LyoKICogICBDb3B5cmlnaHQgKEMpIEJ1bGwgUy5BLiAyMDAxCiAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMQogKgogKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQogKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogKi8KCi8qCiAqIFRlc3QgTmFtZTogc2V0Z3JvdXBzMDQKICoKICogVGVzdCBEZXNjcmlwdGlvbjoKICogIFZlcmlmeSB0aGF0LCBzZXRncm91cHMoKSBmYWlscyB3aXRoIC0xIGFuZCBzZXRzIGVycm5vIHRvIEVGQVVMVCBpZiB0aGUgbGlzdCBoYXMgYW4gaW52YWxpZCBhZGRyZXNzLgogKgogKiBFeHBlY3RlZCBSZXN1bHQ6CiAqICBzZXRncm91cHMoKSBzaG91bGQgZmFpbCB3aXRoIHJldHVybiB2YWx1ZSAtMSBhbmQgc2V0IGV4cGVjdGVkIGVycm5vLgogKgogKiBBbGdvcml0aG06CiAqICBTZXR1cDoKICogICBTZXR1cCBzaWduYWwgaGFuZGxpbmcuCiAqICAgUGF1c2UgZm9yIFNJR1VTUjEgaWYgb3B0aW9uIHNwZWNpZmllZC4KICoKICogIFRlc3Q6CiAqICAgTG9vcCBpZiB0aGUgcHJvcGVyIG9wdGlvbnMgYXJlIGdpdmVuLgogKiAgIEV4ZWN1dGUgc3lzdGVtIGNhbGwKICogICBDaGVjayByZXR1cm4gY29kZSwgaWYgc3lzdGVtIGNhbGwgZmFpbGVkIChyZXR1cm49LTEpCiAqICAgCWlmIGVycm5vIHNldCA9PSBleHBlY3RlZCBlcnJubwogKiAgIAkJSXNzdWUgc3lzIGNhbGwgZmFpbHMgd2l0aCBleHBlY3RlZCByZXR1cm4gdmFsdWUgYW5kIGVycm5vLgogKiAgIAlPdGhlcndpc2UsCiAqCQlJc3N1ZSBzeXMgY2FsbCBmYWlscyB3aXRoIHVuZXhwZWN0ZWQgZXJybm8uCiAqICAgT3RoZXJ3aXNlLAogKglJc3N1ZSBzeXMgY2FsbCByZXR1cm5zIHVuZXhwZWN0ZWQgdmFsdWUuCiAqCiAqICBDbGVhbnVwOgogKiAgIFByaW50IGVycm5vIGxvZyBhbmQvb3IgdGltaW5nIHN0YXRzIGlmIG9wdGlvbnMgZ2l2ZW4KICoKICogVXNhZ2U6ICA8Zm9yIGNvbW1hbmQtbGluZT4KICogIHNldGdyb3VwczA0IFstYyBuXSBbLWVdIFstaSBuXSBbLUkgeF0gWy1QIHhdIFstdF0KICogICAgIHdoZXJlLCAgLWMgbiA6IFJ1biBuIGNvcGllcyBjb25jdXJyZW50bHkuCiAqICAgICAgICAgICAgIC1mICAgOiBUdXJuIG9mZiBmdW5jdGlvbmFsaXR5IFRlc3RpbmcuCiAqCSAgICAgICAtaSBuIDogRXhlY3V0ZSB0ZXN0IG4gdGltZXMuCiAqCSAgICAgICAtSSB4IDogRXhlY3V0ZSB0ZXN0IGZvciB4IHNlY29uZHMuCiAqCSAgICAgICAtUCB4IDogUGF1c2UgZm9yIHggc2Vjb25kcyBiZXR3ZWVuIGl0ZXJhdGlvbnMuCiAqCSAgICAgICAtdCAgIDogVHVybiBvbiBzeXNjYWxsIHRpbWluZy4KICoKICogSElTVE9SWQogKgkwNS8yMDAyIFBvcnRlZCBieSBBbmRy6SBNZXJsaWVyCiAqCiAqIFJFU1RSSUNUSU9OUzoKICogIG5vbmUuCiAqCiAqLwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxwd2QuaD4KI2luY2x1ZGUgPGdycC5oPgoKI2luY2x1ZGUgInRlc3QuaCIKCiNpbmNsdWRlICJjb21wYXRfMTYuaCIKClRDSURfREVGSU5FKHNldGdyb3VwczA0KTsKaW50IFRTVF9UT1RBTCA9IDE7CgpHSURfVCBncm91cHNfbGlzdFtOR1JPVVBTXTsKCnZvaWQgc2V0dXAoKTsJCQkvKiBzZXR1cCBmdW5jdGlvbiBmb3IgdGhlIHRlc3QgKi8Kdm9pZCBjbGVhbnVwKCk7CQkJLyogY2xlYW51cCBmdW5jdGlvbiBmb3IgdGhlIHRlc3QgKi8KCiNpZiAhZGVmaW5lZChVQ0xJTlVYKQoKaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCnsKCWludCBsYzsKCWNvbnN0IGNoYXIgKm1zZzsKCWludCBnaWRzZXRzaXplOwkJLyogdG90YWwgbm8uIG9mIGdyb3VwcyAqLwoJY2hhciAqdGVzdF9kZXNjOwkvKiB0ZXN0IHNwZWNpZmljIGVycm9yIG1lc3NhZ2UgKi8KCglpZiAoKG1zZyA9IHBhcnNlX29wdHMoYWMsIGF2LCBOVUxMLCBOVUxMKSkgIT0gTlVMTCkKCQl0c3RfYnJrbShUQlJPSywgTlVMTCwgIk9QVElPTiBQQVJTSU5HIEVSUk9SIC0gJXMiLCBtc2cpOwoKCS8qIFBlcmZvcm0gc2V0dXAgZm9yIHRlc3QgKi8KCXNldHVwKCk7CgoJZm9yIChsYyA9IDA7IFRFU1RfTE9PUElORyhsYyk7IGxjKyspIHsKCgkJdHN0X2NvdW50ID0gMDsKCgkJZ2lkc2V0c2l6ZSA9IE5HUk9VUFM7CgkJdGVzdF9kZXNjID0gIkVGQVVMVCI7CgoJCS8qCgkJICogQ2FsbCBzZXRncm91cHMoKSB0byB0ZXN0IGNvbmRpdGlvbgoJCSAqIHZlcmlmeSB0aGF0IGl0IGZhaWxzIHdpdGggLTEgcmV0dXJuIHZhbHVlIGFuZAoJCSAqIHNldHMgYXBwcm9wcmlhdGUgZXJybm8uCgkJICovCgkJVEVTVChTRVRHUk9VUFMoY2xlYW51cCwgZ2lkc2V0c2l6ZSwgc2JyaygwKSkpOwoKCQlpZiAoVEVTVF9SRVRVUk4gIT0gLTEpIHsKCQkJdHN0X3Jlc20oVEZBSUwsICJzZXRncm91cHMoKSByZXR1cm5lZCAlbGQsICIKCQkJCSAiZXhwZWN0ZWQgLTEsIGVycm5vPSVkIiwgVEVTVF9SRVRVUk4sCgkJCQkgRUZBVUxUKTsKCQl9IGVsc2UgewoKCQkJaWYgKFRFU1RfRVJSTk8gPT0gRUZBVUxUKSB7CgkJCQl0c3RfcmVzbShUUEFTUywKCQkJCQkgInNldGdyb3VwcygpIGZhaWxzIHdpdGggZXhwZWN0ZWQgIgoJCQkJCSAiZXJyb3IgRUZBVUxUIGVycm5vOiVkIiwgVEVTVF9FUlJOTyk7CgkJCX0gZWxzZSB7CgkJCQl0c3RfcmVzbShURkFJTCwgInNldGdyb3VwcygpIGZhaWxzLCAlcywgIgoJCQkJCSAiZXJybm89JWQsIGV4cGVjdGVkIGVycm5vPSVkIiwKCQkJCQkgdGVzdF9kZXNjLCBURVNUX0VSUk5PLCBFRkFVTFQpOwoJCQl9CgkJfQoKCX0KCgljbGVhbnVwKCk7Cgl0c3RfZXhpdCgpOwoKfQoKI2Vsc2UKCmludCBtYWluKHZvaWQpCnsKCXRzdF9yZXNtKFRJTkZPLCAidGVzdCBpcyBub3QgYXZhaWxhYmxlIG9uIHVDbGludXgiKTsKCXRzdF9leGl0KCk7Cn0KCiNlbmRpZiAvKiBpZiAhZGVmaW5lZChVQ0xJTlVYKSAqLwoKLyoKICogc2V0dXAoKQogKi8Kdm9pZCBzZXR1cCh2b2lkKQp7Cgl0c3RfcmVxdWlyZV9yb290KE5VTEwpOwoKCXRzdF9zaWcoTk9GT1JLLCBERUZfSEFORExFUiwgY2xlYW51cCk7CgoJVEVTVF9QQVVTRTsKCn0KCi8qCiAqIGNsZWFudXAoKQogKi8Kdm9pZCBjbGVhbnVwKHZvaWQpCnsKCn0K