I2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8dS1ib290L3NoYTI1Ni5oPgovLyNpbmNsdWRlIDxhc20vYXJjaC9zZWN1cmVfYXBiLmg+CgoKLy8jaW5jbHVkZTxzdGRpby5oPgoKLy8jaW5jbHVkZSA8YXNtL2lvLmg+Ci8vI2luY2x1ZGUgPGFzbS9hcmNoL2lvLmg+Ci8vI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ2lzdGVyLmg+Ci8vI2luY2x1ZGUgPGFzbS9hcmNoLWc5dHYvbW1jLmg+ICAvL2ppYXhpbmcgZGVidWcKCi8vZXh0ZXJuICB2b2lkIGFtbF9jYWNoZV9kaXNhYmxlKHZvaWQpOwovLyNpZm5kZWYgICBjaGFyKiBpdG9hKGludG51bSxjaGFyKnN0cixpbnRyYWRpeCkKCgojZGVmaW5lICBVU0VfRk9SX05FV01BTgojZGVmaW5lIFVTRV9GT1JfVUJPT1RfMjAxOAojaWZkZWYgVVNFX0ZPUl9ORVdNQU4KLy8vKgppbnQgc2V0ZW52KGNvbnN0IGNoYXIgKnZhcm5hbWUsIGNvbnN0IGNoYXIgKnZhcnZhbHVlKQp7CnJldHVybiAxOwp9CgpjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKewoJcmV0dXJuIE5VTEw7Cn0KLy8qLwojZW5kaWYKI2RlZmluZSBEV0NfQUNfUElOTVVYX1RPVEFMCQkJCQkJMjgKI2RlZmluZSBEV0NfREZJX1BJTk1VWF9UT1RBTAkJCQkJMjYKCi8vI2RlZmluZSBERFJfVVNFX0RFRklORV9URU1QTEFURV9DT05GSUcgICAxCiNkZWZpbmUgRERSX1NUSUNLWV9NQUdJQ19OVU1CRVIJCQkJCTB4MjAxODAwMDAKI2RlZmluZSBERFJfQ0hJUF9JRAkJCQkJCQkJMHgzMAojZGVmaW5lIEREUl9TVElDS1lfU09VUkNFX0RNQ19TVElDS1kJCQkweDEKI2RlZmluZSBERFJfU1RJQ0tZX1NPVVJDRV9TUkFNCQkJCQkweDIKCiNkZWZpbmUgRERSX1NUSUNLWV9PVkVSUklERV9DT05GSUdfTUVTU0FHRV9DTUQJMHgxIC8vb3ZlcnJpZGUgY29uZmlnCiNkZWZpbmUgRERSX1NUSUNLWV9TUEVDSUFMX0ZVTkNUSU9OX0NNRAkJCTB4MiAvL3NwZWNpYWwgdGVzdCBzdWNoIGFzIHNoaWZ0IHNvbWUgYmRsciBvciBwYXJhbWV0ZXIgb3IgaW50ZXJsZWF2ZSB0ZXN0CgojZGVmaW5lIEREUl9JTklUX0NPTkZJR19TVElDS1lfTUVTU0FHRV9TUkFNX0FERFJFU1MJMHgwMDA0MDAwMAojZGVmaW5lIEREUl9JTklUX0NPTkZJR19HTE9CQUxfTUVTU0FHRV9TUkFNX0FERFJFU1MJMHgwMDA1MDAwMAojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9ERFIzCQkJCTAKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSNAkJCQkxCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSNAkJCQkyCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMwkJCQkzCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMgkJCQk0Ci8vI2RlZmluZSBDT05GSUdfRERSX1RZUEVfTFBERFI0WAkJCQk1CiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0FVVE8JCQkJMHhmCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0FVVE9fTElNSVQJCQlDT05GSUdfRERSX1RZUEVfRERSNAoKI2RlZmluZSBDT05GSUdfRERSMF8xNkJJVF9DSDAJCQkJMHgxCiNkZWZpbmUgQ09ORklHX0REUjBfMTZCSVRfUkFOSzAxX0NIMAkJMHg0CiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzBfQ0gwCQkJMHgyCiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMDEJCTB4MwojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUXzE2QklUX1JBTkswX0NIMAkweDUKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF8xNkJJVF9SQU5LMDFfQ0gwCTB4NgojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAJCTB4NwojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMDEJCTB4OAoKLyoKc3RhdGljIHVpbnQzMl90IGRkcl9yZF8xNmJpdF9vbl8zMnJlZyh1aW50MzJfdCBhZGRyKQp7CnVpbnQzMl90IHJlYWRfdmFsdWU9MDsKdWludDMyX3QgYWRkcl90PSgoYWRkcj4+MikgPDwgMik7CnJlYWRfdmFsdWU9ICgqKHZvbGF0aWxlIHVpbnQzMl90ICopKCggdW5zaWduZWQgbG9uZyApKGFkZHJfdCkpKTsKcmVhZF92YWx1ZT0ocmVhZF92YWx1ZT4+KChhZGRyJTQpPDwzKSkmMHhmZmZmOwpyZXR1cm4gcmVhZF92YWx1ZTsKCQp9CnN0YXRpYyB1aW50MzJfdCBkZHJfd3JfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYWRkcix1aW50MzJfdCB2YWx1ZSkKewp1aW50MzJfdCByZWFkX3ZhbHVlPTA7CnVpbnQzMl90IHdyaXRlX3ZhbHVlPTA7CnVpbnQzMl90IGFkZHJfdD0oKGFkZHI+PjIpIDw8IDIpOwp1aW50MzJfdCBvZmZzZXQ9KChhZGRyJTQpPDwzKTsKcmVhZF92YWx1ZT0gKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKTsKd3JpdGVfdmFsdWU9KHZhbHVlPDxvZmZzZXQpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8b2Zmc2V0KSkpOwogKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKT13cml0ZV92YWx1ZTsKCnJldHVybiB3cml0ZV92YWx1ZTsKCQp9CiovCnN0YXRpYyB1aW50MzJfdCBkZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh1aW50MzJfdCBiYXNlX2FkZHIsdWludDMyX3Qgc2l6ZSx1aW50MzJfdCBvZmZzZXRfaW5kZXgpCnsKCXVpbnQzMl90IHJlYWRfdmFsdWU9MDsKCXVpbnQzMl90IGFkZHJfdD0wOwoJdWludDMyX3Qgb2Zmc2V0PTA7CglpZihzaXplPT04KXsKCQlvZmZzZXQ9KChvZmZzZXRfaW5kZXglNCk8PDMpOwoJCWFkZHJfdD0oYmFzZV9hZGRyKygob2Zmc2V0X2luZGV4Pj4yKSA8PCAyKSk7CgkJcmVhZF92YWx1ZT0gKCoodm9sYXRpbGUgdWludDMyX3QgKikoKCB1bnNpZ25lZCBsb25nICkoYWRkcl90KSkpOwoJCXJlYWRfdmFsdWU9KHJlYWRfdmFsdWU+Pm9mZnNldCkmMHhmZjsKCQoJfQoJaWYoc2l6ZT09MTYpewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCUyKTw8NCk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjEpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJcmVhZF92YWx1ZT0ocmVhZF92YWx1ZT4+b2Zmc2V0KSYweGZmZmY7Cgl9CglyZXR1cm4gcmVhZF92YWx1ZTsKCQp9CnN0YXRpYyB1aW50MzJfdCBkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyh1aW50MzJfdCBiYXNlX2FkZHIsdWludDMyX3Qgc2l6ZSx1aW50MzJfdCBvZmZzZXRfaW5kZXgsdWludDMyX3QgdmFsdWUpCnsKCXVpbnQzMl90IHJlYWRfdmFsdWU9MDsKCXVpbnQzMl90IHdyaXRlX3ZhbHVlPTA7Cgl1aW50MzJfdCBhZGRyX3Q9MDsKCXVpbnQzMl90IG9mZnNldD0wOwoJaWYoc2l6ZT09OCl7CgkJb2Zmc2V0PSgob2Zmc2V0X2luZGV4JTQpPDwzKTsKCQlhZGRyX3Q9KGJhc2VfYWRkcisoKG9mZnNldF9pbmRleD4+MikgPDwgMikpOwoJCXJlYWRfdmFsdWU9ICgqKHZvbGF0aWxlIHVpbnQzMl90ICopKCggdW5zaWduZWQgbG9uZyApKGFkZHJfdCkpKTsKCQl3cml0ZV92YWx1ZT0odmFsdWU8PG9mZnNldCl8KHJlYWRfdmFsdWUmKH4oMHhmZjw8b2Zmc2V0KSkpOwoJfQoJaWYoc2l6ZT09MTYpewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCUyKTw8NCk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjEpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJd3JpdGVfdmFsdWU9KHZhbHVlPDxvZmZzZXQpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8b2Zmc2V0KSkpOwoJfQoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKT13cml0ZV92YWx1ZTsKCXJldHVybiB3cml0ZV92YWx1ZTsKfQp0eXBlZGVmIHN0cnVjdCBkZHJfc2V0ewoJdW5zaWduZWQJaW50CQltYWdpYzsKCXVuc2lnbmVkCWNoYXIJZmFzdF9ib290WzRdOy8vIDAgICBmYXN0Ym9vdCBlbmFibGUgIDEgd2luZG93IHRlc3QgbWFyZ2luKGJpdDAtMyByZWFkIGJpdCA0LTcgd3JpdGUpICAyIGF1dG8gb2Zmc2V0IGFmdGVyIHdpbmRvdyB0ZXN0IChiaXQwLTMgcmVhZCBiaXQgNC03IHdyaXRlKSAgICAzIGF1dG8gd2luZG93IHRlc3QgaW5kZXgoYml0IDcgdXNlIGZvciBpZiBlbmFibGUgdXNiIGRvd25sb2FkIGRvIHdpbmRvdyB0ZXN0ICxiaXQgNiB1c2UgZm9yIGZsYXNoKQovLwl1bnNpZ25lZAlpbnQJCXJzdl9pbnQwOwoJdW5zaWduZWQJY2hhcglib2FyZF9pZDsKCS8vYm9hcmQgaWQgcmVzZXJ2ZSwsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcgl2ZXJzaW9uOwoJLy8gZmlybXdhcmUgcmVzZXJ2ZSB2ZXJzaW9uLCxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCURyYW1UeXBlOwoJLy9zdXBwb3J0IERyYW1UeXBlIHNob3VsZCBjb25maXJtIHdpdGggYW1sb2dpYwoJLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9ERFIzCQkJCTAKCS8vI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSNAkJCQkxCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSNAkJCQkyCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMwkJCQkzCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMgkJCQk0Cgl1bnNpZ25lZAljaGFyCURpc2FibGVkRGJ5dGU7CgkvL3VzZSBmb3IgZHJhbSBidXMgMTZiaXQgb3IgMzJiaXQsaWYgdXNlIDE2Yml0IG1vZGUgLHNob3VsZCBkaXNhYmxlIGJpdCAyLDMKCS8vYml0IDAgLS0tdXNlIGJ5dGUgMCAsMSBkaXNhYmxlIGJ5dGUgMCwKCS8vYml0IDEgLS0tdXNlIGJ5dGUgMSAsMSBkaXNhYmxlIGJ5dGUgMSwKCS8vYml0IDIgLS0tdXNlIGJ5dGUgMiAsMSBkaXNhYmxlIGJ5dGUgMiwKCS8vYml0IDMgLS0tdXNlIGJ5dGUgMyAsMSBkaXNhYmxlIGJ5dGUgMywKCXVuc2lnbmVkCWNoYXIJSXMyVHRpbWluZzsKCS8vZGRyMy9kZHIzIHVzZSAydCB0aW1pbmcsbm93IG9ubHkgc3VwcG9ydCAydCB0aW1taW5nCgl1bnNpZ25lZAljaGFyCUhkdEN0cmw7CgkvL3RyYWluaW5nIGluZm9ybWF0aW9uIGNvbnRyb2wsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkcmFtX3JhbmtfY29uZmlnOwoJLy9zdXBwb3J0IERyYW0gY29ubmVjdGlvbiB0eXBlIHNob3VsZCBjb25maXJtIHdpdGggYW1sb2dpYwoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzE2QklUX0NIMAkJCQkweDEgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMTZiaXQgb25seSB1c2UgY3MwCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMTZCSVRfUkFOSzAxX0NIMAkJMHg0ICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDE2Yml0ICB1c2UgY3MwIGNzMQoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMAkJCTB4MiAgLy9kcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNzMAoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAxCQkweDMgICAgLy9vbmx5IGZvciBscGRkcjQsZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjaGFuZWwgYSBjczAgY3MxIGNoYW5lbCBiIGNzMCBjczEKCS8vI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF8xNkJJVF9SQU5LMF9DSDAJCTB4NSAgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0IG9ubHkgdXNlIGNzMCxidXQgaGlnaCBhZGRyZXNzIHVzZSAxNmJpdCBtb2RlCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfMTZCSVRfUkFOSzAxX0NIMAkweDYgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0ICB1c2UgY3MwIGNzMSxidXQgY3MxIHVzZSAxNmJpdCBtb2RlICxjdXJyZW50IHBoeSBub3Qgc3VwcG9ydCByZXNlcnZlCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMAkJMHg3ICAgICAgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjczAgY3MxCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzBfQ0gwMQkJMHg4ICAgICAvL29ubHkgZm9yIGxwZGRyNCxkcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNoYW5lbCBhIGNzMCAgY2hhbmVsIGIgY3MwCgoJLyogcnN2X2NoYXIwLiB1cGRhdGUgZm9yIGRpYWdub3NlIHR5cGUgZGVmaW5lICovCgl1bnNpZ25lZAljaGFyCWRpYWdub3NlOwoKCS8qIGltZW0vZG1lbSBkZWZpbmUgKi8KCXVuc2lnbmVkCWludAkJaW1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWludAkJZG1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CWltZW1fbG9hZF9zaXplOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAlkbWVtX2xvYWRfc2l6ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJaW50CQlkZHJfYmFzZV9hZGRyOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlpbnQJCWRkcl9zdGFydF9vZmZzZXQ7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2NzMF9zaXplX01COwoJLy9jb25maWcgY3MwIGRyYW0gc2l6ZSAsbGlrZSAxRyBEUkFNICxzZXR0aW5nIDEwMjQKCXVuc2lnbmVkCXNob3J0CWRyYW1fY3MxX3NpemVfTUI7CgkvL2NvbmZpZyBjczEgZHJhbSBzaXplLGxpa2UgNTEyTSBEUkFNICxzZXR0aW5nIDUxMgoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJc2hvcnQJdHJhaW5pbmdfU2VxdWVuY2VDdHJsWzJdOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCXBoeV9vZHRfY29uZmlnX3JhbmtbMl07Cgl1bnNpZ25lZAljaGFyCSByZXZlcjE7Cgl1bnNpZ25lZAljaGFyCSByZXZlcjI7CgkvL3RyYWluaW5nIG9kdCBjb25maWcgLG9ubHkgdXNlIGZvciB0cmFpbmluZwoJLy8gWzBdT2R0IHBhdHRlcm4gZm9yIGFjY2Vzc2VzIHRhcmdldGluZyByYW5rIDAuIFszOjBdIGlzIHVzZWQgZm9yIHdyaXRlIE9EVCBbNzo0XSBpcyB1c2VkIGZvciByZWFkIE9EVAoJLy8gWzFdT2R0IHBhdHRlcm4gZm9yIGFjY2Vzc2VzIHRhcmdldGluZyByYW5rIDEuIFszOjBdIGlzIHVzZWQgZm9yIHdyaXRlIE9EVCBbNzo0XSBpcyB1c2VkIGZvciByZWFkIE9EVAoJdW5zaWduZWQJaW50CQlkZmlfb2R0X2NvbmZpZzsKCS8vbm9ybWFsIGdvIHN0YXR1cyBvZCBjb25maWcsdXNlIGZvciBub3JtYWwgc3RhdHVzCgkvL2JpdCAxMi4gIHJhbmsxIE9EVCBkZWZhdWx0LiBkZWZhdWx0IHZ1bHVlIGZvciBPRFRbMV0gcGlucyBpZiB0aGVyZXMgbm8gcmVhZC93cml0ZSBhY3Rpdml0eS4KCS8vYml0IDExLiAgcmFuazEgT0RUIHdyaXRlIHNlbC4gIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyB3cml0ZSBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDEwLiAgcmFuazEgT0RUIHdyaXRlIG5zZWwuIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmVzJ3Mgd3JpdGUgb2NjdXIgaW4gcmFuazAuCgkvL2JpdCA5LiAgIHJhbmsxIG9kdCByZWFkIHNlbC4gICBlbmFibGUgT0RUWzFdIGlmIHRoZXJlJ3MgcmVhZCBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDguICAgcmFuazEgb2R0IHJlYWQgbnNlbC4gIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyByZWFkIG9jY3VyZSBpbiByYW5rMC4KCS8vYml0IDQuICAgcmFuazAgT0RUIGRlZmF1bHQuICAgIGRlZmF1bHQgdnVsdWUgZm9yIE9EVFswXSBwaW5zIGlmIHRoZXJlcyBubyByZWFkL3dyaXRlIGFjdGl2aXR5LgoJLy9iaXQgMy4gICByYW5rMCBPRFQgd3JpdGUgc2VsLiAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHdyaXRlIG9jY3VyIGluIHJhbmswLgoJLy9iaXQgMi4gICByYW5rMCBPRFQgd3JpdGUgbnNlbC4gZW5hYmxlIE9EVFswXSBpZiB0aGVyZXMncyB3cml0ZSBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDEuICAgcmFuazAgb2R0IHJlYWQgc2VsLiAgIGVuYWJsZSBPRFRbMF0gaWYgdGhlcmUncyByZWFkIG9jY3VyIGluIHJhbmswLgoJLy9iaXQgMC4gICByYW5rMCBvZHQgcmVhZCBuc2VsLiAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHJlYWQgb2NjdXJlIGluIHJhbmsxLgoJdW5zaWduZWQJc2hvcnQJRFJBTUZyZXFbNF07CgkvL2NvbmZpZyBkcmFtIGZyZXF1ZW5jeSx1c2UgRFJBTUZyZXFbMF0sb2h0ZXIgcmVzZXJ2ZQoJdW5zaWduZWQJY2hhcglQbGxCeXBhc3NFbjsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkZHJfcmRiaV93cl9lbmFibGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWNoYXIJZGRyX3JmY190eXBlOwoJLy9jb25maWcgZHJhbSByZmMgdHlwZSxhY2NvcmRpbmcgZHJhbSB0eXBlLGFsc28gY2FuIHVzZSBzYW1lIGRyYW0gdHlwZSBtYXggY29uZmlnCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MQkJCQkwCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MgkJCQkxCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4NAkJCQkyCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4OAkJCQkzCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MTYJCQkJNAoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYngxCQkJCQk1CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjRfMkdieDIJCQkJCTYKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSNF8yR2J4NAkJCQkJNwoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYng4CQkJCQk4CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF8yR2J4MQkJCQk5CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF8zR2J4MQkJCQkxMAoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9MUEREUjRfNEdieDEJCQkJMTEKCXVuc2lnbmVkCWNoYXIJZW5hYmxlX2xwZGRyNHhfbW9kZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJaW50CQlwbGxfc3NjX21vZGU7CgkvLwoJLyogcGxsIHNzYyBjb25maWc6CgkgKgoJICogICBwbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKFtzdHJlbmd0aF0gPDwgNCkgfCBbbW9kZV0sCgkgKiAgICAgIHBwbSA9IHN0cmVuZ3RoICogNTAwCgkgKiAgICAgIG1vZGU6IDA9Y2VudGVyLCAxPXVwLCAyPWRvd24KCSAqCgkgKiAgIGVnOgoJICogICAgIDEuIGNvbmZpZyAxMDAwcHBtIGNlbnRlciBzcy4gdGhlbiBtb2RlPTAsIHN0cmVuZ3RoPTIKCSAqICAgICAgICAucGxsX3NzY19tb2RlID0gKDE8PDIwKSB8ICgxPDw4KSB8ICgyIDw8IDQpIHwgMCwKCSAqICAgICAyLiBjb25maWcgMzAwMHBwbSBkb3duIHNzLiB0aGVuIG1vZGU9Miwgc3RyZW5ndGg9NgoJICogICAgICAgIC5wbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKDYgPDwgNCkgfCAyLAoJICovCgl1bnNpZ25lZAlzaG9ydAljbGtfZHJ2X29obTsKCS8vY29uZmlnIHNvYyBjbGsgcGluIHNpZ25hbCBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAljc19kcnZfb2htOwoJLy9jb25maWcgc29jIGNzMCBjczEgcGluIHNpZ25hbCBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAlhY19kcnZfb2htOwoJLy9jb25maWcgc29jICBub3JtYWwgYWRkcmVzcyBjb21tYW5kIHBpbiBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9kcnZfb2htX3A7CgkvL2NvbmZpZyBzb2MgZGF0YSBwaW4gcHVsbCB1cCBkcml2ZXIgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX2Rydl9vaG1fbjsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9vZHRfb2htX3A7CgkvL2NvbmZpZyBzb2MgZGF0YSBwaW4gb2R0IHB1bGwgdXAgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX29kdF9vaG1fbjsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBvZHQgcHVsbCBkb3duIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2RhdGFfZHJ2X29obTsKCS8vY29uZmlnIGRyYW0gZGF0YSBwaW4gcHVsbCB1cCBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsZGRyMyBzZWxlY3QgMzQsNDBvaG0sZGRyNCBzZWxlY3QgMzQsNDhvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2RhdGFfb2R0X29obTsKCS8vY29uZmlnIGRyYW0gZGF0YSBwaW4gb2R0IHB1bGwgdXAgZG93biBzdGVuZ3RoLGRkcjMgc2VsZWN0IDQwLDYwLDEyMG9obSxkZHI0IHNlbGVjdCAzNCw0MCw0OCw2MCwxMjAsMjQwb2htLGxwZGRyNCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQJc2hvcnQJZHJhbV9hY19vZHRfb2htOwoJLy9jb25maWcgZHJhbSBhYyBwaW4gb2R0IHB1bGwgdXAgZG93biBzdGVuZ3RoLHVzZSBmb3IgbHBkZHI0LCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQJc2hvcnQJc29jX2Nsa19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19jc19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19hY19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX3NsZXdfcmF0ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJdnJlZl9vdXRwdXRfcGVybWlsOyAvL3BoeQoJLy9zZXR0aW5nIHNhbWUgd2l0aCB2cmVmX2RyYW1fcGVybWlsCgl1bnNpZ25lZAlzaG9ydAl2cmVmX3JlY2VpdmVyX3Blcm1pbDsgLy9zb2MKCS8vc29jIGluaXQgU09DIHJlY2VpdmVyIHZyZWYgLGNvbmZpZyBsaWtlIDUwMCBtZWFucyAwLjVWRERRLHRha2UgY2FyZSAscGxlYXNlIGZvbGxvdyBTSQoJdW5zaWduZWQJc2hvcnQJdnJlZl9kcmFtX3Blcm1pbDsKCS8vc29jIGluaXQgRFJBTSByZWNlaXZlciB2cmVmICxjb25maWcgbGlrZSA1MDAgbWVhbnMgMC41VkREUSx0YWtlIGNhcmUgLHBsZWFzZSBmb2xsb3cgU0kKCXVuc2lnbmVkCXNob3J0CW1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeTsKCS8vdXNlIGZvciBsaW1pdGVkIGRkciBzcGVlZCBjb3JlIHRpbW1taW5nIHBhcmFtZXRlcixmb3Igc29tZSBvbGQgZHJhbSBtYXliZSBoYXZlIG5vIG92ZXIgc3BlZWQgcmVnaXN0ZXIKCS8qIGFsaWduOCAqLwoKCXVuc2lnbmVkCWNoYXIJYWNfdHJhY2VfZGVsYXlbMTBdOwoJdW5zaWduZWQJY2hhcglscGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nOwoJdW5zaWduZWQJY2hhcglscGRkcjRfeDhfbW9kZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeSAsdGFrZSBjYXJlICxwbGVhc2UgZm9sbG93IFNJCgl1bnNpZ25lZAljaGFyCWFjX3Bpbm11eFtEV0NfQUNfUElOTVVYX1RPVEFMXTsKCS8vdXNlIGZvciBscGRkcjMgL2xwZGRyNCBjYSBwaW5tdXggcmVtYXAKCXVuc2lnbmVkCWNoYXIJZGZpX3Bpbm11eFtEV0NfREZJX1BJTk1VWF9UT1RBTF07Cgl1bnNpZ25lZAljaGFyCXNsdF90ZXN0X2Z1bmN0aW9uWzJdOyAgLy9bMF0gc2x0IHRlc3QgZnVuY3Rpb24gZW5hYmxlLGJpdCAwIGVuYWJsZSA0IGZyZXF1ZW5jeSBzY2FuLGJpdCAxIGVuYWJsZSBmb3JjZSBkZWxheSBsaW5lIG9mZnNldCAsYml0IDcgZW5hYmxlIHNraXAgdHJhaW5pbmcgZnVuY3Rpb24KCS8vWzFdLHNsdCB0ZXN0IHBhcmFtZXRlciAsdXNlIGZvciBmb3JjZSBkZWxheSBsaW5lIG9mZnNldAoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAl0ZHFzMmRxOy8vZHFfYmRscl9vcmc7Cgl1bnNpZ25lZAljaGFyICBkcmFtX2RhdGFfd3Jfb2R0X29obTsKCXVuc2lnbmVkCWNoYXIJYml0VGltZUNvbnRyb2xfMmQ7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCS8qIGFsaWduOCAqLwoKCXVuc2lnbmVkCWludAkJZGRyX2RtY19yZW1hcFs1XTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgl1bnNpZ25lZCBjaGFyCQlkZHJfbHBkZHIzNF9jYV9yZW1hcFs0XTsKCS8vLy91c2UgZm9yIGxwZGRyMyAvbHBkZHI0IGNhIHRyYWluaW5nIGRhdGEgYnl0ZSBsYW5lIHJlbWFwCgl1bnNpZ25lZAljaGFyCWRkcl9scGRkcjM0X2RxX3JlbWFwWzMyXTsKCS8vLy91c2UgZm9yIGxwZGRyMyAvbHBkZHI0IGNhIHBpbm11eCByZW1hcAoJdW5zaWduZWQJaW50CQlkcmFtX3J0dF9ub21fd3JfcGFya1syXTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJaW50CQlkZHJfZnVuYzsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJLy91bnNpZ25lZAlsb25nCXJzdl9sb25nMFsyXTsKCS8qIHYxIGVuZCAqLwovLwkvKgoJdW5zaWduZWQJY2hhcglyZWFkX2Rxc19kZWxheVsxNl07Cgl1bnNpZ25lZAljaGFyCXJlYWRfZHFfYml0X2RlbGF5WzcyXTsKCXVuc2lnbmVkCXNob3J0CXdyaXRlX2Rxc19kZWxheVsxNl07Ci8vCSovCgl1bnNpZ25lZAlzaG9ydAl3cml0ZV9kcV9iaXRfZGVsYXlbNzJdOwoJdW5zaWduZWQJc2hvcnQJcmVhZF9kcXNfZ2F0ZV9kZWxheVsxNl07Cgl1bnNpZ25lZAljaGFyCXNvY19iaXRfdnJlZlszMl07Cgl1bnNpZ25lZAljaGFyCWRyYW1fYml0X3ZyZWZbMzJdOwoJLy8vKgoJdW5zaWduZWQJY2hhcglyZXZlcjM7Ly9yZWFkX2RxcyAgcmVhZF9kcSx3cml0ZV9kcXMsIHdyaXRlX2RxCgl1bnNpZ25lZAljaGFyCWRmaV9tcmw7Cgl1bnNpZ25lZAljaGFyCWRmaV9od3Rtcmw7Cgl1bnNpZ25lZAljaGFyCUFSZFB0ckluaXRWYWw7Cgl1bnNpZ25lZAljaGFyCXJldHJhaW5pbmdbMTZdOwoJLy9vdmVycmlkZSByZWFkIGJpdCBkZWxheQoKCS8vZXh0cmEKLy8JdW5zaWduZWQJc2hvcnQJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4OwovLwl1bnNpZ25lZAlzaG9ydAlkbWNfdGVzdF93b3JzdF93aW5kb3dfcng7Ci8vCSovCn1kZHJfc2V0X3Q7CgpkZHJfc2V0X3QgcF9kZHJfc2V0X3Q7CgpjaGFyKiBpdG9hX2Rkcl90ZXN0KGludCBudW0sY2hhcipzdHIsaW50IHJhZGl4KQp7LyrL99L9se0qLwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgMVxuIik7CgljaGFyIGluZGV4W109IjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7Cgl1bnNpZ25lZCB1bnVtOy8q1tC85LHkwb8qLwoJY2hhciB0ZW1wOwoJaW50IGk9MCxqLGs7CgkvKsi3tqh1bnVttcTWtSovCglpZiAocmFkaXggPT0gMTAgJiYgbnVtPDApIC8qyq69+NbGuLrK/SovCgl7CgkJdW51bSA9ICh1bnNpZ25lZCktbnVtOwoJCXN0cltpKytdID0gJy0nOwoJfQoJZWxzZQoJCXVudW0gPSAodW5zaWduZWQpbnVtOy8qxuTL+8fpv/YqLwoJLyrXqru7Ki8KCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDJcbiIpOwoJcHJpbnRmKCJcbnVudW09MHglMDh4XG4iLHVudW0pOwoJcHJpbnRmKCJcbnVudW0yPTB4JTA4eFxuIiwodW51bSUodW5zaWduZWQpcmFkaXgpKTsKCXByaW50ZigiXG5yYWRpeD0weCUwOHhcbiIscmFkaXgpOwoJc3RyWzBdID0gaW5kZXhbMF07CglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyMlxuIik7Cgl1bnVtIC89IHJhZGl4OwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgMjNcbiIpOwoJZG8gewoJCXN0cltpKytdID0gaW5kZXhbdW51bSUodW5zaWduZWQpcmFkaXhdOwoJCXVudW0gLz0gcmFkaXg7Cgl9d2hpbGUodW51bSk7CglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAzXG4iKTsKCXN0cltpXSA9ICdcMCc7CgkvKsTm0PIqLwoJaWYgKHN0clswXSA9PSAnLScpCgkJayA9IDE7LyrKrr341sa4usr9Ki8KCWVsc2UKCSAgIAlrID0gMDsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDRcbiIpOwoJZm9yIChqID0gaztqIDw9IChpLTEpLzI7aisrKQoJewoJCXRlbXAgPSBzdHJbal07CgkJc3RyW2pdID0gc3RyW2ktMStrLWpdOwoJCXN0cltpLTEray1qXSA9IHRlbXA7Cgl9CglyZXR1cm4gc3RyOwp9Ci8vI2VuZGlmCgovKgpjaGFyICpzdHJzZXAoY2hhciAqKnN0cmluZ3AsIGNvbnN0IGNoYXIgKmRlbGltKQp7CiAgICBjaGFyICpzOwogICAgY29uc3QgY2hhciAqc3BhbnA7CiAgICBpbnQgYywgc2M7CiAgICBjaGFyICp0b2s7CiAgICBpZiAoKHMgPSAqc3RyaW5ncCk9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICBmb3IgKHRvayA9IHM7OykgewogICAgICAgIGMgPSAqcysrOwogICAgICAgIHNwYW5wID0gZGVsaW07CiAgICAgICAgZG8gewogICAgICAgICAgICBpZiAoKHNjID0qc3BhbnArKykgPT0gYykgewogICAgICAgICAgICAgICAgaWYgKGMgPT0gMCkKICAgICAgICAgICAgICAgICAgICBzID0gTlVMTDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzWy0xXSA9IDA7CiAgICAgICAgICAgICAgICAqc3RyaW5ncCA9IHM7CiAgICAgICAgICAgICAgICByZXR1cm4gKHRvayk7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChzYyAhPSAwKTsKICAgIH0KICAKfQoqLwppbnQgVE9MT1dFUihpbnQgY2gpCnsKCiAgIGlmICgodW5zaWduZWQgaW50KShjaCAtICdBJykgPCAyNnUgKQogICAgICBjaCArPSAnYScgLSAnQSc7CgogICByZXR1cm4gY2g7Cn0vL7Tz0LTX1sS416q7u86q0KHQtNfWxLihowoKaW50IGlzeGRpZ2l0KGludCBjaCkKewogICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKCBjaCAgICAgICAgIC0gJzAnKSA8IDEwdSAgfHwKICAgICAgICAgICAodW5zaWduZWQgaW50KSgoY2ggfCAweDIwKSAtICdhJykgPCAgNnU7Cn0vL8XQts/X1rf7Y8rHt/HOqsquwfm9+NbGyv3X1qGjCi8vtbFjzqpBLUYsYS1mu/IwLTnWrrzktcTKrsH5vfjWxsr919bKsaOst7W72LfHwePWtaOst/HU8re1u9jB46GjCmludCBpc2RpZ2l0KGludCBjaCkKewogICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpKGNoIC0gJzAnKSA8IDEwdTsKfS8vxdC2z9fWt/tjyse38c6qyv3X1iAKdW5zaWduZWQgaW50IHNpbXBsZV9ndWVzc19iYXNlKGNvbnN0IGNoYXIgKmNwKQp7CglpZiAoY3BbMF0gPT0gJzAnKSB7CgkJaWYgKFRPTE9XRVIoY3BbMV0pID09ICd4JyAmJiBpc3hkaWdpdChjcFsyXSkpCgkJCXJldHVybiAxNjsKCQllbHNlCgkJCS8vIHJldHVybiA4OwoJCQlyZXR1cm4gMTA7Cgl9IGVsc2UgewoJCXJldHVybiAxMDsKCX0KfQp1bnNpZ25lZCBpbnQgc2ltcGxlX3N0cnRvdWxsX2Rkcihjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQp7Cgl1bnNpZ25lZCBpbnQgIHJlc3VsdCA9IDA7CgkvL3ByaW50ZigidGVzdCBzaXplb2Yoc3RyX2J1Zik9PSVkXG4iLDEpOwoJaWYoY3AgPT0gTlVMTCkgLy9qaWF4aW5nIGFkZCAyMDE3MDYxNgoJCXJldHVybiAwOwoJaWYgKCFiYXNlKQoJCWJhc2UgPSBzaW1wbGVfZ3Vlc3NfYmFzZShjcCk7CglpZiAoYmFzZSA9PSAxNiAmJiBjcFswXSA9PSAnMCcgJiYgVE9MT1dFUihjcFsxXSkgPT0gJ3gnKQoJCWNwICs9IDI7CglpZiAoYmFzZSA9PSAxMCkgewoJCXdoaWxlICgoKmNwKT09ICcwJykgCgkJCWNwKys7Cgl9Cgl3aGlsZSAoaXN4ZGlnaXQoKmNwKSkgey8vvOyy6bWxx7BjcMrHt/HKx7j2yq7B+b341sbK/da1o6yyu8rH1rG907e1u9gwCgkJdW5zaWduZWQgaW50IHZhbHVlOwoJCXZhbHVlID0gaXNkaWdpdCgqY3ApID8gKmNwIC0gJzAnIDogVE9MT1dFUigqY3ApIC0gJ2EnICsgMTA7CgkJaWYgKHZhbHVlID49IGJhc2UpCgkJCWJyZWFrOwoJCXJlc3VsdCA9IHJlc3VsdCAqIGJhc2UgKyB2YWx1ZTsKCQljcCsrOwoJfQoJaWYgKGVuZHApCgkJKmVuZHAgPSAoY2hhciAqKWNwOwoJcmV0dXJuIHJlc3VsdDsKfQkKdW5zaWduZWQgaW50IGVudl90b19hX251bShjb25zdCBjaGFyICplbnZfbmFtZSkKewoJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgljaGFyIGJ1Zls0OF07CglzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgltZW1zZXQoc3RyX2J1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJcHJpbnRmKCJzaXplb2Yoc3RyX2J1Zik9PSVkXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVvZihidWYpKSk7CglzdHJfYnVmID0gZ2V0ZW52KGVudl9uYW1lKTsKCXVuc2lnbmVkIGludCBhX251bSA9IDA7CgljaGFyICplbmRwOwoKCXByaW50Zigic3RyPT0lc1xuIixzdHJfYnVmKTsKCglhX251bT1zaW1wbGVfc3RydG91bGxfZGRyKHN0cl9idWYsICZlbmRwLCAwKTsKCXByaW50ZigiJXM9PTB4JTA4eFxuIixzdHJfYnVmLGFfbnVtKTsKCglyZXR1cm4gYV9udW07Cn0KdW5zaWduZWQgaW50IGFfbnVtX3RvX2Vudihjb25zdCBjaGFyICplbnZfbmFtZSAsdW5zaWduZWQgaW50ICphX251bSkKewoJY2hhciAqc3RyX2J1Zj1OVUxMOwoJY2hhciBidWZbMTAyNF07CgkvL3Vuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs0OF07CgkvL3N0cl9idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCk7CglzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgltZW1zZXQoc3RyX2J1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJcHJpbnRmKCJzaXplb2Yoc3RyX2J1Zik9PSVkXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVvZihidWYpKSk7CglzdHJfYnVmID0gZ2V0ZW52KGVudl9uYW1lKTsKCglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7CgoJc3ByaW50ZihidWYsICIweCUwOHgiLCAqYV9udW0pOwoKCXByaW50ZiggIiVzPT0weCUwOHgiLCBidWYsKmFfbnVtKTsKCXNldGVudihlbnZfbmFtZSwgYnVmKTsKCglydW5fY29tbWFuZCgic2F2ZSIsMCk7CglyZXR1cm4gMTsKfQp1bnNpZ25lZCBpbnQgZW52X3RvX251bShjb25zdCBjaGFyICplbnZfbmFtZSx1bnNpZ25lZCBpbnQgKm51bV9hcnJ5KQp7CgljaGFyICpzdHJfYnVmID0gTlVMTDsKCWNoYXIgYnVmWzEwMjRdOwoJdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CglwcmludGYoInNpemVvZihzdHJfYnVmKT09JWRcbiIsKHVuc2lnbmVkIGludCkoc2l6ZW9mKGJ1ZikpKTsKCXN0cl9idWYgPSBnZXRlbnYoZW52X25hbWUpOwoKCWNoYXIgKiBzdHJbNDhdOwoJY2hhciAqZW5kcDsKCWludCBpOwoJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspCgkJc3RyX3RvX251bWFycnlbaV0gPSAwOwoJcHJpbnRmKCJzdHI9PSVzXG4iLHN0cl9idWYpOwoJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCQlzdHJbaV0gPSBzdHJzZXAoJnN0cl9idWYsICI7Iik7CgkJLy9zdHJbaV0gPSBzdHJzZXAoJnN0cl9idWYsICIgIik7CgkJaWYoc3RyW2ldID09IE5VTEwpCgkJCWJyZWFrOwoJCXN0cl90b19udW1hcnJ5W2ldID0gc2ltcGxlX3N0cnRvdWxsX2RkcihzdHJbaV0sICZlbmRwLCAwKTsKCQkvL3ByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLHN0cl90b19udW1hcnJ5W2ldKTsKCQkvL251bV9hcnJ5W2ldPXN0cl90b19udW1hcnJ5W2ldOwoJfQoJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCQlwcmludGYoInN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxzdHJfdG9fbnVtYXJyeVtpXSk7CgkJbnVtX2FycnlbaV0gPSBzdHJfdG9fbnVtYXJyeVtpXTsKCX0KCS8vbnVtX2Fycnk9KHVuc2lnbmVkIGludCAqKSgmc3RyX3RvX251bWFycnkpOwoJcmV0dXJuIDE7Cn0KCnVuc2lnbmVkIGludCBudW1fdG9fZW52KGNvbnN0IGNoYXIgKmVudl9uYW1lLHVuc2lnbmVkIGludCAqbnVtX2FycnkpCnsKCWNoYXIgKnN0cl9idWY9TlVMTDsKCWNoYXIgYnVmWzEwMjRdOwoJaW50IGk7CgkvL3Vuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs0OF07CgkvL3N0cl9idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCk7CglzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgltZW1zZXQoc3RyX2J1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJcHJpbnRmKCJzaXplb2Yoc3RyX2J1Zik9PSVkXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVvZihidWYpKSk7CglzdHJfYnVmID0gZ2V0ZW52KGVudl9uYW1lKTsKCgkvL2NoYXIgKiBzdHJbNDhdOwoJcHJpbnRmKCJzdHI9PSVzXG4iLHN0cl9idWYpOwoKCglzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIG51bV9hcnJ5WzBdKTsKCWZvciAoaSA9IDE7IGkgPCA0ODsgaSsrKSB7CgkJLy9udW1fYXJyeVtpXT0wOwoJCXNwcmludGYoYnVmLCAiJXM7MHglMDh4IiwgYnVmLG51bV9hcnJ5W2ldKTsKCQlwcmludGYoIiVkICAlZFxuIiwgaSxudW1fYXJyeVtpXSk7Cgl9CgkvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwoJcHJpbnRmKCAiJXMiLCBidWYpOwoJc2V0ZW52KGVudl9uYW1lLCBidWYpOwoKCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCS8vbnVtX2Fycnk9KHVuc2lnbmVkIGludCAqKSgmc3RyX3RvX251bWFycnkpOwoJcmV0dXJuIDE7Cn0KCiNkZWZpbmUgVERBVEEzMkYgMHhmZmZmZmZmZgojZGVmaW5lIFREQVRBMzJBIDB4YWFhYWFhYWEKI2RlZmluZSBUREFUQTMyNSAweDU1NTU1NTU1CiNkZWZpbmUgICAgIFBSRUdfU1RJQ0tZX0cxMkFfUkVHMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgwNzAgPDwgMikpCi8vI2RlZmluZSAgRERSX1RFU1RfQVVUT19URVNUX0NNRF9NQUdJQyAgIDB4MDEyMzQ1NjcKI2RlZmluZSBETUNfU1RJQ0tZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzOTgwMCkKI2RlZmluZSBETUNfU1RJQ0tZX0cxMkFfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM4ODAwKQojZGVmaW5lIERNQ19TVElDS1lfTUFHSUNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIzNDU2NzgKI2RlZmluZSBETUNfU1RJQ0tZX01BR0lDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFiY2RiZWFkCiNkZWZpbmUgRE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjIKI2RlZmluZSBETUNfU1RJQ0tZX0FVVE9fVEVTVF9DTURfSU5ERVhfTUFHSUNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzMKdW5zaWduZWQgaW50IGRtY19zdGlja3lbNjRdOwp1bnNpZ25lZCBpbnQgc3RpY2t5X3JlZ19iYXNlX2FkZD0wOwoKLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKdW5zaWduZWQgaW50ICAgZ2xvYmFsX2Jvb3RfdGltZXM9IDA7CnVuc2lnbmVkIGludCAgIHdhdGNoZG9nX3RpbWVfcz0gMjA7CnVuc2lnbmVkIGludCBnbG9iYWxfZGRyX2Nsaz0xOwp1bnNpZ25lZCBpbnQJYmRscl8xMDBzdGVwPTA7CnVuc2lnbmVkIGludCAgICAgICB1aV8xXzMyXzEwMHN0ZXA9MDsKdW5zaWduZWQgaW50ICAgZXJyb3JfY291bnQgPTA7CnVuc2lnbmVkIGludCAgZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0wOwp1bnNpZ25lZCBpbnQgIGNvcHlfdGVzdF9mbGFnID0gMDsKdW5zaWduZWQgaW50ICB0cmFpbmluZ19wYXR0ZXJuX2ZsYWcgPSAwOwp1bnNpZ25lZCBpbnQgdGVzdF9zdGFydF9hZGRyPTB4MTA4MDAwMDsKCnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E7Cgp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYjsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYjsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYjsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9iOwoKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbNF07Cgp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYls0XTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX29yZ1sxMF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19zZXR1cF9tYXhbNDBdOwp1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfaG9sZF9tYXhbNDBdOwp1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVs0MF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19ob2xkX3RpbWVbNDBdOwovLyAgICB1bnNpZ25lZCBpbnQgIGRhdGFfYmRscjBfNV9yZWdfb3JnWzZdOwp1bnNpZ25lZCBpbnQgIGRhdGFfYmRscjBfNV9yZWdfb3JnWzI4XTsvLzQvLzRsYW5lCnVuc2lnbmVkIGludCAgYmRscjBfOV9yZWdfc2V0dXBfbWF4WzI0KjRdOy8vNC8vNCBsYW5lIDk2IGJkbHIKdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19ob2xkX21heFsyNCo0XTsKdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19zZXR1cF90aW1lWzI0KjRdOwp1bnNpZ25lZCBpbnQgIGJkbHIwXzlfcmVnX2hvbGRfdGltZVsyNCo0XTsKCiNkZWZpbmUgcmVhZGwoYWRkcikgICAgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCiNkZWZpbmUgd3JpdGVsKGRhdGEgLGFkZHIpICAoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCgojZGVmaW5lIHdyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgovLyNkZWZpbmUgQ09ORklHX0REUl9DTURfQkRMX1RVTkUKLy8jZGVmaW5lICBDT05GSUdfQ01EX0REUl9URVNUCgojaWZuZGVmIENPTkZJR19DSElQIAovLyNkZWZpbmUgQ09ORklHX0NISVAgICAgQ0hJUF9PTEQgLy9DSElQX09MRC8vIC8vI2RlZmluZSBDSElQX09MRCAgICAgICAgICAgMCAgLy8jZGVmaW5lIENISVBfVFhMWCAgICAgICAgICAgMQojZGVmaW5lIENISVBfT0xEICAgICAgICAgICAwCiNkZWZpbmUgQ0hJUF9UWExYICAgICAgICAgICAxCiNkZWZpbmUgQ0hJUF9BMTEzICAgICAgICAgICAyCiNkZWZpbmUgQ0hJUF9HMTIgICAgICAgICAzCiNkZWZpbmUgQ09ORklHX0NISVAgICBDSElQX0cxMi8vIENISVBfT0xELy8KI2VuZGlmCgojZGVmaW5lIFBfRERSX1BIWV9ERUZBVUxUICAgICAgICAgICAwCiNkZWZpbmUgUF9ERFJfUEhZX0dYX0JBQlkgICAgICAgICAgICAgMQojZGVmaW5lICBQX0REUl9QSFlfR1hfVFZfQkFCWSAgICAgMgojZGVmaW5lICBQX0REUl9QSFlfOTA1WCAgICAgICAgMwoKLy8jZGVmaW5lICBQX0REUl9QSFlfT0xEX1RBRyAgICAgICAgIDAKI2RlZmluZSAgUF9ERFJfUEhZX0cxMiAgICAgICAgNAoKI2lmIChDT05GSUdfQ0hJUD49Q0hJUF9HMTIpCiNkZWZpbmUgQ09ORklHX0REUl9QSFkgICBQX0REUl9QSFlfRzEyCiNlbHNlIAovLyNkZWZpbmUgQ09ORklHX0NISVAgICAgQ0hJUF9PTEQvLwovLyNkZWZpbmUgQ09ORklHX0REUl9QSFkgICAgUF9ERFJfUEhZXzkwNVgvL1BfRERSX1BIWV9HWF9CQUJZLy9QX0REUl9QSFlfOTA1WC8vIFBfRERSX1BIWV9HWF9CQUJZCi8vI2RlZmluZSBDT05GSUdfRERSX1BIWSAgIFBfRERSX1BIWV9HMTIvL1BfRERSX1BIWV9ERUZBVUxULy8gUF9ERFJfUEhZXzkwNVgvL1BfRERSX1BIWV9HWF9CQUJZLy9QX0REUl9QSFlfOTA1WC8vIFBfRERSX1BIWV9HWF9CQUJZCiNkZWZpbmUgQ09ORklHX0REUl9QSFkgICBQX0REUl9QSFlfOTA1WC8vUF9ERFJfUEhZX0RFRkFVTFQvLyBQX0REUl9QSFlfOTA1WC8vUF9ERFJfUEhZX0dYX0JBQlkvL1BfRERSX1BIWV85MDVYLy8gUF9ERFJfUEhZX0dYX0JBQlkKLy8jZGVmaW5lIENPTkZJR19ERFJfUEhZX05FV19UQUcxICAgUF9ERFJfUEhZX0cxMgojZW5kaWYKCiNkZWZpbmUgRzEyX0FNX0REUl9QTExfQ05UTDAgICAweGZmNjM4YzAwCgojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCiNpbmNsdWRlIDxhc20vYXJjaC9zZWN1cmVfYXBiLmg+CiNlbmRpZgoKI2RlZmluZSBQQVRURVJOX1VTRV9ERFJfREVTCiNkZWZpbmUgIFVTRV82NEJJVF9QT0lOVEVSCi8vI2RlZmluZSAgVVNFXzMyQklUX1BPSU5URVIKI2lmZGVmIFVTRV82NEJJVF9QT0lOVEVSCiNkZWZpbmUgcF9jb252dGVyX2ludChhKSAgKCB1bnNpZ25lZCBpbnQgKSggdW5zaWduZWQgbG9uZyApKGEpCiNkZWZpbmUgaW50X2NvbnZ0ZXJfcChhKSAgKCB1bnNpZ25lZCBsb25nICkoYSkKCiNlbHNlCiNkZWZpbmUgcF9jb252dGVyX2ludChhKSAgKCB1bnNpZ25lZCBpbnQgKShhKQojZGVmaW5lIGludF9jb252dGVyX3AoYSkgICggdW5zaWduZWQgaW50ICkoYSkKI2VuZGlmCgojaWZkZWYgUEFUVEVSTl9VU0VfRERSX0RFUwojZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICAoZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdKQojZGVmaW5lIGRlc19pbnZfcGF0dGVybihhLGIsYyxkKSAgICggZGVzW2FdXih+KHBhdHRlcm5fIyNiW2NdW2RdKSkpCiNkZWZpbmUgZGVzX3hvcl9wYXR0ZXJuKGEsYikgICAoIGFeYikKLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCiNlbHNlCiNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV0mMCkrcGF0dGVybl8jI2JbY11bZF0KI2RlZmluZSBkZXNfaW52X3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV0mMCkrfihwYXR0ZXJuXyMjYltjXVtkXSkKI2RlZmluZSBkZXNfeG9yX3BhdHRlcm4oYSxiKSAgKGEmMCtiKQojZW5kaWYKCgojZGVmaW5lICBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCiNkZWZpbmUgIEREUl9QUkVGRVRDSF9DQUNIRQojZW5kaWYKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQojZGVmaW5lIGRkcl9wbGRfY2FjaGUoUCkgICBhc20gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAoUCkpCiNlbHNlCiNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKQojZW5kaWYKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQojZGVmaW5lIEREUjBfUFVCX1JFR19CQVNFCQkJMHhjODgzNjAwMAojZGVmaW5lIEREUjFfUFVCX1JFR19CQVNFCQkJMHhjODgzNjAwMAojZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKI2RlZmluZSAgQ0hBTk5FTF9CX1JFR19CQVNFICAweDIwMDAKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICAweGM4ODM2YzAwCiNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICAweGM4ODM2YzAwCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzZjMDApKQojZGVmaW5lIE9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzZjMDApKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCg1KSwgMHhjODgzNmMwMCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgKHdyaXRlbCgoNSksIDB4Yzg4MzZjMDApKQovLyAjZGVmaW5lIFBfSVNBX1RJTUVSRSAgICAgICAgICAgICAgICAweGMxMTA5OTg4Ci8vICAgI2RlZmluZSBnZXRfdXNfdGltZSgpICAgIChyZWFkbChQX0lTQV9USU1FUkUpKQojZGVmaW5lIEFNX0REUl9QTExfQ05UTAkJCQkJCTB4Yzg4MzY4MDAKI2RlZmluZSBERFIwX1BVQl9aUUNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTBQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEwRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQoKI2RlZmluZSBERFIxX1BVQl9aUUNSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkwPDwyKSkKI2RlZmluZSBERFIxX1BVQl9aUTBQUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCiNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQoKI2RlZmluZSBERFIwX1BVQl9aUTFQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5NTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlExRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTY8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMVNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk3PDwyKSkKLy8weDk4IHJlc2VydmVkKQojZGVmaW5lIEREUjBfUFVCX1pRMlBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk5PDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTJEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5QTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEyU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUI8PDIpKQovLzB4OWMgcmVzZXJ2ZWQpCiNkZWZpbmUgRERSMF9QVUJfWlEzUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUQ8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRM0RSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlFPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTNTUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Rjw8MikpCiNkZWZpbmUgQUNCRExSX01BWCAgIDBYMUYKI2RlZmluZSBBQ0xDRExSX01BWCAgIDBYRkYKI2RlZmluZSBEUUJETFJfTUFYICAgMFgxRgojZGVmaW5lIERRTENETFJfTUFYICAgMFhGRgojZGVmaW5lIERYTkdUUl9NQVggICAwWDcKI2RlZmluZSBBQ0JETFJfTlVNICAgMTAKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweGEwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMUdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MGMwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MGUwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDEwMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKCgojZGVmaW5lIERNQ19SRUdfQkFTRQkJCQkJCTB4Yzg4MzgwMDAKI2RlZmluZSBETUNfTU9OX0NUUkwyCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI2IDw8MiApKQogICAvL2JpdCAzMS4gICBxb3NfbW9uX2VuLiAgICB3cml0ZSAxIHRvIHRyaWdnZXIgdGhlIGVuYWJsZS4gcG9sbGluZyB0aGlzIGJpdCAwLCBtZWFucyBmaW5pc2hlZC4gIG9yIHVzZSBpbnRlcnJ1cHQgdG8gY2hlY2sgZmluaXNoLgogICAvL2JpdCAzMC4gICBxb3NfbW9uIGludGVycnVwdCBjbGVhci4gIGNsZWFyIHRoZSBxb3MgbW9uaXRvciByZXN1bHQuICByZWFkIDEgPSBxb3MgbW9uIGZpbmlzaCBpbnRlcnJ1cHQuCiAgIC8vYml0IDIwLiAgIHFvc19tb25fdHJpZ19zZWwuICAxID0gdnN5bmMuICAwID0gdGltZXIuCiAgIC8vYml0IDE5OjE2LiAgcW9zIG1vbml0b3IgY2hhbm5lbCBzZWxlY3QuICAgc2VsZWN0IG9uZSBhdCBvbmUgdGltZSBvbmx5LgogICAvL2JpdCAxNTowLiAgIHBvcnQgc2VsZWN0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KI2RlZmluZSBETUNfTU9OX0NUUkwzCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI3IDw8MiApKQogIC8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKCgojZWxpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9UVl9CQUJZKQojZGVmaW5lIEREUjBfUFVCX1JFR19CQVNFCQkJMHhjODgzNjAwMAojZGVmaW5lIEREUjFfUFVCX1JFR19CQVNFCQkJMHhjODgzNzAwMAojZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKI2RlZmluZSAgQ0hBTk5FTF9CX1JFR19CQVNFICAweDEwMDAKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICAweGM4ODM2YzAwCiNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICAweGM4ODM2YzAwCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzZjMDApKQojZGVmaW5lIE9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDApLCAweGM4ODM3YzAwKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMHgxMmEpLCAweGM4ODM2YzAwKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpICAgICh3cml0ZWwoKDB4MTJhKSwgMHhjODgzN2MwMCkpCi8vCSNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgICAweGMxMTA5OTg4Ci8vICAgI2RlZmluZSBnZXRfdXNfdGltZSgpICAgKHJlYWRsKFBfSVNBX1RJTUVSRSkgKQojZGVmaW5lIEFNX0REUl9QTExfQ05UTAkJCQkJCTB4Yzg4MzY4MDAKI2RlZmluZSBERFIwX1BVQl9aUUNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTBQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEwRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQojZGVmaW5lIEREUjFfUFVCX1pRQ1IJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQojZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9aUTBEUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCgojZGVmaW5lIEREUjBfUFVCX1pRMFNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkzPDwyKSkKLy8weDk0IHJlc2VydmVkKQojZGVmaW5lIEREUjBfUFVCX1pRMVBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk1PDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTFEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Njw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlExU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTc8PDIpKQovLzB4OTggcmVzZXJ2ZWQpCiNkZWZpbmUgRERSMF9QVUJfWlEyUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTk8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMkRSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlBPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTJTUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Qjw8MikpCi8vMHg5YyByZXNlcnZlZCkKI2RlZmluZSBERFIwX1BVQl9aUTNQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5RDw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEzRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRM1NSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlGPDwyKSkKI2RlZmluZSBBQ0JETFJfTUFYICAgMFgxRgojZGVmaW5lIEFDTENETFJfTUFYICAgMFhGRgojZGVmaW5lIERRQkRMUl9NQVggICAwWDFGCiNkZWZpbmUgRFFMQ0RMUl9NQVggICAwWEZGCiNkZWZpbmUgRFhOR1RSX01BWCAgIDBYNwojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4YTAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwYzAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwZTAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMTAwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIERNQ19SRUdfQkFTRQkJCQkJCTB4Yzg4MzgwMDAKI2RlZmluZSBETUNfTU9OX0NUUkwyCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI2IDw8MiApKQogICAvL2JpdCAzMS4gICBxb3NfbW9uX2VuLiAgICB3cml0ZSAxIHRvIHRyaWdnZXIgdGhlIGVuYWJsZS4gcG9sbGluZyB0aGlzIGJpdCAwLCBtZWFucyBmaW5pc2hlZC4gIG9yIHVzZSBpbnRlcnJ1cHQgdG8gY2hlY2sgZmluaXNoLgogICAvL2JpdCAzMC4gICBxb3NfbW9uIGludGVycnVwdCBjbGVhci4gIGNsZWFyIHRoZSBxb3MgbW9uaXRvciByZXN1bHQuICByZWFkIDEgPSBxb3MgbW9uIGZpbmlzaCBpbnRlcnJ1cHQuCiAgIC8vYml0IDIwLiAgIHFvc19tb25fdHJpZ19zZWwuICAxID0gdnN5bmMuICAwID0gdGltZXIuCiAgIC8vYml0IDE5OjE2LiAgcW9zIG1vbml0b3IgY2hhbm5lbCBzZWxlY3QuICAgc2VsZWN0IG9uZSBhdCBvbmUgdGltZSBvbmx5LgogICAvL2JpdCAxNTowLiAgIHBvcnQgc2VsZWN0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KI2RlZmluZSBETUNfTU9OX0NUUkwzCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI3IDw8MiApKQogIC8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgZ3JhbnRlZCBkYXRhIGN5Y2xlcyBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYW5kIHBvcnRzLgoKI2VsaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCgkgIC8vICNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgICAweGMxMTA5OTg4CgkgLy8gICNkZWZpbmUgZ2V0X3VzX3RpbWUoKSAgIChyZWFkbChQX0lTQV9USU1FUkUpICkKI2lmIENPTkZJR19DSElQICAgPj1DSElQX1RYTFgKI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCSAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzYwMDApLy9ERFIwX1BVQl9SSURSCiNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzNjAwMCkvL0REUjBfUFVCX1JJRFIKI2RlZmluZSAgQ0hBTk5FTF9BX1JFR19CQVNFICAwCiNkZWZpbmUgIENIQU5ORUxfQl9SRUdfQkFTRSAgMC8vMHgxMDAwCiNkZWZpbmUgTU1DX1JFR19CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM3MDAwKSAgLy8gI2RlZmluZSBBTV9ERFJfUExMX0NOVEwwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzNzAwMCkgMHhjODgzNzAwMAojZGVmaW5lICAgRERSX0NMS19DTlRMICAgKE1NQ19SRUdfQkFTRSArICggMHg3CTw8IDIgKSkKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICBERFJfQ0xLX0NOVEwKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIEREUl9DTEtfQ05UTAojZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwMCksIEREUl9DTEtfQ05UTCkpCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpICAgICAvLyAod3JpdGVsKCgwWGIwMDBhMDAwKSwgRERSX0NMS19DTlRMKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAgLy8gICh3cml0ZWwoKDBYYjAwMGEwMDUpLCBERFJfQ0xLX0NOVEwpKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgLy8gKHdyaXRlbCgoMFhiMDAwYTAwNSksIEREUl9DTEtfQ05UTCkpCgojZGVmaW5lIEFNX0REUl9QTExfQ05UTDAgICAgIAkgICAgICAgKE1NQ19SRUdfQkFTRSArICggMHgwCTw8IDIgKSkKI2RlZmluZSBBTV9ERFJfUExMX0NOVEwJCQkJCQlBTV9ERFJfUExMX0NOVEwwCiNkZWZpbmUgIEREUjBfUFVCX1pRQ1IgICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEwIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEwUFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTEgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTBEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMiA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMFNSICAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEzIDw8IDIgKSkKCiNkZWZpbmUgIEREUjBfUFVCX1pRMVBSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE1IDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlExRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTYgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTFTUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhNyA8PCAyICkpCgojZGVmaW5lICBERFIwX1BVQl9aUTJQUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhOSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMkRSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWFBIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEyU1IgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYUIgPDwgMiApKQoKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAxYzAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMjAwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDI0MCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAyODAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCgojZGVmaW5lIEREUjFfUFVCX1pRQ1IJCQkJCUREUjBfUFVCX1pRMFBSCiNkZWZpbmUgRERSMV9QVUJfWlEwUFIJCQkJCUREUjBfUFVCX1pRMFBSCiNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCUREUjBfUFVCX1pRMERSCgojZGVmaW5lIEFDQkRMUl9NQVggICAwWDNGCiNkZWZpbmUgQUNMQ0RMUl9NQVggICAwWDFGRgojZGVmaW5lIERRQkRMUl9NQVggICAwWDNGCiNkZWZpbmUgRFFMQ0RMUl9NQVggICAwWDFGRgojZGVmaW5lIERYTkdUUl9NQVggICAwWDFGCgogICAgIC8vICAgICAjZGVmaW5lIERNQ19SRUdfQkFTRQkJCQkJCU1NQ19SRUdfQkFTRQoKI2RlZmluZSBETUNfTU9OX0NUUkwyCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI2IDw8MiApKQogICAvL2JpdCAzMS4gICBxb3NfbW9uX2VuLiAgICB3cml0ZSAxIHRvIHRyaWdnZXIgdGhlIGVuYWJsZS4gcG9sbGluZyB0aGlzIGJpdCAwLCBtZWFucyBmaW5pc2hlZC4gIG9yIHVzZSBpbnRlcnJ1cHQgdG8gY2hlY2sgZmluaXNoLgogICAvL2JpdCAzMC4gICBxb3NfbW9uIGludGVycnVwdCBjbGVhci4gIGNsZWFyIHRoZSBxb3MgbW9uaXRvciByZXN1bHQuICByZWFkIDEgPSBxb3MgbW9uIGZpbmlzaCBpbnRlcnJ1cHQuCiAgIC8vYml0IDIwLiAgIHFvc19tb25fdHJpZ19zZWwuICAxID0gdnN5bmMuICAwID0gdGltZXIuCiAgIC8vYml0IDE5OjE2LiAgcW9zIG1vbml0b3IgY2hhbm5lbCBzZWxlY3QuICAgc2VsZWN0IG9uZSBhdCBvbmUgdGltZSBvbmx5LgogICAvL2JpdCAxNTowLiAgIHBvcnQgc2VsZWN0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KI2RlZmluZSBETUNfTU9OX0NUUkwzCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI3IDw8MiApKQovLyBxb3NfbW9uX2Nsa190aW1lci4gICBIb3cgbG9uZyB0byBtZWFzdXJlIHRoZSBiYW5kd2lkdGguCgoKI2RlZmluZSBETUNfTU9OX0FMTF9SRVFfQ05UCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjggPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyByZXF1ZXN0IHRpbWUuCiNkZWZpbmUgRE1DX01PTl9BTExfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIGdyYW50ZWQgZGF0YSBjeWNsZXMuIDY0Yml0cyB1bml0LgojZGVmaW5lIERNQ19NT05fT05FX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MmEgPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIGdyYW50ZWQgZGF0YSBjeWNsZXMgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIGFuZCBwb3J0cy4KCiNlbHNlCiNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCiNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCiNkZWZpbmUgIENIQU5ORUxfQV9SRUdfQkFTRSAgMAojZGVmaW5lICBDSEFOTkVMX0JfUkVHX0JBU0UgIDAvLzB4MTAwMAojZGVmaW5lIE1NQ19SRUdfQkFTRSAgIDB4Yzg4MzcwMDAKI2RlZmluZSAgIEREUl9DTEtfQ05UTCAgIChNTUNfUkVHX0JBU0UgKyAoIDB4Nwk8PCAyICkpCiNkZWZpbmUgUF9ERFIwX0NMS19DVFJMICAgRERSX0NMS19DTlRMCiNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICBERFJfQ0xLX0NOVEwKI2RlZmluZSBPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgLy8gICh3cml0ZWwoKDBYYjAwMGEwMDApLCBERFJfQ0xLX0NOVEwpKQojZGVmaW5lIE9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwMCksIEREUl9DTEtfQ05UTCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKSAgLy8gICAod3JpdGVsKCgwWGIwMDBhMDA1KSwgRERSX0NMS19DTlRMKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpICAgLy8gICh3cml0ZWwoKDBYYjAwMGEwMDUpLCBERFJfQ0xLX0NOVEwpKQoKI2RlZmluZSBBTV9ERFJfUExMX0NOVEwwICAgICAJICAgICAgIChNTUNfUkVHX0JBU0UgKyAoIDB4MAk8PCAyICkpCiNkZWZpbmUgQU1fRERSX1BMTF9DTlRMCQkJCQkJQU1fRERSX1BMTF9DTlRMMAojZGVmaW5lICBERFIwX1BVQl9aUUNSICAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMCA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMFBSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWExIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEwRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTIgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTBTUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMyA8PCAyICkpCgojZGVmaW5lICBERFIwX1BVQl9aUTFQUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhNSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMURSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE2IDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlExU1IgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTcgPDwgMiApKQoKI2RlZmluZSAgRERSMF9QVUJfWlEyUFIgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTkgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTJEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhQSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMlNSICAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWFCIDw8IDIgKSkKCiNkZWZpbmUgRERSMV9QVUJfWlFDUgkJCQkJRERSMF9QVUJfWlEwUFIKI2RlZmluZSBERFIxX1BVQl9aUTBQUgkJCQkJRERSMF9QVUJfWlEwUFIKI2RlZmluZSBERFIxX1BVQl9aUTBEUgkJCQkJRERSMF9QVUJfWlEwRFIKCiNkZWZpbmUgQUNCRExSX01BWCAgIDBYM0YKI2RlZmluZSBBQ0xDRExSX01BWCAgIDBYMUZGCiNkZWZpbmUgRFFCRExSX01BWCAgIDBYM0YKI2RlZmluZSBEUUxDRExSX01BWCAgIDBYMUZGCiNkZWZpbmUgRFhOR1RSX01BWCAgIDBYMUYKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDFjMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDIwMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDI0MCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAyODAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNpZm5kZWYgIERNQ19SRUdfQkFTRQojZGVmaW5lIERNQ19SRUdfQkFTRQkJCQkJCU1NQ19SRUdfQkFTRQojZW5kaWYKI2RlZmluZSBETUNfTU9OX0NUUkwyCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI2IDw8MiApKQovL2JpdCAzMS4gICBxb3NfbW9uX2VuLiAgICB3cml0ZSAxIHRvIHRyaWdnZXIgdGhlIGVuYWJsZS4gcG9sbGluZyB0aGlzIGJpdCAwLCBtZWFucyBmaW5pc2hlZC4gIG9yIHVzZSBpbnRlcnJ1cHQgdG8gY2hlY2sgZmluaXNoLgovL2JpdCAzMC4gICBxb3NfbW9uIGludGVycnVwdCBjbGVhci4gIGNsZWFyIHRoZSBxb3MgbW9uaXRvciByZXN1bHQuICByZWFkIDEgPSBxb3MgbW9uIGZpbmlzaCBpbnRlcnJ1cHQuCi8vYml0IDIwLiAgIHFvc19tb25fdHJpZ19zZWwuICAxID0gdnN5bmMuICAwID0gdGltZXIuCi8vYml0IDE5OjE2LiAgcW9zIG1vbml0b3IgY2hhbm5lbCBzZWxlY3QuICAgc2VsZWN0IG9uZSBhdCBvbmUgdGltZSBvbmx5LgovL2JpdCAxNTowLiAgIHBvcnQgc2VsZWN0IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4KI2RlZmluZSBETUNfTU9OX0NUUkwzCQkJCQkJKERNQ19SRUdfQkFTRSArICgweDI3IDw8MiApKQovLyBxb3NfbW9uX2Nsa190aW1lci4gICBIb3cgbG9uZyB0byBtZWFzdXJlIHRoZSBiYW5kd2lkdGguCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyByZXF1ZXN0IHRpbWUuCiNkZWZpbmUgRE1DX01PTl9BTExfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOSA8PDIgKSkKLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyBncmFudGVkIGRhdGEgY3ljbGVzLiA2NGJpdHMgdW5pdC4KI2RlZmluZSBETUNfTU9OX09ORV9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDJhIDw8MiApKQovLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgZ3JhbnRlZCBkYXRhIGN5Y2xlcyBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYW5kIHBvcnRzLgojZW5kaWYgCgojZWxpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9ERUZBVUxUKQoKI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCTB4YzgwMDEwMDAJCS8vMHhjODgzNjAwMAojZGVmaW5lIEREUjFfUFVCX1JFR19CQVNFCQkJMHhjODAwMTAwMAkJLy8JMHhjODgzNjAwMAojZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKI2RlZmluZSAgQ0hBTk5FTF9CX1JFR19CQVNFICAweDIwMDAKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICAweGM4MDAwODAwCiNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICAweGM4MDAyODAwCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMHgxMmIpLCAweGM4MDAwODAwKSkKI2RlZmluZSBPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgweDEyYiksIDB4YzgwMDI4MDApKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgweDEyYSksIDB4YzgwMDA4MDApKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgweDEyYSksIDB4YzgwMDI4MDApKQovLwkjZGVmaW5lIFBfSVNBX1RJTUVSRSAgICAgICAgICAgICAgICAgMHhjMTEwOTk4OAovLyAgICNkZWZpbmUgZ2V0X3VzX3RpbWUoKSAgIChyZWFkbChQX0lTQV9USU1FUkUpKQoKI2RlZmluZSBQUkVHX1NUSUNLWV9SRUcwICAweGMxMTAwMDAwKygweDIwN2M8PDIpCiNkZWZpbmUgUFJFR19TVElDS1lfUkVHMSAgICAgICAgICAgICAweGMxMTAwMDAwKygweDIwN2Q8PDIpCiNkZWZpbmUgV0FUQ0hET0dfVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAweGMxMTAwMDAwKygweDI2NDA8PDIpLy8gICAgIDB4MjY0MAoKI2RlZmluZSBBTV9ERFJfUExMX0NOVEwgIDB4YzgwMDA0MDAKI2RlZmluZSBERFIwX1BVQl9aUUNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTBQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEwRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMVBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTFEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEyUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMkRSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkyPDwyKSkKI2RlZmluZSBERFIxX1BVQl9aUUNSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkwPDwyKSkKI2RlZmluZSBERFIxX1BVQl9aUTBQUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCiNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQojZGVmaW5lIEFDQkRMUl9NQVggICAwWDFGCiNkZWZpbmUgQUNMQ0RMUl9NQVggICAwWEZGCiNkZWZpbmUgRFFCRExSX01BWCAgIDBYMUYKI2RlZmluZSBEUUxDRExSX01BWCAgIDBYRkYKI2RlZmluZSBEWE5HVFJfTUFYICAgMFg3CiNkZWZpbmUgRERSMF9QVUJfRFgwR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHhhMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDBjMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDBlMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAxMDAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRE1DX1JFR19CQVNFICAgICAgMHhjODAwNjAwMAojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCi8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCi8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCi8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCi8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCiNkZWZpbmUgRE1DX01PTl9BTExfUkVRX0NOVAkJCQkJKERNQ19SRUdfQkFTRSArICgweDI4IDw8MiApKQovLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQovLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIGdyYW50ZWQgZGF0YSBjeWNsZXMuIDY0Yml0cyB1bml0LgojZGVmaW5lIERNQ19NT05fT05FX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MmEgPDwyICkpCi8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSBncmFudGVkIGRhdGEgY3ljbGVzIGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBhbmQgcG9ydHMuCgoKCiNlbGlmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0cxMikKI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCTB4ZmY2MzYwMDAKI2RlZmluZSBERFIxX1BVQl9SRUdfQkFTRQkJCTB4ZmY2MzYwMDAKI2RlZmluZSAgQ0hBTk5FTF9BX1JFR19CQVNFICAwCiNkZWZpbmUgIENIQU5ORUxfQl9SRUdfQkFTRSAgMC8vMHgxMDAwCiNkZWZpbmUgTU1DX1JFR19CQVNFICAgMHhmZjYzNzAwMAojZGVmaW5lICAgRERSX0NMS19DTlRMICAgKE1NQ19SRUdfQkFTRSArICggMHg3CTw8IDIgKSkKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICBERFJfQ0xLX0NOVEwKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIEREUl9DTEtfQ05UTAojZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwMCksIEREUl9DTEtfQ05UTCkpCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpICAgIC8vICAod3JpdGVsKCgwWGIwMDBhMDAwKSwgRERSX0NMS19DTlRMKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAvLyAgICh3cml0ZWwoKDBYYjAwMGEwMDUpLCBERFJfQ0xLX0NOVEwpKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwNSksIEREUl9DTEtfQ05UTCkpCgojZGVmaW5lIEFNX0REUl9QTExfQ05UTDAgICAgIAkgICAgICAgKE1NQ19SRUdfQkFTRSArICggMHgwCTw8IDIgKSkKI2RlZmluZSBBTV9ERFJfUExMX0NOVEwJCQkJCQlBTV9ERFJfUExMX0NOVEwwCiNkZWZpbmUgIEREUjBfUFVCX1pRQ1IgICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEwIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEwUFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTEgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTBEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMiA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMFNSICAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEzIDw8IDIgKSkKCiNkZWZpbmUgIEREUjBfUFVCX1pRMVBSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE1IDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlExRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTYgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTFTUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhNyA8PCAyICkpCgojZGVmaW5lICBERFIwX1BVQl9aUTJQUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhOSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMkRSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWFBIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEyU1IgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYUIgPDwgMiApKQoKI2RlZmluZSBERFIxX1BVQl9aUUNSCQkJCQlERFIwX1BVQl9aUTBQUgojZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQlERFIwX1BVQl9aUTBQUgojZGVmaW5lIEREUjFfUFVCX1pRMERSCQkJCQlERFIwX1BVQl9aUTBEUgoKI2RlZmluZSBBQ0JETFJfTUFYICAgMFgzRgojZGVmaW5lIEFDTENETFJfTUFYICAgMFgxRkYKI2RlZmluZSBEUUJETFJfTUFYICAgMFgzRgojZGVmaW5lIERRTENETFJfTUFYICAgMFgxRkYKI2RlZmluZSBEWE5HVFJfTUFYICAgMFgxRgojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MWMwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMUdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MjAwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MjQwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDI4MCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2lmbmRlZiAgRE1DX1JFR19CQVNFCiNkZWZpbmUgRE1DX1JFR19CQVNFCQkJCQkJTU1DX1JFR19CQVNFCiNlbmRpZgojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCi8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCi8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCi8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCi8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyByZXF1ZXN0IHRpbWUuCiNkZWZpbmUgRE1DX01PTl9BTExfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIGdyYW50ZWQgZGF0YSBjeWNsZXMuIDY0Yml0cyB1bml0LgojZGVmaW5lIERNQ19NT05fT05FX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MmEgPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIGdyYW50ZWQgZGF0YSBjeWNsZXMgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIGFuZCBwb3J0cy4KI2VuZGlmIAoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCiNkZWZpbmUgRERSMF9QVUJfUElSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDAxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9QR0NSMCAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDQgPDwgMiAgKSkvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9QR0NSMSAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDUgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIwX1BVQl9QR0NSMiAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDYgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIKI2RlZmluZSBERFIwX1BVQl9QR0NSMyAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDcgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMKI2RlZmluZSBERFIwX1BVQl9QR0NSNCAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDggPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDQKI2RlZmluZSBERFIwX1BVQl9QR0NSNSAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDkgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDUKI2RlZmluZSBERFIwX1BVQl9QR0NSNiAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMEEgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDYKI2RlZmluZSBERFIwX1BVQl9QR0NSNyAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMEIgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDcKI2RlZmluZSBERFIwX1BVQl9QR0NSOCAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMEMgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDgKCiNkZWZpbmUgRERSMV9QVUJfUElSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDAxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9QR0NSMCAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDQgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIxX1BVQl9QR0NSMSAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDUgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIxX1BVQl9QR0NSMiAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDYgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIKI2RlZmluZSBERFIxX1BVQl9QR0NSMyAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDcgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMKI2RlZmluZSBERFIxX1BVQl9QR0NSNCAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDggPDwgMiApICkvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDQKI2RlZmluZSBERFIxX1BVQl9QR0NSNSAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMDkgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDUKI2RlZmluZSBERFIxX1BVQl9QR0NSNiAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMEEgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDYKI2RlZmluZSBERFIxX1BVQl9QR0NSNyAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMEIgPDwgMiApKSAvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDcKI2RlZmluZSBERFIxX1BVQl9QR0NSOCAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgwMEMgPDwgMiApICkvLyBSL1cgLSBQSFkgR2VuZXJhbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDgKCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDAgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkMSAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEJETFIyICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQyICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjMgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDQgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkNSAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEJETFI1ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ2ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjYgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDggIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUxICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIyICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTIgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjMgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMyAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSNCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU0ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFI1ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTUgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBNRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlOCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYME1ETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU5ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgwR1RSMCAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjAgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBHVFIxICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMEdUUjIgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgwR1RSMyAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjMgIDw8IDIpKQoKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxMCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUJETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjExICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjIgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSMyAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxNCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUJETFI0ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE1ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjUgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTYgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSNiAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxOCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIwICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIxICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjIgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMyAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIzICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFI0ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjQgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjUgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyNSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMU1ETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI4ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTURMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjkgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFHVFIwICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMUdUUjEgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSMiAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFHVFIzICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMyAgPDwgMikgKQoKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1MCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkJETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjUxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjIgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSMyAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1NCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkJETFI0ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU1ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjUgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTYgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSNiAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1OCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMCAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYwICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIxICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjIgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMyAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYzICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFI0ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjQgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjUgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2NSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMk1ETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY4ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTURMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjkgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJHVFIwICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMkdUUjEgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjcxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR1RSMiAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJHVFIzICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MyAgPDwgMikgKQoKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5MCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0JETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjkxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjIgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSMyAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5NCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0JETFI0ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk1ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjUgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTYgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSNiAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5OCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmEwICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIxICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjIgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMyAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmEzICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFI0ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTQgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjUgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhNSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM01ETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE4ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTURMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTkgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNHVFIwICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYM0dUUjEgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR1RSMiAgICAoICBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNHVFIzICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMyAgPDwgMikgKQoKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSMCAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkMCAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMEJETFIxICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQxICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkMiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMEJETFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSNAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ1ICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjUJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkNiAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMEJETFI2CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDggIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjAgICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUwICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIxCSAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMiAgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTIgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjMJICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUzICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFI0ICAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlNCAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSNQkgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBNRExSMAkgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBNRExSMQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlOSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMEdUUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMEdUUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMSAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMEdUUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMiAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMEdUUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMyAgPDwgMikpCgojZGVmaW5lIEREUjFfUFVCX0RYMUJETFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjExICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxMiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUJETFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSNAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjUJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxNiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUJETFI2CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjAJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjEJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjIgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjMJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjMgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjQgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjUJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFNRExSMAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyOCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMU1ETFIxCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI5ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxR1RSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxR1RSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxR1RSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxR1RSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMzICA8PCAyICkpCgojZGVmaW5lIEREUjFfUFVCX0RYMkJETFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjUxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1MiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkJETFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSNAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjUJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1NiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkJETFI2CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjAJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjEJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjIgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjMJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjMgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjQJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjUJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJNRExSMAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2OCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMk1ETFIxCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY5ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyR1RSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjcwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyR1RSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjcxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyR1RSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjcyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyR1RSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjczICA8PCAyICkpCgojZGVmaW5lIEREUjFfUFVCX0RYM0JETFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjkxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5MiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0JETFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSNAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk1ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjUJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5NiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0JETFI2CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTggIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjAJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjEJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjIgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjMJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTMgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjQJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTQgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjUgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNNRExSMAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhOCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM01ETFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTkgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNHVFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNHVFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNHVFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNHVFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjMgIDw8IDIgKSkKCgojZGVmaW5lIEREUjBfUFVCX0FDTENETFIgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE2MCA8PCAyICkpIC8vIFIvVyAtIExDIERlbGF5IExpbmUgUHJlc2VudCBSZWdpc3RlcgojZGVmaW5lIEREUjBfUFVCX0FDTURMUjAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE2OCA8PCAyICkpIC8vIFIvVyAtIEFDIE1hc3RlciBEZWxheSBMaW5lIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9BQ01ETFIxICAgICAoICBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNjkgPDwgMiApKSAvLyBSL1cgLSBNYXN0ZXIgRGVsYXkgTGluZSBSZWdpc3RlciAxCiNkZWZpbmUgRERSMF9QVUJfQUNCRExSMCAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTUwIDw8IDIgKSkgLy8gUi9XIC0gQUMgQml0IERlbGF5IExpbmUgUmVnaXN0ZXIgMAojZGVmaW5lIEREUjBfUFVCX0FDQkRMUjMgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNTMgPDwgMiApICkgLy8gUi9XIC0gQUMgQml0IERlbGF5IExpbmUgUmVnaXN0ZXIgMwoKI2RlZmluZSBERFIxX1BVQl9BQ0xDRExSICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNjAgPDwgMiApICkvLyBSL1cgLSBMQyBEZWxheSBMaW5lIFByZXNlbnQgUmVnaXN0ZXIKI2RlZmluZSBERFIxX1BVQl9BQ01ETFIwICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNjggPDwgMiApKSAvLyBSL1cgLSBBQyBNYXN0ZXIgRGVsYXkgTGluZSBSZWdpc3RlciAwCiNkZWZpbmUgRERSMV9QVUJfQUNNRExSMSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTY5IDw8IDIgKSkgLy8gUi9XIC0gTWFzdGVyIERlbGF5IExpbmUgUmVnaXN0ZXIgMQojZGVmaW5lIEREUjFfUFVCX0FDQkRMUjAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE1MCA8PCAyICkgKS8vIFIvVyAtIEFDIEJpdCBEZWxheSBMaW5lIFJlZ2lzdGVyIDAKCgojZGVmaW5lIEREUjBfUFVCX0FDTURMUgkJCQkJRERSMF9QVUJfQUNNRExSMAojZGVmaW5lIEREUjFfUFVCX0FDTURMUgkJCQkJRERSMV9QVUJfQUNNRExSMAojZGVmaW5lIEREUjBfUFVCX0RYMEdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgwR1RSMAojZGVmaW5lIEREUjBfUFVCX0RYMUdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgxR1RSMAojZGVmaW5lIEREUjBfUFVCX0RYMkdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgyR1RSMAojZGVmaW5lIEREUjBfUFVCX0RYM0dUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgzR1RSMAojZGVmaW5lIEREUjFfUFVCX0RYMEdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgwR1RSMAojZGVmaW5lIEREUjFfUFVCX0RYMUdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgxR1RSMAojZGVmaW5lIEREUjFfUFVCX0RYMkdUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgyR1RSMAojZGVmaW5lIEREUjFfUFVCX0RYM0dUUgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERSMF9QVUJfRFgzR1RSMAoKCiNkZWZpbmUgRERSMF9QVUJfSU9WQ1IwICAgICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0OCA8PCAyICkpIC8vIFIvVyAtIElPIFZSRUYgQ29udHJvbCBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfSU9WQ1IxICAgICAgKCAgIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0OSA8PCAyICkpIC8vIFIvVyAtIElPIFZSRUYgQ29udHJvbCBSZWdpc3RlciAxCiNkZWZpbmUgRERSMF9QVUJfVlRDUjAgICAgICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0QSA8PCAyICkgKS8vIFIvVyAtIFZSRUYgVHJhaW5pbmcgQ29udHJvbCBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfVlRDUjEgICAgICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0QiA8PCAyICkpIC8vIFIvVyAtIFZSRUYgVHJhaW5pbmcgQ29udHJvbCBSZWdpc3RlciAxCiNkZWZpbmUgRERSMV9QVUJfSU9WQ1IwICAgICAoICAgIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0OCA8PCAyICkpIC8vIFIvVyAtIElPIFZSRUYgQ29udHJvbCBSZWdpc3RlciAwCiNkZWZpbmUgRERSMV9QVUJfSU9WQ1IxICAgICAgKCAgIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0OSA8PCAyICkpIC8vIFIvVyAtIElPIFZSRUYgQ29udHJvbCBSZWdpc3RlciAxCiNkZWZpbmUgRERSMV9QVUJfVlRDUjAgICAgICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0QSA8PCAyICkpIC8vIFIvVyAtIFZSRUYgVHJhaW5pbmcgQ29udHJvbCBSZWdpc3RlciAwCiNkZWZpbmUgRERSMV9QVUJfVlRDUjEgICAgICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0QiA8PCAyICkpIC8vIFIvVyAtIFZSRUYgVHJhaW5pbmcgQ29udHJvbCBSZWdpc3RlciAxCgovLyNkZWZpbmUgRERSMF9QVUJfTVI2ICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2NiA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDYKLy8jZGVmaW5lIEREUjFfUFVCX01SNiAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwNjYgPDwgMiApICkgLy8gUi9XIC0gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciA2CiNkZWZpbmUgRERSMF9QVUJfRFgwR0NSNiAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWM2ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMUdDUjYgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNiAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I2ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDYgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNiAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg2ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RDUiAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwNDAgPDwgMiApICkgLy8gUi9XIC0gRFJBTSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfTVIwICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2MCA8PCAyICkgKSAvLyBSL1cgLSBNb2RlIFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfTVIxICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2MSA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfTVIyICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2MiA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDIKI2RlZmluZSBERFIwX1BVQl9NUjMgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDYzIDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgMwojZGVmaW5lIEREUjBfUFVCX01SNCAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwNjQgPDwgMiApICkgLy8gUi9XIC0gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciA0CiNkZWZpbmUgRERSMF9QVUJfTVI1ICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2NSA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDUKI2RlZmluZSBERFIwX1BVQl9NUjYgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDY2IDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgNgojZGVmaW5lIEREUjBfUFVCX01SNyAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwNjcgPDwgMiApICkgLy8gUi9XIC0gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciA3CiNkZWZpbmUgRERSMF9QVUJfTVIxMSAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2QiA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDExCiNkZWZpbmUgRERSMF9QVUJfUkFOS0lEUiAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDEzNyA8PCAyICkgKSAvLyBSL1cgLSBSYW5rIElEIFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfRFRDUjAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA4MCA8PCAyICkgKSAvLyBSL1cgLSBEYXRhIFRyYWluaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKI2RlZmluZSBERFIwX1BVQl9EVEVEUjAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDhDIDw8IDIgKSApIC8vIFIvVyAtIERhdGEgVHJhaW5pbmcgRXllIERhdGEgUmVnaXN0ZXIgMAojZGVmaW5lIEREUjBfUFVCX0RURURSMSAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwOEQgPDwgMiApICkgLy8gUi9XIC0gRGF0YSBUcmFpbmluZyBFeWUgRGF0YSBSZWdpc3RlciAxCiNkZWZpbmUgRERSMF9QVUJfRFRFRFIyICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA4RSA8PCAyICkgKSAvLyBSL1cgLSBEYXRhIFRyYWluaW5nIEV5ZSBEYXRhIFJlZ2lzdGVyIDIKI2RlZmluZSBERFIwX1BVQl9WVERSICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDhGIDw8IDIgKSApIC8vIFIvVyAtIFZyZWYgVHJhaW5pbmcgRGF0YSBSZWdpc3RlcgojZWxzZQoKI2RlZmluZSBERFIwX1BVQl9QSVIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MDE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1BHQ1IwCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDAyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9QR0NSMQkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgwMzw8MikpCgojZGVmaW5lIEREUjFfUFVCX1BJUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfUEdDUjAJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MDI8PDIpKQojZGVmaW5lIEREUjFfUFVCX1BHQ1IxCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDAzPDwyKSkKCiNkZWZpbmUgIEREUjBfUFVCX0RYMEJETFIwICAgKEREUjBfUFVCX1JFR19CQVNFKygweEE3PDwyKSkKI2RlZmluZSAgRERSMF9QVUJfRFgxQkRMUjAgICAgKEREUjBfUFVCX1JFR19CQVNFKygweEM3PDwyKSkKI2RlZmluZSAgRERSMF9QVUJfRFgyQkRMUjAgICAoRERSMF9QVUJfUkVHX0JBU0UrKDB4RTc8PDIpKQojZGVmaW5lICBERFIwX1BVQl9EWDNCRExSMCAgICAoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTA3PDwyKSkKCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjEJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBODw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBOTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjMJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBQTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjQJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBQjw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjUJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBQzw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjYJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBRDw8MikpCgojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFFPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjEJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhBRjw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIyCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4QjA8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYME1ETFIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhCMTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwR1RSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEIyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjAJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhDRTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIxCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4Q0Y8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEQwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDFNRExSCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RDE8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMUdUUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhEMjw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIwCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEVGPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhGMDw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgyTURMUgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEYxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjAJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMEU8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDEwRjw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIyCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTEwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDNNRExSCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTExPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDNHVFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTEyPDwyKSkKCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIwCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4QUU8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEFGPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhCMDw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgwTURMUgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEIxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDBHVFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4QjI8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMAkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweENFPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjEJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhDRjw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIyCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RDA8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMU1ETFIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhEMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgxR1RSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEQyPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjAJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhFRTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIxCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RUY8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEYwPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDJNRExSCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RjE8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMAkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDEwRTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIxCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MTBGPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgxMTA8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYM01ETFIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgxMTE8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYM0dUUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgxMTI8PDIpKQoKCiNkZWZpbmUgRERSMF9QVUJfQUNNRExSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDBFPDwyKSkKI2RlZmluZSBERFIwX1BVQl9BQ0xDRExSCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MEY8PDIpKQojZGVmaW5lIEREUjBfUFVCX0FDQkRMUjAJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMDw8MikpCiNkZWZpbmUgRERSMF9QVUJfQUNCRExSMwkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDEzPDwyKSkKI2RlZmluZSBERFIxX1BVQl9BQ01ETFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MEU8PDIpKQojZGVmaW5lIEREUjFfUFVCX0FDTENETFIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwRjw8MikpCiNkZWZpbmUgRERSMV9QVUJfQUNCRExSMAkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDEwPDwyKSkKCiNkZWZpbmUgRERSMF9QVUJfQUNNRExSMAlERFIwX1BVQl9BQ01ETFIKI2RlZmluZSBERFIxX1BVQl9BQ01ETFIwCUREUjFfUFVCX0FDTURMUgojZGVmaW5lIEREUjBfUFVCX0RYME1ETFIwIEREUjBfUFVCX0RYME1ETFIKI2RlZmluZSBERFIwX1BVQl9EWDFNRExSMCBERFIwX1BVQl9EWDFNRExSCiNkZWZpbmUgRERSMF9QVUJfRFgyTURMUjAgRERSMF9QVUJfRFgyTURMUgojZGVmaW5lIEREUjBfUFVCX0RYM01ETFIwIEREUjBfUFVCX0RYM01ETFIKI2RlZmluZSBERFIxX1BVQl9EWDBNRExSMCBERFIwX1BVQl9EWDBNRExSCiNkZWZpbmUgRERSMV9QVUJfRFgxTURMUjAgRERSMF9QVUJfRFgxTURMUgojZGVmaW5lIEREUjFfUFVCX0RYMk1ETFIwIEREUjBfUFVCX0RYMk1ETFIKI2RlZmluZSBERFIxX1BVQl9EWDNNRExSMCBERFIwX1BVQl9EWDNNRExSCiNkZWZpbmUgRERSMF9QVUJfRENSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDIyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9NUjAJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4Mjc8PDIpKQojZGVmaW5lIEREUjBfUFVCX01SMQkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgyODw8MikpCiNkZWZpbmUgRERSMF9QVUJfTVIyCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDI5PDwyKSkKI2RlZmluZSBERFIwX1BVQl9NUjMJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MkE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1JBTktJRFIgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwPDwgMiApICkgLy8gUi9XIC0gUmFuayBJRCBSZWdpc3RlcgojZGVmaW5lIEREUjBfUFVCX0RUQ1IwICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMDw8IDIgKSApIC8vIFIvVyAtIERhdGEgVHJhaW5pbmcgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgojZGVmaW5lIEREUjBfUFVCX0RURURSMCAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwIDw8IDIgKSApIC8vIFIvVyAtIERhdGEgVHJhaW5pbmcgRXllIERhdGEgUmVnaXN0ZXIgMAojZGVmaW5lIEREUjBfUFVCX0RURURSMSAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwPDwgMiApICkgLy8gUi9XIC0gRGF0YSBUcmFpbmluZyBFeWUgRGF0YSBSZWdpc3RlciAxCiNkZWZpbmUgRERSMF9QVUJfRFRFRFIyICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAgPDwgMiApICkgLy8gUi9XIC0gRGF0YSBUcmFpbmluZyBFeWUgRGF0YSBSZWdpc3RlciAyCiNkZWZpbmUgRERSMF9QVUJfVlREUiAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA8PCAyICkgKSAvLyBSL1cgLSBWcmVmIFRyYWluaW5nIERhdGEgUmVnaXN0ZXIKCiNpZm5kZWYgIFBfRERSMF9DTEtfQ1RSTAojZGVmaW5lIFBfRERSMF9DTEtfQ1RSTCAgIDB4YzgwMDA4MDAKI2VuZGlmCiNpZm5kZWYgIFBfRERSMV9DTEtfQ1RSTAojZGVmaW5lIFBfRERSMV9DTEtfQ1RSTCAgMHhjODAwMjgwMAojZW5kaWYKCiNkZWZpbmUgRERSMF9QVUJfSU9WQ1IwCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDhFPDwyKSkKI2RlZmluZSBERFIwX1BVQl9JT1ZDUjEJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OEY8PDIpKQojZW5kaWYKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQovL3Vuc2lnbmVkIGludCBkZXNbOF07Ci8qCgl1bnNpZ25lZCBpbnQgcGF0dGVybl8xWzRdWzhdPQoJewoJMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoKfTsKdW5zaWduZWQgaW50IHBhdHRlcm5fMls0XVs4XT17CjB4MDAwMWZlMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDJmZDAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDA0ZmIwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwOGY3MDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMTBlZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDIwZGYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDA0MGJmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwODA3ZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKCn07CnVuc2lnbmVkIGludCBwYXR0ZXJuXzNbNF1bOF09ewoJMHgwMDAxMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDIwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwNDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDA4MDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMTAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAyMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDQwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwODAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKfTsKdW5zaWduZWQgaW50IHBhdHRlcm5fNFs0XVs4XT17CgkweDUxYzhjMDQ5CSwKCTB4MmQ0MzU5MmMJLAoJMHgwNzc3YjUwYgksCgkweDljZDJlYmU1CSwKCTB4YzA0MTk5ZDUJLAoJMHhkYzk2OGRjMAksCgkweGI4YmE4YTMzCSwKCTB4MzVlNDMyN2YJLAoJMHg1MWM4YzA0OQksCgkweDJkNDM1OTJjCSwKCTB4MDc3N2I1MGIJLAoJMHg5Y2QyZWJlNQksCgkweGMwNDE5OWQ1CSwKCTB4ZGM5NjhkYzAJLAoJMHhiOGJhOGEzMwksCgkweDM1ZTQzMjdmCSwKCTB4NTFjOGMwNDkJLAoJMHgyZDQzNTkyYwksCgkweDA3NzdiNTBiCSwKCTB4OWNkMmViZTUJLAoJMHhjMDQxOTlkNQksCgkweGRjOTY4ZGMwCSwKCTB4YjhiYThhMzMJLAoJMHgzNWU0MzI3ZgksCgkweDUxYzhjMDQ5CSwKCTB4MmQ0MzU5MmMJLAoJMHgwNzc3YjUwYgksCgkweDljZDJlYmU1CSwKCTB4YzA0MTk5ZDUJLAoJMHhkYzk2OGRjMAksCgkweGI4YmE4YTMzCSwKCTB4MzVlNDMyN2YJLAp9Owp1bnNpZ25lZCBpbnQgcGF0dGVybl81WzRdWzhdPXsKCTB4YWVjOWMxNDkJLAoJMHhkMjQzNTkyYwksCgkweGY4NzdiNTBiCSwKCTB4NjNkMmViZTUJLAoJMHgzZjQzOWJkNQksCgkweDIzOTY4ZGMwCSwKCTB4NDdiYThhMzMJLAoJMHhjYWU0MzI3ZgksCgkweGFlY2NjNDQ5CSwKCTB4ZDI0MzU5MmMJLAoJMHhmODc3YjUwYgksCgkweDYzZDJlYmU1CSwKCTB4M2Y0OTkxZDUJLAoJMHgyMzk2OGRjMAksCgkweDQ3YmE4YTMzCSwKCTB4Y2FlNDMyN2YJLAoJMHhhZWQ4ZDA0OQksCgkweGQyNDM1OTJjCSwKCTB4Zjg3N2I1MGIJLAoJMHg2M2QyZWJlNQksCgkweDNmNjFiOWQ1CSwKCTB4MjM5NjhkYzAJLAoJMHg0N2JhOGEzMwksCgkweGNhZTQzMjdmCSwKCTB4YWU4ODgwNDkJLAoJMHhkMjQzNTkyYwksCgkweGY4NzdiNTBiCSwKCTB4NjNkMmViZTUJLAoJMHgzZmMxMTlkNQksCgkweDIzOTY4ZGMwCSwKCTB4NDdiYThhMzMJLAoJMHhjYWU0MzI3ZgksCn07CnVuc2lnbmVkIGludCBwYXR0ZXJuXzZbNF1bOF09ewoJMHhhZWM5YzE0OQksCgkweGQyNDNhNjJjCSwKCTB4Zjg3NzRhMGIJLAoJMHg2M2QyMTRlNQksCgkweDNmNDM2NmQ1CSwKCTB4MjM5NjcyYzAJLAoJMHg0N2JhNzUzMwksCgkweGNhZTRjZDdmCSwKCTB4YWVjYzNmNDkJLAoJMHhkMjQzYTYyYwksCgkweGY4Nzc0YTBiCSwKCTB4NjNkMjE0ZTUJLAoJMHgzZjQ5NjZkNQksCgkweDIzOTY3MmMwCSwKCTB4NDdiYTc1MzMJLAoJMHhjYWU0Y2Q3ZgksCgkweGFlZDgzZjQ5CSwKCTB4ZDI0M2E2MmMJLAoJMHhmODc3NGEwYgksCgkweDYzZDIxNGU1CSwKCTB4M2Y2MTY2ZDUJLAoJMHgyMzk2NzJjMAksCgkweDQ3YmE3NTMzCSwKCTB4Y2FlNGNkN2YJLAoJMHhhZTg4M2Y0OQksCgkweGQyNDNhNjJjCSwKCTB4Zjg3NzRhMGIJLAoJMHg2M2QyMTRlNQksCgkweDNmYzE2NmQ1CSwKCTB4MjM5NjcyYzAJLAoJMHg0N2JhNzUzMwksCgkweGNhZTRjZDdmCSwKCn07CnVuc2lnbmVkIGludCAgZGVzWzhdID17CgkweGFlYzgzZjQ5LAoJMHhkMjQzYTYyYywKCTB4Zjg3NzRhMGIsCgkweDYzZDIxNGU1LAoJMHgzZjQxNjZkNSwKCTB4MjM5NjcyYzAsCgkweDQ3YmE3NTMzLAoJMHhjYWU0Y2Q3ZiwKfTsKKi8KLyoKICAgdW5zaWduZWQgaW50ICBkZXNbOF0gOwogICBkZXNbMF0gPSAJMHhhZWM4M2Y0OTsKICAgZGVzWzFdID0gICAgICAweGQyNDNhNjJjOwogICBkZXNbMl0gPSAgICAgIDB4Zjg3NzRhMGI7CiAgIGRlc1szXSA9ICAgICAgIDB4NjNkMjE0ZTU7CiAgIGRlc1s0XSA9ICAgICAgMHgzZjQxNjZkNTsKICAgZGVzWzVdID0gICAgIDB4MjM5NjcyYzA7CiAgIGRlc1s2XSA9ICAgICAgMHg0N2JhNzUzMzsKICAgZGVzWzddID0gICAgICAweGNhZTRjZDdmOwogICBwYXR0ZXJuXzFbMF1bMF0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bMV0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bMl0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bM10gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bNF0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bNV0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bNl0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMF1bN10gPSAweGZmMDBmZjAwOwoKICAgcGF0dGVybl8xWzFdWzBdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzFdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzJdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzNdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzRdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzVdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzZdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzFdWzddID0gMHhmZjAwZmYwMDsKCiAgIHBhdHRlcm5fMVsyXVswXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVsxXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVsyXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVszXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVs0XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVs1XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVs2XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVsyXVs3XSA9IDB4ZmYwMGZmMDA7CgogICBwYXR0ZXJuXzFbM11bMF0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bMV0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bMl0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bM10gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bNF0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bNV0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bNl0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbM11bN10gPSAweGZmMDBmZjAwOwoKICAgcGF0dGVybl8yWzBdWzBdID0gMHgwMDAxZmUwMDsKICAgcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzBdWzJdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzBdWzNdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKICAgcGF0dGVybl8yWzBdWzVdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzBdWzZdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCiAgIHBhdHRlcm5fMlsxXVswXSA9IDB4MDAwNGZiMDA7CiAgIHBhdHRlcm5fMlsxXVsxXSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsxXVszXSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsxXVs0XSA9IDB4MDAwOGY3MDA7CiAgIHBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsxXVs2XSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsxXVs3XSA9IDB4MDAwMGZmMDA7CgogICBwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwogICBwYXR0ZXJuXzJbMl1bMV0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMl1bMl0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMl1bNF0gPSAweDAwMjBkZjAwOwogICBwYXR0ZXJuXzJbMl1bNV0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwpwYXR0ZXJuXzJbMl1bN10gPSAweDAwMDBmZjAwOwoKcGF0dGVybl8yWzNdWzBdID0gMHgwMDQwYmYwMDsKcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKcGF0dGVybl8yWzNdWzJdID0gMHgwMDAwZmYwMDsKcGF0dGVybl8yWzNdWzNdID0gMHgwMDAwZmYwMDsKcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKcGF0dGVybl8yWzNdWzVdID0gMHgwMDAwZmYwMDsKcGF0dGVybl8yWzNdWzZdID0gMHgwMDAwZmYwMDsKcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCnBhdHRlcm5fM1swXVswXSA9IDB4MDAwMTAwMDA7CnBhdHRlcm5fM1swXVsxXSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1swXVszXSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1swXVs0XSA9IDB4MDAwMjAwMDA7CnBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1swXVs2XSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1swXVs3XSA9IDB4MDAwMDAwMDA7CgpwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwpwYXR0ZXJuXzNbMV1bMV0gPSAweDAwMDAwMDAwOwpwYXR0ZXJuXzNbMV1bMl0gPSAweDAwMDAwMDAwOwpwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwpwYXR0ZXJuXzNbMV1bNF0gPSAweDAwMDgwMDAwOwoJcGF0dGVybl8zWzFdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1syXVswXSA9IDB4MDAxMDAwMDA7CglwYXR0ZXJuXzNbMl1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNF0gPSAweDAwMjAwMDAwOwoJcGF0dGVybl8zWzJdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1szXVswXSA9IDB4MDA0MDAwMDA7CglwYXR0ZXJuXzNbM11bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNF0gPSAweDAwODAwMDAwOwoJcGF0dGVybl8zWzNdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bN10gPSAweDAwMDAwMDAwOwoKcGF0dGVybl80WzBdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzBdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzBdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzFdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFsxXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMV1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzFdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFsxXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMV1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzFdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFsxXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzJdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFsyXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbMl1bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzJdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFsyXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbMl1bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzJdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFsyXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl80WzNdWzBdID0JMHg1MWM4YzA0OQk7CnBhdHRlcm5fNFszXVsxXSA9CTB4MmQ0MzU5MmMJOwpwYXR0ZXJuXzRbM11bMl0gPQkweDA3NzdiNTBiCTsKcGF0dGVybl80WzNdWzNdID0JMHg5Y2QyZWJlNQk7CnBhdHRlcm5fNFszXVs0XSA9CTB4YzA0MTk5ZDUJOwpwYXR0ZXJuXzRbM11bNV0gPQkweGRjOTY4ZGMwCTsKcGF0dGVybl80WzNdWzZdID0JMHhiOGJhOGEzMwk7CnBhdHRlcm5fNFszXVs3XSA9CTB4MzVlNDMyN2YJOwoKcGF0dGVybl81WzBdWzBdID0JMHhhZWM5YzE0OQk7CnBhdHRlcm5fNVswXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMF1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzBdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVswXVs0XSA9CTB4M2Y0MzliZDUJOwpwYXR0ZXJuXzVbMF1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzBdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVswXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbMV1bMF0gPQkweGFlY2NjNDQ5CTsKcGF0dGVybl81WzFdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVsxXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMV1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzFdWzRdID0JMHgzZjQ5OTFkNQk7CnBhdHRlcm5fNVsxXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMV1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzFdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVsyXVswXSA9CTB4YWVkOGQwNDkJOwpwYXR0ZXJuXzVbMl1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzJdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVsyXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMl1bNF0gPQkweDNmNjFiOWQ1CTsKcGF0dGVybl81WzJdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVsyXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMl1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzNdWzBdID0JMHhhZTg4ODA0OQk7CnBhdHRlcm5fNVszXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbM11bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzNdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVszXVs0XSA9CTB4M2ZjMTE5ZDUJOwpwYXR0ZXJuXzVbM11bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzNdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVszXVs3XSA9CTB4Y2FlNDMyN2YJOwoKcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlswXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CnBhdHRlcm5fNlswXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlsxXVswXSA9CTB4YWVjYzNmNDkJOwpwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlsxXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlsxXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CnBhdHRlcm5fNlsyXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlsyXVs0XSA9CTB4M2Y2MTY2ZDUJOwpwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlsyXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlszXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CnBhdHRlcm5fNlszXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CiovCiNlbmRpZgoKI2RlZmluZSBERFJfVEVTVF9TVEFSVF9BRERSICAweDEwODAwMDAvLyAgMHgxMDAwMDAwMCAvL0NPTkZJR19TWVNfTUVNVEVTVF9TVEFSVAojZGVmaW5lIEREUl9URVNUX1NJWkUgMHgyMDAwMDAwCi8vI2RlZmluZSBERFJfVEVTVF9TSVpFIDB4MjAwMAoKI2lmIChDT05GSUdfQ0hJUD49Q0hJUF9UWExYKQoKI2RlZmluZSBQX0VFX1RJTUVSX0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKCgweDNjNjIgIDw8IDIpICsgMHhmZmQwMDAwMCkKCi8vLyoKLy8jaWZuZGVmIFBfUElOX01VWF9SRUcxCi8vIFBpbiBNdXggICg5KQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNpZiAoQ09ORklHX0NISVA9PUNISVBfVFhMWCkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyYyA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyYyA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgyYyA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyZCA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyZCA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgyZCA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyZSA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyZSA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgyZSA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyZiA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgyZiA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgyZiA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMCA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMCA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzMCA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMSA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMSA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzMSA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMiA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMiA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzMiA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMyA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzMyA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzMyA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNCA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNCA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzNCA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNSA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNSA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzNSA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNiA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNiA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzNiA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNyA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzNyA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzNyA8PCAyKSkKI2RlZmluZSAgICAgUEVSSVBIU19QSU5fTVVYXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzOCA8PCAyKSkKI2RlZmluZSBTRUNfUEVSSVBIU19QSU5fTVVYXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY2MzQ0MDAgKyAoMHgzOCA8PCAyKSkKI2RlZmluZSAgIFBfUEVSSVBIU19QSU5fTVVYXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvbGF0aWxlIHVpbnQzMl90ICopKDB4ZmY2MzQ0MDAgKyAoMHgzOCA8PCAyKSkKI2VuZGlmIAojZGVmaW5lIFBfUElOX01VWF9SRUcxICAgICAgICBQX1BFUklQSFNfUElOX01VWF8xLy8gKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJkIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzIgICAgICAgUF9QRVJJUEhTX1BJTl9NVVhfMi8vICAoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmUgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHMwkJUF9QRVJJUEhTX1BJTl9NVVhfMy8vKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJmIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzcJCVBfUEVSSVBIU19QSU5fTVVYXzcvLygoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgzMyA8PCAyKSkpKQovLyNlbmRpZgoKLy8jaWZuZGVmIFBfUFdNX01JU0NfUkVHX0FCCi8vI2RlZmluZSBQX1BXTV9NSVNDX1JFR19BQgkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxNTYgPDwgMikpKSkKLy8jZGVmaW5lIFBfUFdNX1BXTV9CCQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxNTUgPDwgMikpKSkKLy8jZGVmaW5lIFBfUFdNX01JU0NfUkVHX0NECSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE5MiA8PCAyKSkpKQovLyNkZWZpbmUgUF9QV01fUFdNX0QJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE5MSA8PCAyKSkpKQovLyNlbmRpZgovLyovCi8vI2RlZmluZSAgIFBXTV9NSVNDX1JFR19BQiAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NmMwMikKLy8jZGVmaW5lIFBfUFdNX01JU0NfUkVHX0FCICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKCgweDZjMDIgIDw8IDIpICsgMHhmZmQwMDAwMCkKLy8jZGVmaW5lIFdBVENIRE9HX0NOVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4M2MzNCAgPDwgMikgKyAweGZmZDAwMDAwKQovLyNkZWZpbmUgV0FUQ0hET0dfQ05UTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgzYzM1ICA8PCAyKSArIDB4ZmZkMDAwMDApCi8vI2RlZmluZSBXQVRDSERPR19UQ05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDNjMzYgIDw8IDIpICsgMHhmZmQwMDAwMCkKLy8jZGVmaW5lIFdBVENIRE9HX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4M2MzNyAgPDwgMikgKyAweGZmZDAwMDAwKQojZWxzZQovLyNkZWZpbmUgZGRyX3VkZWxheShhKSAgZG97fXdoaWxlKChhPDw1KS0tKTsKI2RlZmluZSBQX0VFX1RJTUVSX0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKCgoMHgyNjYyICA8PCAyKSArIDB4YzExMDAwMDApKQovLyNkZWZpbmUgV0FUQ0hET0dfQ05UTCAgICAgICAgICAgICAgMHhjMTEwOThkMAovLyNkZWZpbmUgV0FUQ0hET0dfQ05UTDEgICAgICAgICAgICAweGMxMTA5OGQ0Ci8vI2RlZmluZSBXQVRDSERPR19UQ05UICAgICAgICAgICAgIDB4YzExMDk4ZDgKLy8jZGVmaW5lIFdBVENIRE9HX1JFU0VUICAgICAgICAgICAgMHhjMTEwOThkYwojaWZuZGVmIFBfV0FUQ0hET0dfQ05UTAojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCiNkZWZpbmUgUF9XQVRDSERPR19DTlRMICAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhjMTEwOThkMAojZGVmaW5lIFBfV0FUQ0hET0dfQ05UTDEgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHhjMTEwOThkNAojZGVmaW5lIFBfV0FUQ0hET0dfVENOVCAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhjMTEwOThkOAojZGVmaW5lIFBfV0FUQ0hET0dfUkVTRVQgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHhjMTEwOThkYwojZWxzZQojZGVmaW5lIFBfV0FUQ0hET0dfQ05UTCAgICAgICAgICAgICAgKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSgweGMxMTAwMDAwKygweDI2NDA8PDIpKQovLyNkZWZpbmUgUF9XQVRDSERPR19DTlRMMSAgICAgICAgICAgKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweGMxMTA5OGQ0Ci8vI2RlZmluZSBQX1dBVENIRE9HX1RDTlQgICAgICAgICAgICAgKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKTB4YzExMDk4ZDgKI2RlZmluZSBQX1dBVENIRE9HX1JFU0VUICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKDB4YzExMDAwMDArKDB4MjY0MTw8MikpCiNlbmRpZgojZW5kaWYKCgojaWZuZGVmIFBfUElOX01VWF9SRUcxCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzEgICAgICAgICAoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmQgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHMiAgICAgICAgICgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgyZSA8PCAyKSkpKQojZGVmaW5lIFBfUElOX01VWF9SRUczCQkoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmYgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHNwkJKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDMzIDw8IDIpKSkpCiNlbmRpZgoKI2lmbmRlZiBQX1BXTV9NSVNDX1JFR19BQgojZGVmaW5lIFBfUFdNX01JU0NfUkVHX0FCCSgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTU2IDw8IDIpKSkpCiNkZWZpbmUgUF9QV01fUFdNX0IJCSgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTU1IDw8IDIpKSkpCiNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQ0QJKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxOTIgPDwgMikpKSkKI2RlZmluZSBQX1BXTV9QV01fRAkJKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxOTEgPDwgMikpKSkKI2VuZGlmCgojaWZuZGVmIFBfRUVfVElNRVJfRQojZGVmaW5lIFBfRUVfVElNRVJfRQkJKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDI2NjIgPDwgMikpKSkKI2VuZGlmCgojZW5kaWYKCiNkZWZpbmUgZ2V0X3VzX3RpbWUoKSAgICAoKlBfRUVfVElNRVJfRSkvLyAocmVhZGwoUF9JU0FfVElNRVJFKSkKCi8vICNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgIDB4YzExMDk5ODgKLy8gICAjZGVmaW5lIGdldF91c190aW1lKCkgICAgKHJlYWRsKFBfSVNBX1RJTUVSRSkpCgovKgojZGVmaW5lIFBfUElOX01VWF9SRUczCQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhmZjYzNDQwMCArICgweDJmIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzQJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGZmNjM0NDAwICsgKDB4MzAgPDwgMikpKSkKCiNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQUIJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZmY4MDcwMDAgKyAoMHgwMiA8PCAyKSkpKQojZGVmaW5lIFBfUFdNX1BXTV9BCQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoKDB4NmMwMCAgPDwgMikgKyAweGZmZDAwMDAwKSkpCgojZGVmaW5lIEFPX1BJTl9NVVhfUkVHCQkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhmZjgwMDAwMCArICgweDA1IDw8IDIpKSkpCiovCgojZGVmaW5lIGR3Y19kZHJwaHlfYXBiX3dyKGFkZHIsIGRhdCkgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsweGZlMDAwMDAwKSk9KCh1aW50MTZfdClkYXQpCiNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfcmQoYWRkcikgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsweGZlMDAwMDAwKSkKI2RlZmluZSBBQ1hfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAoKdm9pZCBkZHJfdWRlbGF5KHVuc2lnbmVkIGludCB1cykKewovLyNpZm5kZWYgQ09ORklHX1BYUF9FTVVMQVRPUgoJdW5zaWduZWQgaW50IHQwID0gKCooKFBfRUVfVElNRVJfRSkpKTsKCgl3aGlsZSAoKCooKFBfRUVfVElNRVJfRSkpKSAtIHQwIDw9IHVzKQoJCTsKLy8jZW5kaWYKfQoKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kgIDEgCiNkZWZpbmUgRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9VQk9PVF9FTlYgICAgMiAKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0lETUUgIDMgCiNkZWZpbmUgRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZICA0IAoKI2RlZmluZSAJRERSX1BBUkFNRVRFUl9SRUFECQkxCiNkZWZpbmUgCUREUl9QQVJBTUVURVJfV1JJVEUJCTIKI2RlZmluZSAJRERSX1BBUkFNRVRFUl9MRUZUCQkxCiNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCnR5cGVkZWYgc3RydWN0IGRkcl90ZXN0X3N0cnVjdCB7Cgl1bnNpZ25lZAlpbnQJZGRyX2RhdGFfc291cmNlCTsgIAoJdW5zaWduZWQJaW50CWRkcl9kYXRhX3Rlc3Rfc2l6ZQk7ICAKCXVuc2lnbmVkCWludAlkZHJfYWRkcmVzc190ZXN0X3NpemUJOyAgCgl1bnNpZ25lZAlpbnQJZGRyX3Rlc3Rfd2F0Y2hkb2dfdGltZXNfcwk7ICAKCXVuc2lnbmVkCWludAlkZHJfdGVzdF9sYW5lX2Rpc2FibGUJOyAgCgoJdW5zaWduZWQJaW50CWRkcl90ZXN0X3dpbmRvd19mbGFnWzhdCTsgIAoJdW5zaWduZWQJaW50CWRkcl90ZXN0X3dpbmRvd19kYXRhWzEwMF0JOyAgCn0gIGRkcl90ZXN0X3N0cnVjdF90OwkJCQpkZHJfdGVzdF9zdHJ1Y3RfdCAqZ19kZHJfdGVzdF9zdHJ1Y3Q7CQkJCgp1bnNpZ25lZCBpbnQgIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKHVuc2lnbmVkIGludCBzb3VyY2VfaW5kZXgsIHVuc2lnbmVkIGludCBwYXJhbWV0ZXJfaW5kZXggLHVuc2lnbmVkIGludCBwYXJhbWV0ZXJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCglpZihzb3VyY2VfaW5kZXggPT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9ETUNfU1RJQ0tZKQoJewoJCXN0aWNreV9yZWdfYmFzZV9hZGQgPSAoRERSMF9QVUJfUkVHX0JBU0UmMHhmZmZmMDAwMCkrKChETUNfU1RJQ0tZXzApJjB4ZmZmZik7CgoJCWlmKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JFQUQpCgkJCXBhcmFtZXRlcl92YWx1ZSA9IHJkX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSkpOwoJfQoKCWlmKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOVikKCXsKCQljaGFyICpwcmVfZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW0iOwoJCWNoYXIgKmVudl9uYW1lID0gImRkcl90ZXN0X2RhdGFfbnVtXzAwMDAiOwoJCWNoYXIgKnN0cl9idWYgPSBOVUxMOwoJCWNoYXIgKnRlbXBfcyA9IE5VTEw7CgkJY2hhciAqZW5kcCA9IE5VTEw7CgkJY2hhciBidWZbMTAyNF07CgkJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CgkJc3ByaW50ZihlbnZfbmFtZSwiJXNfJTA0ZCIscHJlX2Vudl9uYW1lLHBhcmFtZXRlcl9pbmRleCk7CgkJc3ByaW50ZihidWYsICIweCUwOHgiLCBwYXJhbWV0ZXJfdmFsdWUpOwoKCQlpZihyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQl7IAoJCQlzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQl9CgkJaWYocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQl7IAoJCQl0ZW1wX3MgPSBnZXRlbnYoZW52X25hbWUpOwoJCQlpZih0ZW1wX3MpCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQllbHNlCgkJCQlwYXJhbWV0ZXJfdmFsdWUgPSAwOwoJCX0KCX0KCglpZihzb3VyY2VfaW5kZXggPT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZKQoJewoJCXN0aWNreV9yZWdfYmFzZV9hZGQ9KFBSRUdfU1RJQ0tZX1JFRzApOwoKCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfV1JJVEUpCgkJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSksIHBhcmFtZXRlcl92YWx1ZSk7CgkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1JFQUQpCgkJCXBhcmFtZXRlcl92YWx1ZT1yZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCXJldHVybiBwYXJhbWV0ZXJfdmFsdWU7Cn0KCgp1bnNpZ25lZCBpbnQgIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyh1bnNpZ25lZCBpbnQgc291cmNlX2luZGV4LCB1bnNpZ25lZCBpbnQgcGFyYW1ldGVyX2luZGV4ICx1bnNpZ25lZCBpbnQgcGFyYW1ldGVyX3ZhbHVlLHVuc2lnbmVkIGludCByZWFkX3dyaXRlX2ZsYWcgKQp7CgoJaWYgKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1kpCgl7CgkJc3RpY2t5X3JlZ19iYXNlX2FkZCA9IFBSRUdfU1RJQ0tZX1JFRzA7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSwgcGFyYW1ldGVyX3ZhbHVlKTsKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQkJcGFyYW1ldGVyX3ZhbHVlID0gcmRfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSk7Cgl9CgoJaWYgKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgl7CgkJc3RpY2t5X3JlZ19iYXNlX2FkZCA9IChERFIwX1BVQl9SRUdfQkFTRSYweGZmZmYwMDAwKSsoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCQlwYXJhbWV0ZXJfdmFsdWUgPSByZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WKQoJewoJCWNoYXIgKnByZV9lbnZfbmFtZSA9ICJkZHJfdGVzdF9kYXRhX251bSI7CgkJY2hhciAqZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW1fMDAwMCI7CgkJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgkJY2hhciAqdGVtcF9zID0gTlVMTDsKCQljaGFyICplbmRwID0gTlVMTDsKCQljaGFyIGJ1ZlsxMDI0XTsKCQlzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgkJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCQlzcHJpbnRmKGVudl9uYW1lLCIlc18lMDRkIixwcmVfZW52X25hbWUscGFyYW1ldGVyX2luZGV4KTsKCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIHBhcmFtZXRlcl92YWx1ZSk7CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgkJCXNldGVudihlbnZfbmFtZSwgYnVmKTsKCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCX0KCQlpZihyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCXsgCgkJCXRlbXBfcyA9IGdldGVudihlbnZfbmFtZSk7CgkJCWlmKHRlbXBfcykKCQkJCXBhcmFtZXRlcl92YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCWVsc2UKCQkJCXBhcmFtZXRlcl92YWx1ZSA9IDA7CgkJfQoJfQoKCXJldHVybiBwYXJhbWV0ZXJfdmFsdWU7Cn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfaW5pdCh1aW50MzJfdCBtc2VjKQp7CgoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCS8vCXdyaXRlbCggKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKQoJKlBfV0FUQ0hET0dfQ05UTCA9ICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpOwoKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CgkqUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVCA9IDA7CgkvLypQX1dBVENIRE9HX1JFU0VUID0gMDsKCgkvLyBlbmFibGUKCSpQX1dBVENIRE9HX0NOVEwgPSAoKlBfV0FUQ0hET0dfQ05UTCl8KDE8PDE4KTsKCS8vd3JpdGVsKChyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKXwoMTw8MTgpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkvLypQX1dBVENIRE9HX0NOVEwgfD0gKDE8PDE4KTsKI2Vsc2UKCSpQX1dBVENIRE9HX0NOVEwgPSAoMDw8MjQpfChtc2VjKjgtMSk7CgkvLypQX1dBVENIRE9HX1RDTlQ9bXNlYzsKI2VuZGlmCn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHVpbnQzMl90IHNlYykKewoKCS8vIHNyYzogMjRNSHoKCS8vIGRpdjogMjQwMDAgZm9yIDFtcwoJLy8gcmVzZXQgYW8tMjIgYW5kIGVlLTIxCgkvLwl3cml0ZWwoICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCSpQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAwLTEpOyAvLzEwbXMKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CglpZihzZWMqMTAwPjB4ZmZmZikKCQkqUF9XQVRDSERPR19UQ05UPTB4ZmZmZjsKCWVsc2UKCQkqUF9XQVRDSERPR19UQ05UPXNlYyoxMDA7ICAvL21heCA2NTVzCgkvL3dyaXRlbCgwLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfUkVTRVQpOwoJKlBfV0FUQ0hET0dfUkVTRVQ9MDsKCS8vKlBfV0FUQ0hET0dfUkVTRVQgPSAwOwoKCS8vIGVuYWJsZQoJKlBfV0FUQ0hET0dfQ05UTD0oKlBfV0FUQ0hET0dfQ05UTCl8KDE8PDE4KTsKCS8vd3JpdGVsKChyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKXwoMTw8MTgpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkvLypQX1dBVENIRE9HX0NOVEwgfD0gKDE8PDE4KTsKI2Vsc2UKCS8vKlBfV0FUQ0hET0dfQ05UTD0oMTw8MjQpfCgxPDwxOSl8KHNlYyo4MDAwLTEpOwoJKlBfV0FUQ0hET0dfQ05UTD0oMTw8MjQpfCgxPDwxOSl8KDB4ZmZmZik7CglwcmludGYoIlxubThiYWJ5X3dhdGNoZG9nIG1heCBvbmx5IDVzLHBsZWFzZSB0YWtlIGNhcmUgdGVzdCBzaXplIG5vdCB0b28gbG9uZyBmb3IgbThiYWJ5XG4iKTsKI2VuZGlmCglwcmludGYoIlxuUF9XQVRDSERPR19FTkFCTEVcbiIpOwp9Cgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUodm9pZCApCnsKCgkvLyBzcmM6IDI0TUh6CgkvLyBkaXY6IDI0MDAwIGZvciAxbXMKCS8vIHJlc2V0IGFvLTIyIGFuZCBlZS0yMQoJLy8Jd3JpdGVsKCAoMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMC0xKSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCgkqUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwMC0xKTsgLy8xMG1zCgkvLyBzZXQgdGltZW91dAoJLy8qUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vCXdyaXRlbChtc2VjLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7IC8vYml0MC0xNQoJLy8qUF9XQVRDSERPR19UQ05UPXNlYyoxMDA7CgkvL3dyaXRlbCgwLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfUkVTRVQpOwoJKlBfV0FUQ0hET0dfUkVTRVQ9MDsKCS8vKlBfV0FUQ0hET0dfUkVTRVQgPSAwOwoKCS8vIGVuYWJsZQoJKlBfV0FUQ0hET0dfQ05UTD0oKlBfV0FUQ0hET0dfQ05UTCkmKH4oMTw8MTgpKTsKCS8vd3JpdGVsKChyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKXwoMTw8MTgpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkvLypQX1dBVENIRE9HX0NOVEwgfD0gKDE8PDE4KTsKI2Vsc2UKCSpQX1dBVENIRE9HX0NOVEw9KDA8PDI0KXwoMDw8MTkpfCgyNDAwMC0xKTsKI2VuZGlmCglwcmludGYoIlxuUF9XQVRDSERPR19ESVNBQkxFXG4iKTsKfQoKCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIodm9pZCApCnsKCgkvLyBzcmM6IDI0TUh6CgkvLyBkaXY6IDI0MDAwIGZvciAxbXMKCS8vIHJlc2V0IGFvLTIyIGFuZCBlZS0yMQoJLy8Jd3JpdGVsKCAoMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMC0xKSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJLy8qUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwMC0xKTsgLy8xMG1zCgkvLyBzZXQgdGltZW91dAoJLy8qUF9XQVRDSERPR19UQ05UID0gbXNlYzsKCS8vCXdyaXRlbChtc2VjLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7IC8vYml0MC0xNQoJLy8qUF9XQVRDSERPR19UQ05UPXNlYyoxMDA7CgkvL3dyaXRlbCgwLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfUkVTRVQpOwoJKlBfV0FUQ0hET0dfUkVTRVQ9MDsKCS8vKlBfV0FUQ0hET0dfUkVTRVQgPSAwOwoKCS8vIGVuYWJsZQoJLy8qUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKSYofigxPDwxOCkpOwoJLy93cml0ZWwoKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpfCgxPDwxOCksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCS8vKlBfV0FUQ0hET0dfQ05UTCB8PSAoMTw8MTgpOwoJLy9wcmludGYoIlxuUF9XQVRDSERPR19DTEVBUixyZWc9MHglOHhcbiIsKFBfV0FUQ0hET0dfUkVTRVQpKTsKfQoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0odm9pZCkKewoJLy8jZGVmaW5lIFBfV0FUQ0hET0dfQ05UTCAgICAgICAgICAgICAgMHhjMTEwOThkMAoJLy8jZGVmaW5lIFBfV0FUQ0hET0dfQ05UTDEgICAgICAgICAgICAweGMxMTA5OGQ0CgkvLyNkZWZpbmUgUF9XQVRDSERPR19UQ05UICAgICAgICAgICAgIDB4YzExMDk4ZDgKCS8vI2RlZmluZSBQX1dBVENIRE9HX1JFU0VUICAgICAgICAgICAgMHhjMTEwOThkYwojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCglpbnQgaTsKCgl3aGlsZSAoMSkgewoJCS8qCgkJICAgd3JpdGVsKAkweDMJfCAoMSA8PCAyMSkgLy8gc3lzIHJlc2V0IGVuICBhbyBlZSAzCgkJICAgfCAoMSA8PCAyMykgLy8gaW50ZXJydXB0IGVuCgkJICAgfCAoMSA8PCAyNCkgLy8gY2xrIGVuCgkJICAgfCAoMSA8PCAyNSkgLy8gY2xrIGRpdiBlbgoJCSAgIHwgKDEgPDwgMjYpIC8vIHN5cyByZXNldCBub3cgIGFvIGVlIDMKCQkgICAsICh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkJICAgKi8KCQkqUF9XQVRDSERPR19DTlRMPQoJCQkweDMJfCAoMSA8PCAyMSkgLy8gc3lzIHJlc2V0IGVuICBhbyBlZSAzCgkJCXwgKDEgPDwgMjMpIC8vIGludGVycnVwdCBlbgoJCQl8ICgxIDw8IDI0KSAvLyBjbGsgZW4KCQkJfCAoMSA8PCAyNSkgLy8gY2xrIGRpdiBlbgoJCQl8ICgxIDw8IDI2KTsgLy8gc3lzIHJlc2V0IG5vdyAgYW8gZWUgMzsKCQkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NOVEwgcmVnX2FkZF8leDA4PT0leDA4IiwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwscmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSk7CgkJLy9wcmludGYoIlxuUF9XQVRDSERPR19DTlRMPT0leDA4IixyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKTsKCQkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NOVEw9PSV4MDgiLHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpOwoJCXByaW50ZigiXG5QX1dBVENIRE9HX0NOVExSRUdfQUREICV4MDg9PSV4MDgiLCh1bnNpZ25lZCBpbnQpKHVuc2lnbmVkIGxvbmcpUF9XQVRDSERPR19DTlRMLAoJCQkJKlBfV0FUQ0hET0dfQ05UTCk7CgkJLy93cml0ZWwoMCwgKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkJKlBfV0FUQ0hET0dfUkVTRVQ9MDsKCgkJLy8Jd3JpdGVsKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkgfCAoMTw8MTgpLCAvLyB3YXRjaGRvZyBlbgoJCS8vKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCQkqUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKXwoMTw8MTgpOwoJCWZvciAoaT0wOyBpPDEwMDsgaSsrKQoJCQkqUF9XQVRDSERPR19DTlRMOwoJCS8vcmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsvKkRlY2VpdmUgZ2NjIGZvciB3YWl0aW5nIHNvbWUgY3ljbGVzICovCgl9CgojZWxzZQoJLy9XUklURV9DQlVTX1JFRyhXQVRDSERPR19UQywgMHhmMDgwMDAwIHwgMjAwMCk7CgkqUF9XQVRDSERPR19DTlRMPSgweGYwODAwMDAgfCAyMDAwKTsKI2VuZGlmCgl3aGlsZSgxKTsKfQoKCi8vanVzdCB0dW5lIGZvciBsY2RscgoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKI2Vsc2UKaW50IGRvX2Rkcl9maW5lX3R1bmVfbGNkbHJfZW52MShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBkZHJfZmluZV90dW5lX2xjZGxyX2VudiAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGkgPSAwOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yKGkgPSAwOyBpPGFyZ2M7IGkrKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoKCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoKI2RlZmluZSBXUl9SRF9BREpfVVNFX0VOViAgMQojZGVmaW5lIFdSX1JEX0FESl9VU0VfVUFSVF9JTlBVVCAyCgl1bnNpZ25lZCBpbnQgICB3cl9yZF9hZGpfaW5wdXRfc3JjPTE7CglpbnQgd3JfYWRqX3BlclsxMl09ewoJCTEwMAksCgkJMTAwMCwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJfTsKCWludCByZF9hZGpfcGVyWzEyXT17CgkJMTAwCSwKCQkxMDAJLAoJCTgwCSwKCQk4MAksCgkJODAJLAoJCTgwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCX07CglpZihhcmdjID09IDEpCgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCWlmKGFyZ2MgPj0gMikKCXsKCQl3cl9yZF9hZGpfaW5wdXRfc3JjID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoKCQl1bnNpZ25lZCBpbnQgaT0wOyAJCgkJaWYod3JfcmRfYWRqX2lucHV0X3NyYz09V1JfUkRfQURKX1VTRV9VQVJUX0lOUFVUKQoJCXsKCQkJcHJpbnRmKCJcbnR1bmUgZGRyIGxjZGxyIHVzZSB1YXJ0IGlucHV0XG4iKTsKCQkJaWYgKGFyZ2M+MjQrMikKCQkJCWFyZ2M9MjQrMjsKCgkJCWZvcihpID0gMjtpPGFyZ2M7aSsrKQoJCQl7CgkJCQlpZihpPCgyKzEyKSkKCQkJCQl3cl9hZGpfcGVyW2ktMl09c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2ldLCAmZW5kcCwgMTApOwoJCQkJZWxzZQoJCQkJCXJkX2Fkal9wZXJbaS0xNF09c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2ldLCAmZW5kcCwgMTApOwoJCQl9CgkJfQoKCQkvLyB1bnNpZ25lZCBpbnQgPSAwLCBtYXggPSAweGZmLCBtaW4gPSAweDAwOwoJCWlmKHdyX3JkX2Fkal9pbnB1dF9zcmM9PVdSX1JEX0FESl9VU0VfRU5WKQoJCXsKCQkJcHJpbnRmKCJcbnR1bmUgZGRyIGxjZGxyIHVzZSB1Ym9vdCBlbnZcbiIpOwoJCQkvL2NoYXIgc3RyWzI0XTsKCQkJY29uc3QgY2hhciAqczsKCgkJCS8vIGNoYXIgKnZhcm5hbWU7CgkJCWludCB2YWx1ZT0wOwoKCQkJLy8qdmFybmFtZT0iZW52X2RkcnRlc3QiOwoJCQlzID0gZ2V0ZW52KCJlbnZfd3JfbGNkbHJfcHIiKTsKCQkJaWYgKHMpCgkJCXsvL2k9MDsKCQkJCS8vd2hpbGUoc190ZW1wKQoJCQkJewoJCQkJCXByaW50ZigiJXMiLHMpOwoJCQkJCS8vc3NjYW5mKHMsImQlLCIsd3JfYWRqX3Blcik7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZCUiLHMpOwoJCQkJCS8vZ2V0YwoJCQkJfQoJCQkJdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHMsICZlbmRwLCAxNik7CgkJCQlwcmludGYoIiVkIix2YWx1ZSk7CgkJCX0KCQkJcyA9IGdldGVudigiZW52X3JkX2xjZGxyX3ByIik7CgoJCQlpZiAocykKCQkJey8vaT0wOwoJCQkJLy93aGlsZShzX3RlbXApCgkJCQl7CgkJCQkJcHJpbnRmKCIlcyIscyk7CgkJCQkJLy9zc2NhbmYocywiZCUsIixyZF9hZGpfcGVyKTsKCgkJCQl9CgkJCQkvL3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2RkcihzLCAmZW5kcCwgMTYpOwoJCQl9CgoJCQkvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwoJCQkvLyAgc2V0ZW52KCJlbnZfZGRydGVzdCIsIHN0cik7CgkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCQkJaWYgKGFyZ2M+MjQrMikKCQkJCWFyZ2M9MjQrMjsKCQkJZm9yKGkgPSAyO2k8YXJnYztpKyspCgkJCXsKCQkJCWlmKGk8KDIrMTIpKQoJCQkJCXdyX2Fkal9wZXJbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxNik7CgkJCQllbHNlCgkJCQkJcmRfYWRqX3BlcltpLTE0XT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxNik7CgkJCX0KCQl9CgkJcHJpbnRmKCIgaW50IHdyX2Fkal9wZXJbMTJdPXtcbiIpOwoJCWZvcihpID0gMDtpPDEyO2krKykKCQkJcHJpbnRmKCIlMDRkICxcbiIsd3JfYWRqX3BlcltpXSk7CgkJcHJpbnRmKCJ9O1xuIik7CgkJcHJpbnRmKCIgaW50IHJkX2Fkal9wZXJbMTJdPXtcbiIpOwoJCWZvcihpID0gMDtpPDEyO2krKykKCQkJcHJpbnRmKCIlMDRkICxcbiIscmRfYWRqX3BlcltpXSk7CgkJcHJpbnRmKCJ9O1xuIik7CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQl3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpfCgxPDwyOSkpOwoJCXdyX3JlZyhERFIwX1BVQl9QR0NSNiwgKHJkX3JlZyhERFIwX1BVQl9QR0NSNikpfCgxPDwwKSk7CgkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQl3cl9yZWcoRERSMV9QVUJfUEdDUjYsIChyZF9yZWcoRERSMV9QVUJfUEdDUjYpKXwoMTw8MCkpOwojZWxzZQoJCXdyX3JlZyhERFIwX1BVQl9QSVIsIChyZF9yZWcoRERSMF9QVUJfUElSKSl8KDE8PDI5KSk7CgkJd3JfcmVnKEREUjBfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjBfUFVCX1BHQ1IxKSl8KDE8PDI2KSk7CgkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQl3cl9yZWcoRERSMV9QVUJfUEdDUjEsIChyZF9yZWcoRERSMV9QVUJfUEdDUjEpKXwoMTw8MjYpKTsKI2VuZGlmCgoJCWludCBsY2Rscl93PTAsbGNkbHJfcj0wOwoJCXVuc2lnbmVkIHRlbXBfcmVnPTA7CgkJaW50IHRlbXBfY291bnQ9MDsKCQlmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDI7dGVtcF9jb3VudCsrKQoJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfQUNMQ0RMUisodGVtcF9jb3VudDw8MikpOwoJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZBQ0xDRExSX01BWCk7CgkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCWlmKHRlbXBfY291bnQ9PTEpCgkJCQlsY2Rscl93PWxjZGxyX3cmQUNCRExSX01BWDsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKChsY2Rscl93KSZBQ0xDRExSX01BWCkpOwoJCX0KI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJZm9yKCB0ZW1wX2NvdW50PTI7dGVtcF9jb3VudDw2O3RlbXBfY291bnQrKykKCQl7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjBfUFVCX0RYMExDRExSMSsoRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkqKHRlbXBfY291bnQtMikpOwoJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CgkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCWxjZGxyX3I9KGludCkoKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZytERFIwX1BVQl9EWDBMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIxKSkpKSZEUUxDRExSX01BWCk7CgkJCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CgkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCWxjZGxyX3I9KGxjZGxyX3IqKHJkX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLChsY2Rscl93KSk7CgkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZytERFIwX1BVQl9EWDBMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIxKSksKGxjZGxyX3IpKTsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjEpKSwobGNkbHJfcikpOwoJCX0KI2Vsc2UKCQlmb3IgKCB0ZW1wX2NvdW50PTI7dGVtcF9jb3VudDw2O3RlbXBfY291bnQrKykgewoJCQl0ZW1wX3JlZz0odW5zaWduZWQpKEREUjBfUFVCX0RYMExDRExSMSsoRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkqKHRlbXBfY291bnQtMikpOwoJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CgkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCWxjZGxyX3I9KGludCkoKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKT4+OCkmRFFMQ0RMUl9NQVgpOwoJCQlsY2Rscl9yPWxjZGxyX3I/bGNkbHJfcjoxOwoJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQlsY2Rscl9yPShsY2Rscl9yKihyZF9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKChsY2Rscl9yPDwxNil8KGxjZGxyX3I8PDgpfChsY2Rscl93KSkpKTsKCQl9CiNlbmRpZgoJCWZvciggdGVtcF9jb3VudD02O3RlbXBfY291bnQ8ODt0ZW1wX2NvdW50KyspIHsKCQkJdGVtcF9yZWc9KHVuc2lnbmVkKShERFIxX1BVQl9BQ0xDRExSKygodGVtcF9jb3VudC02KTw8MikpOwoKCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmQUNMQ0RMUl9NQVgpOwoJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQlpZih0ZW1wX2NvdW50PT03KQoJCQkJbGNkbHJfdz1sY2Rscl93JkFDQkRMUl9NQVg7CgkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgobGNkbHJfdykmQUNMQ0RMUl9NQVgpKTsKCQl9CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJCWZvciggdGVtcF9jb3VudD04O3RlbXBfY291bnQ8MTI7dGVtcF9jb3VudCsrKSB7CgkJCXRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfRFgwTENETFIxKyhERFIxX1BVQl9EWDFMQ0RMUjEtRERSMV9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkRRTENETFJfTUFYKTsKCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnK0REUjFfUFVCX0RYMExDRExSMy1ERFIxX1BVQl9EWDBMQ0RMUjEpKSkpJkRRTENETFJfTUFYKTsKCQkJbGNkbHJfcj1sY2Rscl9yP2xjZGxyX3I6MTsKCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKGxjZGxyX3cpKTsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnK0REUjFfUFVCX0RYMExDRExSMy1ERFIxX1BVQl9EWDBMQ0RMUjEpKSwobGNkbHJfcikpOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFI0LUREUjFfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJfQojZWxzZQoJCWZvciggdGVtcF9jb3VudD04O3RlbXBfY291bnQ8MTI7dGVtcF9jb3VudCsrKSB7CgkJCXRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfRFgwTENETFIxKyhERFIxX1BVQl9EWDFMQ0RMUjEtRERSMV9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC04KSk7CgkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJjB4ZmYpOwoJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQlsY2Rscl9yPShpbnQpKCgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSk+PjgpJjB4ZmYpOwoJCQlsY2Rscl9yPWxjZGxyX3I/bGNkbHJfcjoxOwoJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQlsY2Rscl9yPShsY2Rscl9yKihyZF9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKChsY2Rscl9yPDwxNil8KGxjZGxyX3I8PDgpfChsY2Rscl93KSkpKTsKCQl9CiNlbmRpZgkKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJCXdyX3JlZyhERFIwX1BVQl9QR0NSNiwgKHJkX3JlZyhERFIwX1BVQl9QR0NSNikpJih+KDE8PDApKSk7CgkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKCgkJd3JfcmVnKEREUjFfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjFfUFVCX1BHQ1I2KSkmKH4oMTw8MCkpKTsKCQl3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpJih+KDE8PDI5KSkpOwojZWxzZQoJCXdyX3JlZyhERFIwX1BVQl9QR0NSMSwgKHJkX3JlZyhERFIwX1BVQl9QR0NSMSkpJih+KDE8PDI2KSkpOwoJCXdyX3JlZyhERFIwX1BVQl9QSVIsIChyZF9yZWcoRERSMF9QVUJfUElSKSkmKH4oMTw8MjkpKSk7CgoJCXdyX3JlZyhERFIxX1BVQl9QR0NSMSwgKHJkX3JlZyhERFIxX1BVQl9QR0NSMSkpJih+KDE8PDI2KSkpOwoJCXdyX3JlZyhERFIxX1BVQl9QSVIsIChyZF9yZWcoRERSMV9QVUJfUElSKSkmKH4oMTw8MjkpKSk7CiNlbmRpZgoJCXByaW50ZigiXG5lbmQgYWRqdXN0IGxjZGxyXG4iKTsKCgkJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQlDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoJfQoKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglkZHJfdGVzdF90dW5lX2Rxc19lbnYsCTMwLAkxLAlkb19kZHJfZmluZV90dW5lX2xjZGxyX2VudjEsCgkiZG9fZGRyX2ZpbmVfdHVuZV9sY2Rscl9lbnYgYXJnMSBhcmcyIGFyZzMuLi4iLAoJImRvX2Rkcl9maW5lX3R1bmVfbGNkbHJfZW52IGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIgCik7CgojZW5kaWYKLy8qLwpzdGF0aWMgdm9pZCBkZHJfd3JpdGUodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCWZvciAoaj0wO2o8MzI7aisrKQoJCXsKCgkJCWlmIChtX2xlbiA+PSAxMjgpCgkJCQluID0gMzI7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDMwOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDIyOgoJCQkJCQkqKHAraSkgPSAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAzMToKCQkJCQkJKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjQ6CgkJCQkJCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyNzoKCQkJCQljYXNlIDI5OgoJCQkJCQkqKHAraSkgPSAxPDxqOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI4OgoJCQkJCQkqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl9yZWFkKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQlmb3IgKGo9MDtqPDMyO2orKykKCQl7CgoJCQlpZiAobV9sZW4gPj0gMTI4KQoJCQkJbiA9IDMyOwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMzA6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAyMjoKCQkJCQkJaWYgKCoocCtpKSAhPSAwKSB7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDApOwoJCQkJCQl9YnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMzE6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkEpIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkEpOwoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjQ6CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMjUpIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMjUpOwoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDI3OgoJCQkJCWNhc2UgMjk6CgkJCQkJCWlmICgqKHAraSkgIT0gMTw8aikge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAxPDxqKTsKCQkJCQkJfSBicmVhazsKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI4OgoJCQkJCQlpZiAoKihwK2kpICE9IH4oMTw8aikpIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfigxPDxqKSk7CgkJCQkJCX0gYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4OwoJCQkJcCArPSAzMjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgoKc3RhdGljIHZvaWQgZGRyX3dyaXRlNCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJZm9yIChqPTA7ajwzMjtqKyspCgkJewoKCQkJaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCgkJCQkJCSoocCtpKSA9IH4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQkJKihwK2kpID0gMHhhYTU1YWE1NTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJKihwK2kpID0gfjB4YWE1NWFhNTU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgoJCQkJCQkqKHAraSkgPSAxPDxqOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl9yZWFkNCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJZm9yIChqPTA7ajwzMjtqKyspCgkJewoKCQkJaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3dpdGNoIChpKQoJCQkJewoKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgoJCQkJCQkvLyAgICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoKCQkJCQkJLy8gICAgICAqKHAraSkgPSB+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vICAgICoocCtpKSA9IDB4YWE1NWFhNTU7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhhYTU1YWE1NSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJLy8gICAqKHAraSkgPSB+MHhhYTU1YWE1NTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhhYTU1YWE1NSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCgkJCQkJCS8vICAgKihwK2kpID0gMTw8ajsKCQkJCQkJaWYgKCoocCtpKSAhPSAoMTw8aikpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAqKHAraSkgPSB+KDE8PGopOwoJCQkJCQlpZiAoKihwK2kpICE9figgMTw8aikpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWRfZnVsbCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCx1bnNpZ25lZCBpbnQgIHN0YXJ0X3BhdHRlcm4sCgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fb2Zmc2V0KQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpPTA7Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGgmMHhmZmZmZmZmYzsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCS8vKihwKT1zdGFydF9wYXR0ZXJuOwoJd2hpbGUgKG1fbGVuKQoJewoJCW1fbGVuPW1fbGVuLTQ7CgoJCS8vCSoocCtpKSA9ICgqKHApKStwYXR0ZXJuX29mZnNldDsKCiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQlkZHJfcGxkX2NhY2hlKHAraSkgIDsKI2VuZGlmCgkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCXsKCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQltX2xlbj0wOwoJCQlicmVhazsKCQl9CgkJaWYgKCgqKHAraSkpICE9KHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaSkpCgkJe2Vycm9yX2NvdW50Kys7CgkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIAoJCQkJCShzdGFydF9wYXR0ZXJuK3BhdHRlcm5fb2Zmc2V0KmkpKTsKCQl9CgkJYnJlYWs7CgoJCWkrKzsKCX0KfQoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX2Z1bGwodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgsdW5zaWduZWQgaW50ICBzdGFydF9wYXR0ZXJuLAoJdW5zaWduZWQgaW50ICBwYXR0ZXJuX29mZnNldCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaT0wOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoJjB4ZmZmZmZmZmM7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgkvLyoocCk9c3RhcnRfcGF0dGVybjsKCXdoaWxlIChtX2xlbikKCXsKCQltX2xlbj1tX2xlbi00OwoJCSoocCtpKSA9IHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaTsKCQlpKys7Cgl9Cn0KCi8vLyoKc3RhdGljIHZvaWQgZGRyX3Rlc3RfY29weSh2b2lkICphZGRyX2Rlc3Qsdm9pZCAqYWRkcl9zcmMsdW5zaWduZWQgaW50IG1lbWNweV9zaXplKQp7Cgl1bnNpZ25lZCBpbnQgICpwX2Rlc3Q7Cgl1bnNpZ25lZCBpbnQgICpwX3NyYzsKCgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbWVtY3B5X3NpemU7CgoJcF9kZXN0ID0gKCB1bnNpZ25lZCBpbnQgICopYWRkcl9kZXN0OwoJcF9zcmMgPSAoIHVuc2lnbmVkIGludCAgKilhZGRyX3NyYzsKCW1fbGVuID0gbV9sZW4vNDsgLy9hc3N1bWUgaXQncyBtdWx0aXBsZSBvZiA0Cgl3aGlsZSAobV9sZW4tLSkgewoJCWRkcl9wbGRfY2FjaGUocF9zcmMpICA7Ly8jZGVmaW5lIGRkcl9wbGRfY2FjaGUoUCkgICBhc20gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAoUCkpCgkJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkJKnBfZGVzdCsrID0gKnBfc3JjKys7CgkJKnBfZGVzdCsrID0gKnBfc3JjKys7Cgl9Cn0KLy8qLwppbnQgZG9fZGRyX3Rlc3RfY29weShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBsb25nICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBwcmludF9mbGFnID0xOwoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgc3JjX2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICBkZWNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFIrMHg4MDAwMDAwOwoJdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCglwcmludF9mbGFnPTE7CgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CglpZiAoYXJnYyA9PTEpIHsKCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCS8vICAgIGlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJc3JjX2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCWxvb3AgPSAxOwoJfQoJaWYgKGFyZ2MgPiAyKSB7CgkJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl9CglpZiAoYXJnYyA+IDMpIHsKCQlzcmNfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQlkZWNfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJbG9vcCA9IDE7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCgl9CglpZiAodGVzdF9zaXplPDB4MTAwMCkKCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPiA0KSB7CgkJbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCX0KCWlmIChhcmdjID4gNSkgewoJCXByaW50X2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJcHJpbnRfZmxhZyA9IDE7Cgl9CgkvL0NPUFlfVEVTVF9TVEFSVDoKCgkvLy8qCgl1bnNpZ25lZCBsb25nIHRpbWVfc3RhcnQsIHRpbWVfZW5kLHRlc3RfbG9vcHM7Cgl0ZXN0X2xvb3BzPWxvb3A7Cgl1bnNpZ25lZCBsb25nIHNpemVfY291bnQ9MDsKCXNpemVfY291bnQ9bG9vcCp0ZXN0X3NpemU7Cgl0aW1lX3N0YXJ0ID0gZ2V0X3VzX3RpbWUoKTsvL3VzCgoJZG8gewoJCS8vICAgICBsb29wID0gMTsKCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHNyY19hZGRyKSksdGVzdF9zaXplKTsKCQkvL2Jjb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSksdGVzdF9zaXplKTsKCQkvL21jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSksdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykKCQl7CgkJCXByaW50ZigiXG5sb29wPT0weCUwOHgiLCAoIHVuc2lnbmVkIGludCApbG9vcCk7CgkJCXByaW50ZigiXG4gICAgICBcbiIpOwoJCX0KCX13aGlsZSgtLWxvb3ApOwoJLy8qLwoJdGltZV9lbmQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCXByaW50ZigiXG5jb3B5ICVkIHRpbWVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwoIHVuc2lnbmVkIGludCApdGVzdF9sb29wcywoIHVuc2lnbmVkIGludCApKHRpbWVfZW5kLXRpbWVfc3RhcnQpKTsKCglwcmludGYoIlxuZGRyIGNvcHkgYmFuZHdpZHRoPT0lZCBNQllURS9TIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKHVuc2lnbmVkIGludCkoc2l6ZV9jb3VudC8odGltZV9lbmQtdGltZV9zdGFydCkpKTsKCXByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgl1bnNpZ25lZCBpbnQgbV9sZW49MCxjb3VudGVyPTA7Cgl1bnNpZ25lZCBpbnQgICpwX2Rlc3Q7CglwX2Rlc3Q9ICAodm9pZCAqKShpbnRfY29udnRlcl9wKGRlY19hZGRyKSk7CgltX2xlbiA9IHRlc3Rfc2l6ZS80OyAvL2Fzc3VtZSBpdCdzIG11bHRpcGxlIG9mIDQKCWNvdW50ZXI9KHVuc2lnbmVkIGludCl0ZXN0X2xvb3BzOwoJc2l6ZV9jb3VudD1jb3VudGVyKnRlc3Rfc2l6ZTsKCXRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCWRvIHsKCQlsb29wID0gMTsKCQltX2xlbiA9IHRlc3Rfc2l6ZS80OwoJCXdoaWxlIChtX2xlbi0tKSB7CgkJCWRkcl9wbGRfY2FjaGUocF9kZXN0KSAgOwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCQkqcF9kZXN0KysgPSAweDEyMzQ1Njc4OwoJCX0KCX13aGlsZSgtLWNvdW50ZXIpOwoJdGltZV9lbmQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCXByaW50ZigiXG53cml0ZSAlZCBieXRlcyB1c2UgJWR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKCB1bnNpZ25lZCBpbnQgKXRlc3Rfc2l6ZSwoIHVuc2lnbmVkIGludCApKHRpbWVfZW5kLXRpbWVfc3RhcnQpKTsKCglwcmludGYoIlxuZGRyIHdyaXRlIGJhbmR3aWR0aD09JWQgTUJZVEUvUyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvKHRpbWVfZW5kLXRpbWVfc3RhcnQpKSk7CgoJdW5zaWduZWQgaW50ICAqcF9zcmM7CglwX3NyYz0gICh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKTsKCW1fbGVuID0gdGVzdF9zaXplLzQ7IC8vYXNzdW1lIGl0J3MgbXVsdGlwbGUgb2YgNAoJdW5zaWduZWQgaW50IHRlbXAwPTA7CgkvL3Vuc2lnbmVkIGludCB0ZW1wMT0wOwoJLy91bnNpZ25lZCBpbnQgdGVtcDI9MDsKCS8vdW5zaWduZWQgaW50IHRlbXAzPTA7Cgljb3VudGVyPSh1bnNpZ25lZCBpbnQpdGVzdF9sb29wczsKCXNpemVfY291bnQ9Y291bnRlcip0ZXN0X3NpemU7CgoJLy8gICNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzZjMDApKQoJLy93cml0ZWwoKDEwMDAwMDA8PDApLCBETUNfTU9OX0NUUkwxKTsKCS8vd3JpdGVsKCgwPDwzMSl8KDE8PDMwKXwoMDw8MjApfCgxPDwxNil8KDE8PDApLCBETUNfTU9OX0NUUkwyKTsKCS8vd3JpdGVsKCgxPDwzMSl8KDA8PDMwKXwoMDw8MjApfCgxPDwxNil8KDE8PDApLCBETUNfTU9OX0NUUkwyKTsKCXRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCWRvIHsKCQlsb29wID0gMTsKCQltX2xlbiA9IHRlc3Rfc2l6ZS80OwoJCXdoaWxlIChtX2xlbi0tKSB7CgkJCS8vICBkZHJfcGxkX2NhY2hlKHBfc3JjKyspICA7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwcmZtIFBMREwxS0VFUCwgWyUwLCAjMzc2XSI6OiJyIiAocF9zcmMpKTsKI2VuZGlmCgkJCXBfc3JjKys7CgkJCXRlbXAwID0oICpwX3NyYyk7CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJCW1fbGVuLS07CgkJfQoJfXdoaWxlKC0tY291bnRlcik7CgkqcF9kZXN0KysgPSB0ZW1wMDsKCSpwX2Rlc3QrKyA9ICpwX3NyYzsKCSpwX2Rlc3QrKyA9ICpwX3NyYzsKCSpwX2Rlc3QrKyA9ICpwX3NyYzsKCXRpbWVfZW5kID0gZ2V0X3VzX3RpbWUoKTsvL3VzCgoJcHJpbnRmKCJcbnJlYWQgJWQgS2J5dGVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwodW5zaWduZWQgaW50KShzaXplX2NvdW50LzEwMDApLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoJcHJpbnRmKCJcbmRkciByZWFkIGJhbmR3aWR0aD09JWQgTUJZVEUvUyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvKHRpbWVfZW5kLXRpbWVfc3RhcnQpKSk7CgoJcmV0dXJuIDA7Cn0KClVfQk9PVF9DTUQoCglkZHJfdGVzdF9jb3B5LAk3LAkxLAlkb19kZHJfdGVzdF9jb3B5LAoJImRkcl90ZXN0X2NvcHkgZnVuY3Rpb24iLAoJImRkcl90ZXN0X2NvcHkgIDB4MDgwMDAwMDAgMHgxMDAwMDAwMCAweDAyMDAwMDAwIDEgMCA/IFxuIgopOwoKLy8vKgojZGVmaW5lIEREUl9QQVRURVJOX0xPT1BfMSAzMgojZGVmaW5lIEREUl9QQVRURVJOX0xPT1BfMiA2NAojZGVmaW5lIEREUl9QQVRURVJOX0xPT1BfMyA5NgovKgpfX2FzbQp7Ci5HbG9iYWwgbWVtY3B5X3BsZAoudHlwZSBtZW1jcHlfcGxkICwlZnVuY3Rpb24KLmFsaWduIDgKbWVtY3B5X3BsZDoKbW92IHg0LHgwCnN1YnMgeDIseDIsIzgKYi5taSAyZgoxOiBsZHIgeDMsW3gxXSwjOAoJc3VicyB4Mix4MiwjOAoJc3RyIHgzLFt4NF0sIzgKCXByZm0gUExETDFLRUVQLFt4MSwjMzc2XQoJYi5wbCAgMWIKCjI6IGFkZHMgeDIseDIsIzQKCWIubWkgM2YKCWxkciB3MyxbeDFdLCM0CglzdWIgeDIseDIsIzQKCXN0ciB3MyxbeDRdLCM0CgozOiBhZGRzIHgyLHgyLCMyCgliLm1pIDRmCglsZHIgdzMsW3gxXSwjMgoJc3ViIHgyLHgyLCM0CglzdHIgdzMsW3g0XSwjNAoKNDogYWRkcyB4Mix4MiwjMQoJYi5taSA1ZgoJbGRyIHczLFt4MV0sIzIKCXN1YiB4Mix4MiwjNAoJc3RyIHczLFt4NF0sIzQKCjU6IHJldAp9CiovCi8vc3RhdGljIHZvaWQgZGRyX21lbWNweV9wbGQodm9pZCAqYWRkcl9kZXN0LCAgdm9pZCAqYWRkcl9zcmMsIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCi8vewovKgphc20KewovLy5HbG9iYWwgbWVtY3B5X3BsZAoudHlwZSBtZW1jcHlfcGxkICwlZnVuY3Rpb24KLmFsaWduIDgKbWVtY3B5X3BsZDoKbW92IHg0LHgwCnN1YnMgeDIseDIsIzgKYi5taSAyZgoxOiBsZHIgeDMsW3gxXSwjOAoJc3VicyB4Mix4MiwjOAoJc3RyIHgzLFt4NF0sIzgKCXByZm0gUExETDFLRUVQLFt4MSwjMzc2XQoJYi5wbCAgMWIKCjI6IGFkZHMgeDIseDIsIzQKCWIubWkgM2YKCWxkciB3MyxbeDFdLCM0CglzdWIgeDIseDIsIzQKCXN0ciB3MyxbeDRdLCM0CgozOiBhZGRzIHgyLHgyLCMyCgliLm1pIDRmCglsZHIgdzMsW3gxXSwjMgoJc3ViIHgyLHgyLCM0CglzdHIgdzMsW3g0XSwjNAoKNDogYWRkcyB4Mix4MiwjMQoJYi5taSA1ZgoJbGRyIHczLFt4MV0sIzIKCXN1YiB4Mix4MiwjNAoJc3RyIHczLFt4NF0sIzQKCjU6IHJldAp9Cm1lbWNweV9wbGQoYWRkcl9kZXN0LGFkZHJfc3JjLG1fbGVuZ3RoKTsKKi8KLy99CgoKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoKLy8vKgoKaW50IGRkcl90ZXN0X2d4X2Nyb3NzX3RhbGtfcGF0dGVybihpbnQgZGRyX3Rlc3Rfc2l6ZSkKewoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gMHgxMDAwMDAwMDsKCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCWVycm9yX2NvdW50PTA7CgoJdW5zaWduZWQgaW50ICBkZXNbOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzFbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzJbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzNbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzRbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzVbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzZbNF1bOF0gOwoKCWRlc1swXSA9IAkweGFlYzgzZjQ5OwoJZGVzWzFdID0gICAgICAweGQyNDNhNjJjOwoJZGVzWzJdID0gICAgICAweGY4Nzc0YTBiOwoJZGVzWzNdID0gICAgICAgMHg2M2QyMTRlNTsKCWRlc1s0XSA9ICAgICAgMHgzZjQxNjZkNTsKCWRlc1s1XSA9ICAgICAweDIzOTY3MmMwOwoJZGVzWzZdID0gICAgICAweDQ3YmE3NTMzOwoJZGVzWzddID0gICAgICAweGNhZTRjZDdmOwoJcGF0dGVybl8xWzBdWzBdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsxXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bMl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzNdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs0XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzZdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs3XSA9IDB4ZmYwMGZmMDA7CgoJcGF0dGVybl8xWzFdWzBdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVsxXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bMl0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzNdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs0XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNV0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzZdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs3XSA9IDB4MDBmZmZmMDA7CgoJcGF0dGVybl8xWzJdWzBdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVsxXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bMl0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzNdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs0XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNV0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzZdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs3XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbM11bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwoJcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKCXBhdHRlcm5fMlswXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMV1bMF0gPSAweDAwMDRmYjAwOwoJcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKCXBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwoJcGF0dGVybl8yWzJdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzRdID0gMHgwMDIwZGYwMDsKCXBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwoJcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKCXBhdHRlcm5fMlszXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzNbMF1bMF0gPSAweDAwMDEwMDAwOwoJcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKCXBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwoJcGF0dGVybl8zWzFdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzRdID0gMHgwMDA4MDAwMDsKCXBhdHRlcm5fM1sxXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMl1bMF0gPSAweDAwMTAwMDAwOwoJcGF0dGVybl8zWzJdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzRdID0gMHgwMDIwMDAwMDsKCXBhdHRlcm5fM1syXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbM11bMF0gPSAweDAwNDAwMDAwOwoJcGF0dGVybl8zWzNdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzRdID0gMHgwMDgwMDAwMDsKCXBhdHRlcm5fM1szXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzddID0gMHgwMDAwMDAwMDsKCgkvLy8qCglwYXR0ZXJuXzRbMF1bMF0gPQkweDUxYzhjMDQ5CTsKCXBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwoJcGF0dGVybl80WzBdWzJdID0JMHgwNzc3YjUwYgk7CglwYXR0ZXJuXzRbMF1bM10gPQkweDljZDJlYmU1CTsKCXBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwoJcGF0dGVybl80WzBdWzVdID0JMHhkYzk2OGRjMAk7CglwYXR0ZXJuXzRbMF1bNl0gPQkweGI4YmE4YTMzCTsKCXBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKCXBhdHRlcm5fNFsxXVswXSA9CTB4YWUzN2MwNDkJOwoJcGF0dGVybl80WzFdWzFdID0JMHhkMmJjNTkyYwk7CglwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKCXBhdHRlcm5fNFsxXVszXSA9CTB4NjMyZGViZTUJOwoJcGF0dGVybl80WzFdWzRdID0JMHgzZmJlOTlkNQk7CglwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKCXBhdHRlcm5fNFsxXVs2XSA9CTB4NDc0NThhMzMJOwoJcGF0dGVybl80WzFdWzddID0JMHhjYTFiMzI3Zgk7CgoJcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CglwYXR0ZXJuXzRbMl1bMV0gPQkweDJkYmNhNjJjCTsKCXBhdHRlcm5fNFsyXVsyXSA9CTB4MDc4ODRhMGIJOwoJcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CglwYXR0ZXJuXzRbMl1bNF0gPQkweGMwYmU2NmQ1CTsKCXBhdHRlcm5fNFsyXVs1XSA9CTB4ZGM2OTcyYzAJOwoJcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CglwYXR0ZXJuXzRbMl1bN10gPQkweDM1MWJjZDdmCTsKCgoJcGF0dGVybl80WzNdWzBdID0JMHg1MWM4YzA0OQk7CglwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKCXBhdHRlcm5fNFszXVsyXSA9CTB4MDc3N2I1MGIJOwoJcGF0dGVybl80WzNdWzNdID0JMHg5Y2QyZWJlNQk7CglwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKCXBhdHRlcm5fNFszXVs1XSA9CTB4ZGM5NjhkYzAJOwoJcGF0dGVybl80WzNdWzZdID0JMHhiOGJhOGEzMwk7CglwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCglwYXR0ZXJuXzVbMF1bMF0gPQkweGFlYzljMTQ5CTsKCXBhdHRlcm5fNVswXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbMF1bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVswXVs0XSA9CTB4M2Y0MzliZDUJOwoJcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbMF1bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVswXVs3XSA9CTB4Y2FlNDMyN2YJOwoJcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CglwYXR0ZXJuXzVbMV1bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVsxXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbMV1bNF0gPQkweDNmNDk5MWQ1CTsKCXBhdHRlcm5fNVsxXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbMV1bN10gPQkweGNhZTQzMjdmCTsKCXBhdHRlcm5fNVsyXVswXSA9CTB4YWVkOGQwNDkJOwoJcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbMl1bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVsyXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CglwYXR0ZXJuXzVbMl1bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVsyXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CglwYXR0ZXJuXzVbM11bMF0gPQkweGFlODg4MDQ5CTsKCXBhdHRlcm5fNVszXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbM11bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVszXVs0XSA9CTB4M2ZjMTE5ZDUJOwoJcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbM11bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVszXVs3XSA9CTB4Y2FlNDMyN2YJOwoKCXBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKCXBhdHRlcm5fNlswXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzBdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlswXVs0XSA9CTB4M2Y0MzY2ZDUJOwoJcGF0dGVybl82WzBdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlswXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzFdWzBdID0JMHhhZWNjM2Y0OQk7CglwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsxXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzFdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKCXBhdHRlcm5fNlsxXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzFdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlsyXVswXSA9CTB4YWVkODNmNDkJOwoJcGF0dGVybl82WzJdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlsyXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzJdWzRdID0JMHgzZjYxNjZkNQk7CglwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlsyXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzJdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKCXBhdHRlcm5fNlszXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzNdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlszXVs0XSA9CTB4M2ZjMTY2ZDUJOwoJcGF0dGVybl82WzNdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlszXVs3XSA9CTB4Y2FlNGNkN2YJOwoJLy8qLwoJLy8qLwoJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwoJdW5zaWduZWQgaW50CQkJdGVzdF9zaXplID0gMHgyMDsKCXVuc2lnbmVkIGludCB0ZXN0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9rPTA7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9vWzhdOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKCXsKCQkvLyAgaWYobGZsYWcpCgkJLy8gICAgICBsb29wID0gODg4OwoKCQkvL2lmKG9sZF9wYXR0ZXJuX2ZsYWc9PTEpCgkJewoKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uXG4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCgkJCS8qCgkJCSAgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJICAgewoKCQkJICAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJICAgewoJCQkgICB0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJICoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJfQoJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQl7ZXJyb3JfY291bnQrKzsKCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJfQoJCQl9CgkJCX0KCQkJfQoJCQkqLwoJCQkvL2lmKHBhdHRlcm5fZmxhZzE9PTEpCgkJCXsKCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDRFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNCBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvL2lmKHBhdHRlcm5fZmxhZzI9PTEpCgkJCXsKCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNSBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJfQoKCQkJLy8JaWYocGF0dGVybl9mbGFnMz09MSkKCQkJewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8gcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJCQkJCQlpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpKSAhPSBwYXR0ZXJuX2RbdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDYgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCgoJCX0KCgkJcHJpbnRmKCJcRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCQlwcmludGYoIlxuICAgICAgXG4iKTsKCX0KCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cn0KCmludCBkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSAweDEwMDAwMDAwOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJZXJyb3JfY291bnQ9MDsKCgl1bnNpZ25lZCBpbnQgIGRlc1s4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fMVs0XVs4XSA7CgkvLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fMls0XVs4XSA7CgkvLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fM1s0XVs4XSA7CgkvLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNFs0XVs4XSA7CgkvLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNVs0XVs4XSA7CgkvL3Vuc2lnbmVkIGludCAgcGF0dGVybl82WzRdWzhdIDsKCglkZXNbMF0gPSAJMHhhZWM4M2Y0OTsKCWRlc1sxXSA9ICAgICAgMHhkMjQzYTYyYzsKCWRlc1syXSA9ICAgICAgMHhmODc3NGEwYjsKCWRlc1szXSA9ICAgICAgIDB4NjNkMjE0ZTU7CglkZXNbNF0gPSAgICAgIDB4M2Y0MTY2ZDU7CglkZXNbNV0gPSAgICAgMHgyMzk2NzJjMDsKCWRlc1s2XSA9ICAgICAgMHg0N2JhNzUzMzsKCWRlc1s3XSA9ICAgICAgMHhjYWU0Y2Q3ZjsKCS8qCgkgICBwYXR0ZXJuXzFbMF1bMF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzBdWzFdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVswXVsyXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMF1bM10gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzBdWzRdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVswXVs1XSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbMF1bNl0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzBdWzddID0gMHhhYTAwYWEwMDsKCgkgICBwYXR0ZXJuXzFbMV1bMF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzFdWzFdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVsxXVsyXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMV1bM10gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzFdWzRdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVsxXVs1XSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbMV1bNl0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzFdWzddID0gMHhhYTAwYWEwMDsKCgkgICBwYXR0ZXJuXzFbMl1bMF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzJdWzFdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVsyXVsyXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMl1bM10gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzJdWzRdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVsyXVs1XSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbMl1bNl0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzJdWzddID0gMHhhYTAwYWEwMDsKCgkgICBwYXR0ZXJuXzFbM11bMF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzNdWzFdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVszXVsyXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbM11bM10gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzNdWzRdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVszXVs1XSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbM11bNl0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzNdWzddID0gMHhhYTAwYWEwMDsKCSAgICovCgkvLyAvKgoJcGF0dGVybl8xWzBdWzBdID0gMHg1NWFhNTUwMDsKCXBhdHRlcm5fMVswXVsxXSA9IDB4NTVhYTU1MDA7CglwYXR0ZXJuXzFbMF1bMl0gPSAweDU1YWE1NTAwOwoJcGF0dGVybl8xWzBdWzNdID0gMHg1NWFhNTUwMDsKCXBhdHRlcm5fMVswXVs0XSA9IDB4YWEwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNV0gPSAweGFhMDBmZjAwOwoJcGF0dGVybl8xWzBdWzZdID0gMHhhYTAwZmYwMDsKCXBhdHRlcm5fMVswXVs3XSA9IDB4YWEwMGZmMDA7CgoJcGF0dGVybl8xWzFdWzBdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsxXVsxXSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbMV1bMl0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzFdWzNdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVsxXVs0XSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMV1bNV0gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzFdWzZdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsxXVs3XSA9IDB4YWEwMGFhMDA7CgoJcGF0dGVybl8xWzJdWzBdID0gMHgwMDAxZmUwMDsKCXBhdHRlcm5fMVsyXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbMl1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzJdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVsyXVs0XSA9IDB4MDAwMmZkMDA7CglwYXR0ZXJuXzFbMl1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzJdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVsyXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8xWzNdWzBdID0gMHgwMDA0ZmIwMDsKCXBhdHRlcm5fMVszXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbM11bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzNdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVszXVs0XSA9IDB4MDAwOGY3MDA7CglwYXR0ZXJuXzFbM11bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzNdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVszXVs3XSA9IDB4MDAwMGZmMDA7CgkvLyovCgkvKgoJICAgcGF0dGVybl8yWzBdWzBdID0gMHgwMDAxZmUwMDsKCSAgIHBhdHRlcm5fMlswXVsxXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMF1bMl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzBdWzNdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlswXVs0XSA9IDB4MDAwMmZkMDA7CgkgICBwYXR0ZXJuXzJbMF1bNV0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzBdWzZdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlswXVs3XSA9IDB4MDAwMGZmMDA7CgoJICAgcGF0dGVybl8yWzFdWzBdID0gMHgwMDA0ZmIwMDsKCSAgIHBhdHRlcm5fMlsxXVsxXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMV1bMl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzFdWzNdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlsxXVs0XSA9IDB4MDAwOGY3MDA7CgkgICBwYXR0ZXJuXzJbMV1bNV0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzFdWzZdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlsxXVs3XSA9IDB4MDAwMGZmMDA7CgoJICAgcGF0dGVybl8yWzJdWzBdID0gMHgwMDEwZWYwMDsKCSAgIHBhdHRlcm5fMlsyXVsxXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMl1bMl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzJdWzNdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlsyXVs0XSA9IDB4MDAyMGRmMDA7CgkgICBwYXR0ZXJuXzJbMl1bNV0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzJdWzZdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlsyXVs3XSA9IDB4MDAwMGZmMDA7CgoJICAgcGF0dGVybl8yWzNdWzBdID0gMHgwMDQwYmYwMDsKCSAgIHBhdHRlcm5fMlszXVsxXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbM11bMl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzNdWzNdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlszXVs0XSA9IDB4MDA4MDdmMDA7CgkgICBwYXR0ZXJuXzJbM11bNV0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzNdWzZdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlszXVs3XSA9IDB4MDAwMGZmMDA7CgoJICAgcGF0dGVybl8zWzBdWzBdID0gMHgwMDAxMDAwMDsKCSAgIHBhdHRlcm5fM1swXVsxXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMF1bMl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzBdWzNdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1swXVs0XSA9IDB4MDAwMjAwMDA7CgkgICBwYXR0ZXJuXzNbMF1bNV0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzBdWzZdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1swXVs3XSA9IDB4MDAwMDAwMDA7CgoJICAgcGF0dGVybl8zWzFdWzBdID0gMHgwMDA0MDAwMDsKCSAgIHBhdHRlcm5fM1sxXVsxXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMV1bMl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzFdWzNdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1sxXVs0XSA9IDB4MDAwODAwMDA7CgkgICBwYXR0ZXJuXzNbMV1bNV0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzFdWzZdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1sxXVs3XSA9IDB4MDAwMDAwMDA7CgoJICAgcGF0dGVybl8zWzJdWzBdID0gMHgwMDEwMDAwMDsKCSAgIHBhdHRlcm5fM1syXVsxXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMl1bMl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzJdWzNdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1syXVs0XSA9IDB4MDAyMDAwMDA7CgkgICBwYXR0ZXJuXzNbMl1bNV0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzJdWzZdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1syXVs3XSA9IDB4MDAwMDAwMDA7CgoJICAgcGF0dGVybl8zWzNdWzBdID0gMHgwMDQwMDAwMDsKCSAgIHBhdHRlcm5fM1szXVsxXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbM11bMl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzNdWzNdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1szXVs0XSA9IDB4MDA4MDAwMDA7CgkgICBwYXR0ZXJuXzNbM11bNV0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzNdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs3XSA9IDB4MDAwMDAwMDA7CgoKCXBhdHRlcm5fNFswXVswXSA9CTB4NTFjOGMwNDkJOwoJcGF0dGVybl80WzBdWzFdID0JMHgyZDQzNTkyYwk7CglwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKCXBhdHRlcm5fNFswXVszXSA9CTB4OWNkMmViZTUJOwoJcGF0dGVybl80WzBdWzRdID0JMHhjMDQxOTlkNQk7CglwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKCXBhdHRlcm5fNFswXVs2XSA9CTB4YjhiYThhMzMJOwoJcGF0dGVybl80WzBdWzddID0JMHgzNWU0MzI3Zgk7CgoJcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CglwYXR0ZXJuXzRbMV1bMV0gPQkweGQyYmM1OTJjCTsKCXBhdHRlcm5fNFsxXVsyXSA9CTB4Zjg4OGI1MGIJOwoJcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CglwYXR0ZXJuXzRbMV1bNF0gPQkweDNmYmU5OWQ1CTsKCXBhdHRlcm5fNFsxXVs1XSA9CTB4MjM2OThkYzAJOwoJcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CglwYXR0ZXJuXzRbMV1bN10gPQkweGNhMWIzMjdmCTsKCglwYXR0ZXJuXzRbMl1bMF0gPQkweDUxMzczZjQ5CTsKCXBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwoJcGF0dGVybl80WzJdWzJdID0JMHgwNzg4NGEwYgk7CglwYXR0ZXJuXzRbMl1bM10gPQkweDljMmQxNGU1CTsKCXBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwoJcGF0dGVybl80WzJdWzVdID0JMHhkYzY5NzJjMAk7CglwYXR0ZXJuXzRbMl1bNl0gPQkweGI4NDU3NTMzCTsKCXBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCglwYXR0ZXJuXzRbM11bMF0gPQkweDUxYzhjMDQ5CTsKCXBhdHRlcm5fNFszXVsxXSA9CTB4MmQ0MzU5MmMJOwoJcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CglwYXR0ZXJuXzRbM11bM10gPQkweDljZDJlYmU1CTsKCXBhdHRlcm5fNFszXVs0XSA9CTB4YzA0MTk5ZDUJOwoJcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CglwYXR0ZXJuXzRbM11bNl0gPQkweGI4YmE4YTMzCTsKCXBhdHRlcm5fNFszXVs3XSA9CTB4MzVlNDMyN2YJOwoKCXBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwoJcGF0dGVybl81WzBdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbMF1bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzBdWzRdID0JMHgzZjQzOWJkNQk7CglwYXR0ZXJuXzVbMF1bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzBdWzddID0JMHhjYWU0MzI3Zgk7CglwYXR0ZXJuXzVbMV1bMF0gPQkweGFlY2NjNDQ5CTsKCXBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzFdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbMV1bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwoJcGF0dGVybl81WzFdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbMV1bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwoJcGF0dGVybl81WzJdWzBdID0JMHhhZWQ4ZDA0OQk7CglwYXR0ZXJuXzVbMl1bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzJdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbMl1bNF0gPQkweDNmNjFiOWQ1CTsKCXBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzJdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbMl1bN10gPQkweGNhZTQzMjdmCTsKCXBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwoJcGF0dGVybl81WzNdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbM11bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzNdWzRdID0JMHgzZmMxMTlkNQk7CglwYXR0ZXJuXzVbM11bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzNdWzddID0JMHhjYWU0MzI3Zgk7CgoJcGF0dGVybl82WzBdWzBdID0gICAweGFlYzkzZjQ5ICAgOwoJcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMF1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlswXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CglwYXR0ZXJuXzZbMF1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlswXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbMV1bMF0gPQkweGFlY2MzZjQ5CTsKCXBhdHRlcm5fNlsxXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMV1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlsxXVs0XSA9CTB4M2Y0OTY2ZDUJOwoJcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMV1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlsxXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CglwYXR0ZXJuXzZbMl1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsyXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMl1bNF0gPQkweDNmNjE2NmQ1CTsKCXBhdHRlcm5fNlsyXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMl1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlszXVswXSA9CTB4YWU4ODNmNDkJOwoJcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbM11bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlszXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CglwYXR0ZXJuXzZbM11bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlszXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CgkqLwoJCS8vKi8KCQkvLyovCgkJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwoJdW5zaWduZWQgaW50CQkJdGVzdF9zaXplID0gMHgyMDsKCXVuc2lnbmVkIGludCB0ZXN0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9rPTA7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9vWzhdOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKCXsKCQkvLyAgaWYobGZsYWcpCgkJLy8gICAgICBsb29wID0gODg4OwoKCQkvL2lmKG9sZF9wYXR0ZXJuX2ZsYWc9PTEpCgkJewoKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uXG4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCgkJCS8qCgkJCSAgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJICAgewoKCQkJICAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJICAgewoJCQkgICB0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJICoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJfQoJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQl7ZXJyb3JfY291bnQrKzsKCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJfQoJCQl9CgkJCX0KCQkJfQoJCQkqLwoJCQkvL2lmKHBhdHRlcm5fZmxhZzE9PTEpCgkJCXsKCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlpZiAoKHBhdHRlcm5fb1t0ZW1wX2ldKSAhPSAoZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSkpKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJLy8gICAgICAgICAgICAgICAgcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCQlwcmludGYoInA0RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBkZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy8gIHByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLwkgIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJCQkJCQlpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLGRlc19pbnZfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNCBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLAoJCQkJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJfQoJCX0KCgkJcHJpbnRmKCJcRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCQlwcmludGYoIlxuICAgICAgXG4iKTsKCX0KCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gMTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKI2VuZGlmCgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IFREQVRBMzJBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyNTsKCgoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkqKHAraSkgPTB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkJCSoocCtpKSA9MHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkqKHAraSkgPTB4ZmIwNGZiMDQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkqKHAraSkgPTB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkqKHAraSkgPTB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJCQkqKHAraSkgPTB4ZGYyMGRmMjA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkJCQkqKHAraSkgPTB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID0weDAwMDAwMjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDQwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDgwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9MHgwMDAwMTAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9MHgwMDAwMjAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9MHgwMDAwNDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9MHgwMDAwODAwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCS8vI2RlZmluZSBkZHJfcGF0dGVybl9sb29wIDMyCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCSoocCtpKSA9IDB4ZmQwMmZkMDI7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkqKHAraSkgPSAweGVmMTBlZjEwOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJKihwK2kpID0gMHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9IDB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkqKHAraSkgPSAweDdmODA3ZjgwOwoJCQkJCQlicmVhazsKCgoJCQkJCWRlZmF1bHQ6CgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3Aodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlpZiAoKihwK2kpICE9IFREQVRBMzJGKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCQkJLy8gICBjYXNlIDIyOgoJCQkJCQkvLyAgICoocCtpKSA9IDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAwKTsKCQkJCQkJCWJyZWFrO30KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCS8vICAgY2FzZSAzMDoKCQkJCQkJLy8gICAgICAgICoocCtpKSA9IFREQVRBMzJBOwoJCQkJCQlpZiAoKihwK2kpICE9IFREQVRBMzJBKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJBKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlpZiAoKihwK2kpICE9IFREQVRBMzI1KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzI1KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCS8vICAgCSoocCtpKSA9MHhmZTAxZmUwMTsKCQkJCQkJaWYgKCoocCtpKSAhPTB4ZmUwMWZlMDEpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZTAxZmUwMSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkvLyAJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmQwMmZkMDIpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZiMDRmYjA0KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmIwNGZiMDQpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCS8vCSoocCtpKSA9MHhmN2IwOGY3MDg7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmNzA4ZjcwOCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGY3MDhmNzA4KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkvLwkqKHAraSkgPTB4ZWYxMGVmMTA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhlZjEwZWYxMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGVmMTBlZjEwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIzOgoJCQkJCQkvLwkqKHAraSkgPTB4ZGYyMGRmMjA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhkZjIwZGYyMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGRmMjBkZjIwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkJCQkvLyAgCSoocCtpKSA9MHhiZjQwYmY0MDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGJmNDBiZjQwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4YmY0MGJmNDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCS8vICAgCSoocCtpKSA9MHg3ZjgwN2Y4MDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDdmODA3ZjgwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAwMTAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAxMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJLy8gIAkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMDIwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAwMjAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDA0MDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDQwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDA4MDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDgwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDEwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMTAwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gCSoocCtpKSA9MHhmZmZmZmVmZjsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAyMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDIwMDApOwoKCQkJCQkJfSBicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDQwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwNDAwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDgwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwODAwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KjQpCgkJCXsKCQkJCW1fbGVuIC09IDEyOCo0OwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KLy8qLwpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCWlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkJbV9sZW49MDsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkvLyAgICoocCtpKSA9IDB4ZmUwMWZlMDE7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZTAxZmUwMSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZlMDFmZTAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZkMDJmZDAyKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmQwMmZkMDIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLyAgICoocCtpKSA9IDB4ZmIwNGZiMDQ7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmYjA0ZmIwNCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZiMDRmYjA0KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGY3MDhmNzA4OwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZjcwOGY3MDgpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmNzA4ZjcwOCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGVmMTBlZjEwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZWYxMGVmMTApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhkZjIwZGYyMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZGYyMGRmMjApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4YmY0MGJmNDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhiZjQwYmY0MCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGJmNDBiZjQwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHg3ZjgwN2Y4MCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDdmODA3ZjgwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCS8vICAqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCo0KQoJCQl7CgkJCQltX2xlbiAtPSAxMjgqNDsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSB+VERBVEEzMkY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCQkJLy8gICBjYXNlIDIyOgoJCQkJCQkqKHAraSkgPSB+MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCS8vICAgY2FzZSAzMDoKCQkJCQkJKihwK2kpID0gflREQVRBMzJBOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkqKHAraSkgPX5UREFUQTMyNTsKCgoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkqKHAraSkgPX4weGZlMDFmZTAxOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkqKHAraSkgPX4weGZkMDJmZDAyOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCSoocCtpKSA9fjB4ZmIwNGZiMDQ7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkqKHAraSkgPX4weGY3MDhmNzA4OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJKihwK2kpID1+MHhlZjEwZWYxMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCSoocCtpKSA9fjB4ZGYyMGRmMjA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkJCQkqKHAraSkgPX4weGJmNDBiZjQwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJKihwK2kpID1+MHg3ZjgwN2Y4MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJKihwK2kpID1+MHgwMDAwMDEwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID1+MHgwMDAwMDIwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkqKHAraSkgPX4weDAwMDAwNDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID1+MHgwMDAwMDgwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDEwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkqKHAraSkgPX4weDAwMDAyMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID1+MHgwMDAwNDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDgwMDA7CgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24yKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJKihwK2kpID0gfjB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID0gfjB4ZmQwMmZkMDI7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJKihwK2kpID0gfjB4ZmIwNGZiMDQ7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkqKHAraSkgPSB+MHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9IH4weGVmMTBlZjEwOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJKihwK2kpID0gfjB4ZGYyMGRmMjA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkqKHAraSkgPX4weGJmNDBiZjQwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkqKHAraSkgPSB+MHg3ZjgwN2Y4MDsKCQkJCQkJYnJlYWs7CgoKCQkJCQlkZWZhdWx0OgoKCQkJCQkJKihwK2kpID0gfjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24odm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkJCS8vICAgY2FzZSAzMDoKCQkJCQkJLy8gICAgICAqKHAraSkgPSBUREFUQTMyRjsKCQkJCQkJaWYgKCoocCtpKSAhPX5UREFUQTMyRikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+VERBVEEzMkYpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCS8vICAgKihwK2kpID0gMDsKCQkJCQkJaWYgKCoocCtpKSAhPX4wKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4wKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICAgKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWlmICgqKHAraSkgIT0gflREQVRBMzJBKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksflREQVRBMzJBKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkvLwkqKHAraSkgPSBUREFUQTMyNTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+VERBVEEzMjUpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgflREQVRBMzI1KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4ZmUwMWZlMDE7CgkJCQkJCWlmICgqKHAraSkgIT1+MHhmZTAxZmUwMSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZTAxZmUwMSk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJLy8gCSoocCtpKSA9MHhmZDAyZmQwMjsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZDAyZmQwMikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZDAyZmQwMik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJLy8JKihwK2kpID0weGZiMDRmYjA0OwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZiMDRmYjA0KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZiMDRmYjA0KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJLy8JKihwK2kpID0weGY3YjA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmNzA4ZjcwOCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmNzA4ZjcwOCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCS8vCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhlZjEwZWYxMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhlZjEwZWYxMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCS8vCSoocCtpKSA9MHhkZjIwZGYyMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhkZjIwZGYyMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhkZjIwZGYyMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCS8vICAJKihwK2kpID0weGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGJmNDBiZjQwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGJmNDBiZjQwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJLy8gICAJKihwK2kpID0weDdmODA3ZjgwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDdmODA3ZjgwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDdmODA3ZjgwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDAwMTAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwMTAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDIwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDIwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDA0MDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDA0MDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDA4MDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDA4MDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDEwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDEwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkvLyAJKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDAyMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAyMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDA0MDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDA0MDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8JKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDA4MDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDA4MDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KjQpCgkJCXsKCQkJCW1fbGVuIC09IDEyOCo0OwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgovLyovCnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmZTAxZmUwMTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZTAxZmUwMSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZTAxZmUwMSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4ZmQwMmZkMDI7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmQwMmZkMDIpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmQwMmZkMDIpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLyAgICoocCtpKSA9IDB4ZmIwNGZiMDQ7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmIwNGZiMDQpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmIwNGZiMDQpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZjcwOGY3MDgpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZjcwOGY3MDgpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4ZWYxMGVmMTA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZWYxMGVmMTApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZWYxMGVmMTApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhkZjIwZGYyMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhkZjIwZGYyMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhkZjIwZGYyMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhiZjQwYmY0MDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhiZjQwYmY0MCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhiZjQwYmY0MCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLwkgICAqKHAraSkgPSAweDdmODA3ZjgwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDdmODA3ZjgwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDdmODA3ZjgwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCS8vICAqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KjQpCgkJCXsKCQkJCW1fbGVuIC09IDEyOCo0OwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9ub19jcm9zc190YWxrKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJCSoocCtpKSA9IDB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQkJKihwK2kpID0gMHhmZjAwMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJCSoocCtpKSA9IDB4ZmYwMDAwZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkJCSoocCtpKSA9IDB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkqKHAraSkgPSAweDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCQkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMDAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQkJKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJCQkJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCSoocCtpKSA9MHgwMGZmMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJKihwK2kpID0weGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCSoocCtpKSA9MHgwMDAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCSoocCtpKSA9MHgwMDAwMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCSoocCtpKSA9MHgwMGZmMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCSoocCtpKSA9MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCSoocCtpKSA9MHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCSoocCtpKSA9MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJKihwK2kpID1+MHgwMGZmMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkqKHAraSkgPX4weDAwMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID1+MHgwMDAwMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsayh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCWlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkJbV9sZW49MDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJCS8vCSAgaWYoKihwK2kpICE9flREQVRBMzJGKQoKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmZmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCQkvLyAqKHAraSkgPSAweGZmMDAwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDAwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMDAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJCS8vICoocCtpKSA9IDB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJCS8vCSAqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJCS8vICAqKHAraSkgPSAweGZmMDAwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDAwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMDAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSAyNToKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjc6CgkJCQkJCS8vICAqKHAraSkgPSAweGZmZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmZmYwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmZmZjAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgKihwK2kpID0gMHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMGZmMDBmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs3OgoJCQkJCQkvLyAJKihwK2kpID1+MHhmZmZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmZmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmZmZjAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQkJLy8gCSoocCtpKSA9fjB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDAwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDAwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCQkJLy8JKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCQkvLwkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJCS8vCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8JKihwK2kpID1+MHhmZmZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmZmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmZmZjAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weDAwZmYwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJLy8gIAkqKHAraSkgPTB4MDBmZjAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4MDBmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMGZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJLy8gICAJKihwK2kpID0weGZmMDAwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDAwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMDAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJLy8gCSoocCtpKSA9MHgwMDAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMDAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJLy8gICAJKihwK2kpID0weDAwMDAwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwMDAwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4MDBmZjAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4MDBmZjAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMGZmMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCS8vCSoocCtpKSA9MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJLy8gICAJKihwK2kpID0weGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkvLwkgICAJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vCSoocCtpKSA9fjB4MDBmZjAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weDAwZmYwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLyAgIAkqKHAraSkgPX4weGZmMDAwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weDAwMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8gICAJKihwK2kpID1+MHgwMDAwMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDAwMDAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLyAgIAkqKHAraSkgPX4weDAwZmYwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHgwMGZmMDBmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMGZmMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8gIAkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCS8vICAgCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgoKaW50IGRvX2Rkcl90ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIHNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAxOwoJdW5zaWduZWQgaW50ICAgY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJdW5zaWduZWQgaW50ICAgb2xkX3BhdHRlcm5fZmxhZyA9IDE7CgoJdW5zaWduZWQgaW50ICAgcHJpbnRfZmxhZyA9IDE7CgkvLwkgIGNvcHlfdGVzdF9mbGFnID0gMDsKCXByaW50X2ZsYWcgPSAxOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MDsKCWVycm9yX2NvdW50ID0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJaWYgKCFhcmdjKQoJCWdvdG8gRERSX1RFU1RfU1RBUlQ7CglpZiAoYXJnYyA+IDEpIHsKCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJsIikgPT0gMCkgewoJCQlsZmxhZyA9IDE7CgkJfQoJCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiaCIpID09IDApewoJCQlnb3RvIHVzYWdlOwoJCX0KCQllbHNlewoJCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoJCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQkJbG9vcCA9IDE7CgkJfQoJfQoJLy8gICAgcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MSkgewoJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJLy8gICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQlsb29wID0gMTsKCgl9CglpZiAoYXJnYyA+IDIpIHsKCQlzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoKCX0KCWlmIChhcmdjID4gMykgewoJCXRlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCWlmICh0ZXN0X3NpemU8MHgxMDAwKQoJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJb2xkX3BhdHRlcm5fZmxhZyA9IDE7CglzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MikgewoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAicyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJjIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMDsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7CgkJfQoJCWVsc2UgIGlmICggKHN0cmNtcChhcmd2WzFdLCAiZSIpID09IDApKQoJCXsKCQkJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAibiIpID09IDApKQoJCXsKCQkJcHJpbnRfZmxhZyA9IDA7CgkJfQoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAicCIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgInAiKSA9PSAwKSkKCQl7CgkJCWNvcHlfdGVzdF9mbGFnID0gMTsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJzIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJjIikgPT0gMCl8fChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSkKCQl7CgkJCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQl9CgkJZWxzZSAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCl8fChzdHJjbXAoYXJndlsyXSwgImUiKSA9PSAwKSkKCQl7CgkJCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCQl9Cgl9CgkvL3ByaW50ZigiXG5MSU5FMT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPiAzKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicCIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgInAiKSA9PSAwKSkKCQl7CgkJCWNvcHlfdGVzdF9mbGFnID0gMTsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAibiIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgIm4iKSA9PSAwKSkKCQl7CgkJCXByaW50X2ZsYWcgPSAwOwoJCX0KCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAicyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYyIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJjIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMDsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7CgkJfQoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAiZSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImUiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJlIikgPT0gMCkpCgkJewoJCQllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgkJfQoJfQoKCS8vICAgIHByaW50ZigiXG5MSU5FMj09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJLy8JcHJpbnRmKCJcbkxJTkUzPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkvLwlwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoKRERSX1RFU1RfU1RBUlQ6CgoJLy8vKgoJZG8gewoJCWlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKCgkJaWYgKG9sZF9wYXR0ZXJuX2ZsYWcgPT0gMSkKCQl7CgkJCXsKCQkJCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQlpZiAocHJpbnRfZmxhZykKCQkJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCWRkcl93cml0ZSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCS8vCSBmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJfQoJCQkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpCgkJCQkJcHJpbnRmKCJcbkVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQkJCXsKCQkJCQlpZihwcmludF9mbGFnKQoJCQkJCQlwcmludGYoIlxuIGNvcHlfdGVzdF9mbGFnID0gMSxzdGFydCBjb3B5IHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCQkJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwoJCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJCX0KCgkJCX0KCQkJewoJCQkJLy8JcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vcm1hbCBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJfQoJCQkJZGRyX3dyaXRlNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKQoJCQkJCXByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCQkJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQkJCXsKCgkJCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplLzIgKTsKCQkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJCX0KCgoJCQl9CgkJfQoKCQlpZiAoc2ltcGxlX3BhdHRlcm5fZmxhZyA9PSAxKQoJCXsKCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCXByaW50ZigiXG5TdGFydCAqNCBubyBjcm9zcyB0YWxrIHBhdHRlcm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJfQoJCQlkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQlwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJaWYgKHByaW50X2ZsYWcpCgkJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQlpZiAoY29weV90ZXN0X2ZsYWcpCgkJCXsKCQkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CgkJCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCX0KCgkJfQoKCQlpZiAoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPT0gMSkKCQl7aWYocHJpbnRfZmxhZyl7CgkJCQkJCSAgIHByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJCSAgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJCSAgIH0KCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpO30KCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJCS8vLyoKCQkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpO30KCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7fQoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKQoJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQl7CgkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCX0KCQkvLyAgICAqLwoKCQl9CgoJCWlmIChwcmludF9mbGFnKQoJCQlwcmludGYoIlxuRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCgl9d2hpbGUoLS1sb29wKTsKCS8vKi8KCglwcmludGYoIlxyRW5kIGRkciB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQoKVV9CT09UX0NNRCgKCWRkcnRlc3QsCTUsCTEsCWRvX2Rkcl90ZXN0LAoJIkREUiB0ZXN0IGZ1bmN0aW9uIiwKCSJkZHJ0ZXN0IFtMT09QXSBbQUREUl0uRGVmYXVsdCBhZGRyZXNzIGlzIDB4OGQwMDAwMDBcbiIKKTsKCmludCBkb19kZHJfc3BlY2lhbF90ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCB0ZXN0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJdW5zaWduZWQgaW50ICAgd3JpdGVfdGltZXMgPSAxOwoJdW5zaWduZWQgaW50ICByZWFkX3RpbWVzID0gMzsKCS8vICB1bnNpZ25lZCBpbnQgICBvbGRfcGF0dGVybl9mbGFnID0gMTsKCgl1bnNpZ25lZCBpbnQgICBwcmludF9mbGFnID0gMTsKCS8vCSAgY29weV90ZXN0X2ZsYWcgPSAwOwoJcHJpbnRfZmxhZyA9IDE7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJZXJyb3JfY291bnQgPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJaWYgKHN0cmNtcChhcmd2WzFdLCAibCIpID09IDApIHsKCQlsZmxhZyA9IDE7Cgl9CgllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgImgiKSA9PSAwKXsKCQlnb3RvIHVzYWdlOwoJfQoJZWxzZXsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoJfQoKCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CglpZiAoYXJnYyA9PTEpIHsKCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCS8vICAgIGlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkJbG9vcCA9IDE7CgoJfQoJaWYgKGFyZ2MgPiAyKSB7CgkJc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCgl9CglpZiAoYXJnYyA+IDMpIHsKCQl0ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCgl9CglpZiAodGVzdF9zaXplPDB4MTAwMCkKCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPiA0KSB7CgkJd3JpdGVfdGltZXMgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJd3JpdGVfdGltZXMgPSAwOwoKCX0KCWlmIChhcmdjID4gNSkgewoJCXJlYWRfdGltZXMgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJcmVhZF90aW1lcyA9IDA7CgoJfQoJdW5zaWduZWQgaW50ICBiYXNlX3BhdHRlcm4gPSAxOwoJdW5zaWduZWQgaW50ICBpbmNfZmxhZyA9IDE7CglpZiAoYXJnYyA+IDYpIHsKCQliYXNlX3BhdHRlcm4gPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJYmFzZV9wYXR0ZXJuID0gMDsKCgl9CglpZiAoYXJnYyA+IDcpIHsKCQlpbmNfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlpbmNfZmxhZyA9IDA7CgoJfQoKCgkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgoJLy9wcmludGYoIlxuTElORTE9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCgoJLy8gICAgcHJpbnRmKCJcbkxJTkUyPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkvLwlwcmludGYoIlxuTElORTM9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgoKCXVuc2lnbmVkIGludCAgY291bnQgICAgPSAxOwoJdW5zaWduZWQgaW50ICAgdGVzdF92YWwgPSAxOwoKCS8vLyoKCWRvIHsKCQlpZiAobGZsYWcpCgkJCWxvb3AgPSA4ODg7CgoJCWlmICgxKQoJCXsKCgkJCWZvciAoaT0wO2k8d3JpdGVfdGltZXM7KQoJCQl7aSsrOwoKCQkJCXByaW50ZigiXG53cml0ZV90aW1lcz09MHglMDh4IFxuIiwoKHVuc2lnbmVkIGludClpKSk7CgkJCQkvLyAgc2VyaWFsX3B1dF9oZXgoKCh1bnNpZ25lZCBsb25nKWkpLDMyKTsKCQkJCS8vCWNvdW50PWNvdW50X21heDsKCQkJCS8vCXJlZz1yZWdfYmFzZTsKCQkJCS8vICAgICAgIHZhbD12YWxfYmFzZTsKCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyOwoJCQkJdGVzdF92YWw9YmFzZV9wYXR0ZXJuOwoJCQkJY291bnQ9KHRlc3Rfc2l6ZT4+Mik7CgkJCQlkbwoJCQkJewoJCQkJCXdyaXRlbCh0ZXN0X3ZhbCwodW5zaWduZWQgbG9uZyl0ZXN0X2FkZHIpOwoJCQkJCXRlc3RfYWRkcj10ZXN0X2FkZHIrNDsKCQkJCQlpZiAoaW5jX2ZsYWcpCgkJCQkJCXRlc3RfdmFsPXRlc3RfdmFsKzE7CgoJCQkJfQoJCQkJd2hpbGUgKGNvdW50LS0pIDsKCQkJfQoKCQkJZm9yIChpPTA7aTxyZWFkX3RpbWVzOykKCQkJe2krKzsKCQkJCXByaW50ZigiXG5yZWFkX3RpbWVzPT0weCUwOHggXG4iLCgodW5zaWduZWQgaW50KWkpKTsKCQkJCS8vc2VyaWFsX3B1dHMoIlxucmVhZF90aW1lcz0gIik7CgkJCQkvLyAgIHNlcmlhbF9wdXRfaGV4KCgodW5zaWduZWQgbG9uZylpKSwzMik7CgkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcjsKCQkJCXRlc3RfdmFsPWJhc2VfcGF0dGVybjsKCQkJCWNvdW50PSh0ZXN0X3NpemU+PjIpOwoKCQkJCWRvCgkJCQl7CgoJCQkJCS8vd3JpdGVsKHZhbCwodW5zaWduZWQgbG9uZylyZWcpOwoJCQkJCWlmICh0ZXN0X3ZhbCAhPSAocmVhZGwoKHVuc2lnbmVkIGxvbmcpdGVzdF9hZGRyKSkpIHsKCgkJCQkJCXByaW50ZigiXG5hZGQ9PTB4JTA4eCxwYXR0ZXJuPT0weCUwOHgscmVhZD09MHglMDh4IFxuIiwoKHVuc2lnbmVkIGludCl0ZXN0X2FkZHIpLCgodW5zaWduZWQgaW50KXRlc3RfdmFsKSwocmVhZGwoKHVuc2lnbmVkIGludCl0ZXN0X2FkZHIpKSk7CgkJCQkJfQoJCQkJCXRlc3RfYWRkcj10ZXN0X2FkZHIrNDsKCQkJCQlpZiAoaW5jX2ZsYWcpCgkJCQkJCXRlc3RfdmFsPXRlc3RfdmFsKzE7CgkJCQl9CgkJCQl3aGlsZSAoY291bnQtLSkgOwoJCQl9CgkJfQoKCgoJCWlmIChwcmludF9mbGFnKQoJCQlwcmludGYoIlxuRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCgl9d2hpbGUoLS1sb29wKTsKCS8vKi8KCglwcmludGYoIlxyRW5kIGRkciB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX3NwZWNfdGVzdCwJOCwJMSwJZG9fZGRyX3NwZWNpYWxfdGVzdCwKCSJERFIgdGVzdCBmdW5jdGlvbiIsCgkiZGRydGVzdCBbTE9PUF0gW0FERFJdIFtzaXplXSBbd3JpdGVfdGltZXNdIFtyZWFkIHRpbWVzXSBbcGF0dGVybl0gW2luY10uZGRyX3NwZWNfdGVzdCAxIDB4MTA4MDAwMCAweDIwMDAwMCAxICAzIDEgMSBcbiIKKTsKLyoKaW50IGRvX213X21hc2soY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CmNoYXIgKmVuZHA7CnVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKdW5zaWduZWQgaW50ICAgd3JfcmVnX3ZhbHVlPTA7CnVuc2lnbmVkIGludCAgIHJkX3JlZ192YWx1ZT0wOwp1bnNpZ25lZCBpbnQgICB3cl9yZWdfYW5kX21hc2tfMT0weGZmZmZmZmZmOwppZiAoYXJnYyA9PSAxKQp7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CnByaW50ZigiXG5leGFtcGxlIG9ubHkgY2hhbmdlIDB4Yzg4MzY4MDAgMHg4YzAxMDIyNiAweDAwMGZmZmZmIGJpdDIwLWJpdDMxLG5vIGNoYW5nZSBwbGwgb2Qgb2MgXG4iKTsKcHJpbnRmKCJcbm13bSAweGM4ODM2ODAwIDB4OGMwMTAyMjYgMHgwMDBmZmZmZlxuIik7Cn0KZWxzZXsKaWYgKGFyZ2MgPj0gMikKewpyZWdfYWRkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwp9CmlmIChhcmdjID49IDMpCnsKd3JfcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTApOwp9CmlmIChhcmdjID49IDQpCnsKd3JfcmVnX2FuZF9tYXNrXzEgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxMCk7Cgp9CnJkX3JlZ192YWx1ZT0gKHJkX3JlZyhyZWdfYWRkKSk7CndyX3JlZyhyZWdfYWRkLChyZF9yZWdfdmFsdWUmd3JfcmVnX2FuZF9tYXNrXzEpfCh3cl9yZWdfdmFsdWUmKH53cl9yZWdfYW5kX21hc2tfMSkpICk7CgpwcmludGYoIlxubW9kaWZ5IG9rIHJlYWQ9PTB4JTA4eFxuIiwocmRfcmVnKHJlZ19hZGQpKSk7Cgp9CnJldHVybiAxOwp9ClVfQk9PVF9DTUQoCgltd20sCTMwLAkxLAlkb19td19tYXNrLAoJIm13IG1hc2sgZnVuY3Rpb24iLAoJIm13IDB4Yzg4MzY4MDAgMHg4YzgyMDIyYyAweDAwMGZmZmZmXG4iCik7CiovCgovLy8qCgppbnQgZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oaW50IGRkcl90ZXN0X3NpemUpCnsKI2RlZmluZSBURVNUX09GRlNFVCAgMC8vMFg0MDAwMDAwMAoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUitURVNUX09GRlNFVDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoKCWVycm9yX2NvdW50PTA7CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCXRyYWluaW5nX3BhdHRlcm5fZmxhZz0wOwojZW5kaWYKCS8vLyoKCWlmICh0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpCgl7CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCWlmIChlcnJvcl9jb3VudCkKCQkJcmV0dXJuIDE7CgkJZWxzZQoJCQlyZXR1cm4gMDsKCX0KCWVsc2UKCXsKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCgkJZGRyX3Rlc3RfZ3hfdHJhaW5pbmdfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgoJfQoJLy8JCQkqLwoJLyoKCWRkcl90ZXN0X2d4X2Nyb3NzX3RhbGtfcGF0dGVybiggZGRyX3Rlc3Rfc2l6ZSk7CglpZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKCWVsc2UKCXJldHVybiAwOwoJKi8KCXsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBwYXR0ZXJuNCBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7Cgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCS8vaWYoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWc9PTEpCgl7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7Cgl9CglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIGVycm9yX2NvdW50OwoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCQkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQl7CgkJCWlmIChlcnJvcl9jb3VudCkKCQkJcmV0dXJuIGVycm9yX2NvdW50OwoJCQlwcmludGYoIlxuIHN0YXJ0IGNvcHkgdGVzdCAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZS8yICk7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwgZGRyX3Rlc3Rfc2l6ZS8yKTsKCQl9Cgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiAxOwoJZWxzZQoJCXJldHVybiAwOwoJfQoKCgppbnQgZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm5fcXVpY2tfcmV0cnVuKGludCBkZHJfdGVzdF9zaXplKQp7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0xOwoJI2RlZmluZSBURVNUX09GRlNFVCAgMC8vMFg0MDAwMDAwMAoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUitURVNUX09GRlNFVDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoKCWVycm9yX2NvdW50PTA7CgoJI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJdHJhaW5pbmdfcGF0dGVybl9mbGFnPTA7CgkjZW5kaWYKCS8vLyoKCWlmICh0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpCgl7CgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCQlkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJI2VuZGlmCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cgl9CgllbHNlCgl7CgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfQkFCWSkKCQlkZHJfdGVzdF9neF90cmFpbmluZ19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJI2VuZGlmCgl9CgkvLwkJCSovCgkvKgoJZGRyX3Rlc3RfZ3hfY3Jvc3NfdGFsa19wYXR0ZXJuKCBkZHJfdGVzdF9zaXplKTsKCWlmIChlcnJvcl9jb3VudCkKCXJldHVybiAxOwoJZWxzZQoJcmV0dXJuIDA7CgkqLwoKCXsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIHBhdHRlcm40IGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGU0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7Cgl9CgkvL2lmKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnPT0xKQoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJCS8vICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKilzdGFydF9hZGRyLCBkZHJfdGVzdF9zaXplKTsKCQkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKilzdGFydF9hZGRyLCBkZHJfdGVzdF9zaXplKTsKCQkvLyAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgoJfQoKCXsKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJIC8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCWlmIChjb3B5X3Rlc3RfZmxhZykKCQl7CgkJCXByaW50ZigiXG4gc3RhcnQgY29weSB0ZXN0ICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLzIgKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwoJCX0KCgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiAxOwoJZWxzZQoJCXJldHVybiAwOwp9CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQppbnQgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIHRlc3QgZGRyIGRxcyB3aW5kb3cgc3RlcCBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2xhbmU9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9taW5fbWF4X2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0PTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodD0wOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW49MDsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCS8vICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfVEVTVF9TSVpFOy8vRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJCX0KCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCXRlc3RfbGFuZV9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJfQoJfQoJaWYgKHRlc3RfbGFuZV9zdGVwID43KQoJCXRlc3RfbGFuZV9zdGVwID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJaWYgKGFyZ2MgPjUpIHsKCQl0ZXN0X21pbl9tYXhfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9taW5fbWF4X2ZsYWcgPSAwOwoJCX0KCQllbHNlCgkJewoJCQkvL3Rlc3RfbWluX21heF9mbGFnID0xOwoJCX0KCX0KCXVuc2lnbmVkIGludCAgIHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyPTA7CglpZiAoYXJnYyA+NikgewoJCXRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlciA9IDA7CgkJfQoJCWVsc2UKCQl7CgkJCS8vdGVzdF9taW5fbWF4X2ZsYWcgPTE7CgkJfQoJfQoJc3RpY2t5X3JlZ19iYXNlX2FkZD0oRERSMF9QVUJfUkVHX0JBU0UmMHhmZmZmMDAwMCkrKChETUNfU1RJQ0tZXzApJjB4ZmZmZik7CgoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9sYW5lX3N0ZXA9PSAweCUwOHhcbiIsIHRlc3RfbGFuZV9zdGVwKTsKCXByaW50ZigiXG50ZXN0X21pbl9tYXhfZmxhZz09IDB4JTA4eFxuIiwgdGVzdF9taW5fbWF4X2ZsYWcpOwoJcHJpbnRmKCJcbnRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyPT0gMHglMDh4XG4iLCB0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3Rlcik7CgoJY29uc3QgY2hhciAqdGVtcF9zOwoJY2hhciAqZW52X2xjZGxyX3RlbXBfY291bnQ7CgljaGFyICpidWY7CglidWY9IiI7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfdGVtcF9jb3VudD0wOwoJZW52X2xjZGxyX3RlbXBfY291bnQ9ImxjZGxyX3RlbXBfY291bnQiOwoKCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJewoJCWxjZGxyX3RlbXBfY291bnQ9cmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7Cgl9CgllbHNlCgl7CgkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCWlmKHRlbXBfcykKCQl7CgkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJfQoJCWVsc2UKCQl7CgkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQl9Cgl9CgkJCQoJLy9pZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCS8vaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9Cgpmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQp7CgkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJewoJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCX0KCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCXsKCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQl9CgkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCXsKCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQl9CgoJCXsKCQkJcHJpbnRmKCJcbnNob3VsZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4LGlmIG5vIHBhdXNlIGRkbCAsd3JpdGUgbGNkbHIgc29tZSB0aW1lIG1heSBvY2NvdXIgZXJyb3JcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQlwcmludGYoIlxuIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJaWYoIGNoYW5uZWxfYl9lbikKCQkJewoJCQkJcHJpbnRmKCJcbmRkcjEgc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHgsaWYgbm8gcGF1c2UgZGRsICx3cml0ZSBsY2RsciBzb21lIHRpbWUgbWF5IG9jY291ciBlcnJvclxuIiwgcmVhZGwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJd3JpdGVsKChyZWFkbChERFIxX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJcHJpbnRmKCJcbiBkZHIxIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjFfUFVCX1JFR19CQVNFKzQpKTsKCQkJfQoJCQlpZiAodGVzdF9sYW5lX3N0ZXA+OCkKCQkJCXRlc3RfbGFuZV9zdGVwPTA7CgkJCXByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09MHglMDh4XG4gIix0ZXN0X2xhbmVfc3RlcCk7CgoJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2FkaisoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2xhbmVfc3RlcD4+MSk7CgkJCXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz10ZXN0X2xhbmVfc3RlcCUyOwoJCQl0ZXN0aW5nX2xhbmU9KHRlc3RfbGFuZV9zdGVwPj4xKTsKCgkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9cmVhZGwocmVnX2FkZCk7CgkJCWRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQlwcmludGYoIlxucmVnX2FkZF8weCUwOHg9PTB4JTA4eFxuICIscmVnX2FkZCxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQlpZiAodGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQl7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKSYweGZmMDApPj44KTsKCQkJCWRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKChyZWFkbChyZWdfYWRkKSkmMHgwMGZmKT4+MCk7CgkJCQlkcV9sY2RfYmRsX3JlZ19vcmc9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJfQoJCQkjZW5kaWYKCgkJCWlmICgodGVzdF9taW5fbWF4X2ZsYWcgPT0gMCl8fCggKHRlc3RfbWluX21heF9mbGFnID09IDIpKSkKCQkJewoJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+MCkKCQkJCXsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCgkJCQkJewoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCXByaW50ZiggIiVzXG4iLCBidWYpOwoJCQkJCQlpZih0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlcikKCQkJCQkJewoJCQkJCQkJd3JpdGVsKGxjZGxyX3RlbXBfY291bnQsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXByaW50ZigiXG4gbGVmdCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQkJCXsKCQkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKCQkJCQkjZWxzZQoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKCQkJCQkjZW5kaWYKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CgkJCQkJI2VuZGlmCgkJCQkJfQoJCQkJCXByaW50ZigiXG4gcm1pbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlwcmludGYoIlxuIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCXByaW50ZigiXG5sZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJaWYgKHRlc3RfdGltZXMgPT0gMCkKCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj1kcV9sY2RfYmRsX3JlZ19sZWZ0OwoJCQkJaWYgKGRxX2xjZF9iZGxfcmVnX2xlZnQ+ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW4pICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJewoJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPWRxX2xjZF9iZGxfcmVnX2xlZnQJOwoJCQkJfQoJCQl9IAoJCQllbHNlCgkJCXsKCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIHNraXAgXG4iKTsKCQkJfQoKCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCXsKCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKCQkJCSNlbHNlCgkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQkJCSNlbmRpZgoJCQkJLy8gIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDw4KXwoZHFfbGNkX2JkbF9yZWdfb3JnPDwxNil8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYpKSxyZWdfYWRkKTsKCQkJCSNlbHNlCgkJCQkjZW5kaWYKCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCQl9CgoJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX29yZzsKCgkJCXByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgoKCQkJaWYgKCh0ZXN0X21pbl9tYXhfZmxhZyA9PSAwKXx8ICh0ZXN0X21pbl9tYXhfZmxhZyA9PSAxKSkKCQkJewoJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8RFFMQ0RMUl9NQVgpCgkJCQl7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgoKCQkJCQlsY2Rscl90ZW1wX2NvdW50PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQlwcmludGYoICIlc1xuIiwgYnVmKTsKCQkJCQlpZih0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlcikKCQkJCQl7CgkJCQkJCXdyaXRlbChsY2Rscl90ZW1wX2NvdW50LChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl9CgoJCQkJCXByaW50ZigiXG4gcmlnIHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJewoJCQkJCQkvL3dyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8MCl8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmZmZjAwKSkscmVnX2FkZCk7CgkJCQkJCSNlbHNlCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKCQkJCQkJI2VuZGlmCgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CgkJCQkJCSNlbmRpZgoJCQkJCQkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CgkJCQkJfQoJCQkJCXByaW50ZigiXG4gciBtYXggcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQkvL3ByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQlpZiAodGVzdF90aW1lcyA9PSAwKQoJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodDsKCQkJCWlmIChkcV9sY2RfYmRsX3JlZ19yaWdodDxkcV9sY2RfYmRsX3JlZ19yaWdodF9taW4pICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJewoJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodAk7CgkJCQl9CgkJCX0KCgkJCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQl7CgkJCQkvLyB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwoJCQkJI2Vsc2UKCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJI2VuZGlmCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfcmVnX29yZzw8OCl8KGRxX2xjZF9iZGxfcmVnX29yZzw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CgkJCQkjZW5kaWYKCQkJCS8vIAkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKCQkJfQoJCQlwcmludGYoIlxuIHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoJCQlwcmludGYoIlxuZW5kIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJd3JpdGVsKCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpJih+KDE8PDI5KSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCXByaW50ZigiXG4gcmVzdW1lIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQl9Cgl9Cgp9CgoJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPDwxNil8ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CglpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCXsKCQlpZihjaGFubmVsX2FfZW4pCgkJewoJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCX0KCQlpZiAoY2hhbm5lbF9iX2VuKQoJCXsKCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQl9Cgl9CgllbHNlCgl7CgkJaWYgKGNoYW5uZWxfYV9lbikgewoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCX0KCQlpZiAoY2hhbm5lbF9iX2VuKSB7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJfQoKCXJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9ClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kcXNfc3RlcCwJNywJMSwJZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwLAoJImRkcl90dW5lX2Rxc19zdGVwIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kcXNfc3RlcCBhIDAgMHg4MDAwMCAzIG9yIGRkcl90dW5lX2Rxc19zdGVwIGIgMCAweDgwMDAwIDUgXG4gZGNhY2hlIG9mZiA/IFxuIgopOwojZWxzZQoKaW50IGRvX2Rkcl90ZXN0X2ZpbmVfdHVuZV9kcXMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVHVuZSBkZHIgZHFzIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCS8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgojZGVmaW5lICBEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCAgMTIKCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfV0lEVEggIDQKI2RlZmluZSAgQ0hBTk5FTF9DSEFOTkVMX1dJRFRIICAyCgojZGVmaW5lICBDSEFOTkVMX0EgIDAKI2RlZmluZSAgQ0hBTk5FTF9CICAxCgoKCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAwICAwCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAxICAxCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAyICAyCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAzICAzCgojZGVmaW5lICBEQVRYOF9EUV9CRExSMCAgMAojZGVmaW5lICBEQVRYOF9EUV9CRExSMSAgMQojZGVmaW5lICBEQVRYOF9EUV9CRExSMiAgMgojZGVmaW5lICBEQVRYOF9EUV9CRExSMyAgMwojZGVmaW5lICBEQVRYOF9EUV9CRExSNCAgNAojZGVmaW5lICBEQVRYOF9EUV9CRExSNSAgNQojZGVmaW5lICBEQVRYOF9EUV9CRExSNiAgNgojZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjAgICAgIDcKI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIxICAgICA4CiNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMiAgICAgOQojZGVmaW5lICBEQVRYOF9EUV9EWE5NRExSICAgICAgICAxMAojZGVmaW5lICBEQVRYOF9EUV9EWE5HVFIgICAgICAgICAgMTEKCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgojZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwgIERBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIKkRBVFg4X0RRX0xBTkVfV0lEVEgKI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNICAgIERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCpDSEFOTkVMX0NIQU5ORUxfV0lEVEgKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19vcmdbRFFfTENEX0JETF9SRUdfTlVNXTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRbRFFfTENEX0JETF9SRUdfTlVNXTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0W0RRX0xDRF9CRExfUkVHX05VTV07Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19pbmRleFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW0RRX0xDRF9CRExfUkVHX05VTV07Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc25kOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzX21pbjsKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2xvb3AgPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCXsKCQkJdGVzdF9sb29wID0gMTAwMDAwOwoJCX0KCX0KCWlmIChhcmdjID41KSB7CgkJdHJhaW5pbmdfcGF0dGVybl9mbGFnID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0cmFpbmluZ19wYXR0ZXJuX2ZsYWcgPSAwOwoJCX0KCQllbHNlIGlmKHRyYWluaW5nX3BhdHRlcm5fZmxhZykKCQkJdHJhaW5pbmdfcGF0dGVybl9mbGFnID0gMTsKCgoJfQoKCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CglwcmludGYoIlx0cmFpbmluZ19wYXR0ZXJuX2ZsYWc9PSAweCUwOHhcbiIsIHRyYWluaW5nX3BhdHRlcm5fZmxhZyk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoKCgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoKCQkJCWZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCgkJCQl7CgoJCQkJCWlmICh0ZW1wX2NvdW50X2kgPT0gREFUWDhfRFFfTEFORV9MQU5FMDApCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2Fkajt9CgoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqO30KCgkJCQkJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgyQkRMUjArcmVnX2Jhc2VfYWRqO30KCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2Fkajt9CgoKCgkJCQkJZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8REFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgpOyh0ZW1wX2NvdW50X2orKykpCgkJCQkJewoJCQkJCQlkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWFkbChyZWdfYWRkKzQqdGVtcF9jb3VudF9qKTsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWdfYWRkKzQqdGVtcF9jb3VudF9qOwoJCQkJCQlwcmludGYoIlxuIG9yZyBhZGQgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrNCp0ZW1wX2NvdW50X2opLCAoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal0pKTsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXQoJCQkJCQkJPWRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXQoJCQkJCQkJPWRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdOwoKCQkJCQl9CgkJCQl9CgoJCQl9CgoJCX0KCgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCgoJZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQoJCQkJewoJCQkJCXsgcHJpbnRmKCJcbnRlc3QgbGFuZT09MHglMDh4XG4gIix0ZW1wX2NvdW50X2kpOwoKCQkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQkJewoJCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7fQoKCQkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMUJETFIwK3JlZ19iYXNlX2Fkajt9CgoJCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2Fkajt9CgkJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQkJewoJCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDNCRExSMCtyZWdfYmFzZV9hZGo7fQoJCQkJCX0KCgkJCQkJZm9yICgodGVtcF9jb3VudF9rPTApOyh0ZW1wX2NvdW50X2s8Mik7KHRlbXBfY291bnRfaysrKSkKCQkJCQl7CgoJCQkJCQlpZiAodGVtcF9jb3VudF9rID09IDApCgkJCQkJCXsKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0ocmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjApKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0ocmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjApKSZEUUxDRExSX01BWDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KHJlYWRsKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIzLUREUjBfUFVCX0RYMEJETFIwKSkmRFFMQ0RMUl9NQVg7CgkJCQkJCQkvLyAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDAwMCkpPj4xNjsKI2Vsc2UKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCQkJCQkJCS8vICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNuZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMDAwKSk+PjE2OwojZW5kaWYKCgkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPjApCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkLS07CgkJCQkJCQkJcHJpbnRmKCJcbndkcWQgbGVmdCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQsKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIxLUREUjBfUFVCX0RYMEJETFIwKSk7CiNlbHNlCgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CiNlbmRpZgoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxud2RxZCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD4oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJCXsKCQkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCgkJCQkJCQkJCT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmZmYwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKQk7CgkJCQkJCQl9CgoKCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCgoJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDwweGZmKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCsrOwoJCQkJCQkJCXByaW50ZigiXG53ZHFkIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZC0tOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxud2RxZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkvL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZAoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlpZiAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZikpICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQkJewoJCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCgkJCQkJCQkJCT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmZmYwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKQk7CgkJCQkJCQl9CgoKCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgoJCQkJCQl9CgkJCQkJCWVsc2UgaWYodGVtcF9jb3VudF9rPT0xKQoJCQkJCQl7CgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKCQkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPjApCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZC0tOwoJCQkJCQkJCXByaW50ZigiXG5yZHFzZCBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCS8vb25seSB1cGRhdGUgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCByZHFzbmQKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDAwMGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPigoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCQl7CgkJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQoJCQkJCQkJCQk9KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZil8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpCTsKCQkJCQkJCX0KCgoJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKCQkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDB4ZmYpCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCsrOwoJCQkJCQkJCXByaW50ZigiXG5yZHFzZCByaWdodCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZC0tOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG5yZHFzZCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkvL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QgcmRxc25kCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCQl7CgkJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KCQkJCQkJCQkJPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKQk7CgkJCQkJCQl9CgoKCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgoKCgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoKCQkJfQoJCX0KCgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCgoJCS8vLy9jYWxjdWxhdGUgYW5kIHByaW50ICBkcXMgdmFsdWUKCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJewoJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQl7CgkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCX0KCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7CgoKCQkJZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJCQl7CgkJCQkvLyAgZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWdfYWRkKzQqdGVtcF9jb3VudF9qOwoKCQkJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCQkJfQoKCQkJZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJCQl7CgkJCQlwcmludGYoIlxuIGxlZiBhZGQgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSksIChkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJCQl9CgoJCQlmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwpOyh0ZW1wX2NvdW50X2orKykpCgkJCXsKCQkJCXByaW50ZigiXG4gcmlnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJCQl9CgoJCQlwcmludGYoIlxuIGRkcnRlc3Qgc2l6ZSA9PTB4JTA4eCwgdGVzdCB0aW1lcz09MHglMDh4LHRlc3RfbG9vcD09MHglMDh4XG4iLGRkcl90ZXN0X3NpemUsKHRlc3RfdGltZXMrMSksdGVzdF9sb29wKTsKCQkJcHJpbnRmKCJcbiBhZGQgIDB4MDAwMDAwMDAgcmVnPT0gICAgb3JnICAgICAgICAgICBsZWYgICAgICAgICAgIHJpZyAgICAgICAgICAgY2VudGVyICAgICAgICB3aW4gICAgICAgICAgIGxlZl9tICAgICAgICAgcmlnX20gICAgICAgICBtaW5fYyAgICAgICAgIG1pbl93aW4gICAgICAgIFxuIik7CgkJCWZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCgkJCXsKCQkJCXsKCgkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoKCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCQkJCX0KCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj0oZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPShkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCgkJCQlpZiAodGVzdF90aW1lcyA9PSAwKQoJCQkJewoJCQkJCShkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKT1kcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCQkJCQkoZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pPWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCQkJCX0KCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT0oZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9KGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCgoJCQkJLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpOwoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXI9KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZiYweGZmKSsoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWcmMHhmZikpLzIpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj44KSYweGZmKSkvMik8PDgpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj4xNikmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZikpLzIpPDwxNikgKTsKCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3M9KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZyYweGZmKS0oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWYmMHhmZikpKQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj4+OCkmMHhmZikpKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjE2KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSkpPDwxNikgKTsKCgoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKyhkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZikpLzIpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpKS8yKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj4xNikmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpKS8yKTw8MTYpICk7CgoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzX21pbj0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKS0oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKSkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikpKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj4xNikmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSk8PDE2KSApOwoKCQkJCXByaW50ZigiXG4gYWRkICAweCUwOHggcmVnPT0gICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHhcbiIsCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXIsZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbixkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluCgkJCQkJICApOwoJCQl9CgoKCQl9CgoJfQoKCgoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfZHFzLAk2LAkxLAlkb19kZHJfdGVzdF9maW5lX3R1bmVfZHFzLAoJIkREUiB0dW5lIGRxcyBmdW5jdGlvbiIsCgkiZGRyX3R1bmVfZHFzIGEgMCAweDgwMDAwIDMgb3IgZGRyX3R1bmVfZHFzIGIgMCAweDgwMDAwIDUgb3IgZGRyX3R1bmVfZHFzIGEgYiAweDgwMDAwIGxcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgoKCmludCBkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgZHFzIHdpbmRvdyBzdGVwIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2xhbmU9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9taW5fbWF4X2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX29yZz0wOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdD0wOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHQ9MDsKCgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49MDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj0wOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCS8vICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgoKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCXRlc3RfbGFuZV9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJfQoJfQoJaWYgKHRlc3RfbGFuZV9zdGVwID43KQoJCXRlc3RfbGFuZV9zdGVwID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJaWYgKGFyZ2MgPjUpIHsKCgkJdGVzdF9taW5fbWF4X2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbWluX21heF9mbGFnID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJLy90ZXN0X21pbl9tYXhfZmxhZyA9MTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3Rlcj0wOwoJaWYgKGFyZ2MgPjYpIHsKCgkJdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJLy90ZXN0X21pbl9tYXhfZmxhZyA9MTsKCQl9Cgl9CglzdGlja3lfcmVnX2Jhc2VfYWRkPShERFIwX1BVQl9SRUdfQkFTRSYweGZmZmYwMDAwKSsoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09IDB4JTA4eFxuIiwgdGVzdF9sYW5lX3N0ZXApOwoJcHJpbnRmKCJcbnRlc3RfbWluX21heF9mbGFnPT0gMHglMDh4XG4iLCB0ZXN0X21pbl9tYXhfZmxhZyk7CglwcmludGYoIlxudGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXI9PSAweCUwOHhcbiIsIHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKTsKCgljb25zdCBjaGFyICp0ZW1wX3M7CgljaGFyICplbnZfbGNkbHJfdGVtcF9jb3VudDsKCWNoYXIgKmJ1ZjsKCWJ1Zj0iIjsKCXVuc2lnbmVkIGludCBsY2Rscl90ZW1wX2NvdW50PTA7CgllbnZfbGNkbHJfdGVtcF9jb3VudD0ibGNkbHJfdGVtcF9jb3VudCI7CgoJaWYodGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpCgl7bGNkbHJfdGVtcF9jb3VudD1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCX0KCWVsc2UKCXsKCgkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCWlmKHRlbXBfcykKCQl7CgkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJfQoJCWVsc2UKCQl7bGNkbHJfdGVtcF9jb3VudD0wOwoJCX0KCX0KCglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKCQl7CgoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgoKCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnNob3VsZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4LGlmIG5vIHBhdXNlIGRkbCAsd3JpdGUgbGNkbHIgc29tZSB0aW1lIG1heSBvY2NvdXIgZXJyb3JcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQl3cml0ZWwoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKXwoMTw8MjkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJcHJpbnRmKCJcbiBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJaWYoIGNoYW5uZWxfYl9lbikKCQkJCQl7CXByaW50ZigiXG5kZHIxIHNob3VsZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4LGlmIG5vIHBhdXNlIGRkbCAsd3JpdGUgbGNkbHIgc29tZSB0aW1lIG1heSBvY2NvdXIgZXJyb3JcbiIsIHJlYWRsKEREUjFfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQkJd3JpdGVsKChyZWFkbChERFIxX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCQlwcmludGYoIlxuIGRkcjEgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCX0KCQkJCQlpZiAodGVzdF9sYW5lX3N0ZXA+OCkKCQkJCQkJdGVzdF9sYW5lX3N0ZXA9MDsKCQkJCQlwcmludGYoIlxudGVzdF9sYW5lX3N0ZXA9PTB4JTA4eFxuICIsdGVzdF9sYW5lX3N0ZXApOwoKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2FkaisoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2xhbmVfc3RlcD4+MSk7CgkJCQkJdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPXRlc3RfbGFuZV9zdGVwJTI7CgkJCQkJdGVzdGluZ19sYW5lPSh0ZXN0X2xhbmVfc3RlcD4+MSk7CgkJCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJe3JlZ19hZGQ9cmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjA7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQlyZWdfYWRkPXJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIxLUREUjBfUFVCX0RYMEJETFIwOwojZWxzZQoJCQkJCQlyZWdfYWRkPXJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIzLUREUjBfUFVCX0RYMEJETFIwOwojZW5kaWYKCgkJCQkJfQoKCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPXJlYWRsKHJlZ19hZGQpOwoJCQkJCWRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCXByaW50ZigiXG5yZWdfYWRkXzB4JTA4eD09MHglMDh4XG4gIixyZWdfYWRkLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQlpZiAodGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQkJCXtkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKSYweGZmMDApPj44KTsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKChyZWFkbChyZWdfYWRkKSkmMHgwMGZmKT4+MCk7CgkJCQkJCWRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCX0KI2VuZGlmCgoJCQkJCWlmICgodGVzdF9taW5fbWF4X2ZsYWcgPT0gMCl8fCggKHRlc3RfbWluX21heF9mbGFnID09IDIpKSkKCQkJCQl7CgkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPjApCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCgkJCQkJCQl7CgkJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQkJcHJpbnRmKCAiJXNcbiIsIGJ1Zik7CgkJCQkJCQkJaWYodGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpCgkJCQkJCQkJewoJCQkJCQkJCQl3cml0ZWwobGNkbHJfdGVtcF9jb3VudCwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCgoJCQkJCQkJcHJpbnRmKCJcbiBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQlpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQkJCQkJCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKI2Vsc2UKCQkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKI2VuZGlmCgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CiNlbmRpZgoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbiBybWluIHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxubGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCgkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJaWYgKHRlc3RfdGltZXMgPT0gMCkKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPWRxX2xjZF9iZGxfcmVnX2xlZnQ7CgkJCQkJCWlmIChkcV9sY2RfYmRsX3JlZ19sZWZ0PmRxX2xjZF9iZGxfcmVnX2xlZnRfbWluKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJewoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49ZHFfbGNkX2JkbF9yZWdfbGVmdAk7CgkJCQkJCX0KCQkJCQl9IGVsc2UKCQkJCQl7CgkJCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIHNraXAgXG4iKTsKCQkJCQl9CgoJCQkJCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQkJCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKI2Vsc2UKCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKI2VuZGlmCgkJCQkJCS8vICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDgpfChkcV9sY2RfYmRsX3JlZ19vcmc8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CiNlbmRpZgoJCQkJCQkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCQkJCX0KCgkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19vcmc7CgoJCQkJCXByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgoKCQkJCQlpZiAoKHRlc3RfbWluX21heF9mbGFnID09IDApfHwgKHRlc3RfbWluX21heF9mbGFnID09IDEpKQoJCQkJCXsKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8RFFMQ0RMUl9NQVgpCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCgoJCQkJCQkJewoJCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJCXByaW50ZiggIiVzXG4iLCBidWYpOwoJCQkJCQkJCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJCQkJCQkJCXsKCQkJCQkJCQkJd3JpdGVsKGxjZGxyX3RlbXBfY291bnQsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQlwcmludGYoIlxuIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJCQl7CgkJCQkJCQkJLy93cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKI2Vsc2UKCQkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKI2VuZGlmCgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CiNlbmRpZgoJCQkJCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCQkJLy8JICB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbiByIG1heCByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG4gcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCWlmICh0ZXN0X3RpbWVzID09IDApCgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodF9taW49ZHFfbGNkX2JkbF9yZWdfcmlnaHQ7CgkJCQkJCWlmIChkcV9sY2RfYmRsX3JlZ19yaWdodDxkcV9sY2RfYmRsX3JlZ19yaWdodF9taW4pICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQl7CgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodF9taW49ZHFfbGNkX2JkbF9yZWdfcmlnaHQJOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQkJCQl7CgkJCQkJCS8vIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfcmVnX29yZzw8MCl8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmZmZjAwKSkscmVnX2FkZCk7CiNlbHNlCgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CiNlbmRpZgoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDgpfChkcV9sY2RfYmRsX3JlZ19vcmc8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CiNlbmRpZgoJCQkJCQkvLyAJICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJCQkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKCQkJCQl9CgoJCQkJCXByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgkJCQkJcHJpbnRmKCJcbmVuZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJd3JpdGVsKCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpJih+KDE8PDI5KSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJcHJpbnRmKCJcbiByZXN1bWUgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJfQoKCgoJCQl9CgkJfQoKCX0KCglkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW48PDE2KXxkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJe2lmKGNoYW5uZWxfYV9lbil7CgkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJCQkJIGlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CgkJCQkJCSBpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQkJCQkgfQoJaWYgKGNoYW5uZWxfYl9lbikKCXsKCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMSkKCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47Cgl9Cgl9CgllbHNlCgl7CgkJaWYgKGNoYW5uZWxfYV9lbikgewoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCX0KCQlpZiAoY2hhbm5lbF9iX2VuKSB7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2JbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJfQoKCXJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgovLy8qClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kcXNfc3RlcCwJNywJMSwJZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwLAoJImRkcl90dW5lX2Rxc19zdGVwIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kcXNfc3RlcCBhIDAgMHg4MDAwMCAzIG9yIGRkcl90dW5lX2Rxc19zdGVwIGIgMCAweDgwMDAwIDUgXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCgpleHRlcm4gaW50IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihpbnQgZGRyX3Rlc3Rfc2l6ZSk7CgoKaW50IGRvX2Rkcl90ZXN0X2xjZGxyX2Nsa19zdGVwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIHRlc3QgZGRyIGxjZGxyIGNsayBzdGVwIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwPTA7CgkvLyB1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2xhbmU9MDsKCS8vIHVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9taW5fbWF4X2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX29yZz0wOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdD0wOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHQ9MDsKCgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49MDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj0wOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCS8vICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgoKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCXRlc3RfbGFuZV9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJfQoJfQoJaWYgKHRlc3RfbGFuZV9zdGVwID43KQoJCXRlc3RfbGFuZV9zdGVwID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJaWYgKGFyZ2MgPjUpIHsKCgkJdGVzdF9taW5fbWF4X2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbWluX21heF9mbGFnID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJLy90ZXN0X21pbl9tYXhfZmxhZyA9MTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3Rlcj0wOwoJaWYgKGFyZ2MgPjYpIHsKCgkJdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJLy90ZXN0X21pbl9tYXhfZmxhZyA9MTsKCQl9Cgl9CglzdGlja3lfcmVnX2Jhc2VfYWRkPShERFIwX1BVQl9SRUdfQkFTRSYweGZmZmYwMDAwKSsoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0gMHglMDh4XG4iLCB0ZXN0X2xhbmVfc3RlcCk7CglwcmludGYoIlxudGVzdF9taW5fbWF4X2ZsYWc9PSAweCUwOHhcbiIsIHRlc3RfbWluX21heF9mbGFnKTsKCXByaW50ZigiXG50ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3Rlcj09IDB4JTA4eFxuIiwgdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpOwoJY29uc3QgY2hhciAqdGVtcF9zOwoJY2hhciAqZW52X2xjZGxyX3RlbXBfY291bnQ7CgljaGFyICpidWY7CglidWY9IiI7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfdGVtcF9jb3VudD0wOwoJZW52X2xjZGxyX3RlbXBfY291bnQ9ImxjZGxyX3RlbXBfY291bnRfYSI7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfbWF4PTA7CglpZih0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlcikKCXtsY2Rscl90ZW1wX2NvdW50PXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJfQoJZWxzZQoJewoKCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJaWYodGVtcF9zKQoJCXsKCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQl9CgkJZWxzZQoJCXtsY2Rscl90ZW1wX2NvdW50PTA7CgkJfQoJfQoKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCWZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCgoKCQkJCXsKCQkJCQlwcmludGYoIlxuc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHgsaWYgbm8gcGF1c2UgZGRsICx3cml0ZSBsY2RsciBzb21lIHRpbWUgbWF5IG9jY291ciBlcnJvclxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCXdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQlwcmludGYoIlxuIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQlpZiggY2hhbm5lbF9iX2VuKQoJCQkJCXsJcHJpbnRmKCJcbmRkcjEgc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHgsaWYgbm8gcGF1c2UgZGRsICx3cml0ZSBsY2RsciBzb21lIHRpbWUgbWF5IG9jY291ciBlcnJvclxuIiwgcmVhZGwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCQl3cml0ZWwoKHJlYWRsKEREUjFfUFVCX1JFR19CQVNFKzQpKXwoMTw8MjkpLChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJCXByaW50ZigiXG4gZGRyMSBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJfQoJCQkJCWlmICh0ZXN0X2xhbmVfc3RlcD4yKQoJCQkJCQl0ZXN0X2xhbmVfc3RlcD0wOwoJCQkJCXByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09MHglMDh4XG4gIix0ZXN0X2xhbmVfc3RlcCk7CgkJCQkJaWYodGVzdF9sYW5lX3N0ZXA9PTApCgkJCQkJe3JlZ19hZGQ9RERSMF9QVUJfQUNMQ0RMUityZWdfYmFzZV9hZGo7CgkJCQkJCWxjZGxyX21heD1BQ0xDRExSX01BWDsKCQkJCQl9CgkJCQkJaWYodGVzdF9sYW5lX3N0ZXA9PTEpCgkJCQkJe3JlZ19hZGQ9RERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGo7CgkJCQkJCWxjZGxyX21heD1BQ0JETFJfTUFYOwoJCQkJCX0KCgoJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9cmVhZGwocmVnX2FkZCk7CgkJCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJcHJpbnRmKCJcbnJlZ19hZGRfMHglMDh4PT0weCUwOHhcbiAiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJCWlmKHRlc3RfbGFuZV9zdGVwPT0wKQoJCQkJCXtkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKSZBQ0xDRExSX01BWCkpOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19vcmc9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQl9CgkJCQkJaWYodGVzdF9sYW5lX3N0ZXA9PTEpCgkJCQkJe2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KCgocmVhZGwocmVnX2FkZCkpJkFDQkRMUl9NQVgpKTsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJfQoKCgkJCQkJaWYgKCh0ZXN0X21pbl9tYXhfZmxhZyA9PSAwKXx8KCAodGVzdF9taW5fbWF4X2ZsYWcgPT0gMikpKQoJCQkJCXsKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+MCkKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoKCQkJCQkJCXsKCQkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCQlwcmludGYoICIlc1xuIiwgYnVmKTsKCQkJCQkJCQlpZih0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlcikKCQkJCQkJCQl7CgkJCQkJCQkJCXdyaXRlbChsY2Rscl90ZW1wX2NvdW50LChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCQl9CgoJCQkJCQkJfQoKCgoJCQkJCQkJcHJpbnRmKCJcbiBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJCQkJewoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkJfQoKCQkJCQkJCXByaW50ZigiXG4gcm1pbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJLy8jaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkvLyAjZWxzZQoJCQkJCQkJLy8gIHRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJLy8gIHRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJLy8gICNlbmRpZgoKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcbmxlZnQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgoJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCWlmICh0ZXN0X3RpbWVzID09IDApCgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj1kcV9sY2RfYmRsX3JlZ19sZWZ0OwoJCQkJCQlpZiAoZHFfbGNkX2JkbF9yZWdfbGVmdD5kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbikgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCXsKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPWRxX2xjZF9iZGxfcmVnX2xlZnQJOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIHNraXAgXG4iKTsKCQkJCQl9CgoKCQkJCQl7CgoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoKCQkJCQl9CgoJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfb3JnOwoKCQkJCQlwcmludGYoIlxuIHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoKCgkJCQkJaWYgKCh0ZXN0X21pbl9tYXhfZmxhZyA9PSAwKXx8ICh0ZXN0X21pbl9tYXhfZmxhZyA9PSAxKSkKCQkJCQl7CgkJCQkJCS8vaWYodGVzdF9sYW5lX3N0ZXA9PTApCgkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPGxjZGxyX21heCkKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJewoJCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJCXByaW50ZiggIiVzXG4iLCBidWYpOwoJCQkJCQkJCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJCQkJCQkJCXsKCQkJCQkJCQkJd3JpdGVsKGxjZGxyX3RlbXBfY291bnQsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCQlwcmludGYoIlxuIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJewoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkJfQoKCQkJCQkJCXByaW50ZigiXG4gciBtYXggcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgkJCQkJCQkvLwl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJaWYgKHRlc3RfdGltZXMgPT0gMCkKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodDsKCQkJCQkJaWYgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0PGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbikgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCXsKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodAk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXsKCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQkJCQl9CgoJCQkJCXByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgkJCQkJcHJpbnRmKCJcbmVuZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJd3JpdGVsKCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpJih+KDE8PDI5KSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJcHJpbnRmKCJcbiByZXN1bWUgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJfQoKCgoJCQl9CgkJfQoKCX0KCglkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW48PDE2KXxkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCgl7aWYoY2hhbm5lbF9hX2VuKXsKCQkJCQkJIGlmKHRlc3RfbGFuZV9zdGVwPT0wKQoJCQkJCQkgewoJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYT1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCQkJCQkgaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJCQkJCSBpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQkJCQkJIH0KCQkJCQkJIGlmKHRlc3RfbGFuZV9zdGVwPT0xKQoJCQkJCQkgewoJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2E9ZHFfbGNkX2JkbF9yZWdfb3JnOwoJCQkJCQkJIGlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQkJCQkJIGlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQkJCQkJIH0KCQkJCQkgfQoJaWYgKGNoYW5uZWxfYl9lbikKCXsKCQlpZih0ZXN0X2xhbmVfc3RlcD09MCkKCQl7CgkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYj1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9iPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYj1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJCWlmKHRlc3RfbGFuZV9zdGVwPT0xKQoJCXsKCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYj1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYj1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9iPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQl9Cgl9Cgl9CgoKCglyZXR1cm4gZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2FjbGNkbHJfc3RlcCwJNywJMSwJZG9fZGRyX3Rlc3RfbGNkbHJfY2xrX3N0ZXAsCgkiZGRyX3R1bmVfYWNsY2Rscl9zdGVwIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgYSAwIDB4ODAwMDAgMyBvciBkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgYiAwIDB4ODAwMDAgNSBcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgppbnQgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvdyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlcmRkcl90ZXN0X2Rxc193aW5kb3cgZnVuY3Rpb25cbiIpOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCgl1bnNpZ25lZCBpbnQgICBsYW5lX3N0ZXA9IDA7Cgl1bnNpZ25lZCBpbnQgICByZWdfdmFsdWU9IDA7CgkvL2ludCBhcmdjMjsKCS8vY2hhciAgICAgKiAgYXJndjJbMzBdOwoJY2hhciAqZW5kcDsKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoKCgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9CgkvL2FyZ2MyPTU7CgkvL2ZvcihpID0gMTtpPChhcmdjKTtpKyspCgl7CgkJLy9hcmd2MltpLTFdPWFyZ3ZbaV07Cgl9CgoJLy9hcmd2MlswXT1hcmd2WzFdOwoJLy9hcmd2MlsxXT1hcmd2WzJdOwoJLy9hcmd2MlsyXT1hcmd2WzNdOwoJLy8jaW5jbHVkZSA8c3RkaW8uaD4KCS8vICAgdW5zaWduZWQgaW50ICAgd3JfYWRqX3BlclsyNF0gOwoJaWYoMSkKCXsKCQlwcmludGYoIlxudGVzdCB1c2UgdWJvb3QgZW52XG4iKTsKCQl7CgkJCS8vY2hhciBzdHJbMjRdOwoJCQljb25zdCBjaGFyICpzOwoJCQl1bnNpZ25lZCBpbnQgc3RyX3RvX251bWFycnlbNDhdOwoJCQkvL3N0cl9idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCk7CgoJCQl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5OwoJCQludW1fYXJyeSA9ICh1bnNpZ25lZCBpbnQgKikoJnN0cl90b19udW1hcnJ5KTsKCQkJaW50IGk7CgkJCS8vIGNoYXIgKnZhcm5hbWU7CgkJCS8vIGludCB2YWx1ZT0wOwoKCQkJLy8vdmFybmFtZT0iZW52X2RkcnRlc3QiOwoJCQlzID0gZ2V0ZW52KCJlbnZfd3JfbGNkbHJfcHIiKTsKCQkJaWYgKHMpCgkJCXsvL2k9MDsKCQkJCS8vd2hpbGUoc190ZW1wKQoJCQkJewoJCQkJCWVudl90b19udW0oImVudl93cl9sY2Rscl9wciIsbnVtX2FycnkpOy8vdW5zaWduZWQgaW50ICpudW1fYXJyeQoKCgkJCQkJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCgkJCQkJCXByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5W2ldKTsKCQkJCQl9CgkJCQkJLy8JcHJpbnRmKCIlcyxsZW50aD0lZCIscywoc3RybGVuKHMpKSk7CgkJCQkJLy9zc2NhbmYocywiZCUsIix3cl9hZGpfcGVyKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkJSIscyk7CgkJCQkJLy9nZXRjCgkJCQkJLy8gICAgICAgaWYgKHN0cmxlbihzKSA+IDE2KSAKCQkJCQl7CgkJCQkJCS8vICAgc3NjYW5mKHMsICIlMDh4LCAlMDh4LCAlMDh4LCBcbiIsCgkJCQkJCS8vICAgICAgICAgICZ3cl9hZGpfcGVyWzBdLCAmd3JfYWRqX3BlclsxXSwgJndyX2Fkal9wZXJbMl0pOwoJCQkJCX0gCgkJCQl9CgkJCX0KCQl9Cgl9CgkvLyB1bnNpZ25lZCBpbnQgPSAwLCBtYXggPSAweGZmLCBtaW4gPSAweDAwOwoJLyoKCSAgIGlmKDApCgkgICB7CgkgICB7cHJpbnRmKCJcbnRlc3QgdXNlIHVib290IGVudlxuIik7CgkgICB7CgkvL2NoYXIgc3RyWzI0XTsKCWNvbnN0IGNoYXIgKnM7CgoJLy8gY2hhciAqdmFybmFtZTsKCWludCB2YWx1ZT0wOwoKCS8vL3Zhcm5hbWU9ImVudl9kZHJ0ZXN0IjsKCXMgPSBnZXRlbnYoImVudl93cl9sY2Rscl9wciIpOwoJaWYgKHMpCgl7Ly9pPTA7CgkvL3doaWxlKHNfdGVtcCkKCXsKCXByaW50ZigiJXMiLHMpOwoJLy9zc2NhbmYocywiZCUsIix3cl9hZGpfcGVyKTsKCS8vc3ByaW50ZihzdHIsImQlIixzKTsKCS8vZ2V0YwoJaWYgKHN0cmxlbihzKSA+IDE2KSB7Cglzc2NhbmYocywgIiUwOHgsICUwOHgsICUwOHgsICUwOHgsICUwOHhcbiIsCgkmd3JfYWRqX3BlcltpLTJdLCAmbWF4LCAmbWluLCAmdHlwZV9oLCAmdHlwZV9sKTsKCX0gZWxzZSB7Cglzc2NhbmYoYnVmLCAiJTA4eCwgJTA4eCwgJTA4eFxuIiwKCSZyZWcsICZtYXgsICZtaW4pOwoJfQoKCX0KCXZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2RkcihzLCAmZW5kcCwgMTYpOwoJcHJpbnRmKCIlZCIsdmFsdWUpOwoJfQoJcyA9IGdldGVudigiZW52X3JkX2xjZGxyX3ByIik7CgoJaWYgKHMpCgl7Ly9pPTA7CgkvL3doaWxlKHNfdGVtcCkKCXsKCXByaW50ZigiJXMiLHMpOwoJLy9zc2NhbmYocywiZCUsIixyZF9hZGpfcGVyKTsKCgl9CgkvL3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2RkcihzLCAmZW5kcCwgMTYpOwoJfQoKCS8vc3ByaW50ZihzdHIsICIlbHgiLCB2YWx1ZSk7CgkvLyAgc2V0ZW52KCJlbnZfZGRydGVzdCIsIHN0cik7CgoKCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJfQoKCWlmIChhcmdjPjI0KzIpCglhcmdjPTI0KzI7Cglmb3IoaSA9IDI7aTxhcmdjO2krKykKCXsKCWlmKGk8KDIrMTIpKXsKCXdyX2Fkal9wZXJbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxNik7Cgl9CgllbHNlCgl7CglyZF9hZGpfcGVyW2ktMTRdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDE2KTsKCX0KCX0KCgoJfQoJcHJpbnRmKCIgaW50IHdyX2Fkal9wZXJbMTJdPXtcbiIpOwoJZm9yKGkgPSAwO2k8MTI7aSsrKQoJewoJcHJpbnRmKCIlMDRkICxcbiIsd3JfYWRqX3BlcltpXSk7Cn0KcHJpbnRmKCJ9O1xuIik7CnByaW50ZigiIGludCByZF9hZGpfcGVyWzEyXT17XG4iKTsKZm9yKGkgPSAwO2k8MTI7aSsrKQp7CglwcmludGYoIiUwNGQgLFxuIixyZF9hZGpfcGVyW2ldKTsKfQpwcmludGYoIn07XG4iKTsKCn0KKi8KCmNoYXIgc3RyWzEwMF07CgppZiAoY2hhbm5lbF9hX2VuKQp7CgoJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJcHJpbnRmKCJcbnRlc3QgZHFzIHdpbmRvdyBsYW5lIGFcbiIpOwoJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8OCk7KGxhbmVfc3RlcCsrKSkKCXsKCQkvL3NwcmludGYoYXJndjJbM10sImQlIiwoIGxhbmVfc3RlcCkpOwoJCS8vaXRvYV9kZHJfdGVzdChsYW5lX3N0ZXAsKGFyZ3YyWzNdKSwxMCk7CgkJLy9wcmludGYoIlxuYXJndjJbJWRdPSVzXG4iLDAsYXJndjJbMF0pOwoJCS8vCXByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMyxhcmd2MlszXSk7CgkJLy8gcmVnX3ZhbHVlPWRvX2Rkcl90ZXN0X2Rxc193aW5kb3dfc3RlcCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7CgoJfQp9CgoKaWYgKGNoYW5uZWxfYl9lbikKey8vKihjaGFyICAgICAqKShhcmd2MlswXSk9ImIiOwoJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCXByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgbGFuZSBiXG4iKTsKCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDgpOyhsYW5lX3N0ZXArKykpCgl7CgkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4JTA4eCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCkpOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7CgoJfQp9CgppZiAoY2hhbm5lbF9hX2VuKQp7Cglmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJewoJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHx3ZHFfb3JnIDB4JTA4eCAgfHdkcV9taW4gMHglMDh4IHx3ZHFfbWF4IDB4JTA4eCA6OnxyZHFzX29yZyAgMHglMDh4ICB8cmRxc19taW4gMHglMDh4IHxyZHFzX21heCAweCUwOHggIFxuIiwKCQkJCWxhbmVfc3RlcCwKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0sCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdLGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF0sCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXSwKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdLGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdKTsKCX19CmlmIChjaGFubmVsX2JfZW4pCnsKCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgl7CgkJcHJpbnRmKCJcbiBiX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJbGFuZV9zdGVwLAoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2JbbGFuZV9zdGVwXSwKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9iW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2JbbGFuZV9zdGVwXSwKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYltsYW5lX3N0ZXBdLAoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9iW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9iW2xhbmVfc3RlcF0pOwoJfX0KCnJldHVybiByZWdfdmFsdWU7Cn0KCi8qClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kcXNfc3RlcCwJNSwJMSwJZG9fZGRyX3Rlc3RfZmluZV90dW5lX2Rxc19zdGVwLAoJImRkcl90dW5lX2Rxc19zdGVwIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kcXNfc3RlcCBhIDAgMHg4MDAwMDAgMyBvciBkZHJfdHVuZV9kcXNfc3RlcCBiIDAgMHg4MDAwMDAgNSBvciBkZHJfdHVuZV9kcXNfc3RlcCBhIGIgMHg4MDAwMDAgbFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKKi8KCmludCBkb19kZHJfdGVzdF9maW5lX3R1bmVfZHFzX3N0ZXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVHVuZSBkZHIgZHFzIHN0ZXAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXA9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCiNkZWZpbmUgIERBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIICAxMgoKI2RlZmluZSAgREFUWDhfRFFfTEFORV9XSURUSCAgNAojZGVmaW5lICBDSEFOTkVMX0NIQU5ORUxfV0lEVEggIDIKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKCgoKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDAgIDAKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDEgIDEKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDIgIDIKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDMgIDMKCiNkZWZpbmUgIERBVFg4X0RRX0JETFIwICAwCiNkZWZpbmUgIERBVFg4X0RRX0JETFIxICAxCiNkZWZpbmUgIERBVFg4X0RRX0JETFIyICAyCiNkZWZpbmUgIERBVFg4X0RRX0JETFIzICAzCiNkZWZpbmUgIERBVFg4X0RRX0JETFI0ICA0CiNkZWZpbmUgIERBVFg4X0RRX0JETFI1ICA1CiNkZWZpbmUgIERBVFg4X0RRX0JETFI2ICA2CiNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMCAgICAgNwojZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjEgICAgIDgKI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIyICAgICA5CiNkZWZpbmUgIERBVFg4X0RRX0RYTk1ETFIgICAgICAgIDEwCiNkZWZpbmUgIERBVFg4X0RRX0RYTkdUUiAgICAgICAgICAxMQoKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCiNkZWZpbmUgIERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCAgREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgqREFUWDhfRFFfTEFORV9XSURUSAojZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU0gICAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKkNIQU5ORUxfQ0hBTk5FTF9XSURUSAoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX29yZ1tEUV9MQ0RfQkRMX1JFR19OVU1dOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRbRFFfTENEX0JETF9SRUdfTlVNXTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2luZGV4W0RRX0xDRF9CRExfUkVHX05VTV07CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbltEUV9MQ0RfQkRMX1JFR19OVU1dOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXI7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3M7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW47Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluOwoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJdGVzdF9sYW5lX3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9Cgl9Cgl0ZXN0X2xvb3A9MTsKCgl1bnNpZ25lZCBpbnQgICB0ZXN0X21pbl9tYXg9MDsKCWlmIChhcmdjID41KSB7CgoJCXRlc3RfbWluX21heCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9taW5fbWF4ID0gMDsKCQl9CgkJZWxzZQoJCQl0ZXN0X21pbl9tYXg9MTsKCgl9CgoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9sYW5lX3N0ZXA9PSAweCUwOHhcbiIsIHRlc3RfbGFuZV9zdGVwKTsKCXByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CglwcmludGYoIlxudGVzdF9taW5fbWF4PT0gMHglMDh4XG4iLCB0ZXN0X21pbl9tYXgpOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgoKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKCQkJCXsKCgkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqO30KCgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFCRExSMCtyZWdfYmFzZV9hZGo7fQoKCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJCRExSMCtyZWdfYmFzZV9hZGo7fQoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzQkRMUjArcmVnX2Jhc2VfYWRqO30KCgoKCQkJCQlmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCk7KHRlbXBfY291bnRfaisrKSkKCQkJCQl7CgkJCQkJCWRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdPXJlYWRsKHJlZ19hZGQrNCp0ZW1wX2NvdW50X2opOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdPXJlZ19hZGQrNCp0ZW1wX2NvdW50X2o7CgkJCQkJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCs0KnRlbXBfY291bnRfaiksIChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXSkpOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCgkJCQkJCQk9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CgkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCgkJCQkJCQk9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CgoJCQkJCX0KCQkJCX0KCgkJCX0KCgkJfQoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoKCQkJCWZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCgkJCQl7CgkJCQkJaWYgKHRlc3RfbGFuZV9zdGVwPjgpCgkJCQkJCXRlc3RfbGFuZV9zdGVwPTA7CgkJCQkJaWYgKHRlc3RfbGFuZV9zdGVwKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0weCUwOHhcbiAiLHRlc3RfbGFuZV9zdGVwKTsKCQkJCQkJdGVtcF9jb3VudF9pPSh0ZXN0X2xhbmVfc3RlcD4+MSk7CgkJCQkJCXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz10ZXN0X2xhbmVfc3RlcC0odGVtcF9jb3VudF9pPDwxKTsKCQkJCQkJdGVzdF9sYW5lX3N0ZXA9MDsKCQkJCQl9CgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdCBsYW5lPT0weCUwOHhcbiAiLHRlbXBfY291bnRfaSk7CgkJCQkJCWlmICh0ZW1wX2NvdW50X2kgPT0gREFUWDhfRFFfTEFORV9MQU5FMDApCgkJCQkJCXsKCQkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqO30KCgkJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCQkJCQkJewoJCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFCRExSMCtyZWdfYmFzZV9hZGo7fQoKCQkJCQkJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCQkJCQkJewoJCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJCRExSMCtyZWdfYmFzZV9hZGo7fQoJCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgkJCQkJCXsKCQkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzQkRMUjArcmVnX2Jhc2VfYWRqO30KCQkJCQl9CgoJCQkJCWZvciAoKHRlbXBfY291bnRfaz0wKTsodGVtcF9jb3VudF9rPDIpOyh0ZW1wX2NvdW50X2srKykpCgkJCQkJewoJCQkJCQlpZiAodGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2NvdW50X2s9MTsKCQkJCQkJCXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz0wOwoJCQkJCQl9CgkJCQkJCWlmICh0ZW1wX2NvdW50X2sgPT0gMCkKCQkJCQkJewoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoJCQkJCQkJLy8gIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc25kPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwMDApKT4+MTY7CgoJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD4wKQoJCQkJCQkJewoJCQkJCQkJCWlmKHRlc3RfbWluX21heCkKCQkJCQkJCQl7YnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZC0tOwoJCQkJCQkJCXByaW50ZigiXG53ZHFkIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCS8vb25seSB1cGRhdGUgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ+KGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCQl7CgkJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQoJCQkJCQkJCQk9KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZmZmMDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCkJOwoJCQkJCQkJfQoKCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz1yZWFkbChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZik7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwKSk+Pjg7CgoKCQkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ8MHhmZikKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQrKzsKCQkJCQkJCQlwcmludGYoIlxud2RxZCByaWcgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxud2RxZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQtLTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDwoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJCXsKCQkJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQoJCQkJCQkJCQk9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZmZmMDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCkJOwoJCQkJCQkJfQoKCgoJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgoKCQkJCQkJfQoJCQkJCQllbHNlIGlmKHRlbXBfY291bnRfaz09MSkKCQkJCQkJewoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCgkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD4wKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QtLTsKCQkJCQkJCQlwcmludGYoIlxucmRxc2QgbGVmdCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxucmRxc2QgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKys7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxucmRxc2QgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkvL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QgcmRxc25kCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwMDBmZil8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlpZiAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD4oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikpICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQkJewoJCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KCQkJCQkJCQkJPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKQk7CgkJCQkJCQl9CgoKCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCgkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDwweGZmKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QrKzsKCQkJCQkJCQlwcmludGYoIlxucmRxc2QgcmlnaHQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCS8vcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QtLTsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkIHJkcXNuZAoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDAwMGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlpZiAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZikpICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQkJewoJCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCgkJCQkJCQkJCT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSkJOwoJCQkJCQkJfQoKCgoJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgoKCgoJCQkJCQl9CgoJCQkJCX0KCQkJCX0KCgkJCX0KCQl9CgoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKCQkvLy8vY2FsY3VsYXRlIGFuZCBwcmludCAgZHFzIHZhbHVlCgkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCXsKCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJewoJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQl9CgkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqOwoKCgkJCWZvciAoKHRlbXBfY291bnRfaj0wKTsodGVtcF9jb3VudF9qPERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCk7KHRlbXBfY291bnRfaisrKSkKCQkJewoJCQkJLy8gIGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal09cmVnX2FkZCs0KnRlbXBfY291bnRfajsKCgkJCQlwcmludGYoIlxuIG9yZyBhZGQgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSksIChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSk7CgkJCX0KCgkJCWZvciAoKHRlbXBfY291bnRfaj0wKTsodGVtcF9jb3VudF9qPERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCk7KHRlbXBfY291bnRfaisrKSkKCQkJewoJCQkJcHJpbnRmKCJcbiBsZWYgYWRkICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pLCAoZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCQkJfQoKCQkJZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJCQl7CgkJCQlwcmludGYoIlxuIHJpZyBhZGQgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSksIChkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCQkJfQoKCQkJcHJpbnRmKCJcbiBkZHJ0ZXN0IHNpemUgPT0weCUwOHgsIHRlc3QgdGltZXM9PTB4JTA4eCx0ZXN0X2xvb3A9PTB4JTA4eFxuIixkZHJfdGVzdF9zaXplLCh0ZXN0X3RpbWVzKzEpLHRlc3RfbG9vcCk7CgkJCXByaW50ZigiXG4gYWRkICAweDAwMDAwMDAwIHJlZz09ICAgIG9yZyAgICAgICAgICAgbGVmICAgICAgICAgICByaWcgICAgICAgICAgIGNlbnRlciAgICAgICAgd2luICAgICAgICAgICBsZWZfbSAgICAgICAgIHJpZ19tICAgICAgICAgbWluX2MgICAgICAgICBtaW5fd2luICAgICAgICBcbiIpOwoJCQlmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQoJCQl7CgkJCQl7CgoJCQkJCWlmICh0ZW1wX2NvdW50X2kgPT0gREFUWDhfRFFfTEFORV9MQU5FMDApCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9CgoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCgkJCQkJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgyQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9CgkJCQl9CgoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY9KGRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz0oZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgoJCQkJaWYgKHRlc3RfdGltZXMgPT0gMCkKCQkJCXsKCQkJCQkoZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk9ZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkJCQkJKGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKT1kcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCgkJCQl9CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9KGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pOwoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgoKCQkJCS8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDAwMGZmKTsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWYmMHhmZikrKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnJjB4ZmYpKS8yKQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj4+OCkmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZikpLzIpPDw4KQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj4+MTYpJjB4ZmYpKygoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjgpJjB4ZmYpKS8yKTw8MTYpICk7CgoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWcmMHhmZiktKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmJjB4ZmYpKSkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjgpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjgpJjB4ZmYpKSk8PDgpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj4xNikmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj4+OCkmMHhmZikpKTw8MTYpICk7CgoKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbj0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKSsoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpKS8yKQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKygoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKSkvMik8PDgpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+MTYpJjB4ZmYpKygoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKSkvMik8PDE2KSApOwoKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW49KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZiktKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKSkpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSk8PDgpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+MTYpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSkpPDwxNikgKTsKCgkJCQlwcmludGYoIlxuIGFkZCAgMHglMDh4IHJlZz09ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4XG4iLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyLGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93cywKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW4sZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzX21pbgoJCQkJCSAgKTsKCQkJfQoKCgkJfQoKCX0KCgoKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KCgoKaW50IGRvX2Rkcl90ZXN0X2Rxc193aW5kb3dfZW52KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyZGRyX3Rlc3RfZHFzX3dpbmRvdyBmdW5jdGlvblxuIik7CglwcmludGYoIlxuZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAgbnMgbGFuZV9kaXNhYmxlIGFkZF90ZXN0X3NpemUgICAtLS0gd2F0Y2hkb2cgc2hvdWxkID4xNXNcbiIpOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCgl1bnNpZ25lZCBpbnQgICBsYW5lX3N0ZXA9IDA7Cgl1bnNpZ25lZCBpbnQgICByZWdfdmFsdWU9IDA7CgkvL2ludCBhcmdjMjsKCS8vY2hhciAgICAgKiAgYXJndjJbMzBdOwoJY2hhciAqZW5kcDsKCWNoYXIgKmJ1ZjsKCWJ1Zj0iIjsKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoKCgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9CgoKCglpZiAoYXJnYyA+NCkgewoJCXdhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl3YXRjaGRvZ190aW1lX3M9IDIwOwoJCX0KCX0KCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoKCXVuc2lnbmVkIGludCAgIGxhbmVfZGlzYWJsZT0gMDsKCglpZiAoYXJnYyA+NSkgewoJCWxhbmVfZGlzYWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlsYW5lX2Rpc2FibGU9IDA7CgkJfQoJfQoJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PTB4JTA4eFxuIixsYW5lX2Rpc2FibGUpOwoKCXVuc2lnbmVkIGludCAgYWRkX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCWlmIChhcmdjID42KSB7CgkJYWRkX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlhZGRfdGVzdF9zaXplPSBkZHJfdGVzdF9zaXplOwoJCX0KCX0KCXByaW50ZigiYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGFkZF90ZXN0X3NpemUpOwoJLy9hcmdjMj01OwoJLy9mb3IoaSA9IDE7aTwoYXJnYyk7aSsrKQoJewoJCS8vYXJndjJbaS0xXT1hcmd2W2ldOwoJfQoKCS8vYXJndjJbMF09YXJndlsxXTsKCS8vYXJndjJbMV09YXJndlsyXTsKCS8vYXJndjJbMl09YXJndlszXTsKCS8vI2luY2x1ZGUgPHN0ZGlvLmg+CgkvLyAgIHVuc2lnbmVkIGludCAgIHdyX2Fkal9wZXJbMjRdIDsKCS8vaWYoMSkKCglwcmludGYoIlxudGVzdCB1c2UgdWJvb3QgZW52XG4iKTsKCgljaGFyIHN0clsxMDI0XT0iIjsKCWNoYXIgc3RyX3RlbXAxWzEwMjRdPSIiOwoJY2hhciBzdHJfdGVtcDJbMTAyNF09IiI7Cgljb25zdCBjaGFyICpzOwoJdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5OwoJLy91bnNpZ25lZCBpbnQgKm51bV9hcnJ5X3RlbXA7Cgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUwPU5VTEw7Cgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUxPU5VTEw7Cgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUyPU5VTEw7Cgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUzPU5VTEw7CgljaGFyICpuYW1lX2xhbmUwOyAKCWNoYXIgKm5hbWVfbGFuZTE7IAoJY2hhciAqbmFtZV9sYW5lMjsgCgljaGFyICpuYW1lX2xhbmUzOyAKCW51bV9hcnJ5ID0gKHVuc2lnbmVkIGludCAqKSgmc3RyX3RvX251bWFycnkpOwoJaW50IGk7CgljaGFyICp2YXJuYW1lOyAgY2hhciAqZW52X2xjZGxyX3RlbXBfY291bnQ7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfdGVtcF9jb3VudD0wOwoJY29uc3QgY2hhciAqdGVtcF9zO2NvbnN0IGNoYXIgKnRlbXBfczE7CgkvLyBpbnQgdmFsdWU9MDsKCgl2YXJuYW1lPSJlbnZfZGRydGVzdF9kYXRhX2xhbmUiOwoJbmFtZV9sYW5lMD0iZGRyX3Rlc3RfZGF0YV9sYW5lMCI7CgluYW1lX2xhbmUxPSJkZHJfdGVzdF9kYXRhX2xhbmUxIjsKCW5hbWVfbGFuZTI9ImRkcl90ZXN0X2RhdGFfbGFuZTIiOwoJbmFtZV9sYW5lMz0iZGRyX3Rlc3RfZGF0YV9sYW5lMyI7CgllbnZfbGNkbHJfdGVtcF9jb3VudD0ibGNkbHJfdGVtcF9jb3VudCI7CglzID0gZ2V0ZW52KHZhcm5hbWUpOwoJaWYgKHMpCgl7Ly9pPTA7CgkJLy93aGlsZShzX3RlbXApCgkJewoJCQllbnZfdG9fbnVtKHZhcm5hbWUsbnVtX2FycnkpOy8vdW5zaWduZWQgaW50ICpudW1fYXJyeQoJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCWlmKHRlbXBfcykKCQkJewoJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJfQoJCQllbHNlCgkJCXtsY2Rscl90ZW1wX2NvdW50PTA7CgkJCX0KCgkJCWlmKDApewoJCQkJZW52X3RvX251bShuYW1lX2xhbmUwLG51bV9hcnJ5X2xhbmUwKTsvL3Vuc2lnbmVkIGludCAqbnVtX2FycnkKCQkJCWVudl90b19udW0obmFtZV9sYW5lMSxudW1fYXJyeV9sYW5lMSk7Ly91bnNpZ25lZCBpbnQgKm51bV9hcnJ5CgkJCQllbnZfdG9fbnVtKG5hbWVfbGFuZTIsbnVtX2FycnlfbGFuZTIpOy8vdW5zaWduZWQgaW50ICpudW1fYXJyeQoJCQkJZW52X3RvX251bShuYW1lX2xhbmUzLG51bV9hcnJ5X2xhbmUzKTsvL3Vuc2lnbmVkIGludCAqbnVtX2FycnkKCQkJfQoKCQkJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCgkJCQlwcmludGYoInN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeVtpXSk7CgkJCX0KCQkJLy9mb3IgKGxhbmVfc3RlcCA9IDA7bGFuZV9zdGVwPCA0O2xhbmVfc3RlcCsrKQoJCQlpZigwKQoJCQl7CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgoJCQkJCXByaW50ZigibGFuZV8wIHN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeV9sYW5lMFtpXSk7CgkJCQl9CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgoJCQkJCXByaW50ZigibGFuZV8xIHN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeV9sYW5lMVtpXSk7CgkJCQl9CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgoJCQkJCXByaW50ZigibGFuZV8yIHN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeV9sYW5lMltpXSk7CgkJCQl9CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgoJCQkJCXByaW50ZigibGFuZV8zIHN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeV9sYW5lM1tpXSk7CgkJCQl9CgkJCX0KCQkJLy8JcHJpbnRmKCIlcyxsZW50aD0lZCIscywoc3RybGVuKHMpKSk7CgkJCS8vc3NjYW5mKHMsImQlLCIsd3JfYWRqX3Blcik7CgkJCS8vc3ByaW50ZihzdHIsImQlIixzKTsKCQkJLy9nZXRjCgkJCS8vICAgICAgIGlmIChzdHJsZW4ocykgPiAxNikgCgkJCXsKCQkJCS8vICAgc3NjYW5mKHMsICIlMDh4LCAlMDh4LCAlMDh4LCBcbiIsCgkJCQkvLyAgICAgICAgICAmd3JfYWRqX3BlclswXSwgJndyX2Fkal9wZXJbMV0sICZ3cl9hZGpfcGVyWzJdKTsKCQkJfSAKCQl9Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJubyBlbnYgc2V0LGV4aXRcbiIpOwoJCXJldHVybiAwO30KCXMgPSBnZXRlbnYodmFybmFtZSk7Ly9mb3IgZGVidWcgZGlzcGxheSBlbnYgICBzaG91bGQgYWRkCgoKCS8vLyoKCS8vaWYoMSkKCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMF9jbWQwID0wOyAgLy9tYXN0ZXIgY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMV9jbWQxID0wOyAgLy9taW4gY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgbGFuZTAgdyBtaW4gIC0yIGxhbmUwIHcgbWF4IC0zIGxhbmUwIHIgbWluICAgIDQgbGFuZTAgciBtYXggLS0tLS01IGxhbmUxIHcgbWluIC4uLgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgkvLyAgdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJLy9jaGFyIHN0clsyNF07CgoKCXRlc3RfYXJnXzBfY21kMD1udW1fYXJyeVswXTsKCXRlc3RfYXJnXzFfY21kMT1udW1fYXJyeVsxXTsKCXRlc3RfYXJnXzJfc3RlcD1udW1fYXJyeVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyeVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycnlbNF07CglwcmludGYoInRlc3RfYXJnXzBfY21kMD09JWRcbiIsdGVzdF9hcmdfMF9jbWQwKTsKCXByaW50ZigidGVzdF9hcmdfMF9jbWQxPT0lZFxuIix0ZXN0X2FyZ18xX2NtZDEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ18yX3N0ZXA9PSVkXG4iLHRlc3RfYXJnXzJfc3RlcCk7CglwcmludGYoInRlc3RfYXJnXzNfZnJlcT09JWRcbiIsdGVzdF9hcmdfM19mcmVxKTsKCXByaW50ZigidGVzdF9hcmdfNF9zdGVwX3N0YXR1cz09JWRcbiIsdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyk7CgoJaWYodGVzdF9hcmdfMl9zdGVwKQoJewoJCWlmKHRlc3RfYXJnXzNfZnJlcSE9Z2xvYmFsX2Rkcl9jbGspCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgkJewoJCQl0ZXN0X2FyZ18wX2NtZDA9MHgyMjsKCQkJdGVzdF9hcmdfMV9jbWQxPTA7CgkJCXRlc3RfYXJnXzJfc3RlcD0xOwoJCQl0ZXN0X2FyZ18zX2ZyZXE9Z2xvYmFsX2Rkcl9jbGs7CgkJCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9MDsKCQkJbnVtX2FycnlbMF09dGVzdF9hcmdfMF9jbWQwOwoJCQludW1fYXJyeVsxXT10ZXN0X2FyZ18xX2NtZDE7CgkJCW51bV9hcnJ5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCQkJbnVtX2FycnlbM109dGVzdF9hcmdfM19mcmVxOwoJCQludW1fYXJyeVs0XT10ZXN0X2FyZ180X3N0ZXBfc3RhdHVzOwoJCQludW1fYXJyeVs1XT0wOwoJCQludW1fYXJyeVs2XT0wOwoJCQludW1fYXJyeVs3XT0wOwoJCQlmb3IgKGkgPSA4OyBpIDwgNDg7IGkrKykgewoJCQkJbnVtX2FycnlbaV09MDsKCQkJfQoKCQkJZm9yIChsYW5lX3N0ZXAgPSAwOyBsYW5lX3N0ZXAgPCA0OyBsYW5lX3N0ZXArKykKCQkJewoJCQkJLy9pZihsYW5lX3N0ZXAlMikKCQkJCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXT0oKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpKSYweGZmKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXT0oKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpKT4+OCkmMHhmZik7CiNlbHNlCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXT0oKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpKSYweDFmZik7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF09KCgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMy0KCQkJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjMpCgkJCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIzKSk+PjApJjB4MWZmKTsKCgkJCQkJcHJpbnRmKCJsY2RscjEgJWQgICUwOHgsJTA4eCwlMDh4XG4iLCBsYW5lX3N0ZXAsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKSwKCQkJCQkJCSgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJCQkJIEREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpJjB4MWZmKSxkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdKTsKCQkJCQlwcmludGYoImxjZGxyMyAlZCAgJTA4eCwlMDh4LCUwOHhcbiIsIGxhbmVfc3RlcCwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMy0KCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIzKQoJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjMpLAoJCQkJCQkJKCgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMy0KCQkJCQkJCQkJCQkJICBERFIwX1BVQl9EWDBMQ0RMUjMpCgkJCQkJCQkJCSArRERSMF9QVUJfRFgwTENETFIzKSk+PjApJjB4MWZmKSxkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXSk7CiNlbmRpZgoKCQkJCQkvL3ByaW50ZigibGNkbHIxICVkICAlMDh4XG4iLCBsYW5lX3N0ZXAsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJLy9ERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJLy8rRERSMF9QVUJfRFgwTENETFIxKSk7CgkJCQkJLy9wcmludGYoImxjZGxyMyAlZCAgJTA4eFxuIiwgbGFuZV9zdGVwLCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCS8vRERSMF9QVUJfRFgwTENETFIzKQoJCQkJCS8vK0REUjBfUFVCX0RYMExDRExSMykpOwoJCQkJCS8vZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF09MDsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXT0weGZmZmY7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF09MHhmZmZmOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCQl9CgkJCQkvL2Vsc2UKCQkJCXsKCQkJCQkvL2RxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF09MDsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdPTB4ZmZmZjsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdPTB4ZmZmZjsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCQl9CgkJCX0KCgkJCXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYT0oKHJlYWRsKEREUjBfUFVCX0FDTENETFIpKSZBQ0xDRExSX01BWCk7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E9MHhmZmZmOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hPTB4ZmZmZjsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0wOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYT0oKHJlYWRsKEREUjBfUFVCX0FDQkRMUjApKSZBQ0JETFJfTUFYKTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E9MHhmZmZmOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYT0weGZmZmY7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTA7CgkJCX0KCgoKI2lmIDEgLy8oIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQlwcmludGYoIkREUjBfUFVCX0RYMEdDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDBHQ1IwKSkpOwoJCQlwcmludGYoIkREUjBfUFVCX0RYMUdDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDFHQ1IwKSkpOwoJCQlwcmludGYoIkREUjBfUFVCX0RYMkdDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDJHQ1IwKSkpOwoJCQlwcmludGYoIkREUjBfUFVCX0RYM0dDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDNHQ1IwKSkpOwoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8MTsgICAgICAKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDFHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfCgxPDwxKTsgICAKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDJHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfCgxPDwyKTsgICAKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDNHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfCgxPDwzKTsgICAKCiNlbmRpZgoJCQlpZihsYW5lX2Rpc2FibGUpCgkJCXtpZihsYW5lX2Rpc2FibGUmMHgxKXsKCQkJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hWzBdPTQ7CgkJCQkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbMF09NDsKCQkJCQkJCQkgfQoJCQlpZihsYW5lX2Rpc2FibGUmMHgyKXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hWzFdPTQ7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbMV09NDsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHg0KXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hWzJdPTQ7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbMl09NDsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHg4KXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hWzNdPTQ7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbM109NDsKCQkJfQoJCQlwcmludGYoImxhbmVfZGlzYWJsZT09JXhcbiIsbGFuZV9kaXNhYmxlKTsKCQkJaWYobGFuZV9kaXNhYmxlJjB4MTApewoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTQ7CgkJCQlwcmludGYoImRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09JXhcbiIsZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hKTsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHgyMCl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTQ7CgkJCQlwcmludGYoImRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PSV4XG4iLGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2EpOwoKCQkJfQoJCQl9CgoJCQl7CgkJCQlmb3IgKGxhbmVfc3RlcCA9IDA7IGxhbmVfc3RlcCA8IDQ7IGxhbmVfc3RlcCsrKQoKCgkJCQl7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJfQoKCgoKCQkJCWxhbmVfc3RlcD00OwoJCQkJewoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E7CgkJCQl9CgkJCX0KCgkJCWlmKDApewoJCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCQkJCW51bV9hcnJ5X2xhbmUwW2ldPW51bV9hcnJ5WzgraV07CgkJCQl9CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJCQkJbnVtX2FycnlfbGFuZTFbaV09bnVtX2FycnlbOCs4K2ldOwoJCQkJfQoJCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCQkJCW51bV9hcnJ5X2xhbmUyW2ldPW51bV9hcnJ5WzgrOCs4K2ldOwoJCQkJfQoJCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCQkJCW51bV9hcnJ5X2xhbmUzW2ldPW51bV9hcnJ5WzgrOCs4KzgraV07CgkJCQl9CgkJCQludW1fdG9fZW52KG5hbWVfbGFuZTAsbnVtX2FycnlfbGFuZTApOwoJCQkJbnVtX3RvX2VudihuYW1lX2xhbmUxLG51bV9hcnJ5X2xhbmUxKTsKCQkJCW51bV90b19lbnYobmFtZV9sYW5lMixudW1fYXJyeV9sYW5lMik7CgkJCQludW1fdG9fZW52KG5hbWVfbGFuZTMsbnVtX2FycnlfbGFuZTMpOwoJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQl9CgoJCX0KCgoKCgkJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQl9CgoKCgl9CgoJdGVzdF9hcmdfMl9zdGVwKys7CgludW1fYXJyeVsyXT10ZXN0X2FyZ18yX3N0ZXA7CglzcHJpbnRmKHN0ciwgIjB4JTA4eCIsIG51bV9hcnJ5WzBdKTsKCXByaW50ZigiJWQgICVkXG4iLCAwLG51bV9hcnJ5WzBdKTsKCWZvciAoaSA9IDE7IGkgPCA0ODsgaSsrKSB7CgkJLy9udW1fYXJyeVtpXT0wOwoJCXNwcmludGYoc3RyLCAiJXM7MHglMDh4Iiwgc3RyLG51bV9hcnJ5W2ldKTsKCQlwcmludGYoIiVkICAlZFxuIiwgaSxudW1fYXJyeVtpXSk7CgoJfQoJLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKCXByaW50ZigiJXMiLCBzdHIpOwoJc2V0ZW52KHZhcm5hbWUsIHN0cik7CglydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoKCWk9MjsKCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CglydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJZm9yIChpID0gODsgaSA8IDQ4OyBpKyspIHsKCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJdGVtcF9zMT0gZ2V0ZW52KHN0cl90ZW1wMSk7CgkJaWYodGVtcF9zMSkKCQl7CgkJCW51bV9hcnJ5W2ldPSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfczEsICZlbmRwLCAwKTsKCQl9CgkJZWxzZQoJCXtudW1fYXJyeVtpXT0wOwoJCX0KCQlwcmludGYoImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQ9PSVkXG4iLGksbnVtX2FycnlbaV0pOwoJfQoKCS8vLyoKCXsKCQlmb3IgKGxhbmVfc3RlcCA9IDA7IGxhbmVfc3RlcCA8IDQ7IGxhbmVfc3RlcCsrKQoJCXsKCQkJewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM107CgkJCX0KCQkJewoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddOwoJCQl9CgoKCQl9CgkJbGFuZV9zdGVwPTQ7CgkJewoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XTsKCQl9Cgl9CgkvLyovCgoKCgoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCgkJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBkcXMgd2luZG93IGxhbmUgYVxuIik7CgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgoJCQkvKgoJCQkgICB7CgkJCSAgIGxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJICAgc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJICAgcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCSAgIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJICAgfQoJCQkgICAqLwoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTApCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTApKQoJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0xOwoJCQkJCXsKCQkJCQkJewoJCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMCksMik7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoKCQkJCX0KCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpCgkJCQl7CgkJCQkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCWlmKHRlbXBfcykKCQkJCQl7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJfQoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgkJCQl9CgoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXTsKCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCgkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQl7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzE7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJfQoKCgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09Mil8fAoJCQkJCShkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0zKSkKCQkJewoJCQkJLy8JaWYoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0pPT0weGZmZmYpCgkJCQkvLwkJe2RxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCS8vCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJLy8gICAgICAgICAgICAgcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCS8vCQl9CgoJCQkJewoJCQkJCWlmKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpCgkJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMiswKSwxKTsKCQkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCgkJCQkJfQoJCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpCgkJCQkJewoJCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCWlmKHRlbXBfcykKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQkJfQoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCQkJCQl9CgoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCQl7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCsyOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl9CgoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgoJCQl9CgoKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTApCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpCgkJCSAgKQoJCQl7CgkJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTB4ZmZmZikKCQkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTApKQoJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MTsKCQkJCQl7CgkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMik7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJCXsKCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJaWYodGVtcF9zKQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQl9CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs1OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCX0KCgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpfHwKCQkJCQkoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpKQoJCQl7CgoJCQkJewoJCQkJCWlmKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKQoJCQkJCXsJCgoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDEpOwoJCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCgkJCQkJfQoJCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0zKQoJCQkJCXsKCQkJCQkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlpZih0ZW1wX3MpCgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJCX0KCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCQkJCQl9CgoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCQkvLwludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoKCQkJCQl7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs2OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgkJCS8qCgkJCSAgIGlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKXx8CgkJCSAgIChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkpCgkJCSAgIHtkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkgICBzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMisxKSwyKTsKCQkJICAgcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTE7CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpfHwKCQkJKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKSkKCQkJe2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MzsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJKi8JCgoKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJe3ByaW50ZigiY2xvc2UgIHdhdGNoZG9nXG4iKTsKCQkJfQoKCgkJfQoKCgoJfQoKCWlmIChjaGFubmVsX2FfZW4pCgl7CgoJCS8vKihjaGFyICAgICAqKShhcmd2MlswXSk9ImEiOwoJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMTEgYSAwIDB4ODAwMDAgICIsMCk7CgkJcHJpbnRmKCJcbnRlc3QgbGNkbHIgYWMgYmRsciB3aW5kb3cgbGFuZSBhLi4uXG4iKTsKCgkJewoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUod2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix3YXRjaGRvZ190aW1lX3MpOwoJCQlwcmludGYoIlxuZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hICVkIFxuIixkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2EpOwoJCQlsYW5lX3N0ZXA9NDsKCQkJZW52X2xjZGxyX3RlbXBfY291bnQ9ImxjZGxyX3RlbXBfY291bnRfYSI7CgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E+PTB4ZmZmZikKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTApCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0xKQoJCQkgICkKCQkJewoJCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT49MHhmZmZmKQoJCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTApKQoJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTE7CgkJCQkJewoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCQlwcmludGYoImFjbGNkbHJfc3RhdHVzX2E9PTB4JTA4eFxuIixudW1fYXJyeVtpXSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4yMjJ0ZXN0IGxjZGxyIGFjIGJkbHIgd2luZG93IGxhbmUgYS4uLlxuIik7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl9CgoJCQkJCXByaW50ZigiXG4zMzN0ZXN0IGxjZGxyIGFjIGJkbHIgd2luZG93IGxhbmUgYS4uLlxuIik7CgkJCQkJLy9kZHJfdHVuZV9hY2xjZGxyX3N0ZXAKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHglMDh4ICVkICVkIixhZGRfdGVzdF9zaXplLCggMCksMik7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCXByaW50ZigiYWNsY2Rscl9zdGF0dXNfYTE9PTB4JTA4eFxuIixudW1fYXJyeVtpXSk7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTEpCgkJCQl7CgkJCQkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCWlmKHRlbXBfcykKCQkJCQl7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJfQoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E7CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hOwoJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCsxOwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCX0KCgoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09Mil8fAoJCQkJCShkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTMpKQoJCQl7CgkJCQkvLwlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSk9PTB4ZmZmZikKCQkJCS8vCQl7ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkJLy8JCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQkvLyAgICAgICAgICAgICBydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJLy8JCX0KCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0yKQoJCQkJCXsJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0zOwoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGFkZF90ZXN0X3NpemUsKCAwKSwxKTsKCQkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT00OwoKCQkJCQl9CgkJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0zKQoJCQkJCXsKCQkJCQkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlpZih0ZW1wX3MpCgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJCX0KCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT00OwoJCQkJCX0KCgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCQkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJCXsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzI7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTApCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTApKQoJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0xOwoJCQkJCXsKCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCQkJCQl7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl9CgoJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGFkZF90ZXN0X3NpemUsKCAxKSwyKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTI7CgoJCQkJfQoJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MSkKCQkJCXsKCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJaWYodGVtcF9zKQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQl9CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MjsKCQkJCX0KCgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hOwoJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCXsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrNTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQl9CgoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTIpfHwKCQkJCQkoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MykpCgkJCXsKCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MikKCQkJCQl7CQoKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0zOwoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsYWRkX3Rlc3Rfc2l6ZSwoIDEpLDEpOwoJCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT00OwoKCQkJCQl9CgkJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MykKCQkJCQl7CgkJCQkJCXRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJaWYodGVtcF9zKQoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCQl9CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E9bGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT00OwoJCQkJCX0KCgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2E7CgkJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E7CgkJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJCS8vCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgoJCQkJCXsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzY7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCQkJLyoKCQkJICAgaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpfHwKCQkJICAgKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKSkKCQkJICAge2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCSAgIHNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDIpOwoJCQkgICBwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSl8fAoJCQkoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpKQoJCQl7ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQkqLwkKCgoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQl7cHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJCQl9CgoKCQl9CgoKCgl9CgoJaWYgKGNoYW5uZWxfYl9lbikKCXsvLyooY2hhciAgICAgKikoYXJndjJbMF0pPSJiIjsKCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJCXByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgbGFuZSBiXG4iKTsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw4KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHglMDh4ICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoKCQl9Cgl9CgoJdW5zaWduZWQgaW50ICAgYWNtZGxyPSAwOwoJdW5zaWduZWQgaW50ICBkZWxheV9zdGVwX3gxMDA9IDA7CglpZiAoY2hhbm5lbF9hX2VuKQoJewoJCWFjbWRscj0oKHJlYWRsKChERFIwX1BVQl9BQ01ETFIpKSkmQUNMQ0RMUl9NQVgpOwoJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXSk7CgkJfQoJCXsKCQkJcHJpbnRmKCJcbmFjX2xhbmVfMHglMDh4fGxjZF9vcmcgMHglMDh4ICB8bGNkX21pbiAweCUwOHggfGxjZF9tYXggMHglMDh4IDo6fGJkbHJfb3JnICAweCUwOHggIHxiZGxyX21pbiAweCUwOHggfGJkbHJfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCTQsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYSxkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2EsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hLGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2EpOwoJCX0KCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCQl7CgkJCXByaW50ZigiXG4gYWNfbGFuZV8weDAwMDAwMDB8ICBsY2Rscl9vcmcgIHxsY2Rscl9zZXQgcHN8bGNkbHJfaG9sZCBwczp8XAoJCQkJCWNsa19zZXR1cCAgcHN8IGNsa19ob2xkIHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCQkJcHJpbnRmKCJcbiBhY19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EsCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hLWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EtZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2ErZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hKSk7CgkJCXByaW50ZigiXG4gY2tfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSwKCQkJCQkwLAoJCQkJCTAsCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYS1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2EtZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2ErZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSkpOwoJCX0KCQlwcmludGYoIlxuIGFfbGFuZV8weDAwMDAwMDAwfCB3cmRxX29yZyAweDB8d19zZXR1cCB4IHBzfHdfaG9sZCAgeCBwczo6fFwKCQkJCXJkX3NldHVwICBwc3xyZF9ob2xkIHggcHN8YWRqX3BlcmNlbnRbMTAwXVxuIik7CgoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0sCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0tZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMCwKCQkJCQkwLAoJCQkJCTEwMCooZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXStkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXSkpOwoKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJCTAsCgkJCQkJMCwKCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0tZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF0tZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXStkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSkvKAoJCQkJCQkyKmRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdKSk7CgoKCgkJfQoJfQoKCgoJaWYgKGNoYW5uZWxfYl9lbikKCXsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXs7CgkJfQoJfQoKCXJldHVybiByZWdfdmFsdWU7Cn0KCgpVX0JPT1RfQ01EKAoJZGRyX2Rxc193aW5kb3dfc3RlcCwJNiwJMSwJZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwLAoJIkREUiB0dW5lIGRxcyBmdW5jdGlvbiIsCgkiZGRyX2Rxc193aW5kb3dfc3RlcCBhIDAgMHg4MDAwMDAgMSBvciBkZHJfZHFzX3dpbmRvd19zdGVwIGIgMCAweDgwMDAwMCA1XG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKLy8vKgoKI2VuZGlmCgppbnQgZG9fZGRyMnBsbF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoJZXh0ZXJuIGludCBkb19kZHIycGxsX2cxMl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKCWRvX2RkcjJwbGxfZzEyX2NtZChjbWR0cCxmbGFnLGFyZ2MsIGFyZ3YpOwoJcmV0dXJuIDE7CiNlbmRpZgoKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9aUSAgICAgMAojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0FDX0JJVF9TRVRVUCAgICAgIDEKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9BQ19CSVRfSE9MRCAgICAgMgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfV1JJVEVfQklUX1NFVFVQICAgICAgMwojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfV1JJVEVfQklUX0hPTEQgICAgICA0CiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9SRUFEX0JJVF9TRVRVUCAgICAgIDUKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1JFQURfQklUX0hPTEQgICAgIDYKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1ZSRUYgICAgIDcKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9DTEtfSU5WRVRFUiAgICAgOAoKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9GVUxMVEVTVCAgICAgMHhmZmZmZmZmZgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCBwbGwsIHpxY3I7Cgl1bnNpZ25lZCBpbnQgenFwcl9zb2NfZHJhbT0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2NtZF9zb2NfdnJlZj0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9MDsvLzB4M2Y7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfY21kX3pxX3ZyZWY9MDsvLzB4M2Y7CgoKCXVuc2lnbmVkIGludCBkZHJfZnVsbF90ZXN0X2VuYWJsZT0wOwoJLyoKI2RlZmluZSBERFIzX0RSVl80ME9ITQkJMAojZGVmaW5lIEREUjNfRFJWXzM0T0hNCQkxCiNkZWZpbmUgRERSM19PRFRfME9ITQkJMAojZGVmaW5lIEREUjNfT0RUXzYwT0hNCQkxCiNkZWZpbmUgRERSM19PRFRfMTIwT0hNCQkyCiNkZWZpbmUgRERSM19PRFRfNDBPSE0JCTMKI2RlZmluZSBERFIzX09EVF8yME9ITQkJNAojZGVmaW5lIEREUjNfT0RUXzMwT0hNCQk1CgoJLy8gbHBkZHIyIGRydiBvZHQgCiNkZWZpbmUgTFBERFIyX0RSVl8zNE9ITQkxCiNkZWZpbmUgTFBERFIyX0RSVl80ME9ITQkyCiNkZWZpbmUgTFBERFIyX0RSVl80OE9ITQkzCiNkZWZpbmUgTFBERFIyX0RSVl82ME9ITQk0CiNkZWZpbmUgTFBERFIyX0RSVl84ME9ITQk2CiNkZWZpbmUgTFBERFIyX0RSVl8xMjBPSE0JNwojZGVmaW5lIExQRERSMl9PRFRfME9ITQkJMAoKCS8vIGxwZGRyMyBkcnYgb2R0IAojZGVmaW5lIExQRERSM19EUlZfMzRPSE0JMQojZGVmaW5lIExQRERSM19EUlZfNDBPSE0JMgojZGVmaW5lIExQRERSM19EUlZfNDhPSE0JMwojZGVmaW5lIExQRERSM19EUlZfNjBPSE0JNAojZGVmaW5lIExQRERSM19EUlZfODBPSE0JNgojZGVmaW5lIExQRERSM19EUlZfMzRfNDBPSE0JOQojZGVmaW5lIExQRERSM19EUlZfNDBfNDhPSE0JMTAKI2RlZmluZSBMUEREUjNfRFJWXzM0XzQ4T0hNCTExCiNkZWZpbmUgTFBERFIzX09EVF8wT0hNCQkwCiNkZWZpbmUgTFBERFIzX09EVF82ME9ITQkxCiNkZWZpbmUgTFBERFIzX09EVF8xMk9ITQkyCiNkZWZpbmUgTFBERFIzX09EVF8yNDBITQkzCgojZGVmaW5lIEREUjRfRFJWXzM0T0hNCQkwCiNkZWZpbmUgRERSNF9EUlZfNDhPSE0JCTEKI2RlZmluZSBERFI0X09EVF8wT0hNCQkwCiNkZWZpbmUgRERSNF9PRFRfNjBPSE0JCTEKI2RlZmluZSBERFI0X09EVF8xMjBPSE0JCTIKI2RlZmluZSBERFI0X09EVF80ME9ITQkJMwojZGVmaW5lIEREUjRfT0RUXzI0ME9ITQkJNAojZGVmaW5lIEREUjRfT0RUXzQ4T0hNCQk1CiNkZWZpbmUgRERSNF9PRFRfODBPSE0JCTYKI2RlZmluZSBERFI0X09EVF8zNE9ITQkJNwoqLwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9kcnZfb2R0CQkJCT0gMDsKCS8vdW5zaWduZWQgaW50IGRyYW1fZHJ2CQkJCT0gMDsKCS8vdW5zaWduZWQgaW50IGRyYW1fb2R0CQkJCT0gMDsKCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLwoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CgoJcGxsID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwwKTsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlwcmludGYgKCJFcnJvcjogV3JvbmcgZm9ybWF0IHBhcmFtZW50IVxuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoYXJnYyA+MikKCXsKCQl6cWNyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQl6cWNyID0gMDsKCQl9Cgl9CgllbHNlCgl7CgkJenFjciA9IDA7Cgl9CgoJaWYoenFjcj09MHhmZmZmZmZmZikKCXsKCQlkZHJfZnVsbF90ZXN0X2VuYWJsZT0xOwoJCXpxY3I9MDt9CgoJaWYgKGFyZ2MgPjMpCgl7CgkJLy8gc29jX2RhdGFfZHJ2X29kdD16cXByX3NvY19kcmFtJjB4ZmZmZmY7CgkJLy8gZHJhbV9kcnY9KHpxcHJfc29jX2RyYW0+PjIwKSYweGY7CgkJLy8gIGRyYW1fb2R0PSh6cXByX3NvY19kcmFtPj4yNCkmMHhmOwoJCS8vYml0MjggZW5hYmxlIHNvY196cXByICxiaXQgMjkgZW5hYmUgZHJhbV9kcnYgYml0IDMwIGVuYWJlbCBkcmFtX29kdAoJCXpxcHJfc29jX2RyYW0gPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXpxcHJfc29jX2RyYW0gPSAwOwoJCX0KCX0KCWVsc2UKCXsKCQl6cXByX3NvY19kcmFtID0gMDsKCX0KCglpZiAoYXJnYyA+NCkKCXsKCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7CgkJfQoJfQoJZWxzZQoJewoJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7Cgl9CglpZiAoYXJnYyA+NSkKCXsKCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmID0gMDsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgc29jX2RyYW1faGV4X2RlYz0wOwoJaWYgKGFyZ2MgPjYpCgl7CgkJc29jX2RyYW1faGV4X2RlYyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc29jX2RyYW1faGV4X2RlYyA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjcpCgl7CgkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWRkcl90ZXN0X2NtZF96cV92cmVmID0gMDsKCQl9Cgl9CgoKCgl1bnNpZ25lZCBpbnQgc29jX2RyYW1fZHJ2X29kdF91c2VfdmxhdWU9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfZHJ2PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2FjX29kdD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydj0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdD0wOwoJdW5zaWduZWQgaW50IGRyYW1fZHJ2PTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9vZHQ9MDsKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9kcnZfb2R0X2Fkal9lbmFibGU9MDsKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfZHJ2X2Fkal9lbmFibGU9MDsKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfb2R0X2Fkal9lbmFibGU9MDsKCgl1bnNpZ25lZCBpbnQgenEwcHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCXVuc2lnbmVkIGludCB6cTFwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlExUFIpOwoJdW5zaWduZWQgaW50IHB1Yl9kY3I9IHJkX3JlZyhERFIwX1BVQl9EQ1IpOwojZGVmaW5lIEREUl9UWVBFX0xQRERSMiAgMAojZGVmaW5lIEREUl9UWVBFX0xQRERSMyAgMQojZGVmaW5lIEREUl9UWVBFX0REUjMgIDMKI2RlZmluZSBERFJfVFlQRV9ERFI0ICA0Cgl1bnNpZ25lZCBpbnQgZGRyX3R5cGU9IHB1Yl9kY3ImMHg3OyAvLzAgLWxwZGRyMiAgfCAgMS0gbHBkZHIzICB8ICAgMi0gcmV2ICB8ICAzIC1kZHIzICAgfCA0LSBkZHI0CgkvLwl1bnNpZ25lZCBpbnQgenEycHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMlBSKTsKCWlmIChhcmdjID44KQoJewoJCXNvY19kcmFtX2Rydl9vZHRfdXNlX3ZsYXVlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzhdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzb2NfZHJhbV9kcnZfb2R0X3VzZV92bGF1ZSA9IDA7CgkJfQoJfQoJaWYoc29jX2RyYW1fZHJ2X29kdF91c2VfdmxhdWUpCgl7aWYoenFjcikKCQl7cHJpbnRmKCJ6cWNyWzB4JTA4eF0sXG4iLCB6cWNyKTsKCQkJewoJCQkJc29jX2FjX2Rydj16cWNyJTEwMDsKCQkJCWlmKHNvY19hY19kcnY+MTAwKQoJCQkJe3NvY19hY19kcnY9MDt9CgkJCQlpZihzb2NfYWNfZHJ2PT0wKQoJCQkJe3NvY19hY19kcnY9MTt9CgkJCQlzb2NfYWNfZHJ2PSg0ODAvc29jX2FjX2RydiktMTsKCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJCXsKCQkJCQlpZihzb2NfYWNfZHJ2PjB4ZikKCQkJCQl7c29jX2FjX2Rydj16cTBwcl9vcmcmMHhmO30KCQkJCX0KCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCWlmKHNvY19hY19kcnY+MHhmKQoJCQkJCXtzb2NfYWNfZHJ2PSh6cTBwcl9vcmc+PjgpJjB4Zjt9CgkJCQl9CgkJCX0KCgoJCQl7CgkJCQlzb2NfYWNfb2R0PXpxY3IvMTAwOwoJCQkJaWYoc29jX2FjX29kdD4yNDApCgkJCQl7c29jX2FjX29kdD00ODA7fQoJCQkJaWYoc29jX2FjX29kdD09MCkKCQkJCXtzb2NfYWNfb2R0PTE7fQoKCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJCXsKCQkJCQlzb2NfYWNfb2R0PSgzNjAvc29jX2FjX29kdCktMTsKCQkJCQlpZihzb2NfYWNfb2R0PjB4ZikKCQkJCQl7c29jX2FjX29kdD0oenEwcHJfb3JnPj40KSYweGY7fQoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJc29jX2FjX29kdD0oNDgwL3NvY19hY19vZHQpLTE7CgkJCQkJaWYoc29jX2FjX29kdD4weGYpCgkJCQkJe3NvY19hY19vZHQ9KHpxMHByX29yZz4+MTYpJjB4Zjt9CgkJCQl9CgkJCX0KCgkJCXpxY3I9KHNvY19hY19vZHQ8PDE2KXwoc29jX2FjX2Rydjw8MTIpfChzb2NfYWNfZHJ2PDw4KXwoc29jX2FjX29kdDw8NCl8KHNvY19hY19kcnYpOwoJCQlwcmludGYoInpxY3JbMHglMDh4XSxzb2NfYWNfb2R0IFsweCUwOHhdLHNvY19hY19kcnYgWzB4JTA4eF1cbiIsIHpxY3Isc29jX2FjX29kdCxzb2NfYWNfZHJ2KTsKCQl9CgkJaWYoenFwcl9zb2NfZHJhbSkKCQl7cHJpbnRmKCJ6cXByX3NvY19kcmFtWzB4JTA4eF0sXG4iLCB6cXByX3NvY19kcmFtKTsKCQkJewoJCQkJc29jX2RhdGFfZHJ2PXpxcHJfc29jX2RyYW0lMTAwOwoJCQkJcHJpbnRmKCJzb2NfZGF0YV9kcnZbJWRdLFxuIiwgc29jX2RhdGFfZHJ2KTsKCQkJCWlmKHNvY19kYXRhX2Rydj4xMDApCgkJCQl7c29jX2RhdGFfZHJ2PTA7CgoJCQkJfQoJCQkJaWYoc29jX2RhdGFfZHJ2PT0wKQoJCQkJe3NvY19kYXRhX2Rydj0xOwoJCQkJCS8vc29jX2RhdGFfZHJ2X29kdF9hZGpfZW5hYmxlPTA7CgkJCQl9CgkJCQllbHNlCgkJCQl7Ly9zb2NfZGF0YV9kcnZfb2R0X2Fkal9lbmFibGU9MTsKCQkJCX0KCQkJCXNvY19kYXRhX2Rydj0oNDgwL3NvY19kYXRhX2RydiktMTsKCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJCXsKCQkJCQlpZihzb2NfZGF0YV9kcnY+MHhmKQoJCQkJCXtzb2NfZGF0YV9kcnY9enExcHJfb3JnJjB4Zjt9CgkJCQl9CgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlpZihzb2NfZGF0YV9kcnY+MHhmKQoJCQkJCXtzb2NfZGF0YV9kcnY9KHpxMXByX29yZz4+OCkmMHhmO30KCQkJCX0KCQkJfQoKCgkJCXsKCQkJCXNvY19kYXRhX29kdD0oenFwcl9zb2NfZHJhbS8xMDApJTEwMDA7CgkJCQlwcmludGYoInNvY19kYXRhX29kdFslZF0sXG4iLCBzb2NfZGF0YV9vZHQpOwoJCQkJaWYoc29jX2RhdGFfb2R0PjI0MCkKCQkJCXtzb2NfZGF0YV9vZHQ9MzYwO30KCQkJCWlmKHNvY19kYXRhX29kdD09MCkKCQkJCXtzb2NfZGF0YV9vZHQ9MTt9CgoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCXNvY19kYXRhX29kdD0oMzYwL3NvY19kYXRhX29kdCktMTsKCQkJCQlpZihzb2NfZGF0YV9vZHQ+MHhmKQoJCQkJCXtzb2NfZGF0YV9vZHQ9KHpxMXByX29yZz4+NCkmMHhmO30KCQkJCX0KCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCXNvY19kYXRhX29kdD0oNDgwL3NvY19kYXRhX29kdCktMTsKCQkJCQlpZihzb2NfZGF0YV9vZHQ+MHhmKQoJCQkJCXtzb2NfZGF0YV9vZHQ9KHpxMXByX29yZz4+MTYpJjB4Zjt9CgkJCQl9CgoJCQl9CgoJCQlzb2NfZGF0YV9kcnZfb2R0X2Fkal9lbmFibGU9MTsKCgkJCXsKCQkJCWRyYW1fZHJ2PSh6cXByX3NvY19kcmFtLzEwMDAwMCklMTAwOwoJCQkJcHJpbnRmKCJkcmFtX2RydlslZF0sXG4iLCBkcmFtX2Rydik7CgoJCQkJaWYoZHJhbV9kcnY+MTAwKQoJCQkJe2RyYW1fZHJ2PTA7fQoJCQkJaWYoZHJhbV9kcnY9PTApCgkJCQl7CgkJCQkJZHJhbV9kYXRhX2Rydl9hZGpfZW5hYmxlPTA7fQoJCQkJZWxzZQoJCQkJe2RyYW1fZGF0YV9kcnZfYWRqX2VuYWJsZT0xOwoJCQkJfQoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKGRyYW1fZHJ2Pj00MCkKCQkJCQl7ZHJhbV9kcnY9MDt9CgoJCQkJCWVsc2UKCQkJCQl7ZHJhbV9kcnY9MTsKCQkJCQl9CgkJCQl9CgoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCWlmKGRyYW1fZHJ2PDQ4KQoJCQkJCXtkcmFtX2Rydj0wO30KCgkJCQkJZWxzZQoJCQkJCXtkcmFtX2Rydj0xOwoJCQkJCX0KCQkJCX0KCQkJfQoKCgkJCXsKCQkJCWRyYW1fb2R0PSh6cXByX3NvY19kcmFtLzEwMDAwMCkvMTAwOwoJCQkJcHJpbnRmKCJkcmFtX29kdFslZF0sXG4iLCBkcmFtX29kdCk7CgkJCQlpZihkcmFtX29kdD4yNDApCgkJCQl7ZHJhbV9vZHQ9NDgwO30KCQkJCWlmKGRyYW1fb2R0PT0wKQoJCQkJewoJCQkJCWRyYW1fZGF0YV9vZHRfYWRqX2VuYWJsZT0wOwoJCQkJfQoJCQkJZWxzZQoJCQkJe2RyYW1fZGF0YV9vZHRfYWRqX2VuYWJsZT0xOwoJCQkJfQoKCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJCXsKCQkJCQlpZihkcmFtX29kdD4xNjApCgkJCQkJe2RyYW1fb2R0PTA7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjkwKQoJCQkJCXtkcmFtX29kdD0yO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD41MCkKCQkJCQl7ZHJhbV9vZHQ9MTt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MzUpCgkJCQkJe2RyYW1fb2R0PTM7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjI1KQoJCQkJCXtkcmFtX29kdD01O30KCQkJCQllbHNlIGlmIChkcmFtX29kdDw9MjUpCgkJCQkJe2RyYW1fb2R0PTQ7fQoKCQkJCX0KCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCWlmKGRyYW1fb2R0PjI4MCkKCQkJCQl7ZHJhbV9vZHQ9MDt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MTgwKQoJCQkJCXtkcmFtX29kdD00O30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4xMDApCgkJCQkJe2RyYW1fb2R0PTI7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjcwKQoJCQkJCXtkcmFtX29kdD02O30KCQkJCQllbHNlIGlmIChkcmFtX29kdD41NCkKCQkJCQl7ZHJhbV9vZHQ9MTt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+NDQpCgkJCQkJe2RyYW1fb2R0PTU7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjM3KQoJCQkJCXtkcmFtX29kdD0zO30KCQkJCQllbHNlIGlmIChkcmFtX29kdDw9MzQpCgkJCQkJe2RyYW1fb2R0PTc7fQoKCQkJCX0KCgoKCQkJfQoKCQkJenFwcl9zb2NfZHJhbT0oZHJhbV9kYXRhX29kdF9hZGpfZW5hYmxlPDwzMCl8KGRyYW1fZGF0YV9kcnZfYWRqX2VuYWJsZTw8MjkpfChzb2NfZGF0YV9kcnZfb2R0X2Fkal9lbmFibGU8PDI4KXwKCQkJCShkcmFtX29kdDw8MjQpfChkcmFtX2Rydjw8MjApfChzb2NfZGF0YV9vZHQ8PDE2KXwoc29jX2RhdGFfZHJ2PDwxMil8KHNvY19kYXRhX2Rydjw8OCl8KHNvY19kYXRhX29kdDw8NCl8KHNvY19kYXRhX2Rydik7CgkJfQoJfQoKCglpZiAoc29jX2RyYW1faGV4X2RlYykKCXsKCQlpZiAoYXJnYyA+NCkKCQl7CgkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWYgPSAwOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7CgkJfQoJCWlmIChhcmdjID41KQoJCXsKCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmID0gMDsKCQkJfQoJCX0KCQlpZiAoYXJnYyA+NykKCQl7CgkJCWRkcl90ZXN0X2NtZF96cV92cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJCWRkcl90ZXN0X2NtZF96cV92cmVmID0gMDsKCQkJfQoJCX0KCQlpZiAoZGRyX3Rlc3RfY21kX3NvY192cmVmKQoJCXsKCQkJaWYgKGRkcl90ZXN0X2NtZF9zb2NfdnJlZjw0NSkKCQkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZj00NTsKCQkJaWYgKGRkcl90ZXN0X2NtZF9zb2NfdnJlZj44OCkKCQkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZj04ODsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmPShkZHJfdGVzdF9jbWRfc29jX3ZyZWYqMTAwLTQ0MDcpLzcwOwoJCX0KCgkJaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYpCgkJewoJCQlpZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZjw0NSkKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9NDU7CgkJCWlmIChkZHJfdGVzdF9jbWRfZHJhbV92cmVmPjkyKQoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj05MjsKCQkJaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY+NjApIHsKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9KGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYqMTAwLTYwMDApLzY1OwoJCQl9CgkJCWVsc2V7CgkJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmPSgoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZioxMDAtNDUwMCkvNjUpfCgxPDw2KTsKCQkJfQoJCX0KCgoJCXByaW50ZigiXG5TZXQgZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiBbMHglMDh4XVxuIixkZHJfdGVzdF9jbWRfZHJhbV92cmVmKTsKCQlpZiAoZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPT0gMCkKCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWY9MDsKCQlpZiAoZGRyX3Rlc3RfY21kX3pxX3ZyZWYpIHsKCQkJaWYgKGRkcl90ZXN0X2NtZF96cV92cmVmPDQ1KQoJCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWY9NDU7CgkJCWlmIChkZHJfdGVzdF9jbWRfenFfdnJlZj44OCkKCQkJCWRkcl90ZXN0X2NtZF96cV92cmVmPTg4OwoJCQlkZHJfdGVzdF9jbWRfenFfdnJlZj0oZGRyX3Rlc3RfY21kX3pxX3ZyZWYqMTAwLTQ0MDcpLzcwOwoJCX0KCX0KCgkvL2lmKGRkcl90ZXN0X2NtZF90eXBlPT1ERFJfVEVTVF9DTURfVEVTVF9BQ19CSVRfSE9MRCkKCS8ve2lmIChkZHJfdGVzdF9jbWRfY2xrX3NlZWQgPT0wKQoJLy9kZHJfdGVzdF9jbWRfY2xrX3NlZWQgPSAweDNmOwoJLy9pZiAoZGRyX3Rlc3RfY21kX2FjYmRsX3hfc2VlZCA9PTApCgkvL2Rkcl90ZXN0X2NtZF9hY2JkbF94X3NlZWQgPSAweDNmOwoJLy99CgojaWYgZGVmaW5lZChDT05GSUdfTTZUVikgfHwgZGVmaW5lZChDT05GSUdfTTZUVkQpCgl3cml0ZWwoenFjciB8ICgweDNjIDw8IDI0KSwgUFJFR19TVElDS1lfUkVHMCk7CiNlbHNlCgl3cml0ZWwoenFjciB8ICgweGYxMyA8PCAyMCksIFBSRUdfU1RJQ0tZX1JFRzApOwojZW5kaWYKI2lmICggQ09ORklHX0REUl9QSFk+PVBfRERSX1BIWV85MDVYKQoJd3JpdGVsKChkZHJfdGVzdF9jbWRfenFfdnJlZjw8MjQpfChkZHJfdGVzdF9jbWRfc29jX3ZyZWY8PDgpfGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgLCBQUkVHX1NUSUNLWV9SRUc5KTsKCXdyaXRlbCgoenFwcl9zb2NfZHJhbTw8MCkgLCBQUkVHX1NUSUNLWV9SRUc4KTsKCXNvY19kYXRhX2Rydl9vZHQ9enFwcl9zb2NfZHJhbSYweGZmZmZmOwoJZHJhbV9kcnY9KHpxcHJfc29jX2RyYW0+PjIwKSYweGY7CglkcmFtX29kdD0oenFwcl9zb2NfZHJhbT4+MjQpJjB4ZjsKCXByaW50Zigic2V0dGluZyB6cXByX3NvY19kcmFtIFsweCUwOHhdLC4uYml0MjggZW5hYmxlIHNvY196cXByICwgICBiaXQgMjkgZW5hYmUgZHJhbV9kcnYsICAgYml0IDMwIGVuYWJlbCBkcmFtX29kdFxuIiwgenFwcl9zb2NfZHJhbSk7CglwcmludGYoInNvY19kYXRhX2Rydl9vZHQgWzB4JTA4eF0sZHJhbV9kcnYgWzB4JTA4eF0sZHJhbV9vZHQgWzB4JTA4eF1cbiIsIHNvY19kYXRhX2Rydl9vZHQsZHJhbV9kcnYsZHJhbV9vZHQpOwoJaWYoZGRyX2Z1bGxfdGVzdF9lbmFibGUpCgl7CgkJcGxsPShkZHJfZnVsbF90ZXN0X2VuYWJsZTw8MjEpfHBsbDsKCQlwcmludGYoImRkcl9mdWxsX3Rlc3RfZW5hYmxlICUwOHgsc2V0IHN0aWNreSByZWcxIGJpdCAyMSAxXG4iLCBkZHJfZnVsbF90ZXN0X2VuYWJsZSk7Cgl9CgojZW5kaWYKCgoJd3JpdGVsKHBsbCwgUFJFR19TVElDS1lfUkVHMSk7CgoJcHJpbnRmKCJTZXQgcGxsIGRvbmUgWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzEpKTsKCXByaW50ZigiU2V0IFNUSUNLWV9SRUcwIFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUcwKSk7CiNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKCXByaW50ZigiU2V0IFNUSUNLWV9SRUc5IFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUc5KSk7CglwcmludGYoIlNldCBTVElDS1lfUkVHOCBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHOCkpOwoKI2VuZGlmCglwcmludGYoIlxuYmVnaW4gcmVzZXQgMTExLi4uLi4uLi4uLi5cbiIpOwoJcHJpbnRmKCJcbmJlZ2luIHJlc2V0IDIuLi4uLi4uLi4uLlxuIik7CglwcmludGYoIlxuYmVnaW4gcmVzZXQgMy4uLi4uLi4uLi4uXG4iKTsKCiNpZmRlZiBDT05GSUdfTThCCglwcmludGYoIiB0MSBcbiIpOwoJd3JpdGVsKDB4ZjA4MDAwMCB8IDIwMDAsIFdBVENIRE9HX1RDKTsKI2Vsc2UKCXByaW50ZigiIHQyIFxuIik7CgkvLyAgd3JpdGVsKFdBVENIRE9HX1RDLCAweGY0MDAwMDAgfCAyMDAwKTsKCS8vICpQX1dBVENIRE9HX1JFU0VUID0gMDsKCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwojZW5kaWYKCXdoaWxlKDEpOwoJcmV0dXJuIDA7Cgp1c2FnZToKCglwcmludGYoIiBkZHJfdGVzdF9jbWQgMHgxNyBjbGsgenFfYWMgenFfc29jX2RyYW0gc29jX3ZyZWYgZHJhbV92cmVmIGRlY19oZXggenFfdnJlZiAwXG4iKTsKCXByaW50ZigiZXhhbXBsZSBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCA1MCA4MSAxIDUwIFxuIik7CglwcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCAweDA5IDB4MjAgMCA1MCBcbiIpOwoJcHJpbnRmKCJvciAgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCA2MDM0IDA2MDM0MDYwMzQgMCAwIDAgMCAxIFxuIik7CglwcmludGYoInNldHRpbmcgenFwcl9zb2NfZHJhbSAsLi5iaXQyOCBlbmFibGUgc29jX3pxcHIgLCAgIGJpdCAyOSBlbmFiZSBkcmFtX2RydiwgICBiaXQgMzAgZW5hYmVsIGRyYW1fb2R0XG4iKTsKCXByaW50Zigic2V0dGluZyB6cXByX3NvY19kcmFtICxiaXQwLWJpdDE5ICBzb2NfZGF0YV9kcnZfb2R0LGJpdDIwLWJpdDI0ICBkcmFtX2RydiAsICBiaXQyNC1iaXQyOCAgZHJhbV9vZHRcbiIpOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gLGJpdDAtYml0MTkgYml0IDAtNyB1c2UgZm9yIGRkcjOjrGJpdDgtMTkgdXNlIGZvciBkZHI0LG9kdF9kb3duX3VwXG4iKTsKCXByaW50Zigic2V0dGluZyB6cXByX3NvY19kcmFtICxzb2NfZHJ2PSg0ODAvKChzZXR0aW5nKSsxKSk7ZGRyNC0tLXNvY19vZHQ9KDQ4MC8oc2V0dGluZykrMSkpO2RkcjMtLS1zb2Nfb2R0PSgzNjAvKHNldHRpbmcpKzEpKTtcbiIpOwoKCXByaW50ZigiIEREUjNfRFJWXzQwT0hNCQkwXG4iKTsKCXByaW50ZigiIEREUjNfRFJWXzM0T0hNCQkxXG5cbiIpOwoKCXByaW50ZigiIEREUjNfT0RUXzBPSE0JCTBcbiIpOwoJcHJpbnRmKCIgRERSM19PRFRfNjBPSE0JCTFcbiIpOwoJcHJpbnRmKCIgRERSM19PRFRfMTIwT0hNCTJcbiIpOwoJcHJpbnRmKCIgRERSM19PRFRfNDBPSE0JCTNcbiIpOwoJcHJpbnRmKCIgRERSM19PRFRfMjBPSE0JCTRcbiIpOwoJcHJpbnRmKCIgRERSM19PRFRfMzBPSE0JCTVcblxuXG4iKTsKCglwcmludGYoIiBMUEREUjJfRFJWXzM0T0hNCTFcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl80ME9ITQkyXG4iKTsKCXByaW50ZigiIExQRERSMl9EUlZfNDhPSE0JM1xuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzYwT0hNCTRcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl84ME9ITQk2XG4iKTsKCXByaW50ZigiIExQRERSMl9EUlZfMTIwT0hNCTdcblxuIik7CgoJcHJpbnRmKCIgTFBERFIyX09EVF8wT0hNCTBcblxuXG4iKTsKCgoJcHJpbnRmKCIgTFBERFIzX0RSVl8zNE9ITQkxXG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfNDBPSE0JMlxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzQ4T0hNCTNcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl82ME9ITQk0XG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfODBPSE0JNlxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzM0XzQwT0hNCTlcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl80MF80OE9ITQkxMFxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzM0XzQ4T0hNCTExXG5cbiIpOwoKCXByaW50ZigiIExQRERSM19PRFRfME9ITQkJMFxuIik7CglwcmludGYoIiBMUEREUjNfT0RUXzYwT0hNCTFcbiIpOwoJcHJpbnRmKCIgTFBERFIzX09EVF8xMk9ITQkyXG4iKTsKCXByaW50ZigiIExQRERSM19PRFRfMjQwSE0JM1xuXG5cbiIpOwoKCXByaW50ZigiIEREUjRfRFJWXzM0T0hNCQkwXG4iKTsKCXByaW50ZigiIEREUjRfRFJWXzQ4T0hNCQkxXG5cbiIpOwoKCXByaW50ZigiIEREUjRfT0RUXzBPSE0JCTBcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfNjBPSE0JCTFcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfMTIwT0hNCQkyXG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzQwT0hNCQkzXG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzI0ME9ITQkJNFxuIik7CglwcmludGYoIiBERFI0X09EVF80OE9ITQkJNVxuIik7CglwcmludGYoIiBERFI0X09EVF84ME9ITQkJNlxuIik7CglwcmludGYoIiBERFI0X09EVF8zNE9ITQkJN1xuXG5cblxuIik7CgoKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQoKaW50IGRvX2Rkcl91Ym9vdF9uZXdfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy9kZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSBjbWRfb2Zmc2V0IGNtZF92YWx1ZSB2YWx1ZV9zaXplIHJlc2V0X2VuYWJsZQojaWYgMQoJLy8jZGVmaW5lIEREUl9VU0VfREVGSU5FX1RFTVBMQVRFX0NPTkZJRyAgIDEKCS8vI2RlZmluZSBERFJfU1RJQ0tZX01BR0lDX05VTUJFUgkJCQkJMHgyMDE4MDAwMAoJLy8jZGVmaW5lIEREUl9DSElQX0lECQkJCQkJCQkweDMwCgkvLyNkZWZpbmUgRERSX1NUSUNLWV9TT1VSQ0VfRE1DX1NUSUNLWQkJCTB4MQoJLy8jZGVmaW5lIEREUl9TVElDS1lfU09VUkNFX1NSQU0JCQkJCTB4MgoJLy9kbWMgc3RpY2t5IHJlZyBkZWZhdWx0IG5vdCAwLiBuZWVkIHVzZSBjb21tb24gc3RpY2t5IHJlZyBhcyBpZGVudGl0eQoKI2lmIDAKCXVuc2lnbmVkIGludCBkZHJfcGxsID0gcmRfcmVnKEFNX0REUl9QTExfQ05UTDApOwoJZXh0ZXJuIGludCBwbGxfY29udmVydF90b19kZHJfY2xrX2cxMmEodW5zaWduZWQgaW50KTsKCWdsb2JhbF9kZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYShkZHJfcGxsKTsKI2VuZGlmCiNkZWZpbmUgRERSX1NUSUNLWV9PVkVSUklERV9DT05GSUdfTUVTU0FHRV9DTUQJMHgxIC8vb3ZlcnJpZGUgY29uZmlnCiNkZWZpbmUgRERSX1NUSUNLWV9TUEVDSUFMX0ZVTkNUSU9OX0NNRAkJCTB4MiAvL3NwZWNpYWwgdGVzdCBzdWNoIGFzIHNoaWZ0IHNvbWUgYmRsciBvciBwYXJhbWV0ZXIgb3IgaW50ZXJsZWF2ZSB0ZXN0CgojZGVmaW5lIEcxMl9ETUNfU1RJQ0tZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODgwMCkKCXVpbnQzMl90IG1hZ2ljX2NoaXBpZD0gMDsvL3JkX3JlZyhQX1BSRUdfU1RJQ0tZX1JFRzApOwoJdWludDMyX3Qgc3RpY2t5X2NtZCA9IDA7Ly9yZF9yZWcoUF9QUkVHX1NUSUNLWV9SRUcxKTsKCXVpbnQzMl90IGNtZF9vZmZzZXQgPSAwOwoJdWludDMyX3QgY21kX3ZhbHVlID0gMDsKCXVpbnQzMl90IHJlc2V0X2VuYWJsZSA9IDA7Cgl1aW50MzJfdCB2YWx1ZV9zaXplID0gNDsKCWNoYXIgKmVuZHA7CgkvL2JpdCAwIHRyaWdnZXIgZWZmZWN0IHJlc2V0LgoJaWYgKChtYWdpY19jaGlwaWQpICE9ICgoRERSX1NUSUNLWV9NQUdJQ19OVU1CRVIrRERSX0NISVBfSUQpJjB4ZmZmZjAwMDApKSB7CgkJLy9tYWdpYyBudW1iZXIgbm90IG1hdGNoCgkJLy8JbWFnaWNfY2hpcGlkPUREUl9TVElDS1lfTUFHSUNfTlVNQkVSK0REUl9DSElQX0lEOwoJCS8vCXN0aWNreV9jbWQ9RERSX1NUSUNLWV9PVkVSUklERV9DT05GSUdfTUVTU0FHRV9DTUQ7CgkJcHJpbnRmKCJzdGlja3kwIG1hZ2ljIG5vdCBtYXRjaFxuIik7CgoJfQoKCgkvLwl3cl9yZWcoUF9QUkVHX1NUSUNLWV9SRUcwLCAwKTsKCS8vCXdyX3JlZyhQX1BSRUdfU1RJQ0tZX1JFRzEsIDApOwoKCgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCgoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CgoJbWFnaWNfY2hpcGlkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwwKTsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlwcmludGYgKCJFcnJvcjogV3JvbmcgZm9ybWF0IHBhcmFtZW50IVxuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoYXJnYyA+MikKCXsKCQlzdGlja3lfY21kID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja3lfY21kID0gMDsKCQl9Cgl9CgoJaWYgKGFyZ2MgPjMpCgl7CgkJY21kX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJY21kX29mZnNldCA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjQpCgl7CgkJY21kX3ZhbHVlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWNtZF92YWx1ZSA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjUpCgl7CgkJdmFsdWVfc2l6ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQl2YWx1ZV9zaXplID0gNDsKCQl9Cgl9CglpZiAoYXJnYyA+NikKCXsKCQlyZXNldF9lbmFibGU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJcmVzZXRfZW5hYmxlID0gMDsKCQl9Cgl9CglwcmludGYoImNtZF9vZmZzZXRbMHglMDh4fT09Y21kX3ZhbHVlIFsweCUwOHhdXG4iLCBjbWRfb2Zmc2V0LGNtZF92YWx1ZSk7Cgl3cml0ZWwoKG1hZ2ljX2NoaXBpZCYweGZmZmYwMDAwKXwocmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzApKSwgUFJFR19TVElDS1lfUkVHMCk7Cgl3cml0ZWwoc3RpY2t5X2NtZCwgUFJFR19TVElDS1lfUkVHMSk7CgoJdWludDMyX3QgcmVhZF92YWx1ZSA9IDA7CglpZih2YWx1ZV9zaXplKQoJewoJCXJlYWRfdmFsdWU9cmRfcmVnKEcxMl9ETUNfU1RJQ0tZXzArKChjbWRfb2Zmc2V0LzQpPDwyKSk7CgkJaWYodmFsdWVfc2l6ZT09MSl7CgkJCXdyX3JlZygoRzEyX0RNQ19TVElDS1lfMCsoKGNtZF9vZmZzZXQvNCk8PDIpKSwgKChjbWRfdmFsdWU8PCgoY21kX29mZnNldCU0KSo4KSl8KHJlYWRfdmFsdWUmKH4oMHhmZjw8KChjbWRfb2Zmc2V0JTQpKjgpKSkpKSk7CgkJfQoJCWlmKHZhbHVlX3NpemU9PTIpewoJCQl3cl9yZWcoKEcxMl9ETUNfU1RJQ0tZXzArKChjbWRfb2Zmc2V0LzQpPDwyKSksICgoY21kX3ZhbHVlPDwoKGNtZF9vZmZzZXQlNCkqOCkpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8KChjbWRfb2Zmc2V0JTQpKjgpKSkpKSk7CgkJfQoJCWlmKHZhbHVlX3NpemU9PTQpewoJCQkvLwl3cl9yZWcoKEcxMl9ETUNfU1RJQ0tZXzArY21kX29mZnNldC80KSwgKChjbWRfdmFsdWU8PCgoY21kX29mZnNldCU0KSo4KSl8KHJlYWRfdmFsdWUmKH4oMHhmZmZmPDwoKGNtZF9vZmZzZXQlNCkqOCkpKSkpKTsKCQkJd3JfcmVnKChHMTJfRE1DX1NUSUNLWV8wKygoY21kX29mZnNldC80KTw8MikpLCBjbWRfdmFsdWUpOwoJCX0KCgoKCgkJcHJpbnRmKCJETUNfU1RJQ0tZXzBfIG9mZnNldFsweCUwOHh9PT0gWzB4JTA4eF1cbiIsIGNtZF9vZmZzZXQscmVhZGwoKEcxMl9ETUNfU1RJQ0tZXzArKChjbWRfb2Zmc2V0LzQpPDwyKSkpKTsKCX0KCgoJcHJpbnRmKCJQUkVHX1NUSUNLWV9SRUcwPT0gWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzApKTsKCglpZihyZXNldF9lbmFibGUpCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfcmVzZXRfc3lzdGVtKCk7CgoJCXdoaWxlKDEpOwoJfQoJcmV0dXJuIDA7Cgp1c2FnZToKCgoKCgoJY21kX3VzYWdlKGNtZHRwKTsKCiNlbmRpZgoJcmV0dXJuIDE7Cn0KCgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQojZWxzZQppbnQgZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIHRlc3QgZGRyIGFjIGJpdCB3aW5kb3cgIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCXVuc2lnbmVkIGludCAgIGRkbF8xMDBzdGVwX3BzPSAwOwoKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnQ9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZVs0MF07CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9hY19zZXR1cF9ob2xkPTA7CgkvL3Vuc2lnbmVkIGludCAgIHRlc3Rpbmdfc2VlZD0wOwoJLy8gdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2FjYmRsPTA7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgoKCXVuc2lnbmVkIGludCAgIGFjYmRscjBfcmVnX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX2hvbGRfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX2hvbGRfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfc2V0dXBfbWF4PTA7CgkvLyAgICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfc2V0dXBfbWF4PTA7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdD0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0PTA7CgoKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj0wOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCS8vICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgoKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCXsKCQlpZiAoYXJnYyA9PSAyKQoJCXsKCQkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQkJfQoJCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlnb3RvIHVzYWdlOwoJCQl9CgkJfQoJCWlmIChhcmdjID4gMikKCQl7CgkJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQkJfQoJCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQkJfQoJCX0KCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCWlmIChhcmdjID4zKSB7CgkJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJCX0KCgkJfQoJCWlmIChhcmdjID40KSB7CgkJCXRlc3RfYWNfc2V0dXBfaG9sZCA9IDA7CgkJCXRlc3RfYWNfc2V0dXBfaG9sZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9hY19zZXR1cF9ob2xkID0gMDsKCQkJfQoJCQlpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCQl7CgkJCQl0ZXN0X2FjX3NldHVwX2hvbGQgPSAwOwoJCQl9CgkJfQoJCWlmICh0ZXN0X2FjX3NldHVwX2hvbGQgPjEpCgkJCXRlc3RfYWNfc2V0dXBfaG9sZCA9IDI7CgkJaWYgKGFyZ2MgPjUpIHsKCgkJCXRlc3RfYWNiZGw9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9hY2JkbCA9IDA7CgkJCX0KCQkJaWYgKHRlc3RfYWNiZGw+MzkpCgkJCQl0ZXN0X2FjYmRsID0xMjsvL2RlZmF1bHQgdGVzdCBjczAgcGluCgkJfQoJfQoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9hY19zZXR1cF9ob2xkPT0gMHglMDh4XG4iLCB0ZXN0X2FjX3NldHVwX2hvbGQpOwoJcHJpbnRmKCJcbnRlc3RfYWNiZGw9PSAweCUwOHhcbiIsIHRlc3RfYWNiZGwpOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCQl7CgoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQlwcmludGYoIlxuc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCXdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCXByaW50ZigiXG4gcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoKCgkJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEwKTsodGVtcF9jb3VudCsrKSkKCQkJCXsKCQkJCQlhY2JkbHIwXzlfcmVnX29yZ1t0ZW1wX2NvdW50XT0ocmVhZGwoRERSMF9QVUJfQUNCRExSMCsodGVtcF9jb3VudDw8MikrcmVnX2Jhc2VfYWRqKSk7CgoJCQkJfTsKCgoJCQkJewoJCQkJCWRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKTsKCQkJCQlwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSwKCQkJCQkJCSgoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpKTsKCgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkajsKCQkJCQlhY2JkbHIwX3JlZ19vcmc9cmVhZGwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCWFjYmRscl94X3JlZ19vcmc9cmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCXByaW50ZigiXG50ZXN0X2FjYmRsICUwOHggfCBhY19zZXR1cF9ob2xkPT0weCUwOHhcbiAiLHRlc3RfYWNiZGwsdGVzdF9hY19zZXR1cF9ob2xkKTsKCQkJCQlwcmludGYoIlxuYWNiZGxyMF9yZWdfMHglMDh4X29yZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWdfMHglMDh4X29yZz09MHglMDh4XG4gIiwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopLAoJCQkJCQkJYWNiZGxyMF9yZWdfb3JnLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaiksYWNiZGxyX3hfcmVnX29yZyk7CgkJCQkJaWYgKHRlc3RfYWNfc2V0dXBfaG9sZCA9PSAwKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbnRlc3RfYWNfc2V0dXBcbiAiKTsKCgoJCQkJCQkvL3dyaXRlbCgwLChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCgoJCQkJCQkvL3t3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpLCgodGVzdF9hY2JkbC80KSo0K0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCS8vfQoKCgoJCQkJCQlyZWdfYWRkPSgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCWFjYmRscl94X3JlZ19vcmc9cmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKTsKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8QUNCRExSX01BWCkKCQkJCQkJewoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQ9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix2YWx1ZT09MHglMDh4IixyZWdfYWRkLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCSgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpKTsKCgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoKCQkJCQkJCX0KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0ICxyZWc9PTB4JTA4eFxuIiwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCQkJCQkJcHJpbnRmKCJcbiBvcmc9PTB4JTA4eCxyaWdodCBlZGdlPT0weCUwOHgsdmFsdWU9PTB4JTA4eFxuICIsKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpOwoKCQkJCQkJe2FjYmRscl94X3JlZ19zZXR1cF9tYXg9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTt9CgoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgkJCQkJCS8vd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoJCQkJCQl3cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSkscmVnX2FkZCk7CgkJCQkJCS8vdGVzdF9hY19zZXR1cF9ob2xkPTE7CgkJCQkJCXsKCQkJCQkJCXByaW50ZigiXG50ZXN0X2FjYmRsICUwOHggfCBhY19zZXR1cF9ob2xkPT0weCUwOHggYWNtZGxyPT0weCUwOHggIGRkbF8xMDBzdGVwX3BzPT0lMDhkXG4iLHRlc3RfYWNiZGwsdGVzdF9hY19zZXR1cF9ob2xkLAoJCQkJCQkJCQlyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaiksZGRsXzEwMHN0ZXBfcHMpOwoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjBfcmVnX29yZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGFjYmRscjBfcmVnX29yZyxhY2JkbHJfeF9yZWdfb3JnKTsKCQkJCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX3NldHVwX21heCAweCUwOHggIFwKCQkJCQkJCQkJc2V0dXAgdGltZT09MHglMDh4LCAlMDhkIHBzIFxuICIsCgkJCQkJCQkJCWFjYmRscl94X3JlZ19zZXR1cF9tYXgsKGFjYmRscl94X3JlZ19zZXR1cF9tYXgtCgkJCQkJCQkJCQkoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZikpLCgoYWNiZGxyX3hfcmVnX3NldHVwX21heC0KCQkJCQkJCQkJCQkoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZikpICpkZGxfMTAwc3RlcF9wcykvMTAwCgkJCQkJCQkJICApOwoJCQkJCQkJYWNiZGxyMF85X3JlZ19zZXR1cF9tYXhbdGVzdF9hY2JkbF09KGFjYmRscl94X3JlZ19zZXR1cF9tYXgtCgkJCQkJCQkJCSgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKSk7CgkJCQkJCQlhY2JkbHIwXzlfcmVnX3NldHVwX3RpbWVbdGVzdF9hY2JkbF09KChhY2JkbHJfeF9yZWdfc2V0dXBfbWF4LQoJCQkJCQkJCQkJKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMDsKCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTApOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJewoJCQkJCQkJCXdyaXRlbCgoKGFjYmRscjBfOV9yZWdfb3JnW3RlbXBfY291bnRdKSksKEREUjBfUFVCX0FDQkRMUjArKHRlbXBfY291bnQ8PDIpK3JlZ19iYXNlX2FkaikpOwoKCQkJCQkJCX07CgoJCQkJCQl9CgoJCQkJCX0KCgkJCQkJaWYgKHRlc3RfYWNfc2V0dXBfaG9sZCA9PSAxKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbnRlc3RfYWNfaG9sZCAxXG4gIik7CgkJCQkJCWFjYmRscjBfcmVnX29yZz1yZWFkbChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCWFjYmRscl94X3JlZ19vcmc9cmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCQlwcmludGYoIlxudGVzdF9hY2JkbCAlMDh4IHwgYWNfc2V0dXBfaG9sZD09MHglMDh4XG4gIix0ZXN0X2FjYmRsLHRlc3RfYWNfc2V0dXBfaG9sZCk7CgkJCQkJCXByaW50ZigiXG5hY2JkbHIwX3JlZ19vcmc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnX29yZz09MHglMDh4XG4gIixhY2JkbHIwX3JlZ19vcmcsYWNiZGxyX3hfcmVnX29yZyk7CgoKCQkJCQkJcHJpbnRmKCJcbmFjYmRscjBfcmVnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZz09MHglMDh4XG4gIiwKCQkJCQkJCQlyZWFkbChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikscmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCgkJCQkJCXJlZ19hZGQ9KCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpOwoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCXByaW50ZigiXG4gcmVnPT0weCUwOHgsIGxlZnQgdGVtcD09MHglMDh4XG4gLHZhbHVlPT0weCUwOHggIixyZWdfYWRkLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCSgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpKTsKCgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoKCQkJCQkJCX0KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuIGxlZnQgZWRnZSBkZXRlY3QgLHJlZz09MHglMDh4XG4iLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoJCQkJCQlwcmludGYoIlxuIG9yZz09MHglMDh4LGxlZnQgZWRnZT09MHglMDh4XG4gIiwoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJCQl7YWNiZGxyX3hfcmVnX2hvbGRfbWluPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7fQoKCgkJCQkJCS8vdGVzdF9hY19zZXR1cF9ob2xkPTE7CgkJCQkJCS8vd3JpdGVsKGFjYmRscjBfcmVnX29yZywoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCQkJCQkJd3JpdGVsKGFjYmRscl94X3JlZ19vcmcsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCS8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoJCQkJCQkvLyB3cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7CgkJCQkJCXsKCgoJCQkJCQkJcHJpbnRmKCJcbnRlc3RfYWNiZGwgJTA4eCB8IGFjX3NldHVwX2hvbGQ9PTB4JTA4eCBhY21kbHI9PTB4JTA4eCAgZGRsXzEwMHN0ZXBfcHM9PSUwOGRcbiIsdGVzdF9hY2JkbCx0ZXN0X2FjX3NldHVwX2hvbGQsCgkJCQkJCQkJCXJlYWRsKEREUjBfUFVCX0FDTURMUjArcmVnX2Jhc2VfYWRqKSxkZGxfMTAwc3RlcF9wcyk7CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMF9yZWdfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnLGFjYmRscl94X3JlZ19vcmcpOwoJCQkJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfaG9sZF9taW49PTB4JTA4eCBcCgkJCQkJCQkJCWhvbGR1cCB0aW1lPT0weCUwOHgsICUwOGQgcHNcbiAiLAoJCQkJCQkJCQlhY2JkbHJfeF9yZWdfaG9sZF9taW4sCgkJCQkJCQkJCSgoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiktYWNiZGxyX3hfcmVnX2hvbGRfbWluKSwKCQkJCQkJCQkJKCgoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiktYWNiZGxyX3hfcmVnX2hvbGRfbWluKSpkZGxfMTAwc3RlcF9wcykvMTAwKTsKCgkJCQkJCX0KCQkJCQkJYWNiZGxyMF85X3JlZ19ob2xkX21heFt0ZXN0X2FjYmRsXT0oKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpLWFjYmRscl94X3JlZ19ob2xkX21pbik7CgkJCQkJCWFjYmRscjBfOV9yZWdfaG9sZF90aW1lW3Rlc3RfYWNiZGxdPSgoKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpLWFjYmRscl94X3JlZ19ob2xkX21pbikqZGRsXzEwMHN0ZXBfcHMpLzEwMDsKCgkJCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTApOyh0ZW1wX2NvdW50KyspKQoJCQkJCQl7CgkJCQkJCQl3cml0ZWwoKChhY2JkbHIwXzlfcmVnX29yZ1t0ZW1wX2NvdW50XSkpLChERFIwX1BVQl9BQ0JETFIwKyh0ZW1wX2NvdW50PDwyKStyZWdfYmFzZV9hZGopKTsKCgkJCQkJCX07CgoJCQkJCX0KCgkJCQkJaWYgKHRlc3RfYWNfc2V0dXBfaG9sZCA9PSAyKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbnRlc3RfYWNfaG9sZCAyIG1ldGhvZFxuICIpOwoJCQkJCQlhY2JkbHIwX3JlZ19vcmc9cmVhZGwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCQlhY2JkbHJfeF9yZWdfb3JnPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJcHJpbnRmKCJcbnRlc3RfYWNiZGwgJTA4eCB8IGFjX3NldHVwX2hvbGQ9PTB4JTA4eFxuICIsdGVzdF9hY2JkbCx0ZXN0X2FjX3NldHVwX2hvbGQpOwoJCQkJCQlwcmludGYoIlxuYWNiZGxyMF9yZWdfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnLGFjYmRscl94X3JlZ19vcmcpOwoKCgkJCQkJCXByaW50ZigiXG5hY2JkbHIwX3JlZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWc9PTB4JTA4eFxuICIsCgkJCQkJCQkJcmVhZGwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopLHJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgoJCQkJCQlyZWdfYWRkPSgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCS8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCS8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZik7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KHJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSYweGZmKTsKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8MHgzZikKCQkJCQkJewoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQlwcmludGYoIlxuIHJlZz09MHglMDh4LCByaWdodCB0ZW1wPT0weCUwOHgsdmFsdWU9PTB4JTA4eFxuICIsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJCQkJCQkJCQkoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWV8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCgxNikpCgkJCQkJCQkJCSAgfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMjQpKSkmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChhY2JkbHJfeF9yZWdfb3JnJigoMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpKTsKCQkJCQkJCS8qCgkJCQkJCQkgICB7CgkJCQkJCQkgICBmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEwKTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCSAgIHsKCQkJCQkJCSAgIHdyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDE2KSkKCQkJCQkJCSAgIHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDI0KSkpLChERFIwX1BVQl9BQ0JETFIwKyh0ZW1wX2NvdW50PDwyKStyZWdfYmFzZV9hZGopKTsKCQkJCQkJCSAgIH07CgoJCQkJCQkJICAgd3JpdGVsKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDE2KSkKCQkJCQkJCSAgIHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDI0KSkpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoYWNiZGxyX3hfcmVnX29yZyYoKDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKSwKCQkJCQkJCSAgICgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoKCQkJCQkJCSAgIH0KCQkJCQkJCSAgICovCgoJCQkJCQkJewoJCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8NDApOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJCXtpZih0ZW1wX2NvdW50PT0odGVzdF9hY2JkbCkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgocmVhZGwoRERSMF9QVUJfQUNCRExSMCsoKCh0ZW1wX2NvdW50KT4+Mik8PDIpKwoJCQkJCQkJCQkJCQkJCXJlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmY7CgkJCQkJCQkJCX1lbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgoKHJlYWRsKEREUjBfUFVCX0FDQkRMUjArKCgodGVtcF9jb3VudCk+PjIpPDwyKSsKCQkJCQkJCQkJCQkJCQkJcmVnX2Jhc2VfYWRqKSk+Pig4Kih0ZW1wX2NvdW50JTQpKSkmMHhmZikrMTsKCQkJCQkJCQkJfQoJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPkFDQkRMUl9NQVgpPyhBQ0JETFJfTUFYKToodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0pKTsKCgkJCQkJCQkJfTsKCQkJCQkJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDQwKTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCQl7CgkJCQkJCQkJCXdyaXRlbCgoKCh0ZW1wX3JlZ192YWx1ZVsodGVtcF9jb3VudCldKXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMV0pPDwoOCkpfCgoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMl0pPDwoMTYpKSkKCQkJCQkJCQkJCQkJCXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrM10pPDwoMjQpKSkpLAoJCQkJCQkJCQkJCShERFIwX1BVQl9BQ0JETFIwKygoKHRlbXBfY291bnQpPj4yKTw8MikrCgkJCQkJCQkJCQkJIHJlZ19iYXNlX2FkaikpOwoJCQkJCQkJCQl0ZW1wX2NvdW50PXRlbXBfY291bnQrMzsKCQkJCQkJCQl9OwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2JkbHJfY2s9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbixja192YWx1ZT09MHglMDh4IiwoRERSMF9QVUJfQUNCRExSMCsKCQkJCQkJCQkJCQlyZWdfYmFzZV9hZGopLChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKSwKCQkJCQkJCQkJCShyZWFkbChERFIwX1BVQl9BQ0JETFIwKwoJCQkJCQkJCQkJCSAgIHJlZ19iYXNlX2FkaikpKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19iZGxyX3g9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix4X3ZhbHVlPT0weCUwOHgiLChERFIwX1BVQl9BQ0JETFIwKygoKHRlc3RfYWNiZGwpPj4yKTw8MikrCgkJCQkJCQkJCQkJcmVnX2Jhc2VfYWRqKSwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSksCgkJCQkJCQkJCQkocmVhZGwoRERSMF9QVUJfQUNCRExSMCsoKCh0ZXN0X2FjYmRsKT4+Mik8PDIpKwoJCQkJCQkJCQkJCSAgIHJlZ19iYXNlX2FkaikpKTsKCgkJCQkJCQl9CgoKCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlIGRldGVjdCAscmVnPT0weCUwOHhcbiIsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCXByaW50ZigiXG5vcmc9PTB4JTA4eCwgcmlnaHQgZWRnZT09MHglMDh4XG4gIixhY2JkbHIwX3JlZ19vcmcmMHhmZixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCQkJCXthY2JkbHJfeF9yZWdfaG9sZF9taW49ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTt9CgoKCQkJCQkJLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoKCQkJCQkJewoKCgkJCQkJCQlwcmludGYoIlxudGVzdF9hY2JkbCAlMDh4IHwgYWNfc2V0dXBfaG9sZD09MHglMDh4IGFjbWRscj09MHglMDh4ICBkZGxfMTAwc3RlcF9wcz09JTA4ZFxuIix0ZXN0X2FjYmRsLHRlc3RfYWNfc2V0dXBfaG9sZCwKCQkJCQkJCQkJcmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopLGRkbF8xMDBzdGVwX3BzKTsKCQkJCQkJCXByaW50ZigiXG5hY2JkbHIwX3JlZ19vcmc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnX29yZz09MHglMDh4XG4gIixhY2JkbHIwX3JlZ19vcmcsYWNiZGxyX3hfcmVnX29yZyk7CgkJCQkJCQlwcmludGYoImFjYmRscl94X3JlZ19ob2xkX21heD09MHglMDh4IFwKCQkJCQkJCQkJaG9sZHVwIHRpbWU9PTB4JTA4eCwgJTA4ZCBwc1xuICIsCgkJCQkJCQkJCWFjYmRscl94X3JlZ19ob2xkX21pbiwKCQkJCQkJCQkJKChhY2JkbHJfeF9yZWdfaG9sZF9taW4tKGFjYmRscjBfcmVnX29yZyYweGZmKSkpLCgoYWNiZGxyX3hfcmVnX2hvbGRfbWluLShhY2JkbHIwX3JlZ19vcmcmMHhmZikpKmRkbF8xMDBzdGVwX3BzKS8xMDApOwoKCQkJCQkJfQoJCQkJCQlhY2JkbHIwXzlfcmVnX2hvbGRfbWF4W3Rlc3RfYWNiZGxdPSgoYWNiZGxyX3hfcmVnX2hvbGRfbWluLShhY2JkbHIwX3JlZ19vcmcmMHhmZikpKTsKCQkJCQkJYWNiZGxyMF85X3JlZ19ob2xkX3RpbWVbdGVzdF9hY2JkbF09KChhY2JkbHJfeF9yZWdfaG9sZF9taW4tKGFjYmRscjBfcmVnX29yZyYweGZmKSkqZGRsXzEwMHN0ZXBfcHMpLzEwMDsKCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwxMCk7KHRlbXBfY291bnQrKykpCgkJCQkJCXsKCQkJCQkJCXdyaXRlbCgoKGFjYmRscjBfOV9yZWdfb3JnW3RlbXBfY291bnRdKSksKEREUjBfUFVCX0FDQkRMUjArKHRlbXBfY291bnQ8PDIpK3JlZ19iYXNlX2FkaikpOwoKCQkJCQkJfTsKCgkJCQkJfQoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gIGRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKTsKCgoKCQlwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZFxuIiwgZGRsXzEwMHN0ZXBfcHMsKCgxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkpOwoKCQlwcmludGYoIlxucmVzdW1lICBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSkmKH4oMTw8MjkpKSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCXByaW50ZigiXG4gcmVzdW1lIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCgkJcmV0dXJuIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgp1c2FnZToKCQljbWRfdXNhZ2UoY21kdHApOwoJCXJldHVybiAxOwoKCX0KfQoKVV9CT09UX0NNRCgKCWRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdywJNiwJMSwJZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93LAoJIkREUiB0ZXN0IGFjIGJpdCBtYXJnaW4gZnVuY3Rpb24iLAoJImRvX2Rkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyBhIDAgMHg4MDAwMDAwIDAgYyBvciBkb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAyIGMgIFxuIGRjYWNoZSBvZmYgPyBcbiIKCS8vZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgc2V0dXAvaG9sZCBwaW5faWQgLy9jIC0tLSBjcyAsLDggLS0tIGJhMAopOwoKaW50IGRvX2Rkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8vKgoJcHJpbnRmKCJcbkVudGVyIHRlc3QgZGRyIGRhdGEgYml0IHdpbmRvdyAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJdW5zaWduZWQgaW50ICAgZGRsXzEwMHN0ZXBfcHM9IDA7CgoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoJdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudD0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9kYXRhX3NldHVwX2hvbGQ9MDsKCS8vdW5zaWduZWQgaW50ICAgdGVzdGluZ19zZWVkPTA7CgkvLyB1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgb3Blbl92dD0wOwoJdW5zaWduZWQgaW50ICB0ZXN0X2JkbD0wOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iZGxyY2s9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iZGxyX3g9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoKCgl1bnNpZ25lZCBpbnQgICBiZGxyY2tfcmVnX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19vcmc9MDsKCS8vICAgdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19ob2xkX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19ob2xkX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19zZXR1cF9tYXg9MDsKCXVuc2lnbmVkIGludCAgIGJkbHJfeF9yZWdfaG9sZF9tYXg9MDsKCS8vICAgIHVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19zZXR1cF9tYXg9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0PTA7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHQ9MDsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPTA7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoJdW5zaWduZWQgaW50ICAgdGVtcF9yZWdfdmFsdWVbMjRdOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJLy8gICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCgoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoJewoJCWlmIChhcmdjID09IDIpCgkJewoJCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2FfZW4gPSAxOwoJCQl9CgkJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWdvdG8gdXNhZ2U7CgkJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKCQkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2FfZW4gPSAxOwoJCQl9CgkJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2JfZW4gPSAxOwoJCQl9CgkJfQoJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJaWYgKGFyZ2MgPjMpIHsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQkJfQoKCQl9CgkJaWYgKGFyZ2MgPjQpIHsKCQkJdGVzdF9kYXRhX3NldHVwX2hvbGQgPSAwOwoJCQl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kYXRhX3NldHVwX2hvbGQgPSAwOwoJCQl9CgkJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJCXsKCQkJCXRlc3RfZGF0YV9zZXR1cF9ob2xkID0gMDsKCQkJfQoJCX0KCQlpZiAodGVzdF9kYXRhX3NldHVwX2hvbGQgPjEpCgkJCXRlc3RfZGF0YV9zZXR1cF9ob2xkID0gMTsKCQlpZiAoYXJnYyA+NSkgewoKCQkJdGVzdF9iZGw9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2JkbCA9IDA7CgkJCX0KCQkJaWYgKHRlc3RfYmRsPjk2KQoJCQkJdGVzdF9iZGwgPTA7CgkJfQoJCWlmIChhcmdjID42KSB7CgoJCQlvcGVuX3Z0PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJb3Blbl92dCA9IDA7CgkJCX0KCQkJLy9pZihvcGVuX3Z0KQoJCQkvLwkgb3Blbl92dCA9MTsKCQl9Cgl9CglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2RhdGFfc2V0dXBfaG9sZD09IDB4JTA4eFxuIiwgdGVzdF9kYXRhX3NldHVwX2hvbGQpOwoJcHJpbnRmKCJcbnRlc3RfYmRsPT0gMHglMDh4XG4iLCB0ZXN0X2JkbCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKCQl7CgoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgoJCQkJcHJpbnRmKCJcbnNob3VsZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQl3cml0ZWwoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKXwoMTw8MjkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQlwcmludGYoIlxuIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MjgpOyh0ZW1wX2NvdW50KyspKQoJCQkJewoJCQkJCS8vZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF09KCgocmVhZGwoKCh0ZW1wX2NvdW50Pj4yKTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC82KStyZWdfYmFzZV9hZGopKQoJCQkJCS8vCT4+KDgqKHRlc3RfYmRsJTQpKSkmMHhmZik7CgkJCQkJZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF09KChyZWFkbCgoKHRlbXBfY291bnQlNyk8PDIpK0REUjBfUFVCX0RYMEJETFIwKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlbXBfY291bnQvNykrcmVnX2Jhc2VfYWRqKSkKCQkJCQkJCSk7CgkJCQl9OwoKCgkJCQl7CgkJCQkJZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKTsKCQkJCQlwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSwKCQkJCQkJCSgoKChyZWFkbChERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKSk7CgoJCQkJCS8vcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7CgkJCQkJcmVnX2JkbHJjaz0oKCgodGVzdF9iZGwlMjQpPjExKT8oRERSMF9QVUJfRFgwQkRMUjUpOihERFIwX1BVQl9EWDBCRExSMikpKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwoJCQkJCXJlZ19iZGxyX3g9IChERFIwX1BVQl9EWDBCRExSMCsoKCgodGVzdF9iZGwlMjQpPj4yKTw8MikpKwoJCQkJCQkJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2Fkaik7CgkJCQkJaWYgKCh0ZXN0X2JkbCUyNCk+MTEpCgkJCQkJe3JlZ19iZGxyX3g9cmVnX2JkbHJfeCs0Oy8vZHhuYmRscjM0NSByZWdpc3RlciBhZGQgaGF2ZSBhIGdhcCB3aXRoIGR4bmJkbHIwMTIKCQkJCQl9CgkJCQkJYmRscmNrX3JlZ19vcmc9cmVhZGwocmVnX2JkbHJjaykgIDsKCQkJCQliZGxyX3hfcmVnX29yZz1yZWFkbChyZWdfYmRscl94KTsKCQkJCQlwcmludGYoIlxudGVzdF9iZGwgJTA4eCB8IGRhdGFfc2V0dXBfaG9sZD09MHglMDh4XG4gIix0ZXN0X2JkbCx0ZXN0X2RhdGFfc2V0dXBfaG9sZCk7CgkJCQkJcHJpbnRmKCJcbmJkbHIwX3JlZ18weCUwOHhfb3JnPT0weCUwOHggIHwgIGJkbHJfeF9yZWdfMHglMDh4X29yZz09MHglMDh4XG4gIixyZWdfYmRscmNrLAoJCQkJCQkJYmRscmNrX3JlZ19vcmcscmVnX2JkbHJfeCxiZGxyX3hfcmVnX29yZyk7CgkJCQkJaWYgKHRlc3RfZGF0YV9zZXR1cF9ob2xkID09IDApCgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdF9kYXRhX3NldHVwXG4gIik7CgoKCgkJCQkJCXJlZ19iZGxyY2s9KCgoKHRlc3RfYmRsJTI0KT4xMSk/KEREUjBfUFVCX0RYMEJETFI1KTooRERSMF9QVUJfRFgwQkRMUjIpKSsoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKTsKCQkJCQkJcmVnX2JkbHJfeD0gKEREUjBfUFVCX0RYMEJETFIwKygoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSkrCgkJCQkJCQkJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2Fkaik7CgkJCQkJCWlmICgodGVzdF9iZGwlMjQpPjExKQoJCQkJCQl7cmVnX2JkbHJfeD1yZWdfYmRscl94KzQ7Ly9keG5iZGxyMzQ1IHJlZ2lzdGVyIGFkZCBoYXZlIGEgZ2FwIHdpdGggZHhuYmRscjAxMgoJCQkJCQl9CgkJCQkJCWJkbHJja19yZWdfb3JnPXJlYWRsKHJlZ19iZGxyY2spICA7CgkJCQkJCWJkbHJfeF9yZWdfb3JnPXJlYWRsKHJlZ19iZGxyX3gpOwoKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKTsKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8QUNCRExSX01BWCkKCQkJCQkJewoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQlwcmludGYoIlxuIHJlZ19iZGxyX3g9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix2YWx1ZT09MHglMDh4IixyZWdfYmRscl94LGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCSgoYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2JkbCU0KSkpKTsKCgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKCgoYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2JkbCU0KSkpLHJlZ19iZGxyX3gpOwoKCQkJCQkJCX0KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0ICxyZWc9PTB4JTA4eFxuIiwocmVnX2JkbHJfeCkpOwoJCQkJCQlwcmludGYoIlxuIG9yZz09MHglMDh4LHJpZ2h0IGVkZ2U9PTB4JTA4eCx2YWx1ZT09MHglMDh4XG4gIiwoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJCQkJCQkJCSgoYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2JkbCU0KSkpKTsKCgkJCQkJCXtiZGxyX3hfcmVnX3NldHVwX21heD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCQkJCQkJLy93cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7CgkJCQkJCXdyaXRlbCgoKGJkbHJfeF9yZWdfb3JnKSkscmVnX2JkbHJfeCk7CgkJCQkJCS8vdGVzdF9hY19zZXR1cF9ob2xkPTE7CgkJCQkJCXsKCQkJCQkJCXByaW50ZigiXG50ZXN0X2JkbCAlMDh4IHwgZGF0YV9zZXR1cF9ob2xkPT0weCUwOHggbWRscj09MHglMDh4ICBkZGxfMTAwc3RlcF9wcz09JTA4ZFxuIix0ZXN0X2JkbCx0ZXN0X2RhdGFfc2V0dXBfaG9sZCwKCQkJCQkJCQkJcmVhZGwoRERSMF9QVUJfRFgwTURMUjArcmVnX2Jhc2VfYWRqKSxkZGxfMTAwc3RlcF9wcyk7CgkJCQkJCQlwcmludGYoIlxuYmRscl9ja19yZWdfb3JnPT0weCUwOHggIHwgIGJkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGJkbHJja19yZWdfb3JnLGJkbHJfeF9yZWdfb3JnKTsKCQkJCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX3NldHVwX21heCAweCUwOHggIFwKCQkJCQkJCQkJc2V0dXAgdGltZT09MHglMDh4LCAlMDhkIHBzIFxuICIsCgkJCQkJCQkJCWJkbHJfeF9yZWdfc2V0dXBfbWF4LChiZGxyX3hfcmVnX3NldHVwX21heC0KCQkJCQkJCQkJCSgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpKSwoKGJkbHJfeF9yZWdfc2V0dXBfbWF4LQoJCQkJCQkJCQkJCSgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMAoJCQkJCQkJCSAgKTsKCQkJCQkJCWJkbHIwXzlfcmVnX3NldHVwX21heFt0ZXN0X2JkbF09KGJkbHJfeF9yZWdfc2V0dXBfbWF4LQoJCQkJCQkJCQkoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSk7CgkJCQkJCQliZGxyMF85X3JlZ19zZXR1cF90aW1lW3Rlc3RfYmRsXT0oKGJkbHJfeF9yZWdfc2V0dXBfbWF4LQoJCQkJCQkJCQkJKChiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYmRsJTQpKSkmMHhmZikpICpkZGxfMTAwc3RlcF9wcykvMTAwOwoJCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwyOCk7KHRlbXBfY291bnQrKykpCgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKCgoZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF0pKSwKCQkJCQkJCQkJCSgoKHRlbXBfY291bnQlNyk8PDIpK0REUjBfUFVCX0RYMEJETFIwKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlbXBfY291bnQvNykrcmVnX2Jhc2VfYWRqKSk7CgoJCQkJCQkJfTsKCgkJCQkJCX0KCgkJCQkJfQoKCgoKCQkJCQlpZiAodGVzdF9kYXRhX3NldHVwX2hvbGQpCgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdF9kYXRhX2hvbGRcbiAiKTsKCgoKCQkJCQkJcmVnX2JkbHJjaz0oKCgodGVzdF9iZGwlMjQpPjExKT8oRERSMF9QVUJfRFgwQkRMUjUpOihERFIwX1BVQl9EWDBCRExSMikpKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwoJCQkJCQlyZWdfYmRscl94PSAoRERSMF9QVUJfRFgwQkRMUjArKCgoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKSsKCQkJCQkJCQkoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKTsKCQkJCQkJaWYgKCh0ZXN0X2JkbCUyNCk+MTEpCgkJCQkJCXtyZWdfYmRscl94PXJlZ19iZGxyX3grNDsvL2R4bmJkbHIzNDUgcmVnaXN0ZXIgYWRkIGhhdmUgYSBnYXAgd2l0aCBkeG5iZGxyMDEyCgkJCQkJCX0KCQkJCQkJYmRscmNrX3JlZ19vcmc9cmVhZGwocmVnX2JkbHJjaykgIDsKCQkJCQkJYmRscl94X3JlZ19vcmc9cmVhZGwocmVnX2JkbHJfeCk7CgoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoYmRscmNrX3JlZ19vcmc+Pig4KigxKSkpJjB4ZmYpOwoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTxBQ0JETFJfTUFYKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCXByaW50ZigiXG4gcmVnX2JkbHJfY2s9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix2YWx1ZT09MHglMDh4IixyZWdfYmRscmNrLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCSgoKGJkbHJja19yZWdfb3JnKSYofigweGZmZmY8PCg4KigxKSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigxKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCooMikpKSkpOwoKCQkJCQkJCXsKCQkJCQkJCQkvLyB3cml0ZWwoKCgoYmRscmNrX3JlZ19vcmcpJih+KDB4ZmZmZjw8KDgqKDEpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKDEpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigyKSkpKSxyZWdfYmRscmNrKTsKCgkJCQkJCQl9CgoKCgkJCQkJCQlpZiAoKCh0ZXN0X2JkbCUyNCk8MTIpKQoJCQkJCQkJewoJCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTIpOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJCXtpZih0ZW1wX2NvdW50PT0odGVzdF9iZGwlMjQpKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKwoJCQkJCQkJCQkJCQkJCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKT4+KDgqKHRlbXBfY291bnQlNCkpKSYweGZmOwoJCQkJCQkJCQl9ZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKChyZWFkbChERFIwX1BVQl9EWDBCRExSMCsoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSsKCQkJCQkJCQkJCQkJCQkJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmYpKzE7CgkJCQkJCQkJCX0KCQkJCQkJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT5BQ0JETFJfTUFYKT8oQUNCRExSX01BWCk6KHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdKSk7CgoJCQkJCQkJCX07CgkJCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwxMik7KHRlbXBfY291bnQrKykpCgkJCQkJCQkJewoJCQkJCQkJCQl3cml0ZWwoKCgodGVtcF9yZWdfdmFsdWVbKHRlbXBfY291bnQpXSl8KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzFdKTw8KDgpKXwoKCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzJdKTw8KDE2KSkpCgkJCQkJCQkJCQkJCQl8KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzNdKTw8KDI0KSkpKSwKCQkJCQkJCQkJCQkoRERSMF9QVUJfRFgwQkRMUjArKCgodGVtcF9jb3VudCUyNCk+PjIpPDwyKSsKCQkJCQkJCQkJCQkgKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpOwoJCQkJCQkJCQl0ZW1wX2NvdW50PXRlbXBfY291bnQrMzsKCQkJCQkJCQl9OwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2JkbHJfeD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHhfdmFsdWU9PTB4JTA4eCIscmVnX2JkbHJfeCxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJCQkJCQkJCQkJKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKwoJCQkJCQkJCQkJCSAgIChERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKSk7CgoJCQkJCQkJfQoKCgkJCQkJCQlpZiAoKCh0ZXN0X2JkbCUyNCkgPj0gMTIpKQoJCQkJCQkJewoJCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MTIpOyh0ZW1wX2NvdW50PDI0KTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCQl7aWYodGVtcF9jb3VudD09KHRlc3RfYmRsJTI0KSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KChyZWFkbChERFIwX1BVQl9EWDBCRExSMCsoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSs0KwoJCQkJCQkJCQkJCQkJCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKT4+KDgqKHRlbXBfY291bnQlNCkpKSYweGZmOwoJCQkJCQkJCQl9ZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKChyZWFkbChERFIwX1BVQl9EWDBCRExSMCsoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSs0KwoJCQkJCQkJCQkJCQkJCQkoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKSk+Pig4Kih0ZW1wX2NvdW50JTQpKSkmMHhmZikrMTsKCQkJCQkJCQkJfQoJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPkFDQkRMUl9NQVgpPyhBQ0JETFJfTUFYKToodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0pKTsKCgkJCQkJCQkJfTsKCQkJCQkJCQlmb3IgKCh0ZW1wX2NvdW50PTEyKTsodGVtcF9jb3VudDwyNCk7KHRlbXBfY291bnQrKykpCgkJCQkJCQkJewoJCQkJCQkJCQl3cml0ZWwoKCgodGVtcF9yZWdfdmFsdWVbKHRlbXBfY291bnQpXSl8KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzFdKTw8KDgpKXwoKCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzJdKTw8KDE2KSkpCgkJCQkJCQkJCQkJCQl8KCh0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50KzNdKTw8KDI0KSkpKSwKCQkJCQkJCQkJCQkoRERSMF9QVUJfRFgwQkRMUjArKCgodGVtcF9jb3VudCUyNCk+PjIpPDwyKSs0KwoJCQkJCQkJCQkJCSAoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCQkJCXRlbXBfY291bnQ9dGVtcF9jb3VudCszOwoJCQkJCQkJCX07CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYmRscl94PT0weCUwOHgscmlnaHQgdGVtcD09MHglMDh4XG4seF92YWx1ZT09MHglMDh4IixyZWdfYmRscl94LGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCQkocmVhZGwoRERSMF9QVUJfRFgwQkRMUjArKCgodGVzdF9iZGwlMjQpPj4yKTw8MikrNCsKCQkJCQkJCQkJCQkgICAoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKSkpOwoJCQkJCQkJfQoKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlIGRldGVjdCAscmVnPT0weCUwOHhcbiIsKHJlZ19iZGxyY2spKTsKCQkJCQkJcHJpbnRmKCJcbiBvcmc9PTB4JTA4eCxyaWdodCBlZGdlPT0weCUwOHgsdmFsdWU9PTB4JTA4eFxuICIsKChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZiksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkoKChiZGxyY2tfcmVnX29yZykmKH4oMHhmZmZmPDwoOCooMSkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCooMSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKDIpKSkpKTsKCgkJCQkJCXtiZGxyX3hfcmVnX2hvbGRfbWF4PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7fQoKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoJCQkJCQkvL3dyaXRlbCgoKGFjYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYWNiZGwlNCkpKSxyZWdfYWRkKTsKCQkJCQkJd3JpdGVsKCgoYmRscmNrX3JlZ19vcmcpKSxyZWdfYmRscmNrKTsKCQkJCQkJLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKCQkJCQkJewoJCQkJCQkJcHJpbnRmKCJcbnRlc3RfYmRsICUwOHggfCBkYXRhX3NldHVwX2hvbGQ9PTB4JTA4eCBtZGxyPT0weCUwOHggIGRkbF8xMDBzdGVwX3BzPT0lMDhkXG4iLHRlc3RfYmRsLHRlc3RfZGF0YV9zZXR1cF9ob2xkLAoJCQkJCQkJCQlyZWFkbChERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGopLGRkbF8xMDBzdGVwX3BzKTsKCQkJCQkJCXByaW50ZigiXG5iZGxyX2NrX3JlZ19vcmc9PTB4JTA4eCAgfCAgYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYmRscmNrX3JlZ19vcmcsYmRscl94X3JlZ19vcmcpOwoJCQkJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfaG9sZF9tYXggMHglMDh4ICBcCgkJCQkJCQkJCWhvbGQgdGltZT09MHglMDh4LCAlMDhkIHBzIFxuICIsCgkJCQkJCQkJCWJkbHJfeF9yZWdfaG9sZF9tYXgsKGJkbHJfeF9yZWdfaG9sZF9tYXgtCgkJCQkJCQkJCQkoKGJkbHJja19yZWdfb3JnPj4oOCooMSkpKSYweGZmKSksKChiZGxyX3hfcmVnX2hvbGRfbWF4LQoJCQkJCQkJCQkJCSgoYmRscmNrX3JlZ19vcmc+Pig4KigxKSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMAoJCQkJCQkJCSAgKTsKCQkJCQkJCWJkbHIwXzlfcmVnX2hvbGRfbWF4W3Rlc3RfYmRsXT0oYmRscl94X3JlZ19ob2xkX21heC0KCQkJCQkJCQkJKChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZikpOwoJCQkJCQkJYmRscjBfOV9yZWdfaG9sZF90aW1lW3Rlc3RfYmRsXT0oKGJkbHJfeF9yZWdfaG9sZF9tYXgtCgkJCQkJCQkJCQkoKGJkbHJja19yZWdfb3JnPj4oOCooMSkpKSYweGZmKSkgKmRkbF8xMDBzdGVwX3BzKS8xMDA7CgkJCQkJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDI4KTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCXsKCQkJCQkJCQl3cml0ZWwoKChkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XSkpLAoJCQkJCQkJCQkJKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KStyZWdfYmFzZV9hZGopKTsKCgkJCQkJCQl9OwoKCQkJCQkJfQoKCQkJCQl9CgoKCgoKCQkJCX0KCQkJfQoKCQl9CgoJCS8vICBkZGxfMTAwc3RlcF9wcz0oKDEwMCoxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkvKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjArcmVnX2Jhc2VfYWRqKSkpPj4xNikmMHhmZik7CgoKCgkJcHJpbnRmKCJcbmRkbF8xMDBzdGVwX3BzPT0gJTA4ZCwwXzVjeWNsZV9wcz09ICUwOGRcbiIsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpKTsKCgkJcHJpbnRmKCJcbnJlc3VtZSAgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCWlmIChvcGVuX3Z0KQoJCXsKCQkJd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSkmKH4oMTw8MjkpKSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCX0KCQlwcmludGYoIlxuIHJlc3VtZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgoJCXJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKCgoJfQoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJLy8qLwoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93LAk2LAkxLAlkb19kZHJfdGVzdF9kYXRhX2JpdF9zZXR1cF9ob2xkX3dpbmRvdywKCSJERFIgdGVzdCBkYXRhIGJpdCBtYXJnaW4gZnVuY3Rpb24iLAoJImRkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgMCAzIG9yIGRkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgMSAzICBcbiBkY2FjaGUgb2ZmID8gXG4iCik7CiNlbmRpZgoKdW5zaWduZWQgaW50CmRvX3Rlc3RfYWRkcmVzc19idXModm9sYXRpbGUgdW5zaWduZWQgaW50ICogYmFzZUFkZHJlc3MsIHVuc2lnbmVkIGludCBuQnl0ZXMpCnsKCXVuc2lnbmVkIGludCBhZGRyZXNzTWFzayA9IChuQnl0ZXMvc2l6ZW9mKHVuc2lnbmVkIGludCkgLSAxKTsKCXVuc2lnbmVkIGludCBvZmZzZXQ7Cgl1bnNpZ25lZCBpbnQgdGVzdE9mZnNldDsKCgl1bnNpZ25lZCBpbnQgcGF0dGVybgkgPSAodW5zaWduZWQgaW50KSAweEFBQUFBQUFBOwoJdW5zaWduZWQgaW50IGFudGlwYXR0ZXJuID0gKHVuc2lnbmVkIGludCkgMHg1NTU1NTU1NTsKCgl1bnNpZ25lZCBpbnQgZGF0YTEsIGRhdGEyOwoKCXVuc2lnbmVkIGludCByZXQgPSAwOwoKCS8qCgkgKiBXcml0ZSB0aGUgZGVmYXVsdCBwYXR0ZXJuIGF0IGVhY2ggb2YgdGhlIHBvd2VyLW9mLXR3byBvZmZzZXRzLgoJICovCglmb3IgKG9mZnNldCA9IDE7IChvZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgb2Zmc2V0IDw8PSAxKQoJewoJCWJhc2VBZGRyZXNzW29mZnNldF0gPSBwYXR0ZXJuOwoJfQoKCS8qCgkgKiBDaGVjayBmb3IgYWRkcmVzcyBiaXRzIHN0dWNrIGhpZ2guCgkgKi8KCXRlc3RPZmZzZXQgPSAwOwoJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBhbnRpcGF0dGVybjsKCglmb3IgKG9mZnNldCA9IDE7IChvZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgb2Zmc2V0IDw8PSAxKQoJewoJCWRhdGExID0gYmFzZUFkZHJlc3Nbb2Zmc2V0XTsKCQlkYXRhMiA9IGJhc2VBZGRyZXNzW29mZnNldF07CgkJaWYgKGRhdGExICE9IGRhdGEyKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzIC0gcmVhZCB0d2ljZSBkaWZmZXJlbnRbb2Zmc2V0XTogMHglOHgtMHglOHhcbiIsIGRhdGExLCBkYXRhMik7CgkJCXJldCA9IDE7CgkJfQoJCWlmIChkYXRhMSAhPSBwYXR0ZXJuKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzIC0gd3JpdGVbMHglOHhdOiAweCU4eCwgcmVhZFsweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJb2Zmc2V0LCBwYXR0ZXJuLCBvZmZzZXQsIGRhdGExKTsKCQkJcmV0ID0gMTsKCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQl9Cgl9CgoJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBwYXR0ZXJuOwoKCS8qCgkgKiBDaGVjayBmb3IgYWRkcmVzcyBiaXRzIHN0dWNrIGxvdyBvciBzaG9ydGVkLgoJICovCglmb3IgKHRlc3RPZmZzZXQgPSAxOyAodGVzdE9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyB0ZXN0T2Zmc2V0IDw8PSAxKQoJewoJCWJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdID0gYW50aXBhdHRlcm47CgoJCWlmIChiYXNlQWRkcmVzc1swXSAhPSBwYXR0ZXJuKQoJCXsKCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzMiAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMF06IDB4JTh4XG4iLCBcCgkJCQkJdGVzdE9mZnNldCwgYW50aXBhdHRlcm4sIGJhc2VBZGRyZXNzWzBdKTsKCQkJcmV0ID0gMTsKCQkJLy9yZXR1cm4gKCh1bnNpZ25lZCBpbnQpICZiYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSk7CgkJfQoKCQlmb3IgKG9mZnNldCA9IDE7IChvZmZzZXQgJiBhZGRyZXNzTWFzaykgIT0gMDsgb2Zmc2V0IDw8PSAxKQoJCXsKCQkJZGF0YTEgPSBiYXNlQWRkcmVzc1tvZmZzZXRdOwoJCQlpZiAoKGRhdGExICE9IHBhdHRlcm4pICYmIChvZmZzZXQgIT0gdGVzdE9mZnNldCkpCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czMgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJdGVzdE9mZnNldCwgYW50aXBhdHRlcm4sIHRlc3RPZmZzZXQsIGRhdGExKTsKCQkJCXJldCA9IDE7CgkJCQkvL3JldHVybiAoKHVuc2lnbmVkIGludCkgJmJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdKTsKCQkJfQoJCX0KCgkJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBwYXR0ZXJuOwoJfQoKCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoJCWlmICgoKH5vZmZzZXQpIDw9IGFkZHJlc3NNYXNrKSApCgkJewoJCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCQkJYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSA9IGFudGlwYXR0ZXJuOwoJCX0KCX0KCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKTsgb2Zmc2V0KyspCgl7CgkJaWYgKCgofm9mZnNldCkgPD0gYWRkcmVzc01hc2spICkKCQl7CgkJCWlmIChiYXNlQWRkcmVzc1tvZmZzZXRdICE9IHBhdHRlcm4pCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czQgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJb2Zmc2V0LCBwYXR0ZXJuLCBvZmZzZXQsIGJhc2VBZGRyZXNzW29mZnNldF0pOwoKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKGJhc2VBZGRyZXNzWyh+b2Zmc2V0KV0gIT0gYW50aXBhdHRlcm4pCgkJCXsKCQkJCXByaW50ZigiICBtZW1UZXN0QWRkcmVzc0J1czUgLSB3cml0ZSBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4LCByZWFkIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQkJKCh+b2Zmc2V0KSksIGFudGlwYXR0ZXJuLCAoKH5vZmZzZXQpKSwgYmFzZUFkZHJlc3NbKCh+b2Zmc2V0KSldKTsKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglpZiAocmV0KQoJe3JldHVybiAocmV0KTsKCX0KCS8vdW5zaWduZWQgaW50IHN1cV92YWx1ZTsKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spIDsgb2Zmc2V0KyspCgl7CgoJCXsKCQkJcGF0dGVybj0oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47CgkJCS8vYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSA9IGFudGlwYXR0ZXJuOwoJCX0KCX0KCglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKTsgb2Zmc2V0KyspCgl7CgoJCXsKCQkJcGF0dGVybj0oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJaWYgKGJhc2VBZGRyZXNzW29mZnNldF0gIT0gcGF0dGVybikKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNiAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQlvZmZzZXQscGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCgkJfQoJfQoJaWYgKHJldCkKCXtyZXR1cm4gKHJldCk7Cgl9Cglmb3IgKG9mZnNldCA9IDB4MTsgKG9mZnNldCA8PWFkZHJlc3NNYXNrKSA7IG9mZnNldCsrKQoJewoKCQl7CgkJCXBhdHRlcm49figob2Zmc2V0PDwyKS1vZmZzZXQpOwoJCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCQkJLy9iYXNlQWRkcmVzc1sofm9mZnNldCldID0gYW50aXBhdHRlcm47CgkJfQoJfQoKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spOyBvZmZzZXQrKykKCXsKCgkJewoJCQlwYXR0ZXJuPX4oKG9mZnNldDw8Miktb2Zmc2V0KTsKCQkJaWYgKGJhc2VBZGRyZXNzW29mZnNldF0gIT0gcGF0dGVybikKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNyAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQlvZmZzZXQscGF0dGVybiwgb2Zmc2V0LCBiYXNlQWRkcmVzc1tvZmZzZXRdKTsKCQkJCXJldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCgkJfQoJfQoKCglyZXR1cm4gKHJldCk7Cn0gICAvKiBtZW1UZXN0QWRkcmVzc0J1cygpICovCgppbnQgZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7CgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCWVycm9yX2NvdW50PTA7CgkvLy8qCglwcmludGYoIlxyU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGUoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vKi8KCS8qCgkgICBwcmludGYoIlxyU3RhcnQgd3JpdGluZyBwYXR0ZXJuNCBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBkZHJfd3JpdGU0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgIHByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgIHByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgICovCglkZHJfd3JpdGVfZnVsbCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSwweDAsMHgzKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfZnVsbCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSwwLDMpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9mdWxsKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLDAsMyk7CgoKCXByaW50ZigiXHJTdGFydCB3cml0aW5nIGFkZCBwYXR0ZXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglpZiAoZG9fdGVzdF9hZGRyZXNzX2J1cygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSkpCgkJZXJyb3JfY291bnQrKzsKCgoJLyoKCSAgIHByaW50ZigiXG5TdGFydCAqNCBubyBjcm9zcyB0YWxrIHBhdHRlcm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIGRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIHByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkvL2lmKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnPT0xKQoJewoJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCgl9CgoJewoJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgoJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgp9CgkqLwppZiAoZXJyb3JfY291bnQpCglyZXR1cm4gMTsKCWVsc2UKCXJldHVybiAwOwoJfQoKaW50IGRvX2Rkcl90ZXN0X2FjX3dpbmRvd3NfYWNsY2RscihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkciBhYyB3aW5kb3dzIGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiXG5zZXQgZGRyICB0ZXN0IHRlc3Rfc3RhcnRfYWRkcj09MHglMDh4IFxuIix0ZXN0X3N0YXJ0X2FkZHIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJLy91bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgoKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKCgoKCgoKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKCXVuc2lnbmVkIGludCAgYWNfbWRscl9hX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19tZGxyX2Jfb3JnPTA7CgoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9vcmc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2Jfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX3JpZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9sZWY9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX2xlZj0wOwoKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9sZWZfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWZfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfdGVtcD0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfdGVtcD0wOwoKCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCS8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgdGVzdF9taW5fbWF4PTA7CglpZiAoYXJnYyA+NSkgewoKCQl0ZXN0X21pbl9tYXggPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbWluX21heCA9IDA7CgkJfQoJCWVsc2UKCQkJdGVzdF9taW5fbWF4PTE7CgoJfQoKCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CglwcmludGYoIlxudGVzdF9taW5fbWF4PT0gMHglMDh4XG4iLCB0ZXN0X21pbl9tYXgpOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCgoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCgkJCQkJfQoJCQkJfQoKCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMxMTBcbiIpOwoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIDB4JTA4eFxuIixyZWdfYWRkKTsKCQkJCQlhY19tZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50IClyZWdfYWRkKSk7Ly9yZWFkbChyZWdfYWRkKTsvLzB4Yzg4MzYwMDAKCQkJCQlhY19sY2Rscl9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpKSk7Ly9yZWFkbChyZWdfYWRkKzQpOwoJCQkJCWFjX2JkbHIwX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrOCk7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDMTEzXG4iKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyk7CgkJCQl9CgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMxMTJcbiIpOwoJCQkJCWFjX21kbHJfYl9vcmc9cmVhZGwocmVnX2FkZCk7CgkJCQkJYWNfbGNkbHJfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUik7CgkJCQkJYWNfYmRscjBfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUik7CgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoJCQkJfQoKCgkJCX0KCgkJfQoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQ1xuIik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDXG4iKTsKCQkJCX0KCgkJCQl7CgkJCQkJewoJCQkJCQkvLyNpZmRlZiBERFJfVEVTVF9BQ0xDRExSCgoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTENETFIrcmVnX2Jhc2VfYWRqOwoKCQkJCQkJYWNfbGNkbHJfdGVtcD1yZWFkbChyZWdfYWRkKTsKCgkJCQkJCXdoaWxlIChhY19sY2Rscl90ZW1wPjApCgkJCQkJCXsKCQkJCQkJCWlmKHRlc3RfbWluX21heCkKCQkJCQkJCXticmVhazsKCQkJCQkJCX0KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcC0tOwoKCQkJCQkJCXByaW50ZigiXG5sY2RsciB0ZXN0IHZhbHVlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoJCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWFjX2xjZGxyX3RlbXArKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJcHJpbnRmKCJcbmxjZGxyIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcbmxjZGxyIGxlZnQgZWRnZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKCQkJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQkJCXsKCQkJCQkJCWFjX2xjZGxyX2FfbGVmPWFjX2xjZGxyX3RlbXA7CgkJCQkJCQlhY19sY2Rscl90ZW1wPWFjX2xjZGxyX2Ffb3JnOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJYWNfbGNkbHJfYl9sZWY9YWNfbGNkbHJfdGVtcDsKCQkJCQkJCWFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYl9vcmc7CgoJCQkJCQl9CgkJCQkJCXdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CgoJCQkJCQl3aGlsZSAoYWNfbGNkbHJfdGVtcDxBQ0xDRExSX01BWCkKCQkJCQkJewoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlhY19sY2Rscl90ZW1wKys7CgkJCQkJCQlwcmludGYoIlxubGNkbHIgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKCQkJCQkJCXdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CiNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2Vsc2UKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQkvL3ByaW50ZigiXG5sY2RsciByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWFjX2xjZGxyX3RlbXAtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxubGNkbHJyaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxubGNkbHIgcmlnaHQgZWRnZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKCgoKCQkJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQkJCXsKCQkJCQkJCWFjX2xjZGxyX2FfcmlnPWFjX2xjZGxyX3RlbXA7CgkJCQkJCQlhY19sY2Rscl90ZW1wPWFjX2xjZGxyX2Ffb3JnOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJYWNfbGNkbHJfYl9yaWc9YWNfbGNkbHJfdGVtcDsKCQkJCQkJCWFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYl9vcmc7CgoJCQkJCQl9CgkJCQkJCXdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CgoKCgkJCQkJCS8vI2VuZGlmCgoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqOwoKCQkJCQkJCWFjX2JkbHIwX3RlbXA9cmVhZGwocmVnX2FkZCk7CgkJCQkJCQl3aGlsZSAoYWNfYmRscjBfdGVtcD4wKQoJCQkJCQkJewoJCQkJCQkJCWlmKHRlc3RfbWluX21heCkKCQkJCQkJCQl7YnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXAtLTsKCQkJCQkJCQlwcmludGYoIlxuYmRscjAgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCQkJCQkJCQl3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWFjX2JkbHIwX3RlbXArKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjAgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjAgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoKCQkJCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJCQkJewoJCQkJCQkJCWFjX2JkbHIwX2FfbGVmPWFjX2JkbHIwX3RlbXA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcD1hY19iZGxyMF9hX29yZzsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlhY19iZGxyMF9iX2xlZj1hY19iZGxyMF90ZW1wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYl9vcmc7CgoJCQkJCQkJfQoKCQkJCQkJCXdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7CgoJCQkJCQkJd2hpbGUgKGFjX2JkbHIwX3RlbXA8QUNCRExSX01BWCkKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlhY19iZGxyMF90ZW1wKys7CgkJCQkJCQkJcHJpbnRmKCJcbmJkbHIwIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7CgkJCQkJCQkJd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2Vsc2UKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCS8vcHJpbnRmKCJcbmFjYmRscjAgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJYWNfYmRscjBfdGVtcC0tOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjAgcmlnaHQgZWRnZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCgkJCQkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCQkJCXsKCQkJCQkJCQlhY19iZGxyMF9hX3JpZz1hY19iZGxyMF90ZW1wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYV9vcmc7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJYWNfYmRscjBfYl9yaWc9YWNfYmRscjBfdGVtcDsKCQkJCQkJCQlhY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Jfb3JnOwoKCQkJCQkJCX0KCgkJCQkJCQl3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwoKCQkJCQkJfQoJCQkJCX0KCgkJCQl9CgkJCX0KCgkJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKCQkJLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJewoJCQkJCWlmICh0ZXN0X3RpbWVzKQoJCQkJCXsKCQkJCQkJaWYgKGFjX2xjZGxyX2FfbGVmPmFjX2xjZGxyX2FfbGVmX21pbikKCQkJCQkJCWFjX2xjZGxyX2FfbGVmX21pbj1hY19sY2Rscl9hX2xlZjsKCgkJCQkJCWlmIChhY19sY2Rscl9hX3JpZzxhY19sY2Rscl9hX3JpZ19taW4pCgkJCQkJCQlhY19sY2Rscl9hX3JpZ19taW49YWNfbGNkbHJfYV9yaWc7CgoJCQkJCQlpZiAoYWNfYmRscjBfYV9sZWY+YWNfYmRscjBfYV9sZWZfbWluKQoJCQkJCQkJYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2FfcmlnPGFjX2JkbHIwX2FfcmlnX21pbikKCQkJCQkJCWFjX2JkbHIwX2FfcmlnX21pbj1hY19iZGxyMF9hX3JpZzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoJCQkJCQlhY19sY2Rscl9hX3JpZ19taW49YWNfbGNkbHJfYV9yaWc7CgkJCQkJCWFjX2JkbHIwX2FfbGVmX21pbj1hY19iZGxyMF9hX2xlZjsKCQkJCQkJYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwoJCQkJCX0KCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMgcmVzdWx0XG4iKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyk7CgoJCQkJCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyxhY19sY2Rscl9hX2xlZixhY19sY2Rscl9hX3JpZyxhY19sY2Rscl9hX2xlZl9taW4sYWNfbGNkbHJfYV9yaWdfbWluKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyxhY19iZGxyMF9hX2xlZixhY19iZGxyMF9hX3JpZyxhY19iZGxyMF9hX2xlZl9taW4sYWNfYmRscjBfYV9yaWdfbWluKTsKCgoKCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKCQkJCXsKCQkJCQlpZiAodGVzdF90aW1lcykKCQkJCQl7CgkJCQkJCWlmIChhY19sY2Rscl9iX2xlZj5hY19sY2Rscl9iX2xlZl9taW4pCgkJCQkJCQlhY19sY2Rscl9iX2xlZl9taW49YWNfbGNkbHJfYl9sZWY7CgoJCQkJCQlpZiAoYWNfbGNkbHJfYl9yaWc8YWNfbGNkbHJfYl9yaWdfbWluKQoJCQkJCQkJYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2JfbGVmPmFjX2JkbHIwX2JfbGVmX21pbikKCQkJCQkJCWFjX2JkbHIwX2JfbGVmX21pbj1hY19iZGxyMF9iX2xlZjsKCgkJCQkJCWlmIChhY19iZGxyMF9iX3JpZzxhY19iZGxyMF9iX3JpZ19taW4pCgkJCQkJCQlhY19iZGxyMF9iX3JpZ19taW49YWNfYmRscjBfYl9yaWc7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWFjX2xjZGxyX2JfbGVmX21pbj1hY19sY2Rscl9iX2xlZjsKCQkJCQkJYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwoJCQkJCQlhY19iZGxyMF9iX2xlZl9taW49YWNfYmRscjBfYl9sZWY7CgkJCQkJCWFjX2JkbHIwX2JfcmlnX21pbj1hY19iZGxyMF9iX3JpZzsKCQkJCQl9CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDIHJlc3VsdFxuIik7CgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoKCQkJCQlwcmludGYoIlxuIGFjX2FjbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggICBsY2Rscl9sZWYgICBsY2Rscl9yaWcgICBsY2Rscl9sbWluICBsY2Rscl9ybWluXG4iLChyZWdfYWRkKSxhY19tZGxyX2Jfb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcsYWNfbGNkbHJfYl9sZWYsYWNfbGNkbHJfYl9yaWcsYWNfbGNkbHJfYl9sZWZfbWluLGFjX2xjZGxyX2JfcmlnX21pbik7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9hX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcsYWNfYmRscjBfYl9sZWYsYWNfYmRscjBfYl9yaWcsYWNfYmRscjBfYl9sZWZfbWluLGFjX2JkbHIwX2JfcmlnX21pbik7CgoKCgkJCQl9CgoKCgkJCX0KCgoJCX0KCgl9CgoKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KCgoKClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciwJNiwJMSwJZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2xjZGxyLAoJIkREUiB0dW5lIGRxcyBmdW5jdGlvbiIsCgkiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgYSAwIDB4ODAwMDAwMCAzIG9yIGRkcl90dW5lX2Rkcl9hY19hY2xjZGxyIGIgMCAweDgwMDAwIDUgb3IgZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgYSBiIDB4ODAwMDAgbFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKCgppbnQgZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2JkbHJfY2soY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVGVzdCBkZHIgYWMgd2luZG93cyBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoKCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJdW5zaWduZWQgaW50ICBhY19tZGxyX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX21kbHJfYl9vcmc9MDsKCgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWY9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWY9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmPTA7CgoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmX21pbj0wOwoJLy8gICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX3RlbXA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF90ZW1wPTA7CgoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCS8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJfQoJfQoKCXVuc2lnbmVkIGludCAgIHRlc3RfbWluX21heD0wOwoJaWYgKGFyZ2MgPjUpIHsKCgkJdGVzdF9taW5fbWF4ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X21pbl9tYXggPSAwOwoJCX0KCQllbHNlCgkJCXRlc3RfbWluX21heD0xOwoKCX0KCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CglwcmludGYoIlxudGVzdF9taW5fbWF4PT0gMHglMDh4XG4iLCB0ZXN0X21pbl9tYXgpOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCgoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCgkJCQkJfQoJCQkJfQoKCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIDB4JTA4eFxuIixyZWdfYWRkKTsKCQkJCQlhY19tZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50IClyZWdfYWRkKSk7Ly9yZWFkbChyZWdfYWRkKTsvLzB4Yzg4MzYwMDAKCQkJCQlhY19sY2Rscl9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpKSk7Ly9yZWFkbChyZWdfYWRkKzQpOwoJCQkJCWFjX2JkbHIwX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrOCk7CgoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCQkJCX0KCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9CX1JFR19CQVNFKQoJCQkJewoKCQkJCQlhY19tZGxyX2Jfb3JnPXJlYWRsKHJlZ19hZGQpOwoJCQkJCWFjX2xjZGxyX2Jfb3JnPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpOwoJCQkJCWFjX2JkbHIwX2Jfb3JnPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpOwoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Jfb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnKTsKCQkJCX0KCgoJCQl9CgoJCX0KCgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyAgdmFsdWUKCgoJZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUNcbiIpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBBQ1xuIik7CgkJCQl9CgoJCQkJewoJCQkJCXsKI2lmZGVmIEREUl9URVNUX0FDTENETFIKCgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNMQ0RMUityZWdfYmFzZV9hZGo7CgoJCQkJCQlhY19sY2Rscl90ZW1wPXJlYWRsKHJlZ19hZGQpOwoKCQkJCQkJd2hpbGUgKGFjX2xjZGxyX3RlbXA+MCkKCQkJCQkJewoJCQkJCQkJaWYodGVzdF9taW5fbWF4KQoJCQkJCQkJe2JyZWFrOwoJCQkJCQkJfQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlhY19sY2Rscl90ZW1wLS07CgoJCQkJCQkJcHJpbnRmKCJcbmxjZGxyIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgkJCQkJCQl3cml0ZWwoYWNfbGNkbHJfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJYWNfbGNkbHJfdGVtcCsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlwcmludGYoIlxubGNkbHIgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxubGNkbHIgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoJCQkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCQkJewoJCQkJCQkJYWNfbGNkbHJfYV9sZWY9YWNfbGNkbHJfdGVtcDsKCQkJCQkJCWFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYV9vcmc7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlhY19sY2Rscl9iX2xlZj1hY19sY2Rscl90ZW1wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9iX29yZzsKCgkJCQkJCX0KCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKCgkJCQkJCXdoaWxlIChhY19sY2Rscl90ZW1wPEFDTENETFJfTUFYKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWFjX2xjZGxyX3RlbXArKzsKCQkJCQkJCXByaW50ZigiXG5sY2RsciB0ZXN0IHZhbHVlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoJCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbmxjZGxyIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJYWNfbGNkbHJfdGVtcC0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG5sY2RscnJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5sY2RsciByaWdodCBlZGdlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoKCgoJCQkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCQkJewoJCQkJCQkJYWNfbGNkbHJfYV9yaWc9YWNfbGNkbHJfdGVtcDsKCQkJCQkJCWFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYV9vcmc7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlhY19sY2Rscl9iX3JpZz1hY19sY2Rscl90ZW1wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9iX29yZzsKCgkJCQkJCX0KCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKCgoKI2VuZGlmCgoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqOwoKCQkJCQkJCWFjX2JkbHIwX3RlbXA9cmVhZGwocmVnX2FkZCk7CgkJCQkJCQl3aGlsZSAoYWNfYmRscjBfdGVtcD4wKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXAtLTsKCQkJCQkJCQlwcmludGYoIlxuYmRscjAgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCQkJCQkJCQl3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWFjX2JkbHIwX3RlbXArKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjAgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjAgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoKCQkJCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJCQkJewoJCQkJCQkJCWFjX2JkbHIwX2FfbGVmPWFjX2JkbHIwX3RlbXA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcD1hY19iZGxyMF9hX29yZzsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlhY19iZGxyMF9iX2xlZj1hY19iZGxyMF90ZW1wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYl9vcmc7CgoJCQkJCQkJfQoKCQkJCQkJCXdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7CgoJCQkJCQkJd2hpbGUgKGFjX2JkbHIwX3RlbXA8QUNCRExSX01BWCkKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlhY19iZGxyMF90ZW1wKys7CgkJCQkJCQkJcHJpbnRmKCJcbmJkbHIwIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7CgkJCQkJCQkJd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2Vsc2UKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCS8vcHJpbnRmKCJcbmFjYmRscjAgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJYWNfYmRscjBfdGVtcC0tOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjAgcmlnaHQgZWRnZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCgkJCQkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCQkJCXsKCQkJCQkJCQlhY19iZGxyMF9hX3JpZz1hY19iZGxyMF90ZW1wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYV9vcmc7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJYWNfYmRscjBfYl9yaWc9YWNfYmRscjBfdGVtcDsKCQkJCQkJCQlhY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Jfb3JnOwoKCQkJCQkJCX0KCgkJCQkJCQl3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwoKCQkJCQkJfQoJCQkJCX0KCgkJCQl9CgkJCX0KCgkJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoKCgoKCQkJLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJewoJCQkJCWlmICh0ZXN0X3RpbWVzKQoJCQkJCXsKCQkJCQkJaWYgKGFjX2xjZGxyX2FfbGVmPmFjX2xjZGxyX2FfbGVmX21pbikKCQkJCQkJCWFjX2xjZGxyX2FfbGVmX21pbj1hY19sY2Rscl9hX2xlZjsKCgkJCQkJCWlmIChhY19sY2Rscl9hX3JpZzxhY19sY2Rscl9hX3JpZ19taW4pCgkJCQkJCQlhY19sY2Rscl9hX3JpZ19taW49YWNfbGNkbHJfYV9yaWc7CgoJCQkJCQlpZiAoYWNfYmRscjBfYV9sZWY+YWNfYmRscjBfYV9sZWZfbWluKQoJCQkJCQkJYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2FfcmlnPGFjX2JkbHIwX2FfcmlnX21pbikKCQkJCQkJCWFjX2JkbHIwX2FfcmlnX21pbj1hY19iZGxyMF9hX3JpZzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoJCQkJCQlhY19sY2Rscl9hX3JpZ19taW49YWNfbGNkbHJfYV9yaWc7CgkJCQkJCWFjX2JkbHIwX2FfbGVmX21pbj1hY19iZGxyMF9hX2xlZjsKCQkJCQkJYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwoJCQkJCX0KCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMgcmVzdWx0XG4iKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyk7CgoJCQkJCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyxhY19sY2Rscl9hX2xlZixhY19sY2Rscl9hX3JpZyxhY19sY2Rscl9hX2xlZl9taW4sYWNfbGNkbHJfYV9yaWdfbWluKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyxhY19iZGxyMF9hX2xlZixhY19iZGxyMF9hX3JpZyxhY19iZGxyMF9hX2xlZl9taW4sYWNfYmRscjBfYV9yaWdfbWluKTsKCgoKCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKCQkJCXsKCQkJCQlpZiAodGVzdF90aW1lcykKCQkJCQl7CgkJCQkJCWlmIChhY19sY2Rscl9iX2xlZj5hY19sY2Rscl9iX2xlZl9taW4pCgkJCQkJCQlhY19sY2Rscl9iX2xlZl9taW49YWNfbGNkbHJfYl9sZWY7CgoJCQkJCQlpZiAoYWNfbGNkbHJfYl9yaWc8YWNfbGNkbHJfYl9yaWdfbWluKQoJCQkJCQkJYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2JfbGVmPmFjX2JkbHIwX2JfbGVmX21pbikKCQkJCQkJCWFjX2JkbHIwX2JfbGVmX21pbj1hY19iZGxyMF9iX2xlZjsKCgkJCQkJCWlmIChhY19iZGxyMF9iX3JpZzxhY19iZGxyMF9iX3JpZ19taW4pCgkJCQkJCQlhY19iZGxyMF9iX3JpZ19taW49YWNfYmRscjBfYl9yaWc7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWFjX2xjZGxyX2JfbGVmX21pbj1hY19sY2Rscl9iX2xlZjsKCQkJCQkJYWNfbGNkbHJfYl9yaWdfbWluPWFjX2xjZGxyX2JfcmlnOwoJCQkJCQlhY19iZGxyMF9iX2xlZl9taW49YWNfYmRscjBfYl9sZWY7CgkJCQkJCWFjX2JkbHIwX2JfcmlnX21pbj1hY19iZGxyMF9iX3JpZzsKCQkJCQl9CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDIHJlc3VsdFxuIik7CgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoKCQkJCQlwcmludGYoIlxuIGFjX2FjbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggICBsY2Rscl9sZWYgICBsY2Rscl9yaWcgICBsY2Rscl9sbWluICBsY2Rscl9ybWluXG4iLChyZWdfYWRkKSxhY19tZGxyX2Jfb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcsYWNfbGNkbHJfYl9sZWYsYWNfbGNkbHJfYl9yaWcsYWNfbGNkbHJfYl9sZWZfbWluLGFjX2xjZGxyX2JfcmlnX21pbik7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9hX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcsYWNfYmRscjBfYl9sZWYsYWNfYmRscjBfYl9yaWcsYWNfYmRscjBfYl9sZWZfbWluLGFjX2JkbHIwX2JfcmlnX21pbik7CgoKCgoJCQkJfQoKCgoJCQl9CgoKCQl9CgoJfQoKCgoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgoKCgpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jaywJNiwJMSwJZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2JkbHJfY2ssCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGEgMCAweDgwMDAwMDAgMyBvciBkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGIgMCAweDgwMDAwIDUgb3IgZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jayBhIGIgMHg4MDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCmludCBkb19kZHJfdGVzdF9hY19iaXRfbWFyZ2luKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyZGRyX3Rlc3RfYWNfd2luZG93IGZ1bmN0aW9uXG4iKTsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkvLwkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgoJdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJdW5zaWduZWQgaW50ICAgcmVnX3ZhbHVlPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdF9hY19zZXR1cF9ob2xkPSAwOwoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCS8vICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfb3JnWzEwXTsKCS8vICAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX21heFs0MF07CgkvLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfbWF4WzQwXTsKCS8vICAgICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVs0MF07CgkvLyB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfaG9sZF90aW1lWzQwXTsKCgljaGFyICplbmRwOwoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoJCXsvL2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXsvL2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9CgkvL2FyZ2MyPTU7CgkvL2ZvcihpID0gMTtpPChhcmdjKTtpKyspCgl7CgkJLy9hcmd2MltpLTFdPWFyZ3ZbaV07Cgl9CgoJLy9hcmd2MlswXT1hcmd2WzFdOwoJLy9hcmd2MlsxXT1hcmd2WzJdOwoJLy9hcmd2MlsyXT1hcmd2WzNdOwoJY2hhciBzdHJbMTAwXTsKCXRlc3RfYWNfc2V0dXBfaG9sZD0wOwoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCgkJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBhYyB3aW5kb3cgIGFcbiIpOwoJCWZvciAoKGxhbmVfc3RlcD00KTsobGFuZV9zdGVwPDQwKTsobGFuZV9zdGVwKyspKQoJCXsKCQkJaWYgKGxhbmVfc3RlcCA9PSA3KQoJCQl7bGFuZV9zdGVwPTg7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSAxMikKCQkJe2xhbmVfc3RlcD0xNjsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDE0KQoJCQl7bGFuZV9zdGVwPTE2OwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gMTgpCgkJCXtsYW5lX3N0ZXA9MjA7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSAyMikKCQkJe2xhbmVfc3RlcD0yNDsKCQkJfQoJCQkvL3NwcmludGYoYXJndjJbM10sImQlIiwoIGxhbmVfc3RlcCkpOwoJCQkvL2l0b2FfZGRyX3Rlc3QobGFuZV9zdGVwLChhcmd2MlszXSksMTApOwoJCQkvL3ByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMCxhcmd2MlswXSk7CgkJCS8vCXByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMyxhcmd2MlszXSk7Ly9hIDAgMHg4MDAwMDAwIDAgYwoJCQkvLyByZWdfdmFsdWU9ZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoKCQkJdGVzdF9hY19zZXR1cF9ob2xkPTI7CgkJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgIGEgMCAgMHglMDh4ICAlZCAgMHglMDh4IixkZHJfdGVzdF9zaXplLHRlc3RfYWNfc2V0dXBfaG9sZCwoIGxhbmVfc3RlcCkpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJdGVzdF9hY19zZXR1cF9ob2xkPTA7CgoJCX0KCX0KCWlmIChjaGFubmVsX2FfZW4pCgl7CgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8MTApOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoImFjYmRscjBfOV9yZWdfb3JnWyVkXTB4JTA4eD09MHglMDh4XG4iLAlsYW5lX3N0ZXAsKEREUjBfUFVCX0FDQkRMUjArKGxhbmVfc3RlcDw8MikpLGFjYmRscjBfOV9yZWdfb3JnW2xhbmVfc3RlcF0pOwoKCQl9OwoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0MCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9hY19sYW5lXzB4JTA4eHxzZXR1cF9tYXggMHglMDh4ICB8aG9sZF9tYXggMHglMDh4IHxzZXR1cF90aW1lICUwOGQgcHMgOjp8aG9sZF90aW1lICUwOGQgcHMgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJYWNiZGxyMF85X3JlZ19zZXR1cF9tYXhbbGFuZV9zdGVwXSwKCQkJCQlhY2JkbHIwXzlfcmVnX2hvbGRfbWF4W2xhbmVfc3RlcF0sCgkJCQkJYWNiZGxyMF85X3JlZ19zZXR1cF90aW1lW2xhbmVfc3RlcF0sCgkJCQkJYWNiZGxyMF85X3JlZ19ob2xkX3RpbWVbbGFuZV9zdGVwXSk7CgoJCX0KCX0KCXJldHVybiByZWdfdmFsdWU7Cn0KCmludCBkb19kZHJfdGVzdF9kYXRhX2JpdF9tYXJnaW4oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXJkZHJfdGVzdF9kYXRhX3dpbmRvdyBmdW5jdGlvblxuIik7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJLy8JICAgdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoKCXVuc2lnbmVkIGludCAgIGxhbmVfc3RlcD0gMDsKCXVuc2lnbmVkIGludCAgIHJlZ192YWx1ZT0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RfYWNfc2V0dXBfaG9sZD0gMDsKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgkvLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX29yZ1sxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19zZXR1cF9tYXhbNDBdOwoJLy8gIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19ob2xkX21heFs0MF07CgkvLyAgICAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX3RpbWVbNDBdOwoJLy8gdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVs0MF07CgoJY2hhciAqZW5kcDsKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJey8vY2hhbm5lbF9iX2VuID0gMTsKCQl9CgoKCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Ly9jaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3RfdHlwZT0wOwoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3RfdHlwZV9wYXJhMT0wOwoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3RfdHlwZV9wYXJhMj0wOwoJaWYgKGFyZ2MgPjQpIHsKCQlkZHJfdGVzdF90eXBlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3R5cGUgPSAwOwoJCX0KCX0KCWlmIChkZHJfdGVzdF90eXBlKSB7CgkJaWYgKGFyZ2MgPjUpIHsKCQkJZGRyX3Rlc3RfdHlwZV9wYXJhMSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlkZHJfdGVzdF90eXBlX3BhcmExID0gMDsKCQkJfQoJCX0KCQlpZiAoYXJnYyA+NikgewoJCQlkZHJfdGVzdF90eXBlX3BhcmEyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCWRkcl90ZXN0X3R5cGVfcGFyYTIgPSA5NjsKCQkJfQoJCX0KCX1lbHNlCgl7IGRkcl90ZXN0X3R5cGVfcGFyYTEgPSAwOwoJCWRkcl90ZXN0X3R5cGVfcGFyYTIgPSA5NjsKCX0KCS8vYXJnYzI9NTsKCS8vZm9yKGkgPSAxO2k8KGFyZ2MpO2krKykKCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCX0KCgkvL2FyZ3YyWzBdPWFyZ3ZbMV07CgkvL2FyZ3YyWzFdPWFyZ3ZbMl07CgkvL2FyZ3YyWzJdPWFyZ3ZbM107CglwcmludGYoIlxudGVzdCBkYXRhIHdpbmRvdyBkZHJfdGVzdF90eXBlPT0weCUwOHgsIGRkcl90ZXN0X3R5cGVfcGFyYTE9PTB4JTA4eCxkZHJfdGVzdF90eXBlX3BhcmEyPT0weCUwOHhcbiIsCgkJCWRkcl90ZXN0X3R5cGUsZGRyX3Rlc3RfdHlwZV9wYXJhMSxkZHJfdGVzdF90eXBlX3BhcmEyKTsKCWNoYXIgc3RyWzEwMF07Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50PTA7Cgl0ZXN0X2FjX3NldHVwX2hvbGQ9MDsKCWlmIChjaGFubmVsX2FfZW4pCgl7CgkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwyOCk7KHRlbXBfY291bnQrKykpCgkJewoJCQkvL2RhdGFfYmRscjBfNV9yZWdfb3JnW3RlbXBfY291bnRdPSgoKHJlYWRsKCgodGVtcF9jb3VudD4+Mik8PDIpK0REUjBfUFVCX0RYMEJETFIwKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlbXBfY291bnQvNikrcmVnX2Jhc2VfYWRqKSkKCQkJLy8JPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKTsKCQkJZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF09KChyZWFkbCgoKHRlbXBfY291bnQlNyk8PDIpK0REUjBfUFVCX0RYMEJETFIwKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlbXBfY291bnQvNykpKQoJCQkJCSk7CgkJfTsKCgkJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBkYXRhIHdpbmRvdyAgYVxuIik7CgkJZm9yICgobGFuZV9zdGVwPWRkcl90ZXN0X3R5cGVfcGFyYTEpOyhsYW5lX3N0ZXA8ZGRyX3Rlc3RfdHlwZV9wYXJhMik7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCWlmIChsYW5lX3N0ZXAgPT0gOSkKCQkJe2xhbmVfc3RlcD0xMjsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDIxKQoJCQl7bGFuZV9zdGVwPTI0OwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gMzMpCgkJCXtsYW5lX3N0ZXA9MzY7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSA0NSkKCQkJe2xhbmVfc3RlcD00ODsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDMzKzI0KQoJCQl7bGFuZV9zdGVwPTM2KzI0OwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gNDUrMjQpCgkJCXtsYW5lX3N0ZXA9NDgrMjQ7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSAzMys0OCkKCQkJe2xhbmVfc3RlcD0zNis0ODsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDQ0KzQ4KQoJCQl7bGFuZV9zdGVwPTQ4KzQ4OwoJCQl9CgoJCQkvL3NwcmludGYoYXJndjJbM10sImQlIiwoIGxhbmVfc3RlcCkpOwoJCQkvL2l0b2FfZGRyX3Rlc3QobGFuZV9zdGVwLChhcmd2MlszXSksMTApOwoJCQkvL3ByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMCxhcmd2MlswXSk7CgkJCS8vCXByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMyxhcmd2MlszXSk7Ly9hIDAgMHg4MDAwMDAwIDAgYwoJCQkvLyByZWdfdmFsdWU9ZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93ICBhIDAgIDB4JTA4eCAgJWQgIDB4JTA4eCIsZGRyX3Rlc3Rfc2l6ZSx0ZXN0X2FjX3NldHVwX2hvbGQsKCBsYW5lX3N0ZXApKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCQl0ZXN0X2FjX3NldHVwX2hvbGQ9MTsKCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93ICBhIDAgIDB4JTA4eCAgJWQgIDB4JTA4eCIsZGRyX3Rlc3Rfc2l6ZSx0ZXN0X2FjX3NldHVwX2hvbGQsKCBsYW5lX3N0ZXApKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCXRlc3RfYWNfc2V0dXBfaG9sZD0wOwoJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDI4KTsodGVtcF9jb3VudCsrKSkKCQkJewoJCQkJd3JpdGVsKCgoZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF0pKSwKCQkJCQkJKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KSkpOwoKCQkJfTsKCgoJCX0KCX0KCgoKCgoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwyOCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiZGF0YV9iZGxyMF81X3JlZ19vcmdbJWRdMHglMDh4PT0weCUwOHhcbiIsCWxhbmVfc3RlcCwKCQkJCQkoKChsYW5lX3N0ZXAlNyk8PDIpK0REUjBfUFVCX0RYMEJETFIwKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKGxhbmVfc3RlcC83KSksCgkJCQkJZGF0YV9iZGxyMF81X3JlZ19vcmdbbGFuZV9zdGVwXSk7CgoJCX07CgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDk2KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2FjX2xhbmVfMHglMDh4fHNldHVwX21heCAweCUwOHggIHxob2xkX21heCAweCUwOHggfHNldHVwX3RpbWUgJTA4ZCBwcyA6Onxob2xkX3RpbWUgJTA4ZCBwcyAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQliZGxyMF85X3JlZ19zZXR1cF9tYXhbbGFuZV9zdGVwXSwKCQkJCQliZGxyMF85X3JlZ19ob2xkX21heFtsYW5lX3N0ZXBdLAoJCQkJCWJkbHIwXzlfcmVnX3NldHVwX3RpbWVbbGFuZV9zdGVwXSwKCQkJCQliZGxyMF85X3JlZ19ob2xkX3RpbWVbbGFuZV9zdGVwXSk7CgoJCX19CgoKCglyZXR1cm4gcmVnX3ZhbHVlOwp9CgovLyNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQppbnQgZG9fZGRyX2d4X2Nyb3NzdGFsayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vLyoKCXVuc2lnbmVkIGludCAgZGVzWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl8xWzRdWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl8yWzRdWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl8zWzRdWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl80WzRdWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl81WzRdWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl82WzRdWzhdIDsKCgoJZGVzWzBdID0gCTB4YWVjODNmNDk7CglkZXNbMV0gPSAgICAgIDB4ZDI0M2E2MmM7CglkZXNbMl0gPSAgICAgIDB4Zjg3NzRhMGI7CglkZXNbM10gPSAgICAgICAweDYzZDIxNGU1OwoJZGVzWzRdID0gICAgICAweDNmNDE2NmQ1OwoJZGVzWzVdID0gICAgIDB4MjM5NjcyYzA7CglkZXNbNl0gPSAgICAgIDB4NDdiYTc1MzM7CglkZXNbN10gPSAgICAgIDB4Y2FlNGNkN2Y7CglwYXR0ZXJuXzFbMF1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzFbMV1bMF0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzFdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVsyXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bM10gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzRdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs1XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNl0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzddID0gMHgwMGZmZmYwMDsKCglwYXR0ZXJuXzFbMl1bMF0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzFdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVsyXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bM10gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzRdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs1XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNl0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzddID0gMHhmZmZmMDAwMDsKCglwYXR0ZXJuXzFbM11bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwoJcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKCXBhdHRlcm5fMlswXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMV1bMF0gPSAweDAwMDRmYjAwOwoJcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKCXBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwoJcGF0dGVybl8yWzJdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzRdID0gMHgwMDIwZGYwMDsKCXBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwoJcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKCXBhdHRlcm5fMlszXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzNbMF1bMF0gPSAweDAwMDEwMDAwOwoJcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKCXBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwoJcGF0dGVybl8zWzFdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzRdID0gMHgwMDA4MDAwMDsKCXBhdHRlcm5fM1sxXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbMl1bMF0gPSAweDAwMTAwMDAwOwoJcGF0dGVybl8zWzJdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzRdID0gMHgwMDIwMDAwMDsKCXBhdHRlcm5fM1syXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzddID0gMHgwMDAwMDAwMDsKCglwYXR0ZXJuXzNbM11bMF0gPSAweDAwNDAwMDAwOwoJcGF0dGVybl8zWzNdWzFdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVsyXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bM10gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzRdID0gMHgwMDgwMDAwMDsKCXBhdHRlcm5fM1szXVs1XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzddID0gMHgwMDAwMDAwMDsKCgkvLy8qCglwYXR0ZXJuXzRbMF1bMF0gPQkweDUxYzhjMDQ5CTsKCXBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwoJcGF0dGVybl80WzBdWzJdID0JMHgwNzc3YjUwYgk7CglwYXR0ZXJuXzRbMF1bM10gPQkweDljZDJlYmU1CTsKCXBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwoJcGF0dGVybl80WzBdWzVdID0JMHhkYzk2OGRjMAk7CglwYXR0ZXJuXzRbMF1bNl0gPQkweGI4YmE4YTMzCTsKCXBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKCXBhdHRlcm5fNFsxXVswXSA9CTB4YWUzN2MwNDkJOwoJcGF0dGVybl80WzFdWzFdID0JMHhkMmJjNTkyYwk7CglwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKCXBhdHRlcm5fNFsxXVszXSA9CTB4NjMyZGViZTUJOwoJcGF0dGVybl80WzFdWzRdID0JMHgzZmJlOTlkNQk7CglwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKCXBhdHRlcm5fNFsxXVs2XSA9CTB4NDc0NThhMzMJOwoJcGF0dGVybl80WzFdWzddID0JMHhjYTFiMzI3Zgk7CgoJcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CglwYXR0ZXJuXzRbMl1bMV0gPQkweDJkYmNhNjJjCTsKCXBhdHRlcm5fNFsyXVsyXSA9CTB4MDc4ODRhMGIJOwoJcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CglwYXR0ZXJuXzRbMl1bNF0gPQkweGMwYmU2NmQ1CTsKCXBhdHRlcm5fNFsyXVs1XSA9CTB4ZGM2OTcyYzAJOwoJcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CglwYXR0ZXJuXzRbMl1bN10gPQkweDM1MWJjZDdmCTsKCgoJcGF0dGVybl80WzNdWzBdID0JMHg1MWM4YzA0OQk7CglwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKCXBhdHRlcm5fNFszXVsyXSA9CTB4MDc3N2I1MGIJOwoJcGF0dGVybl80WzNdWzNdID0JMHg5Y2QyZWJlNQk7CglwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKCXBhdHRlcm5fNFszXVs1XSA9CTB4ZGM5NjhkYzAJOwoJcGF0dGVybl80WzNdWzZdID0JMHhiOGJhOGEzMwk7CglwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCglwYXR0ZXJuXzVbMF1bMF0gPQkweGFlYzljMTQ5CTsKCXBhdHRlcm5fNVswXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbMF1bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVswXVs0XSA9CTB4M2Y0MzliZDUJOwoJcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbMF1bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVswXVs3XSA9CTB4Y2FlNDMyN2YJOwoJcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CglwYXR0ZXJuXzVbMV1bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVsxXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbMV1bNF0gPQkweDNmNDk5MWQ1CTsKCXBhdHRlcm5fNVsxXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbMV1bN10gPQkweGNhZTQzMjdmCTsKCXBhdHRlcm5fNVsyXVswXSA9CTB4YWVkOGQwNDkJOwoJcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbMl1bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVsyXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CglwYXR0ZXJuXzVbMl1bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVsyXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CglwYXR0ZXJuXzVbM11bMF0gPQkweGFlODg4MDQ5CTsKCXBhdHRlcm5fNVszXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbM11bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVszXVs0XSA9CTB4M2ZjMTE5ZDUJOwoJcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbM11bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVszXVs3XSA9CTB4Y2FlNDMyN2YJOwoKCXBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKCXBhdHRlcm5fNlswXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzBdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlswXVs0XSA9CTB4M2Y0MzY2ZDUJOwoJcGF0dGVybl82WzBdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlswXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzFdWzBdID0JMHhhZWNjM2Y0OQk7CglwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsxXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzFdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKCXBhdHRlcm5fNlsxXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzFdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlsyXVswXSA9CTB4YWVkODNmNDkJOwoJcGF0dGVybl82WzJdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlsyXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzJdWzRdID0JMHgzZjYxNjZkNQk7CglwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlsyXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzJdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKCXBhdHRlcm5fNlszXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzNdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlszXVs0XSA9CTB4M2ZjMTY2ZDUJOwoJcGF0dGVybl82WzNdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlszXVs3XSA9CTB4Y2FlNGNkN2YJOwoJLy8qLwoJLy8qLwoKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIGxmbGFnID0gMDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2FkZHI7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MDsKCWVycm9yX2NvdW50ID0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJaWYgKGFyZ2MgPT0gMSkKCQlnb3RvIHVzYWdlOwoJaWYgKGFyZ2M+MSkKCXsKCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJsIikgPT0gMCkgewoJCQlsZmxhZyA9IDE7CgkJfQoKCQllbHNlewoJCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoJCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQkJbG9vcCA9IDE7CgkJfQoKCQkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCWlmIChhcmdjID09MSkgewoJCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCQkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQkJbG9vcCA9IDE7CgoJCX0KCX0KCgoKCWlmIChhcmdjID49IDIpIHsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoKCX0KCXVuc2lnbmVkIGludCBwYXR0ZXJuX2ZsYWcxPTE7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9mbGFnMj0xOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZmxhZzM9MTsKCXBhdHRlcm5fZmxhZzEgPSAxOwoJcGF0dGVybl9mbGFnMj0xOwoJcGF0dGVybl9mbGFnMyA9IDE7CgoKCWlmIChhcmdjID49IDMgICkgewoJCWlmICggKHN0cmNtcChhcmd2WzJdLCAicyIpID09IDApKQoJCXsKCQkJcGF0dGVybl9mbGFnMSA9IDE7CgkJCXBhdHRlcm5fZmxhZzI9MDsKCQkJcGF0dGVybl9mbGFnMyA9IDA7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSkKCQl7CgkJCXBhdHRlcm5fZmxhZzEgPSAwOwoJCQlwYXR0ZXJuX2ZsYWcyPTE7CgkJCXBhdHRlcm5fZmxhZzMgPSAwOwoJCX0KCQllbHNlICBpZiAoIChzdHJjbXAoYXJndlsyXSwgImQiKSA9PSAwKSkKCQl7CgkJCXBhdHRlcm5fZmxhZzEgPSAwOwoJCQlwYXR0ZXJuX2ZsYWcyPTA7CgkJCXBhdHRlcm5fZmxhZzMgPSAxOwoJCX0KCX0KCgkvLwlpZih0ZXN0X3NpemU8MHgyMCkKCXN0YXJ0X2FkZHI9MHgxMDAwMDAwMDsKCXRlc3Rfc2l6ZSA9IDB4MjA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9rPTA7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9vWzhdOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKCgoJLy9ERFJfVEVTVF9TVEFSVDoKCgkvLy8qCgllcnJvcl9jb3VudD0wOwoJZG8gewoJCWlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKCgkJLy9pZihvbGRfcGF0dGVybl9mbGFnPT0xKQoJCXsKCgkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLlxuIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJCQkvKgoJCQkgICBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKSB7CgkJCSAgIHsKCgkJCSAgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCSAgIHsKCQkJICAgdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCSAqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCX0KCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CgkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkKCQkJe2Vycm9yX2NvdW50Kys7CgkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCX0KCQkJfQoJCQl9CgkJCX0KCQkJKi8KCQkJaWYgKHBhdHRlcm5fZmxhZzEgPT0gMSkgewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCQkJCQkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQlwcmludGYoInA0IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmIChwYXR0ZXJuX2ZsYWcyID09IDEpIHsKCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNSBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJfQoKCQkJaWYgKHBhdHRlcm5fZmxhZzMgPT0gMSkgewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8gcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJCQkJCQlpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpKSAhPSBwYXR0ZXJuX2RbdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDYgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCgoJCX0KCgkJcHJpbnRmKCJcRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCQlwcmludGYoIlxuICAgICAgXG4iKTsKCX13aGlsZSgtLWxvb3ApOwoJLy8qLwoKCXByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgoKVV9CT09UX0NNRCgKCWRkcnRlc3RfZ3hfY3Jvc3N0YWxrLAk1LAkxLAlkb19kZHJfZ3hfY3Jvc3N0YWxrLAoJIkREUiB0ZXN0IGZ1bmN0aW9uIiwKCSJkZHJ0ZXN0IFtMT09QXSBbQUREUl0uRGVmYXVsdCBhZGRyZXNzIGlzIDB4MTAwMDAwMDBcbiIKKTsKCgoKLy8jaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfR1hfVFZfQkFCWSkKaW50IGRvX2Rkcl9neHR2YmJfY3Jvc3N0YWxrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8vKgoJdW5zaWduZWQgaW50ICBhX2Rlc1s4XSxiX2Rlc1s4XSxkZXNbOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzFbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzJbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzNbNF1bOF0gOwoJLy8gdW5zaWduZWQgaW50ICBwYXR0ZXJuXzRbNF1bOF0gOwoJLy8gdW5zaWduZWQgaW50ICBwYXR0ZXJuXzVbNF1bOF0gOwoJLy8gIHVuc2lnbmVkIGludCAgcGF0dGVybl82WzRdWzhdIDsKCgoJYV9kZXNbMF0gPSAgICAgIDB4N2VhMDliNTI7CglhX2Rlc1sxXSA9ICAgICAgMHhiYzU3YmIyMzsKCWFfZGVzWzJdID0gICAgICAweDhkMmI2ZTY1OwoJYV9kZXNbM10gPSAgICAgIDB4MTVmZGNkYzQ7CglhX2Rlc1s0XSA9ICAgICAgMHhiYzFkZjQ1MzsKCWFfZGVzWzVdID0gICAgICAweDIxYmNiY2RmOwoJYV9kZXNbNl0gPSAgICAgIDB4MjY3YjdhYzE7CglhX2Rlc1s3XSA9ICAgICAgMHg2YWYwM2Q3MjsKCgoJYl9kZXNbMF0gPSAgICAgIDB4ZGZjMmVlMTI7CgliX2Rlc1sxXSA9ICAgICAgMHg0ZjU4ZGE0MzsKCWJfZGVzWzJdID0gICAgICAweDg3ODA5NTU3OwoJYl9kZXNbM10gPSAgICAgIDB4Yjg3ZGRiZjQ7CgliX2Rlc1s0XSA9ICAgICAgMHg2NjdmYjAyMTsKCWJfZGVzWzVdID0gICAgICAweDY0NTkzNTg2OwoJYl9kZXNbNl0gPSAgICAgIDB4ZWU3M2Q4ZDU7CgliX2Rlc1s3XSA9ICAgICAgMHhlNjVmOTcyZDsKCXBhdHRlcm5fMVswXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMVsxXVswXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bMV0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzJdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVszXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNF0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzVdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs2XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bN10gPSAweDAwZmZmZjAwOwoKCXBhdHRlcm5fMVsyXVswXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bMV0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzJdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVszXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNF0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzVdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs2XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bN10gPSAweGZmZmYwMDAwOwoKCXBhdHRlcm5fMVszXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMlswXVswXSA9IDB4MDAwMWZlMDA7CglwYXR0ZXJuXzJbMF1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNF0gPSAweDAwMDJmZDAwOwoJcGF0dGVybl8yWzBdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsxXVswXSA9IDB4MDAwNGZiMDA7CglwYXR0ZXJuXzJbMV1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNF0gPSAweDAwMDhmNzAwOwoJcGF0dGVybl8yWzFdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsyXVswXSA9IDB4MDAxMGVmMDA7CglwYXR0ZXJuXzJbMl1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNF0gPSAweDAwMjBkZjAwOwoJcGF0dGVybl8yWzJdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlszXVswXSA9IDB4MDA0MGJmMDA7CglwYXR0ZXJuXzJbM11bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNF0gPSAweDAwODA3ZjAwOwoJcGF0dGVybl8yWzNdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fM1swXVswXSA9IDB4MDAwMTAwMDA7CglwYXR0ZXJuXzNbMF1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNF0gPSAweDAwMDIwMDAwOwoJcGF0dGVybl8zWzBdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1sxXVswXSA9IDB4MDAwNDAwMDA7CglwYXR0ZXJuXzNbMV1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNF0gPSAweDAwMDgwMDAwOwoJcGF0dGVybl8zWzFdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1syXVswXSA9IDB4MDAxMDAwMDA7CglwYXR0ZXJuXzNbMl1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNF0gPSAweDAwMjAwMDAwOwoJcGF0dGVybl8zWzJdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1szXVswXSA9IDB4MDA0MDAwMDA7CglwYXR0ZXJuXzNbM11bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNF0gPSAweDAwODAwMDAwOwoJcGF0dGVybl8zWzNdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bN10gPSAweDAwMDAwMDAwOwoKCS8qCgkgICBwYXR0ZXJuXzRbMF1bMF0gPQkweDUxYzhjMDQ5CTsKCSAgIHBhdHRlcm5fNFswXVsxXSA9CTB4MmQ0MzU5MmMJOwoJICAgcGF0dGVybl80WzBdWzJdID0JMHgwNzc3YjUwYgk7CgkgICBwYXR0ZXJuXzRbMF1bM10gPQkweDljZDJlYmU1CTsKCSAgIHBhdHRlcm5fNFswXVs0XSA9CTB4YzA0MTk5ZDUJOwoJICAgcGF0dGVybl80WzBdWzVdID0JMHhkYzk2OGRjMAk7CgkgICBwYXR0ZXJuXzRbMF1bNl0gPQkweGI4YmE4YTMzCTsKCSAgIHBhdHRlcm5fNFswXVs3XSA9CTB4MzVlNDMyN2YJOwoKCSAgIHBhdHRlcm5fNFsxXVswXSA9CTB4YWUzN2MwNDkJOwoJICAgcGF0dGVybl80WzFdWzFdID0JMHhkMmJjNTkyYwk7CgkgICBwYXR0ZXJuXzRbMV1bMl0gPQkweGY4ODhiNTBiCTsKCSAgIHBhdHRlcm5fNFsxXVszXSA9CTB4NjMyZGViZTUJOwoJICAgcGF0dGVybl80WzFdWzRdID0JMHgzZmJlOTlkNQk7CgkgICBwYXR0ZXJuXzRbMV1bNV0gPQkweDIzNjk4ZGMwCTsKCSAgIHBhdHRlcm5fNFsxXVs2XSA9CTB4NDc0NThhMzMJOwoJICAgcGF0dGVybl80WzFdWzddID0JMHhjYTFiMzI3Zgk7CgoJICAgcGF0dGVybl80WzJdWzBdID0JMHg1MTM3M2Y0OQk7CgkgICBwYXR0ZXJuXzRbMl1bMV0gPQkweDJkYmNhNjJjCTsKCSAgIHBhdHRlcm5fNFsyXVsyXSA9CTB4MDc4ODRhMGIJOwoJICAgcGF0dGVybl80WzJdWzNdID0JMHg5YzJkMTRlNQk7CgkgICBwYXR0ZXJuXzRbMl1bNF0gPQkweGMwYmU2NmQ1CTsKCSAgIHBhdHRlcm5fNFsyXVs1XSA9CTB4ZGM2OTcyYzAJOwoJICAgcGF0dGVybl80WzJdWzZdID0JMHhiODQ1NzUzMwk7CgkgICBwYXR0ZXJuXzRbMl1bN10gPQkweDM1MWJjZDdmCTsKCgoJICAgcGF0dGVybl80WzNdWzBdID0JMHg1MWM4YzA0OQk7CgkgICBwYXR0ZXJuXzRbM11bMV0gPQkweDJkNDM1OTJjCTsKCSAgIHBhdHRlcm5fNFszXVsyXSA9CTB4MDc3N2I1MGIJOwoJICAgcGF0dGVybl80WzNdWzNdID0JMHg5Y2QyZWJlNQk7CgkgICBwYXR0ZXJuXzRbM11bNF0gPQkweGMwNDE5OWQ1CTsKCSAgIHBhdHRlcm5fNFszXVs1XSA9CTB4ZGM5NjhkYzAJOwoJICAgcGF0dGVybl80WzNdWzZdID0JMHhiOGJhOGEzMwk7CgkgICBwYXR0ZXJuXzRbM11bN10gPQkweDM1ZTQzMjdmCTsKCgkgICBwYXR0ZXJuXzVbMF1bMF0gPQkweGFlYzljMTQ5CTsKCSAgIHBhdHRlcm5fNVswXVsxXSA9CTB4ZDI0MzU5MmMJOwoJICAgcGF0dGVybl81WzBdWzJdID0JMHhmODc3YjUwYgk7CgkgICBwYXR0ZXJuXzVbMF1bM10gPQkweDYzZDJlYmU1CTsKCSAgIHBhdHRlcm5fNVswXVs0XSA9CTB4M2Y0MzliZDUJOwoJICAgcGF0dGVybl81WzBdWzVdID0JMHgyMzk2OGRjMAk7CgkgICBwYXR0ZXJuXzVbMF1bNl0gPQkweDQ3YmE4YTMzCTsKCSAgIHBhdHRlcm5fNVswXVs3XSA9CTB4Y2FlNDMyN2YJOwoJICAgcGF0dGVybl81WzFdWzBdID0JMHhhZWNjYzQ0OQk7CgkgICBwYXR0ZXJuXzVbMV1bMV0gPQkweGQyNDM1OTJjCTsKCSAgIHBhdHRlcm5fNVsxXVsyXSA9CTB4Zjg3N2I1MGIJOwoJICAgcGF0dGVybl81WzFdWzNdID0JMHg2M2QyZWJlNQk7CgkgICBwYXR0ZXJuXzVbMV1bNF0gPQkweDNmNDk5MWQ1CTsKCSAgIHBhdHRlcm5fNVsxXVs1XSA9CTB4MjM5NjhkYzAJOwoJICAgcGF0dGVybl81WzFdWzZdID0JMHg0N2JhOGEzMwk7CgkgICBwYXR0ZXJuXzVbMV1bN10gPQkweGNhZTQzMjdmCTsKCSAgIHBhdHRlcm5fNVsyXVswXSA9CTB4YWVkOGQwNDkJOwoJICAgcGF0dGVybl81WzJdWzFdID0JMHhkMjQzNTkyYwk7CgkgICBwYXR0ZXJuXzVbMl1bMl0gPQkweGY4NzdiNTBiCTsKCSAgIHBhdHRlcm5fNVsyXVszXSA9CTB4NjNkMmViZTUJOwoJICAgcGF0dGVybl81WzJdWzRdID0JMHgzZjYxYjlkNQk7CgkgICBwYXR0ZXJuXzVbMl1bNV0gPQkweDIzOTY4ZGMwCTsKCSAgIHBhdHRlcm5fNVsyXVs2XSA9CTB4NDdiYThhMzMJOwoJICAgcGF0dGVybl81WzJdWzddID0JMHhjYWU0MzI3Zgk7CgkgICBwYXR0ZXJuXzVbM11bMF0gPQkweGFlODg4MDQ5CTsKCSAgIHBhdHRlcm5fNVszXVsxXSA9CTB4ZDI0MzU5MmMJOwoJICAgcGF0dGVybl81WzNdWzJdID0JMHhmODc3YjUwYgk7CgkgICBwYXR0ZXJuXzVbM11bM10gPQkweDYzZDJlYmU1CTsKCSAgIHBhdHRlcm5fNVszXVs0XSA9CTB4M2ZjMTE5ZDUJOwoJICAgcGF0dGVybl81WzNdWzVdID0JMHgyMzk2OGRjMAk7CgkgICBwYXR0ZXJuXzVbM11bNl0gPQkweDQ3YmE4YTMzCTsKCSAgIHBhdHRlcm5fNVszXVs3XSA9CTB4Y2FlNDMyN2YJOwoKCXBhdHRlcm5fNlswXVswXSA9ICAgMHhhZWM5M2Y0OSAgIDsKCXBhdHRlcm5fNlswXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzBdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMF1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlswXVs0XSA9CTB4M2Y0MzY2ZDUJOwoJcGF0dGVybl82WzBdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMF1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlswXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzFdWzBdID0JMHhhZWNjM2Y0OQk7CglwYXR0ZXJuXzZbMV1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsxXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzFdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMV1bNF0gPQkweDNmNDk2NmQ1CTsKCXBhdHRlcm5fNlsxXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzFdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMV1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlsyXVswXSA9CTB4YWVkODNmNDkJOwoJcGF0dGVybl82WzJdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMl1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlsyXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzJdWzRdID0JMHgzZjYxNjZkNQk7CglwYXR0ZXJuXzZbMl1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlsyXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzJdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbM11bMF0gPQkweGFlODgzZjQ5CTsKCXBhdHRlcm5fNlszXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzNdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbM11bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlszXVs0XSA9CTB4M2ZjMTY2ZDUJOwoJcGF0dGVybl82WzNdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbM11bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlszXVs3XSA9CTB4Y2FlNGNkN2YJOwoJKi8KCQkvLyovCgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIHRlc3RfYWRkcjsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJZXJyb3JfY291bnQgPTA7CgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJaWYgKGFyZ2MgPT0gMSkKCQlnb3RvIHVzYWdlOwoJaWYgKGFyZ2M+MSkKCXsKCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICJsIikgPT0gMCkgewoJCQlsZmxhZyA9IDE7CgkJfQoKCQllbHNlewoJCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoJCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQkJbG9vcCA9IDE7CgkJfQoKCQkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJCWlmIChhcmdjID09MSkgewoJCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCQkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQkJbG9vcCA9IDE7CgkJfQoJfQoKCWlmIChhcmdjID49IDIpIHsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoKCX0KCXVuc2lnbmVkIGludCBwYXR0ZXJuX2ZsYWcxPTE7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9mbGFnMj0xOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZmxhZzM9MTsKCXBhdHRlcm5fZmxhZzEgPSAxOwoJcGF0dGVybl9mbGFnMj0xOwoJcGF0dGVybl9mbGFnMyA9IDE7CgoKCWlmIChhcmdjID49IDMgICkgewoJCWlmICggKHN0cmNtcChhcmd2WzJdLCAicyIpID09IDApKQoJCXsKCQkJcGF0dGVybl9mbGFnMSA9IDE7CgkJCXBhdHRlcm5fZmxhZzI9MDsKCQkJcGF0dGVybl9mbGFnMyA9IDA7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsyXSwgImMiKSA9PSAwKSkKCQl7CgkJCXBhdHRlcm5fZmxhZzEgPSAwOwoJCQlwYXR0ZXJuX2ZsYWcyPTE7CgkJCXBhdHRlcm5fZmxhZzMgPSAwOwoJCX0KCQllbHNlICBpZiAoIChzdHJjbXAoYXJndlsyXSwgImQiKSA9PSAwKSkKCQl7CgkJCXBhdHRlcm5fZmxhZzEgPSAwOwoJCQlwYXR0ZXJuX2ZsYWcyPTA7CgkJCXBhdHRlcm5fZmxhZzMgPSAxOwoJCX0KCX0KCgkvLwlpZih0ZXN0X3NpemU8MHgyMCkKCXN0YXJ0X2FkZHI9MHgxMDAwMDAwMDsKCXRlc3Rfc2l6ZSA9IDB4MjA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9rPTA7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9vWzhdOwoJdW5zaWduZWQgaW50IHBhdHRlcm5fZFs4XTsKCS8vdW5zaWduZWQgaW50IGk9MDsKCglwcmludGYoIlxubG9vcCBzaG91bGQgPjIgYW5kIG5vdyBsb29wPT0gMHglMDh4XG4iLCBsb29wKTsKCS8vRERSX1RFU1RfU1RBUlQ6CgoJLy8vKgoKCWVycm9yX2NvdW50PTA7CglkbyB7CgkJaWYgKGxmbGFnKQoJCQlsb29wID0gODg4OwoJCWlmIChsb29wJTIpCgkJewoJCQlzdGFydF9hZGRyPTB4MTAwMDAwMDA7CgkJCXRlc3Rfc2l6ZSA9IDB4MjA7CgkJCWZvciAoKGk9MCk7KGk8OCk7KGkrKykpCgkJCXsKCQkJCWRlc1tpXT0gIGFfZGVzW2ldOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCXN0YXJ0X2FkZHI9MHgxMDAwMDQwMDsKCQkJdGVzdF9zaXplID0gMHgyMDsKCQkJZm9yICgoaT0wKTsoaTw4KTsoaSsrKSkKCQkJewoJCQkJZGVzW2ldPSAgYl9kZXNbaV07CgkJCX0KCQl9CgkJLy9pZihvbGRfcGF0dGVybl9mbGFnPT0xKQoJCXsKCgkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLlxuIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJCQkvKgoJCQkgICBmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKSB7CgkJCSAgIHsKCgkJCSAgIGZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCSAgIHsKCQkJICAgdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCSAqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCX0KCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CgkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQlpZiAocGF0dGVybl9vW3RlbXBfaV0gIT0gcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkKCQkJe2Vycm9yX2NvdW50Kys7CgkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCX0KCQkJfQoJCQl9CgkJCX0KCQkJKi8KCQkJaWYgKHBhdHRlcm5fZmxhZzEgPT0gMSkgewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vCWlmKHBhdHRlcm5fb1t0ZW1wX2ldIT1wYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJaWYgKChwYXR0ZXJuX29bdGVtcF9pXSkgIT0gKGRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpKSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCS8vICAgICAgICAgICAgICAgIHByaW50ZigicDRFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkJcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSkscGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJLy8gICAgICAgICAgICAgICAgICAgICBwcmludGYoInA0IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQkJcHJpbnRmKCJwNCBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4oZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSkpLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKHBhdHRlcm5fZmxhZzIgPT0gMSkgewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vCWlmKHBhdHRlcm5fb1t0ZW1wX2ldIT1wYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJaWYgKChwYXR0ZXJuX29bdGVtcF9pXSkgIT0gKGRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpKSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCS8vICAgICAgICAgICBwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJCXByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIGRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJCQkJCQlpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpKSAhPSBwYXR0ZXJuX2RbdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCS8vICAgICAgICAgIHByaW50ZigicDUgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCQlwcmludGYoInA1IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihkZXNfaW52X3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSkpLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCX0KCgkJCWlmIChwYXR0ZXJuX2ZsYWczID09IDEpIHsKCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9pZihwYXR0ZXJuX29bdGVtcF9pXSE9cGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSkKCQkJCQkJCWlmICgocGF0dGVybl9vW3RlbXBfaV0pICE9IChkZXNfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKSkpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQkvLyAgICAgICBwcmludGYoInA2RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJCXByaW50ZigicDZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIGRlc19wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpLHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLyBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCQkJCQkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQkvLyAgICAgICBwcmludGYoInA2IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQkJcHJpbnRmKCJwNiBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4oZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgoKCQl9CgoJCXByaW50ZigiXEVycm9yIGNvdW50PT0weCUwOHgiLCBlcnJvcl9jb3VudCk7CgkJcHJpbnRmKCJcbiAgICAgIFxuIik7Cgl9d2hpbGUoLS1sb29wKTsKCS8vKi8KCglwcmludGYoIlxyRW5kIGRkciB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQoKClVfQk9PVF9DTUQoCglkZHJ0ZXN0X2d4dHZiYl9jcm9zc3RhbGssCTUsCTEsCWRvX2Rkcl9neHR2YmJfY3Jvc3N0YWxrLAoJIkREUiB0ZXN0IGZ1bmN0aW9uIiwKCSJkZHJ0ZXN0IFtMT09QXSBbQUREUl0uRGVmYXVsdCBhZGRyZXNzIGlzIDB4MTAwMDAwMDBcbiIKKTsKCiNpZiAxCmludCBkb19kZHJ0ZXN0X2ZpbmRfZ2F0ZV93aW5kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIFR1bmUgZGRyIGRxcyBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7CgkvLyAgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgkvLyAvKgoJLy8gI2RlZmluZSAgREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEggIDEyCgojZGVmaW5lICBEQVRYOF9EUV9MQU5FX1dJRFRIICA0CiNkZWZpbmUgIENIQU5ORUxfQ0hBTk5FTF9XSURUSCAgMgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMCAgMAojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMSAgMQojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMiAgMgojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMyAgMwoKI2RlZmluZSAgREFUWDhfRFFfQkRMUjAgIDAKI2RlZmluZSAgREFUWDhfRFFfQkRMUjEgIDEKI2RlZmluZSAgREFUWDhfRFFfQkRMUjIgIDIKI2RlZmluZSAgREFUWDhfRFFfQkRMUjMgIDMKI2RlZmluZSAgREFUWDhfRFFfQkRMUjQgIDQKI2RlZmluZSAgREFUWDhfRFFfQkRMUjUgIDUKI2RlZmluZSAgREFUWDhfRFFfQkRMUjYgIDYKI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIwICAgICA3CiNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMSAgICAgOAojZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjIgICAgIDkKI2RlZmluZSAgREFUWDhfRFFfRFhOTURMUiAgICAgICAgMTAKI2RlZmluZSAgREFUWDhfRFFfRFhOR1RSICAgICAgICAgIDExCgoKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKCS8vICNkZWZpbmUgIERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCAgNS8vREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgqREFUWDhfRFFfTEFORV9XSURUSAoJLy8gICAgI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNICAgIERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCpDSEFOTkVMX0NIQU5ORUxfV0lEVEgKCS8vKi8KCgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX29yZ1tEUV9MQ0RfQkRMX1JFR19OVU1dOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRbRFFfTENEX0JETF9SRUdfTlVNXTsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2luZGV4W0RRX0xDRF9CRExfUkVHX05VTV07CgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW0RRX0xDRF9CRExfUkVHX05VTV07CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW0RRX0xDRF9CRExfUkVHX05VTV07CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9taW47CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9tYXg7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCS8vICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDsKCgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCS8vICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyOwoJLy8gICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzOwoJLy8gICAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW47CgkvLyAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluOwoKCXVuc2lnbmVkIGludCAgIGRxZ3RyX29yZ1s0XSxkcWxjZGxyMl9vcmdbNF0sZHFndHJfbFs0XSxkcWxjZGxyMl9sWzRdLGRxZ3RyX3JbNF0sZHFsY2RscjJfcls0XSxkcW1kbHJbNF07Cgl1bnNpZ25lZCBpbnQgZHFndHJfdGVtcDsKCXVuc2lnbmVkIGludCBkcWxjZGxyMl90ZW1wOwoJdW5zaWduZWQgaW50IGRxcXNnYXRlX29yZ1s0XSxkcXFzZ2F0ZV9sWzRdLCBkcXFzZ2F0ZV9yWzRdOwoJdW5zaWduZWQgaW50ICAgZGRyX2dhdGVfdXBfZG93bj0wOwoJdW5zaWduZWQgaW50ICAgZGRyX2dhdGVfaW5pdF9sYW5lPTA7CgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2JfZW4gPSAxOwoJCX0KCQllbHNlCgkJewoJCQlnb3RvIHVzYWdlOwoJCX0KCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCgl9CglpZiAoYXJnYyA+NCkgewoJCXRlc3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9sb29wID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbG9vcCA9IDEwMDAwMDsKCQl9Cgl9CgoKCWlmIChhcmdjID41KSB7CgkJZGRyX2dhdGVfdXBfZG93biA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2dhdGVfdXBfZG93biA9IDA7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls1XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNV0sICJMIikgPT0gMCkpCgkJewoJCQlkZHJfZ2F0ZV91cF9kb3duID0gMDAwMDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjYpIHsKCQlkZHJfZ2F0ZV9pbml0X2xhbmUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9nYXRlX2luaXRfbGFuZSA9IDA7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls2XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNl0sICJMIikgPT0gMCkpCgkJewoJCQlkZHJfZ2F0ZV9pbml0X2xhbmUgPSAwMDAwMDsKCQl9Cgl9CgoKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCXByaW50ZigiXG5kZHJfZ2F0ZV91cF9kb3duPT0gMHglMDh4XG4iLCBkZHJfZ2F0ZV91cF9kb3duKTsKCXByaW50ZigiXG5kZHJfZ2F0ZV9pbml0X2xhbmU9PSAweCUwOHhcbiIsIGRkcl9nYXRlX2luaXRfbGFuZSk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoKCgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCXsKCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJewoJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQl9CgoJCQlmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQoJCQl7CgoJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCXsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMExDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQl9CgkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgkJCQl7CgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFMQ0RMUjArcmVnX2Jhc2VfYWRqOwoJCQkJfQoJCQkJZWxzZSAgIAkgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMikKCQkJCXsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkxDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQl9IGVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCXsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYM0xDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQl9CgkJCX0KCQl9Cgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCgoJZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBsYW5lPT0weCUwOHhcbiAiLHRlbXBfY291bnRfaSk7CgkJCQkJaWYgKGRkcl9nYXRlX2luaXRfbGFuZSkKCQkJCQl7CgkJCQkJCXRlbXBfY291bnRfaT1kZHJfZ2F0ZV9pbml0X2xhbmU7CgkJCQkJCXByaW50ZigiXG50ZXN0IGxhbmUgY2hhbmdlPT0weCUwOHhcbiAiLHRlbXBfY291bnRfaSk7CgkJCQkJfQoKCgkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwTENETFIwK3JlZ19iYXNlX2FkajsKCQkJCQl9CgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFMQ0RMUjArcmVnX2Jhc2VfYWRqOwoJCQkJCX0KCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJMQ0RMUjArcmVnX2Jhc2VfYWRqOwoJCQkJCX0KCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYM0xDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQkJfQoKCQkJCQkvLyBmb3IoKHRlbXBfY291bnRfaz0wKTsodGVtcF9jb3VudF9rPDIpOyh0ZW1wX2NvdW50X2srKykpCgkJCQkJewoJCQkJCQkvL2lmKHRlbXBfY291bnRfaz09MCkKCQkJCQkJewoJCQkJCQkJZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV09cmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjItRERSMF9QVUJfRFgwTENETFIwKTsKCQkJCQkJCWRxZ3RyX29yZ1t0ZW1wX2NvdW50X2ldPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCk7CgkJCQkJCQlkcW1kbHJbdGVtcF9jb3VudF9pXT1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDTURMUi1ERFIwX1BVQl9EWDBMQ0RMUjApOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKigoZHFndHJfb3JnW3RlbXBfY291bnRfaV0pJihEWE5HVFJfTUFYKSkrKCgoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCk7CgkJCQkJCQlkcXFzZ2F0ZV9vcmdbdGVtcF9jb3VudF9pXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKCQkJCQkJCXByaW50ZigiXG5nYXRlIG9yZz09MHglMDh4ICAweCUwOHggICAweCUwOHggMHglMDh4XG4gIixkcXFzZ2F0ZV9vcmdbdGVtcF9jb3VudF9pXSxkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSxkcWxjZGxyMl9vcmdbdGVtcF9jb3VudF9pXSwgZHFtZGxyW3RlbXBfY291bnRfaV0pOwoKCQkJCQkJCWlmIChkZHJfZ2F0ZV91cF9kb3duID09IDApCgkJCQkJCQl7CgkJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+MCkKCQkJCQkJCQl7CgkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgkJCQkJCQkJCXByaW50ZigiXG5nYXRlIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQkJZHFndHJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCQkJCQkJCQkJZHFsY2RscjJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLWRxZ3RyX3RlbXAqKCgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIpOwoKCQkJCQkJCQkJd3JpdGVsKChkcWxjZGxyMl90ZW1wKSwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjItRERSMF9QVUJfRFgwTENETFIwKSk7CgkJCQkJCQkJCXdyaXRlbCgoKChyZWFkbCgocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSkpJjB4ZmZmZmYwMDApfChkcWd0cl90ZW1wKSksKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJCQlwcmludGYoIlxuIChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApIDB4JTA4eCBndHI9PTB4JTA4eFxuICIsKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCksKHJlYWRsKChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKSkpOwoJCQkJCQkJCQlwcmludGYoIlxubGNkbHIyPT0weCUwOHhcbiAiLHJlYWRsKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJCQlwcmludGYoIlxuZHFndHJfdGVtcD09MHglMDh4XG4gIixkcWd0cl90ZW1wKTsKCQkJCQkJCQkJcHJpbnRmKCJcbmdhdGVkcWxjZGxyMl90ZW1wPT0weCUwOHhcbiAiLGRxbGNkbHIyX3RlbXApOwoJCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXByaW50ZigiXG5nYXRlbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJcHJpbnRmKCJcbmdhdGUgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCXByaW50ZigiXG5nYXRlIGxlZnQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQkvL2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfbWluPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCQkJZHFxc2dhdGVfbFt0ZW1wX2NvdW50X2ldPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCQkJd3JpdGVsKGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCQkJCQkJCQl3cml0ZWwoIGRxZ3RyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKigoZHFndHJfb3JnW3RlbXBfY291bnRfaV0pJkRYTkdUUl9NQVgpKygoKGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpOwoJCQkJCQkJfQoJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQkJcHJpbnRmKCJcbmdhdGUgcmlnIHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQkJZHFndHJfdGVtcD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCQkJCQkJCQlkcWxjZGxyMl90ZW1wPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtZHFndHJfdGVtcCooKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CgoJCQkJCQkJCXdyaXRlbCgoZHFsY2RscjJfdGVtcCksKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJCXdyaXRlbCgoKHJlYWRsKChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKSkmMHhmZmZmZjAwMCl8KGRxZ3RyX3RlbXApLChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCQkJCQkJCQlwcmludGYoIlxuIChyZWdfYWRkRERSMF9QVUJfRFgwR1RSKSAweCUwOHggZ3RyPT0weCUwOHhcbiAiLChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApLChyZWFkbCgocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSkpKTsKCQkJCQkJCQlwcmludGYoIlxubGNkbHIyPT0weCUwOHhcbiAiLHJlYWRsKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJCXByaW50ZigiXG5kcWd0cl90ZW1wPT0weCUwOHhcbiAiLGRxZ3RyX3RlbXApOwoJCQkJCQkJCXByaW50ZigiXG5nYXRlZHFsY2RscjJfdGVtcD09MHglMDh4XG4gIixkcWxjZGxyMl90ZW1wKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCXByaW50ZigiXG5nYXRlcmlnIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbmdhdGUgcmlnIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxuZ2F0ZSByaWcgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCS8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9tYXg9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJCWRxcXNnYXRlX3JbdGVtcF9jb3VudF9pXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQkJd3JpdGVsKGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldLChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCQkJCQkJCXdyaXRlbCggZHFndHJfb3JnW3RlbXBfY291bnRfaV0sKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpOwoKCgoKCgoJCQkJCQl9CgoKCgkJCQkJfQoJCQkJfQoKCQkJfQoJCX0KCgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCgoJCS8vLy9jYWxjdWxhdGUgYW5kIHByaW50ICBkcXMgdmFsdWUKCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJewoJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQl7CgkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCX0KCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBMQ0RMUjArcmVnX2Jhc2VfYWRqOwoKCgoKCQkJcHJpbnRmKCJcbiBkZHJ0ZXN0IHNpemUgPT0weCUwOHgsIHRlc3QgdGltZXM9PTB4JTA4eCx0ZXN0X2xvb3A9PTB4JTA4eFxuIixkZHJfdGVzdF9zaXplLCh0ZXN0X3RpbWVzKzEpLHRlc3RfbG9vcCk7CgkJCXByaW50ZigiXG4gYWRkICAweDAwMDAwMDAwIHJlZz09ICAgIG9yZyAgICAgICAgICAgbGVmICAgICAgICAgICByaWcgICAgICAgICAgIGNlbnRlciAgICAgICAgd2luICAgICAgICAgICBsZWZfbSAgICAgICAgIHJpZ19tICAgICAgICAgbWluX2MgICAgICAgICBtaW5fd2luICAgICAgICBcbiIpOwoKCQkJZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKCQkJewoJCQkJewoKCQkJCQlpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBMQ0RMUjArcmVnX2Jhc2VfYWRqKzAqNDt9CgoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgxTENETFIwK3JlZ19iYXNlX2FkaiswKjQ7fQoKCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJMQ0RMUjArcmVnX2Jhc2VfYWRqKzAqNDt9CgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDNMQ0RMUjArcmVnX2Jhc2VfYWRqKzAqNDt9CgkJCQl9CgoJCQkJLy91bnNpZ25lZCBpbnQgICBkcWd0cl9vcmdbNF0sZHFsY2RscjJfb3JnWzRdLGRxZ3RyX2xbNF0sZHFsY2RscjJfbFs0XSxkcWd0cl9yWzRdLGRxbGNkbHIyX3JbNF0sZHFtZGxyWzRdOwoJCQkJLy8JIHVuc2lnbmVkIGludCBkcWd0cl90ZW1wOwoJCQkJLy8JICB1bnNpZ25lZCBpbnQgZHFsY2RscjJfdGVtcDsKCQkJCS8vCSAgdW5zaWduZWQgaW50IGRxcXNnYXRlX2xbNF0sIGRxcXNnYXRlX3JbNF07CgkJCQkoZHFndHJfbFt0ZW1wX2NvdW50X2ldKT0oZHFxc2dhdGVfbFt0ZW1wX2NvdW50X2ldKS8oKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CgkJCQkoZHFsY2RscjJfbFt0ZW1wX2NvdW50X2ldKT0oZHFxc2dhdGVfbFt0ZW1wX2NvdW50X2ldKS0oZHFndHJfbFt0ZW1wX2NvdW50X2ldKSooKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CgkJCQkoZHFndHJfclt0ZW1wX2NvdW50X2ldKT0oZHFxc2dhdGVfclt0ZW1wX2NvdW50X2ldKS8oKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CgkJCQkoZHFsY2RscjJfclt0ZW1wX2NvdW50X2ldKT0oZHFxc2dhdGVfclt0ZW1wX2NvdW50X2ldKS0oZHFndHJfclt0ZW1wX2NvdW50X2ldKSooKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CgkJCQlwcmludGYoIlxuIGFkZCAgcmVnPT0gICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHhcbiIsCgkJCQkJCShkcXFzZ2F0ZV9vcmdbdGVtcF9jb3VudF9pXSksCgkJCQkJCShkcXFzZ2F0ZV9sW3RlbXBfY291bnRfaV0pLAoJCQkJCQkoZHFxc2dhdGVfclt0ZW1wX2NvdW50X2ldKSwKCQkJCQkJKGRxZ3RyX29yZ1t0ZW1wX2NvdW50X2ldKSwKCQkJCQkJKGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldKSwKCQkJCQkJKGRxZ3RyX2xbdGVtcF9jb3VudF9pXSksCgkJCQkJCShkcWd0cl9yW3RlbXBfY291bnRfaV0pLAoJCQkJCQkoZHFsY2RscjJfbFt0ZW1wX2NvdW50X2ldKSwKCQkJCQkJKGRxbGNkbHIyX3JbdGVtcF9jb3VudF9pXSkKCQkJCQkgICk7CgoKCQkJfQoKCgoKCgkJfQoKCX0KCgoKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKClVfQk9PVF9DTUQoCglkZHJ0ZXN0X2dhdGUsCTcsCTEsCWRvX2RkcnRlc3RfZmluZF9nYXRlX3dpbmQsCgkiRERSIHRlc3QgZnVuY3Rpb24gc2hvdWxkIGRjYWNoZSBvZmYgZGRydGVzdF9nYXRlIGEgMCAweDgwMDAwIDEgMCAzIiwKCSJkZHJ0ZXN0X2dhdGUgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHgxMDAwMDAwMFxuIgopOwoKCiNlbmRpZgoKLy8vKgppbnQgZG9fZGRyX3Rlc3RfYWNfd2luZG93c19iZGxyKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIGFjIGJkbHIgd2luZG93cyBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCXN0YXRpYyB1bnNpZ25lZCBpbnQgc29mdF9jYV90cmFpbmluZ19zZWVkPTA7CglzdGF0aWMgdW5zaWduZWQgaW50IHNvZnRfY2FfdHJhaW5pbmdfc3RlcD0wOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgojZGVmaW5lICBDSEFOTkVMX0EgIDAKI2RlZmluZSAgQ0hBTk5FTF9CICAxCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgl1bnNpZ25lZCBpbnQgIGFjX21kbHJfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbWRscl9iX29yZz0wOwoKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2Jfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX3JpZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX2xlZj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWY9MDsKCgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWZfbWluPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWZfbWluPTA7CgkvLyAgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfdGVtcDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF90ZW1wPTA7CgoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJdW5zaWduZWQgaW50ICAgYWNfYmRscl9sZWZbMTBdOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscl9yaWdbMTBdOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscl90ZW1wX3ZhbHVlOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscl9yZWdfc2VlZF92YWx1ZTsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHJfdGVtcF9yZWdfdmFsdWU7CgkvLyAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yOwoJdW5zaWduZWQgaW50IHRlbXBfaT0wOwoJdW5zaWduZWQgaW50IHRlbXBfaj0wOwoJLy91bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy8JCXN0YXRpYyB1bnNpZ25lZCBpbnQgc29mdF9jYV90cmFpbmluZ19lbmFibGVkPTE7CgoJLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCQllbHNlCgkJewoJCQlnb3RvIHVzYWdlOwoJCX0KCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCgl9CglpZiAoYXJnYyA+NCkgewoJCXRlc3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9sb29wID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbG9vcCA9IDEwMDAwMDsKCQl9Cgl9CgoJaWYgKGFyZ2MgPjUpIHsKCQlzb2Z0X2NhX3RyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXNvZnRfY2FfdHJhaW5pbmdfc2VlZCA9IDB4MWY7CgkJfQoKCgl9CglpZiAoYXJnYyA+NikgewoJCXNvZnRfY2FfdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJc29mdF9jYV90cmFpbmluZ19zdGVwID0gMDsKCQl9CgoKCX0KCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCXByaW50ZigiXG5zb2Z0X2NhX3RyYWluaW5nX3NlZWQ9PSAweCUwOHhcbiIsIHNvZnRfY2FfdHJhaW5pbmdfc2VlZCk7CglwcmludGYoIlxuc29mdF9jYV90cmFpbmluZ19zdGVwPT0gMHglMDh4XG4iLCBzb2Z0X2NhX3RyYWluaW5nX3N0ZXApOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoKCgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoKCQkJCQl9CgkJCQl9CgoJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgMHglMDh4XG4iLHJlZ19hZGQpOwoJCQkJCWFjX21kbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsvL3JlYWRsKHJlZ19hZGQpOy8vMHhjODgzNjAwMAoJCQkJCWFjX2xjZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrNCk7CgkJCQkJYWNfYmRscjBfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs4KTsKCgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcpOwoJCQkJfQoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCgkJCQl7CgoJCQkJCWFjX21kbHJfYl9vcmc9cmVhZGwocmVnX2FkZCk7CgkJCQkJYWNfbGNkbHJfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUik7CgkJCQkJYWNfYmRscjBfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUik7CgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoJCQkJfQoKCgkJCX0KCgkJfQoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUNcbiIpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBBQ1xuIik7CgkJCQl9CgoKI2RlZmluZSB3cnJfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZHJfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIzLCAweDA4MDgpOyAgLy9jczAgY3MxCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIwLCAweDFmKTsgIC8vY2swCgkJCQkvLwl3cl9yZWcoRERSMF9QVUJfQUNCRExSNCwgMHgwODA4KTsgLy9vZHQwIG9kdDEKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjUsIDB4MDgwOCk7ICAvL2NrZTAgY2tlMQoKCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIxLCAweDE4MTgxOCk7IC8vcmFzIGNhcyB3ZQoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMiwgMHgxODE4MTgpOyAvL2JhMCBiYTEgYmEyCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI2LCAweDEyMTIxMjEyKTsgLy9hMCBhMSBhMiBhMwoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSNywgMHgwZDBkMGQwZCk7IC8vYTQgYTUgYTYgYTcKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjgsIDB4MTAxMDEwMTApOyAgLy9hOCBhOSBhMTAgYTExCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI5LCAweDE4MTgxODE4KTsgIC8vYTEyIGExMyBhMTQgYTE1CgkJCQlyZWdfYWRkPUREUjBfUFVCX0FDQkRMUjA7CgkJCQlhY19iZGxyX3JlZ19zZWVkX3ZhbHVlPShzb2Z0X2NhX3RyYWluaW5nX3NlZWR8KHNvZnRfY2FfdHJhaW5pbmdfc2VlZDw8OCl8KHNvZnRfY2FfdHJhaW5pbmdfc2VlZDw8MTYpfChzb2Z0X2NhX3RyYWluaW5nX3NlZWQ8PDI0KSk7CgkJCQlmb3IgKCggIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQkvL3dyX3JlZygoRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCksCgkJCQkJLy9hY19iZGxyX3JlZ19zZWVkX3ZhbHVlKTsgIC8vY3MwIGNzMQoJCQkJCS8vcmVnX2FkZD1yZWdfYWRkK3RlbXBfaSo0OwoKCQkJCQkvL3JlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCQkJCQlyZWdfYWRkPShERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KTsKCQkJCQlyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwoJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJYWNfYmRscl9yZWdfc2VlZF92YWx1ZSk7ICAvL2NzMCBjczEKCQkJCQlhY19iZGxyX2xlZlt0ZW1wX2ldPWFjX2JkbHJfcmVnX3NlZWRfdmFsdWU7CgkJCQkJYWNfYmRscl9yaWdbdGVtcF9pXT1hY19iZGxyX3JlZ19zZWVkX3ZhbHVlOwoJCQkJfQoKCQkJCXByaW50ZigiXG5iZGwgIHNvZnRfY2FfdHJhaW5pbmdfc3RlcD09MHglMDh4XG4gIixzb2Z0X2NhX3RyYWluaW5nX3N0ZXApOwoJCQkJZm9yICgoIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQkvL2FjX2JkbHJfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJCWlmICh0ZW1wX2kgPT0gMSkKCQkJCQl7CgkJCQkJCS8vdGVtcF9pPTM7CgkJCQkJfQoKCQkJCQlmb3IgKCggdGVtcF9qPTApOyh0ZW1wX2o8NCk7KCB0ZW1wX2orKykpCgkJCQkJewoJCQkJCQlpZiAoc29mdF9jYV90cmFpbmluZ19zdGVwKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9KHNvZnRfY2FfdHJhaW5pbmdfc3RlcD4+Mik7CgkJCQkJCQl0ZW1wX2o9c29mdF9jYV90cmFpbmluZ19zdGVwLSgoc29mdF9jYV90cmFpbmluZ19zdGVwPj4yKTw8Mik7CgkJCQkJCQlzb2Z0X2NhX3RyYWluaW5nX3N0ZXA9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMSkKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTE7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gNykKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTI7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTQpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT00OwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDE4KQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9NTsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAyMikKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTY7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQkvL3ByaW50ZigiXG5iZGwgIHRlbXBfaT09MHglMDh4XG4gIix0ZW1wX2kpOwoJCQkJCQlwcmludGYoIlxuYmRsICB0ZW1wX2lqPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opKTsKCQkJCQkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CgkJCQkJCXJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CgkJCQkJCWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKCQkJCQkJYWNfYmRscl90ZW1wX3ZhbHVlPSgoYWNfYmRscl90ZW1wX3JlZ192YWx1ZT4+KHRlbXBfajw8MykpJkFDQkRMUl9NQVgpOwoJCQkJCQl3aGlsZSAoYWNfYmRscl90ZW1wX3ZhbHVlPjApCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJYWNfYmRscl90ZW1wX3ZhbHVlLS07CgoJCQkJCQkJcHJpbnRmKCJcbmJkbCAgdGVtcF9paj09MHglMDh4IGxlZiB0ZW1wPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CgoJCQkJCQkJYWNfYmRscl90ZW1wX3JlZ192YWx1ZT0oKCh+KDB4ZmY8PCh0ZW1wX2o8PDMpKSkmYWNfYmRscl9yZWdfc2VlZF92YWx1ZSl8KChhY19iZGxyX3RlbXBfdmFsdWUpPDwodGVtcF9qPDwzKSkpOwoJCQkJCQkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CgkJCQkJCQlyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwoJCQkJCQkJd3JyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkLAoJCQkJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCXByaW50ZigiXG5iZGwgcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7CgojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcHJpbnRmKCJcbmJkbCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJYWNfYmRscl90ZW1wX3ZhbHVlKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXByaW50ZigiXG5iZGwgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxuXG5iZGwgIHRlbXBfaWo9PTB4JTA4eCAgICAgICAgICBiZGwgbGVmdCBlZGdlPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CgkJCQkJCXJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwoJCQkJCQlyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwoJCQkJCQl3cnJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQsCgkJCQkJCQkJYWNfYmRscl9yZWdfc2VlZF92YWx1ZSk7CgoJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlPSgoKH4oMHhmZjw8KHRlbXBfajw8MykpKSZhY19iZGxyX2xlZlt0ZW1wX2ldKXwoKGFjX2JkbHJfdGVtcF92YWx1ZSk8PCh0ZW1wX2o8PDMpKSk7CgkJCQkJCWFjX2JkbHJfbGVmW3RlbXBfaV09YWNfYmRscl90ZW1wX3JlZ192YWx1ZTsKCgkJCQkJCWFjX2JkbHJfdGVtcF92YWx1ZT0oKGFjX2JkbHJfcmVnX3NlZWRfdmFsdWU+Pih0ZW1wX2o8PDMpKSZBQ0JETFJfTUFYKTsKCQkJCQkJd2hpbGUgKGFjX2JkbHJfdGVtcF92YWx1ZTxBQ0JETFJfTUFYKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWFjX2JkbHJfdGVtcF92YWx1ZSsrOwoJCQkJCQkJcHJpbnRmKCJcbnRlbXBfaWo9PTB4JTA4eCByaWcgdGVtcD09MHglMDh4XG4gIiwodGVtcF9pKjQrdGVtcF9qKSxhY19iZGxyX3RlbXBfdmFsdWUpOwoKCQkJCQkJCWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9KCgofigweGZmPDwodGVtcF9qPDwzKSkpJmFjX2JkbHJfcmVnX3NlZWRfdmFsdWUpfCgoYWNfYmRscl90ZW1wX3ZhbHVlKTw8KHRlbXBfajw8MykpKTsKCQkJCQkJCXJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwoJCQkJCQkJcmVnX2FkZD1yZWdfYWRkK3JlZ19iYXNlX2FkajsKCQkJCQkJCXdycl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCwKCQkJCQkJCQkJYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQlwcmludGYoIlxuYmRsIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIixyZWdfYWRkLGFjX2JkbHJfdGVtcF9yZWdfdmFsdWUpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcHJpbnRmKCJcbmJkbCByaWcgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlhY19iZGxyX3RlbXBfdmFsdWUtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoKCgoJCQkJCQlwcmludGYoIlxuYmRsIHJpZyBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkvL3ByaW50ZigiXG5cbmJkbCByaWcgZWRnZT09MHglMDh4XG4gIixhY19iZGxyX3RlbXBfdmFsdWUpOwoJCQkJCQlwcmludGYoIlxuXG5iZGwgIHRlbXBfaWo9PTB4JTA4eCAgICAgICAgICBiZGwgcmlnaCBlZGdlPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CgkJCQkJCXJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwoJCQkJCQlyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwoJCQkJCQl3cnJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQsCgkJCQkJCQkJYWNfYmRscl9yZWdfc2VlZF92YWx1ZSk7CgoJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlPSgoKH4oMHhmZjw8KHRlbXBfajw8MykpKSZhY19iZGxyX3JpZ1t0ZW1wX2ldKXwoKGFjX2JkbHJfdGVtcF92YWx1ZSk8PCh0ZW1wX2o8PDMpKSk7CgkJCQkJCWFjX2JkbHJfcmlnW3RlbXBfaV09YWNfYmRscl90ZW1wX3JlZ192YWx1ZTsKCQkJCQl9CgkJCQl9CgoJCQkJcHJpbnRmKCJcbmJkbCBsZWYgZWRnZT09YmRscjAgICAgIGJkbHIxICAgICBiZGxyMiAgICAgYmRscjMgICAgIGJkbHI0ICAgICBiZGxyNSAgICAgYmRscjYgICAgIGJkbHI3ICAgICBiZGxyOCAgICAgYmRscjkgICAgIFxuICIpOwoJCQkJcHJpbnRmKCJcbmJkbCBsZWYgZWRnZT09XG4iKTsKCQkJCWZvciAoKCB0ZW1wX2k9MCk7KHRlbXBfaTwxMCk7KCB0ZW1wX2krKykpCgkJCQl7CgoJCQkJCXByaW50ZigiMHglMDh4XG4gIixhY19iZGxyX2xlZlt0ZW1wX2ldKTsKCgkJCQl9CgoJCQkJcHJpbnRmKCJcbiAiKTsKCQkJCWZvciAoKCB0ZW1wX2k9MCk7KHRlbXBfaTwxMCk7KCB0ZW1wX2krKykpCgkJCQl7CgkJCQkJcHJpbnRmKCIweCUwOHhcbiAiLGFjX2JkbHJfcmlnW3RlbXBfaV0pOwoJCQkJfQoJCQkJcHJpbnRmKCJcbmJkbCByaWcgZWRnZT09PT09PT09PT09XG4iKTsKCQkJCXByaW50ZigiXG49PT09PT09PT09PT09PT09PT09XG4iKTsKCgkJCQlwcmludGYoIlxuYmRsIGxlZiBlZGdlPT1cbiIpOwoJCQkJZm9yICgoIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQlmb3IgKCggdGVtcF9qPTApOyh0ZW1wX2o8NCk7KCB0ZW1wX2orKykpCgkJCQkJewoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMSkKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTE7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gNykKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTI7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTQpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT00OwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDE4KQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9NTsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAyMikKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTY7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlPSgoKCgweGZmPDwodGVtcF9qPDwzKSkpJmFjX2JkbHJfbGVmW3RlbXBfaV0pPj4odGVtcF9qPDwzKSk7CgkJCQkJCXByaW50ZigiXG50ZW1waV9qMHglMDh4PT0weCUwOHgiLCgodGVtcF9pPDwyKSt0ZW1wX2opLGFjX2JkbHJfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCX0KCQkJCX0KCgkJCQlwcmludGYoIlxuICIpOwoJCQkJcHJpbnRmKCJcbmJkbCByaWcgZWRnZT09XG4iKTsKCQkJCWZvciAoKCB0ZW1wX2k9MCk7KHRlbXBfaTwxMCk7KCB0ZW1wX2krKykpCgkJCQl7CgkJCQkJZm9yICgoIHRlbXBfaj0wKTsodGVtcF9qPDQpOyggdGVtcF9qKyspKQoJCQkJCXsKCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDEpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT0xOwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDcpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT0yOwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDE0KQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9NDsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxOCkKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTU7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMjIpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT02OwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJYWNfYmRscl90ZW1wX3JlZ192YWx1ZT0oKCgoMHhmZjw8KHRlbXBfajw8MykpKSZhY19iZGxyX3JpZ1t0ZW1wX2ldKT4+KHRlbXBfajw8MykpOwoJCQkJCQlwcmludGYoIlxudGVtcGlfajB4JTA4eD09MHglMDh4IiwoKHRlbXBfaTw8MikrdGVtcF9qKSxhY19iZGxyX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCQkvLy8vY2FsY3VsYXRlIGFuZCBwcmludCAgZHFzIHZhbHVlCgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJaWYgKHRlc3RfdGltZXMpCgkJCQkJewoJCQkJCQlpZiAoYWNfbGNkbHJfYV9sZWY+YWNfbGNkbHJfYV9sZWZfbWluKQoJCQkJCQkJYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoKCQkJCQkJaWYgKGFjX2xjZGxyX2FfcmlnPGFjX2xjZGxyX2FfcmlnX21pbikKCQkJCQkJCWFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCgkJCQkJCWlmIChhY19iZGxyMF9hX2xlZj5hY19iZGxyMF9hX2xlZl9taW4pCgkJCQkJCQlhY19iZGxyMF9hX2xlZl9taW49YWNfYmRscjBfYV9sZWY7CgoJCQkJCQlpZiAoYWNfYmRscjBfYV9yaWc8YWNfYmRscjBfYV9yaWdfbWluKQoJCQkJCQkJYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlhY19sY2Rscl9hX2xlZl9taW49YWNfbGNkbHJfYV9sZWY7CgkJCQkJCWFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCQkJCQkJYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoJCQkJCQlhY19iZGxyMF9hX3JpZ19taW49YWNfYmRscjBfYV9yaWc7CgkJCQkJfQoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQyByZXN1bHRcbiIpOwoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCgkJCQkJcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnLGFjX2xjZGxyX2FfbGVmLGFjX2xjZGxyX2FfcmlnLGFjX2xjZGxyX2FfbGVmX21pbixhY19sY2Rscl9hX3JpZ19taW4pOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfYV9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnLGFjX2JkbHIwX2FfbGVmLGFjX2JkbHIwX2FfcmlnLGFjX2JkbHIwX2FfbGVmX21pbixhY19iZGxyMF9hX3JpZ19taW4pOwoJCQkJfQoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9CX1JFR19CQVNFKQoJCQkJewoJCQkJCWlmICh0ZXN0X3RpbWVzKQoJCQkJCXsKCQkJCQkJaWYgKGFjX2xjZGxyX2JfbGVmPmFjX2xjZGxyX2JfbGVmX21pbikKCQkJCQkJCWFjX2xjZGxyX2JfbGVmX21pbj1hY19sY2Rscl9iX2xlZjsKCgkJCQkJCWlmIChhY19sY2Rscl9iX3JpZzxhY19sY2Rscl9iX3JpZ19taW4pCgkJCQkJCQlhY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgoJCQkJCQlpZiAoYWNfYmRscjBfYl9sZWY+YWNfYmRscjBfYl9sZWZfbWluKQoJCQkJCQkJYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2JfcmlnPGFjX2JkbHIwX2JfcmlnX21pbikKCQkJCQkJCWFjX2JkbHIwX2JfcmlnX21pbj1hY19iZGxyMF9iX3JpZzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYWNfbGNkbHJfYl9sZWZfbWluPWFjX2xjZGxyX2JfbGVmOwoJCQkJCQlhY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgkJCQkJCWFjX2JkbHIwX2JfbGVmX21pbj1hY19iZGxyMF9iX2xlZjsKCQkJCQkJYWNfYmRscjBfYl9yaWdfbWluPWFjX2JkbHIwX2JfcmlnOwoJCQkJCX0KCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUMgcmVzdWx0XG4iKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyk7CgoJCQkJCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyxhY19sY2Rscl9iX2xlZixhY19sY2Rscl9iX3JpZyxhY19sY2Rscl9iX2xlZl9taW4sYWNfbGNkbHJfYl9yaWdfbWluKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyxhY19iZGxyMF9iX2xlZixhY19iZGxyMF9iX3JpZyxhY19iZGxyMF9iX2xlZl9taW4sYWNfYmRscjBfYl9yaWdfbWluKTsKCQkJCX0KCQkJfQoJCX0KCgl9CgoKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KCgpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfZGRyX2FjX2JkbHIsCTcsCTEsCWRvX2Rkcl90ZXN0X2FjX3dpbmRvd3NfYmRsciwKCSJERFIgdHVuZSBhYyBiZGwgZnVuY3Rpb24iLAoJImRkcl90dW5lX2Rkcl9hY19iZGxyIGEgMCAweDgwMDAwMDAgMSBzZWVkIHN0ZXAgb3IgZGRyX3R1bmVfZGRyX2FjX2JkbHIgYiAwIDB4ODAwMDAwIDEgc2VlZCBzdGVwIG9yIGRkcl90dW5lX2Rkcl9hY19hY2JkbHJfY2sgYSBiIDB4ODAwMDAgbFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKCgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQojZWxzZQppbnQgZG9fZGRyX3Rlc3RfdnJlZihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkciB2cmVmIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7CgkvLyAgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CglzdGF0aWMgdW5zaWduZWQgaW50IHRyYWluaW5nX3NlZWQ9MDsKCXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhaW5pbmdfc3RlcD0wOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7CgoKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKCXVuc2lnbmVkIGludCAgYWNfbWRscl9hX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19tZGxyX2Jfb3JnPTA7CgoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9vcmc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2Jfb3JnPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX3JpZz0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZz0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfcmlnPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX2xlZj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmPTA7CgoJLy8JICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWdfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWdfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZl9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZl9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmX21pbj0wOwoJLy8gICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX3RlbXA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfdGVtcD0wOwoKCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCS8vICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9sZWZbMTBdOwoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX3JpZ1sxMF07Cgl1bnNpZ25lZCBpbnQgICBpb3ZyZWZfdGVtcF92YWx1ZTsKCXVuc2lnbmVkIGludCAgIGlvdnJlZl90ZW1wX3JlZ192YWx1ZTsKCXVuc2lnbmVkIGludCAgcmVnX3NlZWRfdmFsdWU7CgkvLwkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZTsKCXVuc2lnbmVkIGludCAgIGlvdnJlZl9sZWY7Cgl1bnNpZ25lZCBpbnQgICBpb3ZyZWZfcmlnOwoJLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcjsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2o9MDsKCS8vdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vCQlzdGF0aWMgdW5zaWduZWQgaW50IHRyYWluaW5nX2VuYWJsZWQ9MTsKCgkvLwkgaW92cmVmX2xlZj0weDQ5OwoJLy8gcHJpbnRmKCJcblxuIGlvdnJlZiAgb3JnICAgICAgICAgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX2xlZiwoKCgoKGlvdnJlZl9sZWYmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCS8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJfQoJfQoJdHJhaW5pbmdfc2VlZCA9IDB4NDk7CglpZiAoYXJnYyA+NSkgewoJCXRyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRyYWluaW5nX3NlZWQgPSAweDQ5OwoJCX0KCgoJfQoKCXByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCgl0cmFpbmluZ19zdGVwID0gMDsKCWlmIChhcmdjID42KSB7CgkJdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc3RlcCA9IDA7CgkJfQoJfQoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9sb29wPT0gMHglMDh4XG4iLCB0ZXN0X2xvb3ApOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQl7CgkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCXsKCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCQkJCX0KCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCQkJCX0KCQkJfQoKCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCXsKCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCAweCUwOHhcbiIscmVnX2FkZCk7CgkJCQlhY19tZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50IClyZWdfYWRkKSk7Ly9yZWFkbChyZWdfYWRkKTsvLzB4Yzg4MzYwMDAKCQkJCWFjX2xjZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrNCk7CgkJCQlhY19iZGxyMF9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpKSk7Ly9yZWFkbChyZWdfYWRkKzgpOwoKCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcpOwoJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyk7CgkJCX0KCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCgkJCXsKCgkJCQlhY19tZGxyX2Jfb3JnPXJlYWRsKHJlZ19hZGQpOwoJCQkJYWNfbGNkbHJfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUik7CgkJCQlhY19iZGxyMF9iX29yZz1yZWFkbChyZWdfYWRkKzgpOwoJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CgkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnKTsKCQkJfQoKCgkJfQoKCgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyAgdmFsdWUKCgoJZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDXG4iKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUNcbiIpOwoJCQkJfQoKCiNkZWZpbmUgd3JyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRyX3JlZyhhZGRyKQkJICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMywgMHgwODA4KTsgIC8vY3MwIGNzMQoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMCwgMHgxZik7ICAvL2NrMAoJCQkJLy8Jd3JfcmVnKEREUjBfUFVCX0FDQkRMUjQsIDB4MDgwOCk7IC8vb2R0MCBvZHQxCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI1LCAweDA4MDgpOyAgLy9ja2UwIGNrZTEKCgoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMSwgMHgxODE4MTgpOyAvL3JhcyBjYXMgd2UKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjIsIDB4MTgxODE4KTsgLy9iYTAgYmExIGJhMgoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSNiwgMHgxMjEyMTIxMik7IC8vYTAgYTEgYTIgYTMKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjcsIDB4MGQwZDBkMGQpOyAvL2E0IGE1IGE2IGE3CgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI4LCAweDEwMTAxMDEwKTsgIC8vYTggYTkgYTEwIGExMQoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSOSwgMHgxODE4MTgxOCk7ICAvL2ExMiBhMTMgYTE0IGExNQoJCQkJcmVnX2FkZD1ERFIwX1BVQl9JT1ZDUjA7CgkJCQlyZWdfc2VlZF92YWx1ZT0odHJhaW5pbmdfc2VlZHwodHJhaW5pbmdfc2VlZDw8OCl8KHRyYWluaW5nX3NlZWQ8PDE2KXwodHJhaW5pbmdfc2VlZDw8MjQpKTsKCQkJCS8vZm9yKCggIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCS8vd3JfcmVnKChERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KSwKCQkJCS8vYWNfYmRscl9yZWdfc2VlZF92YWx1ZSk7ICAvL2NzMCBjczEKCQkJCS8vcmVnX2FkZD1yZWdfYWRkK3RlbXBfaSo0OwoKCQkJCS8vcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoJCQkJLy9yZWdfYWRkPShERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KTsKCQkJCXJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CgkJCQkvLwkgaW92cmVmX2xlZj0weDQ5OwoJCQkJaWYgKGlvdnJlZl90ZW1wX3ZhbHVlKQoJCQkJewoJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIG9yZyAgICAgICAgICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl90ZW1wX3ZhbHVlLCgoKCgoaW92cmVmX3RlbXBfdmFsdWUmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwcmludGYoIlxuaW8gdnJlZiBwb3dlciBkb3duICx1c2UgZXh0ZXJuYWwgcmVzaXN0ZXIgXG4gIik7CgkJCQl9CgoJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCXJlZ19zZWVkX3ZhbHVlKTsgIC8vCgoJCQkJd3JyX3JlZygocmVnX2FkZCs0KSwKCQkJCQkJcmVnX3NlZWRfdmFsdWUpOyAgLy8KCQkJCWlvdnJlZl9sZWY9dHJhaW5pbmdfc2VlZDsKCQkJCWlvdnJlZl9yaWc9dHJhaW5pbmdfc2VlZDsKCgkJCQlwcmludGYoIlxudHJhaW5pbmdfc3RlcD09MHglMDh4XG4gIix0cmFpbmluZ19zdGVwKTsKCgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CgkJCQl3aGlsZSAoaW92cmVmX3RlbXBfdmFsdWU+MHg0MCkKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZS0tOwoKCQkJCQlwcmludGYoIlxuaW92cmVmIGxlZiB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlPShpb3ZyZWZfdGVtcF92YWx1ZXwoaW92cmVmX3RlbXBfdmFsdWU8PDgpfChpb3ZyZWZfdGVtcF92YWx1ZTw8MTYpfChpb3ZyZWZfdGVtcF92YWx1ZTw8MjQpKTs7CgkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCgkJCQkJd3JyX3JlZygocmVnX2FkZCtERFIwX1BVQl9JT1ZDUjEtRERSMF9QVUJfSU9WQ1IwKSwKCQkJCQkJCWlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7ICAvLwoJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXByaW50ZigiXG52cmVmIGRvd24gZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWUrKzsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCXByaW50ZigiXG4gZG93biBlZGdlIGRldGVjdCBcbiIpOwoJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgICAgICAgICAgICAgICAgICAgICAgZG93biBlZGdlPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCWlvdnJlZl9sZWY9aW92cmVmX3RlbXBfdmFsdWU7CgoJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCXJlZ19zZWVkX3ZhbHVlKTsgIC8vCgoJCQkJd3JyX3JlZygocmVnX2FkZCtERFIwX1BVQl9JT1ZDUjEtRERSMF9QVUJfSU9WQ1IwKSwKCQkJCQkJcmVnX3NlZWRfdmFsdWUpOyAgLy8KCgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CgoKCQkJCXdoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZTwweDdmKQoJCQkJewoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlKys7CgoJCQkJCXByaW50ZigiXG5pb3ZyZWYgbGVmIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWU9KGlvdnJlZl90ZW1wX3ZhbHVlfChpb3ZyZWZfdGVtcF92YWx1ZTw8OCl8KGlvdnJlZl90ZW1wX3ZhbHVlPDwxNil8KGlvdnJlZl90ZW1wX3ZhbHVlPDwyNCkpOzsKCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJCWlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7ICAvLwoKCQkJCQl3cnJfcmVnKChyZWdfYWRkK0REUjBfUFVCX0lPVkNSMS1ERFIwX1BVQl9JT1ZDUjApLAoJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXByaW50ZigiXG52cmVmIHVwIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlLS07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQlwcmludGYoIlxuIHVwIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICB1cCBlZGdlPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCWlvdnJlZl9yaWc9aW92cmVmX3RlbXBfdmFsdWU7CgoJCQkJLy9yZWdfc2VlZF92YWx1ZT0weDQ5NDk0OTQ5CgkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJMHg0OTQ5NDk0OSk7ICAvLwoKCQkJCXdycl9yZWcoKHJlZ19hZGQrRERSMF9QVUJfSU9WQ1IxLUREUjBfUFVCX0lPVkNSMCksCgkJCQkJCTB4NDk0OTQ5NDkpOyAgLy8KCgkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICBkb3duIGVkZ2U9PTB4JTA4eCAgICUwOGRtVlxuIixpb3ZyZWZfbGVmLCgoKCgoaW92cmVmX2xlZiYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICB1cCBlZGdlPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX3JpZywoKCgoKGlvdnJlZl9yaWcmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkID09MHglMDh4ICAgJTA4ZG1WXG4iLAoJCQkJCQkoaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yLCgoKCgoKChpb3ZyZWZfbGVmK2lvdnJlZl9yaWcpLzIpJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CgkJCQlpZiAoaW92cmVmX2xlZiA9PSAweDQwKQoJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICBkb3duIGVkZ2UgcmVhY2ggIHJlZyBsaW1pdGVkXG4iKTsKCQkJfQoJCX0KCX0KCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfZGRyX3ZyZWYsCTcsCTEsCWRvX2Rkcl90ZXN0X3ZyZWYsCgkiRERSIHR1bmUgdnJlZiBmdW5jdGlvbiBkZHJfdHVuZV9kZHJfdnJlZiAgYSAwIDB4ODAwMDAwMCAgMSA0OCAxIiwKCSJkZHJfdHVuZV9kZHJfdnJlZiAgYSAwIDB4ODAwMDAwMCAgMSBzZWVkIHN0ZXAgXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCmludCBkb19kZHI0X3Rlc3RfcGh5X3ZyZWYoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCWlmKHdhdGNoZG9nX3RpbWVfcz09MCkKCXsKCQl3YXRjaGRvZ190aW1lX3M9NTA7CgkJcHJpbnRmKCJ0ZXN0IHNvY192cmVmIHJlIHNldCB3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl9CgojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHI9dGVzdF9zdGFydF9hZGRyOwoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyNCBwaHkgdnJlZiBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7CgkvLyAgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CglpbnQgdHJhaW5pbmdfc2VlZD0wOwoJaW50IHRyYWluaW5nX3N0ZXA9MDsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3NvY19kcmFtPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7Cgl1bnNpZ25lZCBpbnQgICBkeG5sY2RscjNbNF07Cgl1bnNpZ25lZCBpbnQgICBkeG5sY2RscjRbNF07CgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgkvLyAgICNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkJCTB4Yzg4MzYwMDAKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNCAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ0ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzUgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjA1ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI0NSAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyODUgIDw8IDIgKSApCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCS8vICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9sZWZbMTBdOwoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX3JpZ1sxMF07CglpbnQgICBpb3ZyZWZfdGVtcF92YWx1ZTsKCWludCBkZHJfc29jX2lvdnJlZl9vcmc9MDsKCWludCAgIGlvdnJlZl90ZW1wX3JlZ192YWx1ZTsKCS8vICAgIHVuc2lnbmVkIGludCAgcmVnX3NlZWRfdmFsdWU7CgkvLwkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZTsKCWludCAgIGlvdnJlZl9vcmdbNF07CglpbnQgICBpb3ZyZWZfbGVmWzRdOwoJaW50ICAgaW92cmVmX3JpZ1s0XTsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9qPTA7CgkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7CgkvLwkJc3RhdGljIHVuc2lnbmVkIGludCB0cmFpbmluZ19lbmFibGVkPTE7CgoJLy8JIGlvdnJlZl9sZWY9MHg0OTsKCS8vIHByaW50ZigiXG5cbiBpb3ZyZWYgIG9yZyAgICAgICAgICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CgkvLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgoKCWNoYXIgc3RyX3RlbXAxWzEwMjRdPSIiOwoJY2hhciBzdHJfdGVtcDJbMTAyNF09IiI7CgljaGFyIHN0cls1MTJdPSIiOwoJdW5zaWduZWQgaW50ICBzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsaz0wOwoJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX3Rlc3RfZGRyX2NsayIpOwoJc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGs9ZW52X3RvX2FfbnVtKHN0cl90ZW1wMSk7CglpZihzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsaz09MCkKCXsKCQlzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsaz1nbG9iYWxfZGRyX2NsazsKCQl7CgkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGsiKTsKCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGspOwoJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJfQoJfQoJaWYoc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGshPWdsb2JhbF9kZHJfY2xrKQoJewoJCXByaW50ZigicnVubmluZyBkZHIgZnJlcT09JWQsYnV0IHRlc3QgZnJlcSBpcyAlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHNvY19pb3ZyZWZfdGVzdF9kZHJfY2xrKTsKCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIixzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsayk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQl3aGlsZSgxKTsKCX0KCXVuc2lnbmVkIGludCAgc29jX2lvdnJlZl90ZXN0X3N0ZXA9MDsKCXNwcmludGYoc3RyX3RlbXAxLCJzb2NfaW92cmVmX3Rlc3Rfc3RlcCIpOwoJc29jX2lvdnJlZl90ZXN0X3N0ZXA9ZW52X3RvX2FfbnVtKHN0cl90ZW1wMSk7CglpZihzb2NfaW92cmVmX3Rlc3Rfc3RlcD09MCkKCQlpb3ZyZWZfdGVtcF92YWx1ZT0wOwoJewoJCXNwcmludGYoc3RyX3RlbXAxLCJzb2NfaW92cmVmX3Rlc3Rfc3RlcCIpOwoJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCX0KCgl1bnNpZ25lZCBpbnQgIHNvY19pb3ZyZWZfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgIHNvY19pb3ZyZWZfcmlnPTA7CgkvL2NoYXIgKnBfc3RyPU5VTEw7CglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9zb2NfZHJhbSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9zb2NfZHJhbSA9IDA7CgkJfQoJCWlmICh0ZXN0X3NvY19kcmFtKQoJCQl0ZXN0X3NvY19kcmFtID0gMTsKCgl9Cgl0cmFpbmluZ19zZWVkID0gMDsKCWlmIChhcmdjID41KSB7CgkJdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCX0KCX0KCglpZiAodHJhaW5pbmdfc2VlZD4weDNmKQoJCXRyYWluaW5nX3NlZWQ9MHgzZjsKCglwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCgl0cmFpbmluZ19zdGVwID0gMDsKCWlmIChhcmdjID42KSB7CgkJdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc3RlcCA9IDA7CgkJfQoJfQoJaW50IHZyZWZfYWxsPTE7CglpZiAoYXJnYyA+NykgewoJCXZyZWZfYWxsID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX2FsbCA9MDsvLwoJCX0KCX0KCXZyZWZfYWxsID0xOy8vCglpbnQgdnJlZl9sY2Rscl9vZmZzZXQ9MDsKCWlmIChhcmdjID44KSB7CgkJdnJlZl9sY2Rscl9vZmZzZXQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfbGNkbHJfb2Zmc2V0ID0wOwoJCX0KCX0KCWludCB2cmVmX3NldF90ZXN0X3N0ZXA9MDsKCWlmIChhcmdjID45KSB7CgkJdnJlZl9zZXRfdGVzdF9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzldLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX3NldF90ZXN0X3N0ZXAgPTA7CgkJfQoJfQoKCXVuc2lnbmVkIGludCBzb2NfZHJhbV9oZXhfZGVjPTA7CglpZiAoYXJnYyA+MTApCgl7CgkJc29jX2RyYW1faGV4X2RlYyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTBdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzb2NfZHJhbV9oZXhfZGVjID0gMDsKCQl9Cgl9CglpZiAoc29jX2RyYW1faGV4X2RlYykKCXsKCQlpZiAoYXJnYyA+NSkgewoJCQl0cmFpbmluZ19zZWVkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRyYWluaW5nX3NlZWQgPTA7Ly8gMHgyZTsKCQkJfQoJCQlwcmludGYoIlxudHJhaW5pbmdfc2VlZD09IDB4JTA4eFxuIiwgdHJhaW5pbmdfc2VlZCk7CgoJCX0KCQlpZiAodHJhaW5pbmdfc2VlZDw0NSkKCQkJdHJhaW5pbmdfc2VlZD00NTsKCQlpZiAodHJhaW5pbmdfc2VlZD44OCkKCQkJdHJhaW5pbmdfc2VlZD04ODsKCQl0cmFpbmluZ19zZWVkID0oKCh0cmFpbmluZ19zZWVkKjEwMDAtNDQwNzApLzY5OCkpOwoKCgkJcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxMi8xNSk7Cgl9CglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X3NvY19kcmFtPT0gMHglMDh4XG4iLCB0ZXN0X3NvY19kcmFtKTsKCXByaW50ZigiXG52cmVmX2FsbD09IDB4JTA4eFxuIiwgdnJlZl9hbGwpOwoJcHJpbnRmKCJcbnZyZWZfbGNkbHJfb2Zmc2V0PT0gMHglMDh4XG4iLCB2cmVmX2xjZGxyX29mZnNldCk7CglwcmludGYoIlxuc29jX2RyYW1faGV4X2RlYz09IDB4JTA4eFxuIiwgc29jX2RyYW1faGV4X2RlYyk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCgoJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJewoJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQl7CgkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCX0KCgkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQl7CgkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBkYXRhIGxhbmVcbiIpOwoJCQl9CgoKCgojZGVmaW5lIHdycl9yZWcoYWRkciwgZGF0YSkJKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQojZGVmaW5lIHJkcl9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCQkJCXVuc2lnbmVkIGludCAgIGR4bm1kbHI9MDsKCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwTURMUjArcmVnX2Jhc2VfYWRqOwoJCQkJZHhubWRscj0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpPj4xNikmMHgxZmY7CgkJCQkvLwlyZWdfc2VlZF92YWx1ZT0odHJhaW5pbmdfc2VlZHwoMHgwPDw4KXwoMHgwPDwxNil8KDB4MDw8MjQpKTsKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgwR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYMUdDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDJHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgzR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQlwcmludGYoIlxuRERSMF9QVUJfRFgwR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwR0NSNCkpKSk7CgkJCQlwcmludGYoIlxuRERSMF9QVUJfRFgxR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxR0NSNCkpKSk7CgkJCQlwcmludGYoIlxuRERSMF9QVUJfRFgyR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSk7CgkJCQlwcmludGYoIlxuRERSMF9QVUJfRFgzR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzR0NSNCkpKSk7CgoJCQkJcHJpbnRmKCJcbmR4bm1kbHI9PTB4JTA4eFxuICIsZHhubWRscik7CgkJCQl1bnNpZ25lZCBpbnQgICB0ZW1wX2k9MDsKCQkJCXVuc2lnbmVkIGludCAgIHRlbXBfaV9tYXg9NDsKCQkJCWZvciAoKCAgdGVtcF9pPTApOyh0ZW1wX2k8NCk7KCB0ZW1wX2krKykpCgkJCQl7CgkJCQkJZHhubGNkbHIzW3RlbXBfaV09KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSt0ZW1wX2kqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpOwoJCQkJCWR4bmxjZGxyNFt0ZW1wX2ldPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrdGVtcF9pKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKTsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEdDUjUrcmVnX2Jhc2VfYWRqK3RlbXBfaSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KTsKCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJCWlvdnJlZl9vcmdbdGVtcF9pXT1pb3ZyZWZfdGVtcF92YWx1ZTsKCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCQkJCQlwcmludGYoIlxuZHhubGNkbHIzWyUwOHhdPT0weCUwOHgsZHhubGNkbHI0WyUwOHhdPT0weCUwOHhcbiAiLHRlbXBfaSxkeG5sY2RscjNbdGVtcF9pXSx0ZW1wX2ksZHhubGNkbHI0W3RlbXBfaV0pOwoJCQkJCS8vCSBpb3ZyZWZfbGVmPTB4NDk7CgkJCQkJaWYgKGlvdnJlZl90ZW1wX3ZhbHVlKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJyZWdfYWRkPT0weCUwOHgsdmFsdWU9PTB4JTA4eCwgaW92cmVmICBvcmcgPT0weCUwOHggICAlMDhkbVZcbiIscmVnX2FkZCwKCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaV0saW92cmVmX3RlbXBfdmFsdWUsKCgoKCgoaW92cmVmX3RlbXBfdmFsdWUmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxMi8xNSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXByaW50ZigiXG5pbyB2cmVmIHBvd2VyIGRvd24gLHVzZSBleHRlcm5hbCByZXNpc3RlciBcbiAiKTsKCQkJCQl9CgoJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJaW92cmVmX29yZ1t0ZW1wX2ldKTsgIC8vCgkJCQkJaW92cmVmX2xlZlt0ZW1wX2ldPShpb3ZyZWZfb3JnW3RlbXBfaV0pJjB4ZmY7CgkJCQkJaW92cmVmX3JpZ1t0ZW1wX2ldPShpb3ZyZWZfb3JnW3RlbXBfaV0pJjB4ZmY7CgkJCQkJaWYgKHRyYWluaW5nX3NlZWQpCgkJCQkJe2lvdnJlZl9sZWZbdGVtcF9pXT10cmFpbmluZ19zZWVkOwoJCQkJCQlpb3ZyZWZfcmlnW3RlbXBfaV09dHJhaW5pbmdfc2VlZDsKCgkJCQkJfQoJCQkJfQoKCQkJCXByaW50ZigiXG50cmFpbmluZ19zdGVwPT0weCUwOHhcbiAiLHRyYWluaW5nX3N0ZXApOwoJCQkJaWYgKHZyZWZfYWxsKQoJCQkJe3RlbXBfaV9tYXg9MTsKCQkJCX0KCQkJCWZvciAoKCAgdGVtcF9pPTApOyh0ZW1wX2k8dGVtcF9pX21heCk7KCB0ZW1wX2krKykpCgkJCQl7CgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBHQ1I1K3JlZ19iYXNlX2Fkait0ZW1wX2kqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSk7CgoKCQkJCQlpZiAodHJhaW5pbmdfc2VlZCkKCQkJCQl7CgkJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJCSh0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2ldKSYweGZmZmZmZjAwKSkpOwoJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCXdycl9yZWcoKChyZWdfYWRkKzEqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpKSwKCQkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaSsxXSkmMHhmZmZmZmYwMCkpKTsgIC8vCgkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCSh0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2krMl0pJjB4ZmZmZmZmMDApKSk7ICAvLwoJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQkodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzNdKSYweGZmZmZmZjAwKSkpOyAgLy8KCQkJCQkJfQoJCQkJCX0KCgkJCQkJewoKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CgoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfb3JnIik7CgkJCQkJCWRkcl9zb2NfaW92cmVmX29yZz1lbnZfdG9fYV9udW0oc3RyX3RlbXAxKTsKCQkJCQkJaWYoZGRyX3NvY19pb3ZyZWZfb3JnPT0wKQoJCQkJCQl7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfb3JnIik7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfdGVtcF92YWx1ZSk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9sZWYiKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX3JpZyIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfbGVmIik7CgkJCQkJCXNvY19pb3ZyZWZfbGVmPWVudl90b19hX251bShzdHJfdGVtcDEpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfcmlnIik7CgkJCQkJCXNvY19pb3ZyZWZfcmlnPWVudl90b19hX251bShzdHJfdGVtcDEpOwoKCgkJCQkJCWlmKHNvY19pb3ZyZWZfbGVmKQoJCQkJCQl7OwoJCQkJCQl9CgoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUod2F0Y2hkb2dfdGltZV9zKTsKCgkJCQkJCWlmICh2cmVmX3NldF90ZXN0X3N0ZXApCgkJCQkJCXsKCQkJCQkJCXByaW50ZigiXG52cmVmX3NldF90ZXN0X3N0ZXA9PTB4JTA4eCxza2lwIHRlc3QgbGVmdCBlZGdlXG4gIix2cmVmX3NldF90ZXN0X3N0ZXApOwoJCQkJCQkJc29jX2lvdnJlZl90ZXN0X3N0ZXA9MTsKCQkJCQkJCXsKCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwic29jX2lvdnJlZl90ZXN0X3N0ZXAiKTsKCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixzb2NfaW92cmVmX3Rlc3Rfc3RlcCk7CgkJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl9CgkJCQkJCQkvL2JyZWFrOwoJCQkJCQl9CgoJCQkJCQlpZihzb2NfaW92cmVmX3Rlc3Rfc3RlcD09MCkKCQkJCQkJey8vaW50IHRlbXA9MDsKCQkJCQkJCWlmKHNvY19pb3ZyZWZfbGVmKQoJCQkJCQkJe2lvdnJlZl90ZW1wX3ZhbHVlPXNvY19pb3ZyZWZfbGVmOwoJCQkJCQkJfQoJCQkJCQkJd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPjB4MCkKCQkJCQkJCXsKCgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcDsKCQkJCQkJCQlpZiAoaW92cmVmX3RlbXBfdmFsdWU8dHJhaW5pbmdfc3RlcCkKCQkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9MDsKCQkJCQkJCQlwcmludGYoIlxuaW92cmVmIGxlZiB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgkJCQkJCQkJewoJCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfbGVmIik7CgkJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJCX0KCgkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlPShpb3ZyZWZfdGVtcF92YWx1ZXwoKGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZmZmZmYwMCkpOwoJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCgkJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCgkJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCgkJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJfQoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzIqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCQkJCQkJCXsKCQkJCQkJCQkJewoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJewoJCQkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8KCQkJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksZHhubGNkbHI0WzBdKTsgIC8vCgkJCQkJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzFdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbMl0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1szXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzFdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbMl0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFszXSk7ICAvLwoJCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCgkJCQkJCQkJCX0KCgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCQkJewoJCQkJCQkJCQl7CgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSwoZHhubGNkbHIzWzBdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyNFswXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHIzWzFdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHIzWzJdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHIzWzNdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHI0WzFdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHI0WzJdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHI0WzNdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwoJCQkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KCQkJCQkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbMV0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1syXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzNdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbMV0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFsyXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzNdKTsgIC8vCgkJCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJfQoKCQkJCQkJCQl9CgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCXByaW50ZigiXG52cmVmIGRvd24gZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcDsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbmlvdnJlZiBsZWYgdGVtcD09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7CgoJCQkJCQkJewoJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9sZWYiKTsKCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfdGVtcF92YWx1ZSk7CgkJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl9CgoJCQkJCQkJewoJCQkJCQkJCXNvY19pb3ZyZWZfdGVzdF9zdGVwPTE7CgkJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsInNvY19pb3ZyZWZfdGVzdF9zdGVwIik7CgkJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsc29jX2lvdnJlZl90ZXN0X3N0ZXApOwoJCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfbGVmIik7CgkJCQkJCXNvY19pb3ZyZWZfbGVmPWVudl90b19hX251bShzdHJfdGVtcDEpOwoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1zb2NfaW92cmVmX2xlZjsKCQkJCQkJcHJpbnRmKCJcbiBkb3duIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIGRvd24gZWRnZT09MHglMDh4XG4gIixzb2NfaW92cmVmX2xlZik7CgkJCQkJCWlvdnJlZl9sZWZbdGVtcF9pXT1pb3ZyZWZfdGVtcF92YWx1ZTsKCQkJCQkJLy9pZihzb2NfaW92cmVmX2xlZikKCQkJCQkJLy97aW92cmVmX3RlbXBfdmFsdWU9c29jX2lvdnJlZl9sZWY7CgkJCQkJCS8vaW92cmVmX2xlZlt0ZW1wX2ldPWlvdnJlZl90ZW1wX3ZhbHVlOwoJCQkJCQkvL30KCQkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQkJaW92cmVmX29yZ1t0ZW1wX2ldKTsgIC8vCgkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaSsxXSk7ICAvLwoJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaSsyXSk7ICAvLwoJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaSszXSk7ICAvLwoJCQkJCQl9CgoJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCXsKCQkJCQkJCXsKCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQlkeG5sY2RscjNbMV0pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQlkeG5sY2RscjNbMl0pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQlkeG5sY2RscjNbM10pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQlkeG5sY2RscjRbMV0pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQlkeG5sY2RscjRbMl0pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQlkeG5sY2RscjRbM10pOyAgLy8KCQkJCQkJCQl9CgoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCgkJCQkJewoJCQkJCQlpZiAodHJhaW5pbmdfc2VlZCkKCQkJCQkJewoJCQkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQkJCSh0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2ldKSYweGZmZmZmZjAwKSkpOwoJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaSsxXSkmMHhmZmZmZmYwMCkpKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaSsyXSkmMHhmZmZmZmYwMCkpKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaSszXSkmMHhmZmZmZmYwMCkpKTsgIC8vCgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoKCQkJCQkJLy9pZihzb2NfaW92cmVmX3JpZz09MCkKCQkJCQkJaWYoc29jX2lvdnJlZl90ZXN0X3N0ZXA9PTEpCgkJCQkJCXsKCQkJCQkJCWlmKHNvY19pb3ZyZWZfcmlnKQoJCQkJCQkJe2lvdnJlZl90ZW1wX3ZhbHVlPXNvY19pb3ZyZWZfcmlnOwoJCQkJCQkJfQoJCQkJCQkJd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPDB4M2YpCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcDsKCQkJCQkJCQlpZiAoaW92cmVmX3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9MHgzZjsKCQkJCQkJCQlwcmludGYoIlxuaW92cmVmIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgkJCQkJCQkJewoJCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfcmlnIik7CgkJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJCX0KCgkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlPShpb3ZyZWZfdGVtcF92YWx1ZXwoKGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZmZmZmYwMCkpOwoJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCgkJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCgkJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksCgkJCQkJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJCQkJfQoKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIixyZWdfYWRkLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzMqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCQkJewoJCQkJCQkJCQl7CgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCX0KCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksZHhubGNkbHIzWzBdKTsgIC8vCgkJCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLGR4bmxjZGxyNFswXSk7ICAvLwoJCQkJCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1sxXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzJdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbM10pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFsxXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzJdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbM10pOyAgLy8KCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0KCgkJCQkJCQkJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCQkJCQkJCXsKCQkJCQkJCQkJewoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyM1swXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLChkeG5sY2RscjRbMF0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKGR4bmxjZGxyM1sxXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKGR4bmxjZGxyM1syXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKGR4bmxjZGxyM1szXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKGR4bmxjZGxyNFsxXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKGR4bmxjZGxyNFsyXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKGR4bmxjZGxyNFszXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCX0KCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJewoJCQkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8KCQkJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksZHhubGNkbHI0WzBdKTsgIC8vCgkJCQkJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzFdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbMl0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1szXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzFdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbMl0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFszXSk7ICAvLwoJCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCgkJCQkJCQkJCX0KCgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJcHJpbnRmKCJcbnZyZWYgdXAgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcDsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlwcmludGYoIlxuaW92cmVmIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgkJCQkJCXsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9yaWciKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCgkJCQkJCXsKCQkJCQkJCXNvY19pb3ZyZWZfdGVzdF9zdGVwPTI7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwic29jX2lvdnJlZl90ZXN0X3N0ZXAiKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLHNvY19pb3ZyZWZfdGVzdF9zdGVwKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkvL3J1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCX0KCgkJCQkJfQoKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfcmlnIik7CgkJCQkJc29jX2lvdnJlZl9yaWc9ZW52X3RvX2FfbnVtKHN0cl90ZW1wMSk7CgkJCQkJaW92cmVmX3RlbXBfdmFsdWU9c29jX2lvdnJlZl9yaWc7CgoJCQkJCXByaW50ZigiXG4gdXAgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICB1cCBlZGdlPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQlpb3ZyZWZfcmlnW3RlbXBfaV09aW92cmVmX3RlbXBfdmFsdWU7CgkJCQkJLy9pZihzb2NfaW92cmVmX3JpZykKCQkJCQkvL3tpb3ZyZWZfdGVtcF92YWx1ZT1zb2NfaW92cmVmX3JpZzsKCQkJCQkvL2lvdnJlZl9yaWdbdGVtcF9pXT1pb3ZyZWZfdGVtcF92YWx1ZTsKCQkJCQkvL30KCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pXSk7ICAvLwoJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJaW92cmVmX29yZ1t0ZW1wX2krMV0pOyAgLy8KCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pKzJdKTsgIC8vCgkJCQkJCXdycl9yZWcoKChyZWdfYWRkKzMqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpKSwKCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaSszXSk7ICAvLwoJCQkJCX0KCgkJCQkJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCQkJCXsKCQkJCQkJewoJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksZHhubGNkbHIzWzBdKTsgIC8vCgkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQlkeG5sY2RscjNbMV0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJZHhubGNkbHIzWzJdKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCWR4bmxjZGxyM1szXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQlkeG5sY2RscjRbMV0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJZHhubGNkbHI0WzJdKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCWR4bmxjZGxyNFszXSk7ICAvLwoJCQkJCQkJfQoKCQkJCQkJfQoJCQkJCX0KCgoJCQkJfQoJCQkJLy8gdmRkcT0xLjV2CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7CgkJCQlwcmludGYoIlxuXG5zb2MgIGlvdnJlZiB0ZXN0IGNsaz09JWRcbiIsc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGspOwoJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgdmRkcT0xLjJ2LGlmIHVzZSBvdGhlciB2ZGRxICxwbGVhc2UgcmVjb3VudFxuIik7CgkJCQlmb3IgKCggIHRlbXBfaT0wKTsodGVtcF9pPDQpOyggdGVtcF9pKyspKQoJCQkJewoJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIGxhbmVfeD0weCUwOHgsICAgICBvcmc9PTB4JTA4eCAgICUwOGRtVlxuIix0ZW1wX2ksaW92cmVmX29yZ1t0ZW1wX2ldLCgoKCgoKGlvdnJlZl9vcmdbdGVtcF9pXSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICBsYW5lX3g9MHglMDh4LCAgICAgZG93biBlZGdlPT0weCUwOHggICAlMDhkbVZcbiIsdGVtcF9pLGlvdnJlZl9sZWZbdGVtcF9pXSwoKCgoKChpb3ZyZWZfbGVmW3RlbXBfaV0mMFgzRikqNykrNDQwKSozKS8yKSsxKSoxMi8xNSk7CgkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgbGFuZV94PTB4JTA4eCwgICAgIHVwIGVkZ2U9PTB4JTA4eCAgICUwOGRtVlxuIix0ZW1wX2ksaW92cmVmX3JpZ1t0ZW1wX2ldLCgoKCgoKGlvdnJlZl9yaWdbdGVtcF9pXSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICBsYW5lX3g9MHglMDh4LCAgICAgbWlkID09MHglMDh4ICAgJTA4ZG1WXG4iLHRlbXBfaSwKCQkJCQkJCShpb3ZyZWZfbGVmW3RlbXBfaV0raW92cmVmX3JpZ1t0ZW1wX2ldKS8yLCgoKCgoKCgoaW92cmVmX2xlZlt0ZW1wX2ldK2lvdnJlZl9yaWdbdGVtcF9pXSkvMikmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxMi8xNSk7CgkJCQkJaWYgKGlvdnJlZl9sZWZbdGVtcF9pXSA9PSAweDApCgkJCQkJewoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgZG93biBlZGdlIHJlYWNoICByZWcgbGltaXRlZFxuIik7CgkJCQkJfQoJCQkJCWlmIChpb3ZyZWZfcmlnW3RlbXBfaV0gPT0gMHgzZikKCQkJCQl7CgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICB1cCBlZGdlIHJlYWNoICByZWcgbGltaXRlZFxuIik7CgkJCQkJfQoJCQkJfQoJCQkJewoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9vcmciKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfb3JnWzBdKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCX0KCgkJCQl7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX2xlZiIpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9sZWZbMF0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJfQoJCQkJewoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9yaWciKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfcmlnWzBdKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCX0KCgkJCQlwcmludGYoIlxuXG4gcHJpbnRmIHNvYyB2cmVmIGZyb20gZW52ICxpZiByZW1lYXN1cmUgc2hvdWxkIGNsZWFyIGRkcl9zb2NfaW92cmVmX29yZyBlbnYgIGRkcl9zb2NfaW92cmVmX2xlZiBcCgkJCQkJCWRkcl9zb2NfaW92cmVmX3JpZyBkZHJfc29jX3ZyZWZfcmFuZ2UsZGRyX3NvY19pb3ZyZWZfdGVzdF9kZHJfY2xrIFxuIik7CgkJfQoJfQoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CiNlbmRpZgoJcmV0dXJuIDE7Cgp9Ci8vKi8KCmludCBkb19kZHI0X3Rlc3RfZHJhbV92cmVmKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCWlmKHdhdGNoZG9nX3RpbWVfcz09MCkKCXsKCQl3YXRjaGRvZ190aW1lX3M9NTA7CgkJcHJpbnRmKCJ0ZXN0IGRyYW1fdnJlZiByZSBzZXQgd2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJfQoKI2lmICggQ09ORklHX0REUl9QSFk+PVBfRERSX1BIWV85MDVYKQoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkcjQgZHJhbSB2cmVmIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7CgkvLyAgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CglpbnQgdHJhaW5pbmdfc2VlZD0wOwoJaW50IHRyYWluaW5nX3N0ZXA9MDsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2NsZWFyPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfY2hhbm5lbCA9IDA7Cgl1bnNpZ25lZCBpbnQgICBkeG5sY2RscjFbNF07CgkvLyAgdW5zaWduZWQgaW50ICAgZHhubGNkbHI0WzRdOwoKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgkvLyAgICNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkJCTB4Yzg4MzYwMDAKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNCAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ0ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzUgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjA1ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI0NSAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyODUgIDw8IDIgKSApCgoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfcmlnWzEwXTsKCWludCAgIGlvdnJlZl90ZW1wX3ZhbHVlOwoJLy8gICAgIGludCAgIGlvdnJlZl90ZW1wX3JlZ192YWx1ZTsKCS8vICAgIHVuc2lnbmVkIGludCAgcmVnX3NlZWRfdmFsdWU7CgkvLwkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZTsKCWludCAgIGlvdnJlZl9vcmc9MDsKCWludCAgIGlvdnJlZl9sZWY9MDsKCWludCAgIGlvdnJlZl9yaWc9MDsKCWludCAgIGlvdnJlZl9taWQ7CglpbnQgICBpb3ZyZWZfdGVzdF9yZWFkOwoJaW50ICAgaW92cmVmX3Rlc3Rfc3RlcDsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9qPTA7CgkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7CgkvLwkJc3RhdGljIHVuc2lnbmVkIGludCB0cmFpbmluZ19lbmFibGVkPTE7CgoJLy8JIGlvdnJlZl9sZWY9MHg0OTsKCS8vIHByaW50ZigiXG5cbiBpb3ZyZWYgIG9yZyAgICAgICAgICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CgkvLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9jbGVhciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9jbGVhciA9IDA7CgkJfQoJCWlmICggIHRlc3RfY2xlYXIgKQoJCQl0ZXN0X2NsZWFyID0gMTsKCgl9Cgl0cmFpbmluZ19zZWVkID0gMDsKCWlmIChhcmdjID41KSB7CgkJdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCX0KCgoJfQoKCgoKCgl0cmFpbmluZ19zdGVwID0gMDsKCWlmIChhcmdjID42KSB7CgkJdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc3RlcCA9IDA7CgkJfQoKCX0KCWlmICghdHJhaW5pbmdfc3RlcCkKCQl0cmFpbmluZ19zdGVwPTE7CglpbnQgdnJlZl9hbGw9MDsKCWlmIChhcmdjID43KSB7CgkJdnJlZl9hbGwgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfYWxsID0wOy8vIDB4MmU7CgkJfX0KCWludCB2cmVmX2xjZGxyX29mZnNldD0wOwoJaWYgKGFyZ2MgPjgpIHsKCQl2cmVmX2xjZGxyX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdnJlZl9sY2Rscl9vZmZzZXQgPTA7CgkJfX0KCWludCB2cmVmX3NldF90ZXN0X3N0ZXA9MDsKCWlmIChhcmdjID45KSB7CgkJdnJlZl9zZXRfdGVzdF9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzldLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX3NldF90ZXN0X3N0ZXAgPTA7CgkJfX0KCWludCB2cmVmX2RyYW1fcmFuZ2U9MDsKCWlmIChhcmdjID4xMCkgewoJCXZyZWZfZHJhbV9yYW5nZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzEwXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX2RyYW1fcmFuZ2UgPTA7CgkJfX0KCgoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9jbGVhcj09IDB4JTA4eFxuIiwgdGVzdF9jbGVhcik7CglwcmludGYoIlxudnJlZl9hbGw9PSAweCUwOHhcbiIsIHZyZWZfYWxsKTsKCXByaW50ZigiXG52cmVmX2xjZGxyX29mZnNldD09IDB4JTA4eFxuIiwgdnJlZl9sY2Rscl9vZmZzZXQpOwoJcHJpbnRmKCJcbnZyZWZfZHJhbV9yYW5nZT09IDB4JTA4eFxuIiwgdnJlZl9kcmFtX3JhbmdlKTsKCgl1bnNpZ25lZCBpbnQgc29jX2RyYW1faGV4X2RlYz0wOwoJaWYgKGFyZ2MgPjExKQoJewoJCXNvY19kcmFtX2hleF9kZWMgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTFdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsxMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXNvY19kcmFtX2hleF9kZWMgPSAwOwoJCX0KCX0KCWlmIChzb2NfZHJhbV9oZXhfZGVjKQoJewoJCWlmIChhcmdjID41KSB7CgkJCXRyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCQl9CgoKCQl9CgoJfQoJaWYgKHRyYWluaW5nX3NlZWQpCgl7CgkJaWYgKHNvY19kcmFtX2hleF9kZWMpCgkJewoJCQlpZiAodnJlZl9kcmFtX3JhbmdlKQoJCQl7CgkJCQlpZiAodHJhaW5pbmdfc2VlZDw0NSkKCQkJCQl0cmFpbmluZ19zZWVkPTQ1OwoJCQkJaWYgKHRyYWluaW5nX3NlZWQ+NzcpCgkJCQkJdHJhaW5pbmdfc2VlZD03NzsKCQkJCXRyYWluaW5nX3NlZWQgPSgoKCgodHJhaW5pbmdfc2VlZCoxMDAwLTQ1MDAwKS82NTApPjBYMzIpPygwWDMyKTooKCh0cmFpbmluZ19zZWVkKjEwMDAtNDUwMDApLzY1MCkpKSk7CgkJCX0KCQkJaWYgKHZyZWZfZHJhbV9yYW5nZSA9PSAwKQoJCQl7CgkJCQlpZiAodHJhaW5pbmdfc2VlZDw2MCkKCQkJCQl0cmFpbmluZ19zZWVkPTYwOwoJCQkJaWYgKHRyYWluaW5nX3NlZWQ+OTIpCgkJCQkJdHJhaW5pbmdfc2VlZD05MjsKCQkJCXRyYWluaW5nX3NlZWQgPSgoKCgodHJhaW5pbmdfc2VlZCoxMDAwLTYwMDAwKS82NTApPjBYMzIpPygwWDMyKTooKCh0cmFpbmluZ19zZWVkKjEwMDAtNjAwMDApLzY1MCkpKSk7CgkJCX0KCQl9CgkJaWYgKHZyZWZfZHJhbV9yYW5nZSA9PSAwKQoJCQlwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpOwoJCWVsc2UKCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKTsKCX0KCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoJY2hhciBzdHJfdGVtcDFbMTAyNF09IiI7CgljaGFyIHN0cl90ZW1wMlsxMDI0XT0iIjsKCWNoYXIgKnBfc3RyPU5VTEw7CgoKCWNoYXIgc3RyWzUxMl09IiI7Cgl1bnNpZ25lZCBpbnQgIGRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsaz0wOwoJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9kcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGsiKTsKCWRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsaz1lbnZfdG9fYV9udW0oc3RyX3RlbXAxKTsKCWlmKGRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsaz09MCkKCXtkcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGs9Z2xvYmFsX2Rkcl9jbGs7CgkJewoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX3Rlc3RfZGRyX2NsayIpOwoJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixkcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGspOwoJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJfQoJfQoJaWYoZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrIT1nbG9iYWxfZGRyX2NsaykKCXsKCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLGRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsayk7CgkJc3ByaW50ZihzdHIsImQycGxsICAlZCIsZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCXdoaWxlKDEpOwoJfQoKCgl7CgkJewoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX29yZyIpOwoJCQkvLwlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfb3JnKTsKCQkJcF9zdHI9Z2V0ZW52KHN0cl90ZW1wMSk7CgoJCQlpZihwX3N0cikKCQkJewoJCQkJaW92cmVmX29yZz0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX3N0ciwgJmVuZHAsIDApOwoJCQl9CgoKCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9kcmFtX2lvdnJlZl9sZWYiKTsKCQkJLy9zcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfbGVmKTsKCQkJcF9zdHI9Z2V0ZW52KHN0cl90ZW1wMSk7CgoJCQlpZihwX3N0cikKCQkJewoJCQkJaW92cmVmX2xlZj0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX3N0ciwgJmVuZHAsIDApOwoJCQl9CgoKCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9kcmFtX2lvdnJlZl9yaWciKTsKCQkJLy9zcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfcmlnKTsKCQkJcF9zdHI9Z2V0ZW52KHN0cl90ZW1wMSk7CgoJCQlpZihwX3N0cikKCQkJewoJCQkJaW92cmVmX3JpZz0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX3N0ciwgJmVuZHAsIDApOwoJCQl9CgoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1fdnJlZl9yYW5nZSIpOwoJCQkvL3NwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLHZyZWZfZHJhbV9yYW5nZSk7CgkJCXBfc3RyPWdldGVudihzdHJfdGVtcDEpOwoKCgkJCWlmKHBfc3RyKQoJCQl7CgkJCQl2cmVmX2RyYW1fcmFuZ2U9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9zdHIsICZlbmRwLCAwKTsKCQkJfQoKCQl9CgoJCWlmKHZyZWZfZHJhbV9yYW5nZXxpb3ZyZWZfcmlnfGlvdnJlZl9vcmd8aW92cmVmX2xlZikKCQl7CgkJCXByaW50ZigiXG5cbmRyYW0gIGlvdnJlZiB0ZXN0IGNsaz09JWRcbiIsZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrKTsKCQkJaW92cmVmX21pZD0oaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yOwoJCQlpZiAodnJlZl9kcmFtX3JhbmdlID09IDApCgkJCXsKCQkJCXByaW50ZigiaW92cmVmX29yZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX2xlZj09MHglMDh4LCUwOGRtVnx8aW92cmVmX3JpZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX21pZDB4JTA4eCwlMDhkbVZcbiIsCgkJCQkJCWlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbGVmLCgoKCgoKGlvdnJlZl9sZWYmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSksCgkJCQkJCWlvdnJlZl9yaWcsKCgoKCgoaW92cmVmX3JpZyYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbWlkLCgoKCgoKGlvdnJlZl9taWQmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSkpOwoJCQl9CgkJCWlmICh2cmVmX2RyYW1fcmFuZ2UpCgkJCXsKCQkJCXByaW50ZigiaW92cmVmX29yZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX2xlZj09MHglMDh4LCUwOGRtVnx8aW92cmVmX3JpZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX21pZDB4JTA4eCwlMDhkbVZcbiIsCgkJCQkJCWlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbGVmLCgoKCgoKGlvdnJlZl9sZWYmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSksCgkJCQkJCWlvdnJlZl9yaWcsKCgoKCgoaW92cmVmX3JpZyYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbWlkLCgoKCgoKGlvdnJlZl9taWQmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSkpOwoJCQl9CgkJCWlmIChpb3ZyZWZfcmlnID09IDB4MzIpCgkJCXsKCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIHJpZyByZWFjaCByZWcgbWF4XG4iKTsKCQkJfQoJCQlpZiAoaW92cmVmX3JpZyA9PSAweDApCgkJCXsKCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIGxlZiByZWFjaCByZWcgbWluXG4iKTsKCQkJfQoJCQlwcmludGYoIlxuXG4gcHJpbnRmIGRyYW0gdnJlZiBmcm9tIGVudiAsaWYgcmVtZWFzdXJlIHNob3VsZCBjbGVhciBkZHJfZHJhbV9pb3ZyZWZfb3JnIGVudiAgZGRyX2RyYW1faW92cmVmX2xlZiBcCgkJCQkJZGRyX2RyYW1faW92cmVmX3JpZyBkZHJfZHJhbV92cmVmX3JhbmdlLGRkcl9kcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGsgXG4iKTsKCQkJcmV0dXJuIDE7CgkJfQoKCX0KCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIGRhdGEgbGFuZVxuIik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIGRhdGEgbGFuZVxuIik7CgkJCQl9CgoKCgoJCQl9CgoJCQl7CgoKI2RlZmluZSB3cnJfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZHJfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgkJCQl1bnNpZ25lZCBpbnQgICBkeG5tZGxyPTA7CgkJCQlyZWdfYWRkPUREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkajsKCQkJCWR4bm1kbHI9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKT4+MTYpJjB4MWZmOwoJCQkJLy8JcmVnX3NlZWRfdmFsdWU9KHRyYWluaW5nX3NlZWR8KDB4MDw8OCl8KDB4MDw8MTYpfCgweDA8PDI0KSk7CgkJCQlwcmludGYoIlxuZHhubWRscj09MHglMDh4XG4gIixkeG5tZGxyKTsKCQkJCS8vdHVybiBvZmYgZGRyNCBwaHkgcmVhZCB2cmVmIGdhdGUsb25seSBvdXRwdXQgYWMgbGFuZSB2cmVmCgkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYMEdDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDFHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgyR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYM0dDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9JT1ZDUjApKSksMHgwMDA5MDkwOXwoMHgwZjw8MjQpKTsKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfSU9WQ1IxKSkpLDB4MTA5KTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDBHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDFHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDJHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDNHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9JT1ZDUjA9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMCkpKSk7CgkJCQlwcmludGYoIlxuRERSMF9QVUJfSU9WQ1IxPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9JT1ZDUjEpKSkpOwoJCQkJdW5zaWduZWQgaW50ICAgdGVtcF9pPTA7CgkJCQkvL3Vuc2lnbmVkIGludCAgIHRlbXBfaV9tYXg9NDsvL0REUjBfUFVCX01SNgoJCQkJZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTw0KTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQlkeG5sY2RscjFbdGVtcF9pXT0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopK3RlbXBfaSooRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkpKSk7CgoJCQkJCXByaW50ZigiXG5yZWc9PTB4JTA4eCxkeG5sY2RscjFbJTA4eF09PTB4JTA4eFxuICIsCgkJCQkJCQkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopK3RlbXBfaSooRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkpLAoJCQkJCQkJdGVtcF9pLGR4bmxjZGxyMVt0ZW1wX2ldKTsKCgkJCQl9CgoJCQkJaW92cmVmX3Rlc3RfcmVhZD0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpJjB4M2Y7CgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I2KSk7CgkJCQlpZiAoKGlvdnJlZl90ZW1wX3ZhbHVlJjB4M2YpID09IDB4MDkpCgkJCQl7CgkJCQkJaW92cmVmX3RlbXBfdmFsdWU9KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX01SNikpKSYweDNmOzsKCQkJCQlpb3ZyZWZfdGVzdF9yZWFkPWlvdnJlZl90ZW1wX3ZhbHVlOwoJCQkJfQoJCQkJaW92cmVmX29yZz0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzcpKSkpJjB4ZmY7CgoKCQkJCXByaW50ZigiUFJFR19TVElDS1lfUkVHNz09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzcpKSkpKTsKCQkJCXByaW50ZigiRERSMF9QVUJfTVI2PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfTVI2KSkpKSk7CgkJCQlwcmludGYoIkREUjBfUFVCX0RYMEdDUjY9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSk7CgkJCQlpZiAoKChpb3ZyZWZfb3JnKSA9PSAwKSB8fCAodGVzdF9jbGVhcikpCgkJCQl7CgoKCgkJCQkJaW92cmVmX29yZz1pb3ZyZWZfdGVtcF92YWx1ZSYweDNmOwoJCQkJCWlvdnJlZl9sZWY9aW92cmVmX29yZzsKCQkJCQlpb3ZyZWZfcmlnPWlvdnJlZl9vcmc7CgkJCQkJaW92cmVmX3Rlc3Rfc3RlcD0wOwoKCQkJCQlpZiAodHJhaW5pbmdfc2VlZCkKCQkJCQl7CgkJCQkJCWlvdnJlZl9vcmc9dHJhaW5pbmdfc2VlZCYweDNmOwoJCQkJCQlpb3ZyZWZfbGVmPWlvdnJlZl9vcmc7CgkJCQkJCWlvdnJlZl9yaWc9aW92cmVmX29yZzsKCQkJCQkJaW92cmVmX3Rlc3Rfc3RlcD0wOwoKCQkJCQl9CgkJCQkJaWYgKHZyZWZfZHJhbV9yYW5nZSA9PSAwKQoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpOwoJCQkJCWVsc2UKCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKTsKCQkJCQl3cnJfcmVnKChQUkVHX1NUSUNLWV9SRUc3KSxpb3ZyZWZfb3JnfChpb3ZyZWZfbGVmPDw4KXwoKGlvdnJlZl9yaWc8PDE2KSl8KGlvdnJlZl90ZXN0X3N0ZXA8PDI0KSk7CgkJCQl9CgoJCQkJcHJpbnRmKCJQUkVHX1NUSUNLWV9SRUc3PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSkpOwoJCQkJewoJCQkJCWlmICgoKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfTVI2KSkpKT4+NikmMSkgPT0gMCkKCQkJCQl7CgkJCQkJCXByaW50ZigicmVnX2FkZD09MHglMDh4LHZhbHVlPT0weCUwOHgsIGlvdnJlZiAgb3JnID09MHglMDh4ICAgJTA4ZG1WXG4iLEREUjBfUFVCX01SNiwKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZSxpb3ZyZWZfb3JnLCgoKCgoKGlvdnJlZl9vcmcmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSkpOwoJCQkJCQlwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWZfZHgwZ2NyNiA9PTB4JTA4eCAgICUwOGRtVlxuIixERFIwX1BVQl9EWDBHQ1I2LAoJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwR0NSNikpKSksKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSwKCQkJCQkJCQkoKCgoKCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpKTsKCgkJCQkJfQoJCQkJCWlmICgoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9NUjYpKSkpPj42KSYxKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJyZWdfYWRkPT0weCUwOHgsdmFsdWU9PTB4JTA4eCwgaW92cmVmICBvcmcgPT0weCUwOHggICAlMDhkbVZcbiIsRERSMF9QVUJfTVI2LAoJCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlLGlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSk7CgkJCQkJCXByaW50ZigicmVnX2FkZD09MHglMDh4LHZhbHVlPT0weCUwOHgsIGlvdnJlZl9keDBnY3I2ID09MHglMDh4ICAgJTA4ZG1WXG4iLEREUjBfUFVCX0RYMEdDUjYsCgkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpLAoJCQkJCQkJCSgoKCgoKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwR0NSNikpKSkmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSkpOwoKCQkJCQl9CgoJCQkJfQoKCQkJCWlvdnJlZl9vcmc9KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKSYweDNmOyAgLy8KCQkJCWlvdnJlZl9sZWY9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSk+PjgpJjB4M2Y7CgkJCQlpb3ZyZWZfcmlnPSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzcpKSkpPj4xNikmMHgzZjsKCQkJCWlvdnJlZl90ZXN0X3N0ZXA9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSk+PjI0KSYweDNmOwoKCgoJCQkJcHJpbnRmKCJcbnRyYWluaW5nX3N0ZXA9PTB4JTA4eFxuICIsdHJhaW5pbmdfc3RlcCk7CgkJCQlwcmludGYoIlxuaW92cmVmX3Rlc3Rfc3RlcD09MHglMDh4XG4gIixpb3ZyZWZfdGVzdF9zdGVwKTsKCQkJCXByaW50ZigiXG5pb3ZyZWZfbGVmPT0weCUwOHhcbiAiLGlvdnJlZl9sZWYpOwoJCQkJcHJpbnRmKCJcbmlvdnJlZl9yaWc9PTB4JTA4eFxuICIsaW92cmVmX3JpZyk7CgkJCQlpZiAodnJlZl9zZXRfdGVzdF9zdGVwKQoJCQkJe2lmKGlvdnJlZl90ZXN0X3N0ZXA9PTApCgkJCQkJaW92cmVmX3Rlc3Rfc3RlcD12cmVmX3NldF90ZXN0X3N0ZXA7CgkJCQl9CgkJCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcDwyKQoJCQkJewoJCQkJCWlmIChpb3ZyZWZfdGVzdF9zdGVwID09IDApCgkJCQkJewoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfbGVmOwoKCQkJCQl9CgkJCQkJaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPT0gMSkKCQkJCQl7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9yaWc7CgkJCQkJfQoJCQkJCS8vaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX2xlZi10cmFpbmluZ19zdGVwOwoJCQkJCXByaW50ZigiXG5pb3ZyZWYgIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCXByaW50ZigiXG5pb3ZyZWZfdGVzdF9yZWFkPT0weCUwOHhcbiAiLGlvdnJlZl90ZXN0X3JlYWQpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWlmICgoaW92cmVmX29yZyA9PSBpb3ZyZWZfbGVmKSAmJiAoaW92cmVmX29yZyA9PSBpb3ZyZWZfcmlnKSkgewoJCQkJCQlwcmludGYoIlxuZmlyc3QgdGVzdCIpOwoJCQkJCX0KCQkJCQllbHNlIGlmKGlvdnJlZl90ZXN0X3JlYWQhPWlvdnJlZl90ZW1wX3ZhbHVlKQoJCQkJCXt0ZW1wX3Rlc3RfZXJyb3I9MTsKCQkJCQl9CgoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJewoJCQkJCQl7CgkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgoKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCXsKCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCS8vCS8qCgkJCQkJCXsKCQkJCQkJCXsKCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgoKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJewoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgkJCQkJCQkJfQoJCQkJCQkJfQoKCgkJCQkJCX0KCQkJCQkJLy8qLwoJCQkJCX0KCgoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQlwcmludGYoIlxudnJlZiAgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPT0gMCkKCQkJCQkJewoKCQkJCQkJCWlvdnJlZl9sZWY9KChpb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwKTwweDMyKT8oKGlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXApKTooMHgzMik7CgkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfb3JnOwoJCQkJCQl9CgkJCQkJCWlmIChpb3ZyZWZfdGVzdF9zdGVwID09IDEpCgkJCQkJCXsKCgkJCQkJCQlpb3ZyZWZfcmlnPShpb3ZyZWZfdGVtcF92YWx1ZT50cmFpbmluZ19zdGVwKT8oKGlvdnJlZl90ZW1wX3ZhbHVlLXRyYWluaW5nX3N0ZXApKTooMCk7CgkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfb3JnOwoJCQkJCQl9CgkJCQkJCWlvdnJlZl90ZXN0X3N0ZXArKzsKCQkJCQkJLy8JYnJlYWs7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXByaW50ZigiXG5pb3ZyZWZfbGVmMT0leFxuIixpb3ZyZWZfbGVmKTsKCQkJCQkJcHJpbnRmKCJcbmlvdnJlZl90ZXN0X3N0ZXA9JXhcbiIsaW92cmVmX3Rlc3Rfc3RlcCk7CgkJCQkJCWlmIChpb3ZyZWZfdGVzdF9zdGVwID09IDApCgkJCQkJCXsKCQkJCQkJCXByaW50ZigiXG5pb3ZyZWZfbGVmMV8yPSV4XG4iLChpb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwKSk7CgkJCQkJCQlpb3ZyZWZfbGVmPShpb3ZyZWZfdGVtcF92YWx1ZT50cmFpbmluZ19zdGVwKT8oKGlvdnJlZl90ZW1wX3ZhbHVlLXRyYWluaW5nX3N0ZXApKTooMCk7CgkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfbGVmOwoJCQkJCQkJaWYgKGlvdnJlZl9sZWYgPT0gMCkKCQkJCQkJCXsKCQkJCQkJCQlpb3ZyZWZfdGVzdF9zdGVwKys7CgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX29yZzsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA9PSAxKQoJCQkJCQl7CgkJCQkJCQlpb3ZyZWZfcmlnPSgoaW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcCk8MHgzMik/KGlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXApOigweDMyKTsKCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9yaWc7CgkJCQkJCQlpZiAoaW92cmVmX3JpZyA9PSAweDMyKQoJCQkJCQkJCWlvdnJlZl90ZXN0X3N0ZXArKzsKCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuaW92cmVmX2xlZjI9JXhcbiIsaW92cmVmX2xlZik7CgkJCQkJfQoJCQkJCXsKCgoJCQkJCQl3cnJfcmVnKChQUkVHX1NUSUNLWV9SRUc3KSxpb3ZyZWZfb3JnfChpb3ZyZWZfbGVmPDw4KXwoKGlvdnJlZl9yaWc8PDE2KSl8KGlvdnJlZl90ZXN0X3N0ZXA8PDI0KSk7CgkJCQkJCXByaW50ZigiXG5kZHI0cmFtIHZyZWYgdGVzdCB3aWxsIHJlYm9vdCB1c2UgbmV3IGRyYW0gdnJlZiBzZXR0aW5nPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShQUkVHX1NUSUNLWV9SRUc3KSkpKTsKCQkJCQkJY2hhciBzdHJbMTAwXTsKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDE3ICVkIDAgMCAwIDB4JXgiLGRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsayxpb3ZyZWZfdGVtcF92YWx1ZXwoKHZyZWZfZHJhbV9yYW5nZSYxKTw8NikpOwoJCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQkJLy9ydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTcgMTEwMCAwIDAgMHhzb2MgMHhkcmFtICIsMCk7Ly8KCQkJCQl9CgkJCQl9CgoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOwoJCQkJaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPj0gMikKCQkJCXsKCQkJCQlwcmludGYoIlxuXG5kcmFtICBpb3ZyZWYgdGVzdCBjbGs9PSVkXG4iLGRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsayk7CgkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgdmRkcT0xLjJ2LGlmIHVzZSBvdGhlciB2ZGRxICxwbGVhc2UgcmVjb3VudFxuIik7CgkJCQkJcHJpbnRmKCJcbmRkcjRyYW0gdnJlZiB0ZXN0IGZpbmlzaCBpb3ZyZWZfdGVzdF9zdGVwPT0weCUwOHhcbiAiLGlvdnJlZl90ZXN0X3N0ZXApOwoJCQkJCWlvdnJlZl9vcmc9KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKSYweDNmOyAgLy8KCQkJCQlpb3ZyZWZfbGVmPSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzcpKSkpPj44KSYweDNmOwoJCQkJCWlvdnJlZl9yaWc9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSk+PjE2KSYweDNmOwoJCQkJCWlvdnJlZl90ZXN0X3N0ZXA9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSk+PjI0KSYweDNmOwoJCQkJCWlvdnJlZl9taWQ9KGlvdnJlZl9sZWYraW92cmVmX3JpZykvMjsKCQkJCQlpZiAodnJlZl9kcmFtX3JhbmdlID09IDApCgkJCQkJewoJCQkJCQlwcmludGYoImlvdnJlZl9vcmc9PTB4JTA4eCwlMDhkbVZ8fGlvdnJlZl9sZWY9PTB4JTA4eCwlMDhkbVZ8fGlvdnJlZl9yaWc9PTB4JTA4eCwlMDhkbVZ8fGlvdnJlZl9taWQweCUwOHgsJTA4ZG1WXG4iLAoJCQkJCQkJCWlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbGVmLCgoKCgoKGlvdnJlZl9sZWYmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSksCgkJCQkJCQkJaW92cmVmX3JpZywoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9taWQsKCgoKCgoaW92cmVmX21pZCYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSk7CgkJCQkJfQoJCQkJCWlmICh2cmVmX2RyYW1fcmFuZ2UpCgkJCQkJewoJCQkJCQlwcmludGYoImlvdnJlZl9vcmc9PTB4JTA4eCwlMDhkbVZ8fGlvdnJlZl9sZWY9PTB4JTA4eCwlMDhkbVZ8fGlvdnJlZl9yaWc9PTB4JTA4eCwlMDhkbVZ8fGlvdnJlZl9taWQweCUwOHgsJTA4ZG1WXG4iLAoJCQkJCQkJCWlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSxpb3ZyZWZfbGVmLCgoKCgoKGlvdnJlZl9sZWYmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSksCgkJCQkJCQkJaW92cmVmX3JpZywoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9taWQsKCgoKCgoaW92cmVmX21pZCYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSk7CgkJCQkJfQoJCQkJCWlmIChpb3ZyZWZfcmlnID09IDB4MzIpCgkJCQkJewoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICByaWcgcmVhY2ggcmVnIG1heFxuIik7CgkJCQkJfQoJCQkJCWlmIChpb3ZyZWZfcmlnID09IDB4MCkKCQkJCQl7CgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIGxlZiByZWFjaCByZWcgbWluXG4iKTsKCQkJCQl9CgkJCQkJLy9jaGFyIHN0cjJbMTAwXTsKCQkJCQkvL3NwcmludGYoc3RyMiwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAgMHgleCIsZ2xvYmFsX2Rkcl9jbGssaW92cmVmX29yZyk7CgkJCQkJLy9wcmludGYoIlxuc3RyMj0lc1xuIixzdHIyKTsKCQkJCQkvL3J1bl9jb21tYW5kKHN0cjIsMCk7CgkJCQkJewoJCQkJCQl7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX29yZyIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX29yZyk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgkJCQkJCXsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfZHJhbV9pb3ZyZWZfbGVmIik7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfbGVmKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQkJewoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9kcmFtX2lvdnJlZl9yaWciKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9yaWcpOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCQl7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1fdnJlZl9yYW5nZSIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsdnJlZl9kcmFtX3JhbmdlKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQl9CgoKCgoKCgoKCgoKCgoKCgoKCgoJCQkJfQoKCgoJCQl9CgoKCgoKCgkJfQoKCX0KCgoKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKI2VuZGlmCglyZXR1cm4gMTsKCn0KCiNlbmRpZgppbnQgZG9fZGRyNF90ZXN0X2RyYW1fYWNfdnJlZihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKI2lmICggQ09ORklHX0REUl9QSFk+PVBfRERSX1BIWV85MDVYKQoJLy8vKgoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkcjQgcGh5X2FjIG9yIGRkcjMgZHJhbSBkYXRhIHZyZWYgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCS8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9qPSAxOwoJLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoJaW50IHRyYWluaW5nX3NlZWQ9MDsKCWludCB0cmFpbmluZ19zdGVwPTA7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9kcmFtX2FjX2RhdGE9MDsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCXVuc2lnbmVkIGludCAgIGR4bmxjZGxyMVs0XTsKCS8vIHVuc2lnbmVkIGludCAgIGR4bmxjZGxyNFs0XTsKCgojZGVmaW5lICBDSEFOTkVMX0EgIDAKI2RlZmluZSAgQ0hBTk5FTF9CICAxCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgkvLyAgICNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkJCTB4Yzg4MzYwMDAKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNCAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ0ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzUgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjA1ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI0NSAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyODUgIDw8IDIgKSApCgoJLy8jZGVmaW5lIEREUjBfUFVCX0lPVkNSMCAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNDggPDwgMiApICkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDAKCS8vI2RlZmluZSBERFIwX1BVQl9JT1ZDUjEgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ5IDw8IDIgKSApIC8vIFIvVyAtIElPIFZSRUYgQ29udHJvbCBSZWdpc3RlciAxCgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfbGVmWzEwXTsKCS8vICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9yaWdbMTBdOwoJaW50ICAgaW92cmVmX3RlbXBfdmFsdWU7CgkvLyAgICBpbnQgICBpb3ZyZWZfdGVtcF9yZWdfdmFsdWU7CgkvLyAgICB1bnNpZ25lZCBpbnQgIHJlZ19zZWVkX3ZhbHVlOwoJLy8JICAgdW5zaWduZWQgaW50ICAgdGVtcF9yZWdfdmFsdWU7CglpbnQgICBpb3ZyZWZfb3JnOwoJaW50ICAgaW92cmVmX2xlZjsKCWludCAgIGlvdnJlZl9yaWc7CgkvLyAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yOwoJLy8JdW5zaWduZWQgaW50IHRlbXBfaT0wOwoJLy8JdW5zaWduZWQgaW50IHRlbXBfaj0wOwoJLy91bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy8JCXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhaW5pbmdfZW5hYmxlZD0xOwoKCS8vCSBpb3ZyZWZfbGVmPTB4NDk7CgkvLyBwcmludGYoIlxuXG4gaW92cmVmICBvcmcgICAgICAgICAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIixpb3ZyZWZfbGVmLCgoKCgoaW92cmVmX2xlZiYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoJLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCQkJY2hhbm5lbF9hX2VuID0gMTsKCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoJCQljaGFubmVsX2JfZW4gPSAxOwoJCWVsc2UKCQkJZ290byB1c2FnZTsKCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoJCQljaGFubmVsX2FfZW4gPSAxOwoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCQkJY2hhbm5lbF9iX2VuID0gMTsKCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9kcmFtX2FjX2RhdGEgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfZHJhbV9hY19kYXRhID0gMDsKCQl9CgkJaWYgKCAgdGVzdF9kcmFtX2FjX2RhdGEgKQoJCQl0ZXN0X2RyYW1fYWNfZGF0YSA9IDE7CgoJfQoJdHJhaW5pbmdfc2VlZCA9IDA7CglpZiAoYXJnYyA+NSkgewoJCXRyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRyYWluaW5nX3NlZWQgPTA7Ly8gMHgyZTsKCQl9CgoKCX0KCgoJdHJhaW5pbmdfc3RlcCA9IDA7CglpZiAoYXJnYyA+NikgewoJCXRyYWluaW5nX3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRyYWluaW5nX3N0ZXAgPSAwOwoJCX0KCgoKCX0KCWludCB2cmVmX2FsbD0wOwoJaWYgKGFyZ2MgPjcpIHsKCQl2cmVmX2FsbCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdnJlZl9hbGwgPTA7Ly8gMHgyZTsKCQl9fQoJaW50IHZyZWZfbGNkbHJfb2Zmc2V0PTA7CglpZiAoYXJnYyA+OCkgewoJCXZyZWZfbGNkbHJfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzhdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX2xjZGxyX29mZnNldCA9MDsKCQl9fQoJaW50IHNvY19kcmFtX2hleF9kZWM9MDsKCWlmIChhcmdjID45KQoJewoJCXNvY19kcmFtX2hleF9kZWMgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzldID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzb2NfZHJhbV9oZXhfZGVjID0gMDsKCQl9Cgl9CglpZiAodHJhaW5pbmdfc2VlZCA9PTApIC8vIDB4MmU7Cgl7dHJhaW5pbmdfc2VlZD0weDk7Cgl9CglpZiAoc29jX2RyYW1faGV4X2RlYykKCXsKCQlpZiAoYXJnYyA+NSkgewoJCQl0cmFpbmluZ19zZWVkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRyYWluaW5nX3NlZWQgPTA7Ly8gMHgyZTsKCQkJfQoKCgkJfQoJCWlmICh0cmFpbmluZ19zZWVkID09MCkgLy8gMHgyZTsKCQl7dHJhaW5pbmdfc2VlZD01MDsKCQl9CgkJaWYgKHRyYWluaW5nX3NlZWQ8NDUpCgkJCXRyYWluaW5nX3NlZWQ9NDU7CgkJaWYgKHRyYWluaW5nX3NlZWQ+ODgpCgkJCXRyYWluaW5nX3NlZWQ9ODg7CgkJdHJhaW5pbmdfc2VlZCA9KCgodHJhaW5pbmdfc2VlZCoxMDAwLTQ0MDcwKS82OTgpKTsKCgl9CgoKCglwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2RyYW1fYWNfZGF0YT09IDB4JTA4eFxuIiwgdGVzdF9kcmFtX2FjX2RhdGEpOwoJcHJpbnRmKCJcbnZyZWZfYWxsPT0gMHglMDh4XG4iLCB2cmVmX2FsbCk7CglwcmludGYoIlxudnJlZl9sY2Rscl9vZmZzZXQ9PSAweCUwOHhcbiIsIHZyZWZfbGNkbHJfb2Zmc2V0KTsKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIGRhdGEgbGFuZVxuIik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIGRhdGEgbGFuZVxuIik7CgkJCQl9CgoKCQkJCXsKCgojZGVmaW5lIHdycl9yZWcoYWRkciwgZGF0YSkJKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQojZGVmaW5lIHJkcl9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCQkJCQl1bnNpZ25lZCBpbnQgICBkeG5tZGxyPTA7CgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGo7CgkJCQkJZHhubWRscj0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpPj4xNikmMHgxZmY7CgkJCQkJLy8JcmVnX3NlZWRfdmFsdWU9KHRyYWluaW5nX3NlZWR8KDB4MDw8OCl8KDB4MDw8MTYpfCgweDA8PDI0KSk7CgkJCQkJcHJpbnRmKCJcbmR4bm1kbHI9PTB4JTA4eFxuICIsZHhubWRscik7CgkJCQkJLy90dXJuIG9mZiBkZHI0IHBoeSByZWFkIHZyZWYgZ2F0ZSxvbmx5IG91dHB1dCBhYyBsYW5lIHZyZWYKCQkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYMEdDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgxR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDJHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYM0dDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJCXByaW50ZigiXG5vcmcgRERSMF9QVUJfSU9WQ1IwPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9JT1ZDUjApKSkpOwoJCQkJCXByaW50ZigiXG5vcmcgRERSMF9QVUJfSU9WQ1IxPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9JT1ZDUjEpKSkpOwoJCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfSU9WQ1IwKSkpLHRyYWluaW5nX3NlZWR8KHRyYWluaW5nX3NlZWQ8PDgpfCh0cmFpbmluZ19zZWVkPDwxNil8KDB4MWY8PDI0KSk7CgkJCQkJd3JyX3JlZygoKChERFIwX1BVQl9JT1ZDUjEpKSksMHgxMDkpOwoJCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDBHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I0KSkpKTsKCQkJCQlwcmludGYoIlxuRERSMF9QVUJfRFgxR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxR0NSNCkpKSk7CgkJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYMkdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkdDUjQpKSkpOwoJCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDNHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNHQ1I0KSkpKTsKCQkJCQlwcmludGYoIlxuRERSMF9QVUJfSU9WQ1IwPT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9JT1ZDUjApKSkpOwoJCQkJCXByaW50ZigiXG5ERFIwX1BVQl9JT1ZDUjE9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMSkpKSk7CgkJCQkJdW5zaWduZWQgaW50ICAgdGVtcF9pPTA7CgoJCQkJCWZvciAoKCAgdGVtcF9pPTApOyh0ZW1wX2k8NCk7KCB0ZW1wX2krKykpCgkJCQkJewoJCQkJCQl7CgkJCQkJCQlkeG5sY2RscjFbdGVtcF9pXT0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopK3RlbXBfaSooRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkpKSk7CgoJCQkJCQkJcHJpbnRmKCJcbmR4bmxjZGxyMVslMDh4XT09MHglMDh4LGR4bmxjZGxyMVslMDh4XT09MHglMDh4XG4gIix0ZW1wX2ksZHhubGNkbHIxW3RlbXBfaV0sdGVtcF9pLGR4bmxjZGxyMVt0ZW1wX2ldKTsKCgkJCQkJCX0KCQkJCQl9CgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9JT1ZDUjArcmVnX2Jhc2VfYWRqOwoJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQkJaW92cmVmX29yZz0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCQkJCQkvLwkgaW92cmVmX2xlZj0weDQ5OwoKCQkJCQl7CgkJCQkJCXByaW50ZigicmVnX2FkZD09MHglMDh4LHZhbHVlPT0weCUwOHgsIGlvdnJlZiAgb3JnID09MHglMDh4ICAgJTA4ZG1WXG4iLHJlZ19hZGQsCgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWUsaW92cmVmX29yZywoKCgoKChpb3ZyZWZfdGVtcF92YWx1ZSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjE1LzE1KTsKCQkJCQl9CgoKCQkJCQl3cnJfcmVnKChyZWdfYWRkKSxpb3ZyZWZfdGVtcF92YWx1ZSk7ICAvLwoJCQkJCWlvdnJlZl9sZWY9KGlvdnJlZl9vcmcpJjB4ZmY7CgkJCQkJaW92cmVmX3JpZz0oaW92cmVmX29yZykmMHhmZjsKCgkJCQl9CgoJCQkJcHJpbnRmKCJcbnRyYWluaW5nX3N0ZXA9PTB4JTA4eFxuICIsdHJhaW5pbmdfc3RlcCk7CgoKCQkJCXsKCgoKCgoKCQkJCQl7CgoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCgkJCQkJCXdoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZT4weDApCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcDsKCQkJCQkJCWlmIChpb3ZyZWZfdGVtcF92YWx1ZTx0cmFpbmluZ19zdGVwKQoJCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPTA7CgkJCQkJCQlwcmludGYoIlxuaW92cmVmIGxlZiB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgoJCQkJCQkJd3JyX3JlZygocmVnX2FkZCksKDB4MWYwMDAwMDB8aW92cmVmX3RlbXBfdmFsdWV8KGlvdnJlZl90ZW1wX3ZhbHVlPDw4KXwoaW92cmVmX3RlbXBfdmFsdWU8PDE2KSkpOwoKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQscmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKSk7CgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCQl7CgkJCQkJCQkJewoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgoKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgoJCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKCQkJCQkJCQkJfQoKCQkJCQkJCQl9CgoJCQkJCQkJfQoKCQkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJCXsKCQkJCQkJCQl7CgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCgkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoKCQkJCQkJCQkJewoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCXByaW50ZigiXG52cmVmIGRvd24gZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlwcmludGYoIlxuIGRvd24gZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgICAgICAgICAgICAgICAgICAgICAgZG93biBlZGdlPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJaW92cmVmX2xlZj1pb3ZyZWZfdGVtcF92YWx1ZTsKCgkJCQkJCXdycl9yZWcoKHJlZ19hZGQpLGlvdnJlZl9vcmcpOyAgLy8KCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCgkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwoJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8KCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoKCgkJCQkJfQoKCQkJCQl7CgoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCgkJCQkJCXdoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZTwweDNmKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXA7CgkJCQkJCQlpZiAoaW92cmVmX3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJcHJpbnRmKCJcbmlvdnJlZiByaWcgdGVtcD09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7CgoJCQkJCQkJd3JyX3JlZygocmVnX2FkZCksKDB4MWYwMDAwMDB8aW92cmVmX3RlbXBfdmFsdWV8KGlvdnJlZl90ZW1wX3ZhbHVlPDw4KXwoaW92cmVmX3RlbXBfdmFsdWU8PDE2KSkpOwoKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQscmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKSk7CgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCQl7CgkJCQkJCQkJewoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgoKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgoJCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKCQkJCQkJCQkJfQoKCQkJCQkJCQl9CgoJCQkJCQkJfQoKCQkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJCXsKCQkJCQkJCQl7CgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCgkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoKCQkJCQkJCQkJewoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCXByaW50ZigiXG52cmVmIHVwIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcDsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJcHJpbnRmKCJcbiB1cCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICB1cCBlZGdlPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJaW92cmVmX3JpZz1pb3ZyZWZfdGVtcF92YWx1ZTsKCgkJCQkJCXdycl9yZWcoKHJlZ19hZGQpLGlvdnJlZl9vcmcpOyAgLy8KCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCgkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwoJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMl0pOyAgLy8KCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoKCgkJCQkJfQoKCgoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgdmRkcT0xLjV2LGlmIHVzZSBvdGhlciB2ZGRxICxwbGVhc2UgcmVjb3VudFxuIik7CgkJCQkJCXByaW50ZigiXG4gdmRkcT0xLjV2IGlvdnJlZiAgYWMrZHJhbV9kYXRhIG9yZz09MHglMDh4ICAgJTA4ZG1WfHxkb3duIGVkZ2U9PTB4JTA4eCAlMDhkbVZ8fHVwIGVkZ2U9PTB4JTA4eCAlMDhkbVZ8fG1pZD09MHglMDh4ICAgJTA4ZG1WXG4iLAoJCQkJCQkJCWlvdnJlZl9vcmcsKCgoKCgoKGlvdnJlZl9vcmcmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxNS8xNSksaW92cmVmX2xlZiwoKCgoKCgoaW92cmVmX2xlZiYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjE1LzE1KSwKCQkJCQkJCQlpb3ZyZWZfcmlnLCgoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTUvMTUpLCgoaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yKSwKCQkJCQkJCQkoKCgoKCgoKChpb3ZyZWZfbGVmK2lvdnJlZl9yaWcpLzIpJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTUvMTUpCgkJCQkJCQkgICk7CgoJCQkJCQlpZiAoaW92cmVmX2xlZiA9PSAweDApCgkJCQkJCXsKCQkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICBkb3duIGVkZ2UgcmVhY2ggIHJlZyBsaW1pdGVkXG4iKTsKCQkJCQkJfQoJCQkJCQlpZiAoaW92cmVmX3JpZyA9PSAweDNmKQoJCQkJCQl7CgkJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgdXAgZWRnZSByZWFjaCAgcmVnIGxpbWl0ZWRcbiIpOwoJCQkJCQl9CgkJCQkJfQoKCgoKCgoKCgoKCgoKCgkJCQl9CgoKCgkJCX0KCgoKCgoKCQl9CgoJfQoKCgoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJLy8qLwojZW5kaWYKCXJldHVybiAxOwoKfQovLwoKaW50IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYSh1bnNpZ25lZCBpbnQgZGRyX3BsbCkKewoJdW5zaWduZWQgaW50IGRkcl9jbGs9MDsKCXVuc2lnbmVkIGludCBvZF9kaXY9MHhmZmY7CglkZHJfcGxsPWRkcl9wbGwmMHhmZmZmZjsKI2lmIDEvLyAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJLy91bnNpZ25lZCBpbnQgZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj40KSYweDFmZikpLygoZGRyX3BsbD4+MTYpJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjApJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4wKSYweDMpKSkpLygoKGRkcl9wbGw+PjIpJjB4MykrMSkpOyAgLy9vZDEgIG9kCglpZigoKGRkcl9wbGw+PjE2KSY3KT09MCkKCQlvZF9kaXY9MjsKCWlmKCgoZGRyX3BsbD4+MTYpJjcpPT0xKQoJCW9kX2Rpdj0zOwoKCWlmKCgoZGRyX3BsbD4+MTYpJjcpPT0yKQoJCW9kX2Rpdj00OwoKCWlmKCgoZGRyX3BsbD4+MTYpJjcpPT0zKQoJCW9kX2Rpdj02OwoKCWlmKCgoZGRyX3BsbD4+MTYpJjcpPT00KQoJCW9kX2Rpdj04OwoKCWlmKCgoZGRyX3BsbD4+MTApJjB4MWYpKQoJCWRkcl9jbGsgPSAyKigoKCgyNCAqICgoZGRyX3BsbD4+MCkmMHgxZmYpKS8oKGRkcl9wbGw+PjEwKSYweDFmKSk+PigoKChkZHJfcGxsPj4xOSkmMHgxKT09MSk/KDIpOigxKSkpKS9vZF9kaXY7CgojZWxzZQoJZGRyX2NsayA9IDIqKCgoMjQgKiAoZGRyX3BsbCYweDFmZikpLygoZGRyX3BsbD4+OSkmMHgxZikpPj4oKGRkcl9wbGw+PjE2KSYweDMpKTsKCiNlbmRpZgoKCglyZXR1cm4gZGRyX2NsazsKfQoKCmludCBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsX2cxMmEodW5zaWduZWQgaW50IGRkcl9jbGssIHVuc2lnbmVkIGNoYXIgcGxsX2J5cGFzc19lbikKewoJdWludDMyX3QgZGRyX3BsbF92Y29fY3RybD0wOwoJdWludDMyX3QgZGRyX3BsbF92Y29fbT0wOwoJdWludDMyX3QgZGRyX3BsbF92Y29fbj0wOwoJdWludDMyX3QgZGRyX3BsbF92Y29fY3RybF9vZD0wOwoJdWludDMyX3QgZGRyX3BsbF92Y29fY3RybF9vZDE9MDsKCWRkcl9wbGxfdmNvX249MTsKCWlmIChwbGxfYnlwYXNzX2VuID09IDApIHsKCQlpZiAoKGRkcl9jbGsgPj00ODAwLzQpKSB7CgkJCS8vZGF0YXJhdGU9PXZjbyBzaG91bGQgMy00LjhnCgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MTsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgyOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayozKS8yNDsgLy82CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrID40ODAwLzYpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MjsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgyOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo0KS8yNDsgLy84CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrID4gNDgwMC84KSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTM7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MjsgLy8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqNikvMjQ7IC8vMTIKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPiA0ODAwLzEyKSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTQ7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2QxPTB4MjsgLy8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqOCkvMjQ7IC8vMTYKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPiAzNjApKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MzsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgzOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoxMikvMjQ7CgkJfQoJCWVsc2UgewoJCQkvLzMyICAgc2hvdWxkID4yMDBNCgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9NDsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgzOy8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjE2KS8yNDsKCQl9Cgl9CglpZiAocGxsX2J5cGFzc19lbiA9PSAxKSB7CgkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgzOy8vMAoJCWlmICgoZGRyX2NsayA+PTgwMCkpIHsKCQkJLy9kYXRhcmF0ZT09dmNvIHNob3VsZCAyLjQtNC44ZwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTA7CgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqNCkvMjQ7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrIDwgNDgwMC82KSkgewoJCQlkZHJfcGxsX3Zjb19jdHJsX29kPTE7CgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMiozKS8yNDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPCA0ODAwLzgpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MjsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoyKjQpLzI0OwoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA8IDQ4MDAvMTIpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MzsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoyKjYpLzI0OwoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA8IDQ4MDAvMTYpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9NDsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoyKjgpLzI0OwoJCX0KCX0KCWRkcl9wbGxfdmNvX2N0cmw9ZGRyX3BsbF92Y29fbXwoZGRyX3BsbF92Y29fbjw8MTApfChkZHJfcGxsX3Zjb19jdHJsX29kPDwxNil8KGRkcl9wbGxfdmNvX2N0cmxfb2QxPDwxOSk7CglyZXR1cm4gZGRyX3BsbF92Y29fY3RybDsKCgkvL3JldHVybiBkZHJfcGxsX3Zjb19jdHJsOwp9CmludCBwbGxfY29udmVydF90b19kZHJfY2xrKHVuc2lnbmVkIGludCBkZHJfcGxsKQp7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsaz0wOwoJZGRyX3BsbD1kZHJfcGxsJjB4ZmZmZmY7CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoJLy8gICBwcmludGYoIlxuZzEyIGRkcl9wbGw9PSAlMDh4IFxuIiwgZGRyX3BsbCk7CglkZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYSggIGRkcl9wbGwpOwoJcmV0dXJuIGRkcl9jbGs7CiNlbmRpZgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCS8vdW5zaWduZWQgaW50IGRkcl9jbGsgPSAyKigoKCgyNCAqICgoZGRyX3BsbD4+NCkmMHgxZmYpKS8oKGRkcl9wbGw+PjE2KSYweDFmKSk+PigoKChkZHJfcGxsPj4wKSYweDMpPT0zKT8oMik6KCgoZGRyX3BsbD4+MCkmMHgzKSkpKS8oKChkZHJfcGxsPj4yKSYweDMpKzEpKTsKCWlmKCgoZGRyX3BsbD4+MTYpJjB4MWYpKQoKCQlkZHJfY2xrID0gMiooKCgoMjQgKiAoKGRkcl9wbGw+PjQpJjB4MWZmKSkvKChkZHJfcGxsPj4xNikmMHgxZikpPj4oKCgoZGRyX3BsbD4+MCkmMHgzKT09Myk/KDIpOigoKGRkcl9wbGw+PjApJjB4MykpKSk+PigoKChkZHJfcGxsPj4yKSYweDMpPT0zKT8oMik6KCgoZGRyX3BsbD4+MikmMHgzKSkpKTsKCiNlbHNlCglpZigoZGRyX3BsbD4+OSkmMHgxZikKCQlkZHJfY2xrID0gMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKI2VuZGlmCgojaWYgKENPTkZJR19ERFJfUEhZID09IFBfRERSX1BIWV9ERUZBVUxUKQoJaWYoKGRkcl9wbGw+PjkpJjB4MWYpCgkJZGRyX2NsayA9IDIqKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4Myk7CiNlbmRpZgoKCXJldHVybiBkZHJfY2xrOwp9CgppbnQgZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh1bnNpZ25lZCBpbnQgZGRyX2NsaykKewoJdW5zaWduZWQgaW50IGRkcl9wbGw9MHgxMDIyMTsKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCglkZHJfcGxsPWRkcl9jbGtfY29udmVydF90b19wbGxfZzEyYSggIGRkcl9jbGssMCk7CglyZXR1cm4gZGRyX3BsbDsKI2VuZGlmCgoJLyogc2V0IGRkciBwbGwgcmVnICovCglpZiAoKGRkcl9jbGsgPj0gNDApICYmIChkZHJfY2xrIDwgNzUwKSkgewoJCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgyIDw8IDE2KSB8ICgxIDw8IDkpIHwgKCgoKGRkcl9jbGsvNikqNikvMTIpIDw8IDApOwoJfQoJZWxzZSBpZigoZGRyX2NsayA+PSA3NTApICYmIChkZHJfY2xrIDwgMjAwMCkpIHsKCQkvLwkJCQkJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMSA8PCAxNikgfCAoMSA8PCA5KSB8ICgoKChkZHJfY2xrLzEyKSoxMikvMjQpIDw8IDApOwoJfQoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCglkZHJfcGxsPTB4MDAxMDRjNTsKCS8qIHNldCBkZHIgcGxsIHJlZyAqLwoJLyoKCSAgIGlmICgoZGRyX2NsayA+PSA0MCkgJiYgKGRkcl9jbGsgPCA3NTApKSB7CgkvLwkJCQkJCQlPRAkJCU4JCQkJCU0KCWRkcl9wbGw9ICgyIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsvNikqNikvMTIpIDw8IDQpOwoJfQoJZWxzZSBpZigoZGRyX2NsayA+PSA3NTApICYmIChkZHJfY2xrIDwgMjAwMCkpIHsKCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJZGRyX3BsbD0gKDEgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsay8xMikqMTIpLzI0KSA8PCA0KTsKCX0KCSovCglpZiAoKGRkcl9jbGsgPCAyMDApKSB7CgkJLy8JCQkJCQkJT0QxCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDIgPDwgMCkgfCAoMyA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrKjYpLzYpLzMpIDw8IDQpOwoJfQoJZWxzZSBpZiAoKGRkcl9jbGs+PSAyMDApICYmIChkZHJfY2xrPCA0MDApKSB7CgkJLy8JCQkJCQkJT0QxCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDIgPDwgMCkgfCAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrKjYpLzYpLzYpIDw8IDQpOwoJfQoJZWxzZSBpZiAoKGRkcl9jbGs+PSA0MDApICYmIChkZHJfY2xrIDwgODAwKSkgewoJCS8vCQkJCQkJCU9EMQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgxIDw8IDApIHwgKDEgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2NsayoxMikvMTIpLzEyKSA8PCA0KTsKCX0KCWVsc2UgaWYgKChkZHJfY2xrID49IDgwMCkgJiYgKGRkcl9jbGsgPCAyMDAwKSkgewoJCS8vCQkJCQkJCU9EMQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgwIDw8IDApIHwgKDEgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2NsayoxMikvMTIpLzI0KSA8PCA0KTsKCX0KI2VuZGlmCgojaWYgKENPTkZJR19ERFJfUEhZID09IFBfRERSX1BIWV9ERUZBVUxUKQoJewoKCgkJaWYgKChkZHJfY2xrIDwgNzUwKSkgewoJCQkvLwkJT0QJCQlOCQlNCgkJCWRkcl9wbGw9ICgyIDw8IDE2KSB8ICgxIDw8IDkpIHwgKCgoZGRyX2Nsay8yNCkqMik8PCAwKSA7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrID49IDc1MCkpIHsKCQkJLy8JCU9ECQkJTgkJTQoJCQlkZHJfcGxsPSAoMSA8PCAxNikgfCAoMSA8PCA5KSB8ICgoZGRyX2Nsay8yNCk8PCAwKSA7CgkJfQoKCX0KI2VuZGlmCgoJcmV0dXJuIGRkcl9wbGw7Cn0KCgppbnQgZG9fZGRyNF90ZXN0X2RyYW1fY2xrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8vKgoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCWNoYXIgKmVuZHA7CgojZGVmaW5lIFRFU1RfRFJBTV9DTEtfVVNFX0VOViAgMQoJcHJpbnRmKCJcbnR1bmUgZGRyIENMSyB1c2UgdWJvb3QgZW52XG4iKTsKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKI2RlZmluZSAgRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRCAgNTAKI2RlZmluZSAgRERSX1RFU1RfTUlOX0ZSRVEgIDMwMAojZGVmaW5lICBERFJfVEVTVF9NQVhfRlJFUSAgMzAwMAoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCBzdGFydF9mcmVxPUREUl9URVNUX01JTl9GUkVROwoJdW5zaWduZWQgaW50IGVuZF9mcmVxPUREUl9URVNUX01BWF9GUkVROwoJdW5zaWduZWQgaW50IHRlc3RfbG9vcHM9MTsKCS8vcHJpbnRmKCJcbjExMXR1bmUgZGRyIENMSyB1c2UgdWJvb3QgZW52XG4iKTsKCWlmIChhcmdjID09IDEpCgl7CgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJc3RhcnRfZnJlcT1ERFJfVEVTVF9NSU5fRlJFUTsKCQllbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCgl9CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT1ERFJfVEVTVF9NSU5fRlJFUTsKCQllbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCX0KCWlmIChhcmdjPT0gMykKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJZW5kX2ZyZXE9RERSX1RFU1RfTUFYX0ZSRVE7CgoJfQoJaWYgKGFyZ2M9PSA0KQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlzdGFydF9mcmVxPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQllbmRfZnJlcT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCgl9CglpZiAoYXJnYz4gNCkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJZW5kX2ZyZXE9c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJdGVzdF9sb29wcz1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCX0KCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MHgwOwoJdW5zaWduZWQgaW50IGRkcl9wbGw9MDsKCXVuc2lnbmVkIGludCBkZHJfY2xrX29yZz0wOwoJdW5zaWduZWQgaW50IGRkcl9jbGtfaG9wZV90ZXN0PTA7CiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgoJLy8jZGVmaW5lIEFNX0REUl9QTExfQ05UTDAgICAgIAkgICAgICAgKCBNTUNfUkVHX0JBU0UgKyAoIDB4MAk8PCAyICkgKQoJZGRyX3BsbCA9IHJkX3JlZyhHMTJfQU1fRERSX1BMTF9DTlRMMCk7CiNlbHNlCglkZHJfcGxsID0gcmRfcmVnKEFNX0REUl9QTExfQ05UTCk7CiNlbmRpZgoJLy9kZHJfcGxsPWRkcl9wbGxfb3JnOwoJcHJpbnRmKCJcbmRkcl9wbGw9PSAlMDh4XG4iLCBkZHJfcGxsKTsKI2lmICAwIAojZWxzZQoJdW5zaWduZWQgaW50IGRkcl9jbGsgPSBwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCXByaW50ZigiXG5kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoJcHJpbnRmKCJcbnN0YXJ0X2ZyZXE9PSAlZE1IelxuIiwgc3RhcnRfZnJlcSk7CglwcmludGYoIlxuZW5kX2ZyZXE9PSAlZE1IelxuIiwgZW5kX2ZyZXEpOwoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CiNlbmRpZgoKCS8vCXsKCS8vCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJLy8JZGRyX3VkZWxheSgyMDAwKTsKCS8vfQoKCgl1bnNpZ25lZCBpbnQgZnJlcV90YWJsZV90ZXN0X3ZhbHVlWyhERFJfVEVTVF9NQVhfRlJFUSkvMTJdOyAvLyBzdGVwID0wIGluaXQgICwxIHRlc3QgZmFpbCwgLDIgdGVzdCBwYXNzLDMgdGVzdCBza2lwOwoJLy8gIGNoYXIgY2hhcl9mcmVxX25hbWVfdGFibGVbMzBdOwoJLy8gIGNvbnN0IGNoYXIgKnBfY2hhcl9mcmVxX3RhYmxlOwoKCWNvbnN0IGNoYXIgKnBfY2hhcl9kZHJfdGVzdF9zdGVwOwoJY29uc3QgY2hhciAqIHBfY2hhcl9mcmVxX29yZzsKCWNoYXIgY2hhcl9mcmVxX29yZ1szMF07CglpbnQgIGRkcl9mZXFfdGVzdF9zdGVwPTA7IC8vIHN0ZXAgPTAgaW5pdCAsMSBnb2luZyAsMiBkb25lOwoKCWNvbnN0IGNoYXIgKiBwX2NoYXJfZnJlcV9uYW1lX3RhYmxlOwoJY2hhciBjaGFyX2ZyZXFfbmFtZV90YWJsZVszMF07CgljaGFyIGNoYXJfY21kX3RhYmxlWzEwMF07CgljaGFyICogcF9jaGFyX3N0b3JlX2Jvb3Q7CgkvLyAgY2hhciBjaGFyX2ZyZXFfc3RvcmVfYm9vdFsyMDBdOwoKCS8vY29uc3QgY2hhciAqcF9mcmVxX3RhYmxlX2ludDsKCS8vY2hhciBjaGFyX2Rkcl9mZXFfdGVzdF9zdGVwW109ImRkcl9mZXFfdGVzdF9zdGVwIjsKCS8vIGNvbnN0IGNoYXIgKnZhcm5hbWU7CgkvLyBjb25zdCBjaGFyICp2YXJ2YWx1ZTsKCXVuc2lnbmVkIGludCB0ZW1wX2NvdW50PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudF9zdWI9MDsKCgoJLy8KCXBfY2hhcl9kZHJfdGVzdF9zdGVwPSBnZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIik7CglpZiAocF9jaGFyX2Rkcl90ZXN0X3N0ZXApCgl7CgkJcHJpbnRmKCIlcyIscF9jaGFyX2Rkcl90ZXN0X3N0ZXApOwoKCQlkZHJfZmVxX3Rlc3Rfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2Rkcl90ZXN0X3N0ZXAsICZlbmRwLCAwKTsKCQlwcmludGYoImRkcl9mZXFfdGVzdF9zdGVwPSVkXG4iLGRkcl9mZXFfdGVzdF9zdGVwKTsKCX0KCWlmIChkZHJfZmVxX3Rlc3Rfc3RlcCkgewoJCXBfY2hhcl9mcmVxX29yZz0gZ2V0ZW52KCJkZHJfZmVxX29yZyIpOwoJCWlmIChwX2NoYXJfZnJlcV9vcmcpCgkJewoJCQlwcmludGYoIiVzIixwX2NoYXJfZnJlcV9vcmcpOwoKCQkJZGRyX2Nsa19vcmcgPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfY2hhcl9mcmVxX29yZywgJmVuZHAsIDEwKTsgLy9tdXN0IHVzZSAxMCAsZnJlcSAgMDc5MiBtYXliZSBub3QgcmVhZCBzdXNzY2VmdWwgdXNlIDAgYXV0byByZWFkCgkJCXByaW50ZigiZGRyX2Nsa19vcmc9JWRcbiIsZGRyX2Nsa19vcmcpOwoJCX0KCX0KCWlmIChkZHJfZmVxX3Rlc3Rfc3RlcCA9PSAwKQoJewoJCWRkcl9mZXFfdGVzdF9zdGVwPTE7CgkJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCQlzcHJpbnRmKGNoYXJfZnJlcV9vcmcsIiUwNGQiLGRkcl9jbGspOwoJCXByaW50ZigiXG5kZHJfb3JnX2ZyZXE9JXNcbiIsY2hhcl9mcmVxX29yZyk7CgkJc2V0ZW52KCJkZHJfZmVxX29yZyIsIGNoYXJfZnJlcV9vcmcpOwoKCQl0ZW1wX2NvdW50PShERFJfVEVTVF9NSU5fRlJFUV9MSU1JVEVELzEyKTsKCQl3aGlsZSAodGVtcF9jb3VudDwoRERSX1RFU1RfTUFYX0ZSRVEvMTIpKSB7CgoJCQkvLyBzcHJpbnRmKGZyZXFfdGFibGUsIiVzJTA0ZCAlMDFkICUwMWQgICIsZnJlcV90YWJsZSwodGVtcF9jb3VudCoxMiksMCwwKTsKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwoJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQlzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIwIik7CgkJCXNldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJCQl0ZW1wX2NvdW50Kys7CgkJfQoJCXRlbXBfY291bnQ9KEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQvMTIpOwoJCXdoaWxlICh0ZW1wX2NvdW50PCgoc3RhcnRfZnJlcSkvMTIpKSB7CgoJCQkvLyBzcHJpbnRmKGZyZXFfdGFibGUsIiVzJTA0ZCAlMDFkICUwMWQgICIsZnJlcV90YWJsZSwodGVtcF9jb3VudCoxMiksMCwwKTsKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwoJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQlzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIzIik7CgkJCXNldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJCQl0ZW1wX2NvdW50Kys7CgkJfQoJCXdoaWxlICh0ZW1wX2NvdW50PigoZW5kX2ZyZXEpLzEyKSkgewoKCQkJLy8gc3ByaW50ZihmcmVxX3RhYmxlLCIlcyUwNGQgJTAxZCAlMDFkICAiLGZyZXFfdGFibGUsKHRlbXBfY291bnQqMTIpLDAsMCk7CgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJCQlzZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIiwgIjEiKTsKCQkJdGVtcF9jb3VudCsrOwoJCX0KCgkJcF9jaGFyX3N0b3JlX2Jvb3Q9IGdldGVudigic3RvcmVib290Iik7CgkJaWYgKHBfY2hhcl9zdG9yZV9ib290KQoJCQlwcmludGYoInN0b3JlYm9vdCAgICVzXG4iLHBfY2hhcl9zdG9yZV9ib290KTsKCQlzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxYyAgMHglMDh4ICVkICVkICVkOyVzOyIsZGRyX3Rlc3Rfc2l6ZSxzdGFydF9mcmVxLGVuZF9mcmVxLHRlc3RfbG9vcHMscF9jaGFyX3N0b3JlX2Jvb3QpOwoJCXNldGVudigic3RvcmVib290IiwgY2hhcl9jbWRfdGFibGUpOwoKCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJfQoKCWlmIChkZHJfZmVxX3Rlc3Rfc3RlcCA9PSAxKQoJewoKCQl0ZW1wX2NvdW50PShERFJfVEVTVF9NSU5fRlJFUV9MSU1JVEVELzEyKTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKEREUl9URVNUX01BWF9GUkVRKS8xMikpIHsKCgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCgkJCXBfY2hhcl9mcmVxX25hbWVfdGFibGU9IGdldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCWlmIChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKQoJCQl7CgkJCQlwcmludGYoIiVzXG4iLHBfY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSwgJmVuZHAsIDApOwoJCQkJcHJpbnRmKCIlcyB8ICVkXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCX0KCQkJdGVtcF9jb3VudCsrOwoJCX0KCgkJdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgkJCWRkcl9jbGtfaG9wZV90ZXN0PShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKTsKCQkJaWYgKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9PTEpCgkJCXsKCQkJCXRlbXBfY291bnRfc3ViPXRlbXBfY291bnQrMTsKCQkJCXdoaWxlICgocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnRfc3ViKjEyKSkpID09CgkJCQkJCShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSkKCQkJCXt0ZW1wX2NvdW50X3N1Yj10ZW1wX2NvdW50X3N1YisxOwoJCQkJfQoJCQkJd2hpbGUgKHRlbXBfY291bnRfc3ViPCgoRERSX1RFU1RfTUFYX0ZSRVEpLzEyKSkgewoJCQkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50X3N1YioxMikpKSk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJCQkvLyBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF9zdWJdID0xOwoJCQkJCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjMiKTsKCQkJCQl0ZW1wX2NvdW50X3N1YisrOwoJCQkJfQoJCQkJewoJCQkJCWRkcl9mZXFfdGVzdF9zdGVwKys7CgkJCQkJc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIyIik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCQkJCX0KCQkJCXtkZHJfY2xrX2hvcGVfdGVzdD1kZHJfY2xrX29yZzsKCQkJCX0KCQkJCXNwcmludGYoY2hhcl9jbWRfdGFibGUsImRkcl90ZXN0X2NtZCAweDE3ICVkIDAgMCAwIixkZHJfY2xrX2hvcGVfdGVzdCk7CgkJCQlwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwoJCQkJcnVuX2NvbW1hbmQoY2hhcl9jbWRfdGFibGUsMCk7CgoJCQl9CgkJCWlmIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPT0wKQoJCQl7CgkJCQlpZiAoKGRkcl9jbGtfaG9wZV90ZXN0KSAhPSAoZGRyX2NsaykpCgkJCQl7CgkJCQkJc3ByaW50ZihjaGFyX2NtZF90YWJsZSwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAiLGRkcl9jbGtfaG9wZV90ZXN0KTsKCQkJCQlwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwoJCQkJCXJ1bl9jb21tYW5kKGNoYXJfY21kX3RhYmxlLDApOwoJCQkJfQoJCQkJaWYgKChkZHJfY2xrX2hvcGVfdGVzdCkgPT0gKGRkcl9jbGspKQoJCQkJewoKCQkJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPTE7CgkJCQkJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMSIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCXdoaWxlICh0ZXN0X2xvb3BzLS0pIHsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl9CgkJCQkJLy90ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwoJCQkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9MTsKCQkJCQkJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMSIpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPTI7CgkJCQkJCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjIiKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCQkJCQlkZHJfY2xrX2hvcGVfdGVzdD0odGVtcF9jb3VudCoxMikrMTI7CgkJCQkJd2hpbGUgKChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsa19ob3BlX3Rlc3QpKSkgPT0KCQkJCQkJCShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSkKCQkJCQl7ZGRyX2Nsa19ob3BlX3Rlc3Q9ZGRyX2Nsa19ob3BlX3Rlc3QrMTI7CgkJCQkJfQoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfb3JnOwoJCQkJCX0KCQkJCQlzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCIsZGRyX2Nsa19ob3BlX3Rlc3QpOwoJCQkJCXByaW50ZigiXG5jaGFyX2NtZF90YWJsZT0lc1xuIixjaGFyX2NtZF90YWJsZSk7CgkJCQkJcnVuX2NvbW1hbmQoY2hhcl9jbWRfdGFibGUsMCk7CgkJCQl9CgoJCQl9CgkJCXRlbXBfY291bnQrKzsKCQl9CgkJZGRyX2ZlcV90ZXN0X3N0ZXArKzsKCQlzZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIiwgIjIiKTsKCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJfQoKCWlmIChkZHJfZmVxX3Rlc3Rfc3RlcCA+PSAyKQoJewoJCXByaW50ZigiXG5maW5pc2ggdGVzdCBkZHJfZmVxX3Rlc3Rfc3RlcD0lZFxuIixkZHJfZmVxX3Rlc3Rfc3RlcCk7CgkJdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCQlwX2NoYXJfZnJlcV9uYW1lX3RhYmxlPSBnZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQlpZiAocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSkKCQkJewoJCQkJcHJpbnRmKCIlc1xuIixwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCgkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfY2hhcl9mcmVxX25hbWVfdGFibGUsICZlbmRwLCAwKTsKCQkJCXByaW50ZigiJXMgfCAlZFxuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQl9CgkJCXRlbXBfY291bnQrKzsKCQl9CgoJCXByaW50ZigiXG5wcmludCB0ZXN0IGRkcl9mZXFfdGVzdF9yZXN1bHQhISFcbiIpOwoJCXRlbXBfY291bnQ9KEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQvMTIpOwoJCXdoaWxlICh0ZW1wX2NvdW50PCgoRERSX1RFU1RfTUFYX0ZSRVEpLzEyKSkgewoKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwoJCQlwX2NoYXJfZnJlcV9uYW1lX3RhYmxlPSBnZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQlpZiAocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSkKCQkJewoJCQkJLy8JcHJpbnRmKCIlc1xuIixwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCgkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfY2hhcl9mcmVxX25hbWVfdGFibGUsICZlbmRwLCAwKTsKCQkJCS8vcHJpbnRmKCIlZFxuIixmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJaWYgKCAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKSA9PSAwKSB7CgkJCQkJcHJpbnRmKCIlMDRkICBubyBpbml0ICAgICAlZCBcbiIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQl9CgkJCQlpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDEpIHsKCQkJCQlwcmludGYoIiUwNGQgIGZhaWwgICAgICAlZFxuIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSksZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCQkJCX0KCQkJCWlmICggKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSkgPT0gMikgewoJCQkJCXByaW50ZigiJTA0ZCAgcGFzcyAgICAgICVkXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJfQoJCQkJaWYgKCAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKSA+PSAzKSB7CgkJCQkJcHJpbnRmKCIlMDRkICBza2lwIHRlc3QgJWQgXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJfQoJCQkJdGVtcF9jb3VudCsrOwoJCQl9CgkJfQoKCX0KCS8vc3ByaW50ZihzdHIsImRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CgkvLwlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoKCgoJLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKCS8vICBzZXRlbnYoImVudl9kZHJ0ZXN0Iiwgc3RyKTsKCgoJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJLy8qLwoJcmV0dXJuIDE7Cgp9CmludCB1cGRhdGVfZGRyX3pxKHVuc2lnbmVkIGludCB6cTBwcikKewoJd3JfcmVnKCBERFIwX1BVQl9aUTBQUix6cTBwcik7Cgl3cl9yZWcoIEREUjBfUFVCX1pRQ1IsKHJkX3JlZyhERFIwX1BVQl9aUUNSKSl8KDE8PDIpfCgxPDwyNykpOwoJd3JfcmVnKCBERFIwX1BVQl9aUUNSLChyZF9yZWcoRERSMF9QVUJfWlFDUikpJih+KCgxPDwyKXwoMTw8MjcpKSkpOwoJcHJpbnRmKCJcbnVwZGF0ZSB6cSB6cTBwcj0weCUwOHgsenEwZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEwUFIpLHJkX3JlZyhERFIwX1BVQl9aUTBEUikpOwoJcmV0dXJuIHJkX3JlZyhERFIwX1BVQl9aUTBQUik7Cn0KCmludCBkb19kZHJfdGVzdF9kZHJfbWF4X2ZyZXEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVGVzdCBkZHIgbWF4IGZyZXF1ZW5jeSAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgYWRkX2ZyZXE9MTsKCXVuc2lnbmVkIGludCAgIHN1Yl9mcmVxPTE7Cgl1bnNpZ25lZCBpbnQgICBtYXhfZnJlcT03OTI7Cgl1bnNpZ25lZCBpbnQgICBtaW5fZnJlcT03OTI7Cgl1bnNpZ25lZCBpbnQgICBsb29wX21heF9mcmVxPTc5MjsKCXVuc2lnbmVkIGludCAgICBsb29wX21pbl9mcmVxPTc5MjsKCgl1bnNpZ25lZCBpbnQgZGRyX3BsbD0weDEwMjIxOwoJdW5zaWduZWQgaW50IGRkcl9jbGtfb3JnPTc5MjsKCXVuc2lnbmVkIGludCBkZHJfcGxsX29yZyA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpOwoJZGRyX3BsbD1kZHJfcGxsX29yZzsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0gcGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCWRkcl9jbGtfb3JnPWRkcl9jbGs7CglwcmludGYoIlxuZGRyX2Nsa19vcmc9PSAlZE1IelxuIiwgZGRyX2Nsa19vcmcpOwoKCXVuc2lnbmVkIGludCB6cTBwciA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CglwcmludGYoIlxuZGRyX3pxMHByPT0gMHglMDh4XG4iLCB6cTBwcik7CgoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgoJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CglkZHJfdWRlbGF5KDIwMDApOwoKCW1heF9mcmVxPWRkcl9jbGtfb3JnOwoJbWluX2ZyZXE9ZGRyX2Nsa19vcmc7CgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPT0gMSkKCXsKCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCXRlc3RfbG9vcD0xOwoJCWFkZF9mcmVxPTE7CgkJc3ViX2ZyZXE9MTsKCX0KCglpZiAoYXJnYyA9PSAyKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPTE7CgkJYWRkX2ZyZXE9MTsKCQlzdWJfZnJlcT0xOwoJfQoJaWYgKGFyZ2M9PSAzKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJYWRkX2ZyZXE9MTsKCQlzdWJfZnJlcT0xOwoJfQoJaWYgKGFyZ2MgPj0gNCkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWFkZF9mcmVxPTE7CgkJc3ViX2ZyZXE9MTsKCQlpZiAoKHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KSkgPT0gMSkKCQl7CgkJCWFkZF9mcmVxPTE7CgkJCXN1Yl9mcmVxPTA7CgkJfQoJCWVsc2UgaWYoKHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KSk9PTApCgkJewoJCQlhZGRfZnJlcT0wOwoJCQlzdWJfZnJlcT0xOwoJCX0KCX0KCgl1bnNpZ25lZCBpbnQgIAl0ZW1wX3Rlc3RfZXJyb3I9MDsKCXdoaWxlICh0ZXN0X3RpbWVzPCh0ZXN0X2xvb3ArMSkpCgl7CgkJcHJpbnRmKCJcbnRlc3RfdGltZXM9PSAlZCB0aW1lc1xuIiwgdGVzdF90aW1lcyk7CgoJCWlmIChhZGRfZnJlcSkKCQl7CgoJCQl3aGlsZSAoZGRyX2NsazwxNTAwKQoJCQl7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCWRkcl9jbGs9ZGRyX2NsaysxMjsKCQkJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCQkJewoKCQkJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDApOwoJCQkJCXByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgkJCQl9CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCW1heF9mcmVxPWRkcl9jbGstMTI7CgkJCQkJcHJpbnRmKCJcbm1heF9kZHJfY2xrPT0gJWRNSHpcbiIsIG1heF9mcmVxKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQlicmVhazsKCQkJCX0KCgkJCX0KCgkJCXdoaWxlIChkZHJfY2xrPmRkcl9jbGtfb3JnKQoJCQl7CgkJCQlkZHJfY2xrPWRkcl9jbGstMTI7CgkJCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQkJCXsKCgkJCQkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJCQkJZGRyX3VkZWxheSgyMDAwKTsKCQkJCX0KCQkJfQoJCQlwcmludGYoIlxuYmFjayB0byAgb3JnX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgoKCQl9CgoJCWlmIChzdWJfZnJlcSkKCQl7CgoJCQl3aGlsZSAoZGRyX2Nsaz4yNCkKCQkJewoJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQlkZHJfY2xrPWRkcl9jbGstMTI7CgkJCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQkJCXsKCgkJCQkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJCQkJZGRyX3VkZWxheSgyMDAwKTsKCQkJCQlwcmludGYoIlxudGVzdGluZ19kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoJCQkJfQoKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQltaW5fZnJlcT1kZHJfY2xrKzEyOwoJCQkJCXByaW50ZigiXG5taW5fZGRyX2Nsaz09ICVkTUh6XG4iLCBtaW5fZnJlcSk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQl9CgoJCQl3aGlsZSAoZGRyX2NsazxkZHJfY2xrX29yZykKCQkJewoJCQkJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJCQkJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgkJCQl7CgoJCQkJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMCk7CgkJCQl9CgkJCX0KCQkJcHJpbnRmKCJcbmJhY2sgdG8gIG9yZ19kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoKCgkJfQoKCQlpZiAodGVzdF90aW1lcyA9PSAxKQoJCXsKCgkJCWxvb3BfbWF4X2ZyZXE9bWF4X2ZyZXE7CgkJCWxvb3BfbWluX2ZyZXE9bWluX2ZyZXE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChsb29wX21heF9mcmVxPm1heF9mcmVxKQoJCQl7CgkJCQlsb29wX21heF9mcmVxPW1heF9mcmVxOwoJCQl9CgkJCWlmIChtaW5fZnJlcT5sb29wX21pbl9mcmVxKQoJCQl7CgkJCQlsb29wX21pbl9mcmVxPW1pbl9mcmVxOwoJCQl9CgkJfQoJCXRlc3RfdGltZXMrKzsKCgl9CgoJcHJpbnRmKCJcbmxvb3BfbWluX2ZyZXE9PSAlZE1IeixwbGw9PTB4JTA4eFxuIiwgbG9vcF9taW5fZnJlcSxkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGxvb3BfbWluX2ZyZXEpKTsKCXByaW50ZigiXG5sb29wX21heF9mcmVxPT0gJWRNSHoscGxsPT0weCUwOHhcbiIsIGxvb3BfbWF4X2ZyZXEsZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChsb29wX21heF9mcmVxKSk7CgoJcmV0dXJuIGxvb3BfbWF4X2ZyZXE7Cn0KCgppbnQgZG9fZGRyX3Rlc3RfZGRyX3pxKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIHpxICBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIGFkZF9mcmVxPTE7Cgl1bnNpZ25lZCBpbnQgICBzdWJfZnJlcT0xOwoJdW5zaWduZWQgaW50ICAgbWF4X2ZyZXE9NzkyOwoJdW5zaWduZWQgaW50ICAgbWluX2ZyZXE9NzkyOwoJdW5zaWduZWQgaW50ICAgbG9vcF9tYXhfZnJlcT03OTI7Cgl1bnNpZ25lZCBpbnQgICAgbG9vcF9taW5fZnJlcT03OTI7CgoJdW5zaWduZWQgaW50IGRkcl9wbGw9MHgxMDIyMTsKCXVuc2lnbmVkIGludCBkZHJfY2xrX29yZz03OTI7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbF9vcmcgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMKTsKCWRkcl9wbGw9ZGRyX3BsbF9vcmc7Cgl1bnNpZ25lZCBpbnQgZGRyX2NsayA9IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CglkZHJfY2xrX29yZz1kZHJfY2xrOwoJcHJpbnRmKCJcbmRkcl9jbGtfb3JnPT0gJWRNSHpcbiIsIGRkcl9jbGtfb3JnKTsKCgl1bnNpZ25lZCBpbnQgenEwcHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCS8vCXVuc2lnbmVkIGludCB6cTBwcl9iZXN0OwoJdW5zaWduZWQgaW50IHpxMHByPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJLy8JenEwcHJfYmVzdD16cTBwcl9vcmc7Cgl1bnNpZ25lZCBpbnQgenEwcHJfZHJ2X21heDsKCXVuc2lnbmVkIGludCB6cTBwcl9kcnZfbWluOwoJdW5zaWduZWQgaW50IHpxMHByX29kdF9tYXg7Cgl1bnNpZ25lZCBpbnQgenEwcHJfb2R0X21pbjsKCXVuc2lnbmVkIGludCB6cTBwcl9kcnZfZmxhZz0xOwoJdW5zaWduZWQgaW50IHpxMHByX29kdF9mbGFnPTE7CgoKCXByaW50ZigiXG56cTBwcl9vcmc9PSAweCUwOHhcbiIsIHpxMHByX29yZyk7CgoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgoKCXsKCgkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJZGRyX3VkZWxheSgyMDAwKTsKCX0KCgoKCgoKCW1heF9mcmVxPWRkcl9jbGtfb3JnOwoJbWluX2ZyZXE9ZGRyX2Nsa19vcmc7CgoKCgoKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgoKCWlmIChhcmdjID09IDEpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl0ZXN0X2xvb3A9MTsKCQlhZGRfZnJlcT0xOwoJCXN1Yl9mcmVxPTE7Cgl9CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0xOwoJCWFkZF9mcmVxPTE7CgkJc3ViX2ZyZXE9MTsKCX0KCWlmIChhcmdjPT0gMykKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWFkZF9mcmVxPTE7CgkJc3ViX2ZyZXE9MTsKCX0KCWlmIChhcmdjID49IDQpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X2xvb3A9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlhZGRfZnJlcT0xOwoJCXN1Yl9mcmVxPTE7CgkJaWYgKChzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNikpID09IDEpCgkJewoJCQlhZGRfZnJlcT0xOwoJCQlzdWJfZnJlcT0wOwoJCX0KCQllbHNlIGlmKChzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNikpPT0wKQoJCXsKCQkJYWRkX2ZyZXE9MDsKCQkJc3ViX2ZyZXE9MTsKCQl9Cgl9CgoJaWYgKGFyZ2M+NCkKCXsKCQlpZiAoKHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KSkgPT0gMSkKCQl7CgkJCXpxMHByX2Rydl9mbGFnPTA7CgkJCXpxMHByX29kdF9mbGFnPTE7CgkJfQoJCWVsc2UgaWYoKHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KSk9PTApCgkJewoJCQl6cTBwcl9kcnZfZmxhZz0xOwoJCQl6cTBwcl9vZHRfZmxhZz0wOwoJCX0KCgl9CgoKCXVuc2lnbmVkIGludCAgCXRlbXBfdGVzdF9lcnJvcj0wOwoKCgl0ZXN0X3RpbWVzPTE7Cgl0ZW1wX3Rlc3RfZXJyb3I9MDsKCXdoaWxlICh0ZXN0X3RpbWVzPCh0ZXN0X2xvb3ArMSkpCgl7CgkJcHJpbnRmKCJcbnRlc3RfdGltZXM9PSAlZCB0aW1lc1xuIiwgdGVzdF90aW1lcyk7CgoJCWlmIChhZGRfZnJlcSkKCQl7CgoJCQl3aGlsZSAoZGRyX2NsazwxNTAwKQoJCQl7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCWRkcl9jbGs9ZGRyX2NsaysxMjsKCQkJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCQkJewoKCQkJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDApOwoJCQkJCXByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgkJCQl9CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCW1heF9mcmVxPWRkcl9jbGstMTI7CgkJCQkJcHJpbnRmKCJcbm1heF9kZHJfY2xrPT0gJWRNSHpcbiIsIG1heF9mcmVxKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQlicmVhazsKCQkJCX0KCgkJCX0KCgkJCXdoaWxlIChkZHJfY2xrPmRkcl9jbGtfb3JnKQoJCQl7CgkJCQlkZHJfY2xrPWRkcl9jbGstMTI7CgkJCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQkJCXsKCgkJCQkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJCQkJZGRyX3VkZWxheSgyMDAwKTsKCQkJCX0KCQkJfQoJCQlwcmludGYoIlxuYmFjayB0byAgb3JnX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgoKCQl9CgoJCWlmIChzdWJfZnJlcSkKCQl7CgoJCQl3aGlsZSAoZGRyX2Nsaz4yNCkKCQkJewoJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQlkZHJfY2xrPWRkcl9jbGstMTI7CgkJCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQkJCXsKCgkJCQkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJCQkJZGRyX3VkZWxheSgyMDAwKTsKCQkJCQlwcmludGYoIlxudGVzdGluZ19kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoJCQkJfQoKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQltaW5fZnJlcT1kZHJfY2xrKzEyOwoJCQkJCXByaW50ZigiXG5taW5fZGRyX2Nsaz09ICVkTUh6XG4iLCBtaW5fZnJlcSk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQl9CgoJCQl3aGlsZSAoZGRyX2NsazxkZHJfY2xrX29yZykKCQkJewoJCQkJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJCQkJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgkJCQl7CgoJCQkJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMCk7CgkJCQl9CgkJCX0KCQkJcHJpbnRmKCJcbmJhY2sgdG8gIG9yZ19kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoKCgkJfQoKCQlpZiAodGVzdF90aW1lcyA9PSAxKQoJCXsKCgkJCWxvb3BfbWF4X2ZyZXE9bWF4X2ZyZXE7CgkJCWxvb3BfbWluX2ZyZXE9bWluX2ZyZXE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmIChsb29wX21heF9mcmVxPm1heF9mcmVxKQoJCQl7CgkJCQlsb29wX21heF9mcmVxPW1heF9mcmVxOwoJCQl9CgkJCWlmIChtaW5fZnJlcT5sb29wX21pbl9mcmVxKQoJCQl7CgkJCQlsb29wX21pbl9mcmVxPW1pbl9mcmVxOwoJCQl9CgkJfQoJCXRlc3RfdGltZXMrKzsKCgl9CgoJcHJpbnRmKCJcbmxvb3BfbWluX2ZyZXE9PSAlZE1IeixwbGw9PTB4JTA4eFxuIiwgbG9vcF9taW5fZnJlcSxkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGxvb3BfbWluX2ZyZXEpKTsKCXByaW50ZigiXG5sb29wX21heF9mcmVxPT0gJWRNSHoscGxsPT0weCUwOHhcbiIsIGxvb3BfbWF4X2ZyZXEsZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChsb29wX21heF9mcmVxKSk7CgoKCXdoaWxlIChkZHJfY2xrCgkJCTxsb29wX21heF9mcmVxKQoJewoJCWRkcl9jbGs9ZGRyX2NsaysxMjsKCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQl7CgoJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJZGRyX3VkZWxheSgyMDAwKTsKCQl9Cgl9CglwcmludGYoIlxuc2V0IHRvICBsb29wX21heF9mcmVxPT0gJWRNSHpcbiIsIGxvb3BfbWF4X2ZyZXEpOwoKCXVwZGF0ZV9kZHJfenEoenEwcHIpOwoKCXpxMHByX2Rydl9tYXg9KHpxMHByJjB4Zik7Cgl6cTBwcl9kcnZfbWluPSh6cTBwciYweGYpOwoJenEwcHJfb2R0X21heD0oenEwcHImMHhmMCk7Cgl6cTBwcl9vZHRfbWluPSh6cTBwciYweGYwKTsKCglpZiAoenEwcHJfZHJ2X2ZsYWcpCgl7CgkJd2hpbGUgKCh6cTBwciYweGYpPDB4ZikKCQl7CgkJCXpxMHByKys7CgkJCXVwZGF0ZV9kZHJfenEoenEwcHIpOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJenEwcHItLTsKCQkJCXVwZGF0ZV9kZHJfenEoenEwcHIpOwoJCQkJYnJlYWs7CgoKCQkJfQoJCX0KCQl6cTBwcl9kcnZfbWF4PSh6cTBwciYweGYpOwoJCXByaW50ZigiXG56cTBwcl9kcnZfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9kcnZfbWF4KTsKCgkJdXBkYXRlX2Rkcl96cSh6cTBwcl9vcmcpOwoKCQl3aGlsZSAoKHpxMHByJjB4Zik+MHgwKQoJCXsKCQkJenEwcHItLTsKCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQl6cTBwcisrOwoJCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCQlicmVhazsKCgoJCQl9CgkJfQoKCgkJenEwcHJfZHJ2X21pbj0oenEwcHImMHhmKTsKCQlwcmludGYoIlxuenEwcHJfZHJ2X21heD09IDB4JTA4eFxuIiwgenEwcHJfZHJ2X21pbik7Cgl9CgoJaWYgKHpxMHByX29kdF9mbGFnKQoJewoJCXdoaWxlICgoenEwcHImMHhmMCk8MHhmMCkKCQl7CgkJCXpxMHByPXpxMHByKzB4MTA7CgkJCXVwZGF0ZV9kZHJfenEoenEwcHIpOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJenEwcHI9enEwcHItMHgxMDsKCQkJCXVwZGF0ZV9kZHJfenEoenEwcHIpOwoJCQkJYnJlYWs7CgoKCQkJfQoJCX0KCQl6cTBwcl9vZHRfbWF4PSh6cTBwciYweGYwKTsKCQlwcmludGYoIlxuenEwcHJfb2R0X21heD09IDB4JTA4eFxuIiwgenEwcHJfb2R0X21heCk7CgoJCXVwZGF0ZV9kZHJfenEoenEwcHJfb3JnKTsKCgoJCXdoaWxlICgoenEwcHImMHhmMCk+MHgwKQoJCXsKCQkJenEwcHI9enEwcHItMHgxMDsKCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQl6cTBwcj16cTBwcisweDEwOwoJCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCQlicmVhazsKCgoJCQl9CgkJfQoJCXpxMHByX29kdF9taW49KHpxMHByJjB4ZjApOwoJCXByaW50ZigiXG56cTBwcl9vZHRfbWluPT0gMHglMDh4XG4iLCB6cTBwcl9vZHRfbWluKTsKCX0KCXVwZGF0ZV9kZHJfenEoenEwcHJfb3JnKTsKCglwcmludGYoIlxuenEwcHJfZHJ2X21heD09IDB4JTA4eFxuIiwgenEwcHJfZHJ2X21heCk7CglwcmludGYoIlxuenEwcHJfZHJ2X21pbj09IDB4JTA4eFxuIiwgenEwcHJfZHJ2X21pbik7CglwcmludGYoIlxuenEwcHJfb2R0X21heD09IDB4JTA4eFxuIiwgenEwcHJfb2R0X21heCk7CglwcmludGYoIlxuenEwcHJfb2R0X21pbj09IDB4JTA4eFxuIiwgenEwcHJfb2R0X21pbik7CgoJcmV0dXJuIGxvb3BfbWF4X2ZyZXE7CgoKCn0KCmludCBjbGVhcl9kZHJfYmFuZF9tb25pdG9yKHVuc2lnbmVkIGludCBwb3J0LHVuc2lnbmVkIGludCBwb3J0X2lkLHVuc2lnbmVkIGludCB0aW1lcl9jb3VudGVyKQp7Cgl3cl9yZWcoRE1DX01PTl9DVFJMMywgdGltZXJfY291bnRlcik7Cgl3cl9yZWcoRE1DX01PTl9DVFJMMiwgKHBvcnRfaWQ8PDApfChwb3J0PDwxNil8KDA8PDIwKXwoMTw8MzApKTsKCWRkcl91ZGVsYXkoMSk7CglpZiAoKChyZF9yZWcoRE1DX01PTl9DVFJMMikpPj4zMCkgPT0gMSkKCQlyZXR1cm4gMTsKCWVsc2UKCQlyZXR1cm4gMDsKCgp9CmludCBvcGVuX2Rkcl9iYW5kX21vbml0b3IodW5zaWduZWQgaW50IHBvcnQsdW5zaWduZWQgaW50IHBvcnRfaWQsdW5zaWduZWQgaW50IHRpbWVyX2NvdW50ZXIpCnsKCXdyX3JlZyhETUNfTU9OX0NUUkwzLCB0aW1lcl9jb3VudGVyKTsKCXdyX3JlZyhETUNfTU9OX0NUUkwyLCAoKHJkX3JlZyhETUNfTU9OX0NUUkwyKSkmKDE8PDMwKSl8KHBvcnRfaWQ8PDApfChwb3J0PDwxNil8KDA8PDIwKXwoMTw8MzEpKTsKCglyZXR1cm4gMTsKfQoKaW50IGZpbmlzaF9kZHJfYmFuZF9tb25pdG9yKHVuc2lnbmVkIGludCBwb3J0LHVuc2lnbmVkIGludCBwb3J0X2lkLHVuc2lnbmVkIGludCB0aW1lcl9jb3VudGVyKQp7CgkvL3dyX3JlZyhETUNfTU9OX0NUUkwzLCB0aW1lcl90aW1lKTsKCWlmICgoKHJkX3JlZyhETUNfTU9OX0NUUkwyKSk+PjMxKSA9PSAwKQoJewoJCXByaW50ZigiXG5kZHIgYmFuZHdpZHRoIHRpbWVyIGZpbmlzaCBjb3VudCBhbmQgcHJpbnQgcmVzdWx0XG4iKTsKCQlwcmludGYoIlxuRE1DX01PTl9wb3J0CT09IDB4JTA4eCBwb3J0X2lkPT0weCUwOHggdGltZXJfdGltZT09MHglMDh4Iixwb3J0LHBvcnRfaWQsdGltZXJfY291bnRlcik7CgkJcHJpbnRmKCJcbkRNQ19NT05fQUxMX1JFUV9DTlQJPT0gMHglMDh4IiwocmRfcmVnKERNQ19NT05fQUxMX1JFUV9DTlQpKSk7CgoJCXByaW50ZigiXG5ETUNfTU9OX0FMTF9HUkFOVF9DTlQJPT0gMHglMDh4IiwocmRfcmVnKERNQ19NT05fQUxMX0dSQU5UX0NOVCkpKTsKCQlwcmludGYoIlxuRE1DX01PTl9BTExfR1JBTlRfQ05UX2JhbmQJPT0gMHglMDh4IGtieXRlLGRlYz09ICVkIE1ieXRlIiwoKHJkX3JlZyhETUNfTU9OX0FMTF9HUkFOVF9DTlQpKSooOCkpLzEwMjQsKChyZF9yZWcoRE1DX01PTl9BTExfR1JBTlRfQ05UKSkqKDgpKS8oMTAyNCoxMDI0KSk7CgkJcHJpbnRmKCJcbkRNQ19NT05fT05FIF9HUkFOVF9DTlQgZm9yIHNlbGVjdGVkIHBvcnQgYW5kIHN1Ymlkcwk9PSAweCUwOHgiLChyZF9yZWcoRE1DX01PTl9PTkVfR1JBTlRfQ05UKSkpOwoJCXByaW50ZigiXG5ETUNfTU9OX09ORSBfR1JBTlRfQ05UX2JhbmQgZm9yIHNlbGVjdGVkIHBvcnQgYW5kIHN1Ymlkcwk9PSAweCUwOHgsZGVjPT0gJWRNYnl0ZSIsKChyZF9yZWcoRE1DX01PTl9PTkVfR1JBTlRfQ05UKSkqKDgpKS8xMDI0LCgocmRfcmVnKERNQ19NT05fT05FX0dSQU5UX0NOVCkpKig4KSkvKDEwMjQqMTAyNCkpOwoJfQoJLy93cl9yZWcoRE1DX01PTl9DVFJMMiwgKChyZF9yZWcoRE1DX01PTl9DVFJMMikpJigxPDwzMCkpfChwb3J0X2lkPDwwKXwocG9ydDw8MTYpfCgwPDwyMCl8KDE8PDMxKSk7CgoJcmV0dXJuIDE7Cn0KCgoKaW50IGRvX2Rkcl90ZXN0X2JhbmR3aWR0aChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkciBiYW5kd2lkdGggIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50IHRpbWVyX3RpbWVfbXM9MTAwMDsKCgoJdW5zaWduZWQgaW50IGRkcl9wbGw9MHgxMDIyMTsKCXVuc2lnbmVkIGludCBkZHJfY2xrX29yZz03OTI7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbF9vcmcgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMKSYofigxPDwyOSkpOwoJZGRyX3BsbD1kZHJfcGxsX29yZzsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0gcGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCWRkcl9jbGtfb3JnPWRkcl9jbGs7CglwcmludGYoIlxuZGRyX2Nsa19vcmc9PSAlZE1IelxuIiwgZGRyX2Nsa19vcmcpOwoKCXVuc2lnbmVkIGludCB6cTBwciA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CglwcmludGYoIlxuZGRyX3pxMHByPT0gMHglMDh4XG4iLCB6cTBwcik7CgoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCXVuc2lnbmVkIGludCB0ZXN0X3BvcnQ9MDsKCXVuc2lnbmVkIGludCB0ZXN0X3BvcnRfc3ViX2lkPTE7CgoKCWlmIChhcmdjID09IDEpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl0ZXN0X2xvb3A9MTsKCgl9CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0xOwoKCX0KCWlmIChhcmdjPT0gMykKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoKCX0KCWlmIChhcmdjID49IDQpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X2xvb3A9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X3BvcnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCgoJfQoJaWYgKGFyZ2MgPj0gNSkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCXRlc3RfcG9ydD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCXRlc3RfcG9ydF9zdWJfaWQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCgl9CglpZiAoYXJnYyA+NSkKCXsKCgkJdGltZXJfdGltZV9tcz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoKCX0KCgkvL3Vuc2lnbmVkIGludCAgCXRlbXBfdGVzdF9lcnJvcj0wOwoJdW5zaWduZWQgaW50IHRpbWVyX2NvdW50ZXI9MDsKCXRpbWVyX2NvdW50ZXI9KHRpbWVyX3RpbWVfbXMqMTAwMCpkZHJfY2xrLzIpOwoJLy93aGlsZSh0ZXN0X3RpbWVzPCh0ZXN0X2xvb3ArMSkpCgl7CgkJewoJCQljbGVhcl9kZHJfYmFuZF9tb25pdG9yKCB0ZXN0X3BvcnQsIHRlc3RfcG9ydF9zdWJfaWQsIHRpbWVyX2NvdW50ZXIpOwoJCQlvcGVuX2Rkcl9iYW5kX21vbml0b3IoIHRlc3RfcG9ydCwgdGVzdF9wb3J0X3N1Yl9pZCwgdGltZXJfY291bnRlcik7CgkJCXdoaWxlICh0ZXN0X3RpbWVzPCh0ZXN0X2xvb3ArMSkpCgkJCXsKCQkJCXByaW50ZigiXG50ZXN0X3RpbWVzPT0gJWQgdGltZXNcbiIsIHRlc3RfdGltZXMpOwoJCQkJZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl0ZXN0X3RpbWVzKys7CgkJCX0KCQkJZmluaXNoX2Rkcl9iYW5kX21vbml0b3IoIHRlc3RfcG9ydCwgdGVzdF9wb3J0X3N1Yl9pZCwgdGltZXJfY291bnRlcik7CgkJCXByaW50ZigiXG50aW1lcl90aW1lX21zPT0gJWQgbXNcbiIsIHRpbWVyX3RpbWVfbXMpOwoKCQkJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgoJCX0KCX0KCglyZXR1cm4gMTsKfQoKaW50IGRvX2Rkcl9maW5lX3R1bmVfbGNkbHJfZW52KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIGRkcl9maW5lX3R1bmVfbGNkbHJfZW52ICBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CgojZGVmaW5lIFdSX1JEX0FESl9VU0VfRU5WICAxCiNkZWZpbmUgV1JfUkRfQURKX1VTRV9VQVJUX0lOUFVUIDIKCXVuc2lnbmVkIGludCAgIHdyX3JkX2Fkal9pbnB1dF9zcmM9MTsKCglpbnQgd3JfYWRqX3BlclsxMl09ewoJCTEwMAksCgkJMTAwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCgl9OwoJaW50IHJkX2Fkal9wZXJbMTJdPXsKCQkxMDAJLAoJCTEwMAksCgkJODAJLAoJCTgwCSwKCQk4MAksCgkJODAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJfTsKCWlmIChhcmdjID09IDEpCgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCWlmIChhcmdjID49IDIpCgl7CgkJd3JfcmRfYWRqX2lucHV0X3NyYyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDEwKTsKCgkJdW5zaWduZWQgaW50IGk9MDsKCQlpZiAod3JfcmRfYWRqX2lucHV0X3NyYyA9PSBXUl9SRF9BREpfVVNFX1VBUlRfSU5QVVQpCgkJewoJCQlwcmludGYoIlxudHVuZSBkZHIgbGNkbHIgdXNlIHVhcnQgaW5wdXRcbiIpOwoJCQlpZiAoYXJnYz4yNCsyKQoJCQl7YXJnYz0yNCsyO30KCQkJewoKCQkJCWZvciAoaSA9IDI7aTxhcmdjO2krKykKCQkJCXsKCQkJCQlpZiAoaTwoMisxMikpIHsKCQkJCQkJd3JfYWRqX3BlcltpLTJdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDEwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJcmRfYWRqX3BlcltpLTE0XT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxMCk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCX0KCQlpZiAod3JfcmRfYWRqX2lucHV0X3NyYyA9PSBXUl9SRF9BREpfVVNFX0VOVikKCQl7cHJpbnRmKCJcbnR1bmUgZGRyIGxjZGxyIHVzZSB1Ym9vdCBlbnZcbiIpOwoJCQl7CgkJCQkvL2NoYXIgc3RyWzI0XTsKCQkJCWNvbnN0IGNoYXIgKnM7CgoJCQkJLy8gY2hhciAqdmFybmFtZTsKCQkJCWludCB2YWx1ZT0wOwoKCQkJCS8vKnZhcm5hbWU9ImVudl9kZHJ0ZXN0IjsKCQkJCXMgPSBnZXRlbnYoImVudl93cl9sY2Rscl9wciIpOwoJCQkJaWYgKHMpCgkJCQl7Ly9pPTA7CgkJCQkJLy93aGlsZShzX3RlbXApCgkJCQkJewoJCQkJCQlwcmludGYoIiVzIixzKTsKCQkJCQkJLy9zc2NhbmYocywiZCUsIix3cl9hZGpfcGVyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZCUiLHMpOwoJCQkJCQkvL2dldGMKCgkJCQkJfQoJCQkJCXZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2RkcihzLCAmZW5kcCwgMTYpOwoJCQkJCXByaW50ZigiJWQiLHZhbHVlKTsKCQkJCX0KCQkJCXMgPSBnZXRlbnYoImVudl9yZF9sY2Rscl9wciIpOwoKCQkJCWlmIChzKQoJCQkJey8vaT0wOwoJCQkJCS8vd2hpbGUoc190ZW1wKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCIlcyIscyk7CgkJCQkJCS8vc3NjYW5mKHMsImQlLCIscmRfYWRqX3Blcik7CgoJCQkJCX0KCQkJCQkvL3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2RkcihzLCAmZW5kcCwgMTYpOwoJCQkJfQoKCQkJCS8vc3ByaW50ZihzdHIsICIlbHgiLCB2YWx1ZSk7CgkJCQkvLyAgc2V0ZW52KCJlbnZfZGRydGVzdCIsIHN0cik7CgoKCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQl9CgoJCQlpZiAoYXJnYz4yNCsyKQoJCQkJYXJnYz0yNCsyOwoJCQlmb3IgKGkgPSAyO2k8YXJnYztpKyspCgkJCXsKCQkJCWlmIChpPCgyKzEyKSkgewoJCQkJCXdyX2Fkal9wZXJbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxNik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcmRfYWRqX3BlcltpLTE0XT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxNik7CgkJCQl9CgkJCX0KCgoJCX0KCQlwcmludGYoIiBpbnQgd3JfYWRqX3BlclsxMl09e1xuIik7CgkJZm9yIChpID0gMDtpPDEyO2krKykKCQl7CgkJCXByaW50ZigiJTA0ZCAsXG4iLHdyX2Fkal9wZXJbaV0pOwoJCX0KCQlwcmludGYoIn07XG4iKTsKCQlwcmludGYoIiBpbnQgcmRfYWRqX3BlclsxMl09e1xuIik7CgkJZm9yIChpID0gMDtpPDEyO2krKykKCQl7CgkJCXByaW50ZigiJTA0ZCAsXG4iLHJkX2Fkal9wZXJbaV0pOwoJCX0KCQlwcmludGYoIn07XG4iKTsKCgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQkJd3JfcmVnKEREUjBfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjBfUFVCX1BHQ1I2KSl8KDE8PDApKTsKCQkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQkJd3JfcmVnKEREUjFfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjFfUFVCX1BHQ1I2KSl8KDE8PDApKTsKI2Vsc2UKCQkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQkJd3JfcmVnKEREUjBfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjBfUFVCX1BHQ1IxKSl8KDE8PDI2KSk7CgkJCXdyX3JlZyhERFIxX1BVQl9QSVIsIChyZF9yZWcoRERSMV9QVUJfUElSKSl8KDE8PDI5KSk7CgkJCXdyX3JlZyhERFIxX1BVQl9QR0NSMSwgKHJkX3JlZyhERFIxX1BVQl9QR0NSMSkpfCgxPDwyNikpOwojZW5kaWYKCgkJCWludCBsY2Rscl93PTAsbGNkbHJfcj0wOwoJCQl1bnNpZ25lZCB0ZW1wX3JlZz0wOwoJCQlpbnQgdGVtcF9jb3VudD0wOwoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwyO3RlbXBfY291bnQrKykKCQkJeyAgICAgdGVtcF9yZWc9KHVuc2lnbmVkKShERFIwX1BVQl9BQ0xDRExSKyh0ZW1wX2NvdW50PDwyKSk7CgkJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZBQ0xDRExSX01BWCk7CgkJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCWlmICh0ZW1wX2NvdW50ID09IDEpCgkJCQkJbGNkbHJfdz1sY2Rscl93JkFDQkRMUl9NQVg7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKGxjZGxyX3cpJkFDTENETFJfTUFYKSk7CgkJCX0KI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJCWZvciAoIHRlbXBfY291bnQ9Mjt0ZW1wX2NvdW50PDY7dGVtcF9jb3VudCsrKQoJCQl7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjBfUFVCX0RYMExDRExSMSsoRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkqKHRlbXBfY291bnQtMikpOwoJCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmRFFMQ0RMUl9NQVgpOwoJCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJCWxjZGxyX3I9KGludCkoKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZytERFIwX1BVQl9EWDBMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIxKSkpKSZEUUxDRExSX01BWCk7CgkJCQlsY2Rscl9yPWxjZGxyX3I/bGNkbHJfcjoxOwoJCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCWxjZGxyX3I9KGxjZGxyX3IqKHJkX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwobGNkbHJfdykpOwoJCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjEpKSwobGNkbHJfcikpOwoJCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjEpKSwobGNkbHJfcikpOwoJCQl9CiNlbHNlCgkJCWZvciAoIHRlbXBfY291bnQ9Mjt0ZW1wX2NvdW50PDY7dGVtcF9jb3VudCsrKQoJCQl7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjBfUFVCX0RYMExDRExSMSsoRERSMF9QVUJfRFgxTENETFIxLUREUjBfUFVCX0RYMExDRExSMSkqKHRlbXBfY291bnQtMikpOwoJCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmRFFMQ0RMUl9NQVgpOwoJCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJCWxjZGxyX3I9KGludCkoKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKT4+OCkmRFFMQ0RMUl9NQVgpOwoJCQkJbGNkbHJfcj1sY2Rscl9yP2xjZGxyX3I6MTsKCQkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCQlsY2Rscl9yPShsY2Rscl9yKihyZF9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKCgobGNkbHJfcjw8MTYpfChsY2Rscl9yPDw4KXwobGNkbHJfdykpKSk7CgkJCX0KI2VuZGlmCgkJCWZvciAoIHRlbXBfY291bnQ9Njt0ZW1wX2NvdW50PDg7dGVtcF9jb3VudCsrKQoJCQl7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjFfUFVCX0FDTENETFIrKCh0ZW1wX2NvdW50LTYpPDwyKSk7CgoJCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmQUNMQ0RMUl9NQVgpOwoJCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCQlpZiAodGVtcF9jb3VudCA9PSA3KQoJCQkJCWxjZGxyX3c9bGNkbHJfdyZBQ0JETFJfTUFYOwoJCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKChsY2Rscl93KSZBQ0xDRExSX01BWCkpOwoJCQl9CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJCQlmb3IgKCB0ZW1wX2NvdW50PTg7dGVtcF9jb3VudDwxMjt0ZW1wX2NvdW50KyspCgkJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfRFgwTENETFIxKyhERFIxX1BVQl9EWDFMQ0RMUjEtRERSMV9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CgkJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnK0REUjFfUFVCX0RYMExDRExSMy1ERFIxX1BVQl9EWDBMQ0RMUjEpKSkpJkRRTENETFJfTUFYKTsKCQkJCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CgkJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLChsY2Rscl93KSk7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFIzLUREUjFfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFI0LUREUjFfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJCX0KI2Vsc2UKCQkJZm9yICggdGVtcF9jb3VudD04O3RlbXBfY291bnQ8MTI7dGVtcF9jb3VudCsrKQoJCQl7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjFfUFVCX0RYMExDRExSMSsoRERSMV9QVUJfRFgxTENETFIxLUREUjFfUFVCX0RYMExDRExSMSkqKHRlbXBfY291bnQtOCkpOwoJCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmMHhmZik7CgkJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpPj44KSYweGZmKTsKCQkJCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CgkJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgoKGxjZGxyX3I8PDE2KXwobGNkbHJfcjw8OCl8KGxjZGxyX3cpKSkpOwoJCQl9CiNlbmRpZgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgoKCQkJd3JfcmVnKEREUjBfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjBfUFVCX1BHQ1I2KSkmKH4oMTw8MCkpKTsKCQkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKCgkJCXdyX3JlZyhERFIxX1BVQl9QR0NSNiwgKHJkX3JlZyhERFIxX1BVQl9QR0NSNikpJih+KDE8PDApKSk7CgkJCXdyX3JlZyhERFIxX1BVQl9QSVIsIChyZF9yZWcoRERSMV9QVUJfUElSKSkmKH4oMTw8MjkpKSk7CgoKI2Vsc2UKCQkJd3JfcmVnKEREUjBfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjBfUFVCX1BHQ1IxKSkmKH4oMTw8MjYpKSk7CgkJCXdyX3JlZyhERFIwX1BVQl9QSVIsIChyZF9yZWcoRERSMF9QVUJfUElSKSkmKH4oMTw8MjkpKSk7CgoJCQl3cl9yZWcoRERSMV9QVUJfUEdDUjEsIChyZF9yZWcoRERSMV9QVUJfUEdDUjEpKSYofigxPDwyNikpKTsKCQkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKI2VuZGlmCgkJCXByaW50ZigiXG5lbmQgYWRqdXN0IGxjZGxyXG4iKTsKCgkJCUNMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkJCUNMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Cgl9CgoKCglyZXR1cm4gMTsKCn0KLy8qLwppbnQgZG9fZGRyX21vZGlmeV9yZWdfdXNlX21hc2soY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgZGRyX21vZGlmeV9yZWdfdXNlX21hc2sgIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CgoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgd3JfcmVnX3ZhbHVlPTA7Cgl1bnNpZ25lZCBpbnQgICByZF9yZWdfdmFsdWU9MDsKCXVuc2lnbmVkIGludCAgIHdyX3JlZ19hbmRfbWFza18xPTB4ZmZmZmZmZmY7CgkvLyB1bnNpZ25lZCBpbnQgICB3cl9yZWdfb3JfbWFza18yPTB4MDsKCgoKCQlpZiAoYXJnYyA9PSAxKQoJCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCQkJcHJpbnRmKCJcbmV4YW1wbGUgb25seSBjaGFuZ2UgMHhjODgzNjgwMCAweDhjMDEwMjI2IDB4MDAwZmZmZmYgYml0MjAtYml0MzEsbm8gY2hhbmdlIHBsbCBvZCBvYyBcbiIpOwoJCQlwcmludGYoIlxuZGRyX3Rlc3RfY21kIDkgMHhjODgzNjgwMCAweDhjMDEwMjI2IDB4MDAwZmZmZmZcbiIpOwoJCX0KCQllbHNlIHsKCQkJaWYgKGFyZ2MgPj0gMikKCQkJewoJCQkJcmVnX2FkZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDEwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PSAzKQoJCQl7CgkJCQl3cl9yZWdfdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj0gNCkKCQkJewoJCQkJd3JfcmVnX2FuZF9tYXNrXzEgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxMCk7CgoJCQl9CgkJCXJkX3JlZ192YWx1ZT0gKHJkX3JlZyhyZWdfYWRkKSk7CgkJCXdyX3JlZyhyZWdfYWRkLChyZF9yZWdfdmFsdWUmd3JfcmVnX2FuZF9tYXNrXzEpfCh3cl9yZWdfdmFsdWUmKH53cl9yZWdfYW5kX21hc2tfMSkpICk7CgkJCS8vcmRfcmVnX3ZhbHVlPSAocmRfcmVnKHJlZ19hZGQpKTsKCQkJLy93cl9yZWcocmVnX2FkZCwocmRfcmVnX3ZhbHVlJih+d3JfcmVnX29yX21hc2tfMikpfCh3cl9yZWdfdmFsdWUmKHdyX3JlZ19vcl9tYXNrXzIpKSApOwoKCQkJcHJpbnRmKCJcbm1vZGlmeSBvayByZWFkPT0weCUwOHhcbiIsKHJkX3JlZyhyZWdfYWRkKSkpOwoKCgkJCUNMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkJCUNMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJfQoKCXJldHVybiAxOwoKfQppbnQgZG9fZGRyX3NldF96cShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBzZXQgZGRyIHpxICBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoKCXVuc2lnbmVkIGludCB6cTBwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJdW5zaWduZWQgaW50IHpxMXByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTFQUik7Cgl1bnNpZ25lZCBpbnQgenEycHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMlBSKTsKCS8vCXVuc2lnbmVkIGludCB6cTBwcl9iZXN0OwoJdW5zaWduZWQgaW50IHpxMHByMD0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCXVuc2lnbmVkIGludCB6cTFwcjA9IHJkX3JlZyhERFIwX1BVQl9aUTFQUik7Cgl1bnNpZ25lZCBpbnQgenEycHIwPSByZF9yZWcoRERSMF9QVUJfWlEyUFIpOwoKCWlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgkJcHJpbnRmKCJcbmV4YW1wbGUgb25seSBjaGFuZ2UgenEgXG4iKTsKCQlwcmludGYoIlxuZGRyX3Rlc3RfY21kIDEwIDB4MTlcbiIpOwoJfQoJZWxzZXsKCQlpZiAoYXJnYyA+PSAyKQoJCXsKCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJenEwcHIwPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDMpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl6cTFwcjA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCX0KCgkJaWYgKGFyZ2MgPj0gNCkKCQl7CgkJCS8vIHpxMnByMCA9YXJndlszXTsKCQkJenEycHIwPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCgkJfX0KCglwcmludGYoIlxuenEwcHJfb3JnPT0gMHglMDh4XG4iLCB6cTBwcl9vcmcpOwoJcHJpbnRmKCJcbnpxMXByX29yZz09IDB4JTA4eFxuIiwgenExcHJfb3JnKTsKCXByaW50ZigiXG56cTJwcl9vcmc9PSAweCUwOHhcbiIsIHpxMnByX29yZyk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRQ1IsKHJkX3JlZyhERFIwX1BVQl9aUUNSKSl8KDE8PDIpfCgxPDwyNykpOwoJcHJpbnRmKCJcbm9yZyBjaGFubmVsIDAgenEgenEwcHI9MHglMDh4LHpxMGRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMFBSKSxyZF9yZWcoRERSMF9QVUJfWlEwRFIpKTsKCXByaW50ZigiXG5vcmcgY2hhbm5lbCAwIHpxIHpxMXByPTB4JTA4eCx6cTFkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTFQUikscmRfcmVnKEREUjBfUFVCX1pRMURSKSk7CglwcmludGYoIlxub3JnIGNoYW5uZWwgMCB6cSB6cTJwcj0weCUwOHgsenEyZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEyUFIpLHJkX3JlZyhERFIwX1BVQl9aUTJEUikpOwoKCXdyX3JlZyggRERSMF9QVUJfWlEwUFIsenEwcHIwKTsKCXdyX3JlZyggRERSMF9QVUJfWlExUFIsenExcHIwKTsKCXdyX3JlZyggRERSMF9QVUJfWlEyUFIsenEycHIwKTsKCXdyX3JlZyggRERSMF9QVUJfWlFDUiwocmRfcmVnKEREUjBfUFVCX1pRQ1IpKXwoMTw8Mil8KDE8PDI3KSk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRQ1IsKHJkX3JlZyhERFIwX1BVQl9aUUNSKSkmKH4oKDE8PDIpfCgxPDwyNykpKSk7CglwcmludGYoIlxudXBkYXRlIGNoYW5uZWwgMCB6cSB6cTBwcj0weCUwOHgsenEwZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEwUFIpLHJkX3JlZyhERFIwX1BVQl9aUTBEUikpOwoJcHJpbnRmKCJcbnVwZGF0ZSBjaGFubmVsIDAgenEgenExcHI9MHglMDh4LHpxMWRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMVBSKSxyZF9yZWcoRERSMF9QVUJfWlExRFIpKTsKCXByaW50ZigiXG51cGRhdGUgY2hhbm5lbCAwIHpxIHpxMnByPTB4JTA4eCx6cTJkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTJQUikscmRfcmVnKEREUjBfUFVCX1pRMkRSKSk7CgoJd3JfcmVnKCBERFIwX1BVQl9aUTBQUix6cTBwcjApOwoJd3JfcmVnKCBERFIwX1BVQl9aUTFQUix6cTFwcjApOwoJd3JfcmVnKCBERFIwX1BVQl9aUTJQUix6cTJwcjApOwoJcHJpbnRmKCJcbnVwZGF0ZSBjaGFubmVsIDAgenEgenEwcHI9MHglMDh4LHpxMGRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMFBSKSxyZF9yZWcoRERSMF9QVUJfWlEwRFIpKTsKCXByaW50ZigiXG51cGRhdGUgY2hhbm5lbCAwIHpxIHpxMXByPTB4JTA4eCx6cTFkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTFQUikscmRfcmVnKEREUjBfUFVCX1pRMURSKSk7CglwcmludGYoIlxudXBkYXRlIGNoYW5uZWwgMCB6cSB6cTJwcj0weCUwOHgsenEyZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEyUFIpLHJkX3JlZyhERFIwX1BVQl9aUTJEUikpOwoKCS8vd3JfcmVnKCBERFIxX1BVQl9aUUNSLChyZF9yZWcoRERSMV9QVUJfWlFDUikpfCgxPDwyKXwoMTw8MjcpKTsKCS8vd3JfcmVnKCBERFIxX1BVQl9aUUNSLChyZF9yZWcoRERSMV9QVUJfWlFDUikpJih+KCgxPDwyKXwoMTw8MjcpKSkpOwoJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCUNMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CglyZXR1cm4gMTsKCn0KCgppbnQgZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlWzMxXVsyXSA9IHsKCXsgMHgxYzAwMDAsICA4NjB9LAoJeyAweDFiMDAwMSwgIDg3MH0sCgl7IDB4MWEwMDAyLCAgODgwfSwKCXsgMHgxOTAwMDMsICA4OTB9LAoJeyAweDE4MDAwNCwgIDkwMH0sCgl7IDB4MTcwMDA1LCAgOTEwfSwKCXsgMHgxNjAwMDYsICA5MjB9LAoJeyAweDE1MDAwNywgIDkzMH0sCgl7IDB4MTQwMDA4LCAgOTQwfSwKCXsgMHgxMzAwMDksICA5NTB9LAoJeyAweDEyMDAwYSwgIDk2MH0sCgl7IDB4MTEwMDBiLCAgOTcwfSwKCXsgMHgxMDAwMGMsICA5ODB9LAoJeyAweDBmMDAwZCwgIDk5MH0sCgl7IDB4MGUwMDBlLCAxMDAwfSwKCXsgMHgwZDAwMGYsIDEwMTB9LAoJeyAweDBjMDAxMCwgMTAyMH0sCgl7IDB4MGIwMDExLCAxMDMwfSwKCXsgMHgwYTAwMTIsIDEwNDB9LAoJeyAweDA5MDAxMywgMTA1MH0sCgl7IDB4MDgwMDE0LCAxMDYwfSwKCXsgMHgwNzAwMTUsIDEwNzB9LAoJeyAweDA2MDAxNiwgMTA4MH0sCgl7IDB4MDUwMDE3LCAxMDkwfSwKCXsgMHgwNDAwMTgsIDExMDB9LAoJeyAweDAzMDAxOSwgMTExMH0sCgl7IDB4MDIwMDFhLCAxMTIwfSwKCXsgMHgwMTAwMWIsIDExMzB9LAoJeyAweDAwMDAxYywgMTE0MH0KfTsKCgp2b2lkIGRkcl90ZXN0X3B3bV9zZXRfdm9sdGFnZSh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCB2b2x0YWdlKQp7CglpbnQgdG87CgojZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQoKCWVudW0gcHdtX2lkIHsKCQlwd21fYSA9IDAsCgkJcHdtX2IsCgkJcHdtX2MsCgkJcHdtX2QsCgkJcHdtX2UsCgkJcHdtX2YsCgl9OwoKCS8vcHJpbnRmKCJ0ZXN0IGRkciBpbml0IHB3bSAgaWQgJTA4ZCBcbiIsaWQpOwoKCXVuc2lnbmVkICByZWc7CgkvKgoJICogVE9ETzogc3VwcG9ydCBtb3JlIHB3bSBjb250cm9sbGVycywgcmlnaHQgbm93IG9ubHkgc3VwcG9ydAoJICogUFdNX0IsIFBXTV9ECgkgKi8KCXN3aXRjaCAoaWQpIHsKCQljYXNlIHB3bV9iOgoJCQlyZWcgPSogKFBfUFdNX01JU0NfUkVHX0FCKTsKCQkJcmVnICY9IH4oMHg3ZiA8PCAxNik7CgkJCXJlZyB8PSAgKCgxIDw8IDIzKSB8ICgxIDw8IDEpKTsKCQkJKihQX1BXTV9NSVNDX1JFR19BQikgPSByZWc7CgkJCS8qCgkJCSAqIGRlZmF1bHQgc2V0IHRvIG1heCB2b2x0YWdlCgkJCSAqLwoJCQkqKFBfUFdNX1BXTV9CKSA9IGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVtBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxXVswXTsKCQkJcmVnICA9ICooUF9QSU5fTVVYX1JFRzEpOwoJCQlyZWcgJj0gfigxIDw8IDEwKTsKCQkJKihQX1BJTl9NVVhfUkVHMSkgPSByZWc7CgoJCQlyZWcgID0gKihQX1BJTl9NVVhfUkVHMik7CgkJCXJlZyAmPSB+KDEgPDwgNSk7CgkJCXJlZyB8PSAgKDEgPDwgMTEpOwkJLy8gZW5hYmxlIFBXTV9CCgkJCSooUF9QSU5fTVVYX1JFRzIpID0gcmVnOwoJCQlicmVhazsKCgkJY2FzZSBwd21fZDoKCQkJcmVnID0qKCBQX1BXTV9NSVNDX1JFR19DRCk7CgkJCXJlZyAmPSB+KDB4N2YgPDwgMTYpOwoJCQlyZWcgfD0gICgoMSA8PCAyMykgfCAoMSA8PCAxKSk7CgkJCSooUF9QV01fTUlTQ19SRUdfQ0QpID0gcmVnOwoJCQkvKgoJCQkgKiBkZWZhdWx0IHNldCB0byBtYXggdm9sdGFnZQoJCQkgKi8KCQkJKihQX1BXTV9QV01fRCApPSBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpIC0gMV1bMF07CgkJCXJlZyAgPSooIFBfUElOX01VWF9SRUcxKTsKCQkJcmVnICY9IH4oMSA8PCA5KTsKCQkJcmVnICY9IH4oMSA8PCAxMSk7CgkJCSooUF9QSU5fTVVYX1JFRzEpID0gcmVnOwoKCQkJcmVnICA9ICooUF9QSU5fTVVYX1JFRzIpOwoJCQlyZWcgfD0gICgxIDw8IDEyKTsJCS8vIGVuYWJsZSBQV01fRAoJCQkqKFBfUElOX01VWF9SRUcyICk9IHJlZzsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7Cgl9CgoJZGRyX3VkZWxheSgyMDApOwoKCS8vcHJpbnRmKCJ0ZXN0IGRkciBzZXQgdmRkZWUgdG8gICUwOGQgbXZcbiIsdm9sdGFnZSk7CgoJZm9yICh0byA9IDA7IHRvIDwgQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpOyB0bysrKSB7CgkJaWYgKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVt0b11bMV0gPj0gdm9sdGFnZSkgewoJCQlicmVhazsKCQl9Cgl9CglpZiAodG8gPj0gQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpKSB7CgkJdG8gPSBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxOwoJfQoJc3dpdGNoIChpZCkgewoJCWNhc2UgcHdtX2I6CgkJCSooUF9QV01fUFdNX0IpID0gZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVswXTsKCQkJYnJlYWs7CgoJCWNhc2UgcHdtX2Q6CgkJCSooUF9QV01fUFdNX0QpID0gZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVswXTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7Cgl9CglkZHJfdWRlbGF5KDIwMCk7Cn0KCmludCBkb19kZHJfdGVzdF9wd21fY21kIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBkb19kZHJfdGVzdF9wd21fY21kIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgoJY2hhciAqZW5kcDsKCgoJdW5zaWduZWQgaW50IGlkPTA7CgkvLyAgdW5zaWduZWQgaW50IHZvbHRhZ2U9MTAwMDsKCXVuc2lnbmVkIGludCBwd21fbG93PTB4MWY7Cgl1bnNpZ25lZCBpbnQgcHdtX2hpZ2g9MDsKCgoJewoKCgoJCWlmIChhcmdjID09IDEpCgkJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCQl9CgkJZWxzZXsKCQkJaWYgKGFyZ2MgPj0gMikKCQkJewoJCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQlpZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJCQkvL3ZvbHRhZ2U9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCQl9CgoJCQlpZiAoYXJnYyA+PSAzKQoJCQl7CgoJCQkJcHdtX2xvdz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj0gNCkKCQkJewoKCQkJCXB3bV9oaWdoPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQkJfQoJCQlwd21fbG93PShwd21fbG93PjB4MWYpPygweDFmKToocHdtX2xvdyk7CgkJCXB3bV9oaWdoPShwd21faGlnaD4weDFmKT8oMHgxZik6KHB3bV9oaWdoKTsKCgkJCXByaW50ZigiXG5wd21fbG93PT0gMHglMDhkIDAtMWZcbiIsIHB3bV9sb3cpOwoJCQlwcmludGYoIlxucHdtX2hpZ2g9PSAweCUwOGQgIDAtMWZcbiIsIHB3bV9oaWdoKTsKCQkJcHJpbnRmKCJcbnB3bV9pZD09IDB4JTA4ZFxuIiwgaWQpOwoJCQlwcmludGYoIlxucHdtX2lkIDA9PSBwd21fYVxuIik7CgkJCXByaW50ZigiXG5wd21faWQgMT09IHB3bV9iXG4iKTsKCQkJcHJpbnRmKCJcbnB3bV9pZCAyPT0gcHdtX2NcbiIpOwoJCQlwcmludGYoIlxucHdtX2lkIDM9PSBwd21fZFxuIik7CgkJCXByaW50ZigiXG5wd21faWQgND09IHB3bV9lXG4iKTsKCQkJcHJpbnRmKCJcbnB3bV9pZCA1PT0gcHdtX2ZcbiIpOwoJCQkvL2Rkcl90ZXN0X3B3bV9zZXRfdm9sdGFnZShpZCx2b2x0YWdlKTsKCgkJCXsKCgoKCiNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCgoKCgoKCgkJCQllbnVtIHB3bV9pZCB7CgkJCQkJcHdtX2EgPSAwLAoJCQkJCXB3bV9iLAoJCQkJCXB3bV9jLAoJCQkJCXB3bV9kLAoJCQkJCXB3bV9lLAoJCQkJCXB3bV9mLAoJCQkJfTsKCgoJCQkJLy9wcmludGYoInRlc3QgZGRyIGluaXQgcHdtICBpZCAlMDhkIFxuIixpZCk7CgoJCQkJdW5zaWduZWQgaW50IHJlZzsKCgkJCQkvKgoJCQkJICogVE9ETzogc3VwcG9ydCBtb3JlIHB3bSBjb250cm9sbGVycywgcmlnaHQgbm93IG9ubHkgc3VwcG9ydAoJCQkJICogUFdNX0IsIFBXTV9ECgkJCQkgKi8KCgkJCQlzd2l0Y2ggKGlkKSB7CgkJCQkJY2FzZSBwd21fYjoKCQkJCQkJcmVnID0gKihQX1BXTV9NSVNDX1JFR19BQik7CgkJCQkJCXJlZyAmPSB+KDB4N2YgPDwgMTYpOwoJCQkJCQlyZWcgfD0gICgoMSA8PCAyMykgfCAoMSA8PCAxKSk7CgkJCQkJCSooUF9QV01fTUlTQ19SRUdfQUIpID0gcmVnOwoJCQkJCQkvKgoJCQkJCQkgKiBkZWZhdWx0IHNldCB0byBtYXggdm9sdGFnZQoJCQkJCQkgKi8KCQkJCQkJKihQX1BXTV9QV01fQikgPTB4MDAwMDFmOy8vcHdtX2xvd3wocHdtX2hpZ2g8PDE2KTsvLyBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpIC0gMV1bMF07CgkJCQkJCXJlZyAgPSAqKFBfUElOX01VWF9SRUcxKTsKCQkJCQkJcmVnICY9IH4oMSA8PCAxMCk7CgkJCQkJCSooUF9QSU5fTVVYX1JFRzEpID0gcmVnOwoKCQkJCQkJcmVnICA9ICooUF9QSU5fTVVYX1JFRzIpOwoJCQkJCQlyZWcgJj0gfigxIDw8IDUpOwoJCQkJCQlyZWcgfD0gICgxIDw8IDExKTsJCS8vIGVuYWJsZSBQV01fQgoJCQkJCQkqKFBfUElOX01VWF9SRUcyICk9IHJlZzsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgcHdtX2Q6CgkJCQkJCXJlZyA9ICooUF9QV01fTUlTQ19SRUdfQ0QpOwoJCQkJCQlyZWcgJj0gfigweDdmIDw8IDE2KTsKCQkJCQkJcmVnIHw9ICAoKDEgPDwgMjMpIHwgKDEgPDwgMSkpOwoJCQkJCQkqKFBfUFdNX01JU0NfUkVHX0NEKSA9IHJlZzsKCQkJCQkJLyoKCQkJCQkJICogZGVmYXVsdCBzZXQgdG8gbWF4IHZvbHRhZ2UKCQkJCQkJICovCgkJCQkJCSooUF9QV01fUFdNX0QgKT0gMHgwMDAwMWY7Ly9wd21fbG93fChwd21faGlnaDw8MTYpOy8vZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW0FSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSAtIDFdWzBdOwoJCQkJCQlyZWcgID0qKCBQX1BJTl9NVVhfUkVHMSk7CgkJCQkJCXJlZyAmPSB+KDEgPDwgOSk7CgkJCQkJCXJlZyAmPSB+KDEgPDwgMTEpOwoJCQkJCQkqKFBfUElOX01VWF9SRUcxKSA9IHJlZzsKCgkJCQkJCXJlZyAgPSAqKFBfUElOX01VWF9SRUcyKTsKCQkJCQkJcmVnIHw9ICAoMSA8PCAxMik7CQkvLyBlbmFibGUgUFdNX0QKCQkJCQkJKihQX1BJTl9NVVhfUkVHMikgPSByZWc7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWRkcl91ZGVsYXkoMjAwKTsKCgkJCQkvL3ByaW50ZigidGVzdCBkZHIgc2V0IHZkZGVlIHRvICAlMDhkIG12XG4iLHZvbHRhZ2UpOwoKCQkJCS8vZm9yICh0byA9IDA7IHRvIDwgQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpOyB0bysrKSB7CgkJCQkvLwlpZiAoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVsxXSA+PSB2b2x0YWdlKSB7CgkJCQkvLwkJYnJlYWs7CgkJCQkvLwl9CgkJCQkvL30KCQkJCS8vaWYgKHRvID49IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSkgewoJCQkJLy8JdG8gPSBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxOwoJCQkJLy99CgoJCQkJc3dpdGNoIChpZCkgewoJCQkJCWNhc2UgcHdtX2I6CgkJCQkJCSooUF9QV01fUFdNX0IpID0gcHdtX2xvd3wocHdtX2hpZ2g8PDE2KTsvL2Rkcl9lZV9wd21fdm9sdGFnZV90YWJsZVt0b11bMF07CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIHB3bV9kOgoJCQkJCQkqKFBfUFdNX1BXTV9EKSA9IHB3bV9sb3d8KHB3bV9oaWdoPDwxNik7Ly9kZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzBdOwoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQlicmVhazsKCQkJCX0KCQkJCWRkcl91ZGVsYXkoMjAwKTsKCQkJfQoKCQkJdW5zaWduZWQgaW50ICAgZGRsXzEwMHN0ZXBfcHM9IDA7CgkJCWRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpOwoJCQlwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSwKCQkJCQkoKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpKTsKCgkJCUNMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkJCUNMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgoKCQl9CgoJfQoJcmV0dXJuIDE7Cgp9CmludCBkb19kZHJfdGVzdF9wd21fZGRsIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBkb19kZHJfdGVzdF9wd21fZGRsIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoKCXVuc2lnbmVkIGludCBpZD0wOwoJdW5zaWduZWQgaW50IHZvbHRhZ2U9MTAwMDsKCXVuc2lnbmVkIGludCBsb29wPTA7CglpbnQgdG87CgoJaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCgl9CgllbHNlewoJCWlmIChhcmdjID49IDIpCgkJewoJCQkvLyB6cTBwcjAgPSBhcmd2WzFdOwoJCQl2b2x0YWdlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDMpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQlpZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoJCWlmIChhcmdjID49IDQpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQlsb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQl9CgoJCXByaW50ZigiXG52b2x0YWdlPT0gJTA4ZFxuIiwgdm9sdGFnZSk7CgkJcHJpbnRmKCJcbnB3bV9pZD09ICUwOGRcbiIsIGlkKTsKCQlwcmludGYoIlxucHdtX2lkIDA9PSBwd21fYVxuIik7CgkJcHJpbnRmKCJcbnB3bV9pZCAxPT0gcHdtX2JcbiIpOwoJCXByaW50ZigiXG5wd21faWQgMj09IHB3bV9jXG4iKTsKCQlwcmludGYoIlxucHdtX2lkIDM9PSBwd21fZFxuIik7CgkJcHJpbnRmKCJcbnB3bV9pZCA0PT0gcHdtX2VcbiIpOwoJCXByaW50ZigiXG5wd21faWQgNT09IHB3bV9mXG4iKTsKCQlkZHJfdGVzdF9wd21fc2V0X3ZvbHRhZ2UoaWQsdm9sdGFnZSk7CgkJdW5zaWduZWQgaW50ICAgZGRsXzEwMHN0ZXBfcHM9IDA7CgkJZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZik7CgkJcHJpbnRmKCJcbnZvbHRhZ2UgPT0lMDhkLGRkbF8xMDBzdGVwX3BzPT0gJTA4ZCwwXzVjeWNsZV9wcz09ICUwOGQsMF81Y3ljbGU9PTB4JTA4eFxuIix2b2x0YWdlLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSwKCQkJCSgoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZikpOwoKCQlpZiAobG9vcCkKCQl7CgoJCQlmb3IgKHRvID0gMDsgdG8gPCBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSk7IHRvKyspIHsKCgkJCQlkZHJfdGVzdF9wd21fc2V0X3ZvbHRhZ2UoaWQsKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVt0b11bMV0pKTsKCQkJCWRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpOwoJCQkJcHJpbnRmKCJcbnZvbHRhZ2UgPT0lMDhkLGRkbF8xMDBzdGVwX3BzPT0gJTA4ZCwwXzVjeWNsZV9wcz09ICUwOGQsMF81Y3ljbGU9PTB4JTA4eFxuIiwKCQkJCQkJKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVt0b11bMV0pLGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLAoJCQkJCQkoKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpKT4+MTYpJjB4ZmYpKTsKCQkJfQoJCX0KCgoJCUNMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkJQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCgoJfQoKCXJldHVybiAxOwoKfQoKaW50IGRvX2Rkcl90ZXN0X3NoaWZ0X2Rkcl9jbGsoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBzaGlmdCBkZHIgY2xrIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJaW50IHRlc3RfYXBwX3ByYVs0XSA9IHswLDAsMCwwfTsKCgljaGFyICplbmRwOwoKCglpZiAoYXJnYyA9PSAxKQoJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCX0KCWVsc2V7CgkJaWYgKGFyZ2MgPj0gMikKCQl7CgkJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJCXRlc3RfYXBwX3ByYVswXT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJfQoKCQlpZiAoYXJnYyA+PSAzKQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9hcHBfcHJhWzFdPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDQpCgkJewoJCQkvLyB6cTJwcjAgPWFyZ3ZbM107CgkJCXRlc3RfYXBwX3ByYVsyXT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgoJCX0KCX0KCgoJLy9zaGlmdCBkZHIgZnJlcXVlbmN5IHRlc3QKCXByaW50ZigidGVzdF9hcHBfcHJhWzBdPT0weCUwOHhcbiIsdGVzdF9hcHBfcHJhWzBdICk7CglwcmludGYoInRlc3RfYXBwX3ByYVsxXT09MHglMDh4XG4iLHRlc3RfYXBwX3ByYVsxXSApOwoJcHJpbnRmKCJ0ZXN0X2FwcF9wcmFbMl09PTB4JTA4eFxuIix0ZXN0X2FwcF9wcmFbMl0gKTsKCXVuc2lnbmVkIGludCByZWdfdmFsdWVbNF0gPSB7MH07Cgl1bnNpZ25lZCBpbnQgZGVsYXlfbXNfdGltZT0zMDsKCXVuc2lnbmVkIGludCB0ZXN0X3RpbWVzPTB4ZmZmZjsKCXVuc2lnbmVkIGludCB0ZXN0X2NvdW50PTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sb29wX2ZsYWc9MDsKCXJlZ192YWx1ZVswXT0weGM0YWFlODYwIDsKCXdyX3JlZyggMHhjODgzNjAxYywocmVnX3ZhbHVlWzBdKSk7CgkvL3VwZGF0ZV9yZWdfZGVidWdfdmFsdWUoJihyZWdfdmFsdWVbMF0pLDB4Yzg4MzYwMWMgKTsKCXJlZ192YWx1ZVsxXT0weDAwMGVhMjAzICA7Cgl3cl9yZWcoIDB4Yzg4MzcwMDQsKHJlZ192YWx1ZVsxXSkpOwoJLy91cGRhdGVfcmVnX2RlYnVnX3ZhbHVlKCYocmVnX3ZhbHVlWzFdKSwweGM4ODM3MDA0ICApOwoKCXJlZ192YWx1ZVszXT0weDAzZTNiNzQwICA7CglpZiAoKHRlc3RfYXBwX3ByYVsxXSkpCgl7ZGVsYXlfbXNfdGltZT0odGVzdF9hcHBfcHJhWzFdKTsKCX0KCWlmICgodGVzdF9hcHBfcHJhWzJdKSkKCXt0ZXN0X3RpbWVzPSh0ZXN0X2FwcF9wcmFbMl0pOwoJCWlmICh0ZXN0X3RpbWVzID09IDB4ZmZmZmZmZmYpCgkJCXRlc3RfbG9vcF9mbGFnPTE7Cgl9CglwcmludGYoImRlbGF5X21zX3RpbWU9PSVkXG4iLGRlbGF5X21zX3RpbWUgKTsKCXByaW50ZigidGVzdF90aW1lcz09JWRcbiIsdGVzdF90aW1lcyApOwoJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTApCgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NTAgIDsKCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT0xKQoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU0ICA7CglpZiAodGVzdF9hcHBfcHJhWzBdID09MikKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1OCAgOwoJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTMpCgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NWMgIDsKCglpZiAodGVzdF9hcHBfcHJhWzBdID09NCkKCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzU0ICA7Cgl9CglpZiAodGVzdF9hcHBfcHJhWzBdID09NSkKCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzU4ICA7Cgl9CglpZiAodGVzdF9hcHBfcHJhWzBdID09NikKCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzVjICA7Cgl9CglpZiAodGVzdF9hcHBfcHJhWzBdID09NykKCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1NCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzU4ICA7Cgl9CglpZiAodGVzdF9hcHBfcHJhWzBdID09OCkKCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1NCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzVjICA7Cgl9CglpZiAodGVzdF9hcHBfcHJhWzBdID09OSkKCXsKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1OCAgOwoJCXJlZ192YWx1ZVszXT0weDAzZTNiNzVjICA7Cgl9Cgl3aGlsZSAoMSkge3Rlc3RfY291bnQrKzsKCQkvLwlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJCS8vdXBkYXRlX3JlZ19kZWJ1Z192YWx1ZSgmKHJlZ192YWx1ZVsyXSksMHhjODgzNzAwYyAgKTsKCgkJd3JfcmVnKCAweGM4ODM3MDEwLCgweDAwMWMwMTAxKSk7CgkJZGRyX3VkZWxheShkZWxheV9tc190aW1lICogMTAwMCk7CgkJd3JfcmVnKCAweGM4ODM3MDBjLChyZWdfdmFsdWVbMl0pKTsKCQlwcmludGYoIlxudXBkYXRlICByZWcgMHhjODgzNzAwYz0weCUwOHhcbiIscmRfcmVnKDB4Yzg4MzcwMGMpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQl3cl9yZWcoIDB4Yzg4MzcwMTAsKDB4MDAwYzAxMDEpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQl3cl9yZWcoIDB4Yzg4MzcwMTAsKDB4MDAxYzAxMDEpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQkvL3VzbGVlcCgxMDAwICogMTAwMCk7CgkJLy9yZWdfdmFsdWVbM109MHgwM2UzYjc0MCAgOwoJCS8vdXBkYXRlX3JlZ19kZWJ1Z192YWx1ZSgmKHJlZ192YWx1ZVszXSksMHhjODgzNzAwYyAgICk7CgkJd3JfcmVnKCAweGM4ODM3MDBjLChyZWdfdmFsdWVbM10pKTsKCQlwcmludGYoIlxudXBkYXRlICByZWcgMHhjODgzNzAwYz0weCUwOHhcbiIscmRfcmVnKDB4Yzg4MzcwMGMpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQl3cl9yZWcoIDB4Yzg4MzcwMTAsKDB4MDAwYzAxMDEpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQlwcmludGYoIlxudGVzdGluZyAlZCB0aW1lc1xuIiwodGVzdF9jb3VudCkpOwoJCWlmICghdGVzdF9sb29wX2ZsYWcpCgkJewoJCQlpZiAodGVzdF9jb3VudCA9PSB0ZXN0X3RpbWVzKQoJCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiAxOwoKfQoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKI2Vsc2UKaW50IGRvX2Rkcl90ZXN0X3NoaWZ0X2Rkcl9jbGtfdHhsKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIHRlc3Qgc2hpZnQgZGRyIGNsayBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCWludCB0ZXN0X2FwcF9wcmFbNF0gPSB7MCwwLDAsMH07CgoJY2hhciAqZW5kcDsKCWlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJfQoJZWxzZXsKCQlpZiAoYXJnYyA+PSAyKQoJCXsKCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJdGVzdF9hcHBfcHJhWzBdPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDMpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl0ZXN0X2FwcF9wcmFbMV09IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCX0KCgkJaWYgKGFyZ2MgPj0gNCkKCQl7CgkJCS8vIHpxMnByMCA9YXJndlszXTsKCQkJdGVzdF9hcHBfcHJhWzJdPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCgkJfX0KCWlmIChhcmdjID49IDUpCgl7CgkJLy8genEycHIwID1hcmd2WzNdOwoJCXRlc3RfYXBwX3ByYVszXT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgoJfQoKCgoKCgkvL3NoaWZ0IGRkciBmcmVxdWVuY3kgdGVzdAoJcHJpbnRmKCJ0ZXN0X2FwcF9wcmFbMF09PTB4JTA4eFxuIix0ZXN0X2FwcF9wcmFbMF0gKTsKCXByaW50ZigidGVzdF9hcHBfcHJhWzFdPT0weCUwOHhcbiIsdGVzdF9hcHBfcHJhWzFdICk7CglwcmludGYoInRlc3RfYXBwX3ByYVsyXT09MHglMDh4XG4iLHRlc3RfYXBwX3ByYVsyXSApOwoJcHJpbnRmKCJ0ZXN0X2FwcF9wcmFbM109PTB4JTA4eFxuIix0ZXN0X2FwcF9wcmFbM10gKTsKCS8vICAgdW5zaWduZWQgaW50IHJlZ192YWx1ZVs0XSA9IHswfTsKCXVuc2lnbmVkIGludCBkZWxheV9tc190aW1lPTMwOwoJdW5zaWduZWQgaW50IHRlc3RfdGltZXM9MHhmZmZmOwoJdW5zaWduZWQgaW50IHRlc3RfY291bnQ9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xvb3BfZmxhZz0wOwoJLy9yZWdfdmFsdWVbMF09MCA7CgkvLwlyZWdfdmFsdWVbMV09MHgwMDBlYTIwMiAgOwoJLy93cl9yZWcoIDB4Yzg4MzcwMDQsKHJlZ192YWx1ZVsxXSkpOwoJLy91cGRhdGVfcmVnX2RlYnVnX3ZhbHVlKCYocmVnX3ZhbHVlWzFdKSwweGM4ODM3MDA0ICApOwoKCglpZiAoKHRlc3RfYXBwX3ByYVsxXSkpCgl7ZGVsYXlfbXNfdGltZT0odGVzdF9hcHBfcHJhWzFdKTsKCX0KCWlmICgodGVzdF9hcHBfcHJhWzJdKSkKCXt0ZXN0X3RpbWVzPSh0ZXN0X2FwcF9wcmFbMl0pOwoJCWlmICh0ZXN0X3RpbWVzID09IDB4ZmZmZmZmZmYpCgkJCXRlc3RfbG9vcF9mbGFnPTE7Cgl9CglkZWxheV9tc190aW1lPTA7CglwcmludGYoImRlbGF5X21zX3RpbWU9PSVkXG4iLGRlbGF5X21zX3RpbWUgKTsKCXByaW50ZigidGVzdF90aW1lcz09JWRcbiIsdGVzdF90aW1lcyApOwoKCgkvLwkgIHByaW50ZigiXG50ZXN0aW5nIHJlZ192YWx1ZVsyXSA9PSUwOHg7IFxuIiwocmVnX3ZhbHVlWzIpKTsKCgoJd2hpbGUgKDEpIHt0ZXN0X2NvdW50Kys7CgkJLy8JcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NTAgIDsKCQkvL3VwZGF0ZV9yZWdfZGVidWdfdmFsdWUoJihyZWdfdmFsdWVbMl0pLDB4Yzg4MzcwMGMgICk7CgoJCXdyX3JlZyggMHhmZjYzNzAwYywweDNlM2I3NzQpOwoJCS8vCXdyX3JlZyggMHhmZjYzNzAwYywoKHJkX3JlZygweGZmNjM3MDBjKSkmKH4oMHg3PDIpKSl8KHJlZ192YWx1ZVsyXTw8Mil8KDE8PDQpKTsKCQlwcmludGYoIlxudXBkYXRlICByZWcgMHhmZjYzNzAwYz0weCUwOHhcbiIscmRfcmVnKDB4ZmY2MzcwMGMpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQl3cl9yZWcoIDB4ZmY2MzcwMGMsMHgzZTNiNzY0KTsKCQkvL3dyX3JlZyggMHhmZjYzNzAwYywoKHJkX3JlZygweGZmNjM3MDBjKSkmKH4oMHg3PDIpKSl8KHJlZ192YWx1ZVsyXTw8Mil8KDE8PDQpKTsKCQlwcmludGYoIlxuLi4udXBkYXRlICByZWcgMHhmZjYzNzAwYz0weCUwOHhcbiIscmRfcmVnKDB4ZmY2MzcwMGMpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCgoKCQlwcmludGYoIlxudGVzdGluZyAlZCB0aW1lc1xuIiwodGVzdF9jb3VudCkpOwoJCWlmICghdGVzdF9sb29wX2ZsYWcpCgkJewoJCQlpZiAodGVzdF9jb3VudCA9PSB0ZXN0X3RpbWVzKQoJCQkJYnJlYWs7CgkJfQoJfQoKCXJldHVybiAxOwp9CiNlbmRpZgoKdm9pZCBkZHJfbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1aW50MzJfdCBsZW4pCnsvL2VuYWJsZV9tbXVfZWwxX3MoKTsKLy8JcHJpbnRmKCJcbmxlbj09JWQsIixsZW4pOwoJLy9wcmludGYobGVuKTsKCS8vc2VyaWFsX3B1dHMoIlxuIik7Ci8vdWludDMyX3QgZGRyX3Rlc3Rfc3RhcnRfdGltZV91cz1nZXRfdXNfdGltZSgpOyAgLy8gY2hlY2sgY29zdCB0aW1lCgkvL2NvbnN0IGNoYXIgKnMgPSBzcmM7CgkvL2NoYXIgKmQgPSBkc3Q7CglsZW49KGxlbj4+Myk7Cgljb25zdCBsb25nIGxvbmcgKnMgPSBzcmM7Cglsb25nIGxvbmcgKmQgPSBkc3Q7Cgl3aGlsZSAobGVuKQoJCXsKCS8vCWRkcl9wbGRfY2FjaGUocykgOwoJLy8vMSB0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTE4MTkyIHVzICAgMS4yZyAgYmFuZHdpZHRoIDM2ODhNL1MKCS8vIDR0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTExODQ0IHVzICAgMS4yZyAgYmFuZHdpZHRoIDU2NjZNL1MKCS8vIDh0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTExODQ0IHVzICAgMS4yZyAgYmFuZHdpZHRoIDU2NjZNL1MKCSpkKysgPSAqcysrOwoJKmQrKyA9ICpzKys7CgkqZCsrID0gKnMrKzsKCSpkKysgPSAqcysrOwoJbGVuPWxlbi00OwoJCX0KLy8JdWludDMyX3QgZGRyX3Rlc3RfZW5kX3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQovLwlzZXJpYWxfcHV0cygiXG5jb3B5IHRpbWU9PSIpOwovLwlzZXJpYWxfcHV0X2RlYyhkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKTsKLy8Jc2VyaWFsX3B1dHMoIlxuIik7Ci8vcHJpbnRmKCJcbmNvcHkgdGltZT09JWQgdXMsIiwoZGRyX3Rlc3RfZW5kX3RpbWVfdXMtZGRyX3Rlc3Rfc3RhcnRfdGltZV91cykpOwoKfQojZGVmaW5lIFBBVFRFUk5fTUFUUklYX1ggICAoMyszMisxNisxNykgICAgIC8vNjgqMzI9PTIxNzYgLy8vMi4yayAtMHg4ODAtMSBsb29wCgkjZGVmaW5lIFBBVFRFUk5fTUFUUklYX1kgICgzMikKCSNkZWZpbmUgUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFICAgKChQQVRURVJOX01BVFJJWF9YKSooUEFUVEVSTl9NQVRSSVhfWSkqNCkKCXVuc2lnbmVkIGludCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcih1bnNpZ25lZCBpbnQgYWRkX29mZnNldCApIHsJCgoJCQl1bnNpZ25lZCBpbnQgcGF0dGVybl9zZWxlY3Q9MDsKCQkJdW5zaWduZWQgaW50IHBhdHRlcm5fdmFsdWU9MDsKCQkJLy90ZXN0X3NpemU9KHRlc3Rfc2l6ZT4weDEwMDAwKT90ZXN0X3NpemU6MHgxMDAwMDsKCQkvLwl1aW50MzJfdCB3cml0ZV9hZGRyID0gc3RhcnRfYWRkOwoJCQl1aW50MzJfdCBtYXJ0aXhfeF9zZWxlY3Q9IDA7CgkJCXVpbnQzMl90IG1hcnRpeF95X3NlbGVjdD0gMDsKCQkJdW5zaWduZWQgaW50IHBhdHRlcm5fdmFsdWVfdGVtcF8xNj0wOwoJCXsJCgkJLy8JdWludDMyX3QgdGVzdF9lbmRfYWRkID0gc3RhcnRfYWRkK3Rlc3Rfc2l6ZTsKCQkvLwlmb3IoKHdyaXRlX2FkZHI9c3RhcnRfYWRkKTsod3JpdGVfYWRkcjx0ZXN0X2VuZF9hZGQpOykKCQkJCXsKCQkJCXBhdHRlcm5fc2VsZWN0PSgoYWRkX29mZnNldCklKChQQVRURVJOX01BVFJJWF9ZKSooUEFUVEVSTl9NQVRSSVhfWCkpKTsKCQkJCW1hcnRpeF94X3NlbGVjdD1wYXR0ZXJuX3NlbGVjdC8oUEFUVEVSTl9NQVRSSVhfWSk7CgkJCQltYXJ0aXhfeV9zZWxlY3Q9cGF0dGVybl9zZWxlY3QlKFBBVFRFUk5fTUFUUklYX1kpOwoJCQkJLy93cml0ZV9hZGRyX25pYmJsZV9zdGFydD0oKCgoYWRkX29mZnNldC9QQVRURVJOX01BVFJJWF9ZKS9QQVRURVJOX01BVFJJWF9YKSkqCgkJCQkvLwkoKChQQVRURVJOX01BVFJJWF9ZKSpQQVRURVJOX01BVFJJWF9YKSkpOwoJCQkJLy93cml0ZV9hZGRyX25pYmJsZV9zdGFydD0oKChhZGRfb2Zmc2V0KSVQQVRURVJOX01BVFJJWF9ZKSVQQVRURVJOX01BVFJJWF9YKQoJCQkJCXsJaWYobWFydGl4X3hfc2VsZWN0PT0wKQoJCQkJCQlwYXR0ZXJuX3ZhbHVlPTB4YWFhYTU1NTU7ICAvL2ZvciAxNiBiaXQgYnVzIHBhdHRlcm4KCQkJCQkJCQkJCgkJCQkJCWlmKG1hcnRpeF94X3NlbGVjdD09MSkKCQkJCQkJcGF0dGVybl92YWx1ZT0weDAwMDBmZmZmOyAvL2ZvciAxNiBiaXQgYnVzIHBhdHRlcm4KCQkJCQkJCgkJCQkJCWlmKG1hcnRpeF94X3NlbGVjdD09MikKCQkJCQkJcGF0dGVybl92YWx1ZT0wOwoJCQkJCQkJCQkJCQoJCQkJCQlpZigobWFydGl4X3hfc2VsZWN0PjIpJiYobWFydGl4X3hfc2VsZWN0PCgzKzMyKSkpCgkJCQkJCQl7CgkJCQkJCQlwYXR0ZXJuX3ZhbHVlPTE8PChtYXJ0aXhfeF9zZWxlY3QtMyk7CgkJCQkJCQl9CgkJCQkJCgkJCQkJCWlmKChtYXJ0aXhfeF9zZWxlY3Q+KDIrMzIpKSYmKG1hcnRpeF94X3NlbGVjdDwoMyszMisxNikpKSAgIC8vZm9yIDE2IGJpdCBidXMgcGF0dGVybgoJCQkJCQkJewoJCQkJCQkJcGF0dGVybl92YWx1ZV90ZW1wXzE2PSgxPDwobWFydGl4X3hfc2VsZWN0LTMtMzIpKTsKCQkJCQkJCXBhdHRlcm5fdmFsdWU9cGF0dGVybl92YWx1ZV90ZW1wXzE2fCgofnBhdHRlcm5fdmFsdWVfdGVtcF8xNik8PDE2KTsKCQkJCQkJCQkJCQoJCQkJCQkJfQoJCQkJCQlpZigobWFydGl4X3hfc2VsZWN0PigyKzMyKzE2KSkmJihtYXJ0aXhfeF9zZWxlY3Q8KDMrMzIrMTYrMTcpKSkgICAvL2ZvciBkYmkgYnVzIHBhdHRlcm4gIDE3IGdyb3VwCgkJCQkJCQl7CgkJCQkJCQlwYXR0ZXJuX3ZhbHVlX3RlbXBfMTY9KDB4MGYwZisweGYwZioobWFydGl4X3hfc2VsZWN0LTMtMzItMTYpKTsKCQkJCQkJCXBhdHRlcm5fdmFsdWU9cGF0dGVybl92YWx1ZV90ZW1wXzE2fCgofnBhdHRlcm5fdmFsdWVfdGVtcF8xNik8PDE2KTsKCQkJCQkJCQkJCQoJCQkJCQkJfQoJCQoJCQkJCX0KCQkJCWlmKG1hcnRpeF95X3NlbGVjdCUyKQoJCQkJCXBhdHRlcm5fdmFsdWU9fnBhdHRlcm5fdmFsdWU7CgkJCQl9CgoJCX0KCQkvLwlzZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc0Iik7CglyZXR1cm4gcGF0dGVybl92YWx1ZTsKfQp2b2lkIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fYXJlYSh1bnNpZ25lZCBpbnQgdGVzdF9pbml0X3N0YXJ0LHVuc2lnbmVkIGludCB0ZXN0X3NpemUsdW5zaWduZWQgaW50IHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nICkgewoKLy8JcHJpbnRmKCJcbiAxMTEiKTsKCQlpZihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZz09MCkKCQlwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZz0xOyAgLy9mb3IgZGlmZmVyZW50ICBmcmVxdWVuY3kgcGF0dGVybgoJdGVzdF9zaXplPSh0ZXN0X3NpemU+KChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKT90ZXN0X3NpemU6KChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpOwoJLy91bnNpZ25lZCBpbnQgdGVzdF9zdGFydD0weDEwODAwMDA7Cgl1bnNpZ25lZCBpbnQgd3JpdGVfYWRkPXRlc3RfaW5pdF9zdGFydDsKCXVuc2lnbmVkIGludCBzaXplX2xvb3A9MDsKCXVuc2lnbmVkIGludCBzaXplX2xvb3BfbWF4PTA7CgkvL3Vuc2lnbmVkIGludCBjb3VudD0wOwoJZm9yKDsoc2l6ZV9sb29wPCgoUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFKSoocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpKSk7KQoJCXsKCS8vc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNSIpOwoKCS8vCWZvciggIGNvdW50PTA7Y291bnQ8KHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKTspCgkJCXsKCQkJd3JpdGVfYWRkID0gKHVpbnQzMl90KShzaXplX2xvb3AgKyB0ZXN0X2luaXRfc3RhcnQpOwoJCXdyX3JlZygodW5zaWduZWQgbG9uZyl3cml0ZV9hZGQsIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKChzaXplX2xvb3A+PjIpL3BhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkJCXNpemVfbG9vcD1zaXplX2xvb3ArNDsKCQkJfQoJLy8Jc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNiIpOwoJCQoJLy8Jc2VyaWFsX3B1dHMoIiAiKTsKCSNpZiAwCgkJc2VyaWFsX3B1dF9oZXgoc2l6ZV9sb29wLDMyKTsKCQlzZXJpYWxfcHV0cygiICIpOwoJCXNlcmlhbF9wdXRfaGV4KGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKHNpemVfbG9vcD4+MiksMzIpOwojZW5kaWYKCQoJCX0KCXNpemVfbG9vcD0xOwoJc2l6ZV9sb29wX21heD0oKHRlc3Rfc2l6ZS8oKChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKSkrMSk7Cglmb3IoOyhzaXplX2xvb3A8c2l6ZV9sb29wX21heCk7KQoJCXsKCS8vCXNlcmlhbF9wdXRzKCJcbmNwdV90ZXN0X2Rkcl9kZWJ1ZzQxIik7CglkZHJfbWVtY3B5KCh2b2lkICopKHVpbnQ2NF90KSh0ZXN0X2luaXRfc3RhcnQrKChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKihzaXplX2xvb3ApKSwgKHZvaWQgKikodWludDY0X3QpdGVzdF9pbml0X3N0YXJ0LCAoKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkpOwovL3NlcmlhbF9wdXRzKCJcbmNwdV90ZXN0X2Rkcl9kZWJ1ZzQyIik7CnNpemVfbG9vcCsrOwoJfQp9CnVuc2lnbmVkIGludCBjcHVfZGRyX3Rlc3QodW5zaWduZWQgdGVzdF9pbml0X3N0YXJ0LHVuc2lnbmVkIGludCBzdGFydF9hZGQsIHVuc2lnbmVkIGludCB0ZXN0X3NpemUsIHVuc2lnbmVkIGludCB0ZXN0X2RhdGFfYml0X2VuYWJsZSx1bnNpZ25lZCBpbnQgcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcpIHsKLy9wcmludGYoIlxuIDExMTIiKTsKCgl1bnNpZ25lZCBpbnQgc3JjX2FkZD10ZXN0X2luaXRfc3RhcnQ7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl92YWx1ZT0wOwoJdW5zaWduZWQgaW50IHNpemVfbG9vcD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2Vycm9yPTA7Cgl1bnNpZ25lZCBpbnQgcmVhZF9hZGQ9MDsKCXVuc2lnbmVkIGludCByZWFkX3ZhbHVlPTA7Cgl0ZXN0X3NpemU9KHRlc3Rfc2l6ZT4weDIwMDApPyh0ZXN0X3NpemUpOigweDIwMDApOwoJLy9jcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2FyZWEodGVzdF9zaXplKTsKCXVpbnQzMl90IGRkcl90ZXN0X3N0YXJ0X3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJZGRyX21lbWNweSgodm9pZCAqKSh1aW50NjRfdClzdGFydF9hZGQsICh2b2lkICopKHVpbnQ2NF90KXNyY19hZGQsIHRlc3Rfc2l6ZSk7CnVpbnQzMl90IGRkcl90ZXN0X2VuZF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCXByaW50ZigiXG5jcHVfZGRyX3Rlc3RfdGVzdF9jb3B5X2JhbmR3aWR0aD09JWQgTWJ5dGUvc1xuIiwoMSp0ZXN0X3NpemUqMikvKGRkcl90ZXN0X2VuZF90aW1lX3VzLWRkcl90ZXN0X3N0YXJ0X3RpbWVfdXMpKTsKCQoJZm9yKDtzaXplX2xvb3A8KHRlc3Rfc2l6ZSk7KQoJCXtyZWFkX2FkZCA9ICh1aW50MzJfdCkoc2l6ZV9sb29wICsgc3RhcnRfYWRkKTsKCXJlYWRfdmFsdWU9KHJkX3JlZygodW5zaWduZWQgbG9uZylyZWFkX2FkZCkpOwoJcGF0dGVybl92YWx1ZT0oIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKChzaXplX2xvb3A+PjIpL3BhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkgICAgICAgaWYoKCh0ZXN0X2RhdGFfYml0X2VuYWJsZSkmcmVhZF92YWx1ZSkhPSgodGVzdF9kYXRhX2JpdF9lbmFibGUpJnBhdHRlcm5fdmFsdWUpKQoJICAgICAgIAl7CgkgICAgICAgCSNpZiAxCgkJCXByaW50ZigiZXJyb3IgZGF0YSAgZW5hYmxlICUwOHggcmVhZF92YWx1ZSAlMDh4ICBwYXR0ZXJuX3ZhbHVlICUwOHgiLHRlc3RfZGF0YV9iaXRfZW5hYmxlLHJlYWRfdmFsdWUscGF0dGVybl92YWx1ZSk7CgkJCSNpZiAwCgkgICAgICAgCXNlcmlhbF9wdXRzKCJcbmVycm9yIGRhdGEgIik7CgkJIHNlcmlhbF9wdXRfaGV4KHRlc3RfZGF0YV9iaXRfZW5hYmxlLDMyKTsKCQlzZXJpYWxfcHV0cygiICIpOwoJICAgICAgIHNlcmlhbF9wdXRfaGV4KHJlYWRfdmFsdWUsMzIpOwoJCXNlcmlhbF9wdXRzKCIgIik7CgkJIHNlcmlhbF9wdXRfaGV4KHBhdHRlcm5fdmFsdWUsMzIpOwoJCSBzZXJpYWxfcHV0cygiXG4iKTsKCQkgI2VuZGlmCgkJICNlbmRpZgoJCSAgIAlkZHJfdGVzdF9lcnJvcisrOwoJCQlyZXR1cm4gZGRyX3Rlc3RfZXJyb3I7CgkgICAgICAgCX0KCQlzaXplX2xvb3A9c2l6ZV9sb29wKygxPDwyKTsvLyB1c2UgYmlnIHN0ZXAgd2lsbCBmYXN0IHRlc3QgLGJ1dCBsb3NlIGFjY3VyYWN5LgoJCX0KCS8vcHJpbnRmKCJcbiAxMTE0Iik7CQoJcmV0dXJuIGRkcl90ZXN0X2Vycm9yOwp9CgppbnQgZG9fY3B1X2Rkcl90ZXN0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsvL2Rkcl9jcHVfdGVzdCAweDEwODAwMDAgMHgxMDAwMDAwMCAweDIwMDAwMDAgMHhmZmZmZmZmZiAxMCAgLy9zaXplIGRvIG5vdCBvdmVybGFwCgkJaW50IGk9MDsKCQlwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXsKCQkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgkJfQoJCXVuc2lnbmVkIGludCBpbml0X3N0YXJ0X2FkZD0wOwoJCXVuc2lnbmVkIGludCB0ZXN0X2FkZD0wOwoJCXVuc2lnbmVkIGludCB0ZXN0X3NpemU9MDsKCQl1bnNpZ25lZCBpbnQgdGVzdF9kYXRhX2JpdF9lbmFibGU9MDsKCQl1bnNpZ25lZCBpbnQgdGVzdF9sb29wcz0wOwoJCXVuc2lnbmVkIGludCB0ZXN0X2xvb3A9MDsKCQl1bnNpZ25lZCBpbnQgdGVzdF9lcnJvcnM9MDsKCQl1bnNpZ25lZCBpbnQgcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcgPTE7CgkJY2hhciAqZW5kcDsKCQkJaWYgKGFyZ2MgPT0gMSkKCQkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJCQllbHNlCgkJCXsKCQkJaWYgKGFyZ2MgPj0gMikKCQkJewoJCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJCWluaXRfc3RhcnRfYWRkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQkJfQoKCQkJaWYgKGFyZ2MgPj0gMykKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXRlc3RfYWRkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJdGVzdF9zaXplPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQkJfQoJCQkJCQlpZiAoYXJnYyA+PSA1KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJdGVzdF9kYXRhX2JpdF9lbmFibGU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCQl9CgkJCQkJCWlmIChhcmdjID49IDYpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQl0ZXN0X2xvb3BzPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQkJCWlmKHRlc3RfbG9vcHM9PTApCgkJCQkJdGVzdF9sb29wcz0xOwoJCQl9CgkJCQkJCQlpZiAoYXJnYyA+PSA3KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmc9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCQkJaWYocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmc9PTApCgkJCQkJcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmc9MTsKCQkJfQoJCQkJfQoJCQl1aW50MzJfdCBkZHJfdGVzdF9zdGFydF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCQkJY3B1X2Rkcl90ZXN0X2luaXRfcGF0dGVybl9hcmVhKGluaXRfc3RhcnRfYWRkLHRlc3Rfc2l6ZSxwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyk7CgkJCWZvcih0ZXN0X2xvb3A9MDt0ZXN0X2xvb3A8dGVzdF9sb29wczspCgkJCQl7dGVzdF9lcnJvcnM9dGVzdF9lcnJvcnMrY3B1X2Rkcl90ZXN0KGluaXRfc3RhcnRfYWRkLHRlc3RfYWRkLHRlc3Rfc2l6ZSx0ZXN0X2RhdGFfYml0X2VuYWJsZSxwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyk7CgkJCQl0ZXN0X2xvb3ArKzsKCQkJCXByaW50ZigiXG5jcHVfZGRyX3Rlc3RfdGVzdF90aW1lcz09JWQgIHRlc3RfZXJyb3JzPT0lZCIsdGVzdF9sb29wLHRlc3RfZXJyb3JzKTsKCQkJCX0KCQkJdWludDMyX3QgZGRyX3Rlc3RfZW5kX3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJCQkJcHJpbnRmKCJcbmNwdV9kZHJfdGVzdF90ZXN0X2FuZCBjb21wYXJlX2JhbmR3aWR0aD09JWQgTWJ5dGUvc1xuIiwodGVzdF9sb29wcyp0ZXN0X3NpemUqMikvKGRkcl90ZXN0X2VuZF90aW1lX3VzLWRkcl90ZXN0X3N0YXJ0X3RpbWVfdXMpKTsKCQlyZXR1cm4gdGVzdF9lcnJvcnM7Cn0KVV9CT09UX0NNRCgKCWRkcl9jcHVfdGVzdCwJMzAsCTEsCWRvX2NwdV9kZHJfdGVzdCwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7CgppbnQgZG9fZGRyX3Rlc3Rfd3JpdGVfcmVhZCAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLy8qCgl7CgkJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl90ZXN0X2Rkcl93cml0ZV9yZWFkX2N1cnJlbnRcbiIpOwoJCS8vICAgaWYoIWFyZ2MpCgkJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CgkJaW50IGk9MDsKCQlwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXsKCQkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgkJfQoKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgkJY2hhciAqZW5kcDsKCgkJdW5zaWduZWQgaW50IHBhdHRlcm5faWQ9MTsKCQl1bnNpZ25lZCBpbnQgcGF0dGVybls0XSA9ezB9OwoJCXVuc2lnbmVkIGludCB3cml0ZV9yZWFkPTA7CgkJdW5zaWduZWQgaW50IHJlYWRfcGF0dGVybls0XT17MH0gOwoJCXVuc2lnbmVkIGludCBsb29wPTE7CgkJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCQl1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgkJdW5zaWduZWQgaW50ICBjb3B5X29mZnNldD0gRERSX1RFU1RfU0laRTsKCQl1bnNpZ25lZCBpbnQgIG5vX3Nob3dfaW5mbz0gMDsKCQl1bnNpZ25lZCBpbnQgIHVzX2RlbGF5X2NvdW50ZXI9IDA7CgoKCQlpZiAoYXJnYyA9PSAxKQoJCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgkJZWxzZSB7CgkJCWlmIChhcmdjID49IDIpCgkJCXsKCQkJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJCQl3cml0ZV9yZWFkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQkJfQoKCQkJaWYgKGFyZ2MgPj0gMykKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXBhdHRlcm5faWQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49IDQpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQlsb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PTUpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQlzdGFydF9hZGRyPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PTYpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQl0ZXN0X3NpemU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49NykKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCW5vX3Nob3dfaW5mbz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj04KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJdXNfZGVsYXlfY291bnRlcj0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJCX0KCQl9CgkJcHJpbnRmKCJcbndyaXRlX3JlYWQ9PSAweCUwOGRcbiIsIHdyaXRlX3JlYWQpOwoJCXByaW50ZigiXG5wYXR0ZXJuX2lkPT0gMHglMDhkXG4iLCBwYXR0ZXJuX2lkKTsKCQlwcmludGYoIlxubG9vcD09IDB4JTA4ZFxuIiwgbG9vcCk7CgkJcHJpbnRmKCJcbnN0YXJ0X2FkZHI9PSAweCUwOHhcbiIsIHN0YXJ0X2FkZHIpOwoJCXByaW50ZigiXG50ZXN0X3NpemU9PSAweCUwOHhcbiIsIHRlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbnVzX2RlbGF5X2NvdW50ZXI9PSAlZFxuIiwgdXNfZGVsYXlfY291bnRlcik7CgkJY29weV9vZmZzZXQ9dGVzdF9zaXplOwoKCQl1bnNpZ25lZCBpbnQgICpwOwoJCXVuc2lnbmVkIGludCAgIGo7CgoKCQlwID0gKHVuc2lnbmVkIGludCAgKiApKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpOwoKCQlpZiAocGF0dGVybl9pZCA9PSAwKQoJCXsKCQkJcGF0dGVyblswXT0wOwoJCQlwYXR0ZXJuWzFdPTA7CgkJCXBhdHRlcm5bMl09MDsKCQkJcGF0dGVyblszXT0wOwoJCX0KCQlpZiAocGF0dGVybl9pZCA9PSAxKQoJCXsKCQkJcGF0dGVyblswXT0weGZmZmZmZmZmOwoJCQlwYXR0ZXJuWzFdPTB4ZmZmZmZmZmY7CgkJCXBhdHRlcm5bMl09MHhmZmZmZmZmZjsKCQkJcGF0dGVyblszXT0weGZmZmZmZmZmOwoJCX0KCgoJCWRvCgkJewoJCQlpZiAod3JpdGVfcmVhZCA9PSAwKQoJCQl7IAoJCQkJaWYoIW5vX3Nob3dfaW5mbykKCQkJCQlwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJCQl7CgkJCQkJKihwK2opPShwYXR0ZXJuWzBdKTsKCQkJCQkqKHAraisxKT0ocGF0dGVyblsxXSk7CgkJCQkJKihwK2orMik9KHBhdHRlcm5bMl0pOwoJCQkJCSoocCtqKzMpPShwYXR0ZXJuWzNdKTsKCQkJCQlqPWorNDsKCQkJCX0KCQkJfQoJCQlpZiAod3JpdGVfcmVhZCA9PSAxKQoJCQl7ICAKCQkJCWlmKCFub19zaG93X2luZm8pCgkJCQkJcHJpbnRmKCJcbmxvb3A6MHglMDh4OlN0YXJ0IHJlYWRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgbG9vcCxzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCWZvciAoaj0wO2o8dGVzdF9zaXplLzQ7KQoJCQkJewoJCQkJCXJlYWRfcGF0dGVyblswXT0gKihwK2opOwoJCQkJCXJlYWRfcGF0dGVyblsxXT0gKihwK2orMSk7CgkJCQkJcmVhZF9wYXR0ZXJuWzJdPSoocCtqKzIpOwoJCQkJCXJlYWRfcGF0dGVyblszXT0gKihwK2orMyk7CgkJCQkJaj1qKzQ7CgkJCQl9CgkJCQlpZiAobG9vcCA9PSAxKSB7CgkJCQkJaWYoIW5vX3Nob3dfaW5mbykKCQkJCQkJcHJpbnRmKCIgXG5sb29wOjB4JTA4eDpTdGFydCByZWFkaW5nIHJlYWRfcGF0dGVyblswXSAweCUwOHgsIHBhdHRlcm5bMV0gMHglMDh4LHBhdHRlcm5bMl0gMHglMDh4LHBhdHRlcm5bM10gMHglMDh4IiwKCQkJCQkJCQlsb29wLHJlYWRfcGF0dGVyblswXSwgcmVhZF9wYXR0ZXJuWzFdLHJlYWRfcGF0dGVyblsyXSxyZWFkX3BhdHRlcm5bM10KCQkJCQkJCSAgKTsgIH0KCQkJfQoJCQlpZiAod3JpdGVfcmVhZCA9PSAyKQoJCQl7ICAgCgkJCQlpZighbm9fc2hvd19pbmZvKQoJCQkJCXByaW50ZigiXG5sb29wOjB4JTA4eDpTdGFydCBjb3B5aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIGxvb3Asc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQlmb3IgKGo9MDtqPHRlc3Rfc2l6ZS80OykKCQkJCXsKCQkJCQkqKHAraitjb3B5X29mZnNldC80KT0gKihwK2opOwoJCQkJCSoocCtqKzErY29weV9vZmZzZXQvNCk9ICoocCtqKzEpOwoJCQkJCSoocCtqKzIrY29weV9vZmZzZXQvNCk9ICoocCtqKzIpOwoJCQkJCSoocCtqKzMrY29weV9vZmZzZXQvNCk9ICoocCtqKzMpOwoJCQkJCWo9ais0OwoJCQkJfQoJCQl9CgkJCWlmKHVzX2RlbGF5X2NvdW50ZXIpCgkJCXsKCQkJCWRkcl91ZGVsYXkodXNfZGVsYXlfY291bnRlcik7CgkJCX0KCQl9d2hpbGUobG9vcC0tKTsKCgoJCUNMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgkJQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCgkJcHJpbnRmKCJcbnRlc3QgZW5kXG4iKTsKCgkJcmV0dXJuIDE7Cgl9CgkvLyovCn0KCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgojZGVmaW5lIFRFU1RfTUlOX0REUl9FRV9WT0xUQUdFICA2ODEKI2RlZmluZSBURVNUX01BWF9ERFJfRUVfVk9MVEFHRSAgOTYyCiNkZWZpbmUgICAgRzEyX0FPX1BXTV9QV01fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweGZmODA3MDAwICsgKDB4MDAxIDw8IDIpKQpzdGF0aWMgaW50IHB3bV92b2x0YWdlX3RhYmxlX2VlW11bMl0gPQp7Cgl7IDB4MWMwMDAwLCAgNjgxfSwKCXsgMHgxYjAwMDEsICA2OTF9LAoJeyAweDFhMDAwMiwgIDcwMX0sCgl7IDB4MTkwMDAzLCAgNzExfSwKCXsgMHgxODAwMDQsICA3MjF9LAoJeyAweDE3MDAwNSwgIDczMX0sCgl7IDB4MTYwMDA2LCAgNzQxfSwKCXsgMHgxNTAwMDcsICA3NTF9LAoJeyAweDE0MDAwOCwgIDc2MX0sCgl7IDB4MTMwMDA5LCAgNzcyfSwKCXsgMHgxMjAwMGEsICA3ODJ9LAoJeyAweDExMDAwYiwgIDc5Mn0sCgl7IDB4MTAwMDBjLCAgODAyfSwKCXsgMHgwZjAwMGQsICA4MTJ9LAoJeyAweDBlMDAwZSwgIDgyMn0sCgl7IDB4MGQwMDBmLCAgODMyfSwKCXsgMHgwYzAwMTAsICA4NDJ9LAoJeyAweDBiMDAxMSwgIDg1Mn0sCgl7IDB4MGEwMDEyLCAgODYyfSwKCXsgMHgwOTAwMTMsICA4NzJ9LAoJeyAweDA4MDAxNCwgIDg4Mn0sCgl7IDB4MDcwMDE1LCAgODkyfSwKCXsgMHgwNjAwMTYsICA5MDJ9LAoJeyAweDA1MDAxNywgIDkxMn0sCgl7IDB4MDQwMDE4LCAgOTIyfSwKCXsgMHgwMzAwMTksICA5MzJ9LAoJeyAweDAyMDAxYSwgIDk0Mn0sCgl7IDB4MDEwMDFiLCAgOTUyfSwKCXsgMHgwMDAwMWMsICA5NjJ9Cn07CnVpbnQzMl90IGZpbmRfdmRkZWVfdm9sdGFnZV9pbmRleCh1bnNpZ25lZCBpbnQgdGFyZ2V0X3ZvbHRhZ2UpCnsKCXVuc2lnbmVkIGludCB0bzsKCWZvciAodG8gPSAwOyB0byA8IEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpOyB0bysrKSB7CgkJaWYgKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVsxXSA+PSB0YXJnZXRfdm9sdGFnZSkgewoJCQlicmVhazsKCQl9Cgl9CglpZiAodG8gPj0gQVJSQVlfU0laRShwd21fdm9sdGFnZV90YWJsZV9lZSkpIHsKCQl0byA9IEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpIC0gMTsKCX0KCXJldHVybiB0bzsKfQoKdm9pZCBzZXRfZWVfdm9sdGFnZSh1aW50MzJfdCBlZV9vdmVyX3JpZGVfdm9sdGFnZSkKewoJdW5zaWduZWQgaW50IHRvOwoJZm9yICh0byA9ICAoQVJSQVlfU0laRShwd21fdm9sdGFnZV90YWJsZV9lZSkpOyggdG8gPjApOyB0by0tKSB7CgkJaWYgKChwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXTxlZV9vdmVyX3JpZGVfdm9sdGFnZSkgJiYgKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVsxXSA+PSBlZV9vdmVyX3JpZGVfdm9sdGFnZSkpIHsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKGVlX292ZXJfcmlkZV92b2x0YWdlKSB7CgkJd3JpdGVsKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVswXSxHMTJfQU9fUFdNX1BXTV9CKTsKCQlwcmludGYgKCJcbkREUl9vdmVyaWRlX0VFX3ZvbHRhZ2UgPT0lZCBtdiAvbiIscHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMV0pOwoJfQp9Cgp1bnNpZ25lZCBpbnQgcmVhZF9lZV92b2x0YWdlKHZvaWQpCnsKCXVuc2lnbmVkIGludCB0bzsKCXVuc2lnbmVkIGludCByZWdfdmFsdWU9MDsKCXJlZ192YWx1ZT1yZWFkbChHMTJfQU9fUFdNX1BXTV9CKTsKCXRvPXJlZ192YWx1ZSYweGZmOwoJcmV0dXJuIHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvXVsxXTsKfQp1aW50MzJfdCBnZXRfYmRscl8xMDBzdGVwKHVpbnQzMl90IGRkcl9mcmVxdWVuY3kpCnsKCXVpbnQzMl90IGJkbHJfMTAwc3RlcD0wOwoJLy91aW50MzJfdCBwcz0wOwoJLy9wcz0ocmRfcmVnKERNQ19EUkFNX0ZSRVFfQ1RSTCkpJjE7Cglkd2NfZGRycGh5X2FwYl93cigoKCgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhlMykpKSksMHhjMDApOwoJYmRscl8xMDBzdGVwPSgxMDAwMDAwMDAvKDIqZGRyX2ZyZXF1ZW5jeSkpLygoZHdjX2RkcnBoeV9hcGJfcmQoKCgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhlNCkpKSkpJjB4M2ZmKTsKCXJldHVybiBiZGxyXzEwMHN0ZXA7Cn0KCmludCBkb19kZHJfdGVzdF9wd21fYmRsciAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGFyICplbmRwOwoJcHJpbnRmKCJcbkVudGVyIGcxMiBkb19kZHJfdGVzdF9wd21fYmRsIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJLy9pZiAoYXJnYyA8IDIpCgkvLwlnb3RvIHVzYWdlOwoKCgl1bnNpZ25lZCBpbnQgYXJnY19jb3VudD0xOwoJdW5zaWduZWQgaW50ICBwYXJhX21ldGVyWzMwXT17MCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCx9OwoJd2hpbGUoYXJnY19jb3VudDxhcmdjKQoJe3BhcmFfbWV0ZXJbYXJnY19jb3VudC0xXT0gc2ltcGxlX3N0cnRvdWwoYXJndlthcmdjX2NvdW50XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlthcmdjX2NvdW50XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJcGFyYV9tZXRlclthcmdjX2NvdW50LTFdID0gMDsKCQl9CgkJYXJnY19jb3VudCsrOwoJfQoKCS8vdWludDMyX3QgaWQ9cGFyYV9tZXRlclswXTsKCS8vdWludDMyX3Qgdm9sdGFnZT1wYXJhX21ldGVyWzFdOwoJdWludDMyX3QgbG9vcD1wYXJhX21ldGVyWzBdOwoJdWludDMyX3Qgdm9sdGFnZV9taW49cGFyYV9tZXRlclsxXTsKCXVpbnQzMl90IHZvbHRhZ2VfbWF4PXBhcmFfbWV0ZXJbMl07Cgl1aW50MzJfdCBzaG93X2NvdW50X21lc3NhZ2U9cGFyYV9tZXRlclszXTsKCgkvLyNkZWZpbmUgUFdNX0lEX0RFRkFVTFQgICAwPDwwCgkvLyNkZWZpbmUgUFdNX1ZPTFRBR0VfREVGQVVMVCAgIDgwMDw8MAojZGVmaW5lIFBXTV9MT09QX0RFRkFVTFQgICAxMDw8MAojZGVmaW5lIFBXTV9WT0xUQUdFX01JTl9ERUZBVUxUICAgVEVTVF9NSU5fRERSX0VFX1ZPTFRBR0UKI2RlZmluZSBQV01fVk9MVEFHRV9NQVhfREVGQVVMVCAgIFRFU1RfTUFYX0REUl9FRV9WT0xUQUdFCgoKCS8vaWQ9aWQ/aWQ6UFdNX0lEX0RFRkFVTFQ7CgkvL3ZvbHRhZ2U9dm9sdGFnZT92b2x0YWdlOlBXTV9WT0xUQUdFX0RFRkFVTFQ7Cglsb29wPWxvb3A/bG9vcDpQV01fTE9PUF9ERUZBVUxUOwoJdm9sdGFnZV9taW49KHZvbHRhZ2VfbWluPFBXTV9WT0xUQUdFX01JTl9ERUZBVUxUKT9QV01fVk9MVEFHRV9NSU5fREVGQVVMVDp2b2x0YWdlX21pbjsKCXZvbHRhZ2VfbWF4PSh2b2x0YWdlX21heD5QV01fVk9MVEFHRV9NQVhfREVGQVVMVCk/UFdNX1ZPTFRBR0VfTUFYX0RFRkFVTFQ6dm9sdGFnZV9tYXg7Cgl2b2x0YWdlX21heD0odm9sdGFnZV9tYXg8UFdNX1ZPTFRBR0VfTUlOX0RFRkFVTFQpP1BXTV9WT0xUQUdFX01BWF9ERUZBVUxUOnZvbHRhZ2VfbWF4OwoKCS8vCSAgcHJpbnRmKCJcbnZvbHRhZ2VfbWluPSVkXG4iLHZvbHRhZ2VfbWluKTsKCS8vCSAgCQkgIHByaW50ZigiXG52b2x0YWdlX21heD0lZFxuIix2b2x0YWdlX21heCk7Cgl1aW50MTZfdCBiZGxyXzEwMF9taW49MDsKCXVpbnQxNl90IGJkbHJfMTAwX2F2ZXJhZ2U9MDsKCXVpbnQxNl90IGJkbHJfMTAwX21heD0wOwoJdWludDE2X3QgYmRscl8xMDBfY3VyPTA7CgkvL3VpbnQxNl90IGN1cl9kZHJfZnJlcXVlbmN5PTA7Cgl1aW50MzJfdCBjb3VudD0xOwoKCWJkbHJfMTAwX2N1cj1nZXRfYmRscl8xMDBzdGVwKGdsb2JhbF9kZHJfY2xrKTsKCWJkbHJfMTAwX21pbj1iZGxyXzEwMF9jdXI7CgliZGxyXzEwMF9tYXg9YmRscl8xMDBfY3VyOwoJYmRscl8xMDBfYXZlcmFnZT1iZGxyXzEwMF9jdXI7CgoJdW5zaWduZWQgaW50IHRvPTA7Cgl1bnNpZ25lZCBpbnQgdG9fbWluPTA7Cgl1bnNpZ25lZCBpbnQgdG9fbWF4PShBUlJBWV9TSVpFKHB3bV92b2x0YWdlX3RhYmxlX2VlKSktMTsKCS8vdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXByaW50ZigiXG5yZWFkIG9yZ19FRV92b2x0YWdlICVkIG12IFxuIixyZWFkX2VlX3ZvbHRhZ2UoKSk7Cgl0b19taW49ZmluZF92ZGRlZV92b2x0YWdlX2luZGV4KHZvbHRhZ2VfbWluKTsKCXRvX21heD1maW5kX3ZkZGVlX3ZvbHRhZ2VfaW5kZXgodm9sdGFnZV9tYXgpOwoJZm9yICh0byA9KHRvX21heCsxKSAgOyggdG8gPnRvX21pbik7IHRvLS0pIHsKCQkvLyAgcHJpbnRmKCJcblRPPSVkXG4iLHRvKTsKCQl3cml0ZWwocHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMF0sRzEyX0FPX1BXTV9QV01fQik7CgkJdWRlbGF5KDEwMDApOwoJCWJkbHJfMTAwX2N1cj1nZXRfYmRscl8xMDBzdGVwKGdsb2JhbF9kZHJfY2xrKTsKCQliZGxyXzEwMF9taW49YmRscl8xMDBfY3VyOwoJCWJkbHJfMTAwX21heD1iZGxyXzEwMF9jdXI7CgkJYmRscl8xMDBfYXZlcmFnZT1iZGxyXzEwMF9jdXI7CgkJY291bnQ9MTsKCgkJLy8JcHJpbnRmKCJcbkREUl9zZXQgRUVfdm9sdGFnZSAlZCAgYmRscl8xMDBfYXZlcmFnZSAlZCAgYmRscl8xMDBfbWluICVkIGJkbHJfMTAwX21heCAlZCBjb3VudCAlZCxiZGxyXzEwMF9jdXIgJWQgXG4iLHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvLTFdWzFdLAoJCS8vYmRscl8xMDBfYXZlcmFnZSxiZGxyXzEwMF9taW4sYmRscl8xMDBfbWF4LGNvdW50LGJkbHJfMTAwX2N1cik7CgoJCWRvIHsKCQkJYmRscl8xMDBfY3VyPSgxMDAwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKGR3Y19kZHJwaHlfYXBiX3JkKCgoKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4ZTQpKSkpKSYweDNmZik7CgkJCWJkbHJfMTAwX21pbj0oYmRscl8xMDBfY3VyPGJkbHJfMTAwX21pbik/YmRscl8xMDBfY3VyOmJkbHJfMTAwX21pbjsKCQkJYmRscl8xMDBfbWF4PShiZGxyXzEwMF9jdXI+YmRscl8xMDBfbWF4KT9iZGxyXzEwMF9jdXI6YmRscl8xMDBfbWF4OwoJCQliZGxyXzEwMF9hdmVyYWdlPShiZGxyXzEwMF9jdXIrYmRscl8xMDBfYXZlcmFnZSpjb3VudCkvKGNvdW50KzEpOwoJCQljb3VudCsrOwoJCQlpZihzaG93X2NvdW50X21lc3NhZ2UpCgkJCQlwcmludGYoIiVkXG4iLGJkbHJfMTAwX2N1cik7CgoJCX13aGlsZShjb3VudDxsb29wKTsKCQlwcmludGYoIlxuRERSX3NldCBFRV92b2x0YWdlICVkICBiZGxyXzEwMF9hdmVyYWdlICVkICBiZGxyXzEwMF9taW4gJWQgYmRscl8xMDBfbWF4ICVkIGNvdW50ICVkIixwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXSwKCQkJCWJkbHJfMTAwX2F2ZXJhZ2UsYmRscl8xMDBfbWluLGJkbHJfMTAwX21heCxjb3VudCk7CgoKCX0KCgoKCglyZXR1cm4gMTsKCn0KCnR5cGVkZWYgc3RydWN0IGRkcl9zaGFfcyB7Cgl1bnNpZ25lZCBjaGFyIHNoYTJbU0hBMjU2X1NVTV9MRU5dOwoJZGRyX3NldF90IGRkcnM7Cn0gZGRyX3NoYV90OwoKZGRyX3NoYV90IGRkcl9zaGEgPSB7ezB9fTsKZGRyX3NldF90ICpkZHJfc2V0X3RfcF9hcnJhcnkgPSAmZGRyX3NoYS5kZHJzOwoKaW50IGRvX2Rkcl9kaXNwbGF5X2cxMl9kZHJfaW5mb3JtYXRpb24oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCglkZHJfc2V0X3QgKmRkcl9zZXRfdF9wPU5VTEw7CglkZHJfc2V0X3RfcD0oZGRyX3NldF90ICopKGRkcl9zZXRfdF9wX2FycmFyeSk7CgkvL2Rkcl9zZXRfdF9wPSAoZGRyX3NldF90ICopRzEyX0RNQ19TVElDS1lfMDsKCS8vaWYgKHNpemVvZihkZHJfc2V0X3QpPGxvb3BfbWF4KQoJcHJpbnRmKCJcbmRkcl9zZXRfdF9wPT0weCUwOHhcbiIsKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApKTsKCXVpbnQzMl90IGxvb3A9MDsgCgl1aW50MzJfdCBsb29wX21heCA9ICg0KygweDNmPDwyKSk7Ly8oKERNQ19TVElDS1lfNjMtRE1DX1NUSUNLWV8wKSk7CgkJCS8vCWxvb3BfbWF4PXNpemVvZihkZHJfc2V0X3QpOwoJCQlmb3IgKGxvb3AgPSAwOyBsb29wIDxsb29wX21heDsgbG9vcCs9NCkgewoJCQkJd3JfcmVnKCgodWludDY0X3QpKGRkcl9zZXRfdF9wKSArIGxvb3ApLCByZF9yZWcoRzEyX0RNQ19TVElDS1lfMCArIGxvb3ApKTsKCQkJfQoJCgkJCQp7CgkJdWludDE2X3QJZHFfYml0X2RlbGF5WzcyXTsKCQl1bnNpZ25lZAljaGFyIHRfY291bnQ9MDsKCQl1aW50MTZfdCAgZGVsYXlfb3JnPTA7CgkJdWludDE2X3QgIGRlbGF5X3RlbXA9MDsKCQl1aW50MzJfdCAgYWRkX29mZnNldD0wOwoJCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMHgwKTsKCQliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7CgkJdWlfMV8zMl8xMDBzdGVwPSgxMDAwMDAwKjEwMC8oZ2xvYmFsX2Rkcl9jbGsqMiozMikpOwoKCQl7CgoJCQkKCQkvLwkJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MjApLHBfZGV2LT5wX2RkcnMtPmRmaV9tcmwpOyAgLy9ERklNUkwKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMTw8MTIpfCgweDIwKSxwX2Rldi0+cF9kZHJzLT5kZmlfbXJsKTsgIC8vREZJTVJMCgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KDI8PDEyKXwoMHgyMCkscF9kZXYtPnBfZGRycy0+ZGZpX21ybCk7ICAvL0RGSU1STAoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgzPDwxMil8KDB4MjApLHBfZGV2LT5wX2RkcnMtPmRmaV9tcmwpOyAgLy9ERklNUkwKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweDIwKSxwX2Rldi0+cF9kZHJzLT5kZmlfbXJsKTsgIC8vSHd0TVJMCgkvL2Rkcl9zZXRfdF9wLT5kZmlfbXJsOwoJLy9kZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybDsKCQlkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbD0wOwoJCXByaW50ZigiXG4gQVJkUHRySW5pdFZhbCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwoMDw8MTIpfCgweDJlKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5BUmRQdHJJbml0VmFsPWRlbGF5X29yZzsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJCgkJcHJpbnRmKCJcbiBkZmltcmwwIGRmaW1ybDEgZGZpbXJsMiBkZmltcmwzIEh3dE1STCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5kZmlfbXJsPWRlbGF5X29yZzsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgxPDwxMil8KDB4MjApKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMSxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMjw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDIsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDM8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwzLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4MjApKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgoJCWRkcl9zZXRfdF9wLT5kZmlfaHd0bXJsPWRlbGF5X29yZzsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJfQoJewoJCXByaW50ZigiXG4gY291bnRfaW5kZXggICAgIGRlbGF5X3ZhbHVlICAgICByZWdpc3Rlcl9hZGQgICAgIHJlZ2lzdGVyX3ZhbHVlIFxuICIpOwoJCXByaW50ZigiXG4gYWRkcmVzcyBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgIC0tc3RlcD09MS8zMlVJICxiaXQgNiBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxMDt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgwPDwxNil8KHRfY291bnQ8PDEyKXwoMHg4MCkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoJCQlkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkJcHJpbnRmKCJcbiB0ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOSBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHhkMCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCQoJCQlkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQoJCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCX0KCXsKCQlwcmludGYoIlxuIHJ4ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSxubyBjb2Fyc2UiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweDhjKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJCXByaW50ZigiXG4gd3JpdGUgZHFfYml0IGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOCBpcyBjb2Fyc2UgIC0tc3RlcD09MVUiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCWZvcih0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJCXsKCQkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweGMwKygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQkJZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoKCQkJCQoJCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJfQoJewoJCXByaW50ZigiXG4gcmVhZCBkcV9iaXQgZGVsYXkgKiBCRExSeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PWJkbHIgc3RlcCBzaXplIGFib3V0IDVwcyxubyBjb2Fyc2UiLGJkbHJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweDY4KygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oKGRlbGF5X29yZyYweDNmKSk7CgkJCQoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcV9iaXRfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkJcHJpbnRmKCJcbiByZWFkIGRxcyBnYXRlIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAsYml0IDYtMTAgaXMgY29hcnNlIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoKCQkJCgkJCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoKCQlwcmludGYoIlxuIHNvYyB2cmVmIDogbHBkZHI0LS0gVlJFRiA9IFZERFEqKDAuMDQ3ICsgVnJlZkRBQzBbNjowXSowLjAwMzY3ICAgRERSNCAtLVZSRUYgPSBWRERRKigwLjUxMCArIFZyZWZEQUMwWzY6MF0qMC4wMDM0NSIpOwoJCS8vKCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCksb3Zlcl9yaWRlX3ZhbHVlKQkKCQl1aW50MzJfdCB2cmVmX3RfY291bnQ9MDsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KCgodF9jb3VudCUzNiklOSk8PDgpfCgweDQwKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oKGRlbGF5X29yZykpOwoKaWYodF9jb3VudDwzNSkKewoJCQl2cmVmX3RfY291bnQ9KCgoKHRfY291bnQlMzYpLzkpKjgpKyh0X2NvdW50JTkpKTsKCgkJCWRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbdnJlZl90X2NvdW50XT1kZWxheV90ZW1wOwp9CgoJCQkKCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9CgoKCglwcmludGYoIlxuIGRyYW0gdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4gICBERFI0IC0tVlJFRiA9IFZERFEqKDAuICsgVnJlZkRBQzBbNjowXSowLiIpOwoJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MDgyKSk7CmRlbGF5X3RlbXA9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDMyO3RfY291bnQrKykKCQl7CgoJCQoJCQlkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0X2NvdW50XT1kZWxheV90ZW1wOwoKCgkJCQoJCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X3RlbXApOwoJfQoKCS8vCWlmKG92ZXJfcmlkZV9pbmRleCA9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SRVRSQUlOSU5HKQoJCQl7CS8vCWlmIChyZWFkX3dyaXRlPT1SRUdJU1RFUl9SRUFEKQoJCQkJCQkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCXsvL3BfZGV2LT5wX2RkcnMtPnRkcXMyZHE9bHBkZHI0X3RkcXMyZHE7CgkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1swXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhYSkpOyAgLy9QcHRDdGxTdGF0aWMKCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzFdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFlKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmswCgkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1syXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhZikpOyAgLy9QcHREcXNDbnRJbnZUcm5UZzAgIHBzMCByYW5rMQoJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCswXT0oZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKSkmMHhmZjsgIC8vUHB0Q3RsU3RhdGljCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzFdPShkd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhYSkpKT4+ODsgIC8vUHB0Q3RsU3RhdGljCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzJdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFlKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmswIGxhbmUgMC0zCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzNdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxIGxhbmUgMC0zCgkJfQoJCgkJCgkJCX0KfQoKewoJCXVpbnQzMl90ICBjb3VudD0wOwoJCXVpbnQzMl90ICByZWdfYWRkX29mZnNldD0wOwoJCXVpbnQxNl90ICByZWdfdmFsdWU9MDsKCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxucGN0bCB0aW1taW5nOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwojZGVmaW5lIERNQ19EUkFNX1REUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAxZCAgPDwgMikgKyAweGZmNjM4NDAwKQojZGVmaW5lIERNQ19EUkFNX1RNUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM4NDAwKQojZGVmaW5lIEcxMl9ETUNfU1RJQ0tZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODgwMCkKCgkJcHJpbnRmKCJcbiBQQ1RMIHRpbW1pbmc6IDB4Iik7CgoJCWZvciAoY291bnQ9MDtjb3VudDwoRE1DX0RSQU1fVERQRC1ETUNfRFJBTV9UTVJEKTspIHsKCQkJcmVnX2FkZF9vZmZzZXQ9KERNQ19EUkFNX1RNUkQrKGNvdW50KSk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfYWRkX29mZnNldCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJlYWRsKHJlZ19hZGRfb2Zmc2V0KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAgIAoJCQlwcmludGYoIlxuIHJlZ19hZGRfb2Zmc2V0OiAlMDh4ICUwOHggJTA4eCAiLHJlZ19hZGRfb2Zmc2V0LHJlYWRsKHJlZ19hZGRfb2Zmc2V0KSxyZWdfYWRkX29mZnNldCk7CgkJCWNvdW50PWNvdW50KzQ7CgkJfQoJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG5tcnMgcmVnaXN0ZXI6IGJhc2UgKDB4NTQwMDA8PDEpK2ZlMDAwMDAwLGJ5dGUgb2Zmc2V0XG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJcHJpbnRmKCJcbiBtcnMgcmVnaXN0ZXI6ICIpOwoJCXByaW50ZigiXG4gbXJzIHJlZ2lzdGVyOiBiYXNlICgweDU0MDAwPDwxKStmZTAwMDAwMCwlMDh4ICBieXRlIG9mZnNldFxuIiwoMHg1NDAwMDw8MSkrMHhmZTAwMDAwMCk7CgkJZm9yIChjb3VudD0wO2NvdW50PDB4ODA7KSB7CgkJCXJlZ19hZGRfb2Zmc2V0PTB4NTQwMDArY291bnQ7Ly9kd2NfZGRycGh5X2FwYl93cigweDU0MDA4LDB4MTAwMSk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJcmVnX3ZhbHVlPSAoKCoodm9sYXRpbGUgdWludDE2X3QgKikoKHVpbnQ2NF90KSgoKDB4NTQwMDArKGNvdW50Pj4xKSkpIDw8IDEpKzB4ZmUwMDAwMDApKT4+KCgoY291bnQpJTIpPzg6MCkpOy8vZHdjX2RkcnBoeV9hcGJfcmQoMHg1NDAwMCthZGRfb2Zmc2V0KzEpOwoJCQlyZWdfdmFsdWU9cmVnX3ZhbHVlJjB4ZmY7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfdmFsdWUsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsgICAKCQkJcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLHJlZ19hZGRfb2Zmc2V0LHJlZ192YWx1ZSwoKCgoMHg1NDAwMCsoY291bnQ+PjEpKSkgPDwgMSkrMHhmZTAwMDAwMCkpOwoJCQljb3VudD1jb3VudCsxOwoJCX0KCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxudGltbWluZy5jOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoKCgkJcHJpbnRmKCJcbiBzdGlja3kgcmVnaXN0ZXI6ICIpOwoJCXsKCQkJdWludDMyX3QgbG9vcF9tYXggPSAwOwoJCQlsb29wX21heD02NDw8MjsvL3NpemVvZihkZHJfc2V0X3QpOwoJCQkvL3VpbnQzMl90IGxvb3AgPSAwOwoJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wX21heDsgY291bnQrPTQpIHsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZF9yZWcoKHVpbnQ2NF90KShwX2Rldi0+cF9kZHJzKSArIGNvdW50KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAgIAoJCQkJLy8JY291bnQ9Y291bnQrNDsKCQkJCXByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShHMTJfRE1DX1NUSUNLWV8wKSArIGNvdW50KSwoKEcxMl9ETUNfU1RJQ0tZXzApICsgY291bnQpKTsKCQkJfQoJCX0KCgp7CgkJCXVpbnQzMl90IGxvb3BfbWF4ID0gMDsKCQkJbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7CgkJCXVpbnQzMl90IGNvdW50ID0gMDsKCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbG9vcF9tYXg7ICkgewoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRfaGV4KGNvdW50LDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7IAoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0cygiOiAiLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJkX3JlZygodWludDY0X3QpKHBfZGV2LT5wX2RkcnMpICsgY291bnQpLDMyLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7ICAgCgkJCQlwcmludGYoIlxuJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBjb3VudCkpOwoJCQkJCWNvdW50PWNvdW50KzQ7CgkJCQkvL3ByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShHMTJfRE1DX1NUSUNLWV8wKSArIGNvdW50KSwoKEcxMl9ETUNfU1RJQ0tZXzApICsgY291bnQpKTsKCQkJfQoJCX0KCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRzKCJcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKfQoKCXByaW50ZigiXG4gIik7CgoKCS8vZGRyX3NldF90ICpkZHJfc2V0X3RfcDsKCS8vZGRyX3NldF90X3A9IChkZHJfc2V0X3QgKilHMTJfRE1DX1NUSUNLWV8wOwoJCXsKCgkvL2Rkcl9zZXRfdF9wLT5kZHJfZnVuYzsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJLy91bnNpZ25lZAlsb25nCXJzdl9sb25nMFsyXTsKCS8qIHYxIGVuZCAqLwovLwkvKgoKCi8vCWRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxNl07Ci8vCWRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVs3Ml07Ci8vCWRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbMTZdOwovLwkqLwovLwlkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5WzcyXTsKLy8JZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdOwovLwlkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmWzMyXTsKLy8JZGRyX3NldF90X3AtPmRyYW1fYml0X3ZyZWZbMzJdOwoJLy8vKgovLwlkZHJfc2V0X3RfcC0+ZHFfZHFzX2RlbGF5X2ZsYWc7Ly9yZWFkX2RxcyAgcmVhZF9kcSx3cml0ZV9kcXMsIHdyaXRlX2RxCi8vCWRkcl9zZXRfdF9wLT5kZmlfbXJsOwovLwlkZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybDsKLy8JZGRyX3NldF90X3AtPkFSZFB0ckluaXRWYWw7CgkJfQoJdWludDMyX3QgdGVtcF9jb3VudD0wOwoJewoKCnByaW50ZigiXG4ubWFnaWM9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+bWFnaWMsZGRyX3NldF90X3AtPm1hZ2ljKTsKZm9yKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw0O3RlbXBfY291bnQrKykKcHJpbnRmKCJcbi5mYXN0X2Jvb3RbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+ZmFzdF9ib290W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbdGVtcF9jb3VudF0pOwovL3ByaW50ZigiXG4ucnN2X2ludDA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cnN2X2ludDAsZGRyX3NldF90X3AtPnJzdl9pbnQwKTsKcHJpbnRmKCJcbi5ib2FyZF9pZD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5ib2FyZF9pZCxkZHJfc2V0X3RfcC0+Ym9hcmRfaWQpOwpwcmludGYoIlxuLnZlcnNpb249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dmVyc2lvbixkZHJfc2V0X3RfcC0+dmVyc2lvbik7CnByaW50ZigiXG4uRHJhbVR5cGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RHJhbVR5cGUsZGRyX3NldF90X3AtPkRyYW1UeXBlKTsKcHJpbnRmKCJcbi5EaXNhYmxlZERieXRlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRpc2FibGVkRGJ5dGUsZGRyX3NldF90X3AtPkRpc2FibGVkRGJ5dGUpOwpwcmludGYoIlxuLklzMlR0aW1pbmc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+SXMyVHRpbWluZyxkZHJfc2V0X3RfcC0+SXMyVHRpbWluZyk7CnByaW50ZigiXG4uSGR0Q3RybD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5IZHRDdHJsLGRkcl9zZXRfdF9wLT5IZHRDdHJsKTsKcHJpbnRmKCJcbi5kcmFtX3JhbmtfY29uZmlnPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fcmFua19jb25maWcsZGRyX3NldF90X3AtPmRyYW1fcmFua19jb25maWcpOwpwcmludGYoIlxuLmRpYWdub3NlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRpYWdub3NlLGRkcl9zZXRfdF9wLT5kaWFnbm9zZSk7CnByaW50ZigiXG4uaW1lbV9sb2FkX2FkZHI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+aW1lbV9sb2FkX2FkZHIsZGRyX3NldF90X3AtPmltZW1fbG9hZF9hZGRyKTsKcHJpbnRmKCJcbi5kbWVtX2xvYWRfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kbWVtX2xvYWRfYWRkcixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX2FkZHIpOwpwcmludGYoIlxuLmltZW1fbG9hZF9zaXplPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmltZW1fbG9hZF9zaXplLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfc2l6ZSk7CnByaW50ZigiXG4uZG1lbV9sb2FkX3NpemU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX3NpemUsZGRyX3NldF90X3AtPmRtZW1fbG9hZF9zaXplKTsKcHJpbnRmKCJcbi5kZHJfYmFzZV9hZGRyPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9iYXNlX2FkZHIsZGRyX3NldF90X3AtPmRkcl9iYXNlX2FkZHIpOwpwcmludGYoIlxuLmRkcl9zdGFydF9vZmZzZXQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX3N0YXJ0X29mZnNldCxkZHJfc2V0X3RfcC0+ZGRyX3N0YXJ0X29mZnNldCk7CnByaW50ZigiXG4uZHJhbV9jczBfc2l6ZV9NQj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2NzMF9zaXplX01CLGRkcl9zZXRfdF9wLT5kcmFtX2NzMF9zaXplX01CKTsKcHJpbnRmKCJcbi5kcmFtX2NzMV9zaXplX01CPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fY3MxX3NpemVfTUIsZGRyX3NldF90X3AtPmRyYW1fY3MxX3NpemVfTUIpOwpwcmludGYoIlxuLnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMF0sZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXSk7CnByaW50ZigiXG4udHJhaW5pbmdfU2VxdWVuY2VDdHJsWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFsxXSxkZHJfc2V0X3RfcC0+dHJhaW5pbmdfU2VxdWVuY2VDdHJsWzFdKTsKcHJpbnRmKCJcbi5waHlfb2R0X2NvbmZpZ19yYW5rWzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnBoeV9vZHRfY29uZmlnX3JhbmtbMF0sZGRyX3NldF90X3AtPnBoeV9vZHRfY29uZmlnX3JhbmtbMF0pOwpwcmludGYoIlxuLnBoeV9vZHRfY29uZmlnX3JhbmtbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1sxXSxkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1sxXSk7CnByaW50ZigiXG4ucmV2ZXIxPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJldmVyMSxkZHJfc2V0X3RfcC0+cmV2ZXIxKTsKcHJpbnRmKCJcbi5yZXZlcjI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIyLGRkcl9zZXRfdF9wLT5yZXZlcjIpOwovLwl1bnNpZ25lZAljaGFyCXBoeV9vZHRfY29uZmlnX3JhbmtbMl07Ci8vCXVuc2lnbmVkCWNoYXIJIGRkcl9mYXN0X2Jvb3RfZnVuY3Rpb247Ci8vCXVuc2lnbmVkCWNoYXIJIGRxc19vZmZzZXRfdmFsdWU7CnByaW50ZigiXG4uZGZpX29kdF9jb25maWc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX29kdF9jb25maWcsZGRyX3NldF90X3AtPmRmaV9vZHRfY29uZmlnKTsKcHJpbnRmKCJcbi5EUkFNRnJlcVswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVswXSxkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMF0pOwpwcmludGYoIlxuLkRSQU1GcmVxWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzFdLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVsxXSk7CnByaW50ZigiXG4uRFJBTUZyZXFbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMl0sZGRyX3NldF90X3AtPkRSQU1GcmVxWzJdKTsKcHJpbnRmKCJcbi5EUkFNRnJlcVszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVszXSxkZHJfc2V0X3RfcC0+RFJBTUZyZXFbM10pOwpwcmludGYoIlxuLlBsbEJ5cGFzc0VuPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPlBsbEJ5cGFzc0VuLGRkcl9zZXRfdF9wLT5QbGxCeXBhc3NFbik7CnByaW50ZigiXG4uZGRyX3JkYmlfd3JfZW5hYmxlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9yZGJpX3dyX2VuYWJsZSxkZHJfc2V0X3RfcC0+ZGRyX3JkYmlfd3JfZW5hYmxlKTsKcHJpbnRmKCJcbi5kZHJfcmZjX3R5cGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX3JmY190eXBlLGRkcl9zZXRfdF9wLT5kZHJfcmZjX3R5cGUpOwpwcmludGYoIlxuLmVuYWJsZV9scGRkcjR4X21vZGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZW5hYmxlX2xwZGRyNHhfbW9kZSxkZHJfc2V0X3RfcC0+ZW5hYmxlX2xwZGRyNHhfbW9kZSk7CnByaW50ZigiXG4ucGxsX3NzY19tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnBsbF9zc2NfbW9kZSxkZHJfc2V0X3RfcC0+cGxsX3NzY19tb2RlKTsKcHJpbnRmKCJcbi5jbGtfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5jbGtfZHJ2X29obSxkZHJfc2V0X3RfcC0+Y2xrX2Rydl9vaG0pOwpwcmludGYoIlxuLmNzX2Rydl9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Y3NfZHJ2X29obSxkZHJfc2V0X3RfcC0+Y3NfZHJ2X29obSk7CnByaW50ZigiXG4uYWNfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19kcnZfb2htLGRkcl9zZXRfdF9wLT5hY19kcnZfb2htKTsKcHJpbnRmKCJcbi5zb2NfZGF0YV9kcnZfb2htX3A9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfZHJ2X29obV9wLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX3ApOwpwcmludGYoIlxuLnNvY19kYXRhX2Rydl9vaG1fbj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX24sZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fbik7CnByaW50ZigiXG4uc29jX2RhdGFfb2R0X29obV9wPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fcCxkZHJfc2V0X3RfcC0+c29jX2RhdGFfb2R0X29obV9wKTsKcHJpbnRmKCJcbi5zb2NfZGF0YV9vZHRfb2htX249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfb2R0X29obV9uLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX24pOwpwcmludGYoIlxuLmRyYW1fZGF0YV9kcnZfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV9kcnZfb2htLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfZHJ2X29obSk7CnByaW50ZigiXG4uZHJhbV9kYXRhX29kdF9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX29kdF9vaG0sZGRyX3NldF90X3AtPmRyYW1fZGF0YV9vZHRfb2htKTsKcHJpbnRmKCJcbi5kcmFtX2FjX29kdF9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9hY19vZHRfb2htLGRkcl9zZXRfdF9wLT5kcmFtX2FjX29kdF9vaG0pOwpwcmludGYoIlxuLnNvY19jbGtfc2xld19yYXRlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19jbGtfc2xld19yYXRlLGRkcl9zZXRfdF9wLT5zb2NfY2xrX3NsZXdfcmF0ZSk7CnByaW50ZigiXG4uc29jX2NzX3NsZXdfcmF0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlKTsKcHJpbnRmKCJcbi5zb2NfYWNfc2xld19yYXRlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19hY19zbGV3X3JhdGUsZGRyX3NldF90X3AtPnNvY19hY19zbGV3X3JhdGUpOwpwcmludGYoIlxuLnNvY19kYXRhX3NsZXdfcmF0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9zbGV3X3JhdGUsZGRyX3NldF90X3AtPnNvY19kYXRhX3NsZXdfcmF0ZSk7CnByaW50ZigiXG4udnJlZl9vdXRwdXRfcGVybWlsID0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwgLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwgKTsKcHJpbnRmKCJcbi52cmVmX3JlY2VpdmVyX3Blcm1pbCA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dnJlZl9yZWNlaXZlcl9wZXJtaWwgLGRkcl9zZXRfdF9wLT52cmVmX3JlY2VpdmVyX3Blcm1pbCApOwpwcmludGYoIlxuLnZyZWZfZHJhbV9wZXJtaWw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dnJlZl9kcmFtX3Blcm1pbCxkZHJfc2V0X3RfcC0+dnJlZl9kcmFtX3Blcm1pbCk7CnByaW50ZigiXG4ubWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5PTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPm1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeSxkZHJfc2V0X3RfcC0+bWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5KTsKcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVswXSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMF0pOwpwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzFdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVsxXSk7CnByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMl0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzJdKTsKcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVszXSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbM10pOwpwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzRdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs0XSk7CnByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNV0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzVdKTsKcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs2XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNl0pOwpwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzddLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs3XSk7CnByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOF0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzhdKTsKcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs5XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOV0pOwpwcmludGYoIlxuLmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+bHBkZHI0X2RyYW1fdm91dF92b2x0YWdlXzFfM18yXzVfc2V0dGluZyxkZHJfc2V0X3RfcC0+bHBkZHI0X2RyYW1fdm91dF92b2x0YWdlXzFfM18yXzVfc2V0dGluZyk7CnByaW50ZigiXG4ubHBkZHI0X3g4X21vZGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+bHBkZHI0X3g4X21vZGUsZGRyX3NldF90X3AtPmxwZGRyNF94OF9tb2RlKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzBdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMF0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxXSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzJdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzNdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbM10pOwpwcmludGYoIlxuLmFjX3Bpbm11eFs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs0XSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs1XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzVdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzZdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNl0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbN10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs3XSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs4XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzhdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzldLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbOV0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsxMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEwXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEwXSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTFdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTFdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMTJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMl0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsxM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEzXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEzXSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTRdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTRdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMTVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNV0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE2XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE2XSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzE3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTddLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTddKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMThdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOF0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsxOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE5XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE5XSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzIwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjBdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjBdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMjFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMV0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsyMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIyXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIyXSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzIzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjNdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjNdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMjRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNF0pOwpwcmludGYoIlxuLmFjX3Bpbm11eFsyNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI1XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI1XSk7CnByaW50ZigiXG4uYWNfcGlubXV4WzI2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjZdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjZdKTsKcHJpbnRmKCJcbi5hY19waW5tdXhbMjddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyN10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyN10pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFswXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFswXSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzFdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzFdKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMl0pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFszXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFszXSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzRdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzRdKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNV0pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs2XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs2XSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzddLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzddKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOF0pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs5XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs5XSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsxMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTBdKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzExXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMV0pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbMTJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTJdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzEyXSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsxM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxM10sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTNdKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE0XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNF0pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbMTVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTVdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE1XSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTZdKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE3XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxN10pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbMThdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMThdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE4XSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsxOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxOV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTldKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzIwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIwXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMF0pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbMjFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjFdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIxXSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsyMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjJdKTsKcHJpbnRmKCJcbi5kZmlfcGlubXV4WzIzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIzXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyM10pOwpwcmludGYoIlxuLmRmaV9waW5tdXhbMjRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjRdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzI0XSk7CnByaW50ZigiXG4uZGZpX3Bpbm11eFsyNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyNV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjVdKTsKcHJpbnRmKCJcbi5zbHRfdGVzdF9mdW5jdGlvblswXSAgPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzBdICAsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzBdICApOwpwcmludGYoIlxuLnNsdF90ZXN0X2Z1bmN0aW9uWzFdICA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c2x0X3Rlc3RfZnVuY3Rpb25bMV0gICxkZHJfc2V0X3RfcC0+c2x0X3Rlc3RfZnVuY3Rpb25bMV0gICk7CnByaW50ZigiXG4udGRxczJkcT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT50ZHFzMmRxLGRkcl9zZXRfdF9wLT50ZHFzMmRxKTsKcHJpbnRmKCJcbi5kcmFtX2RhdGFfd3Jfb2R0X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfd3Jfb2R0X29obSxkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX3dyX29kdF9vaG0pOwpwcmludGYoIlxuLmJpdFRpbWVDb250cm9sXzJkPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmJpdFRpbWVDb250cm9sXzJkLGRkcl9zZXRfdF9wLT5iaXRUaW1lQ29udHJvbF8yZCk7CnByaW50ZigiXG4uZGRyX2RtY19yZW1hcFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdKTsKcHJpbnRmKCJcbi5kZHJfZG1jX3JlbWFwWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMV0sZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMV0pOwpwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsyXSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsyXSk7CnByaW50ZigiXG4uZGRyX2RtY19yZW1hcFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdKTsKcHJpbnRmKCJcbi5kZHJfZG1jX3JlbWFwWzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbNF0sZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbNF0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2NhX3JlbWFwWzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzBdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFswXSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfY2FfcmVtYXBbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzFdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMl0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2NhX3JlbWFwWzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzNdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFszXSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzBdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMV0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzJdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyXSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzNdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNF0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzVdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs1XSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzZdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbN10pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzhdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs4XSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzldKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTBdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzExXSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTJdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTNdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM10pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE0XSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE1XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTVdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTZdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxN10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE3XSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMThdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE4XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMThdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTldLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzIwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIwXSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIxXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjFdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjJdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzIzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIzXSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI0XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjRdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjVdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI2XSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI3XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjddKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjhdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF0pOwpwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI5XSk7CnByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMwXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzBdKTsKcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV0pOwpwcmludGYoIlxuLmRyYW1fcnR0X25vbV93cl9wYXJrWzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzBdLGRkcl9zZXRfdF9wLT5kcmFtX3J0dF9ub21fd3JfcGFya1swXSk7CnByaW50ZigiXG4uZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV0sZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzFdKTsKcHJpbnRmKCJcbi5kZHJfZnVuYz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZnVuYyxkZHJfc2V0X3RfcC0+ZGRyX2Z1bmMpOwoKLyoKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVswXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMF0pOwpwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzFdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxXSk7CnByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMl0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzJdKTsKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVszXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbM10pOwpwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzRdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs0XSk7CnByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbNV0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzVdKTsKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs2XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbNl0pOwpwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzddLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs3XSk7CnByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbOF0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzhdKTsKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs5XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbOV0pOwpwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzEwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxMF0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzEwXSk7CnByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbMTFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzExXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTFdKTsKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVsxMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTJdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxMl0pOwpwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzEzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxM10sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzEzXSk7CnByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbMTRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzE0XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTRdKTsKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVsxNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTVdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxNV0pOwpwcmludGYoIlxuLnJlYWRfZHFfYml0X2RlbGF5WzcyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVs3Ml0sZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5WzcyXSk7CnByaW50ZigiXG4ud3JpdGVfZHFzX2RlbGF5WzE2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbMTZdLGRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbMTZdKTsKcHJpbnRmKCJcbi53cml0ZV9kcV9iaXRfZGVsYXlbNzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVs3Ml0sZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVs3Ml0pOwpwcmludGYoIlxuLnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19nYXRlX2RlbGF5WzE2XSk7CnByaW50ZigiXG4uc29jX2JpdF92cmVmWzMyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbMzJdLGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbMzJdKTsKcHJpbnRmKCJcbi5kcmFtX2JpdF92cmVmWzMyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmWzMyXSxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlszMl0pOwpwcmludGYoIlxuLmRxX2Rxc19kZWxheV9mbGFnPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRxX2Rxc19kZWxheV9mbGFnLGRkcl9zZXRfdF9wLT5kcV9kcXNfZGVsYXlfZmxhZyk7CnByaW50ZigiXG4uZGZpX21ybD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfbXJsLGRkcl9zZXRfdF9wLT5kZmlfbXJsKTsKcHJpbnRmKCJcbi5kZmlfaHd0bXJsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9od3RtcmwsZGRyX3NldF90X3AtPmRmaV9od3RtcmwpOwpwcmludGYoIlxuLkFSZFB0ckluaXRWYWw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCxkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCk7CgoKKi8KCgovL3ByaW50ZigiXG4ucmVhZF9kcV9iaXRfZGVsYXlbNzJdPSVkLCIsZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5WzcyXSk7Ci8vcHJpbnRmKCJcbi53cml0ZV9kcXNfZGVsYXlbMTZdPSVkLCIsZGRyX3NldF90X3AtPndyaXRlX2Rxc19kZWxheVsxNl0pOwovL3ByaW50ZigiXG4ud3JpdGVfZHFfYml0X2RlbGF5WzcyXT0lZCwiLGRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbNzJdKTsKLy9wcmludGYoIlxuLnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdPSVkLCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdKTsKLy9wcmludGYoIlxuLnNvY19iaXRfdnJlZlszMl09JWQsIixkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmWzMyXSk7Ci8vcHJpbnRmKCJcbi5kcmFtX2JpdF92cmVmWzMyXT0lZCwiLGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmWzMyXSk7Ci8vcHJpbnRmKCJcbi5kcV9kcXNfZGVsYXlfZmxhZz0lZCwiLGRkcl9zZXRfdF9wLT5kcV9kcXNfZGVsYXlfZmxhZyk7Ci8vcHJpbnRmKCJcbi5kZmlfbXJsPSVkLCIsZGRyX3NldF90X3AtPmRmaV9tcmwpOwovL3ByaW50ZigiXG4uZGZpX2h3dG1ybD0lZCwiLGRkcl9zZXRfdF9wLT5kZmlfaHd0bXJsKTsKLy9wcmludGYoIlxuLkFSZFB0ckluaXRWYWw9JWQsIixkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCk7Cgpmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDE2O3RlbXBfY291bnQrKykKcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbdGVtcF9jb3VudF0pOwpmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDcyO3RlbXBfY291bnQrKykKcHJpbnRmKCJcbi5yZWFkX2RxX2JpdF9kZWxheVslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+cmVhZF9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0pOwpmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDE2O3RlbXBfY291bnQrKykKLy9wcmludGYoIlxuLndyaXRlX2Rxc19kZWxheVslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbdGVtcF9jb3VudF0pOwpwcmludGYoIlxuLndyaXRlX2Rxc19kZWxheVslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPndyaXRlX2Rxc19kZWxheVt0ZW1wX2NvdW50XSk7CmZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8NzI7dGVtcF9jb3VudCsrKQovL3ByaW50ZigiXG4ud3JpdGVfZHFfYml0X2RlbGF5WyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSk7CnByaW50ZigiXG4ud3JpdGVfZHFfYml0X2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdKTsKZm9yKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwxNjt0ZW1wX2NvdW50KyspCi8vcHJpbnRmKCJcbi5yZWFkX2Rxc19nYXRlX2RlbGF5WyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbdGVtcF9jb3VudF0pOwpwcmludGYoIlxuLnJlYWRfZHFzX2dhdGVfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0ZW1wX2NvdW50XSk7CmZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MzI7dGVtcF9jb3VudCsrKQovL3ByaW50ZigiXG4uc29jX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CnByaW50ZigiXG4uc29jX2JpdF92cmVmWyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmW3RlbXBfY291bnRdKTsKZm9yKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwzMjt0ZW1wX2NvdW50KyspCi8vcHJpbnRmKCJcbi5kcmFtX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmRyYW1fYml0X3ZyZWZbdGVtcF9jb3VudF0pOwpwcmludGYoIlxuLmRyYW1fYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CgovL2Rkcl9zZXRfdF9wLT5kcV9kcXNfZGVsYXlfZmxhZz0weGZmOwpwcmludGYoIlxuLnJldmVyMz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZXZlcjMsZGRyX3NldF90X3AtPnJldmVyMyk7CnByaW50ZigiXG4uZGZpX21ybD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfbXJsLGRkcl9zZXRfdF9wLT5kZmlfbXJsKTsKcHJpbnRmKCJcbi5kZmlfaHd0bXJsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9od3RtcmwsZGRyX3NldF90X3AtPmRmaV9od3RtcmwpOwpwcmludGYoIlxuLkFSZFB0ckluaXRWYWw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCxkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCk7Cgpmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDE2O3RlbXBfY291bnQrKykKLy9wcmludGYoIlxuLmRyYW1fYml0X3ZyZWZbJWRdPSVkLCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CnByaW50ZigiXG4ucmV0cmFpbmluZ1slZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5yZXRyYWluaW5nW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5yZXRyYWluaW5nW3RlbXBfY291bnRdKTsKCgpwcmludGYoIlxuIik7Ci8qCgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5tYWdpYzolMDh4IixkZHJfc2V0X3RfcC0+bWFnaWMpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+cnN2X2ludDA6JTA4eCIsZGRyX3NldF90X3AtPnJzdl9pbnQwKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmJvYXJkX2lkOiUwOHgiLGRkcl9zZXRfdF9wLT5ib2FyZF9pZCk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT52ZXJzaW9uOiUwOHgiLGRkcl9zZXRfdF9wLT52ZXJzaW9uKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPkRyYW1UeXBlOiUwOHgiLGRkcl9zZXRfdF9wLT5EcmFtVHlwZSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5EaXNhYmxlZERieXRlOiUwOHgiLGRkcl9zZXRfdF9wLT5EaXNhYmxlZERieXRlKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPklzMlR0aW1pbmc6JTA4eCIsZGRyX3NldF90X3AtPklzMlR0aW1pbmcpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+SGR0Q3RybDolMDh4IixkZHJfc2V0X3RfcC0+SGR0Q3RybCk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kcmFtX3JhbmtfY29uZmlnOiUwOHgiLGRkcl9zZXRfdF9wLT5kcmFtX3JhbmtfY29uZmlnKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRpYWdub3NlOiUwOHgiLGRkcl9zZXRfdF9wLT5kaWFnbm9zZSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfYWRkcjolMDh4IixkZHJfc2V0X3RfcC0+aW1lbV9sb2FkX2FkZHIpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX2FkZHI6JTA4eCIsZGRyX3NldF90X3AtPmRtZW1fbG9hZF9hZGRyKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmltZW1fbG9hZF9zaXplOiUwOHgiLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfc2l6ZSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kbWVtX2xvYWRfc2l6ZTolMDh4IixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX3NpemUpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2Jhc2VfYWRkcjolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX2Jhc2VfYWRkcik7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfc3RhcnRfb2Zmc2V0OiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfc3RhcnRfb2Zmc2V0KTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRyYW1fY3MwX3NpemVfTUI6JTA4eCIsZGRyX3NldF90X3AtPmRyYW1fY3MwX3NpemVfTUIpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZHJhbV9jczFfc2l6ZV9NQjolMDh4IixkZHJfc2V0X3RfcC0+ZHJhbV9jczFfc2l6ZV9NQik7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMF06JTA4eCIsZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMV06JTA4eCIsZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFsxXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzBdOiUwOHgiLGRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzBdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPnBoeV9vZHRfY29uZmlnX3JhbmtbMV06JTA4eCIsZGRyX3NldF90X3AtPnBoeV9vZHRfY29uZmlnX3JhbmtbMV0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1syXTolMDh4IixkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1syXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzNdOiUwOHgiLGRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzNdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRmaV9vZHRfY29uZmlnOiUwOHgiLGRkcl9zZXRfdF9wLT5kZmlfb2R0X2NvbmZpZyk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5EUkFNRnJlcVswXTolMDh4IixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMF0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+RFJBTUZyZXFbMV06JTA4eCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzFdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPkRSQU1GcmVxWzJdOiUwOHgiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVsyXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5EUkFNRnJlcVszXTolMDh4IixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbM10pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+UGxsQnlwYXNzRW46JTA4eCIsZGRyX3NldF90X3AtPlBsbEJ5cGFzc0VuKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9yZGJpX3dyX2VuYWJsZTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX3JkYmlfd3JfZW5hYmxlKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9yZmNfdHlwZTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX3JmY190eXBlKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmVuYWJsZV9scGRkcjR4X21vZGU6JTA4eCIsZGRyX3NldF90X3AtPmVuYWJsZV9scGRkcjR4X21vZGUpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+cGxsX3NzY19tb2RlOiUwOHgiLGRkcl9zZXRfdF9wLT5wbGxfc3NjX21vZGUpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+Y2xrX2Rydl9vaG06JTA4eCIsZGRyX3NldF90X3AtPmNsa19kcnZfb2htKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmNzX2Rydl9vaG06JTA4eCIsZGRyX3NldF90X3AtPmNzX2Rydl9vaG0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+YWNfZHJ2X29obTolMDh4IixkZHJfc2V0X3RfcC0+YWNfZHJ2X29obSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX3A6JTA4eCIsZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fcCk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX246JTA4eCIsZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fbik7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX3A6JTA4eCIsZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fcCk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX246JTA4eCIsZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fbik7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfZHJ2X29obTolMDh4IixkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX2Rydl9vaG0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX29kdF9vaG06JTA4eCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV9vZHRfb2htKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRyYW1fYWNfb2R0X29obTolMDh4IixkZHJfc2V0X3RfcC0+ZHJhbV9hY19vZHRfb2htKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPnNvY19jbGtfc2xld19yYXRlOiUwOHgiLGRkcl9zZXRfdF9wLT5zb2NfY2xrX3NsZXdfcmF0ZSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlOiUwOHgiLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPnNvY19hY19zbGV3X3JhdGU6JTA4eCIsZGRyX3NldF90X3AtPnNvY19hY19zbGV3X3JhdGUpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+c29jX2RhdGFfc2xld19yYXRlOiUwOHgiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9zbGV3X3JhdGUpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+dnJlZl9vdXRwdXRfcGVybWlsOiUwOHgiLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+dnJlZl9yZWNlaXZlcl9wZXJtaWw6JTA4eCIsZGRyX3NldF90X3AtPnZyZWZfcmVjZWl2ZXJfcGVybWlsKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPnZyZWZfZHJhbV9wZXJtaWw6JTA4eCIsZGRyX3NldF90X3AtPnZyZWZfZHJhbV9wZXJtaWwpOwogICAgICAgIHByaW50ZigiXG5kZHJfc2V0X3RfcC0+bWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5OiUwOHgiLGRkcl9zZXRfdF9wLT5tYXhfY29yZV90aW1tbWluZ19mcmVxdWVuY3kpOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMF06JTA4eCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzBdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzFdOiUwOHgiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVsxXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVsyXTolMDh4IixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMl0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbM106JTA4eCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzNdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzRdOiUwOHgiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs0XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs1XTolMDh4IixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNV0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNl06JTA4eCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzZdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzddOiUwOHgiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs3XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs4XTolMDh4IixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOF0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOV06JTA4eCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzldKTsKICAgICAgICBwcmludGYoIlxuZGRyX3NldF90X3AtPmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmc6JTA4eCIsZGRyX3NldF90X3AtPmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmcpOwogICAgICAgIHByaW50ZigiXG5kZHJfc2V0X3RfcC0+bHBkZHI0X3g4X21vZGU6JTA4eCIsZGRyX3NldF90X3AtPmxwZGRyNF94OF9tb2RlKTsKCQkvL3ByaW50ZigiXG5kZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI2XTolMDh4IixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI2XSk7CgkJLy9wcmludGYoIlxuZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjhdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzI4XSk7CgkJLy9wcmludGYoIlxuZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzJdOiUwOHgiLGRkcl9zZXRfdF9wLT5zbHRfdGVzdF9mdW5jdGlvblsyXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kcV9iZGxyX29yZzolMDh4IixkZHJfc2V0X3RfcC0+ZHFfYmRscl9vcmcpOwogICAgICAgIHByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX3dyX29kdF9vaG06JTA4eCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV93cl9vZHRfb2htKTsKICAgICAgICBwcmludGYoIlxuZGRyX3NldF90X3AtPmJpdFRpbWVDb250cm9sXzJkOiUwOHgiLGRkcl9zZXRfdF9wLT5iaXRUaW1lQ29udHJvbF8yZCk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMV0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsyXTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsyXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbNF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbNF0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzFdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsxXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMl0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbM106JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzBdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFswXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMV0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMl06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzJdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzNdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNF0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzVdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzZdOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs2XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XTolMDh4IixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbN10pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzhdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzldOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs5XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEwXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzExXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMl06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEyXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM106JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEzXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE0XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE1XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE2XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxN106JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE3XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE4XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE5XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIwXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIxXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIyXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyM106JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIzXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI0XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI1XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNl06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI2XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyN106JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI3XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI4XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI5XSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMF06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMwXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV06JTA4eCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMxXSk7CgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5kcmFtX3J0dF9ub21fd3JfcGFya1swXTolMDh4IixkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMF0pOwoJCXByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV06JTA4eCIsZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzFdKTsKCQlwcmludGYoIlxuZGRyX3NldF90X3AtPmRkcl9mdW5jOiUwOHgiLGRkcl9zZXRfdF9wLT5kZHJfZnVuYyk7CgkJLy9wcmludGYoIlxuZGRyX3NldF90X3AtPnJzdl9sb25nMFsyXTolMDh4IixkZHJfc2V0X3RfcC0+cnN2X2xvbmcwWzJdKTsKCQkvL3ByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZHFzX2FkanVzdFsxNl06JTA4eCIsZGRyX3NldF90X3AtPmRxc19hZGp1c3RbMTZdKTsKCQkvL3ByaW50ZigiXG5kZHJfc2V0X3RfcC0+ZHFfYml0X2RlbGF5WzcyXTolMDh4IixkZHJfc2V0X3RfcC0+ZHFfYml0X2RlbGF5WzcyXSk7CiovCgl9CgoKCglyZXR1cm4gMTsKCgp9CgoKaW50IGRvX2Rkcl9mYXN0Ym9vdF9jb25maWcoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoJaW50IGk9MDsKCWludCBjb3VudD0wOwoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCBlbmFibGVfZGRyX2Zhc3RfYm9vdD0wOyAgLy8gMCBwYXVzZSAxLHJlc3VtZQoKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCWlmIChhcmdjID09IDEpCgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJZWxzZSBpZiAoYXJnYyA+IDEpCgl7CgkJCWNvdW50PTA7CgkJCWVuYWJsZV9kZHJfZmFzdF9ib290PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJZW5hYmxlX2Rkcl9mYXN0X2Jvb3QgPSAwOwoJCQl9CgkJCS8vCWNvdW50Kys7CgkJfQoJaWYoIWVuYWJsZV9kZHJfZmFzdF9ib290KQoJCXJldHVybiAxOwoJZGRyX3NldF90ICpkZHJfc2V0X3RfcD1OVUxMOwoJZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJLy9kZHJfc2V0X3RfcD0gKGRkcl9zZXRfdCAqKUcxMl9ETUNfU1RJQ0tZXzA7CgkvL2lmIChzaXplb2YoZGRyX3NldF90KTxsb29wX21heCkKCXVpbnQzMl90ICBkZHJfc2V0X2FkZD0wOwoJdWludDMyX3QgIGRkcl9zZXRfc2l6ZT0wOwoJZGRyX3NldF9hZGQ9KHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApOwoJZGRyX3NldF9zaXplPXNpemVvZihkZHJfc2V0X3QpOwoJcHJpbnRmKCJcbmRkcl9zZXRfdF9wPT0weCUwOHhcbiIsZGRyX3NldF9hZGQpOwoJdWludDMyX3QgbG9vcD0wOyAKCXVpbnQzMl90IGxvb3BfbWF4ID0gKDQrKDB4M2Y8PDIpKTsvLygoRE1DX1NUSUNLWV82My1ETUNfU1RJQ0tZXzApKTsKCQkJLy8JbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7CgkJCWZvciAobG9vcCA9IDA7IGxvb3AgPGxvb3BfbWF4OyBsb29wKz00KSB7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkoZGRyX3NldF90X3ApICsgbG9vcCksIHJkX3JlZyhHMTJfRE1DX1NUSUNLWV8wICsgbG9vcCkpOwoJCQl9CgkKCQkJCnsKCQl1aW50MTZfdAlkcV9iaXRfZGVsYXlbNzJdOwoJCXVuc2lnbmVkCWNoYXIgdF9jb3VudD0wOwoJCXVpbnQxNl90ICBkZWxheV9vcmc9MDsKCQl1aW50MTZfdCAgZGVsYXlfdGVtcD0wOwoJCXVpbnQzMl90ICBhZGRfb2Zmc2V0PTA7CgkJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwweDApOwoKY2hhciBkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MDsKCQljaGFyIGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD0wOwoKewoJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMHhkPDwxNil8KDA8PDEyKXwoMHgwKSwwKTsgLy8gRFdDX0REUlBIWUFfQVBCT05MWTBfTWljcm9Db250TXV4U2VsCgoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMikpOwoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMykpOwoJaWYoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PjMwKQoJCWRtY190ZXN0X3dvcnN0X3dpbmRvd190eD0zMDsKCWlmKGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD4zMCkKCQlkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MzA7Ci8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMiksdDRfd3JpdGVfd29yc3RfbWFyZ2luX3JhbmsxKTsKLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MWMzKSx0NF9yZWFkX3dvcnN0X21hcmdpbl9yYW5rMSk7CmRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMV09KCgoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4LzIpPDw0KSl8KCgoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4LzIpKSk7CgkJCQl9CgkKCgkJewoKCQkJCgoJLy8JcHJpbnRmKCJcbiBBUmRQdHJJbml0VmFsIik7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMDw8MTYpfCgwPDwxMil8KDB4MmUpKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJZGRyX3NldF90X3AtPkFSZFB0ckluaXRWYWw9ZGVsYXlfb3JnOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCQoJLy8JcHJpbnRmKCJcbiBkZmltcmwwIGRmaW1ybDEgZGZpbXJsMiBkZmltcmwzIEh3dE1STCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5kZmlfbXJsPWRlbGF5X29yZzsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDE8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDEsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDI8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDIsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDM8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDMsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCgkJZGRyX3NldF90X3AtPmRmaV9od3Rtcmw9ZGVsYXlfb3JnOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCX0KCXsKCS8vCXByaW50ZigiXG4gY291bnRfaW5kZXggICAgIGRlbGF5X3ZhbHVlICAgICByZWdpc3Rlcl9hZGQgICAgIHJlZ2lzdGVyX3ZhbHVlIFxuICIpOwoJLy8JcHJpbnRmKCJcbiBhZGRyZXNzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAgLS1zdGVwPT0xLzMyVUkgLGJpdCA2IGlzIGNvYXJzZSAgLS1zdGVwPT0xVUkiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDEwO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwodF9jb3VudDw8MTIpfCgweDgwKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCWRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiB0ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOSBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHhkMCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCQoJCQlkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQoJCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByeGRxcyBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLS1zdGVwPT0xLzMyVUksbm8gY29hcnNlIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4YysodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCWRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiB3cml0ZSBkcV9iaXQgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJICxiaXQgNi04IGlzIGNvYXJzZSAgLS1zdGVwPT0xVSIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQkJewoJCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KDB4YzArKCh0X2NvdW50JTkpPDw4KSsodF9jb3VudC8zNikpKTsKCQkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCgkJCQlkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgoJCQkJCgkJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJCX0KCX0KCXsKCS8vCXByaW50ZigiXG4gcmVhZCBkcV9iaXQgZGVsYXkgKiBCRExSeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PWJkbHIgc3RlcCBzaXplIGFib3V0IDVwcyxubyBjb2Fyc2UiLGJkbHJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweDY4KygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oKGRlbGF5X29yZyYweDNmKSk7CgkJCQoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcV9iaXRfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCX0KCXsKCS8vCXByaW50ZigiXG4gcmVhZCBkcXMgZ2F0ZSBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLGJpdCA2LTEwIGlzIGNvYXJzZSIsdWlfMV8zMl8xMDBzdGVwKTsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8MTY7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlOCk+PjEpPDwxMil8KDB4ODArKHRfY291bnQvOCkrKCh0X2NvdW50JTIpPDw4KSkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCgkJCQoJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoKCS8vCXByaW50ZigiXG4gc29jIHZyZWYgOiBscGRkcjQtLSBWUkVGID0gVkREUSooMC4wNDcgKyBWcmVmREFDMFs2OjBdKjAuMDAzNjcgICBERFI0IC0tVlJFRiA9IFZERFEqKDAuNTEwICsgVnJlZkRBQzBbNjowXSowLjAwMzQ1Iik7CgkJLy8oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpCQoJCXVpbnQzMl90IHZyZWZfdF9jb3VudD0wOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoKCh0X2NvdW50JTM2KSU5KTw8OCl8KDB4NDApKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgoZGVsYXlfb3JnKSk7CgppZih0X2NvdW50PDM1KQp7CgkJCXZyZWZfdF9jb3VudD0oKCgodF9jb3VudCUzNikvOSkqOCkrKHRfY291bnQlOSkpOwoKCQkJZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt2cmVmX3RfY291bnRdPWRlbGF5X3RlbXA7Cn0KCgkJCQoJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoKCgovLwlwcmludGYoIlxuIGRyYW0gdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4gICBERFI0IC0tVlJFRiA9IFZERFEqKDAuICsgVnJlZkRBQzBbNjowXSowLiIpOwoJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MDgyKSk7CmRlbGF5X3RlbXA9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDMyO3RfY291bnQrKykKCQl7CgoJCQoJCQlkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0X2NvdW50XT1kZWxheV90ZW1wOwoKCgkJCQoJCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfdGVtcCk7CgoJCQkJCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NDt0X2NvdW50KyspCgkJey8vcF9kZXYtPnBfZGRycy0+dGRxczJkcT1scGRkcjRfdGRxczJkcTsKCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzBdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFhKSk7ICAvL1BwdEN0bFN0YXRpYwoJCS8vZGRyX3NldF90X3AtPnJldHJhaW5pbmdbMV09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4YWUpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazAKCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzJdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzBdPShkd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhYSkpKSYweGZmOyAgLy9QcHRDdGxTdGF0aWMKCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMV09KGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFhKSkpPj44OyAgLy9QcHRDdGxTdGF0aWMKCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMl09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWUpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazAgbGFuZSAwLTMKCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrM109ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWYpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazEgbGFuZSAwLTMKCQl9Cgl9Cn0KCgpjaGFyIHN0clsxMDI0XT0iIjsKLy9zdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4NzdmODFjZjAgMHgzMDAKLy8JcHJpbnRmKCJcbiAiKTsKCgoJCWlmKGVuYWJsZV9kZHJfZmFzdF9ib290PT0xKQoJCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTB4ZmY7CgoJCWlmKGVuYWJsZV9kZHJfZmFzdF9ib290PT0yKQoJCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTA7CgkJCgkJI2lmZGVmIERFQlVHX0REUl9GQVNUQk9PVF9TSEEKCQlwcmludGYoIiZkZHJfc2hhLmRkcnMgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLmRkcnMpOwoJCXByaW50ZigiJmRkcl9zaGEuc2hhMiA6IDB4JXhcbiIsICh1aW50MzJfdCkodWludDY0X3QpJmRkcl9zaGEuc2hhMik7CgkJcHJpbnRmKCJkZHJfc2V0X2FkZCA6IDB4JXhcbiIsICh1aW50MzJfdCkodWludDY0X3QpZGRyX3NldF9hZGQpOwoJCSNlbmRpZgoJCXNoYTI1Nl9jc3VtX3dkKCh1bnNpZ25lZCBjaGFyICopKHVpbnQ2NF90KWRkcl9zZXRfYWRkLCBzaXplb2YoZGRyX3NldF90KSwgZGRyX3NoYS5zaGEyLCAwKTsKCQkjaWZkZWYgREVCVUdfRERSX0ZBU1RCT09UX1NIQQoJCXByaW50ZigicHJpbnQgc2hhXG4iKTsKCQlzcHJpbnRmKHN0ciwibWQgJTA4eCAweDEwMCIsICh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfYWRkLTMyKSk7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCSNlbmRpZgoJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sZGRyX3NldF9zaXplK1NIQTI1Nl9TVU1fTEVOKTsKCSNlbHNlCgkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTik7CgkjZW5kaWYKCQkvLwlzcHJpbnRmKHN0ciwic3RvcmUgZGRyX3BhcmFtZXRlciB3cml0ZSAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCS8vCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoKCglyZXR1cm4gMTsKCgp9CiNlbHNlCmludCBkb19kZHJfZGlzcGxheV9kZHJfaW5mb3JtYXRpb24oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCS8vIGNoYXIgKmVuZHA7CgoJdW5zaWduZWQgaW50IHpxMHByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7Cgl1bnNpZ25lZCBpbnQgenExcHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMVBSKTsKCXVuc2lnbmVkIGludCB6cTJwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEyUFIpOwoJdW5zaWduZWQgaW50IHNvY19hY19kcnYzPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2FjX2RydjRfdXA9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfZHJ2NF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2FjX29kdDM9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfb2R0ND0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMDFfZHJ2Mz0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMDFfZHJ2NF91cD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMDFfZHJ2NF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEwMV9vZHQzPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEwMV9vZHQ0PTA7CgoJdW5zaWduZWQgaW50IHNvY19kYXRhMjNfZHJ2Mz0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMjNfZHJ2NF91cD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMjNfZHJ2NF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEyM19vZHQzPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEyM19vZHQ0PTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9kcnY9MDsKCXVuc2lnbmVkIGludCBkcmFtX29kdD0wOwoJdW5zaWduZWQgaW50IGRyYW1fZGRyNF9kcnY9MDsKCXVuc2lnbmVkIGludCBkcmFtX2RkcjRfb2R0PTA7CgkvL3Vuc2lnbmVkIGludCBzb2NfenFfb2R0X2Rpdj00ODA7CgoJdW5zaWduZWQgaW50IHB1Yl9kY3I9IHJkX3JlZyhERFIwX1BVQl9EQ1IpOwoJdW5zaWduZWQgaW50IHB1Yl9tcjE9IHJkX3JlZyhERFIwX1BVQl9NUjEpOwoJdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwojZGVmaW5lIEREUl9UWVBFX0xQRERSMiAgMAojZGVmaW5lIEREUl9UWVBFX0xQRERSMyAgMQojZGVmaW5lIEREUl9UWVBFX0REUjMgIDMKI2RlZmluZSBERFJfVFlQRV9ERFI0ICA0Cgl1bnNpZ25lZCBpbnQgZGRyX3R5cGU9IHB1Yl9kY3ImMHg3OyAvLzAgLWxwZGRyMiAgfCAgMS0gbHBkZHIzICB8ICAgMi0gcmV2ICB8ICAzIC1kZHIzICAgfCA0LSBkZHI0CgoJewoJCWlmIChkZHJfdHlwZT09MCkKCQkJcHJpbnRmKCJcbmRkcl90eXBlPT1scGRkcjJcbiIpOwoJCWlmIChkZHJfdHlwZT09MSkKCQkJcHJpbnRmKCJcbmRkcl90eXBlPT1scGRkcjNcbiIpOwoJCWlmIChkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJcHJpbnRmKCJcbmRkcl90eXBlPT1kZHIzXG4iKTsKCQlpZiAoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCXByaW50ZigiXG5kZHJfdHlwZT09ZGRyNFxuIik7CgkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJey8vc29jX3pxX29kdF9kaXY9MzYwOwoJCX0KCQlzb2NfYWNfZHJ2Mz16cTBwcl9vcmcmMHhmOwoJCXNvY19hY19vZHQzPSh6cTBwcl9vcmc+PjQpJjB4ZjsKCQlzb2NfYWNfZHJ2NF91cD0oenEwcHJfb3JnPj44KSYweGY7CgkJc29jX2FjX2RydjRfZG93bj0oenEwcHJfb3JnPj4xMikmMHhmOwoJCXNvY19hY19vZHQ0PSh6cTBwcl9vcmc+PjE2KSYweGY7CgoJCXNvY19kYXRhMDFfZHJ2Mz16cTFwcl9vcmcmMHhmOwoJCXNvY19kYXRhMDFfb2R0Mz0oenExcHJfb3JnPj40KSYweGY7CgkJc29jX2RhdGEwMV9kcnY0X3VwPSh6cTFwcl9vcmc+PjgpJjB4ZjsKCQlzb2NfZGF0YTAxX2RydjRfZG93bj0oenExcHJfb3JnPj4xMikmMHhmOwoJCXNvY19kYXRhMDFfb2R0ND0oenExcHJfb3JnPj4xNikmMHhmOwoKCQlzb2NfZGF0YTIzX2RydjM9enEycHJfb3JnJjB4ZjsKCQlzb2NfZGF0YTIzX29kdDM9KHpxMnByX29yZz4+NCkmMHhmOwoJCXNvY19kYXRhMjNfZHJ2NF91cD0oenEycHJfb3JnPj44KSYweGY7CgkJc29jX2RhdGEyM19kcnY0X2Rvd249KHpxMnByX29yZz4+MTIpJjB4ZjsKCQlzb2NfZGF0YTIzX29kdDQ9KHpxMnByX29yZz4+MTYpJjB4ZjsKCgoJCXJlZ192YWx1ZT1wdWJfbXIxOwoJCWlmKCgoKHJlZ192YWx1ZT4+NSkmMSk9PTApKQoJCXsKCQkJaWYoKChyZWdfdmFsdWU+PjEpJjEpPT0wKQoJCQl7CgkJCQlkcmFtX2Rydj00MDsKCQkJCWRyYW1fZGRyNF9kcnY9MzQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkcmFtX2Rydj0zNDsKCQkJCWRyYW1fZGRyNF9kcnY9NDg7CgkJCX0KCQl9CgoJCWlmKCgocmVnX3ZhbHVlPj44KSY3KT09MCkKCQl7CgkJCWRyYW1fZGRyNF9vZHQ9MDsKCQl9CgkJaWYoKChyZWdfdmFsdWU+PjgpJjcpKQoJCXsKCQkJZHJhbV9kZHI0X29kdD0yNDAvKCgocmVnX3ZhbHVlPj4xMCkmMSl8KCgocmVnX3ZhbHVlPj45KSYxKTw8MSl8KCgocmVnX3ZhbHVlPj44KSYxKTw8MikpOwoJCX0KCQlyZWdfdmFsdWU9KCgocmVnX3ZhbHVlPj45KSYxKTw8Mil8KCgocmVnX3ZhbHVlPj42KSYxKTw8MSl8KCgocmVnX3ZhbHVlPj4yKSYxKTw8MCk7CgkJaWYocmVnX3ZhbHVlPT0xKQoJCXsKCQkJZHJhbV9vZHQ9NjA7CgkJfQoJCWlmKHJlZ192YWx1ZT09MikKCQl7CgkJCWRyYW1fb2R0PTEyMDsKCQl9CgkJaWYocmVnX3ZhbHVlPT0zKQoJCXsKCQkJZHJhbV9vZHQ9NDA7CgkJfQoJCWlmKHJlZ192YWx1ZT09NCkKCQl7CgkJCWRyYW1fb2R0PTIwOwoJCX0KCQlpZihyZWdfdmFsdWU9PTUpCgkJewoJCQlkcmFtX29kdD0zMDsKCQl9CQoKCQlwcmludGYoInpxMHByX29yZz09JXgsenExcHJfb3JnPT0leCx6cTJwcl9vcmc9PSV4LFxuIix6cTBwcl9vcmcsenExcHJfb3JnLHpxMnByX29yZyk7CgkJcHJpbnRmKCJzb2NfYWNfZHJ2Mz09JWQsc29jX2FjX29kdDM9PSVkLFxuIiw0ODAvKHNvY19hY19kcnYzKzEpLDM2MC8oc29jX2FjX29kdDMrMSkpOwoJCXByaW50Zigic29jX2RhdGEwMV9kcnYzPT0lZCxzb2NfZGF0YTAxX29kdDM9PSVkLFxuIiw0ODAvKHNvY19kYXRhMDFfZHJ2MysxKSwzNjAvKHNvY19kYXRhMDFfb2R0MysxKSk7CQoJCXByaW50Zigic29jX2RhdGEyM19kcnYzPT0lZCxzb2NfZGF0YTIzX29kdDM9PSVkLFxuIiw0ODAvKHNvY19kYXRhMjNfZHJ2MysxKSwzNjAvKHNvY19kYXRhMjNfb2R0MysxKSk7CQoJCXByaW50ZigiZHJhbV9kcnYzPT0lZCxkcmFtX29kdDM9PSVkLFxuXG5cbiIsZHJhbV9kcnYsZHJhbV9vZHQpOwoKCQlwcmludGYoInNvY19hY19kcnY0X3VwPT0lZCxzb2NfYWNfZHJ2NF9kb3duPT0lZCxzb2NfYWNfb2R0ND09JWQsXG4iLDQ4MC8oc29jX2FjX2RydjRfdXArMSksNDgwLyhzb2NfYWNfZHJ2NF9kb3duKzEpLDQ4MC8oc29jX2FjX29kdDQrMSkpOwoJCXByaW50Zigic29jX2RhdGEwMV9kcnY0X3VwPT0lZCxzb2NfZGF0YTAxX2RydjRfZG93bj09JWQsc29jX2RhdGEwMV9vZHQ0PT0lZCxcbiIsNDgwLyhzb2NfZGF0YTAxX2RydjRfdXArMSksNDgwLyhzb2NfZGF0YTAxX2RydjRfZG93bisxKSw0ODAvKHNvY19kYXRhMDFfb2R0NCsxKSk7CgkJcHJpbnRmKCJzb2NfZGF0YTIzX2RydjRfdXA9PSVkLHNvY19kYXRhMjNfZHJ2NF9kb3duPT0lZCxzb2NfZGF0YTIzX29kdDQ9PSVkLFxuIiw0ODAvKHNvY19kYXRhMjNfZHJ2NF91cCsxKSw0ODAvKHNvY19kYXRhMjNfZHJ2NF9kb3duKzEpLDQ4MC8oc29jX2RhdGEyM19vZHQ0KzEpKTsKCgoJCXByaW50ZigiZHJhbV9kZHI0X2Rydj09JWQsZHJhbV9kZHI0X29kdD09JWQsXG4iLGRyYW1fZGRyNF9kcnYsZHJhbV9kZHI0X29kdCk7CgoKCX0KCXVuc2lnbmVkIGludCBkdGVkcjBbMl1bNF07Cgl1bnNpZ25lZCBpbnQgZHRlZHIxWzJdWzRdOwoJLy91bnNpZ25lZCBpbnQgdnRkclsyXVs0XTsKCXVuc2lnbmVkIGludCBsY2Rscl93X3NldHRpbmdbMl1bNF07Cgl1bnNpZ25lZCBpbnQgbGNkbHJfcl9zZXR0aW5nWzJdWzRdOwoJdW5zaWduZWQgaW50IGRlbGF5X2xpbmVfMTAwc3RlcD0wOwoJaWYgKDEpIHsKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKQoJCS8qCgkJICAgYmwyX3ByaW50KCJERFIwX1BVQl9BQ0xDRExSOiAweCIscmRfcmVnKEREUjBfUFVCX0FDTENETFIpLCBWQUxVRV9IRVgsICIuLi4uXG4iKTsKCQkgICBibDJfcHJpbnQoIkREUjBfUFVCX0FDQkRMUjA6IDB4IiwgcmRfcmVnKEREUjBfUFVCX0FDQkRMUjApLCBWQUxVRV9IRVgsICIuLi4uXG4iKTsKCQkgICBibDJfcHJpbnQoIkREUjBfTURMUjogIiwgKChyZF9yZWcoRERSMF9QVUJfQUNNRExSMCk+PjE2KSYwWDFGRiksIFZBTFVFX0RFQyAsIi4uLi5cbiIpOwoJCSAgIGJsMl9wcmludCgiRERSMF9DTEs6ICIsIHBfZGRyX3NldC0+ZGRyX2NsaywgVkFMVUVfREVDLCAiTUh6XG4iKTsKCQkgICBibDJfcHJpbnQoImRlbGF5X2xpbmVfMTBzdGVwOiIsICgxMDAwKjEwMDAqMTAvKDIqcF9kZHJfc2V0LT5kZHJfY2xrKSkvKChyZF9yZWcoRERSMF9QVUJfQUNNRExSMCk+PjE2KSYwWDFGRiksIFZBTFVFX0RFQywgIi4uLi5cbiIpOwoJCSAgICovCgkJLy9wcmludGYoIkREUjBfTURMUjolOGQsIENMSzolOGRNaHosIGRlbGF5X2xpbmVfMTBzdGVwOiU4ZCBwc1xuIiwgKChyZF9yZWcoRERSMF9QVUJfQUNNRExSMCk+PjE2KSYwWDFGRiksCgkJLy9wX2Rkcl9zZXQtPmRkcl9jbGsgLCgxMDAwKjEwMDAvKDIqcF9kZHJfc2V0LT5kZHJfY2xrKSkvKChyZF9yZWcoRERSMF9QVUJfQUNNRExSMCk+PjE2KSYwWDFGRikpOwoJCXdyX3JlZyhERFIwX1BVQl9SQU5LSURSLCAoKDA8PDApfCgoMDw8MTYpKSkpOwoJCS8vLyoKCQl1bnNpZ25lZCBpbnQgaT0wOwoJCXVuc2lnbmVkIGludCByYW5rPTA7CgkJZm9yKHJhbms9MDtyYW5rPDI7KHJhbmsrKykpCgkJewoJCQlwcmludGYoIkREUjBfUkFOSzA9PSVkLFxuIixyYW5rKTsKCQkJLy9ibDJfcHJpbnQoIkREUjBfUkFOSzA6IDB4IiwgcmFuaywgVkFMVUVfSEVYLCAiXG5cbiIpOwoJCQl3cl9yZWcoRERSMF9QVUJfUkFOS0lEUiwgKChyYW5rPDwwKXwoKHJhbms8PDE2KSkpKTsKCQkJZm9yKGk9MDtpPDQ7KGkrKykpCgkJCXsKCQkJCS8vY2hhbmdlIGR0Y3IwIGxhbmUgcmVnIG1hcAoJCQkJd3JfcmVnKEREUjBfUFVCX0RUQ1IwLCgoKHJhbms8PDI0KXwoaTw8MTYpKSl8KChyZF9yZWcoRERSMF9QVUJfRFRDUjApKSYofigoMTw8MTEpfCgweGY8PDE2KSkpKSk7Ly8KCgkJCQlwcmludGYoIkREUjBfTEFORTA6IDB4ICVkXG4iLCBpKTsKCQkJCS8vIGJsMl9wcmludCgiRERSMF9QVUJfRFRFRFIwOiAweCIsIHJkX3JlZyhERFIwX1BVQl9EVEVEUjApLCBWQUxVRV9IRVgsICJcbiIpCgkJCQkvLyBibDJfcHJpbnQoIkREUjBfUFVCX0RURURSMTogMHgiLCByZF9yZWcoRERSMF9QVUJfRFRFRFIxKSwgVkFMVUVfSEVYLCAiXG4iKQoKCQkJCS8vICAgYmwyX3ByaW50KCJERFIwX1BVQl9EVEVEUjI6IDB4IiwgcmRfcmVnKEREUjBfUFVCX0RURURSMiksIFZBTFVFX0hFWCwgIlxuIikKCQkJCWR0ZWRyMFtyYW5rXVtpXT0ocmRfcmVnKEREUjBfUFVCX0RURURSMCkpOwoJCQkJZHRlZHIxW3JhbmtdW2ldPShyZF9yZWcoRERSMF9QVUJfRFRFRFIxKSk7CgkJCQkvL3Z0ZHJbcmFua11baV09KHJkX3JlZyhERFIwX1BVQl9WVERSKSk7CgkJCQlwcmludGYoIkREUjBfUFVCX1dfTWluOiVkIFxuIiwgKHJkX3JlZyhERFIwX1BVQl9EVEVEUjApKSYweDFmZik7CgoJCQkJcHJpbnRmKCJERFIwX1BVQl9XX01heDogJWRcbiIsICgocmRfcmVnKEREUjBfUFVCX0RURURSMCkpPj45KSYweDFmZik7CgoJCQkJLy8JIGJsMl9wcmludCgiRERSMF9QVUJfV19NYXg6ICIsICgodWludDY0X3QpKEREUjBfUFVCX0RYMExDRExSMStpKihERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSkpLCBWQUxVRV9ERUMsICJcblxuIikKCQkJCWxjZGxyX3dfc2V0dGluZ1tyYW5rXVtpXT0oKHJkX3JlZygodWludDY0X3QpKEREUjBfUFVCX0RYMExDRExSMStpKihERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSkpKSk7CgkJCQlwcmludGYoIkREUjBfUFVCX1dfU0VUVElORzolZCBcbiIsICgocmRfcmVnKCh1aW50NjRfdCkoRERSMF9QVUJfRFgwTENETFIxK2kqKEREUjBfUFVCX0RYMUxDRExSMS1ERFIwX1BVQl9EWDBMQ0RMUjEpKSkpKSYweDFmZik7CgoKCgkJCQlwcmludGYoIkREUjBfUFVCX1JfTWluOiAlZFxuIiwgKHJkX3JlZyhERFIwX1BVQl9EVEVEUjEpKSYweDFmZik7CgoJCQkJcHJpbnRmKCJERFIwX1BVQl9SX01heDolZFxuIiwgKChyZF9yZWcoRERSMF9QVUJfRFRFRFIxKSk+PjkpJjB4MWZmKTsKCgkJCQlwcmludGYoIkREUjBfUFVCX1JfU0VUVElORzogJWRcbiIsICgocmRfcmVnKCh1aW50NjRfdCkoRERSMF9QVUJfRFgwTENETFIzK2kqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKSYweDFmZik7CgkJCQlsY2Rscl9yX3NldHRpbmdbcmFua11baV09KChyZF9yZWcoKHVpbnQ2NF90KShERFIwX1BVQl9EWDBMQ0RMUjMraSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJcHJpbnRmKCJERFIwX1BVQl9WVERSOiAweCV4XG4iLCAocmRfcmVnKEREUjBfUFVCX1ZURFIpKSk7CQoJCQl9CgkJfQoJCXdyX3JlZyhERFIwX1BVQl9SQU5LSURSLCAoKDA8PDApfCgoMDw8MTYpKSkpOwoKCQl1bnNpZ25lZCBpbnQgZGRyX3BsbCA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpOwoJCXVuc2lnbmVkIGludCBkZHJfY2xrID1wbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJCS8vLzIqKCgoMjQgKiAoZGRyX3BsbCYweDFmZikpLygoZGRyX3BsbD4+OSkmMHgxZikpPj4oKGRkcl9wbGw+PjE2KSYweDMpKTsKCgkJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgkJZ2xvYmFsX2Rkcl9jbGs9ZGRyX2NsazsKCQlwcmludGYoIkREUjBfUFVCX0FDQkRMUjA6IDB4JXhcbiIsIChyZF9yZWcoRERSMF9QVUJfQUNCRExSMCkpKTsKCQlwcmludGYoIkREUjBfUFVCX0FDTENETFI6IDB4JXhcbiIsIChyZF9yZWcoRERSMF9QVUJfQUNMQ0RMUikpKTsKCgkJLy9wcmludGYoIkREUjBfTURMUjolZCBcbiIsICgocmRfcmVnKEREUjBfUFVCX0FDTURMUjApPj4xNikmMFgxRkYpKTsKCQkvL3ByaW50ZigiRERSMF9DTEs6JWQgTUh6IFxuIiwgcF9kZHJfc2V0LT5kZHJfY2xrIik7CgkJLy9wcmludGYoImRlbGF5X2xpbmVfMTBzdGVwOiVkIFxuIiwgKDEwMDAqMTAwMCoxMC8oMipwX2Rkcl9zZXQtPmRkcl9jbGspKS8oKHJkX3JlZyhERFIwX1BVQl9BQ01ETFIwKT4+MTYpJjBYMUZGKSIpOwoKCQlwcmludGYoIkREUjBfTURMUjolOGQsIENMSzolOGRNaHosIGRlbGF5X2xpbmVfMTBzdGVwOiU4ZCBwcyxkZWxheV9saW5lXzEwMHN0ZXA6JThkIHBzLFxuIiwgKChyZF9yZWcoRERSMF9QVUJfQUNNRExSMCk+PjE2KSYwWDFGRiksCgkJCQlnbG9iYWxfZGRyX2NsayAsKDEwMDAwKjEwMDAvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKHJkX3JlZyhERFIwX1BVQl9BQ01ETFIwKT4+MTYpJjBYMUZGKSwKCQkJCSgxMDAwKjEwMDAwMC8oMipnbG9iYWxfZGRyX2NsaykpLygocmRfcmVnKEREUjBfUFVCX0FDTURMUjApPj4xNikmMFgxRkYpKTsKCQlkZWxheV9saW5lXzEwMHN0ZXA9KDEwMDAqMTAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKSkvKChyZF9yZWcoRERSMF9QVUJfQUNNRExSMCk+PjE2KSYwWDFGRik7CgkJZm9yKHJhbms9MDtyYW5rPDI7KHJhbmsrKykpCgkJewoJCQlwcmludGYoIkREUjBfUkFOSzA9PSVkLFxuIixyYW5rKTsKCgkJCWZvcihpPTA7aTw0OyhpKyspKQoJCQl7CgkJCQkvL2R0ZWRyMFtyYW5rXVtpXT0ocmRfcmVnKEREUjBfUFVCX0RURURSMCkpOwoJCQkJLy9kdGVkcjFbcmFua11baV09KHJkX3JlZyhERFIwX1BVQl9EVEVEUjEpKTsKCQkJCS8vdnRkcltyYW5rXVtpXT0ocmRfcmVnKEREUjBfUFVCX1ZURFIpKTsKCQkJCXByaW50ZigiJTRkICIsICgoKChkdGVkcjBbcmFua11baV0pPj45KSYweDFmZiktbGNkbHJfd19zZXR0aW5nW3JhbmtdW2ldKSpkZWxheV9saW5lXzEwMHN0ZXAvMTAwCgkJCQkJICApOwoJCQkJcHJpbnRmKCIlNGQgIiwgKChsY2Rscl93X3NldHRpbmdbcmFua11baV0pLSgoKGR0ZWRyMFtyYW5rXVtpXSk+PjApJjB4MWZmKSkqZGVsYXlfbGluZV8xMDBzdGVwLzEwMAoJCQkJCSAgKTsKCgkJCQlwcmludGYoIiU0ZCAiLCAoKGxjZGxyX3Jfc2V0dGluZ1tyYW5rXVtpXSktKCgoZHRlZHIxW3JhbmtdW2ldKT4+MCkmMHgxZmYpKSpkZWxheV9saW5lXzEwMHN0ZXAvMTAwCgkJCQkJICApOwoJCQkJcHJpbnRmKCIlNGQgICAgICAiLCAoKCgoZHRlZHIxW3JhbmtdW2ldKT4+OSkmMHgxZmYpLWxjZGxyX3Jfc2V0dGluZ1tyYW5rXVtpXSkqZGVsYXlfbGluZV8xMDBzdGVwLzEwMAoJCQkJCSAgKTsKCQkJfQoJCQlwcmludGYoIlxuIik7CQkJCgkJfQoJCXByaW50ZigiXG5lbmQ9PSVkLFxuIixyYW5rKTsKI2VuZGlmCgl9CgoJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCUNMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CglyZXR1cm4gMTsKfQoKCmludCBkb19kZHJfb2Zmc2V0X2Rkcl9sY2RscihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCgkvL2Rkcl90ZXN0X2NtZCAweDI1IDEgMSAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKSAKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50IHJlc3VtZV9kZGw9MDsgIC8vIDAgcGF1c2UgMSxyZXN1bWUKCXVuc2lnbmVkIGludCBvZmZzZXRfaWQ9MDsgIC8vIDAgbGVmdCAgMSAgcmlnaHQKCXVuc2lnbmVkIGludCBjb3VudD0wOwoJdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCByZWdfdmFsdWU9MDsKCXVuc2lnbmVkIGludCBvZmZzZXRfdmFsdWVbMTBdPXswLDAsMCwwLDAsMCwwLDAsMCwwfSA7IC8vIGFjIHcgIGNsayB3ICAgbGFuZSAwIHcgciBsYW5lIDEgdyByIGxhbmUyIHcgciBsYW5lMyB3IHIgIAoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJaWYgKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgllbHNlIGlmIChhcmdjID4gMSkKCXsKCQkJY291bnQ9MDsKCQkJcmVzdW1lX2RkbD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXJlc3VtZV9kZGwgPSAwOwoJCQl9CgkJCS8vCWNvdW50Kys7CgkJaWYgIChhcmdjID4gMikKCQl7CgkJCWNvdW50PTE7CgkJCW9mZnNldF9pZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCW9mZnNldF9pZCA9IDA7CgkJCX0KCQkJLy8JY291bnQrKzsKCQl9CgoJCWlmICAoYXJnYyA+IDMpCgkJewkJCgkJCWNvdW50PTI7CgkJCXdoaWxlKGNvdW50PChhcmdjLTEpKQoJCQl7CgkJCQlvZmZzZXRfdmFsdWVbY291bnQtMl09IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJCXsKCQkJCQlvZmZzZXRfdmFsdWVbY291bnQtMl0gPSAwOwoJCQkJfQoJCQkJY291bnQrKzsKCQkJfQoJCX0KCgl9CgoJcHJpbnRmKCJyZXN1bWVfZGRsPSVkLFxuIixyZXN1bWVfZGRsKTsKCWlmKG9mZnNldF9pZCkKCQlwcmludGYoIm9mZnNldCByaWdodCArKyVkLFxuIixvZmZzZXRfaWQpOwoJZWxzZQoJCXByaW50Zigib2Zmc2V0IGxlZnQgLS0lZCxcbiIsb2Zmc2V0X2lkKTsKCglmb3IgKGkgPSAwO2k8MTA7aSsrKQoJewoJCXByaW50Zigib2Zmc2V0X3ZhbHVlWyVkXT0lZFxuIixpLG9mZnNldF92YWx1ZVtpXSk7Cgl9CgoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgoJcHJpbnRmKCJcbnNob3VsZCBwYXVzZSBkZGwgcGlyPT0gMHglMDh4LGlmIG5vIHBhdXNlIGRkbCAsd3JpdGUgbGNkbHIgc29tZSB0aW1lIG1heSBvY2NvdXIgZXJyb3JcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCXdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCXByaW50ZigiXG4gcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoKCgkvL2lmICh2cmVmX2xjZGxyX29mZnNldCkKCWZvciAoaSA9IDA7aTwxMDtpKyspCQoJewoJCWlmKGk9PTApCgkJCXJlZ19hZGQgPSBERFIwX1BVQl9BQ0xDRExSOwoJCWlmKGk9PTEpCgkJCXJlZ19hZGQgPSBERFIwX1BVQl9BQ0JETFIwOwoJCWlmKGk+MSkKCQl7CgkJCWlmKGklMil7CgkJCQlyZWdfYWRkID0gRERSMF9QVUJfRFgwTENETFIzICsgKChERFIwX1BVQl9EWDFMQ0RMUjMgLSBERFIwX1BVQl9EWDBMQ0RMUjMpKigoaS0yKS8yKSk7fQoJCQllbHNlewoJCQkJcmVnX2FkZCA9IEREUjBfUFVCX0RYMExDRExSMSArICgoRERSMF9QVUJfRFgxTENETFIzIC0gRERSMF9QVUJfRFgwTENETFIzKSooKGktMikvMikpO30KCQl9CgoJCXByaW50ZigiXG4gb3JnIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCksCgkJCQlyZF9yZWcocmVnX2FkZCkpOwoJCWlmKG9mZnNldF9pZCkgIC8vb2Zmc2V0ICsKCQl7CgkJCXdyX3JlZyhyZWdfYWRkLCAoIHJkX3JlZyhyZWdfYWRkKStvZmZzZXRfdmFsdWVbaV0pKTsKCQkJaWYoaT4xKQoJCQl7aWYoaSUyKXt3cl9yZWcoKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyksCgkJCQkJKCByZF9yZWcoKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMykpK29mZnNldF92YWx1ZVtpXSkpOwoJCQkJCX0KCQkJfQoKCgoJCX0KCQllbHNlCgkJewoJCQlyZWdfdmFsdWU9cmRfcmVnKHJlZ19hZGQpOwoJCQlyZWdfdmFsdWU9KCByZWdfdmFsdWU+b2Zmc2V0X3ZhbHVlW2ldKT8oIHJlZ192YWx1ZS1vZmZzZXRfdmFsdWVbaV0pOjA7CgkJCXdyX3JlZyhyZWdfYWRkLCByZWdfdmFsdWUpOwoJCQlpZihpPjEpCgkJCXtpZihpJTIpe3dyX3JlZygocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKSwKCQkJCQkoIHJlZ192YWx1ZSkpOwoJCQkJCX0KCQkJfQoKCgoJCX0KCgkJcHJpbnRmKCJcbiBtb2QgcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKSwKCQkJCXJkX3JlZyhyZWdfYWRkKSk7CgkJLy8JLyoKCQl7CgoKCgkJfQoJCS8vKi8KCX0KCS8vIHByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CglwcmludGYoIlxuZW5kIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCWlmKHJlc3VtZV9kZGwpewoJCXdyaXRlbCgoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKSYofigxPDwyOSkpKSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCXByaW50ZigiXG4gcmVzdW1lIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCX0KCgoKCgojZW5kaWYKCXJldHVybiAxOwp9CgoKI2VuZGlmCmludCBkb19kZHJfc2V0X3dhdGNoZG9nX3ZhbHVlKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJaWYgKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJZWxzZSBpZiAgKGFyZ2MgPiAxKQoJewoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCQl3YXRjaGRvZ190aW1lX3M9IDIwOwoJCX0KCQlwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCX0KCglyZXR1cm4gMTsKfQoKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgkjZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKCSNkZWZpbmUgIEcxMl9EQVRBX1dSSVRFX09GRlNFVF9NQVggICAoMFgzRis3KjMyKQoKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQoJI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSAgNgoKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UgIDB4MTEKCSNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGICAweDEyCgkjZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9EUkFNX1ZSRUYgICAgMHgxMwoKCXR5cGVkZWYgc3RydWN0IHRyYWluaW5nX2RlbGF5X2luZm9ybWF0aW9uewoJdWludDE2X3QgYWNfZGVsYXlbMTBdOwoJdWludDE2X3QgdHhkcXNfZGVsYXlbMTZdOwoJdWludDE2X3QgcnhkcXNfZGVsYXlbMTZdOwoJdWludDE2X3QgdHhkcV9kZWxheVs3Ml07Cgl1aW50MTZfdCByeGRxX2RlbGF5WzcyXTsKCXVpbnQxNl90IGdhdGVfcnhkcV9kZWxheVs3Ml07CgoJfSB0cmFpbmluZ19kZWxheV90OwoJdHJhaW5pbmdfZGVsYXlfdCAgdHJhaW5pbmdfZGVsYXlfdF9wOwoKCXVpbnQxNl90ICBsY2RfYmRsX3ZhbHVlWzcyXVs0XTsgLy9vcmcgbWluIG1heCBzdGF0dXMKCS8vICAjZGVmaW5lIExDRF9CRExSX09SRyAgIDAKCSNkZWZpbmUgTENEX0JETFJfTUlOICAwCgkjZGVmaW5lIExDRF9CRExSX01BWCAgIDEKCSNkZWZpbmUgTENEX0JETFJfU1RBVFVTICAyCgoJLy9CWVRFMC0zCgkjZGVmaW5lICBURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUMgIDAKCSNkZWZpbmUgIFRFU1RfQVJHXzFfQ01EMCAgMQoJI2RlZmluZSAgVEVTVF9BUkdfMl9TVEVQICAyICAgLy8gMCBpbml0ICAgMSB0ZXN0IGFjICAyIHRlc3QgdGRxc193cml0ZQoJI2RlZmluZSAgVEVTVF9BUkdfM19BTExfVE9HSFRFUiAgMwoKCS8vQllURTQtNwoJI2RlZmluZSAgVEVTVF9BUkdfRlJFUV9OSUJCTEVfTCAgNAoJI2RlZmluZSAgVEVTVF9BUkdfRlJFUV9OSUJCTEVfSCAgNQoKCS8vQllURTgtMTEKCSNkZWZpbmUgIFRFU1RfQVJHX0JPT1RfVElNRVNfTCA2CgkjZGVmaW5lICBURVNUX0FSR19CT09UX1RJTUVTX0ggNwoKCS8vQllURTEyLTE1CgkjZGVmaW5lICBURVNUX0FSR19FUlJPUl9GTEFHIDggICAvL3Rha2UgNCBieXRlIGZvciBrZXJuZWwgdGVzdCBmbGFnCgkvLyNkZWZpbmUgIFRFU1RfQVJHX0VSUk9SX0ZMQUcgNjMqNCAgIC8vdGFrZSA0IGJ5dGUgZm9yIGtlcm5lbCB0ZXN0IGZsYWcKCgkvL0JZVEUxNi0xOQoJLy8jZGVmaW5lICBURVNUX0FSR18xNl9MQ0RMUl9URU1QX0NPVU5UIDE2CgkjZGVmaW5lICBURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCAgMTIgICAKCSNkZWZpbmUgIFRFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVggIDE2ICAKCSNkZWZpbmUgIFRFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYICAyMCAgIAoJI2RlZmluZSAgVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCAgMjQgIAoKCSNkZWZpbmUgIFRFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCAgMjggIAoJI2RlZmluZSAgVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVggIDMwIAoJLy8jZGVmaW5lICBURVNUX0FSR19OSUJCTEVfTUFTSzBfRU5BTEJFX0lOREVYICAzMiAKCgkjZGVmaW5lICBURVNUX0FSR19FUlJPUl9GTEFHX05VTEwgMAoJI2RlZmluZSAgVEVTVF9BUkdfRVJST1JfRkxBR19GQUlMIDEKCSNkZWZpbmUgIFRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUyAyCgoJI2RlZmluZSAgVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUgIDMyICAvLyAzMkJZVEUKCSNkZWZpbmUgIFRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFICAzICAvLzMvLy9CWVRFCgppbnQgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGlja3koY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXJkZHJfdGVzdF9kcXNfd2luZG93IGZ1bmN0aW9uICBkZHJfdGVzdF9jbWQgMHgyNyAweDEwODAwMDAgMHg4MDAwMDAgIDB4NDAwMDAwMDAgMHg4MDAwMDAgMTUgMHg2ICAwIDAgMCAwIDAgMCAxL2NvbmZpZ1xuIik7CglwcmludGYoIlxuZGRyX3Rlc3RfY21kIDB4MjcgY3MwX3Rlc3Rfc3RhcnQgIGNzMF90ZXN0X3NpemUgIGNzMV90ZXN0X3N0YXJ0ICBjczFfdGVzdF9zaXplICBucyB0ZXN0X2luZGV4X2VuYWJsZSAgbmliYmxlX21hc2swIG5pYmJsZV9tYXNrMSBuaWJibGVfbWFzazIgZHJhbV90eXBlIGNoYW5uZWxfbW9kZSAgY29uZmlnX3JlZ2lzdGVyIGFsbF90b2d0aGVyLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKCXByaW50ZigiXG4gYWMgd3JpdGVfZHFzIHJlYWRfZHFzIGNhbiB0ZXN0IHRvZ3RoZXIgdGVzdF9pbmRleF9lbmFibGUgY2FuIGVuYWJsZSBrZXJuZWwgdGVzdCBcbiIpOwoJLy8gICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCAgbmliYmxlX3NhdmVfb2Zmc2V0PSAwOwoJdW5zaWduZWQgaW50ICBuaWJibGVfc3RlcD0gMDsKCXVuc2lnbmVkIGludCAgbmliYmxlX21heD0gMTY7Cgl1bnNpZ25lZCBpbnQgIHRlc3RfaW5kZXhfZW5hYmxlPSAwOwoJdW5zaWduZWQgaW50ICB0ZXN0X2luZGV4PSAwOwoJdW5zaWduZWQgaW50ICB0ZXN0X2luZGV4X21heD0gNjsKCXVuc2lnbmVkIGludCAgIHJlZ192YWx1ZT0gMDsKCXVuc2lnbmVkIGludCAgZHJhbV90eXBlPSAwOwoJdW5zaWduZWQgaW50ICBjaGFubmVsX21vZGU9IDA7Cgl1bnNpZ25lZCBpbnQgIGtlcm5lbF93YXRjaGRvZ19zPSAyMDsvLzI0MDsKCS8vCSAgdW5zaWduZWQgaW50ICBmaW5pc2hfY2xlYXJfZmxhZz0gMDsKCXVuc2lnbmVkIGludCAgY29uZmlnX3JlZ2lzdGVyPSAwOwoJdW5zaWduZWQgaW50ICAgYWxsX3RvZ2h0ZXJfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgICBlcnJvcl9mbGFnX3JlZ19hZGQ9MDsKCWNoYXIgKnN0cmluZ19wcmludF9mbGFnPSAgICIgdWJvb3Qtd2luZG93LWxvb3AgXG4iOwoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCWNoYXIgKmVuZHA7CgljaGFyICpidWY7CglidWY9IiI7CgoJdW5zaWduZWQgaW50ICAgY3MwX3Rlc3Rfc3RhcnQ9IDB4MTA4MDAwMDsKCXVuc2lnbmVkIGludCAgIGNzMF90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIGNzMV90ZXN0X3N0YXJ0PSAwOwoJdW5zaWduZWQgaW50ICAgY3MxX3Rlc3Rfc2l6ZT0gMDsKCXVuc2lnbmVkIGludCAgIGVuYWJsZV9rZXJuZWxfdGVzdD0wOwoJaWYgKGFyZ2MgPjEpIHsKCQljczBfdGVzdF9zdGFydCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MwX3Rlc3Rfc3RhcnQgPSAweDEwODAwMDA7CgkJfQoJfQoKCWlmIChhcmdjID4yKSB7CgkJY3MwX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MwX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9CgoJaWYgKGFyZ2MgPjMpIHsKCQljczFfdGVzdF9zdGFydCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MxX3Rlc3Rfc3RhcnQgPSAwOwoJCX0KCX0KCWlmIChhcmdjID40KSB7CgkJY3MxX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY3MxX3Rlc3Rfc2l6ZSA9IDA7CgkJfQoJfQoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWRkcl90ZXN0X3NpemUgPSBjczBfdGVzdF9zaXplOwoJaWYgKGFyZ2MgPjUpIHsKCQl3YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zPSAyMDsKCQl9Cgl9CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCglpZiAoYXJnYyA+NikgewoJCXRlc3RfaW5kZXhfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfaW5kZXhfZW5hYmxlPSAwOwoJCX0KCX0KCXByaW50ZigidGVzdF9pbmRleF9lbmFibGU9PTB4JTA4eFxuIix0ZXN0X2luZGV4X2VuYWJsZSk7CgllbmFibGVfa2VybmVsX3Rlc3Q9KHRlc3RfaW5kZXhfZW5hYmxlPj43KSYxOwoJaWYoZW5hYmxlX2tlcm5lbF90ZXN0KXsKCQlwcmludGYoImVuYWJsZSBrZXJuZWwgd2luZG93IHRlc3RcbiIpOwoJfQoKCXVuc2lnbmVkIGludCAgIG5pYmJsZV9tYXNrWzNdPSB7MCwwLDB9OwoJaWYgKGFyZ2MgPjcpIHsKCQluaWJibGVfbWFza1swXSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQluaWJibGVfbWFza1swXT0gMDsKCQl9Cgl9CglwcmludGYoIm5pYmJsZV9tYXNrWzBdPT0weCUwOHhcbiIsbmliYmxlX21hc2tbMF0pOwoJaWYgKGFyZ2MgPjgpIHsKCQluaWJibGVfbWFza1sxXSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQluaWJibGVfbWFza1sxXT0gMDsKCQl9Cgl9CglwcmludGYoIm5pYmJsZV9tYXNrWzFdPT0weCUwOHhcbiIsbmliYmxlX21hc2tbMV0pOwoJaWYgKGFyZ2MgPjkpIHsKCQluaWJibGVfbWFza1syXSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls5XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQluaWJibGVfbWFza1syXT0gMDsKCQl9Cgl9CglwcmludGYoIm5pYmJsZV9tYXNrWzJdPT0weCUwOHhcbiIsbmliYmxlX21hc2tbMl0pOwoKCWlmIChhcmdjID4xMCkgewoJCWRyYW1fdHlwZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTBdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRyYW1fdHlwZT0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+MTEpIHsKCQljaGFubmVsX21vZGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzExXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQljaGFubmVsX21vZGU9IDA7CgkJfQoJfQoJLy8vKgoJaWYgKGFyZ2MgPjEyKSB7CgkJY29uZmlnX3JlZ2lzdGVyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJY29uZmlnX3JlZ2lzdGVyPSAwOwoJCX0KCX0vLyovCgkvLy8qCglpZiAoYXJnYyA+MTMpIHsKCQlhbGxfdG9naHRlcl9lbmFibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEzXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlhbGxfdG9naHRlcl9lbmFibGU9IDA7CgkJfQoJfS8vKi8KCXByaW50ZigiYWxsX3RvZ2h0ZXJfZW5hYmxlPT0weCUwOHhcbiIsYWxsX3RvZ2h0ZXJfZW5hYmxlKTsKCglpZiAoYXJnYyA+MTQpIHsKCQllcnJvcl9mbGFnX3JlZ19hZGQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzE0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQllcnJvcl9mbGFnX3JlZ19hZGQ9IDA7CgkJfQoJfQoJcHJpbnRmKCJlcnJvcl9mbGFnX3JlZ19hZGQ9PTB4JTA4eFxuIixlcnJvcl9mbGFnX3JlZ19hZGQpOwoJcHJpbnRmKCJcbnRlc3QgdXNlIHVib290IHN0aWNreSByZWdpc3RlclxuIik7CgoJLy9ETUNfU1RJQ0tZXzAKCWNoYXIgc3RyWzEwMjRdPSIiOwoJLy9jaGFyIHN0cl90ZW1wMVsxMDI0XT0iIjsKCS8vY2hhciBzdHJfdGVtcDJbMTAyNF09IiI7Cgl2b2xhdGlsZSB1aW50MTZfdCAgKm51bV9hcnJ5PU5VTEw7CgkvL3ZvbGF0aWxlIHVpbnQxNl90ICAqcF9udW1fYXJyeTsKCWludCBpOwoJLy91bnNpZ25lZCBpbnQgc3RpY2tfYmFzZV9hZGQ9MDsKCS8vdWludDMyX3QgZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4LHVpbnQzMl90IHZhbHVlKQoKCXN0aWNreV9yZWdfYmFzZV9hZGQ9KEREUjBfUFVCX1JFR19CQVNFJjB4ZmZmZjAwMDApKygoRE1DX1NUSUNLWV9HMTJBXzApJjB4ZmZmZik7CgkvL251bV9hcnJ5ID0gKHVpbnQxNl90ICopKHVpbnQ2NF90ICkoc3RpY2t5X3JlZ19iYXNlX2FkZCk7CgkvL251bV9hcnJ5PXBfbnVtX2Fycnk7Cglmb3IgKGkgPSAwOyBpIDwgNjQqNDsgaSsrKSB7CgkJbnVtX2FycnlbaV09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LGkpOwoJCWlmKChpPT0wKXx8KGk9PTMyKXx8KGk9PSgzMisxMCozKSl8fChpPT0oMzIrMTAqMysxNiozKSl8fChpPT0oMzIrMTAqMysxNiozKzE2KjMpKSkKCQl7CgkJCXByaW50ZigiXG4gbnVtYXJyeVslZF0iICxpKTsKCQl9CgkJcHJpbnRmKCIgJWQgIixudW1fYXJyeVtpXSk7Cgl9CgoJLyoKCSNkZWZpbmUgIFRFU1RfQVJHXzFfQ01EMCAgMQoJLy8jZGVmaW5lICBURVNUX0FSR18xX0NNRDEgIDEKCSNkZWZpbmUgIFRFU1RfQVJHXzJfU1RFUCAgMgoJI2RlZmluZSAgVEVTVF9BUkdfM19GUkVRICAzCgkjZGVmaW5lICBURVNUX0FSR180X1NURVBfU1RBVFVTICA0CgkjZGVmaW5lICBURVNUX0FSR181X0JPT1RfVElNRVMgIDUKCSNkZWZpbmUgIFRFU1RfQVJHXzZfTENETFJfVEVNUF9DT1VOVCA2CgkjZGVmaW5lICBURVNUX0FSR183X0RNQ19TVElDS1lfTUFHSUMgIDcKCSovCgoJdWludDE2X3QgdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlID0zMjsgIAoJdWludDE2X3QgdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZSA9MzI7ICAKCXVpbnQxNl90IHRlc3RfYm9vdF90aW1lcyA9MDsgIAoJdWludDE2X3QgdGVzdF9kZHJfZnJlcXVlbmN5ID0wOyAgCgkvL3VpbnQxNl90IHRlbXBfc3ViX3ZhbHVlX2EgPTA7ICAKCS8qCgl1aW50MTZfdCB0ZXN0X2FyZ18xX2NtZDAgPTE7ICAvL21hc3RlciBjbWQKCXVpbnQxNl90IHRlc3RfYXJnXzFfY21kMSA9MDsgIC8vbWluIGNtZAoJdWludDE2X3QgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgbGFuZTAgdyBtaW4gIC0yIGxhbmUwIHcgbWF4IC0zIGxhbmUwIHIgbWluICAgIDQgbGFuZTAgciBtYXggLS0tLS01IGxhbmUxIHcgbWluIC4uLgoJdWludDE2X3QgdGVzdF9hcmdfM19mcmVxID0wOwoJdWludDE2X3QgdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdGVzdF9hcmdfMF9jbWQwPW51bV9hcnJ5WzBdOwoJdGVzdF9hcmdfMV9jbWQxPW51bV9hcnJ5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJ5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJ5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz1udW1fYXJyeVs0XTsKCS8vYm9vdF90aW1lcz1udW1fYXJyeVs1XTsKCS8vbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyeVs2XTsKCSovCglwcmludGYoIlRFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQz09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQ10pOwoJcHJpbnRmKCJcblRFU1RfQVJHXzFfQ01EMD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF0pOwoJcHJpbnRmKCJURVNUX0FSR18yX1NURVA9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCXByaW50ZigiVEVTVF9BUkdfM19BTExfVE9HSFRFUj09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzNfQUxMX1RPR0hURVJdKTsKCXByaW50ZigiVEVTVF9BUkdfRlJFUV9OSUJCTEVfTD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdKTsKCXByaW50ZigiVEVTVF9BUkdfRlJFUV9OSUJCTEVfSD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdKTsKCXByaW50ZigiVEVTVF9BUkdfQk9PVF9USU1FU19MPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CglwcmludGYoIlRFU1RfQVJHX0JPT1RfVElNRVNfSD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF0pOwoJcHJpbnRmKCJURVNUX0FSR19FUlJPUl9GTEFHPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoKCXByaW50ZigiVEVTVF9BUkdfRlJFUT09JWRNXG4iLChudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9IXTw8OCl8KG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdPDwwKSk7CglwcmludGYoIlRFU1RfQVJHX0JPT1RfVElNRVM9PSVkXG4iLChudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXTw8MCkpOwoJdGVzdF9ib290X3RpbWVzPShudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXTw8MCk7Cgl0ZXN0X2Rkcl9mcmVxdWVuY3k9KG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfTF08PDApOwoJaWYoKG51bV9hcnJ5W1RFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQ109PShETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xJjB4ZmYpKSYmCgkobnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXT09KERNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzEmMHhmZikpICkgLy9mb3IgY2hlY2sgbWFnaWMgbnVtYmVyIG1ha2Ugc3VtZSBlbnRlciB0ZXN0IGNvbW1hbmQKCXsKCQkvL251bV9hcnJ5W1RFU1RfQVJHXzVfQk9PVF9USU1FU10rKzsKCQl0ZXN0X2Jvb3RfdGltZXMrKzsKCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdPXRlc3RfYm9vdF90aW1lcyYweGZmOwoJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF09KHRlc3RfYm9vdF90aW1lcz4+OCkmMHhmZjsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19MLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF0pOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0gsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXSk7CgoJCWlmKCB0ZXN0X2Rkcl9mcmVxdWVuY3khPWdsb2JhbF9kZHJfY2xrKSAgLy8KCQl7CgkJCXByaW50ZigicnVubmluZyBkZHIgZnJlcT09JWQsYnV0IHRlc3QgZnJlcSBpcyVkLHdpbGwgcmVib290IHVzZSBkMnBsbCBcbiIsZ2xvYmFsX2Rkcl9jbGssdGVzdF9kZHJfZnJlcXVlbmN5KTsKCQkJc3ByaW50ZihzdHIsImQycGxsICAlZCIsdGVzdF9kZHJfZnJlcXVlbmN5KTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCXdoaWxlKDEpOwoJCX0KCX0KCWVsc2UKCXsKCQl0ZXN0X2Jvb3RfdGltZXM9MDsKCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdPXRlc3RfYm9vdF90aW1lcyYweGZmOwoJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF09KHRlc3RfYm9vdF90aW1lcz4+OCkmMHhmZjsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19MLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF0pOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0gsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXSk7CgkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0wOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7Cgl9CglwcmludGYoInRlc3Rfc3RpY2t5IGlzIG5vdCBtYWdpYyBudW1tYmVyLGJvb3QgdGltZXM9PSVkXG4iLHRlc3RfYm9vdF90aW1lcyk7CgoJewoJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCksIGNzMF90ZXN0X3N0YXJ0KTsKCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCksIGNzMF90ZXN0X3NpemUpOwoJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCksIGNzMV90ZXN0X3N0YXJ0KTsKCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCksIGNzMV90ZXN0X3NpemUpOwoJCXsKCQkJbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYXT13YXRjaGRvZ190aW1lX3MmMHhmZjsKCQkJbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYKzFdPSh3YXRjaGRvZ190aW1lX3M+PjgpJjB4ZmY7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgsbnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYXSk7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwoVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYKzEpLG51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCsxXSk7CgkJfQoJCW51bV9hcnJ5W1RFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYXT10ZXN0X2luZGV4X2VuYWJsZTsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVgsbnVtX2FycnlbVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVhdKTsKCQlpZihjb25maWdfcmVnaXN0ZXI9PTEpCgkJewoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTA7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJfQoJCW51bV9hcnJ5W1RFU1RfQVJHXzNfQUxMX1RPR0hURVJdPWFsbF90b2dodGVyX2VuYWJsZTsKCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfM19BTExfVE9HSFRFUixudW1fYXJyeVtURVNUX0FSR18zX0FMTF9UT0dIVEVSXSk7Cgl9CgoJaWYoKCBudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKT09MCkKCXsKCQl7CgkJCW51bV9hcnJ5W1RFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQ109RE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMTsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzBfRE1DX1NUSUNLWV9NQUdJQyxudW1fYXJyeVtURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUNdKTsKCQkJbnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXT1ETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMV9DTUQwLG51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF0pOwoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJCXsKCQkJCXRlc3RfYm9vdF90aW1lcz0wOwoJCQkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXT10ZXN0X2Jvb3RfdGltZXMmMHhmZjsKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF09KHRlc3RfYm9vdF90aW1lcz4+OCkmMHhmZjsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0wsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19ILG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF0pOwoJCQl9CgkJCXsKCQkJCXRlc3RfZGRyX2ZyZXF1ZW5jeT1nbG9iYWxfZGRyX2NsazsKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdPXRlc3RfZGRyX2ZyZXF1ZW5jeSYweGZmOwoJCQkJbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfSF09KHRlc3RfZGRyX2ZyZXF1ZW5jeT4+OCkmMHhmZjsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19GUkVRX05JQkJMRV9MLG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0xdKTsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19GUkVRX05JQkJMRV9ILG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdKTsKCQkJfQoKCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19OVUxMOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfRVJST1JfRkxBRyxudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJfQoKCgkJZm9yIChuaWJibGVfc3RlcCA9IDA7IG5pYmJsZV9zdGVwIDwgNzI7IG5pYmJsZV9zdGVwKyspCgkJewoJCQkvL2lmKGxhbmVfc3RlcCUyKQoJCQl7CgkJCQkvL251bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfT1JHXT0weGZmZmY7CgkJCQl0ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU9MTY7CgkJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCQkJaWYobmliYmxlX3N0ZXA8MTApCgkJCQl7CgkJCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTMyOwoJCQkJCXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU9MzI7CgkJCQl9CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU5dPXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZTsKCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWF09dGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZTsKCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVU109MDsvLzAKCQkJCQkvL2Rkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxpLG51bV9hcnJ5W2ldKTsKCQkJfQoKCQkJewoJCQkJaWYgKG5pYmJsZV9zdGVwPDMyKQoJCQkJewoJCQkJCWlmKCgobmliYmxlX21hc2tbMF0pPj5uaWJibGVfc3RlcCkmMSkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQkJfQoJCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8NjQpCgkJCQl7CgkJCQkJaWYoKChuaWJibGVfbWFza1sxXSk+PihuaWJibGVfc3RlcC0zMikpJjEpCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJCX0KCQkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDk2KQoJCQkJewoJCQkJCWlmKCgobmliYmxlX21hc2tbMl0pPj4obmliYmxlX3N0ZXAtNjQpKSYxKQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCQl9CgkJCQlpZihhbGxfdG9naHRlcl9lbmFibGUpCgkJCQl7CgkJCQkJaWYoKG5pYmJsZV9zdGVwPT0wKXx8KG5pYmJsZV9zdGVwPT0xMCl8fChuaWJibGVfc3RlcD09KDEwKzE2KSkpCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109MDsKCQkJCQllbHNlCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJCX0KCQkJfQoJCS8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVNdPTB4ZmZmZjsvLzAKCQl9CgoJCXsKCQkJLy9wcmludGYoIi4ubnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXT0lZFxuIixudW1fYXJyeVtURVNUX0FSR18xX0NNRDBdKTsKCQkJZm9yIChpID0gVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEU7IGkgPCA3MipURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURTsgaSsrKSB7CgkJCQkvLwludW1fYXJyeVtpXT0wOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LGksbnVtX2FycnlbaV0pOwoJCQkJLy8JZGRyX3dyXzE2Yml0X29uXzMycmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwxKSksbnVtX2FycnlbaV0pOwoJCQkJLy8JcHJpbnRmKCJudW1fYXJyeVsweCUwOHhdID09MHglMDh4XG4iLGksbnVtX2FycnlbaV0pOwoJCQl9CgoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCX0KCgl9CgoJaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJewoJCWZvciAobmliYmxlX3N0ZXAgPSAwOyBuaWJibGVfc3RlcCA8IDcyOyBuaWJibGVfc3RlcCsrKQoJCXsKCQkJaWYoKG5pYmJsZV9zdGVwPT0wKXx8KG5pYmJsZV9zdGVwPT0xMCl8fChuaWJibGVfc3RlcD09KDEwKzE2KSkpCgkJCXsKCQkJCQkvLwludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTA7CgkJCX0KCQkJZWxzZQoJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCX0KCX0KaWYoY29uZmlnX3JlZ2lzdGVyPT0xKQp7CgludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTA7CglkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKfQoKaWYoKCBudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSkKewpmb3IodGVzdF9pbmRleD1udW1fYXJyeVtURVNUX0FSR18yX1NURVBdO3Rlc3RfaW5kZXg8dGVzdF9pbmRleF9tYXggO3Rlc3RfaW5kZXgrKyApCnsKCXByaW50ZigiXG50ZXN0X2luZGV4PSVkXG4iLHRlc3RfaW5kZXgpOwoJaWYoKCgodGVzdF9pbmRleF9lbmFibGUpPj4odGVzdF9pbmRleC0xKSkmMSk9PTApCgl7CgkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0oKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pKzEpOy8vd2h5IGNhbiBub3QgdXNlICsrCgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCwJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJY29udGludWU7Cgl9Cgl7CgkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTEwOwoJCQluaWJibGVfbWFza1swXT0gMHgzMDsKCQkJaWYoKGRyYW1fdHlwZT09Q09ORklHX0REUl9UWVBFX0xQRERSMykpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNlMzsKCQkJfQoJCQlpZigoZHJhbV90eXBlPT1DT05GSUdfRERSX1RZUEVfTFBERFI0KSkKCQkJewoJCQkJbmliYmxlX21hc2tbMF09IDB4MjczOwoJCQkJaWYoKGNoYW5uZWxfbW9kZT09Q09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMCkpCgkJCQkJbmliYmxlX21hc2tbMF09IDB4M2YzOwoJCQl9CgkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT02NDsKCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT02NDsKCQl9CgkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCXsKCQkJbmliYmxlX3NhdmVfb2Zmc2V0PTEwOwoJCQluaWJibGVfbWF4PTE2OwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweGZmMDA7CgkJCX0KCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9KDEwKSsoMTYpOwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweGZmMDA7CgkJCX0KCQkJbmliYmxlX21heD0xNjsKCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTcyOwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzFdPSAweGZmZmZmZmYwOwoJCQkJbmliYmxlX21hc2tbMl09IDB4ZmZmZmZmZmY7CgkJCX0KCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTcyOwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzFdPSAweGZmZmZmZmYwOwoJCQkJbmliYmxlX21hc2tbMl09IDB4ZmZmZmZmZmY7CgkJCX0KCQkKCQl0ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU9NjQ7CgkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT02NDt9CgkJLy9uaWJibGVfbWF4PTg7Ly8JCgkJLy8gaWYobmliYmxlX21heD4zMCkgIGNhbiBub3Qgb3ZlciBzdGlja3kgcmVnaXN0ZXIgc2l6ZQoJCS8vIAluaWJibGVfbWF4PTMwOwoJCWZvciAoKG5pYmJsZV9zdGVwPTApOyhuaWJibGVfc3RlcDxuaWJibGVfbWF4KTsobmliYmxlX3N0ZXArKykpCgkJewoJCQlpZiAobmliYmxlX3N0ZXA8MzIpCgkJCXsKCQkJCWlmKCgobmliYmxlX21hc2tbMF0pPj5uaWJibGVfc3RlcCkmMSkKCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCX0KCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8NjQpCgkJCXsKCQkJCWlmKCgobmliYmxlX21hc2tbMV0pPj4obmliYmxlX3N0ZXAtMzIpKSYxKQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJfQoJCQllbHNlIGlmIChuaWJibGVfc3RlcDw5NikKCQkJewoJCQkJaWYoKChuaWJibGVfbWFza1syXSk+PihuaWJibGVfc3RlcC02NCkpJjEpCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQl9CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQl9Cgl9Cgp7Cglmb3IgKChuaWJibGVfc3RlcD0wKTsobmliYmxlX3N0ZXA8bmliYmxlX21heCk7KG5pYmJsZV9zdGVwKyspKQoJewoJCWlmKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT00KQoJCQljb250aW51ZTsKCQlwcmludGYoIm5pYmJsZV9zdGVwID09JWRcbiIsbmliYmxlX3N0ZXApOwoKCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpCgkJewoJCQlpZihuaWJibGVfc3RlcCUyKQoJCQl7CgkJCQkvL25pYmJsZV9zYXZlX29mZnNldAoJCQkJLy9udW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pLAkKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwLTErbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKSwJCgkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcC0xK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKTsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXAtMStuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkvL25pYmJsZV9zdGVwKys7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCWlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJewoJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQl9CgoJCWlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCQl7CgkJCWlmKG5pYmJsZV9zdGVwPjcpCgkJCXsKCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJfQoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJewoJCQlpZihuaWJibGVfc3RlcD43KQoJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCX0KCQl9CgkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJewoJCQlpZihuaWJibGVfc3RlcD4zNSkKCQkJewoJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQl9CgkJfQoJCWlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJCXsKCQkJaWYobmliYmxlX3N0ZXA+MzUpCgkJCXsKCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJfQoJCX0KCQl7CgkJCWlmIChuaWJibGVfc3RlcDwzMikKCQkJewoJCQkJbmliYmxlX21hc2tbMF09KCgweGZmZmZmZmZmKSYofigxPDxuaWJibGVfc3RlcCkpKTsKCQkJCW5pYmJsZV9tYXNrWzFdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMl09KCgweGZmZmZmZmZmKSk7CgkJCX0KCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8NjQpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMV09KCgweGZmZmZmZmZmKSYofigxPDwobmliYmxlX3N0ZXAtMzIpKSkpOwoJCQkJbmliYmxlX21hc2tbMl09KCgweGZmZmZmZmZmKSk7CgkJCX0KCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8OTYpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMV09KCgweGZmZmZmZmZmKSk7CgkJCQluaWJibGVfbWFza1syXT0oKDB4ZmZmZmZmZmYpJih+KDE8PChuaWJibGVfc3RlcC02NCkpKSk7CgkJCX0KCQl9CgkJaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCXsKCQkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCQkJewoJCQkJbmliYmxlX3NhdmVfb2Zmc2V0PTA7CgkJCQluaWJibGVfbWF4PTEwOwoJCQkJbmliYmxlX21hc2tbMF09IDB4MzA7CgkJCQluaWJibGVfbWFza1sxXT0gMDsKCQkJCW5pYmJsZV9tYXNrWzJdPSAwOwoJCQkJaWYoKGRyYW1fdHlwZT09Q09ORklHX0REUl9UWVBFX0xQRERSMykpCgkJCQl7CgkJCQkJbmliYmxlX21hc2tbMF09IDB4M2UzOwoJCQkJfQoJCQkJaWYoKGRyYW1fdHlwZT09Q09ORklHX0REUl9UWVBFX0xQRERSNCkpCgkJCQl7CgkJCQkJbmliYmxlX21hc2tbMF09IDB4MjczOwoJCQkJCWlmKChjaGFubmVsX21vZGU9PUNPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDApKQoJCQkJCQluaWJibGVfbWFza1swXT0gMHgzZjM7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQluaWJibGVfbWFza1swXT0gMDsKCQkJCW5pYmJsZV9tYXNrWzFdPSAwOwoJCQkJbmliYmxlX21hc2tbMl09IDA7CgkJCX0KCQl9CgoJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOyAvL3MKCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCQlpZigobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTB4ZmZmZikKCQl8fChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MCkKCQl8fChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MSkgKQoJCXsKCQkJcHJpbnRmKCJcbm5pYmJsZV9zdGVwICA9PSVkICIsIG5pYmJsZV9zdGVwKTsKCQkJaWYoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0weGZmZmYpCgkJCXx8KG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0wKSkKCQkJewoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MTsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoKCQkJCWlmKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildPT0wKQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildPQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildLTE7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTiksCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCX0KCgkJCQl7CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19GQUlMOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAkKCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQl9CgoJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlICYmIGNzMV90ZXN0X3NpemUpCgkJCQl7CgkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczBfdGVzdF9zdGFydDsKCQkJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJCQl9CgkJCQlpZih0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvLwkKCQkJCQlpZighZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19QQVNTOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsa2VybmVsX3dhdGNoZG9nX3MpOwoJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJfQoJCQkJCS8qCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCSovCgkJCQl9CgkJCX0KCQkJZWxzZSBpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTEpCgkJCXsvL2dvIG9uIGZpbmQgbGVmdCBlZGdlCgoJCQkJaWYobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV09PTApCgkJCQl7CgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgoJCQkJaWYoKG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKT09VEVTVF9BUkdfRVJST1JfRkxBR19QQVNTKQoJCQkJewoJCQkJCXsKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCX0KCQkJCQl7CgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfTlVMTDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJaWYoKG51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKT09VEVTVF9BUkdfRVJST1JfRkxBR19GQUlMKQoJCQkJewoJCQkJCXsKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV09CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildLTE7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKSwJCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCQl9CgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX0ZBSUw7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQl9CgkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCAoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKSk7CgkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9MRUZULAoJCQkJCSggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCWlmKGFsbF90b2dodGVyX2VuYWJsZSYmY3MxX3Rlc3Rfc2l6ZSkKCQkJCQl7CgkJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCQkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQkJCQl9CgkJCQkJaWYodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJLy8JCgkJCQkJCWlmKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUzsKCQkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJfQoJCQkJCQkvKgkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkqLwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLwlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCX0KCQkKCQlpZigobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTIpfHwKCQkobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTMpKQoJCXsKCQkJcHJpbnRmKCJcbm5pYmJsZV9zdGVwICA9PSVkICIsIG5pYmJsZV9zdGVwKTsKCQkJaWYoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0yKQoJCQl8fChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MikpCgkJCXsKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTM7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCgkJCQlpZihudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT09MCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT00OwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT0KCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXS0xOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQl9CgoJCQkJewoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJfQoJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfUklHSFQsCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pOwoJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCWlmKGFsbF90b2dodGVyX2VuYWJsZSYmY3MxX3Rlc3Rfc2l6ZSkKCQkJCXsKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQkJCX0KCQkJCWlmKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCS8vCQoJCQkJCWlmKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF93YXRjaGRvZ19zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIixrZXJuZWxfd2F0Y2hkb2dfcyk7CgkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQl9CgkJCQkJLyoJCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJKi8KCQkJCX0KCQkJfQoJCQllbHNlIGlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MykKCQkJey8vZ28gb24gZmluZCBsZWZ0IGVkZ2UKCQkJCWlmKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldPT0wKQoJCQkJewoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTQ7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJCWlmKChudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk9PVRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUykKCQkJCXsKCQkJCQl7CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTQ7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQl9CgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX05VTEw7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCWlmKChudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk9PVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTCkKCQkJCXsKCQkJCQl7CgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldPQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXS0xOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCksCQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19GQUlMOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJfQoJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgKCBudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSkpOwoJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKSk7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZihhbGxfdG9naHRlcl9lbmFibGUmJmNzMV90ZXN0X3NpemUpCgkJCQkJewoJCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQkJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJCQkJfQoJCQkJCWlmKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWlmKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUzsKCQkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJfQoKCQkJCQkJLyoJCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJKi8KCQkJCQl9CgkJCQl9CgkJCX0KCQkJLy8JcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl9CgoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJewoJCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgkJfQoJfQoKCXByaW50ZigiMTFudW1fYXJyeVtURVNUX0FSR18yX1NURVBdPT0lZFxuIixudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09KG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pKzE7CglkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCXByaW50ZigiMjJudW1fYXJyeVtURVNUX0FSR18yX1NURVBdPT0lZFxuIixudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCS8vfQoKCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCglwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgkvL30KCS8vZm9yKHRlc3RfaW5kZXg9MTt0ZXN0X2luZGV4PHRlc3RfaW5kZXhfbWF4IDt0ZXN0X2luZGV4KysgKQoJewoJCXVuc2lnbmVkIGludCAgdWlfMV8zMl8xMDBzdGVwPSAwOwoJCXVuc2lnbmVkIGludCAgYmRscl8xMDBzdGVwPSAwOwoJCXVpXzFfMzJfMTAwc3RlcD0oMTAwMDAwMCoxMDAvKGdsb2JhbF9kZHJfY2xrKjIqMzIpKTsKCQliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7CgkJLy9pZigoKCh0ZXN0X2luZGV4X2VuYWJsZSk+Pih0ZXN0X2luZGV4LTEpKSYxKT09MCkKCgkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsYmRscl8xMDBzdGVwPSVkIHBzLHVpXzFfMzJfMTAwc3RlcD0lZCBwcyxcbiIsMCwwLGdsb2JhbF9kZHJfY2xrLAoJCWJkbHJfMTAwc3RlcCx1aV8xXzMyXzEwMHN0ZXApOwoKCQlwcmludGYoIlxuIHRlc3QgcmVzdWx0IGluZGV4PT0iKTsKCQlwcmludGYoIiUwOGQiLHRlc3RfaW5kZXgpOwoKCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkJCXByaW50ZigiIGFjIHdpbmRvdzoiKTsKCQkJcHJpbnRmKCIgc3RlcF9zaXplIHBzPT0iKTsKCQkJcHJpbnRmKCIlMDhkIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlwcmludGYoIi8xMDAgcHMgIik7CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCQlwcmludGYoIiB0eGRxcyB3aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQkJcHJpbnRmKCIgcnhfY2xrX3dpbmRvdzoiKTsKCQkJcHJpbnRmKCIgc3RlcF9zaXplIHBzPT0iKTsKCQkJcHJpbnRmKCIlMDhkIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlwcmludGYoIi8xMDAgcHMgIik7CgkJfQoJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB7CgkJCXByaW50ZigiIHR4X2JpdF9kcV93aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCQlwcmludGYoIiByeF9iaXRfZHFfd2luZG93Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsYmRscl8xMDBzdGVwKTsvLzQ4MHBzCgkJCXByaW50ZigiLzEwMCBwcyAiKTsKCQl9CgkJcHJpbnRmKCJkZHIgY2xrIGZyZXF1ZW5jeSA6ICIpOwoJCXByaW50ZigiJTA4ZCIsKGdsb2JhbF9kZHJfY2xrKSk7CgkJcHJpbnRmKCJNaHogIik7CgkJcHJpbnRmKHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoImluZGV4ICAgIG9yZyAgICAgIG1pbiAgICAgIG1heCAgICAgIGxlZnQgICAgIHJpZ2h0ICAgIGRlYyB2cmVmX3JhbmdlIHZyZWZfY291bnQiKTsKCQlwcmludGYoc3RyaW5nX3ByaW50X2ZsYWcpOwoKCQljaGFyIGRlbGF5X2xlZnRfbWFyZ2luPTA7CgkJY2hhciBkZWxheV9yaWdodF9tYXJnaW49MDsKCQlpZihhbGxfdG9naHRlcl9lbmFibGU9PTEpCgkJewoJCQluaWJibGVfbWF4PTE7CgkJfQoJCWZvciAoIG5pYmJsZV9zdGVwPTA7bmliYmxlX3N0ZXA8bmliYmxlX21heDtuaWJibGVfc3RlcCsrKQoJCXsKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oZGVsYXlfbWFydGl4W2NvdW50XS5hZGRfaW5kZXgsOCk7CgkJCXByaW50ZigiJTA4ZCIsbmliYmxlX3N0ZXApOwoJCQlwcmludGYoIiAiKTsKCQkJcHJpbnRmKCIlMDhkIiwwKTsKCQkJLy9zZXJpYWxfcHV0cygiICIpOwoJCQkvL2lmICgodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpICkKCQkJewoJCQkJewoJCQkJCXByaW50ZigiICIpOwoJCQkJCXByaW50ZigiJTA4ZCIsMC8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NSU5dCgkJCQkJCSk7CgkJCQl9CgkJCX0KCQkJewoJCQkJewoJCQkJCXByaW50ZigiICIpOwoJCQkJCXByaW50ZigiJTA4ZCIsMC8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NQVhdCgkJCQkJCSk7CgkJCQl9CgkJCX0KCQkJCQoJCQkvLwlkZWxheV9sZWZ0X21hcmdpbj0oKG51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfT1JHXT5udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01JTl0pPwoJCQkvLwkJKG51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfT1JHXS1udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01JTl0pOjApOwoJCQkvLwlkZWxheV9yaWdodF9tYXJnaW49KChudW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01BWF0+bnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9PUkddKT8KCQkJLy8JCShudW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX01BWF0tbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9PUkddKTowKTsKCQkJZGVsYXlfbGVmdF9tYXJnaW49bnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV07CgkJCWRlbGF5X3JpZ2h0X21hcmdpbj1udW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXTsKCQkJcHJpbnRmKCIgIik7CgkJCXByaW50ZigiJTA4ZCIsZGVsYXlfbGVmdF9tYXJnaW4pOwoKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oKGRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfb3JnPmRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfbWluKT8oZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9vcmctZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9taW4pOjAsOCk7CgkJCXByaW50ZigiICIpOwoJCQlwcmludGYoIiUwOGQiLGRlbGF5X3JpZ2h0X21hcmdpbik7CgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKChkZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X21heD5kZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X29yZyk/KGRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfbWF4LWRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfb3JnKTowLDgpOwoJCQlwcmludGYoIiAgICAgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCXByaW50ZigiICAgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCXByaW50ZigiICAgMmQtZXllIik7IC8vcF9kZXYtPmN1cl90eXBlCgkJCXByaW50ZigiIGRyYW10eXBlICIpOwoJCQlwcmludGYoIiUwOGQiLDApOwoJCQlwcmludGYoIiAiKTsKCQkJcHJpbnRmKCIlMDhkIiwoZ2xvYmFsX2Rkcl9jbGspKTsKCQkJcHJpbnRmKCIgTSBiZGwgIik7CgkJCXByaW50ZigiJTA4ZCIsYmRscl8xMDBzdGVwKTsvLzQ4MHBzCgkJCXByaW50ZigiIC8xMDAgcHMgIik7CgkJCXByaW50ZigiMS8zMnN0ZXA9PSAiKTsKCQkJcHJpbnRmKCIlMDhkIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlwcmludGYoIiAvMTAwIHBzICIpOwoJCQkvL3NlcmlhbF9wdXRzKCJiaXRfaW5pdF92YWx1ZSAiKTsKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24oKHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9yZWFkX3Blcl9iaXRfaW5pdF92YWx1ZSksNCk7CgkJCS8vaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKXsKCQkJLy9zZXJpYWxfcHV0cygidHhkcXNkbHlfc2Vjb25kX3R1bmVfbWluX3ZhbHVlICIpOwoJCQkvL3NlcmlhbF9wdXRfZGVjX291dF9hbGlnbih0eGRxc2RseV9zZWNvbmRfdHVuZV92YWx1ZVtjb3VudF0sNCk7CgkJCQkvL30KCQkJcHJpbnRmKHN0cmluZ19wcmludF9mbGFnKTsKCQkJLy9zZXJpYWxfcHV0cygiXG4iKTsKCQl9Cgl9Cn0KfQp9CgoJaWYoY29uZmlnX3JlZ2lzdGVyPT0xKQoJewoJCWlmKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF09PTApCgkJewoJCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsCW51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCX0KCX0KCglpZigoZW5hYmxlX2tlcm5lbF90ZXN0KSYmKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0+MSkpCgkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJcmV0dXJuIHJlZ192YWx1ZTsKfQojZWxzZQppbnQgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGlja3koY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXJkZHJfdGVzdF9kcXNfd2luZG93IGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiXG5kZHJfdGVzdF9jbWQgMHgyNyBhIDAgMHg4MDAwMCBucyBsYW5lX2Rpc2FibGUgYWRkX3Rlc3Rfc2l6ZSAgIC0tLSB3YXRjaGRvZyBzaG91bGQgPjE1c1xuIik7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoKCXVuc2lnbmVkIGludCAgIGxhbmVfc3RlcD0gMDsKCXVuc2lnbmVkIGludCAgIHJlZ192YWx1ZT0gMDsKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgljaGFyICplbmRwOwoJY2hhciAqYnVmOwoJYnVmPSIiOwoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgoKCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCX0KCgoKCWlmIChhcmdjID40KSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMjA7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoKCWlmIChhcmdjID41KSB7CgkJbGFuZV9kaXNhYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWxhbmVfZGlzYWJsZT0gMDsKCQl9Cgl9CglwcmludGYoImxhbmVfZGlzYWJsZT09MHglMDh4XG4iLGxhbmVfZGlzYWJsZSk7CgoJdW5zaWduZWQgaW50ICBhZGRfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJaWYgKGFyZ2MgPjYpIHsKCQlhZGRfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWFkZF90ZXN0X3NpemU9IGRkcl90ZXN0X3NpemU7CgkJfQoJfQoJcHJpbnRmKCJhZGRfdGVzdF9zaXplPT0weCUwOHhcbiIsYWRkX3Rlc3Rfc2l6ZSk7CgkvL2FyZ2MyPTU7CgkvL2ZvcihpID0gMTtpPChhcmdjKTtpKyspCgl7CgkJLy9hcmd2MltpLTFdPWFyZ3ZbaV07Cgl9CgoJLy9hcmd2MlswXT1hcmd2WzFdOwoJLy9hcmd2MlsxXT1hcmd2WzJdOwoJLy9hcmd2MlsyXT1hcmd2WzNdOwoJLy8jaW5jbHVkZSA8c3RkaW8uaD4KCS8vICAgdW5zaWduZWQgaW50ICAgd3JfYWRqX3BlclsyNF0gOwoJLy9pZigxKQoKCXByaW50ZigiXG50ZXN0IHVzZSB1Ym9vdCBzdGlja3kgcmVnaXN0ZXJcbiIpOwoKCS8vRE1DX1NUSUNLWV8wCgoKCWNoYXIgc3RyWzEwMjRdPSIiOwoJY2hhciBzdHJfdGVtcDFbMTAyNF09IiI7CgljaGFyIHN0cl90ZW1wMlsxMDI0XT0iIjsKCS8vY29uc3QgY2hhciAqczsKCXVuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs0OF07CgkvL3N0cl9idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqMTAyNCk7CgoJdW5zaWduZWQgaW50ICpudW1fYXJyeTsKCS8vdW5zaWduZWQgaW50ICpudW1fYXJyeV90ZW1wOwoJLy91bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUwPU5VTEw7CgkvL3Vuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTE9TlVMTDsKCS8vdW5zaWduZWQgaW50ICpudW1fYXJyeV9sYW5lMj1OVUxMOwoJLy91bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUzPU5VTEw7CgkvL2NoYXIgKm5hbWVfbGFuZTA7IAoJLy9jaGFyICpuYW1lX2xhbmUxOyAKCS8vY2hhciAqbmFtZV9sYW5lMjsgCgkvL2NoYXIgKm5hbWVfbGFuZTM7IAoJbnVtX2FycnkgPSAodW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglpbnQgaTsKCS8vY2hhciAqdmFybmFtZTsgIGNoYXIgKmVudl9sY2Rscl90ZW1wX2NvdW50OwoJdW5zaWduZWQgaW50IGxjZGxyX3RlbXBfY291bnQ9MDsKCS8vIGNvbnN0IGNoYXIgKnRlbXBfcztjb25zdCBjaGFyICp0ZW1wX3MxOwoJLy8gaW50IHZhbHVlPTA7CgoJLy8jZGVmaW5lIERNQ19TVElDS1lfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM5ODAwKQoJLy8jZGVmaW5lIERNQ19TVElDS1lfTUFHSUNfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIzNDU2NzgKCS8vI2RlZmluZSBETUNfU1RJQ0tZX01BR0lDXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGFiY2RiZWFkCgkvL3Vuc2lnbmVkIGludCBkbWNfc3RpY2t5WzY0XTsKCS8vdW5zaWduZWQgaW50IHN0aWNreV9yZWdfYmFzZV9hZGQ9MDsKCS8vdmFybmFtZT0iZW52X2RkcnRlc3RfZGF0YV9sYW5lIjsKCS8vbmFtZV9sYW5lMD0iZGRyX3Rlc3RfZGF0YV9sYW5lMCI7CgkvL25hbWVfbGFuZTE9ImRkcl90ZXN0X2RhdGFfbGFuZTEiOwoJLy9uYW1lX2xhbmUyPSJkZHJfdGVzdF9kYXRhX2xhbmUyIjsKCS8vbmFtZV9sYW5lMz0iZGRyX3Rlc3RfZGF0YV9sYW5lMyI7CgkvL2Vudl9sY2Rscl90ZW1wX2NvdW50PSJsY2Rscl90ZW1wX2NvdW50IjsKCgoJey8vaT0wOwoJCS8vd2hpbGUoc190ZW1wKQoJCXsKCgoKCQkJc3RpY2t5X3JlZ19iYXNlX2FkZD0oRERSMF9QVUJfUkVHX0JBU0UmMHhmZmZmMDAwMCkrKChETUNfU1RJQ0tZXzApJjB4ZmZmZik7CgoJCQlmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykgewoJCQkJZG1jX3N0aWNreVtpXT1yZF9yZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpOwoJCQkJLy9wcmludGYoInN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeVtpXSk7CgkJCX0KCgkJCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CgkJCQludW1fYXJyeVtpXT1kbWNfc3RpY2t5W2ldOwoJCQkJcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksbnVtX2FycnlbaV0pOwoJCQl9CgoJCQkvL2xjZGxyX3RlbXBfY291bnQ9bnVtX2FycnlbNV07CgoKCgkJfQoJfQoKCgoKCS8vLyoKCS8vaWYoMSkKCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMF9jbWQwID0wOyAgLy9tYXN0ZXIgY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMV9jbWQxID0wOyAgLy9taW4gY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgbGFuZTAgdyBtaW4gIC0yIGxhbmUwIHcgbWF4IC0zIGxhbmUwIHIgbWluICAgIDQgbGFuZTAgciBtYXggLS0tLS01IGxhbmUxIHcgbWluIC4uLgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgkvLyAgdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJLy9jaGFyIHN0clsyNF07Cgl1bnNpZ25lZCBpbnQgYm9vdF90aW1lcz0wOwoKCXRlc3RfYXJnXzBfY21kMD1udW1fYXJyeVswXTsKCXRlc3RfYXJnXzFfY21kMT1udW1fYXJyeVsxXTsKCXRlc3RfYXJnXzJfc3RlcD1udW1fYXJyeVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyeVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycnlbNF07Cglib290X3RpbWVzPW51bV9hcnJ5WzVdOwoJbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyeVs2XTsKCXByaW50ZigidGVzdF9hcmdfMF9jbWQwPT0lZFxuIix0ZXN0X2FyZ18wX2NtZDApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2NtZDE9PSVkXG4iLHRlc3RfYXJnXzFfY21kMSk7CglwcmludGYoInRlc3RfYXJnXzJfc3RlcD09JWRcbiIsdGVzdF9hcmdfMl9zdGVwKTsKCXByaW50ZigidGVzdF9hcmdfM19mcmVxPT0lZFxuIix0ZXN0X2FyZ18zX2ZyZXEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPT0lZFxuIix0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzKTsKCXByaW50ZigidGVzdF9hcmdfNSBib290dGltZXM9JWRcbiIsbnVtX2FycnlbNV0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ182IGxjZGxyX3RlbXBfY291bnQ9JWRcbiIsbnVtX2FycnlbNl0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ183PSVkXG4iLG51bV9hcnJ5WzddKTsKCglpZigobnVtX2FycnlbN109PURNQ19TVElDS1lfTUFHSUNfMSkpIC8vZm9yIGNoZWNrIG1hZ2ljIG51bWJlciBtYWtlIHN1bWUgZW50ZXIgdGVzdCBjb21tYW5kCgl7Ym9vdF90aW1lcysrOwoKCX0KCWVsc2UKCXtib290X3RpbWVzPTA7CgkJcHJpbnRmKCJ0ZXN0X3N0aWNreSBpcyBub3QgbWFnaWMgbnVtbWJlcixib290IHRpbWVzPT0lZFxuIixib290X3RpbWVzKTsKCQkvLyB3cml0ZWwoRE1DX1NUSUNLWV9NQUdJQ18wLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCXdyaXRlbChETUNfU1RJQ0tZX01BR0lDXzEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDc8PDIpKSk7CgkJdGVzdF9hcmdfMl9zdGVwPTA7CgkJbnVtX2FycnlbNl09MDsKCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJLy9yZXR1cm4gMTsKCX0KCW51bV9hcnJ5WzVdPWJvb3RfdGltZXM7CgoJd3JpdGVsKG51bV9hcnJ5WzVdLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg1PDwyKSkpOwoKCS8vaWYodGVzdF9hcmdfMl9zdGVwKQoJaWYodGVzdF9hcmdfMl9zdGVwKQoJewoJCWlmKHRlc3RfYXJnXzNfZnJlcSE9Z2xvYmFsX2Rkcl9jbGspICAvLwoJCXsKCQkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzJWQsd2lsbCByZWJvb3QgdXNlIGQycGxsIFxuIixnbG9iYWxfZGRyX2Nsayx0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIix0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoJaWYodGVzdF9hcmdfMl9zdGVwPT0wKQoJewoJCXsKCQkJdGVzdF9hcmdfMF9jbWQwPTB4MjI7CgkJCXRlc3RfYXJnXzFfY21kMT0wOwoJCQl0ZXN0X2FyZ18yX3N0ZXA9MTsKCQkJdGVzdF9hcmdfM19mcmVxPWdsb2JhbF9kZHJfY2xrOwoJCQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPTA7CgkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJbnVtX2FycnlbMF09dGVzdF9hcmdfMF9jbWQwOwoJCQludW1fYXJyeVsxXT10ZXN0X2FyZ18xX2NtZDE7CgkJCW51bV9hcnJ5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCQkJbnVtX2FycnlbM109dGVzdF9hcmdfM19mcmVxOwoJCQludW1fYXJyeVs0XT10ZXN0X2FyZ180X3N0ZXBfc3RhdHVzOwoJCQludW1fYXJyeVs1XT1ib290X3RpbWVzOwoJCQlsY2Rscl90ZW1wX2NvdW50PW51bV9hcnJ5WzZdOwoJCQludW1fYXJyeVs2XT1sY2Rscl90ZW1wX2NvdW50OwoJCQludW1fYXJyeVs3XT1ETUNfU1RJQ0tZX01BR0lDXzE7CgkJCWZvciAoaSA9IDg7IGkgPCA0ODsgaSsrKSB7CgkJCQludW1fYXJyeVtpXT0wOwoJCQl9CgoJCQlmb3IgKGxhbmVfc3RlcCA9IDA7IGxhbmVfc3RlcCA8IDQ7IGxhbmVfc3RlcCsrKQoJCQl7CgkJCQkvL2lmKGxhbmVfc3RlcCUyKQoJCQkJewojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdPSgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpJjB4ZmYpOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdPSgoKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpPj44KSYweGZmKTsKI2Vsc2UKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdPSgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpJjB4MWZmKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXT0oKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMykKCQkJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjMpKT4+MCkmMHgxZmYpOwoKCQkJCQlwcmludGYoImxjZGxyMSAlZCAgJTA4eCwlMDh4LCUwOHhcbiIsIGxhbmVfc3RlcCwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpLAoJCQkJCQkJKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQkJCQkJCQkgRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKSkmMHgxZmYpLGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0pOwoJCQkJCXByaW50ZigibGNkbHIzICVkICAlMDh4LCUwOHgsJTA4eFxuIiwgbGFuZV9zdGVwLCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjMpCgkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMyksCgkJCQkJCQkoKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCQkJCQkJCQkgIEREUjBfUFVCX0RYMExDRExSMykKCQkJCQkJCQkJICtERFIwX1BVQl9EWDBMQ0RMUjMpKT4+MCkmMHgxZmYpLGRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdKTsKI2VuZGlmCgoJCQkJCS8vcHJpbnRmKCJsY2RscjEgJWQgICUwOHhcbiIsIGxhbmVfc3RlcCwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkvL0REUjBfUFVCX0RYMExDRExSMSkKCQkJCQkvLytERFIwX1BVQl9EWDBMQ0RMUjEpKTsKCQkJCQkvL3ByaW50ZigibGNkbHIzICVkICAlMDh4XG4iLCBsYW5lX3N0ZXAsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjMtCgkJCQkJLy9ERFIwX1BVQl9EWDBMQ0RMUjMpCgkJCQkJLy8rRERSMF9QVUJfRFgwTENETFIzKSk7CgkJCQkJLy9kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXT0wOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdPTB4ZmZmZjsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXT0weGZmZmY7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCX0KCQkJCS8vZWxzZQoJCQkJewoJCQkJCS8vZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXT0wOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF09MHhmZmZmOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF09MHhmZmZmOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCX0KCQkJfQoKCQkJewoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hPSgocmVhZGwoRERSMF9QVUJfQUNMQ0RMUikpJkFDTENETFJfTUFYKTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYT0weGZmZmY7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E9MHhmZmZmOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTA7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hPSgocmVhZGwoRERSMF9QVUJfQUNCRExSMCkpJkFDQkRMUl9NQVgpOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYT0weGZmZmY7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hPTB4ZmZmZjsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MDsKCQkJfQoKCgojaWYgMSAvLyggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgxR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgyR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgzR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSk7CgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwxOyAgICAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDEpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDIpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDMpOyAgIAoKI2VuZGlmCgkJCWlmKGxhbmVfZGlzYWJsZSkKCQkJe2lmKGxhbmVfZGlzYWJsZSYweDEpewoJCQkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbMF09NDsKCQkJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVswXT00OwoJCQkJCQkJCSB9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIpewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbMV09NDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVsxXT00OwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDQpewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbMl09NDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVsyXT00OwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDgpewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbM109NDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVszXT00OwoJCQl9CgkJCXByaW50ZigibGFuZV9kaXNhYmxlPT0leFxuIixsYW5lX2Rpc2FibGUpOwoJCQlpZihsYW5lX2Rpc2FibGUmMHgxMCl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9NDsKCQkJCXByaW50ZigiZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0leFxuIixkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2EpOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIwKXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9NDsKCQkJCXByaW50ZigiZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09JXhcbiIsZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYSk7CgoJCQl9CgkJCX0KCgkJCXsKCQkJCWZvciAobGFuZV9zdGVwID0gMDsgbGFuZV9zdGVwIDwgNDsgbGFuZV9zdGVwKyspCgoKCQkJCXsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQl9CgoKCgoJCQkJbGFuZV9zdGVwPTQ7CgkJCQl7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCX0KCQkJfQoKCgoJCX0KCgoKCgkJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCS8vc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQl9CgoKCgl9CgoJdGVzdF9hcmdfMl9zdGVwKys7CgludW1fYXJyeVsyXT10ZXN0X2FyZ18yX3N0ZXA7CglzcHJpbnRmKHN0ciwgIjB4JTA4eCIsIG51bV9hcnJ5WzBdKTsKCXByaW50ZigiJWQgICVkXG4iLCAwLG51bV9hcnJ5WzBdKTsKCWZvciAoaSA9IDE7IGkgPCA0ODsgaSsrKSB7CgkJLy9udW1fYXJyeVtpXT0wOwoJCXNwcmludGYoc3RyLCAiJXM7MHglMDh4Iiwgc3RyLG51bV9hcnJ5W2ldKTsKCQlwcmludGYoIiVkICAlZFxuIiwgaSxudW1fYXJyeVtpXSk7CgoJfQoJLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKCXByaW50ZigiJXMiLCBzdHIpOwoJLy8gc2V0ZW52KHZhcm5hbWUsIHN0cik7CgkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCglmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoKCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7Cgl9CgoKCWZvciAoaSA9IDg7IGkgPCA0ODsgaSsrKSB7CgkJbnVtX2FycnlbaV09cmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJcHJpbnRmKCJkZHJfdGVzdF9kYXRhX251bV8lMDRkPT0lZFxuIixpLG51bV9hcnJ5W2ldKTsKCX0KCgkvLy8qCgl7CgkJZm9yIChsYW5lX3N0ZXAgPSAwOyBsYW5lX3N0ZXAgPCA0OyBsYW5lX3N0ZXArKykKCQl7CgkJCXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdOwoJCQl9CgkJCXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XTsKCQkJfQoKCgkJfQoJCWxhbmVfc3RlcD00OwoJCXsKCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN107CgkJfQoJfQoJLy8qLwoKCgoKCWlmIChjaGFubmVsX2FfZW4pCgl7CgoJCS8vKihjaGFyICAgICAqKShhcmd2MlswXSk9ImEiOwoJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMTEgYSAwIDB4ODAwMDAgICIsMCk7CgkJcHJpbnRmKCJcbnRlc3QgZHFzIHdpbmRvdyBsYW5lIGFcbiIpOwoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUod2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix3YXRjaGRvZ190aW1lX3MpOwoKCQkJLyoKCQkJICAgewoJCQkgICBsY2Rscl90ZW1wX2NvdW50PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCSAgIHNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCSAgIHByaW50ZiggIiVzIiwgYnVmKTsKCQkJICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkgICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCSAgIH0KCQkJICAgKi8KCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTB4ZmZmZikKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpCgkJCSAgKQoJCQl7CgkJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKQoJCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKSkKCQkJCXsJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MTsKCQkJCQl7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJCX0KCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCS8vICAgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCS8vCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJfQoKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQgMSIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzApLDIpOwoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0xKQoJCQkJewoJCQkJCS8vICB0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJLy8JIGlmKHRlbXBfcykKCQkJCQkvLwkgCXsKCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCS8vCgkJCQkJLy8JIAl9CgkJCQkJbGNkbHJfdGVtcF9jb3VudD1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF07CgkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF07CgoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCsxOwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJLy8gICAgICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJfQoKCgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09Mil8fAoJCQkJCShkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0zKSkKCQkJewoJCQkJLy8JaWYoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0pPT0weGZmZmYpCgkJCQkvLwkJe2RxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCS8vCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJLy8gICAgICAgICAgICAgcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCS8vCQl9CgoJCQkJewoJCQkJCWlmKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpCgkJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCQl9CgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCQkvLyAgICAgICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJLy8JCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMCksMSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTQ7CgoJCQkJCX0KCQkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0zKQoJCQkJCXsKCQkJCQkJLy8gICB0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCS8vIGlmKHRlbXBfcykKCQkJCQkJLy8JewoJCQkJCQkvLwoJCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCQkvLyAJfQoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSByZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTQ7CgkJCQkJfQoKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQkJewoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMjsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy8gIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCX0KCgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTB4ZmZmZikKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKQoJCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0xOwoJCQkJCXsKCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCS8vCSBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCX0KCQkJCQl7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkvLyAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkvLwlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCS8vaT02OwoJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJfQoKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQgMSIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDIpOwoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgoJCQkJfQoJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpCgkJCQl7CgkJCQkJLy8gIHRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkvLyBpZih0ZW1wX3MpCgkJCQkJLy8gCXsKCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCS8vIAl9CgkJCQkJbGNkbHJfdGVtcF9jb3VudD0gcmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7IAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCQkJCX0KCgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCXsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrNTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCS8vCSBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCS8vCSBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCS8vICAgICAgICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJfQoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09Mil8fAoJCQkJCShkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MykpCgkJCXsKCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpCgkJCQkJewkKCgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQkJfQoKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJCS8vICAgICAgIHNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCS8vCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT00OwoKCQkJCQl9CgkJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpCgkJCQkJewoJCQkJCQkvLyAgdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkvLwkgaWYodGVtcF9zKQoJCQkJCQkvLyAJewoJCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCQkvLyAJfQoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSByZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsgCgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTQ7CgkJCQkJfQoKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkJLy8JbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCgkJCQkJewoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNjsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCS8vCSBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgkJCS8qCgkJCSAgIGlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKXx8CgkJCSAgIChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkpCgkJCSAgIHtkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkgICBzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMisxKSwyKTsKCQkJICAgcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTE7CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpfHwKCQkJKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKSkKCQkJe2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MzsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJKi8JCgoKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJe3ByaW50ZigiY2xvc2UgIHdhdGNoZG9nXG4iKTsKCQkJfQoKCgkJfQoKCgoJfQoKCWlmIChjaGFubmVsX2FfZW4pCgl7CgoJCS8vKihjaGFyICAgICAqKShhcmd2MlswXSk9ImEiOwoJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMTEgYSAwIDB4ODAwMDAgICIsMCk7CgkJcHJpbnRmKCJcbnRlc3QgbGNkbHIgYWMgYmRsciB3aW5kb3cgbGFuZSBhLi4uXG4iKTsKCgkJewoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUod2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix3YXRjaGRvZ190aW1lX3MpOwoJCQlwcmludGYoIlxuZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hICVkIFxuIixkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2EpOwoJCQlsYW5lX3N0ZXA9NDsKCQkJLy9lbnZfbGNkbHJfdGVtcF9jb3VudD0ibGNkbHJfdGVtcF9jb3VudF9hIjsKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT49MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTEpCgkJCSAgKQoJCQl7CgkJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPj0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9MTsKCQkJCQl7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJCXByaW50ZigiYWNsY2Rscl9zdGF0dXNfYT09MHglMDh4XG4iLG51bV9hcnJ5W2ldKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCS8vCSBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4yMjJ0ZXN0IGxjZGxyIGFjIGJkbHIgd2luZG93IGxhbmUgYS4uLlxuIik7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkvLyAgICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkvLwkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJfQoKCQkJCQlwcmludGYoIlxuMzMzdGVzdCBsY2RsciBhYyBiZGxyIHdpbmRvdyBsYW5lIGEuLi5cbiIpOwoJCQkJCS8vZGRyX3R1bmVfYWNsY2Rscl9zdGVwCgkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixhZGRfdGVzdF9zaXplLCggMCksMik7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCXByaW50ZigiYWNsY2Rscl9zdGF0dXNfYTE9PTB4JTA4eFxuIixudW1fYXJyeVtpXSk7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTEpCgkJCQl7CgkJCQkJLy8gICAgIHRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkvLyBpZih0ZW1wX3MpCgkJCQkJLy8gCXsKCQkJCQkvL2xjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJLy8gCX0KCQkJCQlsY2Rscl90ZW1wX2NvdW50PXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E7CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hOwoJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCsxOwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCS8vICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJfQoKCgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0yKXx8CgkJCQkJKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MykpCgkJCXsKCQkJCS8vCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdKT09MHhmZmZmKQoJCQkJLy8JCXtkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCQkvLwkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCS8vICAgICAgICAgICAgIHJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkvLwkJfQoKCQkJCXsKCQkJCQlpZihkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTIpCgkJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQkJfQoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkJLy8gICAgICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJLy8JCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQgMSIsYWRkX3Rlc3Rfc2l6ZSwoIDApLDEpOwoJCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTQ7CgoJCQkJCX0KCQkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTMpCgkJCQkJewoJCQkJCQkvLyAgIHRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJLy8JIGlmKHRlbXBfcykKCQkJCQkJLy8gCXsKCQkJCQkJLy8JbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQkJLy8gCX0KCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gcmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9NDsKCQkJCQl9CgoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E7CgkJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgkJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCQl7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCsyOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy8gIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCX0KCgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTApCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTApKQoJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0xOwoJCQkJCXsKCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQl9CgkJCQkJewoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJLy8gICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkvLwkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbNl0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJfQoKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHglMDh4ICVkICVkIDEiLGFkZF90ZXN0X3NpemUsKCAxKSwyKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTI7CgoJCQkJfQoJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MSkKCQkJCXsKCQkJCQkvLyAgdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCS8vCSBpZih0ZW1wX3MpCgkJCQkJLy8gCXsKCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCS8vIAl9CgkJCQkJbGNkbHJfdGVtcF9jb3VudD0gcmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MjsKCQkJCX0KCgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hOwoJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCXsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrNTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkvLyAgICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJfQoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0yKXx8CgkJCQkJKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTMpKQoJCQl7CgoJCQkJewoJCQkJCWlmKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTIpCgkJCQkJewkKCgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MzsKCQkJCQkJewoJCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E7CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQkJfQoKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJCS8vICAgIHNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCS8vCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixhZGRfdGVzdF9zaXplLCggMSksMSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTQ7CgoJCQkJCX0KCQkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0zKQoJCQkJCXsKCQkJCQkJLy8gIHRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJLy8gaWYodGVtcF9zKQoJCQkJCQkvLyAJewoJCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCQkvLyAJfQoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSByZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTQ7CgkJCQkJfQoKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkJLy8JbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCgkJCQkJewoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNjsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCS8vCSBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vICBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgkJCS8qCgkJCSAgIGlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKXx8CgkJCSAgIChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkpCgkJCSAgIHtkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkgICBzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMisxKSwyKTsKCQkJICAgcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTE7CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpfHwKCQkJKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKSkKCQkJe2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MzsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJKi8JCgoKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJe3ByaW50ZigiY2xvc2UgIHdhdGNoZG9nXG4iKTsKCQkJfQoKCgkJfQoKCgoJfQoKCWlmIChjaGFubmVsX2JfZW4pCgl7Ly8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYiI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBkcXMgd2luZG93IGxhbmUgYlxuIik7CgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8OCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4JTA4eCAlZCAxIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoKCQl9Cgl9CgoJdW5zaWduZWQgaW50ICAgYWNtZGxyPSAwOwoJdW5zaWduZWQgaW50ICBkZWxheV9zdGVwX3gxMDA9IDA7CglpZiAoY2hhbm5lbF9hX2VuKQoJewoJCWFjbWRscj0oKHJlYWRsKChERFIwX1BVQl9BQ01ETFIpKSkmQUNMQ0RMUl9NQVgpOwoJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXSk7CgkJfQoJCXsKCQkJcHJpbnRmKCJcbmFjX2xhbmVfMHglMDh4fGxjZF9vcmcgMHglMDh4ICB8bGNkX21pbiAweCUwOHggfGxjZF9tYXggMHglMDh4IDo6fGJkbHJfb3JnICAweCUwOHggIHxiZGxyX21pbiAweCUwOHggfGJkbHJfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCTQsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYSxkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2EsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hLGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2EpOwoJCX0KCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCQl7CgkJCXByaW50ZigiXG4gYWNfbGFuZV8weDAwMDAwMDB8ICBsY2Rscl9vcmcgIHxsY2Rscl9zZXQgcHN8bGNkbHJfaG9sZCBwczp8XAoJCQkJCWNsa19zZXR1cCAgcHN8IGNsa19ob2xkIHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCQkJcHJpbnRmKCJcbiBhY19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EsCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hLWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EtZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2ErZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hKSk7CgkJCXByaW50ZigiXG4gY2tfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSwKCQkJCQkwLAoJCQkJCTAsCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYS1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2EtZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2ErZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYSkpOwoJCX0KCQlwcmludGYoIlxuIGFfbGFuZV8weDAwMDAwMDAwfCB3cmRxX29yZyAweDB8d19zZXR1cCB4IHBzfHdfaG9sZCAgeCBwczo6fFwKCQkJCXJkX3NldHVwICBwc3xyZF9ob2xkIHggcHN8YWRqX3BlcmNlbnRbMTAwXVxuIik7CgoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0sCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0tZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMCwKCQkJCQkwLAoJCQkJCTEwMCooZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXStkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXSkpOwoKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJCTAsCgkJCQkJMCwKCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0tZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF0tZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXStkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSkvKAoJCQkJCQkyKmRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdKSk7CgoKCgkJfQoJfQoKCgoJaWYgKGNoYW5uZWxfYl9lbikKCXsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXs7CgkJfQoJfQoKCXJldHVybiByZWdfdmFsdWU7Cn0KCgp1bnNpZ25lZCBpbnQgZG9fZGRyX3Vib290X3dpbmRvd19pbml0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIHRlbXBfY291bnQ9MDsKCWZvcig7dGVtcF9jb3VudDxhcmdjO3RlbXBfY291bnQrKykKCXsKCQlwcmludGYoImFyZ1slZF09PSVzO1xuIixhcmdjLGFyZ3ZbdGVtcF9jb3VudF0pOwoJfQoKCWlmIChhcmdjID4xKSB7CgkJZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9kYXRhX3NvdXJjZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9kYXRhX3NvdXJjZSA9IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWTsKCQl9Cgl9CglpZiAoYXJnYyA+MikgewoJCWdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfZGF0YV9zb3VyY2UgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfZGF0YV90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoJfQoJLyoKCSAgIGdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfZGF0YV9zb3VyY2UJPQoJICAgZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9kYXRhX3Rlc3Rfc2l6ZQk9CgkgICBnX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX2FkZHJlc3NfdGVzdF9zaXplCT0KCSAgIGdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfdGVzdF93YXRjaGRvZ190aW1lc19zCT0KCSAgIGdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfdGVzdF9sYW5lX2Rpc2FibGUJPQoJICAgZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9hZGRyZXNzX3Rlc3Rfc2l6ZQk9CgkgICBnX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX2FkZHJlc3NfdGVzdF9zaXplCT0KCSAgICovCgoJcmV0dXJuIDE7Cn0KCnVuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfaW5kZXgsdW5zaWduZWQgaW50IGxjZGxyX3ZhbHVlLHVuc2lnbmVkIGludCByZWFkX3dyaXRlX2ZsYWcgKQp7CgkvL2NoYXIgKmVuZHA7Cgl1bnNpZ25lZCByZWFkX3ZhbHVlPTA7CgoJLy9yZXR1cm4gcmVhZF92YWx1ZTsKCiNpZiAxCgl1bnNpZ25lZCByZWdfYWRkPTA7Cgl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCXsKCQkJcmVnX2FkZD0oKGRhdGFfaW5kZXg+PjEpKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKTsKCQkJaWYoKGRhdGFfaW5kZXglMik9PTApCgkJCXsKCQkJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9SRUFEKQoJCQkJewoJCQkJCWxjZGxyX3ZhbHVlPSgocmVhZGwocmVnX2FkZCkpJjB4ZmYpOwoJCQkJfQoJCQkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQkJewoJCQkJCXdyX3JlZyhyZWdfYWRkLCAoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmZmZjAwKXwobGNkbHJfdmFsdWUmMHhmZikpOwoJCQkJfQoJCQl9CgkJCWlmKChkYXRhX2luZGV4JTIpPT0xKQoJCQl7CgkJCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfUkVBRCkKCQkJCXsKCQkJCQlsY2Rscl92YWx1ZT0oKChyZWFkbChyZWdfYWRkKSk+PjgpJjB4ZmYpOwoJCQkJfQoJCQkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQkJewoJCQkJCXdyX3JlZyhyZWdfYWRkLCAoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMGZmKXwoKGxjZGxyX3ZhbHVlJjB4ZmYpPDw4KSk7CgkJCQl9CgkJCX0KCQl9CgojZWxzZQoKCQlpZigoZGF0YV9pbmRleCUyKT09MCkKCQl7CgkJCXJlZ19hZGQ9KChkYXRhX2luZGV4Pj4xKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJK0REUjBfUFVCX0RYMExDRExSMSk7CgoJCX0KCQlpZigoZGF0YV9pbmRleCUyKT09MSkKCQl7CgkJCXJlZ19hZGQ9KChkYXRhX2luZGV4Pj4xKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJK0REUjBfUFVCX0RYMExDRExSMyk7CgoJCX0KCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfUkVBRCkKCQl7CgkJCWxjZGxyX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKT4+MCkmMHgxZmYpOwoJCX0KCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfV1JJVEUpCgkJewoJCQl3cl9yZWcocmVnX2FkZCwgKChsY2Rscl92YWx1ZSYweDFmZik8PDApKTsKCQl9CgojZW5kaWYKCX0KCgoKCXByaW50ZigibGNkbHIgJWQgICUwOHgsJTA4eFxuIiwgZGF0YV9pbmRleCxyZWdfYWRkLAoJCQkocmVhZGwocmVnX2FkZCkpKTsKCXJlYWRfdmFsdWU9bGNkbHJfdmFsdWU7CgoJcmV0dXJuIHJlYWRfdmFsdWU7CgojZW5kaWYgCn0KdW5zaWduZWQgaW50IGRvX2Rkcl9yZWFkX2FjbWRscih2b2lkICkKewoKCXVuc2lnbmVkIHJlZ192YWx1ZT0wOwojaWYgKCBDT05GSUdfRERSX1BIWTw9UF9ERFJfUEhZXzkwNVgpCglyZWdfdmFsdWU9KHJlYWRsKEREUjBfUFVCX0FDTURMUjApKTsKCXJlZ192YWx1ZT0ocmVnX3ZhbHVlPj4xNikmMHgxZmY7CiNlbmRpZgoJcmV0dXJuIHJlZ192YWx1ZTsKfQp1bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGFkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCXVuc2lnbmVkIHJlZ19hZGQ9MDsKCglpZihhZGRfaW5kZXg9PTApCgkJcmVnX2FkZD0oRERSMF9QVUJfQUNMQ0RMUik7CglpZihhZGRfaW5kZXg9PTEpCgkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCk7Cgl7CgkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1JFQUQpCgkJewoJCQlsY2Rscl92YWx1ZT0oKChyZWFkbChyZWdfYWRkKSk+PjApJjB4MWZmKTsKCQl9CgkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1dSSVRFKQoJCXsKCQkJd3JfcmVnKHJlZ19hZGQsICgobGNkbHJfdmFsdWUmMHgxZmYpPDwwKSk7CgkJfQoKCX0KCXByaW50ZigibGNkbHIgJWQgICUwOHgsJTA4eFxuIiwgYWRkX2luZGV4LHJlZ19hZGQsCgkJCShyZWFkbChyZWdfYWRkKSkpOwoJcmV0dXJuIGxjZGxyX3ZhbHVlOwp9CgppbnQgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlX3F1aWNrX21ldGhvZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCgkvL3NldGVudiBib290Y21kICJkZHJfdGVzdF9jbWQgMHgzMSAyIDYgIDIwIDAgMHgxMDAwMDAgMHg0MDAwMDAwIgoJcHJpbnRmKCJcbnNldGVudiBib290Y21kIGRkcl90ZXN0X2NtZCAweDMyIDIgNiAgMjAgMCAweDEwMDAwMCAweDQwMDAwMDAgXG4iKTsKCXByaW50ZigiXG5FbnRlciBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2UgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJcbi0tLSB3YXRjaGRvZyBzaG91bGQgPjE1c1xuIik7CiNkZWZpbmUgRERSX1RFU1RfTlVMTCAgMAojZGVmaW5lIEREUl9URVNUX1BBU1MgIDEKI2RlZmluZSBERFJfVEVTVF9GQUlMIDIKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoJdW5zaWduZWQgaW50ICAgZGF0YV9zb3VyY2U9IDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3Rfc2l6ZT0weDEwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9zaXplPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCgl1bnNpZ25lZCBpbnQgIGFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7ICAvL2ZvciBxdWljayBvdXQgb2YgZXJyb3IKCWlmIChhcmdjID4xKSB7CgkJZGF0YV9zb3VyY2UgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGF0YV9zb3VyY2U9IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMTU7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkvL3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CglpZiAoYXJnYyA+MykgewoJCWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz0gd2F0Y2hkb2dfdGltZV9zOwoJCX0KCX0KCXByaW50ZigiYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz09JWRcbiIsYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkvL2xhbmVfZGlzYWJsZT1nX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX3Rlc3RfbGFuZV9kaXNhYmxlOwoJaWYgKGFyZ2MgPjQpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsgICAKCglpZiAoYXJnYyA+NSkgewoJCWRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZGF0YV90ZXN0X3NpemU9IDB4MTAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2RhdGFfdGVzdF9zaXplKTsKCWlmIChhcmdjID42KSB7CgkJZGRyX2FkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X3NpemU9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9zaXplKTsKCgl1bnNpZ25lZCBpbnQgcmFua19pbmRleD0wOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9kYXRhX2FycmF5X21heD0xMDA7Cgl1bnNpZ25lZCBpbnQgbnVtX2FycmF5WzEwMF07Ly84IGZsYWcgMzJfZGF0YSBhZGRfOCAgMzJfZGF0YSBhZGRfOAoKCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCBsY2Rscl9taW49MDsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCW1lbXNldChudW1fYXJyYXksIDAsIHNpemVvZihudW1fYXJyYXkpKTsKCWNoYXIgc3RyWzEwMjRdPSIiOwoKCWlmKGRhdGFfc291cmNlPT1ERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgkJZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9NjQ7Cglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4OyB0ZW1wX2NvdW50KyspIAoJewoJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCApOwoJCXByaW50ZigicmVhZCBudW1hcnJ5WyVkXT09JWRcbiIsdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWUgPTA7ICAvL2Jlc3RfbGNkbHJfdmFsdWUKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZyA9MDsgIC8vbWluIGNtZAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzJfc3RlcCA9MDsgLy9zdGVwIDAgIGluaXQgIC0xIGxhbmUwIHcgbWluICAtMiBsYW5lMCB3IG1heCAtMyBsYW5lMCByIG1pbiAgICA0IGxhbmUwIHIgbWF4IC0tLS0tNSBsYW5lMSB3IG1pbiAuLi4KCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18zX2ZyZXEgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19tYWdpY19udW1iZXIgPTA7Cgl1bnNpZ25lZCBpbnQgb3JnX2xjZGxyX3ZhbHVlX3RlbXA9MDsKCXVuc2lnbmVkIGludCBhY21kbHI9MDsKCWFjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCgl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9bnVtX2FycmF5WzBdOwoJdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9bnVtX2FycmF5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJheVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyYXlbM107Cgl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPW51bV9hcnJheVs0XTsKCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT1udW1fYXJyYXlbNV07Cgl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bnVtX2FycmF5WzZdOwoJdGVzdF9hcmdfN19tYWdpY19udW1iZXI9bnVtX2FycmF5WzddOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9PSVkXG4iLHRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZSk7CglwcmludGYoInRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnPT0lZFxuIix0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZyk7CglwcmludGYoInRlc3RfYXJnXzJfc3RlcD09JWRcbiIsdGVzdF9hcmdfMl9zdGVwKTsKCXByaW50ZigidGVzdF9hcmdfM19mcmVxPT0lZFxuIix0ZXN0X2FyZ18zX2ZyZXEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPT0lZFxuIix0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzKTsKCXByaW50ZigidGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPSVkXG4iLG51bV9hcnJheVs1XSk7CglwcmludGYoInRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0lZFxuIixudW1fYXJyYXlbNl0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ183X21hZ2ljX251bWJlcj0lZFxuIixudW1fYXJyYXlbN10pOwoKCgoJaWYoKHRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPT1ETUNfU1RJQ0tZX01BR0lDXzEpKSAvL2ZvciBjaGVjayBtYWdpYyBudW1iZXIgbWFrZSBzdW1lIGVudGVyIHRlc3QgY29tbWFuZAoJewoJfQoJZWxzZQoJewoKCQl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9MDsKCQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9MDsKCQl0ZXN0X2FyZ18yX3N0ZXA9MDsKCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsKCQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1ETUNfU1RJQ0tZX01BR0lDXzE7Cgl9CgkvL3ByaW50ZigiYm9vdCB0aW1lcz09JWRcbiIsdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlKTsKCW51bV9hcnJheVswXQk9CXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZQkJOwoJbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsKCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgl7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJfQoKCgoJaWYodGVzdF9hcmdfMl9zdGVwKQoJewoJCWlmKHRlc3RfYXJnXzNfZnJlcSE9Z2xvYmFsX2Rkcl9jbGspICAvLwoJCXsKCQkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzJWQsd2lsbCByZWJvb3QgdXNlIGQycGxsIFxuIixnbG9iYWxfZGRyX2Nsayx0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIix0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoJaWYodGVzdF9hcmdfMl9zdGVwPT0wKQoJewoJCXsKCQkJdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlPTA7CgkJCXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnPTA7CgkJCXRlc3RfYXJnXzJfc3RlcD0xOwoJCQl0ZXN0X2FyZ18zX2ZyZXE9Z2xvYmFsX2Rkcl9jbGs7CgkJCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9MDsKCQkJdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPTA7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1sY2Rscl9taW47CgkJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCQkJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlCQk7CgkJCW51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7CgkJCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCW51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgoKCQkJZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJCQl7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCgkJCS8vZm9yICh0ZW1wX2NvdW50ID0gODsgdGVtcF9jb3VudDwgNDg7dGVtcF9jb3VudCsrKSB7CgkJCS8vCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJLy99CgoJCQlmb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50IDwgKDMyKzgpOyB0ZW1wX2NvdW50KyspICAgLy9kYXRhCgkJCXsKCQkJCS8vcHJpbnRmKCIxdGVtcF9jb3VudD0lZFxuIix0ZW1wX2NvdW50KTsKCgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CgkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDgpICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQllbHNlIGlmKCgodGVtcF9jb3VudC04KS80KTwxMCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPT05KQoJCQkJCQkJbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJLy9wcmludGYoIjJ0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKCh0ZW1wX2NvdW50LTgpPj4yKSxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsxXT1sY2Rscl9taW47CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrMl09bGNkbHJfbWF4Oy8vbnVtX2FycmF5W3RlbXBfY291bnRdOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzNdPTA7CgkJCQkJLy90ZW1wX2NvdW50PXRlbXBfY291bnQrNDsKCQkJCX0KCgoKCQkJfQoKCQkJZm9yICh0ZW1wX2NvdW50ID0gMzIrODsgdGVtcF9jb3VudCA8ICgzMis4KzgpOyB0ZW1wX2NvdW50KyspICAvL2FkZAoJCQl7CgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CQoJCQkJCWlmKCgodGVtcF9jb3VudC04KS80KTw4KSAgCgkJCQkJewoJCQkJCQlsY2Rscl9taW49MDsKCQkJCQkJbGNkbHJfbWF4PShkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9pZihsYW5lX3N0ZXA9PTkpCgkJCQkJCS8vbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJZWxzZSBpZigoKHRlbXBfY291bnQtOCkvNCk8MTApICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCWlmKCgodGVtcF9jb3VudC04KS80KT09OSkKCQkJCQkJCWxjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJfQoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOC0zMik+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzFdPWxjZGxyX21pbjsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsyXT1sY2Rscl9tYXg7Ly9udW1fYXJyYXlbdGVtcF9jb3VudF07CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrM109MDsKCQkJCX0KCgoJCQl9CgoKCgojaWYgIChDT05GSUdfRERSX1BIWTw9UF9ERFJfUEhZXzkwNVgpCgkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgxR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgyR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgzR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSk7CgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwxOyAgICAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDEpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDIpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDMpOyAgIAoKI2VuZGlmCgkJCWlmKGxhbmVfZGlzYWJsZSkKCQkJe2lmKGxhbmVfZGlzYWJsZSYweDEpewoJCQkJCQkJCQkgbnVtX2FycmF5WzgrM109MHhmZmZmOwoJCQkJCQkJCQkgbnVtX2FycmF5WzgrNCszXT0weGZmZmY7CgkJCQkJCQkJIH0KCQkJaWYobGFuZV9kaXNhYmxlJjB4Mil7CgkJCQludW1fYXJyYXlbOCszKzhdPTB4ZmZmZjsKCQkJCW51bV9hcnJheVs4KzQrMys4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4NCl7CgkJCQludW1fYXJyYXlbOCszKzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDgpewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PSV4XG4iLGxhbmVfZGlzYWJsZSk7CgkJCWlmKGxhbmVfZGlzYWJsZSYweDEwKXsKCQkJCW51bV9hcnJheVs4KzMrOCs4KzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIwKXsKCQkJCW51bV9hcnJheVs4KzQrMys4KzgrOCs4XT0weGZmZmY7CgoJCQl9CgkJCX0KCgoJCX0KCgoKCgkJZm9yICh0ZW1wX2NvdW50PSAwOyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCX0KCgl0ZXN0X2FyZ18yX3N0ZXArKzsKCW51bV9hcnJheVsyXT10ZXN0X2FyZ18yX3N0ZXA7Cglmb3IgKHRlbXBfY291bnQgPSAxOyB0ZW1wX2NvdW50IDwgNDg7IHRlbXBfY291bnQrKykgCgl7CgkJcHJpbnRmKCIlZCAgJWRcbiIsIHRlbXBfY291bnQsbnVtX2FycmF5W3RlbXBfY291bnRdKTsKCX0KCXRlbXBfY291bnQ9MjsKCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkvL2ZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CgoJLy8JIHdyaXRlbChudW1fYXJyYXlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkvL30KCgoJLy9mb3IgKGkgPSA4OyBpIDwgNDg7IGkrKykgewoJLy9udW1fYXJyYXlbaV09cmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkvL3ByaW50ZigiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZD09JWRcbiIsaSxudW1fYXJyYXlbaV0pOwoJLy99CgoJLy8vKgoJdW5zaWduZWQgaW50IGxhbmVfc3RlcD0wOwoKCXByaW50ZigiXG5zdGFydCBsb29wIHRlc3RcbiIpOwoKCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDEwKTsobGFuZV9zdGVwKyspKSAgIC8vZmluZCBuZWVkIHRlc3QgZGF0YSBzdGVwCgl7CgkJaWYoKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSszKzhdPDB4NCkpCgkJe2JyZWFrOwoJCX0KCX0KCXByaW50ZigiXG5zdGFydCAgdGVzdCBsYW5lX3N0ZXAgPSVkXG4iLGxhbmVfc3RlcCk7CglpZihsYW5lX3N0ZXA8MTApCgl7CgkJaWYobGFuZV9zdGVwPDgpCgkJewoJCQl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkJCWRkcl90ZXN0X3NpemU9ZGRyX2RhdGFfdGVzdF9zaXplOwoJCQkvL2xjZGxyX21pbj0wOwoJCQkvL2xjZGxyX21heD0oZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvL2RvX2Rkcl9yZWFkX2FjbWRscigpOwoJCX0KCQllbHNlCgkJewoJCQl0ZXN0X3dhdGNoZG9nX3RpbWVfcz1hZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zOwoJCQlkZHJfdGVzdF9zaXplPWRkcl9hZGRfdGVzdF9zaXplOwoJCQkvL2xjZGxyX21pbj0wOwoJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJLy9pZihsYW5lX3N0ZXA9PTkpCgkJCS8vbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQl9CgoJCWlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09MCkpICAgLy90ZXN0IGxlZnQgZWRnZSBiZWdpbgoJCXsKCQkJLyoKCQkJICAgbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsvLzEgcGFzcyAyIGVycm9yCgkJCSAgIG51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQkgICBudW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJICAgbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQkgICBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJICAgbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCSAgIG51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgkJCSAgICovCgkJCS8vICAgICAgICAgdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7CgkJCS8vCSBudW1fYXJyYXlbMF09dGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlOwoJCQkvLwkgdGVtcF9jb3VudD0wOwoJCQkvLwkgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkvLyAJIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCXRlbXBfY291bnQ9MTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCW51bV9hcnJheVs1XT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pOyAgLy9lZGdlIGxjZGxyCgkJCXRlbXBfY291bnQ9NTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsgIAoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF0pPj4xKTsKCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcF9sY2RscgoJCQl0ZW1wX2NvdW50PTY7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAgLy90ZW1wX2xjZGxyCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MTsKCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAvL2xhbmUgc3RhdHVzCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJaWYobGFuZV9zdGVwPDgpCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCXdoaWxlKDEpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJdGVtcF9jb3VudD0xOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgoJCQl9CgkJfQoJCWVsc2UgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0xKSkgICAvL3Rlc3QgbGVmdCBlZGdlIG9uZ29pbmcgICAgLWxvb3AKCQl7CgoJCQlpZigobnVtX2FycmF5WzVdKzEpPj0obnVtX2FycmF5WzZdKSkKCQkJewoJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9OVUxMKQoJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCX0KCgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MjsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbNV09MDsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCXRlbXBfY291bnQ9NTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XSsxOyAgIC8vdXBkYXRlIEIKCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl07ICAgLy91cGRhdGUgQgoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkvLyAgdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlPTA7Ly8obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF0pOwoJCQkJLy8gbnVtX2FycmF5WzBdPXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZTsKCQkJCS8vIHRlbXBfY291bnQ9MDsKCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7IAoJCQkJd2hpbGUoMSk7CgoJCQl9CgkJCWVsc2UgCgkJCXsgCgkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJfQoJCQkJZWxzZSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJewoKCgoJCQkJCXsKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCS8vIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOyAgIC8vdXBkYXRlIEIKCQkJCQkJLy8gdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQl7CgkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJZWxzZQkgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCXsKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBtaW4gdmFsdWUKCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLXVwZGF0ZSBjdXJlbnQKCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl3aGlsZSgxKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoKCQkJCQl9CgoJCQkJfQoJCQl9CgoKCQl9CgoJCWVsc2UgIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09MikpICAgLy90ZXN0IHJpZ2h0IGVkZ2UgYmVnaW4KCQl7CgkJCS8qCgkJCSAgIG51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7Ly8xIHBhc3MgMiBlcnJvcgoJCQkgICBudW1fYXJyYXlbMl0JPQl0ZXN0X2FyZ18yX3N0ZXAJCTsKCQkJICAgbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgkJCSAgIG51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCQkJICAgbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlCQk7CgkJCSAgIG51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJCQkgICBudW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoJCQkgICAqLwoJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQl0ZW1wX2NvdW50PTE7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl07Ly9sY2Rscl9tYXg7ICAvL2VkZ2UgbGNkbHIKCQkJdGVtcF9jb3VudD01OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07Ly8KCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsKCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcF9sY2RscgoJCQl0ZW1wX2NvdW50PTY7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAgLy90ZW1wX2xjZGxyCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MzsKCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAvL2xhbmUgc3RhdHVzCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJaWYobGFuZV9zdGVwPDgpCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCXdoaWxlKDEpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJdGVtcF9jb3VudD0xOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgoJCQl9CgkJfQoJCWVsc2UgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0zKSkgICAvL3Rlc3QgcmlnaHQgZWRnZSBvbmdvaW5nICAgIC1sb29wCgkJewoKCQkJaWYoKG51bV9hcnJheVs2XSsxKT49KG51bV9hcnJheVs1XSkpCgkJCXsKCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCXtwcmludGYoImRlZmF1bHQgdmFsdWUgbm90IHN0YWJsZSAsb3IgcmVjb3Zlcnkgc3RpY2t5P1xuIik7CgkJCQl9CgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT00OyAgLy91cGRhdGUgc3RhdHVzCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs1XT0wOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJdGVtcF9jb3VudD01OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdLTE7ICAgLy91cGRhdGUgQgoJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XTsgICAvL3VwZGF0ZSBCCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7IAoJCQkJd2hpbGUoMSk7CgkJCX0KCQkJZWxzZSAKCQkJeyAKCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCXtwcmludGYoImRlZmF1bHQgdmFsdWUgbm90IHN0YWJsZSAsb3IgcmVjb3Zlcnkgc3RpY2t5P1xuIik7CgkJCQl9CgkJCQllbHNlICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQl7CgoKCgkJCQkJewoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07ICAgLy91cGRhdGUgQgoJCQkJCQkvLyB0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCXsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCXdoaWxlKDEpOwoKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQllbHNlCSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJewoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTM7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIG1heCB2YWx1ZQoJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tdXBkYXRlIGN1cmVudAoJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgoJCQkJCX0KCgkJCQl9CgkJCX0KCgoJCX0KCX0KCglpZihsYW5lX3N0ZXA+PTEwKSAvL2ZpbmlzaAoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJfQoKCS8vIHVuc2lnbmVkIGludCAgIGFjbWRscj0gMDsKCXVuc2lnbmVkIGludCAgZGVsYXlfc3RlcF94MTAwPSAwOwoKCXsKCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQlkZWxheV9zdGVwX3gxMDA9MTAwKjEwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGsqYWNtZGxyKTsKCQlwcmludGYoIlxuYWNtZGxyPTB4JTA4eC0tPmRlYyAlZCxkZHIgY2xrPT0lZCxzdGVwPSVkIHBzLDEwc3RlcD0lZCBwcywxMDBzdGVwPSVkIHBzLFxuIixhY21kbHIsYWNtZGxyLGdsb2JhbF9kZHJfY2xrLAoJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHx3ZHFfb3JnIDB4JTA4eCAgfHdkcV9taW4gMHglMDh4IHx3ZHFfbWF4IDB4JTA4eCA6OnxyZHFzX29yZyAgMHglMDh4ICB8cmRxc19taW4gMHglMDh4IHxyZHFzX21heCAweCUwOHggIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlsYW5lX3N0ZXA9NDsKCQl7CgkJCXByaW50ZigiXG5hY19sYW5lXzB4JTA4eHxsY2Rfb3JnIDB4JTA4eCAgfGxjZF9taW4gMHglMDh4IHxsY2RfbWF4IDB4JTA4eCA6OnxiZGxyX29yZyAgMHglMDh4ICB8YmRscl9taW4gMHglMDh4IHxiZGxyX21heCAweCUwOHggIFxuIiwKCQkJCQk0LAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdKTsKCQl9CgkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgkJewoJCQlwcmludGYoIlxuIGFjX2xhbmVfMHgwMDAwMDAwfCAgbGNkbHJfb3JnICB8bGNkbHJfc2V0IHBzfGxjZGxyX2hvbGQgcHM6fFwKCQkJCQljbGtfc2V0dXAgIHBzfCBjbGtfaG9sZCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgkJCXByaW50ZigiXG4gYWNfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgkJCXByaW50ZigiXG4gY2tfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgkJfQoJCXByaW50ZigiXG4gYV9sYW5lXzB4MDAwMDAwMDB8IHdyZHFfb3JnIDB4MHx3X3NldHVwIHggcHN8d19ob2xkICB4IHBzOjp8XAoJCQkJcmRfc2V0dXAgIHBzfHJkX2hvbGQgeCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgoKCgkJfQoJfQoKCXRlc3RfYXJnXzJfc3RlcD0weDEwMDAwOwoJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCgoKCXRlbXBfY291bnQ9MjsKCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCXJldHVybiAxOwp9CgppbnQgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCS8vc2V0ZW52IGJvb3RjbWQgImRkcl90ZXN0X2NtZCAweDMxIDIgNiAgMjAgMCAweDEwMDAwMCAweDQwMDAwMDAiCglwcmludGYoIlxuc2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MzEgMiA2ICAyMCAwIDB4MTAwMDAwIDB4NDAwMDAwMCBcbiIpOwoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSBmdW5jdGlvblxuIik7CglwcmludGYoIlxuLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoJdW5zaWduZWQgaW50ICAgZGF0YV9zb3VyY2U9IDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3Rfc2l6ZT0weDEwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9zaXplPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCgl1bnNpZ25lZCBpbnQgIGFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7ICAvL2ZvciBxdWljayBvdXQgb2YgZXJyb3IKCWlmIChhcmdjID4xKSB7CgkJZGF0YV9zb3VyY2UgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGF0YV9zb3VyY2U9IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMTU7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkvL3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CglpZiAoYXJnYyA+MykgewoJCWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz0gd2F0Y2hkb2dfdGltZV9zOwoJCX0KCX0KCXByaW50ZigiYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz09JWRcbiIsYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkvL2xhbmVfZGlzYWJsZT1nX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX3Rlc3RfbGFuZV9kaXNhYmxlOwoJaWYgKGFyZ2MgPjQpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsgICAKCglpZiAoYXJnYyA+NSkgewoJCWRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZGF0YV90ZXN0X3NpemU9IDB4MTAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2RhdGFfdGVzdF9zaXplKTsKCWlmIChhcmdjID42KSB7CgkJZGRyX2FkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X3NpemU9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9zaXplKTsKCgl1bnNpZ25lZCBpbnQgcmFua19pbmRleD0wOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9kYXRhX2FycmF5X21heD0xMDA7Cgl1bnNpZ25lZCBpbnQgbnVtX2FycmF5WzEwMF07Ly84IGZsYWcgMzJfZGF0YSBhZGRfOCAgMzJfZGF0YSBhZGRfOAoKCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCBsY2Rscl9taW49MDsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCW1lbXNldChudW1fYXJyYXksIDAsIHNpemVvZihudW1fYXJyYXkpKTsKCWNoYXIgc3RyWzEwMjRdPSIiOwoKCWlmKGRhdGFfc291cmNlPT1ERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgkJZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9NjQ7Cglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4OyB0ZW1wX2NvdW50KyspIAoJewoJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCApOwoJCXByaW50ZigicmVhZCBudW1hcnJ5WyVkXT09JWRcbiIsdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX2NtZDAgPTA7ICAvL21hc3RlciBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX2NtZDEgPTA7ICAvL21pbiBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18yX3N0ZXAgPTA7IC8vc3RlcCAwICBpbml0ICAtMSBsYW5lMCB3IG1pbiAgLTIgbGFuZTAgdyBtYXggLTMgbGFuZTAgciBtaW4gICAgNCBsYW5lMCByIG1heCAtLS0tLTUgbGFuZTEgdyBtaW4gLi4uCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfM19mcmVxID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ181X2Jvb3R0aW1lcyA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19tYWdpY19udW1iZXIgPTA7Cgl1bnNpZ25lZCBpbnQgb3JnX2xjZGxyX3ZhbHVlX3RlbXA9MDsKCXVuc2lnbmVkIGludCBhY21kbHI9MDsKCWFjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCgl0ZXN0X2FyZ18wX2NtZDA9bnVtX2FycmF5WzBdOwoJdGVzdF9hcmdfMV9jbWQxPW51bV9hcnJheVsxXTsKCXRlc3RfYXJnXzJfc3RlcD1udW1fYXJyYXlbMl07Cgl0ZXN0X2FyZ18zX2ZyZXE9bnVtX2FycmF5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz1udW1fYXJyYXlbNF07Cgl0ZXN0X2FyZ181X2Jvb3R0aW1lcz1udW1fYXJyYXlbNV07Cgl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bnVtX2FycmF5WzZdOwoJdGVzdF9hcmdfN19tYWdpY19udW1iZXI9bnVtX2FycmF5WzddOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2NtZDA9PSVkXG4iLHRlc3RfYXJnXzBfY21kMCk7CglwcmludGYoInRlc3RfYXJnXzBfY21kMT09JWRcbiIsdGVzdF9hcmdfMV9jbWQxKTsKCXByaW50ZigidGVzdF9hcmdfMl9zdGVwPT0lZFxuIix0ZXN0X2FyZ18yX3N0ZXApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18zX2ZyZXE9PSVkXG4iLHRlc3RfYXJnXzNfZnJlcSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9PSVkXG4iLHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMpOwoJcHJpbnRmKCJ0ZXN0X2FyZ181X2Jvb3R0aW1lcz0lZFxuIixudW1fYXJyYXlbNV0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9JWRcbiIsbnVtX2FycmF5WzZdKTsKCXByaW50ZigidGVzdF9hcmdfN19tYWdpY19udW1iZXI9JWRcbiIsbnVtX2FycmF5WzddKTsKCgoKCWlmKCh0ZXN0X2FyZ183X21hZ2ljX251bWJlcj09RE1DX1NUSUNLWV9NQUdJQ18xKSkgLy9mb3IgY2hlY2sgbWFnaWMgbnVtYmVyIG1ha2Ugc3VtZSBlbnRlciB0ZXN0IGNvbW1hbmQKCXt0ZXN0X2FyZ181X2Jvb3R0aW1lcysrOwoKCX0KCWVsc2UKCXt0ZXN0X2FyZ181X2Jvb3R0aW1lcz0wOwoJCXRlc3RfYXJnXzJfc3RlcD0wOwoJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCX0KCXByaW50ZigiYm9vdCB0aW1lcz09JWRcbiIsdGVzdF9hcmdfNV9ib290dGltZXMpOwoJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9jbWQwCQk7CgludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX2NtZDEJCTsKCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2Jvb3R0aW1lcwkJOwoJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCXsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7Cgl9CgoKCglpZih0ZXN0X2FyZ18yX3N0ZXApCgl7CgkJaWYodGVzdF9hcmdfM19mcmVxIT1nbG9iYWxfZGRyX2NsaykgIC8vCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgkJewoJCQl0ZXN0X2FyZ18wX2NtZDA9MFgzMTsvL0REUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9LRVJORUxfV0lORE9XOwoJCQl0ZXN0X2FyZ18xX2NtZDE9MDsKCQkJdGVzdF9hcmdfMl9zdGVwPTE7CgkJCXRlc3RfYXJnXzNfZnJlcT1nbG9iYWxfZGRyX2NsazsKCQkJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz0wOwoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bGNkbHJfbWluOwoJCQludW1fYXJyYXlbMF0JPQl0ZXN0X2FyZ18wX2NtZDAJCTsKCQkJbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV9jbWQxCQk7CgkJCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2Jvb3R0aW1lcwkJOwoJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCQkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCgkJCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCQkJewoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgoJCQkvL2ZvciAodGVtcF9jb3VudCA9IDg7IHRlbXBfY291bnQ8IDQ4O3RlbXBfY291bnQrKykgewoJCQkvLwkJbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCS8vfQoKCQkJZm9yICh0ZW1wX2NvdW50ID0gODsgdGVtcF9jb3VudCA8ICgzMis4KTsgdGVtcF9jb3VudCsrKSAgIC8vZGF0YQoJCQl7CgkJCQkvL3ByaW50ZigiMXRlbXBfY291bnQ9JWRcbiIsdGVtcF9jb3VudCk7CgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CgkJCQkJLy9wcmludGYoIjJ0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKCh0ZW1wX2NvdW50LTgpPj4yKSxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCgkJCQl9CgkJCQlpZigodGVtcF9jb3VudCU0KT09MSkgIC8vbWluCgkJCQl7CQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0wOwoJCQkJfQoJCQkJaWYoKHRlbXBfY291bnQlNCk9PTIpIC8vbWF4CgkJCQl7CQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1hY21kbHI7CgkJCQl9CgkJCQlpZigodGVtcF9jb3VudCU0KT09MykgLy9zdGF0dXMKCQkJCXsJCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQl9CgoKCQkJfQoKCQkJZm9yICh0ZW1wX2NvdW50ID0gMzIrODsgdGVtcF9jb3VudCA8ICgzMis4KzgpOyB0ZW1wX2NvdW50KyspICAvL2FkZAoJCQl7CgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CQoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOC0zMik+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoKCQkJCX0KCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0xKSAgLy9taW4KCQkJCXsJCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQl9CgkJCQlpZigodGVtcF9jb3VudCU0KT09MikgLy9tYXgKCQkJCXsJCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWFjbWRsciozOwoJCQkJCWlmKHRlbXBfY291bnQ9PSgzMis4KzQrMikpCgkJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0weDNmOy8vYmRscjAgbWF4IHZhbHVlCgkJCQl9CgkJCQlpZigodGVtcF9jb3VudCU0KT09MykgLy9zdGF0dXMKCQkJCXsJCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQl9CgoKCQkJfQoKCgoKI2lmICAoQ09ORklHX0REUl9QSFk8PVBfRERSX1BIWV85MDVYKQoJCQlwcmludGYoIkREUjBfUFVCX0RYMEdDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDBHQ1IwKSkpOwoJCQlwcmludGYoIkREUjBfUFVCX0RYMUdDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDFHQ1IwKSkpOwoJCQlwcmludGYoIkREUjBfUFVCX0RYMkdDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDJHQ1IwKSkpOwoJCQlwcmludGYoIkREUjBfUFVCX0RYM0dDUjA9PSV4XG4iLChyZWFkbChERFIwX1BVQl9EWDNHQ1IwKSkpOwoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8MTsgICAgICAKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDFHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfCgxPDwxKTsgICAKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDJHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfCgxPDwyKTsgICAKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDNHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfCgxPDwzKTsgICAKCiNlbmRpZgoJCQlpZihsYW5lX2Rpc2FibGUpCgkJCXtpZihsYW5lX2Rpc2FibGUmMHgxKXsKCQkJCQkJCQkJIG51bV9hcnJheVs4KzNdPTB4ZmZmZjsKCQkJCQkJCQkJIG51bV9hcnJheVs4KzQrM109MHhmZmZmOwoJCQkJCQkJCSB9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIpewoJCQkJbnVtX2FycmF5WzgrMys4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDQpewoJCQkJbnVtX2FycmF5WzgrMys4KzhdPTB4ZmZmZjsKCQkJCW51bV9hcnJheVs4KzQrMys4KzhdPTB4ZmZmZjsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHg4KXsKCQkJCW51bV9hcnJheVs4KzMrOCs4KzhdPTB4ZmZmZjsKCQkJCW51bV9hcnJheVs4KzQrMys4KzgrOF09MHhmZmZmOwoJCQl9CgkJCXByaW50ZigibGFuZV9kaXNhYmxlPT0leFxuIixsYW5lX2Rpc2FibGUpOwoJCQlpZihsYW5lX2Rpc2FibGUmMHgxMCl7CgkJCQludW1fYXJyYXlbOCszKzgrOCs4KzhdPTB4ZmZmZjsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHgyMCl7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4KzgrOF09MHhmZmZmOwoKCQkJfQoJCQl9CgoKCQl9CgoKCgoJCWZvciAodGVtcF9jb3VudD0gMDsgdGVtcF9jb3VudDwgNDg7dGVtcF9jb3VudCsrKSB7CgkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQl9Cgl9CgoJdGVzdF9hcmdfMl9zdGVwKys7CgludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoJZm9yICh0ZW1wX2NvdW50ID0gMTsgdGVtcF9jb3VudCA8IDQ4OyB0ZW1wX2NvdW50KyspIAoJewoJCXByaW50ZigiJWQgICVkXG4iLCB0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9Cgl0ZW1wX2NvdW50PTI7CgludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy9mb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoKCS8vCSB3cml0ZWwobnVtX2FycmF5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJLy99CgoKCS8vZm9yIChpID0gODsgaSA8IDQ4OyBpKyspIHsKCS8vbnVtX2FycmF5W2ldPXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJLy9wcmludGYoImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQ9PSVkXG4iLGksbnVtX2FycmF5W2ldKTsKCS8vfQoKCS8vLyoKCXVuc2lnbmVkIGludCBsYW5lX3N0ZXA9MDsKCglwcmludGYoIlxuc3RhcnQgbG9vcCB0ZXN0XG4iKTsKCglmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkgICAvL2ZpbmQgbmVlZCB0ZXN0IGRhdGEgc3RlcAoJewoJCWlmKChudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMys4XTwweDQpKQoJCXticmVhazsKCQl9Cgl9CglwcmludGYoIlxuc3RhcnQgIHRlc3QgbGFuZV9zdGVwID0lZFxuIixsYW5lX3N0ZXApOwoJaWYobGFuZV9zdGVwPDEwKQoJewoJCWlmKGxhbmVfc3RlcDw4KQoJCXsKCQkJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJCQlkZHJfdGVzdF9zaXplPWRkcl9kYXRhX3Rlc3Rfc2l6ZTsKCQkJbGNkbHJfbWluPTA7CgkJCWxjZGxyX21heD0obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CgkJCWRkcl90ZXN0X3NpemU9ZGRyX2FkZF90ZXN0X3NpemU7CgkJCWxjZGxyX21pbj0wOwoJCQlsY2Rscl9tYXg9KG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCX0KCgkJaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0wKSkgICAvL3Rlc3QgbGVmdCBlZGdlIGJlZ2luCgkJewoJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOwoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bGNkbHJfbWluOwoJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoKCQkJdGVtcF9jb3VudD02OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTI7ICAvL2xlZnQgZmluaXNoCgoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoKCgoJCQl9CgkJfQoJCWVsc2UgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0xKSkgICAvL3Rlc3QgbGVmdCBlZGdlIG9uZ29pbmcgICAgLWxvb3AKCQl7CgkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTE7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCsrOwoJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoKCQkJdGVtcF9jb3VudD02OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MjsgIC8vbGVmdCBmaW5pc2gKCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgoKCgkJCX0KCQl9CgkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTIpKSAgIC8vdGVzdCByaWdodCBlZGdlIGJlZ2luCgkJewoJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOwoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bGNkbHJfbWF4OwoJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoKCQkJdGVtcF9jb3VudD02OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109NDsgIC8vcmlnaHQgZmluaXNoCgoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoKCgoJCQl9CgkJfQoJCWVsc2UgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0zKSkgICAvL3Rlc3QgcmlnaHQgZWRnZSBvbmdvaW5nICAgIC1sb29wCgkJewoJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOwoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQtLTsKCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCgkJCXRlbXBfY291bnQ9NjsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTQ7ICAvL3JpZ2h0IGZpbmlzaAoKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCQludW1fYXJyYXlbdGVtcF9jb3VudF09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7CgkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCgoKCQkJfQoJCX0KCX0KCglpZihsYW5lX3N0ZXA+PTEwKSAvL2ZpbmlzaAoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJfQoKCS8vIHVuc2lnbmVkIGludCAgIGFjbWRscj0gMDsKCXVuc2lnbmVkIGludCAgZGVsYXlfc3RlcF94MTAwPSAwOwoKCXsKCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQlkZWxheV9zdGVwX3gxMDA9MTAwKjEwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGsqYWNtZGxyKTsKCQlwcmludGYoIlxuYWNtZGxyPTB4JTA4eC0tPmRlYyAlZCxkZHIgY2xrPT0lZCxzdGVwPSVkIHBzLDEwc3RlcD0lZCBwcywxMDBzdGVwPSVkIHBzLFxuIixhY21kbHIsYWNtZGxyLGdsb2JhbF9kZHJfY2xrLAoJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHx3ZHFfb3JnIDB4JTA4eCAgfHdkcV9taW4gMHglMDh4IHx3ZHFfbWF4IDB4JTA4eCA6OnxyZHFzX29yZyAgMHglMDh4ICB8cmRxc19taW4gMHglMDh4IHxyZHFzX21heCAweCUwOHggIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlsYW5lX3N0ZXA9NDsKCQl7CgkJCXByaW50ZigiXG5hY19sYW5lXzB4JTA4eHxsY2Rfb3JnIDB4JTA4eCAgfGxjZF9taW4gMHglMDh4IHxsY2RfbWF4IDB4JTA4eCA6OnxiZGxyX29yZyAgMHglMDh4ICB8YmRscl9taW4gMHglMDh4IHxiZGxyX21heCAweCUwOHggIFxuIiwKCQkJCQk0LAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdKTsKCQl9CgkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgkJewoJCQlwcmludGYoIlxuIGFjX2xhbmVfMHgwMDAwMDAwfCAgbGNkbHJfb3JnICB8bGNkbHJfc2V0IHBzfGxjZGxyX2hvbGQgcHM6fFwKCQkJCQljbGtfc2V0dXAgIHBzfCBjbGtfaG9sZCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgkJCXByaW50ZigiXG4gYWNfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgkJCXByaW50ZigiXG4gY2tfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgkJfQoJCXByaW50ZigiXG4gYV9sYW5lXzB4MDAwMDAwMDB8IHdyZHFfb3JnIDB4MHx3X3NldHVwIHggcHN8d19ob2xkICB4IHBzOjp8XAoJCQkJcmRfc2V0dXAgIHBzfHJkX2hvbGQgeCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgoKCgkJfQoJfQoKCXRlc3RfYXJnXzJfc3RlcD0weDEwMDAwOwoJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCgoKCXRlbXBfY291bnQ9MjsKCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCXJldHVybiAxOwp9CgoKaW50IGRvX2Rkcl91Ym9vdF9rZXJuZWxfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfbWV0aG9kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy9zZXRlbnYgc3RvcmVib290ICJkZHJfdGVzdF9jbWQgMHgzMyAyIDYgIDIwIDAgMHgxMDAwMDAgMHg0MDAwMDAwIgoJcHJpbnRmKCJcbnNldGVudiBib290Y21kIGRkcl90ZXN0X2NtZCAweDMzIDIgNiAgMjAgMCAweDEwMDAwMCAweDQwMDAwMDAgXG4iKTsKCXByaW50ZigiXG5FbnRlciBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2UgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJcbi0tLSB3YXRjaGRvZyBzaG91bGQgPjE1c1xuIik7CiNkZWZpbmUgRERSX1RFU1RfTlVMTCAgMAojZGVmaW5lIEREUl9URVNUX1BBU1MgIDEKI2RlZmluZSBERFJfVEVTVF9GQUlMIDIKCiNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICAgNCAgLy8gUFJFR19TVElDS1lfUkVHNAojZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgICA1ICAvLzQ1Ly8gUFJFR19TVElDS1lfUkVHNAoJLy9QUkVHX1NUSUNLWV9SRUc1CgoKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfVUJPT1RfT05HT0lORyAgIDEKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIIDIKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORyAgMwojZGVmaW5lIEREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIIDQKCiNkZWZpbmUgRERSX1RFU1RfTUVUSE9EX0RJVklERVJfMiAgIDEgICAvL0FCIE1FVEhPRCAgQSBpcyBmYWlsaW5nIEIgaXMgcGFzc2luZyB2YWx1ZQojZGVmaW5lIEREUl9URVNUX01FVEhPRF9ERUNSRUFTRSAgIDIKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoJdW5zaWduZWQgaW50ICAgZGF0YV9zb3VyY2U9IDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3RfbWV0aG9kPUREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9tZXRob2Q9RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMjsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfbWV0aG9kPUREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7CgoJdW5zaWduZWQgaW50ICBkZHJfZGF0YV90ZXN0X3NpemU9MHgxMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfYWRkX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9zaXplPTB4MTAwMDAwMDA7CgoJdW5zaWduZWQgaW50ICBhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoJdW5zaWduZWQgaW50ICB0ZXN0X3dhdGNoZG9nX3RpbWVfcz0xNTsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0xOyAgLy9mb3IgcXVpY2sgb3V0IG9mIGVycm9yCglpZiAoYXJnYyA+MSkgewoJCWRhdGFfc291cmNlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRhdGFfc291cmNlPSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOVjsKCQl9Cgl9CglpZiAoYXJnYyA+MikgewoJCXdhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl3YXRjaGRvZ190aW1lX3M9IDE1OwoJCX0KCX0KCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJLy90ZXN0X3dhdGNoZG9nX3RpbWVfcz1hZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zOwoJaWYgKGFyZ2MgPjMpIHsKCQlhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9IHdhdGNoZG9nX3RpbWVfczsKCQl9Cgl9CglwcmludGYoImFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9PSVkXG4iLGFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJLy9sYW5lX2Rpc2FibGU9Z19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl90ZXN0X2xhbmVfZGlzYWJsZTsKCWlmIChhcmdjID40KSB7CgkJbGFuZV9kaXNhYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWxhbmVfZGlzYWJsZT0gMDsKCQl9Cgl9CglwcmludGYoImxhbmVfZGlzYWJsZT09MHglMDh4XG4iLGxhbmVfZGlzYWJsZSk7ICAgCgoJaWYgKGFyZ2MgPjUpIHsKCQlkZHJfZGF0YV90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2RhdGFfdGVzdF9zaXplPSAweDEwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl9kYXRhX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9kYXRhX3Rlc3Rfc2l6ZSk7CglpZiAoYXJnYyA+NikgewoJCWRkcl9hZGRfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9hZGRfdGVzdF9zaXplPSAweDEwMDAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2FkZF90ZXN0X3NpemU9PTB4JTA4eFxuIixkZHJfYWRkX3Rlc3Rfc2l6ZSk7CglpZiAoYXJnYyA+NykgewoJCWRkcl9kYXRhX3Rlc3RfbWV0aG9kID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9kYXRhX3Rlc3RfbWV0aG9kPSBERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9tZXRob2Q9PTB4JTA4eFxuIixkZHJfZGF0YV90ZXN0X21ldGhvZCk7CglpZiAoYXJnYyA+OCkgewoJCWRkcl9hZGRfdGVzdF9tZXRob2QgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X21ldGhvZD0gRERSX1RFU1RfTUVUSE9EX0RJVklERVJfMjsKCQl9Cgl9CglwcmludGYoImRkcl9hZGRfdGVzdF9tZXRob2Q9PTB4JTA4eFxuIixkZHJfYWRkX3Rlc3RfbWV0aG9kKTsKCgl1bnNpZ25lZCBpbnQgcmFua19pbmRleD0wOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9kYXRhX2FycmF5X21heD0xMDA7Cgl1bnNpZ25lZCBpbnQgbnVtX2FycmF5WzEwMF07Ly84IGZsYWcgMzJfZGF0YSBhZGRfOCAgMzJfZGF0YSBhZGRfOAoKCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCBsY2Rscl9taW49MDsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCW1lbXNldChudW1fYXJyYXksIDAsIHNpemVvZihudW1fYXJyYXkpKTsKCWNoYXIgc3RyWzEwMjRdPSIiOwoKCWlmKGRhdGFfc291cmNlPT1ERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgkJZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9NjQ7Cglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4OyB0ZW1wX2NvdW50KyspIAoJewoJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCApOwoJCXByaW50ZigicmVhZCBudW1hcnJ5WyVkXT09JWRcbiIsdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWUgPTA7ICAvL2Jlc3RfbGNkbHJfdmFsdWUKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZyA9MDsgIC8vbWluIGNtZAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzJfc3RlcCA9MDsgLy9zdGVwIDAgIGluaXQgIC0xICBVQk9PVCBPTkdPSU5HICAyIFVCT09UIEZJTklTSCAgMyBLRVJORUwgT05HT0lORyA0IEtFUk5FTCBGSU5JU0gKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18zX2ZyZXEgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19tYWdpY19udW1iZXIgPTA7Cgl1bnNpZ25lZCBpbnQgb3JnX2xjZGxyX3ZhbHVlX3RlbXA9MDsKCXVuc2lnbmVkIGludCBhY21kbHI9MDsKCWFjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCgl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9bnVtX2FycmF5WzBdOwoJdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9bnVtX2FycmF5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJheVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyYXlbM107Cgl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPW51bV9hcnJheVs0XTsKCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT1udW1fYXJyYXlbNV07Cgl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bnVtX2FycmF5WzZdOwoJdGVzdF9hcmdfN19tYWdpY19udW1iZXI9bnVtX2FycmF5WzddOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9PSVkXG4iLHRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZSk7CglwcmludGYoInRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnPT0lZFxuIix0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZyk7CglwcmludGYoInRlc3RfYXJnXzJfc3RlcD09JWRcbiIsdGVzdF9hcmdfMl9zdGVwKTsKCXByaW50ZigidGVzdF9hcmdfM19mcmVxPT0lZFxuIix0ZXN0X2FyZ18zX2ZyZXEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPT0lZFxuIix0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzKTsKCXByaW50ZigidGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPSVkXG4iLG51bV9hcnJheVs1XSk7CglwcmludGYoInRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0lZFxuIixudW1fYXJyYXlbNl0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ183X21hZ2ljX251bWJlcj0lZFxuIixudW1fYXJyYXlbN10pOwoKCgoJaWYoKHRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPT1ETUNfU1RJQ0tZX01BR0lDXzEpKSAvL2ZvciBjaGVjayBtYWdpYyBudW1iZXIgbWFrZSBzdW1lIGVudGVyIHRlc3QgY29tbWFuZAoJewoJfQoJZWxzZQoJewoKCQl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9MDsKCQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9MDsKCQl0ZXN0X2FyZ18yX3N0ZXA9MDsKCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsKCQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1ETUNfU1RJQ0tZX01BR0lDXzE7Cgl9CgkvL3ByaW50ZigiYm9vdCB0aW1lcz09JWRcbiIsdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlKTsKCW51bV9hcnJheVswXQk9CXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZQkJOwoJbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsKCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgl7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJfQoKCgoJaWYodGVzdF9hcmdfMl9zdGVwKQoJewoJCWlmKHRlc3RfYXJnXzNfZnJlcSE9Z2xvYmFsX2Rkcl9jbGspICAvLwoJCXsKCQkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzJWQsd2lsbCByZWJvb3QgdXNlIGQycGxsIFxuIixnbG9iYWxfZGRyX2Nsayx0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIix0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoJaWYodGVzdF9hcmdfMl9zdGVwPT0wKQoJewoJCXsKCgoKCQkJdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlPTA7CgkJCXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnPTA7CgkJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfT05HT0lORzsKCQkJdGVzdF9hcmdfM19mcmVxPWdsb2JhbF9kZHJfY2xrOwoJCQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPTA7CgkJCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT0wOwoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bGNkbHJfbWluOwoJCQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1ETUNfU1RJQ0tZX01BR0lDXzE7CgkJCW51bV9hcnJheVswXQk9CXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZQkJOwoJCQludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOwoJCQludW1fYXJyYXlbMl0JPQl0ZXN0X2FyZ18yX3N0ZXAJCTsKCQkJbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgkJCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlCQk7CgkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCgkJCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCQkJewoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkvLyAJIEREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICx0ZXN0X2FyZ18yX3N0ZXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCS8vZm9yICh0ZW1wX2NvdW50ID0gODsgdGVtcF9jb3VudDwgNDg7dGVtcF9jb3VudCsrKSB7CgkJCS8vCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJLy99CgoJCQlmb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50IDwgKDMyKzgpOyB0ZW1wX2NvdW50KyspICAgLy9kYXRhCgkJCXsKCQkJCS8vcHJpbnRmKCIxdGVtcF9jb3VudD0lZFxuIix0ZW1wX2NvdW50KTsKCgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CgkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDgpICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQllbHNlIGlmKCgodGVtcF9jb3VudC04KS80KTwxMCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPT05KQoJCQkJCQkJbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJLy9wcmludGYoIjJ0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKCh0ZW1wX2NvdW50LTgpPj4yKSxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsxXT1sY2Rscl9taW47CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrMl09bGNkbHJfbWF4Oy8vbnVtX2FycmF5W3RlbXBfY291bnRdOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzNdPTA7CgkJCQkJLy90ZW1wX2NvdW50PXRlbXBfY291bnQrNDsKCQkJCX0KCgoKCQkJfQoKCQkJZm9yICh0ZW1wX2NvdW50ID0gMzIrODsgdGVtcF9jb3VudCA8ICgzMis4KzgpOyB0ZW1wX2NvdW50KyspICAvL2FkZAoJCQl7CgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CQoJCQkJCWlmKCgodGVtcF9jb3VudC04KS80KTw4KSAgCgkJCQkJewoJCQkJCQlsY2Rscl9taW49MDsKCQkJCQkJbGNkbHJfbWF4PShkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9pZihsYW5lX3N0ZXA9PTkpCgkJCQkJCS8vbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJZWxzZSBpZigoKHRlbXBfY291bnQtOCkvNCk8MTApICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCWlmKCgodGVtcF9jb3VudC04KS80KT09OSkKCQkJCQkJCWxjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJfQoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOC0zMik+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzFdPWxjZGxyX21pbjsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsyXT1sY2Rscl9tYXg7Ly9udW1fYXJyYXlbdGVtcF9jb3VudF07CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrM109MDsKCQkJCX0KCgoJCQl9CgoKCgojaWYgIChDT05GSUdfRERSX1BIWTw9UF9ERFJfUEhZXzkwNVgpCgkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgxR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgyR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgzR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSk7CgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwxOyAgICAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDEpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDIpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDMpOyAgIAoKI2VuZGlmCgkJCWlmKGxhbmVfZGlzYWJsZSkKCQkJe2lmKGxhbmVfZGlzYWJsZSYweDEpewoJCQkJCQkJCQkgbnVtX2FycmF5WzgrM109MHhmZmZmOwoJCQkJCQkJCQkgbnVtX2FycmF5WzgrNCszXT0weGZmZmY7CgkJCQkJCQkJIH0KCQkJaWYobGFuZV9kaXNhYmxlJjB4Mil7CgkJCQludW1fYXJyYXlbOCszKzhdPTB4ZmZmZjsKCQkJCW51bV9hcnJheVs4KzQrMys4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4NCl7CgkJCQludW1fYXJyYXlbOCszKzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDgpewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PSV4XG4iLGxhbmVfZGlzYWJsZSk7CgkJCWlmKGxhbmVfZGlzYWJsZSYweDEwKXsKCQkJCW51bV9hcnJheVs4KzMrOCs4KzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIwKXsKCQkJCW51bV9hcnJheVs4KzQrMys4KzgrOCs4XT0weGZmZmY7CgoJCQl9CgkJCX0KCgoJCX0KCgoKCgkJZm9yICh0ZW1wX2NvdW50PSAwOyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCX0KCgkvL3Rlc3RfYXJnXzJfc3RlcCsrOwoJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCWZvciAodGVtcF9jb3VudCA9IDE7IHRlbXBfY291bnQgPCA0ODsgdGVtcF9jb3VudCsrKSAKCXsKCQlwcmludGYoIiVkICAlZFxuIiwgdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoJdGVtcF9jb3VudD0yOwoJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCS8vCSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCS8vIAkgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgLHRlc3RfYXJnXzJfc3RlcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCS8vZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCgkvLwkgd3JpdGVsKG51bV9hcnJheVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCS8vfQoKCgkvL2ZvciAoaSA9IDg7IGkgPCA0ODsgaSsrKSB7CgkvL251bV9hcnJheVtpXT1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCS8vcHJpbnRmKCJkZHJfdGVzdF9kYXRhX251bV8lMDRkPT0lZFxuIixpLG51bV9hcnJheVtpXSk7CgkvL30KCgkvLy8qCgl1bnNpZ25lZCBpbnQgbGFuZV9zdGVwPTA7CgoJcHJpbnRmKCJcbnN0YXJ0IGxvb3AgdGVzdFxuIik7CgoJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8MTApOyhsYW5lX3N0ZXArKykpICAgLy9maW5kIG5lZWQgdGVzdCBkYXRhIHN0ZXAKCXsKCQlpZih0ZXN0X2FyZ18yX3N0ZXA8RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkcpCgkJewoJCQlpZigobnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzMrOF08KDB4NCkpKQoJCQl7YnJlYWs7CgkJCX0KCQl9Cgl9CgoJaWYodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfT05HT0lORykKCXtpZihsYW5lX3N0ZXA+OSkKCQl7CgkJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIOwoJCQlwcmludGYoInVib290IHRlc3QgcmVzdWx0OiBcbiIpOwoJCX0KCX0KCglpZih0ZXN0X2FyZ18yX3N0ZXA+RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCkKCXsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkgICAvL2ZpbmQgbmVlZCB0ZXN0IGRhdGEgc3RlcAoJCXsKCgkJCXsKCQkJCWlmKChudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMys4XTwoMHg0KzQpKSkKCQkJCXticmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZih0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0gpLy98fCh0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIKQoJewoJCS8vdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HOwoJfQoJZWxzZQoJewoJCXByaW50ZigiXG5zdGFydCAgdGVzdCBsYW5lX3N0ZXAgPSVkXG4iLGxhbmVfc3RlcCk7CgkJaWYobGFuZV9zdGVwPDEwKQoJCXsKCQkJaWYobGFuZV9zdGVwPDgpCgkJCXsKCQkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCQkJCWRkcl90ZXN0X3NpemU9ZGRyX2RhdGFfdGVzdF9zaXplOwoJCQkJZGRyX3Rlc3RfbWV0aG9kPWRkcl9kYXRhX3Rlc3RfbWV0aG9kOwoJCQkJLy9sY2Rscl9taW49MDsKCQkJCS8vbGNkbHJfbWF4PShkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl0ZXN0X3dhdGNoZG9nX3RpbWVfcz1hZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zOwoJCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfYWRkX3Rlc3Rfc2l6ZTsKCQkJCWRkcl90ZXN0X21ldGhvZD1kZHJfYWRkX3Rlc3RfbWV0aG9kOwoJCQkJLy9sY2Rscl9taW49MDsKCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCS8vaWYobGFuZV9zdGVwPT05KQoJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQl9CgoJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KSAgLy9mcm9tIGtlcm5lbCAKCQkJewoJCQkJbnVtX2FycmF5WzFdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkvLyBERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl9CgoJCQlpZigoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0wKSl8fCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTQpKSkgICAvL3Rlc3QgbGVmdCBlZGdlIGJlZ2luCgkJCXsKCQkJCS8qCgkJCQkgICBudW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOy8vMSBwYXNzIDIgZXJyb3IKCQkJCSAgIG51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQkJICAgbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgkJCQkgICBudW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgkJCQkgICBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJCSAgIG51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJCQkJICAgbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCQkJCSAgICovCgkJCQkvLyAgICAgICAgIHRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF0pOwoJCQkJLy8JIG51bV9hcnJheVswXT10ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU7CgkJCQkvLwkgdGVtcF9jb3VudD0wOwoJCQkJLy8JIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCS8vIAkgdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJdGVtcF9jb3VudD0xOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCXsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs1XT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pOyAgLy9lZGdlIGxjZGxyCgkJCQl0ZW1wX2NvdW50PTU7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7ICAKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk+PjEpOwoJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvL3RlbXBfbGNkbHIKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAgLy90ZW1wX2xjZGxyCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10rMSk7CgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAvL2xhbmUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJewoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCX0KCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJLy9oZXJlIHdpbGwgZGVhZAoKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl9CgkJCQkvL2lmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoKCgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09MSl8fCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTUpKSkgICAvL3Rlc3QgbGVmdCBlZGdlIGJlZ2luKSAgIC8vdGVzdCBsZWZ0IGVkZ2Ugb25nb2luZyAgICAtbG9vcAoJCQl7CgoJCQkJaWYoKG51bV9hcnJheVs2XSsxKT49KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKSkKCQkJCXsKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgoKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10rMTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJbnVtX2FycmF5WzVdPTA7ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl0rMTsgICAvL3VwZGF0ZSBCCgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl07ICAgLy91cGRhdGUgQgoJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQl7CgkJCQkJCS8vCW51bV9hcnJheVsxXT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCS8vIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoJCQkJCS8vICB0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9MDsvLyhudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7CgkJCQkJLy8gbnVtX2FycmF5WzBdPXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZTsKCQkJCQkvLyB0ZW1wX2NvdW50PTA7CgkJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOyAKCQkJCQl3aGlsZSgxKTsKCgkJCQl9CgkJCQllbHNlIAoJCQkJeyAKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgkJCQkJZWxzZSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCXsKCgoKCQkJCQkJewoJCQkJCQkJLy8gICBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCQkJdGVtcF9jb3VudD01OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOwoJCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoJCQkJCQkJLy8gICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07ICAgLy91cGRhdGUgQgoJCQkJCQkJLy8gdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCX0KCgoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQl7CgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgoJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgoKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQkJfQoKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJZWxzZQkgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQl7CgkJCQkJCS8vIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBtaW4gdmFsdWUKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pPj4xKTsKCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgkJCQkJCS8vICAgdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLXVwZGF0ZSBjdXJlbnQKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQl7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQl7CgkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCXsKCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQl7CgkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJfQoKCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCX0KCQkJCX0KCgoJCQl9CgoJCQllbHNlICBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTIpfHwoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT02KSkpICAgLy90ZXN0IHJpZ2h0IGVkZ2UgYmVnaW4KCQkJewoJCQkJLyoKCQkJCSAgIG51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7Ly8xIHBhc3MgMiBlcnJvcgoJCQkJICAgbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgkJCQkgICBudW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJCSAgIG51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCQkJCSAgIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJCQkJICAgbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCQkgICBudW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoJCQkJICAgKi8KCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJdGVtcF9jb3VudD0xOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCXsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgoKCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXTsvL2xjZGxyX21heDsgIC8vZWRnZSBsY2RscgoJCQkJdGVtcF9jb3VudD01OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07Ly8KCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJLy90ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvL3RlbXBfbGNkbHIKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAgLy90ZW1wX2xjZGxyCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXSsxOwoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgLy9sYW5lIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoKCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQl7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCgkJCQl9CgkJCX0KCQkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTMpfHwobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTcpKSAgIC8vdGVzdCByaWdodCBlZGdlIG9uZ29pbmcgICAgLWxvb3AKCQkJewoKCQkJCWlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSsxKT49KG51bV9hcnJheVs2XSkpCgkJCQl7CgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9OVUxMKQoJCQkJCXtwcmludGYoImRlZmF1bHQgdmFsdWUgbm90IHN0YWJsZSAsb3IgcmVjb3Zlcnkgc3RpY2t5P1xuIik7CgkJCQkJfQoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPSBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXSsxOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQludW1fYXJyYXlbNV09MDsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdLTE7ICAgLy91cGRhdGUgQgoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdOyAgIC8vdXBkYXRlIEIKCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQl7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsgCgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlIAoJCQkJeyAKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgkJCQkJZWxzZSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCXsKCgoKCQkJCQkJewoJCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MzsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJCQkJbnVtX2FycmF5WzVdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsKCQkJCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0UpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCQkJCS8vICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07ICAgLy91cGRhdGUgQgoJCQkJCQkJLy8gdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCX0KCgoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQl7CgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgoJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgoJCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbHNlCSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCXsKCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MzsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIG1heCB2YWx1ZQoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCQkJLy8gICAgdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLXVwZGF0ZSBjdXJlbnQKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCXsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCXsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJewoJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoKCgkJCX0KCQl9Cgl9CglpZihsYW5lX3N0ZXA+PTEwKSAvL2ZpbmlzaAoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJfQoKCS8vIHVuc2lnbmVkIGludCAgIGFjbWRscj0gMDsKCXVuc2lnbmVkIGludCAgZGVsYXlfc3RlcF94MTAwPSAwOwoKCXsKCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQlkZWxheV9zdGVwX3gxMDA9MTAwKjEwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGsqYWNtZGxyKTsKCQlwcmludGYoIlxuYWNtZGxyPTB4JTA4eC0tPmRlYyAlZCxkZHIgY2xrPT0lZCxzdGVwPSVkIHBzLDEwc3RlcD0lZCBwcywxMDBzdGVwPSVkIHBzLFxuIixhY21kbHIsYWNtZGxyLGdsb2JhbF9kZHJfY2xrLAoJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHx3ZHFfb3JnIDB4JTA4eCAgfHdkcV9taW4gMHglMDh4IHx3ZHFfbWF4IDB4JTA4eCA6OnxyZHFzX29yZyAgMHglMDh4ICB8cmRxc19taW4gMHglMDh4IHxyZHFzX21heCAweCUwOHggIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlsYW5lX3N0ZXA9NDsKCQl7CgkJCXByaW50ZigiXG5hY19sYW5lXzB4JTA4eHxsY2Rfb3JnIDB4JTA4eCAgfGxjZF9taW4gMHglMDh4IHxsY2RfbWF4IDB4JTA4eCA6OnxiZGxyX29yZyAgMHglMDh4ICB8YmRscl9taW4gMHglMDh4IHxiZGxyX21heCAweCUwOHggIFxuIiwKCQkJCQk0LAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdKTsKCQl9CgkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgkJewoJCQlwcmludGYoIlxuIGFjX2xhbmVfMHgwMDAwMDAwfCAgbGNkbHJfb3JnICB8bGNkbHJfc2V0IHBzfGxjZGxyX2hvbGQgcHM6fFwKCQkJCQljbGtfc2V0dXAgIHBzfCBjbGtfaG9sZCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgkJCXByaW50ZigiXG4gYWNfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgkJCXByaW50ZigiXG4gY2tfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgkJfQoJCXByaW50ZigiXG4gYV9sYW5lXzB4MDAwMDAwMDB8IHdyZHFfb3JnIDB4MHx3X3NldHVwIHggcHN8d19ob2xkICB4IHBzOjp8XAoJCQkJcmRfc2V0dXAgIHBzfHJkX2hvbGQgeCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgoKCgkJfQoJfQoKCglpZih0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0gpLy98fCh0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIKQoJewoJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORzsKCQludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoJCXRlbXBfY291bnQ9MjsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl3aGlsZSgxKTsKCgl9CgoJaWYodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORykvL3x8KHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0gpCgl7CgkJdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIOwoJCW51bV9hcnJheVsyXT10ZXN0X2FyZ18yX3N0ZXA7CgkJdGVtcF9jb3VudD0yOwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQlERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsdGVzdF9hcmdfMl9zdGVwLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoKCgoKCgoJLy8gaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgoKCglyZXR1cm4gMTsKfQoKCmludCBkb19kZHJfdWJvb3Rfa2VybmVsX3dpbmRvd191c2Vfc291cmNlX3F1aWNrX21ldGhvZHMoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvL3NldGVudiBzdG9yZWJvb3QgImRkcl90ZXN0X2NtZCAweDM0IDIgNiAgMjAgMCAweDEwMDAwMCAweDQwMDAwMDAiCglwcmludGYoIlxuc2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MzQgMiA2ICAyMCAwIDB4MTAwMDAwIDB4NDAwMDAwMCBcbiIpOwoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSBmdW5jdGlvblxuIik7CglwcmludGYoIlxuLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKI2RlZmluZSBERFJfVEVTVF9OVUxMICAwCiNkZWZpbmUgRERSX1RFU1RfUEFTUyAgMQojZGVmaW5lIEREUl9URVNUX0ZBSUwgMgoKI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgICA0ICAvLyBQUkVHX1NUSUNLWV9SRUc0CiNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICAgIDUgIC8vNDUvLyBQUkVHX1NUSUNLWV9SRUc0CgkvL1BSRUdfU1RJQ0tZX1JFRzUKCgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HICAgMQojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0ggMgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HICAzCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0ggNAoKI2RlZmluZSBERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yICAgMSAgIC8vQUIgTUVUSE9EICBBIGlzIGZhaWxpbmcgQiBpcyBwYXNzaW5nIHZhbHVlCiNkZWZpbmUgRERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFICAgMgojZGVmaW5lIEREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUgICAzCgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxhbmVfZGlzYWJsZT0gMDsKCXVuc2lnbmVkIGludCAgIGRhdGFfc291cmNlPSAwOwoJdW5zaWduZWQgaW50ICBkZHJfZGF0YV90ZXN0X21ldGhvZD1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoJdW5zaWduZWQgaW50ICBkZHJfYWRkX3Rlc3RfbWV0aG9kPUREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X21ldGhvZD1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoKCXVuc2lnbmVkIGludCAgZGRyX2VuYWJsZV9rZXJuZWxfd2luZG93X3Rlc3RfZmxhZz0wOwoKCXVuc2lnbmVkIGludCAgZGRyX2RhdGFfdGVzdF9zaXplPTB4MTAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX2FkZF90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9MDsKCS8vdW5zaWduZWQgaW50ICBkZHJfbGNkbHJfdGVzdF9vcmdfc2F2ZT0wOwoJdW5zaWduZWQgaW50ICBkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTA7CgoJdW5zaWduZWQgaW50ICBhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoJdW5zaWduZWQgaW50ICB0ZXN0X3dhdGNoZG9nX3RpbWVfcz0xNTsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0xOyAgLy9mb3IgcXVpY2sgb3V0IG9mIGVycm9yCglpZiAoYXJnYyA+MSkgewoJCWRhdGFfc291cmNlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRhdGFfc291cmNlPSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOVjsKCQl9Cgl9CglpZiAoYXJnYyA+MikgewoJCXdhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl3YXRjaGRvZ190aW1lX3M9IDE1OwoJCX0KCX0KCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJLy90ZXN0X3dhdGNoZG9nX3RpbWVfcz1hZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zOwoJaWYgKGFyZ2MgPjMpIHsKCQlhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9IHdhdGNoZG9nX3RpbWVfczsKCQl9Cgl9CglwcmludGYoImFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9PSVkXG4iLGFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJLy9sYW5lX2Rpc2FibGU9Z19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl90ZXN0X2xhbmVfZGlzYWJsZTsKCWlmIChhcmdjID40KSB7CgkJbGFuZV9kaXNhYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWxhbmVfZGlzYWJsZT0gMDsKCQl9Cgl9CglwcmludGYoImxhbmVfZGlzYWJsZT09MHglMDh4XG4iLGxhbmVfZGlzYWJsZSk7ICAgCgoJaWYgKGFyZ2MgPjUpIHsKCQlkZHJfZGF0YV90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2RhdGFfdGVzdF9zaXplPSAweDEwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl9kYXRhX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9kYXRhX3Rlc3Rfc2l6ZSk7CglpZiAoYXJnYyA+NikgewoJCWRkcl9hZGRfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9hZGRfdGVzdF9zaXplPSAweDEwMDAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2FkZF90ZXN0X3NpemU9PTB4JTA4eFxuIixkZHJfYWRkX3Rlc3Rfc2l6ZSk7CglpZiAoYXJnYyA+NykgewoJCWRkcl9kYXRhX3Rlc3RfbWV0aG9kID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9kYXRhX3Rlc3RfbWV0aG9kPSBERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9tZXRob2Q9PTB4JTA4eFxuIixkZHJfZGF0YV90ZXN0X21ldGhvZCk7CglpZiAoYXJnYyA+OCkgewoJCWRkcl9hZGRfdGVzdF9tZXRob2QgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X21ldGhvZD0gRERSX1RFU1RfTUVUSE9EX0RJVklERVJfMjsKCQl9Cgl9CglwcmludGYoImRkcl9hZGRfdGVzdF9tZXRob2Q9PTB4JTA4eFxuIixkZHJfYWRkX3Rlc3RfbWV0aG9kKTsKCglpZiAoYXJnYyA+OSkgewoJCWRkcl9lbmFibGVfa2VybmVsX3dpbmRvd190ZXN0X2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2VuYWJsZV9rZXJuZWxfd2luZG93X3Rlc3RfZmxhZz0gMDsKCQl9Cgl9CglwcmludGYoImRkcl9lbmFibGVfa2VybmVsX3dpbmRvd190ZXN0X2ZsYWc9PTB4JTA4eFxuIixkZHJfZW5hYmxlX2tlcm5lbF93aW5kb3dfdGVzdF9mbGFnKTsKCgl1bnNpZ25lZCBpbnQgcmFua19pbmRleD0wOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9kYXRhX2FycmF5X21heD0xMDA7Cgl1bnNpZ25lZCBpbnQgbnVtX2FycmF5WzEwMF07Ly84IGZsYWcgMzJfZGF0YSBhZGRfOCAgMzJfZGF0YSBhZGRfOAoKCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MDsKCXVuc2lnbmVkIGludCBsY2Rscl9taW49MDsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCW1lbXNldChudW1fYXJyYXksIDAsIHNpemVvZihudW1fYXJyYXkpKTsKCWNoYXIgc3RyWzEwMjRdPSIiOwoKCWlmKGRhdGFfc291cmNlPT1ERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgkJZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9NjQ7Cglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4OyB0ZW1wX2NvdW50KyspIAoJewoJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCApOwoJCXByaW50ZigicmVhZCBudW1hcnJ5WyVkXT09JWRcbiIsdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWUgPTA7ICAvL2Jlc3RfbGNkbHJfdmFsdWUKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZyA9MDsgIC8vbWluIGNtZAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzJfc3RlcCA9MDsgLy9zdGVwIDAgIGluaXQgIC0xICBVQk9PVCBPTkdPSU5HICAyIFVCT09UIEZJTklTSCAgMyBLRVJORUwgT05HT0lORyA0IEtFUk5FTCBGSU5JU0gKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18zX2ZyZXEgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19tYWdpY19udW1iZXIgPTA7Cgl1bnNpZ25lZCBpbnQgb3JnX2xjZGxyX3ZhbHVlX3RlbXA9MDsKCXVuc2lnbmVkIGludCBhY21kbHI9MDsKCWFjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCgl0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9bnVtX2FycmF5WzBdOwoJdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9bnVtX2FycmF5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJheVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyYXlbM107Cgl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPW51bV9hcnJheVs0XTsKCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT1udW1fYXJyYXlbNV07Cgl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bnVtX2FycmF5WzZdOwoJdGVzdF9hcmdfN19tYWdpY19udW1iZXI9bnVtX2FycmF5WzddOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9PSVkXG4iLHRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZSk7CglwcmludGYoInRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnPT0lZFxuIix0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZyk7CglwcmludGYoInRlc3RfYXJnXzJfc3RlcD09JWRcbiIsdGVzdF9hcmdfMl9zdGVwKTsKCXByaW50ZigidGVzdF9hcmdfM19mcmVxPT0lZFxuIix0ZXN0X2FyZ18zX2ZyZXEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPT0lZFxuIix0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzKTsKCXByaW50ZigidGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPSVkXG4iLG51bV9hcnJheVs1XSk7CglwcmludGYoInRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0lZFxuIixudW1fYXJyYXlbNl0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ183X21hZ2ljX251bWJlcj0lZFxuIixudW1fYXJyYXlbN10pOwoKCgoJaWYoKHRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPT1ETUNfU1RJQ0tZX01BR0lDXzEpKSAvL2ZvciBjaGVjayBtYWdpYyBudW1iZXIgbWFrZSBzdW1lIGVudGVyIHRlc3QgY29tbWFuZAoJewoJfQoJZWxzZQoJewoKCQl0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9MDsKCQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9MDsKCQl0ZXN0X2FyZ18yX3N0ZXA9MDsKCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsKCQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1ETUNfU1RJQ0tZX01BR0lDXzE7Cgl9CgkvL3ByaW50ZigiYm9vdCB0aW1lcz09JWRcbiIsdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlKTsKCW51bV9hcnJheVswXQk9CXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZQkJOwoJbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsKCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgl7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJfQoKCgoJaWYodGVzdF9hcmdfMl9zdGVwKQoJewoJCWlmKHRlc3RfYXJnXzNfZnJlcSE9Z2xvYmFsX2Rkcl9jbGspICAvLwoJCXsKCQkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzJWQsd2lsbCByZWJvb3QgdXNlIGQycGxsIFxuIixnbG9iYWxfZGRyX2Nsayx0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIix0ZXN0X2FyZ18zX2ZyZXEpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoJaWYodGVzdF9hcmdfMl9zdGVwPT0wKQoJewoJCXsKCgoKCQkJdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlPTA7CgkJCXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnPTA7CgkJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfT05HT0lORzsKCQkJdGVzdF9hcmdfM19mcmVxPWdsb2JhbF9kZHJfY2xrOwoJCQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPTA7CgkJCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT0wOwoJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9bGNkbHJfbWluOwoJCQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1ETUNfU1RJQ0tZX01BR0lDXzE7CgkJCW51bV9hcnJheVswXQk9CXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZQkJOwoJCQludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOwoJCQludW1fYXJyYXlbMl0JPQl0ZXN0X2FyZ18yX3N0ZXAJCTsKCQkJbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgkJCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlCQk7CgkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCgkJCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCQkJewoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkvLyAJIEREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICx0ZXN0X2FyZ18yX3N0ZXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCS8vZm9yICh0ZW1wX2NvdW50ID0gODsgdGVtcF9jb3VudDwgNDg7dGVtcF9jb3VudCsrKSB7CgkJCS8vCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJLy99CgoJCQlmb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50IDwgKDMyKzgpOyB0ZW1wX2NvdW50KyspICAgLy9kYXRhCgkJCXsKCQkJCS8vcHJpbnRmKCIxdGVtcF9jb3VudD0lZFxuIix0ZW1wX2NvdW50KTsKCgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CgkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDgpICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQllbHNlIGlmKCgodGVtcF9jb3VudC04KS80KTwxMCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPT05KQoJCQkJCQkJbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJLy9wcmludGYoIjJ0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKCh0ZW1wX2NvdW50LTgpPj4yKSxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsxXT1sY2Rscl9taW47CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrMl09bGNkbHJfbWF4Oy8vbnVtX2FycmF5W3RlbXBfY291bnRdOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzNdPTA7CgkJCQkJLy90ZW1wX2NvdW50PXRlbXBfY291bnQrNDsKCQkJCX0KCgoKCQkJfQoKCQkJZm9yICh0ZW1wX2NvdW50ID0gMzIrODsgdGVtcF9jb3VudCA8ICgzMis4KzgpOyB0ZW1wX2NvdW50KyspICAvL2FkZAoJCQl7CgkJCQlpZigodGVtcF9jb3VudCU0KT09MCkgIC8vb3JnCgkJCQl7CQoJCQkJCWlmKCgodGVtcF9jb3VudC04KS80KTw4KSAgCgkJCQkJewoJCQkJCQlsY2Rscl9taW49MDsKCQkJCQkJbGNkbHJfbWF4PShkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9pZihsYW5lX3N0ZXA9PTkpCgkJCQkJCS8vbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJZWxzZSBpZigoKHRlbXBfY291bnQtOCkvNCk8MTApICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCWlmKCgodGVtcF9jb3VudC04KS80KT09OSkKCQkJCQkJCWxjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJfQoJCQkJCS8vbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQkJLy91bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBkYXRhX2FkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApKQoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOC0zMik+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzFdPWxjZGxyX21pbjsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsyXT1sY2Rscl9tYXg7Ly9udW1fYXJyYXlbdGVtcF9jb3VudF07CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrM109MDsKCQkJCX0KCgoJCQl9CgoKCgojaWYgIChDT05GSUdfRERSX1BIWTw9UF9ERFJfUEhZXzkwNVgpCgkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgxR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgyR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgzR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSk7CgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwxOyAgICAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDEpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDIpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDMpOyAgIAoKI2VuZGlmCgkJCWlmKGxhbmVfZGlzYWJsZSkKCQkJe2lmKGxhbmVfZGlzYWJsZSYweDEpewoJCQkJCQkJCQkgbnVtX2FycmF5WzgrM109MHhmZmZmOwoJCQkJCQkJCQkgbnVtX2FycmF5WzgrNCszXT0weGZmZmY7CgkJCQkJCQkJIH0KCQkJaWYobGFuZV9kaXNhYmxlJjB4Mil7CgkJCQludW1fYXJyYXlbOCszKzhdPTB4ZmZmZjsKCQkJCW51bV9hcnJheVs4KzQrMys4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4NCl7CgkJCQludW1fYXJyYXlbOCszKzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDgpewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PSV4XG4iLGxhbmVfZGlzYWJsZSk7CgkJCWlmKGxhbmVfZGlzYWJsZSYweDEwKXsKCQkJCW51bV9hcnJheVs4KzMrOCs4KzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIwKXsKCQkJCW51bV9hcnJheVs4KzQrMys4KzgrOCs4XT0weGZmZmY7CgoJCQl9CgkJCX0KCgoJCX0KCgoKCgkJZm9yICh0ZW1wX2NvdW50PSAwOyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCX0KCgkvL3Rlc3RfYXJnXzJfc3RlcCsrOwoJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCWZvciAodGVtcF9jb3VudCA9IDE7IHRlbXBfY291bnQgPCA0ODsgdGVtcF9jb3VudCsrKSAKCXsKCQlwcmludGYoIiVkICAlZFxuIiwgdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoJdGVtcF9jb3VudD0yOwoJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCS8vCSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCS8vIAkgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgLHRlc3RfYXJnXzJfc3RlcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCS8vZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCgkvLwkgd3JpdGVsKG51bV9hcnJheVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCS8vfQoKCgkvL2ZvciAoaSA9IDg7IGkgPCA0ODsgaSsrKSB7CgkvL251bV9hcnJheVtpXT1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCS8vcHJpbnRmKCJkZHJfdGVzdF9kYXRhX251bV8lMDRkPT0lZFxuIixpLG51bV9hcnJheVtpXSk7CgkvL30KCgkvLy8qCgl1bnNpZ25lZCBpbnQgbGFuZV9zdGVwPTA7Cgl1bnNpZ25lZCBpbnQgbGFuZV9zdGVwX2NvdW50PTA7CgoJcHJpbnRmKCJcbnN0YXJ0IGxvb3AgdGVzdFxuIik7CgoJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8MTApOyhsYW5lX3N0ZXArKykpICAgLy9maW5kIG5lZWQgdGVzdCBkYXRhIHN0ZXAKCXsKCQlpZihkZHJfZW5hYmxlX2tlcm5lbF93aW5kb3dfdGVzdF9mbGFnPT0wKQoJCXsKCQkJaWYoKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSszKzhdPCgweDQpKSkKCQkJe2JyZWFrOwoJCQl9CgkJfQoJCWVsc2UgaWYodGVzdF9hcmdfMl9zdGVwPEREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HKQoJCXsKCQkJaWYoKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSszKzhdPCgweDQpKSkKCQkJe2JyZWFrOwoJCQl9CgkJfQoJfQoKCWlmKHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX1VCT09UX09OR09JTkcpCgl7aWYobGFuZV9zdGVwPjkpCgkJewoJCQl0ZXN0X2FyZ18yX3N0ZXA9RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSDsKCQkJcHJpbnRmKCJ1Ym9vdCB0ZXN0IHJlc3VsdDogXG4iKTsKCQl9Cgl9CgoKCWlmKGRkcl9lbmFibGVfa2VybmVsX3dpbmRvd190ZXN0X2ZsYWcpCgl7CgkJaWYodGVzdF9hcmdfMl9zdGVwPkREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0gpCgkJewoJCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkgICAvL2ZpbmQgbmVlZCB0ZXN0IGRhdGEgc3RlcAoJCQl7CgoJCQkJewoJCQkJCWlmKChudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMys4XTwoMHg0KzQpKSkKCQkJCQl7YnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCWlmKHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCkvL3x8KHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0gpCgl7CgkJLy90ZXN0X2FyZ18yX3N0ZXA9RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkc7Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJcbnN0YXJ0ICB0ZXN0IGxhbmVfc3RlcCA9JWRcbiIsbGFuZV9zdGVwKTsKCQlpZihsYW5lX3N0ZXA8MTApCgkJewoJCQlpZihsYW5lX3N0ZXA8OCkKCQkJewoJCQkJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfZGF0YV90ZXN0X3NpemU7CgkJCQlkZHJfdGVzdF9tZXRob2Q9ZGRyX2RhdGFfdGVzdF9tZXRob2Q7CgkJCQkvL2xjZGxyX21pbj0wOwoJCQkJLy9sY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly9kb19kZHJfcmVhZF9hY21kbHIoKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CgkJCQlkZHJfdGVzdF9zaXplPWRkcl9hZGRfdGVzdF9zaXplOwoJCQkJZGRyX3Rlc3RfbWV0aG9kPWRkcl9hZGRfdGVzdF9tZXRob2Q7CgkJCQkvL2xjZGxyX21pbj0wOwoJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJLy9pZihsYW5lX3N0ZXA9PTkpCgkJCQkvL2xjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCX0KCgkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpICAvL2Zyb20ga2VybmVsIAoJCQl7CgkJCQludW1fYXJyYXlbMV09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCS8vIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgkJCWlmKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTApKXx8KChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NCkpKSAgIC8vdGVzdCBsZWZ0IGVkZ2UgYmVnaW4KCQkJewoJCQkJLyoKCQkJCSAgIG51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7Ly8xIHBhc3MgMiBlcnJvcgoJCQkJICAgbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgkJCQkgICBudW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJCSAgIG51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCQkJCSAgIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJCQkJICAgbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCQkgICBudW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoJCQkJICAgKi8KCQkJCS8vICAgICAgICAgdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7CgkJCQkvLwkgbnVtX2FycmF5WzBdPXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZTsKCQkJCS8vCSB0ZW1wX2NvdW50PTA7CgkJCQkvLwkgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJLy8gCSB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCXsKCQkJCQl0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKTsKCQkJCQludW1fYXJyYXlbMF09dGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlOwoJCQkJCXRlbXBfY291bnQ9MDsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQl0ZW1wX2NvdW50PTE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJewoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzVdPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk7ICAvL2VkZ2UgbGNkbHIKCQkJCXRlbXBfY291bnQ9NTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsgIAoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKT4+MSk7CgkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvL3RlbXBfbGNkbHIKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAgLy90ZW1wX2xjZGxyCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10rMSk7CgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAvL2xhbmUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJewoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCX0KCgkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQl7CgkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudC1udW1fYXJyYXlbMF07Ly90ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU7Ly9udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsKCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsMCwKCQkJCQkJCShudW1fYXJyYXlbMF0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCXsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsxXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQl7CgkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzFdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCWlmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJe2lmIChkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPjB4M2YpCgkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTB4M2Y7CgkJCQkJCX0KCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LChsYW5lX3N0ZXBfY291bnQtOCksCgkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vaGVyZSB3aWxsIGRlYWQKCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJfQoJCQkJLy9pZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCgoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQl3aGlsZSgxKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgoJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCXsKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD0wOy8vdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOwoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQl7CgkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMF0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQlpZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQkJe2lmIChkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPjB4M2YpCgkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MHgzZjsKCQkJCQkJCQl9CgkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoKCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQllbHNlIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09MSl8fCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTUpKSkgICAvL3Rlc3QgbGVmdCBlZGdlIGJlZ2luKSAgIC8vdGVzdCBsZWZ0IGVkZ2Ugb25nb2luZyAgICAtbG9vcAoJCQl7CgoJCQkJaWYoKG51bV9hcnJheVs2XSsxKT49KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKSkKCQkJCXsKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgoKCgkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCXsKCQkJCQkJLy9kZHJfbGNkbHJfdGVzdF9vZmZzZXQ9MDsvL3Rlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudC1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCXsKCgkJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXT0gbnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM10rMTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQkJbGFuZV9zdGVwX2NvdW50PTgrKGxhbmVfc3RlcF9jb3VudDw8MikrMzsKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109IG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdKzE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCQkJCQludW1fYXJyYXlbNV09MDsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkvLyAgICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJLy8gICAgICAgbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzZdKzE7ICAgLy91cGRhdGUgQgoJCQkJCS8vICAgICAgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQkvLyAgICAgIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgICAvL3VwZGF0ZSBCCgkJCQkJLy8JIHRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoKCgkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCXsKCgkJCQkJCXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT0gbnVtX2FycmF5WzBdOwoJCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJCXsKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSsxLXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZTsKCQkJCQkJfQoJCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJCXsKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSswLXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZTsKCQkJCQkJfQoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTEpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCXsKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCQlpZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQl7CgkJCQkJCQkJaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCk+MHgzZikKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJfQoJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQkoOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyKSAsZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCgkJCQkJfQoJCQkJCWVsc2UgCgkJCQkJewoJCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl0rMTsgICAvL3VwZGF0ZSBCCgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgICAvL3VwZGF0ZSBCCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQl7CgkJCQkJCS8vCW51bV9hcnJheVsxXT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCS8vIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoJCQkJCS8vICB0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9MDsvLyhudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7CgkJCQkJLy8gbnVtX2FycmF5WzBdPXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZTsKCQkJCQkvLyB0ZW1wX2NvdW50PTA7CgkJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOyAKCQkJCQl3aGlsZSgxKTsKCgkJCQl9CgkJCQllbHNlIAoJCQkJeyAKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgkJCQkJZWxzZSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCXsKCgoKCQkJCQkJewoJCQkJCQkJLy8gICBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCQkJdGVtcF9jb3VudD01OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOwoJCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoJCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKSsxKTsKCQkJCQkJCS8vICAgdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCS8vIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOyAgIC8vdXBkYXRlIEIKCQkJCQkJCS8vIHRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCXsKCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgoKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgoJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQkJewoKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVswXTsvL3RudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsKCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsMCwKCQkJCQkJCQkJCShudW1fYXJyYXlbMF0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCXsKCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsxXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCQkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQl7CgkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzFdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCQkJCWlmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQkJe2lmIChkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPjB4M2YpCgkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTB4M2Y7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LChsYW5lX3N0ZXBfY291bnQtOCksCgkJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoKCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCX0KCQkJCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJewoJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoKCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgoJCQkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD0wOy8vdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOwoJCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMF0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQkJCQlpZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQkJCQkJe2lmIChkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPjB4M2YpCgkJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MHgzZjsKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgoJCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCgoJCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbHNlCSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCXsKCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIG1pbiB2YWx1ZQoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOwoJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKSsxKTsKCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoJCQkJCQkvLyAgIHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS11cGRhdGUgY3VyZW50CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudC1udW1fYXJyYXlbMF07Ly90bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07CgkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsMCwKCQkJCQkJCQkJKG51bV9hcnJheVswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTEpOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsxXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQl7CgkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMV0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQlpZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQkJe2lmIChkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPjB4M2YpCgkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MHgzZjsKCQkJCQkJCQl9CgkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCXsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQkJCXsKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PTA7Ly90ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQtbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07CgkJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD04KTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCQl7CgkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCQkJaWYobGFuZV9zdGVwX2NvdW50PT05KQoJCQkJCQkJCQkJe2lmIChkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPjB4M2YpCgkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJfQoKCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCXsKCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgoJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoKCgkJCX0KCgkJCWVsc2UgIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09Mil8fCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTYpKSkgICAvL3Rlc3QgcmlnaHQgZWRnZSBiZWdpbgoJCQl7CgkJCQkvKgoJCQkJICAgbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsvLzEgcGFzcyAyIGVycm9yCgkJCQkgICBudW1fYXJyYXlbMl0JPQl0ZXN0X2FyZ18yX3N0ZXAJCTsKCQkJCSAgIG51bV9hcnJheVszXQk9CXRlc3RfYXJnXzNfZnJlcQkJOwoJCQkJICAgbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQkJICAgbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlCQk7CgkJCQkgICBudW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCQkJCSAgIG51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgkJCQkgICAqLwoKCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCXsKCQkJCQl0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKTsKCQkJCQludW1fYXJyYXlbMF09dGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlOwoJCQkJCXRlbXBfY291bnQ9MDsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCXRlbXBfY291bnQ9MTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQl7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJfQoKCgkJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl07Ly9sY2Rscl9tYXg7ICAvL2VkZ2UgbGNkbHIKCQkJCXRlbXBfY291bnQ9NTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOy8vCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsKCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0UpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSktMSk7CgkJCQkvL3Rlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcF9sY2RscgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsICAvL3RlbXBfbGNkbHIKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdKzE7CgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAvL2xhbmUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgoJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJewoJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD1udW1fYXJyYXlbMF0tdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwwLAoJCQkJCQkJKG51bV9hcnJheVswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0xKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJewoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD04KTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCXsKCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJLy9pZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCXtpZiAoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdKTwoZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSkKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MDsKCQkJCQkJfQoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgoJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQl3aGlsZSgxKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCXsKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD0wOy8vbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0tdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQl7CgkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMF0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQkvL2lmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQkvLwl7aWYgKChudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXTxkZHJfbGNkbHJfdGVzdF9vZmZzZXQpCgkJCQkJCQkJLy8JZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCS8vCX0KCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCgkJCQl9CgkJCX0KCQkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTMpfHwobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTcpKSAgIC8vdGVzdCByaWdodCBlZGdlIG9uZ29pbmcgICAgLWxvb3AKCQkJewoKCQkJCWlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSsxKT49KG51bV9hcnJheVs2XSkpCgkJCQl7CgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9OVUxMKQoJCQkJCXtwcmludGYoImRlZmF1bHQgdmFsdWUgbm90IHN0YWJsZSAsb3IgcmVjb3Zlcnkgc3RpY2t5P1xuIik7CgkJCQkJfQoKCgkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCXsKCQkJCQkJLy9kZHJfbGNkbHJfdGVzdF9vZmZzZXQ9MDsvL3Rlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudC1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCXsKCgkJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXT0gbnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM10rMTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQkJbGFuZV9zdGVwX2NvdW50PTgrKGxhbmVfc3RlcF9jb3VudDw8MikrMzsKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109IG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdKzE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCQkJCQludW1fYXJyYXlbNV09MDsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkvLyAgICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJLy8gICAgIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XS0xOyAgIC8vdXBkYXRlIEIKCQkJCQkvLyAgICAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCS8vICAgICBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbNl07ICAgLy91cGRhdGUgQgoJCQkJCS8vCSB0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCQkvLwkgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCS8vCSB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJewoKCQkJCQkJdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlPSBudW1fYXJyYXlbMF07CgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZS1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSsxOwoJCQkJCQl9CgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZS1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSswOwoJCQkJCQl9CgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdPGRkcl9sY2Rscl90ZXN0X29mZnNldCkKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTA7CgkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJCSg4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzIpICxkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQl9CgkJCQkJZWxzZSAKCQkJCQl7CgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XS0xOyAgIC8vdXBkYXRlIEIKCQkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdOyAgIC8vdXBkYXRlIEIKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOyAKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UgCgkJCQl7IAoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJCX0KCQkJCQllbHNlICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJewoKCgoJCQkJCQl7CgkJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCQkJdGVtcF9jb3VudD01OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCQkJCS8vICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07ICAgLy91cGRhdGUgQgoJCQkJCQkJLy8gdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCX0KCgoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQl7CgkJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PW51bV9hcnJheVswXS10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LDAsCgkJCQkJCQkJCQkobnVtX2FycmF5WzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTEpOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCQkobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJewoJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCQkvL2lmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQkJe2lmICgobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0pPChkZHJfbGNkbHJfdGVzdF9vZmZzZXQpKQoJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQl7CgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgoJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9MDsvL251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdLXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJCQkJCQkobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMF0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJCX0KCQkJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD04KTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCQkJCQkJLy9pZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQkJCQkJLy8Je2lmICgobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMF08ZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KQoJCQkJCQkJCQkJCS8vCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MDsKCQkJCQkJCQkJCQkvLwl9CgkJCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQl9CgkJCQkJCQkJCWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQkJfQoKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJZWxzZQkgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQl7CgkJCQkJCS8vIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTM7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBtYXggdmFsdWUKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsKCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSktMSk7CgkJCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCQkJLy8gICAgdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLXVwZGF0ZSBjdXJlbnQKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCXsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PW51bV9hcnJheVswXS10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsMCwKCQkJCQkJCQkJKG51bV9hcnJheVswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTEpOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQl7CgkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQkvL2lmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQl7aWYgKChudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXSk8KGRkcl9sY2Rscl90ZXN0X29mZnNldCkpCgkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MDsKCQkJCQkJCQl9CgkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCXsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQkJCXsKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PTA7Ly9udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXS10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD04KTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCQl7CgkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCQkJLy9pZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQkJCQkvLwl7aWYgKChudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXTxkZHJfbGNkbHJfdGVzdF9vZmZzZXQpCgkJCQkJCQkJCQkvLwlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTA7CgkJCQkJCQkJCQkvLwl9CgkJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LChsYW5lX3N0ZXBfY291bnQtOCksCgkJCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgkJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCXsKCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgoJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgoJCQkJCQl9CgoJCQkJCX0KCQkJCX0KCgoJCQl9CgkJfQoJfQoJaWYobGFuZV9zdGVwPj0xMCkgLy9maW5pc2gKCXsKCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCXByaW50ZigiY2xvc2UgIHdhdGNoZG9nXG4iKTsKCX0KCgkvLyB1bnNpZ25lZCBpbnQgICBhY21kbHI9IDA7Cgl1bnNpZ25lZCBpbnQgIGRlbGF5X3N0ZXBfeDEwMD0gMDsKCgl7CgkJLy9hY21kbHI9ZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJZGVsYXlfc3RlcF94MTAwPTEwMCoxMDAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKmFjbWRscik7CgkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsc3RlcD0lZCBwcywxMHN0ZXA9JWQgcHMsMTAwc3RlcD0lZCBwcyxcbiIsYWNtZGxyLGFjbWRscixnbG9iYWxfZGRyX2NsaywKCQkJCWRlbGF5X3N0ZXBfeDEwMC8xMDAsZGVsYXlfc3RlcF94MTAwLzEwLGRlbGF5X3N0ZXBfeDEwMCk7CgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8d2RxX29yZyAweCUwOHggIHx3ZHFfbWluIDB4JTA4eCB8d2RxX21heCAweCUwOHggOjp8cmRxc19vcmcgIDB4JTA4eCAgfHJkcXNfbWluIDB4JTA4eCB8cmRxc19tYXggMHglMDh4ICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdKTsKCQl9CgkJbGFuZV9zdGVwPTQ7CgkJewoJCQlwcmludGYoIlxuYWNfbGFuZV8weCUwOHh8bGNkX29yZyAweCUwOHggIHxsY2RfbWluIDB4JTA4eCB8bGNkX21heCAweCUwOHggOjp8YmRscl9vcmcgIDB4JTA4eCAgfGJkbHJfbWluIDB4JTA4eCB8YmRscl9tYXggMHglMDh4ICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXSwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XSk7CgkJfQoJCXByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOwoJCXsKCQkJcHJpbnRmKCJcbiBhY19sYW5lXzB4MDAwMDAwMHwgIGxjZGxyX29yZyAgfGxjZGxyX3NldCBwc3xsY2Rscl9ob2xkIHBzOnxcCgkJCQkJY2xrX3NldHVwICBwc3wgY2xrX2hvbGQgcHN8YWRqX3BlcmNlbnRbMTAwXVxuIik7CgoJCQlwcmludGYoIlxuIGFjX2xhbmUweCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQk0LAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMCwKCQkJCQkwLAoJCQkJCTEwMCoobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXStudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKS8oCgkJCQkJCTIqbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkpOwoJCQlwcmludGYoIlxuIGNrX2xhbmUweCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQk0LAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sCgkJCQkJMCwKCQkJCQkwLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTEwMCoobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XStudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKS8oCgkJCQkJCTIqbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkpOwoJCX0KCQlwcmludGYoIlxuIGFfbGFuZV8weDAwMDAwMDAwfCB3cmRxX29yZyAweDB8d19zZXR1cCB4IHBzfHdfaG9sZCAgeCBwczo6fFwKCQkJCXJkX3NldHVwICBwc3xyZF9ob2xkIHggcHN8YWRqX3BlcmNlbnRbMTAwXVxuIik7CgoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMCwKCQkJCQkwLAoJCQkJCTEwMCoobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXStudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKS8oCgkJCQkJCTIqbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkpOwoKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sCgkJCQkJMCwKCQkJCQkwLAoKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCTEwMCoobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XStudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKS8oCgkJCQkJCTIqbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkpOwoKCgoJCX0KCX0KCgoJaWYodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIKS8vfHwodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSCkKCXsKCQl0ZXN0X2FyZ18yX3N0ZXA9RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkc7CgkJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCQl0ZW1wX2NvdW50PTI7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJd2hpbGUoMSk7CgoJfQoKCWlmKHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkcpLy98fCh0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIKQoJewoJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSDsKCQludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoJCXRlbXBfY291bnQ9MjsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgLHRlc3RfYXJnXzJfc3RlcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJewoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCXdoaWxlKDEpOwoJCX0KCX0KCgoKCgoKCS8vIGlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoKCgoJcmV0dXJuIDE7Cn0KCmludCBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2VfYWxsX3NhbWVfaW5jcmVhc2UoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuc2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MzUgNCA2ICA2MCAwIDB4MTAwMDAwIDB4NDAwMDAwMCAgMCAweDEwMDAxMCAwXG4iKTsKCXByaW50ZigiXG5FbnRlciBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2UgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJcbi0tLSB3YXRjaGRvZyBzaG91bGQgPjE1c1xuIik7CgojZGVmaW5lIEREUl9URVNUX05VTEwgIDAKI2RlZmluZSBERFJfVEVTVF9QQVNTICAxCiNkZWZpbmUgRERSX1RFU1RfRkFJTCAyCgoKI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgICA0ICAvLyBQUkVHX1NUSUNLWV9SRUc0CiNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICAgIDUgIC8vNDUvLyBQUkVHX1NUSUNLWV9SRUc0CgkvL1BSRUdfU1RJQ0tZX1JFRzQKCS8vUFJFR19TVElDS1lfUkVHNQoKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfVUJPT1RfT05HT0lORyAgIDEKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIIDIKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORyAgMwojZGVmaW5lIEREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIIDQKCS8vI2RlZmluZSBERFJfVEVTVF9GQUlMIDIKCgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxhbmVfZGlzYWJsZT0gMDsKCXVuc2lnbmVkIGludCAgIGRhdGFfc291cmNlPSAwOwoJdW5zaWduZWQgaW50ICBkZHJfZGF0YV90ZXN0X3NpemU9MHgxMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfYWRkX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9zaXplPTB4MTAwMDAwMDA7CgoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9jbGVhcl9mbGFnPTA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2luaXRfb2Zmc2V0PTA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzaz0wOwoKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfdWJvb3RfbG9vcD0wOwoKCXVuc2lnbmVkIGludCAga2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPTYwOwoJdW5zaWduZWQgaW50ICB0ZXN0X3dhdGNoZG9nX3RpbWVfcz0xNTsKCgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MTsgIC8vZm9yIHF1aWNrIG91dCBvZiBlcnJvcgoJaWYgKGFyZ2MgPjEpIHsKCQlkYXRhX3NvdXJjZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkYXRhX3NvdXJjZT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9VQk9PVF9FTlY7CgkJfQoJfQoJaWYgKGFyZ2MgPjIpIHsKCQl3YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zPSAxNTsKCQl9Cgl9CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCS8vdGVzdF93YXRjaGRvZ190aW1lX3M9YWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfczsKCWlmIChhcmdjID4zKSB7CgkJa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcz0gd2F0Y2hkb2dfdGltZV9zOwoJCX0KCX0KCXByaW50Zigia2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPT0lZFxuIixrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJLy9sYW5lX2Rpc2FibGU9Z19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl90ZXN0X2xhbmVfZGlzYWJsZTsKCWlmIChhcmdjID40KSB7CgkJbGFuZV9kaXNhYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWxhbmVfZGlzYWJsZT0gMDsKCQl9Cgl9CglwcmludGYoImxhbmVfZGlzYWJsZT09MHglMDh4XG4iLGxhbmVfZGlzYWJsZSk7ICAgCgoJaWYgKGFyZ2MgPjUpIHsKCQlkZHJfZGF0YV90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2RhdGFfdGVzdF9zaXplPSAweDEwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl9kYXRhX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9kYXRhX3Rlc3Rfc2l6ZSk7CglpZiAoYXJnYyA+NikgewoJCWRkcl9hZGRfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9hZGRfdGVzdF9zaXplPSAweDEwMDAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2FkZF90ZXN0X3NpemU9PTB4JTA4eFxuIixkZHJfYWRkX3Rlc3Rfc2l6ZSk7CgoJaWYgKGFyZ2MgPjcpIHsKCQlkZHJfdGVzdF9jbGVhcl9mbGFnID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X2NsZWFyX2ZsYWc9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfdGVzdF9jbGVhcl9mbGFnPT0weCUwOHhcbiIsZGRyX3Rlc3RfY2xlYXJfZmxhZyk7CgoJaWYgKGFyZ2MgPjgpIHsKCQlkZHJfdGVzdF9pbml0X29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9pbml0X29mZnNldD0gMDsKCQl9Cgl9CglwcmludGYoImRkcl90ZXN0X2luaXRfb2Zmc2V0PT0weCUwOHhcbiIsZGRyX3Rlc3RfaW5pdF9vZmZzZXQpOwoKCWlmIChhcmdjID45KSB7CgkJZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzldLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzldID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzaz0gMDsKCQl9Cgl9CglwcmludGYoImRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzaz09MHglMDh4XG4iLGRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzayk7CgoJaWYgKGFyZ2MgPjEwKSB7CgkJZGRyX3Rlc3RfdWJvb3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTBdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3Vib290X2xvb3A9IDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfdGVzdF91Ym9vdF9sb29wPT0weCUwOHhcbiIsZGRyX3Rlc3RfdWJvb3RfbG9vcCk7CgoJdW5zaWduZWQgaW50IHJhbmtfaW5kZXg9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2NvdW50PTA7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9MTA7Cgl1bnNpZ25lZCBpbnQgbnVtX2FycmF5WzEwXTsvLzggZmxhZyAzMl9kYXRhIGFkZF84ICAzMl9kYXRhIGFkZF84CgoJdW5zaWduZWQgaW50IHRlbXBfdGVzdF9lcnJvcj0wOwoJLy91bnNpZ25lZCBpbnQgbGNkbHJfbWluPTA7CgkvL3Vuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCW1lbXNldChudW1fYXJyYXksIDAsIHNpemVvZihudW1fYXJyYXkpKTsKCS8vY2hhciBzdHJbMTAyNF09IiI7CgoKCWRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4PTEwOwoKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg7IHRlbXBfY291bnQrKykgCgl7CgkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEICk7CgkJcHJpbnRmKCJyZWFkIG51bWFycnlbJWRdPT0lZFxuIix0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9CgoJdW5zaWduZWQgaW50IHJlZ19kZWZfdmFsdWVfZGF0YVs0XTsgLy93cml0ZV9sY2Rscl92YWx1ZStyZWFkX2xjZGxyX3ZhbHVlPDwxNjsKCgkvLyNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICAgNCAgLy8gUFJFR19TVElDS1lfUkVHNAoJLy8jZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgICA1ICAvLzQ1Ly8gUFJFR19TVElDS1lfUkVHNAoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldCA9MDsgIC8vdXNlIGZvciBrZXJuZWwKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0ID0wOyAvL3VzZSBmb3Iga2VybmVsCgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X2xjZGxyX29mZnNldCA9MDsgLy9sZWZ0X2xjZGxyK3JpZ2h0X2xjZGxyPDwxNiAKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sID0wOyAvL2xlZnRfbGNkbHIKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPTA7IC8vcmlnaHRfbGNkbHIKCXVuc2lnbmVkIGludCAgZGVsYXlfc3RlcF94MTAwPSAwOwoKCS8vdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxID0wOwoJdW5zaWduZWQgaW50IHRlc3RfbGNkbHJfdGVtcF92YWx1ZTIgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl90ZW1wX3ZhbHVlID0wOwoJdW5zaWduZWQgaW50IHRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnID0wOwoKCXVuc2lnbmVkIGludCBhY21kbHI9MDsKCWFjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCgl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz0wOwoJcmVnX2RlZl92YWx1ZV9kYXRhWzBdPW51bV9hcnJheVswXTsKCXJlZ19kZWZfdmFsdWVfZGF0YVsxXT1udW1fYXJyYXlbMV07CglyZWdfZGVmX3ZhbHVlX2RhdGFbMl09bnVtX2FycmF5WzJdOwoJcmVnX2RlZl92YWx1ZV9kYXRhWzNdPW51bV9hcnJheVszXTsKCXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PW51bV9hcnJheVs0XTsKCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9bnVtX2FycmF5WzVdOwoJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz1udW1fYXJyYXlbNl07Cgl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD1udW1fYXJyYXlbN107CgoKCglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVswXT09MHglMDh4XG4iLG51bV9hcnJheVswXSk7CglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsxXT09MHglMDh4XG4iLG51bV9hcnJheVsxXSk7CglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsyXT09MHglMDh4XG4iLG51bV9hcnJheVsyXSk7CglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVszXT09MHglMDh4XG4iLG51bV9hcnJheVszXSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PSVkXG4iLG51bV9hcnJheVs0XSk7CglwcmludGYoInRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzVdKTsKCXByaW50ZigidGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0lZFxuIixudW1fYXJyYXlbNl0pOwoJcHJpbnRmKCJcbnRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PTB4JTA4eFxuIixudW1fYXJyYXlbN10pOwoKCgoKCS8vZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJLy8JewoJLy8JIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCS8vIAkgdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy99CgoKCWlmKGRkcl90ZXN0X2NsZWFyX2ZsYWcpCgl7ICAgICAgICAgICAgdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0wOwoJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQl0ZW1wX2NvdW50PTY7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCXByaW50ZigiXG4gY2xlYXIgc3RpY2t5IHJlZ2lzdGVyIHNob3VsZCByZXNldCx0aGVuIG92ZXIgd3JpdGUgLi4uLlxuIik7CgkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl3aGlsZSgxKTsKCX0KCglpZih0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKQoJewoJCXsKCgkJCS8vdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0xOwoKCgkJCWZvciAodGVtcF9jb3VudCA9IDA7IHRlbXBfY291bnQgPCAoOCk7IHRlbXBfY291bnQrKykgICAvL2RhdGEKCQkJewoJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMT1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsdGVtcF9jb3VudCx0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQl0ZW1wX2NvdW50PXRlbXBfY291bnQrMTsKCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZTI9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LCh0ZW1wX2NvdW50KSx0ZXN0X2xjZGxyX3RlbXBfdmFsdWUyLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQlyZWdfZGVmX3ZhbHVlX2RhdGFbdGVtcF9jb3VudC8yXT10ZXN0X2xjZGxyX3RlbXBfdmFsdWUxfCh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUyPDwxNik7CgkJCQlwcmludGYoIm51bV9hcnJheVslZF09JTA4eFxuIix0ZW1wX2NvdW50LzIsbnVtX2FycmF5W3RlbXBfY291bnQvMl0pOwoJCQl9CgoJCX0KCQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0wOwoJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9MDsKCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTA7CgkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9MDsKCQlpZihkZHJfdGVzdF9pbml0X29mZnNldCkKCQl7dGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9ZGRyX3Rlc3RfaW5pdF9vZmZzZXQ7CgkJfQoJCW51bV9hcnJheVswXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVswXQkJOwoJCW51bV9hcnJheVsxXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVsxXQkJOwoJCW51bV9hcnJheVsyXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVsyXQkJOwoJCW51bV9hcnJheVszXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVszXQkJOwoJCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7ICAvL3VzZSBmb3Iga2VybmVsCgkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOy8vdXNlIGZvciBrZXJuZWwKCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQJCTsKCgoKCQlmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgkJewoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCgoJfQoJZWxzZQoJewoJCWZvciAodGVtcF9jb3VudCA9IDA7IHRlbXBfY291bnQgPCAoOCk7IHRlbXBfY291bnQrKykgICAvL2RhdGEKCQl7CgkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZTE9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LHRlbXBfY291bnQsdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQl0ZW1wX2NvdW50PXRlbXBfY291bnQrMTsKCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMj1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKHRlbXBfY291bnQpLHRlc3RfbGNkbHJfdGVtcF92YWx1ZTIsRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJcmVnX2RlZl92YWx1ZV9kYXRhW3RlbXBfY291bnQvMl09dGVzdF9sY2Rscl90ZW1wX3ZhbHVlMXwodGVzdF9sY2Rscl90ZW1wX3ZhbHVlMjw8MTYpOwoJCQludW1fYXJyYXlbdGVtcF9jb3VudC8yXT1yZWdfZGVmX3ZhbHVlX2RhdGFbdGVtcF9jb3VudC8yXTsKCQkJcHJpbnRmKCJyZS1udW1fYXJyYXlbJWRdPSUwOHhcbiIsdGVtcF9jb3VudC8yLG51bV9hcnJheVt0ZW1wX2NvdW50LzJdKTsKCQl9Cgl9CgoJaWYoZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrJjEpCgl7cHJpbnRmKCJza2lwIHVib290IHRlc3Qgc2hvdWxkIGluaXQga2VybmVsIG9mZnNldCAgdmFsdWU9PTB4JTA4eFxuIixudW1fYXJyYXlbN10pOwoJfQoKCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7Cgl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSgodGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ+PjE2KSYweGZmZmYpOwoJdW5zaWduZWQgaW50IGxhbmVfc3RlcF9jb3VudD0wOwoJewoKCQl7CgkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfZGF0YV90ZXN0X3NpemU7CgoJCX0KCgkJcHJpbnRmKCJyZWdfZGVmX3ZhbHVlX2RhdGFbMF09PTB4JTA4eFxuIixudW1fYXJyYXlbMF0pOwoJCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzFdPT0weCUwOHhcbiIsbnVtX2FycmF5WzFdKTsKCQlwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsyXT09MHglMDh4XG4iLG51bV9hcnJheVsyXSk7CgkJcHJpbnRmKCJyZWdfZGVmX3ZhbHVlX2RhdGFbM109PTB4JTA4eFxuIixudW1fYXJyYXlbM10pOwoJCXByaW50ZigidGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzRdKTsKCQlwcmludGYoInRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzVdKTsKCQlwcmludGYoInRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9JWRcbiIsbnVtX2FycmF5WzZdKTsKCQlwcmludGYoInRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSVkXG4iLG51bV9hcnJheVs3XSk7CgoJCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTQpIC8vdWJvb3QgZmluaXNoCgkJewoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgoJCQkvLyB1bnNpZ25lZCBpbnQgICBhY21kbHI9IDA7CgoKCQkJewoJCQkJLy9hY21kbHI9ZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJCQlkZWxheV9zdGVwX3gxMDA9MTAwKjEwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGsqYWNtZGxyKTsKCQkJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQkJCWRlbGF5X3N0ZXBfeDEwMC8xMDAsZGVsYXlfc3RlcF94MTAwLzEwLGRlbGF5X3N0ZXBfeDEwMCk7CgoKCQkJCXByaW50ZigiXG5sY2Rfb2Zmc2V0PTB4JTA4eCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0lNGQgICAsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0lNGQgICAiLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcik7CgkJCQlwcmludGYoIlxubGNkX29mZnNldD0weCUwOHgsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JTRkIHBzLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9JTRkIHBzIix0ZXN0X2FyZ183X2xjZGxyX29mZnNldCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKmRlbGF5X3N0ZXBfeDEwMC8xMDAsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcipkZWxheV9zdGVwX3gxMDAvMTAwKTsKCgkJCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCgoJCQl9CgkJCWlmKGRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzayYyKQoJCQl7CgkJCQlpZihkZHJfdGVzdF91Ym9vdF9sb29wKQoJCQkJewoJCQkJCXsgICAgICAgICAgICB0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTA7CgkJCQkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlwcmludGYoIlxuIGNsZWFyIHN0aWNreSByZWdpc3RlciBzaG91bGQgcmVzZXQsdGhlbiBvdmVyIHdyaXRlIC4uLi5cbiIpOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl3aGlsZSgxKTsKCQkJCQl9CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UKCQkJCQlyZXR1cm4gMTsKCQkJfQoJCX0KCgoKCQkvL2lmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKSkgICAvLzAgdGVzdCBsZWZ0IGVkZ2UgYmVnaW4gICAgIDEgdGVzdCBsZWZ0IGVkZ2Ugb25nb2luZyAgICAgMi8vbGVmdF9maW5pc2ggICAgIDMgcmlnaHQgZWRnZSBvbmdvaW5nICAgIDQgcmlnaHQgZmluaXNoICAvLzUga2VybmVsIGxlZnQgZWRnZSBvbmdvaW5nIDYga2VybmVsIGxlZnQgZmluaXNoICAgIDcga2VybmVsIHJpZ2h0IG9uZ29pbmcKCQkvLyAgdWJvb3QgZmluZCBmcm9tIHBhc3MgdG8gZmFpbCBvZmZzZXQgMC0+bWF4CgkJLy9rZXJuZWwgZmluZCBmcm9tIGZhaWwgdG8gcGFzcyBvZmZzZXQgZnJvbSBtYXggLT4wIAoJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPDQpKSAgLy8vLyAgdWJvb3QgZmluZCBmcm9tIHBhc3MgdG8gZmFpbCBvZmZzZXQgMC0+bWF4CgkJewoJCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0yKQoJCQkJCXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTQpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NikKCQkJICApCgkJCXsKCQkJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwoJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJewoJCQkJaWYodGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD09RERSX1RFU1RfUEFTUykgLy9wYXNzIDIgZXJyb3IgMQoJCQkJewoJCQkJCS8vCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwoKCQkJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX05VTEw7CgkJCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCXsKCgkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCXsKCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCQl7CgoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJewoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKTw9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCQl7CgkJCQkJCQkJCXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnPXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnKzE7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJfQoKCgoKCQkJCQl9CgkJCQkJaWYodGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcpCgkJCQkJewoJCQkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsJCQkKCQkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCX0KCgkJCQllbHNlIAlpZih0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9GQUlMKSAvL3Bhc3MgMSBlcnJvciAyCgkJCQl7CgoJCQkJCS8vICB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldCYweGZmZmYpOwoJCQkJCS8vIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9KCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldD4+MTYpJjB4ZmZmZik7CgkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbC0xOwoJCQkJCX0KCQkJCQllbHNlIAlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yLTE7ICAKCQkJCQl9CgkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2x8KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I8PDE2KSk7CgkJCQkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTc7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CQkJCgkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJfQoKCgoJCQkvLyAgICB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldCYweGZmZmYpOwoJCQkvLyB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSgodGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ+PjE2KSYweGZmZmYpOwoJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQl7CgkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wrMTsKCQkJfQoJCQllbHNlIAkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJewoJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKzE7ICAKCQkJfQoJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbHwodGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjw8MTYpKTsKCQkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD03OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCXRlbXBfY291bnQ9NTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCgkJCXsKCgkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJewoJCQkJCXByaW50ZigiXG4gICAgICAgICAgICAgICAgICAgIChudW1fYXJyYXlbJWRdKSA9PSUwOHggXG4iLGxhbmVfc3RlcF9jb3VudC8yLChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKSk7CgkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQl7CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKS10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sOwoJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCXt0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9MDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpLXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w7CgkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQkJCXsKCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpK3Rlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I7CgkJCQkJCX0KCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKSt0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yOwoKCQkJCQkJfQoJCQkJCX0KCgoKCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJKHRlc3RfbGNkbHJfdGVtcF92YWx1ZSksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgoKCgoJCQl9CgoJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM+NCkKCQkJewoJCQkJLy9kZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJLy8gIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCS8vIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCS8vIHRlbXBfY291bnQ9NTsKCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCXdoaWxlKDEpOwoJCQl9IGVsc2UKCQkJewoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQl9CgoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCgoJCQkJewoJCQkJCS8vd3JpdGUgb3JnIHZhbHVlCgkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQl7CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTsKCQkJCQkJfQoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpOwoJCQkJCQl9CgkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJKHRlc3RfbGNkbHJfdGVtcF92YWx1ZSksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCgoKCQkJCX0KCgkJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQl0ZW1wX2NvdW50PTU7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl3aGlsZSgxKTsKCgoKCgoJCQl9CgkJfQoKCgkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTQpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NikpCgkJewoJCQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIOwoJCQludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTQ7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7Ly9ERFJfVEVTVF9OVUxMOwoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCXRlbXBfY291bnQ9NTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJfQoJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPj00KSkgICAvLy8va2VybmVsIGZpbmQgZnJvbSBmYWlsIHRvIHBhc3Mgb2Zmc2V0IGZyb20gbWF4IC0+MCAKCQl7CgkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTIpCgkJCQkJfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT02KQoJCQkgICkKCQkJewoJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09Myl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQl7CgkJCQlpZih0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9QQVNTKSAvL3Bhc3MgMiBlcnJvciAxCgkJCQl7CgkJCQkJLy8JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJewoKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8PXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJewoJCQkJCQkJCQl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz10ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZysxOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9CgoKCgoJCQkJCX0KCQkJCQkvLyBpZih0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZykKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwkJCQoJCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJfQoKCQkJCWVsc2UgCWlmKCh0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9GQUlMKSAKCQkJCQkJLy98fCh0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9OVUxMKSkvL3Bhc3MgMiBlcnJvciAxCgkJCQkJKQoJCQkJCXsKCgkJCQkJCS8vICB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldCYweGZmZmYpOwoJCQkJCQkvLyB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSgodGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ+PjE2KSYweGZmZmYpOwoJCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wtMTsKCQkJCQkJfQoJCQkJCQllbHNlIAlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3ItMTsgIAoJCQkJCQl9CgkJCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sfCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPDwxNikpOwoJCQkJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoJCQkJCQl0ZW1wX2NvdW50PTc7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCgkJCQkJCS8vIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOwoJCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJCX0KCQkJCWVsc2UgaWYgKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX05VTEwpLy9wYXNzIDIgZXJyb3IgMQoJCQkJe3ByaW50ZigiXG5maW5kIGRyb3AgcG93ZXIsdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0lZCBcbiIsdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldCk7CgkJCQl9CgoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQl7CgoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJewoJCQkJCQlwcmludGYoIlxuICAgICAgICAgICAgICAgICAgICAobnVtX2FycmF5WyVkXSkgPT0lMDh4IFxuIixsYW5lX3N0ZXBfY291bnQvMiwobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSkpOwoJCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCQl7CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKS10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sOwoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKS10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sOwoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZikrdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjsKCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKSt0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yOwoKCQkJCQkJCX0KCQkJCQkJfQoKCgoJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCSh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgoKCgkJCQl9CgoJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJaWYodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz40KQoJCQkJewoJCQkJCS8vZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUoa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJLy8gIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkvLyBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJLy8gdGVtcF9jb3VudD01OwoJCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfSBlbHNlCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJfQoKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXsKCQkJCQkJLy93cml0ZSBvcmcgdmFsdWUKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik7CgkJCQkJCQl9CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZik7CgkJCQkJCQl9CgkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkodGVzdF9sY2Rscl90ZW1wX3ZhbHVlKSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQkJCQkJCQkgCgoJCQkJCX0KCgkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgoJCQkJfQoJCQl9CgkJfQoJfQoKCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM+PTgpIC8vZmluaXNoCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgoKCgkJewoJCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQkJZGVsYXlfc3RlcF94MTAwPTEwMCoxMDAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKmFjbWRscik7CgkJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgoJCQlwcmludGYoIlxubGNkX29mZnNldD0weCUwOHgsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JTRkICAgLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9JTRkICAgIix0ZXN0X2FyZ183X2xjZGxyX29mZnNldCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IpOwoJCQlwcmludGYoIlxubGNkX29mZnNldD0weCUwOHgsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JTRkIHBzLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9JTRkIHBzIix0ZXN0X2FyZ183X2xjZGxyX29mZnNldCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKmRlbGF5X3N0ZXBfeDEwMC8xMDAsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcipkZWxheV9zdGVwX3gxMDAvMTAwKTsKCQkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgoJCQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSDsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD00OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCX0KCgl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTB4ZmZmZjsKCXsKCQkvLwl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsKCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJdGVtcF9jb3VudD02OwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCX0KCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkvLyAgdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOyAgLy9wYXNzIDIgZXJyb3IgMQoJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJd2hpbGUoMSk7CglyZXR1cm4gMTsKfQoKCmludCBkb19kZHI0X3Rlc3RfZHJhbV9jbGtfdXNlX3N0aWNreShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vLyoKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgljaGFyICplbmRwOwoKI2RlZmluZSBURVNUX0RSQU1fQ0xLX1VTRV9FTlYgIDEKCXByaW50ZigiXG50dW5lIGRkciBDTEsgdXNlIHVib290IHN0aWNreSByZWdpc3RlclxuIik7CgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCiNkZWZpbmUgIEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQgIDUwCiNkZWZpbmUgIEREUl9URVNUX01JTl9GUkVRICAzMDAKCS8vICAgI2RlZmluZSAgRERSX1RFU1RfTUFYX0ZSRVEgIDMwMDAKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7Cgl1bnNpZ25lZCBpbnQgc3RhcnRfZnJlcT1ERFJfVEVTVF9NSU5fRlJFUTsKCXVuc2lnbmVkIGludCBlbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCXVuc2lnbmVkIGludCB0ZXN0X2xvb3BzPTE7CglpZiAoYXJnYyA9PSAxKQoJewoJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCXN0YXJ0X2ZyZXE9RERSX1RFU1RfTUlOX0ZSRVE7CgkJZW5kX2ZyZXE9RERSX1RFU1RfTUFYX0ZSRVE7CgoJfQoKCWlmIChhcmdjID09IDIpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9RERSX1RFU1RfTUlOX0ZSRVE7CgkJZW5kX2ZyZXE9RERSX1RFU1RfTUFYX0ZSRVE7Cgl9CglpZiAoYXJnYz09IDMpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWVuZF9mcmVxPUREUl9URVNUX01BWF9GUkVROwoKCX0KCWlmIChhcmdjPT0gNCkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJZW5kX2ZyZXE9c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgoJfQoJaWYgKGFyZ2M+IDQpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWVuZF9mcmVxPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCXRlc3RfbG9vcHM9c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7Cgl9Cgl1bnNpZ25lZCBpbnQgdGVtcF90ZXN0X2Vycm9yPTB4MDsKCXVuc2lnbmVkIGludCBkZHJfcGxsPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsa19vcmc9MDsKCXVuc2lnbmVkIGludCBkZHJfY2xrX2hvcGVfdGVzdD0wOwoJZGRyX3BsbCA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpOwoJLy9kZHJfcGxsPWRkcl9wbGxfb3JnOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPSBwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCXByaW50ZigiXG5kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoJcHJpbnRmKCJcbnN0YXJ0X2ZyZXE9PSAlZE1IelxuIiwgc3RhcnRfZnJlcSk7CglwcmludGYoIlxuZW5kX2ZyZXE9PSAlZE1IelxuIiwgZW5kX2ZyZXEpOwoJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgkvLwl7CgkvLwl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCS8vCWRkcl91ZGVsYXkoMjAwMCk7CgkvL30KCgoJdW5zaWduZWQgaW50IGZyZXFfdGFibGVfdGVzdF92YWx1ZVsoRERSX1RFU1RfTUFYX0ZSRVEpLzI0XTsgLy8gc3RlcCA9MCBpbml0ICAsMSB0ZXN0IGZhaWwsICwyIHRlc3QgcGFzcywzIHRlc3Qgc2tpcDsKCS8vICBjaGFyIGNoYXJfZnJlcV9uYW1lX3RhYmxlWzMwXTsKCS8vICBjb25zdCBjaGFyICpwX2NoYXJfZnJlcV90YWJsZTsKCgkvLyBjb25zdCBjaGFyICpwX2NoYXJfZGRyX3Rlc3Rfc3RlcDsKCS8vIGNvbnN0IGNoYXIgKiBwX2NoYXJfZnJlcV9vcmc7CgljaGFyIGNoYXJfZnJlcV9vcmdbMzBdOwoJaW50ICBkZHJfZmVxX3Rlc3Rfc3RlcD0wOyAvLyBzdGVwID0wIGluaXQgLDEgZ29pbmcgLDIgZG9uZTsKCgkvLyBjb25zdCBjaGFyICogcF9jaGFyX2ZyZXFfbmFtZV90YWJsZTsKCWNoYXIgY2hhcl9mcmVxX25hbWVfdGFibGVbMzBdOwoJY2hhciBjaGFyX2NtZF90YWJsZVsxMDBdOwoJLy9jaGFyICogcF9jaGFyX3N0b3JlX2Jvb3Q7CgkvLyAgY2hhciBjaGFyX2ZyZXFfc3RvcmVfYm9vdFsyMDBdOwoKCS8vY29uc3QgY2hhciAqcF9mcmVxX3RhYmxlX2ludDsKCS8vY2hhciBjaGFyX2Rkcl9mZXFfdGVzdF9zdGVwW109ImRkcl9mZXFfdGVzdF9zdGVwIjsKCS8vIGNvbnN0IGNoYXIgKnZhcm5hbWU7CgkvLyBjb25zdCBjaGFyICp2YXJ2YWx1ZTsKCXVuc2lnbmVkIGludCB0ZW1wX2NvdW50PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudF9zdWI9MDsKCgoKCXVuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs2NF07Cgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5OwoKCW51bV9hcnJ5ID0gKHVuc2lnbmVkIGludCAqKSgmc3RyX3RvX251bWFycnkpOwoJLy9pbnQgaTsKCgl1bnNpZ25lZCBpbnQgbGNkbHJfdGVtcF9jb3VudD0wOwoJewoJCXsKCgkJCXN0aWNreV9yZWdfYmFzZV9hZGQ9KEREUjBfUFVCX1JFR19CQVNFJjB4ZmZmZjAwMDApKygoRE1DX1NUSUNLWV8wKSYweGZmZmYpOwoKCQkJZm9yIChpID0gMDsgaSA8IDYzOyBpKyspIHsKCQkJCWRtY19zdGlja3lbaV09cmRfcmVnKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKTsKCQkJCS8vcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksbnVtX2FycnlbaV0pOwoJCQl9CgoJCQlmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykgewoJCQkJbnVtX2FycnlbaV09ZG1jX3N0aWNreVtpXTsKCQkJCXByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5W2ldKTsKCQkJfQoKCQl9Cgl9CgojZGVmaW5lIAlERFJfRkVRX1RFU1RfU1RFUF9PRkZTRVQgIDgKCS8vI2RlZmluZSAJRERSX0ZFUV9URVNUX1NURVBfT0ZGU0VUICA4Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMF9jbWQwID0wOyAgLy9tYXN0ZXIgY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMV9jbWQxID0wOyAgLy9taW4gY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgbGFuZTAgdyBtaW4gIC0yIGxhbmUwIHcgbWF4IC0zIGxhbmUwIHIgbWluICAgIDQgbGFuZTAgciBtYXggLS0tLS01IGxhbmUxIHcgbWluIC4uLgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgkvLyAgdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJLy9jaGFyIHN0clsyNF07Cgl1bnNpZ25lZCBpbnQgYm9vdF90aW1lcz0wOwoKCXRlc3RfYXJnXzBfY21kMD1udW1fYXJyeVswXTsKCXRlc3RfYXJnXzFfY21kMT1udW1fYXJyeVsxXTsKCXRlc3RfYXJnXzJfc3RlcD1udW1fYXJyeVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyeVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycnlbNF07Cglib290X3RpbWVzPW51bV9hcnJ5WzVdOwoJbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyeVs2XTsKCXByaW50ZigidGVzdF9hcmdfMF9jbWQwPT0lZFxuIix0ZXN0X2FyZ18wX2NtZDApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2NtZDE9PSVkXG4iLHRlc3RfYXJnXzFfY21kMSk7CglwcmludGYoInRlc3RfYXJnXzJfc3RlcD09JWRcbiIsdGVzdF9hcmdfMl9zdGVwKTsKCXByaW50ZigidGVzdF9hcmdfM19mcmVxPT0lZFxuIix0ZXN0X2FyZ18zX2ZyZXEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPT0lZFxuIix0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzKTsKCXByaW50ZigidGVzdF9hcmdfNSBib290dGltZXM9JWRcbiIsbnVtX2FycnlbNV0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ182IGxjZGxyX3RlbXBfY291bnQ9JWRcbiIsbnVtX2FycnlbNl0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ183PSVkXG4iLG51bV9hcnJ5WzddKTsKCglpZigobnVtX2FycnlbN109PURNQ19TVElDS1lfTUFHSUNfMSkpIC8vZm9yIGNoZWNrIG1hZ2ljIG51bWJlciBtYWtlIHN1bWUgZW50ZXIgdGVzdCBjb21tYW5kCgl7Ym9vdF90aW1lcysrOwoKCX0KCWVsc2UKCXtib290X3RpbWVzPTA7CgkJcHJpbnRmKCJ0ZXN0X3N0aWNreSBpcyBub3QgbWFnaWMgbnVtbWJlcixib290IHRpbWVzPT0lZFxuIixib290X3RpbWVzKTsKCQkvLyB3cml0ZWwoRE1DX1NUSUNLWV9NQUdJQ18wLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCXdyaXRlbChETUNfU1RJQ0tZX01BR0lDXzEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDc8PDIpKSk7CgkJdGVzdF9hcmdfMl9zdGVwPTA7CgkJbnVtX2FycnlbNl09MDsKCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJLy9yZXR1cm4gMTsKCX0KCW51bV9hcnJ5WzVdPWJvb3RfdGltZXM7CgoJd3JpdGVsKG51bV9hcnJ5WzVdLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg1PDwyKSkpOwoKCgoJaWYodGVzdF9hcmdfMl9zdGVwPT0wKQoJewoKCQl0ZXN0X2FyZ18wX2NtZDA9MHgyODsKCQl0ZXN0X2FyZ18xX2NtZDE9MDsKCQl0ZXN0X2FyZ18yX3N0ZXA9MTsKCQl0ZXN0X2FyZ18zX2ZyZXE9Z2xvYmFsX2Rkcl9jbGs7CgkJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz0wOwoJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQludW1fYXJyeVswXT10ZXN0X2FyZ18wX2NtZDA7CgkJbnVtX2FycnlbMV09dGVzdF9hcmdfMV9jbWQxOwoJCW51bV9hcnJ5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCQludW1fYXJyeVszXT10ZXN0X2FyZ18zX2ZyZXE7CgkJbnVtX2FycnlbNF09dGVzdF9hcmdfNF9zdGVwX3N0YXR1czsKCQludW1fYXJyeVs1XT1ib290X3RpbWVzOwoJCWxjZGxyX3RlbXBfY291bnQ9bnVtX2FycnlbNl07CgkJbnVtX2FycnlbNl09bGNkbHJfdGVtcF9jb3VudDsKCQludW1fYXJyeVs3XT1ETUNfU1RJQ0tZX01BR0lDXzE7CgkJZm9yIChpID0gODsgaSA8IDYzOyBpKyspIHsKCQkJbnVtX2FycnlbaV09MDsKCQl9Cgl9CgoJZm9yIChpID0gMDsgaSA8IDYzOyBpKyspIHsKCgkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJfQoKCglkZHJfZmVxX3Rlc3Rfc3RlcD1yZF9yZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCsoODw8MikpOwoJLy8KCS8vcF9jaGFyX2Rkcl90ZXN0X3N0ZXA9IGdldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiKTsKCS8vIGlmIChwX2NoYXJfZGRyX3Rlc3Rfc3RlcCkKCXsKCQkvLwlwcmludGYoIiVzIixwX2NoYXJfZGRyX3Rlc3Rfc3RlcCk7CgoJCS8vIGRkcl9mZXFfdGVzdF9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX2NoYXJfZGRyX3Rlc3Rfc3RlcCwgJmVuZHAsIDApOwoJCXByaW50ZigiZGRyX2ZlcV90ZXN0X3N0ZXA9JWRcbiIsZGRyX2ZlcV90ZXN0X3N0ZXApOwoJfQoJaWYgKGRkcl9mZXFfdGVzdF9zdGVwKSB7CgkJLy9wX2NoYXJfZnJlcV9vcmc9IGdldGVudigiZGRyX2ZlcV9vcmciKTsKCQkvL2lmIChwX2NoYXJfZnJlcV9vcmcpCgkJewoJCQkvL3ByaW50ZigiJXMiLHBfY2hhcl9mcmVxX29yZyk7CgoJCQkvLyBkZHJfY2xrX29yZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfb3JnLCAmZW5kcCwgMTApOyAvL211c3QgdXNlIDEwICxmcmVxICAwNzkyIG1heWJlIG5vdCByZWFkIHN1c3NjZWZ1bCB1c2UgMCBhdXRvIHJlYWQKCQkJZGRyX2Nsa19vcmc9cmRfcmVnKHN0aWNreV9yZWdfYmFzZV9hZGQrKDk8PDIpKTsKCQkJcHJpbnRmKCJkZHJfY2xrX29yZz0lZFxuIixkZHJfY2xrX29yZyk7CgkJfQoJfQoJaWYgKGRkcl9mZXFfdGVzdF9zdGVwID09IDApCgl7CgkJZGRyX2ZlcV90ZXN0X3N0ZXA9MTsKCQlkZHJfY2xrX29yZz1kZHJfY2xrOwoJCXNwcmludGYoY2hhcl9mcmVxX29yZywiJTA0ZCIsZGRyX2Nsayk7CgkJcHJpbnRmKCJcbmRkcl9vcmdfZnJlcT0lc1xuIixjaGFyX2ZyZXFfb3JnKTsKCQkvL3NldGVudigiZGRyX2ZlcV9vcmciLCBjaGFyX2ZyZXFfb3JnKTsKCQl3cml0ZWwoZGRyX2Nsaywoc3RpY2t5X3JlZ19iYXNlX2FkZCsoOTw8MikpKTsKCgoJCXRlbXBfY291bnQ9KHN0YXJ0X2ZyZXEvMjQpOwoJCXdoaWxlICh0ZW1wX2NvdW50PChERFJfVEVTVF9NQVhfRlJFUS8yNCkpIHsKCgkJCS8vIHNwcmludGYoZnJlcV90YWJsZSwiJXMlMDRkICUwMWQgJTAxZCAgIixmcmVxX3RhYmxlLCh0ZW1wX2NvdW50KjEyKSwwLDApOwoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCS8vc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMCIpOwoJCQkvL3NldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJCQl3cml0ZWwoMCwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpKTsKCQkJd3JpdGVsKDEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDg8PDIpKSk7CgkJCXRlbXBfY291bnQrKzsKCQl9CgkJdGVtcF9jb3VudD0oc3RhcnRfZnJlcS8yNCk7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChzdGFydF9mcmVxKS8yNCkpIHsKCgkJCS8vIHNwcmludGYoZnJlcV90YWJsZSwiJXMlMDRkICUwMWQgJTAxZCAgIixmcmVxX3RhYmxlLCh0ZW1wX2NvdW50KjEyKSwwLDApOwoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCS8vc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJCQkvL3NldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJCQl3cml0ZWwoMywoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpKTsKCQkJd3JpdGVsKDEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDg8PDIpKSk7CgkJCXRlbXBfY291bnQrKzsKCQl9CgkJd2hpbGUgKHRlbXBfY291bnQ+KChlbmRfZnJlcSkvMjQpKSB7CgoJCQkvLyBzcHJpbnRmKGZyZXFfdGFibGUsIiVzJTA0ZCAlMDFkICUwMWQgICIsZnJlcV90YWJsZSwodGVtcF9jb3VudCoxMiksMCwwKTsKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSkpOwoJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkvL3NldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjMiKTsKCQkJLy9zZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIiwgIjEiKTsKCQkJd3JpdGVsKDMsKHN0aWNreV9yZWdfYmFzZV9hZGQrKCgxMCt0ZW1wX2NvdW50LShzdGFydF9mcmVxLzI0KSk8PDIpKSk7CgkJCXdyaXRlbCgxLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg4PDwyKSkpOwoJCQl0ZW1wX2NvdW50Kys7CgkJfQoKCQkvL3BfY2hhcl9zdG9yZV9ib290PSBnZXRlbnYoInN0b3JlYm9vdCIpOwoJCS8vaWYgKHBfY2hhcl9zdG9yZV9ib290KQoJCS8vcHJpbnRmKCJzdG9yZWJvb3QgICAlc1xuIixwX2NoYXJfc3RvcmVfYm9vdCk7CgkJLy8Jc3ByaW50ZihjaGFyX2NtZF90YWJsZSwiZGRyX3Rlc3RfY21kIDB4MWMgIDB4JTA4eCAlZCAlZCAlZDslczsiLGRkcl90ZXN0X3NpemUsc3RhcnRfZnJlcSxlbmRfZnJlcSx0ZXN0X2xvb3BzLHBfY2hhcl9zdG9yZV9ib290KTsKCQkvLwlzZXRlbnYoInN0b3JlYm9vdCIsIGNoYXJfY21kX3RhYmxlKTsKCgkJLy8JIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgoKCQl7CgkJfQoKCX0KCglpZiAoZGRyX2ZlcV90ZXN0X3N0ZXAgPT0gMSkKCXsKCgkJdGVtcF9jb3VudD0oc3RhcnRfZnJlcS8yNCk7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMjQpKSB7CgoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCWRkcl9mZXFfdGVzdF9zdGVwPXJkX3JlZyhzdGlja3lfcmVnX2Jhc2VfYWRkKyg4PDwyKSk7CgkJCS8vCXBfY2hhcl9mcmVxX25hbWVfdGFibGU9IGdldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCS8vIGlmIChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKQoJCQl7CgkJCQkvLwlwcmludGYoIiVzXG4iLHBfY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKCQkJCS8vICBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfY2hhcl9mcmVxX25hbWVfdGFibGUsICZlbmRwLCAwKTsKCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9cmRfcmVnKHN0aWNreV9yZWdfYmFzZV9hZGQrKCgxMCt0ZW1wX2NvdW50LShzdGFydF9mcmVxLzI0KSk8PDIpKTsKCQkJCXByaW50ZigiJXMgfCAlZFxuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoKCgkJCX0KCQkJdGVtcF9jb3VudCsrOwoJCX0KCgkJdGVtcF9jb3VudD0oc3RhcnRfZnJlcS8yNCk7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMjQpKSB7CgkJCWRkcl9jbGtfaG9wZV90ZXN0PShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKTsKCQkJaWYgKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9PTEpCgkJCXsKCQkJCXRlbXBfY291bnRfc3ViPXRlbXBfY291bnQrMTsKCQkJCXdoaWxlICgocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnRfc3ViKjI0KSkpID09CgkJCQkJCShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSkKCQkJCXt0ZW1wX2NvdW50X3N1Yj10ZW1wX2NvdW50X3N1YisxOwoJCQkJfQoJCQkJd2hpbGUgKHRlbXBfY291bnRfc3ViPCgoRERSX1RFU1RfTUFYX0ZSRVEpLzI0KSkgewoJCQkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50X3N1YioyNCkpKSk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJCQkvLyBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF9zdWJdID0xOwoJCQkJCS8vCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjMiKTsKCQkJCQl3cml0ZWwoMywoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnRfc3ViLShzdGFydF9mcmVxLzI0KSk8PDIpKSk7CgoJCQkJCXRlbXBfY291bnRfc3ViKys7CgkJCQl9CgkJCQl7CgkJCQkJZGRyX2ZlcV90ZXN0X3N0ZXArKzsKCQkJCQkvL3NldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMiIpOwoJCQkJCS8vIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwoMiwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoODw8MikpKTsKCgkJCQl9CgkJCQl7ZGRyX2Nsa19ob3BlX3Rlc3Q9ZGRyX2Nsa19vcmc7CgkJCQl9CgkJCQlzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCIsZGRyX2Nsa19ob3BlX3Rlc3QpOwoJCQkJcHJpbnRmKCJcbmNoYXJfY21kX3RhYmxlPSVzXG4iLGNoYXJfY21kX3RhYmxlKTsKCQkJCXJ1bl9jb21tYW5kKGNoYXJfY21kX3RhYmxlLDApOwoKCQkJfQoJCQlpZiAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID09MCkKCQkJewoJCQkJaWYgKChkZHJfY2xrX2hvcGVfdGVzdCkgIT0gKGRkcl9jbGspKQoJCQkJewoJCQkJCXNwcmludGYoY2hhcl9jbWRfdGFibGUsImRkcl90ZXN0X2NtZCAweDE3ICVkIDAgMCAwIixkZHJfY2xrX2hvcGVfdGVzdCk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfY21kX3RhYmxlPSVzXG4iLGNoYXJfY21kX3RhYmxlKTsKCQkJCQlydW5fY29tbWFuZChjaGFyX2NtZF90YWJsZSwwKTsKCQkJCX0KCQkJCWlmICgoZGRyX2Nsa19ob3BlX3Rlc3QpID09IChkZHJfY2xrKSkKCQkJCXsKCgkJCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSkpOwoJCQkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCQkJZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0xOwoJCQkJCS8vIHNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjEiKTsKCQkJCQkvLyBydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKDEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKCgxMCt0ZW1wX2NvdW50LShzdGFydF9mcmVxLzI0KSk8PDIpKSk7CgoKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJd2hpbGUgKHRlc3RfbG9vcHMtLSkgewoJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCX0KCQkJCQkvL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0xOwoJCQkJCQkvLyBzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIxIik7CgkJCQkJCXdyaXRlbCgxLChzdGlja3lfcmVnX2Jhc2VfYWRkKygoMTArdGVtcF9jb3VudC0oc3RhcnRfZnJlcS8yNCkpPDwyKSkpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPTI7CgkJCQkJCS8vIHNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjIiKTsKCQkJCQkJd3JpdGVsKDIsKHN0aWNreV9yZWdfYmFzZV9hZGQrKCgxMCt0ZW1wX2NvdW50LShzdGFydF9mcmVxLzI0KSk8PDIpKSk7CgkJCQkJfQoJCQkJCS8vIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgkJCQkJZGRyX2Nsa19ob3BlX3Rlc3Q9KHRlbXBfY291bnQqMjQpKzI0OwoJCQkJCXdoaWxlICgocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGtfaG9wZV90ZXN0KSkpID09CgkJCQkJCQkocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSkpCgkJCQkJe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfaG9wZV90ZXN0KzI0OwoJCQkJCX0KCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXtkZHJfY2xrX2hvcGVfdGVzdD1kZHJfY2xrX29yZzsKCQkJCQl9CgkJCQkJc3ByaW50ZihjaGFyX2NtZF90YWJsZSwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAiLGRkcl9jbGtfaG9wZV90ZXN0KTsKCQkJCQlwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwoJCQkJCXJ1bl9jb21tYW5kKGNoYXJfY21kX3RhYmxlLDApOwoJCQkJfQoKCQkJfQoKCgoKCgkJCXRlbXBfY291bnQrKzsKCQl9CgkJZGRyX2ZlcV90ZXN0X3N0ZXArKzsKCQkvL3NldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMiIpOwoJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCXdyaXRlbCgyLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg4PDwyKSkpOwoKCX0KCglpZiAoZGRyX2ZlcV90ZXN0X3N0ZXAgPj0gMikKCXsKCQlwcmludGYoIlxuZmluaXNoIHRlc3QgZGRyX2ZlcV90ZXN0X3N0ZXA9JWRcbiIsZGRyX2ZlcV90ZXN0X3N0ZXApOwoJCXRlbXBfY291bnQ9KHN0YXJ0X2ZyZXEvMjQpOwoJCXdoaWxlICh0ZW1wX2NvdW50PCgoRERSX1RFU1RfTUFYX0ZSRVEpLzI0KSkgewoKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSkpOwoJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKCQkJLy8JcF9jaGFyX2ZyZXFfbmFtZV90YWJsZT0gZ2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJLy8gaWYgKHBfY2hhcl9mcmVxX25hbWVfdGFibGUpCgkJCXsKCQkJCS8vCXByaW50ZigiJXNcbiIscF9jaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCQkJLy8gZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX2NoYXJfZnJlcV9uYW1lX3RhYmxlLCAmZW5kcCwgMCk7CgkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPXJkX3JlZyhzdGlja3lfcmVnX2Jhc2VfYWRkKygoMTArdGVtcF9jb3VudC0oc3RhcnRfZnJlcS8yNCkpPDwyKSk7CgkJCQlwcmludGYoIiVzIHwgJWRcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUsZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCQkJfQoJCQl0ZW1wX2NvdW50Kys7CgkJfQoKCQlwcmludGYoIlxucHJpbnQgdGVzdCBkZHJfZmVxX3Rlc3RfcmVzdWx0ISEhXG4iKTsKCQl0ZW1wX2NvdW50PShzdGFydF9mcmVxLzI0KTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKEREUl9URVNUX01BWF9GUkVRKS8yNCkpIHsKCgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpKTsKCQkJLy8JcF9jaGFyX2ZyZXFfbmFtZV90YWJsZT0gZ2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJLy8gaWYgKHBfY2hhcl9mcmVxX25hbWVfdGFibGUpCgkJCXsKCQkJCS8vCXByaW50ZigiJXNcbiIscF9jaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCQkJLy8gIGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSwgJmVuZHAsIDApOwoJCQkJZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID1yZF9yZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpOwoKCQkJCS8vcHJpbnRmKCIlZFxuIixmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJaWYgKCAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKSA9PSAwKSB7CgkJCQkJcHJpbnRmKCIlMDRkICBubyBpbml0ICAgICAlZCBcbiIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQl9CgkJCQlpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDEpIHsKCQkJCQlwcmludGYoIiUwNGQgIGZhaWwgICAgICAlZFxuIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSksZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCQkJCX0KCQkJCWlmICggKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSkgPT0gMikgewoJCQkJCXByaW50ZigiJTA0ZCAgcGFzcyAgICAgICVkXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJfQoJCQkJaWYgKCAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKSA+PSAzKSB7CgkJCQkJcHJpbnRmKCIlMDRkICBza2lwIHRlc3QgJWQgXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJfQoJCQkJdGVtcF9jb3VudCsrOwoJCQl9CgkJfQoKCX0KCS8vc3ByaW50ZihzdHIsImRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CgkvLwlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoJLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKCS8vICBzZXRlbnYoImVudl9kZHJ0ZXN0Iiwgc3RyKTsKCgkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCS8vKi8KCXJldHVybiAxOwoKfQoKCmludCBkb19kZHI0X3Rlc3RfYmlzdF90ZXN0X3VzZV9zdGlja3koY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX1pRICAgICAwCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfQUNfQklUX1NFVFVQICAgICAgMQojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0FDX0JJVF9IT0xEICAgICAyCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9XUklURV9CSVRfU0VUVVAgICAgICAzCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9XUklURV9CSVRfSE9MRCAgICAgIDQKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1JFQURfQklUX1NFVFVQICAgICAgNQojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfUkVBRF9CSVRfSE9MRCAgICAgNgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfVlJFRiAgICAgNwojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0NMS19JTlZFVEVSICAgICA4CgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0ZVTExURVNUICAgICAweGZmZmZmZmZmCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50IHBsbCwgenFjcjsKCXVuc2lnbmVkIGludCB6cXByX3NvY19kcmFtPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfY21kX3NvY192cmVmPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj0wOy8vMHgzZjsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9jbWRfenFfdnJlZj0wOy8vMHgzZjsKCgoJdW5zaWduZWQgaW50IGRkcl9mdWxsX3Rlc3RfZW5hYmxlPTA7CgkvKgojZGVmaW5lIEREUjNfRFJWXzQwT0hNCQkwCiNkZWZpbmUgRERSM19EUlZfMzRPSE0JCTEKI2RlZmluZSBERFIzX09EVF8wT0hNCQkwCiNkZWZpbmUgRERSM19PRFRfNjBPSE0JCTEKI2RlZmluZSBERFIzX09EVF8xMjBPSE0JCTIKI2RlZmluZSBERFIzX09EVF80ME9ITQkJMwojZGVmaW5lIEREUjNfT0RUXzIwT0hNCQk0CiNkZWZpbmUgRERSM19PRFRfMzBPSE0JCTUKCgkvLyBscGRkcjIgZHJ2IG9kdCAKI2RlZmluZSBMUEREUjJfRFJWXzM0T0hNCTEKI2RlZmluZSBMUEREUjJfRFJWXzQwT0hNCTIKI2RlZmluZSBMUEREUjJfRFJWXzQ4T0hNCTMKI2RlZmluZSBMUEREUjJfRFJWXzYwT0hNCTQKI2RlZmluZSBMUEREUjJfRFJWXzgwT0hNCTYKI2RlZmluZSBMUEREUjJfRFJWXzEyME9ITQk3CiNkZWZpbmUgTFBERFIyX09EVF8wT0hNCQkwCgoJLy8gbHBkZHIzIGRydiBvZHQgCiNkZWZpbmUgTFBERFIzX0RSVl8zNE9ITQkxCiNkZWZpbmUgTFBERFIzX0RSVl80ME9ITQkyCiNkZWZpbmUgTFBERFIzX0RSVl80OE9ITQkzCiNkZWZpbmUgTFBERFIzX0RSVl82ME9ITQk0CiNkZWZpbmUgTFBERFIzX0RSVl84ME9ITQk2CiNkZWZpbmUgTFBERFIzX0RSVl8zNF80ME9ITQk5CiNkZWZpbmUgTFBERFIzX0RSVl80MF80OE9ITQkxMAojZGVmaW5lIExQRERSM19EUlZfMzRfNDhPSE0JMTEKI2RlZmluZSBMUEREUjNfT0RUXzBPSE0JCTAKI2RlZmluZSBMUEREUjNfT0RUXzYwT0hNCTEKI2RlZmluZSBMUEREUjNfT0RUXzEyT0hNCTIKI2RlZmluZSBMUEREUjNfT0RUXzI0MEhNCTMKCiNkZWZpbmUgRERSNF9EUlZfMzRPSE0JCTAKI2RlZmluZSBERFI0X0RSVl80OE9ITQkJMQojZGVmaW5lIEREUjRfT0RUXzBPSE0JCTAKI2RlZmluZSBERFI0X09EVF82ME9ITQkJMQojZGVmaW5lIEREUjRfT0RUXzEyME9ITQkJMgojZGVmaW5lIEREUjRfT0RUXzQwT0hNCQkzCiNkZWZpbmUgRERSNF9PRFRfMjQwT0hNCQk0CiNkZWZpbmUgRERSNF9PRFRfNDhPSE0JCTUKI2RlZmluZSBERFI0X09EVF84ME9ITQkJNgojZGVmaW5lIEREUjRfT0RUXzM0T0hNCQk3CiovCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vZHQJCQkJPSAwOwoJdW5zaWduZWQgaW50IGJpc3RfdGVzdF9kcV9pbmRleAkJCQk9IDB4ZmY7CgkvL3Vuc2lnbmVkIGludCBkcmFtX2RydgkJCQk9IDA7CgkvL3Vuc2lnbmVkIGludCBkcmFtX29kdAkJCQk9IDA7CgkvKiBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KCWlmIChhcmdjIDwgMikKCQlnb3RvIHVzYWdlOwoKCXBsbCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsMCk7CglpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJcHJpbnRmICgiRXJyb3I6IFdyb25nIGZvcm1hdCBwYXJhbWVudCFcbiIpOwoJCXJldHVybiAxOwoJfQoJaWYgKGFyZ2MgPjIpCgl7CgkJenFjciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJenFjciA9IDA7CgkJfQoJfQoJZWxzZQoJewoJCXpxY3IgPSAwOwoJfQoJYmlzdF90ZXN0X2RxX2luZGV4PTB4ZmY7CglpZih6cWNyPT0weGZmZmZmZmZmKQoJewoJCWRkcl9mdWxsX3Rlc3RfZW5hYmxlPTE7CgkJenFjcj0wO30KCgllbHNlIGlmKHpxY3I+PjI0KQoJewoJCWJpc3RfdGVzdF9kcV9pbmRleD0wKyh6cWNyPj4yNCk7CgkJenFjcj16cWNyJjB4MDBmZmZmZmY7Cgl9CgoJcHJpbnRmKCJiaXN0X3Rlc3RfZHFfaW5kZXhbJWRdLFxuIiwgYmlzdF90ZXN0X2RxX2luZGV4KTsKCglpZiAoYXJnYyA+MykKCXsKCQkvLyBzb2NfZGF0YV9kcnZfb2R0PXpxcHJfc29jX2RyYW0mMHhmZmZmZjsKCQkvLyBkcmFtX2Rydj0oenFwcl9zb2NfZHJhbT4+MjApJjB4ZjsKCQkvLyAgZHJhbV9vZHQ9KHpxcHJfc29jX2RyYW0+PjI0KSYweGY7CgkJLy9iaXQyOCBlbmFibGUgc29jX3pxcHIgLGJpdCAyOSBlbmFiZSBkcmFtX2RydiBiaXQgMzAgZW5hYmVsIGRyYW1fb2R0CgkJenFwcl9zb2NfZHJhbSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJenFwcl9zb2NfZHJhbSA9IDA7CgkJfQoJfQoJZWxzZQoJewoJCXpxcHJfc29jX2RyYW0gPSAwOwoJfQoKCWlmIChhcmdjID40KQoJewoJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCQl9Cgl9CgllbHNlCgl7CgkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCX0KCWlmIChhcmdjID41KQoJewoJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSAwOwoJCX0KCX0KCXVuc2lnbmVkIGludCBzb2NfZHJhbV9oZXhfZGVjPTA7CglpZiAoYXJnYyA+NikKCXsKCQlzb2NfZHJhbV9oZXhfZGVjID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzb2NfZHJhbV9oZXhfZGVjID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NykKCXsKCQlkZHJfdGVzdF9jbWRfenFfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSAwOwoJCX0KCX0KCXVuc2lnbmVkIGludCBzb2NfZHJhbV9kcnZfb2R0X3VzZV92bGF1ZT0wOwoJdW5zaWduZWQgaW50IHNvY19hY19kcnY9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfb2R0PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfb2R0PTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9kcnY9MDsKCXVuc2lnbmVkIGludCBkcmFtX29kdD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9kcnZfYWRqX2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfYWRqX2VuYWJsZT0wOwoKCXVuc2lnbmVkIGludCB6cTBwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJdW5zaWduZWQgaW50IHpxMXByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTFQUik7Cgl1bnNpZ25lZCBpbnQgcHViX2Rjcj0gcmRfcmVnKEREUjBfUFVCX0RDUik7CiNkZWZpbmUgRERSX1RZUEVfTFBERFIyICAwCiNkZWZpbmUgRERSX1RZUEVfTFBERFIzICAxCiNkZWZpbmUgRERSX1RZUEVfRERSMyAgMwojZGVmaW5lIEREUl9UWVBFX0REUjQgIDQKCXVuc2lnbmVkIGludCBkZHJfdHlwZT0gcHViX2RjciYweDc7IC8vMCAtbHBkZHIyICB8ICAxLSBscGRkcjMgIHwgICAyLSByZXYgIHwgIDMgLWRkcjMgICB8IDQtIGRkcjQKCS8vCXVuc2lnbmVkIGludCB6cTJwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEyUFIpOwoJaWYgKGFyZ2MgPjgpCgl7CgkJc29jX2RyYW1fZHJ2X29kdF91c2VfdmxhdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXNvY19kcmFtX2Rydl9vZHRfdXNlX3ZsYXVlID0gMDsKCQl9Cgl9CglpZihzb2NfZHJhbV9kcnZfb2R0X3VzZV92bGF1ZSkKCXtpZih6cWNyKQoJCXtwcmludGYoInpxY3JbMHglMDh4XSxcbiIsIHpxY3IpOwoJCQl7CgkJCQlzb2NfYWNfZHJ2PXpxY3IlMTAwOwoJCQkJaWYoc29jX2FjX2Rydj4xMDApCgkJCQl7c29jX2FjX2Rydj0wO30KCQkJCWlmKHNvY19hY19kcnY9PTApCgkJCQl7c29jX2FjX2Rydj0xO30KCQkJCXNvY19hY19kcnY9KDQ4MC9zb2NfYWNfZHJ2KS0xOwoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKHNvY19hY19kcnY+MHhmKQoJCQkJCXtzb2NfYWNfZHJ2PXpxMHByX29yZyYweGY7fQoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoc29jX2FjX2Rydj4weGYpCgkJCQkJe3NvY19hY19kcnY9KHpxMHByX29yZz4+OCkmMHhmO30KCQkJCX0KCQkJfQoKCgkJCXsKCQkJCXNvY19hY19vZHQ9enFjci8xMDA7CgkJCQlpZihzb2NfYWNfb2R0PjI0MCkKCQkJCXtzb2NfYWNfb2R0PTQ4MDt9CgkJCQlpZihzb2NfYWNfb2R0PT0wKQoJCQkJe3NvY19hY19vZHQ9MTt9CgoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCXNvY19hY19vZHQ9KDM2MC9zb2NfYWNfb2R0KS0xOwoJCQkJCWlmKHNvY19hY19vZHQ+MHhmKQoJCQkJCXtzb2NfYWNfb2R0PSh6cTBwcl9vcmc+PjQpJjB4Zjt9CgkJCQl9CgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlzb2NfYWNfb2R0PSg0ODAvc29jX2FjX29kdCktMTsKCQkJCQlpZihzb2NfYWNfb2R0PjB4ZikKCQkJCQl7c29jX2FjX29kdD0oenEwcHJfb3JnPj4xNikmMHhmO30KCQkJCX0KCQkJfQoKCQkJenFjcj0oc29jX2FjX29kdDw8MTYpfChzb2NfYWNfZHJ2PDwxMil8KHNvY19hY19kcnY8PDgpfChzb2NfYWNfb2R0PDw0KXwoc29jX2FjX2Rydik7CgkJCXByaW50ZigienFjclsweCUwOHhdLHNvY19hY19vZHQgWzB4JTA4eF0sc29jX2FjX2RydiBbMHglMDh4XVxuIiwgenFjcixzb2NfYWNfb2R0LHNvY19hY19kcnYpOwoJCX0KCQlpZih6cXByX3NvY19kcmFtKQoJCXtwcmludGYoInpxcHJfc29jX2RyYW1bMHglMDh4XSxcbiIsIHpxcHJfc29jX2RyYW0pOwoJCQl7CgkJCQlzb2NfZGF0YV9kcnY9enFwcl9zb2NfZHJhbSUxMDA7CgkJCQlwcmludGYoInNvY19kYXRhX2RydlslZF0sXG4iLCBzb2NfZGF0YV9kcnYpOwoJCQkJaWYoc29jX2RhdGFfZHJ2PjEwMCkKCQkJCXtzb2NfZGF0YV9kcnY9MDsKCgkJCQl9CgkJCQlpZihzb2NfZGF0YV9kcnY9PTApCgkJCQl7c29jX2RhdGFfZHJ2PTE7CgkJCQkJLy9zb2NfZGF0YV9kcnZfb2R0X2Fkal9lbmFibGU9MDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsvL3NvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0xOwoJCQkJfQoJCQkJc29jX2RhdGFfZHJ2PSg0ODAvc29jX2RhdGFfZHJ2KS0xOwoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKHNvY19kYXRhX2Rydj4weGYpCgkJCQkJe3NvY19kYXRhX2Rydj16cTFwcl9vcmcmMHhmO30KCQkJCX0KCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCWlmKHNvY19kYXRhX2Rydj4weGYpCgkJCQkJe3NvY19kYXRhX2Rydj0oenExcHJfb3JnPj44KSYweGY7fQoJCQkJfQoJCQl9CgoKCQkJewoJCQkJc29jX2RhdGFfb2R0PSh6cXByX3NvY19kcmFtLzEwMCklMTAwMDsKCQkJCXByaW50Zigic29jX2RhdGFfb2R0WyVkXSxcbiIsIHNvY19kYXRhX29kdCk7CgkJCQlpZihzb2NfZGF0YV9vZHQ+MjQwKQoJCQkJe3NvY19kYXRhX29kdD0zNjA7fQoJCQkJaWYoc29jX2RhdGFfb2R0PT0wKQoJCQkJe3NvY19kYXRhX29kdD0xO30KCgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJc29jX2RhdGFfb2R0PSgzNjAvc29jX2RhdGFfb2R0KS0xOwoJCQkJCWlmKHNvY19kYXRhX29kdD4weGYpCgkJCQkJe3NvY19kYXRhX29kdD0oenExcHJfb3JnPj40KSYweGY7fQoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJc29jX2RhdGFfb2R0PSg0ODAvc29jX2RhdGFfb2R0KS0xOwoJCQkJCWlmKHNvY19kYXRhX29kdD4weGYpCgkJCQkJe3NvY19kYXRhX29kdD0oenExcHJfb3JnPj4xNikmMHhmO30KCQkJCX0KCgkJCX0KCgkJCXNvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0xOwoKCQkJewoJCQkJZHJhbV9kcnY9KHpxcHJfc29jX2RyYW0vMTAwMDAwKSUxMDA7CgkJCQlwcmludGYoImRyYW1fZHJ2WyVkXSxcbiIsIGRyYW1fZHJ2KTsKCgkJCQlpZihkcmFtX2Rydj4xMDApCgkJCQl7ZHJhbV9kcnY9MDt9CgkJCQlpZihkcmFtX2Rydj09MCkKCQkJCXsKCQkJCQlkcmFtX2RhdGFfZHJ2X2Fkal9lbmFibGU9MDt9CgkJCQllbHNlCgkJCQl7ZHJhbV9kYXRhX2Rydl9hZGpfZW5hYmxlPTE7CgkJCQl9CgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJaWYoZHJhbV9kcnY+PTQwKQoJCQkJCXtkcmFtX2Rydj0wO30KCgkJCQkJZWxzZQoJCQkJCXtkcmFtX2Rydj0xOwoJCQkJCX0KCQkJCX0KCgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoZHJhbV9kcnY8NDgpCgkJCQkJe2RyYW1fZHJ2PTA7fQoKCQkJCQllbHNlCgkJCQkJe2RyYW1fZHJ2PTE7CgkJCQkJfQoJCQkJfQoJCQl9CgoKCQkJewoJCQkJZHJhbV9vZHQ9KHpxcHJfc29jX2RyYW0vMTAwMDAwKS8xMDA7CgkJCQlwcmludGYoImRyYW1fb2R0WyVkXSxcbiIsIGRyYW1fb2R0KTsKCQkJCWlmKGRyYW1fb2R0PjI0MCkKCQkJCXtkcmFtX29kdD00ODA7fQoJCQkJaWYoZHJhbV9vZHQ9PTApCgkJCQl7CgkJCQkJZHJhbV9kYXRhX29kdF9hZGpfZW5hYmxlPTA7CgkJCQl9CgkJCQllbHNlCgkJCQl7ZHJhbV9kYXRhX29kdF9hZGpfZW5hYmxlPTE7CgkJCQl9CgoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKGRyYW1fb2R0PjE2MCkKCQkJCQl7ZHJhbV9vZHQ9MDt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+OTApCgkJCQkJe2RyYW1fb2R0PTI7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjUwKQoJCQkJCXtkcmFtX29kdD0xO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4zNSkKCQkJCQl7ZHJhbV9vZHQ9Mzt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MjUpCgkJCQkJe2RyYW1fb2R0PTU7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PD0yNSkKCQkJCQl7ZHJhbV9vZHQ9NDt9CgoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoZHJhbV9vZHQ+MjgwKQoJCQkJCXtkcmFtX29kdD0wO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4xODApCgkJCQkJe2RyYW1fb2R0PTQ7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjEwMCkKCQkJCQl7ZHJhbV9vZHQ9Mjt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+NzApCgkJCQkJe2RyYW1fb2R0PTY7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjU0KQoJCQkJCXtkcmFtX29kdD0xO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD40NCkKCQkJCQl7ZHJhbV9vZHQ9NTt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MzcpCgkJCQkJe2RyYW1fb2R0PTM7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PD0zNCkKCQkJCQl7ZHJhbV9vZHQ9Nzt9CgoJCQkJfQoKCgoJCQl9CgoJCQl6cXByX3NvY19kcmFtPShkcmFtX2RhdGFfb2R0X2Fkal9lbmFibGU8PDMwKXwoZHJhbV9kYXRhX2Rydl9hZGpfZW5hYmxlPDwyOSl8KHNvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZTw8MjgpfAoJCQkJKGRyYW1fb2R0PDwyNCl8KGRyYW1fZHJ2PDwyMCl8KHNvY19kYXRhX29kdDw8MTYpfChzb2NfZGF0YV9kcnY8PDEyKXwoc29jX2RhdGFfZHJ2PDw4KXwoc29jX2RhdGFfb2R0PDw0KXwoc29jX2RhdGFfZHJ2KTsKCQl9Cgl9CgoKCWlmIChzb2NfZHJhbV9oZXhfZGVjKQoJewoJCWlmIChhcmdjID40KQoJCXsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCQl9CgkJaWYgKGFyZ2MgPjUpCgkJewoJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSAwOwoJCQl9CgkJfQoJCWlmIChhcmdjID43KQoJCXsKCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSAwOwoJCQl9CgkJfQoJCWlmIChkZHJfdGVzdF9jbWRfc29jX3ZyZWYpCgkJewoJCQlpZiAoZGRyX3Rlc3RfY21kX3NvY192cmVmPDQ1KQoJCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmPTQ1OwoJCQlpZiAoZGRyX3Rlc3RfY21kX3NvY192cmVmPjg4KQoJCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmPTg4OwoJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWY9KGRkcl90ZXN0X2NtZF9zb2NfdnJlZioxMDAtNDQwNykvNzA7CgkJfQoKCQlpZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZikKCQl7CgkJCWlmIChkZHJfdGVzdF9jbWRfZHJhbV92cmVmPDQ1KQoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj00NTsKCQkJaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY+OTIpCgkJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmPTkyOwoJCQlpZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj42MCkgewoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj0oZGRyX3Rlc3RfY21kX2RyYW1fdnJlZioxMDAtNjAwMCkvNjU7CgkJCX0KCQkJZWxzZXsKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9KChkZHJfdGVzdF9jbWRfZHJhbV92cmVmKjEwMC00NTAwKS82NSl8KDE8PDYpOwoJCQl9CgkJfQoKCgkJcHJpbnRmKCJcblNldCBkZHJfdGVzdF9jbWRfZHJhbV92cmVmIFsweCUwOHhdXG4iLGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYpOwoJCWlmIChkZHJfdGVzdF9jbWRfenFfdnJlZiA9PSAwKQoJCQlkZHJfdGVzdF9jbWRfenFfdnJlZj0wOwoJCWlmIChkZHJfdGVzdF9jbWRfenFfdnJlZikgewoJCQlpZiAoZGRyX3Rlc3RfY21kX3pxX3ZyZWY8NDUpCgkJCQlkZHJfdGVzdF9jbWRfenFfdnJlZj00NTsKCQkJaWYgKGRkcl90ZXN0X2NtZF96cV92cmVmPjg4KQoJCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWY9ODg7CgkJCWRkcl90ZXN0X2NtZF96cV92cmVmPShkZHJfdGVzdF9jbWRfenFfdnJlZioxMDAtNDQwNykvNzA7CgkJfQoJfQoKCS8vaWYoZGRyX3Rlc3RfY21kX3R5cGU9PUREUl9URVNUX0NNRF9URVNUX0FDX0JJVF9IT0xEKQoJLy97aWYgKGRkcl90ZXN0X2NtZF9jbGtfc2VlZCA9PTApCgkvL2Rkcl90ZXN0X2NtZF9jbGtfc2VlZCA9IDB4M2Y7CgkvL2lmIChkZHJfdGVzdF9jbWRfYWNiZGxfeF9zZWVkID09MCkKCS8vZGRyX3Rlc3RfY21kX2FjYmRsX3hfc2VlZCA9IDB4M2Y7CgkvL30KCiNpZiBkZWZpbmVkKENPTkZJR19NNlRWKSB8fCBkZWZpbmVkKENPTkZJR19NNlRWRCkKCXdyaXRlbCh6cWNyIHwgKDB4M2MgPDwgMjQpLCBQUkVHX1NUSUNLWV9SRUcwKTsKI2Vsc2UKCXdyaXRlbCh6cWNyIHwgKDB4ZjE0IDw8IDIwKSwgUFJFR19TVElDS1lfUkVHMCk7CiNlbmRpZgojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCgl3cml0ZWwoKGRkcl90ZXN0X2NtZF96cV92cmVmPDwyNCl8KGRkcl90ZXN0X2NtZF9zb2NfdnJlZjw8OCl8ZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiAsIFBSRUdfU1RJQ0tZX1JFRzkpOwoJd3JpdGVsKCh6cXByX3NvY19kcmFtPDwwKSAsIFBSRUdfU1RJQ0tZX1JFRzgpOwoJc29jX2RhdGFfZHJ2X29kdD16cXByX3NvY19kcmFtJjB4ZmZmZmY7CglkcmFtX2Rydj0oenFwcl9zb2NfZHJhbT4+MjApJjB4ZjsKCWRyYW1fb2R0PSh6cXByX3NvY19kcmFtPj4yNCkmMHhmOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gWzB4JTA4eF0sLi5iaXQyOCBlbmFibGUgc29jX3pxcHIgLCAgIGJpdCAyOSBlbmFiZSBkcmFtX2RydiwgICBiaXQgMzAgZW5hYmVsIGRyYW1fb2R0XG4iLCB6cXByX3NvY19kcmFtKTsKCXByaW50Zigic29jX2RhdGFfZHJ2X29kdCBbMHglMDh4XSxkcmFtX2RydiBbMHglMDh4XSxkcmFtX29kdCBbMHglMDh4XVxuIiwgc29jX2RhdGFfZHJ2X29kdCxkcmFtX2RydixkcmFtX29kdCk7CglwbGw9cGxsfChiaXN0X3Rlc3RfZHFfaW5kZXg8PDEyKTsKCglpZihkZHJfZnVsbF90ZXN0X2VuYWJsZSkKCXsKCQlwbGw9KGRkcl9mdWxsX3Rlc3RfZW5hYmxlPDwyMSl8cGxsOwoJCXByaW50ZigiZGRyX2Z1bGxfdGVzdF9lbmFibGUgJTA4eCxzZXQgc3RpY2t5IHJlZzEgYml0IDIxIDFcbiIsIGRkcl9mdWxsX3Rlc3RfZW5hYmxlKTsKCX0KCiNlbmRpZgoKCgl3cml0ZWwocGxsLCBQUkVHX1NUSUNLWV9SRUcxKTsKCglwcmludGYoIlNldCBwbGwgZG9uZSBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHMSkpOwoJcHJpbnRmKCJTVElDS1lfUkVHMSBwbGwgYml0IDEyLTE5IHVzZSBmb3IgYmlzdCBkcSBpbmRleCB0ZXN0IDB4ZmYgaXMgYWxsIDEgLS0+IGRxMCAsMi0tLT5kcTEgXG4iKTsKCXByaW50ZigiU2V0IFNUSUNLWV9SRUcwIFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUcwKSk7CglwcmludGYoIlNldCBTVElDS1lfUkVHMSBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHMSkpOwojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCglwcmludGYoIlNldCBTVElDS1lfUkVHOSBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHOSkpOwoJcHJpbnRmKCJTZXQgU1RJQ0tZX1JFRzggWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzgpKTsKCiNlbmRpZgoJcHJpbnRmKCJcbmJlZ2luIHJlc2V0IDExMS4uLi4uLi4uLi4uXG4iKTsKCXByaW50ZigiXG5iZWdpbiByZXNldCAyLi4uLi4uLi4uLi5cbiIpOwoJcHJpbnRmKCJcbmJlZ2luIHJlc2V0IDMuLi4uLi4uLi4uLlxuIik7CgojaWZkZWYgQ09ORklHX004QgoJcHJpbnRmKCIgdDEgXG4iKTsKCXdyaXRlbCgweGYwODAwMDAgfCAyMDAwLCBXQVRDSERPR19UQyk7CiNlbHNlCglwcmludGYoIiB0MiBcbiIpOwoJLy8gIHdyaXRlbChXQVRDSERPR19UQywgMHhmNDAwMDAwIHwgMjAwMCk7CgkvLyAqUF9XQVRDSERPR19SRVNFVCA9IDA7CglkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKI2VuZGlmCgl3aGlsZSgxKTsKCXJldHVybiAwOwoKdXNhZ2U6CgoJcHJpbnRmKCIgZGRyX3Rlc3RfY21kIDB4MTcgY2xrIHpxX2FjIHpxX3NvY19kcmFtIHNvY192cmVmIGRyYW1fdnJlZiBkZWNfaGV4IHpxX3ZyZWYgMFxuIik7CglwcmludGYoImV4YW1wbGUgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCAweDJhYTRhIDB4MjAxNTk5NWQgNTAgODEgMSA1MCBcbiIpOwoJcHJpbnRmKCJvciAgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCAweDJhYTRhIDB4MjAxNTk5NWQgMHgwOSAweDIwIDAgNTAgXG4iKTsKCXByaW50Zigib3IgIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgNjAzNCA2MDM0NjAzNCAwIDAgMCAwIDEgXG4iKTsKCXByaW50Zigic2V0dGluZyB6cXByX3NvY19kcmFtICwuLmJpdDI4IGVuYWJsZSBzb2NfenFwciAsICAgYml0IDI5IGVuYWJlIGRyYW1fZHJ2LCAgIGJpdCAzMCBlbmFiZWwgZHJhbV9vZHRcbiIpOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gLGJpdDAtYml0MTkgIHNvY19kYXRhX2Rydl9vZHQsYml0MjAtYml0MjQgIGRyYW1fZHJ2ICwgIGJpdDI0LWJpdDI4ICBkcmFtX29kdFxuIik7CglwcmludGYoInNldHRpbmcgenFwcl9zb2NfZHJhbSAsYml0MC1iaXQxOSBiaXQgMC03IHVzZSBmb3IgZGRyM6OsYml0OC0xOSB1c2UgZm9yIGRkcjQsb2R0X2Rvd25fdXBcbiIpOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gLHNvY19kcnY9KDQ4MC8oKHNldHRpbmcpKzEpKTtkZHI0LS0tc29jX29kdD0oNDgwLyhzZXR0aW5nKSsxKSk7ZGRyMy0tLXNvY19vZHQ9KDM2MC8oc2V0dGluZykrMSkpO1xuIik7CgoJcHJpbnRmKCIgRERSM19EUlZfNDBPSE0JCTBcbiIpOwoJcHJpbnRmKCIgRERSM19EUlZfMzRPSE0JCTFcblxuIik7CgoJcHJpbnRmKCIgRERSM19PRFRfME9ITQkJMFxuIik7CglwcmludGYoIiBERFIzX09EVF82ME9ITQkJMVxuIik7CglwcmludGYoIiBERFIzX09EVF8xMjBPSE0JMlxuIik7CglwcmludGYoIiBERFIzX09EVF80ME9ITQkJM1xuIik7CglwcmludGYoIiBERFIzX09EVF8yME9ITQkJNFxuIik7CglwcmludGYoIiBERFIzX09EVF8zME9ITQkJNVxuXG5cbiIpOwoKCXByaW50ZigiIExQRERSMl9EUlZfMzRPSE0JMVxuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzQwT0hNCTJcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl80OE9ITQkzXG4iKTsKCXByaW50ZigiIExQRERSMl9EUlZfNjBPSE0JNFxuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzgwT0hNCTZcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl8xMjBPSE0JN1xuXG4iKTsKCglwcmludGYoIiBMUEREUjJfT0RUXzBPSE0JMFxuXG5cbiIpOwoKCglwcmludGYoIiBMUEREUjNfRFJWXzM0T0hNCTFcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl80ME9ITQkyXG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfNDhPSE0JM1xuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzYwT0hNCTRcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl84ME9ITQk2XG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfMzRfNDBPSE0JOVxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzQwXzQ4T0hNCTEwXG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfMzRfNDhPSE0JMTFcblxuIik7CgoJcHJpbnRmKCIgTFBERFIzX09EVF8wT0hNCQkwXG4iKTsKCXByaW50ZigiIExQRERSM19PRFRfNjBPSE0JMVxuIik7CglwcmludGYoIiBMUEREUjNfT0RUXzEyT0hNCTJcbiIpOwoJcHJpbnRmKCIgTFBERFIzX09EVF8yNDBITQkzXG5cblxuIik7CgoJcHJpbnRmKCIgRERSNF9EUlZfMzRPSE0JCTBcbiIpOwoJcHJpbnRmKCIgRERSNF9EUlZfNDhPSE0JCTFcblxuIik7CgoJcHJpbnRmKCIgRERSNF9PRFRfME9ITQkJMFxuIik7CglwcmludGYoIiBERFI0X09EVF82ME9ITQkJMVxuIik7CglwcmludGYoIiBERFI0X09EVF8xMjBPSE0JCTJcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfNDBPSE0JCTNcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfMjQwT0hNCQk0XG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzQ4T0hNCQk1XG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzgwT0hNCQk2XG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzM0T0hNCQk3XG5cblxuXG4iKTsKCgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgoKaW50IGRvX2Rkcl9zZXRfYmlzdF90ZXN0X3NpemVfdXNlX3N0aWNreV82KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCgl1bnNpZ25lZCBpbnQgZGRyX2Jpc3RfdGVzdF9zaXplPTA7CgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCWRkcl9iaXN0X3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsMCk7CglkZHJfYmlzdF90ZXN0X3NpemU9ZGRyX2Jpc3RfdGVzdF9zaXplJjB4ZmZmZmZmZTA7CglpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJZGRyX2Jpc3RfdGVzdF9zaXplPTB4M2YwKjI7Cgl9CgoJcHJpbnRmKCJkZHJfYmlzdF90ZXN0X3NpemUgMHhbJTA4eF0sXG4iLCBkZHJfYmlzdF90ZXN0X3NpemUpOwoKI2lmICggQ09ORklHX0REUl9QSFk+PVBfRERSX1BIWV85MDVYKQoJd3JpdGVsKChkZHJfYmlzdF90ZXN0X3NpemU8PDApICwgUFJFR19TVElDS1lfUkVHNik7CglwcmludGYoIlNldCBTVElDS1lfUkVHNiBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHNikpOwojZW5kaWYKCglyZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50IGRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfX2RhdGFfd2luZG93X2xjZGxyKHVuc2lnbmVkIGludCByYW5rX2luZGV4LHVuc2lnbmVkIGludCBhZGRfaW5kZXgsdW5zaWduZWQgaW50IGxjZGxyX3ZhbHVlLHVuc2lnbmVkIGludCByZWFkX3dyaXRlX2ZsYWcgKQp7Cgl1bnNpZ25lZCByZWdfYWRkPTA7CgoJaWYoYWRkX2luZGV4PT0wKQoJCXJlZ19hZGQ9KEREUjBfUFVCX0FDTENETFIpOwoJaWYoYWRkX2luZGV4PT0xKQoJCXJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjApOwoJewoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9SRUFEKQoJCXsKCQkJbGNkbHJfdmFsdWU9KCgocmVhZGwocmVnX2FkZCkpPj4wKSYweDFmZik7CgkJfQoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgkJCXdyX3JlZyhyZWdfYWRkLCAoKGxjZGxyX3ZhbHVlJjB4MWZmKTw8MCkpOwoJCX0KCgl9CglwcmludGYoImxjZGxyICVkICAlMDh4LCUwOHhcbiIsIGFkZF9pbmRleCxyZWdfYWRkLAoJCQkocmVhZGwocmVnX2FkZCkpKTsKCXJldHVybiBsY2Rscl92YWx1ZTsKfQoKI2VuZGlmCi8vb3V5YW5nCgojZGVmaW5lIGR3Y19kZHJwaHlfYXBiX3dyKGFkZHIsIGRhdCkgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsweGZlMDAwMDAwKSk9KCh1aW50MTZfdClkYXQpCiNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfcmQoYWRkcikgICAqKHZvbGF0aWxlIHVpbnQxNl90ICopKGludF9jb252dGVyX3AoKChhZGRyKSA8PCAxKSsweGZlMDAwMDAwKSkKI2RlZmluZSBBQ1hfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAoKLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhiMCksMCk7Ci8vZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwwKTsKLy9kd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi8vKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOwovL2R3Y19kZHJwaHlfYXBiX3dyKChwczw8MjApfCgwPDwxNil8KGluc3RhbmNlX251bTw8MTIpfCgweDgwKSwpOwoKLy9kZHJfdGVzdF9hY3hfZzEyYSBhIGxlbmd0aCBzdGVwIHRlc3RfbW9kZSBBQ3gKLy9kZHJfdGVzdF9hY3hfZzEyYSAgYSAgICAgICAweDgwMDAwMDAgIDEgICAgICAgICAgMCAgICAgICAgIDB4MQovL2FyZ3ZbMF0gICAgICAgICAgIGFyZ3ZbMV0gIGFyZ3ZbMl0gICAgYXJndlszXSAgICBhcmd2WzRdICAgYXJndls1XQovL2FyZ3ZbMV0sYQovL2FyZ3ZbMl0sdGVzdCBsZW5ndGgKLy9hcmd2WzNdLHRlc3Qgc3RlcAovL2FyZ3ZbNF0sdGVzdF9tb2RlLGRpcmVjdGlvbiwwLHVwOyAgICAxLGRvd247ICAgIDIsZG93biBmaXJzdCx1cCBmb2xsb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAovL2FyZ3ZbNV0sQUN4OzAtQUMwLDEtQUMxLDItQUMyLi4uLDktQUM5CgojaWYgMAppbnQgZG9fZGRyX3Rlc3RfYWN4X2cxMmEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgYWMgYml0IHdpbmRvdyAgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJLy91bnNpZ25lZCBpbnQgICBkZGxfMTAwc3RlcF9wcz0gMDsKCgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50PSAwOwoJLy91bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZVs0MF07CgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIHRlc3RfbW9kZT0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9BQ3g9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoKCXVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19vcmc9MDsKCXVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19taW49MDsKCXVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19tYXg9MDsKCgl1aW50MTZfdCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCXVpbnQxNl90ICAgdGVzdF9zdGVwPTE7Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJaWYgKGFyZ2MgPD0gMikKCXsKCQlnb3RvIHVzYWdlOwoJfQoJZWxzZSAKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0gIAoJfQoJaWYgKGFyZ2MgPjMpIAoJewoJCXRlc3Rfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9zdGVwID0gMTsKCQl9ICAKCX0KCWlmIChhcmdjID40KSAKCXsKCQl0ZXN0X21vZGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7IC8vsuLK1Le9z/IKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9tb2RlID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbW9kZSA9IDI7CgkJfQoJfQoJaWYgKHRlc3RfbW9kZSA+MikgdGVzdF9tb2RlID0gMjsKCgl0ZXN0X0FDeCA9MDsKCWlmIChhcmdjID41KSAKCXsKCgkJdGVzdF9BQ3g9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9BQ3ggPSAwOwoJCX0KCQlpZiAodGVzdF9BQ3g+OSkKCQkJdGVzdF9BQ3ggPTA7Ly9kZWZhdWx0IHRlc3QgQUMwCgl9CgoJcHJpbnRmKCJkZHJfdGVzdF9zaXplICA9IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoInRlc3RfbW9kZSA9IDB4JTA4eFxuIiwgdGVzdF9tb2RlKTsKCXByaW50ZigidGVzdF9BQ3ggPSAgICAgMHglMDh4XG4iLCB0ZXN0X0FDeCk7Cglkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDApOy8vbXcgZmUxYTAwMDAgIDAKCXJlZ19iYXNlX2Fkaj0weGZlMDAwMDAwOwoJcmVnX2FkZD0oKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpPDwxKSArIHJlZ19iYXNlX2FkajsKCgl7CgoJCXsKCQkJcHJpbnRmKCJ0ZXN0IEFDJWQgd2luZG93IHN0YXJ0XG4gIix0ZXN0X0FDeCk7CgoJCQlpZiAoKHRlc3RfbW9kZSA9PSAxKSB8fCAodGVzdF9tb2RlID09IDIpKQoJCQl7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpOwoJCQkJcmVnX2FkZD0oKCgoMDw8MjApfCgwPDwxNil8KHRlc3RfQUN4PDwxMil8KDB4ODApKTw8MSkgKyByZWdfYmFzZV9hZGopOwoJCQkJYWNiZGxyX3hfcmVnX29yZz1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgwPDwxNil8KHRlc3RfQUN4PDwxMil8KDB4ODApKTs7CgkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQoJCQkJewoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWZvcih0ZW1wX2NvdW50PTA7dGVtcF9jb3VudCA8IHRlc3Rfc3RlcDt0ZW1wX2NvdW50KyspCgkJCQkJewoJCQkJCQlpZihkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPT0wKSBicmVhazsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOyAgICAgICAKCQkJCQl9OwoJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQlwcmludGYoIlxuIHJlZ19hZGQ9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix2YWx1ZT09MHglMDh4IixyZWdfYWRkLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLWFjYmRscl94X3JlZ19vcmcpOwoJCQkJCXsKCQkJCQkJZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCX0KCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCXRlbXBfdGVzdF9lcnJvciA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIGRldGVjdCAscmVnPT0weCUwOHhcbiIscmVnX2FkZCk7CgkJCQlwcmludGYoIlxuIG9yZz09MHglMDh4LGxlZnQgZWRnZT09MHglMDh4XG4gIixhY2JkbHJfeF9yZWdfb3JnLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCQkJCWFjYmRscl94X3JlZ19taW49IChpbnQpZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX21pbj09MHglMDh4XG4iLGFjYmRscl94X3JlZ19taW4pOyAgICAgICAKCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgkJCQkvL7vWuLTErMjP1rUKCQkJCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCksKHVpbnQxNl90KWFjYmRscl94X3JlZ19vcmcpOyAgICAgIAoJCQl9CgoJCQlpZiAoKHRlc3RfbW9kZSA9PSAwKSB8fCAodGVzdF9tb2RlID09IDIpKQoJCQl7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpOwoJCQkJcmVnX2FkZD0oKCgoMDw8MjApfCgwPDwxNil8KHRlc3RfQUN4PDwxMil8KDB4ODApKTw8MSkgKyByZWdfYmFzZV9hZGopOwoJCQkJYWNiZGxyX3hfcmVnX29yZz1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgwPDwxNil8KHRlc3RfQUN4PDwxMil8KDB4ODApKTsKCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPEFDWF9NQVgpCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2Vycm9yID0gMDsKCQkJCQlmb3IodGVtcF9jb3VudD0wO3RlbXBfY291bnQgPCB0ZXN0X3N0ZXA7dGVtcF9jb3VudCsrKQoJCQkJCXsKCQkJCQkJaWYoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT49QUNYX01BWCkgYnJlYWs7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsgICAgICAgCgkJCQkJfTsKCQkJCQlwcmludGYoIlxuIHJlZ19hZGQ9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix2YWx1ZT09MHglMDh4IixyZWdfYWRkLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLWFjYmRscl94X3JlZ19vcmcpOwoJCQkJCXsKCQkJCQkJZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCX0KCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgkJCQkJCXRlbXBfdGVzdF9lcnJvciA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCXByaW50ZigicmlnaHQgZWRnZSBkZXRlY3QgLHJlZyA9IDB4JTA4eFxuIixyZWdfYWRkKTsKCQkJCXByaW50Zigib3JnID0gMHglMDh4LHJpZ2h0IGVkZ2UgPSAweCUwOHgsdmFsdWUgPSAweCUwOHhcbiAiLGFjYmRscl94X3JlZ19vcmcsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS1hY2JkbHJfeF9yZWdfb3JnKTsKCgkJCQlhY2JkbHJfeF9yZWdfbWF4PShpbnQpZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX21heCA9IDB4JTA4eFxuIixhY2JkbHJfeF9yZWdfbWF4KTsKCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgkJCQkvL7vWuLTErMjP1rUKCQkJCWR3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgwPDwxNil8KHRlc3RfQUN4PDwxMil8KDB4ODApKSwodWludClhY2JkbHJfeF9yZWdfb3JnKTsKCQkJfQoJCQlpZiAodGVzdF9tb2RlID09IDIpCgkJCXsKCQkJCS8vz8jN+c/CsuKjrNTZzfnJz7Lio6yy4srUveHK+KOstPLTob3hufsKCQkJCXByaW50ZigidGVzdCBBQyVkIHdpbmRvdyBmaW5pc2hcbiAiLHRlc3RfQUN4KTsKCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX21pbiA9IDB4JTA4eFxuIixhY2JkbHJfeF9yZWdfbWluKTsKCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX21heCA9IDB4JTA4eFxuIixhY2JkbHJfeF9yZWdfbWF4KTsgICAgCgkJCX0gIAoJCX0KCQlkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDEpOwoJCXJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKdXNhZ2U6CgkJY21kX3VzYWdlKGNtZHRwKTsKCQlyZXR1cm4gMTsKCgl9Cgp9CgpVX0JPT1RfQ01EKAoJZGRyX3Rlc3RfYWN4X2cxMmEsCTgsCTEsCWRvX2Rkcl90ZXN0X2FjeF9nMTJhLAoJImRkcl90ZXN0X2FjeF9nMTJhIGEgbGVuZ3RoIHN0ZXAgZGlyZWN0aW9uIEFDeCIsCgkiZGRyX3Rlc3RfYWN4X2cxMmEgYSAweDgwMDAwMDAgMSAwIDAgIFxuIgopOwoKLy9kZHJfcmVhZF93cml0ZV9hY3hfZzEyYSBhIHJkL3dyIEFDMCBBQzEgQUMyIEFDMyBBQzQgQUM1IEFDNiBBQzcgQUM4IEFDOQovL2Rkcl90ZXN0X2FjeF9nMTJhICBhICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgMCAgICAgICAgIDB4MQovL2FyZ3ZbMF0gICAgICAgICAgIGFyZ3ZbMV0gIGFyZ3ZbMl0gICAgYXJndlszXSAgICBhcmd2WzRdICAgYXJndls1XQovL2FyZ3ZbMV0sYSAgICAgICAgICxubyB1c2UscmVzZXJ2ZSxqdXN0IGZvciBmbGFnCi8vYXJndlsyXSxyZC93ciwwPXJlYWQsMT13cml0ZQovL2FyZ3ZbM10sQUMwCi8vYXJndls0XSxBQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi8vYXJndls1XSxBQzI7Li4uLDktQUM5CgppbnQgZG9fZGRyX3JlYWRfd3JpdGVfYWN4X2cxMmEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7ICAKCXVuc2lnbmVkIGludCAgICAgcmVhZF93cml0ZV9mbGFnPSAwOyAgCgkvL3Vuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCXVuc2lnbmVkIGludCAgICAgdGVtcF9jb3VudD0gMDsKCS8vdW5zaWduZWQgaW50ICAgdGVtcF9yZWdfdmFsdWVbNDBdOyAgCgl1aW50MTZfdCAgICAgICAgIEFDeFsxMF07CgljaGFyICAgICAgICAgICAgICplbmRwOwoKCXByaW50ZigiRW50ZXIgZGRyX3JlYWRfd3JpdGVfYWN4X2cxMmEgIGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoJaWYgKGFyZ2MgPD0gMikKCXsKCQlnb3RvIHVzYWdlOwoJfQoJZWxzZSAKCXsKCQlyZWFkX3dyaXRlX2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXJlYWRfd3JpdGVfZmxhZyA9IDA7CgkJfSAgCgl9CglpZiAoKGFyZ2MgPjEyKSAmJiAocmVhZF93cml0ZV9mbGFnID09IDEpKSAKCXsKCQlmb3IodGVtcF9jb3VudD0wO3RlbXBfY291bnQgPCAxMDt0ZW1wX2NvdW50KyspCgkJewoJCQkvL3JlYWQgQUMwLUFDOSB0byBBQ3hbMC05XQoJCQlBQ3hbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbdGVtcF9jb3VudCszXSwgJmVuZHAsIDE2KTsKCQl9Cgl9CgllbHNlCgl7CgkJcmVhZF93cml0ZV9mbGFnID0gMDsKCX0KCglkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDApOy8vbXcgZmUxYTAwMDAgIDAKCS8vMHhmZTAwMDAwMDsKCS8vKCgoMDw8MjApfCgwPDwxNil8KHRlc3RfYWNiZGw8PDEyKXwoMHg4MCkpPDwxKSArIDB4ZmUwMDAwMDA7Cgl7CgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSAwKQoJCXsKCQkJZm9yKHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50IDwgMTA7dGVtcF9jb3VudCsrKQoJCQl7CgkJCQlBQ3hbdGVtcF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMDw8MTYpfCh0ZW1wX2NvdW50PDwxMil8KDB4ODApKTsKCQkJCXByaW50ZigiUmVhZDogQUMlZFsweCUwOHhdPT0weCUwOHhcbiIsdGVtcF9jb3VudCwoKCgwPDwyMCl8KDA8PDE2KXwodGVtcF9jb3VudDw8MTIpfCgweDgwKSk8PDEpICsgMHhmZTAwMDAwMCxBQ3hbdGVtcF9jb3VudF0pOyAgICAKCQkJfTsKCQl9CgoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gMSkKCQl7CgoJCQlmb3IodGVtcF9jb3VudD0wO3RlbXBfY291bnQgPCAxMDt0ZW1wX2NvdW50KyspCgkJCXsKCQkJCWR3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgwPDwxNil8KHRlbXBfY291bnQ8PDEyKXwoMHg4MCkpLEFDeFt0ZW1wX2NvdW50XSk7CgkJCQlwcmludGYoIldyaXRlOiBBQyVkWzB4JTA4eF09PTB4JTA4eFxuIix0ZW1wX2NvdW50LCgoKDA8PDIwKXwoMDw8MTYpfCh0ZW1wX2NvdW50PDwxMil8KDB4ODApKTw8MSkgKyAweGZlMDAwMDAwLGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwodGVtcF9jb3VudDw8MTIpfCgweDgwKSkpOyAgICAKCQkJfTsgICAgCgkJfQoJCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMSk7CgkJcmV0dXJuIDA7Cgp1c2FnZToKCQljbWRfdXNhZ2UoY21kdHApOwoJCXJldHVybiAxOwoJfQp9CgpVX0JPT1RfQ01EKAoJZGRyX3JlYWRfd3JpdGVfYWN4X2cxMmEsCTE4LAkxLAlkb19kZHJfcmVhZF93cml0ZV9hY3hfZzEyYSwKCSJkZHJfcmVhZF93cml0ZV9hY3hfZzEyYSBhIHJkL3dyIGFjMC1hYzkiLAoJImRkcl9yZWFkX3dyaXRlX2FjeF9nMTJhIGEgMCAzIDMgMyAgXG4iCik7CiNlbmRpZgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQojZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKI2RlZmluZSAgRzEyX0RBVEFfV1JJVEVfT0ZGU0VUX01BWCAgICgwWDNGKzcqMzIpCgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkgMQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZICAzCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkgIDQKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZICA2CgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9FRV9WT0xUQUdFICAweDExCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGICAweDEyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0RSQU1fVlJFRiAgICAweDEzCgp1aW50MzJfdCAgZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKGNoYXIgdGVzdF9pbmRleCx1aW50MzJfdCB2YWx1ZSkKewoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkgMQoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZICAzCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkgIDQKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQoJdWludDMyX3QgcmVzdWx0PTA7CgkvKgoJICAgaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJICAgcmVzdWx0PTMyKigoKHZhbHVlPj42KSYxKSsoKHZhbHVlPj41KSYxKSkrdmFsdWUmMHgxZjsKCSAgIH0KCSAgIGlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJICAgcmVzdWx0PTMyKigoKHZhbHVlPj42KSYweGYpKygodmFsdWU+PjUpJjEpKSt2YWx1ZSYweDFmOwoJICAgfQoJICAgaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkgICByZXN1bHQ9MzIqKCgodmFsdWU+PjYpJjB4ZikrKCh2YWx1ZT4+NSkmMSkpK3ZhbHVlJjB4MWY7CgkgICB9CgkgICAqLwojaWYgMAoJaWYgKCh0ZXN0X2luZGV4IDw9IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSApewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjB4ZikrKCh2YWx1ZT4+NSkmMSkpKyh2YWx1ZSYweDFmKSk7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQlyZXN1bHQ9KDMyKigoKHZhbHVlPj42KSYweGYpKygoKHZhbHVlPj41KSYxKSoxKSkrKHZhbHVlJjB4MWYpKTsgLy9iaXQgNSBjaGFuZ2UgdG8gMSBVSSAyMDE4MDcxMSAKCQkvL3Jlc3VsdD0oMzIqKCgoKHZhbHVlPj41KSYxKSoxKSkrKHZhbHVlJjB4MWYpKTsgLy9iaXQgNSBjaGFuZ2UgdG8gMSBVSSAyMDE4MDcxMSAKCX0KCglpZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpKXsKCQlyZXN1bHQ9KDMyKigoKHZhbHVlPj42KSYweDFmKSsoKCh2YWx1ZT4+NSkmMSkqMSkpKyh2YWx1ZSYweDFmKSk7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCXJlc3VsdD12YWx1ZSYweDNmOwoJfQoKI2Vsc2UKCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCQlyZXN1bHQ9KDMyKigoKHZhbHVlPj42KSYxKSsoKHZhbHVlPj41KSYxKSkpKyh2YWx1ZSYweDFmKTsKCX0KCS8vdXNlIGZvciB0eGRxZGx5IHJlZ2lzdGVyICxiZWNhdXNlIG9mIHRoaXMgcmVnaXN0ZXIgYml0IDUgaXMgbm8gdXNlIGppYXhpbmcgMjAxODA4MTQKCQllbHNlCWlmKCAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSl8fCh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkpICB7CgkJcmVzdWx0PSgzMiooKCh2YWx1ZT4+NikmNykpKSsodmFsdWUmMHgzZik7Cgl9CgllbHNlICAvL290aGVyIHJlZ2lzdGVyIGJpdDUgaXMgZWZmZWN0ICxidXQgY2FuIG5vdCBtb2RpZnkgY29hcnNlIGRlbGF5IHdoeSAgPyAgamlheGluZyAyMDE4MDgxNAoJCXJlc3VsdD12YWx1ZSYweDNmOwojZW5kaWYKCWlmICh0ZXN0X2luZGV4ID49IERNQ19URVNUX1dJTkRPV19JTkRFWF9FRV9WT0xUQUdFKSB7CgkJcmVzdWx0PXZhbHVlOwoJfQoJcmV0dXJuIHJlc3VsdDsKfQoKdWludDMyX3QgZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhjaGFyIHRlc3RfaW5kZXgsdWludDMyX3QgdmFsdWUgKQp7CgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkgMgoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSAgMwoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZICA0CgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkgIDUKCXVpbnQzMl90IHJlc3VsdD0wOwoJaWYgKCh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpICkgewoJCWlmICh2YWx1ZTw2NCkgewoJCQlyZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTMyOwoJCX0KCQllbHNlIHsKCQkJcmVzdWx0PSgzPDw1KSsodmFsdWUlMzIpOwoJCX0KCX0KCS8qCgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkgICB9CgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkgICB9CgkgICAqLwoJICAgZWxzZSBpZigodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJCSAgIHx8KHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKCQkJICAgfHwodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpKSB7CgkJICAgLy9yZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTY0OwoJCSAgIHJlc3VsdD12YWx1ZSU2NDsKCQkJaWYgKCh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKXx8KHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpKSB7ICAvL3VzZSBmb3IgdHhkcWRseSByZWdpc3RlciAsYmVjYXVzZSBvZiB0aGlzIHJlZ2lzdGVyIGJpdCA1IGlzIG5vIHVzZSBqaWF4aW5nIDIwMTgwODE0CgkJCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkJICAgfQoJICAgfQoJICAgZWxzZSBpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCSAgIHJlc3VsdD12YWx1ZSYweDNmOwoJICAgfQoJICAgZWxzZSBpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKI2lmIDEKCQkgICByZXN1bHQ9KCh2YWx1ZS8zMik8PDYpK3ZhbHVlJTMyOwoJCS8qCgkJICAgaWYoZW5hYmxlX2JpdDUpCgkJICAgewoJCQkgICBpZigocmVzdWx0Pj42KSYxKQoJCQkgICB7cmVzdWx0PShyZXN1bHQmMHhmZmJmKXwoMTw8NSk7CgkJCSAgIH0KCQkgICB9CgkJKi8KI2Vsc2UKCQkgICByZXN1bHQ9dmFsdWUlNjQ7CiNlbmRpZgoJICAgfQoJICAgZWxzZSBpZih0ZXN0X2luZGV4PkRNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJICAgcmVzdWx0PXZhbHVlOwoJICAgfQoKCSAgIHJldHVybiByZXN1bHQ7Cn0KCnVuc2lnbmVkIGludCBkb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGFkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMCk7Ly9tdyBmZTFhMDAwMCAgMAoJLy8gIHJlZ19iYXNlX2Fkaj0weGZlMDAwMDAwOwoJLy8gcmVnX2FkZD0oKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpPDwxKSArIHJlZ19iYXNlX2FkajsKCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfUkVBRCkKCQl7CgoJCQlsY2Rscl92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgwPDwxNil8KGFkZF9pbmRleDw8MTIpfCgweDgwKSk7CgkJfQoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgoJCQlkd2NfZGRycGh5X2FwYl93cigoKDA8PDIwKXwoMDw8MTYpfChhZGRfaW5kZXg8PDEyKXwoMHg4MCkpLCBsY2Rscl92YWx1ZSk7CgkJfQoKCXByaW50ZigicmFua19pbmRleCAlZCAgIGFkZF9pbmRleCAlZCAgbGNkbHI9PSAlZCBcbiIsIHJhbmtfaW5kZXgsYWRkX2luZGV4LGxjZGxyX3ZhbHVlKTsKCXJldHVybiBsY2Rscl92YWx1ZTsKfQoKCnZvaWQgZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfZHEoY2hhciBvdmVyX3JpZGVfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3N1Yl9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsCgl1aW50MzJfdCBzdGVwX3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoKCXVpbnQ2NF90IHJlZ19hZGQ9MDsKCWlmICghb3Zlcl9yaWRlX2luZGV4KQoJCXJldHVybjsKCQoJCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4YzArKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStzdGVwX3ZhbHVlOwoJCQlpZihkZWxheV9yZWdfdmFsdWU+MjU1KQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTI1NTsKCQl9CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlIT0wKQoJCXsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPnN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UgCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlKTsKCgl9CgkKcHJpbnRmKCJyZWdfYWRkICUwOHggb2xkX3ZhbHVlICUwOHggdXBkYXRlX3RvICUwOHggZGVjICVkIHRvICVkIFxuIiwoKHVuc2lnbmVkIGludCkoKChyZWdfYWRkKSA8PCAxKSsweGZlMDAwMDAwKSksCgkJCWRlbGF5X29sZF92YWx1ZSxkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSxkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpLAoJCQkodW5zaWduZWQgaW50KWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpKSk7Cgp9Cgp2b2lkIGR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZShjaGFyIG92ZXJfcmlkZV9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfc3ViX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV92YWx1ZSkKewoJdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlPTA7Cgl1aW50MzJfdCBkZWxheV9yZWdfdmFsdWU9MDsKCXVpbnQ2NF90IHJlZ19hZGQ9MDsKCS8vCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCS8vcF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsPTA7CgkvL3NlcmlhbF9wdXRzKCJcbnN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZz09Iik7CgkvL3NlcmlhbF9wdXRfZGVjKHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nKTsKCS8vc2VyaWFsX3B1dHMoIlxuIik7CgoJaWYgKCFvdmVyX3JpZGVfaW5kZXgpIHsKCQlyZXR1cm47Cgl9CgkvL2Rkcl9kbWNfdXBkYXRlX2RlbGF5X3JlZ2lzdGVyX2JlZm9yZSgpOwoJLy9jaGFyIGVuYWJsZV9iaXQ1PTA7CgkvLwlpZiAoKHBfZGV2LT5wX2RkcnMtPkRyYW1UeXBlID09IENPTkZJR19ERFJfVFlQRV9MUEREUjQpICYmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSkKCS8vCQl7ZW5hYmxlX2JpdDU9MTt9CglkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSk7CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgwPDwxNil8KG92ZXJfcmlkZV9zdWJfaW5kZXg8PDEyKXwoMHg4MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDFkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgoJCS8vCXtlbmFibGVfYml0NT0oZGVsYXlfb2xkX3ZhbHVlPj41KSYxO30KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlLGVuYWJsZV9iaXQ1KTsKCgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweDhjKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxOGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLChkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKS1wX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX3BoeV9yZWFkX2Rxc19uaWJibGVfb2Zmc2V0KTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweDkwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpLChkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKSk7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MTkwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSwoZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSktcF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19waHlfcmVhZF9kcXNfbmliYmxlX29mZnNldCk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4YzArKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4YzArKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4ODArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxODArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYpIHsKCQkvLwlkZWxheV9vbGRfdmFsdWU9IGluaXRfc29jX3ZyZWYocF9kZXYtPmN1cl90eXBlICAsKG92ZXJfcmlkZV92YWx1ZT4+OCkmMHhmZiwgb3Zlcl9yaWRlX3ZhbHVlLCBvdmVyX3JpZGVfc3ViX2luZGV4ICxwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCS8vCXNldF9zb2NfdnJlZiggcF9kZXYtPmN1cl90eXBlICwgIChvdmVyX3JpZGVfdmFsdWU+PjgpJjB4ZmYsIG92ZXJfcmlkZV92YWx1ZSwgb3Zlcl9yaWRlX3N1Yl9pbmRleCApOwoJCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCksb3Zlcl9yaWRlX3ZhbHVlKTsKCX0KCglwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKzB4ZmUwMDAwMDApKSwKCQkJZGVsYXlfb2xkX3ZhbHVlLGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpLGRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSksCgkJCSh1bnNpZ25lZCBpbnQpZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKSk7Cn0KCnZvaWQgZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLAoJdWludDMyX3Qgc3RlcF92YWx1ZSkKewoJdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlPTA7Cgl1aW50MzJfdCBkZWxheV9yZWdfdmFsdWU9MDsKCgl1aW50NjRfdCByZWdfYWRkPTA7CglpZiAoIW92ZXJfcmlkZV9pbmRleCkKCQlyZXR1cm47CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCgkJcmVnX2FkZD0oKDA8PDIwKXwoMDw8MTYpfChvdmVyX3JpZGVfc3ViX2luZGV4PDwxMil8KDB4ODApKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStzdGVwX3ZhbHVlOwoJCQlpZihkZWxheV9yZWdfdmFsdWU+OTUpCgkJCWRlbGF5X3JlZ192YWx1ZT05NTsKCQl9CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlIT0wKQoJCXsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPj1zdGVwX3ZhbHVlKQoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IoKHJlZ19hZGQpLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoKCi8vc29tZSBjYXNlIHdpbGwgaGFwcGVuIHRkcXMgZnJvbSAweDFmIHRvIDB4MCBvciAweDAgdG8gMHgxZiAsdGhlbiBmYXN0IGJvb3Qgd3JpdGUgYmFjayB3aWxsIGhhcHBlbiBlcnJvciAsYmVjYXVzZQovLyBmYXN0IGJvb3Qgd3JpdGUgYmFjayB3aWxsIHJlLWNhbGN1bGF0ZSBjb2Fyc2UgVUksdGhlbiByZXN1bHQgZHEgcGhhc2UgZmFpbC4KLyoKCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKICAgIC8vICBpZihvdmVyX3JpZGVfdmFsdWU+ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCxkZWxheV9vbGRfdmFsdWUpKQogICAgICAJe2R3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKChkZWxheV9vbGRfdmFsdWUmMHgzZikrc3RlcF92YWx1ZSl8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCWlmKCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpK3N0ZXBfdmFsdWUpPjB4M2YpCgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwweDNmfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CiAgICAgIAl9CgllbHNlIAoJCXsvL2R3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKChkZWxheV9vbGRfdmFsdWUmMHgzZiktc3RlcF92YWx1ZSl8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQlpZigoKGRlbGF5X29sZF92YWx1ZSYweDNmKTxzdGVwX3ZhbHVlKSkKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJZWxzZQoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKChkZWxheV9vbGRfdmFsdWUmMHgzZiktc3RlcF92YWx1ZSl8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsJCgkJfQoKKi8KaWYoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik9PTApCnsKCQkJCQkJCWNoYXIJdGVtcF90ZXN0X2luZGV4PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZOwoJCQkJCQkJY2hhciB0ZW1wX2NvdW50PTA7CgkJCQkJCS8vCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQkJCQkJCQl7CgkJCQkJCQkJZm9yICggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8OTt0ZW1wX2NvdW50KyspCgkJCQkJCQkJewoJCQkJCQkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19kcSh0ZW1wX3Rlc3RfaW5kZXgKCQkJCQkJCQkJLCgoKG92ZXJfcmlkZV9zdWJfaW5kZXgpPj4xKSo5K3RlbXBfY291bnQpLAkJKCFvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UpLHN0ZXBfdmFsdWUpIDsKCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCQoJCQkJCQkJfQoKCQoJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDFkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgoJCS8vCXtlbmFibGVfYml0NT0oZGVsYXlfb2xkX3ZhbHVlPj41KSYxO30KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlLGVuYWJsZV9iaXQ1KTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT4yNTUpCgkJCQlkZWxheV9yZWdfdmFsdWU9MjU1OwoJCX0KCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UhPTApCgkJewoJCQlpZihkZWxheV9yZWdfdmFsdWU+c3RlcF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWUpOwoKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT45NSkKCQkJCWRlbGF5X3JlZ192YWx1ZT05NTsKCQl9CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlIT0wKQoJCXsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPnN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UgCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlKTsKCgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStzdGVwX3ZhbHVlOwoJCQlpZihkZWxheV9yZWdfdmFsdWU+NjMpCgkJCQlkZWxheV9yZWdfdmFsdWU9NjM7CgkJfQoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSE9MCkKCQl7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT5zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQllbHNlIAoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZKSB7CgkJLy8vKgoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHg4MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCiAgICAvLyAgaWYob3Zlcl9yaWRlX3ZhbHVlPmRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsZGVsYXlfb2xkX3ZhbHVlKSkKICAgICAgCXsKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCQlpZigoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKT4weDNmKQoJCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwweDNmfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkgICAgfQoJCWVsc2UKCQl7CgkJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKChkZWxheV9vbGRfdmFsdWUmMHgzZiktc3RlcF92YWx1ZSl8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQkJaWYoKChkZWxheV9vbGRfdmFsdWUmMHgzZik8c3RlcF92YWx1ZSkpCgkJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQl9CgkvLwlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkvLwlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCS8vKi8KCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikgewoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpOwoJCS8vcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X29sZF92YWx1ZTsKCQkJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQkJewoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQlpZihkZWxheV9yZWdfdmFsdWU+MTI3KQoJCQlkZWxheV9yZWdfdmFsdWU9MTI3OwoJCQl9CgkJCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UhPTApCgkJewoJCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPj1zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCQl9Ci8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCXByaW50ZigicmVnX2FkZCAlMDh4IG9sZF92YWx1ZSAlMDh4IHVwZGF0ZV90byAlMDh4IGRlYyAlZCB0byAlZCBcbiIsKCh1bnNpZ25lZCBpbnQpKCgocmVnX2FkZCkgPDwgMSkrMHhmZTAwMDAwMCkpLAoJCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQkJKHVuc2lnbmVkIGludClkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSkpOwoKfQoKCnZvaWQgZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXMoY2hhciBvdmVyX3JpZGVfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3N1Yl9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsCgl1aW50MzJfdCBvZmZzZXRfdmFsdWUpCnsKCXVpbnQzMl90IGRlbGF5X29sZF92YWx1ZT0wOwoJLy91aW50MzJfdCBkZWxheV9yZWdfdmFsdWU9MDsKCXVpbnQzMl90IHRlbXBfY291bnRfMz0wOwoJLy8JdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlX2NhY2w9MDsKCS8vCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZV9jYWNsPTA7CgkvL3VpbnQzMl90IG92ZXJfcmlkZV92YWx1ZT0wOwoJLy8JaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJLy9wX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWw9MDsKCS8vc2VyaWFsX3B1dHMoIlxuc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nPT0iKTsKCS8vc2VyaWFsX3B1dF9kZWMocF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcpOwoJLy9zZXJpYWxfcHV0cygiXG4iKTsKCXVpbnQ2NF90IHJlZ19hZGQ9MDsKCWlmICghb3Zlcl9yaWRlX2luZGV4KSB7CgkJcmV0dXJuOwoJfQoKCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUpOwoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMDw8MTYpfChvdmVyX3JpZGVfc3ViX2luZGV4PDwxMil8KDB4ODApKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDFkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTk2OwoJCX0KCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTEpCgkJewoJCQlpZihkZWxheV9yZWdfdmFsdWU+PW9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQllbHNlIAoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoKCQkvLwl7ZW5hYmxlX2JpdDU9KGRlbGF5X29sZF92YWx1ZT4+NSkmMTt9CgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIG92ZXJfcmlkZV92YWx1ZSxlbmFibGVfYml0NSk7CgkqLwoJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJewoJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJfQoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT45NikKCQkJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQl9CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQoJCXsKCQkJCWlmKGRlbGF5X29sZF92YWx1ZT49b2Zmc2V0X3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJCQllbHNlIAoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJKi8KCQkJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCgkJLyoKCQkgICBkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDE4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSkpOwoJCSAgIGlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQkgICBkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlKzE7CgkJICAgaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQoJCSAgIGRlbGF5X3JlZ192YWx1ZT1kZWxheV9vbGRfdmFsdWUtMTsKCQkgICBkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4MThjKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQkgICBkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4MTkwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQkgICAqLwkKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZihkZWxheV9yZWdfdmFsdWU+OTYpCgkJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQkJfQoJCQkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQoJCXsKCQkJCWlmKGRlbGF5X3JlZ192YWx1ZT49b2Zmc2V0X3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJCQllbHNlIAoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJCX0KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LGRlbGF5X29sZF92YWx1ZSkrMTsKCQkvL2lmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LGRlbGF5X29sZF92YWx1ZSktMTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwpkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCSovCgkJCQkJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJCQkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCQl7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJaWYoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJCX0KCQkJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQl7CgkJCQlpZihkZWxheV9yZWdfdmFsdWU+PW9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCQl9CmRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJKi8KCQkJCQlmb3IoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpIHsKCQkKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPDwxMil8KDB4ODArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZihkZWxheV9yZWdfdmFsdWU+OTYpCgkJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQkJfQoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQl7CgkJCQlpZihkZWxheV9yZWdfdmFsdWU+PW9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJKi8KCQkJCQlmb3IoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJCX0KCgppZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikgewoJCgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSk7CgkJLy9yZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9vbGRfdmFsdWU7CgkJCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJCXsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK29mZnNldF92YWx1ZTsKCQlpZihkZWxheV9yZWdfdmFsdWU+MTI3KQoJCQlkZWxheV9yZWdfdmFsdWU9MTI3OwoJCQl9CgkJCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTEpCgkJewoJCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPj1vZmZzZXRfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQkJCWVsc2UgCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQkJfQovL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CiovCglmb3IoIHRlbXBfY291bnRfMz0wO3RlbXBfY291bnRfMzxvZmZzZXRfdmFsdWU7dGVtcF9jb3VudF8zKyspCgkJewoJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKG92ZXJfcmlkZV9pbmRleAoJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgpKSwJCW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSwxKSA7CgkJfQoJfQoKcHJpbnRmKCJvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PSVkXG4iLG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSk7CgppZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTEpCnsKdW5zaWduZWQgaW50IG9yZ19jYWNsX3ZhbHVlPShkZWxheV9vbGRfdmFsdWUpJjB4M2Y7CnByaW50Zigib3JnX2NhY2xfdmFsdWU9PSVkXG4iLG9yZ19jYWNsX3ZhbHVlKTsKcHJpbnRmKCJvZmZzZXRfdmFsdWU9PSVkXG4iLG9mZnNldF92YWx1ZSk7CglpZigob3JnX2NhY2xfdmFsdWUmMHgzZik8b2Zmc2V0X3ZhbHVlKXsKCgljaGFyIHRlbXBfdGVzdF9pbmRleF8yPTA7CgljaGFyIHRlbXBfY291bnRfND0wOwoJY2hhciB0ZW1wX2NvdW50XzI9MDsKCWlmKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpCgkJewoJdGVtcF90ZXN0X2luZGV4XzI9RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFk7CglpZihvdmVyX3JpZGVfc3ViX2luZGV4JTI9PTApewoJZm9yKHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw5O3RlbXBfY291bnRfMisrKQoJCXtmb3IodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpO3RlbXBfY291bnRfNCsrKQp7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4Pj4xKSo5K3RlbXBfY291bnRfMiksCQkwLDEpIDsKCQl9CgkJfQoJCX0KLyoKCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWTsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCSwoKG92ZXJfcmlkZV9pbmRleCUyKT8KCQkob3Zlcl9yaWRlX2luZGV4LTEpOgoJCShvdmVyX3JpZGVfaW5kZXgrMSkpLAkJMCkgOwoJCX0KKi8JCgkJfQppZihvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQp7Cgl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWTsKCmZvciggdGVtcF9jb3VudF8yPTA7dGVtcF9jb3VudF8yPDQ7dGVtcF9jb3VudF8yKyspCglmb3IodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PCgoKG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSkqdWlfMV8zMl8xMDBzdGVwKS9iZGxyXzEwMHN0ZXApO3RlbXBfY291bnRfNCsrKQoJCXsKewoJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKHRlbXBfdGVzdF9pbmRleF8yCgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleC8yKSo5KwoJCXRlbXBfY291bnRfMisob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKSo0KSwJCTAsMSkgOwoJCgkJCQl9CgkJfQp9CgoJCQlpZihvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpCgkJCXsKCQkJCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZOwoKCQkJCWZvciggdGVtcF9jb3VudF8yPTA7dGVtcF9jb3VudF8yPDQ7dGVtcF9jb3VudF8yKyspCgkJCQl7CgkJCQkJaWYodGVtcF9jb3VudF8yPT0oKG92ZXJfcmlkZV9zdWJfaW5kZXglOSklNCkpCgkJCQkJCXRlbXBfY291bnRfMisrOwpmb3IodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpO3RlbXBfY291bnRfNCsrKQoJCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCQkJCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleC85KSo5KwoJCXRlbXBfY291bnRfMisoKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPjMpPzQ6MCkpLAkJMCwxKSA7CgoJCQkJfQoJCQkJLy9iZGxyXzEwMHN0ZXAgIChvcmdfY2FjbF92YWx1ZTxvZmZzZXRfdmFsdWUpCgkJCQlpZigoKChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpKmJkbHJfMTAwc3RlcCkvdWlfMV8zMl8xMDBzdGVwKSkKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFk7Cglmb3IodGVtcF9jb3VudF80PTA7dGVtcF9jb3VudF80PCgoKG9mZnNldF92YWx1ZS1vcmdfY2FjbF92YWx1ZSkqYmRscl8xMDBzdGVwKS91aV8xXzMyXzEwMHN0ZXApO3RlbXBfY291bnRfNCsrKQoJCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCQkJCQkJLCgoKG92ZXJfcmlkZV9zdWJfaW5kZXgvOSk8PDEpKwoJCQkJCQkJCSgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk+Myk/MTowKQoJCSksCQkwLDEpIDsKCQkJCX0KCQkJfQoJCX0KfQoJcHJpbnRmKCJyZWdfYWRkICUwOHggb2xkX3ZhbHVlICUwOHggdXBkYXRlX3RvICUwOHggZGVjICVkIHRvICVkIFxuIiwoKHVuc2lnbmVkIGludCkoKChyZWdfYWRkKSA8PCAxKSsweGZlMDAwMDAwKSksCgkJCWRlbGF5X29sZF92YWx1ZSxkd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKSxkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpLAoJZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCkpKTsKCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiICIsMCk7CgkvL2Rkcl9sb2dfc2VyaWFsX3B1dF9oZXgoZGVsYXlfcmVnX3ZhbHVlLDE2LDApOwoJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCIgIiwwKTsKCS8vCWRkcl9kbWNfdXBkYXRlX2RlbGF5X3JlZ2lzdGVyX2FmdGVyKCk7Cn0KCmludCBkb19kZHIycGxsX2cxMl9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CiNkZWZpbmUgRE1DX1dJTkRPV19DTUQgICAyMDE4MDAxMCAgLy9nMTJfZDJwbGwgMTU4NCAwIDAgMCAwIDB4OAoJLy9nMTJfZDJwbGwgMTYwMCA1IDAgMHgxMCAxCgkvL2cxMl9kMnBsbCAxNjAwIDAgMCAwIDAgMHgxMCAwIDEKCS8vZzEyX2QycGxsIDE0MDAgMCAwIDAgMCAwIDAgMCAwIDEgMTIwMCAgMTkwMCAgICB0ZXN0IGRkciBmcmVxdWVuY3kgCgkvL2cxMl9kMnBsbCAxNDAwIDAgMCAwIDAgMCAwIDAgMCAzIDEyMDAgIDE5MDAgICAgdGVzdCBkZHIgZnJlcXVlbmN5IHdpdGggRUUgdm9sdGFnZQoJLy9nMTJfZDJwbGwgMTYwMCAwIDAgMCAwIDAgMCAwIDEgIC8vZnVsbCB0ZXN0CgkvL2cxMl9kMnBsbCAxNjAwIDAgMCAwIDAgMCAwIDAgMSAgMCAwIDAgODcyIC8vZnVsbCB0ZXN0IHdpdGggODcybXYgRUUKCS8vZzEyX2QycGxsIDE2MDAgMCAwIDAgMCAweDEwIDAgMyAgLy9vbmx5IHRlc3Qgc3BlYyBzdWJfaW5kZXggZGVsYXkgd2luZG93CgkvL2cxMl9kMnBsbCAxNjAwICBjbWRfaW5kZXggY21kX3BhcmExIGNtZF9wYXJhMi4uLi4KCS8vZzEyX2QycGxsIDE2MDAgIDB4MSAgICBvdmVycmlkZV9vcHRpb25fYWNfZGF0YV9kZWxheV92cmVmICBvdmVycmlkZV9pbmRleCAgIG92ZXJfcmlkZV92YWx1ZQoJLy9nMTJfZDJwbGwgMTYwMCAgMHgyICAgIG92ZXJyaWRlIHBsdXMgZnVsbHRlc3QKCS8vZzEyX2QycGxsIDE2MDAgIDB4MyAgICBvdmVycmlkZSBwbHVzLi4ub3RoZXIgZnVuY3Rpb24KCS8vZzEyX2QycGxsIDE2MDAgIDB4MTEgICB3aW5kb3dfdGVzdAoJLy9nMTJfZDJwbGwgMTYwMCAgMHgyMSAgIGZyZXF1ZW5jeSB0YWJsZSB0ZXN0CgkvL2cxMl9kMnBsbCAxNjAwICAweDMxICAgc3dlZXBfZWVfdm9sdGFnZV9mcmVxdWVuY3kgdGFibGUgdGVzdAoKCgkvL2cxMl9kMnBsbCAxODAwICAxICAvL2RtYyBmdWxsdGVzdAoJLy9nMTJfZDJwbGwgMTgwMCAgMiAxIDEgMSAwMyAgMiAyIDE0MiAgMHgxMSAwIDk1MCAgIG92ZXJyaWRlIGFmdGVyX3RyYWluaW5nX2ZsYWcgIG92ZXJyaWRlX2luZGV4IHN1Yl9pbmRleCB2YWx1ZSBvdmVycmlkZV9pbmRleDIgc3ViX2luZGV4MiB2YWx1ZTIgb3ZlcnJpZGVfaW5kZXgzIHN1Yl9pbmRleDMgdmFsdWUzCgkvL292ZXJyaWRlIDEgMiAzIDQgNSAweDExCgkvL2cxMl9kMnBsbCAxODAwIDIgMSAweDEyICAweDEgMHgwZjYgICBvdmVycmlkZV9zb2NfdnJlZiAgIHBpbl9pbmRleCAgKHZyZWZfcmFuZ2U8PDgpfCh2cmVmX3ZhbHVlKQoKCS8vZzEyX2QycGxsIDE4MDAgIDQgIDQvNS9hICAgLy9vdmVycmlkZV90cmFpbmluZ19oZHRsX2N0bCB2YWx1ZQoKCS8vZzEyX2QycGxsIDE4MDAgIDB4MjEgICAvL2RtYyBzdXNwZW5kIHRlc3QKCS8vZzEyX2QycGxsIDE4MDAgIDB4MTEgIDB4MWYgMCAwIDAgMTAgIDB4MjAgLy9kbWMgd2luZG93IHRlc3QgIG1hc2sxIG1hc2syIG1hc2szIHN1Yl9pbmRleCByZWFkX2JpdF9pbml0X3ZhbHVlKHVzZSBmb3IgdmVyeSBoaWdoIHNwZWVkKQoJLy9nMTJfZDJwbGwgMTgwMCAgMHgzMiAgMTMwMCAxNTAwICA3OTAgIDgyMCAgLy9kbWMgc3dlZXAgZnJlcSBhbmQgZWUgdm9sdGFnZSB0ZXN0ICBmcmVxdWVuY3lfbWluIGZyZXF1ZW5jeV9tYXggZWVfdm9sdGFnZV9taW4gIGVlX3ZvbHRhZ2VfbWF4CgkvL2cxMl9kMnBsbCAxODAwICAweDQxIDIgMCAweGZlICAwIDAgIDEgMHgwMSAgMCAgMCAxIDIgIDB4MTAwMDAwIC8vZG1jICBleWVfdGVzdF9lbmFibGUgaW5pdF9yYW5nZV8wIHJhbmdlMCBfdmFsdWUgIHZyZWZfc3RhcnQgdnJlZl9lbmQKCS8vaW5pdF9yYW5nZV8yICByYW5nZTJfdmFsdWUgdnJlZl9zdGFydDIgdnJlZl9lbmQyIHBpbl9pbmRleF9taW4gcGluX2luZGV4X21heCAgdGVzdF9zaXplCgoKI2RlZmluZSBHMTJfRDJQTExfQ01EX0RNQ19GVUxMX1RFU1QgICAweDAxCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9PVkVSX1JJREUgICAweDAyCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9PVkVSX1JJREVfUExVU19GVUxMVEVTVCAgMHgwMwojZGVmaW5lIEcxMl9EMlBMTF9DTURfT1ZFUl9SSURFX1RSQUlOSU5HX0hEVEwgIDB4MDQKI2RlZmluZSBHMTJfRDJQTExfQ01EX1dJTkRPV19URVNUICAweDExCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9XSU5ET1dfVEVTVF9BTkRfU1RJQ0tZX09WRVJSSURFICAweDEyCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9TVVNQRU5EX1RFU1QgIDB4MjEKCS8vI2RlZmluZSBHMTJfRDJQTExfQ01EX0ZSRVFVRU5DWV9UQUJMRV9URVNUICAweDMxCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9TV0VFUF9FRV9WT0xUQUdFX0ZSRVFVRU5DWV9UQUJMRV9URVNUICAweDMyCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1QgIDB4NDEKI2RlZmluZSBHMTJfRDJQTExfQ01EX0REUl9FWUVfVEVTVF9BTkRfU1RJQ0tZX09WRVJSSURFICAgIDB4NDIKCgojZGVmaW5lIEcxMl9EMlBMTF9DTURfRERSX0RWRlNfVEVTVCAgMHg1MQoKCS8vT1ZFUlJJREVfT1BUSU9OCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1CgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9FRV9WT0xUQUdFICAweDExCgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCBwbGw7Cgl1bnNpZ25lZCBpbnQgIHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT0wOwojaWYgMAoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfY21kX2luZGV4PTA7ICAvLyAgMSAgb3ZlcnJpZGVfY21kICAgMgoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGU9MDsgLy8gYml0IDAgYWMgIDEgIGRhdGEgZHFzIHdyaXRlICAgMiBkYXRhIGRxcyByZWFkICAzIGRhdGEgYml0IHdyaXRlICAgNCBkYXRhIGJpdCByZWFkICA1Ly9kYXRhIHdyaXRlIHZyZWYgICA2IC8vZGF0YSByZWFkIHZyZWYgIAoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD0wOwoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZT0wOwoJdW5zaWduZWQgaW50IHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZz0wOyAgLy8wICBiZWZvcmUgICwxIGFmdGVyIHRyYWluaW5nCgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGU9MDsKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfc3BlY19zdWJfaW5kZXg9MDsKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2RtY19mdWxsX3Rlc3RfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlPTA7CgoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9taW49MDsKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWF4PTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZT0wOwojZW5kaWYKCS8vaWYod2luZG93X3Rlc3Rfc3RpY2tfdmFsdWUpCgl7CgkJLy9zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlPSgod2luZG93X3Rlc3Rfc3RpY2tfdmFsdWU+PjI0KSYweGYpOy8vYml0IDAgYWMgIGJpdDEgd3JpdGUgZHEgYml0IDIgcmVhZCBkcQoJCS8vc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4PSgod2luZG93X3Rlc3Rfc3RpY2tfdmFsdWU+PjE2KSYweGZmKTsKCQkvL3N0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZT0od2luZG93X3Rlc3Rfc3RpY2tfdmFsdWUmMHhmZik7Cgl9CgkvKiBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KCWlmIChhcmdjIDwgMikKCQlnb3RvIHVzYWdlOwoKCXBsbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sICZlbmRwLDApOwoJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCXByaW50ZiAoIkVycm9yOiBXcm9uZyBmb3JtYXQgcGFyYW1lbnQhcGxsPTB4JTA4eFxuIixwbGwpOwoJCXJldHVybiAxOwoJfQoJdW5zaWduZWQgaW50IGFyZ2NfY291bnQ9MTsKCXVuc2lnbmVkIGludCAgcGFyYV9tZXRlclszMF09ezAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsfTsKCXdoaWxlKGFyZ2NfY291bnQ8YXJnYykKCXtwYXJhX21ldGVyW2FyZ2NfY291bnQtMV09IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbYXJnY19jb3VudF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbYXJnY19jb3VudF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXBhcmFfbWV0ZXJbYXJnY19jb3VudC0xXSA9IDA7CgkJfQoJCWFyZ2NfY291bnQrKzsKCX0KCgkvL2lmKHN0aWNrX3Rlc3RfY21kX2luZGV4PT0pCiNpZiAwCglpZiAoYXJnYyA+NCkKCXsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlPTA7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGUgPSAwOwoJCX0KCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSBzaW1wbGVfc3RydG91bChhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSAwOwoJCX0KCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWUgPSBzaW1wbGVfc3RydG91bChhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWUgPSAwOwoJCX0KCX0KCWVsc2UKCXsJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0wOwoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleCA9IDA7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlID0gMDsKCX0KCglpZiAoYXJnYyA+NSkKCXsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcgPSBzaW1wbGVfc3RydG91bChhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcgPSAwOwoJCX0KCX0KCWlmIChhcmdjID42KQoJewoJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWwoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGUgPSAwOwoJCX0KCX0KCWlmIChhcmdjID43KQoJewoJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX21hc2sgPSBzaW1wbGVfc3RydG91bChhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+OCkKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9zcGVjX3N1Yl9pbmRleCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX3NwZWNfc3ViX2luZGV4ID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+OSkKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2RtY19mdWxsX3Rlc3RfZW5hYmxlID0gc2ltcGxlX3N0cnRvdWwoYXJndls5XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZSA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjEwKQoJewoJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMTBdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEwXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+MTEpCgl7CgkJc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21pbiA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMTFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzExXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21pbiA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjEyKQoJewoJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9tYXggPSBzaW1wbGVfc3RydG91bChhcmd2WzEyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9tYXggPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMykKCXsKCQlzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTNdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlID0gMDsKCQl9Cgl9CgoKI2lmIGRlZmluZWQoQ09ORklHX002VFYpIHx8IGRlZmluZWQoQ09ORklHX002VFZEKQoJd3JfcmVnKCBQUkVHX1NUSUNLWV9SRUcwLDAgfCAoMHgzYyA8PCAyNCkpOwojZWxzZQoJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzAsMCB8ICgweGYxMyA8PCAyMCkpOwojZW5kaWYKCglpZihzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZSkKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHMCwoKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX3NwZWNfc3ViX2luZGV4JjB4ZmYpPDw4KXwoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGUmMHhmZikgfCAoMHhmMTI8PCAyMCkpOwoJfQoJLy93cl9yZWcoUFJFR19TVElDS1lfUkVHMSxwbGwgfCAocmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzEpKSk7Cgl3cl9yZWcoUFJFR19TVElDS1lfUkVHMSxwbGwgKTsKCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcyLChzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWUmMHhmZmZmKSB8KChzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXgmMHhmZik8PDE2KQoJCQl8KChzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlJjB4Nyk8PDI5KQoJCQl8KChzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcmMHgxKTw8MjgpKTsKCWlmKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX21hc2spCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzMsKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX21hc2spKTsKCX0KCS8vCWlmKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZG1jX2Z1bGxfdGVzdF9lbmFibGUpCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzQsKHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZG1jX2Z1bGxfdGVzdF9lbmFibGU8PDMxKXwoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlPDwyOSkpOwoJfQoJaWYoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X2VlX3ZvbHRhZ2VfZW5hYmxlKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUc1LChzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWluPDwwKXwoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21heDw8MTYpKTsKCX0KCWlmKHN0aWNrX2RtY19kZHJfYmwyX2VlX3ZvbHRhZ2UpCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzYsKHN0aWNrX2RtY19kZHJfYmwyX2VlX3ZvbHRhZ2U8PDApKTsKCX0KI2VuZGlmIAoJYXJnY19jb3VudD0yOwoJd2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlPXBhcmFfbWV0ZXJbYXJnY19jb3VudC0xXTsKCWlmKCh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWU9PUcxMl9EMlBMTF9DTURfT1ZFUl9SSURFKXx8KHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT09RzEyX0QyUExMX0NNRF9PVkVSX1JJREVfUExVU19GVUxMVEVTVCkpCgl7CgkJcGFyYV9tZXRlclszXT0ocGFyYV9tZXRlclszXTw8MjQpfChwYXJhX21ldGVyWzRdPDwxNil8KHBhcmFfbWV0ZXJbNV08PDApOwoJCXBhcmFfbWV0ZXJbNF09KHBhcmFfbWV0ZXJbNl08PDI0KXwocGFyYV9tZXRlcls3XTw8MTYpfChwYXJhX21ldGVyWzhdPDwwKTsKCQlwYXJhX21ldGVyWzVdPShwYXJhX21ldGVyWzldPDwyNCl8KHBhcmFfbWV0ZXJbMTBdPDwxNil8KHBhcmFfbWV0ZXJbMTFdPDwwKTsKCgl9CglpZigod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlPT1HMTJfRDJQTExfQ01EX1dJTkRPV19URVNUKXx8KHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT09RzEyX0QyUExMX0NNRF9XSU5ET1dfVEVTVF9BTkRfU1RJQ0tZX09WRVJSSURFKSkKCXsKCQkvL3BhcmFfbWV0ZXJbOF0gIHNpemUgICA5ICBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X25vX3VzZV9kcXNfZHFfY29ycmVjdGlvbiAgIDEwIGRpc2FibGVfc2NyYW1ibGVfdXNlX2RlZmluZV9wYXR0ZXJuICAxMSBzdGlja19kbWNfd2luZG93X3Rlc3RfbG9vcF9mbGFnIHdpbmRvdyBsb29wIHRlc3QKCQkvLzEyIGlmIHJlaW5pdCB3aGVuIHRlc3QgZHEgIDEzIHBhc3NfdG9fZmFpbF9mbGFnICAgIDE0ICB0ZXN0X2RtY19vcl9jcHUKCQlwYXJhX21ldGVyWzVdPShwYXJhX21ldGVyWzldPDwyOCl8KHBhcmFfbWV0ZXJbMTBdPDwyNCl8KHBhcmFfbWV0ZXJbMTFdPDwyMCl8KHBhcmFfbWV0ZXJbMTJdPDwyMSl8KHBhcmFfbWV0ZXJbMTNdPDwyMil8KHBhcmFfbWV0ZXJbMTRdPDwyNSl8KHBhcmFfbWV0ZXJbNV08PDApOwoKCX0KCWlmKCh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWU9PUcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUKXx8KHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT09RzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERSkpCgl7CgoJCXBhcmFfbWV0ZXJbM109KHBhcmFfbWV0ZXJbM108PDApfChwYXJhX21ldGVyWzRdPDw4KXwocGFyYV9tZXRlcls1XTw8MTYpfChwYXJhX21ldGVyWzZdPDwyNCk7CgkJcGFyYV9tZXRlcls0XT0ocGFyYV9tZXRlcls3XTw8MCl8KHBhcmFfbWV0ZXJbOF08PDgpfChwYXJhX21ldGVyWzldPDwxNil8KHBhcmFfbWV0ZXJbMTBdPDwyNCk7CgkJcGFyYV9tZXRlcls1XT1wYXJhX21ldGVyWzExXTsvLyhwYXJhX21ldGVyWzExXTw8MCl8KHBhcmFfbWV0ZXJbMTJdPDw4KXwocGFyYV9tZXRlclsxM108PDE2KXwocGFyYV9tZXRlclsxNF08PDI0KTsKCQlwYXJhX21ldGVyWzZdPXBhcmFfbWV0ZXJbMTJdOy8vcGFyYV9tZXRlclsxNV07CgkJcGFyYV9tZXRlcls3XT1wYXJhX21ldGVyWzEzXTsvL3BhcmFfbWV0ZXJbMTZdOwoJCXBhcmFfbWV0ZXJbOF09cGFyYV9tZXRlclsxNF07Ly9wYXJhX21ldGVyWzE3XTsKCX0KCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcwLChyZF9yZWcoUFJFR19TVElDS1lfUkVHMCkmMHhmZmZmKSB8ICgweGYxMyA8PCAyMCkpOwoJYXJnY19jb3VudD0wOwoJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRyBbMHglMDh4XSAgWzB4JTA4eF09PVsweCUwOHhdXG4iLCBhcmdjX2NvdW50LChQUkVHX1NUSUNLWV9SRUcwKyhhcmdjX2NvdW50PDwyKSkscmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzArKGFyZ2NfY291bnQ8PDIpKSk7CglhcmdjX2NvdW50PTE7CgkvL3doaWxlKGFyZ2NfY291bnQ8YXJnYykKCXdoaWxlKGFyZ2NfY291bnQ8MTApCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzArKGFyZ2NfY291bnQ8PDIpLHBhcmFfbWV0ZXJbYXJnY19jb3VudC0xXSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRyBbMHglMDh4XSAgWzB4JTA4eF09PVsweCUwOHhdXG4iLCBhcmdjX2NvdW50LChQUkVHX1NUSUNLWV9SRUcwKyhhcmdjX2NvdW50PDwyKSkscmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzArKGFyZ2NfY291bnQ8PDIpKSk7CgkJYXJnY19jb3VudCsrOwoJfQoJLyoJCgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzAgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcwKSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzEgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcxKSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzIgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcyKSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzMgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUczKSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzQgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUc0KSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzUgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUc1KSk7CgkJcHJpbnRmKCJQX1BSRUdfU1RJQ0tZX1JFRzYgWzB4JTA4eF1cbiIsIHJkX3JlZyhQUkVHX1NUSUNLWV9SRUc2KSk7CgkJKi8KCXByaW50ZigicmVzZXQuLi5cbiIpOwoKCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwoKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgoKVV9CT09UX0NNRCgKCWcxMl9kMnBsbCwJMTgsCTEsCWRvX2RkcjJwbGxfZzEyX2NtZCwKCSJnMTJfZDJwbGwgMTMwMCAgMSAweDEwIDAiLAoJImcxMl9kMnBsbCAgY2xrIGRlbGF5X2luZGV4IGRlbGF5X3ZhbHVlIGJlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nXG4iCik7CgppbnQgZG9fZGRyX2cxMl91Ym9vdF9kbWNfdGVzdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXJldHVybiAxOwoKCS8qCgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJaWYgKGFyZ2MgPCAyKQoJZ290byB1c2FnZTsKCgoJdW5zaWduZWQgaW50IGFyZ2NfY291bnQ9MTsKCXVuc2lnbmVkIGludCAgcGFyYV9tZXRlclszMF09ezAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsfTsKCXdoaWxlKGFyZ2NfY291bnQ8YXJnYykKCXtwYXJhX21ldGVyW2FyZ2NfY291bnQtMV09IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbYXJnY19jb3VudF0sICZlbmRwLCAwKTsKCWlmICgqYXJndlthcmdjX2NvdW50XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCXBhcmFfbWV0ZXJbYXJnY19jb3VudC0xXSA9IDA7Cgl9CglhcmdjX2NvdW50Kys7Cgl9CgoJdWludDMyX3QgZG1jX3Rlc3Rfc3RhcnRfYWRkPXBhcmFfbWV0ZXJbMF07Cgl1aW50MzJfdCBkbWNfdGVzdF9zdGFydF9lbmQ9cGFyYV9tZXRlclsxXTsKCXVpbnQzMl90IHRlc3Rfd3JpdGVfbG9vcHM9cGFyYV9tZXRlclsyXTsKCXVpbnQzMl90IHRlc3RfcmVhZF9sb29wcz1wYXJhX21ldGVyWzNdOwojZGVmaW5lIERNQ19URVNUX1NUQVJUX0FERF9ERUZBVUxUICAgMTw8MjAKI2RlZmluZSBETUNfVEVTVF9FTkRfQUREX0RFRkFVTFQgICA1MTI8PDIwCiNkZWZpbmUgRE1DX1RFU1RfV1JJVEVfTE9PUF9ERUZBVUxUICAgMQojZGVmaW5lIERNQ19URVNUX1JFQURfTE9PUF9ERUZBVUxUICAgMQpkbWNfdGVzdF9zdGFydF9hZGQ9ZG1jX3Rlc3Rfc3RhcnRfYWRkP2RtY190ZXN0X3N0YXJ0X2FkZDpETUNfVEVTVF9TVEFSVF9BRERfREVGQVVMVDsKZG1jX3Rlc3Rfc3RhcnRfZW5kPWRtY190ZXN0X3N0YXJ0X2VuZD9kbWNfdGVzdF9zdGFydF9lbmQ6RE1DX1RFU1RfRU5EX0FERF9ERUZBVUxUOwp0ZXN0X3dyaXRlX2xvb3BzPXRlc3Rfd3JpdGVfbG9vcHM/dGVzdF93cml0ZV9sb29wczpETUNfVEVTVF9XUklURV9MT09QX0RFRkFVTFQ7CnRlc3RfcmVhZF9sb29wcz10ZXN0X3JlYWRfbG9vcHM/dGVzdF9yZWFkX2xvb3BzOkRNQ19URVNUX1JFQURfTE9PUF9ERUZBVUxUOwoKd2hpbGUoKHRlc3Rfd3JpdGVfbG9vcHMpfHwodGVzdF9yZWFkX2xvb3BzKSkKewoKaWYodGVzdF93cml0ZV9sb29wcykKZGRyX2Jpc3RfdGVzdF9lcnJvcj1kbWNfZGRyX3Rlc3QoZHJhbV9iYXNlLDEsMCwwLHRlc3Rfc2l6ZSwxLDApK2Rkcl9iaXN0X3Rlc3RfZXJyb3I7CgoKX3VkZWxheSh0ZXN0X2RlbGF5X3RpbWVfbXMqMTAwMCk7CgoKCgojaWZkZWYgQ0ZHX0VOQUJMRV9ERFJfRE1DX1RFU1QKaWYodGVzdF9yZWFkX2xvb3BzKQpkZHJfYmlzdF90ZXN0X2Vycm9yPWRtY19kZHJfdGVzdChkcmFtX2Jhc2UsMCwxLDEsdGVzdF9zaXplLDEsMCkrZGRyX2Jpc3RfdGVzdF9lcnJvcjsKc2VyaWFsX3B1dHMoIlxuZG1jIGZ1bGwgdGVzdCByZXN1bHQ9PSIpOwpzZXJpYWxfcHV0X2RlYyhkZHJfYmlzdF90ZXN0X2Vycm9yKTsKc2VyaWFsX3B1dHMoIlxuIik7CiNlbmRpZgppZih0ZXN0X3dyaXRlX2xvb3BzKQp0ZXN0X3dyaXRlX2xvb3BzLS07CmlmKHRlc3RfcmVhZF9sb29wcykKdGVzdF9yZWFkX2xvb3BzLS07Cn0KCnsKCnVpbnQxNl90CWRxX2JpdF9kZWxheVs3Ml07CnVuc2lnbmVkCWNoYXIgdF9jb3VudD0wOwp1aW50MTZfdCAgZGVsYXlfb3JnPTA7CnVpbnQxNl90ICBkZWxheV90ZW1wPTA7CnVpbnQzMl90ICBhZGRfb2Zmc2V0PTA7CmR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMHgwKTsKCgl7cHJpbnRmKCJcbiB3cml0ZSBkcV9iaXQgZGVsYXkgKiAxLzMyVUkiKTsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KDB4YzArKCh0X2NvdW50JTkpPDw4KSsodF9jb3VudC8zNikpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlZCAlZCIsdF9jb3VudCxkZWxheV90ZW1wKTsKCQl9Cgl9Cgp9CgoKCgoKCgpyZXR1cm4gMTsKKi8KCn0KI2VuZGlmCgojaWYgMAppbnQgZG9fZGRyX3Vib290X3dpbmRvd19nMTJhX3VzZV9zb3VyY2VfdGVzdF9hZGRfY2xrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbnNldGVudiBib290Y21kIGRkcl90ZXN0X2NtZCAweDM2IDQgNiAgNjAgMCAweDEwMDAwMCAweDQwMDAwMDAgIDAgMHgxMDAwMTAgMFxuIik7CglwcmludGYoIlxuRW50ZXIgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlIGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiXG4tLS0gd2F0Y2hkb2cgc2hvdWxkID4xNXNcbiIpOwoKI2RlZmluZSBERFJfVEVTVF9OVUxMICAwCiNkZWZpbmUgRERSX1RFU1RfUEFTUyAgMQojZGVmaW5lIEREUl9URVNUX0ZBSUwgMgoKCiNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICAgNCAgLy8gUFJFR19TVElDS1lfUkVHNAojZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgICA1ICAvLzQ1Ly8gUFJFR19TVElDS1lfUkVHNAoJLy9QUkVHX1NUSUNLWV9SRUc0CgkvL1BSRUdfU1RJQ0tZX1JFRzUKCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX1VCT09UX09OR09JTkcgICAxCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCAyCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkcgIDMKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSCA0CgkvLyNkZWZpbmUgRERSX1RFU1RfRkFJTCAyCgoKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsYW5lX2Rpc2FibGU9IDA7Cgl1bnNpZ25lZCBpbnQgICBkYXRhX3NvdXJjZT0gMDsKCXVuc2lnbmVkIGludCAgZGRyX2RhdGFfdGVzdF9zaXplPTB4MTAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX2FkZF90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfY2xlYXJfZmxhZz0wOwoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9pbml0X29mZnNldD0wOwoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2s9MDsKCgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3Vib290X2xvb3A9MDsKCgl1bnNpZ25lZCBpbnQgIGtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcz02MDsKCXVuc2lnbmVkIGludCAgdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7CgoJLy91aW50MzJfdCAgIHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGU9MDsKCXVpbnQzMl90ICAgc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4PTA7Cgl1aW50MzJfdCAgIHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZT0wOwoKCWNoYXIgc3RyWzEwMjRdPSIiOwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7ICAvL2ZvciBxdWljayBvdXQgb2YgZXJyb3IKCWlmIChhcmdjID4xKSB7CgkJZGF0YV9zb3VyY2UgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGF0YV9zb3VyY2U9IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMTU7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkvL3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CglpZiAoYXJnYyA+MykgewoJCWtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3M9IHdhdGNoZG9nX3RpbWVfczsKCQl9Cgl9CglwcmludGYoImtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcz09JWRcbiIsa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCS8vbGFuZV9kaXNhYmxlPWdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfdGVzdF9sYW5lX2Rpc2FibGU7CglpZiAoYXJnYyA+NCkgewoJCWxhbmVfZGlzYWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlsYW5lX2Rpc2FibGU9IDA7CgkJfQoJfQoJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PTB4JTA4eFxuIixsYW5lX2Rpc2FibGUpOyAgIAoKCWlmIChhcmdjID41KSB7CgkJZGRyX2RhdGFfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9kYXRhX3Rlc3Rfc2l6ZT0gMHgxMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfZGF0YV90ZXN0X3NpemU9PTB4JTA4eFxuIixkZHJfZGF0YV90ZXN0X3NpemUpOwoJaWYgKGFyZ2MgPjYpIHsKCQlkZHJfYWRkX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfYWRkX3Rlc3Rfc2l6ZT0gMHgxMDAwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl9hZGRfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2FkZF90ZXN0X3NpemUpOwoKCWlmIChhcmdjID43KSB7CgkJZGRyX3Rlc3RfY2xlYXJfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9jbGVhcl9mbGFnPSAweDEwMDAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX3Rlc3RfY2xlYXJfZmxhZz09MHglMDh4XG4iLGRkcl90ZXN0X2NsZWFyX2ZsYWcpOwoKCWlmIChhcmdjID44KSB7CgkJZGRyX3Rlc3RfaW5pdF9vZmZzZXQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfaW5pdF9vZmZzZXQ9IDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfdGVzdF9pbml0X29mZnNldD09MHglMDh4XG4iLGRkcl90ZXN0X2luaXRfb2Zmc2V0KTsKCglpZiAoYXJnYyA+OSkgewoJCWRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzayA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls5XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2s9IDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2s9PTB4JTA4eFxuIixkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2spOwoKCWlmIChhcmdjID4xMCkgewoJCWRkcl90ZXN0X3Vib290X2xvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTBdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEwXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF91Ym9vdF9sb29wPSAwOwoJCX0KCX0KCXByaW50ZigiZGRyX3Rlc3RfdWJvb3RfbG9vcD09MHglMDh4XG4iLGRkcl90ZXN0X3Vib290X2xvb3ApOwoKCWlmIChhcmdjID4xMSkgewoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD0gMDsKCQl9Cgl9CglwcmludGYoInN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD09MHglMDh4XG4iLHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleCk7CgoKCXVuc2lnbmVkIGludCByYW5rX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4PTEwOwoJdW5zaWduZWQgaW50IG51bV9hcnJheVsxMF07Ly84IGZsYWcgMzJfZGF0YSBhZGRfOCAgMzJfZGF0YSBhZGRfOAoKCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MDsKCS8vdW5zaWduZWQgaW50IGxjZGxyX21pbj0wOwoJLy91bnNpZ25lZCBpbnQgbGNkbHJfbWF4PTA7CgltZW1zZXQobnVtX2FycmF5LCAwLCBzaXplb2YobnVtX2FycmF5KSk7CgkvL2NoYXIgc3RyWzEwMjRdPSIiOwoKCglkZHJfdGVzdF9kYXRhX2FycmF5X21heD04OwoKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg7IHRlbXBfY291bnQrKykgCgl7CgkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEICk7CgkJcHJpbnRmKCJyZWFkIG51bWFycnlbJWRdPT0lZFxuIix0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9CgoJdW5zaWduZWQgaW50IHJlZ19kZWZfdmFsdWVfZGF0YVs0XTsgLy93cml0ZV9sY2Rscl92YWx1ZStyZWFkX2xjZGxyX3ZhbHVlPDwxNjsKCgkvLyNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICAgNCAgLy8gUFJFR19TVElDS1lfUkVHNAoJLy8jZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgICA1ICAvLzQ1Ly8gUFJFR19TVElDS1lfUkVHNAoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldCA9MDsgIC8vdXNlIGZvciBrZXJuZWwKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0ID0wOyAvL3VzZSBmb3Iga2VybmVsCgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X2xjZGxyX29mZnNldCA9MDsgLy9sZWZ0X2xjZGxyK3JpZ2h0X2xjZGxyPDwxNiAKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sID0wOyAvL2xlZnRfbGNkbHIKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPTA7IC8vcmlnaHRfbGNkbHIKCXVuc2lnbmVkIGludCAgZGVsYXlfc3RlcF94MTAwPSAwOwoKCS8vdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxID0wOwoJLy91bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMiA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xjZGxyX3RlbXBfdmFsdWUgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcgPTA7CgoKCXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnPTA7CglyZWdfZGVmX3ZhbHVlX2RhdGFbMF09bnVtX2FycmF5WzBdOwoJcmVnX2RlZl92YWx1ZV9kYXRhWzFdPW51bV9hcnJheVsxXTsKCXJlZ19kZWZfdmFsdWVfZGF0YVsyXT1udW1fYXJyYXlbMl07CglyZWdfZGVmX3ZhbHVlX2RhdGFbM109bnVtX2FycmF5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9bnVtX2FycmF5WzRdOwoJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1udW1fYXJyYXlbNV07Cgl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPW51bV9hcnJheVs2XTsKCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PW51bV9hcnJheVs3XTsKCgoKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzBdPT0weCUwOHhcbiIsbnVtX2FycmF5WzBdKTsKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzFdPT0weCUwOHhcbiIsbnVtX2FycmF5WzFdKTsKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzJdPT0weCUwOHhcbiIsbnVtX2FycmF5WzJdKTsKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzNdPT0weCUwOHhcbiIsbnVtX2FycmF5WzNdKTsKCXByaW50ZigidGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzRdKTsKCXByaW50ZigidGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0lZFxuIixudW1fYXJyYXlbNV0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPSVkXG4iLG51bV9hcnJheVs2XSk7CglwcmludGYoIlxudGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9MHglMDh4XG4iLG51bV9hcnJheVs3XSk7CgoKCgoJLy9mb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgkvLwl7CgkvLwkgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJLy8gCSB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkvL30KCgoJaWYoZGRyX3Rlc3RfY2xlYXJfZmxhZykKCXsgICAgICAgICAgICB0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTA7CgkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCXRlbXBfY291bnQ9NjsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJcHJpbnRmKCJcbiBjbGVhciBzdGlja3kgcmVnaXN0ZXIgc2hvdWxkIHJlc2V0LHRoZW4gb3ZlciB3cml0ZSAuLi4uXG4iKTsKCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCXdoaWxlKDEpOwoJfQoKCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTApCgl7CgkJewoKCQkJLy90ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTE7CgoKCQkJLy9mb3IgKHRlbXBfY291bnQgPSAwOyB0ZW1wX2NvdW50IDwgKDgpOyB0ZW1wX2NvdW50KyspICAgLy9kYXRhCgoJCQl7CgkJCQl0ZW1wX2NvdW50PXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleDsKCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZTE9ZG9fZGRyX2cxMl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LHRlbXBfY291bnQsdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJLy9yZWdfZGVmX3ZhbHVlX2RhdGFbM109dGVzdF9sY2Rscl90ZW1wX3ZhbHVlMTsKCQkJCXJlZ19kZWZfdmFsdWVfZGF0YVszXT10ZXN0X2xjZGxyX3RlbXBfdmFsdWUxOwoJCQkJbnVtX2FycmF5WzNdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzNdCQk7CgkJCQlwcmludGYoIm51bV9hcnJheVslZF09JTA4eFxuIiwzLG51bV9hcnJheVszXSk7CgkJCX0KCgkJfQoJCXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PTA7CgkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0wOwoJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9MDsKCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0wOwoJCWlmKGRkcl90ZXN0X2luaXRfb2Zmc2V0KQoJCXt0ZXN0X2FyZ183X2xjZGxyX29mZnNldD1kZHJfdGVzdF9pbml0X29mZnNldDsKCQl9CgkJLy9udW1fYXJyYXlbMF0JPQlyZWdfZGVmX3ZhbHVlX2RhdGFbMF0JCTsKCQkvL251bV9hcnJheVsxXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVsxXQkJOwoJCS8vbnVtX2FycmF5WzJdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzJdCQk7CgkJbnVtX2FycmF5WzNdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzNdCQk7CgkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsgIC8vdXNlIGZvciBrZXJuZWwKCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7Ly91c2UgZm9yIGtlcm5lbAoJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoKCgoJCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCQl7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJfQoKCgl9CgllbHNlCgl7CgkJLy9mb3IgKHRlbXBfY291bnQgPSAwOyB0ZW1wX2NvdW50IDwgKDgpOyB0ZW1wX2NvdW50KyspICAgLy9kYXRhCgkJewoJCQkvL3RlbXBfY291bnQ9NDsKCQkJLy90ZXN0X2xjZGxyX3RlbXBfdmFsdWUxPWRvX2Rkcl9nMTJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCx0ZW1wX2NvdW50LHRlc3RfbGNkbHJfdGVtcF92YWx1ZTEsRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJLy90ZW1wX2NvdW50PXRlbXBfY291bnQrMTsKCQkJLy90ZW1wX2NvdW50PTU7CgkJCS8vdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMj1kb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKHRlbXBfY291bnQpLHRlc3RfbGNkbHJfdGVtcF92YWx1ZTIsRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJLy9yZWdfZGVmX3ZhbHVlX2RhdGFbM109dGVzdF9sY2Rscl90ZW1wX3ZhbHVlMXwodGVzdF9sY2Rscl90ZW1wX3ZhbHVlMjw8MTYpOwoJCQkvL251bV9hcnJheVszXT1yZWdfZGVmX3ZhbHVlX2RhdGFbM107CgkJCXByaW50ZigicmUtbnVtX2FycmF5WyVkXT0lMDh4XG4iLDMsbnVtX2FycmF5WzNdKTsKCQl9Cgl9CgoJaWYoZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrJjEpCgl7cHJpbnRmKCJza2lwIHVib290IHRlc3Qgc2hvdWxkIGluaXQga2VybmVsIG9mZnNldCAgdmFsdWU9PTB4JTA4eFxuIixudW1fYXJyYXlbN10pOwoJfQoKCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7Cgl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSgodGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ+PjE2KSYweGZmZmYpOwoJdW5zaWduZWQgaW50IGxhbmVfc3RlcF9jb3VudD0wOwoJewoKCQl7CgkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfZGF0YV90ZXN0X3NpemU7CgoJCX0KCgkJcHJpbnRmKCJyZWdfZGVmX3ZhbHVlX2RhdGFbMF09PTB4JTA4eFxuIixudW1fYXJyYXlbMF0pOwoJCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzFdPT0weCUwOHhcbiIsbnVtX2FycmF5WzFdKTsKCQlwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsyXT09MHglMDh4XG4iLG51bV9hcnJheVsyXSk7CgkJcHJpbnRmKCJyZWdfZGVmX3ZhbHVlX2RhdGFbM109PTB4JTA4eFxuIixudW1fYXJyYXlbM10pOwoJCXByaW50ZigidGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzRdKTsKCQlwcmludGYoInRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzVdKTsKCQlwcmludGYoInRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9JWRcbiIsbnVtX2FycmF5WzZdKTsKCQlwcmludGYoInRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSVkXG4iLG51bV9hcnJheVs3XSk7CgoJCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTQpIC8vdWJvb3QgZmluaXNoCgkJewoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgoJCQkvLyB1bnNpZ25lZCBpbnQgICBhY21kbHI9IDA7CgoKCQkJewoJCQkJLy9hY21kbHI9ZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJCQl1bnNpZ25lZCBpbnQgYWNtZGxyPTMyOwoJCQkJZGVsYXlfc3RlcF94MTAwPTEwMCoxMDAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKjMyKTsgLy8xMDAqLzMyIHBzCgkJCQlwcmludGYoIlxuYWNtZGxyPTB4JTA4eC0tPmRlYyAlZCxkZHIgY2xrPT0lZCxzdGVwPSVkIHBzLDEwc3RlcD0lZCBwcywxMDBzdGVwPSVkIHBzLFxuIixhY21kbHIsYWNtZGxyLGdsb2JhbF9kZHJfY2xrLAoJCQkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCgkJCQlwcmludGYoIlxubGNkX29mZnNldD0weCUwOHgsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JTRkICAgLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9JTRkICAgIix0ZXN0X2FyZ183X2xjZGxyX29mZnNldCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IpOwoJCQkJcHJpbnRmKCJcbmxjZF9vZmZzZXQ9MHglMDh4LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSU0ZCBwcyx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSU0ZCBwcyIsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCpkZWxheV9zdGVwX3gxMDAvMTAwLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IqZGVsYXlfc3RlcF94MTAwLzEwMCk7CgoJCQkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgoKCQkJfQoJCQlpZihkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2smMikKCQkJewoJCQkJaWYoZGRyX3Rlc3RfdWJvb3RfbG9vcCkKCQkJCXsKCQkJCQl7ICAgICAgICAgICAgdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0wOwoJCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcHJpbnRmKCJcbiBjbGVhciBzdGlja3kgcmVnaXN0ZXIgc2hvdWxkIHJlc2V0LHRoZW4gb3ZlciB3cml0ZSAuLi4uXG4iKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlCgkJCQkJcmV0dXJuIDE7CgkJCX0KCQl9CgoKCgkJLy9pZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MCkpICAgLy8wIHRlc3QgbGVmdCBlZGdlIGJlZ2luICAgICAxIHRlc3QgbGVmdCBlZGdlIG9uZ29pbmcgICAgIDIvL2xlZnRfZmluaXNoICAgICAzIHJpZ2h0IGVkZ2Ugb25nb2luZyAgICA0IHJpZ2h0IGZpbmlzaCAgLy81IGtlcm5lbCBsZWZ0IGVkZ2Ugb25nb2luZyA2IGtlcm5lbCBsZWZ0IGZpbmlzaCAgICA3IGtlcm5lbCByaWdodCBvbmdvaW5nCgkJLy8gIHVib290IGZpbmQgZnJvbSBwYXNzIHRvIGZhaWwgb2Zmc2V0IDAtPm1heAoJCS8va2VybmVsIGZpbmQgZnJvbSBmYWlsIHRvIHBhc3Mgb2Zmc2V0IGZyb20gbWF4IC0+MCAKCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1czw0KSkgIC8vLy8gIHVib290IGZpbmQgZnJvbSBwYXNzIHRvIGZhaWwgb2Zmc2V0IDAtPm1heAoJCXsKCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTApfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MikKCQkJCQl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT00KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTYpCgkJCSAgKQoJCQl7CgkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsKCQkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl9CgoJCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCXsKCQkJCWlmKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX1BBU1MpIC8vcGFzcyAyIGVycm9yIDEKCQkJCXsKCQkJCQkvLwl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsKCgkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9OVUxMOwoJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQl7CgoJCQkJCQkvLyBmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQl7CgkJCQkJCQlsYW5lX3N0ZXBfY291bnQ9NjsKCQkJCQkJCS8vaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8PXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJewoJCQkJCQkJCQl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz10ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZysxOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCS8qCgkJCQkJCQkgICBpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJICAgewoJCQkJCQkJICAgaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJICAgewoJCQkJCQkJICAgdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCSAgIH0KCQkJCQkJCSAgIH0KCQkJCQkJCSAgICovCgoJCQkJCQl9CgoKCgoJCQkJCX0KCQkJCQlpZih0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZykKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwkJCQoJCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJfQoKCQkJCWVsc2UgCWlmKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX0ZBSUwpIC8vcGFzcyAxIGVycm9yIDIKCQkJCXsKCgkJCQkJLy8gIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7CgkJCQkJLy8gdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0oKHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0Pj4xNikmMHhmZmZmKTsKCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sLTE7CgkJCQkJfQoJCQkJCWVsc2UgCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCQkJewoJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3ItMTsgIAoJCQkJCX0KCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbHwodGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjw8MTYpKTsKCQkJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoJCQkJCXRlbXBfY291bnQ9NzsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCgkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9OVUxMOwoJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsJCQkKCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQl9CgoKCQkJLy8odGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD09RERSX1RFU1RfTlVMTCkKCQkJLy8gICAgdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXQmMHhmZmZmKTsKCQkJLy8gdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0oKHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0Pj4xNikmMHhmZmZmKTsKCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJewoJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKzE7CgkJCX0KCQkJZWxzZSAJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCXsKCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcisxOyAgCgkJCX0KCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2x8KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I8PDE2KSk7CgkJCW51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0CQk7CgkJCXRlbXBfY291bnQ9NzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsgIC8vcGFzcyAyIGVycm9yIDEKCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTU7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgoJCQl7CgoJCQkJLy8gZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCXsKCQkJCQlsYW5lX3N0ZXBfY291bnQ9NjsKCQkJCQlwcmludGYoIlxuICAgICAgICAgICAgICAgICAgICAobnVtX2FycmF5WyVkXSkgPT0lMDh4IFxuIixsYW5lX3N0ZXBfY291bnQvMiwobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSkpOwoJCQkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSkpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJewoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZiktdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbDsKCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQl7dGVzdF9sY2Rscl90ZW1wX3ZhbHVlPTA7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKS10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sOwoJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCXt0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9MDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJCQl7CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKSt0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yOwoJCQkJCQl9CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZikrdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjsKCgkJCQkJCX0KCQkJCQl9CgoKCQkJCQl7CgkJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZT10ZXN0X2xjZGxyX3RlbXBfdmFsdWU7CgkJCQkJCXNwcmludGYoc3RyLCJnMTJfZDJwbGwgICVkICAweCUwOHggMHglMDh4IixnbG9iYWxfZGRyX2NsaywoIHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleCksCgkJCQkJCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlKTsKCQkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJCS8vICAgICAgICAgIHJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoKCQkJCQl9CgkJCQkJLy8gCWRvX2Rkcl9nMTJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJLy8JKHRlc3RfbGNkbHJfdGVtcF92YWx1ZSksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgoKCgoJCQl9CgoJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM+NCkKCQkJewoJCQkJLy9kZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJLy8gIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCS8vIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCS8vIHRlbXBfY291bnQ9NTsKCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCXdoaWxlKDEpOwoJCQl9IGVsc2UKCQkJewoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQl9CgoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCgoJCQkJewoJCQkJCS8vd3JpdGUgb3JnIHZhbHVlCgkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQl7CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTsKCQkJCQkJfQoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpOwoJCQkJCQl9CgkJCQkJCWRvX2Rkcl9nMTJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJKHRlc3RfbGNkbHJfdGVtcF92YWx1ZSksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCgoKCQkJCX0KCgkJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQl0ZW1wX2NvdW50PTU7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl3aGlsZSgxKTsKCgoKCgoJCQl9CgkJfQoKCgkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTQpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NikpCgkJewoJCQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIOwoJCQludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTQ7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7Ly9ERFJfVEVTVF9OVUxMOwoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCXRlbXBfY291bnQ9NTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJfQoJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPj00KSkgICAvLy8va2VybmVsIGZpbmQgZnJvbSBmYWlsIHRvIHBhc3Mgb2Zmc2V0IGZyb20gbWF4IC0+MCAKCQl7CgkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTIpCgkJCQkJfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT02KQoJCQkgICkKCQkJewoJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09Myl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQl7CgkJCQlpZih0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9QQVNTKSAvL3Bhc3MgMiBlcnJvciAxCgkJCQl7CgkJCQkJLy8JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJewoKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8PXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJewoJCQkJCQkJCQl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz10ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZysxOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9CgoKCgoJCQkJCX0KCQkJCQkvLyBpZih0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZykKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwkJCQoJCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJfQoKCQkJCWVsc2UgCWlmKCh0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9GQUlMKSAKCQkJCQkJLy98fCh0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9OVUxMKSkvL3Bhc3MgMiBlcnJvciAxCgkJCQkJKQoJCQkJCXsKCgkJCQkJCS8vICB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldCYweGZmZmYpOwoJCQkJCQkvLyB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSgodGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ+PjE2KSYweGZmZmYpOwoJCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wtMTsKCQkJCQkJfQoJCQkJCQllbHNlIAlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3ItMTsgIAoJCQkJCQl9CgkJCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sfCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPDwxNikpOwoJCQkJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoJCQkJCQl0ZW1wX2NvdW50PTc7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCgkJCQkJCS8vIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOwoJCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJCX0KCQkJCWVsc2UgaWYgKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX05VTEwpLy9wYXNzIDIgZXJyb3IgMQoJCQkJe3ByaW50ZigiXG5maW5kIGRyb3AgcG93ZXIsdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0lZCBcbiIsdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldCk7CgkJCQl9CgoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQl7CgoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJewoJCQkJCQlwcmludGYoIlxuICAgICAgICAgICAgICAgICAgICAobnVtX2FycmF5WyVkXSkgPT0lMDh4IFxuIixsYW5lX3N0ZXBfY291bnQvMiwobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSkpOwoJCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCQl7CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKS10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sOwoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKS10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sOwoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZikrdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjsKCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKSt0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yOwoKCQkJCQkJCX0KCQkJCQkJfQoKCgoJCQkJCQlkb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCSh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgoKCgkJCQl9CgoJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJaWYodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz40KQoJCQkJewoJCQkJCS8vZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUoa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJLy8gIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkvLyBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJLy8gdGVtcF9jb3VudD01OwoJCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfSBlbHNlCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJfQoKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXsKCQkJCQkJLy93cml0ZSBvcmcgdmFsdWUKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik7CgkJCQkJCQl9CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZik7CgkJCQkJCQl9CgkJCQkJCQlkb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkodGVzdF9sY2Rscl90ZW1wX3ZhbHVlKSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQkJCQkJCQkgCgoJCQkJCX0KCgkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgoJCQkJfQoJCQl9CgkJfQoJfQoKCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM+PTgpIC8vZmluaXNoCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgoKCgkJewoJCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQkJdV9pbnQzMl90IGFjbWRscj0zMjsKCQkJZGVsYXlfc3RlcF94MTAwPTEwMCoxMDAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKmFjbWRscik7CgkJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgoJCQlwcmludGYoIlxubGNkX29mZnNldD0weCUwOHgsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JTRkICAgLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9JTRkICAgIix0ZXN0X2FyZ183X2xjZGxyX29mZnNldCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IpOwoJCQlwcmludGYoIlxubGNkX29mZnNldD0weCUwOHgsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JTRkIHBzLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9JTRkIHBzIix0ZXN0X2FyZ183X2xjZGxyX29mZnNldCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKmRlbGF5X3N0ZXBfeDEwMC8xMDAsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcipkZWxheV9zdGVwX3gxMDAvMTAwKTsKCQkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgoJCQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSDsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD00OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCX0KCgl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTB4ZmZmZjsKCXsKCQkvLwl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsKCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJdGVtcF9jb3VudD02OwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCX0KCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkvLyAgdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOyAgLy9wYXNzIDIgZXJyb3IgMQoJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJd2hpbGUoMSk7CglyZXR1cm4gMTsKfQojZW5kaWYgCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgppbnQgZG9fZGRyX2cxMl9vdmVycmlkZV9kYXRhKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCS8vZGRyX3Rlc3RfY21kIDB4MjUgMSAxICAxMCAxMCAxMCAxMCAxMCAxMCAxMCAxMCAxMCAxMAoKCXByaW50ZigiXDEybm0gcGh5IHJlYWQgd3JpdGUgcmVnaXN0ZXIgc2hvdWxkIGNsb3NkIGFwZCBhbmQgYXNyIGZ1bmNpdG9uXG4iKTsKCXdyaXRlbCgoMCksIDB4ZmY2Mzg2MzApOwoJd3JpdGVsKCgwKSwgMHhmZjYzODYzNCk7CiNkZWZpbmUgIEcxMl9EQVRBX1JFQURfT0ZGU0VUX01BWCAgICgwWDNGKQojZGVmaW5lICBHMTJfREFUQV9XUklURV9PRkZTRVRfTUFYICAgKDBYM0YrNyozMikKCiNpZiAxCgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJY2hhciAqZW5kcDsKCS8vcmFua19pbmRleCAgZHFfaW5kZXggIHdyaXRlX3JlYWQgbGVmdC9yaWdodCAgb2Zmc2V0X3ZhbHVlCgl1bnNpZ25lZCBpbnQgdGVzdF9pbmRleD0wOyAvLyAxIGFjICwweDIsIHdyaXRlIGRxcyAsMHg0LHJlYWQgZHFzLDB4OCx3cml0ZSBkcSwweDEwIHJlYWQgZHEKCXVuc2lnbmVkIGludCBkcV9pbmRleD0wOyAgLy8wLTggcmFuazAgbGFuZTAgLHJhbmswIDktMTcgbGFuZTEscmFuazAgMTgtMjYgbGFuZTIsIHJhbmswIDI3LTM1IGxhbmUzLCAgMzYrMC04IHJhbmsxIGxhbmUwICxyYW5rMSAgMzYrOS0xNyBsYW5lMSxyYW5rMSAgMzYrMTgtMjYgbGFuZTIsIHJhbmsxICAzNisyNy0zNSBsYW5lMwoJLy8JdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18xPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4CgkvLwl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzI9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCS8vCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMz0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy91bnNpZ25lZCBpbnQgd3JpdGVfcmVhZF9mbGFnPTA7Ly8gMiB3cml0ZSAsMSByZWFkICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkxICAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgoJLy8gICAgdW5zaWduZWQgaW50IGxlZnRfcmlnaHRfZmxhZz0wOy8vICAxIGxlZnQgLDIgcmlnaHQgICAjZGVmaW5lICBERFJfUEFSQU1FVEVSX0xFRlQJCTEgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCXVuc2lnbmVkIGludCBvdnJyaWRlX3ZhbHVlPTA7Ly8KCgkvLyAgIHVuc2lnbmVkIGludCBvZmZzZXRfZW5hYmxlPTA7Ly8KCgkvLwkgdW5zaWduZWQgaW50IHRlbXBfdmFsdWU9MDsvLwoJdW5zaWduZWQgaW50IGNvdW50PTA7CgkvLwl1bnNpZ25lZCBpbnQgY291bnQxPTA7CgkvLwl1bnNpZ25lZCBpbnQgY291bnRfbWF4PTA7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfbWF4PTA7CgkvLwl1bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy8JdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoKCWlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJfQoJZWxzZSBpZiAgKGFyZ2MgPjQpCgl7Ly9vZmZzZXRfZW5hYmxlPTE7CgoJCXsKCQkJY291bnQ9MDsKCQkJdGVzdF9pbmRleD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfaW5kZXggPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCWRxX2luZGV4PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJZHFfaW5kZXggPSAwOwoJCQl9CgoJCX0KCgoKCQl7CgkJCWNvdW50Kys7CgkJCW92cnJpZGVfdmFsdWU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlvdnJyaWRlX3ZhbHVlID0gMDsKCQkJfQoKCQl9CgoKCX0KCWVsc2UgeyAKCQlyZXR1cm4gMTsKCX0KCXByaW50ZigibGNkbHJfbWF4ICVkLFxuIixsY2Rscl9tYXgpOwoKCXsKCgoJCXsKCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZSh0ZXN0X2luZGV4LAoJCQkJCQlkcV9pbmRleCwKCQkJCQkJb3ZycmlkZV92YWx1ZSk7CgkJCX0KCgkJfQoJfQoKCiNlbmRpZgoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl9nMTJfb3ZlcnJpZGVfZGF0YSwJMjAsCTEsCWRvX2Rkcl9nMTJfb3ZlcnJpZGVfZGF0YSwKCSJkZHJfZzEyX292ZXJyaWRlX2RhdGEgIDEgMCAgMCAwICAxIDMiLAoJImRkcl9nMTJfb3ZlcnJpZGVfZGF0YSAgdGVzdF9pbmRleCAgZHFfaW5kZXggb3ZycmlkZV92YWx1ZSAgIFxuIgopOwppbnQgZG9fZGRyX2cxMl9vZmZzZXRfZGF0YShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCgkvL2Rkcl90ZXN0X2NtZCAweDI1IDEgMSAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAKCgojZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKI2RlZmluZSAgRzEyX0RBVEFfV1JJVEVfT0ZGU0VUX01BWCAgICgwWDNGKzcqMzIpCglwcmludGYoIlwxMm5tIHBoeSByZWFkIHdyaXRlIHJlZ2lzdGVyIHNob3VsZCBjbG9zZCBhcGQgYW5kIGFzciBmdW5jaXRvblxuIik7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjMwKTsKCXdyaXRlbCgoMCksIDB4ZmY2Mzg2MzQpOwojaWYgMQoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCWNoYXIgKmVuZHA7CgkvL3JhbmtfaW5kZXggIGRxX2luZGV4ICB3cml0ZV9yZWFkIGxlZnQvcmlnaHQgIG9mZnNldF92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfaW5kZXg9MDsgLy8gMSBhYyAsMHgyLCB3cml0ZSBkcXMgLDB4NCxyZWFkIGRxcywweDgsd3JpdGUgZHEsMHgxMCByZWFkIGRxCgkvLyAgdW5zaWduZWQgaW50IGRxX2luZGV4PTA7ICAvLzAtOCByYW5rMCBsYW5lMCAscmFuazAgOS0xNyBsYW5lMSxyYW5rMCAxOC0yNiBsYW5lMiwgcmFuazAgMjctMzUgbGFuZTMsICAzNiswLTggcmFuazEgbGFuZTAgLHJhbmsxICAzNis5LTE3IGxhbmUxLHJhbmsxICAzNisxOC0yNiBsYW5lMiwgcmFuazEgIDM2KzI3LTM1IGxhbmUzCgl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzE9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMj0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18zPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4CgkvL3Vuc2lnbmVkIGludCB3cml0ZV9yZWFkX2ZsYWc9MDsvLyAyIHdyaXRlICwxIHJlYWQgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9SRUFECTEgICAgICAjZGVmaW5lIAlERFJfUEFSQU1FVEVSX1dSSVRFCQkyCgl1bnNpZ25lZCBpbnQgbGVmdF9yaWdodF9mbGFnPTA7Ly8gIDEgbGVmdCAsMiByaWdodCAgICNkZWZpbmUgIEREUl9QQVJBTUVURVJfTEVGVAkJMSAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9SSUdIVAkJMgoJdW5zaWduZWQgaW50IG9mZnNldF92YWx1ZT0wOy8vCgoJLy8gICB1bnNpZ25lZCBpbnQgb2Zmc2V0X2VuYWJsZT0wOy8vCgoJLy8JIHVuc2lnbmVkIGludCB0ZW1wX3ZhbHVlPTA7Ly8KCXVuc2lnbmVkIGludCBjb3VudD0wOwoJLy91bnNpZ25lZCBpbnQgY291bnQxPTA7Cgl1bnNpZ25lZCBpbnQgY291bnRfbWF4PTA7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfbWF4PTA7CgkvLwl1bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy8JdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoKCgliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7Cgl1aV8xXzMyXzEwMHN0ZXA9KDEwMDAwMDAqMTAwLyhnbG9iYWxfZGRyX2NsayoyKjMyKSk7CgoJaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCgl9CgllbHNlIGlmICAoYXJnYyA+NikKCXsvL29mZnNldF9lbmFibGU9MTsKCgkJewoJCQljb3VudD0wOwoJCQl0ZXN0X2luZGV4PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9pbmRleCA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJdGVzdF9kcV9tYXNrXzE9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2RxX21hc2tfMSA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJdGVzdF9kcV9tYXNrXzI9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2RxX21hc2tfMiA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJdGVzdF9kcV9tYXNrXzM9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2RxX21hc2tfMyA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJbGVmdF9yaWdodF9mbGFnPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJbGVmdF9yaWdodF9mbGFnID0gMDsKCQkJfQoKCQl9CgkJewoJCQljb3VudCsrOwoJCQlvZmZzZXRfdmFsdWU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlvZmZzZXRfdmFsdWUgPSAwOwoJCQl9CgoJCX0KCgoJfQoJZWxzZSB7IAoJCXJldHVybiAxOwoJfQoJcHJpbnRmKCJsY2Rscl9tYXggJWQsXG4iLGxjZGxyX21heCk7CglpZihsZWZ0X3JpZ2h0X2ZsYWc9PUREUl9QQVJBTUVURVJfUklHSFQpCgkJcHJpbnRmKCJvZmZzZXQgcmlnaHQgKysgIGxlZnRfcmlnaHRfZmxhZyAlZCxcbiIsbGVmdF9yaWdodF9mbGFnKTsKCWlmKGxlZnRfcmlnaHRfZmxhZz09RERSX1BBUkFNRVRFUl9MRUZUKQoJCXByaW50Zigib2Zmc2V0IGxlZnQgLS1sZWZ0X3JpZ2h0X2ZsYWcgJWQsXG4iLGxlZnRfcmlnaHRfZmxhZyk7CgoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCWNvdW50X21heD0xMDsKCgkJbGNkbHJfbWF4PTMqMzI7Ly8weDNmZjsKCX0KCglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQljb3VudF9tYXg9MTY7CgoJCWxjZGxyX21heD0xNiozMjsvLzB4M2ZmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJY291bnRfbWF4PTE2OwoJCWxjZGxyX21heD05NjsvLzB4M2Y7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCWNvdW50X21heD0zNioyOwoJCWxjZGxyX21heD04KjMyOy8vMHgxZmY7Cgl9CglpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCWNvdW50X21heD0zNioyOwoJCWxjZGxyX21heD0weDNmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJY291bnRfbWF4PTM2KjE7CgkJbGNkbHJfbWF4PTB4M2Y7CgkJcHJpbnRmKCIgc29jIHZyZWYgcmFuazAgYW5kIHJhbmsxIHNoYXJlIHZyZWYgZGFjXG4iKTsKCX0KCgoKCWNvdW50PTA7Cglmb3IgKDtjb3VudDxjb3VudF9tYXg7Y291bnQrKykgewoJCWlmICgoY291bnQ8MzIpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMSYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgoY291bnQ+MzEpICYmIChjb3VudDw2MykpIHsKCQkJaWYgKHRlc3RfZHFfbWFza18yJigxPDwoY291bnQlMzIpKSkgewoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJaWYgKChjb3VudD42MykpIHsKCQkJaWYgKHRlc3RfZHFfbWFza18zJigxPDwoY291bnQlMzIpKSkgewoJCQkJY29udGludWU7CgkJCX0KCQl9CgoJCS8vCWZvciAoY291bnQxPTA7Y291bnQxPG9mZnNldF92YWx1ZTtjb3VudDErKykgCgkJewoJCQlpZihsZWZ0X3JpZ2h0X2ZsYWc9PUREUl9QQVJBTUVURVJfUklHSFQpCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzKHRlc3RfaW5kZXgsCgkJCQkJCWNvdW50LAoJCQkJCQkwLG9mZnNldF92YWx1ZSk7CgkJCX0KCQkJaWYobGVmdF9yaWdodF9mbGFnPT1ERFJfUEFSQU1FVEVSX0xFRlQpCgkJCXsKCQkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzKHRlc3RfaW5kZXgsCgkJCQkJCWNvdW50LAoJCQkJCQkxLG9mZnNldF92YWx1ZSk7CgkJCX0KCQl9Cgl9CgoKI2VuZGlmCglyZXR1cm4gMTsKfQoKClVfQk9PVF9DTUQoCglkZHJfZzEyX29mZnNldF9kYXRhLAkyMCwJMSwJZG9fZGRyX2cxMl9vZmZzZXRfZGF0YSwKCSJkZHJfZzEyX29mZnNldF9kYXRhICAxIDAgIDAgMCAgMSAzIiwKCSJkZHJfZzEyX29mZnNldF9kYXRhICB0ZXN0X2luZGV4ICBtYXNrMSBtYXNrMiBtYXNrMyAgbGVmdC9yaWdodCAgb2Zmc2V0X3ZhbHVlIFxuIgopOwoKI2VuZGlmCgoKI2lmIDAgClVfQk9PVF9DTUQoCglkZHJfZzEyX29mZnNldF9kYXRhX2xjZGxyLAkxMCwJMSwJZG9fZGRyX2cxMl9vZmZzZXRfZGF0YV9sY2RsciwKCSJkZHJfZzEyX29mZnNldF9kYXRhX2xjZGxyICAwIDEgIDIgIDIgIDMiLAoJImRkcl9nMTJfb2Zmc2V0X2RhdGFfbGNkbHIgIHJhbmtfaW5kZXggIGRxX2luZGV4ICB3cml0ZV9yZWFkIGxlZnQvcmlnaHQgIG9mZnNldF92YWx1ZSBcbiIKKTsKI2VuZGlmCmNoYXIgQ01EX1ZFUltdID0gIlZlcl8xMCI7CmludCBkb19kZHJfdGVzdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvL2Rkcl90ZXN0X3dhdGNoZG9nX2luaXQoNDAwMCk7CgkvL3ByaW50ZigiXG5vcGVuIHdhdGNoZG9nICVkbXNcbiIsNDAwMCk7CglwcmludGYoIlxuIGRkciB0ZXN0IGNtZCB2ZXJzaW9uPT0gJXNcbiIsIENNRF9WRVIpOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLwoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CglpZiAoKHN0cmNtcChhcmd2WzFdLCAiaCIpID09IDApKQoJCWdvdG8gdXNhZ2U7CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoJcHJpbnRmKCJcMTJubSBwaHkgcmVhZCB3cml0ZSByZWdpc3RlciBzaG91bGQgY2xvc2QgYXBkIGFuZCBhc3IgZnVuY2l0b25cbiIpOwoJd3JpdGVsKCgwKSwgMHhmZjYzODYzMCk7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjM0KTsKI2Vsc2UKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCgl1bnNpZ25lZCBpbnQgZGRyX3BsbCA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwwKTsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0wOwoJLy8jaWYoIENPTkZJR19ERFJfUEhZICAgPj1QX0REUl9QSFlfRzEyKQoJLy9kZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYShkZHJfcGxsKTsKCS8vI2Vsc2UKCWRkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCS8vI2VuZGlmCgkvLy8yKigoKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKSk7CgoJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CglnbG9iYWxfZGRyX2Nsaz1kZHJfY2xrOwoJdW5zaWduZWQgaW50IHpxMHByID0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCXByaW50ZigiXG5kZHJfenEwcHI9PSAweCUwOHhcbiIsIHpxMHByKTsKCiNlbmRpZgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoJdW5zaWduZWQgaW50IGRkcl9wbGwgPSByZF9yZWcoRzEyX0FNX0REUl9QTExfQ05UTDApOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPTA7CgkvLyNpZiggQ09ORklHX0REUl9QSFkgICA+PVBfRERSX1BIWV9HMTIpCgkvL2Rkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2Nsa19nMTJhKGRkcl9wbGwpOwoJLy8jZWxzZQoJZGRyX2Nsaz1wbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJLy8jZW5kaWYKCS8vLzIqKCgoMjQgKiAoZGRyX3BsbCYweDFmZikpLygoZGRyX3BsbD4+OSkmMHgxZikpPj4oKGRkcl9wbGw+PjE2KSYweDMpKTsKCglwcmludGYoIlxuZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCWdsb2JhbF9kZHJfY2xrPWRkcl9jbGs7CgkvLwl1bnNpZ25lZCBpbnQgenEwcHIgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJLy8JcHJpbnRmKCJcbmRkcl96cTBwcj09IDB4JTA4eFxuIiwgenEwcHIpOwojZW5kaWYKCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fTk9ORSAgIDAKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVCAgICAgICAgIDEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9BQ0xDRExSICAgICAgICAyCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfTUFYX0NMSyAgICAgMyAgIC8vZGRyX3Rlc3RfY21kIDMgMHg4MDAwMDAwIDMgMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX1pRICAgICA0CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfVlJFRiAgICA1CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0dYVFZCQl9DUk9TU1RBTEsgICAgNgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9CQU5EV0lEVEhfVEVTVCAgIDcKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfTENETFJfRU5WX1RVTkUgICA4CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX01PRElGWV9SRUdfVVNFX01BU0sgICA5CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0REUl9UVU5FX0FDX0NMSyAgIDB4YQoKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUWlEgICAweDEwCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfRFFTICAweDExCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9URVNUX1NUQVJUX0FERCAgMHgxMgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0JJVF9TRVRVUF9IT0xEX01BUkdJTiAgMHgxMwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0RBVEFfQklUX1NFVFVQX0hPTERfTUFSR0lOICAweDE0CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfQUNfTEFORV9CSVRfTUFSR0lOICAweDE1CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfRUVfVk9MVEFHRV9NRExSX1NURVAgIDB4MTYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EMlBMTF9DTUQgIDB4MTcKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EQVRBX0xBTkVfQklUX01BUkdJTiAgMHgxOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVFVORV9QSFlfVlJFRiAgIDB4MTkKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RVTkVfRFJBTV9WUkVGICAgMHgxQQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVFVORV9BQ19WUkVGICAgMHgxYgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMICAgMHgxYwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVEVTVF9TSElGVF9ERFJfRlJFUVVFTkNZICAweDFkCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9URVNUX0RBVEFfV1JUSUVfUkVBRCAgMHgxZQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX1BXTV9DTUQgICAgICAgICAgICAgIDB4MWYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9FRV9TSSAgICAgICAgICAgICAweDIwCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfVkREUV9TSSAgICAgICAgICAgICAweDIxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfRERSX0RBVEFfV0lORE9XX0VOViAgICAgICAgICAgIDB4MjIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfU0hJRlRfRERSX0ZSRVFVRU5DWV9UWEwgIDB4MjMKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ESVNQTEFZX0REUl9JTkZPUk1BVElPTiAgMHgyNAojZGVmaW5lICBERFJfVEVTVF9DTURfX09GRlNFVF9MQ0RMUiAgMHgyNQojZGVmaW5lICBERFJfVEVTVF9DTURfX1NFVF9XQVRDSF9ET0dfVkFMVUUgIDB4MjYKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9ERFJfREFUQV9XSU5ET1dfU1RJQ0tZICAweDI3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9TV0VFUF9EUkFNX0NMS19VU0VfRDJQTExfU1RJQ0tZICAweDI4CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9ERFJfQklTVF9URVNUX1VTRV9EMlBMTF9TVElDS1kgIDB4MjkKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX0JJU1RfVEVTVF9TSVpFX1NUSUNLWV82ICAweDMwCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9TVE9SRV9XSU5ET1cgIDB4MzEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX1NUT1JFX1FVSUNLX1dJTkRPVyAgMHgzMgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfS0VSTkVMX1NUT1JFX1FVSUNLX1dJTkRPVyAgMHgzMwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfS0VSTkVMX1NUT1JFX1FVSUNLX1dJTkRPV19NVUxUSSAgMHgzNAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfS0VSTkVMX1dJTkRPV19TQU1FX0NIQU5HRSAgMHgzNQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfRzEyX1JFQ09ORklHX0NNRCAgMHgzNgojZGVmaW5lICBERFJfVEVTVF9DTURfX0RJU1BMQVlfRzEyX0REUl9JTkZPUk1BVElPTiAgMHgzNwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9HMTJfRE1DX1RFU1QgIDB4MzgKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfRzEyX0VFX0JETFJfVEVTVCAgMHgzOQoKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfY21kPTA7Cgl1bnNpZ25lZCBpbnQgIGFyZ1szMF09ezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH07CgljaGFyICplbmRwOwoJZGRyX3Rlc3RfY21kID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7Cglmb3IgKGkgPSAyO2k8YXJnYztpKyspCgkJYXJnW2ktMl09c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2ldLCAmZW5kcCwgMCk7CglwcmludGYoIlxuZGRyX3Rlc3RfY21kPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9jbWQpOwoKCWZvciAoaSA9IDA7aTwoYXJnYy0yKTtpKyspCgkJcHJpbnRmKCJcbmFyZ1slMDh4XT0lMDh4XG4iLGksYXJnW2ldKTsKCS8vaW50IGFyZ2MyX2xlbmd0aDsKCS8vYXJnYzJfbGVuZ3RoPShhcmdjLTIpOwoJLy9jbWRfdGJsX3QgKmNtZHRwMjsKCS8vaW50IGZsYWcyOwoJaW50IGFyZ2MyOwoJY2hhciogYXJndjJbMzBdOwoKCWFyZ2MyPWFyZ2MtMTsKCWZvciAoaSA9IDE7aTwoYXJnYyk7aSsrKQoJCWFyZ3YyW2ktMV09YXJndltpXTsKCS8vYXJndjI9KGNoYXIgICAgKilhcmd2Kys7Cgl7CgkJcnVuX2NvbW1hbmQoImRjYWNoZSBvZmYiLDApOwoJCXJ1bl9jb21tYW5kKCJkY2FjaGUgb24iLDApOwoJCXByaW50ZigiXG4gY2FjaGUgb2ZmIG9uIik7CQoJCXN3aXRjaCAoZGRyX3Rlc3RfY21kKQoJCXtjYXNlKEREUl9URVNUX0NNRF9fTk9ORSk6CgkJCXsKCQkJCXByaW50ZigiXG4gIDB4MCBoZWxwXG4iKTsKCQkJCXByaW50ZigiXG4gIDB4MSBkZHJ0ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxIHN0YXJ0X2FkZCB0ZXN0X3NpemUgbG9vcHMgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyIHRlc3QgYWNsY2RsciAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDIgc3RhcnRfYWRkIHRlc3Rfc2l6ZSBsb29wcyAgICBkZHJfdGVzdF9jbWQgMHgyIGEgMCAweDgwMDAwMDAgIDEiKTsKCQkJCXByaW50ZigiXG4gIDB4MyB0ZXN0IG1heF9wbGxjbGsgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgzICB0ZXN0X3NpemUgbG9vcHMgYWRkX2ZyZXEgc3ViX2ZyZXEgIik7CgkJCQlwcmludGYoIlxuICAweDQgdGVzdCB6cSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDQgIHRlc3Rfc2l6ZSBsb29wcyBhZGRfZnJlcSBzdWJfZnJlcSBkcnZfb2R0X2ZsYWcgIik7CgkJCQlwcmludGYoIlxuICAweDUgdGVzdCB2cmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDUgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4NiB0ZXN0IGd4dHZiYl9jcm9zc3RhbGsgICAgICAgICBkZHJfdGVzdF9jbWQgMHg2ICBsb29wcyBwYXR0ZXJuX2ZsYWcgIik7CgkJCQlwcmludGYoIlxuICAweDcgdGVzdCBiYW5kd2lkdGggICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NyBzaXplIGxvb3BzIHBvcnQgc3ViX2lkIHRpbWVyX21zICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg4IHRlc3QgbGNkbHJfdXNlX2Vudl91YXJ0ICAgICAgZGRyX3Rlc3RfY21kIDB4OCBpbnB1dF9zcmMgd3JfYWRqX3BlcltdIHJkX2Fkal9wZXJbXVtdICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg5IHRlc3RfcmVnX3VzZV9tYXNrICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4OSByZWdfYWRkIHZhbHVlIG1hc2sgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhhIHRlc3QgYWNfY2xrICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4YSBzdGFydF9hZGQgdGVzdF9zaXplIGxvb3BzICAgZGRyX3Rlc3RfY21kIDB4YSBhIDAgMHg4MDAwMDAwICAxICAiKTsKCQkJCXByaW50ZigiXG4gIDB4YiAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhjIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweGQgLi4uICAiKTsKCQkJCXByaW50ZigiXG4gIDB4ZSAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhmIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweDEwIHRlc3Qgc2V0IHpxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTAgenEwcHIwIHpxMXByMCB6cTJwcjAgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTEgdGVzdCB0dW5lIGRxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTEgYSAwIHRlc3Rfc2l6ZSAgIGRkcl90ZXN0X2NtZCAweDExIGEgMCAweDgwMDAwIik7CgkJCQlwcmludGYoIlxuICAweDEyIHRlc3Qgc2V0IHN0YXJ0X2FkZCAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTIgc3RhcnRfYWRkICAgIik7CgkJCQlwcmludGYoIlxuICAweDEzIHRlc3QgYWNfYml0X3NldHVwX2hvbGQgdGltZSAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTMgYSAwIHNpemUgbWV0aG9kICBwaW5faWQgICBkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDAgIDB4YyIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNCB0ZXN0IGRhdGFfYml0X3NldHVwX2hvbGQgdGltZSAgICAgIGRkcl90ZXN0X2NtZCAweDE0IGEgMCBzaXplIHNldHVwL2hvbGQgcGluX2lkICAgZGRyX3Rlc3RfY21kIDB4MTQgYSAwIDB4ODAwMDAgMCAzICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNSB0ZXN0IGFjX2xhbmVfc2V0dXBfaG9sZCAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNSBhIDAgc2l6ZSAgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNiB0ZXN0IGVlIG1kbHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNiAgdm9sdGFnZSBwd21faWQgbG9vcHMgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTcgZDJwbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTcgY2xrIHpxX2FjIHpxX3NvY19kcmFtIHNvY192cmVmIGRyYW1fdnJlZiBkZWNfaGV4IHpxX3ZyZWYgMFxuIFwKCQkJCQkJZXhhbXBsZSBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCA1MCA4MSAxIDUwIFxuIFwKCQkJCQkJb3IgIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDB4MDkgMHgyMCAwIDUwIFxuIik7IAoJCQkJcHJpbnRmKCJvciAgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCA2MDM0IDYwMzQ2MDM0IDAgMCAwIDAgMSBcbiIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxOCB0ZXN0IGRhdGFfbGFuZV9zZXR1cF9ob2xkICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDE4IGEgMCBzaXplIHJhbmdlIHN0YXJ0X3Bpbl9pZCBlbmRfcGluX2lkICBkZHJfdGVzdF9jbWQgMHgxOCBhIDAgMHg4MDAwMCAxIDAgOTYgIik7CgkJCQlwcmludGYoIlxuICAweDE5IHRlc3QgcGh5IHZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDE5IGEgMCAweDgwMDAwICAxIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCB0ZXN0X2Rvd25fdXBfc3RlcCBzZWVkX2hleF9kZWMgIFwKCQkJCQkJZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4MTAwMDAwMCAgMSAgNjMgIDEgMSAgMHg4IDAgMSAiKTsKCQkJCXByaW50ZigiXG4gIDB4MWEgdGVzdCBkcmFtIHZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHg4MDAwMCAgY2xlYXIgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHZyZWZfcmFuZ2Ugc2VlZF9oZXhfZGVjIFwKCQkJCQkJXG4gc2V0ZW52ICBkZHJfdGVzdF9kZHI0cmFtX3ZyZWYgZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwMCAgMCAgMHgxNCAxICAwICAweDggMCAwIDAgOyBzZXRlbnYgIHN0b3JlYm9vdCAgcnVuIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiA7c2F2ZTtyZXNldCAiKTsKCQkJCXByaW50ZigiXG4gIDB4MWIgdGVzdCBhYyB2cmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFCIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgc2VlZF9oZXhfZGVjIik7CgkJCQlwcmludGYoIlxuICAweDFjIHN3ZWVwIGRyYW0gY2xrIHVzZSBkMnBsbF9lbnYgICAgIGRkcl90ZXN0X2NtZCAweDFjICB0ZXN0X3NpemUgc3RhcnRfZnJlcSBlbmRfZnJlcSB0ZXN0X2xvb3BzICBkZHJfdGVzdF9jbWQgMHgxYyAweDgwMDAwMDAgODAwIDE1MDAgMSIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxZCB0ZXN0IHNoaWZ0IGNsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxZCB0eXBlIGRlbGF5X21zIHRpbWVzIik7CgkJCQlwcmludGYoIlxuICAweDFlIHRlc3Qgd3JpdGVfcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MWUgd3JpdGVfcmVhZCBwYXR0ZXJuX2lkIGxvb3Agc3RhcnRfYWRkIHRlc3Rfc2l6ZSIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxZiB0ZXN0IHB3bV9jbWQgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxZiBwd21pZCAgIHB3bV9sb3cgcHdtX2hpZ2giKTsKCQkJCXByaW50ZigiXG4gIDB4MjIgdGVzdCBkZHJfd2luZG93IHVzZSBlbnYgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDIyIGEgMCB0ZXN0X3NpemUgd2F0Y2hkb2dfdGltZSBcCgkJCQkJCWxhbmVfZGlzYWJsZV9tYXNyayBhZGRfdGVzdF9zaXplICBzZXRlbnYgYm9vdGNtZCAgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAwIDE1IDAgMHg4MDAwMDAwIik7CgkJCQlwcmludGYoIlxuIGRlZmVudjtzYXZlO3NldGVudiBib290Y21kIGRkcl90ZXN0X2NtZCAweDIyIGEgMCAweDgwMDAwMCAxOCAweDAgMHg4MDAwMDAwIik7CgkJCQlwcmludGYoIlxuIHNldGVudiBlbnZfZGRydGVzdF9kYXRhX2xhbmUgIDB4MjI7c2F2ZTtyZXNldCIpOwkKCQkJCXByaW50ZigiXG4gIDB4MjMgdGVzdCBzaGlmdCBkZHIgZnJlcXVlbmN5ICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDIzIik7CgkJCQlwcmludGYoIlxuICAweDI0IGRpc3BsYXkgZGRyX2luZm9ybWF0aW9uICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDI0Iik7CgkJCQlwcmludGYoIlxuICAweDI1IG9mZnNldCBkZHJfbGNkbHIgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjUiKTsKCQkJCXByaW50ZigiXG4gIDB4MjYgc2V0IHdhdGNoZG9nX3ZhbHVlICAgICAgICBkZHJfdGVzdF9jbWQgMHgyNiAzMCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyNyB0ZXN0IGRkcl93aW5kb3cgdXNlIHN0aWNreSByZWdpc3RlciAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjcgYSAwIHRlc3Rfc2l6ZSB3YXRjaGRvZ190aW1lIFwKCQkJCQkJbGFuZV9kaXNhYmxlX21hc3JrIGFkZF90ZXN0X3NpemUgIHNldGVudiBib290Y21kICBkZHJfdGVzdF9jbWQgMHgyNyBhIDAgMHg4MDAwMDAgMTUgMCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gIDB4MjggIHN3ZWVwIGRyYW0gY2xrIHVzZSBkMnBsbF9zdGlja3kgICAgIGRkcl90ZXN0X2NtZCAweDI4ICB0ZXN0X3NpemUgc3RhcnRfZnJlcSBlbmRfZnJlcSB0ZXN0X2xvb3BzICBkZHJfdGVzdF9jbWQgMHgyOCAweDgwMDAwMDAgODAwIDE1MDAgMSIpOwoKCQkJCS8qCgkJCQkgICBkZHJfdHVuZV9kcXNfc3RlcCAgYSAwICAweDgwMDAwMCAxIDIJbGFuZTAtNwltaW4KCQkJCSAgIGRkcl90dW5lX2Rxc19zdGVwICBhIDAgIDB4ODAwMDAwIDEgMQlsYW5lMC03CW1heAoKCQkJCSAgIGRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4ODAwMDAwMCAxIDIJbGFuZTAtMQltaW4KCQkJCSAgIGRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4ODAwMDAwMCAxIDEJbGFuZTAtMQltYXgKCgkJCQkgICBzZXRlbnYgYm9vdGNtZCAgImRkcl90ZXN0X2NtZCAweDIyIGEgMCAweDgwMDAwMCAxOCAwIDB4ODAwMDAwMCIJCSB3YXRjaGRvZ190aW1lIKOsbGFuZV9kaXNhYmxlX21hc2ssYWRkX3Rlc3Rfc2l6ZQoJCQkJICAgc2V0ZW52IGVudl9kZHJ0ZXN0X2RhdGFfbGFuZSAgMHgyMgnJ6NbDw/zB7r+qyryx6ta+CQoJCQkJICAgc2F2ZQkgd2F0Y2hkb2dfdGltZSCjrGxhbmVfZGlzYWJsZV9tYXNrLGFkZF90ZXN0X3NpemUJCgkJCQkgICBkMnBsbCAxMjAwCQkKCgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfdGVzdF9kZHJfY2xrICIweDAwMDAwMDAiOwkJCgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfbGVmICIweDAwMDAwMDAiOwkJCgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfb3JnICIweDAiOwkJCgkJCQkgICBzZXRlbnYgZGRyX3NvY19pb3ZyZWZfcmlnICAiMHgwMDAwMDAgIjsJCQoJCQkJICAgc2F2ZQkJCgkJCQkgICBkMnBsbCAxMTA0CQkKCQkJCSAgIGRkcl90ZXN0X2NtZCAweDE5IGEgMCAweDgwMDAwICAxICA3MCAgMSAxICAweDggMCAxCQkKCgoKCQkJCSAgINbYsuLSqrX0teejrMr9vt205tTac3RpY2sgvMS05sb3wcsJCQoJCQkJICAgc2V0ZW52IGRkcl9kcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGsgIjB4MDAwMDAwMCI7CQkKCQkJCSAgIHNldGVudiBkZHJfZHJhbV9pb3ZyZWZfbGVmICIweDAwMDAwMDAiOwkJCgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX29yZyAiMHgwIjsJCQoJCQkJICAgc2V0ZW52IGRkcl9kcmFtX2lvdnJlZl9yaWcgICIweDAwMDAwMCAiOwkJCgkJCQkgICBzZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiAiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwICAwICA3MCAwICAwICAweDA4IDAgMCAxIgkJCgkJCQkgICBzZXRlbnYgYm9vdGNtZCAgICJydW4gZGRyX3Rlc3RfZGRyNHJhbV92cmVmIgkJCgkJCQkgICBzYXZlCQkKCQkJCSAgILX0tefJz7XnCQkKCQkJCSAgIGQycGxsIDExMDQJCQoJCQkJICAgKi8KCgoJCQl9CgkJCXJldHVybiAxOwoKCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJ0ZXN0IDB4MTAwMDAwMDAgMHg4MDAwMDAwIDMiLDApOwoJCQkJLy9kZHJfdGVzdF9jbWQgMHgxIHN0YXJfYWRkIHRlc3Rfc2l6ZSBsb29wcwoJCQkJLy8gZG9fZGRyX3Rlc3QoY21kdHAsICBmbGFnLCBhcmdjMixhcmd2KTsKCQkJCWRvX2Rkcl90ZXN0KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLChhcmd2MikpOwoJCQkJYnJlYWs7CgkJCX0KCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX0FDTENETFIpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgYSAwICAweDgwMDAwMDAgMyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDIgYSAwIDB4ODAwMDAwMCAgMQoJCQkJZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2xjZGxyKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9ERFJfVFVORV9BQ19DTEspOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jayBhIDAgMHg4MDAwMDAwIDMiLDApOwoJCQkJLy9kZHJfdGVzdF9jbWQgMHhBIGEgMCAweDgwMDAwMDAgIDEKCQkJCWRvX2Rkcl90ZXN0X2FjX3dpbmRvd3NfYWNiZGxyX2NrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfTUFYX0NMSyk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMyAweDgwMDAwMDAgMCIsMCk7CgkJCQlwcmludGYoIlxuVGVzdCBkZHIgbWF4IGZyZXF1ZW5jeSBzaG91bGQgdXNlIG1heCB0aW1taW5nICxzdWNoIGFzIDE0LTE0LTE0XG4iKTsKCgkJCQlkb19kZHJfdGVzdF9kZHJfbWF4X2ZyZXEoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfWlEpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkJCQlwcmludGYoIlxuVGVzdCB6cSxzaG91bGQgZmlyc3QgdGVzdCBtYXggZGRyIGZyZXF1ZW5jeSB1c2UgZGVmYXVsdCB6cSB2YWx1ZVxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfZGRyX3pxKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9HWFRWQkJfQ1JPU1NUQUxLKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90dW5lX2Rkcl9hY19hY2xjZGxyIDB4MTAwMDAwMDAgMHg4MDAwMDAwIDMiLDApOwoJCQkJcHJpbnRmKCJcblRlc3QgR1hUVkJCIGNyb3NzIHRhbGssdGVzdCBvbmx5IGNoYW5uZWwgMCAtLTB4MTAwMDAwMDAgY2hhbm5lbCAxIC0tMHgxMDAwMDQwMCAzMmJ5dGVcbiIpOwoKCQkJCWRvX2Rkcl9neHR2YmJfY3Jvc3N0YWxrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9CQU5EV0lEVEhfVEVTVCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciAweDEwMDAwMDAwIDB4ODAwMDAwMCAzIiwwKTsKCQkJCXByaW50ZigiXG5OT1RFIHRlc3QgRERSIGJhbmR3aWR0aCBpbiB1Ym9vdCBsaW1pdGVkIGJ5IGNwdSBzcGVlZCBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2JhbmR3aWR0aCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfTENETFJfRU5WX1RVTkUpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkJCQlwcmludGYoIlxudHVuZSBkZHIgbGNkbHIgdXNlIHVib290IGVudiBvciB1YXJ0IGlucHV0IFxuIik7CgoJCQkJZG9fZGRyX2ZpbmVfdHVuZV9sY2Rscl9lbnYoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX01PRElGWV9SRUdfVVNFX01BU0spOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkJCQlwcmludGYoIlxubW9kaWZ5IGRkciByZWcgdXNlIG1hc2sgXG4iKTsKCgkJCQlkb19kZHJfbW9kaWZ5X3JlZ191c2VfbWFzaygoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUWlEpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTAgIDB4NTkgMHg1ZCAweDViICAiLDApOwoJCQkJcHJpbnRmKCJcbnNldCBkZHIgenEgXG4iKTsKCgkJCQlkb19kZHJfc2V0X3pxKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCiNlbHNlCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9EUVMpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTEgYSAwIDB4ODAwMDAgICIsMCk7CgkJCQlwcmludGYoIlxudGVzdCBkcXMgd2luZG93IFxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfZHFzX3dpbmRvdygoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1RFU1RfU1RBUlRfQUREKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMiAgMHg0MTA4MDAwMCAgIiwwKTsKCgoJCQkJdGVzdF9zdGFydF9hZGRyPWFyZ1swXTsKCQkJCWlmICh0ZXN0X3N0YXJ0X2FkZHIgPT0gMCkKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9MHgxMDgwMDAwOwoJCQkJcHJpbnRmKCJcbnNldCBkZHIgIHRlc3QgdGVzdF9zdGFydF9hZGRyPT0weCUwOHggXG4iLHRlc3Rfc3RhcnRfYWRkcik7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVF9BQ19CSVRfU0VUVVBfSE9MRF9NQVJHSU4pOgoJCQl7ICAvL2NsayBzZWVkIHVzZSBmb3IgY2xrIHRvbyBlYXJseSxjbGsgbXVzdCBkZWxheQoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMCAgMHhjICAiLDApOyBjczAgc2V0dXAKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDEgIDB4YyAgIiwwKTsgY3MwIGhvbGQKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDIgIDB4YyAgIiwwKTsgY3MwIGhvbGQgICAvL3NvbWUgdGltZXMgZGRyIGZyZXF1ZW5jeSB0b28gaGlnaCBjYW5ub3QgbW92ZSBjbGsgZGVsYXkudGhlbiBzaG91bGQgb25seSBtb3ZlIGNtZCBiZGwKCQkJCS8vc28gc2hvdWxkdCB0ZXN0IGhvbGQgdGltZSB1c2UgbWV0aG9kIDEgYW5kIG1ldGhvZCAyLS0tLXRlc3QgaG9sZCB0aW1lIHRha2UgY2FyZS0tMjAxNjA4MDQtamlheGluZwoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMCAgMHhkICAiLDApOyBjczEgc2V0dXAKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMyBhIDAgMHg4MDAwMDAwIDEgIDB4ZCAgICIsMCk7IGNzMSBob2xkCgkJCQlwcmludGYoIlxudGVzdCBBQyBiaXQgd2luZG93IFxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJCS8vZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgMCBjCgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfRDJQTExfQ01EKToKCQkJewoJCQkJLy9wcmludGYoIiBkZHJfdGVzdF9jbWQgMHgxNyBjbGsgenFfYWMgenFfc29jX2RyYW0gc29jX3ZyZWYgZHJhbV92cmVmIGRlY19oZXggenFfdnJlZiAwXG4iKTsKCQkJCS8vcHJpbnRmKCJleGFtcGxlIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDUwIDgxIDEgNTAgXG4iKTsKCQkJCS8vcHJpbnRmKCJvciAgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCAweDJhYTRhIDB4MjAxNTk5NWQgMHgwOSAweDIwIDAgNTAgXG4iKTsKCQkJCXByaW50ZigiXG50ZXN0IGQycGxsIGNtZCAsc2VlIGRkcl90ZXN0X2NtZCAweDE3IGhlbHAgXG4iKTsKCgkJCQlkb19kZHIycGxsX2NtZCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVF9FRV9WT0xUQUdFX01ETFJfU1RFUCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxNiAxMDAwIDEgMSIsMCk7Ly90ZXN0IEVFIDEwMDBtViBkZGwgc3RlcCBwd21iICAtMSAyMTEgICAgMjEyLS1wd21kLS0zCgkJCQkvLzEwMDAgMSAxICAtLS0xMDAwbXYgIHB3bWlkICBsb29wICxpZiBsb29wIHRoZW4gdGVzdCBhbGwgcHdtIHZvbHRhZ2UKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MTYgMTAwMCAxICAgc2V0IHRvIDEwMDBtdgoJCQkJcHJpbnRmKCJcbnRlc3QgZWUgdm9sdGFnZSBkZGwgc3RlcCBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3B3bV9kZGwoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfQUNfTEFORV9CSVRfTUFSR0lOKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE1IGEgMCAweDgwMDAwMCAwIiwwKTsKCQkJCXByaW50ZigiXG50ZXN0IGFjIGxhbmUgYml0IG1hcmdpbiBub3QgaW5jbHVkZSBjcyBwaW4gXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9hY19iaXRfbWFyZ2luKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJCS8vZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgMCBjCgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EQVRBX0JJVF9TRVRVUF9IT0xEX01BUkdJTik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxNCBhIDAgMHg4MDAwMCBzZXR1cC9ob2xkIHBpbl9pZCIsMCk7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTQgYSAwIDB4ODAwMDAgMCAzIiwwKTsKCQkJCXByaW50ZigiXG50ZXN0IGRhdGEgbGFuZSBiaXQgc2V0dXAgaG9sZCBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0RBVEFfTEFORV9CSVRfTUFSR0lOKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE4IGEgMCAweDgwMDAwIDAiLDApOwoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE4IGEgMCAweDgwMDAwIDEgMCA5NiIsMCk7CgkJCQlwcmludGYoIlxudGVzdCBkYXRhIGxhbmUgYml0IG1hcmdpbiAgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9kYXRhX2JpdF9tYXJnaW4oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVFVORV9QSFlfVlJFRik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxOSBhIDAgMHg4MDAwMCAgMSBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgdGVzdF9kb3duX3VwX3N0ZXAgc2VlZF9oZXhfZGVjIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4MTAwMDAwMCAgMSAgMHgxYSAgMSAxICAweDggMCAwCgkJCQkvL2Rkcl90ZXN0X2NtZCAweDE5IGEgMCAweDEwMDAwMDAgIDEgIDYzICAxIDEgIDB4OCAwIDEKCQkJCXByaW50ZigiXG50ZXN0IGRkcjQgcGh5IHZyZWYgIFxuIik7CgoJCQkJZG9fZGRyNF90ZXN0X3BoeV92cmVmKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVFVORV9EUkFNX1ZSRUYpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4ODAwMDAgIGNsZWFyIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCB0ZXN0X2Rvd25fdXBfc3RlcCB2cmVmX3JhbmdlIHNlZWRfaGV4X2RlYyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDFBIGEgMCAweDEwMDAwMDAgIDAgIDAgMyAgMCAgMHgxMAoJCQkJLy9zZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiAiZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MDgwMDAwMCAgMCAgMHgxNCAwICAwICAweDggMCAwIDAiCgkJCQkvL3NldGVudiBzdG9yZWJvb3QgInJ1biBkZHJfdGVzdF9kZHI0cmFtX3ZyZWYiCgkJCQlwcmludGYoIlxudGVzdCBkZHI0IERSQU0gdnJlZiAgXG4iKTsKCgkJCQlkb19kZHI0X3Rlc3RfZHJhbV92cmVmKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVFVORV9BQ19WUkVGKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFCIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgc2VlZF9oZXhfZGVjIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MUIgYSAwIDB4MTAwMDAwMCAgMCAgMCAxICAwICAweDEwIDAKCQkJCXByaW50ZigiXG50ZXN0IGRkcjQgQUMgb3IgZGQzIGRyYW0gYWNfZGF0YSB2cmVmICBcbiIpOwoKCQkJCWRvX2RkcjRfdGVzdF9kcmFtX2FjX3ZyZWYoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCQkJLy9ERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X1NXRUVQX0RSQU1fQ0xLX1VTRV9EMlBMTCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxYyAgdGVzdF9zaXplIHN0YXJ0X2ZyZXEgZW5kX2ZyZXEgdGVzdF9sb29wcyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDFjIDB4ODAwMDAwMCA4MDAgMTUwMCAzCgkJCQlwcmludGYoIlxudGVzdCBkZHI0IHN3ZWVwIGRkciBjbGsgdXNlIGQycGxsIFxuIik7CgoJCQkJZG9fZGRyNF90ZXN0X2RyYW1fY2xrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVEVTVF9TSElGVF9ERFJfRlJFUVVFTkNZKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFkICIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDFkIHR5cGUgZGVsYXlfbXMgdGltZXMgLy9kZHJfdGVzdF9jbWQgMHgxZCAwIDEwMDAgMTAwMDAwCgkJCQkvL3RpbWVzID0weGZmZmZmZmZmIHdpbGwgYXV0byBsb29wCgkJCQlwcmludGYoIlxudGVzdCBkZHIgc2hpZnQgZGRyIGNsayAgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9zaGlmdF9kZHJfY2xrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJLy9ERFJfVEVTVF9DTURfX0REUjRfVEVTVF9EQVRBX1dSVElFX1JFQUQKCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVF9QV01fQ01EKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFmIDB4MSAweDIgMHgxQSAiLDApOy8vdGVzdCBFRSAgIHB3bWIgIC0tMSAyMTEgICAgMjEyLS1wd21kLS0zCgkJCQkvLzEwMDAgMSAxICAtLS1wd21pZCAgIHB3bV9sb3cgcHdtX2hpZ2ggICBwd21fbG93K3B3bV9oaWdoPT1ub3JtYWw9MjgKCQkJCXByaW50ZigiXG5wd21pZCAgIHB3bV9sb3cgcHdtX2hpZ2ggXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9wd21fY21kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1NJKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDIwIDB4MSAweDIgMHgxQSAiLDApOy8vdGVzdCBFRSAgIHB3bWIgIC0tMSAyMTEgICAgMjEyLS1wd21kLS0zCgkJCQkvLzEwMDAgMSAxICAtLS1wd21pZCAgIHB3bV9sb3cgcHdtX2hpZ2ggICBwd21fbG93K3B3bV9oaWdoPT1ub3JtYWw9MjgKCQkJCS8vIGRvX2Rkcl90ZXN0X2VlX3NpKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKI2Vsc2UKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX0REUl9EQVRBX1dJTkRPV19FTlYpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAgICIsMCk7CgkJCQlwcmludGYoIlxudGVzdCBkcXMgd2luZG93IHVzZSBlbnYgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9kcXNfd2luZG93X2VudigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfU0hJRlRfRERSX0ZSRVFVRU5DWV9UWEwpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWQgIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MWQgdHlwZSBkZWxheV9tcyB0aW1lcyAvL2Rkcl90ZXN0X2NtZCAweDFkIDAgMTAwMCAxMDAwMDAKCQkJCS8vdGltZXMgPTB4ZmZmZmZmZmYgd2lsbCBhdXRvIGxvb3AKCQkJCXByaW50ZigiXG50ZXN0IGRkciBzaGlmdCBkZHIgY2xrICBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3NoaWZ0X2Rkcl9jbGtfdHhsKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKI2VuZGlmCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ESVNQTEFZX0REUl9JTkZPUk1BVElPTik6CgkJCXsKCgkJCQlwcmludGYoIlxuZGlzcGxheSBkZHJfaW5mb3JtYXRpb24gIFxuIik7CgoJCQkJZG9fZGRyX2Rpc3BsYXlfZGRyX2luZm9ybWF0aW9uKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX09GRlNFVF9MQ0RMUik6CgkJCXsKCgkJCQlwcmludGYoIlxub2Zmc2V0IGRkciBsY2RsciBcbiIpOwoKCQkJCWRvX2Rkcl9vZmZzZXRfZGRyX2xjZGxyKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX1NFVF9XQVRDSF9ET0dfVkFMVUUpOgoJCQl7CgkJCQlwcmludGYoIlxuc2V0IHdhdGNoZG9nIHZhbHVlIFxuIik7CgkJCQlkb19kZHJfc2V0X3dhdGNoZG9nX3ZhbHVlICgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgoJCQl9CgkJCWJyZWFrOwoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMX1NUSUNLWSk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgyOCAKCQkJCXByaW50ZigiXG50ZXN0IGRkciBmcmVxdWVuY3kgdXNlIHN0aWNreSByZWdpc3RlclxuIik7CgoJCQkJZG9fZGRyNF90ZXN0X2RyYW1fY2xrX3VzZV9zdGlja3koKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9ERFJfQklTVF9URVNUX1VTRV9EMlBMTF9TVElDS1kpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MjkgCgkJCQlwcmludGYoIlxudGVzdCBkZHIgYmlzdCB0ZXN0IHVzZSBzdGlja3kgcmVnaXN0ZXJcbiIpOwoKCQkJCWRvX2RkcjRfdGVzdF9iaXN0X3Rlc3RfdXNlX3N0aWNreSgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX0JJU1RfVEVTVF9TSVpFX1NUSUNLWV82KToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDMwCgkJCQlwcmludGYoIlxuc2V0IGRkciBiaXN0IHRlc3Qgc2l6ZSB1c2Ugc3RpY2t5NiByZWdpc3RlclxuIik7CgoJCQkJZG9fZGRyX3NldF9iaXN0X3Rlc3Rfc2l6ZV91c2Vfc3RpY2t5XzYoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9TVE9SRV9XSU5ET1cpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzEKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlXG4iKTsKCgkJCQlkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2UoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9TVE9SRV9RVUlDS19XSU5ET1cpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzIKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlX3F1aWNrX3Rlc3RcbiIpOwoKCQkJCWRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZV9xdWlja19tZXRob2QoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9LRVJORUxfU1RPUkVfUVVJQ0tfV0lORE9XKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDMzCgkJCQlwcmludGYoIlxuc2V0IGRvX2Rkcl91Ym9vdF9rZXJuZWxfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfbWV0aG9kXG4iKTsKCgkJCQlkb19kZHJfdWJvb3Rfa2VybmVsX3dpbmRvd191c2Vfc291cmNlX3F1aWNrX21ldGhvZCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9TVE9SRV9RVUlDS19XSU5ET1dfTVVMVEkpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzQKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X2tlcm5lbF93aW5kb3dfdXNlX3NvdXJjZV9xdWlja19tZXRob2RzXG4iKTsKCgkJCQlkb19kZHJfdWJvb3Rfa2VybmVsX3dpbmRvd191c2Vfc291cmNlX3F1aWNrX21ldGhvZHMoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQkvL2ludCBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2VfYWxsX3NhbWVfaW5jcmVhc2UoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9LRVJORUxfV0lORE9XX1NBTUVfQ0hBTkdFKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDM1CgkJCQlwcmludGYoIlxuc2V0IGRvX2Rkcl91Ym9vdF9rZXJuZWxfd2luZG93X3VzZV9hbGwgbGNkbHIgc2FtZSBjaGFubmdlIFxuIik7CgoJCQkJZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlX2FsbF9zYW1lX2luY3JlYXNlKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJI2VuZGlmCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9ERFJfREFUQV9XSU5ET1dfU1RJQ0tZKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDI3IAoJCQkJcHJpbnRmKCJcbnRlc3QgZHFzIHdpbmRvdyB1c2Ugc3RpY2t5IHJlZ2lzdGVyXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0aWNreSgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfREFUQV9XUlRJRV9SRUFEKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFlICB3cml0ZV9yZWFkICBwYXR0ZXJuX2lkIGxvb3Agc3RhcnRfYWRkciB0ZXN0X3NpemUgZGVsYXlfdXMiLDApOwoJCQkJLy9kZHJfdGVzdF9jbWQgMHgxZSAxIDIgMTAgMHg0MDAwMDAwMCAweDEwMDAwMDAwCgkJCQkvL3RpbWVzID0weGZmZmZmZmZmIHdpbGwgYXV0byBsb29wCgkJCQlwcmludGYoIlxudGVzdCBkZHIgd3JpdGUgcmVhZCAgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF93cml0ZV9yZWFkKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJLy9ERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfRzEyX1JFQ09ORklHX0NNRAoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9HMTJfUkVDT05GSUdfQ01EKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDM2CgkJCQlwcmludGYoIlxuc2V0IGRvX2Rkcl91Ym9vdF9yZWNvbmZpZyBjbWRcbiIpOwoKCQkJCWRvX2Rkcl91Ym9vdF9uZXdfY21kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ESVNQTEFZX0cxMl9ERFJfSU5GT1JNQVRJT04pOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzcKCQkJCXByaW50ZigiXG5zaG93IGcxMiBkZHIgaW5mb3JtYXRpb25cbiIpOwoKCQkJCWRvX2Rkcl9kaXNwbGF5X2cxMl9kZHJfaW5mb3JtYXRpb24oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9HMTJfRE1DX1RFU1QpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzgKCQkJCXByaW50ZigiXG5VYm9vdCBkbWMgdGVzdCBcbiIpOwoKCQkJCWRvX2Rkcl9nMTJfdWJvb3RfZG1jX3Rlc3QoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0cxMl9FRV9CRExSX1RFU1QpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzkKCQkJCXByaW50ZigiXG5VYm9vdCBCRExSIHRlc3QgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9wd21fYmRscigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCXJldHVybiAxOy8vdGVzdF9zdGFydF9hZGRyCgl9Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KVV9CT09UX0NNRCgKCWRkcl90ZXN0X2NtZCwJMzAsCTEsCWRvX2Rkcl90ZXN0X2NtZCwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7CgppbnQgZG9fZGRyX2F1dG9fdGVzdF93aW5kb3coY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglnbG9iYWxfYm9vdF90aW1lcz1yZF9yZWcoUFJFR19TVElDS1lfRzEyQV9SRUcwKTsKCXByaW50ZigiXG5nbG9iYWxfYm9vdF90aW1lcz09ICVkXG4iLCBnbG9iYWxfYm9vdF90aW1lcyk7CgoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQkJCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJY2hhciBzdHJbMTAyNF09IiI7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwoJdW5zaWduZWQgaW50ICB0ZW1wX3JlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgbnVtX2FycnlbMzJdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwoKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgoJdGVtcF9yZWdfYWRkPSgoRE1DX1NUSUNLWV9HMTJBXzApKTsKCS8vbnVtX2FycnkgPSAodWludDE2X3QgKikodWludDY0X3QgKShzdGlja3lfcmVnX2Jhc2VfYWRkKTsKCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CgkJCW51bV9hcnJ5W2ldPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCw4LGkpOwoJCQlpZigoaT09MCl8fChpPT0xNikpewoJCQkJcHJpbnRmKCJcbiBudW1hcnJ5WyVkXSIgLGkpOwoJCQl9CgkJcHJpbnRmKCIgJWQgIixudW1fYXJyeVtpXSk7Cgl9CgoJZGRyX3Rlc3RfY21kPW51bV9hcnJ5WzBdOwoKCXVuc2lnbmVkIGludCAgIGNzMF90ZXN0X3N0YXJ0PSAweDEwODAwMDA7Cgl1bnNpZ25lZCBpbnQgICBjczBfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7Cgl1bnNpZ25lZCBpbnQgICBjczFfdGVzdF9zdGFydD0gMDsKCXVuc2lnbmVkIGludCAgIGNzMV90ZXN0X3NpemU9IDA7Cgl1bnNpZ25lZCBpbnQgICB3YXRjaGRvZ190aW1lX3M9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfaW5kZXhfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgYWxsX3RvZ2h0ZXJfZW5hYmxlPTA7CgkvL3Vuc2lnbmVkIGludCAgIG5pYmJsZV9tYXNrWzNdPXswLDAsMH07CgljczBfdGVzdF9zdGFydD0oKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCsxXSk8PDgpfAoJCSgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU1RBUlRfSU5ERVgrMl0pPDwxNil8KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCszXSk8PDI0KSk7CgljczBfdGVzdF9zaXplPSgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCsxXSk8PDgpfAoJCSgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCsyXSk8PDE2KXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVgrM10pPDwyNCkpOwoJY3MxX3Rlc3Rfc3RhcnQ9KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU1RBUlRfSU5ERVgrMV0pPDw4KXwKCQkoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYKzJdKTw8MTYpfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU1RBUlRfSU5ERVgrM10pPDwyNCkpOwoJY3MxX3Rlc3Rfc2l6ZT0oKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVgrMV0pPDw4KXwKCQkoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVgrMl0pPDwxNil8KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TSVpFX0lOREVYKzNdKTw8MjQpKTsKCXdhdGNoZG9nX3RpbWVfcz0oKG51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYKzFdKTw8OCkpOwoJdGVzdF9pbmRleF9lbmFibGU9KChudW1fYXJyeVtURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfVEVTVF9JTkRFWF9FTkFMQkVfSU5ERVgrMV0pPDw4KSk7CglhbGxfdG9naHRlcl9lbmFibGU9KG51bV9hcnJ5W1RFU1RfQVJHXzNfQUxMX1RPR0hURVJdKTsKCXN3aXRjaCAoZGRyX3Rlc3RfY21kKQoJewkKCQljYXNlKERNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzEpOgoJCWlmKG51bV9hcnJ5WzFdPT1ETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xKQoJCXsKCQkJLy9hcmdjMj0xMDsKCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDI3IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IFwKCQkJMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggIDB4JTA4eCIsY3MwX3Rlc3Rfc3RhcnQsY3MwX3Rlc3Rfc2l6ZSxjczFfdGVzdF9zdGFydCxjczFfdGVzdF9zaXplLAoJCQl3YXRjaGRvZ190aW1lX3MsdGVzdF9pbmRleF9lbmFibGUsMCwwLDAsMCwwLDAsYWxsX3RvZ2h0ZXJfZW5hYmxlCSk7CgkJCS8vCWZvciAoaSA9IDE7aTwoYXJnYzIpO2krKykKCQkJLy8JewoJCQkvLwlhcmd2MltpXT0oYXJnW2ldKTsKCQkJLy8Jc3ByaW50ZihzdHIsIiAweCUwOHggIiwoYXJnW2ldKSk7CgkJCS8vCX0KCgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJLy8gZGRyX3Rlc3RfY21kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLChhcmd2MikpOwoJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl9hdXRvX3Rlc3Rfd2luZG93LAkzMCwJMSwJZG9fZGRyX2F1dG9fdGVzdF93aW5kb3csCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoJCmludCBkb19kZHJfYXV0b19zY2FuX2RydihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vIGRkcl90eXBlIDIgbHBkZHI0ICAgcmFua19jb25maWcKCSNkZWZpbmUgIEFVVE9fU0NBTl9ERFIzICAwCgkjZGVmaW5lICBBVVRPX1NDQU5fRERSNCAgMQoJI2RlZmluZSAgQVVUT19TQ0FOX0xQRERSMyAgMgoJI2RlZmluZSAgQVVUT19TQ0FOX0xQRERSNCAgMwoKCSNkZWZpbmUgIEFVVE9fU0NBTl9DT05GSUdfUkFOSzAgIDAKCSNkZWZpbmUgIEFVVE9fU0NBTl9DT05GSUdfUkFOSzAxICAxCgoJY2hhciAqc3RyaW5nX3ByaW50X2ZsYWc9ICAgIiB3aW5kb3ctbG9vcCBcbiI7CglnbG9iYWxfYm9vdF90aW1lcz1yZF9yZWcoUFJFR19TVElDS1lfRzEyQV9SRUcwKTsKICAKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgl1bnNpZ25lZCBpbnQgIGRkcl90eXBlPTA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9jaGFubmVsX3JhbmtfY29uZmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGxvb3A9MDsKCWNoYXIgKmVuZHA7CglpZiAoYXJnYz4xKQoJewoJCWRkcl90eXBlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJZGRyX3R5cGU9MDsKCX0KCWlmIChhcmdjPjIpCgl7CgkJZGRyX2NoYW5uZWxfcmFua19jb25maWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZz0wOwoJfQogICAgaWYgKGFyZ2M+MykKCXsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcD0wOwoJfQoJdW5zaWduZWQgaW50ICB0ZW1wX3JlZ19hZGQ9MDsKCXsKCQl0ZW1wX3JlZ19hZGQ9KChETUNfU1RJQ0tZX0cxMkFfMCkpOwoJfQoKCWNoYXIgc3RyWzEwMjRdPSIiOwoJLy8gdW5zaWduZWQgaW50ICBkZHJfdGVzdF9jbWQ9MDsKCS8vIHVuc2lnbmVkIGludCAgdGVtcF9yZWdfYWRkPTA7CgkvLyB1bnNpZ25lZCBpbnQgIG51bV9hcnJ5WzMyXT17MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKCgl1bnNpZ25lZCBpbnQgY291bnRlcl9sb29wPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX2ZyZXF1ZW5jeT0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fcD0wOy8vNzQgIC8vY29uZmlnIHNvYyBkYXRhIHBpbiBwdWxsIHVwIGRyaXZlciBzdGVuZ3RoLHNlbGVjdCAwLDI4LDMwLDMyLDM0LDM3LDQwLDQzLDQ4LDUzLDYwLDY4LDgwLDk2LDEyMG9obQoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fbj0wOy8vNzYKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX3A9MDsvLzc4ICAvL2NvbmZpZyBzb2MgZGF0YSBwaW4gb2R0IHB1bGwgdXAgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX249MDsvLzgwCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG09MDsvLzgyICAvL2NvbmZpZyBkcmFtIGRhdGEgcGluIHB1bGwgdXAgcHVsbCBkb3duIGRyaXZlciBzdGVuZ3RoLGRkcjMgc2VsZWN0IDM0LDQwb2htLGRkcjQgc2VsZWN0IDM0LDQ4b2htLGxwZGRyNCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfb2htPTA7Ly84NCAgLy9jb25maWcgZHJhbSBkYXRhIHBpbiBvZHQgcHVsbCB1cCBkb3duIHN0ZW5ndGgsZGRyMyBzZWxlY3QgNDAsNjAsMTIwb2htLGRkcjQgc2VsZWN0IDM0LDQwLDQ4LDYwLDEyMCwyNDBvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX3dyX29kdF9vaG09MDsgLy8xNzQgY2hhciAxCglpPTc0LzI7Cglzb2NfZGF0YV9kcnZfb2htX3A9ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT03Ni8yOwoJc29jX2RhdGFfZHJ2X29obV9uPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCwxNixpKTsKCWk9NzgvMjsKCXNvY19kYXRhX29kdF9vaG1fcD1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTgwLzI7Cglzb2NfZGF0YV9vZHRfb2htX249ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT04Mi8yOwoJZHJhbV9kYXRhX2Rydl9vaG09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT04NC8yOwoJZHJhbV9kYXRhX29kdF9vaG09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT0xNzQvMTsKCWRyYW1fZGF0YV93cl9vZHRfb2htPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCw4LGkpOwoJaT01Mi8yOwoJZGRyX2ZyZXF1ZW5jeT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CgkvL2Rkcl9mcmVxdWVuY3k9Z2xvYmFsX2Rkcl9jbGs7CglpZihnbG9iYWxfYm9vdF90aW1lcz09MSkKCXsKCQlwcmludGYoIlxub3JnX2dsb2JhbF9ib290X3RpbWVzPT0gJWQgJXMiLCBnbG9iYWxfYm9vdF90aW1lcyxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJLy9wcmludGYoIlxubWF4X2NvdW50ZXI9JWQgICVkICVzIixtYXhfY291bnRlcl90b3RhbCxtYXhfY291bnRlcl90b3RhbCoyLHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoIlxuc29jX2RhdGFfZHJ2X29obV9wPSVkICVzIixzb2NfZGF0YV9kcnZfb2htX3Asc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5zb2NfZGF0YV9kcnZfb2htX249JWQgJXMiLHNvY19kYXRhX2Rydl9vaG1fbixzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbnNvY19kYXRhX29kdF9vaG1fcD0lZCAlcyIsc29jX2RhdGFfb2R0X29obV9wLHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoIlxuc29jX2RhdGFfb2R0X29obV9uPSVkICVzIixzb2NfZGF0YV9vZHRfb2htX24sc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5kcmFtX2RhdGFfZHJ2X29obT0lZCAlcyIsZHJhbV9kYXRhX2Rydl9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5kcmFtX2RhdGFfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5kcmFtX2RhdGFfd3Jfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX3dyX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJfQoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vaG1fcF90W109ezM0LDQwLDQ4LDYwfTsJCgkvLyB1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9uX3RbXT17MzQsNDAsNDgsNjB9OwoKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfb2R0X29obV90X2RkcjNbXT17NDAsNjAsMTIwfTsJLy9kZHIzCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9vaG1fdF9kZHI0W109ezQwLDQ4LDYwLDEyMH07CS8vZGRyNAoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfb2htX3RfbHBkZHI0W109ezQwLDQ4LDYwLDEyMH07CS8vbHBkZHI0CgoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyM1tdPXszNCw0MH07CS8vZGRyMwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyNFtdPXszNCw0OH07CS8vZGRyNAoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9kcnZfb2htX3RfbHBkZHI0W109ezQwLDQ4LDYwfTsJLy9scGRkcjQKCgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfb2R0X29obV9wX3RbXT17NDAsNDgsNjAsODAsMTIwfTsJCgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfb2R0X29obV9uX3RbXT17NDAsNDgsNjAsODAsMTIwfTsKCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzW109ezYwLDEyMCwwfTsJLy9kZHIzCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHI0W109ezgwLDEyMCwwfTsJLy9kZHI0CgoJdW5zaWduZWQgaW50ICAqcF9zb2NfZGF0YV9kcnZfb2htX3A9TlVMTDsKCS8vICB1bnNpZ25lZCBpbnQgICpwX3NvY19kYXRhX2Rydl9vaG1fbj1OVUxMOwoJdW5zaWduZWQgaW50ICAqcF9zb2NfZGF0YV9vZHRfb2htX3A9TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfc29jX2RhdGFfb2R0X29obV9uPU5VTEw7CgoKCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX2Rydl9vaG09TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX29kdF9vaG09TlVMTDsKCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX3dyX29kdF9vaG09TlVMTDsKCglwX3NvY19kYXRhX2Rydl9vaG1fcD1zb2NfZGF0YV9kcnZfb2htX3BfdDsKCS8vIHBfc29jX2RhdGFfZHJ2X29obV9uPXNvY19kYXRhX2Rydl9vaG1fbl90OwoJcF9zb2NfZGF0YV9vZHRfb2htX3A9c29jX2RhdGFfb2R0X29obV9wX3Q7CglwX3NvY19kYXRhX29kdF9vaG1fbj1zb2NfZGF0YV9vZHRfb2htX25fdDsKCgoJcF9kcmFtX2RhdGFfZHJ2X29obT1kcmFtX2RhdGFfZHJ2X29obV90X2RkcjM7CglwX2RyYW1fZGF0YV9vZHRfb2htPWRyYW1fZGF0YV9vZHRfb2htX3RfZGRyMzsKCXBfZHJhbV9kYXRhX3dyX29kdF9vaG09ZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzOwoKCXVuc2lnbmVkIGludCBtYXhfY291bnRlcl9sb29wX3cxPShzaXplb2Yoc29jX2RhdGFfZHJ2X29obV9wX3QpKS8oc2l6ZW9mKHNvY19kYXRhX2Rydl9vaG1fcF90WzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF93Mj0oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyMykpLyhzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9kZHIzWzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF9yMT0oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyMykpLyhzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHIzWzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF9yMj0oc2l6ZW9mKHNvY19kYXRhX29kdF9vaG1fcF90KSkvKHNpemVvZihzb2NfZGF0YV9vZHRfb2htX3BfdFswXSkpOwoJdW5zaWduZWQgaW50IG1heF9jb3VudGVyX2xvb3Bfd3IxPTE7CglpZihkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZykKCXsKCQltYXhfY291bnRlcl9sb29wX3dyMT0oc2l6ZW9mKGRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyMykpLyhzaXplb2YoZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzWzBdKSk7Cgl9CgkvL2Rkcl9jaGFubmVsX3JhbmtfY29uZmlnQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMAkKCWlmKGRkcl90eXBlPT1BVVRPX1NDQU5fRERSNCkKCXsKCQlwX2RyYW1fZGF0YV9kcnZfb2htPWRyYW1fZGF0YV9kcnZfb2htX3RfZGRyNDsKCQlwX2RyYW1fZGF0YV9vZHRfb2htPWRyYW1fZGF0YV9vZHRfb2htX3RfZGRyNDsKCQlwX2RyYW1fZGF0YV93cl9vZHRfb2htPWRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyNDsKCQltYXhfY291bnRlcl9sb29wX3cyPShzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9kZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2RkcjRbMF0pKTsKCQltYXhfY291bnRlcl9sb29wX3IxPShzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2RkcjRbMF0pKTsKCgkJaWYoZGRyX2NoYW5uZWxfcmFua19jb25maWcpCgkJewoJCQltYXhfY291bnRlcl9sb29wX3dyMT0oc2l6ZW9mKGRyYW1fZGF0YV93cl9vZHRfb2htX3RfZGRyNCkpLyhzaXplb2YoZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHI0WzBdKSk7CgkJfQoJfQoJaWYoZGRyX3R5cGU9PUFVVE9fU0NBTl9MUEREUjQpCgl7CgkJcF9kcmFtX2RhdGFfZHJ2X29obT1kcmFtX2RhdGFfZHJ2X29obV90X2xwZGRyNDsKCQlwX2RyYW1fZGF0YV9vZHRfb2htPWRyYW1fZGF0YV9vZHRfb2htX3RfbHBkZHI0OwoJCS8vCXBfZHJhbV9kYXRhX3dyX29kdF9vaG09ZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9scGRkcjQ7CgkJbWF4X2NvdW50ZXJfbG9vcF93Mj0oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfbHBkZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2xwZGRyNFswXSkpOwoJCW1heF9jb3VudGVyX2xvb3BfcjE9KHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2xwZGRyNCkpLyhzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9scGRkcjRbMF0pKTsKCQltYXhfY291bnRlcl9sb29wX3IyPShzaXplb2Yoc29jX2RhdGFfb2R0X29obV9uX3QpKS8oc2l6ZW9mKHNvY19kYXRhX29kdF9vaG1fbl90WzBdKSk7CgoJCS8vCXVuc2lnbmVkIGludCAgKnBfZHJhbV9kYXRhX3dyX29kdF9vaG09ZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9scGRkcjQ7CgkJaWYoZGRyX2NoYW5uZWxfcmFua19jb25maWcpCgkJewoJCQltYXhfY291bnRlcl9sb29wX3dyMT0xOwoJCX0KCX0KCiAgICB1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfdG90YWw9KG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikqbWF4X2NvdW50ZXJfbG9vcF93cjE7CgkvL2FkZCAyIHRpbWVzIHJlY292ZXIgCgkvKgoJc3dpdGNoIChnbG9iYWxfYm9vdF90aW1lcykKCXsJCgkJY2FzZSgxKToKCQl7CgkJCWJyZWFrOwoJCX0KCX0KCSovCgkvL2VhY2ggYXJyYXJ5IHRlc3QgMiB0aW1lcyAsZm9yIG1heWJlIDF0aW1lcyB3aWxsIGZhaWwsdGhlbiBuZXh0IHRpbWUgd2lsbCByZWNvdmVyeSAvL2ppYXhpbmcgMjAxODExMTQKCWNvdW50ZXJfbG9vcD0oKChnbG9iYWxfYm9vdF90aW1lcy0xKS8yKSVtYXhfY291bnRlcl90b3RhbCk7CglkcmFtX2RhdGFfd3Jfb2R0X29obT0wOwoJaWYobWF4X2NvdW50ZXJfbG9vcF93cjE+MSkKCXsKCQlkcmFtX2RhdGFfd3Jfb2R0X29obT1wX2RyYW1fZGF0YV93cl9vZHRfb2htWyhjb3VudGVyX2xvb3AvKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpXTsKCX0KCWlmKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpPChtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIpKQoJewoJCXNvY19kYXRhX2Rydl9vaG1fcD1wX3NvY19kYXRhX2Rydl9vaG1fcFsoKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpKSVtYXhfY291bnRlcl9sb29wX3cxKV07CgkJc29jX2RhdGFfZHJ2X29obV9uPXNvY19kYXRhX2Rydl9vaG1fcDsKCQlkcmFtX2RhdGFfb2R0X29obT1wX2RyYW1fZGF0YV9vZHRfb2htWyAgKCgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKSkvbWF4X2NvdW50ZXJfbG9vcF93MSldOwoJfQoJZWxzZSBpZigoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKT09KChtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIpKzApKQoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwoJCS8vCXNwcmludGYoc3RyLCJnMTJfZDJwbGwgMTIwMCAgMHgxMSAgMHg2IDAgMHgwIDAgMCAwIDB4ODAwMDAwICAgIDAgMSAgICIKCQkvLwlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJLy8JcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJZWxzZSBpZigoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKTwobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyLTEpKQoJewoJCWRyYW1fZGF0YV9kcnZfb2htPXBfZHJhbV9kYXRhX2Rydl9vaG1bKCgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpLShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrMSkpJW1heF9jb3VudGVyX2xvb3BfcjEpXTsKCQlzb2NfZGF0YV9vZHRfb2htX3A9cF9zb2NfZGF0YV9vZHRfb2htX3BbKCgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpLShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrMSkpL21heF9jb3VudGVyX2xvb3BfcjEpXTsKCQlzb2NfZGF0YV9vZHRfb2htX249MDsKCQlpZihkZHJfdHlwZT09Q09ORklHX0REUl9UWVBFX0xQRERSNCkKCQl7CgkJCXNvY19kYXRhX29kdF9vaG1fcD0wOwoJCQlzb2NfZGF0YV9vZHRfb2htX249cF9zb2NfZGF0YV9vZHRfb2htX25bKCgoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpLShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrMSkpL21heF9jb3VudGVyX2xvb3BfcjEpXTsKCQl9Cgl9CgllbHNlIGlmKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpPT0obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyLTEpKQoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwoJfQoJcHJpbnRmKCJcbmdsb2JhbF9ib290X3RpbWVzPT0gJWQgJXMiLCBnbG9iYWxfYm9vdF90aW1lcyxzdHJpbmdfcHJpbnRfZmxhZyk7CglpZihsb29wKQoJewoJCWlmKCgoZ2xvYmFsX2Jvb3RfdGltZXMtMSkvMik+bWF4X2NvdW50ZXJfdG90YWwpCgkJCXJldHVybiAxOwoJfQoJcHJpbnRmKCJcbm1heF9jb3VudGVyPSVkICAlZCAlcyIsbWF4X2NvdW50ZXJfdG90YWwsbWF4X2NvdW50ZXJfdG90YWwqMixzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuc29jX2RhdGFfZHJ2X29obV9wPSVkICVzIixzb2NfZGF0YV9kcnZfb2htX3Asc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbnNvY19kYXRhX2Rydl9vaG1fbj0lZCAlcyIsc29jX2RhdGFfZHJ2X29obV9uLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5zb2NfZGF0YV9vZHRfb2htX3A9JWQgJXMiLHNvY19kYXRhX29kdF9vaG1fcCxzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuc29jX2RhdGFfb2R0X29obV9uPSVkICVzIixzb2NfZGF0YV9vZHRfb2htX24sc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbmRyYW1fZGF0YV9kcnZfb2htPSVkICVzIixkcmFtX2RhdGFfZHJ2X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuZHJhbV9kYXRhX29kdF9vaG09JWQgJXMiLGRyYW1fZGF0YV9vZHRfb2htLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5kcmFtX2RhdGFfd3Jfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX3dyX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwp7CglpZihzb2NfZGF0YV9kcnZfb2htX3ApCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDc0ICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX2Rydl9vaG1fcCk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmKHNvY19kYXRhX2Rydl9vaG1fbikKCXsKCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MzYgMHgyMDE4MDAzMCAweDEgNzYgJWQgMiAgMCAgICIsCgkJc29jX2RhdGFfZHJ2X29obV9uKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJaWYoc29jX2RhdGFfb2R0X29obV9wKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA3OCAlZCAyICAwICAgIiwKCQlzb2NfZGF0YV9vZHRfb2htX3ApOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZihzb2NfZGF0YV9vZHRfb2htX24pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDgwICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX29kdF9vaG1fbik7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmKGRyYW1fZGF0YV9kcnZfb2htKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA4MiAlZCAyICAwICAgIiwKCQlkcmFtX2RhdGFfZHJ2X29obSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmKGRyYW1fZGF0YV9vZHRfb2htKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA4NCAlZCAyICAwICAgIiwKCQlkcmFtX2RhdGFfb2R0X29obSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCS8vaWYoZHJhbV9kYXRhX3dyX29kdF9vaG0pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDE3NCAlZCAxICAwICAgIiwKCQlkcmFtX2RhdGFfd3Jfb2R0X29obSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCglzcHJpbnRmKHN0ciwiZzEyX2QycGxsICVkICAweDEyICAweDYgMCAweDAgMCAwIDAgMHg4MDAwMDAgICAgMCAxICAgIixkZHJfZnJlcXVlbmN5KTsKCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCXJ1bl9jb21tYW5kKHN0ciwwKTsKfQoKcmV0dXJuIDE7Cn0KCmludCBkb19kZHJfYXV0b19mYXN0Ym9vdF9jaGVjayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKI2RlZmluZSBETUNfVEVTVF9TTFRfRU5BQkxFX0REUl9BVVRPX0ZBU1RfQk9PVCAoMTw8NSkKI2RlZmluZSAgQVVUT19XSU5ET1dfVEVTVF9FTkFCTEVfSVRFTSAgICgoMTw8MSl8KDE8PDIpKQovLwlpbnQgaT0wOwovLwlpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7CgkvL3Vuc2lnbmVkIGludCBlbmFibGVfZGRyX2Zhc3RfYm9vdD0wOyAgLy8gMCBwYXVzZSAxLHJlc3VtZQoJY2hhciBhdXRvX3dpbmRvd190ZXN0X2VuYWJsZV9pdGVtPURNQ19URVNUX1NMVF9FTkFCTEVfRERSX0FVVE9fRkFTVF9CT09UOwoJdWludDMyX3QgYXV0b193aW5kb3dfdGVzdF9kcV9zaXplPTA7CgljaGFyIHBhdHRlcm5fZGlzX3NjcmFtYmxlPTA7CglpZiAoYXJnYz4xKQoJewoJCWF1dG9fd2luZG93X3Rlc3RfZW5hYmxlX2l0ZW0gPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlhdXRvX3dpbmRvd190ZXN0X2VuYWJsZV9pdGVtPURNQ19URVNUX1NMVF9FTkFCTEVfRERSX0FVVE9fRkFTVF9CT09UOwoJfQoJCWlmIChhcmdjPjIpCgl7CgkJYXV0b193aW5kb3dfdGVzdF9kcV9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJYXV0b193aW5kb3dfdGVzdF9kcV9zaXplPTA7Cgl9CgkJCQlpZiAoYXJnYz4zKQoJewoJCXBhdHRlcm5fZGlzX3NjcmFtYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJcGF0dGVybl9kaXNfc2NyYW1ibGU9MDsKCX0KCWNoYXIgc3RyWzEwMjRdPSIiOwoJZGRyX3NldF90ICpkZHJfc2V0X3RfcD1OVUxMOwoJZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJLy9kZHJfc2V0X3RfcD0gKGRkcl9zZXRfdCAqKUcxMl9ETUNfU1RJQ0tZXzA7CgkvL2lmIChzaXplb2YoZGRyX3NldF90KTxsb29wX21heCkKCXVpbnQzMl90ICBkZHJfc2V0X2FkZD0wOwoJdWludDMyX3QgIGRkcl9zZXRfc2l6ZT0wOwoJZGRyX3NldF9hZGQ9KHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApOwoJZGRyX3NldF9zaXplPXNpemVvZihkZHJfc2V0X3QpOwoJcHJpbnRmKCJcbmRkcl9zZXRfdF9wPT0weCUwOHhcbiIsZGRyX3NldF9hZGQpOwoJdWludDMyX3QgbG9vcD0wOyAKCXVpbnQzMl90IGxvb3BfbWF4ID0gKDQrKDB4M2Y8PDIpKTsvLygoRE1DX1NUSUNLWV82My1ETUNfU1RJQ0tZXzApKTsKCQkJLy8JbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7CgkJCWZvciAobG9vcCA9IDA7IGxvb3AgPGxvb3BfbWF4OyBsb29wKz00KSB7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkoZGRyX3NldF90X3ApICsgbG9vcCksIHJkX3JlZyhHMTJfRE1DX1NUSUNLWV8wICsgbG9vcCkpOwoJCQl9CgkKCgkJLy8JaWYoKGRkcl9zZXRfdF9wLT5zbHRfdGVzdF9mdW5jdGlvblswXSkmRE1DX1RFU1RfU0xUX0VOQUJMRV9ERFJfQVVUT19GQVNUX0JPT1QpCgkvLwlpZigoZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXSk+PTB4ZmUpCgkJCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSkKCQkJCXsKCQkJCXByaW50ZigiXG51Ym9vdCBlbmFibGUgYXV0byBmYXN0IGJvb3QgZnVuY2l0b24gXG4iKTsKCQkJCX0KZWxzZSAKCSAgcmV0dXJuIDEgOwoKCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKT09MHhmZikKCQkJCXsJcHJpbnRmKCJcbnVib290ICBhdXRvIGZhc3QgYm9vdCAgYXV0byB3aW5kb3cgdGVzdCBpcyBkb25lIFxuIik7CgkgcmV0dXJuIDEgOwoJCQkJfQoKcHJpbnRmKCJcbihkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKT09MHglMDh4XG4iLChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSk7CnsKCQl1aW50MTZfdAlkcV9iaXRfZGVsYXlbNzJdOwoJCXVuc2lnbmVkCWNoYXIgdF9jb3VudD0wOwoJCXVpbnQxNl90ICBkZWxheV9vcmc9MDsKCQl1aW50MTZfdCAgZGVsYXlfdGVtcD0wOwoJCXVpbnQzMl90ICBhZGRfb2Zmc2V0PTA7CgkJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwweDApOwoKCQl7CgoJCQkKCgkvLwlwcmludGYoIlxuIEFSZFB0ckluaXRWYWwiKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgwPDwxNil8KDA8PDEyKXwoMHgyZSkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQlkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbD1kZWxheV9vcmc7CgkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJCgkvLwlwcmludGYoIlxuIGRmaW1ybDAgZGZpbXJsMSBkZmltcmwyIGRmaW1ybDMgSHd0TVJMIik7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MjApKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJZGRyX3NldF90X3AtPmRmaV9tcmw9ZGVsYXlfb3JnOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMTw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMSxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMjw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMixkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMzw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMyxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoKCQlkZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybD1kZWxheV9vcmc7CgkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJfQoJewoJLy8JcHJpbnRmKCJcbiBjb3VudF9pbmRleCAgICAgZGVsYXlfdmFsdWUgICAgIHJlZ2lzdGVyX2FkZCAgICAgcmVnaXN0ZXJfdmFsdWUgXG4gIik7CgkvLwlwcmludGYoIlxuIGFkZHJlc3MgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lICAtLXN0ZXA9PTEvMzJVSSAsYml0IDYgaXMgY29hcnNlICAtLXN0ZXA9PTFVSSIsdWlfMV8zMl8xMDBzdGVwKTsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8MTA7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMDw8MTYpfCh0X2NvdW50PDwxMil8KDB4ODApKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHRkcXMgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJICxiaXQgNi05IGlzIGNvYXJzZSAgLS1zdGVwPT0xVUkiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweGQwKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJCgkJCWRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCgkJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHJ4ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSxubyBjb2Fyc2UiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweDhjKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHdyaXRlIGRxX2JpdCBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLS1zdGVwPT0xLzMyVUkgLGJpdCA2LTggaXMgY29hcnNlICAtLXN0ZXA9PTFVIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCQl7CgkJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoMHhjMCsoKHRfY291bnQlOSk8PDgpKyh0X2NvdW50LzM2KSkpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJCWRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCgkJCQkKCQkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByZWFkIGRxX2JpdCBkZWxheSAqIEJETFJ4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09YmRsciBzdGVwIHNpemUgYWJvdXQgNXBzLG5vIGNvYXJzZSIsYmRscl8xMDBzdGVwKTsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KDB4NjgrKCh0X2NvdW50JTkpPDw4KSsodF9jb3VudC8zNikpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgoZGVsYXlfb3JnJjB4M2YpKTsKCQkJCgkJCWRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByZWFkIGRxcyBnYXRlIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAsYml0IDYtMTAgaXMgY29hcnNlIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoKCQkJCgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9CgoJLy8JcHJpbnRmKCJcbiBzb2MgdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLjA0NyArIFZyZWZEQUMwWzY6MF0qMC4wMDM2NyAgIEREUjQgLS1WUkVGID0gVkREUSooMC41MTAgKyBWcmVmREFDMFs2OjBdKjAuMDAzNDUiKTsKCQkvLygoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSkJCgkJdWludDMyX3QgdnJlZl90X2NvdW50PTA7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgoKHRfY291bnQlMzYpJTkpPDw4KXwoMHg0MCkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KChkZWxheV9vcmcpKTsKCmlmKHRfY291bnQ8MzUpCnsKCQkJdnJlZl90X2NvdW50PSgoKCh0X2NvdW50JTM2KS85KSo4KSsodF9jb3VudCU5KSk7CgoJCQlkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmW3ZyZWZfdF9jb3VudF09ZGVsYXlfdGVtcDsKfQoKCQkJCgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9CgoKCi8vCXByaW50ZigiXG4gZHJhbSB2cmVmIDogbHBkZHI0LS0gVlJFRiA9IFZERFEqKDAuICsgVnJlZkRBQzBbNjowXSowLiAgIEREUjQgLS1WUkVGID0gVkREUSooMC4gKyBWcmVmREFDMFs2OjBdKjAuIik7CglhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwODIpKTsKZGVsYXlfdGVtcD1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJCQlmb3IodF9jb3VudD0wO3RfY291bnQ8MzI7dF9jb3VudCsrKQoJCXsKCgkJCgkJCWRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RfY291bnRdPWRlbGF5X3RlbXA7CgoKCQkJCgkJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9CgkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV90ZW1wKTsKCX0KCQkJCQkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCXsvL3BfZGV2LT5wX2RkcnMtPnRkcXMyZHE9bHBkZHI0X3RkcXMyZHE7CgkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1swXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhYSkpOyAgLy9QcHRDdGxTdGF0aWMKCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzFdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFlKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmswCgkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1syXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhZikpOyAgLy9QcHREcXNDbnRJbnZUcm5UZzAgIHBzMCByYW5rMQoJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCswXT0oZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKSkmMHhmZjsgIC8vUHB0Q3RsU3RhdGljCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzFdPShkd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhYSkpKT4+ODsgIC8vUHB0Q3RsU3RhdGljCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzJdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFlKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmswIGxhbmUgMC0zCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzNdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxIGxhbmUgMC0zCgkJfQp9CgoKCgkKCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKTwweGZlKQoJewoJCXByaW50ZigiXG51Ym9vdCAgYXV0byBmYXN0IGJvb3QgIGF1dG8gd2luZG93IHRlc3QgYmVnaW4gXG4iKTsKCQl7CgkJZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXT0weGZlOwoJCSNpZmRlZiBERUJVR19ERFJfRkFTVEJPT1RfU0hBCgkJcHJpbnRmKCImZGRyX3NoYS5kZHJzIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5kZHJzKTsKCQlwcmludGYoIiZkZHJfc2hhLnNoYTIgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLnNoYTIpOwoJCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KWRkcl9zZXRfYWRkKTsKCQkjZW5kaWYKCQlzaGEyNTZfY3N1bV93ZCgodW5zaWduZWQgY2hhciAqKSh1aW50NjRfdClkZHJfc2V0X2FkZCwgc2l6ZW9mKGRkcl9zZXRfdCksIGRkcl9zaGEuc2hhMiwgMCk7CgkJI2lmZGVmIERFQlVHX0REUl9GQVNUQk9PVF9TSEEKCQlwcmludGYoInByaW50IHNoYVxuIik7CgkJc3ByaW50ZihzdHIsIm1kICUwOHggMHgxMDAiLCAodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X2FkZC0zMikpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkjZW5kaWYKewoJCSNpZmRlZiBVU0VfRk9SX1VCT09UXzIwMTgKCQlzcHJpbnRmKHN0ciwic3RvcmUgcnN2IHdyaXRlIGRkci1wYXJhbWV0ZXIgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLVNIQTI1Nl9TVU1fTEVOLGRkcl9zZXRfc2l6ZStTSEEyNTZfU1VNX0xFTik7CgkjZWxzZQoJCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJI2VuZGlmCgkvLwkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLGRkcl9zZXRfc2l6ZSk7Ci8vCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCQoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCX0KCQoJCQlzcHJpbnRmKHN0ciwiZzEyX2QycGxsICVkIDB4MTEgJWQgMCAwIDAgMCAwIDB4JTA4eCAgMCAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzBdLGF1dG9fd2luZG93X3Rlc3RfZW5hYmxlX2l0ZW0sYXV0b193aW5kb3dfdGVzdF9kcV9zaXplLHBhdHRlcm5fZGlzX3NjcmFtYmxlKTsKCQoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCX0KCSByZXR1cm4gMSA7CgkJCQl9CgoJaWYoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF0pPT0weGZlKQoJCXsKCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PTA7CgkJY2hhciBkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg9MDsKCnsKCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDB4ZDw8MTYpfCgwPDwxMil8KDB4MCksMCk7IC8vIERXQ19ERFJQSFlBX0FQQk9OTFkwX01pY3JvQ29udE11eFNlbAoKCWRtY190ZXN0X3dvcnN0X3dpbmRvd190eD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzIpKTsKCWRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzMpKTsKCXByaW50ZigiXG5kbWNfdGVzdF93b3JzdF93aW5kb3dfdHggPSVkIFxuIixkbWNfdGVzdF93b3JzdF93aW5kb3dfdHgpOwoJcHJpbnRmKCJcbmRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD0lZCBcbiIsZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4KTsKCWlmKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD4zMCkKCQlkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg9MzA7CglpZihkbWNfdGVzdF93b3JzdF93aW5kb3dfcng+MzApCgkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PTMwOwovLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgxYzIpLHQ0X3dyaXRlX3dvcnN0X21hcmdpbl9yYW5rMSk7Ci8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMyksdDRfcmVhZF93b3JzdF9tYXJnaW5fcmFuazEpOwpkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzFdPSgoKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eC8yKTw8NCkpfCgoKGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeC8yKSkpOwoJCQkJfQoJCgkJZGRyX3NldF90X3AtPmZhc3RfYm9vdFswXT0weGZmOwoJCQkJewlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290ICBhdXRvIHdpbmRvdyB0ZXN0IGZpbmlzaCBcbiIpOwoKICAgICAgICAgICAgaWYoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkKICAgICAgICAgICAgCXsKICAgICAgICAgICAgCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDcpCiAgICAgICAgICAgIAkJewogICAgICAgICAgICAJICBpZigoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4OCkpCiAgICAgICAgICAgIAkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAzIDB4MCAgMCAwIDEgJWQgIiwoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg3KTsKCQkJCSAgZWxzZQoJCQkJICAJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMyAweDAgIDAgMCAyICVkICIsKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4Nyk7CgkKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwogICAgICAgICAgICAJCX0KCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDcwKQoJCXsKCQkgaWYoKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKSYweDgwKSkKICAgICAgICAgICAgCQkJCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhIDIgMHgwICAwIDAgMSAlZCAiLCgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSk+PjQpJjB4Nyk7CgkJCQkgIGVsc2UKCQkJCSAgCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhIDIgMHgwICAwIDAgMiAlZCAiLCgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSk+PjQpJjB4Nyk7CgkKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCX0KCgkJCXNwcmludGYoc3RyLCJkZHJfZmFzdF9ib290IDEgIik7CgkKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkKICAgICAgICAgICAgCX0KICAJZWxzZQoJewoJCSNpZmRlZiBERUJVR19ERFJfRkFTVEJPT1RfU0hBCgkJcHJpbnRmKCImZGRyX3NoYS5kZHJzIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5kZHJzKTsKCQlwcmludGYoIiZkZHJfc2hhLnNoYTIgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLnNoYTIpOwoJCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KWRkcl9zZXRfYWRkKTsKCQkjZW5kaWYKCQlzaGEyNTZfY3N1bV93ZCgodW5zaWduZWQgY2hhciAqKSh1aW50NjRfdClkZHJfc2V0X2FkZCwgc2l6ZW9mKGRkcl9zZXRfdCksIGRkcl9zaGEuc2hhMiwgMCk7CgkJI2lmZGVmIERFQlVHX0REUl9GQVNUQk9PVF9TSEEKCQlwcmludGYoInByaW50IHNoYVxuIik7CgkJc3ByaW50ZihzdHIsIm1kICUwOHggMHgxMDAiLCAodWludDMyX3QpKHVpbnQ2NF90KShkZHJfc2V0X2FkZC0zMikpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkjZW5kaWYKCgl7CgkJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sZGRyX3NldF9zaXplK1NIQTI1Nl9TVU1fTEVOKTsKCQkjZWxzZQoJCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJCSNlbmRpZgoJCS8vCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZCxkZHJfc2V0X3NpemUpOwoJLy8Jc3ByaW50ZihzdHIsInN0b3JlIHJzdiB3cml0ZSBkZHItcGFyYW1ldGVyIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZCxkZHJfc2V0X3NpemUpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJfQoJCQl9CgkgcmV0dXJuIDEgOwoJCQkJfQoJCX0KCgoKCXJldHVybiAxOwoKCn0KVV9CT09UX0NNRCgKCWRkcl9hdXRvX3NjYW5fZHJ2LAkzMCwJMSwJZG9fZGRyX2F1dG9fc2Nhbl9kcnYsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX3Rlc3RfY21kIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwpVX0JPT1RfQ01EKAoJZGRyX2Zhc3RfYm9vdCwJMzAsCTEsCWRvX2Rkcl9mYXN0Ym9vdF9jb25maWcsCgkiZGRyX2Zhc3Rib290X2NvbmZpZyBjbWQgYXJnMSBhcmcyIGFyZzMuLi4iLAoJImRkcl9mYXN0Ym9vdF9jb25maWcgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7ClVfQk9PVF9DTUQoCglkZHJfYXV0b19mYXN0X2Jvb3RfY2hlY2ssCTMwLAkxLAlkb19kZHJfYXV0b19mYXN0Ym9vdF9jaGVjaywKCSJkZHJfZmFzdGJvb3RfY29uZmlnIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX2Zhc3Rib290X2NvbmZpZyBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKCg==