LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CgoKc3RydWN0IGlkdF9lbnRyeSB7Cgl1MTYJYmFzZV9sb3c7Cgl1MTYJc2VsZWN0b3I7Cgl1OAlyZXM7Cgl1OAlhY2Nlc3M7Cgl1MTYJYmFzZV9oaWdoOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKCgpzdHJ1Y3QgaWR0X2VudHJ5IGlkdFsyNTZdOwoKCmFzbSAoIi5nbG9ibCBpcnFfcmV0dXJuXG4iCiAgICAgImlycV9yZXR1cm46XG4iCiAgICAgIiAgICAgYWRkbCAgJDQsICVlc3BcbiIKICAgICAiICAgICBwb3BhXG4iCiAgICAgIiAgICAgaXJldFxuIik7Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZGVmYXVsdF9pc3Iodm9pZCk7CmFzbSAoImRlZmF1bHRfaXNyOiBpcmV0XG4iKTsKCmFzbSAoImlkdF9wdHI6XG4iCgkiLndvcmQJMHg4MDBcbiIgLyogc2l6ZSBvZiB0aGUgdGFibGUgOCoyNTYgYnl0ZXMgKi8KCSIubG9uZwlpZHRcbiIJIC8qIG9mZnNldCAqLwoJIi53b3JkCTB4MThcbiIpOy8qIGRhdGEgc2VnbWVudCAqLwoKdm9pZCBzZXRfdmVjdG9yKHU4IGludG51bSwgdm9pZCAqcm91dGluZSkKewoJaWR0W2ludG51bV0uYmFzZV9oaWdoID0gKHUxNikoKHUzMikocm91dGluZSArIGdkLT5yZWxvY19vZmYpID4+IDE2KTsKCWlkdFtpbnRudW1dLmJhc2VfbG93ID0gKHUxNikoKHUzMikocm91dGluZSArIGdkLT5yZWxvY19vZmYpICYgMHhmZmZmKTsKfQoKCmludCBjcHVfaW5pdF9pbnRlcnJ1cHRzKHZvaWQpCnsKCWludCBpOwoKCS8qIEp1c3QgaW4gY2FzZS4uLiAqLwoJZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CgoJLyogU2V0dXAgdGhlIElEVCAqLwoJZm9yIChpPTA7aTwyNTY7aSsrKSB7CgkJaWR0W2ldLmFjY2VzcyA9IDB4OGU7CgkJaWR0W2ldLnJlcyA9IDA7CgkJaWR0W2ldLnNlbGVjdG9yID0gMHgxMDsKCQlzZXRfdmVjdG9yKGksIGRlZmF1bHRfaXNyKTsKCX0KCglhc20gKCJjcyBsaWR0IGlkdF9wdHJcbiIpOwoKCS8qIEl0IGlzIG5vdyBzYWZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzICovCgllbmFibGVfaW50ZXJydXB0cygpOwoKCXJldHVybiAwOwp9Cgp2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHZvaWQpCnsKCWFzbSgic3RpXG4iKTsKfQoKaW50IGRpc2FibGVfaW50ZXJydXB0cyh2b2lkKQp7Cglsb25nIGZsYWdzOwoKCWFzbSB2b2xhdGlsZSAoInB1c2hmbCA7IHBvcGwgJTAgOyBjbGlcbiIgOiAiPWciIChmbGFncykgOiApOwoKCXJldHVybiAoZmxhZ3MmMHgyMDApOyAvKiBJRSBmbGFncyBpcyBiaXQgOSAqLwp9Cg==