I2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN5cy91bi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KCiNpbmNsdWRlICJtYnRrX3R5cGUuaCIKI2luY2x1ZGUgIm1idGtfdXRpbHMuaCIKCi8vI2RlZmluZSBBVF9UWVBFX1NPQ0tFVAojZGVmaW5lIE1CVEtfTE9HCgojaWZkZWYgTUJUS19MT0cKI2luY2x1ZGUgIm1idGtfbG9nLmgiCiNlbHNlCiNkZWZpbmUgTE9HRSBwcmludGYKI2RlZmluZSBMT0dEIHByaW50ZgojZGVmaW5lIExPR1YgcHJpbnRmCiNkZWZpbmUgTE9HSSBwcmludGYKI2VuZGlmCgojZGVmaW5lIERBVEFCSVRTCUNTOAojZGVmaW5lIFNUT1BCSVRTCTAKI2RlZmluZSBQQVJJVFlPTiAgICAgICAgMAojZGVmaW5lIFBBUklUWSAgICAgICAgICAwCgp0eXBlZGVmIGVudW0gewogICAgQVRfTU9ERV9TT0NLXzEgPSAwLAogICAgQVRfTU9ERV9TT0NLXzIsCiAgICBBVF9NT0RFX0RFVl8xLAogICAgQVRfTU9ERV9ERVZfMgp9IGF0X21vZGVfZW51bTsKCi8vIHN0YXRpYyBpbnQgZXBvbGxfZmQgPSAtMTsKLy8gc3RhdGljIHN0cnVjdCBlcG9sbF9ldmVudCBlcG9sbF9ldmVudHNbMjBdOwpzdGF0aWMgaW50IGF0X2ZkID0gLTE7CnN0YXRpYyBhdF9tb2RlX2VudW0gYXRfbW9kZSA9IEFUX01PREVfU09DS18xOwoKc3RhdGljIGNoYXIgKmF0X3JzcF9jb21wbGV0ZV90YWdbXSA9IHsKICAgICAgICAiT0siLAogICAgICAgICJFUlJPUiIsCiAgICAgICAgIkNPTk5FQ1QiLAoJCSIrQ01TIEVSUk9SOiIsCgkJIitDTUUgRVJST1I6IiwKCQkiTk8gQU5TV0VSIiwKCQkiTk8gRElBTFRPTkUiLAoJCU5VTEx9OwoKI2lmbmRlZiBURU1QX0ZBSUxVUkVfUkVUUlkKI2RlZmluZSBURU1QX0ZBSUxVUkVfUkVUUlkoZXhwKSAoeyAgICAgICAgIFwKICAgIHR5cGVvZiAoZXhwKSBfcmM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBfcmMgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUgKF9yYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKICAgIF9yYzsgfSkKI2VuZGlmCgojaWYgMApzdGF0aWMgdm9pZCBhdF9lcG9sbF9jaGFuZ2UoaW50IGlzX2FkZCxpbnQgZmQpCnsKICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKICAgIG1lbXNldCgmZXYsMHgwLHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpKTsKICAgIGV2LmRhdGEuZmQgPSBmZDsKICAgIGV2LmV2ZW50cyA9IEVQT0xMSU4gfCBFUE9MTEVUOwogICAgaWYoaXNfYWRkKQogICAgewogICAgICAgIGVwb2xsX2N0bChlcG9sbF9mZCxFUE9MTF9DVExfQURELGZkLCZldik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZXBvbGxfY3RsKGVwb2xsX2ZkLEVQT0xMX0NUTF9ERUwsZmQsJmV2KTsKICAgIH0KfQoKc3RhdGljIGludCBhdF9zZXRfZmRfbm9ibG9jayhpbnQgZmQpCnsKICAgIC8vIFNldCBPX05PTkJMT0NLCiAgICBpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CiAgICBpZiAoZmxhZ3MgPCAwKSB7CiAgICAgICAgTE9HRSgiR2V0IGZsYWdzIGVycm9yOiVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CiAgICBpZiAoZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzKSA8IDApIHsKICAgICAgICBMT0dFKCJTZXQgZmxhZ3MgZXJyb3I6JXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwp9CiNlbmRpZgoKLy8jaWZkZWYgQVRfVFlQRV9TT0NLRVQKaW50IG9wZW5Tb2NrZXQoY29uc3QgY2hhciogc29ja25hbWUpCnsKCWludCBzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKCWlmIChzb2NrIDwgMCkgewoJCUxPR0UoIkVycm9yIGNyZWF0ZSBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsKCX0KCXN0cnVjdCBzb2NrYWRkcl91biBhZGRyOwoJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwoJYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKCXN0cm5jcHkoYWRkci5zdW5fcGF0aCwgc29ja25hbWUsIHNpemVvZihhZGRyLnN1bl9wYXRoKSk7Cgl3aGlsZSAoVEVNUF9GQUlMVVJFX1JFVFJZKGNvbm5lY3Qoc29jaywoY29uc3Qgc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKSkgIT0gMCkgewoJCUxPR0UoIkVycm9yIGNvbm5lY3QgdG8gc29ja2V0ICVzOiAlcywgdHJ5IGFnYWluIiwgc29ja25hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJc2xlZXAoMSk7Cgl9CgojaWYgMAoJaW50IHNrX2ZsYWdzID0gZmNudGwoc29jaywgRl9HRVRGTCwgMCk7CglmY250bChzb2NrLCBGX1NFVEZMLCBza19mbGFncyB8IE9fTk9OQkxPQ0spOwojZW5kaWYKCglyZXR1cm4gc29jazsKfQoKLy8jZWxzZQoKc3RhdGljIGludCBhdF9vcGVuKGNoYXIgKmRldikKewogICAgLy8gSW5pdCBVU0IgUEMgcG9ydC4KICAgIHN0cnVjdCB0ZXJtaW9zIHNlcl9zZXR0aW5nczsKICAgIGludCBmZCA9IC0xOwoKdXNiX3BjX2luaXQ6CiAgICBmZCA9IG9wZW4oZGV2LE9fUkRXUik7CiAgICBpZihmZCA8PSAwKQogICAgewogICAgICAgIGlmKGVycm5vID09IEVOT0RFVikKICAgICAgICB7CiAgICAgICAgICAgIExPR0QoIldhaXQgZGV2WyVzXSByZWFkeS4uLiIsZGV2KTsKICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgIGdvdG8gdXNiX3BjX2luaXQ7CiAgICAgICAgfQoKICAgICAgICBMT0dFKCJDYW5ub3Qgb3BlbiBVU0IgUEMgcG9ydFslc10gLSBbZXJybm8gPSAlZF0iLGRldixlcnJubyk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHRjZ2V0YXR0cihmZCwgJnNlcl9zZXR0aW5ncyk7CiAgICBjZm1ha2VyYXcoJnNlcl9zZXR0aW5ncyk7CiAgICAvL3Nlcl9zZXR0aW5ncy5jX2xmbGFnIHw9IChFQ0hPIHwgRUNIT05MKTsKICAgIC8vc2VyX3NldHRpbmdzLmNfbGZsYWcgJj0gfkVDSE9DVEw7CiAgICB0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZzZXJfc2V0dGluZ3MpOwoKI2lmIDAKICAgIGlmKGF0X3NldF9mZF9ub2Jsb2NrKGF0X2ZkKSkKICAgIHsKICAgICAgICBMT0dFKCJhdF9zZXRfZmRfbm9ibG9jaygpIGZhaWwuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGF0X2Vwb2xsX2NoYW5nZSgxLCBhdF9mZCk7CiNlbmRpZgoKICAgIHJldHVybiBmZDsKfQovLyNlbmRpZgoKc3RhdGljIGludCBhZGJfcG9ydF9vcGVuKGNvbnN0IGNoYXIgKmRldiwgdW5zaWduZWQgaW50IGJhdWQpCnsKCWludCBmZDsKCgl3aGlsZSgoZmQgPSBvcGVuKGRldiwgT19SRFdSKSkgPCAwKQoJewoJCXByaW50ZigiJXM6IG9wZW4gJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywgZGV2KTsKCQlzbGVlcCgxKTsKCX0KCgkvKiBzZXQgbmV3dGlvICovCglzdHJ1Y3QgdGVybWlvcyBuZXd0aW87CgltZW1zZXQoJm5ld3RpbywgMCwgc2l6ZW9mKG5ld3RpbykpOwojaWYgMAoJKHZvaWQpZmNudGwoZmQsIEZfU0VURkwsIDApOwoJbmV3dGlvLmNfY2ZsYWcgPSBCQVVEIHwgREFUQUJJVFMgfCBTVE9QQklUUyB8IFBBUklUWU9OIHwgUEFSSVRZIHwgQ0xPQ0FMIHwgQ1JFQUQ7CgluZXd0aW8uY19pZmxhZyA9IElHTlBBUjsKCW5ld3Rpby5jX29mbGFnID0gMDsKCW5ld3Rpby5jX2xmbGFnID0gMDsgICAgLyogZGlzYWJsZSBFQ0hPLCBJQ0FOT04sIGV0Yy4uLiAqLwoKCW5ld3Rpby5jX2NjW1ZFUkFTRV0gICA9IDB4ODsgICAgICAvKiBkZWwgKi8KCW5ld3Rpby5jX2NjW1ZFT0ZdICAgICA9IDQ7ICAgICAgLyogQ3RybC1kICovCgluZXd0aW8uY19jY1tWTUlOXSAgICAgPSAxOyAgICAgIC8qIGJsb2NraW5nIHJlYWQgdW50aWwgMSBjaGFyYWN0ZXIgYXJyaXZlcyAqLwoJbmV3dGlvLmNfY2NbVkVPTF0gICAgID0gMHhEOyAgICAgIC8qICdcMCcgKi8KCgl0Y2ZsdXNoKGZkLCBUQ0lGTFVTSCk7Cgl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZuZXd0aW8pOwojZWxzZQoJaWYgKHRjZmx1c2goZmQsIFRDSU9GTFVTSCkgPCAwKSB7CgkJcHJpbnRmKCJDb3VsZCBub3QgZmx1c2ggdWFydCBwb3J0XG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgogICAgbmV3dGlvLmNfY2NbVlRJTUVdICAgID0gMDsgICAvKiBpbnRlci1jaGFyYWN0ZXIgdGltZXIgdW51c2VkICovCiAgICBuZXd0aW8uY19jY1tWTUlOXQkgICA9IDE7ICAgLyogYmxvY2tpbmcgcmVhZCB1bnRpbCA1IGNoYXJzIHJlY2VpdmVkICovCiAgICBuZXd0aW8uY19jZmxhZyB8PSAoQ1M4IHwgQ0xPQ0FMIHwgQ1JFQUQpOwogICAgbmV3dGlvLmNfaWZsYWcgPSBJR05QQVI7CiAgICBuZXd0aW8uY19vZmxhZyA9IDA7CiAgICBuZXd0aW8uY19sZmxhZyA9IDA7CgoJaW50IHJhdGUgPSBiYXVkOyAgLy8gRGVmYXVsdCBiaXRyYXRlLgoJc3dpdGNoKHJhdGUpCgl7CgkJY2FzZSAzMDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEIzMDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCMzAwKTsKCQkJYnJlYWs7CgkJY2FzZSA2MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEI2MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCNjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxMjAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMTIwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIxMjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAyNDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMjQwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIyNDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA0ODAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCNDgwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEI0ODAwKTsKCQkJYnJlYWs7CgkJY2FzZSA5NjAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCOTYwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEI5NjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxOTIwMDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjE5MjAwKTsKCQkJY2ZzZXRpc3BlZWQoJm5ld3RpbywgQjE5MjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAzODQwMDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjM4NDAwKTsKCQkJY2ZzZXRpc3BlZWQoJm5ld3RpbywgQjM4NDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA1NzYwMDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjU3NjAwKTsKCQkJY2ZzZXRpc3BlZWQoJm5ld3RpbywgQjU3NjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxMTUyMDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEIxMTUyMDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCMTE1MjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAyMzA0MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEIyMzA0MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCMjMwNDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA0NjA4MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEI0NjA4MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCNDYwODAwKTsKCQkJYnJlYWs7CgkJY2FzZSA5MjE2MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEI5MjE2MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCOTIxNjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxNTAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMTUwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIxNTAwMDAwKTsKCQkJYnJlYWs7CgkJY2FzZSAyMDAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMjAwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIyMDAwMDAwKTsKCQkJYnJlYWs7CgkJY2FzZSAzMDAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMzAwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIzMDAwMDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA0MDAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCNDAwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEI0MDAwMDAwKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjExNTIwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIxMTUyMDApOwoJCQlicmVhazsKCX0KCglpZiAodGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmbmV3dGlvKSA8IDApIHsKCQlwcmludGYoIkNhbid0IHNldCBwb3J0IHNldHRpbmdcbiIpOwoJCXJldHVybiAtMTsKCX0KCS8qIEJsb2NraW5nIGJlaGF2aW9yICovCglmY250bChmZCwgRl9TRVRGTCwgMCk7CiNlbmRpZgoKICAgIHJldHVybiBmZDsKfQoKCnN0YXRpYyB2b2lkIHNpZ25hbF9wcm9jZXNzKGludCBzaWduYWxfbnVtKSB7CiAgICBpZihhdF9mZCA+IDApIHsKICAgICAgICBjbG9zZShhdF9mZCk7CiAgICB9CiNpZmRlZiBNQlRLX0xPRwogICAgTE9HRCgiRXhpdCBieSBzaWcgLSAlZFxuIiwgc2lnbmFsX251bSk7CiNlbmRpZgogICAgZXhpdCgwKTsKfQoKc3RhdGljIHZvaWQqIHJlYWRfdGhyZWFkX3J1biggdm9pZCAqYXJnKQp7CiAgICAvL1VOVVNFRChhcmcpOwoKICAgIGNoYXIgYXRfcnNwWzEwMjRdOwogICAgY2hhciAqcHRyOwogICAgaW50IGluZGV4OwogICAgaW50IGxlbjsKICAgIHdoaWxlKGF0X2ZkID4gMCkgewogICAgICAgIG1lbXNldChhdF9yc3AsIDB4MCwgMTAyNCk7CiAgICAgICAgaW5kZXggPSAwOwogICAgICAgIGxlbiA9IDA7CiAgICAgICAgd2hpbGUoMSkgewogICAgICAgICAgICBpZigobGVuID0gcmVhZChhdF9mZCwgYXRfcnNwICsgaW5kZXgsIDEwMjQpKSA+IDApIHsKICAgICAgICAgICAgICAgIHB0ciA9IGF0X3JzcDsKICAgICAgICAgICAgICAgIHdoaWxlKCpwdHIgPT0gJ1xyJyB8fCAqcHRyID09ICdcbicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHRyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihzdHJsZW4ocHRyKSA+IDAgJiYgcHRyW3N0cmxlbihwdHIpIC0gMV0gPT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiPCVzXG4iLCBwdHIpOwojaWZkZWYgTUJUS19MT0cKICAgICAgICAgICAgICAgICAgICBMT0dWKCJSU1A6JXMiLCBwdHIpOwojZW5kaWYKCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIExPR0UoIlJlYWQgZXJyb3I6JWQiLGVycm5vKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIExPR0QoInJlYWRfdGhyZWFkX3J1bigpIGV4aXQuXG4iKTsKICAgIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IHJlYWRfdGhyZWFkX3N0YXJ0KCkKewogICAgcHRocmVhZF90IHRpZDsKICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CiAgICBwdGhyZWFkX2F0dHJfaW5pdCAoJmF0dHIpOwogICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CiAgICBpbnQgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnRpZCwgJmF0dHIsIHJlYWRfdGhyZWFkX3J1biwgTlVMTCk7CiAgICBpZiAocmV0IDwgMCkKICAgIHsKICAgICAgICBMT0dFKCJwdGhyZWFkX2NyZWF0ZVxuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0X2NvbXBsZXRlKGNoYXIgKnJzcCkKewojaWYgMAogICAgY2hhciAqcHRyID0gYXRfcnNwX2NvbXBsZXRlX3RhZzsKICAgIHdoaWxlKHB0cikgewogICAgICAgIExPR0QoInB0ciA9ICVzIiwgcHRyKTsKICAgICAgICBpZihzdHJzdHIocnNwLCBwdHIpKSB7CiAgICAgICAgICAgIExPR0QoIiVzICwgJXMiLCByc3AsIHB0cik7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBwdHIrKzsKICAgIH0KI2Vsc2UKICAgIGludCBpID0gMDsKICAgIHdoaWxlKGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pIHsKICAgICAgICBMT0dEKCJwdHIgPSAlcyIsIGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pOwogICAgICAgIGlmKHN0cnN0cihyc3AsIGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pKSB7CiAgICAgICAgICAgIExPR0QoIiVzICwgJXMiLCByc3AsIGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQoKI2VuZGlmCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgYXRfcnNwX3JlYWQoKQp7CiAgICBjaGFyIGF0X3JzcFsxMDI0XTsKICAgIGludCBsZW4gPSAwOwogICAgd2hpbGUoMSkgewogICAgICAgIG1lbXNldChhdF9yc3AsIDB4MCwgMTAyNCk7CiAgICAgICAgaWYoKGxlbiA9IHJlYWQoYXRfZmQsIGF0X3JzcCwgMTAyNCkpID4gMCkgewogICAgICAgICAgICBwcmludGYoIiVzIiwgYXRfcnNwKTsKICAgICAgICAgICAgaWYoYXRfY29tcGxldGUoYXRfcnNwKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludGYoIlJlYWQgZXJyb3I6JWRcbiIsZXJybm8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGhlbHAoKQp7CiAgICBwcmludGYoImF0IDogRW50ZXIgQVQgbW9kZShTb2NrZXQpLlxuIik7CiAgICBwcmludGYoImF0IDxhdF9jbWQ+OiBTZW5kIEFUIGNvbW1hbmQoU29ja2V0KS5cbiIpOwogICAgcHJpbnRmKCJhdCA8ZGV2PjogRW50ZXIgQVQgbW9kZShEZXZpY2UpLlxuIik7CiAgICBwcmludGYoImF0IDxkZXY+IGVjaG86ILSuv9rK/b7du9jP1KGjXG4iKTsKICAgIHByaW50ZigiYXQgPGRldj4gPGF0X2NtZD46IFNlbmQgQVQgY29tbWFuZChEZXZpY2UpLlxuIik7Cn0KCnN0YXRpYyB2b2lkIHNpZ19wcm9jZXNzKGludCBzaWcpCnsKICAgIExPR0koIkkgZ290IHNpZ25hbCAlZFxuIiwgc2lnKTsKICAgIHN3aXRjaChzaWcpCiAgICB7CiAgICAgICAgY2FzZSBTSUdJTlQ6IC8vIEN0cmwgKyBDCiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJFeGl0IGJ5IFNJR0lOVC5cbiIpOwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgICAgICBjYXNlIFNJR1FVSVQ6IC8vIEN0cmwgKyBcICjA4MvGIFNJR0lOVCCjrLWr0qqy+sn6Y29yZc7EvP4pCiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJFeGl0IGJ5IFNJR1FVSVQuXG4iKTsKICAgICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBTSUdURVJNOi8vIMSsyM9raWxsICAgKM2sIFNJR0tJTEwgo6y1qyBTSUdLSUxMILK7v8mytrvxKQogICAgICAgIHsKICAgICAgICAgICAgTE9HSSgiRXhpdCBieSBTSUdURVJNLlxuIik7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgICAgIGNhc2UgU0lHVFNUUDovLyBDdHJsICsgWiAozawgU0lHU1RPUCCjrLWrIFNJR1NUT1Agsru/ybK2u/EpCiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJFeGl0IGJ5IFNJR1RTVFAuXG4iKTsKICAgICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBTSUdTRUdWOiAvLyDI57/V1rjV6wogICAgICAgIHsKICAgICAgICAgICAgTE9HSSgiRXhpdCBieSBTSUdTRUdWLlxuIik7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJVbmtub3duIHNpZzolZFxuIixzaWcpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIC8vVU5VU0VEKGFyZ2MpOwogICAgLy9VTlVTRUQoYXJndik7CiAgICBzaWduYWwoU0lHSU5ULCBzaWdfcHJvY2Vzcyk7CiAgICBzaWduYWwoU0lHUVVJVCwgc2lnX3Byb2Nlc3MpOwogICAgc2lnbmFsKFNJR1RFUk0sIHNpZ19wcm9jZXNzKTsKICAgIC8vc2lnbmFsKFNJR1RTVFAsIHNpZ19wcm9jZXNzKTsKICAgIC8vc2lnbmFsKFNJR1NFR1YsIHNpZ19wcm9jZXNzKTsKCiNpZmRlZiBNQlRLX0xPRwogICAgbWJ0a19sb2dfaW5pdCgicmFkaW8iLCAiTUJUS19BVCIpOwogICAgTE9HSSgibWJ0a19hdCBzdGFydC4iKTsKI2VuZGlmCgogICAgc2lnbmFsKFNJR0tJTEwsIHNpZ25hbF9wcm9jZXNzKTsKICAgIHNpZ25hbChTSUdJTlQsIHNpZ25hbF9wcm9jZXNzKTsKICAgIHNpZ25hbChTSUdRVUlULCBzaWduYWxfcHJvY2Vzcyk7CiAgICBzaWduYWwoU0lHVEVSTSwgc2lnbmFsX3Byb2Nlc3MpOwoKICAgIGNoYXIgKmF0X2NtZCA9IE5VTEw7CiAgICBib29sIGVjaG8gPSBGQUxTRTsKICAgIGlmKGFyZ2MgPT0gMSkgewogICAgICAgIGF0X21vZGUgPSBBVF9NT0RFX1NPQ0tfMTsKICAgIH0gZWxzZSBpZihhcmdjID09IDIpIHsKICAgICAgICBpZighc3RybmNhc2VjbXAoYXJndlsxXSwgImF0IiwgMikpIHsKICAgICAgICAgICAgYXRfbW9kZSA9IEFUX01PREVfU09DS18yOwogICAgICAgICAgICBhdF9jbWQgPSBhcmd2WzFdOwogICAgICAgIH0gZWxzZSBpZighc3RybmNhc2VjbXAoYXJndlsxXSwgIi9kZXYvIiwgNSkpIHsKICAgICAgICAgICAgYXRfbW9kZSA9IEFUX01PREVfREVWXzE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVscCgpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfSBlbHNlIGlmKGFyZ2MgPT0gMykgewogICAgICAgIGlmKCFzdHJuY2FzZWNtcChhcmd2WzFdLCAiL2Rldi8iLCA1KSAmJiAoIXN0cm5jYXNlY21wKGFyZ3ZbMl0sICJhdCIsIDIpIHx8ICFzdHJuY2FzZWNtcChhcmd2WzJdLCAiZWNobyIsIDQpKSkgewogICAgICAgICAgICBhdF9tb2RlID0gQVRfTU9ERV9ERVZfMjsKICAgICAgICAgICAgaWYoIXN0cm5jYXNlY21wKGFyZ3ZbMl0sICJhdCIsIDIpKSB7CiAgICAgICAgICAgICAgICBhdF9jbWQgPSBhcmd2WzJdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWNobyA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoZWxwKCk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGhlbHAoKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiNpZiAwCiNpZmRlZiBBVF9UWVBFX1NPQ0tFVAogICAgYXRfZmQgPSBvcGVuU29ja2V0KCIvdG1wL2F0Y21kbWJ0ayIpOwojZWxzZQoJYXRfZmQgPSBhdF9vcGVuKGFyZ3ZbMV0pOwojZW5kaWYKICAgIGlmKGF0X2ZkID4gMCkgewojaWZkZWYgQVRfVFlQRV9TT0NLRVQKICAgICAgICBpZihhcmdjID4gMSkgewogICAgICAgICAgICBjaGFyICphdF9jbWQgPSBhcmd2WzFdOwojZWxzZQoJICAgIGlmKGFyZ2MgPiAyKSB7CiAgICAgICAgICAgIGNoYXIgKmF0X2NtZCA9IGFyZ3ZbMl07CiNlbmRpZgojZW5kaWYKCiAgICBpZihhdF9tb2RlID09IEFUX01PREVfU09DS18xIHx8IGF0X21vZGUgPT0gQVRfTU9ERV9TT0NLXzIpIHsKICAgICAgICBhdF9mZCA9IG9wZW5Tb2NrZXQoIi90bXAvYXRjbWRtYnRrIik7CiAgICB9IGVsc2UgewojaWYgMAogICAgICAgIGF0X2ZkID0gYXRfb3Blbihhcmd2WzFdKTsKI2Vsc2UKICAgICAgICBpZihlY2hvKSB7CiAgICAgICAgICAgIGF0X2ZkID0gYWRiX3BvcnRfb3Blbihhcmd2WzFdLCAxMTUyMDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF0X2ZkID0gYXRfb3Blbihhcmd2WzFdKTsKICAgICAgICB9CiNlbmRpZgogICAgfQogICAgaWYoYXRfZmQgPiAwKSB7CiAgICAgICAgaWYoYXRfY21kICE9IE5VTEwpIHsKICAgICAgICAgICAgY2hhciAqcHRyID0gYXRfY21kICsgc3RybGVuKGF0X2NtZCkgLSAxOwogICAgICAgICAgICB3aGlsZShwdHIgPj0gYXRfY21kICYmICgqcHRyID09ICdccicgfHwgKnB0ciA9PSAnXG4nKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKnB0ci0tID0gJ1wwJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBwcmludGYoIkFUOlslbGRdJXNcbiIsIHN0cmxlbihhdF9jbWQpLCBhdF9jbWQpOwogICAgICAgICAgICBpZighc3RybmNhc2VjbXAoYXRfY21kLCAiYXQiLCAyKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKigrK3B0cikgPSAnXHInOwogICAgICAgICAgICAgICAgKigrK3B0cikgPSAnXG4nOwogICAgICAgICAgICAgICAgaWYod3JpdGUoYXRfZmQsIGF0X2NtZCwgc3RybGVuKGF0X2NtZCkpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIldyaXRlIGVycm9yOiVkXG4iLCBlcnJubyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgcmVzcG9uc2UuCiAgICAgICAgICAgICAgICAgICAgYXRfcnNwX3JlYWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHByaW50ZigiQVQgZXJyb3IhXG4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmKGVjaG8pIHsKICAgICAgICAgICAgICAgIGNoYXIgcmVhZF9idWZmWzEwMjRdOwogICAgICAgICAgICAgICAgY2hhciB3cml0ZV9idWZmWzEwMjRdOwogICAgICAgICAgICAgICAgaW50IGxlbjsKI2lmIDAKICAgICAgICAgICAgICAgIGZkX3NldCBmZHM7CiAgICAgICAgICAgICAgICBpbnQgZmRjb3VudCwgbmZkcyA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSgxKSB7CiAgICAgICAgICAgICAgICAgICAgRkRfU0VUKGF0X2ZkLCAmZmRzKTsKICAgICAgICAJCSAgICBpZihhdF9mZCA+IG5mZHMpCiAgICAgICAgCQkJICAgIG5mZHMgPSBhdF9mZDsKCiAgICAgICAgICAgICAgICAgICAgZmRjb3VudCA9IHNlbGVjdChuZmRzICsgMSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgCQkJaWYoZmRjb3VudCA8IDApIC8qIGVycm9yICovCiAgICAgICAgCQkJewogICAgICAgIAkJCQlwcmludGYoInNlbGVjdCByZXR1cm5lZCAlZCwgZXJybm8gJWQsIGNvbnRpbnVlXHIiLCBmZGNvdW50LCBlcnJubyk7CiAgICAgICAgCQkJCXNsZWVwKDEpOwogICAgICAgIAkJCQljb250aW51ZTsKICAgICAgICAJCQl9CgogICAgICAgIAkJCWlmKEZEX0lTU0VUKGF0X2ZkLCAmZmRzKSkKICAgICAgICAJCQl7CiAgICAgICAgICAgICAgICAgICAgICAgIEZEX0NMUihhdF9mZCwgJmZkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChyZWFkX2J1ZmYsIDB4MCwgMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKChsZW4gPSByZWFkKGF0X2ZkLCByZWFkX2J1ZmYsIDEwMjQpKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCh3cml0ZV9idWZmLCAweDAsIDEwMjQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgcmVhZF9idWZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHdyaXRlX2J1ZmYsIDEwMjQsICIlc1xuIiwgcmVhZF9idWZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGF0X2ZkLCB3cml0ZV9idWZmLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWFkIGVycm9yOiVkXG4iLGVycm5vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQojZWxzZQogICAgICAgICAgICAgICAgcHJpbnRmKCJXYWl0dGluZyBkYXRhISEhXG4iKTsKICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKICAgICAgICAgICAgICAgICAgICBtZW1zZXQocmVhZF9idWZmLCAweDAsIDEwMjQpOwogICAgICAgICAgICAgICAgICAgIGlmKChsZW4gPSByZWFkKGF0X2ZkLCByZWFkX2J1ZmYsIDEwMjQpKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdyaXRlX2J1ZmYsIDB4MCwgMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIHJlYWRfYnVmZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHdyaXRlX2J1ZmYsIDEwMjQsICIlc1xuIiwgcmVhZF9idWZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWJ0a193cml0ZShhdF9mZCwgd3JpdGVfYnVmZiwgbGVuKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlYWQgZXJyb3I6JWRcbiIsZXJybm8pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldGJ1ZihzdGRvdXQsIE5VTEwpOwogICAgICAgICAgICAgICAgcmVhZF90aHJlYWRfc3RhcnQoKTsKICAgICAgICAgICAgICAgIGNoYXIgYXRfY21kWzEwMF07CiAgICAgICAgICAgICAgICAvL3ByaW50ZigiPj4iKTsKICAgICAgICAgICAgICAgIHdoaWxlKDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGF0X2NtZCwgMHgwLCAxMDApOwogICAgICAgICAgICAgICAgICAgIGlmKGZnZXRzKGF0X2NtZCwgMTAwLCBzdGRpbikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBhdF9jbWQgKyBzdHJsZW4oYXRfY21kKSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKHB0ciA+PSBhdF9jbWQgJiYgKCpwdHIgPT0gJ1xyJyB8fCAqcHRyID09ICdcbicpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyLS0gPSAnXDAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50ZigiQVQ6WyVsZF0lc1xuIiwgc3RybGVuKGF0X2NtZCksIGF0X2NtZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdHJuY2FzZWNtcChhdF9jbWQsICJhdCIsIDIpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCsrcHRyKSA9ICdccic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKCsrcHRyKSA9ICdcbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3cml0ZShhdF9mZCwgYXRfY21kLCBzdHJsZW4oYXRfY21kKSkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIldyaXRlIGVycm9yOiVkIixlcnJubyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIj4lcyIsYXRfY21kKTsKI2lmZGVmIE1CVEtfTE9HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJBVDolcyIsYXRfY21kKTsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZighc3RyY2FzZWNtcChhdF9jbWQsICJxIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjbG9zZShhdF9mZCk7CgojaWZkZWYgTUJUS19MT0cKICAgICAgICBMT0dEKCJFWElUIik7CiNlbmRpZgogICAgfQoKICAgIHJldHVybiAwOwp9Cg==