LyoKICogIFRlbXBsYXRlIE1JQiBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGF0LmMKICoKICovCgovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgIm1pYklJX2NvbW1vbi5oIiAvKiBmb3IgTkVUU05NUF9LTE9PS1VQICovCgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgZGVmaW5lZChJRk5FVF9ORUVEU19LRVJORUwpICYmICFkZWZpbmVkKF9LRVJORUwpCiNkZWZpbmUgX0tFUk5FTCAxCiNkZWZpbmUgX0lfREVGSU5FRF9LRVJORUwKI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGlmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiMgIGluY2x1ZGUgPHN5cy90aW1lYi5oPgojIGVsc2UKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ICiNpbmNsdWRlIDxuZXQvaWYuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9WQVJfSAojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojZW5kaWYKI2lmZGVmIF9JX0RFRklORURfS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNlbmRpZgoKI2lmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ETF9ICiNpZm5kZWYgZHluaXgKI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgojZWxzZQojaW5jbHVkZSA8c3lzL25ldC9pZl9kbC5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TVFJFQU1fSAojaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX1JPVVRFX0gKI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgojZW5kaWYKI2lmZGVmIHNvbGFyaXMyCiNpbmNsdWRlICJrZXJuZWxfc3Vub3M1LmgiCiNlbmRpZgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCgojaWZkZWYgaHB1eDExCiNpbmNsdWRlIDxzeXMvbWliLmg+CiNpbmNsdWRlIDxuZXRpbmV0L21pYl9rZXJuLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CgojaW5jbHVkZSAiYXQuaCIKI2luY2x1ZGUgImludGVyZmFjZXMuaCIKCiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpZiBkZWZpbmVkKEhBVkVfU1lTX1NZU0NUTF9IKSAmJiAhZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKQojIGlmIGRlZmluZWQoUlRGX0xMSU5GTykgCiMgIGRlZmluZSBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMIDEKIyBlbmRpZgojZW5kaWYKCiNpZmRlZiBjeWd3aW4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2VuZGlmCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgS2VybmVsICYgaW50ZXJmYWNlIGluZm9ybWF0aW9uLAoJICogICBhbmQgaW50ZXJuYWwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKI2lmbmRlZiBzb2xhcmlzMgpzdGF0aWMgdm9pZCAgICAgQVJQX1NjYW5fSW5pdCh2b2lkKTsKI2lmZGVmIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTCnN0YXRpYyBpbnQgICAgICBBUlBfU2Nhbl9OZXh0KGluX2FkZHJfdCAqLCBjaGFyICosIGludCAqLCB1X2xvbmcgKiwgdV9zaG9ydCAqKTsKI2Vsc2UKc3RhdGljIGludCAgICAgIEFSUF9TY2FuX05leHQoaW5fYWRkcl90ICosIGNoYXIgKiwgaW50ICosIHVfbG9uZyAqKTsKI2VuZGlmCiNlbmRpZgojZW5kaWYKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBkZWZpbmUgdGhlIHN0cnVjdHVyZSB3ZSdyZSBnb2luZyB0byBhc2sgdGhlIGFnZW50IHRvIHJlZ2lzdGVyIG91cgogKiBpbmZvcm1hdGlvbiBhdCAKICovCnN0cnVjdCB2YXJpYWJsZTEgYXRfdmFyaWFibGVzW10gPSB7CiAgICB7QVRJRklOREVYLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9hdEVudHJ5LCAxLCB7MX19LAogICAge0FUUEhZU0FERFJFU1MsIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfYXRFbnRyeSwgMSwgezJ9fSwKICAgIHtBVE5FVEFERFJFU1MsIEFTTl9JUEFERFJFU1MsIFJPTkxZLCB2YXJfYXRFbnRyeSwgMSwgezN9fQp9OwoKLyoKICogRGVmaW5lIHRoZSBPSUQgcG9pbnRlciB0byB0aGUgdG9wIG9mIHRoZSBtaWIgdHJlZSB0aGF0IHdlJ3JlCiAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGggCiAqLwpvaWQgICAgICAgICAgICAgYXRfdmFyaWFibGVzX29pZFtdID0geyBTTk1QX09JRF9NSUIyLCAzLCAxLCAxIH07Cgp2b2lkCmluaXRfYXQodm9pZCkKewogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBhZ2VudCB0byBoYW5kbGUgb3VyIG1pYiB0cmVlIAogICAgICovCiAgICBSRUdJU1RFUl9NSUIoIm1pYklJL2F0IiwgYXRfdmFyaWFibGVzLCB2YXJpYWJsZTEsIGF0X3ZhcmlhYmxlc19vaWQpOwojaWZkZWYgc29sYXJpczIKICAgIGluaXRfa2VybmVsX3N1bm9zNSgpOwojZW5kaWYKfQoKI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKI2lmbmRlZiBzb2xhcmlzMgoKLyoKICogdmFyX2F0RW50cnkoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwoKdV9jaGFyICAgICAgICAgKgp2YXJfYXRFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogQWRkcmVzcyBUcmFuc2xhdGlvbiB0YWJsZSBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuMy4xLjEuMS5pbnRlcmZhY2UuMS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSW50ZXJmYWNlIGlzIGF0IG9mZnNldCAxMCwKICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEyLgogICAgICoKICAgICAqIElQIE5ldCB0byBNZWRpYSB0YWJsZSBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMi4xLjEuMS5pbnRlcmZhY2UuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIEludGVyZmFjZSBpcyBhdCBvZmZzZXQgMTAsCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMS4KICAgICAqLwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFsxNl07CiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFsxNl07CiAgICBzdGF0aWMgY2hhciAgICAgUGh5c0FkZHJbTUFYX01BQ19BRERSX0xFTl0sIExvd1BoeXNBZGRyW01BWF9NQUNfQUREUl9MRU5dOwogICAgc3RhdGljIGludCAgICAgIFBoeXNBZGRyTGVuLCBMb3dQaHlzQWRkckxlbjsKICAgIGluX2FkZHJfdCAgICAgICBBZGRyLCBMb3dBZGRyOwogICAgaW50ICAgICAgICAgICAgIGZvdW5kb25lOwogICAgc3RhdGljIGluX2FkZHJfdCAgICAgIGFkZHJfcmV0OwojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgIHVfc2hvcnQgICAgICAgICBpZkluZGV4LCBsb3dJZkluZGV4ID0gMDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUyAqLwogICAgdV9sb25nICAgICAgICAgIGlmVHlwZSwgbG93SWZUeXBlID0gMDsKCiAgICBpbnQgICAgICAgICAgICAgb2lkX2xlbmd0aDsKCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChjdXJyZW50WzZdID09IDMpIHsgICAgICAvKiBBVCBncm91cCBvaWQgKi8KICAgICAgICBvaWRfbGVuZ3RoID0gMTY7CiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICBvaWRfbGVuZ3RoID0gMTU7CiAgICB9CgogICAgTG93QWRkciA9IDA7ICAgICAgICAgICAgICAgIC8qIERvbid0IGhhdmUgb25lIHlldCAqLwogICAgZm91bmRvbmUgPSAwOwogICAgQVJQX1NjYW5fSW5pdCgpOwogICAgZm9yICg7OykgewojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgICAgICBpZiAoQVJQX1NjYW5fTmV4dCgmQWRkciwgUGh5c0FkZHIsICZQaHlzQWRkckxlbiwgJmlmVHlwZSwgJmlmSW5kZXgpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGN1cnJlbnRbMTBdID0gaWZJbmRleDsKCiAgICAgICAgaWYgKGN1cnJlbnRbNl0gPT0gMykgeyAgLyogQVQgZ3JvdXAgb2lkICovCiAgICAgICAgICAgIGN1cnJlbnRbMTFdID0gMTsKICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTI7CiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTE7CiAgICAgICAgfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgaWYgKEFSUF9TY2FuX05leHQoJkFkZHIsIFBoeXNBZGRyLCAmUGh5c0FkZHJMZW4sICZpZlR5cGUpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGN1cnJlbnRbMTBdID0gMTsKCiAgICAgICAgaWYgKGN1cnJlbnRbNl0gPT0gMykgeyAgLyogQVQgZ3JvdXAgb2lkICovCiAgICAgICAgICAgIGN1cnJlbnRbMTFdID0gMTsKICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTI7CiAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTE7CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgY3AgPSAodV9jaGFyICopICYgQWRkcjsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAqb3ArKyA9ICpjcCsrOwoKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2lkX2xlbmd0aCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBvaWRfbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93QWRkciA9IEFkZHI7CiAgICAgICAgICAgICAgICBmb3VuZG9uZSA9IDE7CiNpZmRlZiBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUwogICAgICAgICAgICAgICAgbG93SWZJbmRleCA9IGlmSW5kZXg7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgICAgICAgICBtZW1jcHkoTG93UGh5c0FkZHIsIFBoeXNBZGRyLCBzaXplb2YoUGh5c0FkZHIpKTsKICAgICAgICAgICAgICAgIExvd1BoeXNBZGRyTGVuID0gUGh5c0FkZHJMZW47CiAgICAgICAgICAgICAgICBsb3dJZlR5cGUgPSBpZlR5cGU7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIG9pZF9sZW5ndGgsIG5hbWUsICpsZW5ndGgpID4gMCkKICAgICAgICAgICAgICAgICYmICgoZm91bmRvbmUgPT0gMCkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50LCBvaWRfbGVuZ3RoLCBsb3dlc3QsIG9pZF9sZW5ndGgpIDwgMCkpKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaWYgbmV3IG9uZSBpcyBncmVhdGVyIHRoYW4gaW5wdXQgYW5kIGNsb3NlciB0byBpbnB1dCB0aGFuCiAgICAgICAgICAgICAgICAgKiBwcmV2aW91cyBsb3dlc3QsIHNhdmUgdGhpcyBvbmUgYXMgdGhlICJuZXh0IiBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgb2lkX2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIExvd0FkZHIgPSBBZGRyOwogICAgICAgICAgICAgICAgZm91bmRvbmUgPSAxOwojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgICAgICAgICAgICAgIGxvd0lmSW5kZXggPSBpZkluZGV4OwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBBUlBfU0NBTl9GT1VSX0FSR1VNRU5UUyAqLwogICAgICAgICAgICAgICAgbWVtY3B5KExvd1BoeXNBZGRyLCBQaHlzQWRkciwgc2l6ZW9mKFBoeXNBZGRyKSk7CiAgICAgICAgICAgICAgICBMb3dQaHlzQWRkckxlbiA9IFBoeXNBZGRyTGVuOwogICAgICAgICAgICAgICAgbG93SWZUeXBlID0gaWZUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kb25lID09IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbG93ZXN0LCBvaWRfbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IG9pZF9sZW5ndGg7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIElQTUVESUFJRklOREVYOiAgICAgICAvKiBhbHNvIEFUSUZJTkRFWCAqLwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mIGxvbmdfcmV0dXJuOwojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKICAgICAgICBsb25nX3JldHVybiA9IGxvd0lmSW5kZXg7CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMgKi8KI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgICAgIC8qIFhYWCAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTICovCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBNRURJQVBIWVNBRERSRVNTOiAgIC8qIGFsc28gQVRQSFlTQUREUkVTUyAqLwogICAgICAgICp2YXJfbGVuID0gTG93UGh5c0FkZHJMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgTG93UGh5c0FkZHI7CiAgICBjYXNlIElQTUVESUFORVRBRERSRVNTOiAgICAvKiBhbHNvIEFUTkVUQUREUkVTUyAqLwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGFkZHJfcmV0KTsKICAgICAgICBhZGRyX3JldCA9IExvd0FkZHI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKICAgIGNhc2UgSVBNRURJQVRZUEU6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YgbG9uZ19yZXR1cm47CiAgICAgICAgbG9uZ19yZXR1cm4gPSBsb3dJZlR5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9hdEVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKdHlwZWRlZiBzdHJ1Y3QgaWZfaXAgewogICAgaW50ICAgICAgICAgICAgIGlmSWR4OwogICAgSXBBZGRyZXNzICAgICAgIGlwQWRkcjsKfSBpZl9pcF90OwoKc3RhdGljIGludApBVF9DbXAodm9pZCAqYWRkciwgdm9pZCAqZXApCnsKICAgIG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCAqbXAgPSAobWliMl9pcE5ldFRvTWVkaWFFbnRyeV90ICopIGVwOwogICAgaW50ICAgICAgICAgICAgIHJldCA9IC0xOwogICAgb2lkICAgICAgICAgICAgIGluZGV4OwoKI2lmZGVmIE5FVFNOTVBfSU5DTFVERV9JRlRBQkxFX1JFV1JJVEVTCiAgICBtcC0+aXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzW21wLT5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fbGVuZ3RoXSA9ICdcMCc7CiAgICBpbmRleCA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9pbmRleF9maW5kKAogICAgICAgICAgICAgICAgICAgIG1wLT5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXMpOwojZWxzZQogICAgaW5kZXggPSBJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShtcC0+aXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC0+aXBOZXRUb01lZGlhSWZJbmRleC5vX2xlbmd0aCk7CiNlbmRpZgogICAgREVCVUdNU0dUTCgoIm1pYklJL2F0IiwgIi4uLi4uLi4uLiBBVF9DbXAgJWx4PD4lbHggJWQ8PiVkICglLjVzKVxuIiwKICAgICAgICAgICAgICAgIG1wLT5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzLCAoKGlmX2lwX3QgKikgYWRkciktPmlwQWRkciwKICAgICAgICAgICAgICAgICgoaWZfaXBfdCAqKSBhZGRyKS0+aWZJZHgsIGluZGV4LAogICAgICAgICAgICAgICAgbXAtPmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlcykpOwogICAgaWYgKG1wLT5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzICE9ICgoaWZfaXBfdCAqKSBhZGRyKS0+aXBBZGRyKQogICAgICAgIHJldCA9IDE7CiAgICBlbHNlIGlmICgoKGlmX2lwX3QgKikgYWRkciktPmlmSWR4ICE9IGluZGV4KQogICAgICAgIHJldCA9IDE7CiAgICBlbHNlCiAgICAgICAgcmV0ID0gMDsKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9hdCIsICIuLi4uLi4uLi4gQVRfQ21wIHJldHVybnMgJWRcbiIsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfYXRFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS4zLjEuMS4xLmludGVyZmFjZS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJbnRlcmZhY2UgaXMgYXQgb2Zmc2V0IDEwLAogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTIuCiAgICAgKi8KI2RlZmluZSBBVF9NQVhfTkFNRV9MRU5HVEgJMTYKI2RlZmluZSBBVF9JRklOREVYX09GRgkxMAogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFtBVF9NQVhfTkFNRV9MRU5HVEhdOwogICAgb2lkICAgICAgICAgICAgIGN1cnJlbnRbQVRfTUFYX05BTUVfTEVOR1RIXTsKICAgIGlmX2lwX3QgICAgICAgICBOZXh0QWRkcjsKICAgIG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCBlbnRyeTsKICAgIHN0YXRpYyBtaWIyX2lwTmV0VG9NZWRpYUVudHJ5X3QgTG93ZW50cnk7CiAgICBpbnQgICAgICAgICAgICAgRm91bmQgPSAwOwogICAgcmVxX2UgICAgICAgICAgIHJlcV90eXBlOwogICAgaW50ICAgICAgICAgICAgIG9mZnNldCwgb2xlbmd0aDsKICAgIHN0YXRpYyBpbl9hZGRyX3QgICAgICBhZGRyX3JldDsKCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9hdCIsICJ2YXJfYXRFbnRyeTogIikpOwogICAgREVCVUdNU0dPSUQoKCJtaWJJSS9hdCIsIHZwLT5uYW1lLCB2cC0+bmFtZWxlbikpOwogICAgREVCVUdNU0coKCJtaWJJSS9hdCIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtc2V0KCZMb3dlbnRyeSwgMCwgc2l6ZW9mKExvd2VudHJ5KSk7CiAgICBtZW1jcHkoKGNoYXIgKikgY3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgbG93ZXN0WzBdID0gMTAyNDsKICAgIGZvciAoTmV4dEFkZHIuaXBBZGRyID0gKHVfbG9uZykgLSAxLCBOZXh0QWRkci5pZklkeCA9IDI1NSwgcmVxX3R5cGUgPQogICAgICAgICBHRVRfRklSU1Q7OwogICAgICAgICBOZXh0QWRkci5pcEFkZHIgPSBlbnRyeS5pcE5ldFRvTWVkaWFOZXRBZGRyZXNzLCBOZXh0QWRkci5pZklkeCA9CiAgICAgICAgIGN1cnJlbnRbQVRfSUZJTkRFWF9PRkZdLCByZXFfdHlwZSA9IEdFVF9ORVhUKSB7CiAgICAgICAgaWYgKGdldE1pYnN0YXQKICAgICAgICAgICAgKE1JQl9JUF9ORVQsICZlbnRyeSwgc2l6ZW9mKG1pYjJfaXBOZXRUb01lZGlhRW50cnlfdCksCiAgICAgICAgICAgICByZXFfdHlwZSwgJkFUX0NtcCwgJk5leHRBZGRyKSAhPSAwKQogICAgICAgICAgICBicmVhazsKI2lmZGVmIE5FVFNOTVBfSU5DTFVERV9JRlRBQkxFX1JFV1JJVEVTCiAgICAgICAgZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzW2VudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19sZW5ndGhdID0gJ1wwJzsKICAgICAgICBjdXJyZW50W0FUX0lGSU5ERVhfT0ZGXSA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9pbmRleF9maW5kKAogICAgICAgICAgIGVudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19ieXRlcyk7CiNlbHNlCiAgICAgICAgY3VycmVudFtBVF9JRklOREVYX09GRl0gPSAKICAgICAgICAgICBJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShlbnRyeS5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2xlbmd0aCk7CiNlbmRpZgogICAgICAgIGlmIChjdXJyZW50WzZdID09IDMpIHsgIC8qIEFUIGdyb3VwIG9pZCAqLwogICAgICAgICAgICBjdXJyZW50W0FUX0lGSU5ERVhfT0ZGICsgMV0gPSAxOwogICAgICAgICAgICBvZmZzZXQgPSBBVF9JRklOREVYX09GRiArIDI7CiAgICAgICAgICAgIG9sZW5ndGggPSBBVF9JRklOREVYX09GRiArIDY7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2Zmc2V0ID0gQVRfSUZJTkRFWF9PRkYgKyAxOwogICAgICAgICAgICBvbGVuZ3RoID0gQVRfSUZJTkRFWF9PRkYgKyA1OwogICAgICAgIH0KICAgICAgICBDT1BZX0lQQUREUihjcCwgKHVfY2hhciAqKSAmIGVudHJ5LmlwTmV0VG9NZWRpYU5ldEFkZHJlc3MsIG9wLAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKyBvZmZzZXQpOwogICAgICAgIGlmIChleGFjdCkgewogICAgICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShjdXJyZW50LCBvbGVuZ3RoLCBuYW1lLCAqbGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgIG9sZW5ndGggKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBMb3dlbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgRm91bmQrKzsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShjdXJyZW50LCBvbGVuZ3RoLCBuYW1lLCAqbGVuZ3RoKSA+IDAKICAgICAgICAgICAgICAgICYmIHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgb2xlbmd0aCwgbG93ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGVuZ3RoKSA8IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpZiBuZXcgb25lIGlzIGdyZWF0ZXIgdGhhbiBpbnB1dCBhbmQgY2xvc2VyIHRvIGlucHV0IHRoYW4KICAgICAgICAgICAgICAgICAqIHByZXZpb3VzIGxvd2VzdCwgYW5kIGlzIG5vdCBlcXVhbCB0byBpdCwgc2F2ZSB0aGlzIG9uZSBhcyB0aGUgIm5leHQiIG9uZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBvbGVuZ3RoICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgTG93ZW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgICAgIEZvdW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUkvYXQiLCAiLi4uIEZvdW5kID0gJWRcbiIsIEZvdW5kKSk7CiAgICBpZiAoRm91bmQgPT0gMCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIGxvd2VzdCwgb2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSBvbGVuZ3RoOwogICAgKndyaXRlX21ldGhvZCA9IDA7CiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUE1FRElBSUZJTkRFWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZiBsb25nX3JldHVybjsKI2lmZGVmIE5FVFNOTVBfSU5DTFVERV9JRlRBQkxFX1JFV1JJVEVTCiAgICAgICAgTG93ZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzWwogICAgICAgICAgICBMb3dlbnRyeS5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fbGVuZ3RoXSA9ICdcMCc7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfaW5kZXhfZmluZCgKICAgICAgICAgICAgTG93ZW50cnkuaXBOZXRUb01lZGlhSWZJbmRleC5vX2J5dGVzKTsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IEludGVyZmFjZV9JbmRleF9CeV9OYW1lKAogICAgICAgICAgICBMb3dlbnRyeS5pcE5ldFRvTWVkaWFJZkluZGV4Lm9fYnl0ZXMsCiAgICAgICAgICAgIExvd2VudHJ5LmlwTmV0VG9NZWRpYUlmSW5kZXgub19sZW5ndGgpOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBJUE1FRElBUEhZU0FERFJFU1M6CiAgICAgICAgKnZhcl9sZW4gPSBMb3dlbnRyeS5pcE5ldFRvTWVkaWFQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICByZXR1cm4gTG93ZW50cnkuaXBOZXRUb01lZGlhUGh5c0FkZHJlc3Mub19ieXRlczsKICAgIGNhc2UgSVBNRURJQU5FVEFERFJFU1M6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gTG93ZW50cnkuaXBOZXRUb01lZGlhTmV0QWRkcmVzczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmYWRkcl9yZXQ7CiAgICBjYXNlIElQTUVESUFUWVBFOgogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mIGxvbmdfcmV0dXJuOwogICAgICAgIGxvbmdfcmV0dXJuID0gTG93ZW50cnkuaXBOZXRUb01lZGlhVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2F0RW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIHNvbGFyaXMyCgpzdGF0aWMgaW50ICAgICAgYXJwdGFiX3NpemUsIGFycHRhYl9jdXJyZW50OwojaWYgTkVUU05NUF9DQU5fVVNFX1NZU0NUTApzdGF0aWMgY2hhciAgICAqbGltLCAqcnRuZXh0OwpzdGF0aWMgY2hhciAgICAqYXQgPSAwOwojZWxzZQojaWZkZWYgU1RSVUNUX0FSUEhEX0hBU19BVF9ORVhUCnN0YXRpYyBzdHJ1Y3QgYXJwaGQgKmF0ID0gMDsKc3RhdGljIHN0cnVjdCBhcnB0YWIgKmF0X3B0ciwgYXRfZW50cnk7CnN0YXRpYyBzdHJ1Y3QgYXJwY29tIGF0X2NvbTsKI2VsaWYgZGVmaW5lZChocHV4MTEpCnN0YXRpYyBtaWJfaXBOZXRUb01lZGlhRW50ICphdCA9IChtaWJfaXBOZXRUb01lZGlhRW50ICopIDA7CiNlbHNlCgovKgogKiBhdCB1c2VkIHRvIGJlIGFsbG9jYXRlZCBldmVyeSB0aW1lIHdlIG5lZWRlZCB0byBsb29rIGF0IHRoZSBhcnAgY2FjaGUuCiAqIFRoaXMgY2F1c2UgdXMgdG8gcGFyc2UgL3Byb2MvbmV0L2FycCB0d2ljZSBmb3IgZWFjaCByZXF1ZXN0IGFuZCBkaWRuJ3QKICogYWxsb3cgdXMgdG8gZmlsdGVyIHRoaW5ncyBsaWtlIHdlJ2QgbGlrZSB0by4gIFNvIG5vdyB3ZSB1c2UgaXQgCiAqIHNlbWktc3RhdGljYWxseS4gIFdlIGluaXRpYWxpemUgaXQgdG8gc2l6ZSAwIGFuZCBpZiB3ZSBuZWVkIG1vcmUgcm9vbQogKiB3ZSByZWFsbG9jIHJvb20gZm9yIEFSUF9DQUNIRV9JTkNSIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUuCiAqIFdlIG5ldmVyIHJlbGVhc2Ugd2hhdCB3ZSd2ZSB0YWtlbiAuIC4gLgogKi8KI2RlZmluZSBBUlBfQ0FDSEVfSU5DUiAxMDI0CnN0YXRpYyBzdHJ1Y3QgYXJwdGFiICphdCA9IE5VTEw7CnN0YXRpYyBpbnQgICAgICBhcnB0YWJfY3Vycl9tYXhfc2l6ZSA9IDA7CgojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCgpzdGF0aWMgdm9pZApBUlBfU2Nhbl9Jbml0KHZvaWQpCnsKI2lmbmRlZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMCiNpZm5kZWYgbGludXgKI2lmZGVmIGhwdXgxMQoKICAgIGludCAgICAgICAgICAgICBmZDsKICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgaW50ICAgICAgICAgICAgIHZhbDsKICAgIHVuc2lnbmVkIGludCAgICB1bGVuOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAoYXQpCiAgICAgICAgZnJlZShhdCk7CiAgICBhdCA9IChtaWJfaXBOZXRUb01lZGlhRW50ICopIDA7CiAgICBhcnB0YWJfc2l6ZSA9IDA7CgogICAgaWYgKChmZCA9IG9wZW5fbWliKCIvZGV2L2lwIiwgT19SRE9OTFksIDAsIE5NX0FTWU5DX09GRikpID49IDApIHsKICAgICAgICBwLm9iamlkID0gSURfaXBOZXRUb01lZGlhVGFibGVOdW07CiAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgIGFycHRhYl9zaXplID0gdmFsOwoKICAgICAgICBpZiAoYXJwdGFiX3NpemUgPiAwKSB7CiAgICAgICAgICAgIHVsZW4gPSAodW5zaWduZWQpIGFycHRhYl9zaXplICpzaXplb2YobWliX2lwTmV0VG9NZWRpYUVudCk7CiAgICAgICAgICAgIGF0ID0gKG1pYl9pcE5ldFRvTWVkaWFFbnQgKikgbWFsbG9jKHVsZW4pOwogICAgICAgICAgICBtZW1zZXQoYXQsIDAsIHVsZW4pOwogICAgICAgICAgICBwLm9iamlkID0gSURfaXBOZXRUb01lZGlhVGFibGU7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgYXQ7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpIDwgMCkKICAgICAgICAgICAgICAgIGFycHRhYl9zaXplID0gMDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYXJwdGFiX3NpemUgPSAqcC5sZW4gLyBzaXplb2YobWliX2lwTmV0VG9NZWRpYUVudCk7CiAgICAgICAgfQoKICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgfQoKICAgIGFycHRhYl9jdXJyZW50ID0gMDsKCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgogICAgaWYgKCFhdCkgewojaWZkZWYgQVJQVEFCX1NJWkVfU1lNQk9MCiAgICAgICAgYXV0b19ubGlzdChBUlBUQUJfU0laRV9TWU1CT0wsIChjaGFyICopICZhcnB0YWJfc2l6ZSwKICAgICAgICAgICAgICAgICAgIHNpemVvZiBhcnB0YWJfc2l6ZSk7CiNpZmRlZiBTVFJVQ1RfQVJQSERfSEFTX0FUX05FWFQKICAgICAgICBhdCA9IChzdHJ1Y3QgYXJwaGQgKikgbWFsbG9jKGFycHRhYl9zaXplICogc2l6ZW9mKHN0cnVjdCBhcnBoZCkpOwojZWxzZQogICAgICAgIGF0ID0gKHN0cnVjdCBhcnB0YWIgKikgbWFsbG9jKGFycHRhYl9zaXplICogc2l6ZW9mKHN0cnVjdCBhcnB0YWIpKTsKI2VuZGlmCiNlbHNlCiAgICAgICAgcmV0dXJuOwojZW5kaWYKICAgIH0KI2lmZGVmIFNUUlVDVF9BUlBIRF9IQVNfQVRfTkVYVAogICAgYXV0b19ubGlzdChBUlBUQUJfU1lNQk9MLCAoY2hhciAqKSBhdCwKICAgICAgICAgICAgICAgYXJwdGFiX3NpemUgKiBzaXplb2Yoc3RydWN0IGFycGhkKSk7CiAgICBhdF9wdHIgPSBhdFswXS5hdF9uZXh0OwojZWxzZQogICAgYXV0b19ubGlzdChBUlBUQUJfU1lNQk9MLCAoY2hhciAqKSBhdCwKICAgICAgICAgICAgICAgYXJwdGFiX3NpemUgKiBzaXplb2Yoc3RydWN0IGFycHRhYikpOwojZW5kaWYKICAgIGFycHRhYl9jdXJyZW50ID0gMDsKCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KCiAgICBzdGF0aWMgdGltZV90ICAgdG0gPSAwOyAgICAgLyogVGltZSBvZiBsYXN0IHNjYW4gKi8KICAgIEZJTEUgICAgICAgICAgICppbjsKICAgIGludCAgICAgICAgICAgICBpLCBqOwogICAgY2hhciAgICAgICAgICAgIGxpbmVbMTI4XTsKICAgIGludCAgICAgICAgICAgICB6YSwgemIsIHpjLCB6ZDsKICAgIGNoYXIgICAgICAgICAgICBpZm5hbWVbMjFdOwogICAgY2hhciAgICAgICAgICAgIG1hY1szKk1BWF9NQUNfQUREUl9MRU4rMV07CiAgICBjaGFyICAgICAgICAgICAqdG9rOwoKICAgIGFycHRhYl9jdXJyZW50ID0gMDsgICAgICAgICAvKiBBbnl0aW1lIHRoaXMgaXMgY2FsbGVkIHdlIG5lZWQgdG8gcmVzZXQgJ2N1cnJlbnQnICovCgogICAgaWYgKHRpbWUoTlVMTCkgPCB0bSArIDEpIHsgIC8qT3VyIGNvb2wgb25lIHNlY29uZCBjYWNoZSBpbXBsZW1lbnRhdGlvbiA6LSkgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW4gPSBmb3BlbigiL3Byb2MvbmV0L2FycCIsICJyIik7CiAgICBpZiAoIWluKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInNubXBkOiBDYW5ub3Qgb3BlbiAvcHJvYy9uZXQvYXJwXG4iKTsKICAgICAgICBhcnB0YWJfc2l6ZSA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBHZXQgcmlkIG9mIHRoZSBoZWFkZXIgbGluZSAKICAgICAqLwogICAgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbik7CgogICAgaSA9IDA7CiAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKICAgICAgICB1X2xvbmcgICAgICAgICAgdG1wX2E7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRtcF9mbGFnczsKICAgICAgICBpZiAoaSA+PSBhcnB0YWJfY3Vycl9tYXhfc2l6ZSkgewogICAgICAgICAgICBzdHJ1Y3QgYXJwdGFiICAqbmV3dGFiID0gKHN0cnVjdCBhcnB0YWIgKikKICAgICAgICAgICAgICAgIHJlYWxsb2MoYXQsIChzaXplb2Yoc3RydWN0IGFycHRhYikgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcnB0YWJfY3Vycl9tYXhfc2l6ZSArIEFSUF9DQUNIRV9JTkNSKSkpOwogICAgICAgICAgICBpZiAobmV3dGFiID09IGF0KSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGFsbG9jYXRpbmcgbW9yZSBzcGFjZSBmb3IgYXJwY2FjaGUuICAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FjaGUgd2lsbCBjb250aW51ZSB0byBiZSBsaW1pdGVkIHRvICVkIGVudHJpZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXJwdGFiX2N1cnJfbWF4X3NpemUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhcnB0YWJfY3Vycl9tYXhfc2l6ZSArPSBBUlBfQ0FDSEVfSU5DUjsKICAgICAgICAgICAgICAgIGF0ID0gbmV3dGFiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICg3ICE9CiAgICAgICAgICAgIHNzY2FuZihsaW5lLAogICAgICAgICAgICAgICAgICAgIiVkLiVkLiVkLiVkIDB4JSp4IDB4JXggJXMgJSpbXiBdICUyMHNcbiIsCiAgICAgICAgICAgICAgICAgICAmemEsICZ6YiwgJnpjLCAmemQsICZ0bXBfZmxhZ3MsIG1hYywgaWZuYW1lKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiQmFkIGxpbmUgaW4gL3Byb2MvbmV0L2FycDogJXMiLCBsaW5lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogSW52YWxpZGF0ZWQgZW50cmllcyBoYXZlIHRoZWlyIGZsYWcgc2V0IHRvIDAuCiAgICAgICAgICogKiBXZSB3YW50IHRvIGlnbm9yZSB0aGVtIAogICAgICAgICAqLwogICAgICAgIGlmICh0bXBfZmxhZ3MgPT0gMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWZuYW1lW3NpemVvZihpZm5hbWUpLTFdID0gMDsgLyogbWFrZSBzdXJlIG5hbWUgaXMgbnVsbCB0ZXJtaW5hdGVkICovCiAgICAgICAgYXRbaV0uYXRfZmxhZ3MgPSB0bXBfZmxhZ3M7CiAgICAgICAgdG1wX2EgPSAoKHVfbG9uZykgemEgPDwgMjQpIHwKICAgICAgICAgICAgKCh1X2xvbmcpIHpiIDw8IDE2KSB8ICgodV9sb25nKSB6YyA8PCA4KSB8ICgodV9sb25nKSB6ZCk7CiAgICAgICAgYXRbaV0uYXRfaWFkZHIuc19hZGRyID0gaHRvbmwodG1wX2EpOwogICAgICAgIGF0W2ldLmlmX2luZGV4ID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoaWZuYW1lKTsKICAgICAgICAKICAgICAgICBmb3IgKGo9MCx0b2s9c3RydG9rKG1hYywgIjoiKTsgdG9rICE9IE5VTEw7IHRvaz1zdHJ0b2soTlVMTCwgIjoiKSxqKyspIHsKICAgICAgICAJYXRbaV0uYXRfZW5hZGRyW2pdID0gc3RydG9sKHRvaywgTlVMTCwgMTYpOwogICAgICAgIH0KICAgICAgICBhdFtpXS5hdF9lbmFkZHJfbGVuID0gajsKICAgICAgICBpKys7CiAgICB9CiAgICBhcnB0YWJfc2l6ZSA9IGk7CgogICAgZmNsb3NlKGluKTsKICAgIHRpbWUoJnRtKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KCiAgICBpbnQgICAgICAgICAgICAgbWliWzZdOwogICAgc2l6ZV90ICAgICAgICAgIG5lZWRlZDsKCiAgICBtaWJbMF0gPSBDVExfTkVUOwogICAgbWliWzFdID0gUEZfUk9VVEU7CiAgICBtaWJbMl0gPSAwOwogICAgbWliWzNdID0gQUZfSU5FVDsKICAgIG1pYls0XSA9IE5FVF9SVF9GTEFHUzsKI2lmIGRlZmluZWQgUlRGX0xMSU5GTwogICAgbWliWzVdID0gUlRGX0xMSU5GTzsKI2Vsc2UKICAgIG1pYls1XSA9IDA7CiNlbmRpZgoKICAgIGlmIChhdCkKICAgICAgICBmcmVlKGF0KTsKICAgIHJ0bmV4dCA9IGxpbSA9IGF0ID0gMDsKCiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgTlVMTCwgJm5lZWRlZCwgTlVMTCwgMCkgPCAwKQogICAgICAgIHNubXBfbG9nX3BlcnJvcigicm91dGUtc3lzY3RsLWVzdGltYXRlIik7CiAgICBlbHNlIHsKICAgICAgICBpZiAoKGF0ID0gbWFsbG9jKG5lZWRlZCA/IG5lZWRlZCA6IDEpKSA9PSBOVUxMKQogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIm1hbGxvYyIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoc3lzY3RsKG1pYiwgNiwgYXQsICZuZWVkZWQsIE5VTEwsIDApIDwgMCkKICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigiYWN0dWFsIHJldHJpZXZhbCBvZiByb3V0aW5nIHRhYmxlIik7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGltID0gYXQgKyBuZWVkZWQ7CiAgICAgICAgICAgICAgICBydG5leHQgPSBhdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAqLwp9CgojaWZkZWYgQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMKc3RhdGljIGludApBUlBfU2Nhbl9OZXh0KGluX2FkZHJfdCAqIElQQWRkciwgY2hhciAqUGh5c0FkZHIsIGludCAqUGh5c0FkZHJMZW4sCiAgICAgICAgICAgICAgdV9sb25nICogaWZUeXBlLCB1X3Nob3J0ICogaWZJbmRleCkKI2Vsc2UKc3RhdGljIGludApBUlBfU2Nhbl9OZXh0KGluX2FkZHJfdCAqIElQQWRkciwgY2hhciAqUGh5c0FkZHIsIGludCAqUGh5c0FkZHJMZW4sCiAgICAgICAgICAgICAgdV9sb25nICogaWZUeXBlKQojZW5kaWYKewojaWZuZGVmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKI2lmZGVmIGxpbnV4CiAgICBpZiAoYXJwdGFiX2N1cnJlbnQgPCBhcnB0YWJfc2l6ZSkgewogICAgICAgIC8qCiAgICAgICAgICogY29weSB2YWx1ZXMgCiAgICAgICAgICovCiAgICAgICAgKklQQWRkciA9IGF0W2FycHRhYl9jdXJyZW50XS5hdF9pYWRkci5zX2FkZHI7CiAgICAgICAgKmlmVHlwZSA9CiAgICAgICAgICAgIChhdFthcnB0YWJfY3VycmVudF0uCiAgICAgICAgICAgICBhdF9mbGFncyAmIEFURl9QRVJNKSA/IDQgLypzdGF0aWMgKi8gOiAzIC8qZHluYW1pYyAqLyA7CiAgICAgICAgKmlmSW5kZXggPSBhdFthcnB0YWJfY3VycmVudF0uaWZfaW5kZXg7CiAgICAgICAgbWVtY3B5KFBoeXNBZGRyLCAmYXRbYXJwdGFiX2N1cnJlbnRdLmF0X2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGF0W2FycHRhYl9jdXJyZW50XS5hdF9lbmFkZHIpKTsKICAgICAgICAqUGh5c0FkZHJMZW4gPSBhdFthcnB0YWJfY3VycmVudF0uYXRfZW5hZGRyX2xlbjsKCiAgICAgICAgLyoKICAgICAgICAgKiBpbmNyZW1lbnQgdG8gcG9pbnQgbmV4dCBlbnRyeSAKICAgICAgICAgKi8KICAgICAgICBhcnB0YWJfY3VycmVudCsrOwogICAgICAgIC8qCiAgICAgICAgICogcmV0dXJuIHN1Y2Nlc3MgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuICgxKTsKICAgIH0KI2VsaWYgZGVmaW5lZChocHV4MTEpCiAgICBpZiAoYXJwdGFiX2N1cnJlbnQgPCBhcnB0YWJfc2l6ZSkgewogICAgICAgIC8qCiAgICAgICAgICogY29weSB2YWx1ZXMgCiAgICAgICAgICovCiAgICAgICAgKklQQWRkciA9IGF0W2FycHRhYl9jdXJyZW50XS5OZXRBZGRyOwogICAgICAgIG1lbWNweShQaHlzQWRkciwgYXRbYXJwdGFiX2N1cnJlbnRdLlBoeXNBZGRyLm9fYnl0ZXMsCiAgICAgICAgICAgICAgIGF0W2FycHRhYl9jdXJyZW50XS5QaHlzQWRkci5vX2xlbmd0aCk7CiAgICAgICAgKmlmVHlwZSA9IGF0W2FycHRhYl9jdXJyZW50XS5UeXBlOwogICAgICAgICppZkluZGV4ID0gYXRbYXJwdGFiX2N1cnJlbnRdLklmSW5kZXg7CiAgICAgICAgKlBoeXNBZGRyTGVuID0gYXRbYXJwdGFiX2N1cnJlbnRdLlBoeXNBZGRyLm9fbGVuZ3RoOwogICAgICAgIC8qCiAgICAgICAgICogaW5jcmVtZW50IHRvIHBvaW50IG5leHQgZW50cnkgCiAgICAgICAgICovCiAgICAgICAgYXJwdGFiX2N1cnJlbnQrKzsKICAgICAgICAvKgogICAgICAgICAqIHJldHVybiBzdWNjZXNzIAogICAgICAgICAqLwogICAgICAgIHJldHVybiAoMSk7CiAgICB9CiNlbGlmICFkZWZpbmVkKEFSUF9TQ0FOX0ZPVVJfQVJHVU1FTlRTKSB8fCBkZWZpbmVkKGhwdXgpCiAgICByZWdpc3RlciBzdHJ1Y3QgYXJwdGFiICphdGFiOwoKICAgIHdoaWxlIChhcnB0YWJfY3VycmVudCA8IGFycHRhYl9zaXplKSB7CiNpZmRlZiBTVFJVQ1RfQVJQSERfSEFTX0FUX05FWFQKICAgICAgICAvKgogICAgICAgICAqIFRoZSBhcnAgdGFibGUgaXMgYW4gYXJyYXkgb2YgbGlua2VkIGxpc3RzIG9mIGFycHRhYiBlbnRyaWVzLgogICAgICAgICAqIFVudXNlZCBzbG90cyBoYXZlIHBvaW50ZXJzIGJhY2sgdG8gdGhlIGFycmF5IGVudHJ5IGl0c2VsZiAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKGF0X3B0ciA9PSAoYXV0b19ubGlzdF92YWx1ZShBUlBUQUJfU1lNQk9MKSArCiAgICAgICAgICAgICAgICAgICAgICAgYXJwdGFiX2N1cnJlbnQgKiBzaXplb2Yoc3RydWN0IGFycGhkKSkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogVXN1c2VkIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYXJwdGFiX2N1cnJlbnQrKzsKICAgICAgICAgICAgYXRfcHRyID0gYXRbYXJwdGFiX2N1cnJlbnRdLmF0X25leHQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoYXRfcHRyLCAoY2hhciAqKSAmYXRfZW50cnksIHNpemVvZihzdHJ1Y3QgYXJwdGFiKSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2F0OkFSUF9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChhdF9lbnRyeS5hdF9hYywgKGNoYXIgKikgJmF0X2NvbSwgc2l6ZW9mKHN0cnVjdCBhcnBjb20pKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvYXQ6QVJQX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGF0X3B0ciA9IGF0X2VudHJ5LmF0X25leHQ7CiAgICAgICAgYXRhYiA9ICZhdF9lbnRyeTsKICAgICAgICAqaWZJbmRleCA9IGF0X2NvbS5hY19pZi5pZl9pbmRleDsgICAgICAgLyogbm90IHN0cmljdGx5IEFSUEhEICovCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1RSVUNUX0FSUEhEX0hBU19BVF9ORVhUICovCiAgICAgICAgYXRhYiA9ICZhdFthcnB0YWJfY3VycmVudCsrXTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTVFJVQ1RfQVJQSERfSEFTX0FUX05FWFQgKi8KICAgICAgICBpZiAoIShhdGFiLT5hdF9mbGFncyAmIEFURl9DT00pKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAqaWZUeXBlID0gKGF0YWItPmF0X2ZsYWdzICYgQVRGX1BFUk0pID8gNCA6IDM7CiAgICAgICAgKklQQWRkciA9IGF0YWItPmF0X2lhZGRyLnNfYWRkcjsKI2lmIGRlZmluZWQgKHN1blYzKSB8fCBkZWZpbmVkKHNwYXJjKSB8fCBkZWZpbmVkKGhwdXgpCiAgICAgICAgbWVtY3B5KFBoeXNBZGRyLCAoY2hhciAqKSAmYXRhYi0+YXRfZW5hZGRyLAogICAgICAgICAgICAgICBzaXplb2YoYXRhYi0+YXRfZW5hZGRyKSk7CiAgICAgICAgKlBoeXNBZGRyTGVuID0gc2l6ZW9mKGF0YWItPmF0X2VuYWRkcik7CiNlbmRpZgojaWYgZGVmaW5lZChtaXBzKSB8fCBkZWZpbmVkKGlibTAzMikKICAgICAgICBtZW1jcHkoUGh5c0FkZHIsIChjaGFyICopIGF0YWItPmF0X2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGF0YWItPmF0X2VuYWRkcikpOwogICAgICAgICpQaHlzQWRkckxlbiA9IHNpemVvZihhdGFiLT5hdF9lbmFkZHIpOwojZW5kaWYKICAgICAgICByZXR1cm4gKDEpOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4IHx8IGhwdXgxMSB8fCAhQVJQX1NDQU5fRk9VUl9BUkdVTUVOVFMgfHwgaHB1eCAqLwoKICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIHNvbWVvbmUgd2l0aCBhbiBpcml4IGJveCB0byBmaXggdGhpcyBzZWN0aW9uICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICovCiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydG07CiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW5hcnAgKnNpbjsKICAgIHN0cnVjdCBzb2NrYWRkcl9kbCAqc2RsOwoKICAgIHdoaWxlIChydG5leHQgPCBsaW0pIHsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBydG5leHQ7CiAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbmFycCAqKSAocnRtICsgMSk7CiAgICAgICAgc2RsID0gKHN0cnVjdCBzb2NrYWRkcl9kbCAqKSAoc2luICsgMSk7CiAgICAgICAgcnRuZXh0ICs9IHJ0bS0+cnRtX21zZ2xlbjsKICAgICAgICBpZiAoc2RsLT5zZGxfYWxlbikgewojaWZkZWYgaXJpeDYKICAgICAgICAgICAgKklQQWRkciA9IHNpbi0+c2FycF9hZGRyLnNfYWRkcjsKI2Vsc2UKICAgICAgICAgICAgKklQQWRkciA9IHNpbi0+c2luX2FkZHIuc19hZGRyOwojZW5kaWYKICAgICAgICAgICAgbWVtY3B5KFBoeXNBZGRyLCAoY2hhciAqKSBMTEFERFIoc2RsKSwgc2RsLT5zZGxfYWxlbik7CiAgICAgICAgICAgICpQaHlzQWRkckxlbiA9IHNkbC0+c2RsX2FsZW47CiAgICAgICAgICAgICppZkluZGV4ID0gc2RsLT5zZGxfaW5kZXg7CiAgICAgICAgICAgICppZlR5cGUgPSAxOyAgICAgICAgLyogWFhYICovCiAgICAgICAgICAgIHJldHVybiAoMSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qICJFT0YiICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIU5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgKi8KfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwojaW5jbHVkZSA8aXBobHBhcGkuaD4KCmV4dGVybiBXcml0ZU1ldGhvZCB3cml0ZV9hcnA7Ck1JQl9JUE5FVFJPVyAgICphcnBfcm93ID0gTlVMTDsKaW50ICAgICAgICAgICAgIGNyZWF0ZV9mbGFnID0gMDsKCnVfY2hhciAgICAgICAgICoKdmFyX2F0RW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIEFkZHJlc3MgVHJhbnNsYXRpb24gdGFibGUgb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjMuMS4/LmludGVyZmFjZS4xLkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJbnRlcmZhY2UgaXMgYXQgb2Zmc2V0IDEwLAogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTIuCiAgICAgKgogICAgICogSVAgTmV0IHRvIE1lZGlhIHRhYmxlIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIyLjEuPy5pbnRlcmZhY2UuQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIEludGVyZmFjZSBpcyBhdCBvZmZzZXQgMTAsCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMS4KICAgICAqLwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgb2lkICAgICAgICAgICAgKm9wOwogICAgb2lkICAgICAgICAgICAgIGxvd2VzdFsxNl07CiAgICBvaWQgICAgICAgICAgICAgY3VycmVudFsxNl07CiAgICBpbnQgICAgICAgICAgICAgb2lkX2xlbmd0aDsKICAgIGludCAgICAgICAgICAgICBsb3dTdGF0ZSA9IC0xOyAgICAgIC8qIERvbid0IGhhdmUgb25lIHlldCAqLwogICAgUE1JQl9JUE5FVFRBQkxFIHBJcE5ldFRhYmxlID0gTlVMTDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgVUlOVCAgICAgICAgICAgIGk7CiAgICB1X2NoYXIgICAgICAgICAgZGVzdF9hZGRyWzRdOwogICAgdm9pZCAgICAgICAgICAgKnJlc3VsdCA9IE5VTEw7CiAgICBzdGF0aWMgaW5fYWRkcl90CWFkZHJfcmV0OwogICAgCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwogICAgbWVtY3B5KChjaGFyICopIGN1cnJlbnQsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIGlmIChjdXJyZW50WzZdID09IDMpIHsgICAgICAvKiBBVCBncm91cCBvaWQgKi8KICAgICAgICBvaWRfbGVuZ3RoID0gMTY7CiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICBvaWRfbGVuZ3RoID0gMTU7CiAgICB9CgogICAgc3RhdHVzID0gR2V0SXBOZXRUYWJsZShwSXBOZXRUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwSXBOZXRUYWJsZSA9IG1hbGxvYyhkd0FjdHVhbFNpemUpOwogICAgICAgIGlmIChwSXBOZXRUYWJsZSkKICAgICAgICAgICAgc3RhdHVzID0gR2V0SXBOZXRUYWJsZShwSXBOZXRUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICB9CgoKICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcElwTmV0VGFibGUtPmR3TnVtRW50cmllczsgKytpKSB7CiAgICAgICAgICAgIGN1cnJlbnRbMTBdID0gcElwTmV0VGFibGUtPnRhYmxlW2ldLmR3SW5kZXg7CgoKICAgICAgICAgICAgaWYgKGN1cnJlbnRbNl0gPT0gMykgeyAgICAgIC8qIEFUIGdyb3VwIG9pZCAqLwogICAgICAgICAgICAgICAgY3VycmVudFsxMV0gPSAxOwogICAgICAgICAgICAgICAgb3AgPSBjdXJyZW50ICsgMTI7CiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgLyogSVAgTmV0VG9NZWRpYSBncm91cCBvaWQgKi8KICAgICAgICAgICAgICAgIG9wID0gY3VycmVudCArIDExOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNwID0gKHVfY2hhciAqKSAmIHBJcE5ldFRhYmxlLT50YWJsZVtpXS5kd0FkZHI7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CgogICAgICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIG9pZF9sZW5ndGgsIG5hbWUsICpsZW5ndGgpID09CiAgICAgICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9pZF9sZW5ndGggKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgbG93U3RhdGUgPSAwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIG9pZF9sZW5ndGgsIG5hbWUsICpsZW5ndGgpID4KICAgICAgICAgICAgICAgICAgICAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkX2xlbmd0aCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICBsb3dTdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgLyogQXMgdGhlIHRhYmxlIGlzIHNvcnRlZCwgbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKGFycF9yb3cgPT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5IGluIGNhc2Ugb2YgU0VUIHJlcXVlc3QncyBGUkVFIHBoYXNlIAogICAgICAgICAqLwogICAgICAgIGFycF9yb3cgPSAoUE1JQl9JUE5FVFJPVykgbWFsbG9jKHNpemVvZihNSUJfSVBORVRST1cpKTsKICAgIH0KCiAgICBpZiAobG93U3RhdGUgPCAwIHx8IHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgIC8qCiAgICAgICAgICogZm9yIGNyZWF0aW9uIG9mIG5ldyByb3csIG9ubHkgaXBOZXRUb01lZGlhVGFibGUgY2FzZSBpcyBjb25zaWRlcmVkIAogICAgICAgICAqLwogICAgICAgIGlmICgqbGVuZ3RoID09IDE1IHx8ICpsZW5ndGggPT0gMTYpIHsKICAgICAgICAgICAgY3JlYXRlX2ZsYWcgPSAxOwogICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfYXJwOwogICAgICAgICAgICBhcnBfcm93LT5kd0luZGV4ID0gbmFtZVsxMF07CgogICAgICAgICAgICBpZiAoKmxlbmd0aCA9PSAxNSkgeyAgICAgICAgLyogaXBOZXRUb01lZGlhVGFibGUgKi8KICAgICAgICAgICAgICAgIGkgPSAxMTsKICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAvKiBhdCBUYWJsZSAqLwoKICAgICAgICAgICAgICAgIGkgPSAxMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVzdF9hZGRyWzBdID0gKHVfY2hhcikgbmFtZVtpXTsKICAgICAgICAgICAgZGVzdF9hZGRyWzFdID0gKHVfY2hhcikgbmFtZVtpICsgMV07CiAgICAgICAgICAgIGRlc3RfYWRkclsyXSA9ICh1X2NoYXIpIG5hbWVbaSArIDJdOwogICAgICAgICAgICBkZXN0X2FkZHJbM10gPSAodV9jaGFyKSBuYW1lW2kgKyAzXTsKICAgICAgICAgICAgYXJwX3Jvdy0+ZHdBZGRyID0gKigoRFdPUkQgKikgZGVzdF9hZGRyKTsKCiAgICAgICAgICAgIGFycF9yb3ctPmR3VHlwZSA9IDQ7ICAgICAgICAvKiBTdGF0aWMgKi8KICAgICAgICAgICAgYXJwX3Jvdy0+ZHdQaHlzQWRkckxlbiA9IDA7CiAgICAgICAgfQogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIGNyZWF0ZV9mbGFnID0gMDsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBsb3dlc3QsIG9pZF9sZW5ndGggKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gb2lkX2xlbmd0aDsKICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV9hcnA7CiAgICAqYXJwX3JvdyA9IHBJcE5ldFRhYmxlLT50YWJsZVtpXTsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUE1FRElBSUZJTkRFWDogICAgICAgLyogYWxzbyBBVElGSU5ERVggKi8KICAgICAgICAqdmFyX2xlbiA9IHNpemVvZiBsb25nX3JldHVybjsKICAgICAgICBsb25nX3JldHVybiA9IHBJcE5ldFRhYmxlLT50YWJsZVtpXS5kd0luZGV4OwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKICAgIGNhc2UgSVBNRURJQVBIWVNBRERSRVNTOiAgIC8qIGFsc28gQVRQSFlTQUREUkVTUyAqLwogICAgICAgICp2YXJfbGVuID0gcElwTmV0VGFibGUtPnRhYmxlW2ldLmR3UGh5c0FkZHJMZW47CiAgICAgICAgbWVtY3B5KHJldHVybl9idWYsIHBJcE5ldFRhYmxlLT50YWJsZVtpXS5iUGh5c0FkZHIsICp2YXJfbGVuKTsKICAgICAgICByZXN1bHQgPSByZXR1cm5fYnVmOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBJUE1FRElBTkVUQUREUkVTUzogICAgLyogYWxzbyBBVE5FVEFERFJFU1MgKi8KICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBOZXRUYWJsZS0+dGFibGVbaV0uZHdBZGRyOwogICAgICAgIHJlc3VsdCA9ICZhZGRyX3JldDsKICAgICAgICBicmVhazsKICAgIGNhc2UgSVBNRURJQVRZUEU6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YgbG9uZ19yZXR1cm47CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBOZXRUYWJsZS0+dGFibGVbaV0uZHdUeXBlOwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9hdEVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgICAgIGJyZWFrOwogICAgfQpvdXQ6CiAgICBmcmVlKHBJcE5ldFRhYmxlKTsKICAgIHJldHVybiByZXN1bHQ7Cn0KCmludAp3cml0ZV9hcnAoaW50IGFjdGlvbiwKICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLCB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IGxlbmd0aCkKewogICAgaW50ICAgICAgICAgICAgIHZhciwgcmV0dmFsID0gU05NUF9FUlJfTk9FUlJPUjsKICAgIHN0YXRpYyBQTUlCX0lQTkVUUk9XIG9sZGFycF9yb3cgPSBOVUxMOwogICAgTUlCX0lQTkVUUk9XICAgIHRlbXBfcm93OwogICAgRFdPUkQgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwoKICAgIC8qCiAgICAgKiBJUCBOZXQgdG8gTWVkaWEgdGFibGUgb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjIuMS4/LmludGVyZmFjZS5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSW50ZXJmYWNlIGlzIGF0IG9mZnNldCAxMCwKICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDExLgogICAgICovCgogICAgaWYgKG5hbWVbNl0gPT0gMykgeyAgICAgICAgIC8qIEFUIGdyb3VwIG9pZCAqLwogICAgICAgIGlmIChsZW5ndGggIT0gMTYpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImxlbmd0aCBlcnJvclxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgICAgIH0KICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBJUCBOZXRUb01lZGlhIGdyb3VwIG9pZCAqLwogICAgICAgIGlmIChsZW5ndGggIT0gMTUpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImxlbmd0aCBlcnJvclxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0NSRUFUSU9OOwogICAgICAgIH0KICAgIH0KCgogICAgLyoKICAgICAqICNkZWZpbmUgZm9yIGlwTmV0VG9NZWRpYVRhYmxlIGVudHJpZXMgYXJlIDEgbGVzcyB0aGFuIGNvcnJlc3BvbmRpbmcgc3ViLWlkIGluIE1JQgogICAgICogKiBpLmUuIElQTUVESUFJRklOREVYIGRlZmluZWQgYXMgMCwgYnV0IGlwTmV0VG9NZWRpYUlmSW5kZXggcmVnaXN0ZXJlZCBhcyAxCiAgICAgKi8KICAgIHZhciA9IG5hbWVbOV0gLSAxOwogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgc3dpdGNoICh2YXIpIHsKICAgICAgICBjYXNlIElQTUVESUFJRklOREVYOgogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IGludGVnZXJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCooKGludCAqKSB2YXJfdmFsKSkgPCAwKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiaW52YWxpZCBtZWRpYSBpZkluZGV4Iik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImJhZCBsZW5ndGhcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HTEVOR1RIOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSVBNRURJQU5FVEFERFJFU1M6CiAgICAgICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lQQUREUkVTUykgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBJUCBBZGRyZXNzXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCgqKChpbnQgKikgdmFyX3ZhbCkpIDwgMCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImludmFsaWQgbWVkaWEgbmV0IGFkZHJlc3MiKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YXJfdmFsX2xlbiA+IHNpemVvZihEV09SRCkpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJiYWQgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFUWVBFOgogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IGludGVnZXJcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKCooKGludCAqKSB2YXJfdmFsKSkgPCAxIHx8ICgqKChpbnQgKikgdmFyX3ZhbCkpID4gNCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImludmFsaWQgbWVkaWEgdHlwZSIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJiYWQgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFQSFlTQUREUkVTUzoKICAgICAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IG9jdGV0IHN0ciIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmFyX3ZhbF9sZW4gIT0gNikgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBjb3JyZWN0IGlwQWRkcmVzcyBsZW5ndGg6ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl92YWxfbGVuKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gd3JpdGVfcnRlXG4iLAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgKyAxKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogU2F2ZSB0aGUgb2xkIHZhbHVlLCBpbiBjYXNlIG9mIFVORE8gCiAgICAgICAgICovCiAgICAgICAgaWYgKG9sZGFycF9yb3cgPT0gTlVMTCkgewogICAgICAgICAgICBvbGRhcnBfcm93ID0gKFBNSUJfSVBORVRST1cpIG1hbGxvYyhzaXplb2YoTUlCX0lQTkVUUk9XKSk7CiAgICAgICAgICAgICpvbGRhcnBfcm93ID0gKmFycF9yb3c7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBBQ1RJT046ICAgICAgICAgICAgICAgLyogUGVyZm9ybSB0aGUgU0VUIGFjdGlvbiAoaWYgcmV2ZXJzaWJsZSkgKi8KICAgICAgICBzd2l0Y2ggKHZhcikgewoKICAgICAgICBjYXNlIElQTUVESUFJRklOREVYOgogICAgICAgICAgICB0ZW1wX3JvdyA9ICphcnBfcm93OwogICAgICAgICAgICBhcnBfcm93LT5kd0luZGV4ID0gKigoaW50ICopIHZhcl92YWwpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJbiBjYXNlIG9mIG5ldyBlbnRyeSwgcGh5c2ljYWwgYWRkcmVzcyBpcyBtYW5kYXRvcnkuCiAgICAgICAgICAgICAqICogU2V0SXBOZXRFbnRyeSB3aWxsIGJlIGRvbmUgaW4gQ09NTUlUIGNhc2UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoIWNyZWF0ZV9mbGFnKSB7CiAgICAgICAgICAgICAgICBpZiAoU2V0SXBOZXRFbnRyeShhcnBfcm93KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgIGFycF9yb3ctPmR3SW5kZXggPSB0ZW1wX3Jvdy5kd0luZGV4OwogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBEb24ndCBrbm93IHlldCwgd2hldGhlciBjaGFuZ2UgaW4gaWZJbmRleCBjcmVhdGVzIG5ldyByb3cgb3Igbm90IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZWxzZXsgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0ZW1wX3Jvdy5kd1R5cGUgPSAyOyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmKFNldElwTmV0RW50cnkoJnRlbXBfcm93KSAhPSBOT19FUlJPUikgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiByZXR2YWwgPSBTTk1QX0VSUl9DT01NSVRGQUlMRUQ7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogfSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSVBNRURJQU5FVEFERFJFU1M6CiAgICAgICAgICAgIHRlbXBfcm93ID0gKmFycF9yb3c7CiAgICAgICAgICAgIGFycF9yb3ctPmR3QWRkciA9ICooKGludCAqKSB2YXJfdmFsKTsKICAgICAgICAgICAgaWYgKCFjcmVhdGVfZmxhZykgewogICAgICAgICAgICAgICAgaWYgKFNldElwTmV0RW50cnkoYXJwX3JvdykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICBhcnBfcm93LT5kd0FkZHIgPSBvbGRhcnBfcm93LT5kd0FkZHI7CiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfQ09NTUlURkFJTEVEOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wX3Jvdy5kd1R5cGUgPSAyOwogICAgICAgICAgICAgICAgICAgIGlmIChTZXRJcE5ldEVudHJ5KCZ0ZW1wX3JvdykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCBpbiBBQ1RJT04sIHdoaWxlIGRlbGV0aW5nIG9sZCByb3cgXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfQ09NTUlURkFJTEVEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFUWVBFOgogICAgICAgICAgICBhcnBfcm93LT5kd1R5cGUgPSAqKChpbnQgKikgdmFyX3ZhbCk7CiAgICAgICAgICAgIGlmICghY3JlYXRlX2ZsYWcpIHsKICAgICAgICAgICAgICAgIGlmIChTZXRJcE5ldEVudHJ5KGFycF9yb3cpICE9IE5PX0VSUk9SKQogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElQTUVESUFQSFlTQUREUkVTUzoKICAgICAgICAgICAgbWVtY3B5KGFycF9yb3ctPmJQaHlzQWRkciwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgICAgICBhcnBfcm93LT5kd1BoeXNBZGRyTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgICAgIGlmICghY3JlYXRlX2ZsYWcpIHsKICAgICAgICAgICAgICAgIGlmIChTZXRJcE5ldEVudHJ5KGFycF9yb3cpICE9IE5PX0VSUk9SKQogICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX0NPTU1JVEZBSUxFRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gd3JpdGVfYXJwXG4iLAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgKyAxKSk7CiAgICAgICAgICAgIHJldHZhbCA9IFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogUmV2ZXJzZSB0aGUgU0VUIGFjdGlvbiBhbmQgZnJlZSByZXNvdXJjZXMgCiAgICAgICAgICovCiAgICAgICAgaWYgKG9sZGFycF9yb3cgIT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBVTkRPIHRoZSBjaGFuZ2VzIGRvbmUgZm9yIGV4aXN0aW5nIGVudHJ5LiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICghY3JlYXRlX2ZsYWcpIHsKICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gU2V0SXBOZXRFbnRyeShvbGRhcnBfcm93KSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiRXJyb3IgaW4gY2FzZSBVTkRPLCBzdGF0dXMgOiAlbHVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBTTk1QX0VSUl9VTkRPRkFJTEVEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob2xkYXJwX3Jvdy0+ZHdBZGRyICE9IGFycF9yb3ctPmR3QWRkcikgewogICAgICAgICAgICAgICAgYXJwX3Jvdy0+ZHdUeXBlID0gMjsgICAgLypJZiByb3cgd2FzIGFkZGVkL2NyZWF0ZWQgZGVsZXRlIHRoYXQgcm93ICovCgogICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBTZXRJcE5ldEVudHJ5KGFycF9yb3cpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIGRlbGV0aW5nIGFkZGVkIHJvdywgc3RhdHVzIDogJWx1XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfVU5ET0ZBSUxFRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKG9sZGFycF9yb3cpOwogICAgICAgICAgICBvbGRhcnBfcm93ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShhcnBfcm93KTsKICAgICAgICAgICAgYXJwX3JvdyA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBpZiBuZXcgZW50cnkgYW5kIHBoeXNpY2FsIGFkZHJlc3Mgc3BlY2lmaWVkLCBjcmVhdGUgbmV3IGVudHJ5IAogICAgICAgICAqLwogICAgICAgIGlmIChjcmVhdGVfZmxhZykgewogICAgICAgICAgICBpZiAoYXJwX3Jvdy0+ZHdQaHlzQWRkckxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IENyZWF0ZUlwTmV0RW50cnkoYXJwX3JvdykpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5zaWRlIENPTU1JVDogQ3JlYXRlSXBOZXRFbnRyeSBmYWlsZWQsIHN0YXR1cyAlbHVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBTTk1QX0VSUl9DT01NSVRGQUlMRUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogRm9yIG5ldyBlbnRyeSwgcGh5c2ljYWwgYWRkcmVzcyBtdXN0IGJlIHNldC4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY3JlYXRlIG5ldyBlbnRyeSB3aXRob3V0IHBoeXNpY2FsIGFkZHJlc3NcbiIpOwogICAgICAgICAgICAgICAgcmV0dmFsID0gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB1bnNldCB0aGUgY3JlYXRlX2ZsYWcsIHNvIHRoYXQgQ3JlYXRlSXBOZXRFbnRyeSBjYWxsZWQgb25seSBvbmNlIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3JlYXRlX2ZsYWcgPSAwOwogICAgICAgIH0KCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBGcmVlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGZyZWUob2xkYXJwX3Jvdyk7CiAgICAgICAgb2xkYXJwX3JvdyA9IE5VTEw7CiAgICAgICAgZnJlZShhcnBfcm93KTsKICAgICAgICBhcnBfcm93ID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiByZXR2YWw7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8K