LyoKICogVG9zaGliYSBUQzYzOTNYQiBJL08gQ29udHJvbGxlci4KICogRm91bmQgaW4gU2hhcnAgWmF1cnVzIFNMLTYwMDAgKHRvc2EpIG9yIHNvbWUKICogVG9zaGliYSBlLVNlcmllcyBQREFzLgogKgogKiBGQiBzdXBwb3J0IGNvZGUuIEJhc2VkIG9uIEczNjQgZmIgZW11bGF0b3IKICoKICogQ29weXJpZ2h0IChjKSAyMDA3IEhlcnbpIFBvdXNzaW5lYXUKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaWYgQklUUyA9PSA4CiMgZGVmaW5lIFNFVF9QSVhFTChhZGRyLCBjb2xvcikJKih1aW50OF90KilhZGRyID0gY29sb3I7CiNlbGlmIEJJVFMgPT0gMTUgfHwgQklUUyA9PSAxNgojIGRlZmluZSBTRVRfUElYRUwoYWRkciwgY29sb3IpCSoodWludDE2X3QqKWFkZHIgPSBjb2xvcjsKI2VsaWYgQklUUyA9PSAyNAojIGRlZmluZSBTRVRfUElYRUwoYWRkciwgY29sb3IpCVwKICAgIGFkZHJbMF0gPSBjb2xvcjsgYWRkclsxXSA9IChjb2xvcikgPj4gODsgYWRkclsyXSA9IChjb2xvcikgPj4gMTY7CiNlbGlmIEJJVFMgPT0gMzIKIyBkZWZpbmUgU0VUX1BJWEVMKGFkZHIsIGNvbG9yKQkqKHVpbnQzMl90KilhZGRyID0gY29sb3I7CiNlbHNlCiMgZXJyb3IgdW5rbm93biBiaXQgZGVwdGgKI2VuZGlmCgoKc3RhdGljIHZvaWQgZ2x1ZSh0YzYzOTN4Yl9kcmF3X2dyYXBoaWMsIEJJVFMpKHN0cnVjdCB0YzYzOTN4Yl9zICpzKQp7CiAgICBpbnQgaTsKICAgIGludCB3X2Rpc3BsYXk7CiAgICB1aW50MTZfdCAqZGF0YV9idWZmZXI7CiAgICB1aW50OF90ICpkYXRhX2Rpc3BsYXk7CgogICAgZGF0YV9idWZmZXIgPSAodWludDE2X3QqKShwaHlzX3JhbV9iYXNlICsgcy0+dnJhbV9hZGRyKTsKICAgIHdfZGlzcGxheSA9IHMtPnNjcl93aWR0aCAqIEJJVFMgLyA4OwogICAgZGF0YV9kaXNwbGF5ID0gcy0+ZHMtPmRhdGE7CiAgICBmb3IoaSA9IDA7IGkgPCBzLT5zY3JfaGVpZ2h0OyBpKyspIHsKI2lmIChCSVRTID09IDE2KQogICAgICAgIG1lbWNweShkYXRhX2Rpc3BsYXksIGRhdGFfYnVmZmVyLCBzLT5zY3Jfd2lkdGggKiAyKTsKICAgICAgICBkYXRhX2J1ZmZlciArPSBzLT5zY3Jfd2lkdGg7CiAgICAgICAgZGF0YV9kaXNwbGF5ICs9IHMtPmRzLT5saW5lc2l6ZTsKI2Vsc2UKICAgICAgICBpbnQgajsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+c2NyX3dpZHRoOyBqKyssIGRhdGFfZGlzcGxheSArPSBCSVRTIC8gOCwgZGF0YV9idWZmZXIrKykgewogICAgICAgICAgICB1aW50MTZfdCBjb2xvciA9ICpkYXRhX2J1ZmZlcjsKICAgICAgICAgICAgdWludDMyX3QgZGVzdF9jb2xvciA9IGdsdWUocmdiX3RvX3BpeGVsLCBCSVRTKSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb2xvciAmIDB4ZjgwMCkgKiAweDEwOCkgPj4gMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29sb3IgJiAweDdlMCkgKiAweDQxKSA+PiA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbG9yICYgMHgxZikgKiAweDIxKSA+PiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIFNFVF9QSVhFTChkYXRhX2Rpc3BsYXksIGRlc3RfY29sb3IpOwogICAgICAgIH0KI2VuZGlmCiAgICB9Cn0KCiN1bmRlZiBCSVRTCiN1bmRlZiBTRVRfUElYRUwKCg==