Lyogc3RhdGVtZW50LmMgLSB0aGUgc3RhdGVtZW50IHR5cGUKICoKICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgojaW5jbHVkZSAidXRpbC5oIgojaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCgovKiBwcm90b3R5cGVzICovCnN0YXRpYyBpbnQgcHlzcWxpdGVfY2hlY2tfcmVtYWluaW5nX3NxbChjb25zdCBjaGFyKiB0YWlsKTsKCnR5cGVkZWYgZW51bSB7CiAgICBMSU5FQ09NTUVOVF8xLAogICAgSU5fTElORUNPTU1FTlQsCiAgICBDT01NRU5UU1RBUlRfMSwKICAgIElOX0NPTU1FTlQsCiAgICBDT01NRU5URU5EXzEsCiAgICBOT1JNQUwKfSBwYXJzZV9yZW1haW5pbmdfc3FsX3N0YXRlOwoKdHlwZWRlZiBlbnVtIHsKICAgIFRZUEVfSU5ULAogICAgVFlQRV9MT05HLAogICAgVFlQRV9GTE9BVCwKICAgIFRZUEVfU1RSSU5HLAogICAgVFlQRV9VTklDT0RFLAogICAgVFlQRV9CVUZGRVIsCiAgICBUWVBFX1VOS05PV04KfSBwYXJhbWV0ZXJfdHlwZTsKCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfY3JlYXRlKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgcHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCkKewogICAgY29uc3QgY2hhciogdGFpbDsKICAgIGludCByYzsKICAgIFB5T2JqZWN0KiBzcWxfc3RyOwogICAgY2hhciogc3FsX2NzdHI7CgogICAgc2VsZi0+c3QgPSBOVUxMOwogICAgc2VsZi0+aW5fdXNlID0gMDsKCiAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3FsKSkgewogICAgICAgIHNxbF9zdHIgPSBzcWw7CiAgICAgICAgUHlfSU5DUkVGKHNxbF9zdHIpOwogICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3FsKSkgewogICAgICAgIHNxbF9zdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHNxbCk7CiAgICAgICAgaWYgKCFzcWxfc3RyKSB7CiAgICAgICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CiAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CiAgICAgICAgcmV0dXJuIHJjOwogICAgfQoKICAgIHNlbGYtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKICAgIHNlbGYtPnNxbCA9IHNxbF9zdHI7CgogICAgc3FsX2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzcWxfc3RyKTsKCiAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShjb25uZWN0aW9uLT5kYiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNxbF9jc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAmdGFpbCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIHNlbGYtPmRiID0gY29ubmVjdGlvbi0+ZGI7CgogICAgaWYgKHJjID09IFNRTElURV9PSyAmJiBweXNxbGl0ZV9jaGVja19yZW1haW5pbmdfc3FsKHRhaWwpKSB7CiAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CiAgICAgICAgc2VsZi0+c3QgPSBOVUxMOwogICAgICAgIHJjID0gUFlTUUxJVEVfVE9PX01VQ0hfU1FMOwogICAgfQoKICAgIHJldHVybiByYzsKfQoKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIGludCBwb3MsIFB5T2JqZWN0KiBwYXJhbWV0ZXIsIGludCBhbGxvd184Yml0X2NoYXJzKQp7CiAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CiAgICBjb25zdCBjaGFyKiBidWZmZXI7CiAgICBjaGFyKiBzdHJpbmc7CiAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7CiAgICBwYXJhbWV0ZXJfdHlwZSBwYXJhbXR5cGU7CiAgICBjaGFyKiBjOwoKICAgIGlmIChwYXJhbWV0ZXIgPT0gUHlfTm9uZSkgewogICAgICAgIHJjID0gc3FsaXRlM19iaW5kX251bGwoc2VsZi0+c3QsIHBvcyk7CiAgICAgICAgZ290byBmaW5hbDsKICAgIH0KCiAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9JTlQ7CiAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0xPTkc7CiAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9TVFJJTkc7CiAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOSUNPREU7CiAgICB9IGVsc2UgaWYgKFB5QnVmZmVyX0NoZWNrKHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0JVRkZFUjsKICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfSU5UOwogICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfTE9ORzsKICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfU1RSSU5HOwogICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfVU5JQ09ERTsKICAgIH0gZWxzZSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9VTktOT1dOOwogICAgfQoKICAgIGlmIChwYXJhbXR5cGUgPT0gVFlQRV9TVFJJTkcgJiYgIWFsbG93XzhiaXRfY2hhcnMpIHsKICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcocGFyYW1ldGVyKTsKICAgICAgICBmb3IgKGMgPSBzdHJpbmc7ICpjICE9IDA7IGMrKykgewogICAgICAgICAgICBpZiAoKmMgJiAweDgwKSB7CiAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBtdXN0IG5vdCB1c2UgOC1iaXQgYnl0ZXN0cmluZ3MgdW5sZXNzIHlvdSB1c2UgYSB0ZXh0X2ZhY3RvcnkgdGhhdCBjYW4gaW50ZXJwcmV0IDgtYml0IGJ5dGVzdHJpbmdzIChsaWtlIHRleHRfZmFjdG9yeSA9IHN0cikuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0ZWFkIGp1c3Qgc3dpdGNoIHlvdXIgYXBwbGljYXRpb24gdG8gVW5pY29kZSBzdHJpbmdzLiIpOwogICAgICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgICAgICAgIGdvdG8gZmluYWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgc3dpdGNoIChwYXJhbXR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfSU5UOiB7CiAgICAgICAgICAgIGxvbmcgbG9uZ3ZhbCA9IFB5SW50X0FzTG9uZyhwYXJhbWV0ZXIpOwogICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCBsb25ndmFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgVFlQRV9MT05HOiB7CiAgICAgICAgICAgIHNxbGl0ZV9pbnQ2NCB2YWx1ZSA9IF9weXNxbGl0ZV9sb25nX2FzX2ludDY0KHBhcmFtZXRlcik7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NCl2YWx1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CiAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2RvdWJsZShzZWxmLT5zdCwgcG9zLCBQeUZsb2F0X0FzRG91YmxlKHBhcmFtZXRlcikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfU1RSSU5HOgogICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocGFyYW1ldGVyLCAmc3RyaW5nLCAmYnVmbGVuKTsKICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VTklDT0RFOgogICAgICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7CiAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShzdHJpbmd2YWwsICZzdHJpbmcsICZidWZsZW4pOwogICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CVUZGRVI6CiAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9ibG9iKHNlbGYtPnN0LCBwb3MsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKICAgICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOS05PV046CiAgICAgICAgICAgIHJjID0gLTE7CiAgICB9CgpmaW5hbDoKICAgIHJldHVybiByYzsKfQoKLyogcmV0dXJucyAwIGlmIHRoZSBvYmplY3QgaXMgb25lIG9mIFB5dGhvbidzIGludGVybmFsIG9uZXMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGFkYXB0ZWQgKi8Kc3RhdGljIGludCBfbmVlZF9hZGFwdChQeU9iamVjdCogb2JqKQp7CiAgICBpZiAocHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKFB5SW50X0NoZWNrRXhhY3Qob2JqKSB8fCBQeUxvbmdfQ2hlY2tFeGFjdChvYmopCiAgICAgICAgICAgIHx8IFB5RmxvYXRfQ2hlY2tFeGFjdChvYmopIHx8IFB5U3RyaW5nX0NoZWNrRXhhY3Qob2JqKQogICAgICAgICAgICB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopIHx8IFB5QnVmZmVyX0NoZWNrKG9iaikpIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cn0KCnZvaWQgcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIFB5T2JqZWN0KiBwYXJhbWV0ZXJzLCBpbnQgYWxsb3dfOGJpdF9jaGFycykKewogICAgUHlPYmplY3QqIGN1cnJlbnRfcGFyYW07CiAgICBQeU9iamVjdCogYWRhcHRlZDsKICAgIGNvbnN0IGNoYXIqIGJpbmRpbmdfbmFtZTsKICAgIGludCBpOwogICAgaW50IHJjOwogICAgaW50IG51bV9wYXJhbXNfbmVlZGVkOwogICAgaW50IG51bV9wYXJhbXM7CgogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgbnVtX3BhcmFtc19uZWVkZWQgPSBzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX2NvdW50KHNlbGYtPnN0KTsKICAgIFB5X0VORF9BTExPV19USFJFQURTCgogICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSB8fCBQeUxpc3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSB8fCAoIVB5RGljdF9DaGVjayhwYXJhbWV0ZXJzKSAmJiBQeVNlcXVlbmNlX0NoZWNrKHBhcmFtZXRlcnMpKSkgewogICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIHNlcXVlbmNlICovCiAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgewogICAgICAgICAgICBudW1fcGFyYW1zID0gUHlUdXBsZV9HRVRfU0laRShwYXJhbWV0ZXJzKTsKICAgICAgICB9IGVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CiAgICAgICAgICAgIG51bV9wYXJhbXMgPSBQeUxpc3RfR0VUX1NJWkUocGFyYW1ldGVycyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbnVtX3BhcmFtcyA9IFB5U2VxdWVuY2VfU2l6ZShwYXJhbWV0ZXJzKTsKICAgICAgICB9CiAgICAgICAgaWYgKG51bV9wYXJhbXMgIT0gbnVtX3BhcmFtc19uZWVkZWQpIHsKICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGJpbmRpbmdzIHN1cHBsaWVkLiBUaGUgY3VycmVudCBzdGF0ZW1lbnQgdXNlcyAlZCwgYW5kIHRoZXJlIGFyZSAlZCBzdXBwbGllZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtc19uZWVkZWQsIG51bV9wYXJhbXMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFyYW1zOyBpKyspIHsKICAgICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgewogICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyYW1ldGVycywgaSk7CiAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlMaXN0X0dFVF9JVEVNKHBhcmFtZXRlcnMsIGkpOwogICAgICAgICAgICAgICAgUHlfWElOQ1JFRihjdXJyZW50X3BhcmFtKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0ocGFyYW1ldGVycywgaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFjdXJyZW50X3BhcmFtKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghX25lZWRfYWRhcHQoY3VycmVudF9wYXJhbSkpIHsKICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRhcHRlZCA9IHB5c3FsaXRlX21pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOwogICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJjID0gcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGkgKyAxLCBhZGFwdGVkLCBhbGxvd184Yml0X2NoYXJzKTsKICAgICAgICAgICAgUHlfREVDUkVGKGFkYXB0ZWQpOwoKICAgICAgICAgICAgaWYgKHJjICE9IFNRTElURV9PSykgewogICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX0ludGVyZmFjZUVycm9yLCAiRXJyb3IgYmluZGluZyBwYXJhbWV0ZXIgJWQgLSBwcm9iYWJseSB1bnN1cHBvcnRlZCB0eXBlLiIsIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChQeURpY3RfQ2hlY2socGFyYW1ldGVycykpIHsKICAgICAgICAvKiBwYXJhbWV0ZXJzIHBhc3NlZCBhcyBkaWN0aW9uYXJ5ICovCiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBudW1fcGFyYW1zX25lZWRlZDsgaSsrKSB7CiAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgYmluZGluZ19uYW1lID0gc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9uYW1lKHNlbGYtPnN0LCBpKTsKICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgaWYgKCFiaW5kaW5nX25hbWUpIHsKICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiQmluZGluZyAlZCBoYXMgbm8gbmFtZSwgYnV0IHlvdSBzdXBwbGllZCBhIGRpY3Rpb25hcnkgKHdoaWNoIGhhcyBvbmx5IG5hbWVzKS4iLCBpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYmluZGluZ19uYW1lKys7IC8qIHNraXAgZmlyc3QgY2hhciAodGhlIGNvbG9uKSAqLwogICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhwYXJhbWV0ZXJzLCBiaW5kaW5nX25hbWUpOwogICAgICAgICAgICAgICAgUHlfWElOQ1JFRihjdXJyZW50X3BhcmFtKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyhwYXJhbWV0ZXJzLCAoY2hhciopYmluZGluZ19uYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsKICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9Qcm9ncmFtbWluZ0Vycm9yLCAiWW91IGRpZCBub3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGJpbmRpbmcgJWQuIiwgaSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghX25lZWRfYWRhcHQoY3VycmVudF9wYXJhbSkpIHsKICAgICAgICAgICAgICAgIGFkYXB0ZWQgPSBjdXJyZW50X3BhcmFtOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRhcHRlZCA9IHB5c3FsaXRlX21pY3JvcHJvdG9jb2xzX2FkYXB0KGN1cnJlbnRfcGFyYW0sIChQeU9iamVjdCopJnB5c3FsaXRlX1ByZXBhcmVQcm90b2NvbFR5cGUsIE5VTEwpOwogICAgICAgICAgICAgICAgaWYgKGFkYXB0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VycmVudF9wYXJhbSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJjID0gcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHNlbGYsIGksIGFkYXB0ZWQsIGFsbG93XzhiaXRfY2hhcnMpOwogICAgICAgICAgICBQeV9ERUNSRUYoYWRhcHRlZCk7CgogICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IsICJFcnJvciBiaW5kaW5nIHBhcmFtZXRlciA6JXMgLSBwcm9iYWJseSB1bnN1cHBvcnRlZCB0eXBlLiIsIGJpbmRpbmdfbmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJwYXJhbWV0ZXJzIGFyZSBvZiB1bnN1cHBvcnRlZCB0eXBlIik7CiAgICB9Cn0KCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfcmVjb21waWxlKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtcykKewogICAgY29uc3QgY2hhciogdGFpbDsKICAgIGludCByYzsKICAgIGNoYXIqIHNxbF9jc3RyOwogICAgc3FsaXRlM19zdG10KiBuZXdfc3Q7CgogICAgc3FsX2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5zcWwpOwoKICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgIHJjID0gc3FsaXRlM19wcmVwYXJlKHNlbGYtPmRiLAogICAgICAgICAgICAgICAgICAgICAgICAgc3FsX2NzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAmdGFpbCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIGlmIChyYyA9PSBTUUxJVEVfT0spIHsKICAgICAgICAvKiBUaGUgZWZmaWNpZW50IHNxbGl0ZTNfdHJhbnNmZXJfYmluZGluZ3MgaXMgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlCiAgICAgICAgICogdmVyc2lvbiAzLjIuMiBvciBsYXRlci4gRm9yIG9sZGVyIFNRTGl0ZSByZWxlYXNlcywgdGhhdCBtaWdodCBub3QKICAgICAgICAgKiBldmVuIGRlZmluZSBTUUxJVEVfVkVSU0lPTl9OVU1CRVIsIHdlIGRvIGl0IHRoZSBtYW51YWwgd2F5LgogICAgICAgICAqLwogICAgICAgICNpZmRlZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIKICAgICAgICAjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDIwMDIKICAgICAgICAvKiBUaGUgY2hlY2sgZm9yIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyBuZWNlc3NhcnkgdG8gbm90IHRyaWdnZXIgYQogICAgICAgICAqIGJ1ZyBpbiBjZXJ0YWluIFNRTGl0ZSB2ZXJzaW9ucyAoZXhwZXJpZW5jZWQgaW4gMy4yLjggYW5kIDMuMy40KS4gKi8KICAgICAgICBpZiAoc3FsaXRlM19iaW5kX3BhcmFtZXRlcl9jb3VudChzZWxmLT5zdCkgPiAwKSB7CiAgICAgICAgICAgICh2b2lkKXNxbGl0ZTNfdHJhbnNmZXJfYmluZGluZ3Moc2VsZi0+c3QsIG5ld19zdCk7CiAgICAgICAgfQogICAgICAgICNlbmRpZgogICAgICAgICNlbHNlCiAgICAgICAgc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVycyhzZWxmLCBwYXJhbXMpOwogICAgICAgICNlbmRpZgoKICAgICAgICAodm9pZClzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsKICAgICAgICBzZWxmLT5zdCA9IG5ld19zdDsKICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfZmluYWxpemUocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmKQp7CiAgICBpbnQgcmM7CgogICAgcmMgPSBTUUxJVEVfT0s7CiAgICBpZiAoc2VsZi0+c3QpIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX2ZpbmFsaXplKHNlbGYtPnN0KTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgIHNlbGYtPnN0ID0gTlVMTDsKICAgIH0KCiAgICBzZWxmLT5pbl91c2UgPSAwOwoKICAgIHJldHVybiByYzsKfQoKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9yZXNldChweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYpCnsKICAgIGludCByYzsKCiAgICByYyA9IFNRTElURV9PSzsKCiAgICBpZiAoc2VsZi0+aW5fdXNlICYmIHNlbGYtPnN0KSB7CiAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgIHJjID0gc3FsaXRlM19yZXNldChzZWxmLT5zdCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKCiAgICAgICAgaWYgKHJjID09IFNRTElURV9PSykgewogICAgICAgICAgICBzZWxmLT5pbl91c2UgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmM7Cn0KCnZvaWQgcHlzcWxpdGVfc3RhdGVtZW50X21hcmtfZGlydHkocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmKQp7CiAgICBzZWxmLT5pbl91c2UgPSAxOwp9Cgp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9kZWFsbG9jKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikKewogICAgaW50IHJjOwoKICAgIGlmIChzZWxmLT5zdCkgewogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICB9CgogICAgc2VsZi0+c3QgPSBOVUxMOwoKICAgIFB5X1hERUNSRUYoc2VsZi0+c3FsKTsKCiAgICBpZiAoc2VsZi0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgewogICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0KilzZWxmKTsKICAgIH0KCiAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7Cn0KCi8qCiAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnl0aGluZyBsZWZ0IGluIGFuIFNRTCBzdHJpbmcgYWZ0ZXIgU1FMaXRlIGNvbXBpbGVkIGl0LgogKiBUaGlzIGlzIHVzZWQgdG8gY2hlY2sgaWYgc29tZWJvZHkgdHJpZWQgdG8gZXhlY3V0ZSBtb3JlIHRoYW4gb25lIFNRTCBjb21tYW5kCiAqIHdpdGggb25lIGV4ZWN1dGUoKS9leGVjdXRlbWFueSgpIGNvbW1hbmQsIHdoaWNoIHRoZSBEQi1BUEkgYW5kIHdlIGRvbid0CiAqIGFsbG93LgogKgogKiBSZXR1cm5zIDEgaWYgdGhlcmUgaXMgbW9yZSBsZWZ0IHRoYW4gc2hvdWxkIGJlLiAwIGlmIG9rLgogKi8Kc3RhdGljIGludCBweXNxbGl0ZV9jaGVja19yZW1haW5pbmdfc3FsKGNvbnN0IGNoYXIqIHRhaWwpCnsKICAgIGNvbnN0IGNoYXIqIHBvcyA9IHRhaWw7CgogICAgcGFyc2VfcmVtYWluaW5nX3NxbF9zdGF0ZSBzdGF0ZSA9IE5PUk1BTDsKCiAgICBmb3IgKDs7KSB7CiAgICAgICAgc3dpdGNoICgqcG9zKSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBOT1JNQUwpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSAgPSBMSU5FQ09NTUVOVF8xOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBMSU5FQ09NTUVOVF8xKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9MSU5FQ09NTUVOVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAgY2FzZSAnXHQnOgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1xuJzoKICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBJTl9MSU5FQ09NTUVOVCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gTk9STUFMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gQ09NTUVOVFNUQVJUXzE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IENPTU1FTlRFTkRfMSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gTk9STUFMOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBDT01NRU5UU1RBUlRfMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJyonOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBMSU5FQ09NTUVOVF8xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IENPTU1FTlRTVEFSVF8xKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9DT01NRU5UOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBJTl9DT01NRU5UKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBDT01NRU5URU5EXzE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBDT01NRU5URU5EXzEpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NPTU1FTlQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0xJTkVDT01NRU5UKSB7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0NPTU1FTlQpIHsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwb3MrKzsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKUHlUeXBlT2JqZWN0IHB5c3FsaXRlX1N0YXRlbWVudFR5cGUgPSB7CiAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgICAgTU9EVUxFX05BTUUgIi5TdGF0ZW1lbnQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgICAgIHNpemVvZihweXNxbGl0ZV9TdGF0ZW1lbnQpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgICAgKGRlc3RydWN0b3IpcHlzcWxpdGVfc3RhdGVtZW50X2RlYWxsb2MsICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgIC8qIHRwX2ZsYWdzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgICAgb2Zmc2V0b2YocHlzcWxpdGVfU3RhdGVtZW50LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwogICAgICAgIChpbml0cHJvYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KfTsKCmV4dGVybiBpbnQgcHlzcWxpdGVfc3RhdGVtZW50X3NldHVwX3R5cGVzKHZvaWQpCnsKICAgIHB5c3FsaXRlX1N0YXRlbWVudFR5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CiAgICByZXR1cm4gUHlUeXBlX1JlYWR5KCZweXNxbGl0ZV9TdGF0ZW1lbnRUeXBlKTsKfQo=