LyoKKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1sb2dpYywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqICoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKiAqClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAoqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgoqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgoqIG1vcmUgZGV0YWlscy4KKiAqCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCiogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgoqICoKRGVzY3JpcHRpb246CiovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDx1LWJvb3Qvc2hhMjU2Lmg+CgoKLy8jZGVmaW5lICBVU0VfRk9SX05FV01BTgovLyNkZWZpbmUgVVNFX0ZPUl9VQk9PVF8yMDE4CgojaWZkZWYgQ09ORklHX0VOVl9JU19OT1dIRVJFCgppbnQgc2V0ZW52KGNvbnN0IGNoYXIgKnZhcm5hbWUsIGNvbnN0IGNoYXIgKnZhcnZhbHVlKQp7CnJldHVybiAxOwp9CgpjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqbmFtZSkKewoJcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAvL0NPTkZJR19FTlZfSVNfTk9XSEVSRQojZGVmaW5lIERXQ19BQ19QSU5NVVhfVE9UQUwJCQkJCQkyOAojZGVmaW5lIERXQ19ERklfUElOTVVYX1RPVEFMCQkJCQkyNgoKLy8jZGVmaW5lIEREUl9VU0VfREVGSU5FX1RFTVBMQVRFX0NPTkZJRyAgIDEKI2RlZmluZSBERFJfU1RJQ0tZX01BR0lDX05VTUJFUgkJCQkJMHgyMDE4MDAwMAojZGVmaW5lIEREUl9DSElQX0lECQkJCQkJCQkweDMwCiNkZWZpbmUgRERSX1NUSUNLWV9TT1VSQ0VfRE1DX1NUSUNLWQkJCTB4MQojZGVmaW5lIEREUl9TVElDS1lfU09VUkNFX1NSQU0JCQkJCTB4MgoKI2RlZmluZSBERFJfU1RJQ0tZX09WRVJSSURFX0NPTkZJR19NRVNTQUdFX0NNRAkweDEgLy9vdmVycmlkZSBjb25maWcKI2RlZmluZSBERFJfU1RJQ0tZX1NQRUNJQUxfRlVOQ1RJT05fQ01ECQkJMHgyIC8vc3BlY2lhbCB0ZXN0IHN1Y2ggYXMgc2hpZnQgc29tZSBiZGxyIG9yIHBhcmFtZXRlciBvciBpbnRlcmxlYXZlIHRlc3QKCiNkZWZpbmUgRERSX0lOSVRfQ09ORklHX1NUSUNLWV9NRVNTQUdFX1NSQU1fQUREUkVTUwkweDAwMDQwMDAwCiNkZWZpbmUgRERSX0lOSVRfQ09ORklHX0dMT0JBTF9NRVNTQUdFX1NSQU1fQUREUkVTUwkweDAwMDUwMDAwCiNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0REUjMJCQkJMAojZGVmaW5lIENPTkZJR19ERFJfVFlQRV9ERFI0CQkJCTEKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfTFBERFI0CQkJCTIKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfTFBERFIzCQkJCTMKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfTFBERFIyCQkJCTQKLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9MUEREUjRYCQkJCTUKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfQVVUTwkJCQkweGYKI2RlZmluZSBDT05GSUdfRERSX1RZUEVfQVVUT19MSU1JVAkJCUNPTkZJR19ERFJfVFlQRV9ERFI0CgojZGVmaW5lIENPTkZJR19ERFIwXzE2QklUX0NIMAkJCQkweDEKI2RlZmluZSBDT05GSUdfRERSMF8xNkJJVF9SQU5LMDFfQ0gwCQkweDQKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMF9DSDAJCQkweDIKI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMDFfQ0gwMQkJMHgzCiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfMTZCSVRfUkFOSzBfQ0gwCTB4NQojZGVmaW5lIENPTkZJR19ERFIwXzMyQklUXzE2QklUX1JBTkswMV9DSDAJMHg2CiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMAkJMHg3CiNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzBfQ0gwMQkJMHg4CgoKc3RhdGljIHVpbnQzMl90IGRkcl9yZF84XzE2Yml0X29uXzMycmVnKHVpbnQzMl90IGJhc2VfYWRkcix1aW50MzJfdCBzaXplLHVpbnQzMl90IG9mZnNldF9pbmRleCkKewoJdWludDMyX3QgcmVhZF92YWx1ZT0wOwoJdWludDMyX3QgYWRkcl90PTA7Cgl1aW50MzJfdCBvZmZzZXQ9MDsKCWlmKHNpemU9PTgpewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCU0KTw8Myk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjIpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJcmVhZF92YWx1ZT0ocmVhZF92YWx1ZT4+b2Zmc2V0KSYweGZmOwoKCX0KCWlmKHNpemU9PTE2KXsKCQlvZmZzZXQ9KChvZmZzZXRfaW5kZXglMik8PDQpOwoJCWFkZHJfdD0oYmFzZV9hZGRyKygob2Zmc2V0X2luZGV4Pj4xKSA8PCAyKSk7CgkJcmVhZF92YWx1ZT0gKCoodm9sYXRpbGUgdWludDMyX3QgKikoKCB1bnNpZ25lZCBsb25nICkoYWRkcl90KSkpOwoJCXJlYWRfdmFsdWU9KHJlYWRfdmFsdWU+Pm9mZnNldCkmMHhmZmZmOwoJfQoJcmV0dXJuIHJlYWRfdmFsdWU7Cgp9CnN0YXRpYyB1aW50MzJfdCBkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyh1aW50MzJfdCBiYXNlX2FkZHIsdWludDMyX3Qgc2l6ZSx1aW50MzJfdCBvZmZzZXRfaW5kZXgsdWludDMyX3QgdmFsdWUpCnsKCXVpbnQzMl90IHJlYWRfdmFsdWU9MDsKCXVpbnQzMl90IHdyaXRlX3ZhbHVlPTA7Cgl1aW50MzJfdCBhZGRyX3Q9MDsKCXVpbnQzMl90IG9mZnNldD0wOwoJaWYoc2l6ZT09OCl7CgkJb2Zmc2V0PSgob2Zmc2V0X2luZGV4JTQpPDwzKTsKCQlhZGRyX3Q9KGJhc2VfYWRkcisoKG9mZnNldF9pbmRleD4+MikgPDwgMikpOwoJCXJlYWRfdmFsdWU9ICgqKHZvbGF0aWxlIHVpbnQzMl90ICopKCggdW5zaWduZWQgbG9uZyApKGFkZHJfdCkpKTsKCQl3cml0ZV92YWx1ZT0odmFsdWU8PG9mZnNldCl8KHJlYWRfdmFsdWUmKH4oMHhmZjw8b2Zmc2V0KSkpOwoJfQoJaWYoc2l6ZT09MTYpewoJCW9mZnNldD0oKG9mZnNldF9pbmRleCUyKTw8NCk7CgkJYWRkcl90PShiYXNlX2FkZHIrKChvZmZzZXRfaW5kZXg+PjEpIDw8IDIpKTsKCQlyZWFkX3ZhbHVlPSAoKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKSk7CgkJd3JpdGVfdmFsdWU9KHZhbHVlPDxvZmZzZXQpfChyZWFkX3ZhbHVlJih+KDB4ZmZmZjw8b2Zmc2V0KSkpOwoJfQoJKih2b2xhdGlsZSB1aW50MzJfdCAqKSgoIHVuc2lnbmVkIGxvbmcgKShhZGRyX3QpKT13cml0ZV92YWx1ZTsKCXJldHVybiB3cml0ZV92YWx1ZTsKfQp0eXBlZGVmIHN0cnVjdCBkZHJfc2V0ewoJdW5zaWduZWQJaW50CQltYWdpYzsKCXVuc2lnbmVkCWNoYXIJZmFzdF9ib290WzRdOy8vIDAgICBmYXN0Ym9vdCBlbmFibGUgIDEgd2luZG93IHRlc3QgbWFyZ2luICAyIGF1dG8gb2Zmc2V0IGFmdGVyIHdpbmRvdyB0ZXN0IDMgYXV0byB3aW5kb3cgdGVzdAovLwl1bnNpZ25lZAlpbnQJCXJzdl9pbnQwOwoJdW5zaWduZWQJY2hhcglib2FyZF9pZDsKCS8vYm9hcmQgaWQgcmVzZXJ2ZSwsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcgl2ZXJzaW9uOwoJLy8gZmlybXdhcmUgcmVzZXJ2ZSB2ZXJzaW9uLCxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCURyYW1UeXBlOwoJLy9zdXBwb3J0IERyYW1UeXBlIHNob3VsZCBjb25maXJtIHdpdGggYW1sb2dpYwoJLy8jZGVmaW5lIENPTkZJR19ERFJfVFlQRV9ERFIzCQkJCTAKCS8vI2RlZmluZSBDT05GSUdfRERSX1RZUEVfRERSNAkJCQkxCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSNAkJCQkyCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMwkJCQkzCgkvLyNkZWZpbmUgQ09ORklHX0REUl9UWVBFX0xQRERSMgkJCQk0Cgl1bnNpZ25lZAljaGFyCURpc2FibGVkRGJ5dGU7CgkvL3VzZSBmb3IgZHJhbSBidXMgMTZiaXQgb3IgMzJiaXQsaWYgdXNlIDE2Yml0IG1vZGUgLHNob3VsZCBkaXNhYmxlIGJpdCAyLDMKCS8vYml0IDAgLS0tdXNlIGJ5dGUgMCAsMSBkaXNhYmxlIGJ5dGUgMCwKCS8vYml0IDEgLS0tdXNlIGJ5dGUgMSAsMSBkaXNhYmxlIGJ5dGUgMSwKCS8vYml0IDIgLS0tdXNlIGJ5dGUgMiAsMSBkaXNhYmxlIGJ5dGUgMiwKCS8vYml0IDMgLS0tdXNlIGJ5dGUgMyAsMSBkaXNhYmxlIGJ5dGUgMywKCXVuc2lnbmVkCWNoYXIJSXMyVHRpbWluZzsKCS8vZGRyMy9kZHIzIHVzZSAydCB0aW1pbmcsbm93IG9ubHkgc3VwcG9ydCAydCB0aW1taW5nCgl1bnNpZ25lZAljaGFyCUhkdEN0cmw7CgkvL3RyYWluaW5nIGluZm9ybWF0aW9uIGNvbnRyb2wsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkcmFtX3JhbmtfY29uZmlnOwoJLy9zdXBwb3J0IERyYW0gY29ubmVjdGlvbiB0eXBlIHNob3VsZCBjb25maXJtIHdpdGggYW1sb2dpYwoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzE2QklUX0NIMAkJCQkweDEgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMTZiaXQgb25seSB1c2UgY3MwCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMTZCSVRfUkFOSzAxX0NIMAkJMHg0ICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDE2Yml0ICB1c2UgY3MwIGNzMQoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswX0NIMAkJCTB4MiAgLy9kcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNzMAoJLy8jZGVmaW5lIENPTkZJR19ERFIwXzMyQklUX1JBTkswMV9DSDAxCQkweDMgICAgLy9vbmx5IGZvciBscGRkcjQsZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjaGFuZWwgYSBjczAgY3MxIGNoYW5lbCBiIGNzMCBjczEKCS8vI2RlZmluZSBDT05GSUdfRERSMF8zMkJJVF8xNkJJVF9SQU5LMF9DSDAJCTB4NSAgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0IG9ubHkgdXNlIGNzMCxidXQgaGlnaCBhZGRyZXNzIHVzZSAxNmJpdCBtb2RlCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfMTZCSVRfUkFOSzAxX0NIMAkweDYgICAvL2RyYW0gdG90YWwgYnVzIHdpZHRoIDMyYml0ICB1c2UgY3MwIGNzMSxidXQgY3MxIHVzZSAxNmJpdCBtb2RlICxjdXJyZW50IHBoeSBub3Qgc3VwcG9ydCByZXNlcnZlCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMAkJMHg3ICAgICAgIC8vZHJhbSB0b3RhbCBidXMgd2lkdGggMzJiaXQgIHVzZSBjczAgY3MxCgkvLyNkZWZpbmUgQ09ORklHX0REUjBfMzJCSVRfUkFOSzBfQ0gwMQkJMHg4ICAgICAvL29ubHkgZm9yIGxwZGRyNCxkcmFtIHRvdGFsIGJ1cyB3aWR0aCAzMmJpdCAgdXNlIGNoYW5lbCBhIGNzMCAgY2hhbmVsIGIgY3MwCgoJLyogcnN2X2NoYXIwLiB1cGRhdGUgZm9yIGRpYWdub3NlIHR5cGUgZGVmaW5lICovCgl1bnNpZ25lZAljaGFyCWRpYWdub3NlOwoKCS8qIGltZW0vZG1lbSBkZWZpbmUgKi8KCXVuc2lnbmVkCWludAkJaW1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWludAkJZG1lbV9sb2FkX2FkZHI7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CWltZW1fbG9hZF9zaXplOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAlkbWVtX2xvYWRfc2l6ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJaW50CQlkZHJfYmFzZV9hZGRyOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlpbnQJCWRkcl9zdGFydF9vZmZzZXQ7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2NzMF9zaXplX01COwoJLy9jb25maWcgY3MwIGRyYW0gc2l6ZSAsbGlrZSAxRyBEUkFNICxzZXR0aW5nIDEwMjQKCXVuc2lnbmVkCXNob3J0CWRyYW1fY3MxX3NpemVfTUI7CgkvL2NvbmZpZyBjczEgZHJhbSBzaXplLGxpa2UgNTEyTSBEUkFNICxzZXR0aW5nIDUxMgoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJc2hvcnQJdHJhaW5pbmdfU2VxdWVuY2VDdHJsWzJdOwoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAljaGFyCXBoeV9vZHRfY29uZmlnX3JhbmtbMl07Cgl1bnNpZ25lZAljaGFyCSByZXZlcjE7Cgl1bnNpZ25lZAljaGFyCSByZXZlcjI7CgkvL3RyYWluaW5nIG9kdCBjb25maWcgLG9ubHkgdXNlIGZvciB0cmFpbmluZwoJLy8gWzBdT2R0IHBhdHRlcm4gZm9yIGFjY2Vzc2VzIHRhcmdldGluZyByYW5rIDAuIFszOjBdIGlzIHVzZWQgZm9yIHdyaXRlIE9EVCBbNzo0XSBpcyB1c2VkIGZvciByZWFkIE9EVAoJLy8gWzFdT2R0IHBhdHRlcm4gZm9yIGFjY2Vzc2VzIHRhcmdldGluZyByYW5rIDEuIFszOjBdIGlzIHVzZWQgZm9yIHdyaXRlIE9EVCBbNzo0XSBpcyB1c2VkIGZvciByZWFkIE9EVAoJdW5zaWduZWQJaW50CQlkZmlfb2R0X2NvbmZpZzsKCS8vbm9ybWFsIGdvIHN0YXR1cyBvZCBjb25maWcsdXNlIGZvciBub3JtYWwgc3RhdHVzCgkvL2JpdCAxMi4gIHJhbmsxIE9EVCBkZWZhdWx0LiBkZWZhdWx0IHZ1bHVlIGZvciBPRFRbMV0gcGlucyBpZiB0aGVyZXMgbm8gcmVhZC93cml0ZSBhY3Rpdml0eS4KCS8vYml0IDExLiAgcmFuazEgT0RUIHdyaXRlIHNlbC4gIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyB3cml0ZSBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDEwLiAgcmFuazEgT0RUIHdyaXRlIG5zZWwuIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmVzJ3Mgd3JpdGUgb2NjdXIgaW4gcmFuazAuCgkvL2JpdCA5LiAgIHJhbmsxIG9kdCByZWFkIHNlbC4gICBlbmFibGUgT0RUWzFdIGlmIHRoZXJlJ3MgcmVhZCBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDguICAgcmFuazEgb2R0IHJlYWQgbnNlbC4gIGVuYWJsZSBPRFRbMV0gaWYgdGhlcmUncyByZWFkIG9jY3VyZSBpbiByYW5rMC4KCS8vYml0IDQuICAgcmFuazAgT0RUIGRlZmF1bHQuICAgIGRlZmF1bHQgdnVsdWUgZm9yIE9EVFswXSBwaW5zIGlmIHRoZXJlcyBubyByZWFkL3dyaXRlIGFjdGl2aXR5LgoJLy9iaXQgMy4gICByYW5rMCBPRFQgd3JpdGUgc2VsLiAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHdyaXRlIG9jY3VyIGluIHJhbmswLgoJLy9iaXQgMi4gICByYW5rMCBPRFQgd3JpdGUgbnNlbC4gZW5hYmxlIE9EVFswXSBpZiB0aGVyZXMncyB3cml0ZSBvY2N1ciBpbiByYW5rMS4KCS8vYml0IDEuICAgcmFuazAgb2R0IHJlYWQgc2VsLiAgIGVuYWJsZSBPRFRbMF0gaWYgdGhlcmUncyByZWFkIG9jY3VyIGluIHJhbmswLgoJLy9iaXQgMC4gICByYW5rMCBvZHQgcmVhZCBuc2VsLiAgZW5hYmxlIE9EVFswXSBpZiB0aGVyZSdzIHJlYWQgb2NjdXJlIGluIHJhbmsxLgoJdW5zaWduZWQJc2hvcnQJRFJBTUZyZXFbNF07CgkvL2NvbmZpZyBkcmFtIGZyZXF1ZW5jeSx1c2UgRFJBTUZyZXFbMF0sb2h0ZXIgcmVzZXJ2ZQoJdW5zaWduZWQJY2hhcglQbGxCeXBhc3NFbjsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJY2hhcglkZHJfcmRiaV93cl9lbmFibGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCWNoYXIJZGRyX3JmY190eXBlOwoJLy9jb25maWcgZHJhbSByZmMgdHlwZSxhY2NvcmRpbmcgZHJhbSB0eXBlLGFsc28gY2FuIHVzZSBzYW1lIGRyYW0gdHlwZSBtYXggY29uZmlnCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MQkJCQkwCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MgkJCQkxCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4NAkJCQkyCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4OAkJCQkzCgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjNfNTEyTWJ4MTYJCQkJNAoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYngxCQkJCQk1CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0REUjRfMkdieDIJCQkJCTYKCS8vI2RlZmluZSBERFJfUkZDX1RZUEVfRERSNF8yR2J4NAkJCQkJNwoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9ERFI0XzJHYng4CQkJCQk4CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF8yR2J4MQkJCQk5CgkvLyNkZWZpbmUgRERSX1JGQ19UWVBFX0xQRERSNF8zR2J4MQkJCQkxMAoJLy8jZGVmaW5lIEREUl9SRkNfVFlQRV9MUEREUjRfNEdieDEJCQkJMTEKCXVuc2lnbmVkCWNoYXIJZW5hYmxlX2xwZGRyNHhfbW9kZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJdW5zaWduZWQJaW50CQlwbGxfc3NjX21vZGU7CgkvLwoJLyogcGxsIHNzYyBjb25maWc6CgkgKgoJICogICBwbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKFtzdHJlbmd0aF0gPDwgNCkgfCBbbW9kZV0sCgkgKiAgICAgIHBwbSA9IHN0cmVuZ3RoICogNTAwCgkgKiAgICAgIG1vZGU6IDA9Y2VudGVyLCAxPXVwLCAyPWRvd24KCSAqCgkgKiAgIGVnOgoJICogICAgIDEuIGNvbmZpZyAxMDAwcHBtIGNlbnRlciBzcy4gdGhlbiBtb2RlPTAsIHN0cmVuZ3RoPTIKCSAqICAgICAgICAucGxsX3NzY19tb2RlID0gKDE8PDIwKSB8ICgxPDw4KSB8ICgyIDw8IDQpIHwgMCwKCSAqICAgICAyLiBjb25maWcgMzAwMHBwbSBkb3duIHNzLiB0aGVuIG1vZGU9Miwgc3RyZW5ndGg9NgoJICogICAgICAgIC5wbGxfc3NjX21vZGUgPSAoMTw8MjApIHwgKDE8PDgpIHwgKDYgPDwgNCkgfCAyLAoJICovCgl1bnNpZ25lZAlzaG9ydAljbGtfZHJ2X29obTsKCS8vY29uZmlnIHNvYyBjbGsgcGluIHNpZ25hbCBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAljc19kcnZfb2htOwoJLy9jb25maWcgc29jIGNzMCBjczEgcGluIHNpZ25hbCBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAlhY19kcnZfb2htOwoJLy9jb25maWcgc29jICBub3JtYWwgYWRkcmVzcyBjb21tYW5kIHBpbiBkcml2ZXIgc3Rlbmd0aCAsc2VsZWN0IDIwLDMwLDQwLDYwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9kcnZfb2htX3A7CgkvL2NvbmZpZyBzb2MgZGF0YSBwaW4gcHVsbCB1cCBkcml2ZXIgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX2Rydl9vaG1fbjsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZAlzaG9ydAlzb2NfZGF0YV9vZHRfb2htX3A7CgkvL2NvbmZpZyBzb2MgZGF0YSBwaW4gb2R0IHB1bGwgdXAgc3Rlbmd0aCxzZWxlY3QgMCwyOCwzMCwzMiwzNCwzNyw0MCw0Myw0OCw1Myw2MCw2OCw4MCw5NiwxMjBvaG0KCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX29kdF9vaG1fbjsKCS8vY29uZmlnIHNvYyBkYXRhIHBpbiBvZHQgcHVsbCBkb3duIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2RhdGFfZHJ2X29obTsKCS8vY29uZmlnIGRyYW0gZGF0YSBwaW4gcHVsbCB1cCBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsZGRyMyBzZWxlY3QgMzQsNDBvaG0sZGRyNCBzZWxlY3QgMzQsNDhvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZAlzaG9ydAlkcmFtX2RhdGFfb2R0X29obTsKCS8vY29uZmlnIGRyYW0gZGF0YSBwaW4gb2R0IHB1bGwgdXAgZG93biBzdGVuZ3RoLGRkcjMgc2VsZWN0IDQwLDYwLDEyMG9obSxkZHI0IHNlbGVjdCAzNCw0MCw0OCw2MCwxMjAsMjQwb2htLGxwZGRyNCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQJc2hvcnQJZHJhbV9hY19vZHRfb2htOwoJLy9jb25maWcgZHJhbSBhYyBwaW4gb2R0IHB1bGwgdXAgZG93biBzdGVuZ3RoLHVzZSBmb3IgbHBkZHI0LCBzZWxlY3QgNDAsNDgsNjAsODAsMTIwLDI0MG9obQoJdW5zaWduZWQJc2hvcnQJc29jX2Nsa19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19jc19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19hY19zbGV3X3JhdGU7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCXVuc2lnbmVkCXNob3J0CXNvY19kYXRhX3NsZXdfcmF0ZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJc2hvcnQJdnJlZl9vdXRwdXRfcGVybWlsOyAvL3BoeQoJLy9zZXR0aW5nIHNhbWUgd2l0aCB2cmVmX2RyYW1fcGVybWlsCgl1bnNpZ25lZAlzaG9ydAl2cmVmX3JlY2VpdmVyX3Blcm1pbDsgLy9zb2MKCS8vc29jIGluaXQgU09DIHJlY2VpdmVyIHZyZWYgLGNvbmZpZyBsaWtlIDUwMCBtZWFucyAwLjVWRERRLHRha2UgY2FyZSAscGxlYXNlIGZvbGxvdyBTSQoJdW5zaWduZWQJc2hvcnQJdnJlZl9kcmFtX3Blcm1pbDsKCS8vc29jIGluaXQgRFJBTSByZWNlaXZlciB2cmVmICxjb25maWcgbGlrZSA1MDAgbWVhbnMgMC41VkREUSx0YWtlIGNhcmUgLHBsZWFzZSBmb2xsb3cgU0kKCXVuc2lnbmVkCXNob3J0CW1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeTsKCS8vdXNlIGZvciBsaW1pdGVkIGRkciBzcGVlZCBjb3JlIHRpbW1taW5nIHBhcmFtZXRlcixmb3Igc29tZSBvbGQgZHJhbSBtYXliZSBoYXZlIG5vIG92ZXIgc3BlZWQgcmVnaXN0ZXIKCS8qIGFsaWduOCAqLwoKCXVuc2lnbmVkCWNoYXIJYWNfdHJhY2VfZGVsYXlbMTBdOwoJdW5zaWduZWQJY2hhcglscGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nOwoJdW5zaWduZWQJY2hhcglscGRkcjRfeDhfbW9kZTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeSAsdGFrZSBjYXJlICxwbGVhc2UgZm9sbG93IFNJCgl1bnNpZ25lZAljaGFyCWFjX3Bpbm11eFtEV0NfQUNfUElOTVVYX1RPVEFMXTsKCS8vdXNlIGZvciBscGRkcjMgL2xwZGRyNCBjYSBwaW5tdXggcmVtYXAKCXVuc2lnbmVkCWNoYXIJZGZpX3Bpbm11eFtEV0NfREZJX1BJTk1VWF9UT1RBTF07Cgl1bnNpZ25lZAljaGFyCXNsdF90ZXN0X2Z1bmN0aW9uWzJdOyAgLy9bMF0gc2x0IHRlc3QgZnVuY3Rpb24gZW5hYmxlLGJpdCAwIGVuYWJsZSA0IGZyZXF1ZW5jeSBzY2FuLGJpdCAxIGVuYWJsZSBmb3JjZSBkZWxheSBsaW5lIG9mZnNldCAsYml0IDcgZW5hYmxlIHNraXAgdHJhaW5pbmcgZnVuY3Rpb24KCS8vWzFdLHNsdCB0ZXN0IHBhcmFtZXRlciAsdXNlIGZvciBmb3JjZSBkZWxheSBsaW5lIG9mZnNldAoJLy9zeXN0ZW0gcmVzZXJ2ZSxkbyBub3QgbW9kaWZ5Cgl1bnNpZ25lZAlzaG9ydAl0ZHFzMmRxOy8vZHFfYmRscl9vcmc7Cgl1bnNpZ25lZAljaGFyICBkcmFtX2RhdGFfd3Jfb2R0X29obTsKCXVuc2lnbmVkCWNoYXIJYml0VGltZUNvbnRyb2xfMmQ7CgkvL3N5c3RlbSByZXNlcnZlLGRvIG5vdCBtb2RpZnkKCS8qIGFsaWduOCAqLwoKCXVuc2lnbmVkCWludAkJZGRyX2RtY19yZW1hcFs1XTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgl1bnNpZ25lZCBjaGFyCQlkZHJfbHBkZHIzNF9jYV9yZW1hcFs0XTsKCS8vLy91c2UgZm9yIGxwZGRyMyAvbHBkZHI0IGNhIHRyYWluaW5nIGRhdGEgYnl0ZSBsYW5lIHJlbWFwCgl1bnNpZ25lZAljaGFyCWRkcl9scGRkcjM0X2RxX3JlbWFwWzMyXTsKCS8vLy91c2UgZm9yIGxwZGRyMyAvbHBkZHI0IGNhIHBpbm11eCByZW1hcAoJdW5zaWduZWQJaW50CQlkcmFtX3J0dF9ub21fd3JfcGFya1syXTsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJdW5zaWduZWQJaW50CQlkZHJfZnVuYzsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJLy91bnNpZ25lZAlsb25nCXJzdl9sb25nMFsyXTsKCS8qIHYxIGVuZCAqLwovLwkvKgoJdW5zaWduZWQJY2hhcglyZWFkX2Rxc19kZWxheVsxNl07Cgl1bnNpZ25lZAljaGFyCXJlYWRfZHFfYml0X2RlbGF5WzcyXTsKCXVuc2lnbmVkCXNob3J0CXdyaXRlX2Rxc19kZWxheVsxNl07Ci8vCSovCgl1bnNpZ25lZAlzaG9ydAl3cml0ZV9kcV9iaXRfZGVsYXlbNzJdOwoJdW5zaWduZWQJc2hvcnQJcmVhZF9kcXNfZ2F0ZV9kZWxheVsxNl07Cgl1bnNpZ25lZAljaGFyCXNvY19iaXRfdnJlZlszMl07Cgl1bnNpZ25lZAljaGFyCWRyYW1fYml0X3ZyZWZbMzJdOwoJLy8vKgoJdW5zaWduZWQJY2hhcglyZXZlcjM7Ly9yZWFkX2RxcyAgcmVhZF9kcSx3cml0ZV9kcXMsIHdyaXRlX2RxCgl1bnNpZ25lZAljaGFyCWRmaV9tcmw7Cgl1bnNpZ25lZAljaGFyCWRmaV9od3Rtcmw7Cgl1bnNpZ25lZAljaGFyCUFSZFB0ckluaXRWYWw7Cgl1bnNpZ25lZAljaGFyCXJldHJhaW5pbmdbMTZdOwoJLy9vdmVycmlkZSByZWFkIGJpdCBkZWxheQoJLy9leHRyYQovLwl1bnNpZ25lZAlzaG9ydAlkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg7Ci8vCXVuc2lnbmVkCXNob3J0CWRtY190ZXN0X3dvcnN0X3dpbmRvd19yeDsKLy8JKi8KfWRkcl9zZXRfdDsKCmRkcl9zZXRfdCBwX2Rkcl9zZXRfdDsKCmNoYXIqIGl0b2FfZGRyX3Rlc3QoaW50IG51bSxjaGFyKnN0cixpbnQgcmFkaXgpCnsvKsv30v2x7SovCglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAxXG4iKTsKCWNoYXIgaW5kZXhbXT0iMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKCXVuc2lnbmVkIHVudW07LyrW0LzkseTBvyovCgljaGFyIHRlbXA7CglpbnQgaT0wLGosazsKCS8qyLe2qHVudW21xNa1Ki8KCWlmIChyYWRpeCA9PSAxMCAmJiBudW08MCkgLyrKrr341sa4usr9Ki8KCXsKCQl1bnVtID0gKHVuc2lnbmVkKS1udW07CgkJc3RyW2krK10gPSAnLSc7Cgl9CgllbHNlCgkJdW51bSA9ICh1bnNpZ25lZCludW07LyrG5Mv7x+m/9iovCgkvKtequ7sqLwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgMlxuIik7CglwcmludGYoIlxudW51bT0weCUwOHhcbiIsdW51bSk7CglwcmludGYoIlxudW51bTI9MHglMDh4XG4iLCh1bnVtJSh1bnNpZ25lZClyYWRpeCkpOwoJcHJpbnRmKCJcbnJhZGl4PTB4JTA4eFxuIixyYWRpeCk7CglzdHJbMF0gPSBpbmRleFswXTsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDIyXG4iKTsKCXVudW0gLz0gcmFkaXg7CglwcmludGYoIlxuaXRvYV9kZHJfdGVzdCAyM1xuIik7CglkbyB7CgkJc3RyW2krK10gPSBpbmRleFt1bnVtJSh1bnNpZ25lZClyYWRpeF07CgkJdW51bSAvPSByYWRpeDsKCX13aGlsZSh1bnVtKTsKCXByaW50ZigiXG5pdG9hX2Rkcl90ZXN0IDNcbiIpOwoJc3RyW2ldID0gJ1wwJzsKCS8qxObQ8iovCglpZiAoc3RyWzBdID09ICctJykKCQlrID0gMTsvKsquvfjWxri6yv0qLwoJZWxzZQoJICAgCWsgPSAwOwoJcHJpbnRmKCJcbml0b2FfZGRyX3Rlc3QgNFxuIik7Cglmb3IgKGogPSBrO2ogPD0gKGktMSkvMjtqKyspCgl7CgkJdGVtcCA9IHN0cltqXTsKCQlzdHJbal0gPSBzdHJbaS0xK2stal07CgkJc3RyW2ktMStrLWpdID0gdGVtcDsKCX0KCXJldHVybiBzdHI7Cn0KLy8jZW5kaWYKCi8qCmNoYXIgKnN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCnsKICAgIGNoYXIgKnM7CiAgICBjb25zdCBjaGFyICpzcGFucDsKICAgIGludCBjLCBzYzsKICAgIGNoYXIgKnRvazsKICAgIGlmICgocyA9ICpzdHJpbmdwKT09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIGZvciAodG9rID0gczs7KSB7CiAgICAgICAgYyA9ICpzKys7CiAgICAgICAgc3BhbnAgPSBkZWxpbTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmICgoc2MgPSpzcGFucCsrKSA9PSBjKSB7CiAgICAgICAgICAgICAgICBpZiAoYyA9PSAwKQogICAgICAgICAgICAgICAgICAgIHMgPSBOVUxMOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNbLTFdID0gMDsKICAgICAgICAgICAgICAgICpzdHJpbmdwID0gczsKICAgICAgICAgICAgICAgIHJldHVybiAodG9rKTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKHNjICE9IDApOwogICAgfQogIAp9CiovCmludCBUT0xPV0VSKGludCBjaCkKewoKICAgaWYgKCh1bnNpZ25lZCBpbnQpKGNoIC0gJ0EnKSA8IDI2dSApCiAgICAgIGNoICs9ICdhJyAtICdBJzsKCiAgIHJldHVybiBjaDsKfS8vtPPQtNfWxLjXqru7zqrQodC019bEuKGjCgppbnQgaXN4ZGlnaXQoaW50IGNoKQp7CiAgICByZXR1cm4gKHVuc2lnbmVkIGludCkoIGNoICAgICAgICAgLSAnMCcpIDwgMTB1ICB8fAogICAgICAgICAgICh1bnNpZ25lZCBpbnQpKChjaCB8IDB4MjApIC0gJ2EnKSA8ICA2dTsKfS8vxdC2z9fWt/tjyse38c6qyq7B+b341sbK/dfWoaMKLy+1sWPOqkEtRixhLWa78jAtOdauvOS1xMquwfm9+NbGyv3X1sqxo6y3tbvYt8fB49a1o6y38dTyt7W72MHjoaMKaW50IGlzZGlnaXQoaW50IGNoKQp7CiAgICByZXR1cm4gKHVuc2lnbmVkIGludCkoY2ggLSAnMCcpIDwgMTB1Owp9Ly/F0LbP19a3+2PKx7fxzqrK/dfWIAp1bnNpZ25lZCBpbnQgc2ltcGxlX2d1ZXNzX2Jhc2UoY29uc3QgY2hhciAqY3ApCnsKCWlmIChjcFswXSA9PSAnMCcpIHsKCQlpZiAoVE9MT1dFUihjcFsxXSkgPT0gJ3gnICYmIGlzeGRpZ2l0KGNwWzJdKSkKCQkJcmV0dXJuIDE2OwoJCWVsc2UKCQkJLy8gcmV0dXJuIDg7CgkJCXJldHVybiAxMDsKCX0gZWxzZSB7CgkJcmV0dXJuIDEwOwoJfQp9CnVuc2lnbmVkIGludCBzaW1wbGVfc3RydG91bGxfZGRyKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCnsKCXVuc2lnbmVkIGludCAgcmVzdWx0ID0gMDsKCS8vcHJpbnRmKCJ0ZXN0IHNpemVvZihzdHJfYnVmKT09JWRcbiIsMSk7CglpZihjcCA9PSBOVUxMKSAvL2ppYXhpbmcgYWRkIDIwMTcwNjE2CgkJcmV0dXJuIDA7CglpZiAoIWJhc2UpCgkJYmFzZSA9IHNpbXBsZV9ndWVzc19iYXNlKGNwKTsKCWlmIChiYXNlID09IDE2ICYmIGNwWzBdID09ICcwJyAmJiBUT0xPV0VSKGNwWzFdKSA9PSAneCcpCgkJY3AgKz0gMjsKCWlmIChiYXNlID09IDEwKSB7CgkJd2hpbGUgKCgqY3ApPT0gJzAnKSAKCQkJY3ArKzsKCX0KCXdoaWxlIChpc3hkaWdpdCgqY3ApKSB7Ly+87LLptbHHsGNwyse38crHuPbKrsH5vfjWxsr91rWjrLK7ysfWsb3Tt7W72DAKCQl1bnNpZ25lZCBpbnQgdmFsdWU7CgkJdmFsdWUgPSBpc2RpZ2l0KCpjcCkgPyAqY3AgLSAnMCcgOiBUT0xPV0VSKCpjcCkgLSAnYScgKyAxMDsKCQlpZiAodmFsdWUgPj0gYmFzZSkKCQkJYnJlYWs7CgkJcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlOwoJCWNwKys7Cgl9CglpZiAoZW5kcCkKCQkqZW5kcCA9IChjaGFyICopY3A7CglyZXR1cm4gcmVzdWx0Owp9CQp1bnNpZ25lZCBpbnQgZW52X3RvX2FfbnVtKGNvbnN0IGNoYXIgKmVudl9uYW1lKQp7CgljaGFyICpzdHJfYnVmID0gTlVMTDsKCWNoYXIgYnVmWzQ4XTsKCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CglwcmludGYoInNpemVvZihzdHJfYnVmKT09JWRcbiIsKHVuc2lnbmVkIGludCkoc2l6ZW9mKGJ1ZikpKTsKCXN0cl9idWYgPSBnZXRlbnYoZW52X25hbWUpOwoJdW5zaWduZWQgaW50IGFfbnVtID0gMDsKCWNoYXIgKmVuZHA7CgoJcHJpbnRmKCJzdHI9PSVzXG4iLHN0cl9idWYpOwoKCWFfbnVtPXNpbXBsZV9zdHJ0b3VsbF9kZHIoc3RyX2J1ZiwgJmVuZHAsIDApOwoJcHJpbnRmKCIlcz09MHglMDh4XG4iLHN0cl9idWYsYV9udW0pOwoKCXJldHVybiBhX251bTsKfQp1bnNpZ25lZCBpbnQgYV9udW1fdG9fZW52KGNvbnN0IGNoYXIgKmVudl9uYW1lICx1bnNpZ25lZCBpbnQgKmFfbnVtKQp7CgljaGFyICpzdHJfYnVmPU5VTEw7CgljaGFyIGJ1ZlsxMDI0XTsKCS8vdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CglwcmludGYoInNpemVvZihzdHJfYnVmKT09JWRcbiIsKHVuc2lnbmVkIGludCkoc2l6ZW9mKGJ1ZikpKTsKCXN0cl9idWYgPSBnZXRlbnYoZW52X25hbWUpOwoKCXByaW50Zigic3RyPT0lc1xuIixzdHJfYnVmKTsKCglzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsICphX251bSk7CgoJcHJpbnRmKCAiJXM9PTB4JTA4eCIsIGJ1ZiwqYV9udW0pOwoJc2V0ZW52KGVudl9uYW1lLCBidWYpOwoKCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCXJldHVybiAxOwp9CnVuc2lnbmVkIGludCBlbnZfdG9fbnVtKGNvbnN0IGNoYXIgKmVudl9uYW1lLHVuc2lnbmVkIGludCAqbnVtX2FycnkpCnsKCWNoYXIgKnN0cl9idWYgPSBOVUxMOwoJY2hhciBidWZbMTAyNF07Cgl1bnNpZ25lZCBpbnQgc3RyX3RvX251bWFycnlbNDhdOwoJLy9zdHJfYnVmID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKjEwMjQpOwoJc3RyX2J1ZiA9IChjaGFyICopKCZidWYpOwoJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCXByaW50Zigic2l6ZW9mKHN0cl9idWYpPT0lZFxuIiwodW5zaWduZWQgaW50KShzaXplb2YoYnVmKSkpOwoJc3RyX2J1ZiA9IGdldGVudihlbnZfbmFtZSk7CgoJY2hhciAqIHN0cls0OF07CgljaGFyICplbmRwOwoJaW50IGk7Cglmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykKCQlzdHJfdG9fbnVtYXJyeVtpXSA9IDA7CglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7Cglmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoJCXN0cltpXSA9IHN0cnNlcCgmc3RyX2J1ZiwgIjsiKTsKCQkvL3N0cltpXSA9IHN0cnNlcCgmc3RyX2J1ZiwgIiAiKTsKCQlpZihzdHJbaV0gPT0gTlVMTCkKCQkJYnJlYWs7CgkJc3RyX3RvX251bWFycnlbaV0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHN0cltpXSwgJmVuZHAsIDApOwoJCS8vcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksc3RyX3RvX251bWFycnlbaV0pOwoJCS8vbnVtX2FycnlbaV09c3RyX3RvX251bWFycnlbaV07Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoJCXByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLHN0cl90b19udW1hcnJ5W2ldKTsKCQludW1fYXJyeVtpXSA9IHN0cl90b19udW1hcnJ5W2ldOwoJfQoJLy9udW1fYXJyeT0odW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglyZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50IG51bV90b19lbnYoY29uc3QgY2hhciAqZW52X25hbWUsdW5zaWduZWQgaW50ICpudW1fYXJyeSkKewoJY2hhciAqc3RyX2J1Zj1OVUxMOwoJY2hhciBidWZbMTAyNF07CglpbnQgaTsKCS8vdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCW1lbXNldChzdHJfYnVmLCAwLCBzaXplb2YoYnVmKSk7CglwcmludGYoInNpemVvZihzdHJfYnVmKT09JWRcbiIsKHVuc2lnbmVkIGludCkoc2l6ZW9mKGJ1ZikpKTsKCXN0cl9idWYgPSBnZXRlbnYoZW52X25hbWUpOwoKCS8vY2hhciAqIHN0cls0OF07CglwcmludGYoInN0cj09JXNcbiIsc3RyX2J1Zik7CgoKCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbnVtX2FycnlbMF0pOwoJZm9yIChpID0gMTsgaSA8IDQ4OyBpKyspIHsKCQkvL251bV9hcnJ5W2ldPTA7CgkJc3ByaW50ZihidWYsICIlczsweCUwOHgiLCBidWYsbnVtX2FycnlbaV0pOwoJCXByaW50ZigiJWQgICVkXG4iLCBpLG51bV9hcnJ5W2ldKTsKCX0KCS8vc3ByaW50ZihzdHIsICIlbHgiLCB2YWx1ZSk7CglwcmludGYoICIlcyIsIGJ1Zik7CglzZXRlbnYoZW52X25hbWUsIGJ1Zik7CgoJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJLy9udW1fYXJyeT0odW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglyZXR1cm4gMTsKfQoKI2RlZmluZSBUREFUQTMyRiAweGZmZmZmZmZmCiNkZWZpbmUgVERBVEEzMkEgMHhhYWFhYWFhYQojZGVmaW5lIFREQVRBMzI1IDB4NTU1NTU1NTUKI2RlZmluZSAgICAgUFJFR19TVElDS1lfRzEyQV9SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDA3MCA8PCAyKSkKLy8jZGVmaW5lICBERFJfVEVTVF9BVVRPX1RFU1RfQ01EX01BR0lDICAgMHgwMTIzNDU2NwojZGVmaW5lIERNQ19TVElDS1lfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM5ODAwKQojZGVmaW5lIERNQ19TVElDS1lfRzEyQV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzg4MDApCiNkZWZpbmUgRE1DX1NUSUNLWV9NQUdJQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAojZGVmaW5lIERNQ19TVElDS1lfTUFHSUNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWJjZGJlYWQKI2RlZmluZSBETUNfU1RJQ0tZX1VCT09UX1dJTkRPV19NQUdJQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMgojZGVmaW5lIERNQ19TVElDS1lfQVVUT19URVNUX0NNRF9JTkRFWF9NQUdJQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMwp1bnNpZ25lZCBpbnQgZG1jX3N0aWNreVs2NF07CnVuc2lnbmVkIGludCBzdGlja3lfcmVnX2Jhc2VfYWRkPTA7CgovLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgp1bnNpZ25lZCBpbnQgICBnbG9iYWxfYm9vdF90aW1lcz0gMDsKdW5zaWduZWQgaW50ICAgd2F0Y2hkb2dfdGltZV9zPSAyMDsKdW5zaWduZWQgaW50IGdsb2JhbF9kZHJfY2xrPTE7CnVuc2lnbmVkIGludAliZGxyXzEwMHN0ZXA9MDsKdW5zaWduZWQgaW50ICAgICAgIHVpXzFfMzJfMTAwc3RlcD0wOwp1bnNpZ25lZCBpbnQgICBlcnJvcl9jb3VudCA9MDsKdW5zaWduZWQgaW50ICBlcnJvcl9vdXRvZl9jb3VudF9mbGFnPTA7CnVuc2lnbmVkIGludCAgY29weV90ZXN0X2ZsYWcgPSAwOwp1bnNpZ25lZCBpbnQgIHRyYWluaW5nX3BhdHRlcm5fZmxhZyA9IDA7CnVuc2lnbmVkIGludCB0ZXN0X3N0YXJ0X2FkZHI9MHgxMDgwMDAwOwoKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2I7CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9iOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2I7Cgp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVs0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVs0XTsKCnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9iWzRdOwp1bnNpZ25lZCBpbnQgIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYls0XTsKdW5zaWduZWQgaW50ICBkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2JbNF07CnVuc2lnbmVkIGludCAgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19iWzRdOwp1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfb3JnWzEwXTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX21heFs0MF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19ob2xkX21heFs0MF07CnVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19zZXR1cF90aW1lWzQwXTsKdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVs0MF07Ci8vICAgIHVuc2lnbmVkIGludCAgZGF0YV9iZGxyMF81X3JlZ19vcmdbNl07CnVuc2lnbmVkIGludCAgZGF0YV9iZGxyMF81X3JlZ19vcmdbMjhdOy8vNC8vNGxhbmUKdW5zaWduZWQgaW50ICBiZGxyMF85X3JlZ19zZXR1cF9tYXhbMjQqNF07Ly80Ly80IGxhbmUgOTYgYmRscgp1bnNpZ25lZCBpbnQgIGJkbHIwXzlfcmVnX2hvbGRfbWF4WzI0KjRdOwp1bnNpZ25lZCBpbnQgIGJkbHIwXzlfcmVnX3NldHVwX3RpbWVbMjQqNF07CnVuc2lnbmVkIGludCAgYmRscjBfOV9yZWdfaG9sZF90aW1lWzI0KjRdOwoKI2RlZmluZSByZWFkbChhZGRyKSAgICAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKI2RlZmluZSB3cml0ZWwoZGF0YSAsYWRkcikgICgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKCiNkZWZpbmUgd3JfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZF9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCi8vI2RlZmluZSBDT05GSUdfRERSX0NNRF9CRExfVFVORQovLyNkZWZpbmUgIENPTkZJR19DTURfRERSX1RFU1QKCiNpZm5kZWYgQ09ORklHX0NISVAgCi8vI2RlZmluZSBDT05GSUdfQ0hJUCAgICBDSElQX09MRCAvL0NISVBfT0xELy8gLy8jZGVmaW5lIENISVBfT0xEICAgICAgICAgICAwICAvLyNkZWZpbmUgQ0hJUF9UWExYICAgICAgICAgICAxCiNkZWZpbmUgQ0hJUF9PTEQgICAgICAgICAgIDAKI2RlZmluZSBDSElQX1RYTFggICAgICAgICAgIDEKI2RlZmluZSBDSElQX0ExMTMgICAgICAgICAgIDIKI2RlZmluZSBDSElQX0cxMiAgICAgICAgIDMKI2RlZmluZSBDT05GSUdfQ0hJUCAgIENISVBfRzEyLy8gQ0hJUF9PTEQvLwojZW5kaWYKCiNkZWZpbmUgUF9ERFJfUEhZX0RFRkFVTFQgICAgICAgICAgIDAKI2RlZmluZSBQX0REUl9QSFlfR1hfQkFCWSAgICAgICAgICAgICAxCiNkZWZpbmUgIFBfRERSX1BIWV9HWF9UVl9CQUJZICAgICAyCiNkZWZpbmUgIFBfRERSX1BIWV85MDVYICAgICAgICAzCgovLyNkZWZpbmUgIFBfRERSX1BIWV9PTERfVEFHICAgICAgICAgMAojZGVmaW5lICBQX0REUl9QSFlfRzEyICAgICAgICA0CgojaWYgKENPTkZJR19DSElQPj1DSElQX0cxMikKI2RlZmluZSBDT05GSUdfRERSX1BIWSAgIFBfRERSX1BIWV9HMTIKI2Vsc2UgCi8vI2RlZmluZSBDT05GSUdfQ0hJUCAgICBDSElQX09MRC8vCi8vI2RlZmluZSBDT05GSUdfRERSX1BIWSAgICBQX0REUl9QSFlfOTA1WC8vUF9ERFJfUEhZX0dYX0JBQlkvL1BfRERSX1BIWV85MDVYLy8gUF9ERFJfUEhZX0dYX0JBQlkKLy8jZGVmaW5lIENPTkZJR19ERFJfUEhZICAgUF9ERFJfUEhZX0cxMi8vUF9ERFJfUEhZX0RFRkFVTFQvLyBQX0REUl9QSFlfOTA1WC8vUF9ERFJfUEhZX0dYX0JBQlkvL1BfRERSX1BIWV85MDVYLy8gUF9ERFJfUEhZX0dYX0JBQlkKI2RlZmluZSBDT05GSUdfRERSX1BIWSAgIFBfRERSX1BIWV85MDVYLy9QX0REUl9QSFlfREVGQVVMVC8vIFBfRERSX1BIWV85MDVYLy9QX0REUl9QSFlfR1hfQkFCWS8vUF9ERFJfUEhZXzkwNVgvLyBQX0REUl9QSFlfR1hfQkFCWQovLyNkZWZpbmUgQ09ORklHX0REUl9QSFlfTkVXX1RBRzEgICBQX0REUl9QSFlfRzEyCiNlbmRpZgoKI2RlZmluZSBHMTJfQU1fRERSX1BMTF9DTlRMMCAgIDB4ZmY2MzhjMDAKCiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKI2luY2x1ZGUgPGFzbS9hcmNoL3NlY3VyZV9hcGIuaD4KI2VuZGlmCgojZGVmaW5lIFBBVFRFUk5fVVNFX0REUl9ERVMKI2RlZmluZSAgVVNFXzY0QklUX1BPSU5URVIKLy8jZGVmaW5lICBVU0VfMzJCSVRfUE9JTlRFUgojaWZkZWYgVVNFXzY0QklUX1BPSU5URVIKI2RlZmluZSBwX2NvbnZ0ZXJfaW50KGEpICAoIHVuc2lnbmVkIGludCApKCB1bnNpZ25lZCBsb25nICkoYSkKI2RlZmluZSBpbnRfY29udnRlcl9wKGEpICAoIHVuc2lnbmVkIGxvbmcgKShhKQoKI2Vsc2UKI2RlZmluZSBwX2NvbnZ0ZXJfaW50KGEpICAoIHVuc2lnbmVkIGludCApKGEpCiNkZWZpbmUgaW50X2NvbnZ0ZXJfcChhKSAgKCB1bnNpZ25lZCBpbnQgKShhKQojZW5kaWYKCiNpZmRlZiBQQVRURVJOX1VTRV9ERFJfREVTCiNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIChkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0pCiNkZWZpbmUgZGVzX2ludl9wYXR0ZXJuKGEsYixjLGQpICAgKCBkZXNbYV1eKH4ocGF0dGVybl8jI2JbY11bZF0pKSkKI2RlZmluZSBkZXNfeG9yX3BhdHRlcm4oYSxiKSAgICggYV5iKQovL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KI2Vsc2UKI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgKGRlc1thXSYwKStwYXR0ZXJuXyMjYltjXVtkXQojZGVmaW5lIGRlc19pbnZfcGF0dGVybihhLGIsYyxkKSAgKGRlc1thXSYwKSt+KHBhdHRlcm5fIyNiW2NdW2RdKQojZGVmaW5lIGRlc194b3JfcGF0dGVybihhLGIpICAoYSYwK2IpCiNlbmRpZgoKCiNkZWZpbmUgIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKI2RlZmluZSAgRERSX1BSRUZFVENIX0NBQ0hFCiNlbmRpZgojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCiNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKSAgIGFzbSAoInByZm0gUExETDFLRUVQLCBbJTAsICMzNzZdIjo6InIiIChQKSkKI2Vsc2UKI2RlZmluZSBkZHJfcGxkX2NhY2hlKFApCiNlbmRpZgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCiNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCiNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCiNkZWZpbmUgIENIQU5ORUxfQV9SRUdfQkFTRSAgMAojZGVmaW5lICBDSEFOTkVMX0JfUkVHX0JBU0UgIDB4MjAwMAojZGVmaW5lIFBfRERSMF9DTEtfQ1RSTCAgIDB4Yzg4MzZjMDAKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIDB4Yzg4MzZjMDAKI2RlZmluZSBPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgwKSwgMHhjODgzNmMwMCkpCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpICAgICAod3JpdGVsKCgwKSwgMHhjODgzNmMwMCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDUpLCAweGM4ODM2YzAwKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpICAgICAod3JpdGVsKCg1KSwgMHhjODgzNmMwMCkpCi8vICNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgIDB4YzExMDk5ODgKLy8gICAjZGVmaW5lIGdldF91c190aW1lKCkgICAgKHJlYWRsKFBfSVNBX1RJTUVSRSkpCiNkZWZpbmUgQU1fRERSX1BMTF9DTlRMCQkJCQkJMHhjODgzNjgwMAojZGVmaW5lIEREUjBfUFVCX1pRQ1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMFBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTBEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCgojZGVmaW5lIEREUjFfUFVCX1pRQ1IJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQojZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9aUTBEUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCgojZGVmaW5lIEREUjBfUFVCX1pRMVBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk1PDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTFEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Njw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlExU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTc8PDIpKQovLzB4OTggcmVzZXJ2ZWQpCiNkZWZpbmUgRERSMF9QVUJfWlEyUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTk8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMkRSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlBPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTJTUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Qjw8MikpCi8vMHg5YyByZXNlcnZlZCkKI2RlZmluZSBERFIwX1BVQl9aUTNQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5RDw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEzRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRM1NSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlGPDwyKSkKI2RlZmluZSBBQ0JETFJfTUFYICAgMFgxRgojZGVmaW5lIEFDTENETFJfTUFYICAgMFhGRgojZGVmaW5lIERRQkRMUl9NQVggICAwWDFGCiNkZWZpbmUgRFFMQ0RMUl9NQVggICAwWEZGCiNkZWZpbmUgRFhOR1RSX01BWCAgIDBYNwojZGVmaW5lIEFDQkRMUl9OVU0gICAxMAojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4YTAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwYzAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwZTAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMTAwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQoKCiNkZWZpbmUgRE1DX1JFR19CQVNFCQkJCQkJMHhjODgzODAwMAojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCiAgIC8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCiAgIC8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KICAgLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KICAgLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCiAgIC8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCiAgLy8gcW9zX21vbl9jbGtfdGltZXIuICAgSG93IGxvbmcgdG8gbWVhc3VyZSB0aGUgYmFuZHdpZHRoLgoKCiNkZWZpbmUgRE1DX01PTl9BTExfUkVRX0NOVAkJCQkJKERNQ19SRUdfQkFTRSArICgweDI4IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgcmVxdWVzdCB0aW1lLgojZGVmaW5lIERNQ19NT05fQUxMX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjkgPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyBncmFudGVkIGRhdGEgY3ljbGVzLiA2NGJpdHMgdW5pdC4KI2RlZmluZSBETUNfTU9OX09ORV9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDJhIDw8MiApKQoKCiNlbGlmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX1RWX0JBQlkpCiNkZWZpbmUgRERSMF9QVUJfUkVHX0JBU0UJCQkweGM4ODM2MDAwCiNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4ODM3MDAwCiNkZWZpbmUgIENIQU5ORUxfQV9SRUdfQkFTRSAgMAojZGVmaW5lICBDSEFOTkVMX0JfUkVHX0JBU0UgIDB4MTAwMAojZGVmaW5lIFBfRERSMF9DTEtfQ1RSTCAgIDB4Yzg4MzZjMDAKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIDB4Yzg4MzZjMDAKI2RlZmluZSBPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgwKSwgMHhjODgzNmMwMCkpCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpICAgICAgKHdyaXRlbCgoMCksIDB4Yzg4MzdjMDApKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgweDEyYSksIDB4Yzg4MzZjMDApKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgKHdyaXRlbCgoMHgxMmEpLCAweGM4ODM3YzAwKSkKLy8JI2RlZmluZSBQX0lTQV9USU1FUkUgICAgICAgICAgICAgICAgIDB4YzExMDk5ODgKLy8gICAjZGVmaW5lIGdldF91c190aW1lKCkgICAocmVhZGwoUF9JU0FfVElNRVJFKSApCiNkZWZpbmUgQU1fRERSX1BMTF9DTlRMCQkJCQkJMHhjODgzNjgwMAojZGVmaW5lIEREUjBfUFVCX1pRQ1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMFBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTBEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCiNkZWZpbmUgRERSMV9QVUJfWlFDUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5MDw8MikpCiNkZWZpbmUgRERSMV9QVUJfWlEwUFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTE8PDIpKQojZGVmaW5lIEREUjFfUFVCX1pRMERSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkyPDwyKSkKCiNkZWZpbmUgRERSMF9QVUJfWlEwU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTM8PDIpKQovLzB4OTQgcmVzZXJ2ZWQpCiNkZWZpbmUgRERSMF9QVUJfWlExUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTU8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMURSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDk2PDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTFTUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Nzw8MikpCi8vMHg5OCByZXNlcnZlZCkKI2RlZmluZSBERFIwX1BVQl9aUTJQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5OTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEyRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMlNSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlCPDwyKSkKLy8weDljIHJlc2VydmVkKQojZGVmaW5lIEREUjBfUFVCX1pRM1BSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDlEPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTNEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5RTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEzU1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OUY8PDIpKQojZGVmaW5lIEFDQkRMUl9NQVggICAwWDFGCiNkZWZpbmUgQUNMQ0RMUl9NQVggICAwWEZGCiNkZWZpbmUgRFFCRExSX01BWCAgIDBYMUYKI2RlZmluZSBEUUxDRExSX01BWCAgIDBYRkYKI2RlZmluZSBEWE5HVFJfTUFYICAgMFg3CiNkZWZpbmUgRERSMF9QVUJfRFgwR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHhhMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDBjMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDBlMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAxMDAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRE1DX1JFR19CQVNFCQkJCQkJMHhjODgzODAwMAojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCiAgIC8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCiAgIC8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KICAgLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KICAgLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCiAgIC8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCiAgLy8gcW9zX21vbl9jbGtfdGltZXIuICAgSG93IGxvbmcgdG8gbWVhc3VyZSB0aGUgYmFuZHdpZHRoLgoKCiNkZWZpbmUgRE1DX01PTl9BTExfUkVRX0NOVAkJCQkJKERNQ19SRUdfQkFTRSArICgweDI4IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgcmVxdWVzdCB0aW1lLgojZGVmaW5lIERNQ19NT05fQUxMX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjkgPDwyICkpCiAgLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIHdob2xlIE1NQyBncmFudGVkIGRhdGEgY3ljbGVzLiA2NGJpdHMgdW5pdC4KI2RlZmluZSBETUNfTU9OX09ORV9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDJhIDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSBncmFudGVkIGRhdGEgY3ljbGVzIGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBhbmQgcG9ydHMuCgojZWxpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoKCSAgLy8gI2RlZmluZSBQX0lTQV9USU1FUkUgICAgICAgICAgICAgICAgIDB4YzExMDk5ODgKCSAvLyAgI2RlZmluZSBnZXRfdXNfdGltZSgpICAgKHJlYWRsKFBfSVNBX1RJTUVSRSkgKQojaWYgQ09ORklHX0NISVAgICA+PUNISVBfVFhMWAojZGVmaW5lIEREUjBfUFVCX1JFR19CQVNFCQkJICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzNjAwMCkvL0REUjBfUFVCX1JJRFIKI2RlZmluZSBERFIxX1BVQl9SRUdfQkFTRQkJCSAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM2MDAwKS8vRERSMF9QVUJfUklEUgojZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKI2RlZmluZSAgQ0hBTk5FTF9CX1JFR19CQVNFICAwLy8weDEwMDAKI2RlZmluZSBNTUNfUkVHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2MzcwMDApICAvLyAjZGVmaW5lIEFNX0REUl9QTExfQ05UTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM3MDAwKSAweGM4ODM3MDAwCiNkZWZpbmUgICBERFJfQ0xLX0NOVEwgICAoTU1DX1JFR19CQVNFICsgKCAweDcJPDwgMiApKQojZGVmaW5lIFBfRERSMF9DTEtfQ1RSTCAgIEREUl9DTEtfQ05UTAojZGVmaW5lIFBfRERSMV9DTEtfQ1RSTCAgRERSX0NMS19DTlRMCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgIC8vICAod3JpdGVsKCgwWGIwMDBhMDAwKSwgRERSX0NMS19DTlRMKSkKI2RlZmluZSBPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgIC8vICh3cml0ZWwoKDBYYjAwMGEwMDApLCBERFJfQ0xLX0NOVEwpKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwNSksIEREUl9DTEtfQ05UTCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAvLyAod3JpdGVsKCgwWGIwMDBhMDA1KSwgRERSX0NMS19DTlRMKSkKCiNkZWZpbmUgQU1fRERSX1BMTF9DTlRMMCAgICAgCSAgICAgICAoTU1DX1JFR19CQVNFICsgKCAweDAJPDwgMiApKQojZGVmaW5lIEFNX0REUl9QTExfQ05UTAkJCQkJCUFNX0REUl9QTExfQ05UTDAKI2RlZmluZSAgRERSMF9QVUJfWlFDUiAgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTAgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTBQUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMERSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEyIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEwU1IgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTMgPDwgMiApKQoKI2RlZmluZSAgRERSMF9QVUJfWlExUFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTUgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTFEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhNiA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMVNSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE3IDw8IDIgKSkKCiNkZWZpbmUgIEREUjBfUFVCX1pRMlBSICAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE5IDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEyRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYUEgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTJTUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhQiA8PCAyICkpCgojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDFjMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAyMDAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMjQwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDI4MCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKCiNkZWZpbmUgRERSMV9QVUJfWlFDUgkJCQkJRERSMF9QVUJfWlEwUFIKI2RlZmluZSBERFIxX1BVQl9aUTBQUgkJCQkJRERSMF9QVUJfWlEwUFIKI2RlZmluZSBERFIxX1BVQl9aUTBEUgkJCQkJRERSMF9QVUJfWlEwRFIKCiNkZWZpbmUgQUNCRExSX01BWCAgIDBYM0YKI2RlZmluZSBBQ0xDRExSX01BWCAgIDBYMUZGCiNkZWZpbmUgRFFCRExSX01BWCAgIDBYM0YKI2RlZmluZSBEUUxDRExSX01BWCAgIDBYMUZGCiNkZWZpbmUgRFhOR1RSX01BWCAgIDBYMUYKCiAgICAgLy8gICAgICNkZWZpbmUgRE1DX1JFR19CQVNFCQkJCQkJTU1DX1JFR19CQVNFCgojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCiAgIC8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCiAgIC8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KICAgLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KICAgLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCiAgIC8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCi8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCgojZGVmaW5lIERNQ19NT05fQUxMX1JFUV9DTlQJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyOCA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgZ3JhbnRlZCBkYXRhIGN5Y2xlcyBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYW5kIHBvcnRzLgoKI2Vsc2UKI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCTB4Yzg4MzYwMDAKI2RlZmluZSBERFIxX1BVQl9SRUdfQkFTRQkJCTB4Yzg4MzYwMDAKI2RlZmluZSAgQ0hBTk5FTF9BX1JFR19CQVNFICAwCiNkZWZpbmUgIENIQU5ORUxfQl9SRUdfQkFTRSAgMC8vMHgxMDAwCiNkZWZpbmUgTU1DX1JFR19CQVNFICAgMHhjODgzNzAwMAojZGVmaW5lICAgRERSX0NMS19DTlRMICAgKE1NQ19SRUdfQkFTRSArICggMHg3CTw8IDIgKSkKI2RlZmluZSBQX0REUjBfQ0xLX0NUUkwgICBERFJfQ0xLX0NOVEwKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIEREUl9DTEtfQ05UTAojZGVmaW5lIE9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwMCksIEREUl9DTEtfQ05UTCkpCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpICAgIC8vICAod3JpdGVsKCgwWGIwMDBhMDAwKSwgRERSX0NMS19DTlRMKSkKI2RlZmluZSBDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpICAvLyAgICh3cml0ZWwoKDBYYjAwMGEwMDUpLCBERFJfQ0xLX0NOVEwpKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAvLyAgKHdyaXRlbCgoMFhiMDAwYTAwNSksIEREUl9DTEtfQ05UTCkpCgojZGVmaW5lIEFNX0REUl9QTExfQ05UTDAgICAgIAkgICAgICAgKE1NQ19SRUdfQkFTRSArICggMHgwCTw8IDIgKSkKI2RlZmluZSBBTV9ERFJfUExMX0NOVEwJCQkJCQlBTV9ERFJfUExMX0NOVEwwCiNkZWZpbmUgIEREUjBfUFVCX1pRQ1IgICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEwIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEwUFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTEgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTBEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMiA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMFNSICAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEzIDw8IDIgKSkKCiNkZWZpbmUgIEREUjBfUFVCX1pRMVBSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE1IDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlExRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTYgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTFTUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhNyA8PCAyICkpCgojZGVmaW5lICBERFIwX1BVQl9aUTJQUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhOSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMkRSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWFBIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEyU1IgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYUIgPDwgMiApKQoKI2RlZmluZSBERFIxX1BVQl9aUUNSCQkJCQlERFIwX1BVQl9aUTBQUgojZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQlERFIwX1BVQl9aUTBQUgojZGVmaW5lIEREUjFfUFVCX1pRMERSCQkJCQlERFIwX1BVQl9aUTBEUgoKI2RlZmluZSBBQ0JETFJfTUFYICAgMFgzRgojZGVmaW5lIEFDTENETFJfTUFYICAgMFgxRkYKI2RlZmluZSBEUUJETFJfTUFYICAgMFgzRgojZGVmaW5lIERRTENETFJfTUFYICAgMFgxRkYKI2RlZmluZSBEWE5HVFJfTUFYICAgMFgxRgojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MWMwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMUdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MjAwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MjQwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDI4MCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2lmbmRlZiAgRE1DX1JFR19CQVNFCiNkZWZpbmUgRE1DX1JFR19CQVNFCQkJCQkJTU1DX1JFR19CQVNFCiNlbmRpZgojZGVmaW5lIERNQ19NT05fQ1RSTDIJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjYgPDwyICkpCi8vYml0IDMxLiAgIHFvc19tb25fZW4uICAgIHdyaXRlIDEgdG8gdHJpZ2dlciB0aGUgZW5hYmxlLiBwb2xsaW5nIHRoaXMgYml0IDAsIG1lYW5zIGZpbmlzaGVkLiAgb3IgdXNlIGludGVycnVwdCB0byBjaGVjayBmaW5pc2guCi8vYml0IDMwLiAgIHFvc19tb24gaW50ZXJydXB0IGNsZWFyLiAgY2xlYXIgdGhlIHFvcyBtb25pdG9yIHJlc3VsdC4gIHJlYWQgMSA9IHFvcyBtb24gZmluaXNoIGludGVycnVwdC4KLy9iaXQgMjAuICAgcW9zX21vbl90cmlnX3NlbC4gIDEgPSB2c3luYy4gIDAgPSB0aW1lci4KLy9iaXQgMTk6MTYuICBxb3MgbW9uaXRvciBjaGFubmVsIHNlbGVjdC4gICBzZWxlY3Qgb25lIGF0IG9uZSB0aW1lIG9ubHkuCi8vYml0IDE1OjAuICAgcG9ydCBzZWxlY3QgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsLgojZGVmaW5lIERNQ19NT05fQ1RSTDMJCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjcgPDwyICkpCi8vIHFvc19tb25fY2xrX3RpbWVyLiAgIEhvdyBsb25nIHRvIG1lYXN1cmUgdGhlIGJhbmR3aWR0aC4KCiNkZWZpbmUgRE1DX01PTl9BTExfUkVRX0NOVAkJCQkJKERNQ19SRUdfQkFTRSArICgweDI4IDw8MiApKQovLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQovLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIGdyYW50ZWQgZGF0YSBjeWNsZXMuIDY0Yml0cyB1bml0LgojZGVmaW5lIERNQ19NT05fT05FX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MmEgPDwyICkpCi8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSBncmFudGVkIGRhdGEgY3ljbGVzIGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBhbmQgcG9ydHMuCiNlbmRpZiAKCiNlbGlmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0RFRkFVTFQpCgojZGVmaW5lIEREUjBfUFVCX1JFR19CQVNFCQkJMHhjODAwMTAwMAkJLy8weGM4ODM2MDAwCiNkZWZpbmUgRERSMV9QVUJfUkVHX0JBU0UJCQkweGM4MDAxMDAwCQkvLwkweGM4ODM2MDAwCiNkZWZpbmUgIENIQU5ORUxfQV9SRUdfQkFTRSAgMAojZGVmaW5lICBDSEFOTkVMX0JfUkVHX0JBU0UgIDB4MjAwMAojZGVmaW5lIFBfRERSMF9DTEtfQ1RSTCAgIDB4YzgwMDA4MDAKI2RlZmluZSBQX0REUjFfQ0xLX0NUUkwgIDB4YzgwMDI4MDAKI2RlZmluZSBPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgweDEyYiksIDB4YzgwMDA4MDApKQojZGVmaW5lIE9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJiKSwgMHhjODAwMjgwMCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJhKSwgMHhjODAwMDgwMCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgICAgICh3cml0ZWwoKDB4MTJhKSwgMHhjODAwMjgwMCkpCi8vCSNkZWZpbmUgUF9JU0FfVElNRVJFICAgICAgICAgICAgICAgICAweGMxMTA5OTg4Ci8vICAgI2RlZmluZSBnZXRfdXNfdGltZSgpICAgKHJlYWRsKFBfSVNBX1RJTUVSRSkpCgojZGVmaW5lIFBSRUdfU1RJQ0tZX1JFRzAgIDB4YzExMDAwMDArKDB4MjA3Yzw8MikKI2RlZmluZSBQUkVHX1NUSUNLWV9SRUcxICAgICAgICAgICAgIDB4YzExMDAwMDArKDB4MjA3ZDw8MikKI2RlZmluZSBXQVRDSERPR19UQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YzExMDAwMDArKDB4MjY0MDw8MikvLyAgICAgMHgyNjQwCgojZGVmaW5lIEFNX0REUl9QTExfQ05UTCAgMHhjODAwMDQwMAojZGVmaW5lIEREUjBfUFVCX1pRQ1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMFBSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTBEUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlExUFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1pRMURSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDkyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9aUTJQUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg5MTw8MikpCiNkZWZpbmUgRERSMF9QVUJfWlEyRFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OTI8PDIpKQojZGVmaW5lIEREUjFfUFVCX1pRQ1IJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4OTA8PDIpKQojZGVmaW5lIEREUjFfUFVCX1pRMFBSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDkxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9aUTBEUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHg5Mjw8MikpCiNkZWZpbmUgQUNCRExSX01BWCAgIDBYMUYKI2RlZmluZSBBQ0xDRExSX01BWCAgIDBYRkYKI2RlZmluZSBEUUJETFJfTUFYICAgMFgxRgojZGVmaW5lIERRTENETFJfTUFYICAgMFhGRgojZGVmaW5lIERYTkdUUl9NQVggICAwWDcKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweGEwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMUdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MGMwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MGUwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDEwMCAgPDwgMikgKyBERFIwX1BVQl9SRUdfQkFTRSkKI2RlZmluZSBETUNfUkVHX0JBU0UgICAgICAweGM4MDA2MDAwCiNkZWZpbmUgRE1DX01PTl9DVFJMMgkJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyNiA8PDIgKSkKLy9iaXQgMzEuICAgcW9zX21vbl9lbi4gICAgd3JpdGUgMSB0byB0cmlnZ2VyIHRoZSBlbmFibGUuIHBvbGxpbmcgdGhpcyBiaXQgMCwgbWVhbnMgZmluaXNoZWQuICBvciB1c2UgaW50ZXJydXB0IHRvIGNoZWNrIGZpbmlzaC4KLy9iaXQgMzAuICAgcW9zX21vbiBpbnRlcnJ1cHQgY2xlYXIuICBjbGVhciB0aGUgcW9zIG1vbml0b3IgcmVzdWx0LiAgcmVhZCAxID0gcW9zIG1vbiBmaW5pc2ggaW50ZXJydXB0LgovL2JpdCAyMC4gICBxb3NfbW9uX3RyaWdfc2VsLiAgMSA9IHZzeW5jLiAgMCA9IHRpbWVyLgovL2JpdCAxOToxNi4gIHFvcyBtb25pdG9yIGNoYW5uZWwgc2VsZWN0LiAgIHNlbGVjdCBvbmUgYXQgb25lIHRpbWUgb25seS4KLy9iaXQgMTU6MC4gICBwb3J0IHNlbGVjdCBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCiNkZWZpbmUgRE1DX01PTl9DVFJMMwkJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyNyA8PDIgKSkKLy8gcW9zX21vbl9jbGtfdGltZXIuICAgSG93IGxvbmcgdG8gbWVhc3VyZSB0aGUgYmFuZHdpZHRoLgoKI2RlZmluZSBETUNfTU9OX0FMTF9SRVFfQ05UCQkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjggPDwyICkpCi8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgcmVxdWVzdCB0aW1lLgojZGVmaW5lIERNQ19NT05fQUxMX0dSQU5UX0NOVAkJCQkoRE1DX1JFR19CQVNFICsgKDB4MjkgPDwyICkpCi8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKLy8gYXQgdGhlIHRlc3QgcGVyaW9kLCAgdGhlIGdyYW50ZWQgZGF0YSBjeWNsZXMgZm9yIHRoZSBzZWxlY3RlZCBjaGFubmVsIGFuZCBwb3J0cy4KCgoKI2VsaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfRzEyKQojZGVmaW5lIEREUjBfUFVCX1JFR19CQVNFCQkJMHhmZjYzNjAwMAojZGVmaW5lIEREUjFfUFVCX1JFR19CQVNFCQkJMHhmZjYzNjAwMAojZGVmaW5lICBDSEFOTkVMX0FfUkVHX0JBU0UgIDAKI2RlZmluZSAgQ0hBTk5FTF9CX1JFR19CQVNFICAwLy8weDEwMDAKI2RlZmluZSBNTUNfUkVHX0JBU0UgICAweGZmNjM3MDAwCiNkZWZpbmUgICBERFJfQ0xLX0NOVEwgICAoTU1DX1JFR19CQVNFICsgKCAweDcJPDwgMiApKQojZGVmaW5lIFBfRERSMF9DTEtfQ1RSTCAgIEREUl9DTEtfQ05UTAojZGVmaW5lIFBfRERSMV9DTEtfQ1RSTCAgRERSX0NMS19DTlRMCiNkZWZpbmUgT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpICAgIC8vICAod3JpdGVsKCgwWGIwMDBhMDAwKSwgRERSX0NMS19DTlRMKSkKI2RlZmluZSBPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCkgICAgLy8gICh3cml0ZWwoKDBYYjAwMGEwMDApLCBERFJfQ0xLX0NOVEwpKQojZGVmaW5lIENMT1NFX0NIQU5ORUxfQV9QSFlfQ0xLKCkgIC8vICAgKHdyaXRlbCgoMFhiMDAwYTAwNSksIEREUl9DTEtfQ05UTCkpCiNkZWZpbmUgQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKSAgIC8vICAod3JpdGVsKCgwWGIwMDBhMDA1KSwgRERSX0NMS19DTlRMKSkKCiNkZWZpbmUgQU1fRERSX1BMTF9DTlRMMCAgICAgCSAgICAgICAoTU1DX1JFR19CQVNFICsgKCAweDAJPDwgMiApKQojZGVmaW5lIEFNX0REUl9QTExfQ05UTAkJCQkJCUFNX0REUl9QTExfQ05UTDAKI2RlZmluZSAgRERSMF9QVUJfWlFDUiAgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTAgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTBQUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhMSA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMERSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWEyIDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEwU1IgICAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTMgPDwgMiApKQoKI2RlZmluZSAgRERSMF9QVUJfWlExUFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYTUgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTFEUiAgICAgICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhNiA8PCAyICkpCiNkZWZpbmUgIEREUjBfUFVCX1pRMVNSICAgICAgICAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE3IDw8IDIgKSkKCiNkZWZpbmUgIEREUjBfUFVCX1pRMlBSICAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWE5IDw8IDIgKSkKI2RlZmluZSAgRERSMF9QVUJfWlEyRFIgICAgICAgICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYUEgPDwgMiApKQojZGVmaW5lICBERFIwX1BVQl9aUTJTUiAgICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFhQiA8PCAyICkpCgojZGVmaW5lIEREUjFfUFVCX1pRQ1IJCQkJCUREUjBfUFVCX1pRMFBSCiNkZWZpbmUgRERSMV9QVUJfWlEwUFIJCQkJCUREUjBfUFVCX1pRMFBSCiNkZWZpbmUgRERSMV9QVUJfWlEwRFIJCQkJCUREUjBfUFVCX1pRMERSCgojZGVmaW5lIEFDQkRMUl9NQVggICAwWDNGCiNkZWZpbmUgQUNMQ0RMUl9NQVggICAwWDFGRgojZGVmaW5lIERRQkRMUl9NQVggICAwWDNGCiNkZWZpbmUgRFFMQ0RMUl9NQVggICAwWDFGRgojZGVmaW5lIERYTkdUUl9NQVggICAwWDFGCiNkZWZpbmUgRERSMF9QVUJfRFgwR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgxYzAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgyMDAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgyNDAgIDw8IDIpICsgRERSMF9QVUJfUkVHX0JBU0UpCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMjgwICA8PCAyKSArIEREUjBfUFVCX1JFR19CQVNFKQojaWZuZGVmICBETUNfUkVHX0JBU0UKI2RlZmluZSBETUNfUkVHX0JBU0UJCQkJCQlNTUNfUkVHX0JBU0UKI2VuZGlmCiNkZWZpbmUgRE1DX01PTl9DVFJMMgkJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyNiA8PDIgKSkKLy9iaXQgMzEuICAgcW9zX21vbl9lbi4gICAgd3JpdGUgMSB0byB0cmlnZ2VyIHRoZSBlbmFibGUuIHBvbGxpbmcgdGhpcyBiaXQgMCwgbWVhbnMgZmluaXNoZWQuICBvciB1c2UgaW50ZXJydXB0IHRvIGNoZWNrIGZpbmlzaC4KLy9iaXQgMzAuICAgcW9zX21vbiBpbnRlcnJ1cHQgY2xlYXIuICBjbGVhciB0aGUgcW9zIG1vbml0b3IgcmVzdWx0LiAgcmVhZCAxID0gcW9zIG1vbiBmaW5pc2ggaW50ZXJydXB0LgovL2JpdCAyMC4gICBxb3NfbW9uX3RyaWdfc2VsLiAgMSA9IHZzeW5jLiAgMCA9IHRpbWVyLgovL2JpdCAxOToxNi4gIHFvcyBtb25pdG9yIGNoYW5uZWwgc2VsZWN0LiAgIHNlbGVjdCBvbmUgYXQgb25lIHRpbWUgb25seS4KLy9iaXQgMTU6MC4gICBwb3J0IHNlbGVjdCBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwuCiNkZWZpbmUgRE1DX01PTl9DVFJMMwkJCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyNyA8PDIgKSkKLy8gcW9zX21vbl9jbGtfdGltZXIuICAgSG93IGxvbmcgdG8gbWVhc3VyZSB0aGUgYmFuZHdpZHRoLgoKCiNkZWZpbmUgRE1DX01PTl9BTExfUkVRX0NOVAkJCQkJKERNQ19SRUdfQkFTRSArICgweDI4IDw8MiApKQovLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgd2hvbGUgTU1DIHJlcXVlc3QgdGltZS4KI2RlZmluZSBETUNfTU9OX0FMTF9HUkFOVF9DTlQJCQkJKERNQ19SRUdfQkFTRSArICgweDI5IDw8MiApKQogIC8vIGF0IHRoZSB0ZXN0IHBlcmlvZCwgIHRoZSB3aG9sZSBNTUMgZ3JhbnRlZCBkYXRhIGN5Y2xlcy4gNjRiaXRzIHVuaXQuCiNkZWZpbmUgRE1DX01PTl9PTkVfR1JBTlRfQ05UCQkJCShETUNfUkVHX0JBU0UgKyAoMHgyYSA8PDIgKSkKICAvLyBhdCB0aGUgdGVzdCBwZXJpb2QsICB0aGUgZ3JhbnRlZCBkYXRhIGN5Y2xlcyBmb3IgdGhlIHNlbGVjdGVkIGNoYW5uZWwgYW5kIHBvcnRzLgojZW5kaWYgCgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKI2RlZmluZSBERFIwX1BVQl9QSVIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MDE8PDIpKQojZGVmaW5lIEREUjBfUFVCX1BHQ1IwICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNCA8PCAyICApKS8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMAojZGVmaW5lIEREUjBfUFVCX1BHQ1IxICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNSA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQojZGVmaW5lIEREUjBfUFVCX1BHQ1IyICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNiA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgojZGVmaW5lIEREUjBfUFVCX1BHQ1IzICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNyA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMwojZGVmaW5lIEREUjBfUFVCX1BHQ1I0ICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwOCA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNAojZGVmaW5lIEREUjBfUFVCX1BHQ1I1ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwOSA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNQojZGVmaW5lIEREUjBfUFVCX1BHQ1I2ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwQSA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNgojZGVmaW5lIEREUjBfUFVCX1BHQ1I3ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwQiA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNwojZGVmaW5lIEREUjBfUFVCX1BHQ1I4ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwQyA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgOAoKI2RlZmluZSBERFIxX1BVQl9QSVIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MDE8PDIpKQojZGVmaW5lIEREUjFfUFVCX1BHQ1IwICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNCA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMAojZGVmaW5lIEREUjFfUFVCX1BHQ1IxICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNSA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMQojZGVmaW5lIEREUjFfUFVCX1BHQ1IyICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNiA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMgojZGVmaW5lIEREUjFfUFVCX1BHQ1IzICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwNyA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMwojZGVmaW5lIEREUjFfUFVCX1BHQ1I0ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwOCA8PCAyICkgKS8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNAojZGVmaW5lIEREUjFfUFVCX1BHQ1I1ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwOSA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNQojZGVmaW5lIEREUjFfUFVCX1BHQ1I2ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwQSA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNgojZGVmaW5lIEREUjFfUFVCX1BHQ1I3ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwQiA8PCAyICkpIC8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgNwojZGVmaW5lIEREUjFfUFVCX1BHQ1I4ICAgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAwQyA8PCAyICkgKS8vIFIvVyAtIFBIWSBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgOAoKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMCAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkMCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEJETFIxICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQxICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjIgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDIgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMyAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkNCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEJETFI0ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ1ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwQkRMUjUgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDYgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNiAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkOCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMCAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUwICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIxICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTEgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjIgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMiAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMyAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUzICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFI0ICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTQgIDw8IDIgKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjUgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlNSAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYME1ETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU4ICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgwTURMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTkgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDBHVFIwICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMCAgPDwgMiApKQojZGVmaW5lIEREUjBfUFVCX0RYMEdUUjEgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYxICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgwR1RSMiAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZjIgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDBHVFIzICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFmMyAgPDwgMikpCgojZGVmaW5lIEREUjBfUFVCX0RYMUJETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjEwICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSMiAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxMiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUJETFIzICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE0ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxQkRMUjQgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTUgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFCRExSNSAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxNiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUJETFI2ICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE4ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIwICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjAgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjEgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMiAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjIyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIzICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjMgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjQgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyNCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSNSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI1ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxTURMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjggIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFNRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyOSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUdUUjAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMwICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSMSAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDFHVFIyICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIzMiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMUdUUjMgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjMzICA8PCAyKSApCgojZGVmaW5lIEREUjBfUFVCX0RYMkJETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjUwICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSMiAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1MiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkJETFIzICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU0ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyQkRMUjQgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTUgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJCRExSNSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1NiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkJETFI2ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU4ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIwICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjAgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjEgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMiAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjYyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIzICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjMgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjQgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2NCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSNSAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY1ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyTURMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjggIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJNRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2OSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdUUjAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjcwICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgyR1RSMSAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDJHVFIyICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI3MiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdUUjMgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjczICA8PCAyKSApCgojZGVmaW5lIEREUjBfUFVCX0RYM0JETFIwICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjkwICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjEgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSMiAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5MiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0JETFIzICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk0ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzQkRMUjQgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTUgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNCRExSNSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5NiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0JETFI2ICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk4ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIwICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTAgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjEgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMiAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmEyICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIzICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTMgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjQgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhNCAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSNSAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE1ICA8PCAyKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzTURMUjAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYTggIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNNRExSMSAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhOSAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dUUjAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIwICA8PCAyICkpCiNkZWZpbmUgRERSMF9QVUJfRFgzR1RSMSAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyYjEgIDw8IDIpICkKI2RlZmluZSBERFIwX1BVQl9EWDNHVFIyICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMiAgPDwgMikgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dUUjMgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmIzICA8PCAyKSApCgojZGVmaW5lIEREUjFfUFVCX0RYMEJETFIwICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQwICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjEgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDEgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkNCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMEJETFI0CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZDUgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBCRExSNQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWQ2ICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwQkRMUjYJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFkOCAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMCAgKAlERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTAgIDw8IDIpICkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjEJICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWUxICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIyICAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlMiAgPDwgMikgKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMwkgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxZTMgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjQgICgJRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU0ICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFI1CSAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlNSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYME1ETFIwCSAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFlOCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYME1ETFIxCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWU5ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwR1RSMAkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYwICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgwR1RSMQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYxICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwR1RSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYyICA8PCAyKSApCiNkZWZpbmUgRERSMV9QVUJfRFgwR1RSMwkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MWYzICA8PCAyKSkKCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxMCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUJETFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjEyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxNCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUJETFI0CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMTUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFCRExSNQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjE2ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxQkRMUjYJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIxOCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMiAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMwkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyMyAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSNCAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyNCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSNQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIyNSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMU1ETFIwCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjI4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgxTURMUjEJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMjkgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFHVFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFHVFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFHVFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDFHVFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMzMgIDw8IDIgKSkKCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1MCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkJETFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjUyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1NCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkJETFI0CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNTUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJCRExSNQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjU2ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyQkRMUjYJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI1OCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMiAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMwkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2MyAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSNAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2NCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSNQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI2NSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYMk1ETFIwCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjY4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgyTURMUjEJIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNjkgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJHVFIwCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzAgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJHVFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJHVFIyCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzIgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDJHVFIzCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNzMgIDw8IDIgKSkKCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5MCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0JETFIxCShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTEgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSMgkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjkyICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5NCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0JETFI0CShERFIwX1BVQl9SRUdfQkFTRSArICggMHgyOTUgIDw8IDIgKSkKI2RlZmluZSBERFIxX1BVQl9EWDNCRExSNQkoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjk2ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzQkRMUjYJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI5OCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMQkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMiAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMwkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhMyAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSNAkgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhNCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSNSAoCUREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhNSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM01ETFIwCSAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MmE4ICA8PCAyICkpCiNkZWZpbmUgRERSMV9QVUJfRFgzTURMUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJhOSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0dUUjAJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMCAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0dUUjEJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMSAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0dUUjIJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMiAgPDwgMiApKQojZGVmaW5lIEREUjFfUFVCX0RYM0dUUjMJKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDJiMyAgPDwgMiApKQoKCiNkZWZpbmUgRERSMF9QVUJfQUNMQ0RMUiAgICAgICAoRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTYwIDw8IDIgKSkgLy8gUi9XIC0gTEMgRGVsYXkgTGluZSBQcmVzZW50IFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfQUNNRExSMCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTY4IDw8IDIgKSkgLy8gUi9XIC0gQUMgTWFzdGVyIERlbGF5IExpbmUgUmVnaXN0ZXIgMAojZGVmaW5lIEREUjBfUFVCX0FDTURMUjEgICAgICggIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE2OSA8PCAyICkpIC8vIFIvVyAtIE1hc3RlciBEZWxheSBMaW5lIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIwX1BVQl9BQ0JETFIwICAgICAgIChERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNTAgPDwgMiApKSAvLyBSL1cgLSBBQyBCaXQgRGVsYXkgTGluZSBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfQUNCRExSMyAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE1MyA8PCAyICkgKSAvLyBSL1cgLSBBQyBCaXQgRGVsYXkgTGluZSBSZWdpc3RlciAzCgojZGVmaW5lIEREUjFfUFVCX0FDTENETFIgICAgICAgKEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE2MCA8PCAyICkgKS8vIFIvVyAtIExDIERlbGF5IExpbmUgUHJlc2VudCBSZWdpc3RlcgojZGVmaW5lIEREUjFfUFVCX0FDTURMUjAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE2OCA8PCAyICkpIC8vIFIvVyAtIEFDIE1hc3RlciBEZWxheSBMaW5lIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIxX1BVQl9BQ01ETFIxICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNjkgPDwgMiApKSAvLyBSL1cgLSBNYXN0ZXIgRGVsYXkgTGluZSBSZWdpc3RlciAxCiNkZWZpbmUgRERSMV9QVUJfQUNCRExSMCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTUwIDw8IDIgKSApLy8gUi9XIC0gQUMgQml0IERlbGF5IExpbmUgUmVnaXN0ZXIgMAoKCiNkZWZpbmUgRERSMF9QVUJfQUNNRExSCQkJCQlERFIwX1BVQl9BQ01ETFIwCiNkZWZpbmUgRERSMV9QVUJfQUNNRExSCQkJCQlERFIxX1BVQl9BQ01ETFIwCiNkZWZpbmUgRERSMF9QVUJfRFgwR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDBHVFIwCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDFHVFIwCiNkZWZpbmUgRERSMF9QVUJfRFgyR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDJHVFIwCiNkZWZpbmUgRERSMF9QVUJfRFgzR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDNHVFIwCiNkZWZpbmUgRERSMV9QVUJfRFgwR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDBHVFIwCiNkZWZpbmUgRERSMV9QVUJfRFgxR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDFHVFIwCiNkZWZpbmUgRERSMV9QVUJfRFgyR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDJHVFIwCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBERFIwX1BVQl9EWDNHVFIwCgoKI2RlZmluZSBERFIwX1BVQl9JT1ZDUjAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ4IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9JT1ZDUjEgICAgICAoICAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ5IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIwX1BVQl9WVENSMCAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRBIDw8IDIgKSApLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIwX1BVQl9WVENSMSAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRCIDw8IDIgKSkgLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIxX1BVQl9JT1ZDUjAgICAgICggICAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ4IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIxX1BVQl9JT1ZDUjEgICAgICAoICAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTQ5IDw8IDIgKSkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIxX1BVQl9WVENSMCAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRBIDw8IDIgKSkgLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDAKI2RlZmluZSBERFIxX1BVQl9WVENSMSAgICAgICAgKCAgRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTRCIDw8IDIgKSkgLy8gUi9XIC0gVlJFRiBUcmFpbmluZyBDb250cm9sIFJlZ2lzdGVyIDEKCi8vI2RlZmluZSBERFIwX1BVQl9NUjYgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDY2IDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgNgovLyNkZWZpbmUgRERSMV9QVUJfTVI2ICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2NiA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDYKI2RlZmluZSBERFIwX1BVQl9EWDBHQ1I2ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxYzYgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgxR0NSNiAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjA2ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMkdDUjYgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI0NiAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDNHQ1I2ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyODYgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRENSICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA0MCA8PCAyICkgKSAvLyBSL1cgLSBEUkFNIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKI2RlZmluZSBERFIwX1BVQl9NUjAgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDYwIDw8IDIgKSApIC8vIFIvVyAtIE1vZGUgUmVnaXN0ZXIKI2RlZmluZSBERFIwX1BVQl9NUjEgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDYxIDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIKI2RlZmluZSBERFIwX1BVQl9NUjIgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDYyIDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgMgojZGVmaW5lIEREUjBfUFVCX01SMyAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwNjMgPDwgMiApICkgLy8gUi9XIC0gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciAzCiNkZWZpbmUgRERSMF9QVUJfTVI0ICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2NCA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDQKI2RlZmluZSBERFIwX1BVQl9NUjUgICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDY1IDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgNQojZGVmaW5lIEREUjBfUFVCX01SNiAgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwNjYgPDwgMiApICkgLy8gUi9XIC0gRXh0ZW5kZWQgTW9kZSBSZWdpc3RlciA2CiNkZWZpbmUgRERSMF9QVUJfTVI3ICAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA2NyA8PCAyICkgKSAvLyBSL1cgLSBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIDcKI2RlZmluZSBERFIwX1BVQl9NUjExICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDZCIDw8IDIgKSApIC8vIFIvVyAtIEV4dGVuZGVkIE1vZGUgUmVnaXN0ZXIgMTEKI2RlZmluZSBERFIwX1BVQl9SQU5LSURSICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MTM3IDw8IDIgKSApIC8vIFIvVyAtIFJhbmsgSUQgUmVnaXN0ZXIKI2RlZmluZSBERFIwX1BVQl9EVENSMCAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDgwIDw8IDIgKSApIC8vIFIvVyAtIERhdGEgVHJhaW5pbmcgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgojZGVmaW5lIEREUjBfUFVCX0RURURSMCAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwOEMgPDwgMiApICkgLy8gUi9XIC0gRGF0YSBUcmFpbmluZyBFeWUgRGF0YSBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfRFRFRFIxICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA4RCA8PCAyICkgKSAvLyBSL1cgLSBEYXRhIFRyYWluaW5nIEV5ZSBEYXRhIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIwX1BVQl9EVEVEUjIgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDhFIDw8IDIgKSApIC8vIFIvVyAtIERhdGEgVHJhaW5pbmcgRXllIERhdGEgUmVnaXN0ZXIgMgojZGVmaW5lIEREUjBfUFVCX1ZURFIgICAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgwOEYgPDwgMiApICkgLy8gUi9XIC0gVnJlZiBUcmFpbmluZyBEYXRhIFJlZ2lzdGVyCiNlbHNlCgojZGVmaW5lIEREUjBfUFVCX1BJUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgwMTw8MikpCiNkZWZpbmUgRERSMF9QVUJfUEdDUjAJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MDI8PDIpKQojZGVmaW5lIEREUjBfUFVCX1BHQ1IxCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDAzPDwyKSkKCiNkZWZpbmUgRERSMV9QVUJfUElSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDAxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9QR0NSMAkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwMjw8MikpCiNkZWZpbmUgRERSMV9QVUJfUEdDUjEJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MDM8PDIpKQoKI2RlZmluZSAgRERSMF9QVUJfRFgwQkRMUjAgICAoRERSMF9QVUJfUkVHX0JBU0UrKDB4QTc8PDIpKQojZGVmaW5lICBERFIwX1BVQl9EWDFCRExSMCAgICAoRERSMF9QVUJfUkVHX0JBU0UrKDB4Qzc8PDIpKQojZGVmaW5lICBERFIwX1BVQl9EWDJCRExSMCAgIChERFIwX1BVQl9SRUdfQkFTRSsoMHhFNzw8MikpCiNkZWZpbmUgIEREUjBfUFVCX0RYM0JETFIwICAgIChERFIwX1BVQl9SRUdfQkFTRSsoMHgxMDc8PDIpKQoKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEE4PDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEE5PDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSMwkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFBPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFCPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFDPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBCRExSNgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFEPDwyKSkKCiNkZWZpbmUgRERSMF9QVUJfRFgwTENETFIwCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4QUU8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMExDRExSMQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEFGPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBMQ0RMUjIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhCMDw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgwTURMUgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEIxPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDBHVFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4QjI8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMUxDRExSMAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweENFPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDFMQ0RMUjEJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhDRjw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgxTENETFIyCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RDA8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMU1ETFIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhEMTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgxR1RSCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEQyPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDJMQ0RMUjAJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHhFRTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgyTENETFIxCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RUY8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYMkxDRExSMgkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweEYwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDJNRExSCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4RjE8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM0xDRExSMAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDEwRTw8MikpCiNkZWZpbmUgRERSMF9QVUJfRFgzTENETFIxCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTBGPDwyKSkKI2RlZmluZSBERFIwX1BVQl9EWDNMQ0RMUjIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMTA8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM01ETFIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMTE8PDIpKQojZGVmaW5lIEREUjBfUFVCX0RYM0dUUgkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgxMTI8PDIpKQoKI2RlZmluZSBERFIxX1BVQl9EWDBMQ0RMUjAJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhBRTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgwTENETFIxCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4QUY8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMExDRExSMgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEIwPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDBNRExSCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4QjE8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMEdUUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhCMjw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgxTENETFIwCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4Q0U8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMUxDRExSMQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweENGPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDFMQ0RMUjIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhEMDw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgxTURMUgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEQxPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDFHVFIJCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RDI8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMkxDRExSMAkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweEVFPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDJMQ0RMUjEJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhFRjw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgyTENETFIyCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4RjA8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYMk1ETFIJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHhGMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzTENETFIwCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MTBFPDwyKSkKI2RlZmluZSBERFIxX1BVQl9EWDNMQ0RMUjEJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgxMEY8PDIpKQojZGVmaW5lIEREUjFfUFVCX0RYM0xDRExSMgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDExMDw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzTURMUgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDExMTw8MikpCiNkZWZpbmUgRERSMV9QVUJfRFgzR1RSCQkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDExMjw8MikpCgoKI2RlZmluZSBERFIwX1BVQl9BQ01ETFIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MEU8PDIpKQojZGVmaW5lIEREUjBfUFVCX0FDTENETFIJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgwRjw8MikpCiNkZWZpbmUgRERSMF9QVUJfQUNCRExSMAkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDEwPDwyKSkKI2RlZmluZSBERFIwX1BVQl9BQ0JETFIzCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MTM8PDIpKQojZGVmaW5lIEREUjFfUFVCX0FDTURMUgkJCQkJCShERFIxX1BVQl9SRUdfQkFTRSsoMHgwRTw8MikpCiNkZWZpbmUgRERSMV9QVUJfQUNMQ0RMUgkJCQkJKEREUjFfUFVCX1JFR19CQVNFKygweDBGPDwyKSkKI2RlZmluZSBERFIxX1BVQl9BQ0JETFIwCQkJCQkoRERSMV9QVUJfUkVHX0JBU0UrKDB4MTA8PDIpKQoKI2RlZmluZSBERFIwX1BVQl9BQ01ETFIwCUREUjBfUFVCX0FDTURMUgojZGVmaW5lIEREUjFfUFVCX0FDTURMUjAJRERSMV9QVUJfQUNNRExSCiNkZWZpbmUgRERSMF9QVUJfRFgwTURMUjAgRERSMF9QVUJfRFgwTURMUgojZGVmaW5lIEREUjBfUFVCX0RYMU1ETFIwIEREUjBfUFVCX0RYMU1ETFIKI2RlZmluZSBERFIwX1BVQl9EWDJNRExSMCBERFIwX1BVQl9EWDJNRExSCiNkZWZpbmUgRERSMF9QVUJfRFgzTURMUjAgRERSMF9QVUJfRFgzTURMUgojZGVmaW5lIEREUjFfUFVCX0RYME1ETFIwIEREUjBfUFVCX0RYME1ETFIKI2RlZmluZSBERFIxX1BVQl9EWDFNRExSMCBERFIwX1BVQl9EWDFNRExSCiNkZWZpbmUgRERSMV9QVUJfRFgyTURMUjAgRERSMF9QVUJfRFgyTURMUgojZGVmaW5lIEREUjFfUFVCX0RYM01ETFIwIEREUjBfUFVCX0RYM01ETFIKI2RlZmluZSBERFIwX1BVQl9EQ1IJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4MjI8PDIpKQojZGVmaW5lIEREUjBfUFVCX01SMAkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgyNzw8MikpCiNkZWZpbmUgRERSMF9QVUJfTVIxCQkJCQkJKEREUjBfUFVCX1JFR19CQVNFKygweDI4PDwyKSkKI2RlZmluZSBERFIwX1BVQl9NUjIJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4Mjk8PDIpKQojZGVmaW5lIEREUjBfUFVCX01SMwkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHgyQTw8MikpCiNkZWZpbmUgRERSMF9QVUJfUkFOS0lEUiAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA8PCAyICkgKSAvLyBSL1cgLSBSYW5rIElEIFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfRFRDUjAgICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAwPDwgMiApICkgLy8gUi9XIC0gRGF0YSBUcmFpbmluZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCiNkZWZpbmUgRERSMF9QVUJfRFRFRFIwICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDAgPDwgMiApICkgLy8gUi9XIC0gRGF0YSBUcmFpbmluZyBFeWUgRGF0YSBSZWdpc3RlciAwCiNkZWZpbmUgRERSMF9QVUJfRFRFRFIxICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDA8PCAyICkgKSAvLyBSL1cgLSBEYXRhIFRyYWluaW5nIEV5ZSBEYXRhIFJlZ2lzdGVyIDEKI2RlZmluZSBERFIwX1BVQl9EVEVEUjIgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MCA8PCAyICkgKSAvLyBSL1cgLSBEYXRhIFRyYWluaW5nIEV5ZSBEYXRhIFJlZ2lzdGVyIDIKI2RlZmluZSBERFIwX1BVQl9WVERSICAgICAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MDw8IDIgKSApIC8vIFIvVyAtIFZyZWYgVHJhaW5pbmcgRGF0YSBSZWdpc3RlcgoKI2lmbmRlZiAgUF9ERFIwX0NMS19DVFJMCiNkZWZpbmUgUF9ERFIwX0NMS19DVFJMICAgMHhjODAwMDgwMAojZW5kaWYKI2lmbmRlZiAgUF9ERFIxX0NMS19DVFJMCiNkZWZpbmUgUF9ERFIxX0NMS19DVFJMICAweGM4MDAyODAwCiNlbmRpZgoKI2RlZmluZSBERFIwX1BVQl9JT1ZDUjAJCQkJCQkoRERSMF9QVUJfUkVHX0JBU0UrKDB4OEU8PDIpKQojZGVmaW5lIEREUjBfUFVCX0lPVkNSMQkJCQkJCShERFIwX1BVQl9SRUdfQkFTRSsoMHg4Rjw8MikpCiNlbmRpZgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCi8vdW5zaWduZWQgaW50IGRlc1s4XTsKLyoKCXVuc2lnbmVkIGludCBwYXR0ZXJuXzFbNF1bOF09Cgl7CgkweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCjB4ZmYwMGZmMDAJLAoweGZmMDBmZjAwCSwKMHhmZjAwZmYwMAksCgp9Owp1bnNpZ25lZCBpbnQgcGF0dGVybl8yWzRdWzhdPXsKMHgwMDAxZmUwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMmZkMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDRmYjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDA4ZjcwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAxMGVmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMjBkZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDQwYmYwMAksCjB4MDAwMGZmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDA4MDdmMDAJLAoweDAwMDBmZjAwCSwKMHgwMDAwZmYwMAksCjB4MDAwMGZmMDAJLAoKfTsKdW5zaWduZWQgaW50IHBhdHRlcm5fM1s0XVs4XT17CgkweDAwMDEwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMjAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDA0MDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDgwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAxMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDIwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwNDAwMDAwCSwKCTB4MDAwMDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDA4MDAwMDAJLAoJMHgwMDAwMDAwMAksCgkweDAwMDAwMDAwCSwKCTB4MDAwMDAwMDAJLAp9Owp1bnNpZ25lZCBpbnQgcGF0dGVybl80WzRdWzhdPXsKCTB4NTFjOGMwNDkJLAoJMHgyZDQzNTkyYwksCgkweDA3NzdiNTBiCSwKCTB4OWNkMmViZTUJLAoJMHhjMDQxOTlkNQksCgkweGRjOTY4ZGMwCSwKCTB4YjhiYThhMzMJLAoJMHgzNWU0MzI3ZgksCgkweDUxYzhjMDQ5CSwKCTB4MmQ0MzU5MmMJLAoJMHgwNzc3YjUwYgksCgkweDljZDJlYmU1CSwKCTB4YzA0MTk5ZDUJLAoJMHhkYzk2OGRjMAksCgkweGI4YmE4YTMzCSwKCTB4MzVlNDMyN2YJLAoJMHg1MWM4YzA0OQksCgkweDJkNDM1OTJjCSwKCTB4MDc3N2I1MGIJLAoJMHg5Y2QyZWJlNQksCgkweGMwNDE5OWQ1CSwKCTB4ZGM5NjhkYzAJLAoJMHhiOGJhOGEzMwksCgkweDM1ZTQzMjdmCSwKCTB4NTFjOGMwNDkJLAoJMHgyZDQzNTkyYwksCgkweDA3NzdiNTBiCSwKCTB4OWNkMmViZTUJLAoJMHhjMDQxOTlkNQksCgkweGRjOTY4ZGMwCSwKCTB4YjhiYThhMzMJLAoJMHgzNWU0MzI3ZgksCn07CnVuc2lnbmVkIGludCBwYXR0ZXJuXzVbNF1bOF09ewoJMHhhZWM5YzE0OQksCgkweGQyNDM1OTJjCSwKCTB4Zjg3N2I1MGIJLAoJMHg2M2QyZWJlNQksCgkweDNmNDM5YmQ1CSwKCTB4MjM5NjhkYzAJLAoJMHg0N2JhOGEzMwksCgkweGNhZTQzMjdmCSwKCTB4YWVjY2M0NDkJLAoJMHhkMjQzNTkyYwksCgkweGY4NzdiNTBiCSwKCTB4NjNkMmViZTUJLAoJMHgzZjQ5OTFkNQksCgkweDIzOTY4ZGMwCSwKCTB4NDdiYThhMzMJLAoJMHhjYWU0MzI3ZgksCgkweGFlZDhkMDQ5CSwKCTB4ZDI0MzU5MmMJLAoJMHhmODc3YjUwYgksCgkweDYzZDJlYmU1CSwKCTB4M2Y2MWI5ZDUJLAoJMHgyMzk2OGRjMAksCgkweDQ3YmE4YTMzCSwKCTB4Y2FlNDMyN2YJLAoJMHhhZTg4ODA0OQksCgkweGQyNDM1OTJjCSwKCTB4Zjg3N2I1MGIJLAoJMHg2M2QyZWJlNQksCgkweDNmYzExOWQ1CSwKCTB4MjM5NjhkYzAJLAoJMHg0N2JhOGEzMwksCgkweGNhZTQzMjdmCSwKfTsKdW5zaWduZWQgaW50IHBhdHRlcm5fNls0XVs4XT17CgkweGFlYzljMTQ5CSwKCTB4ZDI0M2E2MmMJLAoJMHhmODc3NGEwYgksCgkweDYzZDIxNGU1CSwKCTB4M2Y0MzY2ZDUJLAoJMHgyMzk2NzJjMAksCgkweDQ3YmE3NTMzCSwKCTB4Y2FlNGNkN2YJLAoJMHhhZWNjM2Y0OQksCgkweGQyNDNhNjJjCSwKCTB4Zjg3NzRhMGIJLAoJMHg2M2QyMTRlNQksCgkweDNmNDk2NmQ1CSwKCTB4MjM5NjcyYzAJLAoJMHg0N2JhNzUzMwksCgkweGNhZTRjZDdmCSwKCTB4YWVkODNmNDkJLAoJMHhkMjQzYTYyYwksCgkweGY4Nzc0YTBiCSwKCTB4NjNkMjE0ZTUJLAoJMHgzZjYxNjZkNQksCgkweDIzOTY3MmMwCSwKCTB4NDdiYTc1MzMJLAoJMHhjYWU0Y2Q3ZgksCgkweGFlODgzZjQ5CSwKCTB4ZDI0M2E2MmMJLAoJMHhmODc3NGEwYgksCgkweDYzZDIxNGU1CSwKCTB4M2ZjMTY2ZDUJLAoJMHgyMzk2NzJjMAksCgkweDQ3YmE3NTMzCSwKCTB4Y2FlNGNkN2YJLAoKfTsKdW5zaWduZWQgaW50ICBkZXNbOF0gPXsKCTB4YWVjODNmNDksCgkweGQyNDNhNjJjLAoJMHhmODc3NGEwYiwKCTB4NjNkMjE0ZTUsCgkweDNmNDE2NmQ1LAoJMHgyMzk2NzJjMCwKCTB4NDdiYTc1MzMsCgkweGNhZTRjZDdmLAp9OwoqLwovKgogICB1bnNpZ25lZCBpbnQgIGRlc1s4XSA7CiAgIGRlc1swXSA9IAkweGFlYzgzZjQ5OwogICBkZXNbMV0gPSAgICAgIDB4ZDI0M2E2MmM7CiAgIGRlc1syXSA9ICAgICAgMHhmODc3NGEwYjsKICAgZGVzWzNdID0gICAgICAgMHg2M2QyMTRlNTsKICAgZGVzWzRdID0gICAgICAweDNmNDE2NmQ1OwogICBkZXNbNV0gPSAgICAgMHgyMzk2NzJjMDsKICAgZGVzWzZdID0gICAgICAweDQ3YmE3NTMzOwogICBkZXNbN10gPSAgICAgIDB4Y2FlNGNkN2Y7CiAgIHBhdHRlcm5fMVswXVswXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVsxXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVsyXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVszXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVs0XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVs1XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVs2XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVswXVs3XSA9IDB4ZmYwMGZmMDA7CgogICBwYXR0ZXJuXzFbMV1bMF0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bMV0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bMl0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bM10gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bNF0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bNV0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bNl0gPSAweGZmMDBmZjAwOwogICBwYXR0ZXJuXzFbMV1bN10gPSAweGZmMDBmZjAwOwoKICAgcGF0dGVybl8xWzJdWzBdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzFdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzJdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzNdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzRdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzVdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzZdID0gMHhmZjAwZmYwMDsKICAgcGF0dGVybl8xWzJdWzddID0gMHhmZjAwZmYwMDsKCiAgIHBhdHRlcm5fMVszXVswXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVsxXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVsyXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVszXSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVs0XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVs1XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVs2XSA9IDB4ZmYwMGZmMDA7CiAgIHBhdHRlcm5fMVszXVs3XSA9IDB4ZmYwMGZmMDA7CgogICBwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwogICBwYXR0ZXJuXzJbMF1bMV0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMF1bMl0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMF1bNF0gPSAweDAwMDJmZDAwOwogICBwYXR0ZXJuXzJbMF1bNV0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwogICBwYXR0ZXJuXzJbMF1bN10gPSAweDAwMDBmZjAwOwoKICAgcGF0dGVybl8yWzFdWzBdID0gMHgwMDA0ZmIwMDsKICAgcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzFdWzJdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzFdWzNdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKICAgcGF0dGVybl8yWzFdWzVdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzFdWzZdID0gMHgwMDAwZmYwMDsKICAgcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCiAgIHBhdHRlcm5fMlsyXVswXSA9IDB4MDAxMGVmMDA7CiAgIHBhdHRlcm5fMlsyXVsxXSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsyXVszXSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsyXVs0XSA9IDB4MDAyMGRmMDA7CiAgIHBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CiAgIHBhdHRlcm5fMlsyXVs2XSA9IDB4MDAwMGZmMDA7CnBhdHRlcm5fMlsyXVs3XSA9IDB4MDAwMGZmMDA7CgpwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwpwYXR0ZXJuXzJbM11bMV0gPSAweDAwMDBmZjAwOwpwYXR0ZXJuXzJbM11bMl0gPSAweDAwMDBmZjAwOwpwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwpwYXR0ZXJuXzJbM11bNF0gPSAweDAwODA3ZjAwOwpwYXR0ZXJuXzJbM11bNV0gPSAweDAwMDBmZjAwOwpwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwpwYXR0ZXJuXzJbM11bN10gPSAweDAwMDBmZjAwOwoKcGF0dGVybl8zWzBdWzBdID0gMHgwMDAxMDAwMDsKcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKcGF0dGVybl8zWzBdWzJdID0gMHgwMDAwMDAwMDsKcGF0dGVybl8zWzBdWzNdID0gMHgwMDAwMDAwMDsKcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKcGF0dGVybl8zWzBdWzVdID0gMHgwMDAwMDAwMDsKcGF0dGVybl8zWzBdWzZdID0gMHgwMDAwMDAwMDsKcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCnBhdHRlcm5fM1sxXVswXSA9IDB4MDAwNDAwMDA7CnBhdHRlcm5fM1sxXVsxXSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1sxXVszXSA9IDB4MDAwMDAwMDA7CnBhdHRlcm5fM1sxXVs0XSA9IDB4MDAwODAwMDA7CglwYXR0ZXJuXzNbMV1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzJdWzBdID0gMHgwMDEwMDAwMDsKCXBhdHRlcm5fM1syXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs0XSA9IDB4MDAyMDAwMDA7CglwYXR0ZXJuXzNbMl1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzNdWzBdID0gMHgwMDQwMDAwMDsKCXBhdHRlcm5fM1szXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs0XSA9IDB4MDA4MDAwMDA7CglwYXR0ZXJuXzNbM11bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs3XSA9IDB4MDAwMDAwMDA7CgpwYXR0ZXJuXzRbMF1bMF0gPQkweDUxYzhjMDQ5CTsKcGF0dGVybl80WzBdWzFdID0JMHgyZDQzNTkyYwk7CnBhdHRlcm5fNFswXVsyXSA9CTB4MDc3N2I1MGIJOwpwYXR0ZXJuXzRbMF1bM10gPQkweDljZDJlYmU1CTsKcGF0dGVybl80WzBdWzRdID0JMHhjMDQxOTlkNQk7CnBhdHRlcm5fNFswXVs1XSA9CTB4ZGM5NjhkYzAJOwpwYXR0ZXJuXzRbMF1bNl0gPQkweGI4YmE4YTMzCTsKcGF0dGVybl80WzBdWzddID0JMHgzNWU0MzI3Zgk7CgpwYXR0ZXJuXzRbMV1bMF0gPQkweDUxYzhjMDQ5CTsKcGF0dGVybl80WzFdWzFdID0JMHgyZDQzNTkyYwk7CnBhdHRlcm5fNFsxXVsyXSA9CTB4MDc3N2I1MGIJOwpwYXR0ZXJuXzRbMV1bM10gPQkweDljZDJlYmU1CTsKcGF0dGVybl80WzFdWzRdID0JMHhjMDQxOTlkNQk7CnBhdHRlcm5fNFsxXVs1XSA9CTB4ZGM5NjhkYzAJOwpwYXR0ZXJuXzRbMV1bNl0gPQkweGI4YmE4YTMzCTsKcGF0dGVybl80WzFdWzddID0JMHgzNWU0MzI3Zgk7CgpwYXR0ZXJuXzRbMl1bMF0gPQkweDUxYzhjMDQ5CTsKcGF0dGVybl80WzJdWzFdID0JMHgyZDQzNTkyYwk7CnBhdHRlcm5fNFsyXVsyXSA9CTB4MDc3N2I1MGIJOwpwYXR0ZXJuXzRbMl1bM10gPQkweDljZDJlYmU1CTsKcGF0dGVybl80WzJdWzRdID0JMHhjMDQxOTlkNQk7CnBhdHRlcm5fNFsyXVs1XSA9CTB4ZGM5NjhkYzAJOwpwYXR0ZXJuXzRbMl1bNl0gPQkweGI4YmE4YTMzCTsKcGF0dGVybl80WzJdWzddID0JMHgzNWU0MzI3Zgk7CgpwYXR0ZXJuXzRbM11bMF0gPQkweDUxYzhjMDQ5CTsKcGF0dGVybl80WzNdWzFdID0JMHgyZDQzNTkyYwk7CnBhdHRlcm5fNFszXVsyXSA9CTB4MDc3N2I1MGIJOwpwYXR0ZXJuXzRbM11bM10gPQkweDljZDJlYmU1CTsKcGF0dGVybl80WzNdWzRdID0JMHhjMDQxOTlkNQk7CnBhdHRlcm5fNFszXVs1XSA9CTB4ZGM5NjhkYzAJOwpwYXR0ZXJuXzRbM11bNl0gPQkweGI4YmE4YTMzCTsKcGF0dGVybl80WzNdWzddID0JMHgzNWU0MzI3Zgk7CgpwYXR0ZXJuXzVbMF1bMF0gPQkweGFlYzljMTQ5CTsKcGF0dGVybl81WzBdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVswXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbMF1bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzBdWzRdID0JMHgzZjQzOWJkNQk7CnBhdHRlcm5fNVswXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbMF1bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzBdWzddID0JMHhjYWU0MzI3Zgk7CnBhdHRlcm5fNVsxXVswXSA9CTB4YWVjY2M0NDkJOwpwYXR0ZXJuXzVbMV1bMV0gPQkweGQyNDM1OTJjCTsKcGF0dGVybl81WzFdWzJdID0JMHhmODc3YjUwYgk7CnBhdHRlcm5fNVsxXVszXSA9CTB4NjNkMmViZTUJOwpwYXR0ZXJuXzVbMV1bNF0gPQkweDNmNDk5MWQ1CTsKcGF0dGVybl81WzFdWzVdID0JMHgyMzk2OGRjMAk7CnBhdHRlcm5fNVsxXVs2XSA9CTB4NDdiYThhMzMJOwpwYXR0ZXJuXzVbMV1bN10gPQkweGNhZTQzMjdmCTsKcGF0dGVybl81WzJdWzBdID0JMHhhZWQ4ZDA0OQk7CnBhdHRlcm5fNVsyXVsxXSA9CTB4ZDI0MzU5MmMJOwpwYXR0ZXJuXzVbMl1bMl0gPQkweGY4NzdiNTBiCTsKcGF0dGVybl81WzJdWzNdID0JMHg2M2QyZWJlNQk7CnBhdHRlcm5fNVsyXVs0XSA9CTB4M2Y2MWI5ZDUJOwpwYXR0ZXJuXzVbMl1bNV0gPQkweDIzOTY4ZGMwCTsKcGF0dGVybl81WzJdWzZdID0JMHg0N2JhOGEzMwk7CnBhdHRlcm5fNVsyXVs3XSA9CTB4Y2FlNDMyN2YJOwpwYXR0ZXJuXzVbM11bMF0gPQkweGFlODg4MDQ5CTsKcGF0dGVybl81WzNdWzFdID0JMHhkMjQzNTkyYwk7CnBhdHRlcm5fNVszXVsyXSA9CTB4Zjg3N2I1MGIJOwpwYXR0ZXJuXzVbM11bM10gPQkweDYzZDJlYmU1CTsKcGF0dGVybl81WzNdWzRdID0JMHgzZmMxMTlkNQk7CnBhdHRlcm5fNVszXVs1XSA9CTB4MjM5NjhkYzAJOwpwYXR0ZXJuXzVbM11bNl0gPQkweDQ3YmE4YTMzCTsKcGF0dGVybl81WzNdWzddID0JMHhjYWU0MzI3Zgk7CgpwYXR0ZXJuXzZbMF1bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzBdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlswXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbMF1bNF0gPQkweDNmNDM2NmQ1CTsKcGF0dGVybl82WzBdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlswXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbMF1bN10gPQkweGNhZTRjZDdmCTsKcGF0dGVybl82WzFdWzBdID0JMHhhZWNjM2Y0OQk7CnBhdHRlcm5fNlsxXVsxXSA9CTB4ZDI0M2E2MmMJOwpwYXR0ZXJuXzZbMV1bMl0gPQkweGY4Nzc0YTBiCTsKcGF0dGVybl82WzFdWzNdID0JMHg2M2QyMTRlNQk7CnBhdHRlcm5fNlsxXVs0XSA9CTB4M2Y0OTY2ZDUJOwpwYXR0ZXJuXzZbMV1bNV0gPQkweDIzOTY3MmMwCTsKcGF0dGVybl82WzFdWzZdID0JMHg0N2JhNzUzMwk7CnBhdHRlcm5fNlsxXVs3XSA9CTB4Y2FlNGNkN2YJOwpwYXR0ZXJuXzZbMl1bMF0gPQkweGFlZDgzZjQ5CTsKcGF0dGVybl82WzJdWzFdID0JMHhkMjQzYTYyYwk7CnBhdHRlcm5fNlsyXVsyXSA9CTB4Zjg3NzRhMGIJOwpwYXR0ZXJuXzZbMl1bM10gPQkweDYzZDIxNGU1CTsKcGF0dGVybl82WzJdWzRdID0JMHgzZjYxNjZkNQk7CnBhdHRlcm5fNlsyXVs1XSA9CTB4MjM5NjcyYzAJOwpwYXR0ZXJuXzZbMl1bNl0gPQkweDQ3YmE3NTMzCTsKcGF0dGVybl82WzJdWzddID0JMHhjYWU0Y2Q3Zgk7CnBhdHRlcm5fNlszXVswXSA9CTB4YWU4ODNmNDkJOwpwYXR0ZXJuXzZbM11bMV0gPQkweGQyNDNhNjJjCTsKcGF0dGVybl82WzNdWzJdID0JMHhmODc3NGEwYgk7CnBhdHRlcm5fNlszXVszXSA9CTB4NjNkMjE0ZTUJOwpwYXR0ZXJuXzZbM11bNF0gPQkweDNmYzE2NmQ1CTsKcGF0dGVybl82WzNdWzVdID0JMHgyMzk2NzJjMAk7CnBhdHRlcm5fNlszXVs2XSA9CTB4NDdiYTc1MzMJOwpwYXR0ZXJuXzZbM11bN10gPQkweGNhZTRjZDdmCTsKKi8KI2VuZGlmCgojZGVmaW5lIEREUl9URVNUX1NUQVJUX0FERFIgIDB4MTA4MDAwMC8vICAweDEwMDAwMDAwIC8vQ09ORklHX1NZU19NRU1URVNUX1NUQVJUCiNkZWZpbmUgRERSX1RFU1RfU0laRSAweDIwMDAwMDAKLy8jZGVmaW5lIEREUl9URVNUX1NJWkUgMHgyMDAwCgojaWYgKENPTkZJR19DSElQPj1DSElQX1RYTFgpCgojZGVmaW5lIFBfRUVfVElNRVJfRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoKDB4M2M2MiAgPDwgMikgKyAweGZmZDAwMDAwKQoKLy8vKgovLyNpZm5kZWYgUF9QSU5fTVVYX1JFRzEKLy8gUGluIE11eCAgKDkpCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI2lmIChDT05GSUdfQ0hJUD09Q0hJUF9UWExYKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJjIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJjIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDJjIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJkIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJkIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDJkIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJlIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJlIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDJlIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJmIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDJmIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDJmIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMwIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMwIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDMwIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMxIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMxIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDMxIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMyIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMyIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDMyIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMzIDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDMzIDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDMzIDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM0IDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM0IDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDM0IDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM1IDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM1IDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDM1IDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM2IDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM2IDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDM2IDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM3IDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM3IDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDM3IDw8IDIpKQojZGVmaW5lICAgICBQRVJJUEhTX1BJTl9NVVhfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM4IDw8IDIpKQojZGVmaW5lIFNFQ19QRVJJUEhTX1BJTl9NVVhfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHhmZjYzNDQwMCArICgweDM4IDw8IDIpKQojZGVmaW5lICAgUF9QRVJJUEhTX1BJTl9NVVhfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9sYXRpbGUgdWludDMyX3QgKikoMHhmZjYzNDQwMCArICgweDM4IDw8IDIpKQojZW5kaWYgCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzEgICAgICAgIFBfUEVSSVBIU19QSU5fTVVYXzEvLyAoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmQgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHMiAgICAgICBQX1BFUklQSFNfUElOX01VWF8yLy8gICgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgyZSA8PCAyKSkpKQojZGVmaW5lIFBfUElOX01VWF9SRUczCQlQX1BFUklQSFNfUElOX01VWF8zLy8oKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MmYgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHNwkJUF9QRVJJUEhTX1BJTl9NVVhfNy8vKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDMzIDw8IDIpKSkpCi8vI2VuZGlmCgovLyNpZm5kZWYgUF9QV01fTUlTQ19SRUdfQUIKLy8jZGVmaW5lIFBfUFdNX01JU0NfUkVHX0FCCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE1NiA8PCAyKSkpKQovLyNkZWZpbmUgUF9QV01fUFdNX0IJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE1NSA8PCAyKSkpKQovLyNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQ0QJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTkyIDw8IDIpKSkpCi8vI2RlZmluZSBQX1BXTV9QV01fRAkJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4YzExMDAwMDAgKyAoMHgyMTkxIDw8IDIpKSkpCi8vI2VuZGlmCi8vKi8KLy8jZGVmaW5lICAgUFdNX01JU0NfUkVHX0FCICAgICAgICAgICAgICAgICAgICAgICAgICAoMHg2YzAyKQovLyNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQUIgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoKDB4NmMwMiAgPDwgMikgKyAweGZmZDAwMDAwKQovLyNkZWZpbmUgV0FUQ0hET0dfQ05UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgzYzM0ICA8PCAyKSArIDB4ZmZkMDAwMDApCi8vI2RlZmluZSBXQVRDSERPR19DTlRMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDNjMzUgIDw8IDIpICsgMHhmZmQwMDAwMCkKLy8jZGVmaW5lIFdBVENIRE9HX1RDTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4M2MzNiAgPDwgMikgKyAweGZmZDAwMDAwKQovLyNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgzYzM3ICA8PCAyKSArIDB4ZmZkMDAwMDApCiNlbHNlCi8vI2RlZmluZSBkZHJfdWRlbGF5KGEpICBkb3t9d2hpbGUoKGE8PDUpLS0pOwojZGVmaW5lIFBfRUVfVElNRVJfRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoKCgweDI2NjIgIDw8IDIpICsgMHhjMTEwMDAwMCkpCi8vI2RlZmluZSBXQVRDSERPR19DTlRMICAgICAgICAgICAgICAweGMxMTA5OGQwCi8vI2RlZmluZSBXQVRDSERPR19DTlRMMSAgICAgICAgICAgIDB4YzExMDk4ZDQKLy8jZGVmaW5lIFdBVENIRE9HX1RDTlQgICAgICAgICAgICAgMHhjMTEwOThkOAovLyNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgICAgICAgICAgICAweGMxMTA5OGRjCiNpZm5kZWYgUF9XQVRDSERPR19DTlRMCiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKI2RlZmluZSBQX1dBVENIRE9HX0NOVEwgICAgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikweGMxMTA5OGQwCiNkZWZpbmUgUF9XQVRDSERPR19DTlRMMSAgICAgICAgICAgKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweGMxMTA5OGQ0CiNkZWZpbmUgUF9XQVRDSERPR19UQ05UICAgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikweGMxMTA5OGQ4CiNkZWZpbmUgUF9XQVRDSERPR19SRVNFVCAgICAgICAgICAgKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweGMxMTA5OGRjCiNlbHNlCiNkZWZpbmUgUF9XQVRDSERPR19DTlRMICAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKDB4YzExMDAwMDArKDB4MjY0MDw8MikpCi8vI2RlZmluZSBQX1dBVENIRE9HX0NOVEwxICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4YzExMDk4ZDQKLy8jZGVmaW5lIFBfV0FUQ0hET0dfVENOVCAgICAgICAgICAgICAodm9sYXRpbGUgdW5zaWduZWQgaW50ICopMHhjMTEwOThkOAojZGVmaW5lIFBfV0FUQ0hET0dfUkVTRVQgICAgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoMHhjMTEwMDAwMCsoMHgyNjQxPDwyKSkKI2VuZGlmCiNlbmRpZgoKCiNpZm5kZWYgUF9QSU5fTVVYX1JFRzEKI2RlZmluZSBQX1BJTl9NVVhfUkVHMSAgICAgICAgICgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgyZCA8PCAyKSkpKQojZGVmaW5lIFBfUElOX01VWF9SRUcyICAgICAgICAgKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhkYTgzNDQwMCArICgweDJlIDw8IDIpKSkpCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzMJCSgoKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZGE4MzQ0MDAgKyAoMHgyZiA8PCAyKSkpKQojZGVmaW5lIFBfUElOX01VWF9SRUc3CQkoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGRhODM0NDAwICsgKDB4MzMgPDwgMikpKSkKI2VuZGlmCgojaWZuZGVmIFBfUFdNX01JU0NfUkVHX0FCCiNkZWZpbmUgUF9QV01fTUlTQ19SRUdfQUIJKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxNTYgPDwgMikpKSkKI2RlZmluZSBQX1BXTV9QV01fQgkJKCgodm9sYXRpbGUgdW5zaWduZWQgKikoMHhjMTEwMDAwMCArICgweDIxNTUgPDwgMikpKSkKI2RlZmluZSBQX1BXTV9NSVNDX1JFR19DRAkoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE5MiA8PCAyKSkpKQojZGVmaW5lIFBfUFdNX1BXTV9ECQkoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjE5MSA8PCAyKSkpKQojZW5kaWYKCiNpZm5kZWYgUF9FRV9USU1FUl9FCiNkZWZpbmUgUF9FRV9USU1FUl9FCQkoKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGMxMTAwMDAwICsgKDB4MjY2MiA8PCAyKSkpKQojZW5kaWYKCiNlbmRpZgoKI2RlZmluZSBnZXRfdXNfdGltZSgpICAgICgqUF9FRV9USU1FUl9FKS8vIChyZWFkbChQX0lTQV9USU1FUkUpKQoKLy8gI2RlZmluZSBQX0lTQV9USU1FUkUgICAgICAgICAgICAgICAgMHhjMTEwOTk4OAovLyAgICNkZWZpbmUgZ2V0X3VzX3RpbWUoKSAgICAocmVhZGwoUF9JU0FfVElNRVJFKSkKCi8qCiNkZWZpbmUgUF9QSU5fTVVYX1JFRzMJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGZmNjM0NDAwICsgKDB4MmYgPDwgMikpKSkKI2RlZmluZSBQX1BJTl9NVVhfUkVHNAkJKCooKHZvbGF0aWxlIHVuc2lnbmVkICopKDB4ZmY2MzQ0MDAgKyAoMHgzMCA8PCAyKSkpKQoKI2RlZmluZSBQX1BXTV9NSVNDX1JFR19BQgkoKigodm9sYXRpbGUgdW5zaWduZWQgKikoMHhmZjgwNzAwMCArICgweDAyIDw8IDIpKSkpCiNkZWZpbmUgUF9QV01fUFdNX0EJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgoMHg2YzAwICA8PCAyKSArIDB4ZmZkMDAwMDApKSkKCiNkZWZpbmUgQU9fUElOX01VWF9SRUcJCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCAqKSgweGZmODAwMDAwICsgKDB4MDUgPDwgMikpKSkKKi8KCiNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfd3IoYWRkciwgZGF0KSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKzB4ZmUwMDAwMDApKT0oKHVpbnQxNl90KWRhdCkKI2RlZmluZSBkd2NfZGRycGh5X2FwYl9yZChhZGRyKSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKzB4ZmUwMDAwMDApKQojZGVmaW5lIEFDWF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCgp2b2lkIGRkcl91ZGVsYXkodW5zaWduZWQgaW50IHVzKQp7Ci8vI2lmbmRlZiBDT05GSUdfUFhQX0VNVUxBVE9SCgl1bnNpZ25lZCBpbnQgdDAgPSAoKigoUF9FRV9USU1FUl9FKSkpOwoKCXdoaWxlICgoKigoUF9FRV9USU1FUl9FKSkpIC0gdDAgPD0gdXMpCgkJOwovLyNlbmRpZgp9CgojZGVmaW5lIEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSAgMSAKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOViAgICAyIAojZGVmaW5lIEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfSURNRSAgMyAKI2RlZmluZSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1kgIDQgCgojZGVmaW5lIAlERFJfUEFSQU1FVEVSX1JFQUQJCTEKI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgojZGVmaW5lIAlERFJfUEFSQU1FVEVSX0xFRlQJCTEKI2RlZmluZSAJRERSX1BBUkFNRVRFUl9SSUdIVAkJMgoKdHlwZWRlZiBzdHJ1Y3QgZGRyX3Rlc3Rfc3RydWN0IHsKCXVuc2lnbmVkCWludAlkZHJfZGF0YV9zb3VyY2UJOyAgCgl1bnNpZ25lZAlpbnQJZGRyX2RhdGFfdGVzdF9zaXplCTsgIAoJdW5zaWduZWQJaW50CWRkcl9hZGRyZXNzX3Rlc3Rfc2l6ZQk7ICAKCXVuc2lnbmVkCWludAlkZHJfdGVzdF93YXRjaGRvZ190aW1lc19zCTsgIAoJdW5zaWduZWQJaW50CWRkcl90ZXN0X2xhbmVfZGlzYWJsZQk7ICAKCgl1bnNpZ25lZAlpbnQJZGRyX3Rlc3Rfd2luZG93X2ZsYWdbOF0JOyAgCgl1bnNpZ25lZAlpbnQJZGRyX3Rlc3Rfd2luZG93X2RhdGFbMTAwXQk7ICAKfSAgZGRyX3Rlc3Rfc3RydWN0X3Q7CQkJCmRkcl90ZXN0X3N0cnVjdF90ICpnX2Rkcl90ZXN0X3N0cnVjdDsJCQkKCnVuc2lnbmVkIGludCAgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIodW5zaWduZWQgaW50IHNvdXJjZV9pbmRleCwgdW5zaWduZWQgaW50IHBhcmFtZXRlcl9pbmRleCAsdW5zaWduZWQgaW50IHBhcmFtZXRlcl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkKewoKCWlmKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX0RNQ19TVElDS1kpCgl7CgkJc3RpY2t5X3JlZ19iYXNlX2FkZCA9IChERFIwX1BVQl9SRUdfQkFTRSYweGZmZmYwMDAwKSsoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCgkJaWYocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfV1JJVEUpCgkJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSksIHBhcmFtZXRlcl92YWx1ZSk7CgkJaWYocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfUkVBRCkKCQkJcGFyYW1ldGVyX3ZhbHVlID0gcmRfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSk7Cgl9CgoJaWYoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WKQoJewoJCWNoYXIgKnByZV9lbnZfbmFtZSA9ICJkZHJfdGVzdF9kYXRhX251bSI7CgkJY2hhciAqZW52X25hbWUgPSAiZGRyX3Rlc3RfZGF0YV9udW1fMDAwMCI7CgkJY2hhciAqc3RyX2J1ZiA9IE5VTEw7CgkJY2hhciAqdGVtcF9zID0gTlVMTDsKCQljaGFyICplbmRwID0gTlVMTDsKCQljaGFyIGJ1ZlsxMDI0XTsKCQlzdHJfYnVmID0gKGNoYXIgKikoJmJ1Zik7CgkJbWVtc2V0KHN0cl9idWYsIDAsIHNpemVvZihidWYpKTsKCQlzcHJpbnRmKGVudl9uYW1lLCIlc18lMDRkIixwcmVfZW52X25hbWUscGFyYW1ldGVyX2luZGV4KTsKCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIHBhcmFtZXRlcl92YWx1ZSk7CgoJCWlmKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCXsgCgkJCXNldGVudihlbnZfbmFtZSwgYnVmKTsKCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCX0KCQlpZihyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCXsgCgkJCXRlbXBfcyA9IGdldGVudihlbnZfbmFtZSk7CgkJCWlmKHRlbXBfcykKCQkJCXBhcmFtZXRlcl92YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCWVsc2UKCQkJCXBhcmFtZXRlcl92YWx1ZSA9IDA7CgkJfQoJfQoKCWlmKHNvdXJjZV9pbmRleCA9PSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1kpCgl7CgkJc3RpY2t5X3JlZ19iYXNlX2FkZD0oUFJFR19TVElDS1lfUkVHMCk7CgoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9XUklURSkKCQkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhwYXJhbWV0ZXJfaW5kZXg8PDIpKSwgcGFyYW1ldGVyX3ZhbHVlKTsKCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfUkVBRCkKCQkJcGFyYW1ldGVyX3ZhbHVlPXJkX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSkpOwoJfQoJcmV0dXJuIHBhcmFtZXRlcl92YWx1ZTsKfQoKCnVuc2lnbmVkIGludCAgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKHVuc2lnbmVkIGludCBzb3VyY2VfaW5kZXgsIHVuc2lnbmVkIGludCBwYXJhbWV0ZXJfaW5kZXggLHVuc2lnbmVkIGludCBwYXJhbWV0ZXJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSkKCXsKCQlzdGlja3lfcmVnX2Jhc2VfYWRkID0gUFJFR19TVElDS1lfUkVHMDsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpLCBwYXJhbWV0ZXJfdmFsdWUpOwoJCWlmIChyZWFkX3dyaXRlX2ZsYWcgPT0gRERSX1BBUkFNRVRFUl9SRUFEKQoJCQlwYXJhbWV0ZXJfdmFsdWUgPSByZF9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrKHBhcmFtZXRlcl9pbmRleDw8MikpKTsKCX0KCglpZiAoc291cmNlX2luZGV4ID09IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSkKCXsKCQlzdGlja3lfcmVnX2Jhc2VfYWRkID0gKEREUjBfUFVCX1JFR19CQVNFJjB4ZmZmZjAwMDApKygoRE1DX1NUSUNLWV8wKSYweGZmZmYpOwoKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IEREUl9QQVJBTUVURVJfV1JJVEUpCgkJCXdyX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSksIHBhcmFtZXRlcl92YWx1ZSk7CgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JFQUQpCgkJCXBhcmFtZXRlcl92YWx1ZSA9IHJkX3JlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsocGFyYW1ldGVyX2luZGV4PDwyKSkpOwoJfQoKCWlmIChzb3VyY2VfaW5kZXggPT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9VQk9PVF9FTlYpCgl7CgkJY2hhciAqcHJlX2Vudl9uYW1lID0gImRkcl90ZXN0X2RhdGFfbnVtIjsKCQljaGFyICplbnZfbmFtZSA9ICJkZHJfdGVzdF9kYXRhX251bV8wMDAwIjsKCQljaGFyICpzdHJfYnVmID0gTlVMTDsKCQljaGFyICp0ZW1wX3MgPSBOVUxMOwoJCWNoYXIgKmVuZHAgPSBOVUxMOwoJCWNoYXIgYnVmWzEwMjRdOwoJCXN0cl9idWYgPSAoY2hhciAqKSgmYnVmKTsKCQltZW1zZXQoc3RyX2J1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJCXNwcmludGYoZW52X25hbWUsIiVzXyUwNGQiLHByZV9lbnZfbmFtZSxwYXJhbWV0ZXJfaW5kZXgpOwoJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgcGFyYW1ldGVyX3ZhbHVlKTsKCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1dSSVRFKQoJCXsKCQkJc2V0ZW52KGVudl9uYW1lLCBidWYpOwoJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJfQoJCWlmKHJlYWRfd3JpdGVfZmxhZyA9PSBERFJfUEFSQU1FVEVSX1JFQUQpCgkJeyAKCQkJdGVtcF9zID0gZ2V0ZW52KGVudl9uYW1lKTsKCQkJaWYodGVtcF9zKQoJCQkJcGFyYW1ldGVyX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJZWxzZQoJCQkJcGFyYW1ldGVyX3ZhbHVlID0gMDsKCQl9Cgl9CgoJcmV0dXJuIHBhcmFtZXRlcl92YWx1ZTsKfQoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19pbml0KHVpbnQzMl90IG1zZWMpCnsKCgkvLyBzcmM6IDI0TUh6CgkvLyBkaXY6IDI0MDAwIGZvciAxbXMKCS8vIHJlc2V0IGFvLTIyIGFuZCBlZS0yMQoJLy8Jd3JpdGVsKCAoMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMC0xKSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwojaWYgKENPTkZJR19ERFJfUEhZID4gUF9ERFJfUEhZX0RFRkFVTFQpCgkqUF9XQVRDSERPR19DTlRMID0gKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSk7CgoJLy8gc2V0IHRpbWVvdXQKCS8vKlBfV0FUQ0hET0dfVENOVCA9IG1zZWM7CgkvLwl3cml0ZWwobXNlYywodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOyAvL2JpdDAtMTUKCSpQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy93cml0ZWwoMCwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX1JFU0VUKTsKCSpQX1dBVENIRE9HX1JFU0VUID0gMDsKCS8vKlBfV0FUQ0hET0dfUkVTRVQgPSAwOwoKCS8vIGVuYWJsZQoJKlBfV0FUQ0hET0dfQ05UTCA9ICgqUF9XQVRDSERPR19DTlRMKXwoMTw8MTgpOwoJLy93cml0ZWwoKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpfCgxPDwxOCksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCS8vKlBfV0FUQ0hET0dfQ05UTCB8PSAoMTw8MTgpOwojZWxzZQoJKlBfV0FUQ0hET0dfQ05UTCA9ICgwPDwyNCl8KG1zZWMqOC0xKTsKCS8vKlBfV0FUQ0hET0dfVENOVD1tc2VjOwojZW5kaWYKfQoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodWludDMyX3Qgc2VjKQp7CgoJLy8gc3JjOiAyNE1IegoJLy8gZGl2OiAyNDAwMCBmb3IgMW1zCgkvLyByZXNldCBhby0yMiBhbmQgZWUtMjEKCS8vCXdyaXRlbCggKDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAtMSksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKI2lmIChDT05GSUdfRERSX1BIWSA+IFBfRERSX1BIWV9ERUZBVUxUKQoJKlBfV0FUQ0hET0dfQ05UTD0oMTw8MjQpfCgxPDwyNSl8KDE8PDIzKXwoMTw8MjEpfCgyNDAwMDAtMSk7IC8vMTBtcwoJLy8gc2V0IHRpbWVvdXQKCS8vKlBfV0FUQ0hET0dfVENOVCA9IG1zZWM7CgkvLwl3cml0ZWwobXNlYywodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOyAvL2JpdDAtMTUKCWlmKHNlYyoxMDA+MHhmZmZmKQoJCSpQX1dBVENIRE9HX1RDTlQ9MHhmZmZmOwoJZWxzZQoJCSpQX1dBVENIRE9HX1RDTlQ9c2VjKjEwMDsgIC8vbWF4IDY1NXMKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVD0wOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkqUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKXwoMTw8MTgpOwoJLy93cml0ZWwoKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpfCgxPDwxOCksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCS8vKlBfV0FUQ0hET0dfQ05UTCB8PSAoMTw8MTgpOwojZWxzZQoJLy8qUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDE5KXwoc2VjKjgwMDAtMSk7CgkqUF9XQVRDSERPR19DTlRMPSgxPDwyNCl8KDE8PDE5KXwoMHhmZmZmKTsKCXByaW50ZigiXG5tOGJhYnlfd2F0Y2hkb2cgbWF4IG9ubHkgNXMscGxlYXNlIHRha2UgY2FyZSB0ZXN0IHNpemUgbm90IHRvbyBsb25nIGZvciBtOGJhYnlcbiIpOwojZW5kaWYKCXByaW50ZigiXG5QX1dBVENIRE9HX0VOQUJMRVxuIik7Cn0KCnZvaWQgZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSh2b2lkICkKewoKCS8vIHNyYzogMjRNSHoKCS8vIGRpdjogMjQwMDAgZm9yIDFtcwoJLy8gcmVzZXQgYW8tMjIgYW5kIGVlLTIxCgkvLwl3cml0ZWwoICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCSpQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAwLTEpOyAvLzEwbXMKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CgkvLypQX1dBVENIRE9HX1RDTlQ9c2VjKjEwMDsKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVD0wOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkqUF9XQVRDSERPR19DTlRMPSgqUF9XQVRDSERPR19DTlRMKSYofigxPDwxOCkpOwoJLy93cml0ZWwoKHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpfCgxPDwxOCksKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCS8vKlBfV0FUQ0hET0dfQ05UTCB8PSAoMTw8MTgpOwojZWxzZQoJKlBfV0FUQ0hET0dfQ05UTD0oMDw8MjQpfCgwPDwxOSl8KDI0MDAwLTEpOwojZW5kaWYKCXByaW50ZigiXG5QX1dBVENIRE9HX0RJU0FCTEVcbiIpOwp9CgoKdm9pZCBkZHJfdGVzdF93YXRjaGRvZ19jbGVhcih2b2lkICkKewoKCS8vIHNyYzogMjRNSHoKCS8vIGRpdjogMjQwMDAgZm9yIDFtcwoJLy8gcmVzZXQgYW8tMjIgYW5kIGVlLTIxCgkvLwl3cml0ZWwoICgxPDwyNCl8KDE8PDI1KXwoMTw8MjMpfCgxPDwyMSl8KDI0MDAwLTEpLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCk7CgkvLypQX1dBVENIRE9HX0NOVEw9KDE8PDI0KXwoMTw8MjUpfCgxPDwyMyl8KDE8PDIxKXwoMjQwMDAwLTEpOyAvLzEwbXMKCS8vIHNldCB0aW1lb3V0CgkvLypQX1dBVENIRE9HX1RDTlQgPSBtc2VjOwoJLy8Jd3JpdGVsKG1zZWMsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsgLy9iaXQwLTE1CgkvLypQX1dBVENIRE9HX1RDTlQ9c2VjKjEwMDsKCS8vd3JpdGVsKDAsKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19SRVNFVCk7CgkqUF9XQVRDSERPR19SRVNFVD0wOwoJLy8qUF9XQVRDSERPR19SRVNFVCA9IDA7CgoJLy8gZW5hYmxlCgkvLypQX1dBVENIRE9HX0NOVEw9KCpQX1dBVENIRE9HX0NOVEwpJih+KDE8PDE4KSk7CgkvL3dyaXRlbCgocmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSl8KDE8PDE4KSwodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJLy8qUF9XQVRDSERPR19DTlRMIHw9ICgxPDwxOCk7CgkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NMRUFSLHJlZz0weCU4eFxuIiwoUF9XQVRDSERPR19SRVNFVCkpOwp9Cgp2b2lkIGRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSh2b2lkKQp7CgkvLyNkZWZpbmUgUF9XQVRDSERPR19DTlRMICAgICAgICAgICAgICAweGMxMTA5OGQwCgkvLyNkZWZpbmUgUF9XQVRDSERPR19DTlRMMSAgICAgICAgICAgIDB4YzExMDk4ZDQKCS8vI2RlZmluZSBQX1dBVENIRE9HX1RDTlQgICAgICAgICAgICAgMHhjMTEwOThkOAoJLy8jZGVmaW5lIFBfV0FUQ0hET0dfUkVTRVQgICAgICAgICAgICAweGMxMTA5OGRjCiNpZiAoQ09ORklHX0REUl9QSFkgPiBQX0REUl9QSFlfREVGQVVMVCkKCWludCBpOwoKCXdoaWxlICgxKSB7CgkJLyoKCQkgICB3cml0ZWwoCTB4Mwl8ICgxIDw8IDIxKSAvLyBzeXMgcmVzZXQgZW4gIGFvIGVlIDMKCQkgICB8ICgxIDw8IDIzKSAvLyBpbnRlcnJ1cHQgZW4KCQkgICB8ICgxIDw8IDI0KSAvLyBjbGsgZW4KCQkgICB8ICgxIDw8IDI1KSAvLyBjbGsgZGl2IGVuCgkJICAgfCAoMSA8PCAyNikgLy8gc3lzIHJlc2V0IG5vdyAgYW8gZWUgMwoJCSAgICwgKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKTsKCQkgICAqLwoJCSpQX1dBVENIRE9HX0NOVEw9CgkJCTB4Mwl8ICgxIDw8IDIxKSAvLyBzeXMgcmVzZXQgZW4gIGFvIGVlIDMKCQkJfCAoMSA8PCAyMykgLy8gaW50ZXJydXB0IGVuCgkJCXwgKDEgPDwgMjQpIC8vIGNsayBlbgoJCQl8ICgxIDw8IDI1KSAvLyBjbGsgZGl2IGVuCgkJCXwgKDEgPDwgMjYpOyAvLyBzeXMgcmVzZXQgbm93ICBhbyBlZSAzOwoJCS8vcHJpbnRmKCJcblBfV0FUQ0hET0dfQ05UTCByZWdfYWRkXyV4MDg9PSV4MDgiLCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCxyZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpKTsKCQkvL3ByaW50ZigiXG5QX1dBVENIRE9HX0NOVEw9PSV4MDgiLHJlYWRsKCh1bnNpZ25lZCBpbnQgKVBfV0FUQ0hET0dfQ05UTCkpOwoJCS8vcHJpbnRmKCJcblBfV0FUQ0hET0dfQ05UTD09JXgwOCIscmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSk7CgkJcHJpbnRmKCJcblBfV0FUQ0hET0dfQ05UTFJFR19BREQgJXgwOD09JXgwOCIsKHVuc2lnbmVkIGludCkodW5zaWduZWQgbG9uZylQX1dBVENIRE9HX0NOVEwsCgkJCQkqUF9XQVRDSERPR19DTlRMKTsKCQkvL3dyaXRlbCgwLCAodW5zaWduZWQgaW50IClQX1dBVENIRE9HX1JFU0VUKTsKCQkqUF9XQVRDSERPR19SRVNFVD0wOwoKCQkvLwl3cml0ZWwocmVhZGwoKHVuc2lnbmVkIGludCApUF9XQVRDSERPR19DTlRMKSB8ICgxPDwxOCksIC8vIHdhdGNoZG9nIGVuCgkJLy8odW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOwoJCSpQX1dBVENIRE9HX0NOVEw9KCpQX1dBVENIRE9HX0NOVEwpfCgxPDwxOCk7CgkJZm9yIChpPTA7IGk8MTAwOyBpKyspCgkJCSpQX1dBVENIRE9HX0NOVEw7CgkJLy9yZWFkbCgodW5zaWduZWQgaW50IClQX1dBVENIRE9HX0NOVEwpOy8qRGVjZWl2ZSBnY2MgZm9yIHdhaXRpbmcgc29tZSBjeWNsZXMgKi8KCX0KCiNlbHNlCgkvL1dSSVRFX0NCVVNfUkVHKFdBVENIRE9HX1RDLCAweGYwODAwMDAgfCAyMDAwKTsKCSpQX1dBVENIRE9HX0NOVEw9KDB4ZjA4MDAwMCB8IDIwMDApOwojZW5kaWYKCXdoaWxlKDEpOwp9CgoKLy9qdXN0IHR1bmUgZm9yIGxjZGxyCgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQojZWxzZQppbnQgZG9fZGRyX2ZpbmVfdHVuZV9sY2Rscl9lbnYxKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIGRkcl9maW5lX3R1bmVfbGNkbHJfZW52ICBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaSA9IDA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IoaSA9IDA7IGk8YXJnYzsgaSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CgoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7CgojZGVmaW5lIFdSX1JEX0FESl9VU0VfRU5WICAxCiNkZWZpbmUgV1JfUkRfQURKX1VTRV9VQVJUX0lOUFVUIDIKCXVuc2lnbmVkIGludCAgIHdyX3JkX2Fkal9pbnB1dF9zcmM9MTsKCWludCB3cl9hZGpfcGVyWzEyXT17CgkJMTAwCSwKCQkxMDAwLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgl9OwoJaW50IHJkX2Fkal9wZXJbMTJdPXsKCQkxMDAJLAoJCTEwMAksCgkJODAJLAoJCTgwCSwKCQk4MAksCgkJODAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJfTsKCWlmKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJaWYoYXJnYyA+PSAyKQoJewoJCXdyX3JkX2Fkal9pbnB1dF9zcmMgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CgoJCXVuc2lnbmVkIGludCBpPTA7IAkKCQlpZih3cl9yZF9hZGpfaW5wdXRfc3JjPT1XUl9SRF9BREpfVVNFX1VBUlRfSU5QVVQpCgkJewoJCQlwcmludGYoIlxudHVuZSBkZHIgbGNkbHIgdXNlIHVhcnQgaW5wdXRcbiIpOwoJCQlpZiAoYXJnYz4yNCsyKQoJCQkJYXJnYz0yNCsyOwoKCQkJZm9yKGkgPSAyO2k8YXJnYztpKyspCgkJCXsKCQkJCWlmKGk8KDIrMTIpKQoJCQkJCXdyX2Fkal9wZXJbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxMCk7CgkJCQllbHNlCgkJCQkJcmRfYWRqX3BlcltpLTE0XT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAxMCk7CgkJCX0KCQl9CgoJCS8vIHVuc2lnbmVkIGludCA9IDAsIG1heCA9IDB4ZmYsIG1pbiA9IDB4MDA7CgkJaWYod3JfcmRfYWRqX2lucHV0X3NyYz09V1JfUkRfQURKX1VTRV9FTlYpCgkJewoJCQlwcmludGYoIlxudHVuZSBkZHIgbGNkbHIgdXNlIHVib290IGVudlxuIik7CgkJCS8vY2hhciBzdHJbMjRdOwoJCQljb25zdCBjaGFyICpzOwoKCQkJLy8gY2hhciAqdmFybmFtZTsKCQkJaW50IHZhbHVlPTA7CgoJCQkvLyp2YXJuYW1lPSJlbnZfZGRydGVzdCI7CgkJCXMgPSBnZXRlbnYoImVudl93cl9sY2Rscl9wciIpOwoJCQlpZiAocykKCQkJey8vaT0wOwoJCQkJLy93aGlsZShzX3RlbXApCgkJCQl7CgkJCQkJcHJpbnRmKCIlcyIscyk7CgkJCQkJLy9zc2NhbmYocywiZCUsIix3cl9hZGpfcGVyKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkJSIscyk7CgkJCQkJLy9nZXRjCgkJCQl9CgkJCQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocywgJmVuZHAsIDE2KTsKCQkJCXByaW50ZigiJWQiLHZhbHVlKTsKCQkJfQoJCQlzID0gZ2V0ZW52KCJlbnZfcmRfbGNkbHJfcHIiKTsKCgkJCWlmIChzKQoJCQl7Ly9pPTA7CgkJCQkvL3doaWxlKHNfdGVtcCkKCQkJCXsKCQkJCQlwcmludGYoIiVzIixzKTsKCQkJCQkvL3NzY2FuZihzLCJkJSwiLHJkX2Fkal9wZXIpOwoKCQkJCX0KCQkJCS8vdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHMsICZlbmRwLCAxNik7CgkJCX0KCgkJCS8vc3ByaW50ZihzdHIsICIlbHgiLCB2YWx1ZSk7CgkJCS8vICBzZXRlbnYoImVudl9kZHJ0ZXN0Iiwgc3RyKTsKCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJCQlpZiAoYXJnYz4yNCsyKQoJCQkJYXJnYz0yNCsyOwoJCQlmb3IoaSA9IDI7aTxhcmdjO2krKykKCQkJewoJCQkJaWYoaTwoMisxMikpCgkJCQkJd3JfYWRqX3BlcltpLTJdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDE2KTsKCQkJCWVsc2UKCQkJCQlyZF9hZGpfcGVyW2ktMTRdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDE2KTsKCQkJfQoJCX0KCQlwcmludGYoIiBpbnQgd3JfYWRqX3BlclsxMl09e1xuIik7CgkJZm9yKGkgPSAwO2k8MTI7aSsrKQoJCQlwcmludGYoIiUwNGQgLFxuIix3cl9hZGpfcGVyW2ldKTsKCQlwcmludGYoIn07XG4iKTsKCQlwcmludGYoIiBpbnQgcmRfYWRqX3BlclsxMl09e1xuIik7CgkJZm9yKGkgPSAwO2k8MTI7aSsrKQoJCQlwcmludGYoIiUwNGQgLFxuIixyZF9hZGpfcGVyW2ldKTsKCQlwcmludGYoIn07XG4iKTsKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJCXdyX3JlZyhERFIwX1BVQl9QSVIsIChyZF9yZWcoRERSMF9QVUJfUElSKSl8KDE8PDI5KSk7CgkJd3JfcmVnKEREUjBfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjBfUFVCX1BHQ1I2KSl8KDE8PDApKTsKCQl3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpfCgxPDwyOSkpOwoJCXdyX3JlZyhERFIxX1BVQl9QR0NSNiwgKHJkX3JlZyhERFIxX1BVQl9QR0NSNikpfCgxPDwwKSk7CiNlbHNlCgkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQl3cl9yZWcoRERSMF9QVUJfUEdDUjEsIChyZF9yZWcoRERSMF9QVUJfUEdDUjEpKXwoMTw8MjYpKTsKCQl3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpfCgxPDwyOSkpOwoJCXdyX3JlZyhERFIxX1BVQl9QR0NSMSwgKHJkX3JlZyhERFIxX1BVQl9QR0NSMSkpfCgxPDwyNikpOwojZW5kaWYKCgkJaW50IGxjZGxyX3c9MCxsY2Rscl9yPTA7CgkJdW5zaWduZWQgdGVtcF9yZWc9MDsKCQlpbnQgdGVtcF9jb3VudD0wOwoJCWZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8Mjt0ZW1wX2NvdW50KyspCgkJeyAgICAgdGVtcF9yZWc9KHVuc2lnbmVkKShERFIwX1BVQl9BQ0xDRExSKyh0ZW1wX2NvdW50PDwyKSk7CgkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkFDTENETFJfTUFYKTsKCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJaWYodGVtcF9jb3VudD09MSkKCQkJCWxjZGxyX3c9bGNkbHJfdyZBQ0JETFJfTUFYOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKGxjZGxyX3cpJkFDTENETFJfTUFYKSk7CgkJfQojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQlmb3IoIHRlbXBfY291bnQ9Mjt0ZW1wX2NvdW50PDY7dGVtcF9jb3VudCsrKQoJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfRFgwTENETFIxKyhERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkRRTENETFJfTUFYKTsKCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjEpKSkpJkRRTENETFJfTUFYKTsKCQkJbGNkbHJfcj1sY2Rscl9yP2xjZGxyX3I6MTsKCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKGxjZGxyX3cpKTsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjEpKSwobGNkbHJfcikpOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJfQojZWxzZQoJCWZvciAoIHRlbXBfY291bnQ9Mjt0ZW1wX2NvdW50PDY7dGVtcF9jb3VudCsrKSB7CgkJCXRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfRFgwTENETFIxKyhERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkRRTENETFJfTUFYKTsKCQkJbGNkbHJfdz1sY2Rscl93P2xjZGxyX3c6MTsKCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpPj44KSZEUUxDRExSX01BWCk7CgkJCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CgkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCWxjZGxyX3I9KGxjZGxyX3IqKHJkX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgoKGxjZGxyX3I8PDE2KXwobGNkbHJfcjw8OCl8KGxjZGxyX3cpKSkpOwoJCX0KI2VuZGlmCgkJZm9yKCB0ZW1wX2NvdW50PTY7dGVtcF9jb3VudDw4O3RlbXBfY291bnQrKykgewoJCQl0ZW1wX3JlZz0odW5zaWduZWQpKEREUjFfUFVCX0FDTENETFIrKCh0ZW1wX2NvdW50LTYpPDwyKSk7CgoJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZBQ0xDRExSX01BWCk7CgkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCWlmKHRlbXBfY291bnQ9PTcpCgkJCQlsY2Rscl93PWxjZGxyX3cmQUNCRExSX01BWDsKCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKChsY2Rscl93KSZBQ0xDRExSX01BWCkpOwoJCX0KI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJZm9yKCB0ZW1wX2NvdW50PTg7dGVtcF9jb3VudDwxMjt0ZW1wX2NvdW50KyspIHsKCQkJdGVtcF9yZWc9KHVuc2lnbmVkKShERFIxX1BVQl9EWDBMQ0RMUjErKEREUjFfUFVCX0RYMUxDRExSMS1ERFIxX1BVQl9EWDBMQ0RMUjEpKih0ZW1wX2NvdW50LTIpKTsKCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmRFFMQ0RMUl9NQVgpOwoJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQlsY2Rscl9yPShpbnQpKCgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFIzLUREUjFfUFVCX0RYMExDRExSMSkpKSkmRFFMQ0RMUl9NQVgpOwoJCQlsY2Rscl9yPWxjZGxyX3I/bGNkbHJfcjoxOwoJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQlsY2Rscl9yPShsY2Rscl9yKihyZF9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwobGNkbHJfdykpOwoJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFIzLUREUjFfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZytERFIxX1BVQl9EWDBMQ0RMUjQtRERSMV9QVUJfRFgwTENETFIxKSksKGxjZGxyX3IpKTsKCQl9CiNlbHNlCgkJZm9yKCB0ZW1wX2NvdW50PTg7dGVtcF9jb3VudDwxMjt0ZW1wX2NvdW50KyspIHsKCQkJdGVtcF9yZWc9KHVuc2lnbmVkKShERFIxX1BVQl9EWDBMQ0RMUjErKEREUjFfUFVCX0RYMUxDRExSMS1ERFIxX1BVQl9EWDBMQ0RMUjEpKih0ZW1wX2NvdW50LTgpKTsKCQkJbGNkbHJfdz0oaW50KSgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSkmMHhmZik7CgkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCWxjZGxyX3I9KGludCkoKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKT4+OCkmMHhmZik7CgkJCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CgkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCWxjZGxyX3I9KGxjZGxyX3IqKHJkX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgoKGxjZGxyX3I8PDE2KXwobGNkbHJfcjw8OCl8KGxjZGxyX3cpKSkpOwoJCX0KI2VuZGlmCQoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJd3JfcmVnKEREUjBfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjBfUFVCX1BHQ1I2KSkmKH4oMTw8MCkpKTsKCQl3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpJih+KDE8PDI5KSkpOwoKCQl3cl9yZWcoRERSMV9QVUJfUEdDUjYsIChyZF9yZWcoRERSMV9QVUJfUEdDUjYpKSYofigxPDwwKSkpOwoJCXdyX3JlZyhERFIxX1BVQl9QSVIsIChyZF9yZWcoRERSMV9QVUJfUElSKSkmKH4oMTw8MjkpKSk7CiNlbHNlCgkJd3JfcmVnKEREUjBfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjBfUFVCX1BHQ1IxKSkmKH4oMTw8MjYpKSk7CgkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKCgkJd3JfcmVnKEREUjFfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjFfUFVCX1BHQ1IxKSkmKH4oMTw8MjYpKSk7CgkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKI2VuZGlmCgkJcHJpbnRmKCJcbmVuZCBhZGp1c3QgbGNkbHJcbiIpOwoKCQlDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpOwoJCUNMT1NFX0NIQU5ORUxfQl9QSFlfQ0xLKCk7Cgl9CgoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl90ZXN0X3R1bmVfZHFzX2VudiwJMzAsCTEsCWRvX2Rkcl9maW5lX3R1bmVfbGNkbHJfZW52MSwKCSJkb19kZHJfZmluZV90dW5lX2xjZGxyX2VudiBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZG9fZGRyX2ZpbmVfdHVuZV9sY2Rscl9lbnYgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIiAKKTsKCiNlbmRpZgovLyovCnN0YXRpYyB2b2lkIGRkcl93cml0ZSh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCXVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJZm9yIChqPTA7ajwzMjtqKyspCgkJewoKCQkJaWYgKG1fbGVuID49IDEyOCkKCQkJCW4gPSAzMjsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDMxOgoJCQkJCQkqKHAraSkgPSBUREFUQTMyQTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyNDoKCQkJCQkJKihwK2kpID0gVERBVEEzMjU7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDI3OgoJCQkJCWNhc2UgMjk6CgkJCQkJCSoocCtpKSA9IDE8PGo7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSAxMToKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjg6CgkJCQkJCSoocCtpKSA9IH4oMTw8aik7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWQodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCWZvciAoaj0wO2o8MzI7aisrKQoJCXsKCgkJCWlmIChtX2xlbiA+PSAxMjgpCgkJCQluID0gMzI7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCWlmICgoZXJyb3Jfb3V0b2ZfY291bnRfZmxhZykgJiYgKGVycm9yX2NvdW50KSkKCQkJCXsKCQkJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCQkJbV9sZW49MDsKCQkJCQlicmVhazsKCQkJCX0KCQkJCXN3aXRjaCAoaSkKCQkJCXsKCgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAzMDoKCQkJCQkJaWYgKCoocCtpKSAhPSBUREFUQTMyRikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDIyOgoJCQkJCQlpZiAoKihwK2kpICE9IDApIHtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMCk7CgkJCQkJCX1icmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAzMToKCQkJCQkJaWYgKCoocCtpKSAhPSBUREFUQTMyQSkge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyQSk7CgkJCQkJCX0gYnJlYWs7CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyNDoKCQkJCQkJaWYgKCoocCtpKSAhPSBUREFUQTMyNSkge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyNSk7CgkJCQkJCX0gYnJlYWs7CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjc6CgkJCQkJY2FzZSAyOToKCQkJCQkJaWYgKCoocCtpKSAhPSAxPDxqKSB7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDE8PGopOwoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgMzoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSAxMToKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDI2OgoJCQkJCWNhc2UgMjg6CgkJCQkJCWlmICgqKHAraSkgIT0gfigxPDxqKSkge2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+KDE8PGopKTsKCQkJCQkJfSBicmVhazsKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KQoJCQl7CgkJCQltX2xlbiAtPSAxMjg7CgkJCQlwICs9IDMyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCgpzdGF0aWMgdm9pZCBkZHJfd3JpdGU0KHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQlmb3IgKGo9MDtqPDMyO2orKykKCQl7CgoJCQlpZiAobV9sZW4gPj0gMTI4KQoJCQkJbiA9IDMyOwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoKCQkJCQkJKihwK2kpID0gMHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoKCQkJCQkJKihwK2kpID0gfjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCQkqKHAraSkgPSAweGFhNTVhYTU1OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCQkqKHAraSkgPSB+MHhhYTU1YWE1NTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCgkJCQkJCSoocCtpKSA9IDE8PGo7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCSoocCtpKSA9IH4oMTw8aik7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgpCgkJCXsKCQkJCW1fbGVuIC09IDEyODsKCQkJCXAgKz0gMzI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3JlYWQ0KHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQlmb3IgKGo9MDtqPDMyO2orKykKCQl7CgoJCQlpZiAobV9sZW4gPj0gMTI4KQoJCQkJbiA9IDMyOwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCgkJCQkJCS8vICAgKihwK2kpID0gMHhmZjAwZmYwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgoJCQkJCQkvLyAgICAgICoocCtpKSA9IH4weGZmMDBmZjAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDg6CgkJCQkJY2FzZSA5OgoJCQkJCWNhc2UgMTA6CgkJCQkJY2FzZSAxMToKCQkJCQkJLy8gICAgKihwK2kpID0gMHhhYTU1YWE1NTsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGFhNTVhYTU1KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCQkvLyAgICoocCtpKSA9IH4weGFhNTVhYTU1OwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGFhNTVhYTU1KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIFREQVRBMzJGKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgMTc6CgkJCQkJY2FzZSAxODoKCQkJCQljYXNlIDE5OgoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoKCQkJCQkJLy8gICAqKHAraSkgPSAxPDxqOwoJCQkJCQlpZiAoKihwK2kpICE9ICgxPDxqKSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjA6CgkJCQkJY2FzZSAyMToKCQkJCQljYXNlIDIyOgoJCQkJCWNhc2UgMjM6CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIDI5OgoJCQkJCWNhc2UgMzA6CgkJCQkJY2FzZSAzMToKCQkJCQkJLy8gICoocCtpKSA9IH4oMTw8aik7CgkJCQkJCWlmICgqKHAraSkgIT1+KCAxPDxqKSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCBUREFUQTMyRik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+IDEyOCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4OwoJCQkJcCArPSAzMjsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZF9mdWxsKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoLHVuc2lnbmVkIGludCAgc3RhcnRfcGF0dGVybiwKCXVuc2lnbmVkIGludCAgcGF0dGVybl9vZmZzZXQpCnsKCXVuc2lnbmVkIGludCAgKnA7Cgl1bnNpZ25lZCBpbnQgIGk9MDsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aCYweGZmZmZmZmZjOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoJLy8qKHApPXN0YXJ0X3BhdHRlcm47Cgl3aGlsZSAobV9sZW4pCgl7CgkJbV9sZW49bV9sZW4tNDsKCgkJLy8JKihwK2kpID0gKCoocCkpK3BhdHRlcm5fb2Zmc2V0OwoKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCWRkcl9wbGRfY2FjaGUocCtpKSAgOwojZW5kaWYKCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJewoJCQlwcmludGYoIkVycm9yIGRhdGEgb3V0IG9mIGNvdW50Iik7CgkJCW1fbGVuPTA7CgkJCWJyZWFrOwoJCX0KCQlpZiAoKCoocCtpKSkgIT0oc3RhcnRfcGF0dGVybitwYXR0ZXJuX29mZnNldCppKSkKCQl7ZXJyb3JfY291bnQrKzsKCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgCgkJCQkJKHN0YXJ0X3BhdHRlcm4rcGF0dGVybl9vZmZzZXQqaSkpOwoJCX0KCQlicmVhazsKCgkJaSsrOwoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfd3JpdGVfZnVsbCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCx1bnNpZ25lZCBpbnQgIHN0YXJ0X3BhdHRlcm4sCgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fb2Zmc2V0KQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJdW5zaWduZWQgaW50ICBpPTA7Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGgmMHhmZmZmZmZmYzsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCS8vKihwKT1zdGFydF9wYXR0ZXJuOwoJd2hpbGUgKG1fbGVuKQoJewoJCW1fbGVuPW1fbGVuLTQ7CgkJKihwK2kpID0gc3RhcnRfcGF0dGVybitwYXR0ZXJuX29mZnNldCppOwoJCWkrKzsKCX0KfQoKLy8vKgpzdGF0aWMgdm9pZCBkZHJfdGVzdF9jb3B5KHZvaWQgKmFkZHJfZGVzdCx2b2lkICphZGRyX3NyYyx1bnNpZ25lZCBpbnQgbWVtY3B5X3NpemUpCnsKCXVuc2lnbmVkIGludCAgKnBfZGVzdDsKCXVuc2lnbmVkIGludCAgKnBfc3JjOwoKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtZW1jcHlfc2l6ZTsKCglwX2Rlc3QgPSAoIHVuc2lnbmVkIGludCAgKilhZGRyX2Rlc3Q7CglwX3NyYyA9ICggdW5zaWduZWQgaW50ICAqKWFkZHJfc3JjOwoJbV9sZW4gPSBtX2xlbi80OyAvL2Fzc3VtZSBpdCdzIG11bHRpcGxlIG9mIDQKCXdoaWxlIChtX2xlbi0tKSB7CgkJZGRyX3BsZF9jYWNoZShwX3NyYykgIDsvLyNkZWZpbmUgZGRyX3BsZF9jYWNoZShQKSAgIGFzbSAoInByZm0gUExETDFLRUVQLCBbJTAsICMzNzZdIjo6InIiIChQKSkKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCQkqcF9kZXN0KysgPSAqcF9zcmMrKzsKCX0KfQovLyovCmludCBkb19kZHJfdGVzdF9jb3B5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGxvbmcgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIHByaW50X2ZsYWcgPTE7CgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICBzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgIGRlY19hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUisweDgwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoKCXByaW50X2ZsYWc9MTsKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJLy8gICAgcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCWlmIChhcmdjID09MSkgewoJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJLy8gICAgaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlzcmNfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgkJbG9vcCA9IDE7Cgl9CglpZiAoYXJnYyA+IDIpIHsKCQkvLyAgICBzdGFydF9hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXNyY19hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCX0KCWlmIChhcmdjID4gMykgewoJCXNyY19hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCWRlY19hZGRyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCXRlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlsb29wID0gMTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoKCX0KCWlmICh0ZXN0X3NpemU8MHgxMDAwKQoJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CglpZiAoYXJnYyA+IDQpIHsKCQlsb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWxvb3AgPSAxOwoJfQoJaWYgKGFyZ2MgPiA1KSB7CgkJcHJpbnRfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlwcmludF9mbGFnID0gMTsKCX0KCS8vQ09QWV9URVNUX1NUQVJUOgoKCS8vLyoKCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFydCwgdGltZV9lbmQsdGVzdF9sb29wczsKCXRlc3RfbG9vcHM9bG9vcDsKCXVuc2lnbmVkIGxvbmcgc2l6ZV9jb3VudD0wOwoJc2l6ZV9jb3VudD1sb29wKnRlc3Rfc2l6ZTsKCXRpbWVfc3RhcnQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCglkbyB7CgkJLy8gICAgIGxvb3AgPSAxOwoJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChkZWNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3JjX2FkZHIpKSx0ZXN0X3NpemUpOwoJCS8vYmNvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSx0ZXN0X3NpemUpOwoJCS8vbWNvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpLCh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKSx0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKQoJCXsKCQkJcHJpbnRmKCJcbmxvb3A9PTB4JTA4eCIsICggdW5zaWduZWQgaW50IClsb29wKTsKCQkJcHJpbnRmKCJcbiAgICAgIFxuIik7CgkJfQoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgl0aW1lX2VuZCA9IGdldF91c190aW1lKCk7Ly91cwoJcHJpbnRmKCJcbmNvcHkgJWQgdGltZXMgdXNlICVkdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCggdW5zaWduZWQgaW50ICl0ZXN0X2xvb3BzLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoKCXByaW50ZigiXG5kZHIgY29weSBiYW5kd2lkdGg9PSVkIE1CWVRFL1MgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwodW5zaWduZWQgaW50KShzaXplX2NvdW50Lyh0aW1lX2VuZC10aW1lX3N0YXJ0KSkpOwoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXVuc2lnbmVkIGludCBtX2xlbj0wLGNvdW50ZXI9MDsKCXVuc2lnbmVkIGludCAgKnBfZGVzdDsKCXBfZGVzdD0gICh2b2lkICopKGludF9jb252dGVyX3AoZGVjX2FkZHIpKTsKCW1fbGVuID0gdGVzdF9zaXplLzQ7IC8vYXNzdW1lIGl0J3MgbXVsdGlwbGUgb2YgNAoJY291bnRlcj0odW5zaWduZWQgaW50KXRlc3RfbG9vcHM7CglzaXplX2NvdW50PWNvdW50ZXIqdGVzdF9zaXplOwoJdGltZV9zdGFydCA9IGdldF91c190aW1lKCk7Ly91cwoJZG8gewoJCWxvb3AgPSAxOwoJCW1fbGVuID0gdGVzdF9zaXplLzQ7CgkJd2hpbGUgKG1fbGVuLS0pIHsKCQkJZGRyX3BsZF9jYWNoZShwX2Rlc3QpICA7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJCSpwX2Rlc3QrKyA9IDB4MTIzNDU2Nzg7CgkJfQoJfXdoaWxlKC0tY291bnRlcik7Cgl0aW1lX2VuZCA9IGdldF91c190aW1lKCk7Ly91cwoJcHJpbnRmKCJcbndyaXRlICVkIGJ5dGVzIHVzZSAlZHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiwoIHVuc2lnbmVkIGludCApdGVzdF9zaXplLCggdW5zaWduZWQgaW50ICkodGltZV9lbmQtdGltZV9zdGFydCkpOwoKCXByaW50ZigiXG5kZHIgd3JpdGUgYmFuZHdpZHRoPT0lZCBNQllURS9TIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKHVuc2lnbmVkIGludCkoc2l6ZV9jb3VudC8odGltZV9lbmQtdGltZV9zdGFydCkpKTsKCgl1bnNpZ25lZCBpbnQgICpwX3NyYzsKCXBfc3JjPSAgKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzcmNfYWRkcikpOwoJbV9sZW4gPSB0ZXN0X3NpemUvNDsgLy9hc3N1bWUgaXQncyBtdWx0aXBsZSBvZiA0Cgl1bnNpZ25lZCBpbnQgdGVtcDA9MDsKCS8vdW5zaWduZWQgaW50IHRlbXAxPTA7CgkvL3Vuc2lnbmVkIGludCB0ZW1wMj0wOwoJLy91bnNpZ25lZCBpbnQgdGVtcDM9MDsKCWNvdW50ZXI9KHVuc2lnbmVkIGludCl0ZXN0X2xvb3BzOwoJc2l6ZV9jb3VudD1jb3VudGVyKnRlc3Rfc2l6ZTsKCgkvLyAgI2RlZmluZSBPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCkgICAgICAod3JpdGVsKCgwKSwgMHhjODgzNmMwMCkpCgkvL3dyaXRlbCgoMTAwMDAwMDw8MCksIERNQ19NT05fQ1RSTDEpOwoJLy93cml0ZWwoKDA8PDMxKXwoMTw8MzApfCgwPDwyMCl8KDE8PDE2KXwoMTw8MCksIERNQ19NT05fQ1RSTDIpOwoJLy93cml0ZWwoKDE8PDMxKXwoMDw8MzApfCgwPDwyMCl8KDE8PDE2KXwoMTw8MCksIERNQ19NT05fQ1RSTDIpOwoJdGltZV9zdGFydCA9IGdldF91c190aW1lKCk7Ly91cwoJZG8gewoJCWxvb3AgPSAxOwoJCW1fbGVuID0gdGVzdF9zaXplLzQ7CgkJd2hpbGUgKG1fbGVuLS0pIHsKCQkJLy8gIGRkcl9wbGRfY2FjaGUocF9zcmMrKykgIDsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInByZm0gUExETDFLRUVQLCBbJTAsICMzNzZdIjo6InIiIChwX3NyYykpOwojZW5kaWYKCQkJcF9zcmMrKzsKCQkJdGVtcDAgPSggKnBfc3JjKTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQkJbV9sZW4tLTsKCQl9Cgl9d2hpbGUoLS1jb3VudGVyKTsKCSpwX2Rlc3QrKyA9IHRlbXAwOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJKnBfZGVzdCsrID0gKnBfc3JjOwoJdGltZV9lbmQgPSBnZXRfdXNfdGltZSgpOy8vdXMKCglwcmludGYoIlxucmVhZCAlZCBLYnl0ZXMgdXNlICVkdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iLCh1bnNpZ25lZCBpbnQpKHNpemVfY291bnQvMTAwMCksKCB1bnNpZ25lZCBpbnQgKSh0aW1lX2VuZC10aW1lX3N0YXJ0KSk7CglwcmludGYoIlxuZGRyIHJlYWQgYmFuZHdpZHRoPT0lZCBNQllURS9TIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIsKHVuc2lnbmVkIGludCkoc2l6ZV9jb3VudC8odGltZV9lbmQtdGltZV9zdGFydCkpKTsKCglyZXR1cm4gMDsKfQoKVV9CT09UX0NNRCgKCWRkcl90ZXN0X2NvcHksCTcsCTEsCWRvX2Rkcl90ZXN0X2NvcHksCgkiZGRyX3Rlc3RfY29weSBmdW5jdGlvbiIsCgkiZGRyX3Rlc3RfY29weSAgMHgwODAwMDAwMCAweDEwMDAwMDAwIDB4MDIwMDAwMDAgMSAwID8gXG4iCik7CgovLy8qCiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8xIDMyCiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8yIDY0CiNkZWZpbmUgRERSX1BBVFRFUk5fTE9PUF8zIDk2Ci8qCl9fYXNtCnsKLkdsb2JhbCBtZW1jcHlfcGxkCi50eXBlIG1lbWNweV9wbGQgLCVmdW5jdGlvbgouYWxpZ24gOAptZW1jcHlfcGxkOgptb3YgeDQseDAKc3VicyB4Mix4MiwjOApiLm1pIDJmCjE6IGxkciB4MyxbeDFdLCM4CglzdWJzIHgyLHgyLCM4CglzdHIgeDMsW3g0XSwjOAoJcHJmbSBQTERMMUtFRVAsW3gxLCMzNzZdCgliLnBsICAxYgoKMjogYWRkcyB4Mix4MiwjNAoJYi5taSAzZgoJbGRyIHczLFt4MV0sIzQKCXN1YiB4Mix4MiwjNAoJc3RyIHczLFt4NF0sIzQKCjM6IGFkZHMgeDIseDIsIzIKCWIubWkgNGYKCWxkciB3MyxbeDFdLCMyCglzdWIgeDIseDIsIzQKCXN0ciB3MyxbeDRdLCM0Cgo0OiBhZGRzIHgyLHgyLCMxCgliLm1pIDVmCglsZHIgdzMsW3gxXSwjMgoJc3ViIHgyLHgyLCM0CglzdHIgdzMsW3g0XSwjNAoKNTogcmV0Cn0KKi8KLy9zdGF0aWMgdm9pZCBkZHJfbWVtY3B5X3BsZCh2b2lkICphZGRyX2Rlc3QsICB2b2lkICphZGRyX3NyYywgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKLy97Ci8qCmFzbQp7Ci8vLkdsb2JhbCBtZW1jcHlfcGxkCi50eXBlIG1lbWNweV9wbGQgLCVmdW5jdGlvbgouYWxpZ24gOAptZW1jcHlfcGxkOgptb3YgeDQseDAKc3VicyB4Mix4MiwjOApiLm1pIDJmCjE6IGxkciB4MyxbeDFdLCM4CglzdWJzIHgyLHgyLCM4CglzdHIgeDMsW3g0XSwjOAoJcHJmbSBQTERMMUtFRVAsW3gxLCMzNzZdCgliLnBsICAxYgoKMjogYWRkcyB4Mix4MiwjNAoJYi5taSAzZgoJbGRyIHczLFt4MV0sIzQKCXN1YiB4Mix4MiwjNAoJc3RyIHczLFt4NF0sIzQKCjM6IGFkZHMgeDIseDIsIzIKCWIubWkgNGYKCWxkciB3MyxbeDFdLCMyCglzdWIgeDIseDIsIzQKCXN0ciB3MyxbeDRdLCM0Cgo0OiBhZGRzIHgyLHgyLCMxCgliLm1pIDVmCglsZHIgdzMsW3gxXSwjMgoJc3ViIHgyLHgyLCM0CglzdHIgdzMsW3g0XSwjNAoKNTogcmV0Cn0KbWVtY3B5X3BsZChhZGRyX2Rlc3QsYWRkcl9zcmMsbV9sZW5ndGgpOwoqLwovL30KCgoKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCgovLy8qCgppbnQgZGRyX3Rlc3RfZ3hfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKQp7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSAweDEwMDAwMDAwOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJZXJyb3JfY291bnQ9MDsKCgl1bnNpZ25lZCBpbnQgIGRlc1s4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fMVs0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fMls0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fM1s0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNFs0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNVs0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNls0XVs4XSA7CgoJZGVzWzBdID0gCTB4YWVjODNmNDk7CglkZXNbMV0gPSAgICAgIDB4ZDI0M2E2MmM7CglkZXNbMl0gPSAgICAgIDB4Zjg3NzRhMGI7CglkZXNbM10gPSAgICAgICAweDYzZDIxNGU1OwoJZGVzWzRdID0gICAgICAweDNmNDE2NmQ1OwoJZGVzWzVdID0gICAgIDB4MjM5NjcyYzA7CglkZXNbNl0gPSAgICAgIDB4NDdiYTc1MzM7CglkZXNbN10gPSAgICAgIDB4Y2FlNGNkN2Y7CglwYXR0ZXJuXzFbMF1bMF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzFdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsyXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bM10gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzRdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs1XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzddID0gMHhmZjAwZmYwMDsKCglwYXR0ZXJuXzFbMV1bMF0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzFdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVsyXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bM10gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzRdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs1XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNl0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzddID0gMHgwMGZmZmYwMDsKCglwYXR0ZXJuXzFbMl1bMF0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzFdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVsyXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bM10gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzRdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs1XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNl0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzddID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVszXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMlswXVswXSA9IDB4MDAwMWZlMDA7CglwYXR0ZXJuXzJbMF1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNF0gPSAweDAwMDJmZDAwOwoJcGF0dGVybl8yWzBdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsxXVswXSA9IDB4MDAwNGZiMDA7CglwYXR0ZXJuXzJbMV1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNF0gPSAweDAwMDhmNzAwOwoJcGF0dGVybl8yWzFdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsyXVswXSA9IDB4MDAxMGVmMDA7CglwYXR0ZXJuXzJbMl1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNF0gPSAweDAwMjBkZjAwOwoJcGF0dGVybl8yWzJdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlszXVswXSA9IDB4MDA0MGJmMDA7CglwYXR0ZXJuXzJbM11bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNF0gPSAweDAwODA3ZjAwOwoJcGF0dGVybl8yWzNdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fM1swXVswXSA9IDB4MDAwMTAwMDA7CglwYXR0ZXJuXzNbMF1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNF0gPSAweDAwMDIwMDAwOwoJcGF0dGVybl8zWzBdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1sxXVswXSA9IDB4MDAwNDAwMDA7CglwYXR0ZXJuXzNbMV1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNF0gPSAweDAwMDgwMDAwOwoJcGF0dGVybl8zWzFdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1syXVswXSA9IDB4MDAxMDAwMDA7CglwYXR0ZXJuXzNbMl1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNF0gPSAweDAwMjAwMDAwOwoJcGF0dGVybl8zWzJdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1szXVswXSA9IDB4MDA0MDAwMDA7CglwYXR0ZXJuXzNbM11bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNF0gPSAweDAwODAwMDAwOwoJcGF0dGVybl8zWzNdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bN10gPSAweDAwMDAwMDAwOwoKCS8vLyoKCXBhdHRlcm5fNFswXVswXSA9CTB4NTFjOGMwNDkJOwoJcGF0dGVybl80WzBdWzFdID0JMHgyZDQzNTkyYwk7CglwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKCXBhdHRlcm5fNFswXVszXSA9CTB4OWNkMmViZTUJOwoJcGF0dGVybl80WzBdWzRdID0JMHhjMDQxOTlkNQk7CglwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKCXBhdHRlcm5fNFswXVs2XSA9CTB4YjhiYThhMzMJOwoJcGF0dGVybl80WzBdWzddID0JMHgzNWU0MzI3Zgk7CgoJcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CglwYXR0ZXJuXzRbMV1bMV0gPQkweGQyYmM1OTJjCTsKCXBhdHRlcm5fNFsxXVsyXSA9CTB4Zjg4OGI1MGIJOwoJcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CglwYXR0ZXJuXzRbMV1bNF0gPQkweDNmYmU5OWQ1CTsKCXBhdHRlcm5fNFsxXVs1XSA9CTB4MjM2OThkYzAJOwoJcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CglwYXR0ZXJuXzRbMV1bN10gPQkweGNhMWIzMjdmCTsKCglwYXR0ZXJuXzRbMl1bMF0gPQkweDUxMzczZjQ5CTsKCXBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwoJcGF0dGVybl80WzJdWzJdID0JMHgwNzg4NGEwYgk7CglwYXR0ZXJuXzRbMl1bM10gPQkweDljMmQxNGU1CTsKCXBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwoJcGF0dGVybl80WzJdWzVdID0JMHhkYzY5NzJjMAk7CglwYXR0ZXJuXzRbMl1bNl0gPQkweGI4NDU3NTMzCTsKCXBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCglwYXR0ZXJuXzRbM11bMF0gPQkweDUxYzhjMDQ5CTsKCXBhdHRlcm5fNFszXVsxXSA9CTB4MmQ0MzU5MmMJOwoJcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CglwYXR0ZXJuXzRbM11bM10gPQkweDljZDJlYmU1CTsKCXBhdHRlcm5fNFszXVs0XSA9CTB4YzA0MTk5ZDUJOwoJcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CglwYXR0ZXJuXzRbM11bNl0gPQkweGI4YmE4YTMzCTsKCXBhdHRlcm5fNFszXVs3XSA9CTB4MzVlNDMyN2YJOwoKCXBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwoJcGF0dGVybl81WzBdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbMF1bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzBdWzRdID0JMHgzZjQzOWJkNQk7CglwYXR0ZXJuXzVbMF1bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzBdWzddID0JMHhjYWU0MzI3Zgk7CglwYXR0ZXJuXzVbMV1bMF0gPQkweGFlY2NjNDQ5CTsKCXBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzFdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbMV1bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwoJcGF0dGVybl81WzFdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbMV1bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwoJcGF0dGVybl81WzJdWzBdID0JMHhhZWQ4ZDA0OQk7CglwYXR0ZXJuXzVbMl1bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzJdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbMl1bNF0gPQkweDNmNjFiOWQ1CTsKCXBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzJdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbMl1bN10gPQkweGNhZTQzMjdmCTsKCXBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwoJcGF0dGVybl81WzNdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbM11bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzNdWzRdID0JMHgzZmMxMTlkNQk7CglwYXR0ZXJuXzVbM11bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzNdWzddID0JMHhjYWU0MzI3Zgk7CgoJcGF0dGVybl82WzBdWzBdID0gICAweGFlYzkzZjQ5ICAgOwoJcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMF1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlswXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CglwYXR0ZXJuXzZbMF1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlswXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbMV1bMF0gPQkweGFlY2MzZjQ5CTsKCXBhdHRlcm5fNlsxXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMV1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlsxXVs0XSA9CTB4M2Y0OTY2ZDUJOwoJcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMV1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlsxXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CglwYXR0ZXJuXzZbMl1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsyXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMl1bNF0gPQkweDNmNjE2NmQ1CTsKCXBhdHRlcm5fNlsyXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMl1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlszXVswXSA9CTB4YWU4ODNmNDkJOwoJcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbM11bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlszXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CglwYXR0ZXJuXzZbM11bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlszXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CgkvLyovCgkvLyovCglzdGFydF9hZGRyPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQJCQl0ZXN0X3NpemUgPSAweDIwOwoJdW5zaWduZWQgaW50IHRlc3RfYWRkcjsKCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2s9MDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX29bOF07Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9kWzhdOwoJewoJCS8vICBpZihsZmxhZykKCQkvLyAgICAgIGxvb3AgPSA4ODg7CgoJCS8vaWYob2xkX3BhdHRlcm5fZmxhZz09MSkKCQl7CgoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi5cbiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCQkJLyoKCQkJICAgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkgICB7CgoJCQkgICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkgICB7CgkJCSAgIHRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkgKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQl9CgkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwoJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCgkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pCgkJCXtlcnJvcl9jb3VudCsrOwoJCQlwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQl9CgkJCX0KCQkJfQoJCQl9CgkJCSovCgkJCS8vaWYocGF0dGVybl9mbGFnMT09MSkKCQkJewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCQkJCQkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQlwcmludGYoInA0IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJCS8vaWYocGF0dGVybl9mbGFnMj09MSkKCQkJewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCQkJCQkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQlwcmludGYoInA1IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQl9CgoJCQkvLwlpZihwYXR0ZXJuX2ZsYWczPT0xKQoJCQl7CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKSB7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLyBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8gcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNiBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgoKCgkJfQoKCQlwcmludGYoIlxFcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoJCXByaW50ZigiXG4gICAgICBcbiIpOwoJfQoKCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gMTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKaW50IGRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oaW50IGRkcl90ZXN0X3NpemUpCnsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IDB4MTAwMDAwMDA7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgllcnJvcl9jb3VudD0wOwoKCXVuc2lnbmVkIGludCAgZGVzWzhdIDsKCXVuc2lnbmVkIGludCAgcGF0dGVybl8xWzRdWzhdIDsKCS8vIHVuc2lnbmVkIGludCAgcGF0dGVybl8yWzRdWzhdIDsKCS8vIHVuc2lnbmVkIGludCAgcGF0dGVybl8zWzRdWzhdIDsKCS8vIHVuc2lnbmVkIGludCAgcGF0dGVybl80WzRdWzhdIDsKCS8vIHVuc2lnbmVkIGludCAgcGF0dGVybl81WzRdWzhdIDsKCS8vdW5zaWduZWQgaW50ICBwYXR0ZXJuXzZbNF1bOF0gOwoKCWRlc1swXSA9IAkweGFlYzgzZjQ5OwoJZGVzWzFdID0gICAgICAweGQyNDNhNjJjOwoJZGVzWzJdID0gICAgICAweGY4Nzc0YTBiOwoJZGVzWzNdID0gICAgICAgMHg2M2QyMTRlNTsKCWRlc1s0XSA9ICAgICAgMHgzZjQxNjZkNTsKCWRlc1s1XSA9ICAgICAweDIzOTY3MmMwOwoJZGVzWzZdID0gICAgICAweDQ3YmE3NTMzOwoJZGVzWzddID0gICAgICAweGNhZTRjZDdmOwoJLyoKCSAgIHBhdHRlcm5fMVswXVswXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMF1bMV0gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzBdWzJdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVswXVszXSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbMF1bNF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzBdWzVdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVswXVs2XSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMF1bN10gPSAweGFhMDBhYTAwOwoKCSAgIHBhdHRlcm5fMVsxXVswXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMV1bMV0gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzFdWzJdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVsxXVszXSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbMV1bNF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzFdWzVdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVsxXVs2XSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMV1bN10gPSAweGFhMDBhYTAwOwoKCSAgIHBhdHRlcm5fMVsyXVswXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMl1bMV0gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzJdWzJdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVsyXVszXSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbMl1bNF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzJdWzVdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVsyXVs2XSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbMl1bN10gPSAweGFhMDBhYTAwOwoKCSAgIHBhdHRlcm5fMVszXVswXSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbM11bMV0gPSAweGFhMDBhYTAwOwoJICAgcGF0dGVybl8xWzNdWzJdID0gMHg1NTAwNTUwMDsKCSAgIHBhdHRlcm5fMVszXVszXSA9IDB4YWEwMGFhMDA7CgkgICBwYXR0ZXJuXzFbM11bNF0gPSAweDU1MDA1NTAwOwoJICAgcGF0dGVybl8xWzNdWzVdID0gMHhhYTAwYWEwMDsKCSAgIHBhdHRlcm5fMVszXVs2XSA9IDB4NTUwMDU1MDA7CgkgICBwYXR0ZXJuXzFbM11bN10gPSAweGFhMDBhYTAwOwoJICAgKi8KCS8vIC8qCglwYXR0ZXJuXzFbMF1bMF0gPSAweDU1YWE1NTAwOwoJcGF0dGVybl8xWzBdWzFdID0gMHg1NWFhNTUwMDsKCXBhdHRlcm5fMVswXVsyXSA9IDB4NTVhYTU1MDA7CglwYXR0ZXJuXzFbMF1bM10gPSAweDU1YWE1NTAwOwoJcGF0dGVybl8xWzBdWzRdID0gMHhhYTAwZmYwMDsKCXBhdHRlcm5fMVswXVs1XSA9IDB4YWEwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNl0gPSAweGFhMDBmZjAwOwoJcGF0dGVybl8xWzBdWzddID0gMHhhYTAwZmYwMDsKCglwYXR0ZXJuXzFbMV1bMF0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzFdWzFdID0gMHhhYTAwYWEwMDsKCXBhdHRlcm5fMVsxXVsyXSA9IDB4NTUwMDU1MDA7CglwYXR0ZXJuXzFbMV1bM10gPSAweGFhMDBhYTAwOwoJcGF0dGVybl8xWzFdWzRdID0gMHg1NTAwNTUwMDsKCXBhdHRlcm5fMVsxXVs1XSA9IDB4YWEwMGFhMDA7CglwYXR0ZXJuXzFbMV1bNl0gPSAweDU1MDA1NTAwOwoJcGF0dGVybl8xWzFdWzddID0gMHhhYTAwYWEwMDsKCglwYXR0ZXJuXzFbMl1bMF0gPSAweDAwMDFmZTAwOwoJcGF0dGVybl8xWzJdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVsyXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbMl1bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzJdWzRdID0gMHgwMDAyZmQwMDsKCXBhdHRlcm5fMVsyXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbMl1bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzJdWzddID0gMHgwMDAwZmYwMDsKCglwYXR0ZXJuXzFbM11bMF0gPSAweDAwMDRmYjAwOwoJcGF0dGVybl8xWzNdWzFdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMVszXVsyXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbM11bM10gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzNdWzRdID0gMHgwMDA4ZjcwMDsKCXBhdHRlcm5fMVszXVs1XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzFbM11bNl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8xWzNdWzddID0gMHgwMDAwZmYwMDsKCS8vKi8KCS8qCgkgICBwYXR0ZXJuXzJbMF1bMF0gPSAweDAwMDFmZTAwOwoJICAgcGF0dGVybl8yWzBdWzFdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlswXVsyXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMF1bM10gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzBdWzRdID0gMHgwMDAyZmQwMDsKCSAgIHBhdHRlcm5fMlswXVs1XSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMF1bNl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzBdWzddID0gMHgwMDAwZmYwMDsKCgkgICBwYXR0ZXJuXzJbMV1bMF0gPSAweDAwMDRmYjAwOwoJICAgcGF0dGVybl8yWzFdWzFdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlsxXVsyXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMV1bM10gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzFdWzRdID0gMHgwMDA4ZjcwMDsKCSAgIHBhdHRlcm5fMlsxXVs1XSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMV1bNl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzFdWzddID0gMHgwMDAwZmYwMDsKCgkgICBwYXR0ZXJuXzJbMl1bMF0gPSAweDAwMTBlZjAwOwoJICAgcGF0dGVybl8yWzJdWzFdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlsyXVsyXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMl1bM10gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzJdWzRdID0gMHgwMDIwZGYwMDsKCSAgIHBhdHRlcm5fMlsyXVs1XSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbMl1bNl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzJdWzddID0gMHgwMDAwZmYwMDsKCgkgICBwYXR0ZXJuXzJbM11bMF0gPSAweDAwNDBiZjAwOwoJICAgcGF0dGVybl8yWzNdWzFdID0gMHgwMDAwZmYwMDsKCSAgIHBhdHRlcm5fMlszXVsyXSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbM11bM10gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzNdWzRdID0gMHgwMDgwN2YwMDsKCSAgIHBhdHRlcm5fMlszXVs1XSA9IDB4MDAwMGZmMDA7CgkgICBwYXR0ZXJuXzJbM11bNl0gPSAweDAwMDBmZjAwOwoJICAgcGF0dGVybl8yWzNdWzddID0gMHgwMDAwZmYwMDsKCgkgICBwYXR0ZXJuXzNbMF1bMF0gPSAweDAwMDEwMDAwOwoJICAgcGF0dGVybl8zWzBdWzFdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1swXVsyXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMF1bM10gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzBdWzRdID0gMHgwMDAyMDAwMDsKCSAgIHBhdHRlcm5fM1swXVs1XSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMF1bNl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzBdWzddID0gMHgwMDAwMDAwMDsKCgkgICBwYXR0ZXJuXzNbMV1bMF0gPSAweDAwMDQwMDAwOwoJICAgcGF0dGVybl8zWzFdWzFdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1sxXVsyXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMV1bM10gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzFdWzRdID0gMHgwMDA4MDAwMDsKCSAgIHBhdHRlcm5fM1sxXVs1XSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMV1bNl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzFdWzddID0gMHgwMDAwMDAwMDsKCgkgICBwYXR0ZXJuXzNbMl1bMF0gPSAweDAwMTAwMDAwOwoJICAgcGF0dGVybl8zWzJdWzFdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1syXVsyXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMl1bM10gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzJdWzRdID0gMHgwMDIwMDAwMDsKCSAgIHBhdHRlcm5fM1syXVs1XSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbMl1bNl0gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzJdWzddID0gMHgwMDAwMDAwMDsKCgkgICBwYXR0ZXJuXzNbM11bMF0gPSAweDAwNDAwMDAwOwoJICAgcGF0dGVybl8zWzNdWzFdID0gMHgwMDAwMDAwMDsKCSAgIHBhdHRlcm5fM1szXVsyXSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbM11bM10gPSAweDAwMDAwMDAwOwoJICAgcGF0dGVybl8zWzNdWzRdID0gMHgwMDgwMDAwMDsKCSAgIHBhdHRlcm5fM1szXVs1XSA9IDB4MDAwMDAwMDA7CgkgICBwYXR0ZXJuXzNbM11bNl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzddID0gMHgwMDAwMDAwMDsKCgoJcGF0dGVybl80WzBdWzBdID0JMHg1MWM4YzA0OQk7CglwYXR0ZXJuXzRbMF1bMV0gPQkweDJkNDM1OTJjCTsKCXBhdHRlcm5fNFswXVsyXSA9CTB4MDc3N2I1MGIJOwoJcGF0dGVybl80WzBdWzNdID0JMHg5Y2QyZWJlNQk7CglwYXR0ZXJuXzRbMF1bNF0gPQkweGMwNDE5OWQ1CTsKCXBhdHRlcm5fNFswXVs1XSA9CTB4ZGM5NjhkYzAJOwoJcGF0dGVybl80WzBdWzZdID0JMHhiOGJhOGEzMwk7CglwYXR0ZXJuXzRbMF1bN10gPQkweDM1ZTQzMjdmCTsKCglwYXR0ZXJuXzRbMV1bMF0gPQkweGFlMzdjMDQ5CTsKCXBhdHRlcm5fNFsxXVsxXSA9CTB4ZDJiYzU5MmMJOwoJcGF0dGVybl80WzFdWzJdID0JMHhmODg4YjUwYgk7CglwYXR0ZXJuXzRbMV1bM10gPQkweDYzMmRlYmU1CTsKCXBhdHRlcm5fNFsxXVs0XSA9CTB4M2ZiZTk5ZDUJOwoJcGF0dGVybl80WzFdWzVdID0JMHgyMzY5OGRjMAk7CglwYXR0ZXJuXzRbMV1bNl0gPQkweDQ3NDU4YTMzCTsKCXBhdHRlcm5fNFsxXVs3XSA9CTB4Y2ExYjMyN2YJOwoKCXBhdHRlcm5fNFsyXVswXSA9CTB4NTEzNzNmNDkJOwoJcGF0dGVybl80WzJdWzFdID0JMHgyZGJjYTYyYwk7CglwYXR0ZXJuXzRbMl1bMl0gPQkweDA3ODg0YTBiCTsKCXBhdHRlcm5fNFsyXVszXSA9CTB4OWMyZDE0ZTUJOwoJcGF0dGVybl80WzJdWzRdID0JMHhjMGJlNjZkNQk7CglwYXR0ZXJuXzRbMl1bNV0gPQkweGRjNjk3MmMwCTsKCXBhdHRlcm5fNFsyXVs2XSA9CTB4Yjg0NTc1MzMJOwoJcGF0dGVybl80WzJdWzddID0JMHgzNTFiY2Q3Zgk7CgoKCXBhdHRlcm5fNFszXVswXSA9CTB4NTFjOGMwNDkJOwoJcGF0dGVybl80WzNdWzFdID0JMHgyZDQzNTkyYwk7CglwYXR0ZXJuXzRbM11bMl0gPQkweDA3NzdiNTBiCTsKCXBhdHRlcm5fNFszXVszXSA9CTB4OWNkMmViZTUJOwoJcGF0dGVybl80WzNdWzRdID0JMHhjMDQxOTlkNQk7CglwYXR0ZXJuXzRbM11bNV0gPQkweGRjOTY4ZGMwCTsKCXBhdHRlcm5fNFszXVs2XSA9CTB4YjhiYThhMzMJOwoJcGF0dGVybl80WzNdWzddID0JMHgzNWU0MzI3Zgk7CgoJcGF0dGVybl81WzBdWzBdID0JMHhhZWM5YzE0OQk7CglwYXR0ZXJuXzVbMF1bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVswXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzBdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbMF1bNF0gPQkweDNmNDM5YmQ1CTsKCXBhdHRlcm5fNVswXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzBdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbMF1bN10gPQkweGNhZTQzMjdmCTsKCXBhdHRlcm5fNVsxXVswXSA9CTB4YWVjY2M0NDkJOwoJcGF0dGVybl81WzFdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbMV1bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVsxXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzFdWzRdID0JMHgzZjQ5OTFkNQk7CglwYXR0ZXJuXzVbMV1bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVsxXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzFdWzddID0JMHhjYWU0MzI3Zgk7CglwYXR0ZXJuXzVbMl1bMF0gPQkweGFlZDhkMDQ5CTsKCXBhdHRlcm5fNVsyXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzJdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbMl1bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVsyXVs0XSA9CTB4M2Y2MWI5ZDUJOwoJcGF0dGVybl81WzJdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbMl1bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVsyXVs3XSA9CTB4Y2FlNDMyN2YJOwoJcGF0dGVybl81WzNdWzBdID0JMHhhZTg4ODA0OQk7CglwYXR0ZXJuXzVbM11bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVszXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzNdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbM11bNF0gPQkweDNmYzExOWQ1CTsKCXBhdHRlcm5fNVszXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzNdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbM11bN10gPQkweGNhZTQzMjdmCTsKCglwYXR0ZXJuXzZbMF1bMF0gPSAgIDB4YWVjOTNmNDkgICA7CglwYXR0ZXJuXzZbMF1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlswXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzBdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMF1bNF0gPQkweDNmNDM2NmQ1CTsKCXBhdHRlcm5fNlswXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzBdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMF1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlsxXVswXSA9CTB4YWVjYzNmNDkJOwoJcGF0dGVybl82WzFdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMV1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlsxXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzFdWzRdID0JMHgzZjQ5NjZkNQk7CglwYXR0ZXJuXzZbMV1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlsxXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzFdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbMl1bMF0gPQkweGFlZDgzZjQ5CTsKCXBhdHRlcm5fNlsyXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzJdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMl1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlsyXVs0XSA9CTB4M2Y2MTY2ZDUJOwoJcGF0dGVybl82WzJdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMl1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlsyXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzNdWzBdID0JMHhhZTg4M2Y0OQk7CglwYXR0ZXJuXzZbM11bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlszXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzNdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbM11bNF0gPQkweDNmYzE2NmQ1CTsKCXBhdHRlcm5fNlszXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzNdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbM11bN10gPQkweGNhZTRjZDdmCTsKCSovCgkJLy8qLwoJCS8vKi8KCQlzdGFydF9hZGRyPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQJCQl0ZXN0X3NpemUgPSAweDIwOwoJdW5zaWduZWQgaW50IHRlc3RfYWRkcjsKCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2s9MDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX29bOF07Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9kWzhdOwoJewoJCS8vICBpZihsZmxhZykKCQkvLyAgICAgIGxvb3AgPSA4ODg7CgoJCS8vaWYob2xkX3BhdHRlcm5fZmxhZz09MSkKCQl7CgoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi5cbiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoKCQkJLyoKCQkJICAgZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkgICB7CgoJCQkgICBmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkgICB7CgkJCSAgIHRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkgKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQl9CgkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwoJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCgkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pCgkJCXtlcnJvcl9jb3VudCsrOwoJCQlwcmludGYoInA1RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQl9CgkJCX0KCQkJfQoJCQl9CgkJCSovCgkJCS8vaWYocGF0dGVybl9mbGFnMT09MSkKCQkJewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmICgocGF0dGVybl9vW3RlbXBfaV0pICE9IChkZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSkpCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQkvLyAgICAgICAgICAgICAgICBwcmludGYoInA0RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJCXByaW50ZigicDRFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIGRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpLHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoKCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkKCQkJCXsKCQkJCQl7CgkJCQkJCWRkcl91ZGVsYXkoMTAwMDApOwoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfaW52X3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8xW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvLyAgcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vCSAgcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQlwcmludGYoInA0IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIsCgkJCQkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQl9CgkJfQoKCQlwcmludGYoIlxFcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoJCXByaW50ZigiXG4gICAgICBcbiIpOwoJfQoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiAxOwoJZWxzZQoJCXJldHVybiAwOwp9CgojZW5kaWYKCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3Aodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAgY2FzZSAyMjoKCQkJCQkJKihwK2kpID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCS8vICAgY2FzZSAzMDoKCQkJCQkJKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCSoocCtpKSA9IFREQVRBMzI1OwoKCgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCSoocCtpKSA9MHhmZTAxZmUwMTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNzoKCQkJCQkJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTE6CgkJCQkJCSoocCtpKSA9MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCSoocCtpKSA9MHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCSoocCtpKSA9MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCSoocCtpKSA9MHhiZjQwYmY0MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCSoocCtpKSA9MHg3ZjgwN2Y4MDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPTB4MDAwMDAyMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMToKCQkJCQkJKihwK2kpID0weDAwMDAwNDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID0weDAwMDAwODAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID0weDAwMDAxMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJKihwK2kpID0weDAwMDAyMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID0weDAwMDA0MDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID0weDAwMDA4MDAwOwoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoJLy8jZGVmaW5lIGRkcl9wYXR0ZXJuX2xvb3AgMzIKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgoJCQkJc3dpdGNoIChpKQoJCQkJewoKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCSoocCtpKSA9IDB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkqKHAraSkgPSAweGZiMDRmYjA0OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJKihwK2kpID0gMHhmNzA4ZjcwODsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCSoocCtpKSA9IDB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJKihwK2kpID0gMHhiZjQwYmY0MDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9IDB4N2Y4MDdmODA7CgkJCQkJCWJyZWFrOwoKCgkJCQkJZGVmYXVsdDoKCgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCh2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3dpdGNoIChpKQoJCQkJewoKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgKihwK2kpID0gVERBVEEzMkY7CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkYpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCS8vICAgKihwK2kpID0gMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDApOwoJCQkJCQkJYnJlYWs7fQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICAgKihwK2kpID0gVERBVEEzMkE7CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMkEpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMkEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszMToKCQkJCQkJLy8JKihwK2kpID0gVERBVEEzMjU7CgkJCQkJCWlmICgqKHAraSkgIT0gVERBVEEzMjUpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgVERBVEEzMjUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJLy8gICAJKihwK2kpID0weGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9MHhmZTAxZmUwMSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZlMDFmZTAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkJCS8vIAkqKHAraSkgPTB4ZmQwMmZkMDI7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZDAyZmQwMikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZkMDJmZDAyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJLy8JKihwK2kpID0weGZiMDRmYjA0OwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmIwNGZiMDQpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJLy8JKihwK2kpID0weGY3YjA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGY3MDhmNzA4KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZjcwOGY3MDgpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCS8vCSoocCtpKSA9MHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGVmMTBlZjEwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZWYxMGVmMTApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjM6CgkJCQkJCS8vCSoocCtpKSA9MHhkZjIwZGYyMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZGYyMGRmMjApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCS8vICAJKihwK2kpID0weGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4YmY0MGJmNDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhiZjQwYmY0MCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJLy8gICAJKihwK2kpID0weDdmODA3ZjgwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4N2Y4MDdmODApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHg3ZjgwN2Y4MCk7CgkJCQkJCQlicmVhazsKCgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8JKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDAxMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDEwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDAwMDAwMjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMDAyMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMDQwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAwNDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMDgwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAwODAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwMTAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDAxMDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkvLyAJKihwK2kpID0weGZmZmZmZWZmOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4MDAwMDIwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMjAwMCk7CgoJCQkJCQl9IGJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwNDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDA0MDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gMHgwMDAwODAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwMDA4MDAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQovLyovCnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgIHVuc2lnbmVkIGludCAgaSwgaiwgbjsKCXVuc2lnbmVkIGludCAgaSwgbjsKCXVuc2lnbmVkIGludCAgbV9sZW4gPSBtX2xlbmd0aDsKCglwID0gKCB1bnNpZ25lZCBpbnQgICopYnVmZjsKCgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzM6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmZTAxZmUwMTsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZlMDFmZTAxKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmUwMWZlMDEpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZmQwMmZkMDIpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGZiMDRmYjA0KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmIwNGZiMDQpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4ZjcwOGY3MDg7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmNzA4ZjcwOCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGY3MDhmNzA4KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE5OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZWYxMGVmMTApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhlZjEwZWYxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IDB4ZGYyMGRmMjApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhkZjIwZGYyMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhiZjQwYmY0MDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweGJmNDBiZjQwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4YmY0MGJmNDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8JICAgKihwK2kpID0gMHg3ZjgwN2Y4MDsKCQkJCQkJaWYgKCoocCtpKSAhPSAweDdmODA3ZjgwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCQkJCQlkZWZhdWx0OgoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gMHhmZjAwZmYwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZjAwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4gMTI4KjQpCgkJCXsKCQkJCW1fbGVuIC09IDEyOCo0OwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24odm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMjU6CgkJCQkJY2FzZSAyNjoKCQkJCQljYXNlIDI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCSoocCtpKSA9IH5UREFUQTMyRjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgNToKCQkJCQljYXNlIDY6CgkJCQkJY2FzZSA3OgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSAxMzoKCQkJCQljYXNlIDE0OgoJCQkJCWNhc2UgMTU6CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQljYXNlIDI4OgoJCQkJCWNhc2UgMjk6CgkJCQkJY2FzZSAzMDoKCQkJCQljYXNlIDMxOgoJCQkJCQkvLyAgIGNhc2UgMjI6CgkJCQkJCSoocCtpKSA9IH4wOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSszOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkqKHAraSkgPSB+VERBVEEzMkE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCSoocCtpKSA9flREQVRBMzI1OwoKCgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCSoocCtpKSA9fjB4ZmUwMWZlMDE7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzc6CgkJCQkJCSoocCtpKSA9fjB4ZmQwMmZkMDI7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJKihwK2kpID1+MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTU6CgkJCQkJCSoocCtpKSA9fjB4ZjcwOGY3MDg7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE5OgoJCQkJCQkqKHAraSkgPX4weGVmMTBlZjEwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJKihwK2kpID1+MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjc6CgkJCQkJCSoocCtpKSA9fjB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkqKHAraSkgPX4weDdmODA3ZjgwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMTAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDA0MDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwODAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID1+MHgwMDAwMTAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9fjB4MDAwMDIwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkqKHAraSkgPX4weDAwMDA0MDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID1+MHgwMDAwODAwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPSB+MHhmZTAxZmUwMTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSA0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPSB+MHhmZDAyZmQwMjsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzExOgoJCQkJCQkqKHAraSkgPSB+MHhmYjA0ZmIwNDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCSoocCtpKSA9IH4weGY3MDhmNzA4OwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID0gfjB4ZWYxMGVmMTA7CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzIxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzIyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzIzOgoJCQkJCQkqKHAraSkgPSB+MHhkZjIwZGYyMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjc6CgkJCQkJCSoocCtpKSA9fjB4YmY0MGJmNDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCSoocCtpKSA9IH4weDdmODA3ZjgwOwoJCQkJCQlicmVhazsKCgoJCQkJCWRlZmF1bHQ6CgoJCQkJCQkqKHAraSkgPSB+MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiggMTI4KjQpKQoJCQl7CgkJCQltX2xlbiAtPSggMTI4KjQpOwoJCQkJcCArPSAzMio0OwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcCArPSAobV9sZW4+PjIpOwoJCQkJbV9sZW4gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyB2b2lkIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzd2l0Y2ggKGkpCgkJCQl7CgkJCQkJY2FzZSAwOgoJCQkJCWNhc2UgMToKCQkJCQljYXNlIDI6CgkJCQkJY2FzZSAzOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCWNhc2UgMTY6CgkJCQkJY2FzZSAxNzoKCQkJCQljYXNlIDE4OgoJCQkJCWNhc2UgMTk6CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICBjYXNlIDMwOgoJCQkJCQkvLyAgICAgICoocCtpKSA9IFREQVRBMzJGOwoJCQkJCQlpZiAoKihwK2kpICE9flREQVRBMzJGKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH5UREFUQTMyRik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIDQ6CgkJCQkJY2FzZSA1OgoJCQkJCWNhc2UgNjoKCQkJCQljYXNlIDc6CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQljYXNlIDIwOgoJCQkJCWNhc2UgMjE6CgkJCQkJY2FzZSAyMjoKCQkJCQljYXNlIDIzOgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAgY2FzZSAyMjoKCQkJCQkJLy8gICAqKHAraSkgPSAwOwoJCQkJCQlpZiAoKihwK2kpICE9fjApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLyAgIGNhc2UgMzA6CgkJCQkJCS8vICAgICAgICAqKHAraSkgPSBUREFUQTMyQTsKCQkJCQkJaWYgKCoocCtpKSAhPSB+VERBVEEzMkEpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSx+VERBVEEzMkEpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vCSoocCtpKSA9IFREQVRBMzI1OwoJCQkJCQlpZiAoKihwK2kpICE9IH5UREFUQTMyNSkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+VERBVEEzMjUpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzM6CgkJCQkJCS8vICAgCSoocCtpKSA9MHhmZTAxZmUwMTsKCQkJCQkJaWYgKCoocCtpKSAhPX4weGZlMDFmZTAxKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZlMDFmZTAxKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkvLyAJKihwK2kpID0weGZkMDJmZDAyOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZkMDJmZDAyKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZkMDJmZDAyKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmIwNGZiMDQ7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmIwNGZiMDQpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmIwNGZiMDQpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkvLwkqKHAraSkgPTB4ZjdiMDhmNzA4OwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGY3MDhmNzA4KQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGY3MDhmNzA4KTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJLy8JKihwK2kpID0weGVmMTBlZjEwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGVmMTBlZjEwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGVmMTBlZjEwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJLy8JKihwK2kpID0weGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGRmMjBkZjIwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJLy8gIAkqKHAraSkgPTB4YmY0MGJmNDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4YmY0MGJmNDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4YmY0MGJmNDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzMxOgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4N2Y4MDdmODApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4N2Y4MDdmODApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkvLwkqKHAraSkgPTB4MDAwMDAxMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDAxMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDAxMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCS8vICAJKihwK2kpID0weDAwMDAwMTAwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weDAwMDAwMjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwMDAwMjAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDQwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDQwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTU6CgkJCQkJCS8vCSoocCtpKSA9MHgwMDAwMDEwMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMDgwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDgwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCS8vCSoocCtpKSA9MHhmZmZmZmVmZjsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHgwMDAwMTAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMTAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCS8vIAkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDIwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDIwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDQwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDQwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzMxOgoJCQkJCQkvLwkqKHAraSkgPTB4ZmZmZmZlZmY7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4MDAwMDgwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMDgwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCi8vKi8Kc3RhdGljIHZvaWQgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMih2b2lkICpidWZmLCAgdW5zaWduZWQgaW50ICBtX2xlbmd0aCkKewoJdW5zaWduZWQgaW50ICAqcDsKCS8vICAgdW5zaWduZWQgaW50ICBpLCBqLCBuOwoJdW5zaWduZWQgaW50ICBpLCBuOwoJdW5zaWduZWQgaW50ICBtX2xlbiA9IG1fbGVuZ3RoOwoKCXAgPSAoIHVuc2lnbmVkIGludCAgKilidWZmOwoKCXdoaWxlIChtX2xlbikKCXsKCQkvLyAgZm9yKGo9MDtqPDMyO2orKykKCQl7CgkJCWlmIChtX2xlbiA+PSAxMjgqNCkKCQkJCW4gPSAzMio0OwoJCQllbHNlCgkJCQluID0gbV9sZW4+PjI7CgoJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCWRkcl9wbGRfY2FjaGUocCkgIDsKI2VuZGlmCgkJCQlpZiAoKGVycm9yX291dG9mX2NvdW50X2ZsYWcpICYmIChlcnJvcl9jb3VudCkpCgkJCQl7CgkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIG91dCBvZiBjb3VudCIpOwoJCQkJCW1fbGVuPTA7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGZlMDFmZTAxOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGZlMDFmZTAxKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZlMDFmZTAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNzoKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmZDAyZmQwMjsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmZDAyZmQwMikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZDAyZmQwMik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAgKihwK2kpID0gMHhmYjA0ZmIwNDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmYjA0ZmIwNCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmYjA0ZmIwNCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhmNzA4ZjcwODsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhmNzA4ZjcwOCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmNzA4ZjcwOCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJLy8JICAgKihwK2kpID0gMHhlZjEwZWYxMDsKCQkJCQkJaWYgKCoocCtpKSAhPSB+MHhlZjEwZWYxMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhlZjEwZWYxMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8gICAqKHAraSkgPSAweGRmMjBkZjIwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGRmMjBkZjIwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGRmMjBkZjIwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLwkgICAqKHAraSkgPSAweGJmNDBiZjQwOwoJCQkJCQlpZiAoKihwK2kpICE9IH4weGJmNDBiZjQwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGJmNDBiZjQwKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzE6CgkJCQkJCS8vCSAgICoocCtpKSA9IDB4N2Y4MDdmODA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4N2Y4MDdmODApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4N2Y4MDdmODApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoKCQkJCQlkZWZhdWx0OgoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWlmICgqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCQlicmVhazsKCgoJCQkJfQoJCQl9CgoJCQlpZiAobV9sZW4gPiAxMjgqNCkKCQkJewoJCQkJbV9sZW4gLT0gMTI4KjQ7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsodm9pZCAqYnVmZiwgIHVuc2lnbmVkIGludCAgbV9sZW5ndGgpCnsKCXVuc2lnbmVkIGludCAgKnA7CgkvLyAgICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgkvLyNkZWZpbmUgZGRyX3BhdHRlcm5fbG9vcCAzMgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7CgoJd2hpbGUgKG1fbGVuKQoJewoJCS8vICBmb3Ioaj0wO2o8MzI7aisrKQoJCXsKCQkJaWYgKG1fbGVuID49IDEyOCo0KQoJCQkJbiA9IDMyKjQ7CgkJCWVsc2UKCQkJCW4gPSBtX2xlbj4+MjsKCgkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCgkJCXsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJZGRyX3BsZF9jYWNoZShwKSAgOwojZW5kaWYKCQkJCXN3aXRjaCAoaSkKCQkJCXsKCQkJCQljYXNlIDA6CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgMjoKCQkJCQljYXNlIDM6CgkJCQkJCSoocCtpKSA9IDB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQkJKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDk6CgkJCQkJY2FzZSAxMDoKCQkJCQljYXNlIDExOgoJCQkJCQkqKHAraSkgPSAweGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIDEyOgoJCQkJCWNhc2UgMTM6CgkJCQkJY2FzZSAxNDoKCQkJCQljYXNlIDE1OgoJCQkJCQkqKHAraSkgPSAweGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQkJKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQkJKihwK2kpID0gMHhmZjAwMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJKihwK2kpID0gMHhmZmZmMDAwMDsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCSoocCtpKSA9IDB4MDBmZjAwZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsxMToKCQkJCQkJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTM6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTU6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE3OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE5OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQkJKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjc6CgkJCQkJCSoocCtpKSA9fjB4ZmZmZjAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzMxOgoJCQkJCQkqKHAraSkgPX4weDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzoKCQkJCQkJKihwK2kpID0weDAwZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkqKHAraSkgPTB4ZmYwMDAwMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMToKCQkJCQkJKihwK2kpID0weDAwMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxMzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNToKCQkJCQkJKihwK2kpID0weDAwMDAwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisxOToKCQkJCQkJKihwK2kpID0weDAwZmYwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyNzoKCQkJCQkJKihwK2kpID0weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszMToKCQkJCQkJKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszOgoJCQkJCQkqKHAraSkgPX4weDAwZmYwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys3OgoJCQkJCQkqKHAraSkgPX4weGZmMDAwMDAwOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCSoocCtpKSA9fjB4MDAwMGZmZmY7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkqKHAraSkgPX4weDAwMDAwMGZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxNzoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOToKCQkJCQkJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMjM6CgkJCQkJCSoocCtpKSA9fjB4ZmYwMGZmMDA7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJYnJlYWs7CgoKCQkJCX0KCQkJfQoKCQkJaWYgKG1fbGVuID4oIDEyOCo0KSkKCQkJewoJCQkJbV9sZW4gLT0oIDEyOCo0KTsKCQkJCXAgKz0gMzIqNDsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXAgKz0gKG1fbGVuPj4yKTsKCQkJCW1fbGVuID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKHZvaWQgKmJ1ZmYsICB1bnNpZ25lZCBpbnQgIG1fbGVuZ3RoKQp7Cgl1bnNpZ25lZCBpbnQgICpwOwoJLy8gICB1bnNpZ25lZCBpbnQgIGksIGosIG47Cgl1bnNpZ25lZCBpbnQgIGksIG47Cgl1bnNpZ25lZCBpbnQgIG1fbGVuID0gbV9sZW5ndGg7CgoJcCA9ICggdW5zaWduZWQgaW50ICAqKWJ1ZmY7Cgl3aGlsZSAobV9sZW4pCgl7CgkJLy8gIGZvcihqPTA7ajwzMjtqKyspCgkJewoJCQlpZiAobV9sZW4gPj0gMTI4KjQpCgkJCQluID0gMzIqNDsKCQkJZWxzZQoJCQkJbiA9IG1fbGVuPj4yOwoKCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKCQkJewojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQlkZHJfcGxkX2NhY2hlKHApICA7CiNlbmRpZgoJCQkJaWYgKChlcnJvcl9vdXRvZl9jb3VudF9mbGFnKSAmJiAoZXJyb3JfY291bnQpKQoJCQkJewoJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBvdXQgb2YgY291bnQiKTsKCQkJCQltX2xlbj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJc3dpdGNoIChpKQoJCQkJewoJCQkJCWNhc2UgMDoKCQkJCQljYXNlIDE6CgkJCQkJY2FzZSAyOgoJCQkJCWNhc2UgMzoKCQkJCQkJLy8JICBpZigqKHAraSkgIT1+VERBVEEzMkYpCgoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgNDoKCQkJCQljYXNlIDU6CgkJCQkJY2FzZSA2OgoJCQkJCWNhc2UgNzoKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZmZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSA4OgoJCQkJCWNhc2UgOToKCQkJCQljYXNlIDEwOgoJCQkJCWNhc2UgMTE6CgkJCQkJCS8vICoocCtpKSA9IDB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAxMjoKCQkJCQljYXNlIDEzOgoJCQkJCWNhc2UgMTQ6CgkJCQkJY2FzZSAxNToKCQkJCQkJLy8gKihwK2kpID0gMHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHhmZjAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSAxNjoKCQkJCQljYXNlIDE3OgoJCQkJCWNhc2UgMTg6CgkJCQkJY2FzZSAxOToKCQkJCQkJLy8JICoocCtpKSA9IDB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyMDoKCQkJCQljYXNlIDIxOgoJCQkJCWNhc2UgMjI6CgkJCQkJY2FzZSAyMzoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmYwMDAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAyNDoKCQkJCQljYXNlIDI1OgoJCQkJCWNhc2UgMjY6CgkJCQkJY2FzZSAyNzoKCQkJCQkJLy8gICoocCtpKSA9IDB4ZmZmZjAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmZmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgMjg6CgkJCQkJY2FzZSAyOToKCQkJCQljYXNlIDMwOgoJCQkJCWNhc2UgMzE6CgkJCQkJCS8vICAqKHAraSkgPSAweDAwZmYwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwZmYwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDBmZjAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzM6CgkJCQkJCS8vICAJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzc6CgkJCQkJCS8vIAkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZmZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSs5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzExOgoJCQkJCQkvLyAJKihwK2kpID1+MHhmZjAwMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMDAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMDAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzE1OgoJCQkJCQkvLwkqKHAraSkgPX4weGZmMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZjAwZmZmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMTk6CgkJCQkJCS8vCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMSsyMzoKCQkJCQkJLy8JKihwK2kpID1+MHhmZjAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8xKzI3OgoJCQkJCQkvLwkqKHAraSkgPX4weGZmZmYwMDAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHhmZmZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHhmZmZmMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzErMzE6CgkJCQkJCS8vICAJKihwK2kpID1+MHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDBmZjAwZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiswOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMiszOgoJCQkJCQkvLyAgCSoocCtpKSA9MHgwMGZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMGZmMDAwMCkKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzU6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrNjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis3OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMDAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwMDAwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMis5OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEwOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzExOgoJCQkJCQkvLyAJKihwK2kpID0weDAwMDBmZmZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweDAwMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4MDAwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzE1OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4MDAwMDAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4MDAwMDAwZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHgwMDAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMTk6CgkJCQkJCS8vICAgCSoocCtpKSA9MHgwMGZmMDBmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gMHgwMGZmMDBmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCAweDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMisyMzoKCQkJCQkJLy8JKihwK2kpID0weGZmMDBmZjAwOwoJCQkJCQlpZiAoICoocCtpKSAhPSAweGZmMDBmZjAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIDB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8yKzI3OgoJCQkJCQkvLyAgIAkqKHAraSkgPTB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmZmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMjk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzIrMzE6CgkJCQkJCS8vCSAgIAkqKHAraSkgPTB4ZmYwMGZmMDA7CgkJCQkJCWlmICggKihwK2kpICE9IDB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgMHhmZjAwZmYwMCk7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysxOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMzoKCQkJCQkJLy8JKihwK2kpID1+MHgwMGZmMDAwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDBmZjAwMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDBmZjAwMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzQ6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrNToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzc6CgkJCQkJCS8vICAgCSoocCtpKSA9fjB4ZmYwMDAwMDA7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDAwMDAwKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDAwMDAwKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMys4OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzk6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTA6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTE6CgkJCQkJCS8vICAJKihwK2kpID1+MHgwMDAwZmZmZjsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4MDAwMGZmZmYpCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4MDAwMGZmZmYpOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEyOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzEzOgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzE1OgoJCQkJCQkvLyAgIAkqKHAraSkgPX4weDAwMDAwMGZmOwoJCQkJCQlpZiAoICoocCtpKSAhPSB+MHgwMDAwMDBmZikKCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQlwcmludGYoIkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdXG4iLCAqKHAraSksIHBfY29udnRlcl9pbnQocCArIGkpLCB+MHgwMDAwMDBmZik7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTY6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTc6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTg6CgkJCQkJY2FzZSBERFJfUEFUVEVSTl9MT09QXzMrMTk6CgkJCQkJCS8vICAgCSoocCtpKSA9fjB4MDBmZjAwZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weDAwZmYwMGZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weDAwZmYwMGZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMjoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyMzoKCQkJCQkJLy8JKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI0OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI1OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI2OgoJCQkJCWNhc2UgRERSX1BBVFRFUk5fTE9PUF8zKzI3OgoJCQkJCQkvLyAgCSoocCtpKSA9fjB4ZmYwMGZmZmY7CgkJCQkJCWlmICggKihwK2kpICE9IH4weGZmMDBmZmZmKQoJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCXByaW50ZigiRXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF1cbiIsICoocCtpKSwgcF9jb252dGVyX2ludChwICsgaSksIH4weGZmMDBmZmZmKTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyODoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMysyOToKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMDoKCQkJCQljYXNlIEREUl9QQVRURVJOX0xPT1BfMyszMToKCQkJCQkJLy8gICAJKihwK2kpID1+MHhmZjAwZmYwMDsKCQkJCQkJaWYgKCAqKHAraSkgIT0gfjB4ZmYwMGZmMDApCgkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJcHJpbnRmKCJFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XVxuIiwgKihwK2kpLCBwX2NvbnZ0ZXJfaW50KHAgKyBpKSwgfjB4ZmYwMGZmMDApOwoJCQkJCQl9CgkJCQkJCWJyZWFrOwoKCgkJCQl9CgkJCX0KCgkJCWlmIChtX2xlbiA+KCAxMjgqNCkpCgkJCXsKCQkJCW1fbGVuIC09KCAxMjgqNCk7CgkJCQlwICs9IDMyKjQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwICs9IChtX2xlbj4+Mik7CgkJCQltX2xlbiA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KfQoKCgppbnQgZG9fZGRyX3Rlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBsZmxhZyA9IDA7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJdW5zaWduZWQgaW50ICAgc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDE7Cgl1bnNpZ25lZCBpbnQgICBjcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDE7Cgl1bnNpZ25lZCBpbnQgICBvbGRfcGF0dGVybl9mbGFnID0gMTsKCgl1bnNpZ25lZCBpbnQgICBwcmludF9mbGFnID0gMTsKCS8vCSAgY29weV90ZXN0X2ZsYWcgPSAwOwoJcHJpbnRfZmxhZyA9IDE7CgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJZXJyb3JfY291bnQgPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CglpZiAoIWFyZ2MpCgkJZ290byBERFJfVEVTVF9TVEFSVDsKCWlmIChhcmdjID4gMSkgewoJCWlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJCWxmbGFnID0gMTsKCQl9CgkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJoIikgPT0gMCl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJCWVsc2V7CgkJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CgkJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCQlsb29wID0gMTsKCQl9Cgl9CgkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPT0xKSB7CgkJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCWxvb3AgPSAxOwoKCX0KCWlmIChhcmdjID4gMikgewoJCXN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgoJfQoJaWYgKGFyZ2MgPiAzKSB7CgkJdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJfQoJaWYgKHRlc3Rfc2l6ZTwweDEwMDApCgkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCglvbGRfcGF0dGVybl9mbGFnID0gMTsKCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAxOwoJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJLy9wcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPT0yKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJzIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImMiKSA9PSAwKSkKCQl7CgkJCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQl9CgkJZWxzZSAgaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCkpCgkJewoJCQllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgkJfQoJfQoJaWYgKGFyZ2MgPjIpIHsKCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgIm4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJuIikgPT0gMCkpCgkJewoJCQlwcmludF9mbGFnID0gMDsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAicCIpID09IDApKQoJCXsKCQkJY29weV90ZXN0X2ZsYWcgPSAxOwoJCX0KCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImMiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApKQoJCXsKCQkJc2ltcGxlX3BhdHRlcm5fZmxhZyA9IDA7CgkJCW9sZF9wYXR0ZXJuX2ZsYWc9MDsKCQkJY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWcgPSAxOwoJCX0KCQllbHNlICBpZiAoIChzdHJjbXAoYXJndlsxXSwgImUiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzJdLCAiZSIpID09IDApKQoJCXsKCQkJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJCX0KCX0KCS8vcHJpbnRmKCJcbkxJTkUxPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CglpZiAoYXJnYyA+IDMpIHsKCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgInAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAicCIpID09IDApKQoJCXsKCQkJY29weV90ZXN0X2ZsYWcgPSAxOwoJCX0KCQlpZiAoIChzdHJjbXAoYXJndlsxXSwgIm4iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJuIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzNdLCAibiIpID09IDApKQoJCXsKCQkJcHJpbnRfZmxhZyA9IDA7CgkJfQoJCWlmICggKHN0cmNtcChhcmd2WzFdLCAicyIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgInMiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbM10sICJzIikgPT0gMCkpCgkJewoJCQlzaW1wbGVfcGF0dGVybl9mbGFnID0gMTsKCQkJb2xkX3BhdHRlcm5fZmxhZz0wOwoJCQljcm9zc190YWxrX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJjIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgImMiKSA9PSAwKSkKCQl7CgkJCXNpbXBsZV9wYXR0ZXJuX2ZsYWcgPSAwOwoJCQlvbGRfcGF0dGVybl9mbGFnPTA7CgkJCWNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID0gMTsKCQl9CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMV0sICJlIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiZSIpID09IDApIHx8IChzdHJjbXAoYXJndlszXSwgImUiKSA9PSAwKSkKCQl7CgkJCWVycm9yX291dG9mX2NvdW50X2ZsYWc9MTsKCQl9Cgl9CgoJLy8gICAgcHJpbnRmKCJcbkxJTkUyPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkvLwlwcmludGYoIlxuTElORTM9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgpERFJfVEVTVF9TVEFSVDoKCgkvLy8qCglkbyB7CgkJaWYgKGxmbGFnKQoJCQlsb29wID0gODg4OwoKCQlpZiAob2xkX3BhdHRlcm5fZmxhZyA9PSAxKQoJCXsKCQkJewoJCQkJLy8JcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCS8vcHJpbnRmKCJcbkxJTkU9PSAweCUwOHhcbiIsIF9fTElORV9fKTsKCQkJCWlmIChwcmludF9mbGFnKQoJCQkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJLy8JIGZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQl9CgkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQkJCWlmIChwcmludF9mbGFnKSB7CgkJCQkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCQkJaWYgKHByaW50X2ZsYWcpIHsKCQkJCQlwcmludGYoIlxuRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCXByaW50ZigiXG5TdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCQkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykKCQkJCQlwcmludGYoIlxuRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCQkJe2lmKHByaW50X2ZsYWcpCgkJCQkJcHJpbnRmKCJcbiBjb3B5X3Rlc3RfZmxhZyA9IDEsc3RhcnQgY29weSB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgkJCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplLzIgKTsKCQkJCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQl9CgoJCQl9CgkJCXsKCQkJCS8vCXByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQkvL3ByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5TdGFydCAqNCBub3JtYWwgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCX0KCQkJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykgewoJCQkJCXByaW50ZigiXG5FbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCQkJcHJpbnRmKCJcblN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCQlpZiAocHJpbnRfZmxhZykKCQkJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgkJCQlpZiAoY29weV90ZXN0X2ZsYWcpCgkJCQl7CgoJCQkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZS8yICk7CgkJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQkJZGRyX3JlYWQ0KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCQl9CgoKCQkJfQoJCX0KCgkJaWYgKHNpbXBsZV9wYXR0ZXJuX2ZsYWcgPT0gMSkKCQl7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCX0KCQkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKSB7CgkJCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJCWlmIChwcmludF9mbGFnKQoJCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCQl7CgkJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwoJCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrdGVzdF9zaXplLzIpKSwgdGVzdF9zaXplLzIpOwoJCQl9CgoJCX0KCgkJaWYgKGNyb3NzX3RhbGtfcGF0dGVybl9mbGFnID09IDEpCgkJe2lmKHByaW50X2ZsYWcpewoJCQkJCQkgICBwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQkJCQkgICBwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCQkgICB9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTt9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJCQkvLy8qCgkJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTt9CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbjIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpO30KCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykgewoJCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpO30KCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUpOwoJCWlmIChwcmludF9mbGFnKSB7CgkJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7fQoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIHRlc3Rfc2l6ZSk7CgkJaWYgKHByaW50X2ZsYWcpIHsKCQkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTt9CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgdGVzdF9zaXplKTsKCQlpZiAocHJpbnRfZmxhZykKCQkJcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQlpZiAoY29weV90ZXN0X2ZsYWcpCgkJewoJCQlkZHJfdGVzdF9jb3B5KCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCB0ZXN0X3NpemUvMiApOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcit0ZXN0X3NpemUvMikpLCB0ZXN0X3NpemUvMik7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK3Rlc3Rfc2l6ZS8yKSksIHRlc3Rfc2l6ZS8yKTsKCQl9CgkJLy8gICAgKi8KCgkJfQoKCQlpZiAocHJpbnRfZmxhZykKCQkJcHJpbnRmKCJcbkVycm9yIGNvdW50PT0weCUwOHgiLCBlcnJvcl9jb3VudCk7CgoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KClVfQk9PVF9DTUQoCglkZHJ0ZXN0LAk1LAkxLAlkb19kZHJfdGVzdCwKCSJERFIgdGVzdCBmdW5jdGlvbiIsCgkiZGRydGVzdCBbTE9PUF0gW0FERFJdLkRlZmF1bHQgYWRkcmVzcyBpcyAweDhkMDAwMDAwXG4iCik7CgppbnQgZG9fZGRyX3NwZWNpYWxfdGVzdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIGxmbGFnID0gMDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIHdyaXRlX3RpbWVzID0gMTsKCXVuc2lnbmVkIGludCAgcmVhZF90aW1lcyA9IDM7CgkvLyAgdW5zaWduZWQgaW50ICAgb2xkX3BhdHRlcm5fZmxhZyA9IDE7CgoJdW5zaWduZWQgaW50ICAgcHJpbnRfZmxhZyA9IDE7CgkvLwkgIGNvcHlfdGVzdF9mbGFnID0gMDsKCXByaW50X2ZsYWcgPSAxOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MDsKCWVycm9yX2NvdW50ID0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCWlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJbGZsYWcgPSAxOwoJfQoJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJoIikgPT0gMCl7CgkJZ290byB1c2FnZTsKCX0KCWVsc2V7CgkJbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDEwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wID0gMTsKCX0KCgkvLyAgICBwcmludGYoIlxuTElORT09IDB4JTA4eFxuIiwgX19MSU5FX18pOwoJaWYgKGFyZ2MgPT0xKSB7CgkJLy8gICAgc3RhcnRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQkvLyAgICBpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCWxvb3AgPSAxOwoKCX0KCWlmIChhcmdjID4gMikgewoJCXN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7CgoJfQoJaWYgKGFyZ2MgPiAzKSB7CgkJdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXRlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgoJfQoJaWYgKHRlc3Rfc2l6ZTwweDEwMDApCgkJdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCWlmIChhcmdjID4gNCkgewoJCXdyaXRlX3RpbWVzID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXdyaXRlX3RpbWVzID0gMDsKCgl9CglpZiAoYXJnYyA+IDUpIHsKCQlyZWFkX3RpbWVzID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXJlYWRfdGltZXMgPSAwOwoKCX0KCXVuc2lnbmVkIGludCAgYmFzZV9wYXR0ZXJuID0gMTsKCXVuc2lnbmVkIGludCAgaW5jX2ZsYWcgPSAxOwoJaWYgKGFyZ2MgPiA2KSB7CgkJYmFzZV9wYXR0ZXJuID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWJhc2VfcGF0dGVybiA9IDA7CgoJfQoJaWYgKGFyZ2MgPiA3KSB7CgkJaW5jX2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJaW5jX2ZsYWcgPSAwOwoKCX0KCgoJdW5zaWduZWQgaW50ICBjb3VudCAgICA9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3ZhbCA9IDE7CgoJLy8vKgoJZG8gewoJCWlmIChsZmxhZykKCQkJbG9vcCA9IDg4ODsKCgkJaWYgKDEpCgkJewoKCQkJZm9yIChpPTA7aTx3cml0ZV90aW1lczspCgkJCXtpKys7CgkJCQlwcmludGYoIlxud3JpdGVfdGltZXM9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpaSkpOwoJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHI7CgkJCQl0ZXN0X3ZhbD1iYXNlX3BhdHRlcm47CgkJCQljb3VudD0odGVzdF9zaXplPj4yKTsKCQkJCWRvCgkJCQl7CgkJCQkJd3JpdGVsKHRlc3RfdmFsLCh1bnNpZ25lZCBsb25nKXRlc3RfYWRkcik7CgkJCQkJdGVzdF9hZGRyPXRlc3RfYWRkcis0OwoJCQkJCWlmIChpbmNfZmxhZykKCQkJCQkJdGVzdF92YWw9dGVzdF92YWwrMTsKCgkJCQl9CgkJCQl3aGlsZSAoY291bnQtLSkgOwoJCQl9CgoJCQlmb3IgKGk9MDtpPHJlYWRfdGltZXM7KQoJCQl7aSsrOwoJCQkJcHJpbnRmKCJcbnJlYWRfdGltZXM9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpaSkpOwoJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHI7CgkJCQl0ZXN0X3ZhbD1iYXNlX3BhdHRlcm47CgkJCQljb3VudD0odGVzdF9zaXplPj4yKTsKCgkJCQlkbwoJCQkJewoKCQkJCQkvL3dyaXRlbCh2YWwsKHVuc2lnbmVkIGxvbmcpcmVnKTsKCQkJCQlpZiAodGVzdF92YWwgIT0gKHJlYWRsKCh1bnNpZ25lZCBsb25nKXRlc3RfYWRkcikpKSB7CgoJCQkJCQlwcmludGYoIlxuYWRkPT0weCUwOHgscGF0dGVybj09MHglMDh4LHJlYWQ9PTB4JTA4eCBcbiIsKCh1bnNpZ25lZCBpbnQpdGVzdF9hZGRyKSwoKHVuc2lnbmVkIGludCl0ZXN0X3ZhbCksKHJlYWRsKCh1bnNpZ25lZCBpbnQpdGVzdF9hZGRyKSkpOwoJCQkJCX0KCQkJCQl0ZXN0X2FkZHI9dGVzdF9hZGRyKzQ7CgkJCQkJaWYgKGluY19mbGFnKQoJCQkJCQl0ZXN0X3ZhbD10ZXN0X3ZhbCsxOwoJCQkJfQoJCQkJd2hpbGUgKGNvdW50LS0pIDsKCQkJfQoJCX0KCgoKCQlpZiAocHJpbnRfZmxhZykKCQkJcHJpbnRmKCJcbkVycm9yIGNvdW50PT0weCUwOHgiLCBlcnJvcl9jb3VudCk7CgoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KVV9CT09UX0NNRCgKCWRkcl9zcGVjX3Rlc3QsCTgsCTEsCWRvX2Rkcl9zcGVjaWFsX3Rlc3QsCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXSBbc2l6ZV0gW3dyaXRlX3RpbWVzXSBbcmVhZCB0aW1lc10gW3BhdHRlcm5dIFtpbmNdLmRkcl9zcGVjX3Rlc3QgMSAweDEwODAwMDAgMHgyMDAwMDAgMSAgMyAxIDEgXG4iCik7CgppbnQgZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oaW50IGRkcl90ZXN0X3NpemUpCnsKI2RlZmluZSBURVNUX09GRlNFVCAgMC8vMFg0MDAwMDAwMAoJLy8gdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUitURVNUX09GRlNFVDsKCXVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoKCWVycm9yX2NvdW50PTA7CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCXRyYWluaW5nX3BhdHRlcm5fZmxhZz0wOwojZW5kaWYKCS8vLyoKCWlmICh0cmFpbmluZ19wYXR0ZXJuX2ZsYWcpCgl7CiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCWlmIChlcnJvcl9jb3VudCkKCQkJcmV0dXJuIDE7CgkJZWxzZQoJCQlyZXR1cm4gMDsKCX0KCWVsc2UKCXsKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCgkJZGRyX3Rlc3RfZ3hfdHJhaW5pbmdfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgoJfQoKCXsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBwYXR0ZXJuNCBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkNCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7Cgl9CgoJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCS8vaWYoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWc9PTEpCgl7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJaWYgKGVycm9yX2NvdW50KQoJCXJldHVybiBlcnJvcl9jb3VudDsKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7Cgl9CglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIGVycm9yX2NvdW50OwoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCQkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoJCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCXsKCQkJaWYgKGVycm9yX2NvdW50KQoJCQlyZXR1cm4gZXJyb3JfY291bnQ7CgkJCXByaW50ZigiXG4gc3RhcnQgY29weSB0ZXN0ICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJCWRkcl90ZXN0X2NvcHkoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLzIgKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CgkJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyK2Rkcl90ZXN0X3NpemUvMikpLCBkZHJfdGVzdF9zaXplLzIpOwoJCX0KCX0KCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cgl9CgoKCmludCBkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybl9xdWlja19yZXRydW4oaW50IGRkcl90ZXN0X3NpemUpCnsKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7CgkjZGVmaW5lIFRFU1RfT0ZGU0VUICAwLy8wWDQwMDAwMDAwCgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSK1RFU1RfT0ZGU0VUOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyPXRlc3Rfc3RhcnRfYWRkcjsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnPTE7CgoJZXJyb3JfY291bnQ9MDsKCgkjaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQl0cmFpbmluZ19wYXR0ZXJuX2ZsYWc9MDsKCSNlbmRpZgoJLy8vKgoJaWYgKHRyYWluaW5nX3BhdHRlcm5fZmxhZykKCXsKCSNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkjZW5kaWYKCWlmIChlcnJvcl9jb3VudCkKCQlyZXR1cm4gMTsKCWVsc2UKCQlyZXR1cm4gMDsKCX0KCWVsc2UKCXsKCSNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9CQUJZKQoJCWRkcl90ZXN0X2d4X3RyYWluaW5nX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkjZW5kaWYKCX0KCS8vCQkJKi8KCS8qCglkZHJfdGVzdF9neF9jcm9zc190YWxrX3BhdHRlcm4oIGRkcl90ZXN0X3NpemUpOwoJaWYgKGVycm9yX2NvdW50KQoJcmV0dXJuIDE7CgllbHNlCglyZXR1cm4gMDsKCSovCgoJewoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGUoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCgkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgcGF0dGVybjQgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJCWRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoKCQlwcmludGYoIlxuU3RhcnQgKjQgbm8gY3Jvc3MgdGFsayBwYXR0ZXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcbkVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXG5FbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCX0KCS8vaWYoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWc9PTEpCgl7CgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkJLy8gICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgIHByaW50ZigiXHJFbmQgM3JkIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCgkJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CgkJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbigodm9pZCAqKXN0YXJ0X2FkZHIsIGRkcl90ZXN0X3NpemUpOwoJCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCgl9CgoJewoJCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIHAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCQkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCQlwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCQlkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCQlwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopc3RhcnRfYWRkciwgZGRyX3Rlc3Rfc2l6ZSk7CgkgLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgkJaWYgKGNvcHlfdGVzdF9mbGFnKQoJCXsKCQkJcHJpbnRmKCJcbiBzdGFydCBjb3B5IHRlc3QgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCQkJZGRyX3Rlc3RfY29weSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUvMiApOwoJCQlkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcitkZHJfdGVzdF9zaXplLzIpKSwgZGRyX3Rlc3Rfc2l6ZS8yKTsKCQkJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIrZGRyX3Rlc3Rfc2l6ZS8yKSksIGRkcl90ZXN0X3NpemUvMik7CgkJfQoKCX0KCglpZiAoZXJyb3JfY291bnQpCgkJcmV0dXJuIDE7CgllbHNlCgkJcmV0dXJuIDA7Cn0KCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCmludCBkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgZHFzIHdpbmRvdyBzdGVwIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXA9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfbGFuZT0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X21pbl9tYXhfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19vcmc9MDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnQ9MDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0PTA7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49MDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj0wOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJLy8gICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9URVNUX1NJWkU7Ly9ERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2JfZW4gPSAxOwoJCX0KCQllbHNlCgkJewoJCQlnb3RvIHVzYWdlOwoJCX0KCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9URVNUX1NJWkU7CgkJfQoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJdGVzdF9sYW5lX3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9Cgl9CglpZiAodGVzdF9sYW5lX3N0ZXAgPjcpCgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CglpZiAoYXJnYyA+NSkgewoJCXRlc3RfbWluX21heF9mbGFnID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X21pbl9tYXhfZmxhZyA9IDA7CgkJfQoJCWVsc2UKCQl7CgkJCS8vdGVzdF9taW5fbWF4X2ZsYWcgPTE7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXI9MDsKCWlmIChhcmdjID42KSB7CgkJdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyID0gMDsKCQl9CgkJZWxzZQoJCXsKCQkJLy90ZXN0X21pbl9tYXhfZmxhZyA9MTsKCQl9Cgl9CglzdGlja3lfcmVnX2Jhc2VfYWRkPShERFIwX1BVQl9SRUdfQkFTRSYweGZmZmYwMDAwKSsoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09IDB4JTA4eFxuIiwgdGVzdF9sYW5lX3N0ZXApOwoJcHJpbnRmKCJcbnRlc3RfbWluX21heF9mbGFnPT0gMHglMDh4XG4iLCB0ZXN0X21pbl9tYXhfZmxhZyk7CglwcmludGYoIlxudGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXI9PSAweCUwOHhcbiIsIHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKTsKCgljb25zdCBjaGFyICp0ZW1wX3M7CgljaGFyICplbnZfbGNkbHJfdGVtcF9jb3VudDsKCWNoYXIgKmJ1ZjsKCWJ1Zj0iIjsKCXVuc2lnbmVkIGludCBsY2Rscl90ZW1wX2NvdW50PTA7CgllbnZfbGNkbHJfdGVtcF9jb3VudD0ibGNkbHJfdGVtcF9jb3VudCI7CgoJaWYodGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpCgl7CgkJbGNkbHJfdGVtcF9jb3VudD1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCX0KCWVsc2UKCXsKCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJaWYodGVtcF9zKQoJCXsKCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQl9CgkJZWxzZQoJCXsKCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCX0KCX0KCQkJCgkvL2lmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJLy9pZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCmZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCnsKCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQl7CgkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJfQoJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJewoJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCX0KCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJewoJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCX0KCgkJewoJCQlwcmludGYoIlxuc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHgsaWYgbm8gcGF1c2UgZGRsICx3cml0ZSBsY2RsciBzb21lIHRpbWUgbWF5IG9jY291ciBlcnJvclxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQl3cml0ZWwoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKXwoMTw8MjkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCXByaW50ZigiXG4gcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQlpZiggY2hhbm5lbF9iX2VuKQoJCQl7CgkJCQlwcmludGYoIlxuZGRyMSBzaG91bGQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eCxpZiBubyBwYXVzZSBkZGwgLHdyaXRlIGxjZGxyIHNvbWUgdGltZSBtYXkgb2Njb3VyIGVycm9yXG4iLCByZWFkbChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQl3cml0ZWwoKHJlYWRsKEREUjFfUFVCX1JFR19CQVNFKzQpKXwoMTw8MjkpLChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQlwcmludGYoIlxuIGRkcjEgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQl9CgkJCWlmICh0ZXN0X2xhbmVfc3RlcD44KQoJCQkJdGVzdF9sYW5lX3N0ZXA9MDsKCQkJcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0weCUwOHhcbiAiLHRlc3RfbGFuZV9zdGVwKTsKCgkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfbGFuZV9zdGVwPj4xKTsKCQkJdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPXRlc3RfbGFuZV9zdGVwJTI7CgkJCXRlc3RpbmdfbGFuZT0odGVzdF9sYW5lX3N0ZXA+PjEpOwoKCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1yZWFkbChyZWdfYWRkKTsKCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCXByaW50ZigiXG5yZWdfYWRkXzB4JTA4eD09MHglMDh4XG4gIixyZWdfYWRkLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCWlmICh0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCXsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYwMCk+PjgpOwoJCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKSYweDAwZmYpPj4wKTsKCQkJCWRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQl9CgkJCSNlbmRpZgoKCQkJaWYgKCh0ZXN0X21pbl9tYXhfZmxhZyA9PSAwKXx8KCAodGVzdF9taW5fbWF4X2ZsYWcgPT0gMikpKQoJCQl7CgkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQoJCQkJewoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoKCQkJCQl7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJcHJpbnRmKCAiJXNcbiIsIGJ1Zik7CgkJCQkJCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJCQkJCQl7CgkJCQkJCQl3cml0ZWwobGNkbHJfdGVtcF9jb3VudCwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJcHJpbnRmKCJcbiBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJewoJCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwoJCQkJCSNlbHNlCgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCSNlbmRpZgoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwxNil8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYpKSxyZWdfYWRkKTsKCQkJCQkjZW5kaWYKCQkJCQl9CgkJCQkJcHJpbnRmKCJcbiBybWluIHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJcHJpbnRmKCJcbmxlZnQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQlpZiAodGVzdF90aW1lcyA9PSAwKQoJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPWRxX2xjZF9iZGxfcmVnX2xlZnQ7CgkJCQlpZiAoZHFfbGNkX2JkbF9yZWdfbGVmdD5kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbikgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQl7CgkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49ZHFfbGNkX2JkbF9yZWdfbGVmdAk7CgkJCQl9CgkJCX0gCgkJCWVsc2UKCQkJewoJCQkJcHJpbnRmKCJcbiBsZWZ0IGVkZ2Ugc2tpcCBcbiIpOwoJCQl9CgoJCQlpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQkJewoJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwoJCQkJI2Vsc2UKCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJI2VuZGlmCgkJCQkvLyAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDgpfChkcV9sY2RfYmRsX3JlZ19vcmc8PDE2KXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZikpLHJlZ19hZGQpOwoJCQkJI2Vsc2UKCQkJCSNlbmRpZgoJCQkJLy8JICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJLy8JICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CgkJCX0KCgkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfb3JnOwoKCQkJcHJpbnRmKCJcbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCgoJCQlpZiAoKHRlc3RfbWluX21heF9mbGFnID09IDApfHwgKHRlc3RfbWluX21heF9mbGFnID09IDEpKQoJCQl7CgkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTxEUUxDRExSX01BWCkKCQkJCXsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCgoJCQkJCWxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCXByaW50ZiggIiVzXG4iLCBidWYpOwoJCQkJCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJCQkJCXsKCQkJCQkJd3JpdGVsKGxjZGxyX3RlbXBfY291bnQsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJcHJpbnRmKCJcbiByaWcgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQlpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQkJCQl7CgkJCQkJCS8vd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKCQkJCQkJI2Vsc2UKCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwoJCQkJCQkjZW5kaWYKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwxNil8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYpKSxyZWdfYWRkKTsKCQkJCQkJI2VuZGlmCgkJCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKCQkJCQl9CgkJCQkJcHJpbnRmKCJcbiByIG1heCByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCS8vcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCWlmICh0ZXN0X3RpbWVzID09IDApCgkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPWRxX2xjZF9iZGxfcmVnX3JpZ2h0OwoJCQkJaWYgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0PGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbikgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQl7CgkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPWRxX2xjZF9iZGxfcmVnX3JpZ2h0CTsKCQkJCX0KCQkJfQoKCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCXsKCQkJCS8vIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkjaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfcmVnX29yZzw8MCl8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmZmZjAwKSkscmVnX2FkZCk7CgkJCQkjZWxzZQoJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkjZW5kaWYKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDw4KXwoZHFfbGNkX2JkbF9yZWdfb3JnPDwxNil8KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYpKSxyZWdfYWRkKTsKCQkJCSNlbmRpZgoJCQkJLy8gCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCQl9CgkJCXByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgkJCXByaW50ZigiXG5lbmQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQl3cml0ZWwoKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSkmKH4oMTw8MjkpKSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJcHJpbnRmKCJcbiByZXN1bWUgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCX0KCX0KCn0KCglkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW48PDE2KXxkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJewoJCWlmKGNoYW5uZWxfYV9lbikKCQl7CgkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfb3JnOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMSkKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJCWlmIChjaGFubmVsX2JfZW4pCgkJewoJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9iW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCX0KCX0KCWVsc2UKCXsKCQlpZiAoY2hhbm5lbF9hX2VuKSB7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJCWlmIChjaGFubmVsX2JfZW4pIHsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19iW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfb3JnOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMSkKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQl9Cgl9CgoJcmV0dXJuIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rxc19zdGVwLAk3LAkxLAlkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAsCgkiZGRyX3R1bmVfZHFzX3N0ZXAgZnVuY3Rpb24iLAoJImRkcl90dW5lX2Rxc19zdGVwIGEgMCAweDgwMDAwIDMgb3IgZGRyX3R1bmVfZHFzX3N0ZXAgYiAwIDB4ODAwMDAgNSBcbiBkY2FjaGUgb2ZmID8gXG4iCik7CiNlbHNlCgppbnQgZG9fZGRyX3Rlc3RfZmluZV90dW5lX2RxcyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUdW5lIGRkciBkcXMgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCiNkZWZpbmUgIERBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIICAxMgoKI2RlZmluZSAgREFUWDhfRFFfTEFORV9XSURUSCAgNAojZGVmaW5lICBDSEFOTkVMX0NIQU5ORUxfV0lEVEggIDIKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKCgoKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDAgIDAKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDEgIDEKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDIgIDIKI2RlZmluZSAgREFUWDhfRFFfTEFORV9MQU5FMDMgIDMKCiNkZWZpbmUgIERBVFg4X0RRX0JETFIwICAwCiNkZWZpbmUgIERBVFg4X0RRX0JETFIxICAxCiNkZWZpbmUgIERBVFg4X0RRX0JETFIyICAyCiNkZWZpbmUgIERBVFg4X0RRX0JETFIzICAzCiNkZWZpbmUgIERBVFg4X0RRX0JETFI0ICA0CiNkZWZpbmUgIERBVFg4X0RRX0JETFI1ICA1CiNkZWZpbmUgIERBVFg4X0RRX0JETFI2ICA2CiNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMCAgICAgNwojZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjEgICAgIDgKI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIyICAgICA5CiNkZWZpbmUgIERBVFg4X0RRX0RYTk1ETFIgICAgICAgIDEwCiNkZWZpbmUgIERBVFg4X0RRX0RYTkdUUiAgICAgICAgICAxMQoKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCiNkZWZpbmUgIERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCAgREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgqREFUWDhfRFFfTEFORV9XSURUSAojZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU0gICAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKkNIQU5ORUxfQ0hBTk5FTF9XSURUSAoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX29yZ1tEUV9MQ0RfQkRMX1JFR19OVU1dOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRbRFFfTENEX0JETF9SRUdfTlVNXTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2luZGV4W0RRX0xDRF9CRExfUkVHX05VTV07CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbltEUV9MQ0RfQkRMX1JFR19OVU1dOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXI7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3M7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW47Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluOwoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbG9vcCA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJewoJCQl0ZXN0X2xvb3AgPSAxMDAwMDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjUpIHsKCQl0cmFpbmluZ19wYXR0ZXJuX2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRyYWluaW5nX3BhdHRlcm5fZmxhZyA9IDA7CgkJfQoJCWVsc2UgaWYodHJhaW5pbmdfcGF0dGVybl9mbGFnKQoJCQl0cmFpbmluZ19wYXR0ZXJuX2ZsYWcgPSAxOwoKCgl9CgoKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCXByaW50ZigiXHRyYWluaW5nX3BhdHRlcm5fZmxhZz09IDB4JTA4eFxuIiwgdHJhaW5pbmdfcGF0dGVybl9mbGFnKTsKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgoKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKCQkJCXsKCgkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqO30KCgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFCRExSMCtyZWdfYmFzZV9hZGo7fQoKCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJCRExSMCtyZWdfYmFzZV9hZGo7fQoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzQkRMUjArcmVnX2Jhc2VfYWRqO30KCgoKCQkJCQlmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCk7KHRlbXBfY291bnRfaisrKSkKCQkJCQl7CgkJCQkJCWRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdPXJlYWRsKHJlZ19hZGQrNCp0ZW1wX2NvdW50X2opOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdPXJlZ19hZGQrNCp0ZW1wX2NvdW50X2o7CgkJCQkJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCs0KnRlbXBfY291bnRfaiksIChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXSkpOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCgkJCQkJCQk9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CgkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdCgkJCQkJCQk9ZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal07CgoJCQkJCX0KCQkJCX0KCgkJCX0KCgkJfQoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoKCQkJCWZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCgkJCQl7CgkJCQkJeyBwcmludGYoIlxudGVzdCBsYW5lPT0weCUwOHhcbiAiLHRlbXBfY291bnRfaSk7CgoJCQkJCQlpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2Fkajt9CgoJCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgkJCQkJCXsKCQkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgxQkRMUjArcmVnX2Jhc2VfYWRqO30KCgkJCQkJCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgkJCQkJCXsKCQkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgyQkRMUjArcmVnX2Jhc2VfYWRqO30KCQkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYM0JETFIwK3JlZ19iYXNlX2Fkajt9CgkJCQkJfQoKCQkJCQlmb3IgKCh0ZW1wX2NvdW50X2s9MCk7KHRlbXBfY291bnRfazwyKTsodGVtcF9jb3VudF9rKyspKQoJCQkJCXsKCgkJCQkJCWlmICh0ZW1wX2NvdW50X2sgPT0gMCkKCQkJCQkJewojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShyZWFkbChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMS1ERFIwX1BVQl9EWDBCRExSMCkpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShyZWFkbChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMS1ERFIwX1BVQl9EWDBCRExSMCkpJkRRTENETFJfTUFYOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0ocmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjMtRERSMF9QVUJfRFgwQkRMUjApKSZEUUxDRExSX01BWDsKCQkJCQkJCS8vICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNuZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMDAwKSk+PjE2OwojZWxzZQoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoJCQkJCQkJLy8gIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc25kPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwMDApKT4+MTY7CiNlbmRpZgoKCQkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ+MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQtLTsKCQkJCQkJCQlwcmludGYoIlxud2RxZCBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjApKTsKI2Vsc2UKCQkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKI2VuZGlmCgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKys7CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG53ZHFkIGxlZnQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkvL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZAoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlpZiAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPihkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZikpICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQkJewoJCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KCQkJCQkJCQkJPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmZmZjAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpCTsKCQkJCQkJCX0KCgoJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKCgkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPDB4ZmYpCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKys7CgkJCQkJCQkJcHJpbnRmKCJcbndkcWQgcmlnIHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkLS07CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxud2RxZCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCS8vb25seSB1cGRhdGUgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ8KGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCQl7CgkJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KCQkJCQkJCQkJPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmZmZjAwKXxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpCTsKCQkJCQkJCX0KCgoKCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCgkJCQkJCX0KCQkJCQkJZWxzZSBpZih0ZW1wX2NvdW50X2s9PTEpCgkJCQkJCXsKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz1yZWFkbChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZik7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwKSk+Pjg7CgoJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q+MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkLS07CgkJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQl7CgkJCQkJCQkJCS8vcHJpbnRmKCJcbnJkcXNkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxucmRxc2QgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIGxlZnQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkIHJkcXNuZAoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q+KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJCXsKCQkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCgkJCQkJCQkJCT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSkJOwoJCQkJCQkJfQoKCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz1yZWFkbChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZik7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwKSk+Pjg7CgoJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8MHhmZikKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkKys7CgkJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG5yZHFzZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkLS07CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXByaW50ZigiXG5yZHFzZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCS8vb25seSB1cGRhdGUgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCByZHFzbmQKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwMDBmZil8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8KChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJCXsKCQkJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQoJCQkJCQkJCQk9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZil8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpCTsKCQkJCQkJCX0KCgoKCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCgoKCQkJCQkJfQoKCQkJCQl9CgkJCQl9CgoJCQl9CgkJfQoKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCgoKCgkJLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQoJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQl7CgkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCXsKCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJfQoJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2FkajsKCgoJCQlmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwpOyh0ZW1wX2NvdW50X2orKykpCgkJCXsKCQkJCS8vICBkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdPXJlZ19hZGQrNCp0ZW1wX2NvdW50X2o7CgoJCQkJcHJpbnRmKCJcbiBvcmcgYWRkICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pLCAoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJCQl9CgoJCQlmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwpOyh0ZW1wX2NvdW50X2orKykpCgkJCXsKCQkJCXByaW50ZigiXG4gbGVmIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSk7CgkJCX0KCgkJCWZvciAoKHRlbXBfY291bnRfaj0wKTsodGVtcF9jb3VudF9qPERRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCk7KHRlbXBfY291bnRfaisrKSkKCQkJewoJCQkJcHJpbnRmKCJcbiByaWcgYWRkICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pLCAoZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSk7CgkJCX0KCgkJCXByaW50ZigiXG4gZGRydGVzdCBzaXplID09MHglMDh4LCB0ZXN0IHRpbWVzPT0weCUwOHgsdGVzdF9sb29wPT0weCUwOHhcbiIsZGRyX3Rlc3Rfc2l6ZSwodGVzdF90aW1lcysxKSx0ZXN0X2xvb3ApOwoJCQlwcmludGYoIlxuIGFkZCAgMHgwMDAwMDAwMCByZWc9PSAgICBvcmcgICAgICAgICAgIGxlZiAgICAgICAgICAgcmlnICAgICAgICAgICBjZW50ZXIgICAgICAgIHdpbiAgICAgICAgICAgbGVmX20gICAgICAgICByaWdfbSAgICAgICAgIG1pbl9jICAgICAgICAgbWluX3dpbiAgICAgICAgXG4iKTsKCQkJZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKCQkJewoJCQkJewoKCQkJCQlpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoKCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMUJETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9CgoJCQkJCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2FkaitEQVRYOF9EUV9EWE5MQ0RMUjEqNDt9CgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDNCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoJCQkJfQoKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPShkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pOwoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc9KGRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pOwoKCQkJCWlmICh0ZXN0X3RpbWVzID09IDApCgkJCQl7CgkJCQkJKGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pPWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJCQkJCShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk9ZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgoJCQkJfQoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPShkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT0oZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pOwoKCgkJCQkvL2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYweDAwMDBmZik7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcj0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmJjB4ZmYpKyhkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZyYweGZmKSkvMikKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjgpJjB4ZmYpKygoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjgpJjB4ZmYpKS8yKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjE2KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj44KSYweGZmKSkvMik8PDE2KSApOwoKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93cz0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnJjB4ZmYpLShkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZiYweGZmKSkpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj44KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSkpPDw4KQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+MTYpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY+PjgpJjB4ZmYpKSk8PDE2KSApOwoKCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcl9taW49KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZikrKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKSkvMikKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZikpLzIpPDw4KQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjE2KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT4+OCkmMHhmZikpLzIpPDwxNikgKTsKCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpLShkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZikpKQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpLSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSkpPDw4KQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjE2KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikpKTw8MTYpICk7CgoJCQkJcHJpbnRmKCJcbiBhZGQgIDB4JTA4eCByZWc9PSAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eFxuIiwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pLAoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcixkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3MsCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluLGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW4KCQkJCQkgICk7CgkJCX0KCgoJCX0KCgl9CgoKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kcXMsCTYsCTEsCWRvX2Rkcl90ZXN0X2ZpbmVfdHVuZV9kcXMsCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kcXMgYSAwIDB4ODAwMDAgMyBvciBkZHJfdHVuZV9kcXMgYiAwIDB4ODAwMDAgNSBvciBkZHJfdHVuZV9kcXMgYSBiIDB4ODAwMDAgbFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKCgoKaW50IGRvX2Rkcl90ZXN0X2Rxc193aW5kb3dfc3RlcChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciB0ZXN0IGRkciBkcXMgd2luZG93IHN0ZXAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXA9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RpbmdfbGFuZT0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X21pbl9tYXhfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0PTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodD0wOwoKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj0wOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPTA7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJLy8gICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCgoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJdGVzdF9sYW5lX3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9Cgl9CglpZiAodGVzdF9sYW5lX3N0ZXAgPjcpCgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CglpZiAoYXJnYyA+NSkgewoKCQl0ZXN0X21pbl9tYXhfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9taW5fbWF4X2ZsYWcgPSAwOwoJCX0KCQllbHNlCgkJewoJCQkvL3Rlc3RfbWluX21heF9mbGFnID0xOwoJCX0KCX0KCXVuc2lnbmVkIGludCAgIHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyPTA7CglpZiAoYXJnYyA+NikgewoKCQl0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIgPSAwOwoJCX0KCQllbHNlCgkJewoJCQkvL3Rlc3RfbWluX21heF9mbGFnID0xOwoJCX0KCX0KCXN0aWNreV9yZWdfYmFzZV9hZGQ9KEREUjBfUFVCX1JFR19CQVNFJjB4ZmZmZjAwMDApKygoRE1DX1NUSUNLWV8wKSYweGZmZmYpOwoKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0gMHglMDh4XG4iLCB0ZXN0X2xhbmVfc3RlcCk7CglwcmludGYoIlxudGVzdF9taW5fbWF4X2ZsYWc9PSAweCUwOHhcbiIsIHRlc3RfbWluX21heF9mbGFnKTsKCXByaW50ZigiXG50ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3Rlcj09IDB4JTA4eFxuIiwgdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpOwoKCWNvbnN0IGNoYXIgKnRlbXBfczsKCWNoYXIgKmVudl9sY2Rscl90ZW1wX2NvdW50OwoJY2hhciAqYnVmOwoJYnVmPSIiOwoJdW5zaWduZWQgaW50IGxjZGxyX3RlbXBfY291bnQ9MDsKCWVudl9sY2Rscl90ZW1wX2NvdW50PSJsY2Rscl90ZW1wX2NvdW50IjsKCglpZih0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlcikKCXtsY2Rscl90ZW1wX2NvdW50PXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJfQoJZWxzZQoJewoKCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJaWYodGVtcF9zKQoJCXsKCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQl9CgkJZWxzZQoJCXtsY2Rscl90ZW1wX2NvdW50PTA7CgkJfQoJfQoKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCWZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCgoKCQkJCXsKCQkJCQlwcmludGYoIlxuc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHgsaWYgbm8gcGF1c2UgZGRsICx3cml0ZSBsY2RsciBzb21lIHRpbWUgbWF5IG9jY291ciBlcnJvclxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCXdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQlwcmludGYoIlxuIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQlpZiggY2hhbm5lbF9iX2VuKQoJCQkJCXsJcHJpbnRmKCJcbmRkcjEgc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHgsaWYgbm8gcGF1c2UgZGRsICx3cml0ZSBsY2RsciBzb21lIHRpbWUgbWF5IG9jY291ciBlcnJvclxuIiwgcmVhZGwoRERSMV9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCQl3cml0ZWwoKHJlYWRsKEREUjFfUFVCX1JFR19CQVNFKzQpKXwoMTw8MjkpLChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJCXByaW50ZigiXG4gZGRyMSBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJfQoJCQkJCWlmICh0ZXN0X2xhbmVfc3RlcD44KQoJCQkJCQl0ZXN0X2xhbmVfc3RlcD0wOwoJCQkJCXByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09MHglMDh4XG4gIix0ZXN0X2xhbmVfc3RlcCk7CgoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfbGFuZV9zdGVwPj4xKTsKCQkJCQl0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9dGVzdF9sYW5lX3N0ZXAlMjsKCQkJCQl0ZXN0aW5nX2xhbmU9KHRlc3RfbGFuZV9zdGVwPj4xKTsKCQkJCQlpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQkJCQl7cmVnX2FkZD1yZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMS1ERFIwX1BVQl9EWDBCRExSMDsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCXJlZ19hZGQ9cmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjEtRERSMF9QVUJfRFgwQkRMUjA7CiNlbHNlCgkJCQkJCXJlZ19hZGQ9cmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjMtRERSMF9QVUJfRFgwQkRMUjA7CiNlbmRpZgoKCQkJCQl9CgoJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9cmVhZGwocmVnX2FkZCk7CgkJCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJcHJpbnRmKCJcbnJlZ19hZGRfMHglMDh4PT0weCUwOHhcbiAiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCWlmICh0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJe2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KCgocmVhZGwocmVnX2FkZCkpJjB4ZmYwMCk+PjgpOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19vcmc9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXtkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKSYweDAwZmYpPj4wKTsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfb3JnPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJfQojZW5kaWYKCgkJCQkJaWYgKCh0ZXN0X21pbl9tYXhfZmxhZyA9PSAwKXx8KCAodGVzdF9taW5fbWF4X2ZsYWcgPT0gMikpKQoJCQkJCXsKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+MCkKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoKCQkJCQkJCXsKCQkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCQlwcmludGYoICIlc1xuIiwgYnVmKTsKCQkJCQkJCQlpZih0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlcikKCQkJCQkJCQl7CgkJCQkJCQkJCXdyaXRlbChsY2Rscl90ZW1wX2NvdW50LChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlCgkJCQkJCQkJewoJCQkJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoKCgkJCQkJCQlwcmludGYoIlxuIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQkJCQkJewojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwojZW5kaWYKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CiNlbHNlCgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKI2VuZGlmCgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuIHJtaW4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcHJpbnRmKCJcbiBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5sZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoKCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQlpZiAodGVzdF90aW1lcyA9PSAwKQoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49ZHFfbGNkX2JkbF9yZWdfbGVmdDsKCQkJCQkJaWYgKGRxX2xjZF9iZGxfcmVnX2xlZnQ+ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW4pICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQl7CgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj1kcV9sY2RfYmRsX3JlZ19sZWZ0CTsKCQkJCQkJfQoJCQkJCX0gZWxzZQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbiBsZWZ0IGVkZ2Ugc2tpcCBcbiIpOwoJCQkJCX0KCgkJCQkJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJewojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3JlZ19vcmc8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwojZW5kaWYKCQkJCQkJLy8gIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfcmVnX29yZzw8OCl8KGRxX2xjZF9iZGxfcmVnX29yZzw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CiNlbHNlCgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKI2VuZGlmCgkJCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKCQkJCQkJLy8JICB3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CgkJCQkJfQoKCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX29yZzsKCgkJCQkJcHJpbnRmKCJcbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCgoJCQkJCWlmICgodGVzdF9taW5fbWF4X2ZsYWcgPT0gMCl8fCAodGVzdF9taW5fbWF4X2ZsYWcgPT0gMSkpCgkJCQkJewoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTxEUUxDRExSX01BWCkKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoKCgkJCQkJCQl7CgkJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQkJcHJpbnRmKCAiJXNcbiIsIGJ1Zik7CgkJCQkJCQkJaWYodGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpCgkJCQkJCQkJewoJCQkJCQkJCQl3cml0ZWwobGNkbHJfdGVtcF9jb3VudCwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCXByaW50ZigiXG4gcmlnIHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQlpZiAoIXRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZykKCQkJCQkJCXsKCQkJCQkJCQkvL3dyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PDApfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmZmYwMCkpLHJlZ19hZGQpOwojZWxzZQoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQpOwojZW5kaWYKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCQkJd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CiNlbHNlCgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKI2VuZGlmCgkJCQkJCQkJLy8JICB3cml0ZWwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSxyZWdfYWRkKTsKCQkJCQkJCQkvLwkgIHdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMyk7CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuIHIgbWF4IHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJaWYgKHRlc3RfdGltZXMgPT0gMCkKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodDsKCQkJCQkJaWYgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0PGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbikgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCXsKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbj1kcV9sY2RfYmRsX3JlZ19yaWdodAk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmICghdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnKQoJCQkJCXsKCQkJCQkJLy8gd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCQkJCXdyaXRlbCgoZHFfbGNkX2JkbF9yZWdfb3JnPDwwKXwoKChyZWFkbChyZWdfYWRkKSkmMHhmZmZmMDApKSxyZWdfYWRkKTsKI2Vsc2UKCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkKTsKI2VuZGlmCgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCQl3cml0ZWwoKGRxX2xjZF9iZGxfcmVnX29yZzw8OCl8KGRxX2xjZF9iZGxfcmVnX29yZzw8MTYpfCgoKHJlYWRsKHJlZ19hZGQpKSYweGZmKSkscmVnX2FkZCk7CiNlbHNlCgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjQtRERSMF9QVUJfRFgwTENETFIzKTsKI2VuZGlmCgkJCQkJCS8vIAkgIHdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgkJCQkJCS8vCSAgd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZyxyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjMpOwoJCQkJCX0KCgkJCQkJcHJpbnRmKCJcbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQlwcmludGYoIlxuZW5kIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQl3cml0ZWwoKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSkmKH4oMTw8MjkpKSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQlwcmludGYoIlxuIHJlc3VtZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQl9CgoKCgkJCX0KCQl9CgoJfQoKCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjw8MTYpfGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJaWYgKCF0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgl7aWYoY2hhbm5lbF9hX2VuKXsKCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfb3JnOwoJCQkJCQkgaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJCQkJIGlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCQkJCSB9CglpZiAoY2hhbm5lbF9iX2VuKQoJewoJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19iW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfb3JnOwoJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAxKQoJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCX0KCX0KCWVsc2UKCXsKCQlpZiAoY2hhbm5lbF9hX2VuKSB7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pbjsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbdGVzdGluZ19sYW5lXT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW47CgkJfQoJCWlmIChjaGFubmVsX2JfZW4pIHsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19iW3Rlc3RpbmdfbGFuZV09ZHFfbGNkX2JkbF9yZWdfb3JnOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMSkKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYlt0ZXN0aW5nX2xhbmVdPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQl9Cgl9CgoJcmV0dXJuIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KCi8vLyoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rxc19zdGVwLAk3LAkxLAlkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAsCgkiZGRyX3R1bmVfZHFzX3N0ZXAgZnVuY3Rpb24iLAoJImRkcl90dW5lX2Rxc19zdGVwIGEgMCAweDgwMDAwIDMgb3IgZGRyX3R1bmVfZHFzX3N0ZXAgYiAwIDB4ODAwMDAgNSBcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgoKCmV4dGVybiBpbnQgZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGludCBkZHJfdGVzdF9zaXplKTsKCgppbnQgZG9fZGRyX3Rlc3RfbGNkbHJfY2xrX3N0ZXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgbGNkbHIgY2xrIHN0ZXAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXA9MDsKCS8vIHVuc2lnbmVkIGludCAgIHRlc3RpbmdfbGFuZT0wOwoJLy8gdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X21pbl9tYXhfZmxhZz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0PTA7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodD0wOwoKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbj0wOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPTA7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJLy8gICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCgoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2xhbmVfc3RlcCA9IDA7CgkJdGVzdF9sYW5lX3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl9Cgl9CglpZiAodGVzdF9sYW5lX3N0ZXAgPjcpCgkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7CglpZiAoYXJnYyA+NSkgewoKCQl0ZXN0X21pbl9tYXhfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9taW5fbWF4X2ZsYWcgPSAwOwoJCX0KCQllbHNlCgkJewoJCQkvL3Rlc3RfbWluX21heF9mbGFnID0xOwoJCX0KCX0KCXVuc2lnbmVkIGludCAgIHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyPTA7CglpZiAoYXJnYyA+NikgewoKCQl0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3RlciA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIgPSAwOwoJCX0KCQllbHNlCgkJewoJCQkvL3Rlc3RfbWluX21heF9mbGFnID0xOwoJCX0KCX0KCXN0aWNreV9yZWdfYmFzZV9hZGQ9KEREUjBfUFVCX1JFR19CQVNFJjB4ZmZmZjAwMDApKygoRE1DX1NUSUNLWV8wKSYweGZmZmYpOwoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9sYW5lX3N0ZXA9PSAweCUwOHhcbiIsIHRlc3RfbGFuZV9zdGVwKTsKCXByaW50ZigiXG50ZXN0X21pbl9tYXhfZmxhZz09IDB4JTA4eFxuIiwgdGVzdF9taW5fbWF4X2ZsYWcpOwoJcHJpbnRmKCJcbnRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyPT0gMHglMDh4XG4iLCB0ZXN0X3RlbXBfdmFsdWVfdXNlX3N0aWNreV9yZWdpc3Rlcik7Cgljb25zdCBjaGFyICp0ZW1wX3M7CgljaGFyICplbnZfbGNkbHJfdGVtcF9jb3VudDsKCWNoYXIgKmJ1ZjsKCWJ1Zj0iIjsKCXVuc2lnbmVkIGludCBsY2Rscl90ZW1wX2NvdW50PTA7CgllbnZfbGNkbHJfdGVtcF9jb3VudD0ibGNkbHJfdGVtcF9jb3VudF9hIjsKCXVuc2lnbmVkIGludCBsY2Rscl9tYXg9MDsKCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJe2xjZGxyX3RlbXBfY291bnQ9cmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7Cgl9CgllbHNlCgl7CgoJCXRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQlpZih0ZW1wX3MpCgkJewoJCQlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCX0KCQllbHNlCgkJe2xjZGxyX3RlbXBfY291bnQ9MDsKCQl9Cgl9CgoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCgoJZm9yICh0ZXN0X3RpbWVzPTA7KHRlc3RfdGltZXM8dGVzdF9sb29wKTsodGVzdF90aW1lcysrKSkKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCgkJewoKCQkJewoKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoKCgoJCQkJewoJCQkJCXByaW50ZigiXG5zaG91bGQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eCxpZiBubyBwYXVzZSBkZGwgLHdyaXRlIGxjZGxyIHNvbWUgdGltZSBtYXkgb2Njb3VyIGVycm9yXG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCXByaW50ZigiXG4gcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJCWlmKCBjaGFubmVsX2JfZW4pCgkJCQkJewlwcmludGYoIlxuZGRyMSBzaG91bGQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eCxpZiBubyBwYXVzZSBkZGwgLHdyaXRlIGxjZGxyIHNvbWUgdGltZSBtYXkgb2Njb3VyIGVycm9yXG4iLCByZWFkbChERFIxX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQkJCXdyaXRlbCgocmVhZGwoRERSMV9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjFfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQkJcHJpbnRmKCJcbiBkZHIxIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjFfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQl9CgkJCQkJaWYgKHRlc3RfbGFuZV9zdGVwPjIpCgkJCQkJCXRlc3RfbGFuZV9zdGVwPTA7CgkJCQkJcHJpbnRmKCJcbnRlc3RfbGFuZV9zdGVwPT0weCUwOHhcbiAiLHRlc3RfbGFuZV9zdGVwKTsKCQkJCQlpZih0ZXN0X2xhbmVfc3RlcD09MCkKCQkJCQl7cmVnX2FkZD1ERFIwX1BVQl9BQ0xDRExSK3JlZ19iYXNlX2FkajsKCQkJCQkJbGNkbHJfbWF4PUFDTENETFJfTUFYOwoJCQkJCX0KCQkJCQlpZih0ZXN0X2xhbmVfc3RlcD09MSkKCQkJCQl7cmVnX2FkZD1ERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkajsKCQkJCQkJbGNkbHJfbWF4PUFDQkRMUl9NQVg7CgkJCQkJfQoKCgkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1yZWFkbChyZWdfYWRkKTsKCQkJCQlkcV9sY2RfYmRsX3JlZ19vcmc9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQlwcmludGYoIlxucmVnX2FkZF8weCUwOHg9PTB4JTA4eFxuICIscmVnX2FkZCxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCQkJaWYodGVzdF9sYW5lX3N0ZXA9PTApCgkJCQkJe2RxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KCgocmVhZGwocmVnX2FkZCkpJkFDTENETFJfTUFYKSk7CgkJCQkJCWRxX2xjZF9iZGxfcmVnX29yZz1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCX0KCQkJCQlpZih0ZXN0X2xhbmVfc3RlcD09MSkKCQkJCQl7ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKChyZWFkbChyZWdfYWRkKSkmQUNCRExSX01BWCkpOwoJCQkJCQlkcV9sY2RfYmRsX3JlZ19vcmc9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQl9CgoKCQkJCQlpZiAoKHRlc3RfbWluX21heF9mbGFnID09IDApfHwoICh0ZXN0X21pbl9tYXhfZmxhZyA9PSAyKSkpCgkJCQkJewoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQoJCQkJCQl7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgoJCQkJCQkJewoJCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJCXByaW50ZiggIiVzXG4iLCBidWYpOwoJCQkJCQkJCWlmKHRlc3RfdGVtcF92YWx1ZV91c2Vfc3RpY2t5X3JlZ2lzdGVyKQoJCQkJCQkJCXsKCQkJCQkJCQkJd3JpdGVsKGxjZGxyX3RlbXBfY291bnQsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJCX0KCgkJCQkJCQl9CgoKCgkJCQkJCQlwcmludGYoIlxuIGxlZnQgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCQl9CgoJCQkJCQkJcHJpbnRmKCJcbiBybWluIHJlYWQgcmVnPT0weCUwOHhcbiAiLChyZWFkbChyZWdfYWRkKSkpOwoJCQkJCQkJLy90ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkvLyNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCS8vICNlbHNlCgkJCQkJCQkvLyAgdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkvLyAgdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkvLyAgI2VuZGlmCgoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxubGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCgkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJaWYgKHRlc3RfdGltZXMgPT0gMCkKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPWRxX2xjZF9iZGxfcmVnX2xlZnQ7CgkJCQkJCWlmIChkcV9sY2RfYmRsX3JlZ19sZWZ0PmRxX2xjZF9iZGxfcmVnX2xlZnRfbWluKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJewoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49ZHFfbGNkX2JkbF9yZWdfbGVmdAk7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbiBsZWZ0IGVkZ2Ugc2tpcCBcbiIpOwoJCQkJCX0KCgoJCQkJCXsKCgkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmcscmVnX2FkZCk7CgoJCQkJCX0KCgkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19vcmc7CgoJCQkJCXByaW50ZigiXG4gcmVhZCByZWc9PTB4JTA4eFxuICIsKHJlYWRsKHJlZ19hZGQpKSk7CgoKCQkJCQlpZiAoKHRlc3RfbWluX21heF9mbGFnID09IDApfHwgKHRlc3RfbWluX21heF9mbGFnID09IDEpKQoJCQkJCXsKCQkJCQkJLy9pZih0ZXN0X2xhbmVfc3RlcD09MCkKCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8bGNkbHJfbWF4KQoJCQkJCQl7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQl7CgkJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQkJcHJpbnRmKCAiJXNcbiIsIGJ1Zik7CgkJCQkJCQkJaWYodGVzdF90ZW1wX3ZhbHVlX3VzZV9zdGlja3lfcmVnaXN0ZXIpCgkJCQkJCQkJewoJCQkJCQkJCQl3cml0ZWwobGNkbHJfdGVtcF9jb3VudCwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJCXByaW50ZigiXG4gcmlnIHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUscmVnX2FkZCk7CgkJCQkJCQl9CgoJCQkJCQkJcHJpbnRmKCJcbiByIG1heCByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQkJCS8vCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcHJpbnRmKCJcbiByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJCQlkcV9sY2RfYmRsX3JlZ19yaWdodD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQlpZiAodGVzdF90aW1lcyA9PSAwKQoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPWRxX2xjZF9iZGxfcmVnX3JpZ2h0OwoJCQkJCQlpZiAoZHFfbGNkX2JkbF9yZWdfcmlnaHQ8ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJewoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPWRxX2xjZF9iZGxfcmVnX3JpZ2h0CTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJewoJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnLHJlZ19hZGQpOwoJCQkJCX0KCgkJCQkJcHJpbnRmKCJcbiByZWFkIHJlZz09MHglMDh4XG4gIiwocmVhZGwocmVnX2FkZCkpKTsKCQkJCQlwcmludGYoIlxuZW5kIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQl3cml0ZWwoKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSkmKH4oMTw8MjkpKSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCQlwcmludGYoIlxuIHJlc3VtZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJCQl9CgoKCgkJCX0KCQl9CgoJfQoKCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjw8MTYpfGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoKCXtpZihjaGFubmVsX2FfZW4pewoJCQkJCQkgaWYodGVzdF9sYW5lX3N0ZXA9PTApCgkJCQkJCSB7CgkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJCQkJCSBpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMSkKCQkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQkJCQkJIGlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCQkJCQkgfQoJCQkJCQkgaWYodGVzdF9sYW5lX3N0ZXA9PTEpCgkJCQkJCSB7CgkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYT1kcV9sY2RfYmRsX3JlZ19vcmc7CgkJCQkJCQkgaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CgkJCQkJCQkgaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDIpCgkJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCQkJCQkgfQoJCQkJCSB9CglpZiAoY2hhbm5lbF9iX2VuKQoJewoJCWlmKHRlc3RfbGFuZV9zdGVwPT0wKQoJCXsKCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19iPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2I9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW47CgkJCWlmICh0ZXN0X21pbl9tYXhfZmxhZyAhPSAyKQoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9iPWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pbjsKCQl9CgkJaWYodGVzdF9sYW5lX3N0ZXA9PTEpCgkJewoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19iPWRxX2xjZF9iZGxfcmVnX29yZzsKCQkJaWYgKHRlc3RfbWluX21heF9mbGFnICE9IDEpCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9iPWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluOwoJCQlpZiAodGVzdF9taW5fbWF4X2ZsYWcgIT0gMikKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2I9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluOwoJCX0KCX0KCX0KCgoKCXJldHVybiBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgpVX0JPT1RfQ01EKAoJZGRyX3R1bmVfYWNsY2Rscl9zdGVwLAk3LAkxLAlkb19kZHJfdGVzdF9sY2Rscl9jbGtfc3RlcCwKCSJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgZnVuY3Rpb24iLAoJImRkcl90dW5lX2FjbGNkbHJfc3RlcCBhIDAgMHg4MDAwMCAzIG9yIGRkcl90dW5lX2FjbGNkbHJfc3RlcCBiIDAgMHg4MDAwMCA1IFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKCmludCBkb19kZHJfdGVzdF9kcXNfd2luZG93KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyZGRyX3Rlc3RfZHFzX3dpbmRvdyBmdW5jdGlvblxuIik7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoKCXVuc2lnbmVkIGludCAgIGxhbmVfc3RlcD0gMDsKCXVuc2lnbmVkIGludCAgIHJlZ192YWx1ZT0gMDsKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgljaGFyICplbmRwOwoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgoKCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCX0KCS8vYXJnYzI9NTsKCS8vZm9yKGkgPSAxO2k8KGFyZ2MpO2krKykKCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCX0KCgkvL2FyZ3YyWzBdPWFyZ3ZbMV07CgkvL2FyZ3YyWzFdPWFyZ3ZbMl07CgkvL2FyZ3YyWzJdPWFyZ3ZbM107CgkvLyNpbmNsdWRlIDxzdGRpby5oPgoJLy8gICB1bnNpZ25lZCBpbnQgICB3cl9hZGpfcGVyWzI0XSA7CglpZigxKQoJewoJCXByaW50ZigiXG50ZXN0IHVzZSB1Ym9vdCBlbnZcbiIpOwoJCXsKCQkJLy9jaGFyIHN0clsyNF07CgkJCWNvbnN0IGNoYXIgKnM7CgkJCXVuc2lnbmVkIGludCBzdHJfdG9fbnVtYXJyeVs0OF07CgkJCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCgkJCXVuc2lnbmVkIGludCAqbnVtX2Fycnk7CgkJCW51bV9hcnJ5ID0gKHVuc2lnbmVkIGludCAqKSgmc3RyX3RvX251bWFycnkpOwoJCQlpbnQgaTsKCQkJLy8gY2hhciAqdmFybmFtZTsKCQkJLy8gaW50IHZhbHVlPTA7CgoJCQkvLy92YXJuYW1lPSJlbnZfZGRydGVzdCI7CgkJCXMgPSBnZXRlbnYoImVudl93cl9sY2Rscl9wciIpOwoJCQlpZiAocykKCQkJey8vaT0wOwoJCQkJLy93aGlsZShzX3RlbXApCgkJCQl7CgkJCQkJZW52X3RvX251bSgiZW52X3dyX2xjZGxyX3ByIixudW1fYXJyeSk7Ly91bnNpZ25lZCBpbnQgKm51bV9hcnJ5CgoKCQkJCQlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoKCQkJCQkJcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksbnVtX2FycnlbaV0pOwoJCQkJCX0KCQkJCQkvLwlwcmludGYoIiVzLGxlbnRoPSVkIixzLChzdHJsZW4ocykpKTsKCQkJCQkvL3NzY2FuZihzLCJkJSwiLHdyX2Fkal9wZXIpOwoJCQkJCS8vc3ByaW50ZihzdHIsImQlIixzKTsKCQkJCQkvL2dldGMKCQkJCQkvLyAgICAgICBpZiAoc3RybGVuKHMpID4gMTYpIAoJCQkJCXsKCQkJCQkJLy8gICBzc2NhbmYocywgIiUwOHgsICUwOHgsICUwOHgsIFxuIiwKCQkJCQkJLy8gICAgICAgICAgJndyX2Fkal9wZXJbMF0sICZ3cl9hZGpfcGVyWzFdLCAmd3JfYWRqX3BlclsyXSk7CgkJCQkJfSAKCQkJCX0KCQkJfQoJCX0KCX0KCS8vIHVuc2lnbmVkIGludCA9IDAsIG1heCA9IDB4ZmYsIG1pbiA9IDB4MDA7CgkvKgoJICAgaWYoMCkKCSAgIHsKCSAgIHtwcmludGYoIlxudGVzdCB1c2UgdWJvb3QgZW52XG4iKTsKCSAgIHsKCS8vY2hhciBzdHJbMjRdOwoJY29uc3QgY2hhciAqczsKCgkvLyBjaGFyICp2YXJuYW1lOwoJaW50IHZhbHVlPTA7CgoJLy8vdmFybmFtZT0iZW52X2RkcnRlc3QiOwoJcyA9IGdldGVudigiZW52X3dyX2xjZGxyX3ByIik7CglpZiAocykKCXsvL2k9MDsKCS8vd2hpbGUoc190ZW1wKQoJewoJcHJpbnRmKCIlcyIscyk7CgkvL3NzY2FuZihzLCJkJSwiLHdyX2Fkal9wZXIpOwoJLy9zcHJpbnRmKHN0ciwiZCUiLHMpOwoJLy9nZXRjCglpZiAoc3RybGVuKHMpID4gMTYpIHsKCXNzY2FuZihzLCAiJTA4eCwgJTA4eCwgJTA4eCwgJTA4eCwgJTA4eFxuIiwKCSZ3cl9hZGpfcGVyW2ktMl0sICZtYXgsICZtaW4sICZ0eXBlX2gsICZ0eXBlX2wpOwoJfSBlbHNlIHsKCXNzY2FuZihidWYsICIlMDh4LCAlMDh4LCAlMDh4XG4iLAoJJnJlZywgJm1heCwgJm1pbik7Cgl9CgoJfQoJdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHMsICZlbmRwLCAxNik7CglwcmludGYoIiVkIix2YWx1ZSk7Cgl9CglzID0gZ2V0ZW52KCJlbnZfcmRfbGNkbHJfcHIiKTsKCglpZiAocykKCXsvL2k9MDsKCS8vd2hpbGUoc190ZW1wKQoJewoJcHJpbnRmKCIlcyIscyk7CgkvL3NzY2FuZihzLCJkJSwiLHJkX2Fkal9wZXIpOwoKCX0KCS8vdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHMsICZlbmRwLCAxNik7Cgl9CgoJLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKCS8vICBzZXRlbnYoImVudl9kZHJ0ZXN0Iiwgc3RyKTsKCgoJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7Cgl9CgoJaWYgKGFyZ2M+MjQrMikKCWFyZ2M9MjQrMjsKCWZvcihpID0gMjtpPGFyZ2M7aSsrKQoJewoJaWYoaTwoMisxMikpewoJd3JfYWRqX3BlcltpLTJdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDE2KTsKCX0KCWVsc2UKCXsKCXJkX2Fkal9wZXJbaS0xNF09c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2ldLCAmZW5kcCwgMTYpOwoJfQoJfQoKCgl9CglwcmludGYoIiBpbnQgd3JfYWRqX3BlclsxMl09e1xuIik7Cglmb3IoaSA9IDA7aTwxMjtpKyspCgl7CglwcmludGYoIiUwNGQgLFxuIix3cl9hZGpfcGVyW2ldKTsKfQpwcmludGYoIn07XG4iKTsKcHJpbnRmKCIgaW50IHJkX2Fkal9wZXJbMTJdPXtcbiIpOwpmb3IoaSA9IDA7aTwxMjtpKyspCnsKCXByaW50ZigiJTA0ZCAsXG4iLHJkX2Fkal9wZXJbaV0pOwp9CnByaW50ZigifTtcbiIpOwoKfQoqLwoKY2hhciBzdHJbMTAwXTsKCmlmIChjaGFubmVsX2FfZW4pCnsKCgkvLyooY2hhciAgICAgKikoYXJndjJbMF0pPSJhIjsKCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMTEgYSAwIDB4ODAwMDAgICIsMCk7CglwcmludGYoIlxudGVzdCBkcXMgd2luZG93IGxhbmUgYVxuIik7Cglmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw4KTsobGFuZV9zdGVwKyspKQoJewoJCS8vc3ByaW50Zihhcmd2MlszXSwiZCUiLCggbGFuZV9zdGVwKSk7CgkJLy9pdG9hX2Rkcl90ZXN0KGxhbmVfc3RlcCwoYXJndjJbM10pLDEwKTsKCQkvL3ByaW50ZigiXG5hcmd2MlslZF09JXNcbiIsMCxhcmd2MlswXSk7CgkJLy8JcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwzLGFyZ3YyWzNdKTsKCQkvLyByZWdfdmFsdWU9ZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19zdGVwKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXApKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCgl9Cn0KCgppZiAoY2hhbm5lbF9iX2VuKQp7Ly8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYiI7CgkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJcHJpbnRmKCJcbnRlc3QgZHFzIHdpbmRvdyBsYW5lIGJcbiIpOwoJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8OCk7KGxhbmVfc3RlcCsrKSkKCXsKCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHglMDh4ICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKSk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCgl9Cn0KCmlmIChjaGFubmVsX2FfZW4pCnsKCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgl7CgkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJbGFuZV9zdGVwLAoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXSwKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXSwKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF0sZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF0pOwoJfX0KaWYgKGNoYW5uZWxfYl9lbikKewoJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCXsKCQlwcmludGYoIlxuIGJfbGFuZV8weCUwOHh8d2RxX29yZyAweCUwOHggIHx3ZHFfbWluIDB4JTA4eCB8d2RxX21heCAweCUwOHggOjp8cmRxc19vcmcgIDB4JTA4eCAgfHJkcXNfbWluIDB4JTA4eCB8cmRxc19tYXggMHglMDh4ICBcbiIsCgkJCQlsYW5lX3N0ZXAsCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYltsYW5lX3N0ZXBdLAoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2JbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYltsYW5lX3N0ZXBdLAoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19iW2xhbmVfc3RlcF0sCgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2JbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2JbbGFuZV9zdGVwXSk7Cgl9fQoKcmV0dXJuIHJlZ192YWx1ZTsKfQoKLyoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rxc19zdGVwLAk1LAkxLAlkb19kZHJfdGVzdF9maW5lX3R1bmVfZHFzX3N0ZXAsCgkiZGRyX3R1bmVfZHFzX3N0ZXAgZnVuY3Rpb24iLAoJImRkcl90dW5lX2Rxc19zdGVwIGEgMCAweDgwMDAwMCAzIG9yIGRkcl90dW5lX2Rxc19zdGVwIGIgMCAweDgwMDAwMCA1IG9yIGRkcl90dW5lX2Rxc19zdGVwIGEgYiAweDgwMDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoqLwoKaW50IGRvX2Rkcl90ZXN0X2ZpbmVfdHVuZV9kcXNfc3RlcChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUdW5lIGRkciBkcXMgc3RlcCBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9qPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcD0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2NoYW5uZWwgPSAwOwoKI2RlZmluZSAgREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEggIDEyCgojZGVmaW5lICBEQVRYOF9EUV9MQU5FX1dJRFRIICA0CiNkZWZpbmUgIENIQU5ORUxfQ0hBTk5FTF9XSURUSCAgMgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMCAgMAojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMSAgMQojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMiAgMgojZGVmaW5lICBEQVRYOF9EUV9MQU5FX0xBTkUwMyAgMwoKI2RlZmluZSAgREFUWDhfRFFfQkRMUjAgIDAKI2RlZmluZSAgREFUWDhfRFFfQkRMUjEgIDEKI2RlZmluZSAgREFUWDhfRFFfQkRMUjIgIDIKI2RlZmluZSAgREFUWDhfRFFfQkRMUjMgIDMKI2RlZmluZSAgREFUWDhfRFFfQkRMUjQgIDQKI2RlZmluZSAgREFUWDhfRFFfQkRMUjUgIDUKI2RlZmluZSAgREFUWDhfRFFfQkRMUjYgIDYKI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIwICAgICA3CiNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMSAgICAgOAojZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjIgICAgIDkKI2RlZmluZSAgREFUWDhfRFFfRFhOTURMUiAgICAgICAgMTAKI2RlZmluZSAgREFUWDhfRFFfRFhOR1RSICAgICAgICAgIDExCgoKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMICBEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCpEQVRYOF9EUV9MQU5FX1dJRFRICiNkZWZpbmUgIERRX0xDRF9CRExfUkVHX05VTSAgICBEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwqQ0hBTk5FTF9DSEFOTkVMX1dJRFRICgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfb3JnW0RRX0xDRF9CRExfUkVHX05VTV07Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0W0RRX0xDRF9CRExfUkVHX05VTV07Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfaW5kZXhbRFFfTENEX0JETF9SRUdfTlVNXTsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0X21pbltEUV9MQ0RfQkRMX1JFR19OVU1dOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW0RRX0xDRF9CRExfUkVHX05VTV07CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNuZDsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZTsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkOwoKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7Cgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2NlbnRlcjsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93czsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbjsKCXVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW47CgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCQllbHNlCgkJewoJCQlnb3RvIHVzYWdlOwoJCX0KCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCgl9CglpZiAoYXJnYyA+NCkgewoJCXRlc3RfbGFuZV9zdGVwID0gMDsKCQl0ZXN0X2xhbmVfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCXsKCQkJdGVzdF9sYW5lX3N0ZXAgPSAwOwoJCX0KCX0KCXRlc3RfbG9vcD0xOwoKCXVuc2lnbmVkIGludCAgIHRlc3RfbWluX21heD0wOwoJaWYgKGFyZ2MgPjUpIHsKCgkJdGVzdF9taW5fbWF4ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X21pbl9tYXggPSAwOwoJCX0KCQllbHNlCgkJCXRlc3RfbWluX21heD0xOwoKCX0KCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xhbmVfc3RlcD09IDB4JTA4eFxuIiwgdGVzdF9sYW5lX3N0ZXApOwoJcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCXByaW50ZigiXG50ZXN0X21pbl9tYXg9PSAweCUwOHhcbiIsIHRlc3RfbWluX21heCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCgoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQoJCQkJewoKCQkJCQlpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7fQoKCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMUJETFIwK3JlZ19iYXNlX2Fkajt9CgoJCQkJCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2Fkajt9CgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDNCRExSMCtyZWdfYmFzZV9hZGo7fQoKCgoJCQkJCWZvciAoKHRlbXBfY291bnRfaj0wKTsodGVtcF9jb3VudF9qPERBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIKTsodGVtcF9jb3VudF9qKyspKQoJCQkJCXsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal09cmVhZGwocmVnX2FkZCs0KnRlbXBfY291bnRfaik7CgkJCQkJCWRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal09cmVnX2FkZCs0KnRlbXBfY291bnRfajsKCQkJCQkJcHJpbnRmKCJcbiBvcmcgYWRkICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKzQqdGVtcF9jb3VudF9qKSwgKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCt0ZW1wX2NvdW50X2pdKSk7CgkJCQkJCWRxX2xjZF9iZGxfcmVnX2xlZnRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal0KCQkJCQkJCT1kcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXTsKCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK3RlbXBfY291bnRfal0KCQkJCQkJCT1kcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXTsKCgkJCQkJfQoJCQkJfQoKCQkJfQoKCQl9CgoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCWZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJZm9yICgodGVtcF9jb3VudF9pPTApOyh0ZW1wX2NvdW50X2k8REFUWDhfRFFfTEFORV9XSURUSCk7KHRlbXBfY291bnRfaSsrKSkKCQkJCXsKCQkJCQlpZiAodGVzdF9sYW5lX3N0ZXA+OCkKCQkJCQkJdGVzdF9sYW5lX3N0ZXA9MDsKCQkJCQlpZiAodGVzdF9sYW5lX3N0ZXApCgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdF9sYW5lX3N0ZXA9PTB4JTA4eFxuICIsdGVzdF9sYW5lX3N0ZXApOwoJCQkJCQl0ZW1wX2NvdW50X2k9KHRlc3RfbGFuZV9zdGVwPj4xKTsKCQkJCQkJdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPXRlc3RfbGFuZV9zdGVwLSh0ZW1wX2NvdW50X2k8PDEpOwoJCQkJCQl0ZXN0X2xhbmVfc3RlcD0wOwoJCQkJCX0KCQkJCQl7CgkJCQkJCXByaW50ZigiXG50ZXN0IGxhbmU9PTB4JTA4eFxuICIsdGVtcF9jb3VudF9pKTsKCQkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQkJewoJCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7fQoKCQkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMUJETFIwK3JlZ19iYXNlX2Fkajt9CgoJCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCQl7CgkJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkJETFIwK3JlZ19iYXNlX2Fkajt9CgkJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQkJewoJCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDNCRExSMCtyZWdfYmFzZV9hZGo7fQoJCQkJCX0KCgkJCQkJZm9yICgodGVtcF9jb3VudF9rPTApOyh0ZW1wX2NvdW50X2s8Mik7KHRlbXBfY291bnRfaysrKSkKCQkJCQl7CgkJCQkJCWlmICh0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWcpCgkJCQkJCXsKCQkJCQkJCXRlbXBfY291bnRfaz0xOwoJCQkJCQkJdGVzdF9sYW5lX3N0ZXBfcmRxc19mbGFnPTA7CgkJCQkJCX0KCQkJCQkJaWYgKHRlbXBfY291bnRfayA9PSAwKQoJCQkJCQl7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz1yZWFkbChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZik7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXMmMHhmZjAwKSk+Pjg7CgkJCQkJCQkvLyAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzbmQ9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDAwMCkpPj4xNjsKCgkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPjApCgkJCQkJCQl7CgkJCQkJCQkJaWYodGVzdF9taW5fbWF4KQoJCQkJCQkJCXticmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkLS07CgkJCQkJCQkJcHJpbnRmKCJcbndkcWQgbGVmdCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxud2RxZCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJLy9vbmx5IHVwZGF0ZSBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJaWYgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZD4oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKSAgLy91cGRhdGUgd2RxZCBtaW4gdmFsdWUKCQkJCQkJCXsKCQkJCQkJCQlkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCgkJCQkJCQkJCT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZSYweGZmZmYwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKQk7CgkJCQkJCQl9CgoKCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3JlZ19vcmdbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPXJlYWRsKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmKTsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcyYweGZmMDApKT4+ODsKCgoJCQkJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZDwweGZmKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCsrOwoJCQkJCQkJCXByaW50ZigiXG53ZHFkIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZC0tOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxud2RxZCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJcHJpbnRmKCJcbndkcWQgcmlnaHQgZWRnZT09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkvL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZAoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDApfGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZCk7CgoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXT1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxczsKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlpZiAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkPChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZikpICAvL3VwZGF0ZSB3ZHFkIG1pbiB2YWx1ZQoJCQkJCQkJewoJCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdCgkJCQkJCQkJCT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmZmYwMCl8ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkKQk7CgkJCQkJCQl9CgoKCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgoJCQkJCQl9CgkJCQkJCWVsc2UgaWYodGVtcF9jb3VudF9rPT0xKQoJCQkJCQl7CgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKCQkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPjApCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZC0tOwoJCQkJCQkJCXByaW50ZigiXG5yZHFzZCBsZWZ0IHRlbXA9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QrKzsKCQkJCQkJCQkJYnJlYWs7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcHJpbnRmKCJcbnJkcXNkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG5yZHFzZCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCS8vb25seSB1cGRhdGUgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCByZHFzbmQKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlJjB4MDAwMGZmKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgoJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzOwoKCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU9ZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPigoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj44KSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCQl7CgkJCQkJCQkJZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXQoJCQkJCQkJCQk9KChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWUmMHhmZil8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpCTsKCQkJCQkJCX0KCgoJCQkJCQkJd3JpdGVsKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdLChyZWdfYWRkKzQqREFUWDhfRFFfRFhOTENETFIxKSk7CgoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9cmVhZGwocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZD0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzJjB4ZmYwMCkpPj44OwoKCQkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDB4ZmYpCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZCsrOwoJCQkJCQkJCXByaW50ZigiXG5yZHFzZCByaWdodCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfZHFzPShkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWR8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDgpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDwxNikpOwoJCQkJCQkJCXdyaXRlbChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2RxcywocmVnX2FkZCs0KkRBVFg4X0RRX0RYTkxDRExSMSkpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZC0tOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxucmRxc2QgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG5yZHFzZCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QpOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfd2RxZHwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8OCl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2Q8PDE2KSk7CgkJCQkJCQkvL29ubHkgdXBkYXRlIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWVfcmRxc2QgcmRxc25kCgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV07CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX2Rxcz0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKTsKCQkJCQkJCWRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgoKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZT1kcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXTsKCQkJCQkJCWlmIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKSkgIC8vdXBkYXRlIHdkcWQgbWluIHZhbHVlCgkJCQkJCQl7CgkJCQkJCQkJZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0KCQkJCQkJCQkJPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlJjB4ZmYpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkPDw4KXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDw8MTYpKQk7CgkJCQkJCQl9CgoKCgkJCQkJCQl3cml0ZWwoZHFfbGNkX2JkbF9yZWdfb3JnW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0sKHJlZ19hZGQrNCpEQVRYOF9EUV9EWE5MQ0RMUjEpKTsKCgoKCgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoKCQkJfQoJCX0KCgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCgoJCS8vLy9jYWxjdWxhdGUgYW5kIHByaW50ICBkcXMgdmFsdWUKCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJewoJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQl7CgkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCX0KCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBCRExSMCtyZWdfYmFzZV9hZGo7CgoKCQkJZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJCQl7CgkJCQkvLyAgZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrdGVtcF9jb3VudF9qXT1yZWdfYWRkKzQqdGVtcF9jb3VudF9qOwoKCQkJCXByaW50ZigiXG4gb3JnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfal0pKTsKCQkJfQoKCQkJZm9yICgodGVtcF9jb3VudF9qPTApOyh0ZW1wX2NvdW50X2o8RFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKTsodGVtcF9jb3VudF9qKyspKQoJCQl7CgkJCQlwcmludGYoIlxuIGxlZiBhZGQgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKGRxX2xjZF9iZGxfcmVnX2luZGV4W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSksIChkcV9sY2RfYmRsX3JlZ19sZWZ0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJCQl9CgoJCQlmb3IgKCh0ZW1wX2NvdW50X2o9MCk7KHRlbXBfY291bnRfajxEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwpOyh0ZW1wX2NvdW50X2orKykpCgkJCXsKCQkJCXByaW50ZigiXG4gcmlnIGFkZCAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwoZHFfbGNkX2JkbF9yZWdfaW5kZXhbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2pdKSwgKGRxX2xjZF9iZGxfcmVnX3JpZ2h0W3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9qXSkpOwoJCQl9CgoJCQlwcmludGYoIlxuIGRkcnRlc3Qgc2l6ZSA9PTB4JTA4eCwgdGVzdCB0aW1lcz09MHglMDh4LHRlc3RfbG9vcD09MHglMDh4XG4iLGRkcl90ZXN0X3NpemUsKHRlc3RfdGltZXMrMSksdGVzdF9sb29wKTsKCQkJcHJpbnRmKCJcbiBhZGQgIDB4MDAwMDAwMDAgcmVnPT0gICAgb3JnICAgICAgICAgICBsZWYgICAgICAgICAgIHJpZyAgICAgICAgICAgY2VudGVyICAgICAgICB3aW4gICAgICAgICAgIGxlZl9tICAgICAgICAgcmlnX20gICAgICAgICBtaW5fYyAgICAgICAgIG1pbl93aW4gICAgICAgIFxuIik7CgkJCWZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCgkJCXsKCQkJCXsKCgkJCQkJaWYgKHRlbXBfY291bnRfaSA9PSBEQVRYOF9EUV9MQU5FX0xBTkUwMCkKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoKCQkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDJCRExSMCtyZWdfYmFzZV9hZGorREFUWDhfRFFfRFhOTENETFIxKjQ7fQoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzQkRMUjArcmVnX2Jhc2VfYWRqK0RBVFg4X0RRX0RYTkxDRExSMSo0O30KCQkJCX0KCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj0oZHFfbGNkX2JkbF9yZWdfbGVmdFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPShkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCgkJCQlpZiAodGVzdF90aW1lcyA9PSAwKQoJCQkJewoJCQkJCShkcV9sY2RfYmRsX3JlZ19sZWZ0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKT1kcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCQkJCQkoZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluW3Rlc3RpbmdfY2hhbm5lbCpEUV9MQ0RfQkRMX1JFR19OVU1fUEVSX0NIQU5ORUwrdGVtcF9jb3VudF9pKkRBVFg4X0RRX0xDRF9CRExfUkVHX1dJRFRIK0RBVFg4X0RRX0RYTkxDRExSMV0pPWRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoKCQkJCX0KCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT0oZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSk7CgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU9KGRxX2xjZF9iZGxfcmVnX3JpZ2h0X21pblt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKTsKCgoJCQkJLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3dkcWQ9KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUmMHgwMDAwZmYpOwoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXI9KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZiYweGZmKSsoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWcmMHhmZikpLzIpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSsoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnPj44KSYweGZmKSkvMik8PDgpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj4xNikmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZikpLzIpPDwxNikgKTsKCgkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3M9KCAoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZyYweGZmKS0oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWYmMHhmZikpKQoJCQkJCQl8KCgoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZz4+OCkmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZj4+OCkmMHhmZikpKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc+PjE2KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmPj44KSYweGZmKSkpPDwxNikgKTsKCgoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXJfbWluPSggKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKyhkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWUmMHhmZikpLzIpCgkJCQkJCXwoKCgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpKS8yKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlPj4xNikmMHhmZikrKChkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZ19taW5fdmFsdWU+PjgpJjB4ZmYpKS8yKTw8MTYpICk7CgoJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzX21pbj0oICgoKGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZSYweGZmKS0oZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlJjB4ZmYpKSkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj44KSYweGZmKS0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmX21pbl92YWx1ZT4+OCkmMHhmZikpKTw8OCkKCQkJCQkJfCgoKCgoZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlPj4xNikmMHhmZiktKChkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU+PjgpJjB4ZmYpKSk8PDE2KSApOwoKCQkJCXByaW50ZigiXG4gYWRkICAweCUwOHggcmVnPT0gICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHhcbiIsCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19pbmRleFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX29yZ1t0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJKGRxX2xjZF9iZGxfcmVnX2xlZnRbdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19yaWdodFt0ZXN0aW5nX2NoYW5uZWwqRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMK3RlbXBfY291bnRfaSpEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCtEQVRYOF9EUV9EWE5MQ0RMUjFdKSwKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXIsZHFfbGNkX2JkbF90ZW1wX3JlZ193aW5kb3dzLAoJCQkJCQkoZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCShkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bdGVzdGluZ19jaGFubmVsKkRRX0xDRF9CRExfUkVHX05VTV9QRVJfQ0hBTk5FTCt0ZW1wX2NvdW50X2kqREFUWDhfRFFfTENEX0JETF9SRUdfV0lEVEgrREFUWDhfRFFfRFhOTENETFIxXSksCgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbixkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3NfbWluCgkJCQkJICApOwoJCQl9CgoKCQl9CgoJfQoKCgoKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKCgppbnQgZG9fZGRyX3Rlc3RfZHFzX3dpbmRvd19lbnYoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXJkZHJfdGVzdF9kcXNfd2luZG93IGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiXG5kZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMCBucyBsYW5lX2Rpc2FibGUgYWRkX3Rlc3Rfc2l6ZSAgIC0tLSB3YXRjaGRvZyBzaG91bGQgPjE1c1xuIik7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoKCXVuc2lnbmVkIGludCAgIGxhbmVfc3RlcD0gMDsKCXVuc2lnbmVkIGludCAgIHJlZ192YWx1ZT0gMDsKCS8vaW50IGFyZ2MyOwoJLy9jaGFyICAgICAqICBhcmd2MlszMF07CgljaGFyICplbmRwOwoJY2hhciAqYnVmOwoJYnVmPSIiOwoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9CgoKCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCX0KCgoKCWlmIChhcmdjID40KSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMjA7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoKCWlmIChhcmdjID41KSB7CgkJbGFuZV9kaXNhYmxlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWxhbmVfZGlzYWJsZT0gMDsKCQl9Cgl9CglwcmludGYoImxhbmVfZGlzYWJsZT09MHglMDh4XG4iLGxhbmVfZGlzYWJsZSk7CgoJdW5zaWduZWQgaW50ICBhZGRfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJaWYgKGFyZ2MgPjYpIHsKCQlhZGRfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWFkZF90ZXN0X3NpemU9IGRkcl90ZXN0X3NpemU7CgkJfQoJfQoJcHJpbnRmKCJhZGRfdGVzdF9zaXplPT0weCUwOHhcbiIsYWRkX3Rlc3Rfc2l6ZSk7CgkvL2FyZ2MyPTU7CgkvL2ZvcihpID0gMTtpPChhcmdjKTtpKyspCgl7CgkJLy9hcmd2MltpLTFdPWFyZ3ZbaV07Cgl9CgoJLy9hcmd2MlswXT1hcmd2WzFdOwoJLy9hcmd2MlsxXT1hcmd2WzJdOwoJLy9hcmd2MlsyXT1hcmd2WzNdOwoJLy8jaW5jbHVkZSA8c3RkaW8uaD4KCS8vICAgdW5zaWduZWQgaW50ICAgd3JfYWRqX3BlclsyNF0gOwoJLy9pZigxKQoKCXByaW50ZigiXG50ZXN0IHVzZSB1Ym9vdCBlbnZcbiIpOwoKCWNoYXIgc3RyWzEwMjRdPSIiOwoJY2hhciBzdHJfdGVtcDFbMTAyNF09IiI7CgljaGFyIHN0cl90ZW1wMlsxMDI0XT0iIjsKCWNvbnN0IGNoYXIgKnM7Cgl1bnNpZ25lZCBpbnQgc3RyX3RvX251bWFycnlbNDhdOwoJLy9zdHJfYnVmID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKjEwMjQpOwoKCXVuc2lnbmVkIGludCAqbnVtX2Fycnk7CgkvL3Vuc2lnbmVkIGludCAqbnVtX2FycnlfdGVtcDsKCXVuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTA9TlVMTDsKCXVuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTE9TlVMTDsKCXVuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTI9TlVMTDsKCXVuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTM9TlVMTDsKCWNoYXIgKm5hbWVfbGFuZTA7IAoJY2hhciAqbmFtZV9sYW5lMTsgCgljaGFyICpuYW1lX2xhbmUyOyAKCWNoYXIgKm5hbWVfbGFuZTM7IAoJbnVtX2FycnkgPSAodW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CglpbnQgaTsKCWNoYXIgKnZhcm5hbWU7ICBjaGFyICplbnZfbGNkbHJfdGVtcF9jb3VudDsKCXVuc2lnbmVkIGludCBsY2Rscl90ZW1wX2NvdW50PTA7Cgljb25zdCBjaGFyICp0ZW1wX3M7Y29uc3QgY2hhciAqdGVtcF9zMTsKCS8vIGludCB2YWx1ZT0wOwoKCXZhcm5hbWU9ImVudl9kZHJ0ZXN0X2RhdGFfbGFuZSI7CgluYW1lX2xhbmUwPSJkZHJfdGVzdF9kYXRhX2xhbmUwIjsKCW5hbWVfbGFuZTE9ImRkcl90ZXN0X2RhdGFfbGFuZTEiOwoJbmFtZV9sYW5lMj0iZGRyX3Rlc3RfZGF0YV9sYW5lMiI7CgluYW1lX2xhbmUzPSJkZHJfdGVzdF9kYXRhX2xhbmUzIjsKCWVudl9sY2Rscl90ZW1wX2NvdW50PSJsY2Rscl90ZW1wX2NvdW50IjsKCXMgPSBnZXRlbnYodmFybmFtZSk7CglpZiAocykKCXsvL2k9MDsKCQkvL3doaWxlKHNfdGVtcCkKCQl7CgkJCWVudl90b19udW0odmFybmFtZSxudW1fYXJyeSk7Ly91bnNpZ25lZCBpbnQgKm51bV9hcnJ5CgkJCXRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJaWYodGVtcF9zKQoJCQl7CgkJCQlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQl9CgkJCWVsc2UKCQkJe2xjZGxyX3RlbXBfY291bnQ9MDsKCQkJfQoKCQkJaWYoMCl7CgkJCQllbnZfdG9fbnVtKG5hbWVfbGFuZTAsbnVtX2FycnlfbGFuZTApOy8vdW5zaWduZWQgaW50ICpudW1fYXJyeQoJCQkJZW52X3RvX251bShuYW1lX2xhbmUxLG51bV9hcnJ5X2xhbmUxKTsvL3Vuc2lnbmVkIGludCAqbnVtX2FycnkKCQkJCWVudl90b19udW0obmFtZV9sYW5lMixudW1fYXJyeV9sYW5lMik7Ly91bnNpZ25lZCBpbnQgKm51bV9hcnJ5CgkJCQllbnZfdG9fbnVtKG5hbWVfbGFuZTMsbnVtX2FycnlfbGFuZTMpOy8vdW5zaWduZWQgaW50ICpudW1fYXJyeQoJCQl9CgoJCQlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoKCQkJCXByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5W2ldKTsKCQkJfQoJCQkvL2ZvciAobGFuZV9zdGVwID0gMDtsYW5lX3N0ZXA8IDQ7bGFuZV9zdGVwKyspCgkJCWlmKDApCgkJCXsKCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCgkJCQkJcHJpbnRmKCJsYW5lXzAgc3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5X2xhbmUwW2ldKTsKCQkJCX0KCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCgkJCQkJcHJpbnRmKCJsYW5lXzEgc3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5X2xhbmUxW2ldKTsKCQkJCX0KCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCgkJCQkJcHJpbnRmKCJsYW5lXzIgc3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5X2xhbmUyW2ldKTsKCQkJCX0KCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCgkJCQkJcHJpbnRmKCJsYW5lXzMgc3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5X2xhbmUzW2ldKTsKCQkJCX0KCQkJfQoJCQkvLwlwcmludGYoIiVzLGxlbnRoPSVkIixzLChzdHJsZW4ocykpKTsKCQkJLy9zc2NhbmYocywiZCUsIix3cl9hZGpfcGVyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZCUiLHMpOwoJCQkvL2dldGMKCQkJLy8gICAgICAgaWYgKHN0cmxlbihzKSA+IDE2KSAKCQkJewoJCQkJLy8gICBzc2NhbmYocywgIiUwOHgsICUwOHgsICUwOHgsIFxuIiwKCQkJCS8vICAgICAgICAgICZ3cl9hZGpfcGVyWzBdLCAmd3JfYWRqX3BlclsxXSwgJndyX2Fkal9wZXJbMl0pOwoJCQl9IAoJCX0KCX0KCWVsc2UKCXsKCQlwcmludGYoIm5vIGVudiBzZXQsZXhpdFxuIik7CgkJcmV0dXJuIDA7fQoJcyA9IGdldGVudih2YXJuYW1lKTsvL2ZvciBkZWJ1ZyBkaXNwbGF5IGVudiAgIHNob3VsZCBhZGQKCgoJLy8vKgoJLy9pZigxKQoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX2NtZDAgPTA7ICAvL21hc3RlciBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX2NtZDEgPTA7ICAvL21pbiBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18yX3N0ZXAgPTA7IC8vc3RlcCAwICBpbml0ICAtMSBsYW5lMCB3IG1pbiAgLTIgbGFuZTAgdyBtYXggLTMgbGFuZTAgciBtaW4gICAgNCBsYW5lMCByIG1heCAtLS0tLTUgbGFuZTEgdyBtaW4gLi4uCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfM19mcmVxID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCS8vICB1bnNpZ25lZCBpbnQgICBsYW5lX3N0ZXA9IDA7CgkvL2NoYXIgc3RyWzI0XTsKCgoJdGVzdF9hcmdfMF9jbWQwPW51bV9hcnJ5WzBdOwoJdGVzdF9hcmdfMV9jbWQxPW51bV9hcnJ5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJ5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJ5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz1udW1fYXJyeVs0XTsKCXByaW50ZigidGVzdF9hcmdfMF9jbWQwPT0lZFxuIix0ZXN0X2FyZ18wX2NtZDApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2NtZDE9PSVkXG4iLHRlc3RfYXJnXzFfY21kMSk7CglwcmludGYoInRlc3RfYXJnXzJfc3RlcD09JWRcbiIsdGVzdF9hcmdfMl9zdGVwKTsKCXByaW50ZigidGVzdF9hcmdfM19mcmVxPT0lZFxuIix0ZXN0X2FyZ18zX2ZyZXEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPT0lZFxuIix0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzKTsKCglpZih0ZXN0X2FyZ18yX3N0ZXApCgl7CgkJaWYodGVzdF9hcmdfM19mcmVxIT1nbG9iYWxfZGRyX2NsaykKCQl7CgkJCXByaW50ZigicnVubmluZyBkZHIgZnJlcT09JWQsYnV0IHRlc3QgZnJlcSBpcyVkLHdpbGwgcmVib290IHVzZSBkMnBsbCBcbiIsZ2xvYmFsX2Rkcl9jbGssdGVzdF9hcmdfM19mcmVxKTsKCQkJc3ByaW50ZihzdHIsImQycGxsICAlZCIsdGVzdF9hcmdfM19mcmVxKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCXdoaWxlKDEpOwoJCX0KCX0KCWlmKHRlc3RfYXJnXzJfc3RlcD09MCkKCXsKCQl7CgkJCXRlc3RfYXJnXzBfY21kMD0weDIyOwoJCQl0ZXN0X2FyZ18xX2NtZDE9MDsKCQkJdGVzdF9hcmdfMl9zdGVwPTE7CgkJCXRlc3RfYXJnXzNfZnJlcT1nbG9iYWxfZGRyX2NsazsKCQkJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz0wOwoJCQludW1fYXJyeVswXT10ZXN0X2FyZ18wX2NtZDA7CgkJCW51bV9hcnJ5WzFdPXRlc3RfYXJnXzFfY21kMTsKCQkJbnVtX2FycnlbMl09dGVzdF9hcmdfMl9zdGVwOwoJCQludW1fYXJyeVszXT10ZXN0X2FyZ18zX2ZyZXE7CgkJCW51bV9hcnJ5WzRdPXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM7CgkJCW51bV9hcnJ5WzVdPTA7CgkJCW51bV9hcnJ5WzZdPTA7CgkJCW51bV9hcnJ5WzddPTA7CgkJCWZvciAoaSA9IDg7IGkgPCA0ODsgaSsrKSB7CgkJCQludW1fYXJyeVtpXT0wOwoJCQl9CgoJCQlmb3IgKGxhbmVfc3RlcCA9IDA7IGxhbmVfc3RlcCA8IDQ7IGxhbmVfc3RlcCsrKQoJCQl7CgkJCQkvL2lmKGxhbmVfc3RlcCUyKQoJCQkJewojaWYgKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdPSgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpJjB4ZmYpOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdPSgoKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpPj44KSYweGZmKTsKI2Vsc2UKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdPSgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSkpJjB4MWZmKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXT0oKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMykKCQkJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjMpKT4+MCkmMHgxZmYpOwoKCQkJCQlwcmludGYoImxjZGxyMSAlZCAgJTA4eCwlMDh4LCUwOHhcbiIsIGxhbmVfc3RlcCwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpLAoJCQkJCQkJKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQkJCQkJCQkgRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKSkmMHgxZmYpLGRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0pOwoJCQkJCXByaW50ZigibGNkbHIzICVkICAlMDh4LCUwOHgsJTA4eFxuIiwgbGFuZV9zdGVwLCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjMpCgkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMyksCgkJCQkJCQkoKChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIzLQoJCQkJCQkJCQkJCQkgIEREUjBfUFVCX0RYMExDRExSMykKCQkJCQkJCQkJICtERFIwX1BVQl9EWDBMQ0RMUjMpKT4+MCkmMHgxZmYpLGRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdKTsKI2VuZGlmCgoJCQkJCS8vcHJpbnRmKCJsY2RscjEgJWQgICUwOHhcbiIsIGxhbmVfc3RlcCwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkvL0REUjBfUFVCX0RYMExDRExSMSkKCQkJCQkvLytERFIwX1BVQl9EWDBMQ0RMUjEpKTsKCQkJCQkvL3ByaW50ZigibGNkbHIzICVkICAlMDh4XG4iLCBsYW5lX3N0ZXAsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjMtCgkJCQkJLy9ERFIwX1BVQl9EWDBMQ0RMUjMpCgkJCQkJLy8rRERSMF9QVUJfRFgwTENETFIzKSk7CgkJCQkJLy9kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXT0wOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdPTB4ZmZmZjsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXT0weGZmZmY7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCX0KCQkJCS8vZWxzZQoJCQkJewoJCQkJCS8vZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXT0wOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF09MHhmZmZmOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF09MHhmZmZmOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCX0KCQkJfQoKCQkJewoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hPSgocmVhZGwoRERSMF9QVUJfQUNMQ0RMUikpJkFDTENETFJfTUFYKTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYT0weGZmZmY7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E9MHhmZmZmOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTA7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hPSgocmVhZGwoRERSMF9QVUJfQUNCRExSMCkpJkFDQkRMUl9NQVgpOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYT0weGZmZmY7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hPTB4ZmZmZjsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MDsKCQkJfQoKCgojaWYgMSAvLyggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgxR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgyR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgzR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSk7CgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwxOyAgICAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDEpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDIpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDMpOyAgIAoKI2VuZGlmCgkJCWlmKGxhbmVfZGlzYWJsZSkKCQkJe2lmKGxhbmVfZGlzYWJsZSYweDEpewoJCQkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbMF09NDsKCQkJCQkJCQkJIGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVswXT00OwoJCQkJCQkJCSB9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIpewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbMV09NDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVsxXT00OwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDQpewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbMl09NDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVsyXT00OwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDgpewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbM109NDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVszXT00OwoJCQl9CgkJCXByaW50ZigibGFuZV9kaXNhYmxlPT0leFxuIixsYW5lX2Rpc2FibGUpOwoJCQlpZihsYW5lX2Rpc2FibGUmMHgxMCl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9NDsKCQkJCXByaW50ZigiZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0leFxuIixkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2EpOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIwKXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9NDsKCQkJCXByaW50ZigiZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09JXhcbiIsZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYSk7CgoJCQl9CgkJCX0KCgkJCXsKCQkJCWZvciAobGFuZV9zdGVwID0gMDsgbGFuZV9zdGVwIDwgNDsgbGFuZV9zdGVwKyspCgoKCQkJCXsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQl9CgoKCgoJCQkJbGFuZV9zdGVwPTQ7CgkJCQl7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCX0KCQkJfQoKCQkJaWYoMCl7CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJCQkJbnVtX2FycnlfbGFuZTBbaV09bnVtX2FycnlbOCtpXTsKCQkJCX0KCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCQkJCQludW1fYXJyeV9sYW5lMVtpXT1udW1fYXJyeVs4KzgraV07CgkJCQl9CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJCQkJbnVtX2FycnlfbGFuZTJbaV09bnVtX2FycnlbOCs4KzgraV07CgkJCQl9CgkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJCQkJbnVtX2FycnlfbGFuZTNbaV09bnVtX2FycnlbOCs4KzgrOCtpXTsKCQkJCX0KCQkJCW51bV90b19lbnYobmFtZV9sYW5lMCxudW1fYXJyeV9sYW5lMCk7CgkJCQludW1fdG9fZW52KG5hbWVfbGFuZTEsbnVtX2FycnlfbGFuZTEpOwoJCQkJbnVtX3RvX2VudihuYW1lX2xhbmUyLG51bV9hcnJ5X2xhbmUyKTsKCQkJCW51bV90b19lbnYobmFtZV9sYW5lMyxudW1fYXJyeV9sYW5lMyk7CgkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCX0KCgkJfQoKCgoKCQlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCX0KCgoKCX0KCgl0ZXN0X2FyZ18yX3N0ZXArKzsKCW51bV9hcnJ5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCXNwcmludGYoc3RyLCAiMHglMDh4IiwgbnVtX2FycnlbMF0pOwoJcHJpbnRmKCIlZCAgJWRcbiIsIDAsbnVtX2FycnlbMF0pOwoJZm9yIChpID0gMTsgaSA8IDQ4OyBpKyspIHsKCQkvL251bV9hcnJ5W2ldPTA7CgkJc3ByaW50ZihzdHIsICIlczsweCUwOHgiLCBzdHIsbnVtX2FycnlbaV0pOwoJCXByaW50ZigiJWQgICVkXG4iLCBpLG51bV9hcnJ5W2ldKTsKCgl9CgkvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwoJcHJpbnRmKCIlcyIsIHN0cik7CglzZXRlbnYodmFybmFtZSwgc3RyKTsKCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgoJaT0yOwoJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCglmb3IgKGkgPSA4OyBpIDwgNDg7IGkrKykgewoJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQl0ZW1wX3MxPSBnZXRlbnYoc3RyX3RlbXAxKTsKCQlpZih0ZW1wX3MxKQoJCXsKCQkJbnVtX2FycnlbaV09IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zMSwgJmVuZHAsIDApOwoJCX0KCQllbHNlCgkJe251bV9hcnJ5W2ldPTA7CgkJfQoJCXByaW50ZigiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZD09JWRcbiIsaSxudW1fYXJyeVtpXSk7Cgl9CgoJLy8vKgoJewoJCWZvciAobGFuZV9zdGVwID0gMDsgbGFuZV9zdGVwIDwgNDsgbGFuZV9zdGVwKyspCgkJewoJCQl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXTsKCQkJfQoJCQl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN107CgkJCX0KCgoJCX0KCQlsYW5lX3N0ZXA9NDsKCQl7CgkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9taW5fYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM107CgkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddOwoJCX0KCX0KCS8vKi8KCgoKCglpZiAoY2hhbm5lbF9hX2VuKQoJewoKCQkvLyooY2hhciAgICAgKikoYXJndjJbMF0pPSJhIjsKCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJCXByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgbGFuZSBhXG4iKTsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHdhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCgkJCS8qCgkJCSAgIHsKCQkJICAgbGNkbHJfdGVtcF9jb3VudD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkgICBzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkgICBwcmludGYoICIlcyIsIGJ1Zik7CgkJCSAgIHNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJICAgcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkgICB9CgkJCSAgICovCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0xKQoJCQkgICkKCQkJewoJCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTB4ZmZmZikKCQkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTE7CgkJCQkJewoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJfQoKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMiswKSwyKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgoJCQkJfQoJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJCXsKCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJaWYodGVtcF9zKQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQl9CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCQkJCX0KCgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdOwoJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdOwoKCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCXsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrMTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQl9CgoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKXx8CgkJCQkJKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpKQoJCQl7CgkJCQkvLwlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSk9PTB4ZmZmZikKCQkJCS8vCQl7ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkJLy8JCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQkvLyAgICAgICAgICAgICBydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJLy8JCX0KCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MikKCQkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCQlzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzApLDEpOwoJCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT00OwoKCQkJCQl9CgkJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MykKCQkJCQl7CgkJCQkJCXRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJaWYodGVtcF9zKQoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCQl9CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT00OwoJCQkJCX0KCgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF07CgkJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJCXsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzI7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCX0KCgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTB4ZmZmZikKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKQoJCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0xOwoJCQkJCXsKCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl9CgkJCQkJewoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJfQoKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMisxKSwyKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoKCQkJCX0KCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0xKQoJCQkJewoJCQkJCXRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQlpZih0ZW1wX3MpCgkJCQkJewoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCX0KCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgkJCQl9CgoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQl7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzU7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrNzsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJfQoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09Mil8fAoJCQkJCShkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MykpCgkJCXsKCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpCgkJCQkJewkKCgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT00OwoKCQkJCQl9CgkJCQkJZWxzZSBpZiAoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpCgkJCQkJewoJCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCWlmKHRlbXBfcykKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQkJfQoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT00OwoJCQkJCX0KCgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJCS8vCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgoJCQkJCXsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzY7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCQkJLyoKCQkJICAgaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpfHwKCQkJICAgKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKSkKCQkJICAge2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCSAgIHNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDIpOwoJCQkgICBwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSl8fAoJCQkoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpKQoJCQl7ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQkqLwkKCgoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQl7cHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJCQl9CgoKCQl9CgoKCgl9CgoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCgkJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBsY2RsciBhYyBiZGxyIHdpbmRvdyBsYW5lIGEuLi5cbiIpOwoKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgkJCXByaW50ZigiXG5kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2EgJWQgXG4iLGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYSk7CgkJCWxhbmVfc3RlcD00OwoJCQllbnZfbGNkbHJfdGVtcF9jb3VudD0ibGNkbHJfdGVtcF9jb3VudF9hIjsKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT49MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTEpCgkJCSAgKQoJCQl7CgkJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPj0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9MTsKCQkJCQl7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJCXByaW50ZigiYWNsY2Rscl9zdGF0dXNfYT09MHglMDh4XG4iLG51bV9hcnJ5W2ldKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQkJcHJpbnRmKCJcbjIyMnRlc3QgbGNkbHIgYWMgYmRsciB3aW5kb3cgbGFuZSBhLi4uXG4iKTsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJcHJpbnRmKCJcbjMzM3Rlc3QgbGNkbHIgYWMgYmRsciB3aW5kb3cgbGFuZSBhLi4uXG4iKTsKCQkJCQkvL2Rkcl90dW5lX2FjbGNkbHJfc3RlcAoJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGFkZF90ZXN0X3NpemUsKCAwKSwyKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJcHJpbnRmKCJhY2xjZGxyX3N0YXR1c19hMT09MHglMDh4XG4iLG51bV9hcnJ5W2ldKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0yOwoKCQkJCX0KCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MSkKCQkJCXsKCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJaWYodGVtcF9zKQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQl9CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTI7CgkJCQl9CgoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E7CgkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCgkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQl7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzE7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJfQoKCgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0yKXx8CgkJCQkJKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MykpCgkJCXsKCQkJCS8vCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdKT09MHhmZmZmKQoJCQkJLy8JCXtkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCQkvLwkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCS8vICAgICAgICAgICAgIHJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkvLwkJfQoKCQkJCXsKCQkJCQlpZihkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTIpCgkJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E7CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsYWRkX3Rlc3Rfc2l6ZSwoIDApLDEpOwoJCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJZGRyX3VkZWxheSgyMDAwMDAwKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTQ7CgoJCQkJCX0KCQkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTMpCgkJCQkJewoJCQkJCQl0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCWlmKHRlbXBfcykKCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQkJfQoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E9bGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTQ7CgkJCQkJfQoKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hOwoJCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hOwoJCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQkJewoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMjsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJfQoKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0weGZmZmYpCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0xKQoJCQkgICkKCQkJewoJCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTB4ZmZmZikKCQkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTE7CgkJCQkJewoJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCXNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCX0KCgkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsYWRkX3Rlc3Rfc2l6ZSwoIDEpLDIpOwoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0xKQoJCQkJewoJCQkJCXRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQlpZih0ZW1wX3MpCgkJCQkJewoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCX0KCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E7CgkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hOwoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs1OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCX0KCgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09Mil8fAoJCQkJCShkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0zKSkKCQkJewoKCQkJCXsKCQkJCQlpZihkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0yKQoJCQkJCXsJCgoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkJc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHglMDh4ICVkICVkIixhZGRfdGVzdF9zaXplLCggMSksMSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTQ7CgoJCQkJCX0KCQkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0zKQoJCQkJCXsKCQkJCQkJdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlpZih0ZW1wX3MpCgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJCX0KCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYT1sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTQ7CgkJCQkJfQoKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9vcmdfYTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkJLy8JbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCgkJCQkJewoJCQkJCQlpPTgrbGFuZV9zdGVwKjgrNjsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJfQoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgoJCQl9CgoJCQkvKgoJCQkgICBpZigoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTB4ZmZmZil8fAoJCQkgICAoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTApKQoJCQkgICB7ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJICAgc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMik7CgkJCSAgIHByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0xOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0xKXx8CgkJCShkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MikpCgkJCXtkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMisxKSwxKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTM7CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJLy9udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQl9CgkJCSovCQoKCgkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCXtwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7CgkJCX0KCgoJCX0KCgoKCX0KCglpZiAoY2hhbm5lbF9iX2VuKQoJey8vKihjaGFyICAgICAqKShhcmd2MlswXSk9ImIiOwoJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMTEgYSAwIDB4ODAwMDAgICIsMCk7CgkJcHJpbnRmKCJcbnRlc3QgZHFzIHdpbmRvdyBsYW5lIGJcbiIpOwoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDgpOyhsYW5lX3N0ZXArKykpCgkJewoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweCUwOHggJWQiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXApKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCX0KCX0KCgl1bnNpZ25lZCBpbnQgICBhY21kbHI9IDA7Cgl1bnNpZ25lZCBpbnQgIGRlbGF5X3N0ZXBfeDEwMD0gMDsKCWlmIChjaGFubmVsX2FfZW4pCgl7CgkJYWNtZGxyPSgocmVhZGwoKEREUjBfUFVCX0FDTURMUikpKSZBQ0xDRExSX01BWCk7CgkJZGVsYXlfc3RlcF94MTAwPTEwMCoxMDAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKmFjbWRscik7CgkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsc3RlcD0lZCBwcywxMHN0ZXA9JWQgcHMsMTAwc3RlcD0lZCBwcyxcbiIsYWNtZGxyLGFjbWRscixnbG9iYWxfZGRyX2NsaywKCQkJCWRlbGF5X3N0ZXBfeDEwMC8xMDAsZGVsYXlfc3RlcF94MTAwLzEwLGRlbGF5X3N0ZXBfeDEwMCk7CgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8d2RxX29yZyAweCUwOHggIHx3ZHFfbWluIDB4JTA4eCB8d2RxX21heCAweCUwOHggOjp8cmRxc19vcmcgIDB4JTA4eCAgfHJkcXNfbWluIDB4JTA4eCB8cmRxc19tYXggMHglMDh4ICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0sCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdLGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdKTsKCQl9CgkJewoJCQlwcmludGYoIlxuYWNfbGFuZV8weCUwOHh8bGNkX29yZyAweCUwOHggIHxsY2RfbWluIDB4JTA4eCB8bGNkX21heCAweCUwOHggOjp8YmRscl9vcmcgIDB4JTA4eCAgfGJkbHJfbWluIDB4JTA4eCB8YmRscl9tYXggMHglMDh4ICBcbiIsCgkJCQkJNCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hLGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2EsZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYSk7CgkJfQoJCXByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOwoJCXsKCQkJcHJpbnRmKCJcbiBhY19sYW5lXzB4MDAwMDAwMHwgIGxjZGxyX29yZyAgfGxjZGxyX3NldCBwc3xsY2Rscl9ob2xkIHBzOnxcCgkJCQkJY2xrX3NldHVwICBwc3wgY2xrX2hvbGQgcHN8YWRqX3BlcmNlbnRbMTAwXVxuIik7CgoJCQlwcmludGYoIlxuIGFjX2xhbmUweCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQk0LAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2EtZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYS1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2EpKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYStkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2EpLygKCQkJCQkJMipkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EpKTsKCQkJcHJpbnRmKCJcbiBja19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hLAoJCQkJCTAsCgkJCQkJMCwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hLWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2EpKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYS1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkxMDAqKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYStkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2EpLygKCQkJCQkJMipkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hKSk7CgkJfQoJCXByaW50ZigiXG4gYV9sYW5lXzB4MDAwMDAwMDB8IHdyZHFfb3JnIDB4MHx3X3NldHVwIHggcHN8d19ob2xkICB4IHBzOjp8XAoJCQkJcmRfc2V0dXAgIHBzfHJkX2hvbGQgeCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdLWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdK2RxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0pLygKCQkJCQkJMipkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdKSk7CgoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0sCgkJCQkJMCwKCQkJCQkwLAoKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkxMDAqKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdK2RxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0pKTsKCgoKCQl9Cgl9CgoKCglpZiAoY2hhbm5lbF9iX2VuKQoJewoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJezsKCQl9Cgl9CgoJcmV0dXJuIHJlZ192YWx1ZTsKfQoKClVfQk9PVF9DTUQoCglkZHJfZHFzX3dpbmRvd19zdGVwLAk2LAkxLAlkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAsCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfZHFzX3dpbmRvd19zdGVwIGEgMCAweDgwMDAwMCAxIG9yIGRkcl9kcXNfd2luZG93X3N0ZXAgYiAwIDB4ODAwMDAwIDVcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgovLy8qCgojZW5kaWYKCmludCBkb19kZHIycGxsX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCglleHRlcm4gaW50IGRvX2RkcjJwbGxfZzEyX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOwoJZG9fZGRyMnBsbF9nMTJfY21kKGNtZHRwLGZsYWcsYXJnYywgYXJndik7CglyZXR1cm4gMTsKI2VuZGlmCgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX1pRICAgICAwCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfQUNfQklUX1NFVFVQICAgICAgMQojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0FDX0JJVF9IT0xEICAgICAyCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9XUklURV9CSVRfU0VUVVAgICAgICAzCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9XUklURV9CSVRfSE9MRCAgICAgIDQKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1JFQURfQklUX1NFVFVQICAgICAgNQojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfUkVBRF9CSVRfSE9MRCAgICAgNgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfVlJFRiAgICAgNwojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0NMS19JTlZFVEVSICAgICA4CgojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0ZVTExURVNUICAgICAweGZmZmZmZmZmCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50IHBsbCwgenFjcjsKCXVuc2lnbmVkIGludCB6cXByX3NvY19kcmFtPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfY21kX3NvY192cmVmPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj0wOy8vMHgzZjsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9jbWRfenFfdnJlZj0wOy8vMHgzZjsKCgoJdW5zaWduZWQgaW50IGRkcl9mdWxsX3Rlc3RfZW5hYmxlPTA7CgkvKgojZGVmaW5lIEREUjNfRFJWXzQwT0hNCQkwCiNkZWZpbmUgRERSM19EUlZfMzRPSE0JCTEKI2RlZmluZSBERFIzX09EVF8wT0hNCQkwCiNkZWZpbmUgRERSM19PRFRfNjBPSE0JCTEKI2RlZmluZSBERFIzX09EVF8xMjBPSE0JCTIKI2RlZmluZSBERFIzX09EVF80ME9ITQkJMwojZGVmaW5lIEREUjNfT0RUXzIwT0hNCQk0CiNkZWZpbmUgRERSM19PRFRfMzBPSE0JCTUKCgkvLyBscGRkcjIgZHJ2IG9kdCAKI2RlZmluZSBMUEREUjJfRFJWXzM0T0hNCTEKI2RlZmluZSBMUEREUjJfRFJWXzQwT0hNCTIKI2RlZmluZSBMUEREUjJfRFJWXzQ4T0hNCTMKI2RlZmluZSBMUEREUjJfRFJWXzYwT0hNCTQKI2RlZmluZSBMUEREUjJfRFJWXzgwT0hNCTYKI2RlZmluZSBMUEREUjJfRFJWXzEyME9ITQk3CiNkZWZpbmUgTFBERFIyX09EVF8wT0hNCQkwCgoJLy8gbHBkZHIzIGRydiBvZHQgCiNkZWZpbmUgTFBERFIzX0RSVl8zNE9ITQkxCiNkZWZpbmUgTFBERFIzX0RSVl80ME9ITQkyCiNkZWZpbmUgTFBERFIzX0RSVl80OE9ITQkzCiNkZWZpbmUgTFBERFIzX0RSVl82ME9ITQk0CiNkZWZpbmUgTFBERFIzX0RSVl84ME9ITQk2CiNkZWZpbmUgTFBERFIzX0RSVl8zNF80ME9ITQk5CiNkZWZpbmUgTFBERFIzX0RSVl80MF80OE9ITQkxMAojZGVmaW5lIExQRERSM19EUlZfMzRfNDhPSE0JMTEKI2RlZmluZSBMUEREUjNfT0RUXzBPSE0JCTAKI2RlZmluZSBMUEREUjNfT0RUXzYwT0hNCTEKI2RlZmluZSBMUEREUjNfT0RUXzEyT0hNCTIKI2RlZmluZSBMUEREUjNfT0RUXzI0MEhNCTMKCiNkZWZpbmUgRERSNF9EUlZfMzRPSE0JCTAKI2RlZmluZSBERFI0X0RSVl80OE9ITQkJMQojZGVmaW5lIEREUjRfT0RUXzBPSE0JCTAKI2RlZmluZSBERFI0X09EVF82ME9ITQkJMQojZGVmaW5lIEREUjRfT0RUXzEyME9ITQkJMgojZGVmaW5lIEREUjRfT0RUXzQwT0hNCQkzCiNkZWZpbmUgRERSNF9PRFRfMjQwT0hNCQk0CiNkZWZpbmUgRERSNF9PRFRfNDhPSE0JCTUKI2RlZmluZSBERFI0X09EVF84ME9ITQkJNgojZGVmaW5lIEREUjRfT0RUXzM0T0hNCQk3CiovCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vZHQJCQkJPSAwOwoJLy91bnNpZ25lZCBpbnQgZHJhbV9kcnYJCQkJPSAwOwoJLy91bnNpZ25lZCBpbnQgZHJhbV9vZHQJCQkJPSAwOwoJLyogbmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzICovCglpZiAoYXJnYyA8IDIpCgkJZ290byB1c2FnZTsKCglwbGwgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLDApOwoJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCXByaW50ZiAoIkVycm9yOiBXcm9uZyBmb3JtYXQgcGFyYW1lbnQhXG4iKTsKCQlyZXR1cm4gMTsKCX0KCWlmIChhcmdjID4yKQoJewoJCXpxY3IgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXpxY3IgPSAwOwoJCX0KCX0KCWVsc2UKCXsKCQl6cWNyID0gMDsKCX0KCglpZih6cWNyPT0weGZmZmZmZmZmKQoJewoJCWRkcl9mdWxsX3Rlc3RfZW5hYmxlPTE7CgkJenFjcj0wO30KCglpZiAoYXJnYyA+MykKCXsKCQkvLyBzb2NfZGF0YV9kcnZfb2R0PXpxcHJfc29jX2RyYW0mMHhmZmZmZjsKCQkvLyBkcmFtX2Rydj0oenFwcl9zb2NfZHJhbT4+MjApJjB4ZjsKCQkvLyAgZHJhbV9vZHQ9KHpxcHJfc29jX2RyYW0+PjI0KSYweGY7CgkJLy9iaXQyOCBlbmFibGUgc29jX3pxcHIgLGJpdCAyOSBlbmFiZSBkcmFtX2RydiBiaXQgMzAgZW5hYmVsIGRyYW1fb2R0CgkJenFwcl9zb2NfZHJhbSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJenFwcl9zb2NfZHJhbSA9IDA7CgkJfQoJfQoJZWxzZQoJewoJCXpxcHJfc29jX2RyYW0gPSAwOwoJfQoKCWlmIChhcmdjID40KQoJewoJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCQl9Cgl9CgllbHNlCgl7CgkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCX0KCWlmIChhcmdjID41KQoJewoJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSAwOwoJCX0KCX0KCXVuc2lnbmVkIGludCBzb2NfZHJhbV9oZXhfZGVjPTA7CglpZiAoYXJnYyA+NikKCXsKCQlzb2NfZHJhbV9oZXhfZGVjID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzb2NfZHJhbV9oZXhfZGVjID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NykKCXsKCQlkZHJfdGVzdF9jbWRfenFfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSAwOwoJCX0KCX0KCgoKCXVuc2lnbmVkIGludCBzb2NfZHJhbV9kcnZfb2R0X3VzZV92bGF1ZT0wOwoJdW5zaWduZWQgaW50IHNvY19hY19kcnY9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfb2R0PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfb2R0PTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9kcnY9MDsKCXVuc2lnbmVkIGludCBkcmFtX29kdD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9kcnZfYWRqX2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfYWRqX2VuYWJsZT0wOwoKCXVuc2lnbmVkIGludCB6cTBwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJdW5zaWduZWQgaW50IHpxMXByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTFQUik7Cgl1bnNpZ25lZCBpbnQgcHViX2Rjcj0gcmRfcmVnKEREUjBfUFVCX0RDUik7CiNkZWZpbmUgRERSX1RZUEVfTFBERFIyICAwCiNkZWZpbmUgRERSX1RZUEVfTFBERFIzICAxCiNkZWZpbmUgRERSX1RZUEVfRERSMyAgMwojZGVmaW5lIEREUl9UWVBFX0REUjQgIDQKCXVuc2lnbmVkIGludCBkZHJfdHlwZT0gcHViX2RjciYweDc7IC8vMCAtbHBkZHIyICB8ICAxLSBscGRkcjMgIHwgICAyLSByZXYgIHwgIDMgLWRkcjMgICB8IDQtIGRkcjQKCS8vCXVuc2lnbmVkIGludCB6cTJwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEyUFIpOwoJaWYgKGFyZ2MgPjgpCgl7CgkJc29jX2RyYW1fZHJ2X29kdF91c2VfdmxhdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXNvY19kcmFtX2Rydl9vZHRfdXNlX3ZsYXVlID0gMDsKCQl9Cgl9CglpZihzb2NfZHJhbV9kcnZfb2R0X3VzZV92bGF1ZSkKCXtpZih6cWNyKQoJCXtwcmludGYoInpxY3JbMHglMDh4XSxcbiIsIHpxY3IpOwoJCQl7CgkJCQlzb2NfYWNfZHJ2PXpxY3IlMTAwOwoJCQkJaWYoc29jX2FjX2Rydj4xMDApCgkJCQl7c29jX2FjX2Rydj0wO30KCQkJCWlmKHNvY19hY19kcnY9PTApCgkJCQl7c29jX2FjX2Rydj0xO30KCQkJCXNvY19hY19kcnY9KDQ4MC9zb2NfYWNfZHJ2KS0xOwoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKHNvY19hY19kcnY+MHhmKQoJCQkJCXtzb2NfYWNfZHJ2PXpxMHByX29yZyYweGY7fQoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoc29jX2FjX2Rydj4weGYpCgkJCQkJe3NvY19hY19kcnY9KHpxMHByX29yZz4+OCkmMHhmO30KCQkJCX0KCQkJfQoKCgkJCXsKCQkJCXNvY19hY19vZHQ9enFjci8xMDA7CgkJCQlpZihzb2NfYWNfb2R0PjI0MCkKCQkJCXtzb2NfYWNfb2R0PTQ4MDt9CgkJCQlpZihzb2NfYWNfb2R0PT0wKQoJCQkJe3NvY19hY19vZHQ9MTt9CgoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCXNvY19hY19vZHQ9KDM2MC9zb2NfYWNfb2R0KS0xOwoJCQkJCWlmKHNvY19hY19vZHQ+MHhmKQoJCQkJCXtzb2NfYWNfb2R0PSh6cTBwcl9vcmc+PjQpJjB4Zjt9CgkJCQl9CgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlzb2NfYWNfb2R0PSg0ODAvc29jX2FjX29kdCktMTsKCQkJCQlpZihzb2NfYWNfb2R0PjB4ZikKCQkJCQl7c29jX2FjX29kdD0oenEwcHJfb3JnPj4xNikmMHhmO30KCQkJCX0KCQkJfQoKCQkJenFjcj0oc29jX2FjX29kdDw8MTYpfChzb2NfYWNfZHJ2PDwxMil8KHNvY19hY19kcnY8PDgpfChzb2NfYWNfb2R0PDw0KXwoc29jX2FjX2Rydik7CgkJCXByaW50ZigienFjclsweCUwOHhdLHNvY19hY19vZHQgWzB4JTA4eF0sc29jX2FjX2RydiBbMHglMDh4XVxuIiwgenFjcixzb2NfYWNfb2R0LHNvY19hY19kcnYpOwoJCX0KCQlpZih6cXByX3NvY19kcmFtKQoJCXtwcmludGYoInpxcHJfc29jX2RyYW1bMHglMDh4XSxcbiIsIHpxcHJfc29jX2RyYW0pOwoJCQl7CgkJCQlzb2NfZGF0YV9kcnY9enFwcl9zb2NfZHJhbSUxMDA7CgkJCQlwcmludGYoInNvY19kYXRhX2RydlslZF0sXG4iLCBzb2NfZGF0YV9kcnYpOwoJCQkJaWYoc29jX2RhdGFfZHJ2PjEwMCkKCQkJCXtzb2NfZGF0YV9kcnY9MDsKCgkJCQl9CgkJCQlpZihzb2NfZGF0YV9kcnY9PTApCgkJCQl7c29jX2RhdGFfZHJ2PTE7CgkJCQkJLy9zb2NfZGF0YV9kcnZfb2R0X2Fkal9lbmFibGU9MDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsvL3NvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0xOwoJCQkJfQoJCQkJc29jX2RhdGFfZHJ2PSg0ODAvc29jX2RhdGFfZHJ2KS0xOwoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKHNvY19kYXRhX2Rydj4weGYpCgkJCQkJe3NvY19kYXRhX2Rydj16cTFwcl9vcmcmMHhmO30KCQkJCX0KCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCWlmKHNvY19kYXRhX2Rydj4weGYpCgkJCQkJe3NvY19kYXRhX2Rydj0oenExcHJfb3JnPj44KSYweGY7fQoJCQkJfQoJCQl9CgoKCQkJewoJCQkJc29jX2RhdGFfb2R0PSh6cXByX3NvY19kcmFtLzEwMCklMTAwMDsKCQkJCXByaW50Zigic29jX2RhdGFfb2R0WyVkXSxcbiIsIHNvY19kYXRhX29kdCk7CgkJCQlpZihzb2NfZGF0YV9vZHQ+MjQwKQoJCQkJe3NvY19kYXRhX29kdD0zNjA7fQoJCQkJaWYoc29jX2RhdGFfb2R0PT0wKQoJCQkJe3NvY19kYXRhX29kdD0xO30KCgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJc29jX2RhdGFfb2R0PSgzNjAvc29jX2RhdGFfb2R0KS0xOwoJCQkJCWlmKHNvY19kYXRhX29kdD4weGYpCgkJCQkJe3NvY19kYXRhX29kdD0oenExcHJfb3JnPj40KSYweGY7fQoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJc29jX2RhdGFfb2R0PSg0ODAvc29jX2RhdGFfb2R0KS0xOwoJCQkJCWlmKHNvY19kYXRhX29kdD4weGYpCgkJCQkJe3NvY19kYXRhX29kdD0oenExcHJfb3JnPj4xNikmMHhmO30KCQkJCX0KCgkJCX0KCgkJCXNvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0xOwoKCQkJewoJCQkJZHJhbV9kcnY9KHpxcHJfc29jX2RyYW0vMTAwMDAwKSUxMDA7CgkJCQlwcmludGYoImRyYW1fZHJ2WyVkXSxcbiIsIGRyYW1fZHJ2KTsKCgkJCQlpZihkcmFtX2Rydj4xMDApCgkJCQl7ZHJhbV9kcnY9MDt9CgkJCQlpZihkcmFtX2Rydj09MCkKCQkJCXsKCQkJCQlkcmFtX2RhdGFfZHJ2X2Fkal9lbmFibGU9MDt9CgkJCQllbHNlCgkJCQl7ZHJhbV9kYXRhX2Rydl9hZGpfZW5hYmxlPTE7CgkJCQl9CgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJaWYoZHJhbV9kcnY+PTQwKQoJCQkJCXtkcmFtX2Rydj0wO30KCgkJCQkJZWxzZQoJCQkJCXtkcmFtX2Rydj0xOwoJCQkJCX0KCQkJCX0KCgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoZHJhbV9kcnY8NDgpCgkJCQkJe2RyYW1fZHJ2PTA7fQoKCQkJCQllbHNlCgkJCQkJe2RyYW1fZHJ2PTE7CgkJCQkJfQoJCQkJfQoJCQl9CgoKCQkJewoJCQkJZHJhbV9vZHQ9KHpxcHJfc29jX2RyYW0vMTAwMDAwKS8xMDA7CgkJCQlwcmludGYoImRyYW1fb2R0WyVkXSxcbiIsIGRyYW1fb2R0KTsKCQkJCWlmKGRyYW1fb2R0PjI0MCkKCQkJCXtkcmFtX29kdD00ODA7fQoJCQkJaWYoZHJhbV9vZHQ9PTApCgkJCQl7CgkJCQkJZHJhbV9kYXRhX29kdF9hZGpfZW5hYmxlPTA7CgkJCQl9CgkJCQllbHNlCgkJCQl7ZHJhbV9kYXRhX29kdF9hZGpfZW5hYmxlPTE7CgkJCQl9CgoKCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFIzKQoJCQkJewoJCQkJCWlmKGRyYW1fb2R0PjE2MCkKCQkJCQl7ZHJhbV9vZHQ9MDt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+OTApCgkJCQkJe2RyYW1fb2R0PTI7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjUwKQoJCQkJCXtkcmFtX29kdD0xO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4zNSkKCQkJCQl7ZHJhbV9vZHQ9Mzt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MjUpCgkJCQkJe2RyYW1fb2R0PTU7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PD0yNSkKCQkJCQl7ZHJhbV9vZHQ9NDt9CgoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoZHJhbV9vZHQ+MjgwKQoJCQkJCXtkcmFtX29kdD0wO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4xODApCgkJCQkJe2RyYW1fb2R0PTQ7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjEwMCkKCQkJCQl7ZHJhbV9vZHQ9Mjt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+NzApCgkJCQkJe2RyYW1fb2R0PTY7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjU0KQoJCQkJCXtkcmFtX29kdD0xO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD40NCkKCQkJCQl7ZHJhbV9vZHQ9NTt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MzcpCgkJCQkJe2RyYW1fb2R0PTM7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PD0zNCkKCQkJCQl7ZHJhbV9vZHQ9Nzt9CgoJCQkJfQoKCgoJCQl9CgoJCQl6cXByX3NvY19kcmFtPShkcmFtX2RhdGFfb2R0X2Fkal9lbmFibGU8PDMwKXwoZHJhbV9kYXRhX2Rydl9hZGpfZW5hYmxlPDwyOSl8KHNvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZTw8MjgpfAoJCQkJKGRyYW1fb2R0PDwyNCl8KGRyYW1fZHJ2PDwyMCl8KHNvY19kYXRhX29kdDw8MTYpfChzb2NfZGF0YV9kcnY8PDEyKXwoc29jX2RhdGFfZHJ2PDw4KXwoc29jX2RhdGFfb2R0PDw0KXwoc29jX2RhdGFfZHJ2KTsKCQl9Cgl9CgoKCWlmIChzb2NfZHJhbV9oZXhfZGVjKQoJewoJCWlmIChhcmdjID40KQoJCXsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZiA9IDA7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCQl9CgkJaWYgKGFyZ2MgPjUpCgkJewoJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSAwOwoJCQl9CgkJfQoJCWlmIChhcmdjID43KQoJCXsKCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWYgPSAwOwoJCQl9CgkJfQoJCWlmIChkZHJfdGVzdF9jbWRfc29jX3ZyZWYpCgkJewoJCQlpZiAoZGRyX3Rlc3RfY21kX3NvY192cmVmPDQ1KQoJCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmPTQ1OwoJCQlpZiAoZGRyX3Rlc3RfY21kX3NvY192cmVmPjg4KQoJCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmPTg4OwoJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWY9KGRkcl90ZXN0X2NtZF9zb2NfdnJlZioxMDAtNDQwNykvNzA7CgkJfQoKCQlpZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZikKCQl7CgkJCWlmIChkZHJfdGVzdF9jbWRfZHJhbV92cmVmPDQ1KQoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj00NTsKCQkJaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY+OTIpCgkJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmPTkyOwoJCQlpZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj42MCkgewoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj0oZGRyX3Rlc3RfY21kX2RyYW1fdnJlZioxMDAtNjAwMCkvNjU7CgkJCX0KCQkJZWxzZXsKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9KChkZHJfdGVzdF9jbWRfZHJhbV92cmVmKjEwMC00NTAwKS82NSl8KDE8PDYpOwoJCQl9CgkJfQoKCgkJcHJpbnRmKCJcblNldCBkZHJfdGVzdF9jbWRfZHJhbV92cmVmIFsweCUwOHhdXG4iLGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYpOwoJCWlmIChkZHJfdGVzdF9jbWRfenFfdnJlZiA9PSAwKQoJCQlkZHJfdGVzdF9jbWRfenFfdnJlZj0wOwoJCWlmIChkZHJfdGVzdF9jbWRfenFfdnJlZikgewoJCQlpZiAoZGRyX3Rlc3RfY21kX3pxX3ZyZWY8NDUpCgkJCQlkZHJfdGVzdF9jbWRfenFfdnJlZj00NTsKCQkJaWYgKGRkcl90ZXN0X2NtZF96cV92cmVmPjg4KQoJCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWY9ODg7CgkJCWRkcl90ZXN0X2NtZF96cV92cmVmPShkZHJfdGVzdF9jbWRfenFfdnJlZioxMDAtNDQwNykvNzA7CgkJfQoJfQoKCS8vaWYoZGRyX3Rlc3RfY21kX3R5cGU9PUREUl9URVNUX0NNRF9URVNUX0FDX0JJVF9IT0xEKQoJLy97aWYgKGRkcl90ZXN0X2NtZF9jbGtfc2VlZCA9PTApCgkvL2Rkcl90ZXN0X2NtZF9jbGtfc2VlZCA9IDB4M2Y7CgkvL2lmIChkZHJfdGVzdF9jbWRfYWNiZGxfeF9zZWVkID09MCkKCS8vZGRyX3Rlc3RfY21kX2FjYmRsX3hfc2VlZCA9IDB4M2Y7CgkvL30KCiNpZiBkZWZpbmVkKENPTkZJR19NNlRWKSB8fCBkZWZpbmVkKENPTkZJR19NNlRWRCkKCXdyaXRlbCh6cWNyIHwgKDB4M2MgPDwgMjQpLCBQUkVHX1NUSUNLWV9SRUcwKTsKI2Vsc2UKCXdyaXRlbCh6cWNyIHwgKDB4ZjEzIDw8IDIwKSwgUFJFR19TVElDS1lfUkVHMCk7CiNlbmRpZgojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCgl3cml0ZWwoKGRkcl90ZXN0X2NtZF96cV92cmVmPDwyNCl8KGRkcl90ZXN0X2NtZF9zb2NfdnJlZjw8OCl8ZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiAsIFBSRUdfU1RJQ0tZX1JFRzkpOwoJd3JpdGVsKCh6cXByX3NvY19kcmFtPDwwKSAsIFBSRUdfU1RJQ0tZX1JFRzgpOwoJc29jX2RhdGFfZHJ2X29kdD16cXByX3NvY19kcmFtJjB4ZmZmZmY7CglkcmFtX2Rydj0oenFwcl9zb2NfZHJhbT4+MjApJjB4ZjsKCWRyYW1fb2R0PSh6cXByX3NvY19kcmFtPj4yNCkmMHhmOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gWzB4JTA4eF0sLi5iaXQyOCBlbmFibGUgc29jX3pxcHIgLCAgIGJpdCAyOSBlbmFiZSBkcmFtX2RydiwgICBiaXQgMzAgZW5hYmVsIGRyYW1fb2R0XG4iLCB6cXByX3NvY19kcmFtKTsKCXByaW50Zigic29jX2RhdGFfZHJ2X29kdCBbMHglMDh4XSxkcmFtX2RydiBbMHglMDh4XSxkcmFtX29kdCBbMHglMDh4XVxuIiwgc29jX2RhdGFfZHJ2X29kdCxkcmFtX2RydixkcmFtX29kdCk7CglpZihkZHJfZnVsbF90ZXN0X2VuYWJsZSkKCXsKCQlwbGw9KGRkcl9mdWxsX3Rlc3RfZW5hYmxlPDwyMSl8cGxsOwoJCXByaW50ZigiZGRyX2Z1bGxfdGVzdF9lbmFibGUgJTA4eCxzZXQgc3RpY2t5IHJlZzEgYml0IDIxIDFcbiIsIGRkcl9mdWxsX3Rlc3RfZW5hYmxlKTsKCX0KCiNlbmRpZgoKCgl3cml0ZWwocGxsLCBQUkVHX1NUSUNLWV9SRUcxKTsKCglwcmludGYoIlNldCBwbGwgZG9uZSBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHMSkpOwoJcHJpbnRmKCJTZXQgU1RJQ0tZX1JFRzAgWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzApKTsKI2lmICggQ09ORklHX0REUl9QSFk+PVBfRERSX1BIWV85MDVYKQoJcHJpbnRmKCJTZXQgU1RJQ0tZX1JFRzkgWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzkpKTsKCXByaW50ZigiU2V0IFNUSUNLWV9SRUc4IFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUc4KSk7CgojZW5kaWYKCXByaW50ZigiXG5iZWdpbiByZXNldCAxMTEuLi4uLi4uLi4uLlxuIik7CglwcmludGYoIlxuYmVnaW4gcmVzZXQgMi4uLi4uLi4uLi4uXG4iKTsKCXByaW50ZigiXG5iZWdpbiByZXNldCAzLi4uLi4uLi4uLi5cbiIpOwoKI2lmZGVmIENPTkZJR19NOEIKCXByaW50ZigiIHQxIFxuIik7Cgl3cml0ZWwoMHhmMDgwMDAwIHwgMjAwMCwgV0FUQ0hET0dfVEMpOwojZWxzZQoJcHJpbnRmKCIgdDIgXG4iKTsKCS8vICB3cml0ZWwoV0FUQ0hET0dfVEMsIDB4ZjQwMDAwMCB8IDIwMDApOwoJLy8gKlBfV0FUQ0hET0dfUkVTRVQgPSAwOwoJZGRyX3Rlc3Rfd2F0Y2hkb2dfcmVzZXRfc3lzdGVtKCk7CiNlbmRpZgoJd2hpbGUoMSk7CglyZXR1cm4gMDsKCnVzYWdlOgoKCXByaW50ZigiIGRkcl90ZXN0X2NtZCAweDE3IGNsayB6cV9hYyB6cV9zb2NfZHJhbSBzb2NfdnJlZiBkcmFtX3ZyZWYgZGVjX2hleCB6cV92cmVmIDBcbiIpOwoJcHJpbnRmKCJleGFtcGxlIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDUwIDgxIDEgNTAgXG4iKTsKCXByaW50Zigib3IgIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDB4MDkgMHgyMCAwIDUwIFxuIik7CglwcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDYwMzQgMDYwMzQwNjAzNCAwIDAgMCAwIDEgXG4iKTsKCXByaW50Zigic2V0dGluZyB6cXByX3NvY19kcmFtICwuLmJpdDI4IGVuYWJsZSBzb2NfenFwciAsICAgYml0IDI5IGVuYWJlIGRyYW1fZHJ2LCAgIGJpdCAzMCBlbmFiZWwgZHJhbV9vZHRcbiIpOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gLGJpdDAtYml0MTkgIHNvY19kYXRhX2Rydl9vZHQsYml0MjAtYml0MjQgIGRyYW1fZHJ2ICwgIGJpdDI0LWJpdDI4ICBkcmFtX29kdFxuIik7CglwcmludGYoInNldHRpbmcgenFwcl9zb2NfZHJhbSAsYml0MC1iaXQxOSBiaXQgMC03IHVzZSBmb3IgZGRyM6OsYml0OC0xOSB1c2UgZm9yIGRkcjQsb2R0X2Rvd25fdXBcbiIpOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gLHNvY19kcnY9KDQ4MC8oKHNldHRpbmcpKzEpKTtkZHI0LS0tc29jX29kdD0oNDgwLyhzZXR0aW5nKSsxKSk7ZGRyMy0tLXNvY19vZHQ9KDM2MC8oc2V0dGluZykrMSkpO1xuIik7CgoJcHJpbnRmKCIgRERSM19EUlZfNDBPSE0JCTBcbiIpOwoJcHJpbnRmKCIgRERSM19EUlZfMzRPSE0JCTFcblxuIik7CgoJcHJpbnRmKCIgRERSM19PRFRfME9ITQkJMFxuIik7CglwcmludGYoIiBERFIzX09EVF82ME9ITQkJMVxuIik7CglwcmludGYoIiBERFIzX09EVF8xMjBPSE0JMlxuIik7CglwcmludGYoIiBERFIzX09EVF80ME9ITQkJM1xuIik7CglwcmludGYoIiBERFIzX09EVF8yME9ITQkJNFxuIik7CglwcmludGYoIiBERFIzX09EVF8zME9ITQkJNVxuXG5cbiIpOwoKCXByaW50ZigiIExQRERSMl9EUlZfMzRPSE0JMVxuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzQwT0hNCTJcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl80OE9ITQkzXG4iKTsKCXByaW50ZigiIExQRERSMl9EUlZfNjBPSE0JNFxuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzgwT0hNCTZcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl8xMjBPSE0JN1xuXG4iKTsKCglwcmludGYoIiBMUEREUjJfT0RUXzBPSE0JMFxuXG5cbiIpOwoKCglwcmludGYoIiBMUEREUjNfRFJWXzM0T0hNCTFcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl80ME9ITQkyXG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfNDhPSE0JM1xuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzYwT0hNCTRcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl84ME9ITQk2XG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfMzRfNDBPSE0JOVxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzQwXzQ4T0hNCTEwXG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfMzRfNDhPSE0JMTFcblxuIik7CgoJcHJpbnRmKCIgTFBERFIzX09EVF8wT0hNCQkwXG4iKTsKCXByaW50ZigiIExQRERSM19PRFRfNjBPSE0JMVxuIik7CglwcmludGYoIiBMUEREUjNfT0RUXzEyT0hNCTJcbiIpOwoJcHJpbnRmKCIgTFBERFIzX09EVF8yNDBITQkzXG5cblxuIik7CgoJcHJpbnRmKCIgRERSNF9EUlZfMzRPSE0JCTBcbiIpOwoJcHJpbnRmKCIgRERSNF9EUlZfNDhPSE0JCTFcblxuIik7CgoJcHJpbnRmKCIgRERSNF9PRFRfME9ITQkJMFxuIik7CglwcmludGYoIiBERFI0X09EVF82ME9ITQkJMVxuIik7CglwcmludGYoIiBERFI0X09EVF8xMjBPSE0JCTJcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfNDBPSE0JCTNcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfMjQwT0hNCQk0XG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzQ4T0hNCQk1XG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzgwT0hNCQk2XG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzM0T0hNCQk3XG5cblxuXG4iKTsKCgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgppbnQgZG9fZGRyX3Vib290X25ld19jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvL2Rkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIGNtZF9vZmZzZXQgY21kX3ZhbHVlIHZhbHVlX3NpemUgcmVzZXRfZW5hYmxlCiNpZiAxCgkvLyNkZWZpbmUgRERSX1VTRV9ERUZJTkVfVEVNUExBVEVfQ09ORklHICAgMQoJLy8jZGVmaW5lIEREUl9TVElDS1lfTUFHSUNfTlVNQkVSCQkJCQkweDIwMTgwMDAwCgkvLyNkZWZpbmUgRERSX0NISVBfSUQJCQkJCQkJCTB4MzAKCS8vI2RlZmluZSBERFJfU1RJQ0tZX1NPVVJDRV9ETUNfU1RJQ0tZCQkJMHgxCgkvLyNkZWZpbmUgRERSX1NUSUNLWV9TT1VSQ0VfU1JBTQkJCQkJMHgyCgkvL2RtYyBzdGlja3kgcmVnIGRlZmF1bHQgbm90IDAuIG5lZWQgdXNlIGNvbW1vbiBzdGlja3kgcmVnIGFzIGlkZW50aXR5CgojaWYgMAoJdW5zaWduZWQgaW50IGRkcl9wbGwgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMMCk7CglleHRlcm4gaW50IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGtfZzEyYSh1bnNpZ25lZCBpbnQpOwoJZ2xvYmFsX2Rkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2Nsa19nMTJhKGRkcl9wbGwpOwojZW5kaWYKI2RlZmluZSBERFJfU1RJQ0tZX09WRVJSSURFX0NPTkZJR19NRVNTQUdFX0NNRAkweDEgLy9vdmVycmlkZSBjb25maWcKI2RlZmluZSBERFJfU1RJQ0tZX1NQRUNJQUxfRlVOQ1RJT05fQ01ECQkJMHgyIC8vc3BlY2lhbCB0ZXN0IHN1Y2ggYXMgc2hpZnQgc29tZSBiZGxyIG9yIHBhcmFtZXRlciBvciBpbnRlcmxlYXZlIHRlc3QKCiNkZWZpbmUgRzEyX0RNQ19TVElDS1lfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MDAwMCAgPDwgMikgKyAweGZmNjM4ODAwKQoJdWludDMyX3QgbWFnaWNfY2hpcGlkPSAwOy8vcmRfcmVnKFBfUFJFR19TVElDS1lfUkVHMCk7Cgl1aW50MzJfdCBzdGlja3lfY21kID0gMDsvL3JkX3JlZyhQX1BSRUdfU1RJQ0tZX1JFRzEpOwoJdWludDMyX3QgY21kX29mZnNldCA9IDA7Cgl1aW50MzJfdCBjbWRfdmFsdWUgPSAwOwoJdWludDMyX3QgcmVzZXRfZW5hYmxlID0gMDsKCXVpbnQzMl90IHZhbHVlX3NpemUgPSA0OwoJY2hhciAqZW5kcDsKCS8vYml0IDAgdHJpZ2dlciBlZmZlY3QgcmVzZXQuCglpZiAoKG1hZ2ljX2NoaXBpZCkgIT0gKChERFJfU1RJQ0tZX01BR0lDX05VTUJFUitERFJfQ0hJUF9JRCkmMHhmZmZmMDAwMCkpIHsKCQkvL21hZ2ljIG51bWJlciBub3QgbWF0Y2gKCQkvLwltYWdpY19jaGlwaWQ9RERSX1NUSUNLWV9NQUdJQ19OVU1CRVIrRERSX0NISVBfSUQ7CgkJLy8Jc3RpY2t5X2NtZD1ERFJfU1RJQ0tZX09WRVJSSURFX0NPTkZJR19NRVNTQUdFX0NNRDsKCQlwcmludGYoInN0aWNreTAgbWFnaWMgbm90IG1hdGNoXG4iKTsKCgl9CgoKCS8vCXdyX3JlZyhQX1BSRUdfU1RJQ0tZX1JFRzAsIDApOwoJLy8Jd3JfcmVnKFBfUFJFR19TVElDS1lfUkVHMSwgMCk7CgoKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoKCglpZiAoYXJnYyA8IDIpCgkJZ290byB1c2FnZTsKCgltYWdpY19jaGlwaWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLDApOwoJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCXByaW50ZiAoIkVycm9yOiBXcm9uZyBmb3JtYXQgcGFyYW1lbnQhXG4iKTsKCQlyZXR1cm4gMTsKCX0KCWlmIChhcmdjID4yKQoJewoJCXN0aWNreV9jbWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNreV9jbWQgPSAwOwoJCX0KCX0KCglpZiAoYXJnYyA+MykKCXsKCQljbWRfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQljbWRfb2Zmc2V0ID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NCkKCXsKCQljbWRfdmFsdWU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJY21kX3ZhbHVlID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NSkKCXsKCQl2YWx1ZV9zaXplPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXZhbHVlX3NpemUgPSA0OwoJCX0KCX0KCWlmIChhcmdjID42KQoJewoJCXJlc2V0X2VuYWJsZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlyZXNldF9lbmFibGUgPSAwOwoJCX0KCX0KCXByaW50ZigiY21kX29mZnNldFsweCUwOHh9PT1jbWRfdmFsdWUgWzB4JTA4eF1cbiIsIGNtZF9vZmZzZXQsY21kX3ZhbHVlKTsKCXdyaXRlbCgobWFnaWNfY2hpcGlkJjB4ZmZmZjAwMDApfChyZF9yZWcoUFJFR19TVElDS1lfUkVHMCkpLCBQUkVHX1NUSUNLWV9SRUcwKTsKCXdyaXRlbChzdGlja3lfY21kLCBQUkVHX1NUSUNLWV9SRUcxKTsKCgl1aW50MzJfdCByZWFkX3ZhbHVlID0gMDsKCWlmKHZhbHVlX3NpemUpCgl7CgkJcmVhZF92YWx1ZT1yZF9yZWcoRzEyX0RNQ19TVElDS1lfMCsoKGNtZF9vZmZzZXQvNCk8PDIpKTsKCQlpZih2YWx1ZV9zaXplPT0xKXsKCQkJd3JfcmVnKChHMTJfRE1DX1NUSUNLWV8wKygoY21kX29mZnNldC80KTw8MikpLCAoKGNtZF92YWx1ZTw8KChjbWRfb2Zmc2V0JTQpKjgpKXwocmVhZF92YWx1ZSYofigweGZmPDwoKGNtZF9vZmZzZXQlNCkqOCkpKSkpKTsKCQl9CgkJaWYodmFsdWVfc2l6ZT09Mil7CgkJCXdyX3JlZygoRzEyX0RNQ19TVElDS1lfMCsoKGNtZF9vZmZzZXQvNCk8PDIpKSwgKChjbWRfdmFsdWU8PCgoY21kX29mZnNldCU0KSo4KSl8KHJlYWRfdmFsdWUmKH4oMHhmZmZmPDwoKGNtZF9vZmZzZXQlNCkqOCkpKSkpKTsKCQl9CgkJaWYodmFsdWVfc2l6ZT09NCl7CgkJCS8vCXdyX3JlZygoRzEyX0RNQ19TVElDS1lfMCtjbWRfb2Zmc2V0LzQpLCAoKGNtZF92YWx1ZTw8KChjbWRfb2Zmc2V0JTQpKjgpKXwocmVhZF92YWx1ZSYofigweGZmZmY8PCgoY21kX29mZnNldCU0KSo4KSkpKSkpOwoJCQl3cl9yZWcoKEcxMl9ETUNfU1RJQ0tZXzArKChjbWRfb2Zmc2V0LzQpPDwyKSksIGNtZF92YWx1ZSk7CgkJfQoKCgoKCQlwcmludGYoIkRNQ19TVElDS1lfMF8gb2Zmc2V0WzB4JTA4eH09PSBbMHglMDh4XVxuIiwgY21kX29mZnNldCxyZWFkbCgoRzEyX0RNQ19TVElDS1lfMCsoKGNtZF9vZmZzZXQvNCk8PDIpKSkpOwoJfQoKCglwcmludGYoIlBSRUdfU1RJQ0tZX1JFRzA9PSBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHMCkpOwoKCWlmKHJlc2V0X2VuYWJsZSkKCXsKCQlkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCgkJd2hpbGUoMSk7Cgl9CglyZXR1cm4gMDsKCnVzYWdlOgoKCgoKCgljbWRfdXNhZ2UoY21kdHApOwoKI2VuZGlmCglyZXR1cm4gMTsKfQoKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCiNlbHNlCmludCBkb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3coY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgYWMgYml0IHdpbmRvdyAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJdW5zaWduZWQgaW50ICAgZGRsXzEwMHN0ZXBfcHM9IDA7CgoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoJdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudD0gMDsKCXVuc2lnbmVkIGludCAgIHRlbXBfcmVnX3ZhbHVlWzQwXTsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2FjX3NldHVwX2hvbGQ9MDsKCS8vdW5zaWduZWQgaW50ICAgdGVzdGluZ19zZWVkPTA7CgkvLyB1bnNpZ25lZCBpbnQgICB0ZXN0X2xhbmVfc3RlcF9yZHFzX2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgIHRlc3RfYWNiZGw9MDsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2FfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9iX2VuID0gMDsKCgoJdW5zaWduZWQgaW50ICAgYWNiZGxyMF9yZWdfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfaG9sZF9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY2JkbHJfeF9yZWdfaG9sZF9taW49MDsKCXVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19zZXR1cF9tYXg9MDsKCS8vICAgIHVuc2lnbmVkIGludCAgIGFjYmRscl94X3JlZ19zZXR1cF9tYXg9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19sZWZ0PTA7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHQ9MDsKCgoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnRfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfcmlnaHRfbWluPTA7CgoJdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJLy8gICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCgoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZjsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWc7CgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoJewoJCWlmIChhcmdjID09IDIpCgkJewoJCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2FfZW4gPSAxOwoJCQl9CgkJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWdvdG8gdXNhZ2U7CgkJCX0KCQl9CgkJaWYgKGFyZ2MgPiAyKQoJCXsKCQkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2FfZW4gPSAxOwoJCQl9CgkJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2JfZW4gPSAxOwoJCQl9CgkJfQoJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJaWYgKGFyZ2MgPjMpIHsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQkJfQoKCQl9CgkJaWYgKGFyZ2MgPjQpIHsKCQkJdGVzdF9hY19zZXR1cF9ob2xkID0gMDsKCQkJdGVzdF9hY19zZXR1cF9ob2xkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2FjX3NldHVwX2hvbGQgPSAwOwoJCQl9CgkJCWlmICAgKChzdHJjbXAoYXJndls0XSwgImwiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbNF0sICJMIikgPT0gMCkpCgkJCXsKCQkJCXRlc3RfYWNfc2V0dXBfaG9sZCA9IDA7CgkJCX0KCQl9CgkJaWYgKHRlc3RfYWNfc2V0dXBfaG9sZCA+MSkKCQkJdGVzdF9hY19zZXR1cF9ob2xkID0gMjsKCQlpZiAoYXJnYyA+NSkgewoKCQkJdGVzdF9hY2JkbD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2FjYmRsID0gMDsKCQkJfQoJCQlpZiAodGVzdF9hY2JkbD4zOSkKCQkJCXRlc3RfYWNiZGwgPTEyOy8vZGVmYXVsdCB0ZXN0IGNzMCBwaW4KCQl9Cgl9CglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2FjX3NldHVwX2hvbGQ9PSAweCUwOHhcbiIsIHRlc3RfYWNfc2V0dXBfaG9sZCk7CglwcmludGYoIlxudGVzdF9hY2JkbD09IDB4JTA4eFxuIiwgdGVzdF9hY2JkbCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJCXsKCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCXByaW50ZigiXG5zaG91bGQgcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJd3JpdGVsKChyZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSl8KDE8PDI5KSwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJcHJpbnRmKCJcbiBwYXVzZSBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgoKCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTApOyh0ZW1wX2NvdW50KyspKQoJCQkJewoJCQkJCWFjYmRscjBfOV9yZWdfb3JnW3RlbXBfY291bnRdPShyZWFkbChERFIwX1BVQl9BQ0JETFIwKyh0ZW1wX2NvdW50PDwyKStyZWdfYmFzZV9hZGopKTsKCgkJCQl9OwoKCgkJCQl7CgkJCQkJZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpOwoJCQkJCXByaW50ZigiXG5kZGxfMTAwc3RlcF9wcz09ICUwOGQsMF81Y3ljbGVfcHM9PSAlMDhkLDBfNWN5Y2xlPT0weCUwOHhcbiIsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLAoJCQkJCQkJKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjArcmVnX2Jhc2VfYWRqKSkpPj4xNikmMHhmZikpOwoKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqOwoJCQkJCWFjYmRscjBfcmVnX29yZz1yZWFkbChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJYWNiZGxyX3hfcmVnX29yZz1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJcHJpbnRmKCJcbnRlc3RfYWNiZGwgJTA4eCB8IGFjX3NldHVwX2hvbGQ9PTB4JTA4eFxuICIsdGVzdF9hY2JkbCx0ZXN0X2FjX3NldHVwX2hvbGQpOwoJCQkJCXByaW50ZigiXG5hY2JkbHIwX3JlZ18weCUwOHhfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ18weCUwOHhfb3JnPT0weCUwOHhcbiAiLChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaiksCgkJCQkJCQlhY2JkbHIwX3JlZ19vcmcsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSxhY2JkbHJfeF9yZWdfb3JnKTsKCQkJCQlpZiAodGVzdF9hY19zZXR1cF9ob2xkID09IDApCgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdF9hY19zZXR1cFxuICIpOwoKCgkJCQkJCS8vd3JpdGVsKDAsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9cmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoKCgkJCQkJCS8ve3dyaXRlbCgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSksKCh0ZXN0X2FjYmRsLzQpKjQrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCQkJCQkJLy99CgoKCgkJCQkJCXJlZ19hZGQ9KCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJYWNiZGxyX3hfcmVnX29yZz1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpOwoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTxBQ0JETFJfTUFYKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHZhbHVlPT0weCUwOHgiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkJKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpOwoKCQkJCQkJCXsKCQkJCQkJCQl3cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7CgoJCQkJCQkJfQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gcmlnaHQgZWRnZSBkZXRlY3QgLHJlZz09MHglMDh4XG4iLCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoJCQkJCQlwcmludGYoIlxuIG9yZz09MHglMDh4LHJpZ2h0IGVkZ2U9PTB4JTA4eCx2YWx1ZT09MHglMDh4XG4gIiwoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkoKGFjYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYWNiZGwlNCkpKSk7CgoJCQkJCQl7YWNiZGxyX3hfcmVnX3NldHVwX21heD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCQkJCQkJLy93cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7CgkJCQkJCXdyaXRlbCgoKGFjYmRscl94X3JlZ19vcmcpKSxyZWdfYWRkKTsKCQkJCQkJLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKCQkJCQkJewoJCQkJCQkJcHJpbnRmKCJcbnRlc3RfYWNiZGwgJTA4eCB8IGFjX3NldHVwX2hvbGQ9PTB4JTA4eCBhY21kbHI9PTB4JTA4eCAgZGRsXzEwMHN0ZXBfcHM9PSUwOGRcbiIsdGVzdF9hY2JkbCx0ZXN0X2FjX3NldHVwX2hvbGQsCgkJCQkJCQkJCXJlYWRsKEREUjBfUFVCX0FDTURMUjArcmVnX2Jhc2VfYWRqKSxkZGxfMTAwc3RlcF9wcyk7CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMF9yZWdfb3JnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYWNiZGxyMF9yZWdfb3JnLGFjYmRscl94X3JlZ19vcmcpOwoJCQkJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfc2V0dXBfbWF4IDB4JTA4eCAgXAoJCQkJCQkJCQlzZXR1cCB0aW1lPT0weCUwOHgsICUwOGQgcHMgXG4gIiwKCQkJCQkJCQkJYWNiZGxyX3hfcmVnX3NldHVwX21heCwoYWNiZGxyX3hfcmVnX3NldHVwX21heC0KCQkJCQkJCQkJCSgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKSksKChhY2JkbHJfeF9yZWdfc2V0dXBfbWF4LQoJCQkJCQkJCQkJCSgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKSkgKmRkbF8xMDBzdGVwX3BzKS8xMDAKCQkJCQkJCQkgICk7CgkJCQkJCQlhY2JkbHIwXzlfcmVnX3NldHVwX21heFt0ZXN0X2FjYmRsXT0oYWNiZGxyX3hfcmVnX3NldHVwX21heC0KCQkJCQkJCQkJKChhY2JkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9hY2JkbCU0KSkpJjB4ZmYpKTsKCQkJCQkJCWFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVt0ZXN0X2FjYmRsXT0oKGFjYmRscl94X3JlZ19zZXR1cF9tYXgtCgkJCQkJCQkJCQkoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZikpICpkZGxfMTAwc3RlcF9wcykvMTAwOwoJCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwxMCk7KHRlbXBfY291bnQrKykpCgkJCQkJCQl7CgkJCQkJCQkJd3JpdGVsKCgoYWNiZGxyMF85X3JlZ19vcmdbdGVtcF9jb3VudF0pKSwoRERSMF9QVUJfQUNCRExSMCsodGVtcF9jb3VudDw8MikrcmVnX2Jhc2VfYWRqKSk7CgoJCQkJCQkJfTsKCgkJCQkJCX0KCgkJCQkJfQoKCQkJCQlpZiAodGVzdF9hY19zZXR1cF9ob2xkID09IDEpCgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdF9hY19ob2xkIDFcbiAiKTsKCQkJCQkJYWNiZGxyMF9yZWdfb3JnPXJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJYWNiZGxyX3hfcmVnX29yZz1yZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCXByaW50ZigiXG50ZXN0X2FjYmRsICUwOHggfCBhY19zZXR1cF9ob2xkPT0weCUwOHhcbiAiLHRlc3RfYWNiZGwsdGVzdF9hY19zZXR1cF9ob2xkKTsKCQkJCQkJcHJpbnRmKCJcbmFjYmRscjBfcmVnX29yZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGFjYmRscjBfcmVnX29yZyxhY2JkbHJfeF9yZWdfb3JnKTsKCgoJCQkJCQlwcmludGYoIlxuYWNiZGxyMF9yZWc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnPT0weCUwOHhcbiAiLAoJCQkJCQkJCXJlYWRsKEREUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSxyZWFkbCgoKHRlc3RfYWNiZGw+PjIpPDwyKStERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoKCQkJCQkJcmVnX2FkZD0oKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0oKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZik7CgkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPjApCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQkJcHJpbnRmKCJcbiByZWc9PTB4JTA4eCwgbGVmdCB0ZW1wPT0weCUwOHhcbiAsdmFsdWU9PTB4JTA4eCAiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkJKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpOwoKCQkJCQkJCXsKCQkJCQkJCQl3cml0ZWwoKChhY2JkbHJfeF9yZWdfb3JnKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4Kih0ZXN0X2FjYmRsJTQpKSkscmVnX2FkZCk7CgoJCQkJCQkJfQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gbGVmdCBlZGdlIGRldGVjdCAscmVnPT0weCUwOHhcbiIsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCXByaW50ZigiXG4gb3JnPT0weCUwOHgsbGVmdCBlZGdlPT0weCUwOHhcbiAiLCgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKSxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCgkJCQkJCXthY2JkbHJfeF9yZWdfaG9sZF9taW49ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTt9CgoKCQkJCQkJLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKCQkJCQkJLy93cml0ZWwoYWNiZGxyMF9yZWdfb3JnLChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikpOwoJCQkJCQl3cml0ZWwoYWNiZGxyX3hfcmVnX29yZywoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCQkJCQkJLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgkJCQkJCS8vIHdyaXRlbCgoKGFjYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYWNiZGwlNCkpKSxyZWdfYWRkKTsKCQkJCQkJewoKCgkJCQkJCQlwcmludGYoIlxudGVzdF9hY2JkbCAlMDh4IHwgYWNfc2V0dXBfaG9sZD09MHglMDh4IGFjbWRscj09MHglMDh4ICBkZGxfMTAwc3RlcF9wcz09JTA4ZFxuIix0ZXN0X2FjYmRsLHRlc3RfYWNfc2V0dXBfaG9sZCwKCQkJCQkJCQkJcmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopLGRkbF8xMDBzdGVwX3BzKTsKCQkJCQkJCXByaW50ZigiXG5hY2JkbHIwX3JlZ19vcmc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnX29yZz09MHglMDh4XG4gIixhY2JkbHIwX3JlZ19vcmcsYWNiZGxyX3hfcmVnX29yZyk7CgkJCQkJCQlwcmludGYoImFjYmRscl94X3JlZ19ob2xkX21pbj09MHglMDh4IFwKCQkJCQkJCQkJaG9sZHVwIHRpbWU9PTB4JTA4eCwgJTA4ZCBwc1xuICIsCgkJCQkJCQkJCWFjYmRscl94X3JlZ19ob2xkX21pbiwKCQkJCQkJCQkJKCgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKS1hY2JkbHJfeF9yZWdfaG9sZF9taW4pLAoJCQkJCQkJCQkoKCgoYWNiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKS1hY2JkbHJfeF9yZWdfaG9sZF9taW4pKmRkbF8xMDBzdGVwX3BzKS8xMDApOwoKCQkJCQkJfQoJCQkJCQlhY2JkbHIwXzlfcmVnX2hvbGRfbWF4W3Rlc3RfYWNiZGxdPSgoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiktYWNiZGxyX3hfcmVnX2hvbGRfbWluKTsKCQkJCQkJYWNiZGxyMF85X3JlZ19ob2xkX3RpbWVbdGVzdF9hY2JkbF09KCgoKGFjYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2FjYmRsJTQpKSkmMHhmZiktYWNiZGxyX3hfcmVnX2hvbGRfbWluKSpkZGxfMTAwc3RlcF9wcykvMTAwOwoKCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwxMCk7KHRlbXBfY291bnQrKykpCgkJCQkJCXsKCQkJCQkJCXdyaXRlbCgoKGFjYmRscjBfOV9yZWdfb3JnW3RlbXBfY291bnRdKSksKEREUjBfUFVCX0FDQkRMUjArKHRlbXBfY291bnQ8PDIpK3JlZ19iYXNlX2FkaikpOwoKCQkJCQkJfTsKCgkJCQkJfQoKCQkJCQlpZiAodGVzdF9hY19zZXR1cF9ob2xkID09IDIpCgkJCQkJewoJCQkJCQlwcmludGYoIlxudGVzdF9hY19ob2xkIDIgbWV0aG9kXG4gIik7CgkJCQkJCWFjYmRscjBfcmVnX29yZz1yZWFkbChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2Fkaik7CgkJCQkJCWFjYmRscl94X3JlZ19vcmc9cmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopOwoJCQkJCQlwcmludGYoIlxudGVzdF9hY2JkbCAlMDh4IHwgYWNfc2V0dXBfaG9sZD09MHglMDh4XG4gIix0ZXN0X2FjYmRsLHRlc3RfYWNfc2V0dXBfaG9sZCk7CgkJCQkJCXByaW50ZigiXG5hY2JkbHIwX3JlZ19vcmc9PTB4JTA4eCAgfCAgYWNiZGxyX3hfcmVnX29yZz09MHglMDh4XG4gIixhY2JkbHIwX3JlZ19vcmcsYWNiZGxyX3hfcmVnX29yZyk7CgoKCQkJCQkJcHJpbnRmKCJcbmFjYmRscjBfcmVnPT0weCUwOHggIHwgIGFjYmRscl94X3JlZz09MHglMDh4XG4gIiwKCQkJCQkJCQlyZWFkbChERFIwX1BVQl9BQ0JETFIwK3JlZ19iYXNlX2FkaikscmVhZGwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCgkJCQkJCXJlZ19hZGQ9KCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPXJlYWRsKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKTsKCQkJCQkJLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4+KDgqKHRlc3RfYWNiZGwlNCkpKSYweGZmKTsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0ocmVhZGwoRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopJjB4ZmYpOwoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTwweDNmKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCXByaW50ZigiXG4gcmVnPT0weCUwOHgsIHJpZ2h0IHRlbXA9PTB4JTA4eCx2YWx1ZT09MHglMDh4XG4gIiwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCSgoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDE2KSkKCQkJCQkJCQkJICB8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCgyNCkpKSYofigweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSl8KGFjYmRscl94X3JlZ19vcmcmKCgweGZmPDwoOCoodGVzdF9hY2JkbCU0KSkpKSkpOwoJCQkJCQkJLyoKCQkJCQkJCSAgIHsKCQkJCQkJCSAgIGZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MTApOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJICAgewoJCQkJCQkJICAgd3JpdGVsKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMTYpKQoJCQkJCQkJICAgfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMjQpKSksKEREUjBfUFVCX0FDQkRMUjArKHRlbXBfY291bnQ8PDIpK3JlZ19iYXNlX2FkaikpOwoJCQkJCQkJICAgfTsKCgkJCQkJCQkgICB3cml0ZWwoKChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMTYpKQoJCQkJCQkJICAgfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoMjQpKSkmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChhY2JkbHJfeF9yZWdfb3JnJigoMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpLAoJCQkJCQkJICAgKCgodGVzdF9hY2JkbD4+Mik8PDIpK0REUjBfUFVCX0FDQkRMUjArcmVnX2Jhc2VfYWRqKSk7CgoJCQkJCQkJICAgfQoJCQkJCQkJICAgKi8KCgkJCQkJCQl7CgkJCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDw0MCk7KHRlbXBfY291bnQrKykpCgkJCQkJCQkJe2lmKHRlbXBfY291bnQ9PSh0ZXN0X2FjYmRsKSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KChyZWFkbChERFIwX1BVQl9BQ0JETFIwKygoKHRlbXBfY291bnQpPj4yKTw8MikrCgkJCQkJCQkJCQkJCQkJcmVnX2Jhc2VfYWRqKSk+Pig4Kih0ZW1wX2NvdW50JTQpKSkmMHhmZjsKCQkJCQkJCQkJfWVsc2UKCQkJCQkJCQkJewoJCQkJCQkJCQkJdGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF09KCgocmVhZGwoRERSMF9QVUJfQUNCRExSMCsoKCh0ZW1wX2NvdW50KT4+Mik8PDIpKwoJCQkJCQkJCQkJCQkJCQlyZWdfYmFzZV9hZGopKT4+KDgqKHRlbXBfY291bnQlNCkpKSYweGZmKSsxOwoJCQkJCQkJCQl9CgkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0+QUNCRExSX01BWCk/KEFDQkRMUl9NQVgpOih0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XSkpOwoKCQkJCQkJCQl9OwoJCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8NDApOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJCXsKCQkJCQkJCQkJd3JpdGVsKCgoKHRlbXBfcmVnX3ZhbHVlWyh0ZW1wX2NvdW50KV0pfCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCsxXSk8PCg4KSl8KCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCsyXSk8PCgxNikpKQoJCQkJCQkJCQkJCQkJfCgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudCszXSk8PCgyNCkpKSksCgkJCQkJCQkJCQkJKEREUjBfUFVCX0FDQkRMUjArKCgodGVtcF9jb3VudCk+PjIpPDwyKSsKCQkJCQkJCQkJCQkgcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCQkJCXRlbXBfY291bnQ9dGVtcF9jb3VudCszOwoJCQkJCQkJCX07CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYmRscl9jaz09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLGNrX3ZhbHVlPT0weCUwOHgiLChERFIwX1BVQl9BQ0JETFIwKwoJCQkJCQkJCQkJCXJlZ19iYXNlX2FkaiksKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpLAoJCQkJCQkJCQkJKHJlYWRsKEREUjBfUFVCX0FDQkRMUjArCgkJCQkJCQkJCQkJICAgcmVnX2Jhc2VfYWRqKSkpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2JkbHJfeD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHhfdmFsdWU9PTB4JTA4eCIsKEREUjBfUFVCX0FDQkRMUjArKCgodGVzdF9hY2JkbCk+PjIpPDwyKSsKCQkJCQkJCQkJCQlyZWdfYmFzZV9hZGopLChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKSwKCQkJCQkJCQkJCShyZWFkbChERFIwX1BVQl9BQ0JETFIwKygoKHRlc3RfYWNiZGwpPj4yKTw8MikrCgkJCQkJCQkJCQkJICAgcmVnX2Jhc2VfYWRqKSkpOwoKCQkJCQkJCX0KCgoKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbndkcWQgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0ICxyZWc9PTB4JTA4eFxuIiwoKCh0ZXN0X2FjYmRsPj4yKTw8MikrRERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGopKTsKCQkJCQkJcHJpbnRmKCJcbm9yZz09MHglMDh4LCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGFjYmRscjBfcmVnX29yZyYweGZmLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoKCQkJCQkJe2FjYmRscl94X3JlZ19ob2xkX21pbj1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlO30KCgoJCQkJCQkvL3Rlc3RfYWNfc2V0dXBfaG9sZD0xOwoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgoJCQkJCQl7CgoKCQkJCQkJCXByaW50ZigiXG50ZXN0X2FjYmRsICUwOHggfCBhY19zZXR1cF9ob2xkPT0weCUwOHggYWNtZGxyPT0weCUwOHggIGRkbF8xMDBzdGVwX3BzPT0lMDhkXG4iLHRlc3RfYWNiZGwsdGVzdF9hY19zZXR1cF9ob2xkLAoJCQkJCQkJCQlyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaiksZGRsXzEwMHN0ZXBfcHMpOwoJCQkJCQkJcHJpbnRmKCJcbmFjYmRscjBfcmVnX29yZz09MHglMDh4ICB8ICBhY2JkbHJfeF9yZWdfb3JnPT0weCUwOHhcbiAiLGFjYmRscjBfcmVnX29yZyxhY2JkbHJfeF9yZWdfb3JnKTsKCQkJCQkJCXByaW50ZigiYWNiZGxyX3hfcmVnX2hvbGRfbWF4PT0weCUwOHggXAoJCQkJCQkJCQlob2xkdXAgdGltZT09MHglMDh4LCAlMDhkIHBzXG4gIiwKCQkJCQkJCQkJYWNiZGxyX3hfcmVnX2hvbGRfbWluLAoJCQkJCQkJCQkoKGFjYmRscl94X3JlZ19ob2xkX21pbi0oYWNiZGxyMF9yZWdfb3JnJjB4ZmYpKSksKChhY2JkbHJfeF9yZWdfaG9sZF9taW4tKGFjYmRscjBfcmVnX29yZyYweGZmKSkqZGRsXzEwMHN0ZXBfcHMpLzEwMCk7CgoJCQkJCQl9CgkJCQkJCWFjYmRscjBfOV9yZWdfaG9sZF9tYXhbdGVzdF9hY2JkbF09KChhY2JkbHJfeF9yZWdfaG9sZF9taW4tKGFjYmRscjBfcmVnX29yZyYweGZmKSkpOwoJCQkJCQlhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVt0ZXN0X2FjYmRsXT0oKGFjYmRscl94X3JlZ19ob2xkX21pbi0oYWNiZGxyMF9yZWdfb3JnJjB4ZmYpKSpkZGxfMTAwc3RlcF9wcykvMTAwOwoJCQkJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEwKTsodGVtcF9jb3VudCsrKSkKCQkJCQkJewoJCQkJCQkJd3JpdGVsKCgoYWNiZGxyMF85X3JlZ19vcmdbdGVtcF9jb3VudF0pKSwoRERSMF9QVUJfQUNCRExSMCsodGVtcF9jb3VudDw8MikrcmVnX2Jhc2VfYWRqKSk7CgoJCQkJCQl9OwoKCQkJCQl9CgkJCQl9CgkJCX0KCgkJfQoKCQkvLyAgZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpOwoKCgoJCXByaW50ZigiXG5kZGxfMTAwc3RlcF9wcz09ICUwOGQsMF81Y3ljbGVfcHM9PSAlMDhkXG4iLCBkZGxfMTAwc3RlcF9wcywoKDEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKSk7CgoJCXByaW50ZigiXG5yZXN1bWUgIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQl3cml0ZWwoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKSYofigxPDwyOSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJcHJpbnRmKCJcbiByZXN1bWUgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoKCQlyZXR1cm4gZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCnVzYWdlOgoJCWNtZF91c2FnZShjbWR0cCk7CgkJcmV0dXJuIDE7CgoJfQp9CgpVX0JPT1RfQ01EKAoJZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93LAk2LAkxLAlkb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3csCgkiRERSIHRlc3QgYWMgYml0IG1hcmdpbiBmdW5jdGlvbiIsCgkiZG9fZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93IGEgMCAweDgwMDAwMDAgMCBjIG9yIGRvX2Rkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyBhIDAgMHg4MDAwMDAwIDIgYyAgXG4gZGNhY2hlIG9mZiA/IFxuIgoJLy9kb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCBzZXR1cC9ob2xkIHBpbl9pZCAvL2MgLS0tIGNzICwsOCAtLS0gYmEwCik7CgppbnQgZG9fZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3coY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLy8qCglwcmludGYoIlxuRW50ZXIgdGVzdCBkZHIgZGF0YSBiaXQgd2luZG93ICBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cgl1bnNpZ25lZCBpbnQgICBkZGxfMTAwc3RlcF9wcz0gMDsKCgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50PSAwOwoKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2RhdGFfc2V0dXBfaG9sZD0wOwoJLy91bnNpZ25lZCBpbnQgICB0ZXN0aW5nX3NlZWQ9MDsKCS8vIHVuc2lnbmVkIGludCAgIHRlc3RfbGFuZV9zdGVwX3JkcXNfZmxhZz0wOwoJdW5zaWduZWQgaW50ICBvcGVuX3Z0PTA7Cgl1bnNpZ25lZCBpbnQgIHRlc3RfYmRsPTA7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCS8vIHVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2JkbHJjaz0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2JkbHJfeD0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgoKCXVuc2lnbmVkIGludCAgIGJkbHJja19yZWdfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBiZGxyX3hfcmVnX29yZz0wOwoJLy8gICB1bnNpZ25lZCBpbnQgICBiZGxyX3hfcmVnX2hvbGRfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX2hvbGRfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBiZGxyX3hfcmVnX3NldHVwX21heD0wOwoJdW5zaWduZWQgaW50ICAgYmRscl94X3JlZ19ob2xkX21heD0wOwoJLy8gICAgdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX3NldHVwX21heD0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX2xlZnQ9MDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodD0wOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW49MDsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZVsyNF07CgoKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX2xlZl9taW5fdmFsdWU7CgkvLyAgICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19yaWdfbWluX3ZhbHVlOwoKCgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfbGVmOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3JpZzsKCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCgl7CgkJaWYgKGFyZ2MgPT0gMikKCQl7CgkJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJCX0KCQkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJCXtjaGFubmVsX2JfZW4gPSAxOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZ290byB1c2FnZTsKCQkJfQoJCX0KCQlpZiAoYXJnYyA+IDIpCgkJewoJCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJCX0KCQkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJCX0KCQl9CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQlpZiAoYXJnYyA+MykgewoJCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCQl9CgoJCX0KCQlpZiAoYXJnYyA+NCkgewoJCQl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IDA7CgkJCXRlc3RfZGF0YV9zZXR1cF9ob2xkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2RhdGFfc2V0dXBfaG9sZCA9IDA7CgkJCX0KCQkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQkJewoJCQkJdGVzdF9kYXRhX3NldHVwX2hvbGQgPSAwOwoJCQl9CgkJfQoJCWlmICh0ZXN0X2RhdGFfc2V0dXBfaG9sZCA+MSkKCQkJdGVzdF9kYXRhX3NldHVwX2hvbGQgPSAxOwoJCWlmIChhcmdjID41KSB7CgoJCQl0ZXN0X2JkbD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfYmRsID0gMDsKCQkJfQoJCQlpZiAodGVzdF9iZGw+OTYpCgkJCQl0ZXN0X2JkbCA9MDsKCQl9CgkJaWYgKGFyZ2MgPjYpIHsKCgkJCW9wZW5fdnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQlvcGVuX3Z0ID0gMDsKCQkJfQoJCQkvL2lmKG9wZW5fdnQpCgkJCS8vCSBvcGVuX3Z0ID0xOwoJCX0KCX0KCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfZGF0YV9zZXR1cF9ob2xkPT0gMHglMDh4XG4iLCB0ZXN0X2RhdGFfc2V0dXBfaG9sZCk7CglwcmludGYoIlxudGVzdF9iZGw9PSAweCUwOHhcbiIsIHRlc3RfYmRsKTsKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7CgoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCgkJCQlwcmludGYoIlxuc2hvdWxkIHBhdXNlIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCXdyaXRlbCgocmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpfCgxPDwyOSksKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCQkJCXByaW50ZigiXG4gcGF1c2UgZGRsIHBpcj09IDB4JTA4eFxuIiwgcmVhZGwoRERSMF9QVUJfUkVHX0JBU0UrNCkpOwoJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwyOCk7KHRlbXBfY291bnQrKykpCgkJCQl7CgkJCQkJLy9kYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XT0oKChyZWFkbCgoKHRlbXBfY291bnQ+PjIpPDwyKStERFIwX1BVQl9EWDBCRExSMCsoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZW1wX2NvdW50LzYpK3JlZ19iYXNlX2FkaikpCgkJCQkJLy8JPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKTsKCQkJCQlkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XT0oKHJlYWRsKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KStyZWdfYmFzZV9hZGopKQoJCQkJCQkJKTsKCQkJCX07CgoKCQkJCXsKCQkJCQlkZGxfMTAwc3RlcF9wcz0oKDEwMCoxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkvKCgoKHJlYWRsKEREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpOwoJCQkJCXByaW50ZigiXG5kZGxfMTAwc3RlcF9wcz09ICUwOGQsMF81Y3ljbGVfcHM9PSAlMDhkLDBfNWN5Y2xlPT0weCUwOHhcbiIsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLAoJCQkJCQkJKCgoKHJlYWRsKEREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkaikpKT4+MTYpJjB4ZmYpKTsKCgkJCQkJLy9yZWdfYWRkPUREUjBfUFVCX0RYMEJETFIwK3JlZ19iYXNlX2FkajsKCQkJCQlyZWdfYmRscmNrPSgoKCh0ZXN0X2JkbCUyNCk+MTEpPyhERFIwX1BVQl9EWDBCRExSNSk6KEREUjBfUFVCX0RYMEJETFIyKSkrKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2Fkaik7CgkJCQkJcmVnX2JkbHJfeD0gKEREUjBfUFVCX0RYMEJETFIwKygoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSkrCgkJCQkJCQkoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKTsKCQkJCQlpZiAoKHRlc3RfYmRsJTI0KT4xMSkKCQkJCQl7cmVnX2JkbHJfeD1yZWdfYmRscl94KzQ7Ly9keG5iZGxyMzQ1IHJlZ2lzdGVyIGFkZCBoYXZlIGEgZ2FwIHdpdGggZHhuYmRscjAxMgoJCQkJCX0KCQkJCQliZGxyY2tfcmVnX29yZz1yZWFkbChyZWdfYmRscmNrKSAgOwoJCQkJCWJkbHJfeF9yZWdfb3JnPXJlYWRsKHJlZ19iZGxyX3gpOwoJCQkJCXByaW50ZigiXG50ZXN0X2JkbCAlMDh4IHwgZGF0YV9zZXR1cF9ob2xkPT0weCUwOHhcbiAiLHRlc3RfYmRsLHRlc3RfZGF0YV9zZXR1cF9ob2xkKTsKCQkJCQlwcmludGYoIlxuYmRscjBfcmVnXzB4JTA4eF9vcmc9PTB4JTA4eCAgfCAgYmRscl94X3JlZ18weCUwOHhfb3JnPT0weCUwOHhcbiAiLHJlZ19iZGxyY2ssCgkJCQkJCQliZGxyY2tfcmVnX29yZyxyZWdfYmRscl94LGJkbHJfeF9yZWdfb3JnKTsKCQkJCQlpZiAodGVzdF9kYXRhX3NldHVwX2hvbGQgPT0gMCkKCQkJCQl7CgkJCQkJCXByaW50ZigiXG50ZXN0X2RhdGFfc2V0dXBcbiAiKTsKCgoKCQkJCQkJcmVnX2JkbHJjaz0oKCgodGVzdF9iZGwlMjQpPjExKT8oRERSMF9QVUJfRFgwQkRMUjUpOihERFIwX1BVQl9EWDBCRExSMikpKyhERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwoJCQkJCQlyZWdfYmRscl94PSAoRERSMF9QVUJfRFgwQkRMUjArKCgoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKSsKCQkJCQkJCQkoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKTsKCQkJCQkJaWYgKCh0ZXN0X2JkbCUyNCk+MTEpCgkJCQkJCXtyZWdfYmRscl94PXJlZ19iZGxyX3grNDsvL2R4bmJkbHIzNDUgcmVnaXN0ZXIgYWRkIGhhdmUgYSBnYXAgd2l0aCBkeG5iZGxyMDEyCgkJCQkJCX0KCQkJCQkJYmRscmNrX3JlZ19vcmc9cmVhZGwocmVnX2JkbHJjaykgIDsKCQkJCQkJYmRscl94X3JlZ19vcmc9cmVhZGwocmVnX2JkbHJfeCk7CgoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpOwoJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTxBQ0JETFJfTUFYKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCXByaW50ZigiXG4gcmVnX2JkbHJfeD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHZhbHVlPT0weCUwOHgiLHJlZ19iZGxyX3gsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkJKChiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYmRsJTQpKSkpOwoKCQkJCQkJCXsKCQkJCQkJCQl3cml0ZWwoKChiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYmRsJTQpKSkscmVnX2JkbHJfeCk7CgoJCQkJCQkJfQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG4gcmlnaHQgZWRnZSBkZXRlY3QgLHJlZz09MHglMDh4XG4iLChyZWdfYmRscl94KSk7CgkJCQkJCXByaW50ZigiXG4gb3JnPT0weCUwOHgscmlnaHQgZWRnZT09MHglMDh4LHZhbHVlPT0weCUwOHhcbiAiLCgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJKChiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYmRsJTQpKSkpOwoKCQkJCQkJe2JkbHJfeF9yZWdfc2V0dXBfbWF4PWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7fQoKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoJCQkJCQkvL3dyaXRlbCgoKGFjYmRscl94X3JlZ19vcmcpJih+KDB4ZmY8PCg4Kih0ZXN0X2FjYmRsJTQpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKHRlc3RfYWNiZGwlNCkpKSxyZWdfYWRkKTsKCQkJCQkJd3JpdGVsKCgoYmRscl94X3JlZ19vcmcpKSxyZWdfYmRscl94KTsKCQkJCQkJLy90ZXN0X2FjX3NldHVwX2hvbGQ9MTsKCQkJCQkJewoJCQkJCQkJcHJpbnRmKCJcbnRlc3RfYmRsICUwOHggfCBkYXRhX3NldHVwX2hvbGQ9PTB4JTA4eCBtZGxyPT0weCUwOHggIGRkbF8xMDBzdGVwX3BzPT0lMDhkXG4iLHRlc3RfYmRsLHRlc3RfZGF0YV9zZXR1cF9ob2xkLAoJCQkJCQkJCQlyZWFkbChERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGopLGRkbF8xMDBzdGVwX3BzKTsKCQkJCQkJCXByaW50ZigiXG5iZGxyX2NrX3JlZ19vcmc9PTB4JTA4eCAgfCAgYmRscl94X3JlZ19vcmc9PTB4JTA4eFxuICIsYmRscmNrX3JlZ19vcmcsYmRscl94X3JlZ19vcmcpOwoJCQkJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfc2V0dXBfbWF4IDB4JTA4eCAgXAoJCQkJCQkJCQlzZXR1cCB0aW1lPT0weCUwOHgsICUwOGQgcHMgXG4gIiwKCQkJCQkJCQkJYmRscl94X3JlZ19zZXR1cF9tYXgsKGJkbHJfeF9yZWdfc2V0dXBfbWF4LQoJCQkJCQkJCQkJKChiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYmRsJTQpKSkmMHhmZikpLCgoYmRscl94X3JlZ19zZXR1cF9tYXgtCgkJCQkJCQkJCQkJKChiZGxyX3hfcmVnX29yZz4+KDgqKHRlc3RfYmRsJTQpKSkmMHhmZikpICpkZGxfMTAwc3RlcF9wcykvMTAwCgkJCQkJCQkJICApOwoJCQkJCQkJYmRscjBfOV9yZWdfc2V0dXBfbWF4W3Rlc3RfYmRsXT0oYmRscl94X3JlZ19zZXR1cF9tYXgtCgkJCQkJCQkJCSgoYmRscl94X3JlZ19vcmc+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpKTsKCQkJCQkJCWJkbHIwXzlfcmVnX3NldHVwX3RpbWVbdGVzdF9iZGxdPSgoYmRscl94X3JlZ19zZXR1cF9tYXgtCgkJCQkJCQkJCQkoKGJkbHJfeF9yZWdfb3JnPj4oOCoodGVzdF9iZGwlNCkpKSYweGZmKSkgKmRkbF8xMDBzdGVwX3BzKS8xMDA7CgkJCQkJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDI4KTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCXsKCQkJCQkJCQl3cml0ZWwoKChkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XSkpLAoJCQkJCQkJCQkJKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KStyZWdfYmFzZV9hZGopKTsKCgkJCQkJCQl9OwoKCQkJCQkJfQoKCQkJCQl9CgoKCgoJCQkJCWlmICh0ZXN0X2RhdGFfc2V0dXBfaG9sZCkKCQkJCQl7CgkJCQkJCXByaW50ZigiXG50ZXN0X2RhdGFfaG9sZFxuICIpOwoKCgoJCQkJCQlyZWdfYmRscmNrPSgoKCh0ZXN0X2JkbCUyNCk+MTEpPyhERFIwX1BVQl9EWDBCRExSNSk6KEREUjBfUFVCX0RYMEJETFIyKSkrKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2Fkaik7CgkJCQkJCXJlZ19iZGxyX3g9IChERFIwX1BVQl9EWDBCRExSMCsoKCgodGVzdF9iZGwlMjQpPj4yKTw8MikpKwoJCQkJCQkJCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopOwoJCQkJCQlpZiAoKHRlc3RfYmRsJTI0KT4xMSkKCQkJCQkJe3JlZ19iZGxyX3g9cmVnX2JkbHJfeCs0Oy8vZHhuYmRscjM0NSByZWdpc3RlciBhZGQgaGF2ZSBhIGdhcCB3aXRoIGR4bmJkbHIwMTIKCQkJCQkJfQoJCQkJCQliZGxyY2tfcmVnX29yZz1yZWFkbChyZWdfYmRscmNrKSAgOwoJCQkJCQliZGxyX3hfcmVnX29yZz1yZWFkbChyZWdfYmRscl94KTsKCgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9KChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZik7CgkJCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPEFDQkRMUl9NQVgpCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYmRscl9jaz09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHZhbHVlPT0weCUwOHgiLHJlZ19iZGxyY2ssZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkJKCgoYmRscmNrX3JlZ19vcmcpJih+KDB4ZmZmZjw8KDgqKDEpKSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKDEpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigyKSkpKSk7CgoJCQkJCQkJewoJCQkJCQkJCS8vIHdyaXRlbCgoKChiZGxyY2tfcmVnX29yZykmKH4oMHhmZmZmPDwoOCooMSkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCooMSkpKXwoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTw8KDgqKDIpKSkpLHJlZ19iZGxyY2spOwoKCQkJCQkJCX0KCgoKCQkJCQkJCWlmICgoKHRlc3RfYmRsJTI0KTwxMikpCgkJCQkJCQl7CgkJCQkJCQkJZm9yICgodGVtcF9jb3VudD0wKTsodGVtcF9jb3VudDwxMik7KHRlbXBfY291bnQrKykpCgkJCQkJCQkJe2lmKHRlbXBfY291bnQ9PSh0ZXN0X2JkbCUyNCkpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgocmVhZGwoRERSMF9QVUJfRFgwQkRMUjArKCgodGVzdF9iZGwlMjQpPj4yKTw8MikrCgkJCQkJCQkJCQkJCQkJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmY7CgkJCQkJCQkJCX1lbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgoKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKwoJCQkJCQkJCQkJCQkJCQkoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKSk+Pig4Kih0ZW1wX2NvdW50JTQpKSkmMHhmZikrMTsKCQkJCQkJCQkJfQoJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPkFDQkRMUl9NQVgpPyhBQ0JETFJfTUFYKToodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0pKTsKCgkJCQkJCQkJfTsKCQkJCQkJCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDEyKTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCQl7CgkJCQkJCQkJCXdyaXRlbCgoKCh0ZW1wX3JlZ192YWx1ZVsodGVtcF9jb3VudCldKXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMV0pPDwoOCkpfCgoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMl0pPDwoMTYpKSkKCQkJCQkJCQkJCQkJCXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrM10pPDwoMjQpKSkpLAoJCQkJCQkJCQkJCShERFIwX1BVQl9EWDBCRExSMCsoKCh0ZW1wX2NvdW50JTI0KT4+Mik8PDIpKwoJCQkJCQkJCQkJCSAoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZXN0X2JkbC8yNCkrcmVnX2Jhc2VfYWRqKSk7CgkJCQkJCQkJCXRlbXBfY291bnQ9dGVtcF9jb3VudCszOwoJCQkJCQkJCX07CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYmRscl94PT0weCUwOHgscmlnaHQgdGVtcD09MHglMDh4XG4seF92YWx1ZT09MHglMDh4IixyZWdfYmRscl94LGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUsCgkJCQkJCQkJCQkocmVhZGwoRERSMF9QVUJfRFgwQkRMUjArKCgodGVzdF9iZGwlMjQpPj4yKTw8MikrCgkJCQkJCQkJCQkJICAgKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpKTsKCgkJCQkJCQl9CgoKCQkJCQkJCWlmICgoKHRlc3RfYmRsJTI0KSA+PSAxMikpCgkJCQkJCQl7CgkJCQkJCQkJZm9yICgodGVtcF9jb3VudD0xMik7KHRlbXBfY291bnQ8MjQpOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJCXtpZih0ZW1wX2NvdW50PT0odGVzdF9iZGwlMjQpKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XT0oKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKzQrCgkJCQkJCQkJCQkJCQkJKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVzdF9iZGwvMjQpK3JlZ19iYXNlX2FkaikpPj4oOCoodGVtcF9jb3VudCU0KSkpJjB4ZmY7CgkJCQkJCQkJCX1lbHNlCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgoKHJlYWRsKEREUjBfUFVCX0RYMEJETFIwKygoKHRlc3RfYmRsJTI0KT4+Mik8PDIpKzQrCgkJCQkJCQkJCQkJCQkJCShERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKT4+KDgqKHRlbXBfY291bnQlNCkpKSYweGZmKSsxOwoJCQkJCQkJCQl9CgkJCQkJCQkJCXRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnRdPSgodGVtcF9yZWdfdmFsdWVbdGVtcF9jb3VudF0+QUNCRExSX01BWCk/KEFDQkRMUl9NQVgpOih0ZW1wX3JlZ192YWx1ZVt0ZW1wX2NvdW50XSkpOwoKCQkJCQkJCQl9OwoJCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MTIpOyh0ZW1wX2NvdW50PDI0KTsodGVtcF9jb3VudCsrKSkKCQkJCQkJCQl7CgkJCQkJCQkJCXdyaXRlbCgoKCh0ZW1wX3JlZ192YWx1ZVsodGVtcF9jb3VudCldKXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMV0pPDwoOCkpfCgoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrMl0pPDwoMTYpKSkKCQkJCQkJCQkJCQkJCXwoKHRlbXBfcmVnX3ZhbHVlW3RlbXBfY291bnQrM10pPDwoMjQpKSkpLAoJCQkJCQkJCQkJCShERFIwX1BVQl9EWDBCRExSMCsoKCh0ZW1wX2NvdW50JTI0KT4+Mik8PDIpKzQrCgkJCQkJCQkJCQkJIChERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKTsKCQkJCQkJCQkJdGVtcF9jb3VudD10ZW1wX2NvdW50KzM7CgkJCQkJCQkJfTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19iZGxyX3g9PTB4JTA4eCxyaWdodCB0ZW1wPT0weCUwOHhcbix4X3ZhbHVlPT0weCUwOHgiLHJlZ19iZGxyX3gsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCQkJCShyZWFkbChERFIwX1BVQl9EWDBCRExSMCsoKCh0ZXN0X2JkbCUyNCk+PjIpPDwyKSs0KwoJCQkJCQkJCQkJCSAgIChERFIwX1BVQl9EWDFCRExSMC1ERFIwX1BVQl9EWDBCRExSMCkqKHRlc3RfYmRsLzI0KStyZWdfYmFzZV9hZGopKSk7CgkJCQkJCQl9CgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlwcmludGYoIlxuIHJpZ2h0IGVkZ2UgZGV0ZWN0ICxyZWc9PTB4JTA4eFxuIiwocmVnX2JkbHJjaykpOwoJCQkJCQlwcmludGYoIlxuIG9yZz09MHglMDh4LHJpZ2h0IGVkZ2U9PTB4JTA4eCx2YWx1ZT09MHglMDh4XG4gIiwoKGJkbHJja19yZWdfb3JnPj4oOCooMSkpKSYweGZmKSxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJCQkJCQkJCSgoKGJkbHJja19yZWdfb3JnKSYofigweGZmZmY8PCg4KigxKSkpKSl8KGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8PCg4KigxKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCooMikpKSkpOwoKCQkJCQkJe2JkbHJfeF9yZWdfaG9sZF9tYXg9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTt9CgoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPTA7CgkJCQkJCS8vd3JpdGVsKCgoYWNiZGxyX3hfcmVnX29yZykmKH4oMHhmZjw8KDgqKHRlc3RfYWNiZGwlNCkpKSkpfChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPDwoOCoodGVzdF9hY2JkbCU0KSkpLHJlZ19hZGQpOwoJCQkJCQl3cml0ZWwoKChiZGxyY2tfcmVnX29yZykpLHJlZ19iZGxyY2spOwoJCQkJCQkvL3Rlc3RfYWNfc2V0dXBfaG9sZD0xOwoJCQkJCQl7CgkJCQkJCQlwcmludGYoIlxudGVzdF9iZGwgJTA4eCB8IGRhdGFfc2V0dXBfaG9sZD09MHglMDh4IG1kbHI9PTB4JTA4eCAgZGRsXzEwMHN0ZXBfcHM9PSUwOGRcbiIsdGVzdF9iZGwsdGVzdF9kYXRhX3NldHVwX2hvbGQsCgkJCQkJCQkJCXJlYWRsKEREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkaiksZGRsXzEwMHN0ZXBfcHMpOwoJCQkJCQkJcHJpbnRmKCJcbmJkbHJfY2tfcmVnX29yZz09MHglMDh4ICB8ICBiZGxyX3hfcmVnX29yZz09MHglMDh4XG4gIixiZGxyY2tfcmVnX29yZyxiZGxyX3hfcmVnX29yZyk7CgkJCQkJCQlwcmludGYoImFjYmRscl94X3JlZ19ob2xkX21heCAweCUwOHggIFwKCQkJCQkJCQkJaG9sZCB0aW1lPT0weCUwOHgsICUwOGQgcHMgXG4gIiwKCQkJCQkJCQkJYmRscl94X3JlZ19ob2xkX21heCwoYmRscl94X3JlZ19ob2xkX21heC0KCQkJCQkJCQkJCSgoYmRscmNrX3JlZ19vcmc+Pig4KigxKSkpJjB4ZmYpKSwoKGJkbHJfeF9yZWdfaG9sZF9tYXgtCgkJCQkJCQkJCQkJKChiZGxyY2tfcmVnX29yZz4+KDgqKDEpKSkmMHhmZikpICpkZGxfMTAwc3RlcF9wcykvMTAwCgkJCQkJCQkJICApOwoJCQkJCQkJYmRscjBfOV9yZWdfaG9sZF9tYXhbdGVzdF9iZGxdPShiZGxyX3hfcmVnX2hvbGRfbWF4LQoJCQkJCQkJCQkoKGJkbHJja19yZWdfb3JnPj4oOCooMSkpKSYweGZmKSk7CgkJCQkJCQliZGxyMF85X3JlZ19ob2xkX3RpbWVbdGVzdF9iZGxdPSgoYmRscl94X3JlZ19ob2xkX21heC0KCQkJCQkJCQkJCSgoYmRscmNrX3JlZ19vcmc+Pig4KigxKSkpJjB4ZmYpKSAqZGRsXzEwMHN0ZXBfcHMpLzEwMDsKCQkJCQkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MjgpOyh0ZW1wX2NvdW50KyspKQoJCQkJCQkJewoJCQkJCQkJCXdyaXRlbCgoKGRhdGFfYmRscjBfNV9yZWdfb3JnW3RlbXBfY291bnRdKSksCgkJCQkJCQkJCQkoKCh0ZW1wX2NvdW50JTcpPDwyKStERFIwX1BVQl9EWDBCRExSMCsoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZW1wX2NvdW50LzcpK3JlZ19iYXNlX2FkaikpOwoKCQkJCQkJCX07CgoJCQkJCQl9CgoJCQkJCX0KCgoKCgoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gIGRkbF8xMDBzdGVwX3BzPSgoMTAwKjEwMDAqMTAwMCkvKDIqZ2xvYmFsX2Rkcl9jbGspKS8oKCgocmVhZGwoRERSMF9QVUJfQUNNRExSMCtyZWdfYmFzZV9hZGopKSk+PjE2KSYweGZmKTsKCgoKCQlwcmludGYoIlxuZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZFxuIiwgZGRsXzEwMHN0ZXBfcHMsKCgxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkpOwoKCQlwcmludGYoIlxucmVzdW1lICBkZGwgcGlyPT0gMHglMDh4XG4iLCByZWFkbChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJaWYgKG9wZW5fdnQpCgkJewoJCQl3cml0ZWwoKHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKSYofigxPDwyOSkpLChERFIwX1BVQl9SRUdfQkFTRSs0KSk7CgkJfQoJCXByaW50ZigiXG4gcmVzdW1lIGRkbCBwaXI9PSAweCUwOHhcbiIsIHJlYWRsKEREUjBfUFVCX1JFR19CQVNFKzQpKTsKCgkJcmV0dXJuIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgoKCgl9Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CgkvLyovCglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3csCTYsCTEsCWRvX2Rkcl90ZXN0X2RhdGFfYml0X3NldHVwX2hvbGRfd2luZG93LAoJIkREUiB0ZXN0IGRhdGEgYml0IG1hcmdpbiBmdW5jdGlvbiIsCgkiZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAwIDMgb3IgZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAxIDMgIFxuIGRjYWNoZSBvZmYgPyBcbiIKKTsKI2VuZGlmCgp1bnNpZ25lZCBpbnQKZG9fdGVzdF9hZGRyZXNzX2J1cyh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKiBiYXNlQWRkcmVzcywgdW5zaWduZWQgaW50IG5CeXRlcykKewoJdW5zaWduZWQgaW50IGFkZHJlc3NNYXNrID0gKG5CeXRlcy9zaXplb2YodW5zaWduZWQgaW50KSAtIDEpOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCXVuc2lnbmVkIGludCB0ZXN0T2Zmc2V0OwoKCXVuc2lnbmVkIGludCBwYXR0ZXJuCSA9ICh1bnNpZ25lZCBpbnQpIDB4QUFBQUFBQUE7Cgl1bnNpZ25lZCBpbnQgYW50aXBhdHRlcm4gPSAodW5zaWduZWQgaW50KSAweDU1NTU1NTU1OwoKCXVuc2lnbmVkIGludCBkYXRhMSwgZGF0YTI7CgoJdW5zaWduZWQgaW50IHJldCA9IDA7CgoJLyoKCSAqIFdyaXRlIHRoZSBkZWZhdWx0IHBhdHRlcm4gYXQgZWFjaCBvZiB0aGUgcG93ZXItb2YtdHdvIG9mZnNldHMuCgkgKi8KCWZvciAob2Zmc2V0ID0gMTsgKG9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyBvZmZzZXQgPDw9IDEpCgl7CgkJYmFzZUFkZHJlc3Nbb2Zmc2V0XSA9IHBhdHRlcm47Cgl9CgoJLyoKCSAqIENoZWNrIGZvciBhZGRyZXNzIGJpdHMgc3R1Y2sgaGlnaC4KCSAqLwoJdGVzdE9mZnNldCA9IDA7CgliYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSA9IGFudGlwYXR0ZXJuOwoKCWZvciAob2Zmc2V0ID0gMTsgKG9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyBvZmZzZXQgPDw9IDEpCgl7CgkJZGF0YTEgPSBiYXNlQWRkcmVzc1tvZmZzZXRdOwoJCWRhdGEyID0gYmFzZUFkZHJlc3Nbb2Zmc2V0XTsKCQlpZiAoZGF0YTEgIT0gZGF0YTIpCgkJewoJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXMgLSByZWFkIHR3aWNlIGRpZmZlcmVudFtvZmZzZXRdOiAweCU4eC0weCU4eFxuIiwgZGF0YTEsIGRhdGEyKTsKCQkJcmV0ID0gMTsKCQl9CgkJaWYgKGRhdGExICE9IHBhdHRlcm4pCgkJewoJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXMgLSB3cml0ZVsweCU4eF06IDB4JTh4LCByZWFkWzB4JTh4XTogMHglOHhcbiIsIFwKCQkJCQlvZmZzZXQsIHBhdHRlcm4sIG9mZnNldCwgZGF0YTEpOwoJCQlyZXQgPSAxOwoJCQkvL3JldHVybiAoKHVuc2lnbmVkIGludCkgJmJhc2VBZGRyZXNzW29mZnNldF0pOwoJCX0KCX0KCgliYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSA9IHBhdHRlcm47CgoJLyoKCSAqIENoZWNrIGZvciBhZGRyZXNzIGJpdHMgc3R1Y2sgbG93IG9yIHNob3J0ZWQuCgkgKi8KCWZvciAodGVzdE9mZnNldCA9IDE7ICh0ZXN0T2Zmc2V0ICYgYWRkcmVzc01hc2spICE9IDA7IHRlc3RPZmZzZXQgPDw9IDEpCgl7CgkJYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0gPSBhbnRpcGF0dGVybjsKCgkJaWYgKGJhc2VBZGRyZXNzWzBdICE9IHBhdHRlcm4pCgkJewoJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXMyIC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1swXTogMHglOHhcbiIsIFwKCQkJCQl0ZXN0T2Zmc2V0LCBhbnRpcGF0dGVybiwgYmFzZUFkZHJlc3NbMF0pOwoJCQlyZXQgPSAxOwoJCQkvL3JldHVybiAoKHVuc2lnbmVkIGludCkgJmJhc2VBZGRyZXNzW3Rlc3RPZmZzZXRdKTsKCQl9CgoJCWZvciAob2Zmc2V0ID0gMTsgKG9mZnNldCAmIGFkZHJlc3NNYXNrKSAhPSAwOyBvZmZzZXQgPDw9IDEpCgkJewoJCQlkYXRhMSA9IGJhc2VBZGRyZXNzW29mZnNldF07CgkJCWlmICgoZGF0YTEgIT0gcGF0dGVybikgJiYgKG9mZnNldCAhPSB0ZXN0T2Zmc2V0KSkKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzMyAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQl0ZXN0T2Zmc2V0LCBhbnRpcGF0dGVybiwgdGVzdE9mZnNldCwgZGF0YTEpOwoJCQkJcmV0ID0gMTsKCQkJCS8vcmV0dXJuICgodW5zaWduZWQgaW50KSAmYmFzZUFkZHJlc3NbdGVzdE9mZnNldF0pOwoJCQl9CgkJfQoKCQliYXNlQWRkcmVzc1t0ZXN0T2Zmc2V0XSA9IHBhdHRlcm47Cgl9CgoKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spIDsgb2Zmc2V0KyspCgl7CgkJaWYgKCgofm9mZnNldCkgPD0gYWRkcmVzc01hc2spICkKCQl7CgkJCWJhc2VBZGRyZXNzW29mZnNldF0gPSBwYXR0ZXJuOwoJCQliYXNlQWRkcmVzc1sofm9mZnNldCldID0gYW50aXBhdHRlcm47CgkJfQoJfQoKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spOyBvZmZzZXQrKykKCXsKCQlpZiAoKCh+b2Zmc2V0KSA8PSBhZGRyZXNzTWFzaykgKQoJCXsKCQkJaWYgKGJhc2VBZGRyZXNzW29mZnNldF0gIT0gcGF0dGVybikKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNCAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQlvZmZzZXQsIHBhdHRlcm4sIG9mZnNldCwgYmFzZUFkZHJlc3Nbb2Zmc2V0XSk7CgoJCQkJcmV0ID0gMTsKCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAoYmFzZUFkZHJlc3NbKH5vZmZzZXQpXSAhPSBhbnRpcGF0dGVybikKCQkJewoJCQkJcHJpbnRmKCIgIG1lbVRlc3RBZGRyZXNzQnVzNSAtIHdyaXRlIGJhc2VBZGRyZXNzWzB4JTh4XTogMHglOHgsIHJlYWQgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eFxuIiwgXAoJCQkJCQkoKH5vZmZzZXQpKSwgYW50aXBhdHRlcm4sICgofm9mZnNldCkpLCBiYXNlQWRkcmVzc1soKH5vZmZzZXQpKV0pOwoJCQkJcmV0ID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCWlmIChyZXQpCgl7cmV0dXJuIChyZXQpOwoJfQoJLy91bnNpZ25lZCBpbnQgc3VxX3ZhbHVlOwoJZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzaykgOyBvZmZzZXQrKykKCXsKCgkJewoJCQlwYXR0ZXJuPSgob2Zmc2V0PDwyKS1vZmZzZXQpOwoJCQliYXNlQWRkcmVzc1tvZmZzZXRdID0gcGF0dGVybjsKCQkJLy9iYXNlQWRkcmVzc1sofm9mZnNldCldID0gYW50aXBhdHRlcm47CgkJfQoJfQoKCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spOyBvZmZzZXQrKykKCXsKCgkJewoJCQlwYXR0ZXJuPSgob2Zmc2V0PDwyKS1vZmZzZXQpOwoJCQlpZiAoYmFzZUFkZHJlc3Nbb2Zmc2V0XSAhPSBwYXR0ZXJuKQoJCQl7CgkJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXM2IC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJCW9mZnNldCxwYXR0ZXJuLCBvZmZzZXQsIGJhc2VBZGRyZXNzW29mZnNldF0pOwoJCQkJcmV0ID0gMTsKCQkJCWJyZWFrOwoJCQl9CgoKCQl9Cgl9CglpZiAocmV0KQoJe3JldHVybiAocmV0KTsKCX0KCWZvciAob2Zmc2V0ID0gMHgxOyAob2Zmc2V0IDw9YWRkcmVzc01hc2spIDsgb2Zmc2V0KyspCgl7CgoJCXsKCQkJcGF0dGVybj1+KChvZmZzZXQ8PDIpLW9mZnNldCk7CgkJCWJhc2VBZGRyZXNzW29mZnNldF0gPSBwYXR0ZXJuOwoJCQkvL2Jhc2VBZGRyZXNzWyh+b2Zmc2V0KV0gPSBhbnRpcGF0dGVybjsKCQl9Cgl9CgoJZm9yIChvZmZzZXQgPSAweDE7IChvZmZzZXQgPD1hZGRyZXNzTWFzayk7IG9mZnNldCsrKQoJewoKCQl7CgkJCXBhdHRlcm49figob2Zmc2V0PDwyKS1vZmZzZXQpOwoJCQlpZiAoYmFzZUFkZHJlc3Nbb2Zmc2V0XSAhPSBwYXR0ZXJuKQoJCQl7CgkJCQlwcmludGYoIiAgbWVtVGVzdEFkZHJlc3NCdXM3IC0gd3JpdGUgYmFzZUFkZHJlc3NbMHglOHhdOiAweCU4eCwgcmVhZCBiYXNlQWRkcmVzc1sweCU4eF06IDB4JTh4XG4iLCBcCgkJCQkJCW9mZnNldCxwYXR0ZXJuLCBvZmZzZXQsIGJhc2VBZGRyZXNzW29mZnNldF0pOwoJCQkJcmV0ID0gMTsKCQkJCWJyZWFrOwoJCQl9CgoKCQl9Cgl9CgoKCXJldHVybiAocmV0KTsKfSAgIC8qIG1lbVRlc3RBZGRyZXNzQnVzKCkgKi8KCmludCBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oaW50IGRkcl90ZXN0X3NpemUpCnsKCS8vIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkciA9IEREUl9URVNUX1NUQVJUX0FERFI7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHI9dGVzdF9zdGFydF9hZGRyOwoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZz0xOwoJZXJyb3JfY291bnQ9MDsKCS8vLyoKCXByaW50ZigiXHJTdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCWRkcl93cml0ZSgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcblN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMXN0IHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMm5kIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8qLwoJLyoKCSAgIHByaW50ZigiXHJTdGFydCB3cml0aW5nIHBhdHRlcm40IGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCSAgIGRkcl93cml0ZTQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIHByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIHByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBkZHJfcmVhZDQoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJICAgKi8KCWRkcl93cml0ZV9mdWxsKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLDB4MCwweDMpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9mdWxsKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplLDAsMyk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX2Z1bGwoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUsMCwzKTsKCgoJcHJpbnRmKCJcclN0YXJ0IHdyaXRpbmcgYWRkIHBhdHRlcm4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWlmIChkb190ZXN0X2FkZHJlc3NfYnVzKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKSkKCQllcnJvcl9jb3VudCsrOwoKCgkvKgoJICAgcHJpbnRmKCJcblN0YXJ0ICo0IG5vIGNyb3NzIHRhbGsgcGF0dGVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIHByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCSAgIGRkcl93cml0ZV9wYXR0ZXJuNF9ub19jcm9zc190YWxrKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCSAgIHByaW50ZigiXG5FbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkgICBwcmludGYoIlxuU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgZGRyX3JlYWRfcGF0dGVybjRfbm9fY3Jvc3NfdGFsaygodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkgICBwcmludGYoIlxuRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJICAgcHJpbnRmKCJcblN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCSAgIGRkcl9yZWFkX3BhdHRlcm40X25vX2Nyb3NzX3RhbGsoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoKCS8vaWYoY3Jvc3NfdGFsa19wYXR0ZXJuX2ZsYWc9PTEpCgl7CglwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIGRkcl90ZXN0X3NpemUpOwoJZGRyX3dyaXRlX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDJuZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoKCS8vICAgcHJpbnRmKCJcclN0YXJ0IDNyZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIGRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcCgodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CgkvLyAgICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoJcHJpbnRmKCJcblN0YXJ0ICo0ICBjcm9zcyB0YWxrIHBhdHRlcm4gbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCB3cml0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAxc3QgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCS8vICAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24oKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8gICBwcmludGYoIlxyRW5kIDNyZCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIik7CgoKCX0KCgl7CglwcmludGYoIlxuU3RhcnQgKjQgIGNyb3NzIHRhbGsgcGF0dGVybiBwMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXG5TdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyBkZHJfdGVzdF9zaXplKTsKCWRkcl93cml0ZV9wYXR0ZXJuNF9jcm9zc190YWxrX3AyKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgd3JpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxyU3RhcnQgMXN0IHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19wMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIDFzdCByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDJuZCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfcDIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAybmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCgkvLyAgIHByaW50ZigiXHJTdGFydCAzcmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX3AoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJLy8gICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXByaW50ZigiXG5TdGFydCAqNCAgY3Jvc3MgdGFsayBwYXR0ZXJuIG4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CglwcmludGYoIlxuU3RhcnQgd3JpdGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgZGRyX3Rlc3Rfc2l6ZSk7CglkZHJfd3JpdGVfcGF0dGVybjRfY3Jvc3NfdGFsa19uMigodm9pZCAqKShpbnRfY29udnRlcl9wKHN0YXJ0X2FkZHIpKSwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxyRW5kIHdyaXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJcHJpbnRmKCJcclN0YXJ0IDFzdCByZWFkaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAiKTsKCWRkcl9yZWFkX3BhdHRlcm40X2Nyb3NzX3RhbGtfbjIoKHZvaWQgKikoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSksIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcckVuZCAxc3QgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKCXByaW50ZigiXHJTdGFydCAybmQgcmVhZGluZy4uLiAgICAgICAgICAgICAgICAgICAgICAgIik7CglkZHJfcmVhZF9wYXR0ZXJuNF9jcm9zc190YWxrX24yKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXHJFbmQgMm5kIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CgkvLyAgICBwcmludGYoIlxyU3RhcnQgM3JkIHJlYWRpbmcuLi4gICAgICAgICAgICAgICAgICAgICAgICIpOwoJLy8gICAgZGRyX3JlYWRfcGF0dGVybjRfY3Jvc3NfdGFsa19uKCh2b2lkICopKGludF9jb252dGVyX3Aoc3RhcnRfYWRkcikpLCBkZHJfdGVzdF9zaXplKTsKCS8vICAgcHJpbnRmKCJcckVuZCAzcmQgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCn0KCSovCmlmIChlcnJvcl9jb3VudCkKCXJldHVybiAxOwoJZWxzZQoJcmV0dXJuIDA7Cgl9CgppbnQgZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2xjZGxyKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIGFjIHdpbmRvd3MgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJcbnNldCBkZHIgIHRlc3QgdGVzdF9zdGFydF9hZGRyPT0weCUwOHggXG4iLHRlc3Rfc3RhcnRfYWRkcik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkvL3Vuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9qPSAxOwoJLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCgoKCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJdW5zaWduZWQgaW50ICBhY19tZGxyX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX21kbHJfYl9vcmc9MDsKCgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWY9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWY9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmPTA7CgoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl90ZW1wPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF90ZW1wPTA7CgoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCQllbHNlCgkJewoJCQlnb3RvIHVzYWdlOwoJCX0KCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCgl9CglpZiAoYXJnYyA+NCkgewoJCXRlc3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9sb29wID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbG9vcCA9IDEwMDAwMDsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X21pbl9tYXg9MDsKCWlmIChhcmdjID41KSB7CgoJCXRlc3RfbWluX21heCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9taW5fbWF4ID0gMDsKCQl9CgkJZWxzZQoJCQl0ZXN0X21pbl9tYXg9MTsKCgl9CgoKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCXByaW50ZigiXG50ZXN0X21pbl9tYXg9PSAweCUwOHhcbiIsIHRlc3RfbWluX21heCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoKCgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoKCQkJCQl9CgkJCQl9CgoJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQzExMFxuIik7CgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgMHglMDh4XG4iLHJlZ19hZGQpOwoJCQkJCWFjX21kbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsvL3JlYWRsKHJlZ19hZGQpOy8vMHhjODgzNjAwMAoJCQkJCWFjX2xjZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrNCk7CgkJCQkJYWNfYmRscjBfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs4KTsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUMxMTNcbiIpOwoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCQkJCX0KCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9CX1JFR19CQVNFKQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQzExMlxuIik7CgkJCQkJYWNfbWRscl9iX29yZz1yZWFkbChyZWdfYWRkKTsKCQkJCQlhY19sY2Rscl9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKTsKCQkJCQlhY19iZGxyMF9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyk7CgkJCQl9CgoKCQkJfQoKCQl9CgoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKCWZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDXG4iKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUNcbiIpOwoJCQkJfQoKCQkJCXsKCQkJCQl7CgkJCQkJCS8vI2lmZGVmIEREUl9URVNUX0FDTENETFIKCgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNMQ0RMUityZWdfYmFzZV9hZGo7CgoJCQkJCQlhY19sY2Rscl90ZW1wPXJlYWRsKHJlZ19hZGQpOwoKCQkJCQkJd2hpbGUgKGFjX2xjZGxyX3RlbXA+MCkKCQkJCQkJewoJCQkJCQkJaWYodGVzdF9taW5fbWF4KQoJCQkJCQkJe2JyZWFrOwoJCQkJCQkJfQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlhY19sY2Rscl90ZW1wLS07CgoJCQkJCQkJcHJpbnRmKCJcbmxjZGxyIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgkJCQkJCQl3cml0ZWwoYWNfbGNkbHJfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxud2RxZCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJYWNfbGNkbHJfdGVtcCsrOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlwcmludGYoIlxubGNkbHIgbGVmdCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxubGNkbHIgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoJCQkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCQkJewoJCQkJCQkJYWNfbGNkbHJfYV9sZWY9YWNfbGNkbHJfdGVtcDsKCQkJCQkJCWFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYV9vcmc7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlhY19sY2Rscl9iX2xlZj1hY19sY2Rscl90ZW1wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9iX29yZzsKCgkJCQkJCX0KCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKCgkJCQkJCXdoaWxlIChhY19sY2Rscl90ZW1wPEFDTENETFJfTUFYKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWFjX2xjZGxyX3RlbXArKzsKCQkJCQkJCXByaW50ZigiXG5sY2RsciB0ZXN0IHZhbHVlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoJCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKI2lmZGVmIEREUl9MQ0RMUl9DS19VU0VfRkFTVF9QQVRURVJOCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IHRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJewoJCQkJCQkJCS8vcHJpbnRmKCJcbmxjZGxyIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJYWNfbGNkbHJfdGVtcC0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG5sY2RscnJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5sY2RsciByaWdodCBlZGdlPT0weCUwOHhcbiAiLGFjX2xjZGxyX3RlbXApOwoKCgoJCQkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCQkJewoJCQkJCQkJYWNfbGNkbHJfYV9yaWc9YWNfbGNkbHJfdGVtcDsKCQkJCQkJCWFjX2xjZGxyX3RlbXA9YWNfbGNkbHJfYV9vcmc7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlhY19sY2Rscl9iX3JpZz1hY19sY2Rscl90ZW1wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9iX29yZzsKCgkJCQkJCX0KCQkJCQkJd3JpdGVsKGFjX2xjZGxyX3RlbXAsKHJlZ19hZGQpKTsKCgoKCQkJCQkJLy8jZW5kaWYKCgkJCQkJCXsKCQkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGo7CgoJCQkJCQkJYWNfYmRscjBfdGVtcD1yZWFkbChyZWdfYWRkKTsKCQkJCQkJCXdoaWxlIChhY19iZGxyMF90ZW1wPjApCgkJCQkJCQl7CgkJCQkJCQkJaWYodGVzdF9taW5fbWF4KQoJCQkJCQkJCXticmVhazsKCQkJCQkJCQl9CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcC0tOwoJCQkJCQkJCXByaW50ZigiXG5iZGxyMCB0ZXN0IHZhbHVlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoJCQkJCQkJCXdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7CiNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJYWNfYmRscjBfdGVtcCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7CgoJCQkJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQkJCQl7CgkJCQkJCQkJYWNfYmRscjBfYV9sZWY9YWNfYmRscjBfdGVtcDsKCQkJCQkJCQlhY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Ffb3JnOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWFjX2JkbHIwX2JfbGVmPWFjX2JkbHIwX3RlbXA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcD1hY19iZGxyMF9iX29yZzsKCgkJCQkJCQl9CgoJCQkJCQkJd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKCgkJCQkJCQl3aGlsZSAoYWNfYmRscjBfdGVtcDxBQ0JETFJfTUFYKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXArKzsKCQkJCQkJCQlwcmludGYoIlxuYmRscjAgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCQkJCQkJCQl3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlhY19iZGxyMF90ZW1wLS07CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXByaW50ZigiXG5hY2JkbHIwIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoKCQkJCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJCQkJewoJCQkJCQkJCWFjX2JkbHIwX2FfcmlnPWFjX2JkbHIwX3RlbXA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcD1hY19iZGxyMF9hX29yZzsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlhY19iZGxyMF9iX3JpZz1hY19iZGxyMF90ZW1wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYl9vcmc7CgoJCQkJCQkJfQoKCQkJCQkJCXdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7CgoJCQkJCQl9CgkJCQkJfQoKCQkJCX0KCQkJfQoKCQkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCgoJCQkvLy8vY2FsY3VsYXRlIGFuZCBwcmludCAgZHFzIHZhbHVlCgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJaWYgKHRlc3RfdGltZXMpCgkJCQkJewoJCQkJCQlpZiAoYWNfbGNkbHJfYV9sZWY+YWNfbGNkbHJfYV9sZWZfbWluKQoJCQkJCQkJYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoKCQkJCQkJaWYgKGFjX2xjZGxyX2FfcmlnPGFjX2xjZGxyX2FfcmlnX21pbikKCQkJCQkJCWFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCgkJCQkJCWlmIChhY19iZGxyMF9hX2xlZj5hY19iZGxyMF9hX2xlZl9taW4pCgkJCQkJCQlhY19iZGxyMF9hX2xlZl9taW49YWNfYmRscjBfYV9sZWY7CgoJCQkJCQlpZiAoYWNfYmRscjBfYV9yaWc8YWNfYmRscjBfYV9yaWdfbWluKQoJCQkJCQkJYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlhY19sY2Rscl9hX2xlZl9taW49YWNfbGNkbHJfYV9sZWY7CgkJCQkJCWFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCQkJCQkJYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoJCQkJCQlhY19iZGxyMF9hX3JpZ19taW49YWNfYmRscjBfYV9yaWc7CgkJCQkJfQoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQyByZXN1bHRcbiIpOwoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCgkJCQkJcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnLGFjX2xjZGxyX2FfbGVmLGFjX2xjZGxyX2FfcmlnLGFjX2xjZGxyX2FfbGVmX21pbixhY19sY2Rscl9hX3JpZ19taW4pOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfYV9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnLGFjX2JkbHIwX2FfbGVmLGFjX2JkbHIwX2FfcmlnLGFjX2JkbHIwX2FfbGVmX21pbixhY19iZGxyMF9hX3JpZ19taW4pOwoKCgoJCQkJfQoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9CX1JFR19CQVNFKQoJCQkJewoJCQkJCWlmICh0ZXN0X3RpbWVzKQoJCQkJCXsKCQkJCQkJaWYgKGFjX2xjZGxyX2JfbGVmPmFjX2xjZGxyX2JfbGVmX21pbikKCQkJCQkJCWFjX2xjZGxyX2JfbGVmX21pbj1hY19sY2Rscl9iX2xlZjsKCgkJCQkJCWlmIChhY19sY2Rscl9iX3JpZzxhY19sY2Rscl9iX3JpZ19taW4pCgkJCQkJCQlhY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgoJCQkJCQlpZiAoYWNfYmRscjBfYl9sZWY+YWNfYmRscjBfYl9sZWZfbWluKQoJCQkJCQkJYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2JfcmlnPGFjX2JkbHIwX2JfcmlnX21pbikKCQkJCQkJCWFjX2JkbHIwX2JfcmlnX21pbj1hY19iZGxyMF9iX3JpZzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYWNfbGNkbHJfYl9sZWZfbWluPWFjX2xjZGxyX2JfbGVmOwoJCQkJCQlhY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgkJCQkJCWFjX2JkbHIwX2JfbGVmX21pbj1hY19iZGxyMF9iX2xlZjsKCQkJCQkJYWNfYmRscjBfYl9yaWdfbWluPWFjX2JkbHIwX2JfcmlnOwoJCQkJCX0KCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUMgcmVzdWx0XG4iKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyk7CgoJCQkJCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyxhY19sY2Rscl9iX2xlZixhY19sY2Rscl9iX3JpZyxhY19sY2Rscl9iX2xlZl9taW4sYWNfbGNkbHJfYl9yaWdfbWluKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyxhY19iZGxyMF9iX2xlZixhY19iZGxyMF9iX3JpZyxhY19iZGxyMF9iX2xlZl9taW4sYWNfYmRscjBfYl9yaWdfbWluKTsKCgoKCQkJCX0KCgoKCQkJfQoKCgkJfQoKCX0KCgoKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKCgoKVV9CT09UX0NNRCgKCWRkcl90dW5lX2Rkcl9hY19hY2xjZGxyLAk2LAkxLAlkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjbGNkbHIsCgkiRERSIHR1bmUgZHFzIGZ1bmN0aW9uIiwKCSJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciBhIDAgMHg4MDAwMDAwIDMgb3IgZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgYiAwIDB4ODAwMDAgNSBvciBkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciBhIGIgMHg4MDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCmludCBkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjYmRscl9jayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkciBhYyB3aW5kb3dzIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCS8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9qPSAxOwoJLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2NoYW5uZWwgPSAwOwoKCgojZGVmaW5lICBDSEFOTkVMX0EgIDAKI2RlZmluZSAgQ0hBTk5FTF9CICAxCgoKCgoKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgl1bnNpZ25lZCBpbnQgIGFjX21kbHJfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbWRscl9iX29yZz0wOwoKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2Jfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX3JpZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2JfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZj0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX2xlZj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWY9MDsKCgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWZfbWluPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWZfbWluPTA7CgkvLyAgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfdGVtcDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX3RlbXA9MDsKCgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgoJLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCQllbHNlCgkJewoJCQlnb3RvIHVzYWdlOwoJCX0KCX0KCWlmIChhcmdjID4gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoKCQl7Y2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCgl9CglpZiAoYXJnYyA+NCkgewoJCXRlc3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9sb29wID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbG9vcCA9IDEwMDAwMDsKCQl9Cgl9CgoJdW5zaWduZWQgaW50ICAgdGVzdF9taW5fbWF4PTA7CglpZiAoYXJnYyA+NSkgewoKCQl0ZXN0X21pbl9tYXggPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXRlc3RfbWluX21heCA9IDA7CgkJfQoJCWVsc2UKCQkJdGVzdF9taW5fbWF4PTE7CgoJfQoKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfbG9vcD09IDB4JTA4eFxuIiwgdGVzdF9sb29wKTsKCXByaW50ZigiXG50ZXN0X21pbl9tYXg9PSAweCUwOHhcbiIsIHRlc3RfbWluX21heCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoKCgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoKCQkJCQl9CgkJCQl9CgoJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgMHglMDh4XG4iLHJlZ19hZGQpOwoJCQkJCWFjX21kbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsvL3JlYWRsKHJlZ19hZGQpOy8vMHhjODgzNjAwMAoJCQkJCWFjX2xjZGxyX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrNCk7CgkJCQkJYWNfYmRscjBfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs4KTsKCgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcpOwoJCQkJfQoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCgkJCQl7CgoJCQkJCWFjX21kbHJfYl9vcmc9cmVhZGwocmVnX2FkZCk7CgkJCQkJYWNfbGNkbHJfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUik7CgkJCQkJYWNfYmRscjBfYl9vcmc9cmVhZGwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUik7CgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoJCQkJfQoKCgkJCX0KCgkJfQoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQ1xuIik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDXG4iKTsKCQkJCX0KCgkJCQl7CgkJCQkJewojaWZkZWYgRERSX1RFU1RfQUNMQ0RMUgoKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ0xDRExSK3JlZ19iYXNlX2FkajsKCgkJCQkJCWFjX2xjZGxyX3RlbXA9cmVhZGwocmVnX2FkZCk7CgoJCQkJCQl3aGlsZSAoYWNfbGNkbHJfdGVtcD4wKQoJCQkJCQl7CgkJCQkJCQlpZih0ZXN0X21pbl9tYXgpCgkJCQkJCQl7YnJlYWs7CgkJCQkJCQl9CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCWFjX2xjZGxyX3RlbXAtLTsKCgkJCQkJCQlwcmludGYoIlxubGNkbHIgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19sY2Rscl90ZW1wKTsKCQkJCQkJCXdyaXRlbChhY19sY2Rscl90ZW1wLChyZWdfYWRkKSk7CiNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2Vsc2UKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlhY19sY2Rscl90ZW1wKys7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXByaW50ZigiXG5sY2RsciBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5sY2RsciBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgkJCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJCQl7CgkJCQkJCQlhY19sY2Rscl9hX2xlZj1hY19sY2Rscl90ZW1wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9hX29yZzsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWFjX2xjZGxyX2JfbGVmPWFjX2xjZGxyX3RlbXA7CgkJCQkJCQlhY19sY2Rscl90ZW1wPWFjX2xjZGxyX2Jfb3JnOwoKCQkJCQkJfQoJCQkJCQl3cml0ZWwoYWNfbGNkbHJfdGVtcCwocmVnX2FkZCkpOwoKCQkJCQkJd2hpbGUgKGFjX2xjZGxyX3RlbXA8QUNMQ0RMUl9NQVgpCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcCsrOwoJCQkJCQkJcHJpbnRmKCJcbmxjZGxyIHRlc3QgdmFsdWU9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgkJCQkJCQl3cml0ZWwoYWNfbGNkbHJfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9IGRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJLy9wcmludGYoIlxubGNkbHIgcmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlhY19sY2Rscl90ZW1wLS07CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJcHJpbnRmKCJcbmxjZGxycmlnaHQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcbmxjZGxyIHJpZ2h0IGVkZ2U9PTB4JTA4eFxuICIsYWNfbGNkbHJfdGVtcCk7CgoKCgkJCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJCQl7CgkJCQkJCQlhY19sY2Rscl9hX3JpZz1hY19sY2Rscl90ZW1wOwoJCQkJCQkJYWNfbGNkbHJfdGVtcD1hY19sY2Rscl9hX29yZzsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWFjX2xjZGxyX2JfcmlnPWFjX2xjZGxyX3RlbXA7CgkJCQkJCQlhY19sY2Rscl90ZW1wPWFjX2xjZGxyX2Jfb3JnOwoKCQkJCQkJfQoJCQkJCQl3cml0ZWwoYWNfbGNkbHJfdGVtcCwocmVnX2FkZCkpOwoKCgojZW5kaWYKCgkJCQkJCXsKCQkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNCRExSMCtyZWdfYmFzZV9hZGo7CgoJCQkJCQkJYWNfYmRscjBfdGVtcD1yZWFkbChyZWdfYWRkKTsKCQkJCQkJCXdoaWxlIChhY19iZGxyMF90ZW1wPjApCgkJCQkJCQl7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcC0tOwoJCQkJCQkJCXByaW50ZigiXG5iZGxyMCB0ZXN0IHZhbHVlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoJCQkJCQkJCXdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7CiNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbHNlCgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSBkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQkvL3ByaW50ZigiXG53ZHFkIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJYWNfYmRscjBfdGVtcCsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsYWNfYmRscjBfdGVtcCk7CgoJCQkJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQkJCQl7CgkJCQkJCQkJYWNfYmRscjBfYV9sZWY9YWNfYmRscjBfdGVtcDsKCQkJCQkJCQlhY19iZGxyMF90ZW1wPWFjX2JkbHIwX2Ffb3JnOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWFjX2JkbHIwX2JfbGVmPWFjX2JkbHIwX3RlbXA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcD1hY19iZGxyMF9iX29yZzsKCgkJCQkJCQl9CgoJCQkJCQkJd3JpdGVsKGFjX2JkbHIwX3RlbXAsKHJlZ19hZGQpKTsKCgkJCQkJCQl3aGlsZSAoYWNfYmRscjBfdGVtcDxBQ0JETFJfTUFYKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXArKzsKCQkJCQkJCQlwcmludGYoIlxuYmRscjAgdGVzdCB2YWx1ZT09MHglMDh4XG4gIixhY19iZGxyMF90ZW1wKTsKCQkJCQkJCQl3cml0ZWwoYWNfYmRscjBfdGVtcCwocmVnX2FkZCkpOwojaWZkZWYgRERSX0xDRExSX0NLX1VTRV9GQVNUX1BBVFRFUk4KCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZWxzZQoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gdGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJLy9wcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlhY19iZGxyMF90ZW1wLS07CgkJCQkJCQkJCWJyZWFrOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCXByaW50ZigiXG5hY2JkbHIwIHJpZ2h0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQlwcmludGYoIlxuYWNiZGxyMCByaWdodCBlZGdlPT0weCUwOHhcbiAiLGFjX2JkbHIwX3RlbXApOwoKCQkJCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJCQkJewoJCQkJCQkJCWFjX2JkbHIwX2FfcmlnPWFjX2JkbHIwX3RlbXA7CgkJCQkJCQkJYWNfYmRscjBfdGVtcD1hY19iZGxyMF9hX29yZzsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlhY19iZGxyMF9iX3JpZz1hY19iZGxyMF90ZW1wOwoJCQkJCQkJCWFjX2JkbHIwX3RlbXA9YWNfYmRscjBfYl9vcmc7CgoJCQkJCQkJfQoKCQkJCQkJCXdyaXRlbChhY19iZGxyMF90ZW1wLChyZWdfYWRkKSk7CgoJCQkJCQl9CgkJCQkJfQoKCQkJCX0KCQkJfQoKCQkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgoKCgoJCQkvLy8vY2FsY3VsYXRlIGFuZCBwcmludCAgZHFzIHZhbHVlCgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCQl9CgkJCQl9CgkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCQl7CgkJCQkJaWYgKHRlc3RfdGltZXMpCgkJCQkJewoJCQkJCQlpZiAoYWNfbGNkbHJfYV9sZWY+YWNfbGNkbHJfYV9sZWZfbWluKQoJCQkJCQkJYWNfbGNkbHJfYV9sZWZfbWluPWFjX2xjZGxyX2FfbGVmOwoKCQkJCQkJaWYgKGFjX2xjZGxyX2FfcmlnPGFjX2xjZGxyX2FfcmlnX21pbikKCQkJCQkJCWFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCgkJCQkJCWlmIChhY19iZGxyMF9hX2xlZj5hY19iZGxyMF9hX2xlZl9taW4pCgkJCQkJCQlhY19iZGxyMF9hX2xlZl9taW49YWNfYmRscjBfYV9sZWY7CgoJCQkJCQlpZiAoYWNfYmRscjBfYV9yaWc8YWNfYmRscjBfYV9yaWdfbWluKQoJCQkJCQkJYWNfYmRscjBfYV9yaWdfbWluPWFjX2JkbHIwX2FfcmlnOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlhY19sY2Rscl9hX2xlZl9taW49YWNfbGNkbHJfYV9sZWY7CgkJCQkJCWFjX2xjZGxyX2FfcmlnX21pbj1hY19sY2Rscl9hX3JpZzsKCQkJCQkJYWNfYmRscjBfYV9sZWZfbWluPWFjX2JkbHIwX2FfbGVmOwoJCQkJCQlhY19iZGxyMF9hX3JpZ19taW49YWNfYmRscjBfYV9yaWc7CgkJCQkJfQoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQyByZXN1bHRcbiIpOwoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCgkJCQkJcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Ffb3JnLGFjX2xjZGxyX2FfbGVmLGFjX2xjZGxyX2FfcmlnLGFjX2xjZGxyX2FfbGVmX21pbixhY19sY2Rscl9hX3JpZ19taW4pOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfYV9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnLGFjX2JkbHIwX2FfbGVmLGFjX2JkbHIwX2FfcmlnLGFjX2JkbHIwX2FfbGVmX21pbixhY19iZGxyMF9hX3JpZ19taW4pOwoKCgoJCQkJfQoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9CX1JFR19CQVNFKQoJCQkJewoJCQkJCWlmICh0ZXN0X3RpbWVzKQoJCQkJCXsKCQkJCQkJaWYgKGFjX2xjZGxyX2JfbGVmPmFjX2xjZGxyX2JfbGVmX21pbikKCQkJCQkJCWFjX2xjZGxyX2JfbGVmX21pbj1hY19sY2Rscl9iX2xlZjsKCgkJCQkJCWlmIChhY19sY2Rscl9iX3JpZzxhY19sY2Rscl9iX3JpZ19taW4pCgkJCQkJCQlhY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgoJCQkJCQlpZiAoYWNfYmRscjBfYl9sZWY+YWNfYmRscjBfYl9sZWZfbWluKQoJCQkJCQkJYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2JfcmlnPGFjX2JkbHIwX2JfcmlnX21pbikKCQkJCQkJCWFjX2JkbHIwX2JfcmlnX21pbj1hY19iZGxyMF9iX3JpZzsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJYWNfbGNkbHJfYl9sZWZfbWluPWFjX2xjZGxyX2JfbGVmOwoJCQkJCQlhY19sY2Rscl9iX3JpZ19taW49YWNfbGNkbHJfYl9yaWc7CgkJCQkJCWFjX2JkbHIwX2JfbGVmX21pbj1hY19iZGxyMF9iX2xlZjsKCQkJCQkJYWNfYmRscjBfYl9yaWdfbWluPWFjX2JkbHIwX2JfcmlnOwoJCQkJCX0KCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgQUMgcmVzdWx0XG4iKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyk7CgoJCQkJCXByaW50ZigiXG4gYWNfYWNtZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgIGxjZGxyX2xlZiAgIGxjZGxyX3JpZyAgIGxjZGxyX2xtaW4gIGxjZGxyX3JtaW5cbiIsKHJlZ19hZGQpLGFjX21kbHJfYl9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyxhY19sY2Rscl9iX2xlZixhY19sY2Rscl9iX3JpZyxhY19sY2Rscl9iX2xlZl9taW4sYWNfbGNkbHJfYl9yaWdfbWluKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX2Ffb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyxhY19iZGxyMF9iX2xlZixhY19iZGxyMF9iX3JpZyxhY19iZGxyMF9iX2xlZl9taW4sYWNfYmRscjBfYl9yaWdfbWluKTsKCgoKCgkJCQl9CgoKCgkJCX0KCgoJCX0KCgl9CgoKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKCn0KCgoKClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrLAk2LAkxLAlkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjYmRscl9jaywKCSJERFIgdHVuZSBkcXMgZnVuY3Rpb24iLAoJImRkcl90dW5lX2Rkcl9hY19hY2JkbHJfY2sgYSAwIDB4ODAwMDAwMCAzIG9yIGRkcl90dW5lX2Rkcl9hY19hY2JkbHJfY2sgYiAwIDB4ODAwMDAgNSBvciBkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGEgYiAweDgwMDAwIGxcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgoKaW50IGRvX2Rkcl90ZXN0X2FjX2JpdF9tYXJnaW4oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXJkZHJfdGVzdF9hY193aW5kb3cgZnVuY3Rpb25cbiIpOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCS8vCSAgIHVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7CgkvLyB1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCgl1bnNpZ25lZCBpbnQgICBsYW5lX3N0ZXA9IDA7Cgl1bnNpZ25lZCBpbnQgICByZWdfdmFsdWU9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2FjX3NldHVwX2hvbGQ9IDA7CgkvL2ludCBhcmdjMjsKCS8vY2hhciAgICAgKiAgYXJndjJbMzBdOwoJLy8gIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19vcmdbMTBdOwoJLy8gICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfbWF4WzQwXTsKCS8vICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfaG9sZF9tYXhbNDBdOwoJLy8gICAgIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19zZXR1cF90aW1lWzQwXTsKCS8vIHVuc2lnbmVkIGludCAgYWNiZGxyMF85X3JlZ19ob2xkX3RpbWVbNDBdOwoKCWNoYXIgKmVuZHA7CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgkJey8vY2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCgkJey8vY2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCX0KCS8vYXJnYzI9NTsKCS8vZm9yKGkgPSAxO2k8KGFyZ2MpO2krKykKCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCX0KCgkvL2FyZ3YyWzBdPWFyZ3ZbMV07CgkvL2FyZ3YyWzFdPWFyZ3ZbMl07CgkvL2FyZ3YyWzJdPWFyZ3ZbM107CgljaGFyIHN0clsxMDBdOwoJdGVzdF9hY19zZXR1cF9ob2xkPTA7CglpZiAoY2hhbm5lbF9hX2VuKQoJewoKCQkvLyooY2hhciAgICAgKikoYXJndjJbMF0pPSJhIjsKCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJCXByaW50ZigiXG50ZXN0IGFjIHdpbmRvdyAgYVxuIik7CgkJZm9yICgobGFuZV9zdGVwPTQpOyhsYW5lX3N0ZXA8NDApOyhsYW5lX3N0ZXArKykpCgkJewoJCQlpZiAobGFuZV9zdGVwID09IDcpCgkJCXtsYW5lX3N0ZXA9ODsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDEyKQoJCQl7bGFuZV9zdGVwPTE2OwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gMTQpCgkJCXtsYW5lX3N0ZXA9MTY7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSAxOCkKCQkJe2xhbmVfc3RlcD0yMDsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDIyKQoJCQl7bGFuZV9zdGVwPTI0OwoJCQl9CgkJCS8vc3ByaW50Zihhcmd2MlszXSwiZCUiLCggbGFuZV9zdGVwKSk7CgkJCS8vaXRvYV9kZHJfdGVzdChsYW5lX3N0ZXAsKGFyZ3YyWzNdKSwxMCk7CgkJCS8vcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwwLGFyZ3YyWzBdKTsKCQkJLy8JcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwzLGFyZ3YyWzNdKTsvL2EgMCAweDgwMDAwMDAgMCBjCgkJCS8vIHJlZ192YWx1ZT1kb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93ICBhIDAgIDB4JTA4eCAgJWQgIDB4JTA4eCIsZGRyX3Rlc3Rfc2l6ZSx0ZXN0X2FjX3NldHVwX2hvbGQsKCBsYW5lX3N0ZXApKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCQl0ZXN0X2FjX3NldHVwX2hvbGQ9MjsKCQkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2FjX2JpdF9zZXR1cF9ob2xkX3dpbmRvdyAgYSAwICAweCUwOHggICVkICAweCUwOHgiLGRkcl90ZXN0X3NpemUsdGVzdF9hY19zZXR1cF9ob2xkLCggbGFuZV9zdGVwKSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl0ZXN0X2FjX3NldHVwX2hvbGQ9MDsKCgkJfQoJfQoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiYWNiZGxyMF85X3JlZ19vcmdbJWRdMHglMDh4PT0weCUwOHhcbiIsCWxhbmVfc3RlcCwoRERSMF9QVUJfQUNCRExSMCsobGFuZV9zdGVwPDwyKSksYWNiZGxyMF85X3JlZ19vcmdbbGFuZV9zdGVwXSk7CgoJCX07CgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQwKTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2FjX2xhbmVfMHglMDh4fHNldHVwX21heCAweCUwOHggIHxob2xkX21heCAweCUwOHggfHNldHVwX3RpbWUgJTA4ZCBwcyA6Onxob2xkX3RpbWUgJTA4ZCBwcyAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQlhY2JkbHIwXzlfcmVnX3NldHVwX21heFtsYW5lX3N0ZXBdLAoJCQkJCWFjYmRscjBfOV9yZWdfaG9sZF9tYXhbbGFuZV9zdGVwXSwKCQkJCQlhY2JkbHIwXzlfcmVnX3NldHVwX3RpbWVbbGFuZV9zdGVwXSwKCQkJCQlhY2JkbHIwXzlfcmVnX2hvbGRfdGltZVtsYW5lX3N0ZXBdKTsKCgkJfQoJfQoJcmV0dXJuIHJlZ192YWx1ZTsKfQoKaW50IGRvX2Rkcl90ZXN0X2RhdGFfYml0X21hcmdpbihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlcmRkcl90ZXN0X2RhdGFfd2luZG93IGZ1bmN0aW9uXG4iKTsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7CgkvLwkgICB1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgoJdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJdW5zaWduZWQgaW50ICAgcmVnX3ZhbHVlPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdF9hY19zZXR1cF9ob2xkPSAwOwoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCS8vICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfb3JnWzEwXTsKCS8vICAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX3NldHVwX21heFs0MF07CgkvLyAgdW5zaWduZWQgaW50ICBhY2JkbHIwXzlfcmVnX2hvbGRfbWF4WzQwXTsKCS8vICAgICB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfc2V0dXBfdGltZVs0MF07CgkvLyB1bnNpZ25lZCBpbnQgIGFjYmRscjBfOV9yZWdfaG9sZF90aW1lWzQwXTsKCgljaGFyICplbmRwOwoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoKCQl7Ly9jaGFubmVsX2JfZW4gPSAxOwoJCX0KCgoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXsvL2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF90eXBlPTA7Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF90eXBlX3BhcmExPTA7Cgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF90eXBlX3BhcmEyPTA7CglpZiAoYXJnYyA+NCkgewoJCWRkcl90ZXN0X3R5cGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfdHlwZSA9IDA7CgkJfQoJfQoJaWYgKGRkcl90ZXN0X3R5cGUpIHsKCQlpZiAoYXJnYyA+NSkgewoJCQlkZHJfdGVzdF90eXBlX3BhcmExID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCWRkcl90ZXN0X3R5cGVfcGFyYTEgPSAwOwoJCQl9CgkJfQoJCWlmIChhcmdjID42KSB7CgkJCWRkcl90ZXN0X3R5cGVfcGFyYTIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzZdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJZGRyX3Rlc3RfdHlwZV9wYXJhMiA9IDk2OwoJCQl9CgkJfQoJfWVsc2UKCXsgZGRyX3Rlc3RfdHlwZV9wYXJhMSA9IDA7CgkJZGRyX3Rlc3RfdHlwZV9wYXJhMiA9IDk2OwoJfQoJLy9hcmdjMj01OwoJLy9mb3IoaSA9IDE7aTwoYXJnYyk7aSsrKQoJewoJCS8vYXJndjJbaS0xXT1hcmd2W2ldOwoJfQoKCS8vYXJndjJbMF09YXJndlsxXTsKCS8vYXJndjJbMV09YXJndlsyXTsKCS8vYXJndjJbMl09YXJndlszXTsKCXByaW50ZigiXG50ZXN0IGRhdGEgd2luZG93IGRkcl90ZXN0X3R5cGU9PTB4JTA4eCwgZGRyX3Rlc3RfdHlwZV9wYXJhMT09MHglMDh4LGRkcl90ZXN0X3R5cGVfcGFyYTI9PTB4JTA4eFxuIiwKCQkJZGRyX3Rlc3RfdHlwZSxkZHJfdGVzdF90eXBlX3BhcmExLGRkcl90ZXN0X3R5cGVfcGFyYTIpOwoJY2hhciBzdHJbMTAwXTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnQ9MDsKCXRlc3RfYWNfc2V0dXBfaG9sZD0wOwoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCQlmb3IgKCh0ZW1wX2NvdW50PTApOyh0ZW1wX2NvdW50PDI4KTsodGVtcF9jb3VudCsrKSkKCQl7CgkJCS8vZGF0YV9iZGxyMF81X3JlZ19vcmdbdGVtcF9jb3VudF09KCgocmVhZGwoKCh0ZW1wX2NvdW50Pj4yKTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC82KStyZWdfYmFzZV9hZGopKQoJCQkvLwk+Pig4Kih0ZXN0X2JkbCU0KSkpJjB4ZmYpOwoJCQlkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XT0oKHJlYWRsKCgodGVtcF9jb3VudCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoodGVtcF9jb3VudC83KSkpCgkJCQkJKTsKCQl9OwoKCQkvLyooY2hhciAgICAgKikoYXJndjJbMF0pPSJhIjsKCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJCXByaW50ZigiXG50ZXN0IGRhdGEgd2luZG93ICBhXG4iKTsKCQlmb3IgKChsYW5lX3N0ZXA9ZGRyX3Rlc3RfdHlwZV9wYXJhMSk7KGxhbmVfc3RlcDxkZHJfdGVzdF90eXBlX3BhcmEyKTsobGFuZV9zdGVwKyspKQoJCXsKCQkJaWYgKGxhbmVfc3RlcCA9PSA5KQoJCQl7bGFuZV9zdGVwPTEyOwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gMjEpCgkJCXtsYW5lX3N0ZXA9MjQ7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSAzMykKCQkJe2xhbmVfc3RlcD0zNjsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDQ1KQoJCQl7bGFuZV9zdGVwPTQ4OwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gMzMrMjQpCgkJCXtsYW5lX3N0ZXA9MzYrMjQ7CgkJCX0KCQkJaWYgKGxhbmVfc3RlcCA9PSA0NSsyNCkKCQkJe2xhbmVfc3RlcD00OCsyNDsKCQkJfQoJCQlpZiAobGFuZV9zdGVwID09IDMzKzQ4KQoJCQl7bGFuZV9zdGVwPTM2KzQ4OwoJCQl9CgkJCWlmIChsYW5lX3N0ZXAgPT0gNDQrNDgpCgkJCXtsYW5lX3N0ZXA9NDgrNDg7CgkJCX0KCgkJCS8vc3ByaW50Zihhcmd2MlszXSwiZCUiLCggbGFuZV9zdGVwKSk7CgkJCS8vaXRvYV9kZHJfdGVzdChsYW5lX3N0ZXAsKGFyZ3YyWzNdKSwxMCk7CgkJCS8vcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwwLGFyZ3YyWzBdKTsKCQkJLy8JcHJpbnRmKCJcbmFyZ3YyWyVkXT0lc1xuIiwzLGFyZ3YyWzNdKTsvL2EgMCAweDgwMDAwMDAgMCBjCgkJCS8vIHJlZ192YWx1ZT1kb19kZHJfdGVzdF9kcXNfd2luZG93X3N0ZXAoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3cgIGEgMCAgMHglMDh4ICAlZCAgMHglMDh4IixkZHJfdGVzdF9zaXplLHRlc3RfYWNfc2V0dXBfaG9sZCwoIGxhbmVfc3RlcCkpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCgkJCXRlc3RfYWNfc2V0dXBfaG9sZD0xOwoJCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3cgIGEgMCAgMHglMDh4ICAlZCAgMHglMDh4IixkZHJfdGVzdF9zaXplLHRlc3RfYWNfc2V0dXBfaG9sZCwoIGxhbmVfc3RlcCkpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJdGVzdF9hY19zZXR1cF9ob2xkPTA7CgkJCWZvciAoKHRlbXBfY291bnQ9MCk7KHRlbXBfY291bnQ8MjgpOyh0ZW1wX2NvdW50KyspKQoJCQl7CgkJCQl3cml0ZWwoKChkYXRhX2JkbHIwXzVfcmVnX29yZ1t0ZW1wX2NvdW50XSkpLAoJCQkJCQkoKCh0ZW1wX2NvdW50JTcpPDwyKStERFIwX1BVQl9EWDBCRExSMCsoRERSMF9QVUJfRFgxQkRMUjAtRERSMF9QVUJfRFgwQkRMUjApKih0ZW1wX2NvdW50LzcpKSk7CgoJCQl9OwoKCgkJfQoJfQoKCgoKCglpZiAoY2hhbm5lbF9hX2VuKQoJewoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDI4KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJkYXRhX2JkbHIwXzVfcmVnX29yZ1slZF0weCUwOHg9PTB4JTA4eFxuIiwJbGFuZV9zdGVwLAoJCQkJCSgoKGxhbmVfc3RlcCU3KTw8MikrRERSMF9QVUJfRFgwQkRMUjArKEREUjBfUFVCX0RYMUJETFIwLUREUjBfUFVCX0RYMEJETFIwKSoobGFuZV9zdGVwLzcpKSwKCQkJCQlkYXRhX2JkbHIwXzVfcmVnX29yZ1tsYW5lX3N0ZXBdKTsKCgkJfTsKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8OTYpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfYWNfbGFuZV8weCUwOHh8c2V0dXBfbWF4IDB4JTA4eCAgfGhvbGRfbWF4IDB4JTA4eCB8c2V0dXBfdGltZSAlMDhkIHBzIDo6fGhvbGRfdGltZSAlMDhkIHBzICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWJkbHIwXzlfcmVnX3NldHVwX21heFtsYW5lX3N0ZXBdLAoJCQkJCWJkbHIwXzlfcmVnX2hvbGRfbWF4W2xhbmVfc3RlcF0sCgkJCQkJYmRscjBfOV9yZWdfc2V0dXBfdGltZVtsYW5lX3N0ZXBdLAoJCQkJCWJkbHIwXzlfcmVnX2hvbGRfdGltZVtsYW5lX3N0ZXBdKTsKCgkJfX0KCgoKCXJldHVybiByZWdfdmFsdWU7Cn0KCi8vI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZX0dYX0JBQlkpCmludCBkb19kZHJfZ3hfY3Jvc3N0YWxrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8vKgoJdW5zaWduZWQgaW50ICBkZXNbOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzFbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzJbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzNbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzRbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzVbNF1bOF0gOwoJdW5zaWduZWQgaW50ICBwYXR0ZXJuXzZbNF1bOF0gOwoKCglkZXNbMF0gPSAJMHhhZWM4M2Y0OTsKCWRlc1sxXSA9ICAgICAgMHhkMjQzYTYyYzsKCWRlc1syXSA9ICAgICAgMHhmODc3NGEwYjsKCWRlc1szXSA9ICAgICAgIDB4NjNkMjE0ZTU7CglkZXNbNF0gPSAgICAgIDB4M2Y0MTY2ZDU7CglkZXNbNV0gPSAgICAgMHgyMzk2NzJjMDsKCWRlc1s2XSA9ICAgICAgMHg0N2JhNzUzMzsKCWRlc1s3XSA9ICAgICAgMHhjYWU0Y2Q3ZjsKCXBhdHRlcm5fMVswXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMVsxXVswXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bMV0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzJdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVszXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNF0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzVdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs2XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bN10gPSAweDAwZmZmZjAwOwoKCXBhdHRlcm5fMVsyXVswXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bMV0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzJdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVszXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNF0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzVdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs2XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bN10gPSAweGZmZmYwMDAwOwoKCXBhdHRlcm5fMVszXVswXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bMV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzJdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVszXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNF0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzVdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs2XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bN10gPSAweGZmMDBmZjAwOwoKCXBhdHRlcm5fMlswXVswXSA9IDB4MDAwMWZlMDA7CglwYXR0ZXJuXzJbMF1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bNF0gPSAweDAwMDJmZDAwOwoJcGF0dGVybl8yWzBdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsxXVswXSA9IDB4MDAwNGZiMDA7CglwYXR0ZXJuXzJbMV1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bNF0gPSAweDAwMDhmNzAwOwoJcGF0dGVybl8yWzFdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlsyXVswXSA9IDB4MDAxMGVmMDA7CglwYXR0ZXJuXzJbMl1bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bNF0gPSAweDAwMjBkZjAwOwoJcGF0dGVybl8yWzJdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fMlszXVswXSA9IDB4MDA0MGJmMDA7CglwYXR0ZXJuXzJbM11bMV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzJdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVszXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bNF0gPSAweDAwODA3ZjAwOwoJcGF0dGVybl8yWzNdWzVdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs2XSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bN10gPSAweDAwMDBmZjAwOwoKCXBhdHRlcm5fM1swXVswXSA9IDB4MDAwMTAwMDA7CglwYXR0ZXJuXzNbMF1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bNF0gPSAweDAwMDIwMDAwOwoJcGF0dGVybl8zWzBdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1sxXVswXSA9IDB4MDAwNDAwMDA7CglwYXR0ZXJuXzNbMV1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bNF0gPSAweDAwMDgwMDAwOwoJcGF0dGVybl8zWzFdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1syXVswXSA9IDB4MDAxMDAwMDA7CglwYXR0ZXJuXzNbMl1bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bNF0gPSAweDAwMjAwMDAwOwoJcGF0dGVybl8zWzJdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bN10gPSAweDAwMDAwMDAwOwoKCXBhdHRlcm5fM1szXVswXSA9IDB4MDA0MDAwMDA7CglwYXR0ZXJuXzNbM11bMV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzJdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVszXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bNF0gPSAweDAwODAwMDAwOwoJcGF0dGVybl8zWzNdWzVdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs2XSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bN10gPSAweDAwMDAwMDAwOwoKCS8vLyoKCXBhdHRlcm5fNFswXVswXSA9CTB4NTFjOGMwNDkJOwoJcGF0dGVybl80WzBdWzFdID0JMHgyZDQzNTkyYwk7CglwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKCXBhdHRlcm5fNFswXVszXSA9CTB4OWNkMmViZTUJOwoJcGF0dGVybl80WzBdWzRdID0JMHhjMDQxOTlkNQk7CglwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKCXBhdHRlcm5fNFswXVs2XSA9CTB4YjhiYThhMzMJOwoJcGF0dGVybl80WzBdWzddID0JMHgzNWU0MzI3Zgk7CgoJcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CglwYXR0ZXJuXzRbMV1bMV0gPQkweGQyYmM1OTJjCTsKCXBhdHRlcm5fNFsxXVsyXSA9CTB4Zjg4OGI1MGIJOwoJcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CglwYXR0ZXJuXzRbMV1bNF0gPQkweDNmYmU5OWQ1CTsKCXBhdHRlcm5fNFsxXVs1XSA9CTB4MjM2OThkYzAJOwoJcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CglwYXR0ZXJuXzRbMV1bN10gPQkweGNhMWIzMjdmCTsKCglwYXR0ZXJuXzRbMl1bMF0gPQkweDUxMzczZjQ5CTsKCXBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwoJcGF0dGVybl80WzJdWzJdID0JMHgwNzg4NGEwYgk7CglwYXR0ZXJuXzRbMl1bM10gPQkweDljMmQxNGU1CTsKCXBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwoJcGF0dGVybl80WzJdWzVdID0JMHhkYzY5NzJjMAk7CglwYXR0ZXJuXzRbMl1bNl0gPQkweGI4NDU3NTMzCTsKCXBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCglwYXR0ZXJuXzRbM11bMF0gPQkweDUxYzhjMDQ5CTsKCXBhdHRlcm5fNFszXVsxXSA9CTB4MmQ0MzU5MmMJOwoJcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CglwYXR0ZXJuXzRbM11bM10gPQkweDljZDJlYmU1CTsKCXBhdHRlcm5fNFszXVs0XSA9CTB4YzA0MTk5ZDUJOwoJcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CglwYXR0ZXJuXzRbM11bNl0gPQkweGI4YmE4YTMzCTsKCXBhdHRlcm5fNFszXVs3XSA9CTB4MzVlNDMyN2YJOwoKCXBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwoJcGF0dGVybl81WzBdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbMF1bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzBdWzRdID0JMHgzZjQzOWJkNQk7CglwYXR0ZXJuXzVbMF1bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzBdWzddID0JMHhjYWU0MzI3Zgk7CglwYXR0ZXJuXzVbMV1bMF0gPQkweGFlY2NjNDQ5CTsKCXBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwoJcGF0dGVybl81WzFdWzJdID0JMHhmODc3YjUwYgk7CglwYXR0ZXJuXzVbMV1bM10gPQkweDYzZDJlYmU1CTsKCXBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwoJcGF0dGVybl81WzFdWzVdID0JMHgyMzk2OGRjMAk7CglwYXR0ZXJuXzVbMV1bNl0gPQkweDQ3YmE4YTMzCTsKCXBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwoJcGF0dGVybl81WzJdWzBdID0JMHhhZWQ4ZDA0OQk7CglwYXR0ZXJuXzVbMl1bMV0gPQkweGQyNDM1OTJjCTsKCXBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwoJcGF0dGVybl81WzJdWzNdID0JMHg2M2QyZWJlNQk7CglwYXR0ZXJuXzVbMl1bNF0gPQkweDNmNjFiOWQ1CTsKCXBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwoJcGF0dGVybl81WzJdWzZdID0JMHg0N2JhOGEzMwk7CglwYXR0ZXJuXzVbMl1bN10gPQkweGNhZTQzMjdmCTsKCXBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwoJcGF0dGVybl81WzNdWzFdID0JMHhkMjQzNTkyYwk7CglwYXR0ZXJuXzVbM11bMl0gPQkweGY4NzdiNTBiCTsKCXBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwoJcGF0dGVybl81WzNdWzRdID0JMHgzZmMxMTlkNQk7CglwYXR0ZXJuXzVbM11bNV0gPQkweDIzOTY4ZGMwCTsKCXBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwoJcGF0dGVybl81WzNdWzddID0JMHhjYWU0MzI3Zgk7CgoJcGF0dGVybl82WzBdWzBdID0gICAweGFlYzkzZjQ5ICAgOwoJcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMF1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlswXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CglwYXR0ZXJuXzZbMF1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlswXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbMV1bMF0gPQkweGFlY2MzZjQ5CTsKCXBhdHRlcm5fNlsxXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMV1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlsxXVs0XSA9CTB4M2Y0OTY2ZDUJOwoJcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMV1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlsxXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CglwYXR0ZXJuXzZbMl1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsyXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMl1bNF0gPQkweDNmNjE2NmQ1CTsKCXBhdHRlcm5fNlsyXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMl1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlszXVswXSA9CTB4YWU4ODNmNDkJOwoJcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbM11bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlszXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CglwYXR0ZXJuXzZbM11bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlszXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CgkvLyovCgkvLyovCgoJY2hhciAqZW5kcDsKCXVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJdW5zaWduZWQgaW50ICAgbGZsYWcgPSAwOwoJdW5zaWduZWQgaW50ICBzdGFydF9hZGRyID0gRERSX1RFU1RfU1RBUlRfQUREUjsKCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIHRlc3RfYWRkcjsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0wOwoJZXJyb3JfY291bnQgPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CglpZiAoYXJnYyA9PSAxKQoJCWdvdG8gdXNhZ2U7CglpZiAoYXJnYz4xKQoJewoJCWlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJCWxmbGFnID0gMTsKCQl9CgoJCWVsc2V7CgkJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CgkJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCQlsb29wID0gMTsKCQl9CgoJCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJaWYgKGFyZ2MgPT0xKSB7CgkJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJCS8vICAgIGlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCQlsb29wID0gMTsKCgkJfQoJfQoKCgoJaWYgKGFyZ2MgPj0gMikgewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcCA9IDE7CgoJfQoJdW5zaWduZWQgaW50IHBhdHRlcm5fZmxhZzE9MTsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX2ZsYWcyPTE7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9mbGFnMz0xOwoJcGF0dGVybl9mbGFnMSA9IDE7CglwYXR0ZXJuX2ZsYWcyPTE7CglwYXR0ZXJuX2ZsYWczID0gMTsKCgoJaWYgKGFyZ2MgPj0gMyAgKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkpCgkJewoJCQlwYXR0ZXJuX2ZsYWcxID0gMTsKCQkJcGF0dGVybl9mbGFnMj0wOwoJCQlwYXR0ZXJuX2ZsYWczID0gMDsKCQl9CgkJZWxzZSBpZiAoKHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApKQoJCXsKCQkJcGF0dGVybl9mbGFnMSA9IDA7CgkJCXBhdHRlcm5fZmxhZzI9MTsKCQkJcGF0dGVybl9mbGFnMyA9IDA7CgkJfQoJCWVsc2UgIGlmICggKHN0cmNtcChhcmd2WzJdLCAiZCIpID09IDApKQoJCXsKCQkJcGF0dGVybl9mbGFnMSA9IDA7CgkJCXBhdHRlcm5fZmxhZzI9MDsKCQkJcGF0dGVybl9mbGFnMyA9IDE7CgkJfQoJfQoKCS8vCWlmKHRlc3Rfc2l6ZTwweDIwKQoJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwoJdGVzdF9zaXplID0gMHgyMDsKCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2s9MDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX29bOF07Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9kWzhdOwoKCgkvL0REUl9URVNUX1NUQVJUOgoKCS8vLyoKCWVycm9yX2NvdW50PTA7CglkbyB7CgkJaWYgKGxmbGFnKQoJCQlsb29wID0gODg4OwoKCQkvL2lmKG9sZF9wYXR0ZXJuX2ZsYWc9PTEpCgkJewoKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uXG4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCgkJCS8qCgkJCSAgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJICAgewoKCQkJICAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJICAgewoJCQkgICB0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJICoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJfQoJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQl7ZXJyb3JfY291bnQrKzsKCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJfQoJCQl9CgkJCX0KCQkJfQoJCQkqLwoJCQlpZiAocGF0dGVybl9mbGFnMSA9PSAxKSB7CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy8gIHByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLwkgIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJaWYgKHBhdHRlcm5fb1t0ZW1wX2ldICE9IHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQlwcmludGYoInA0RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldLHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJfQoKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy8gIHByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLwkgIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJCQkJCQlpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpKSAhPSBwYXR0ZXJuX2RbdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCXByaW50ZigicDQgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKHBhdHRlcm5fZmxhZzIgPT0gMSkgewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwyLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCQkJCQkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQlwcmludGYoInA1IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKSxwYXR0ZXJuX2RbdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQl9CgoJCQlpZiAocGF0dGVybl9mbGFnMyA9PSAxKSB7CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKSB7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLyBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpCgkJCQl7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX2ludl9wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8gcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJcHJpbnRmKCJwNiBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgoKCgkJfQoKCQlwcmludGYoIlxFcnJvciBjb3VudD09MHglMDh4IiwgZXJyb3JfY291bnQpOwoJCXByaW50ZigiXG4gICAgICBcbiIpOwoJfXdoaWxlKC0tbG9vcCk7CgkvLyovCgoJcHJpbnRmKCJcckVuZCBkZHIgdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIpOwoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KCgpVX0JPT1RfQ01EKAoJZGRydGVzdF9neF9jcm9zc3RhbGssCTUsCTEsCWRvX2Rkcl9neF9jcm9zc3RhbGssCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHgxMDAwMDAwMFxuIgopOwoKCgovLyNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV9HWF9UVl9CQUJZKQppbnQgZG9fZGRyX2d4dHZiYl9jcm9zc3RhbGsoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLy8qCgl1bnNpZ25lZCBpbnQgIGFfZGVzWzhdLGJfZGVzWzhdLGRlc1s4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fMVs0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fMls0XVs4XSA7Cgl1bnNpZ25lZCBpbnQgIHBhdHRlcm5fM1s0XVs4XSA7CgkvLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNFs0XVs4XSA7CgkvLyB1bnNpZ25lZCBpbnQgIHBhdHRlcm5fNVs0XVs4XSA7CgkvLyAgdW5zaWduZWQgaW50ICBwYXR0ZXJuXzZbNF1bOF0gOwoKCglhX2Rlc1swXSA9ICAgICAgMHg3ZWEwOWI1MjsKCWFfZGVzWzFdID0gICAgICAweGJjNTdiYjIzOwoJYV9kZXNbMl0gPSAgICAgIDB4OGQyYjZlNjU7CglhX2Rlc1szXSA9ICAgICAgMHgxNWZkY2RjNDsKCWFfZGVzWzRdID0gICAgICAweGJjMWRmNDUzOwoJYV9kZXNbNV0gPSAgICAgIDB4MjFiY2JjZGY7CglhX2Rlc1s2XSA9ICAgICAgMHgyNjdiN2FjMTsKCWFfZGVzWzddID0gICAgICAweDZhZjAzZDcyOwoKCgliX2Rlc1swXSA9ICAgICAgMHhkZmMyZWUxMjsKCWJfZGVzWzFdID0gICAgICAweDRmNThkYTQzOwoJYl9kZXNbMl0gPSAgICAgIDB4ODc4MDk1NTc7CgliX2Rlc1szXSA9ICAgICAgMHhiODdkZGJmNDsKCWJfZGVzWzRdID0gICAgICAweDY2N2ZiMDIxOwoJYl9kZXNbNV0gPSAgICAgIDB4NjQ1OTM1ODY7CgliX2Rlc1s2XSA9ICAgICAgMHhlZTczZDhkNTsKCWJfZGVzWzddID0gICAgICAweGU2NWY5NzJkOwoJcGF0dGVybl8xWzBdWzBdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVsxXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bMl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzNdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs0XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbMF1bNV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzBdWzZdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVswXVs3XSA9IDB4ZmYwMGZmMDA7CgoJcGF0dGVybl8xWzFdWzBdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVsxXSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bMl0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzNdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs0XSA9IDB4MDBmZmZmMDA7CglwYXR0ZXJuXzFbMV1bNV0gPSAweDAwZmZmZjAwOwoJcGF0dGVybl8xWzFdWzZdID0gMHgwMGZmZmYwMDsKCXBhdHRlcm5fMVsxXVs3XSA9IDB4MDBmZmZmMDA7CgoJcGF0dGVybl8xWzJdWzBdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVsxXSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bMl0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzNdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs0XSA9IDB4ZmZmZjAwMDA7CglwYXR0ZXJuXzFbMl1bNV0gPSAweGZmZmYwMDAwOwoJcGF0dGVybl8xWzJdWzZdID0gMHhmZmZmMDAwMDsKCXBhdHRlcm5fMVsyXVs3XSA9IDB4ZmZmZjAwMDA7CgoJcGF0dGVybl8xWzNdWzBdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVsxXSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bMl0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzNdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs0XSA9IDB4ZmYwMGZmMDA7CglwYXR0ZXJuXzFbM11bNV0gPSAweGZmMDBmZjAwOwoJcGF0dGVybl8xWzNdWzZdID0gMHhmZjAwZmYwMDsKCXBhdHRlcm5fMVszXVs3XSA9IDB4ZmYwMGZmMDA7CgoJcGF0dGVybl8yWzBdWzBdID0gMHgwMDAxZmUwMDsKCXBhdHRlcm5fMlswXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMF1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs0XSA9IDB4MDAwMmZkMDA7CglwYXR0ZXJuXzJbMF1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzBdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlswXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8yWzFdWzBdID0gMHgwMDA0ZmIwMDsKCXBhdHRlcm5fMlsxXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMV1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs0XSA9IDB4MDAwOGY3MDA7CglwYXR0ZXJuXzJbMV1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzFdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsxXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8yWzJdWzBdID0gMHgwMDEwZWYwMDsKCXBhdHRlcm5fMlsyXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbMl1bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs0XSA9IDB4MDAyMGRmMDA7CglwYXR0ZXJuXzJbMl1bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzJdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlsyXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8yWzNdWzBdID0gMHgwMDQwYmYwMDsKCXBhdHRlcm5fMlszXVsxXSA9IDB4MDAwMGZmMDA7CglwYXR0ZXJuXzJbM11bMl0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzNdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs0XSA9IDB4MDA4MDdmMDA7CglwYXR0ZXJuXzJbM11bNV0gPSAweDAwMDBmZjAwOwoJcGF0dGVybl8yWzNdWzZdID0gMHgwMDAwZmYwMDsKCXBhdHRlcm5fMlszXVs3XSA9IDB4MDAwMGZmMDA7CgoJcGF0dGVybl8zWzBdWzBdID0gMHgwMDAxMDAwMDsKCXBhdHRlcm5fM1swXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMF1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs0XSA9IDB4MDAwMjAwMDA7CglwYXR0ZXJuXzNbMF1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzBdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1swXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzFdWzBdID0gMHgwMDA0MDAwMDsKCXBhdHRlcm5fM1sxXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMV1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs0XSA9IDB4MDAwODAwMDA7CglwYXR0ZXJuXzNbMV1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzFdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1sxXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzJdWzBdID0gMHgwMDEwMDAwMDsKCXBhdHRlcm5fM1syXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbMl1bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs0XSA9IDB4MDAyMDAwMDA7CglwYXR0ZXJuXzNbMl1bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzJdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1syXVs3XSA9IDB4MDAwMDAwMDA7CgoJcGF0dGVybl8zWzNdWzBdID0gMHgwMDQwMDAwMDsKCXBhdHRlcm5fM1szXVsxXSA9IDB4MDAwMDAwMDA7CglwYXR0ZXJuXzNbM11bMl0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzNdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs0XSA9IDB4MDA4MDAwMDA7CglwYXR0ZXJuXzNbM11bNV0gPSAweDAwMDAwMDAwOwoJcGF0dGVybl8zWzNdWzZdID0gMHgwMDAwMDAwMDsKCXBhdHRlcm5fM1szXVs3XSA9IDB4MDAwMDAwMDA7CgoJLyoKCSAgIHBhdHRlcm5fNFswXVswXSA9CTB4NTFjOGMwNDkJOwoJICAgcGF0dGVybl80WzBdWzFdID0JMHgyZDQzNTkyYwk7CgkgICBwYXR0ZXJuXzRbMF1bMl0gPQkweDA3NzdiNTBiCTsKCSAgIHBhdHRlcm5fNFswXVszXSA9CTB4OWNkMmViZTUJOwoJICAgcGF0dGVybl80WzBdWzRdID0JMHhjMDQxOTlkNQk7CgkgICBwYXR0ZXJuXzRbMF1bNV0gPQkweGRjOTY4ZGMwCTsKCSAgIHBhdHRlcm5fNFswXVs2XSA9CTB4YjhiYThhMzMJOwoJICAgcGF0dGVybl80WzBdWzddID0JMHgzNWU0MzI3Zgk7CgoJICAgcGF0dGVybl80WzFdWzBdID0JMHhhZTM3YzA0OQk7CgkgICBwYXR0ZXJuXzRbMV1bMV0gPQkweGQyYmM1OTJjCTsKCSAgIHBhdHRlcm5fNFsxXVsyXSA9CTB4Zjg4OGI1MGIJOwoJICAgcGF0dGVybl80WzFdWzNdID0JMHg2MzJkZWJlNQk7CgkgICBwYXR0ZXJuXzRbMV1bNF0gPQkweDNmYmU5OWQ1CTsKCSAgIHBhdHRlcm5fNFsxXVs1XSA9CTB4MjM2OThkYzAJOwoJICAgcGF0dGVybl80WzFdWzZdID0JMHg0NzQ1OGEzMwk7CgkgICBwYXR0ZXJuXzRbMV1bN10gPQkweGNhMWIzMjdmCTsKCgkgICBwYXR0ZXJuXzRbMl1bMF0gPQkweDUxMzczZjQ5CTsKCSAgIHBhdHRlcm5fNFsyXVsxXSA9CTB4MmRiY2E2MmMJOwoJICAgcGF0dGVybl80WzJdWzJdID0JMHgwNzg4NGEwYgk7CgkgICBwYXR0ZXJuXzRbMl1bM10gPQkweDljMmQxNGU1CTsKCSAgIHBhdHRlcm5fNFsyXVs0XSA9CTB4YzBiZTY2ZDUJOwoJICAgcGF0dGVybl80WzJdWzVdID0JMHhkYzY5NzJjMAk7CgkgICBwYXR0ZXJuXzRbMl1bNl0gPQkweGI4NDU3NTMzCTsKCSAgIHBhdHRlcm5fNFsyXVs3XSA9CTB4MzUxYmNkN2YJOwoKCgkgICBwYXR0ZXJuXzRbM11bMF0gPQkweDUxYzhjMDQ5CTsKCSAgIHBhdHRlcm5fNFszXVsxXSA9CTB4MmQ0MzU5MmMJOwoJICAgcGF0dGVybl80WzNdWzJdID0JMHgwNzc3YjUwYgk7CgkgICBwYXR0ZXJuXzRbM11bM10gPQkweDljZDJlYmU1CTsKCSAgIHBhdHRlcm5fNFszXVs0XSA9CTB4YzA0MTk5ZDUJOwoJICAgcGF0dGVybl80WzNdWzVdID0JMHhkYzk2OGRjMAk7CgkgICBwYXR0ZXJuXzRbM11bNl0gPQkweGI4YmE4YTMzCTsKCSAgIHBhdHRlcm5fNFszXVs3XSA9CTB4MzVlNDMyN2YJOwoKCSAgIHBhdHRlcm5fNVswXVswXSA9CTB4YWVjOWMxNDkJOwoJICAgcGF0dGVybl81WzBdWzFdID0JMHhkMjQzNTkyYwk7CgkgICBwYXR0ZXJuXzVbMF1bMl0gPQkweGY4NzdiNTBiCTsKCSAgIHBhdHRlcm5fNVswXVszXSA9CTB4NjNkMmViZTUJOwoJICAgcGF0dGVybl81WzBdWzRdID0JMHgzZjQzOWJkNQk7CgkgICBwYXR0ZXJuXzVbMF1bNV0gPQkweDIzOTY4ZGMwCTsKCSAgIHBhdHRlcm5fNVswXVs2XSA9CTB4NDdiYThhMzMJOwoJICAgcGF0dGVybl81WzBdWzddID0JMHhjYWU0MzI3Zgk7CgkgICBwYXR0ZXJuXzVbMV1bMF0gPQkweGFlY2NjNDQ5CTsKCSAgIHBhdHRlcm5fNVsxXVsxXSA9CTB4ZDI0MzU5MmMJOwoJICAgcGF0dGVybl81WzFdWzJdID0JMHhmODc3YjUwYgk7CgkgICBwYXR0ZXJuXzVbMV1bM10gPQkweDYzZDJlYmU1CTsKCSAgIHBhdHRlcm5fNVsxXVs0XSA9CTB4M2Y0OTkxZDUJOwoJICAgcGF0dGVybl81WzFdWzVdID0JMHgyMzk2OGRjMAk7CgkgICBwYXR0ZXJuXzVbMV1bNl0gPQkweDQ3YmE4YTMzCTsKCSAgIHBhdHRlcm5fNVsxXVs3XSA9CTB4Y2FlNDMyN2YJOwoJICAgcGF0dGVybl81WzJdWzBdID0JMHhhZWQ4ZDA0OQk7CgkgICBwYXR0ZXJuXzVbMl1bMV0gPQkweGQyNDM1OTJjCTsKCSAgIHBhdHRlcm5fNVsyXVsyXSA9CTB4Zjg3N2I1MGIJOwoJICAgcGF0dGVybl81WzJdWzNdID0JMHg2M2QyZWJlNQk7CgkgICBwYXR0ZXJuXzVbMl1bNF0gPQkweDNmNjFiOWQ1CTsKCSAgIHBhdHRlcm5fNVsyXVs1XSA9CTB4MjM5NjhkYzAJOwoJICAgcGF0dGVybl81WzJdWzZdID0JMHg0N2JhOGEzMwk7CgkgICBwYXR0ZXJuXzVbMl1bN10gPQkweGNhZTQzMjdmCTsKCSAgIHBhdHRlcm5fNVszXVswXSA9CTB4YWU4ODgwNDkJOwoJICAgcGF0dGVybl81WzNdWzFdID0JMHhkMjQzNTkyYwk7CgkgICBwYXR0ZXJuXzVbM11bMl0gPQkweGY4NzdiNTBiCTsKCSAgIHBhdHRlcm5fNVszXVszXSA9CTB4NjNkMmViZTUJOwoJICAgcGF0dGVybl81WzNdWzRdID0JMHgzZmMxMTlkNQk7CgkgICBwYXR0ZXJuXzVbM11bNV0gPQkweDIzOTY4ZGMwCTsKCSAgIHBhdHRlcm5fNVszXVs2XSA9CTB4NDdiYThhMzMJOwoJICAgcGF0dGVybl81WzNdWzddID0JMHhjYWU0MzI3Zgk7CgoJcGF0dGVybl82WzBdWzBdID0gICAweGFlYzkzZjQ5ICAgOwoJcGF0dGVybl82WzBdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbMF1bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlswXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzBdWzRdID0JMHgzZjQzNjZkNQk7CglwYXR0ZXJuXzZbMF1bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlswXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzBdWzddID0JMHhjYWU0Y2Q3Zgk7CglwYXR0ZXJuXzZbMV1bMF0gPQkweGFlY2MzZjQ5CTsKCXBhdHRlcm5fNlsxXVsxXSA9CTB4ZDI0M2E2MmMJOwoJcGF0dGVybl82WzFdWzJdID0JMHhmODc3NGEwYgk7CglwYXR0ZXJuXzZbMV1bM10gPQkweDYzZDIxNGU1CTsKCXBhdHRlcm5fNlsxXVs0XSA9CTB4M2Y0OTY2ZDUJOwoJcGF0dGVybl82WzFdWzVdID0JMHgyMzk2NzJjMAk7CglwYXR0ZXJuXzZbMV1bNl0gPQkweDQ3YmE3NTMzCTsKCXBhdHRlcm5fNlsxXVs3XSA9CTB4Y2FlNGNkN2YJOwoJcGF0dGVybl82WzJdWzBdID0JMHhhZWQ4M2Y0OQk7CglwYXR0ZXJuXzZbMl1bMV0gPQkweGQyNDNhNjJjCTsKCXBhdHRlcm5fNlsyXVsyXSA9CTB4Zjg3NzRhMGIJOwoJcGF0dGVybl82WzJdWzNdID0JMHg2M2QyMTRlNQk7CglwYXR0ZXJuXzZbMl1bNF0gPQkweDNmNjE2NmQ1CTsKCXBhdHRlcm5fNlsyXVs1XSA9CTB4MjM5NjcyYzAJOwoJcGF0dGVybl82WzJdWzZdID0JMHg0N2JhNzUzMwk7CglwYXR0ZXJuXzZbMl1bN10gPQkweGNhZTRjZDdmCTsKCXBhdHRlcm5fNlszXVswXSA9CTB4YWU4ODNmNDkJOwoJcGF0dGVybl82WzNdWzFdID0JMHhkMjQzYTYyYwk7CglwYXR0ZXJuXzZbM11bMl0gPQkweGY4Nzc0YTBiCTsKCXBhdHRlcm5fNlszXVszXSA9CTB4NjNkMjE0ZTUJOwoJcGF0dGVybl82WzNdWzRdID0JMHgzZmMxNjZkNQk7CglwYXR0ZXJuXzZbM11bNV0gPQkweDIzOTY3MmMwCTsKCXBhdHRlcm5fNlszXVs2XSA9CTB4NDdiYTc1MzMJOwoJcGF0dGVybl82WzNdWzddID0JMHhjYWU0Y2Q3Zgk7CgkqLwoJCS8vKi8KCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7Cgl1bnNpZ25lZCBpbnQgICBsZmxhZyA9IDA7Cgl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJdW5zaWduZWQgaW50ICB0ZXN0X3NpemUgPSBERFJfVEVTVF9TSVpFOwoJdW5zaWduZWQgaW50ICAgdGVzdF9hZGRyOwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTA7CgllcnJvcl9jb3VudCA9MDsKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CglpZiAoYXJnYyA9PSAxKQoJCWdvdG8gdXNhZ2U7CglpZiAoYXJnYz4xKQoJewoJCWlmIChzdHJjbXAoYXJndlsxXSwgImwiKSA9PSAwKSB7CgkJCWxmbGFnID0gMTsKCQl9CgoJCWVsc2V7CgkJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxMCk7CgkJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCQlsb29wID0gMTsKCQl9CgoJCS8vICAgIHByaW50ZigiXG5MSU5FPT0gMHglMDh4XG4iLCBfX0xJTkVfXyk7CgkJaWYgKGFyZ2MgPT0xKSB7CgkJCS8vICAgIHN0YXJ0X2FkZHIgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJCS8vICAgIGlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCQlsb29wID0gMTsKCQl9Cgl9CgoJaWYgKGFyZ2MgPj0gMikgewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJbG9vcCA9IDE7CgoJfQoJdW5zaWduZWQgaW50IHBhdHRlcm5fZmxhZzE9MTsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX2ZsYWcyPTE7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9mbGFnMz0xOwoJcGF0dGVybl9mbGFnMSA9IDE7CglwYXR0ZXJuX2ZsYWcyPTE7CglwYXR0ZXJuX2ZsYWczID0gMTsKCgoJaWYgKGFyZ2MgPj0gMyAgKSB7CgkJaWYgKCAoc3RyY21wKGFyZ3ZbMl0sICJzIikgPT0gMCkpCgkJewoJCQlwYXR0ZXJuX2ZsYWcxID0gMTsKCQkJcGF0dGVybl9mbGFnMj0wOwoJCQlwYXR0ZXJuX2ZsYWczID0gMDsKCQl9CgkJZWxzZSBpZiAoKHN0cmNtcChhcmd2WzJdLCAiYyIpID09IDApKQoJCXsKCQkJcGF0dGVybl9mbGFnMSA9IDA7CgkJCXBhdHRlcm5fZmxhZzI9MTsKCQkJcGF0dGVybl9mbGFnMyA9IDA7CgkJfQoJCWVsc2UgIGlmICggKHN0cmNtcChhcmd2WzJdLCAiZCIpID09IDApKQoJCXsKCQkJcGF0dGVybl9mbGFnMSA9IDA7CgkJCXBhdHRlcm5fZmxhZzI9MDsKCQkJcGF0dGVybl9mbGFnMyA9IDE7CgkJfQoJfQoKCS8vCWlmKHRlc3Rfc2l6ZTwweDIwKQoJc3RhcnRfYWRkcj0weDEwMDAwMDAwOwoJdGVzdF9zaXplID0gMHgyMDsKCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2s9MDsKCXVuc2lnbmVkIGludCBwYXR0ZXJuX29bOF07Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl9kWzhdOwoJLy91bnNpZ25lZCBpbnQgaT0wOwoKCXByaW50ZigiXG5sb29wIHNob3VsZCA+MiBhbmQgbm93IGxvb3A9PSAweCUwOHhcbiIsIGxvb3ApOwoJLy9ERFJfVEVTVF9TVEFSVDoKCgkvLy8qCgoJZXJyb3JfY291bnQ9MDsKCWRvIHsKCQlpZiAobGZsYWcpCgkJCWxvb3AgPSA4ODg7CgkJaWYgKGxvb3AlMikKCQl7CgkJCXN0YXJ0X2FkZHI9MHgxMDAwMDAwMDsKCQkJdGVzdF9zaXplID0gMHgyMDsKCQkJZm9yICgoaT0wKTsoaTw4KTsoaSsrKSkKCQkJewoJCQkJZGVzW2ldPSAgYV9kZXNbaV07CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJc3RhcnRfYWRkcj0weDEwMDAwNDAwOwoJCQl0ZXN0X3NpemUgPSAweDIwOwoJCQlmb3IgKChpPTApOyhpPDgpOyhpKyspKQoJCQl7CgkJCQlkZXNbaV09ICBiX2Rlc1tpXTsKCQkJfQoJCX0KCQkvL2lmKG9sZF9wYXR0ZXJuX2ZsYWc9PTEpCgkJewoKCQkJcHJpbnRmKCJcblN0YXJ0IHdyaXRpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uXG4iLCBzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCgkJCS8qCgkJCSAgIGZvciAoKHRlbXBfaz0wKTsodGVtcF9rPDQpOyh0ZW1wX2srKykpIHsKCQkJICAgewoKCQkJICAgZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJICAgewoJCQkgICB0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJICoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKT1kZXNfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJfQoJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgoJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCWlmIChwYXR0ZXJuX29bdGVtcF9pXSAhPSBwYXR0ZXJuXzVbdGVtcF9rXVt0ZW1wX2ldKQoJCQl7ZXJyb3JfY291bnQrKzsKCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJfQoJCQl9CgkJCX0KCQkJfQoJCQkqLwoJCQlpZiAocGF0dGVybl9mbGFnMSA9PSAxKSB7CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwxLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fMVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy8gIHByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvLwkgIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy8JaWYocGF0dGVybl9vW3RlbXBfaV0hPXBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pCgkJCQkJCQlpZiAoKHBhdHRlcm5fb1t0ZW1wX2ldKSAhPSAoZGVzX3BhdHRlcm4odGVtcF9pLDEsdGVtcF9rLHRlbXBfaSkpKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJLy8gICAgICAgICAgICAgICAgcHJpbnRmKCJwNEVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgcGF0dGVybl80W3RlbXBfa11bdGVtcF9pXSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCQlwcmludGYoInA0RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCBkZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSxwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCX0KCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzFbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vICBwcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8JICBwcmludGYoIlxuMHglMDh4IixwYXR0ZXJuXzRbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCXBhdHRlcm5fZFt0ZW1wX2ldPWRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpOwoJCQkJCQkJaWYgKChkZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKSkgIT0gcGF0dGVybl9kW3RlbXBfaV0pCgkJCQkJCQl7ZXJyb3JfY291bnQrKzsKCQkJCQkJCQkvLyAgICAgICAgICAgICAgICAgICAgIHByaW50ZigicDQgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNFt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCQlwcmludGYoInA0IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihkZXNfcGF0dGVybih0ZW1wX2ksMSx0ZW1wX2ssdGVtcF9pKSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZiAocGF0dGVybl9mbGFnMiA9PSAxKSB7CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKSB7CgkJCQkJewoJCQkJCQlkZHJfdWRlbGF5KDEwMDAwKTsKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQkqKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ly9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldOwoJCQkJCQkJLy8JI2RlZmluZSBkZXNfcGF0dGVybihhLGIsYyxkKSAgZGVzW2FdXnBhdHRlcm5fIyNiW2NdW2RdCgkJCQkJCQkvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV0KCQkJCQkJfQoJCQkJCQkvLyAgIF9jbGVhbl9kY2FjaGVfYWRkcigweDEwMDAwMDAwKTsKI2lmZGVmIEREUl9QUkVGRVRDSF9DQUNIRQoJCQkJCQlmbHVzaF9kY2FjaGVfcmFuZ2Uoc3RhcnRfYWRkcixzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKI2VuZGlmCgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpIHsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJcGF0dGVybl9vW3RlbXBfaV09Kih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpOwoJCQkJCQkJLy8JIHByaW50ZigiXG4gdGVzdF9hZGRyIHBhdHRlcm5fbyBwYXR0ZXJuX2QgIDB4JTA4eCAtIDB4JTA4eCAtIDB4JTA4eCIsIHRlc3RfYWRkcixwYXR0ZXJuX29bdGVtcF9pXSwgcGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLChwYXR0ZXJuX29bdGVtcF9pXSleKGRlc1t0ZW1wX2ldKSk7CgkJCQkJCQkvL3ByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy8JaWYocGF0dGVybl9vW3RlbXBfaV0hPXBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0pCgkJCQkJCQlpZiAoKHBhdHRlcm5fb1t0ZW1wX2ldKSAhPSAoZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSkpKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJLy8gICAgICAgICAgIHByaW50ZigicDVFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNVt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkJcHJpbnRmKCJwNUVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSkscGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQlwYXR0ZXJuX2RbdGVtcF9pXT1kZXNfeG9yX3BhdHRlcm4oKGRlc1t0ZW1wX2ldKSwocGF0dGVybl9vW3RlbXBfaV0pKTsKCQkJCQkJCWlmICgoZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSkpICE9IHBhdHRlcm5fZFt0ZW1wX2ldKQoJCQkJCQkJe2Vycm9yX2NvdW50Kys7CgkJCQkJCQkJLy8gICAgICAgICAgcHJpbnRmKCJwNSBpbnZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIH4ocGF0dGVybl81W3RlbXBfa11bdGVtcF9pXSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJCXByaW50ZigicDUgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KGRlc19pbnZfcGF0dGVybih0ZW1wX2ksMix0ZW1wX2ssdGVtcF9pKSkscGF0dGVybl9kW3RlbXBfaV0pOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJfQoKCQkJaWYgKHBhdHRlcm5fZmxhZzMgPT0gMSkgewoJCQkJZm9yICgodGVtcF9rPTApOyh0ZW1wX2s8NCk7KHRlbXBfaysrKSkgewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpOy8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXTsKCQkJCQkJCS8vCSNkZWZpbmUgZGVzX3BhdHRlcm4oYSxiLGMsZCkgIGRlc1thXV5wYXR0ZXJuXyMjYltjXVtkXQoJCQkJCQkJLy9kZXNbdGVtcF9pXV5wYXR0ZXJuXzJbdGVtcF9rXVt0ZW1wX2ldCgkJCQkJCX0KCQkJCQkJLy8gICBfY2xlYW5fZGNhY2hlX2FkZHIoMHgxMDAwMDAwMCk7CiNpZmRlZiBERFJfUFJFRkVUQ0hfQ0FDSEUKCQkJCQkJZmx1c2hfZGNhY2hlX3JhbmdlKHN0YXJ0X2FkZHIsc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQlmb3IgKCh0ZW1wX2k9MCk7KHRlbXBfaTw4KTsodGVtcF9pKyspKSB7CgkJCQkJCQl0ZXN0X2FkZHI9c3RhcnRfYWRkcisodGVtcF9pPDwyKTsKCQkJCQkJCXBhdHRlcm5fb1t0ZW1wX2ldPSoodm9sYXRpbGUgdWludDMyX3QgKikoaW50X2NvbnZ0ZXJfcCh0ZXN0X2FkZHIpKTsKCQkJCQkJCS8vCSBwcmludGYoIlxuIHRlc3RfYWRkciBwYXR0ZXJuX28gcGF0dGVybl9kICAweCUwOHggLSAweCUwOHggLSAweCUwOHgiLCB0ZXN0X2FkZHIscGF0dGVybl9vW3RlbXBfaV0sIHBhdHRlcm5fM1t0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJLy9wcmludGYoIlxuMHglMDh4IiwocGF0dGVybl9vW3RlbXBfaV0pXihkZXNbdGVtcF9pXSkpOwoJCQkJCQkJLy8gcHJpbnRmKCJcbjB4JTA4eCIscGF0dGVybl82W3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkvL2lmKHBhdHRlcm5fb1t0ZW1wX2ldIT1wYXR0ZXJuXzZbdGVtcF9rXVt0ZW1wX2ldKQoJCQkJCQkJaWYgKChwYXR0ZXJuX29bdGVtcF9pXSkgIT0gKGRlc19wYXR0ZXJuKHRlbXBfaSwzLHRlbXBfayx0ZW1wX2kpKSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCS8vICAgICAgIHByaW50ZigicDZFcnJvciBkYXRhIFsweCUwOHhdIGF0IG9mZnNldCAweCUwOHhbMHglMDh4XS1EMHglMDh4XG4iLHBhdHRlcm5fb1t0ZW1wX2ldLCBwX2NvbnZ0ZXJfaW50KHRlc3RfYWRkciksIHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0scGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQkJcHJpbnRmKCJwNkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgZGVzX3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSkscGF0dGVybl8zW3RlbXBfa11bdGVtcF9pXSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlmb3IgKCh0ZW1wX2s9MCk7KHRlbXBfazw0KTsodGVtcF9rKyspKQoJCQkJewoJCQkJCXsKCQkJCQkJZGRyX3VkZWxheSgxMDAwMCk7CgkJCQkJCWZvciAoKHRlbXBfaT0wKTsodGVtcF9pPDgpOyh0ZW1wX2krKykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYWRkcj1zdGFydF9hZGRyKyh0ZW1wX2k8PDIpOwoJCQkJCQkJKih2b2xhdGlsZSB1aW50MzJfdCAqKShpbnRfY29udnRlcl9wKHRlc3RfYWRkcikpPWRlc19pbnZfcGF0dGVybih0ZW1wX2ksMyx0ZW1wX2ssdGVtcF9pKTsvL2Rlc1t0ZW1wX2ldXnBhdHRlcm5fMlt0ZW1wX2tdW3RlbXBfaV07CgkJCQkJCQkvLwkjZGVmaW5lIGRlc19wYXR0ZXJuKGEsYixjLGQpICBkZXNbYV1ecGF0dGVybl8jI2JbY11bZF0KCQkJCQkJCS8vZGVzW3RlbXBfaV1ecGF0dGVybl8yW3RlbXBfa11bdGVtcF9pXQoJCQkJCQl9CgkJCQkJCS8vICAgX2NsZWFuX2RjYWNoZV9hZGRyKDB4MTAwMDAwMDApOwojaWZkZWYgRERSX1BSRUZFVENIX0NBQ0hFCgkJCQkJCWZsdXNoX2RjYWNoZV9yYW5nZShzdGFydF9hZGRyLHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwojZW5kaWYKCQkJCQkJZm9yICgodGVtcF9pPTApOyh0ZW1wX2k8OCk7KHRlbXBfaSsrKSkgewoJCQkJCQkJdGVzdF9hZGRyPXN0YXJ0X2FkZHIrKHRlbXBfaTw8Mik7CgkJCQkJCQlwYXR0ZXJuX29bdGVtcF9pXT0qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk7CgkJCQkJCQkvLwkgcHJpbnRmKCJcbiB0ZXN0X2FkZHIgcGF0dGVybl9vIHBhdHRlcm5fZCAgMHglMDh4IC0gMHglMDh4IC0gMHglMDh4IiwgdGVzdF9hZGRyLHBhdHRlcm5fb1t0ZW1wX2ldLCBwYXR0ZXJuXzNbdGVtcF9rXVt0ZW1wX2ldKTsKCQkJCQkJCS8vcHJpbnRmKCJcbjB4JTA4eCIsKHBhdHRlcm5fb1t0ZW1wX2ldKV4oZGVzW3RlbXBfaV0pKTsKCQkJCQkJCS8vIHByaW50ZigiXG4weCUwOHgiLHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pOwoJCQkJCQkJcGF0dGVybl9kW3RlbXBfaV09ZGVzX3hvcl9wYXR0ZXJuKChkZXNbdGVtcF9pXSksKHBhdHRlcm5fb1t0ZW1wX2ldKSk7CgkJCQkJCQlpZiAoKGRlc194b3JfcGF0dGVybigoZGVzW3RlbXBfaV0pLChwYXR0ZXJuX29bdGVtcF9pXSkpKSAhPSBwYXR0ZXJuX2RbdGVtcF9pXSkKCQkJCQkJCXtlcnJvcl9jb3VudCsrOwoJCQkJCQkJCS8vICAgICAgIHByaW50ZigicDYgaW52RXJyb3IgZGF0YSBbMHglMDh4XSBhdCBvZmZzZXQgMHglMDh4WzB4JTA4eF0tRDB4JTA4eFxuIixwYXR0ZXJuX29bdGVtcF9pXSwgcF9jb252dGVyX2ludCh0ZXN0X2FkZHIpLCB+KHBhdHRlcm5fNlt0ZW1wX2tdW3RlbXBfaV0pLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCQlwcmludGYoInA2IGludkVycm9yIGRhdGEgWzB4JTA4eF0gYXQgb2Zmc2V0IDB4JTA4eFsweCUwOHhdLUQweCUwOHhcbiIscGF0dGVybl9vW3RlbXBfaV0sIHBfY29udnRlcl9pbnQodGVzdF9hZGRyKSwgfihkZXNfaW52X3BhdHRlcm4odGVtcF9pLDMsdGVtcF9rLHRlbXBfaSkpLHBhdHRlcm5fZFt0ZW1wX2ldKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCgoJCX0KCgkJcHJpbnRmKCJcRXJyb3IgY291bnQ9PTB4JTA4eCIsIGVycm9yX2NvdW50KTsKCQlwcmludGYoIlxuICAgICAgXG4iKTsKCX13aGlsZSgtLWxvb3ApOwoJLy8qLwoKCXByaW50ZigiXHJFbmQgZGRyIHRlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iKTsKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwp9CgoKVV9CT09UX0NNRCgKCWRkcnRlc3RfZ3h0dmJiX2Nyb3NzdGFsaywJNSwJMSwJZG9fZGRyX2d4dHZiYl9jcm9zc3RhbGssCgkiRERSIHRlc3QgZnVuY3Rpb24iLAoJImRkcnRlc3QgW0xPT1BdIFtBRERSXS5EZWZhdWx0IGFkZHJlc3MgaXMgMHgxMDAwMDAwMFxuIgopOwoKI2lmIDEKaW50IGRvX2RkcnRlc3RfZmluZF9nYXRlX3dpbmQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVHVuZSBkZHIgZHFzIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCS8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2xvb3A9MTsKCXVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2NoYW5uZWwgPSAwOwoKCS8vIC8qCgkvLyAjZGVmaW5lICBEQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCAgMTIKCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfV0lEVEggIDQKI2RlZmluZSAgQ0hBTk5FTF9DSEFOTkVMX1dJRFRIICAyCgojZGVmaW5lICBDSEFOTkVMX0EgIDAKI2RlZmluZSAgQ0hBTk5FTF9CICAxCgoKCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAwICAwCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAxICAxCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAyICAyCiNkZWZpbmUgIERBVFg4X0RRX0xBTkVfTEFORTAzICAzCgojZGVmaW5lICBEQVRYOF9EUV9CRExSMCAgMAojZGVmaW5lICBEQVRYOF9EUV9CRExSMSAgMQojZGVmaW5lICBEQVRYOF9EUV9CRExSMiAgMgojZGVmaW5lICBEQVRYOF9EUV9CRExSMyAgMwojZGVmaW5lICBEQVRYOF9EUV9CRExSNCAgNAojZGVmaW5lICBEQVRYOF9EUV9CRExSNSAgNQojZGVmaW5lICBEQVRYOF9EUV9CRExSNiAgNgojZGVmaW5lICBEQVRYOF9EUV9EWE5MQ0RMUjAgICAgIDcKI2RlZmluZSAgREFUWDhfRFFfRFhOTENETFIxICAgICA4CiNkZWZpbmUgIERBVFg4X0RRX0RYTkxDRExSMiAgICAgOQojZGVmaW5lICBEQVRYOF9EUV9EWE5NRExSICAgICAgICAxMAojZGVmaW5lICBEQVRYOF9EUV9EWE5HVFIgICAgICAgICAgMTEKCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJLy8gI2RlZmluZSAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMICA1Ly9EQVRYOF9EUV9MQ0RfQkRMX1JFR19XSURUSCpEQVRYOF9EUV9MQU5FX1dJRFRICgkvLyAgICAjZGVmaW5lICBEUV9MQ0RfQkRMX1JFR19OVU0gICAgRFFfTENEX0JETF9SRUdfTlVNX1BFUl9DSEFOTkVMKkNIQU5ORUxfQ0hBTk5FTF9XSURUSAoJLy8qLwoKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfb3JnW0RRX0xDRF9CRExfUkVHX05VTV07CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdFtEUV9MQ0RfQkRMX1JFR19OVU1dOwoJLy8gIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfcmVnX3JpZ2h0W0RRX0xDRF9CRExfUkVHX05VTV07CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfaW5kZXhbRFFfTENEX0JETF9SRUdfTlVNXTsKCgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF9yZWdfbGVmdF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3JlZ19yaWdodF9taW5bRFFfTENEX0JETF9SRUdfTlVNXTsKCgl1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX21pbjsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX21heDsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9yZHFzZDsKCS8vICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNuZDsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWZfbWluX3ZhbHVlOwoJLy8gICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnX21pbl92YWx1ZTsKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9kcXM7CgkvLyAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV93ZHFkOwoJLy8gICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX3JkcXNkOwoKCS8vICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19sZWY7CgkvLyAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfcmlnOwoJLy8gICAgdW5zaWduZWQgaW50ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ19jZW50ZXI7CgkvLyAgICB1bnNpZ25lZCBpbnQgICBkcV9sY2RfYmRsX3RlbXBfcmVnX3dpbmRvd3M7CgkvLyAgICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfY2VudGVyX21pbjsKCS8vICAgIHVuc2lnbmVkIGludCAgIGRxX2xjZF9iZGxfdGVtcF9yZWdfd2luZG93c19taW47CgoJdW5zaWduZWQgaW50ICAgZHFndHJfb3JnWzRdLGRxbGNkbHIyX29yZ1s0XSxkcWd0cl9sWzRdLGRxbGNkbHIyX2xbNF0sZHFndHJfcls0XSxkcWxjZGxyMl9yWzRdLGRxbWRscls0XTsKCXVuc2lnbmVkIGludCBkcWd0cl90ZW1wOwoJdW5zaWduZWQgaW50IGRxbGNkbHIyX3RlbXA7Cgl1bnNpZ25lZCBpbnQgZHFxc2dhdGVfb3JnWzRdLGRxcXNnYXRlX2xbNF0sIGRxcXNnYXRlX3JbNF07Cgl1bnNpZ25lZCBpbnQgICBkZHJfZ2F0ZV91cF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgICBkZHJfZ2F0ZV9pbml0X2xhbmU9MDsKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2xvb3AgPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCXsKCQkJdGVzdF9sb29wID0gMTAwMDAwOwoJCX0KCX0KCgoJaWYgKGFyZ2MgPjUpIHsKCQlkZHJfZ2F0ZV91cF9kb3duID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZ2F0ZV91cF9kb3duID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzVdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls1XSwgIkwiKSA9PSAwKSkKCQl7CgkJCWRkcl9nYXRlX3VwX2Rvd24gPSAwMDAwMDsKCQl9Cgl9CglpZiAoYXJnYyA+NikgewoJCWRkcl9nYXRlX2luaXRfbGFuZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2dhdGVfaW5pdF9sYW5lID0gMDsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzZdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls2XSwgIkwiKSA9PSAwKSkKCQl7CgkJCWRkcl9nYXRlX2luaXRfbGFuZSA9IDAwMDAwOwoJCX0KCX0KCgoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9sb29wPT0gMHglMDh4XG4iLCB0ZXN0X2xvb3ApOwoJcHJpbnRmKCJcbmRkcl9nYXRlX3VwX2Rvd249PSAweCUwOHhcbiIsIGRkcl9nYXRlX3VwX2Rvd24pOwoJcHJpbnRmKCJcbmRkcl9nYXRlX2luaXRfbGFuZT09IDB4JTA4eFxuIiwgZGRyX2dhdGVfaW5pdF9sYW5lKTsKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgoKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJewoJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQl7CgkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoIHRlc3RpbmdfY2hhbm5lbD09Q0hBTk5FTF9CKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCX0KCgkJCWZvciAoKHRlbXBfY291bnRfaT0wKTsodGVtcF9jb3VudF9pPERBVFg4X0RRX0xBTkVfV0lEVEgpOyh0ZW1wX2NvdW50X2krKykpCgkJCXsKCgkJCQlpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJCQkJewoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwTENETFIwK3JlZ19iYXNlX2FkajsKCQkJCX0KCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMSkKCQkJCXsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMUxDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQl9CgkJCQllbHNlICAgCSBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAyKQoJCQkJewoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgyTENETFIwK3JlZ19iYXNlX2FkajsKCQkJCX0gZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAzKQoJCQkJewoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzTENETFIwK3JlZ19iYXNlX2FkajsKCQkJCX0KCQkJfQoJCX0KCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IGxhbmU9PTB4JTA4eFxuICIsdGVtcF9jb3VudF9pKTsKCQkJCQlpZiAoZGRyX2dhdGVfaW5pdF9sYW5lKQoJCQkJCXsKCQkJCQkJdGVtcF9jb3VudF9pPWRkcl9nYXRlX2luaXRfbGFuZTsKCQkJCQkJcHJpbnRmKCJcbnRlc3QgbGFuZSBjaGFuZ2U9PTB4JTA4eFxuICIsdGVtcF9jb3VudF9pKTsKCQkJCQl9CgoKCQkJCQlpZiAodGVtcF9jb3VudF9pID09IERBVFg4X0RRX0xBTkVfTEFORTAwKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBMQ0RMUjArcmVnX2Jhc2VfYWRqOwoJCQkJCX0KCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDEpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMUxDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQkJfQoJCQkJCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkxDRExSMCtyZWdfYmFzZV9hZGo7CgkJCQkJfQoJCQkJCWVsc2UgICAgaWYodGVtcF9jb3VudF9pPT1EQVRYOF9EUV9MQU5FX0xBTkUwMykKCQkJCQl7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgzTENETFIwK3JlZ19iYXNlX2FkajsKCQkJCQl9CgoJCQkJCS8vIGZvcigodGVtcF9jb3VudF9rPTApOyh0ZW1wX2NvdW50X2s8Mik7KHRlbXBfY291bnRfaysrKSkKCQkJCQl7CgkJCQkJCS8vaWYodGVtcF9jb3VudF9rPT0wKQoJCQkJCQl7CgkJCQkJCQlkcWxjZGxyMl9vcmdbdGVtcF9jb3VudF9pXT1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApOwoJCQkJCQkJZHFndHJfb3JnW3RlbXBfY291bnRfaV09cmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKTsKCQkJCQkJCWRxbWRsclt0ZW1wX2NvdW50X2ldPXJlYWRsKHJlZ19hZGQrRERSMF9QVUJfQUNNRExSLUREUjBfUFVCX0RYMExDRExSMCk7CgkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIqKChkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSkmKERYTkdUUl9NQVgpKSsoKChkcWxjZGxyMl9vcmdbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKTsKCQkJCQkJCWRxcXNnYXRlX29yZ1t0ZW1wX2NvdW50X2ldPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgoJCQkJCQkJcHJpbnRmKCJcbmdhdGUgb3JnPT0weCUwOHggIDB4JTA4eCAgIDB4JTA4eCAweCUwOHhcbiAiLGRxcXNnYXRlX29yZ1t0ZW1wX2NvdW50X2ldLGRxZ3RyX29yZ1t0ZW1wX2NvdW50X2ldLGRxbGNkbHIyX29yZ1t0ZW1wX2NvdW50X2ldLCBkcW1kbHJbdGVtcF9jb3VudF9pXSk7CgoJCQkJCQkJaWYgKGRkcl9nYXRlX3VwX2Rvd24gPT0gMCkKCQkJCQkJCXsKCQkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJCQkJcHJpbnRmKCJcbmdhdGUgbGVmdCB0ZW1wPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCQlkcWd0cl90ZW1wPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUvKCgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIpOwoJCQkJCQkJCQlkcWxjZGxyMl90ZW1wPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtZHFndHJfdGVtcCooKCgoZHFtZGxyW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCkqMik7CgoJCQkJCQkJCQl3cml0ZWwoKGRxbGNkbHIyX3RlbXApLChyZWdfYWRkK0REUjBfUFVCX0RYMExDRExSMi1ERFIwX1BVQl9EWDBMQ0RMUjApKTsKCQkJCQkJCQkJd3JpdGVsKCgoKHJlYWRsKChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKSkmMHhmZmZmZjAwMCl8KGRxZ3RyX3RlbXApKSwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkgMHglMDh4IGd0cj09MHglMDh4XG4gIiwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSwocmVhZGwoKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG5sY2RscjI9PTB4JTA4eFxuICIscmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjItRERSMF9QVUJfRFgwTENETFIwKSk7CgkJCQkJCQkJCXByaW50ZigiXG5kcWd0cl90ZW1wPT0weCUwOHhcbiAiLGRxZ3RyX3RlbXApOwoJCQkJCQkJCQlwcmludGYoIlxuZ2F0ZWRxbGNkbHIyX3RlbXA9PTB4JTA4eFxuICIsZHFsY2RscjJfdGVtcCk7CgkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCQkJewoJCQkJCQkJCQkJcHJpbnRmKCJcbmdhdGVsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKys7CgkJCQkJCQkJCQlicmVhazsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCQlwcmludGYoIlxuZ2F0ZSBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCQkJcHJpbnRmKCJcbmdhdGUgbGVmdCBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCS8vZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZV9taW49ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJCQlkcXFzZ2F0ZV9sW3RlbXBfY291bnRfaV09ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJCQkJCQl3cml0ZWwoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0sKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJCXdyaXRlbCggZHFndHJfb3JnW3RlbXBfY291bnRfaV0sKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpOwoKCQkJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPSgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIqKChkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSkmRFhOR1RSX01BWCkrKCgoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0pKSZBQ0xDRExSX01BWCk7CgkJCQkJCQl9CgkJCQkJCQl3aGlsZSAoZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT4wKQoJCQkJCQkJewoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJCQlwcmludGYoIlxuZ2F0ZSByaWcgdGVtcD09MHglMDh4XG4gIixkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlkcWd0cl90ZW1wPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUvKCgoKGRxbWRsclt0ZW1wX2NvdW50X2ldKSkmQUNMQ0RMUl9NQVgpKjIpOwoJCQkJCQkJCWRxbGNkbHIyX3RlbXA9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS1kcWd0cl90ZW1wKigoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCgkJCQkJCQkJd3JpdGVsKChkcWxjZGxyMl90ZW1wKSwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjItRERSMF9QVUJfRFgwTENETFIwKSk7CgkJCQkJCQkJd3JpdGVsKCgocmVhZGwoKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpKSYweGZmZmZmMDAwKXwoZHFndHJfdGVtcCksKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJCXByaW50ZigiXG4gKHJlZ19hZGRERFIwX1BVQl9EWDBHVFIpIDB4JTA4eCBndHI9PTB4JTA4eFxuICIsKHJlZ19hZGQrRERSMF9QVUJfRFgwR1RSLUREUjBfUFVCX0RYMExDRExSMCksKHJlYWRsKChyZWdfYWRkK0REUjBfUFVCX0RYMEdUUi1ERFIwX1BVQl9EWDBMQ0RMUjApKSkpOwoJCQkJCQkJCXByaW50ZigiXG5sY2RscjI9PTB4JTA4eFxuICIscmVhZGwocmVnX2FkZCtERFIwX1BVQl9EWDBMQ0RMUjItRERSMF9QVUJfRFgwTENETFIwKSk7CgkJCQkJCQkJcHJpbnRmKCJcbmRxZ3RyX3RlbXA9PTB4JTA4eFxuICIsZHFndHJfdGVtcCk7CgkJCQkJCQkJcHJpbnRmKCJcbmdhdGVkcWxjZGxyMl90ZW1wPT0weCUwOHhcbiAiLGRxbGNkbHIyX3RlbXApOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJcHJpbnRmKCJcbmdhdGVyaWcgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuZ2F0ZSByaWcgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCXByaW50ZigiXG5nYXRlIHJpZyBlZGdlPT0weCUwOHhcbiAiLGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJLy9kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlX21heD1kcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCQkJZHFxc2dhdGVfclt0ZW1wX2NvdW50X2ldPWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7CgkJCQkJCQl3cml0ZWwoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0sKHJlZ19hZGQrRERSMF9QVUJfRFgwTENETFIyLUREUjBfUFVCX0RYMExDRExSMCkpOwoJCQkJCQkJd3JpdGVsKCBkcWd0cl9vcmdbdGVtcF9jb3VudF9pXSwocmVnX2FkZCtERFIwX1BVQl9EWDBHVFItRERSMF9QVUJfRFgwTENETFIwKSk7CgoKCgoKCgkJCQkJCX0KCgoKCQkJCQl9CgkJCQl9CgoJCQl9CgkJfQoKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCgoKCgkJLy8vL2NhbGN1bGF0ZSBhbmQgcHJpbnQgIGRxcyB2YWx1ZQoJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQl7CgkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCXsKCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJfQoJCQlyZWdfYWRkPUREUjBfUFVCX0RYMExDRExSMCtyZWdfYmFzZV9hZGo7CgoKCgoJCQlwcmludGYoIlxuIGRkcnRlc3Qgc2l6ZSA9PTB4JTA4eCwgdGVzdCB0aW1lcz09MHglMDh4LHRlc3RfbG9vcD09MHglMDh4XG4iLGRkcl90ZXN0X3NpemUsKHRlc3RfdGltZXMrMSksdGVzdF9sb29wKTsKCQkJcHJpbnRmKCJcbiBhZGQgIDB4MDAwMDAwMDAgcmVnPT0gICAgb3JnICAgICAgICAgICBsZWYgICAgICAgICAgIHJpZyAgICAgICAgICAgY2VudGVyICAgICAgICB3aW4gICAgICAgICAgIGxlZl9tICAgICAgICAgcmlnX20gICAgICAgICBtaW5fYyAgICAgICAgIG1pbl93aW4gICAgICAgIFxuIik7CgoJCQlmb3IgKCh0ZW1wX2NvdW50X2k9MCk7KHRlbXBfY291bnRfaTxEQVRYOF9EUV9MQU5FX1dJRFRIKTsodGVtcF9jb3VudF9pKyspKQoJCQl7CgkJCQl7CgoJCQkJCWlmICh0ZW1wX2NvdW50X2kgPT0gREFUWDhfRFFfTEFORV9MQU5FMDApCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMExDRExSMCtyZWdfYmFzZV9hZGorMCo0O30KCgkJCQkJZWxzZSAgICBpZih0ZW1wX2NvdW50X2k9PURBVFg4X0RRX0xBTkVfTEFORTAxKQoJCQkJCXsKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDFMQ0RMUjArcmVnX2Jhc2VfYWRqKzAqNDt9CgoJCQkJCWVsc2UgICAJIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDIpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMkxDRExSMCtyZWdfYmFzZV9hZGorMCo0O30KCQkJCQllbHNlICAgIGlmKHRlbXBfY291bnRfaT09REFUWDhfRFFfTEFORV9MQU5FMDMpCgkJCQkJewoJCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYM0xDRExSMCtyZWdfYmFzZV9hZGorMCo0O30KCQkJCX0KCgkJCQkvL3Vuc2lnbmVkIGludCAgIGRxZ3RyX29yZ1s0XSxkcWxjZGxyMl9vcmdbNF0sZHFndHJfbFs0XSxkcWxjZGxyMl9sWzRdLGRxZ3RyX3JbNF0sZHFsY2RscjJfcls0XSxkcW1kbHJbNF07CgkJCQkvLwkgdW5zaWduZWQgaW50IGRxZ3RyX3RlbXA7CgkJCQkvLwkgIHVuc2lnbmVkIGludCBkcWxjZGxyMl90ZW1wOwoJCQkJLy8JICB1bnNpZ25lZCBpbnQgZHFxc2dhdGVfbFs0XSwgZHFxc2dhdGVfcls0XTsKCQkJCShkcWd0cl9sW3RlbXBfY291bnRfaV0pPShkcXFzZ2F0ZV9sW3RlbXBfY291bnRfaV0pLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCQkJCShkcWxjZGxyMl9sW3RlbXBfY291bnRfaV0pPShkcXFzZ2F0ZV9sW3RlbXBfY291bnRfaV0pLShkcWd0cl9sW3RlbXBfY291bnRfaV0pKigoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCQkJCShkcWd0cl9yW3RlbXBfY291bnRfaV0pPShkcXFzZ2F0ZV9yW3RlbXBfY291bnRfaV0pLygoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCQkJCShkcWxjZGxyMl9yW3RlbXBfY291bnRfaV0pPShkcXFzZ2F0ZV9yW3RlbXBfY291bnRfaV0pLShkcWd0cl9yW3RlbXBfY291bnRfaV0pKigoKChkcW1kbHJbdGVtcF9jb3VudF9pXSkpJkFDTENETFJfTUFYKSoyKTsKCQkJCXByaW50ZigiXG4gYWRkICByZWc9PSAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eCAgICAweCUwOHggICAgMHglMDh4ICAgIDB4JTA4eFxuIiwKCQkJCQkJKGRxcXNnYXRlX29yZ1t0ZW1wX2NvdW50X2ldKSwKCQkJCQkJKGRxcXNnYXRlX2xbdGVtcF9jb3VudF9pXSksCgkJCQkJCShkcXFzZ2F0ZV9yW3RlbXBfY291bnRfaV0pLAoJCQkJCQkoZHFndHJfb3JnW3RlbXBfY291bnRfaV0pLAoJCQkJCQkoZHFsY2RscjJfb3JnW3RlbXBfY291bnRfaV0pLAoJCQkJCQkoZHFndHJfbFt0ZW1wX2NvdW50X2ldKSwKCQkJCQkJKGRxZ3RyX3JbdGVtcF9jb3VudF9pXSksCgkJCQkJCShkcWxjZGxyMl9sW3RlbXBfY291bnRfaV0pLAoJCQkJCQkoZHFsY2RscjJfclt0ZW1wX2NvdW50X2ldKQoJCQkJCSAgKTsKCgoJCQl9CgoKCgoKCQl9CgoJfQoKCgoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9CgoKVV9CT09UX0NNRCgKCWRkcnRlc3RfZ2F0ZSwJNywJMSwJZG9fZGRydGVzdF9maW5kX2dhdGVfd2luZCwKCSJERFIgdGVzdCBmdW5jdGlvbiBzaG91bGQgZGNhY2hlIG9mZiBkZHJ0ZXN0X2dhdGUgYSAwIDB4ODAwMDAgMSAwIDMiLAoJImRkcnRlc3RfZ2F0ZSBbTE9PUF0gW0FERFJdLkRlZmF1bHQgYWRkcmVzcyBpcyAweDEwMDAwMDAwXG4iCik7CgoKI2VuZGlmCgovLy8qCmludCBkb19kZHJfdGVzdF9hY193aW5kb3dzX2JkbHIoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVGVzdCBkZHIgYWMgYmRsciB3aW5kb3dzIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCS8vICB1bnNpZ25lZCBpbnQgICBsb29wID0gMTsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9pID0gMTsKCS8vICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9qPSAxOwoJLy8gICAgdW5zaWduZWQgaW50ICAgdGVtcF9jb3VudF9rPSAxOwoJdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoJc3RhdGljIHVuc2lnbmVkIGludCBzb2Z0X2NhX3RyYWluaW5nX3NlZWQ9MDsKCXN0YXRpYyB1bnNpZ25lZCBpbnQgc29mdF9jYV90cmFpbmluZ19zdGVwPTA7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAoKCXVuc2lnbmVkIGludCAgYWNfbWRscl9hX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19tZGxyX2Jfb3JnPTA7CgoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9hX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9vcmc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9vcmc9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2Jfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX3JpZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWc9MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9sZWY9MDsKCXVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX2xlZj0wOwoKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9yaWdfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZ19taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9sZWZfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX2xlZl9taW49MDsKCXVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWZfbWluPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX2xlZl9taW49MDsKCS8vICAgdW5zaWduZWQgaW50ICBhY19sY2Rscl90ZW1wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX3RlbXA9MDsKCgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgl1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyX3JpZ1sxMF07Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyX3RlbXBfdmFsdWU7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyX3JlZ19zZWVkX3ZhbHVlOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscl90ZW1wX3JlZ192YWx1ZTsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I7Cgl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9qPTA7CgkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7CgkvLwkJc3RhdGljIHVuc2lnbmVkIGludCBzb2Z0X2NhX3RyYWluaW5nX2VuYWJsZWQ9MTsKCgkvLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoKCQl7Y2hhbm5lbF9hX2VuID0gMTsKCQl9CgkJZWxzZSBpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCl8fChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYl9lbiA9IDE7CgkJfQoJCWVsc2UKCQl7CgkJCWdvdG8gdXNhZ2U7CgkJfQoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoKCX0KCWlmIChhcmdjID40KSB7CgkJdGVzdF9sb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2xvb3AgPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCXsKCQkJdGVzdF9sb29wID0gMTAwMDAwOwoJCX0KCX0KCglpZiAoYXJnYyA+NSkgewoJCXNvZnRfY2FfdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJc29mdF9jYV90cmFpbmluZ19zZWVkID0gMHgxZjsKCQl9CgoKCX0KCWlmIChhcmdjID42KSB7CgkJc29mdF9jYV90cmFpbmluZ19zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlzb2Z0X2NhX3RyYWluaW5nX3N0ZXAgPSAwOwoJCX0KCgoJfQoJcHJpbnRmKCJcbmNoYW5uZWxfYV9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9hX2VuKTsKCXByaW50ZigiXG5jaGFubmVsX2JfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYl9lbik7CglwcmludGYoIlxuZGRyX3Rlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgZGRyX3Rlc3Rfc2l6ZSk7CglwcmludGYoIlxudGVzdF9sb29wPT0gMHglMDh4XG4iLCB0ZXN0X2xvb3ApOwoJcHJpbnRmKCJcbnNvZnRfY2FfdHJhaW5pbmdfc2VlZD09IDB4JTA4eFxuIiwgc29mdF9jYV90cmFpbmluZ19zZWVkKTsKCXByaW50ZigiXG5zb2Z0X2NhX3RyYWluaW5nX3N0ZXA9PSAweCUwOHhcbiIsIHNvZnRfY2FfdHJhaW5pbmdfc3RlcCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgoKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoKCQl7CgkJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQkJewoJCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiAoKGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pPT0yKQoJCQkJewoJCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgoKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoKCQkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoKCgoJCQkJCX0KCQkJCX0KCgkJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCAweCUwOHhcbiIscmVnX2FkZCk7CgkJCQkJYWNfbWRscl9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpOy8vcmVhZGwocmVnX2FkZCk7Ly8weGM4ODM2MDAwCgkJCQkJYWNfbGNkbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs0KTsKCQkJCQlhY19iZGxyMF9hX29yZz0odW5zaWduZWQgaW50ICkocmVhZGwoKHVuc2lnbmVkIGludCApKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpKSk7Ly9yZWFkbChyZWdfYWRkKzgpOwoKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9hX29yZyk7CgkJCQl9CgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKCQkJCXsKCgkJCQkJYWNfbWRscl9iX29yZz1yZWFkbChyZWdfYWRkKTsKCQkJCQlhY19sY2Rscl9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKTsKCQkJCQlhY19iZGxyMF9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKTsKCQkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNCRExSMC1ERFIwX1BVQl9BQ01ETFIpLCBhY19iZGxyMF9iX29yZyk7CgkJCQl9CgoKCQkJfQoKCQl9CgoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKCWZvciAodGVzdF90aW1lcz0wOyh0ZXN0X3RpbWVzPHRlc3RfbG9vcCk7KHRlc3RfdGltZXMrKykpCgl7CgkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCQkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYoKCBjaGFubmVsX2JfZW4pJiYoIGNoYW5uZWxfYV9lbj09MCkpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJCXsKCQkJCQlpZiAoIHRlc3RpbmdfY2hhbm5lbCA9PSBDSEFOTkVMX0EpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJCX0KCQkJCQllbHNlIGlmKCB0ZXN0aW5nX2NoYW5uZWw9PUNIQU5ORUxfQikKCQkJCQl7CgkJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyZWdfYmFzZV9hZGogPT0gQ0hBTk5FTF9BX1JFR19CQVNFKQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBBQ1xuIik7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIEFDXG4iKTsKCQkJCX0KCgojZGVmaW5lIHdycl9yZWcoYWRkciwgZGF0YSkJKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQojZGVmaW5lIHJkcl9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjMsIDB4MDgwOCk7ICAvL2NzMCBjczEKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjAsIDB4MWYpOyAgLy9jazAKCQkJCS8vCXdyX3JlZyhERFIwX1BVQl9BQ0JETFI0LCAweDA4MDgpOyAvL29kdDAgb2R0MQoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSNSwgMHgwODA4KTsgIC8vY2tlMCBja2UxCgoKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjEsIDB4MTgxODE4KTsgLy9yYXMgY2FzIHdlCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIyLCAweDE4MTgxOCk7IC8vYmEwIGJhMSBiYTIKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjYsIDB4MTIxMjEyMTIpOyAvL2EwIGExIGEyIGEzCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI3LCAweDBkMGQwZDBkKTsgLy9hNCBhNSBhNiBhNwoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSOCwgMHgxMDEwMTAxMCk7ICAvL2E4IGE5IGExMCBhMTEKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjksIDB4MTgxODE4MTgpOyAgLy9hMTIgYTEzIGExNCBhMTUKCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNCRExSMDsKCQkJCWFjX2JkbHJfcmVnX3NlZWRfdmFsdWU9KHNvZnRfY2FfdHJhaW5pbmdfc2VlZHwoc29mdF9jYV90cmFpbmluZ19zZWVkPDw4KXwoc29mdF9jYV90cmFpbmluZ19zZWVkPDwxNil8KHNvZnRfY2FfdHJhaW5pbmdfc2VlZDw8MjQpKTsKCQkJCWZvciAoKCAgdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQoJCQkJewoJCQkJCS8vd3JfcmVnKChERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KSwKCQkJCQkvL2FjX2JkbHJfcmVnX3NlZWRfdmFsdWUpOyAgLy9jczAgY3MxCgkJCQkJLy9yZWdfYWRkPXJlZ19hZGQrdGVtcF9pKjQ7CgoJCQkJCS8vcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoJCQkJCXJlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwoJCQkJCXJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CgkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQlhY19iZGxyX3JlZ19zZWVkX3ZhbHVlKTsgIC8vY3MwIGNzMQoJCQkJCWFjX2JkbHJfbGVmW3RlbXBfaV09YWNfYmRscl9yZWdfc2VlZF92YWx1ZTsKCQkJCQlhY19iZGxyX3JpZ1t0ZW1wX2ldPWFjX2JkbHJfcmVnX3NlZWRfdmFsdWU7CgkJCQl9CgoJCQkJcHJpbnRmKCJcbmJkbCAgc29mdF9jYV90cmFpbmluZ19zdGVwPT0weCUwOHhcbiAiLHNvZnRfY2FfdHJhaW5pbmdfc3RlcCk7CgkJCQlmb3IgKCggdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQoJCQkJewoJCQkJCS8vYWNfYmRscl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQkJaWYgKHRlbXBfaSA9PSAxKQoJCQkJCXsKCQkJCQkJLy90ZW1wX2k9MzsKCQkJCQl9CgoJCQkJCWZvciAoKCB0ZW1wX2o9MCk7KHRlbXBfajw0KTsoIHRlbXBfaisrKSkKCQkJCQl7CgkJCQkJCWlmIChzb2Z0X2NhX3RyYWluaW5nX3N0ZXApCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT0oc29mdF9jYV90cmFpbmluZ19zdGVwPj4yKTsKCQkJCQkJCXRlbXBfaj1zb2Z0X2NhX3RyYWluaW5nX3N0ZXAtKChzb2Z0X2NhX3RyYWluaW5nX3N0ZXA+PjIpPDwyKTsKCQkJCQkJCXNvZnRfY2FfdHJhaW5pbmdfc3RlcD0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9MTsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSA3KQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9MjsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxNCkKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTQ7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTgpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT01OwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDIyKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9NjsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCS8vcHJpbnRmKCJcbmJkbCAgdGVtcF9pPT0weCUwOHhcbiAiLHRlbXBfaSk7CgkJCQkJCXByaW50ZigiXG5iZGwgIHRlbXBfaWo9PTB4JTA4eFxuICIsKHRlbXBfaSo0K3RlbXBfaikpOwoJCQkJCQlyZWdfYWRkPShERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KTsKCQkJCQkJcmVnX2FkZD1yZWdfYWRkK3JlZ19iYXNlX2FkajsKCQkJCQkJYWNfYmRscl90ZW1wX3JlZ192YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJCQlhY19iZGxyX3RlbXBfdmFsdWU9KChhY19iZGxyX3RlbXBfcmVnX3ZhbHVlPj4odGVtcF9qPDwzKSkmQUNCRExSX01BWCk7CgkJCQkJCXdoaWxlIChhY19iZGxyX3RlbXBfdmFsdWU+MCkKCQkJCQkJewoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlhY19iZGxyX3RlbXBfdmFsdWUtLTsKCgkJCQkJCQlwcmludGYoIlxuYmRsICB0ZW1wX2lqPT0weCUwOHggbGVmIHRlbXA9PTB4JTA4eFxuICIsKHRlbXBfaSo0K3RlbXBfaiksYWNfYmRscl90ZW1wX3ZhbHVlKTsKCgkJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlPSgoKH4oMHhmZjw8KHRlbXBfajw8MykpKSZhY19iZGxyX3JlZ19zZWVkX3ZhbHVlKXwoKGFjX2JkbHJfdGVtcF92YWx1ZSk8PCh0ZW1wX2o8PDMpKSk7CgkJCQkJCQlyZWdfYWRkPShERFIwX1BVQl9BQ0JETFIwK3RlbXBfaSo0KTsKCQkJCQkJCXJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CgkJCQkJCQl3cnJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQsCgkJCQkJCQkJCWFjX2JkbHJfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJcHJpbnRmKCJcbmJkbCByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxhY19iZGxyX3RlbXBfcmVnX3ZhbHVlKTsKCiNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2Vsc2UKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQlwcmludGYoIlxuYmRsIGxlZnQgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlhY19iZGxyX3RlbXBfdmFsdWUrKzsKCQkJCQkJCQlicmVhazsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJcHJpbnRmKCJcbmJkbCBsZWZ0IGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5cbmJkbCAgdGVtcF9paj09MHglMDh4ICAgICAgICAgIGJkbCBsZWZ0IGVkZ2U9PTB4JTA4eFxuICIsKHRlbXBfaSo0K3RlbXBfaiksYWNfYmRscl90ZW1wX3ZhbHVlKTsKCQkJCQkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CgkJCQkJCXJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CgkJCQkJCXdycl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCwKCQkJCQkJCQlhY19iZGxyX3JlZ19zZWVkX3ZhbHVlKTsKCgkJCQkJCWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9KCgofigweGZmPDwodGVtcF9qPDwzKSkpJmFjX2JkbHJfbGVmW3RlbXBfaV0pfCgoYWNfYmRscl90ZW1wX3ZhbHVlKTw8KHRlbXBfajw8MykpKTsKCQkJCQkJYWNfYmRscl9sZWZbdGVtcF9pXT1hY19iZGxyX3RlbXBfcmVnX3ZhbHVlOwoKCQkJCQkJYWNfYmRscl90ZW1wX3ZhbHVlPSgoYWNfYmRscl9yZWdfc2VlZF92YWx1ZT4+KHRlbXBfajw8MykpJkFDQkRMUl9NQVgpOwoJCQkJCQl3aGlsZSAoYWNfYmRscl90ZW1wX3ZhbHVlPEFDQkRMUl9NQVgpCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJYWNfYmRscl90ZW1wX3ZhbHVlKys7CgkJCQkJCQlwcmludGYoIlxudGVtcF9paj09MHglMDh4IHJpZyB0ZW1wPT0weCUwOHhcbiAiLCh0ZW1wX2kqNCt0ZW1wX2opLGFjX2JkbHJfdGVtcF92YWx1ZSk7CgoJCQkJCQkJYWNfYmRscl90ZW1wX3JlZ192YWx1ZT0oKCh+KDB4ZmY8PCh0ZW1wX2o8PDMpKSkmYWNfYmRscl9yZWdfc2VlZF92YWx1ZSl8KChhY19iZGxyX3RlbXBfdmFsdWUpPDwodGVtcF9qPDwzKSkpOwoJCQkJCQkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CgkJCQkJCQlyZWdfYWRkPXJlZ19hZGQrcmVnX2Jhc2VfYWRqOwoJCQkJCQkJd3JyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkLAoJCQkJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCXByaW50ZigiXG5iZGwgcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7CiNpZmRlZiBERFJfTENETFJfQ0tfVVNFX0ZBU1RfUEFUVEVSTgoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKI2Vsc2UKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0gZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPSB0ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CiNlbmRpZgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQlwcmludGYoIlxuYmRsIHJpZyBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWFjX2JkbHJfdGVtcF92YWx1ZS0tOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgoKCgkJCQkJCXByaW50ZigiXG5iZGwgcmlnIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCS8vcHJpbnRmKCJcblxuYmRsIHJpZyBlZGdlPT0weCUwOHhcbiAiLGFjX2JkbHJfdGVtcF92YWx1ZSk7CgkJCQkJCXByaW50ZigiXG5cbmJkbCAgdGVtcF9paj09MHglMDh4ICAgICAgICAgIGJkbCByaWdoIGVkZ2U9PTB4JTA4eFxuICIsKHRlbXBfaSo0K3RlbXBfaiksYWNfYmRscl90ZW1wX3ZhbHVlKTsKCQkJCQkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCt0ZW1wX2kqNCk7CgkJCQkJCXJlZ19hZGQ9cmVnX2FkZCtyZWdfYmFzZV9hZGo7CgkJCQkJCXdycl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCwKCQkJCQkJCQlhY19iZGxyX3JlZ19zZWVkX3ZhbHVlKTsKCgkJCQkJCWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9KCgofigweGZmPDwodGVtcF9qPDwzKSkpJmFjX2JkbHJfcmlnW3RlbXBfaV0pfCgoYWNfYmRscl90ZW1wX3ZhbHVlKTw8KHRlbXBfajw8MykpKTsKCQkJCQkJYWNfYmRscl9yaWdbdGVtcF9pXT1hY19iZGxyX3RlbXBfcmVnX3ZhbHVlOwoJCQkJCX0KCQkJCX0KCgkJCQlwcmludGYoIlxuYmRsIGxlZiBlZGdlPT1iZGxyMCAgICAgYmRscjEgICAgIGJkbHIyICAgICBiZGxyMyAgICAgYmRscjQgICAgIGJkbHI1ICAgICBiZGxyNiAgICAgYmRscjcgICAgIGJkbHI4ICAgICBiZGxyOSAgICAgXG4gIik7CgkJCQlwcmludGYoIlxuYmRsIGxlZiBlZGdlPT1cbiIpOwoJCQkJZm9yICgoIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCXsKCgkJCQkJcHJpbnRmKCIweCUwOHhcbiAiLGFjX2JkbHJfbGVmW3RlbXBfaV0pOwoKCQkJCX0KCgkJCQlwcmludGYoIlxuICIpOwoJCQkJZm9yICgoIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQlwcmludGYoIjB4JTA4eFxuICIsYWNfYmRscl9yaWdbdGVtcF9pXSk7CgkJCQl9CgkJCQlwcmludGYoIlxuYmRsIHJpZyBlZGdlPT09PT09PT09PT1cbiIpOwoJCQkJcHJpbnRmKCJcbj09PT09PT09PT09PT09PT09PT1cbiIpOwoKCQkJCXByaW50ZigiXG5iZGwgbGVmIGVkZ2U9PVxuIik7CgkJCQlmb3IgKCggdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQoJCQkJewoJCQkJCWZvciAoKCB0ZW1wX2o9MCk7KHRlbXBfajw0KTsoIHRlbXBfaisrKSkKCQkJCQl7CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9MTsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSA3KQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9MjsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAxNCkKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTQ7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTgpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT01OwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDIyKQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9NjsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWFjX2JkbHJfdGVtcF9yZWdfdmFsdWU9KCgoKDB4ZmY8PCh0ZW1wX2o8PDMpKSkmYWNfYmRscl9sZWZbdGVtcF9pXSk+Pih0ZW1wX2o8PDMpKTsKCQkJCQkJcHJpbnRmKCJcbnRlbXBpX2oweCUwOHg9PTB4JTA4eCIsKCh0ZW1wX2k8PDIpK3RlbXBfaiksYWNfYmRscl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJfQoJCQkJfQoKCQkJCXByaW50ZigiXG4gIik7CgkJCQlwcmludGYoIlxuYmRsIHJpZyBlZGdlPT1cbiIpOwoJCQkJZm9yICgoIHRlbXBfaT0wKTsodGVtcF9pPDEwKTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQlmb3IgKCggdGVtcF9qPTApOyh0ZW1wX2o8NCk7KCB0ZW1wX2orKykpCgkJCQkJewoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMSkKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTE7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gNykKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTI7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlpZiAoKHRlbXBfaSo0K3RlbXBfaikgPT0gMTQpCgkJCQkJCXsKCQkJCQkJCXRlbXBfaT00OwoJCQkJCQkJdGVtcF9qPTA7CgkJCQkJCX0KCQkJCQkJaWYgKCh0ZW1wX2kqNCt0ZW1wX2opID09IDE4KQoJCQkJCQl7CgkJCQkJCQl0ZW1wX2k9NTsKCQkJCQkJCXRlbXBfaj0wOwoJCQkJCQl9CgkJCQkJCWlmICgodGVtcF9pKjQrdGVtcF9qKSA9PSAyMikKCQkJCQkJewoJCQkJCQkJdGVtcF9pPTY7CgkJCQkJCQl0ZW1wX2o9MDsKCQkJCQkJfQoJCQkJCQlhY19iZGxyX3RlbXBfcmVnX3ZhbHVlPSgoKCgweGZmPDwodGVtcF9qPDwzKSkpJmFjX2JkbHJfcmlnW3RlbXBfaV0pPj4odGVtcF9qPDwzKSk7CgkJCQkJCXByaW50ZigiXG50ZW1waV9qMHglMDh4PT0weCUwOHgiLCgodGVtcF9pPDwyKSt0ZW1wX2opLGFjX2JkbHJfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8vL3R1bmUgYW5kIHNhdmUgdHJhaW5pbmcgZHFzIHZhbHVlCgkJCS8vLy9jYWxjdWxhdGUgYW5kIHByaW50ICBkcXMgdmFsdWUKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCQkJCXJlZ19hZGQ9RERSMF9QVUJfQUNNRExSK3JlZ19iYXNlX2FkajsKCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlpZiAodGVzdF90aW1lcykKCQkJCQl7CgkJCQkJCWlmIChhY19sY2Rscl9hX2xlZj5hY19sY2Rscl9hX2xlZl9taW4pCgkJCQkJCQlhY19sY2Rscl9hX2xlZl9taW49YWNfbGNkbHJfYV9sZWY7CgoJCQkJCQlpZiAoYWNfbGNkbHJfYV9yaWc8YWNfbGNkbHJfYV9yaWdfbWluKQoJCQkJCQkJYWNfbGNkbHJfYV9yaWdfbWluPWFjX2xjZGxyX2FfcmlnOwoKCQkJCQkJaWYgKGFjX2JkbHIwX2FfbGVmPmFjX2JkbHIwX2FfbGVmX21pbikKCQkJCQkJCWFjX2JkbHIwX2FfbGVmX21pbj1hY19iZGxyMF9hX2xlZjsKCgkJCQkJCWlmIChhY19iZGxyMF9hX3JpZzxhY19iZGxyMF9hX3JpZ19taW4pCgkJCQkJCQlhY19iZGxyMF9hX3JpZ19taW49YWNfYmRscjBfYV9yaWc7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWFjX2xjZGxyX2FfbGVmX21pbj1hY19sY2Rscl9hX2xlZjsKCQkJCQkJYWNfbGNkbHJfYV9yaWdfbWluPWFjX2xjZGxyX2FfcmlnOwoJCQkJCQlhY19iZGxyMF9hX2xlZl9taW49YWNfYmRscjBfYV9sZWY7CgkJCQkJCWFjX2JkbHIwX2FfcmlnX21pbj1hY19iZGxyMF9hX3JpZzsKCQkJCQl9CgkJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIEFDIHJlc3VsdFxuIik7CgkJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfbGNkbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcpOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcpOwoKCQkJCQlwcmludGYoIlxuIGFjX2FjbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggICBsY2Rscl9sZWYgICBsY2Rscl9yaWcgICBsY2Rscl9sbWluICBsY2Rscl9ybWluXG4iLChyZWdfYWRkKSxhY19tZGxyX2Ffb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSwgYWNfbGNkbHJfYV9vcmcsYWNfbGNkbHJfYV9sZWYsYWNfbGNkbHJfYV9yaWcsYWNfbGNkbHJfYV9sZWZfbWluLGFjX2xjZGxyX2FfcmlnX21pbik7CgkJCQkJcHJpbnRmKCJcbiBhY19iZGxyMF9hX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eCAgMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYV9vcmcsYWNfYmRscjBfYV9sZWYsYWNfYmRscjBfYV9yaWcsYWNfYmRscjBfYV9sZWZfbWluLGFjX2JkbHIwX2FfcmlnX21pbik7CgkJCQl9CgoJCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0JfUkVHX0JBU0UpCgkJCQl7CgkJCQkJaWYgKHRlc3RfdGltZXMpCgkJCQkJewoJCQkJCQlpZiAoYWNfbGNkbHJfYl9sZWY+YWNfbGNkbHJfYl9sZWZfbWluKQoJCQkJCQkJYWNfbGNkbHJfYl9sZWZfbWluPWFjX2xjZGxyX2JfbGVmOwoKCQkJCQkJaWYgKGFjX2xjZGxyX2JfcmlnPGFjX2xjZGxyX2JfcmlnX21pbikKCQkJCQkJCWFjX2xjZGxyX2JfcmlnX21pbj1hY19sY2Rscl9iX3JpZzsKCgkJCQkJCWlmIChhY19iZGxyMF9iX2xlZj5hY19iZGxyMF9iX2xlZl9taW4pCgkJCQkJCQlhY19iZGxyMF9iX2xlZl9taW49YWNfYmRscjBfYl9sZWY7CgoJCQkJCQlpZiAoYWNfYmRscjBfYl9yaWc8YWNfYmRscjBfYl9yaWdfbWluKQoJCQkJCQkJYWNfYmRscjBfYl9yaWdfbWluPWFjX2JkbHIwX2JfcmlnOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlhY19sY2Rscl9iX2xlZl9taW49YWNfbGNkbHJfYl9sZWY7CgkJCQkJCWFjX2xjZGxyX2JfcmlnX21pbj1hY19sY2Rscl9iX3JpZzsKCQkJCQkJYWNfYmRscjBfYl9sZWZfbWluPWFjX2JkbHIwX2JfbGVmOwoJCQkJCQlhY19iZGxyMF9iX3JpZ19taW49YWNfYmRscjBfYl9yaWc7CgkJCQkJfQoJCQkJCXByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBBQyByZXN1bHRcbiIpOwoJCQkJCXByaW50ZigiXG4gYWNfbWRscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQpLCBhY19tZGxyX2Jfb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnKTsKCQkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnKTsKCgkJCQkJcHJpbnRmKCJcbiBhY19hY21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4ICAgbGNkbHJfbGVmICAgbGNkbHJfcmlnICAgbGNkbHJfbG1pbiAgbGNkbHJfcm1pblxuIiwocmVnX2FkZCksYWNfbWRscl9iX29yZyk7CgkJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnLGFjX2xjZGxyX2JfbGVmLGFjX2xjZGxyX2JfcmlnLGFjX2xjZGxyX2JfbGVmX21pbixhY19sY2Rscl9iX3JpZ19taW4pOwoJCQkJCXByaW50ZigiXG4gYWNfYmRscjBfYV9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHggIDB4JTA4eCAgMHglMDh4ICAweCUwOHggIDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Jfb3JnLGFjX2JkbHIwX2JfbGVmLGFjX2JkbHIwX2JfcmlnLGFjX2JkbHIwX2JfbGVmX21pbixhY19iZGxyMF9iX3JpZ19taW4pOwoJCQkJfQoJCQl9CgkJfQoKCX0KCgoKCglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQoKClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kZHJfYWNfYmRsciwJNywJMSwJZG9fZGRyX3Rlc3RfYWNfd2luZG93c19iZGxyLAoJIkREUiB0dW5lIGFjIGJkbCBmdW5jdGlvbiIsCgkiZGRyX3R1bmVfZGRyX2FjX2JkbHIgYSAwIDB4ODAwMDAwMCAxIHNlZWQgc3RlcCBvciBkZHJfdHVuZV9kZHJfYWNfYmRsciBiIDAgMHg4MDAwMDAgMSBzZWVkIHN0ZXAgb3IgZGRyX3R1bmVfZGRyX2FjX2FjYmRscl9jayBhIGIgMHg4MDAwMCBsXG4gZGNhY2hlIG9mZiA/IFxuIgopOwoKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCiNlbHNlCmludCBkb19kZHJfdGVzdF92cmVmKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIHZyZWYgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhaW5pbmdfc2VlZD0wOwoJc3RhdGljIHVuc2lnbmVkIGludCB0cmFpbmluZ19zdGVwPTA7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgoJdW5zaWduZWQgaW50ICBhY19tZGxyX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgIGFjX21kbHJfYl9vcmc9MDsKCgl1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2Ffb3JnPTA7Cgl1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9hX29yZz0wOwoJdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9vcmc9MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfcmlnPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWc9MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfcmlnPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9yaWc9MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9sZWY9MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2JfbGVmPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWY9MDsKCgkvLwkgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYV9yaWdfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYV9yaWdfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICBhY19sY2Rscl9iX3JpZ19taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF9iX3JpZ19taW49MDsKCS8vICB1bnNpZ25lZCBpbnQgIGFjX2xjZGxyX2FfbGVmX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgIGFjX2JkbHIwX2FfbGVmX21pbj0wOwoJLy8gIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfYl9sZWZfbWluPTA7CgkvLyAgdW5zaWduZWQgaW50ICAgYWNfYmRscjBfYl9sZWZfbWluPTA7CgkvLyAgIHVuc2lnbmVkIGludCAgYWNfbGNkbHJfdGVtcDsKCS8vICB1bnNpZ25lZCBpbnQgICBhY19iZGxyMF90ZW1wPTA7CgoKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfcmlnWzEwXTsKCXVuc2lnbmVkIGludCAgIGlvdnJlZl90ZW1wX3ZhbHVlOwoJdW5zaWduZWQgaW50ICAgaW92cmVmX3RlbXBfcmVnX3ZhbHVlOwoJdW5zaWduZWQgaW50ICByZWdfc2VlZF92YWx1ZTsKCS8vCSAgIHVuc2lnbmVkIGludCAgIHRlbXBfcmVnX3ZhbHVlOwoJdW5zaWduZWQgaW50ICAgaW92cmVmX2xlZjsKCXVuc2lnbmVkIGludCAgIGlvdnJlZl9yaWc7CgkvLyAgdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yOwoJLy8JdW5zaWduZWQgaW50IHRlbXBfaT0wOwoJLy8JdW5zaWduZWQgaW50IHRlbXBfaj0wOwoJLy91bnNpZ25lZCBpbnQgcmVnX2FkZD0wOwoJLy8JCXN0YXRpYyB1bnNpZ25lZCBpbnQgdHJhaW5pbmdfZW5hYmxlZD0xOwoKCS8vCSBpb3ZyZWZfbGVmPTB4NDk7CgkvLyBwcmludGYoIlxuXG4gaW92cmVmICBvcmcgICAgICAgICAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIixpb3ZyZWZfbGVmLCgoKCgoaW92cmVmX2xlZiYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoJLy8jZGVmaW5lIEREUl9URVNUX0FDTENETFIKCgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9Cgl9CglkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJaWYgKGFyZ2MgPjMpIHsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCX0KCgl9CglpZiAoYXJnYyA+NCkgewoJCXRlc3RfbG9vcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9sb29wID0gMTsKCQl9CgkJaWYgICAoKHN0cmNtcChhcmd2WzRdLCAibCIpID09IDApIHx8IChzdHJjbXAoYXJndls0XSwgIkwiKSA9PSAwKSkKCQl7CgkJCXRlc3RfbG9vcCA9IDEwMDAwMDsKCQl9Cgl9Cgl0cmFpbmluZ19zZWVkID0gMHg0OTsKCWlmIChhcmdjID41KSB7CgkJdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc2VlZCA9IDB4NDk7CgkJfQoKCgl9CgoJcHJpbnRmKCJcblxuIGlvdnJlZiAgdHJhaW5pbmdfc2VlZCAgICAgICAgICAgICA9PTB4JTA4eCAgICUwOGRtVlxuIix0cmFpbmluZ19zZWVkLCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoKCXRyYWluaW5nX3N0ZXAgPSAwOwoJaWYgKGFyZ2MgPjYpIHsKCQl0cmFpbmluZ19zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0cmFpbmluZ19zdGVwID0gMDsKCQl9Cgl9CglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2xvb3A9PSAweCUwOHhcbiIsIHRlc3RfbG9vcCk7CglpZiAoIGNoYW5uZWxfYV9lbikKCXsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCX0KCWlmICggY2hhbm5lbF9iX2VuKQoJewoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJfQoKCS8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nIGRxcyB2YWx1ZQoJaWYgKGNoYW5uZWxfYV9lbiB8fCBjaGFubmVsX2JfZW4pCgl7CgkJLy9kY2FjaGVfZGlzYWJsZSgpOwoJCS8vc2VyaWFsX3B1dHMoIlxuZGVidWcgZm9yIGRkcnRlc3QgLGppYXhpbmcgZGlzYWJsZSBkY2FjaGUiKTsKCgkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCXsKCQkJaWYgKCggY2hhbm5lbF9hX2VuKSAmJiAoIGNoYW5uZWxfYl9lbiA9PSAwKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQl7CgkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQl9CgkJCWVsc2UgaWYgKChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKT09MikKCQkJewoJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoJCQkJfQoJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCgkJCQkJcmVnX2FkZD1ERFIwX1BVQl9BQ01ETFIrcmVnX2Jhc2VfYWRqOwoJCQkJfQoJCQl9CgoJCQlyZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgoJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJewoJCQkJcHJpbnRmKCJcbnRlc3QgQSBjaGFubmVsIDB4JTA4eFxuIixyZWdfYWRkKTsKCQkJCWFjX21kbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsvL3JlYWRsKHJlZ19hZGQpOy8vMHhjODgzNjAwMAoJCQkJYWNfbGNkbHJfYV9vcmc9KHVuc2lnbmVkIGludCApKHJlYWRsKCh1bnNpZ25lZCBpbnQgKShyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKSkpOy8vcmVhZGwocmVnX2FkZCs0KTsKCQkJCWFjX2JkbHIwX2Ffb3JnPSh1bnNpZ25lZCBpbnQgKShyZWFkbCgodW5zaWduZWQgaW50ICkocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUikpKTsvL3JlYWRsKHJlZ19hZGQrOCk7CgoJCQkJcHJpbnRmKCJcbiBhY19tZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCksIGFjX21kbHJfYV9vcmcpOwoJCQkJcHJpbnRmKCJcbiBhY19sY2Rscl9vcmcgIDB4JTA4eCByZWc9PSAweCUwOHhcbiIsKHJlZ19hZGQrRERSMF9QVUJfQUNMQ0RMUi1ERFIwX1BVQl9BQ01ETFIpLCBhY19sY2Rscl9hX29yZyk7CgkJCQlwcmludGYoIlxuIGFjX2JkbHIwX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0JETFIwLUREUjBfUFVCX0FDTURMUiksIGFjX2JkbHIwX2Ffb3JnKTsKCQkJfQoJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQl9SRUdfQkFTRSkKCQkJewoKCQkJCWFjX21kbHJfYl9vcmc9cmVhZGwocmVnX2FkZCk7CgkJCQlhY19sY2Rscl9iX29yZz1yZWFkbChyZWdfYWRkK0REUjBfUFVCX0FDTENETFItRERSMF9QVUJfQUNNRExSKTsKCQkJCWFjX2JkbHIwX2Jfb3JnPXJlYWRsKHJlZ19hZGQrOCk7CgkJCQlwcmludGYoIlxuIGFjX21kbHJfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkKSwgYWNfbWRscl9iX29yZyk7CgkJCQlwcmludGYoIlxuIGFjX2xjZGxyX29yZyAgMHglMDh4IHJlZz09IDB4JTA4eFxuIiwocmVnX2FkZCtERFIwX1BVQl9BQ0xDRExSLUREUjBfUFVCX0FDTURMUiksIGFjX2xjZGxyX2Jfb3JnKTsKCQkJCXByaW50ZigiXG4gYWNfYmRscjBfb3JnICAweCUwOHggcmVnPT0gMHglMDh4XG4iLChyZWdfYWRkK0REUjBfUFVCX0FDQkRMUjAtRERSMF9QVUJfQUNNRExSKSwgYWNfYmRscjBfYl9vcmcpOwoJCQl9CgoKCQl9CgoKCX0vLy8vc2F2ZSBhbmQgcHJpbnQgb3JnIHRyYWluaW5nICB2YWx1ZQoKCglmb3IgKHRlc3RfdGltZXM9MDsodGVzdF90aW1lczx0ZXN0X2xvb3ApOyh0ZXN0X3RpbWVzKyspKQoJewoJCS8vLy90dW5lIGFuZCBzYXZlIHRyYWluaW5nIGRxcyB2YWx1ZQoJCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJCXsKCQkJZm9yICgodGVzdGluZ19jaGFubmVsPTApOyh0ZXN0aW5nX2NoYW5uZWw8KGNoYW5uZWxfYV9lbitjaGFubmVsX2JfZW4pKTsodGVzdGluZ19jaGFubmVsKyspKQoJCQl7CgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgQUNcbiIpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXByaW50ZigiXG50ZXN0IEIgY2hhbm5lbCBBQ1xuIik7CgkJCQl9CgoKI2RlZmluZSB3cnJfcmVnKGFkZHIsIGRhdGEpCSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpPShkYXRhKSAgLy93cl9yZWcoYWRkciwgZGF0YSkKI2RlZmluZSByZHJfcmVnKGFkZHIpCQkgKHVuc2lnbmVkIGludCApKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSkgIC8vcmRfcmVnKGFkZHIpCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIzLCAweDA4MDgpOyAgLy9jczAgY3MxCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIwLCAweDFmKTsgIC8vY2swCgkJCQkvLwl3cl9yZWcoRERSMF9QVUJfQUNCRExSNCwgMHgwODA4KTsgLy9vZHQwIG9kdDEKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjUsIDB4MDgwOCk7ICAvL2NrZTAgY2tlMQoKCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFIxLCAweDE4MTgxOCk7IC8vcmFzIGNhcyB3ZQoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSMiwgMHgxODE4MTgpOyAvL2JhMCBiYTEgYmEyCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI2LCAweDEyMTIxMjEyKTsgLy9hMCBhMSBhMiBhMwoJCQkJLy93cl9yZWcoRERSMF9QVUJfQUNCRExSNywgMHgwZDBkMGQwZCk7IC8vYTQgYTUgYTYgYTcKCQkJCS8vd3JfcmVnKEREUjBfUFVCX0FDQkRMUjgsIDB4MTAxMDEwMTApOyAgLy9hOCBhOSBhMTAgYTExCgkJCQkvL3dyX3JlZyhERFIwX1BVQl9BQ0JETFI5LCAweDE4MTgxODE4KTsgIC8vYTEyIGExMyBhMTQgYTE1CgkJCQlyZWdfYWRkPUREUjBfUFVCX0lPVkNSMDsKCQkJCXJlZ19zZWVkX3ZhbHVlPSh0cmFpbmluZ19zZWVkfCh0cmFpbmluZ19zZWVkPDw4KXwodHJhaW5pbmdfc2VlZDw8MTYpfCh0cmFpbmluZ19zZWVkPDwyNCkpOwoJCQkJLy9mb3IoKCAgdGVtcF9pPTApOyh0ZW1wX2k8MTApOyggdGVtcF9pKyspKQoJCQkJLy93cl9yZWcoKEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpLAoJCQkJLy9hY19iZGxyX3JlZ19zZWVkX3ZhbHVlKTsgIC8vY3MwIGNzMQoJCQkJLy9yZWdfYWRkPXJlZ19hZGQrdGVtcF9pKjQ7CgoJCQkJLy9yZWdfYWRkPUREUjBfUFVCX0FDTURMUityZWdfYmFzZV9hZGo7CgkJCQkvL3JlZ19hZGQ9KEREUjBfUFVCX0FDQkRMUjArdGVtcF9pKjQpOwoJCQkJcmVnX2FkZD1yZWdfYWRkK3JlZ19iYXNlX2FkajsKCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCQkJCS8vCSBpb3ZyZWZfbGVmPTB4NDk7CgkJCQlpZiAoaW92cmVmX3RlbXBfdmFsdWUpCgkJCQl7CgkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgb3JnICAgICAgICAgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX3RlbXBfdmFsdWUsKCgoKChpb3ZyZWZfdGVtcF92YWx1ZSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXByaW50ZigiXG5pbyB2cmVmIHBvd2VyIGRvd24gLHVzZSBleHRlcm5hbCByZXNpc3RlciBcbiAiKTsKCQkJCX0KCgkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJcmVnX3NlZWRfdmFsdWUpOyAgLy8KCgkJCQl3cnJfcmVnKChyZWdfYWRkKzQpLAoJCQkJCQlyZWdfc2VlZF92YWx1ZSk7ICAvLwoJCQkJaW92cmVmX2xlZj10cmFpbmluZ19zZWVkOwoJCQkJaW92cmVmX3JpZz10cmFpbmluZ19zZWVkOwoKCQkJCXByaW50ZigiXG50cmFpbmluZ19zdGVwPT0weCUwOHhcbiAiLHRyYWluaW5nX3N0ZXApOwoKCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCQkJCXdoaWxlIChpb3ZyZWZfdGVtcF92YWx1ZT4weDQwKQoJCQkJewoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlLS07CgoJCQkJCXByaW50ZigiXG5pb3ZyZWYgbGVmIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWU9KGlvdnJlZl90ZW1wX3ZhbHVlfChpb3ZyZWZfdGVtcF92YWx1ZTw8OCl8KGlvdnJlZl90ZW1wX3ZhbHVlPDwxNil8KGlvdnJlZl90ZW1wX3ZhbHVlPDwyNCkpOzsKCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJCWlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7ICAvLwoKCQkJCQl3cnJfcmVnKChyZWdfYWRkK0REUjBfUFVCX0lPVkNSMS1ERFIwX1BVQl9JT1ZDUjApLAoJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbnZyZWYgZG93biBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZSsrOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgoJCQkJcHJpbnRmKCJcbiBkb3duIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICBkb3duIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJaW92cmVmX2xlZj1pb3ZyZWZfdGVtcF92YWx1ZTsKCgkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJcmVnX3NlZWRfdmFsdWUpOyAgLy8KCgkJCQl3cnJfcmVnKChyZWdfYWRkK0REUjBfUFVCX0lPVkNSMS1ERFIwX1BVQl9JT1ZDUjApLAoJCQkJCQlyZWdfc2VlZF92YWx1ZSk7ICAvLwoKCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCgoJCQkJd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPDB4N2YpCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJaW92cmVmX3RlbXBfdmFsdWUrKzsKCgkJCQkJcHJpbnRmKCJcbmlvdnJlZiBsZWYgdGVtcD09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7CgoJCQkJCWlvdnJlZl90ZW1wX3JlZ192YWx1ZT0oaW92cmVmX3RlbXBfdmFsdWV8KGlvdnJlZl90ZW1wX3ZhbHVlPDw4KXwoaW92cmVmX3RlbXBfdmFsdWU8PDE2KXwoaW92cmVmX3RlbXBfdmFsdWU8PDI0KSk7OwoJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsgIC8vCgoJCQkJCXdycl9yZWcoKHJlZ19hZGQrRERSMF9QVUJfSU9WQ1IxLUREUjBfUFVCX0lPVkNSMCksCgkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIixyZWdfYWRkLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbnZyZWYgdXAgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWUtLTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCXByaW50ZigiXG4gdXAgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIHVwIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJaW92cmVmX3JpZz1pb3ZyZWZfdGVtcF92YWx1ZTsKCgkJCQkvL3JlZ19zZWVkX3ZhbHVlPTB4NDk0OTQ5NDkKCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkweDQ5NDk0OTQ5KTsgIC8vCgoJCQkJd3JyX3JlZygocmVnX2FkZCtERFIwX1BVQl9JT1ZDUjEtRERSMF9QVUJfSU9WQ1IwKSwKCQkJCQkJMHg0OTQ5NDk0OSk7ICAvLwoKCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIGRvd24gZWRnZT09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CgkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICAgIHVwIGVkZ2U9PTB4JTA4eCAgICUwOGRtVlxuIixpb3ZyZWZfcmlnLCgoKCgoaW92cmVmX3JpZyYwWDNGKSo3KSs0NDApKjMpLzIpKzEpOwoJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWQgPT0weCUwOHggICAlMDhkbVZcbiIsCgkJCQkJCShpb3ZyZWZfbGVmK2lvdnJlZl9yaWcpLzIsKCgoKCgoKGlvdnJlZl9sZWYraW92cmVmX3JpZykvMikmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCQkJCWlmIChpb3ZyZWZfbGVmID09IDB4NDApCgkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgIGRvd24gZWRnZSByZWFjaCAgcmVnIGxpbWl0ZWRcbiIpOwoJCQl9CgkJfQoJfQoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cgp9ClVfQk9PVF9DTUQoCglkZHJfdHVuZV9kZHJfdnJlZiwJNywJMSwJZG9fZGRyX3Rlc3RfdnJlZiwKCSJERFIgdHVuZSB2cmVmIGZ1bmN0aW9uIGRkcl90dW5lX2Rkcl92cmVmICBhIDAgMHg4MDAwMDAwICAxIDQ4IDEiLAoJImRkcl90dW5lX2Rkcl92cmVmICBhIDAgMHg4MDAwMDAwICAxIHNlZWQgc3RlcCBcbiBkY2FjaGUgb2ZmID8gXG4iCik7CgoKaW50IGRvX2RkcjRfdGVzdF9waHlfdnJlZihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJaWYod2F0Y2hkb2dfdGltZV9zPT0wKQoJewoJCXdhdGNoZG9nX3RpbWVfcz01MDsKCQlwcmludGYoInRlc3Qgc29jX3ZyZWYgcmUgc2V0IHdhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCX0KCiNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKCS8vIHVuc2lnbmVkIGludCAgc3RhcnRfYWRkcj10ZXN0X3N0YXJ0X2FkZHI7CglwcmludGYoIlxuRW50ZXIgVGVzdCBkZHI0IHBoeSB2cmVmIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCWludCB0cmFpbmluZ19zZWVkPTA7CglpbnQgdHJhaW5pbmdfc3RlcD0wOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3Rfc29jX2RyYW09MDsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCXVuc2lnbmVkIGludCAgIGR4bmxjZGxyM1s0XTsKCXVuc2lnbmVkIGludCAgIGR4bmxjZGxyNFs0XTsKCgojZGVmaW5lICBDSEFOTkVMX0EgIDAKI2RlZmluZSAgQ0hBTk5FTF9CICAxCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCS8vICAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCQkJMHhjODgzNjAwMAojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I0ICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg0ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNSAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDUgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ1ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NSAgPDwgMiApICkKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX2xlZlsxMF07CgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfcmlnWzEwXTsKCWludCAgIGlvdnJlZl90ZW1wX3ZhbHVlOwoJaW50IGRkcl9zb2NfaW92cmVmX29yZz0wOwoJaW50ICAgaW92cmVmX3RlbXBfcmVnX3ZhbHVlOwoJLy8gICAgdW5zaWduZWQgaW50ICByZWdfc2VlZF92YWx1ZTsKCS8vCSAgIHVuc2lnbmVkIGludCAgIHRlbXBfcmVnX3ZhbHVlOwoJaW50ICAgaW92cmVmX29yZ1s0XTsKCWludCAgIGlvdnJlZl9sZWZbNF07CglpbnQgICBpb3ZyZWZfcmlnWzRdOwoJLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcjsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2o9MDsKCS8vdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vCQlzdGF0aWMgdW5zaWduZWQgaW50IHRyYWluaW5nX2VuYWJsZWQ9MTsKCgkvLwkgaW92cmVmX2xlZj0weDQ5OwoJLy8gcHJpbnRmKCJcblxuIGlvdnJlZiAgb3JnICAgICAgICAgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX2xlZiwoKCgoKGlvdnJlZl9sZWYmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCS8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoJY2hhciBzdHJfdGVtcDFbMTAyNF09IiI7CgljaGFyIHN0cl90ZW1wMlsxMDI0XT0iIjsKCWNoYXIgc3RyWzUxMl09IiI7Cgl1bnNpZ25lZCBpbnQgIHNvY19pb3ZyZWZfdGVzdF9kZHJfY2xrPTA7CglzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfdGVzdF9kZHJfY2xrIik7Cglzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsaz1lbnZfdG9fYV9udW0oc3RyX3RlbXAxKTsKCWlmKHNvY19pb3ZyZWZfdGVzdF9kZHJfY2xrPT0wKQoJewoJCXNvY19pb3ZyZWZfdGVzdF9kZHJfY2xrPWdsb2JhbF9kZHJfY2xrOwoJCXsKCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX3Rlc3RfZGRyX2NsayIpOwoJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsayk7CgkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQl9Cgl9CglpZihzb2NfaW92cmVmX3Rlc3RfZGRyX2NsayE9Z2xvYmFsX2Rkcl9jbGspCgl7CgkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzICVkLHdpbGwgcmVib290IHVzZSBkMnBsbCBcbiIsZ2xvYmFsX2Rkcl9jbGssc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGspOwoJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHNvY19pb3ZyZWZfdGVzdF9kZHJfY2xrKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCXdoaWxlKDEpOwoJfQoJdW5zaWduZWQgaW50ICBzb2NfaW92cmVmX3Rlc3Rfc3RlcD0wOwoJc3ByaW50ZihzdHJfdGVtcDEsInNvY19pb3ZyZWZfdGVzdF9zdGVwIik7Cglzb2NfaW92cmVmX3Rlc3Rfc3RlcD1lbnZfdG9fYV9udW0oc3RyX3RlbXAxKTsKCWlmKHNvY19pb3ZyZWZfdGVzdF9zdGVwPT0wKQoJCWlvdnJlZl90ZW1wX3ZhbHVlPTA7Cgl7CgkJc3ByaW50ZihzdHJfdGVtcDEsInNvY19pb3ZyZWZfdGVzdF9zdGVwIik7CgkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJfQoKCXVuc2lnbmVkIGludCAgc29jX2lvdnJlZl9sZWY9MDsKCXVuc2lnbmVkIGludCAgc29jX2lvdnJlZl9yaWc9MDsKCS8vY2hhciAqcF9zdHI9TlVMTDsKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X3NvY19kcmFtID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X3NvY19kcmFtID0gMDsKCQl9CgkJaWYgKHRlc3Rfc29jX2RyYW0pCgkJCXRlc3Rfc29jX2RyYW0gPSAxOwoKCX0KCXRyYWluaW5nX3NlZWQgPSAwOwoJaWYgKGFyZ2MgPjUpIHsKCQl0cmFpbmluZ19zZWVkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0cmFpbmluZ19zZWVkID0wOy8vIDB4MmU7CgkJfQoJfQoKCWlmICh0cmFpbmluZ19zZWVkPjB4M2YpCgkJdHJhaW5pbmdfc2VlZD0weDNmOwoKCXByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTIvMTUpOwoKCXRyYWluaW5nX3N0ZXAgPSAwOwoJaWYgKGFyZ2MgPjYpIHsKCQl0cmFpbmluZ19zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0cmFpbmluZ19zdGVwID0gMDsKCQl9Cgl9CglpbnQgdnJlZl9hbGw9MTsKCWlmIChhcmdjID43KSB7CgkJdnJlZl9hbGwgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfYWxsID0wOy8vCgkJfQoJfQoJdnJlZl9hbGwgPTE7Ly8KCWludCB2cmVmX2xjZGxyX29mZnNldD0wOwoJaWYgKGFyZ2MgPjgpIHsKCQl2cmVmX2xjZGxyX29mZnNldCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbOF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdnJlZl9sY2Rscl9vZmZzZXQgPTA7CgkJfQoJfQoJaW50IHZyZWZfc2V0X3Rlc3Rfc3RlcD0wOwoJaWYgKGFyZ2MgPjkpIHsKCQl2cmVmX3NldF90ZXN0X3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzldID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfc2V0X3Rlc3Rfc3RlcCA9MDsKCQl9Cgl9CgoJdW5zaWduZWQgaW50IHNvY19kcmFtX2hleF9kZWM9MDsKCWlmIChhcmdjID4xMCkKCXsKCQlzb2NfZHJhbV9oZXhfZGVjID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEwXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXNvY19kcmFtX2hleF9kZWMgPSAwOwoJCX0KCX0KCWlmIChzb2NfZHJhbV9oZXhfZGVjKQoJewoJCWlmIChhcmdjID41KSB7CgkJCXRyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCQl9CgkJCXByaW50ZigiXG50cmFpbmluZ19zZWVkPT0gMHglMDh4XG4iLCB0cmFpbmluZ19zZWVkKTsKCgkJfQoJCWlmICh0cmFpbmluZ19zZWVkPDQ1KQoJCQl0cmFpbmluZ19zZWVkPTQ1OwoJCWlmICh0cmFpbmluZ19zZWVkPjg4KQoJCQl0cmFpbmluZ19zZWVkPTg4OwoJCXRyYWluaW5nX3NlZWQgPSgoKHRyYWluaW5nX3NlZWQqMTAwMC00NDA3MCkvNjk4KSk7CgoKCQlwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCgodHJhaW5pbmdfc2VlZCYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCX0KCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3Rfc29jX2RyYW09PSAweCUwOHhcbiIsIHRlc3Rfc29jX2RyYW0pOwoJcHJpbnRmKCJcbnZyZWZfYWxsPT0gMHglMDh4XG4iLCB2cmVmX2FsbCk7CglwcmludGYoIlxudnJlZl9sY2Rscl9vZmZzZXQ9PSAweCUwOHhcbiIsIHZyZWZfbGNkbHJfb2Zmc2V0KTsKCXByaW50ZigiXG5zb2NfZHJhbV9oZXhfZGVjPT0gMHglMDh4XG4iLCBzb2NfZHJhbV9oZXhfZGVjKTsKCWlmICggY2hhbm5lbF9hX2VuKQoJewoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJfQoJaWYgKCBjaGFubmVsX2JfZW4pCgl7CgkJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7Cgl9CgoJLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgZHFzIHZhbHVlCglpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCXsKCQkvL2RjYWNoZV9kaXNhYmxlKCk7CgkJLy9zZXJpYWxfcHV0cygiXG5kZWJ1ZyBmb3IgZGRydGVzdCAsamlheGluZyBkaXNhYmxlIGRjYWNoZSIpOwoJfS8vLy9zYXZlIGFuZCBwcmludCBvcmcgdHJhaW5pbmcgIHZhbHVlCgoKCgkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCWZvciAoKHRlc3RpbmdfY2hhbm5lbD0wKTsodGVzdGluZ19jaGFubmVsPChjaGFubmVsX2FfZW4rY2hhbm5lbF9iX2VuKSk7KHRlc3RpbmdfY2hhbm5lbCsrKSkKCQl7CgkJCWlmICgoIGNoYW5uZWxfYV9lbikgJiYgKCBjaGFubmVsX2JfZW4gPT0gMCkpCgkJCXsKCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCX0KCQkJZWxzZSBpZigoIGNoYW5uZWxfYl9lbikmJiggY2hhbm5lbF9hX2VuPT0wKSkKCQkJewoJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJfQoJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCXsKCQkJCWlmICggdGVzdGluZ19jaGFubmVsID09IENIQU5ORUxfQSkKCQkJCXsKCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9BX1JFR19CQVNFOwoJCQkJfQoJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQl7CgkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQl9SRUdfQkFTRTsKCQkJCX0KCQkJfQoKCQkJaWYgKHJlZ19iYXNlX2FkaiA9PSBDSEFOTkVMX0FfUkVHX0JBU0UpCgkJCXsKCQkJCXByaW50ZigiXG50ZXN0IEEgY2hhbm5lbCBkYXRhIGxhbmVcbiIpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcHJpbnRmKCJcbnRlc3QgQiBjaGFubmVsIGRhdGEgbGFuZVxuIik7CgkJCX0KCgoKCiNkZWZpbmUgd3JyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRyX3JlZyhhZGRyKQkJICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQoJCQkJdW5zaWduZWQgaW50ICAgZHhubWRscj0wOwoJCQkJcmVnX2FkZD1ERFIwX1BVQl9EWDBNRExSMCtyZWdfYmFzZV9hZGo7CgkJCQlkeG5tZGxyPSgocmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKSk+PjE2KSYweDFmZjsKCQkJCS8vCXJlZ19zZWVkX3ZhbHVlPSh0cmFpbmluZ19zZWVkfCgweDA8PDgpfCgweDA8PDE2KXwoMHgwPDwyNCkpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDBHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgxR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYMkdDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDNHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDBHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDFHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDJHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJHQ1I0KSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDNHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNHQ1I0KSkpKTsKCgkJCQlwcmludGYoIlxuZHhubWRscj09MHglMDh4XG4gIixkeG5tZGxyKTsKCQkJCXVuc2lnbmVkIGludCAgIHRlbXBfaT0wOwoJCQkJdW5zaWduZWQgaW50ICAgdGVtcF9pX21heD00OwoJCQkJZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTw0KTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQlkeG5sY2RscjNbdGVtcF9pXT0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopK3RlbXBfaSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSk7CgkJCQkJZHhubGNkbHI0W3RlbXBfaV09KHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSt0ZW1wX2kqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpOwoJCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwR0NSNStyZWdfYmFzZV9hZGordGVtcF9pKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpOwoJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQkJaW92cmVmX29yZ1t0ZW1wX2ldPWlvdnJlZl90ZW1wX3ZhbHVlOwoJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoJCQkJCXByaW50ZigiXG5keG5sY2RscjNbJTA4eF09PTB4JTA4eCxkeG5sY2RscjRbJTA4eF09PTB4JTA4eFxuICIsdGVtcF9pLGR4bmxjZGxyM1t0ZW1wX2ldLHRlbXBfaSxkeG5sY2RscjRbdGVtcF9pXSk7CgkJCQkJLy8JIGlvdnJlZl9sZWY9MHg0OTsKCQkJCQlpZiAoaW92cmVmX3RlbXBfdmFsdWUpCgkJCQkJewoJCQkJCQlwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWYgIG9yZyA9PTB4JTA4eCAgICUwOGRtVlxuIixyZWdfYWRkLAoJCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pXSxpb3ZyZWZfdGVtcF92YWx1ZSwoKCgoKChpb3ZyZWZfdGVtcF92YWx1ZSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbmlvIHZyZWYgcG93ZXIgZG93biAsdXNlIGV4dGVybmFsIHJlc2lzdGVyIFxuICIpOwoJCQkJCX0KCgkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaV0pOyAgLy8KCQkJCQlpb3ZyZWZfbGVmW3RlbXBfaV09KGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZjsKCQkJCQlpb3ZyZWZfcmlnW3RlbXBfaV09KGlvdnJlZl9vcmdbdGVtcF9pXSkmMHhmZjsKCQkJCQlpZiAodHJhaW5pbmdfc2VlZCkKCQkJCQl7aW92cmVmX2xlZlt0ZW1wX2ldPXRyYWluaW5nX3NlZWQ7CgkJCQkJCWlvdnJlZl9yaWdbdGVtcF9pXT10cmFpbmluZ19zZWVkOwoKCQkJCQl9CgkJCQl9CgoJCQkJcHJpbnRmKCJcbnRyYWluaW5nX3N0ZXA9PTB4JTA4eFxuICIsdHJhaW5pbmdfc3RlcCk7CgkJCQlpZiAodnJlZl9hbGwpCgkJCQl7dGVtcF9pX21heD0xOwoJCQkJfQoJCQkJZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTx0ZW1wX2lfbWF4KTsoIHRlbXBfaSsrKSkKCQkJCXsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYMEdDUjUrcmVnX2Jhc2VfYWRqK3RlbXBfaSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KTsKCgoJCQkJCWlmICh0cmFpbmluZ19zZWVkKQoJCQkJCXsKCQkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaV0pJjB4ZmZmZmZmMDApKSk7CgkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMSooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCQkodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzFdKSYweGZmZmZmZjAwKSkpOyAgLy8KCQkJCQkJCXdycl9yZWcoKChyZWdfYWRkKzIqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpKSwKCQkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaSsyXSkmMHhmZmZmZmYwMCkpKTsgIC8vCgkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCSh0cmFpbmluZ19zZWVkfCgoaW92cmVmX29yZ1t0ZW1wX2krM10pJjB4ZmZmZmZmMDApKSk7ICAvLwoJCQkJCQl9CgkJCQkJfQoKCQkJCQl7CgoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1yZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpOwoJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0oKGlvdnJlZl90ZW1wX3ZhbHVlKSYweGZmKTsKCgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9vcmciKTsKCQkJCQkJZGRyX3NvY19pb3ZyZWZfb3JnPWVudl90b19hX251bShzdHJfdGVtcDEpOwoJCQkJCQlpZihkZHJfc29jX2lvdnJlZl9vcmc9PTApCgkJCQkJCXsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9vcmciKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX2xlZiIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfcmlnIik7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfdGVtcF92YWx1ZSk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9sZWYiKTsKCQkJCQkJc29jX2lvdnJlZl9sZWY9ZW52X3RvX2FfbnVtKHN0cl90ZW1wMSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9yaWciKTsKCQkJCQkJc29jX2lvdnJlZl9yaWc9ZW52X3RvX2FfbnVtKHN0cl90ZW1wMSk7CgoKCQkJCQkJaWYoc29jX2lvdnJlZl9sZWYpCgkJCQkJCXs7CgkJCQkJCX0KCgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOwoKCQkJCQkJaWYgKHZyZWZfc2V0X3Rlc3Rfc3RlcCkKCQkJCQkJewoJCQkJCQkJcHJpbnRmKCJcbnZyZWZfc2V0X3Rlc3Rfc3RlcD09MHglMDh4LHNraXAgdGVzdCBsZWZ0IGVkZ2VcbiAiLHZyZWZfc2V0X3Rlc3Rfc3RlcCk7CgkJCQkJCQlzb2NfaW92cmVmX3Rlc3Rfc3RlcD0xOwoJCQkJCQkJewoJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJzb2NfaW92cmVmX3Rlc3Rfc3RlcCIpOwoJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLHNvY19pb3ZyZWZfdGVzdF9zdGVwKTsKCQkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCX0KCQkJCQkJCS8vYnJlYWs7CgkJCQkJCX0KCgkJCQkJCWlmKHNvY19pb3ZyZWZfdGVzdF9zdGVwPT0wKQoJCQkJCQl7Ly9pbnQgdGVtcD0wOwoJCQkJCQkJaWYoc29jX2lvdnJlZl9sZWYpCgkJCQkJCQl7aW92cmVmX3RlbXBfdmFsdWU9c29jX2lvdnJlZl9sZWY7CgkJCQkJCQl9CgkJCQkJCQl3aGlsZSAoaW92cmVmX3RlbXBfdmFsdWU+MHgwKQoJCQkJCQkJewoKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwOwoJCQkJCQkJCWlmIChpb3ZyZWZfdGVtcF92YWx1ZTx0cmFpbmluZ19zdGVwKQoJCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCXByaW50ZigiXG5pb3ZyZWYgbGVmIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKCQkJCQkJCQl7CgkJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9sZWYiKTsKCQkJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWU9KGlvdnJlZl90ZW1wX3ZhbHVlfCgoaW92cmVmX29yZ1t0ZW1wX2ldKSYweGZmZmZmZjAwKSk7CgkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKCQkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKCQkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKCQkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQl9CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzEqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKHJlZ19hZGQrMiooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCQkJewoJCQkJCQkJCQl7CgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCX0KCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpKTsKCQkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwoJCQkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KCQkJCQkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbMV0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1syXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzNdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbMV0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFsyXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzNdKTsgIC8vCgkJCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJfQoKCQkJCQkJCQl9CgoJCQkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJCQl7CgkJCQkJCQkJCXsKCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLChkeG5sY2RscjNbMF0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSwoZHhubGNkbHI0WzBdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCShkeG5sY2RscjNbMV0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCShkeG5sY2RscjNbMl0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCShkeG5sY2RscjNbM10tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCShkeG5sY2RscjRbMV0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCShkeG5sY2RscjRbMl0tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCShkeG5sY2RscjRbM10tdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzAqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSk7CgkJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaiksZHhubGNkbHIzWzBdKTsgIC8vCgkJCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLGR4bmxjZGxyNFswXSk7ICAvLwoJCQkJCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1sxXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzJdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbM10pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFsxXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzIqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzJdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbM10pOyAgLy8KCQkJCQkJCQkJCQkJfQoKCQkJCQkJCQkJCQl9CgkJCQkJCQkJCQl9CgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0KCQkJCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCQkJCXsKCQkJCQkJCQkJcHJpbnRmKCJcbnZyZWYgZG93biBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlwcmludGYoIlxuaW92cmVmIGxlZiB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgkJCQkJCQl7CgkJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX2xlZiIpOwoJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCQkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCX0KCgkJCQkJCQl7CgkJCQkJCQkJc29jX2lvdnJlZl90ZXN0X3N0ZXA9MTsKCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwic29jX2lvdnJlZl90ZXN0X3N0ZXAiKTsKCQkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixzb2NfaW92cmVmX3Rlc3Rfc3RlcCk7CgkJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9sZWYiKTsKCQkJCQkJc29jX2lvdnJlZl9sZWY9ZW52X3RvX2FfbnVtKHN0cl90ZW1wMSk7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXNvY19pb3ZyZWZfbGVmOwoJCQkJCQlwcmludGYoIlxuIGRvd24gZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgICAgICAgICAgICAgICAgICAgICAgZG93biBlZGdlPT0weCUwOHhcbiAiLHNvY19pb3ZyZWZfbGVmKTsKCQkJCQkJaW92cmVmX2xlZlt0ZW1wX2ldPWlvdnJlZl90ZW1wX3ZhbHVlOwoJCQkJCQkvL2lmKHNvY19pb3ZyZWZfbGVmKQoJCQkJCQkvL3tpb3ZyZWZfdGVtcF92YWx1ZT1zb2NfaW92cmVmX2xlZjsKCQkJCQkJLy9pb3ZyZWZfbGVmW3RlbXBfaV09aW92cmVmX3RlbXBfdmFsdWU7CgkJCQkJCS8vfQoJCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaV0pOyAgLy8KCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pKzFdKTsgIC8vCgkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pKzJdKTsgIC8vCgkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pKzNdKTsgIC8vCgkJCQkJCX0KCgkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJewoJCQkJCQkJewoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLGR4bmxjZGxyNFswXSk7ICAvLwoJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCWR4bmxjZGxyM1sxXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCWR4bmxjZGxyM1syXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCWR4bmxjZGxyM1szXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCWR4bmxjZGxyNFsxXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCWR4bmxjZGxyNFsyXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCWR4bmxjZGxyNFszXSk7ICAvLwoJCQkJCQkJCX0KCgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoKCQkJCQl7CgkJCQkJCWlmICh0cmFpbmluZ19zZWVkKQoJCQkJCQl7CgkJCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwKCQkJCQkJCQkJKHRyYWluaW5nX3NlZWR8KChpb3ZyZWZfb3JnW3RlbXBfaV0pJjB4ZmZmZmZmMDApKSk7CgkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCQkodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzFdKSYweGZmZmZmZjAwKSkpOyAgLy8KCQkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCQkodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzJdKSYweGZmZmZmZjAwKSkpOyAgLy8KCQkJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJCQkodHJhaW5pbmdfc2VlZHwoKGlvdnJlZl9vcmdbdGVtcF9pKzNdKSYweGZmZmZmZjAwKSkpOyAgLy8KCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9KChpb3ZyZWZfdGVtcF92YWx1ZSkmMHhmZik7CgoJCQkJCQkvL2lmKHNvY19pb3ZyZWZfcmlnPT0wKQoJCQkJCQlpZihzb2NfaW92cmVmX3Rlc3Rfc3RlcD09MSkKCQkJCQkJewoJCQkJCQkJaWYoc29jX2lvdnJlZl9yaWcpCgkJCQkJCQl7aW92cmVmX3RlbXBfdmFsdWU9c29jX2lvdnJlZl9yaWc7CgkJCQkJCQl9CgkJCQkJCQl3aGlsZSAoaW92cmVmX3RlbXBfdmFsdWU8MHgzZikKCQkJCQkJCXsKCQkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwOwoJCQkJCQkJCWlmIChpb3ZyZWZfdGVtcF92YWx1ZT4weDNmKQoJCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJCXByaW50ZigiXG5pb3ZyZWYgcmlnIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKCQkJCQkJCQl7CgkJCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9yaWciKTsKCQkJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQkJfQoKCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWU9KGlvdnJlZl90ZW1wX3ZhbHVlfCgoaW92cmVmX29yZ1t0ZW1wX2ldKSYweGZmZmZmZjAwKSk7CgkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCksCgkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQlpZiAodnJlZl9hbGwpIHsKCQkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKCQkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKCQkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygocmVnX2FkZCszKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSwKCQkJCQkJCQkJCQlpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOyAgLy8KCQkJCQkJCQl9CgoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLHJlZ19hZGQsaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwocmVnX2FkZCsxKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSxpb3ZyZWZfdGVtcF9yZWdfdmFsdWUpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLChyZWdfYWRkKzIqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpLGlvdnJlZl90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSksaW92cmVmX3RlbXBfcmVnX3ZhbHVlKTsKCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJCQl7CgkJCQkJCQkJCXsKCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSkpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCSgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJewoJCQkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8KCQkJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksZHhubGNkbHI0WzBdKTsgIC8vCgkJCQkJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzFdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbMl0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1szXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzFdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbMl0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFszXSk7ICAvLwoJCQkJCQkJCQkJCQl9CgoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCX0KCgkJCQkJCQkJCX0KCgkJCQkJCQkJfQoKCQkJCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJCQkJewoJCQkJCQkJCQl7CgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSwoZHhubGNkbHIzWzBdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaiksKGR4bmxjZGxyNFswXS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJCWlmICh2cmVmX2FsbCkgewoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHIzWzFdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHIzWzJdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHIzWzNdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHI0WzFdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHI0WzJdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkoZHhubGNkbHI0WzNdLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSswKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMCooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsxKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMiooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSszKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpKSkpOwoJCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopLGR4bmxjZGxyM1swXSk7ICAvLwoJCQkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjRbMF0pOyAgLy8KCQkJCQkJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjNbMV0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyM1syXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHIzWzNdKTsgIC8vCgkJCQkJCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMSooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJCQkJCQlkeG5sY2RscjRbMV0pOyAgLy8KCQkJCQkJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQkJCQkJCWR4bmxjZGxyNFsyXSk7ICAvLwoJCQkJCQkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzMqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCQkJCQkJZHhubGNkbHI0WzNdKTsgIC8vCgkJCQkJCQkJCQkJCX0KCgkJCQkJCQkJCQkJfQoJCQkJCQkJCQkJfQoKCQkJCQkJCQkJfQoKCQkJCQkJCQl9CgoJCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQkJewoJCQkJCQkJCQlwcmludGYoIlxudnJlZiB1cCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwOwoJCQkJCQkJCQlicmVhazsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXByaW50ZigiXG5pb3ZyZWYgcmlnIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKCQkJCQkJewoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX3JpZyIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoKCQkJCQkJewoJCQkJCQkJc29jX2lvdnJlZl90ZXN0X3N0ZXA9MjsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJzb2NfaW92cmVmX3Rlc3Rfc3RlcCIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsc29jX2lvdnJlZl90ZXN0X3N0ZXApOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCS8vcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJfQoKCQkJCQl9CgoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfc29jX2lvdnJlZl9yaWciKTsKCQkJCQlzb2NfaW92cmVmX3JpZz1lbnZfdG9fYV9udW0oc3RyX3RlbXAxKTsKCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1zb2NfaW92cmVmX3JpZzsKCgkJCQkJcHJpbnRmKCJcbiB1cCBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIHVwIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCWlvdnJlZl9yaWdbdGVtcF9pXT1pb3ZyZWZfdGVtcF92YWx1ZTsKCQkJCQkvL2lmKHNvY19pb3ZyZWZfcmlnKQoJCQkJCS8ve2lvdnJlZl90ZW1wX3ZhbHVlPXNvY19pb3ZyZWZfcmlnOwoJCQkJCS8vaW92cmVmX3JpZ1t0ZW1wX2ldPWlvdnJlZl90ZW1wX3ZhbHVlOwoJCQkJCS8vfQoJCQkJCXdycl9yZWcoKHJlZ19hZGQpLAoJCQkJCQkJaW92cmVmX29yZ1t0ZW1wX2ldKTsgIC8vCgkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCXdycl9yZWcoKChyZWdfYWRkKzEqKEREUjBfUFVCX0RYMUdDUjUtRERSMF9QVUJfRFgwR0NSNSkpKSwKCQkJCQkJCQlpb3ZyZWZfb3JnW3RlbXBfaSsxXSk7ICAvLwoJCQkJCQl3cnJfcmVnKCgocmVnX2FkZCsyKihERFIwX1BVQl9EWDFHQ1I1LUREUjBfUFVCX0RYMEdDUjUpKSksCgkJCQkJCQkJaW92cmVmX29yZ1t0ZW1wX2krMl0pOyAgLy8KCQkJCQkJd3JyX3JlZygoKHJlZ19hZGQrMyooRERSMF9QVUJfRFgxR0NSNS1ERFIwX1BVQl9EWDBHQ1I1KSkpLAoJCQkJCQkJCWlvdnJlZl9vcmdbdGVtcF9pKzNdKTsgIC8vCgkJCQkJfQoKCQkJCQlpZiAodnJlZl9sY2Rscl9vZmZzZXQpCgkJCQkJewoJCQkJCQl7CgkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjNbMF0pOyAgLy8KCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopLGR4bmxjZGxyNFswXSk7ICAvLwoJCQkJCQkJaWYgKHZyZWZfYWxsKSB7CgkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSMytyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjMpKSwKCQkJCQkJCQkJCWR4bmxjZGxyM1sxXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjMrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjMtRERSMF9QVUJfRFgwTENETFIzKSksCgkJCQkJCQkJCQlkeG5sY2RscjNbMl0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFIzK3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFIzLUREUjBfUFVCX0RYMExDRExSMykpLAoJCQkJCQkJCQkJZHhubGNkbHIzWzNdKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoKEREUjBfUFVCX0RYMExDRExSNCtyZWdfYmFzZV9hZGopKzEqKEREUjBfUFVCX0RYMUxDRExSNC1ERFIwX1BVQl9EWDBMQ0RMUjQpKSwKCQkJCQkJCQkJCWR4bmxjZGxyNFsxXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKChERFIwX1BVQl9EWDBMQ0RMUjQrcmVnX2Jhc2VfYWRqKSsyKihERFIwX1BVQl9EWDFMQ0RMUjQtRERSMF9QVUJfRFgwTENETFI0KSksCgkJCQkJCQkJCQlkeG5sY2RscjRbMl0pOyAgLy8KCQkJCQkJCQl3cnJfcmVnKCgoRERSMF9QVUJfRFgwTENETFI0K3JlZ19iYXNlX2FkaikrMyooRERSMF9QVUJfRFgxTENETFI0LUREUjBfUFVCX0RYMExDRExSNCkpLAoJCQkJCQkJCQkJZHhubGNkbHI0WzNdKTsgIC8vCgkJCQkJCQl9CgoJCQkJCQl9CgkJCQkJfQoKCgkJCQl9CgkJCQkvLyB2ZGRxPTEuNXYKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsKCQkJCXByaW50ZigiXG5cbnNvYyAgaW92cmVmIHRlc3QgY2xrPT0lZFxuIixzb2NfaW92cmVmX3Rlc3RfZGRyX2Nsayk7CgkJCQlwcmludGYoIlxuXG4gaW92cmVmICB2ZGRxPTEuMnYsaWYgdXNlIG90aGVyIHZkZHEgLHBsZWFzZSByZWNvdW50XG4iKTsKCQkJCWZvciAoKCAgdGVtcF9pPTApOyh0ZW1wX2k8NCk7KCB0ZW1wX2krKykpCgkJCQl7CgkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgbGFuZV94PTB4JTA4eCwgICAgIG9yZz09MHglMDh4ICAgJTA4ZG1WXG4iLHRlbXBfaSxpb3ZyZWZfb3JnW3RlbXBfaV0sKCgoKCgoaW92cmVmX29yZ1t0ZW1wX2ldJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTIvMTUpOwoJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIGxhbmVfeD0weCUwOHgsICAgICBkb3duIGVkZ2U9PTB4JTA4eCAgICUwOGRtVlxuIix0ZW1wX2ksaW92cmVmX2xlZlt0ZW1wX2ldLCgoKCgoKGlvdnJlZl9sZWZbdGVtcF9pXSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICBsYW5lX3g9MHglMDh4LCAgICAgdXAgZWRnZT09MHglMDh4ICAgJTA4ZG1WXG4iLHRlbXBfaSxpb3ZyZWZfcmlnW3RlbXBfaV0sKCgoKCgoaW92cmVmX3JpZ1t0ZW1wX2ldJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTIvMTUpOwoJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIGxhbmVfeD0weCUwOHgsICAgICBtaWQgPT0weCUwOHggICAlMDhkbVZcbiIsdGVtcF9pLAoJCQkJCQkJKGlvdnJlZl9sZWZbdGVtcF9pXStpb3ZyZWZfcmlnW3RlbXBfaV0pLzIsKCgoKCgoKChpb3ZyZWZfbGVmW3RlbXBfaV0raW92cmVmX3JpZ1t0ZW1wX2ldKS8yKSYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjEyLzE1KTsKCQkJCQlpZiAoaW92cmVmX2xlZlt0ZW1wX2ldID09IDB4MCkKCQkJCQl7CgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICBkb3duIGVkZ2UgcmVhY2ggIHJlZyBsaW1pdGVkXG4iKTsKCQkJCQl9CgkJCQkJaWYgKGlvdnJlZl9yaWdbdGVtcF9pXSA9PSAweDNmKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgIHVwIGVkZ2UgcmVhY2ggIHJlZyBsaW1pdGVkXG4iKTsKCQkJCQl9CgkJCQl9CgkJCQl7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX29yZyIpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9vcmdbMF0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJfQoKCQkJCXsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3NvY19pb3ZyZWZfbGVmIik7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX2xlZlswXSk7CgkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQl9CgkJCQl7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9zb2NfaW92cmVmX3JpZyIpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9yaWdbMF0pOwoJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJfQoKCQkJCXByaW50ZigiXG5cbiBwcmludGYgc29jIHZyZWYgZnJvbSBlbnYgLGlmIHJlbWVhc3VyZSBzaG91bGQgY2xlYXIgZGRyX3NvY19pb3ZyZWZfb3JnIGVudiAgZGRyX3NvY19pb3ZyZWZfbGVmIFwKCQkJCQkJZGRyX3NvY19pb3ZyZWZfcmlnIGRkcl9zb2NfdnJlZl9yYW5nZSxkZHJfc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGsgXG4iKTsKCQl9Cgl9CglyZXR1cm4gMDsKCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKI2VuZGlmCglyZXR1cm4gMTsKCn0KLy8qLwoKaW50IGRvX2RkcjRfdGVzdF9kcmFtX3ZyZWYoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoKCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJaWYod2F0Y2hkb2dfdGltZV9zPT0wKQoJewoJCXdhdGNoZG9nX3RpbWVfcz01MDsKCQlwcmludGYoInRlc3QgZHJhbV92cmVmIHJlIHNldCB3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl9CgojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHI9dGVzdF9zdGFydF9hZGRyOwoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyNCBkcmFtIHZyZWYgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoKCgkvLyAgdW5zaWduZWQgaW50ICAgbG9vcCA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaSA9IDE7CgkvLyAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaj0gMTsKCS8vICAgIHVuc2lnbmVkIGludCAgIHRlbXBfY291bnRfaz0gMTsKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCWludCB0cmFpbmluZ19zZWVkPTA7CglpbnQgdHJhaW5pbmdfc3RlcD0wOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfY2xlYXI9MDsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICByZWdfYmFzZV9hZGo9MDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJdW5zaWduZWQgaW50ICAgdGVzdGluZ19jaGFubmVsID0gMDsKCXVuc2lnbmVkIGludCAgIGR4bmxjZGxyMVs0XTsKCS8vICB1bnNpZ25lZCBpbnQgICBkeG5sY2RscjRbNF07CgoKI2RlZmluZSAgQ0hBTk5FTF9BICAwCiNkZWZpbmUgIENIQU5ORUxfQiAgMQoKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCS8vICAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCQkJMHhjODgzNjAwMAojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I0ICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg0ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNSAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDUgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ1ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NSAgPDwgMiApICkKCgoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCgkvLyAgIHVuc2lnbmVkIGludCAgIGFjX2JkbHJfbGVmWzEwXTsKCS8vICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9yaWdbMTBdOwoJaW50ICAgaW92cmVmX3RlbXBfdmFsdWU7CgkvLyAgICAgaW50ICAgaW92cmVmX3RlbXBfcmVnX3ZhbHVlOwoJLy8gICAgdW5zaWduZWQgaW50ICByZWdfc2VlZF92YWx1ZTsKCS8vCSAgIHVuc2lnbmVkIGludCAgIHRlbXBfcmVnX3ZhbHVlOwoJaW50ICAgaW92cmVmX29yZz0wOwoJaW50ICAgaW92cmVmX2xlZj0wOwoJaW50ICAgaW92cmVmX3JpZz0wOwoJaW50ICAgaW92cmVmX21pZDsKCWludCAgIGlvdnJlZl90ZXN0X3JlYWQ7CglpbnQgICBpb3ZyZWZfdGVzdF9zdGVwOwoJLy8gIHVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcjsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2k9MDsKCS8vCXVuc2lnbmVkIGludCB0ZW1wX2o9MDsKCS8vdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vCQlzdGF0aWMgdW5zaWduZWQgaW50IHRyYWluaW5nX2VuYWJsZWQ9MTsKCgkvLwkgaW92cmVmX2xlZj0weDQ5OwoJLy8gcHJpbnRmKCJcblxuIGlvdnJlZiAgb3JnICAgICAgICAgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsaW92cmVmX2xlZiwoKCgoKGlvdnJlZl9sZWYmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCS8vI2RlZmluZSBERFJfVEVTVF9BQ0xDRExSCgoKCWlmIChhcmdjID09IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkpCgkJewoJCQljaGFubmVsX2FfZW4gPSAxOwoJCX0KCQllbHNlIGlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKXx8KHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApKQoJCXsKCQkJY2hhbm5lbF9iX2VuID0gMTsKCQl9CgkJZWxzZQoJCXsKCQkJZ290byB1c2FnZTsKCQl9Cgl9CglpZiAoYXJnYyA+IDIpCgl7CgkJaWYgKChzdHJjbXAoYXJndlsxXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJBIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkEiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWlmICAgKChzdHJjbXAoYXJndlsxXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgIkIiKSA9PSAwKSkKCQl7CgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJfQoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2NsZWFyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X2NsZWFyID0gMDsKCQl9CgkJaWYgKCAgdGVzdF9jbGVhciApCgkJCXRlc3RfY2xlYXIgPSAxOwoKCX0KCXRyYWluaW5nX3NlZWQgPSAwOwoJaWYgKGFyZ2MgPjUpIHsKCQl0cmFpbmluZ19zZWVkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0cmFpbmluZ19zZWVkID0wOy8vIDB4MmU7CgkJfQoKCgl9CgoKCgoKCXRyYWluaW5nX3N0ZXAgPSAwOwoJaWYgKGFyZ2MgPjYpIHsKCQl0cmFpbmluZ19zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzZdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0cmFpbmluZ19zdGVwID0gMDsKCQl9CgoJfQoJaWYgKCF0cmFpbmluZ19zdGVwKQoJCXRyYWluaW5nX3N0ZXA9MTsKCWludCB2cmVmX2FsbD0wOwoJaWYgKGFyZ2MgPjcpIHsKCQl2cmVmX2FsbCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdnJlZl9hbGwgPTA7Ly8gMHgyZTsKCQl9fQoJaW50IHZyZWZfbGNkbHJfb2Zmc2V0PTA7CglpZiAoYXJnYyA+OCkgewoJCXZyZWZfbGNkbHJfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzhdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX2xjZGxyX29mZnNldCA9MDsKCQl9fQoJaW50IHZyZWZfc2V0X3Rlc3Rfc3RlcD0wOwoJaWYgKGFyZ2MgPjkpIHsKCQl2cmVmX3NldF90ZXN0X3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzldID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfc2V0X3Rlc3Rfc3RlcCA9MDsKCQl9fQoJaW50IHZyZWZfZHJhbV9yYW5nZT0wOwoJaWYgKGFyZ2MgPjEwKSB7CgkJdnJlZl9kcmFtX3JhbmdlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEwXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMTBdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfZHJhbV9yYW5nZSA9MDsKCQl9fQoKCglwcmludGYoIlxuY2hhbm5lbF9hX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2FfZW4pOwoJcHJpbnRmKCJcbmNoYW5uZWxfYl9lbj09IDB4JTA4eFxuIiwgY2hhbm5lbF9iX2VuKTsKCXByaW50ZigiXG5kZHJfdGVzdF9zaXplPT0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigiXG50ZXN0X2NsZWFyPT0gMHglMDh4XG4iLCB0ZXN0X2NsZWFyKTsKCXByaW50ZigiXG52cmVmX2FsbD09IDB4JTA4eFxuIiwgdnJlZl9hbGwpOwoJcHJpbnRmKCJcbnZyZWZfbGNkbHJfb2Zmc2V0PT0gMHglMDh4XG4iLCB2cmVmX2xjZGxyX29mZnNldCk7CglwcmludGYoIlxudnJlZl9kcmFtX3JhbmdlPT0gMHglMDh4XG4iLCB2cmVmX2RyYW1fcmFuZ2UpOwoKCXVuc2lnbmVkIGludCBzb2NfZHJhbV9oZXhfZGVjPTA7CglpZiAoYXJnYyA+MTEpCgl7CgkJc29jX2RyYW1faGV4X2RlYyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxMV0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzExXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc29jX2RyYW1faGV4X2RlYyA9IDA7CgkJfQoJfQoJaWYgKHNvY19kcmFtX2hleF9kZWMpCgl7CgkJaWYgKGFyZ2MgPjUpIHsKCQkJdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0cmFpbmluZ19zZWVkID0wOy8vIDB4MmU7CgkJCX0KCgoJCX0KCgl9CglpZiAodHJhaW5pbmdfc2VlZCkKCXsKCQlpZiAoc29jX2RyYW1faGV4X2RlYykKCQl7CgkJCWlmICh2cmVmX2RyYW1fcmFuZ2UpCgkJCXsKCQkJCWlmICh0cmFpbmluZ19zZWVkPDQ1KQoJCQkJCXRyYWluaW5nX3NlZWQ9NDU7CgkJCQlpZiAodHJhaW5pbmdfc2VlZD43NykKCQkJCQl0cmFpbmluZ19zZWVkPTc3OwoJCQkJdHJhaW5pbmdfc2VlZCA9KCgoKCh0cmFpbmluZ19zZWVkKjEwMDAtNDUwMDApLzY1MCk+MFgzMik/KDBYMzIpOigoKHRyYWluaW5nX3NlZWQqMTAwMC00NTAwMCkvNjUwKSkpKTsKCQkJfQoJCQlpZiAodnJlZl9kcmFtX3JhbmdlID09IDApCgkJCXsKCQkJCWlmICh0cmFpbmluZ19zZWVkPDYwKQoJCQkJCXRyYWluaW5nX3NlZWQ9NjA7CgkJCQlpZiAodHJhaW5pbmdfc2VlZD45MikKCQkJCQl0cmFpbmluZ19zZWVkPTkyOwoJCQkJdHJhaW5pbmdfc2VlZCA9KCgoKCh0cmFpbmluZ19zZWVkKjEwMDAtNjAwMDApLzY1MCk+MFgzMik/KDBYMzIpOigoKHRyYWluaW5nX3NlZWQqMTAwMC02MDAwMCkvNjUwKSkpKTsKCQkJfQoJCX0KCQlpZiAodnJlZl9kcmFtX3JhbmdlID09IDApCgkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSk7CgkJZWxzZQoJCQlwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpOwoJfQoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgljaGFyIHN0cl90ZW1wMVsxMDI0XT0iIjsKCWNoYXIgc3RyX3RlbXAyWzEwMjRdPSIiOwoJY2hhciAqcF9zdHI9TlVMTDsKCgoJY2hhciBzdHJbNTEyXT0iIjsKCXVuc2lnbmVkIGludCAgZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrPTA7CglzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX3Rlc3RfZGRyX2NsayIpOwoJZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrPWVudl90b19hX251bShzdHJfdGVtcDEpOwoJaWYoZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrPT0wKQoJe2RyYW1faW92cmVmX3Rlc3RfZGRyX2Nsaz1nbG9iYWxfZGRyX2NsazsKCQl7CgkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrIik7CgkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGRyYW1faW92cmVmX3Rlc3RfZGRyX2Nsayk7CgkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQl9Cgl9CglpZihkcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGshPWdsb2JhbF9kZHJfY2xrKQoJewoJCXByaW50ZigicnVubmluZyBkZHIgZnJlcT09JWQsYnV0IHRlc3QgZnJlcSBpcyVkLHdpbGwgcmVib290IHVzZSBkMnBsbCBcbiIsZ2xvYmFsX2Rkcl9jbGssZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrKTsKCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIixkcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGspOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7CgkJd2hpbGUoMSk7Cgl9CgoKCXsKCQl7CgkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfZHJhbV9pb3ZyZWZfb3JnIik7CgkJCS8vCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9vcmcpOwoJCQlwX3N0cj1nZXRlbnYoc3RyX3RlbXAxKTsKCgkJCWlmKHBfc3RyKQoJCQl7CgkJCQlpb3ZyZWZfb3JnPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfc3RyLCAmZW5kcCwgMCk7CgkJCX0KCgoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX2xlZiIpOwoJCQkvL3NwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9sZWYpOwoJCQlwX3N0cj1nZXRlbnYoc3RyX3RlbXAxKTsKCgkJCWlmKHBfc3RyKQoJCQl7CgkJCQlpb3ZyZWZfbGVmPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfc3RyLCAmZW5kcCwgMCk7CgkJCX0KCgoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX3JpZyIpOwoJCQkvL3NwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9yaWcpOwoJCQlwX3N0cj1nZXRlbnYoc3RyX3RlbXAxKTsKCgkJCWlmKHBfc3RyKQoJCQl7CgkJCQlpb3ZyZWZfcmlnPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfc3RyLCAmZW5kcCwgMCk7CgkJCX0KCgkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfZHJhbV92cmVmX3JhbmdlIik7CgkJCS8vc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsdnJlZl9kcmFtX3JhbmdlKTsKCQkJcF9zdHI9Z2V0ZW52KHN0cl90ZW1wMSk7CgoKCQkJaWYocF9zdHIpCgkJCXsKCQkJCXZyZWZfZHJhbV9yYW5nZT0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX3N0ciwgJmVuZHAsIDApOwoJCQl9CgoJCX0KCgkJaWYodnJlZl9kcmFtX3JhbmdlfGlvdnJlZl9yaWd8aW92cmVmX29yZ3xpb3ZyZWZfbGVmKQoJCXsKCQkJcHJpbnRmKCJcblxuZHJhbSAgaW92cmVmIHRlc3QgY2xrPT0lZFxuIixkcmFtX2lvdnJlZl90ZXN0X2Rkcl9jbGspOwoJCQlpb3ZyZWZfbWlkPShpb3ZyZWZfbGVmK2lvdnJlZl9yaWcpLzI7CgkJCWlmICh2cmVmX2RyYW1fcmFuZ2UgPT0gMCkKCQkJewoJCQkJcHJpbnRmKCJpb3ZyZWZfb3JnPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfbGVmPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfcmlnPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfbWlkMHglMDh4LCUwOGRtVlxuIiwKCQkJCQkJaW92cmVmX29yZywoKCgoKChpb3ZyZWZfb3JnJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9sZWYsKCgoKCgoaW92cmVmX2xlZiYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSwKCQkJCQkJaW92cmVmX3JpZywoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9taWQsKCgoKCgoaW92cmVmX21pZCYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSk7CgkJCX0KCQkJaWYgKHZyZWZfZHJhbV9yYW5nZSkKCQkJewoJCQkJcHJpbnRmKCJpb3ZyZWZfb3JnPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfbGVmPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfcmlnPT0weCUwOHgsJTA4ZG1WfHxpb3ZyZWZfbWlkMHglMDh4LCUwOGRtVlxuIiwKCQkJCQkJaW92cmVmX29yZywoKCgoKChpb3ZyZWZfb3JnJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9sZWYsKCgoKCgoaW92cmVmX2xlZiYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSwKCQkJCQkJaW92cmVmX3JpZywoKCgoKChpb3ZyZWZfcmlnJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9taWQsKCgoKCgoaW92cmVmX21pZCYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSk7CgkJCX0KCQkJaWYgKGlvdnJlZl9yaWcgPT0gMHgzMikKCQkJewoJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgcmlnIHJlYWNoIHJlZyBtYXhcbiIpOwoJCQl9CgkJCWlmIChpb3ZyZWZfcmlnID09IDB4MCkKCQkJewoJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgbGVmIHJlYWNoIHJlZyBtaW5cbiIpOwoJCQl9CgkJCXByaW50ZigiXG5cbiBwcmludGYgZHJhbSB2cmVmIGZyb20gZW52ICxpZiByZW1lYXN1cmUgc2hvdWxkIGNsZWFyIGRkcl9kcmFtX2lvdnJlZl9vcmcgZW52ICBkZHJfZHJhbV9pb3ZyZWZfbGVmIFwKCQkJCQlkZHJfZHJhbV9pb3ZyZWZfcmlnIGRkcl9kcmFtX3ZyZWZfcmFuZ2UsZGRyX2RyYW1faW92cmVmX3Rlc3RfZGRyX2NsayBcbiIpOwoJCQlyZXR1cm4gMTsKCQl9CgoJfQoKCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7Cgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyAgdmFsdWUKCgoKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKCQkJCX0KCgoKCgkJCX0KCgkJCXsKCgojZGVmaW5lIHdycl9yZWcoYWRkciwgZGF0YSkJKCooKHZvbGF0aWxlICB1bnNpZ25lZCBpbnQgICopKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQgKWFkZHIpKSk9KGRhdGEpICAvL3dyX3JlZyhhZGRyLCBkYXRhKQojZGVmaW5lIHJkcl9yZWcoYWRkcikJCSAodW5zaWduZWQgaW50ICkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKSAgLy9yZF9yZWcoYWRkcikKCQkJCXVuc2lnbmVkIGludCAgIGR4bm1kbHI9MDsKCQkJCXJlZ19hZGQ9RERSMF9QVUJfRFgwTURMUjArcmVnX2Jhc2VfYWRqOwoJCQkJZHhubWRscj0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCkpPj4xNikmMHgxZmY7CgkJCQkvLwlyZWdfc2VlZF92YWx1ZT0odHJhaW5pbmdfc2VlZHwoMHgwPDw4KXwoMHgwPDwxNil8KDB4MDw8MjQpKTsKCQkJCXByaW50ZigiXG5keG5tZGxyPT0weCUwOHhcbiAiLGR4bm1kbHIpOwoJCQkJLy90dXJuIG9mZiBkZHI0IHBoeSByZWFkIHZyZWYgZ2F0ZSxvbmx5IG91dHB1dCBhYyBsYW5lIHZyZWYKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgwR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYMUdDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDJHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgzR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0lPVkNSMCkpKSwweDAwMDkwOTA5fCgweDBmPDwyNCkpOwoJCQkJd3JyX3JlZygoKChERFIwX1BVQl9JT1ZDUjEpKSksMHgxMDkpOwoJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYMEdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkpOwoJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYMUdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUdDUjQpKSkpOwoJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYMkdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkdDUjQpKSkpOwoJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYM0dDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkpOwoJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0lPVkNSMD09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfSU9WQ1IwKSkpKTsKCQkJCXByaW50ZigiXG5ERFIwX1BVQl9JT1ZDUjE9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMSkpKSk7CgkJCQl1bnNpZ25lZCBpbnQgICB0ZW1wX2k9MDsKCQkJCS8vdW5zaWduZWQgaW50ICAgdGVtcF9pX21heD00Oy8vRERSMF9QVUJfTVI2CgkJCQlmb3IgKCggIHRlbXBfaT0wKTsodGVtcF9pPDQpOyggdGVtcF9pKyspKQoJCQkJewoJCQkJCWR4bmxjZGxyMVt0ZW1wX2ldPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikrdGVtcF9pKihERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSkpKTsKCgkJCQkJcHJpbnRmKCJcbnJlZz09MHglMDh4LGR4bmxjZGxyMVslMDh4XT09MHglMDh4XG4gIiwKCQkJCQkJCSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikrdGVtcF9pKihERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSksCgkJCQkJCQl0ZW1wX2ksZHhubGNkbHIxW3RlbXBfaV0pOwoKCQkJCX0KCgkJCQlpb3ZyZWZfdGVzdF9yZWFkPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwR0NSNikpKSkmMHgzZjsKCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjYpKTsKCQkJCWlmICgoaW92cmVmX3RlbXBfdmFsdWUmMHgzZikgPT0gMHgwOSkKCQkJCXsKCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfTVI2KSkpJjB4M2Y7OwoJCQkJCWlvdnJlZl90ZXN0X3JlYWQ9aW92cmVmX3RlbXBfdmFsdWU7CgkJCQl9CgkJCQlpb3ZyZWZfb3JnPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSkmMHhmZjsKCgoJCQkJcHJpbnRmKCJQUkVHX1NUSUNLWV9SRUc3PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSkpOwoJCQkJcHJpbnRmKCJERFIwX1BVQl9NUjY9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9NUjYpKSkpKTsKCQkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSNj09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpKTsKCQkJCWlmICgoKGlvdnJlZl9vcmcpID09IDApIHx8ICh0ZXN0X2NsZWFyKSkKCQkJCXsKCgoKCQkJCQlpb3ZyZWZfb3JnPWlvdnJlZl90ZW1wX3ZhbHVlJjB4M2Y7CgkJCQkJaW92cmVmX2xlZj1pb3ZyZWZfb3JnOwoJCQkJCWlvdnJlZl9yaWc9aW92cmVmX29yZzsKCQkJCQlpb3ZyZWZfdGVzdF9zdGVwPTA7CgoJCQkJCWlmICh0cmFpbmluZ19zZWVkKQoJCQkJCXsKCQkJCQkJaW92cmVmX29yZz10cmFpbmluZ19zZWVkJjB4M2Y7CgkJCQkJCWlvdnJlZl9sZWY9aW92cmVmX29yZzsKCQkJCQkJaW92cmVmX3JpZz1pb3ZyZWZfb3JnOwoJCQkJCQlpb3ZyZWZfdGVzdF9zdGVwPTA7CgoJCQkJCX0KCQkJCQlpZiAodnJlZl9kcmFtX3JhbmdlID09IDApCgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSk7CgkJCQkJZWxzZQoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICB0cmFpbmluZ19zZWVkICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLHRyYWluaW5nX3NlZWQsKCgoKCh0cmFpbmluZ19zZWVkJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpOwoJCQkJCXdycl9yZWcoKFBSRUdfU1RJQ0tZX1JFRzcpLGlvdnJlZl9vcmd8KGlvdnJlZl9sZWY8PDgpfCgoaW92cmVmX3JpZzw8MTYpKXwoaW92cmVmX3Rlc3Rfc3RlcDw8MjQpKTsKCQkJCX0KCgkJCQlwcmludGYoIlBSRUdfU1RJQ0tZX1JFRzc9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKSk7CgkJCQl7CgkJCQkJaWYgKCgoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9NUjYpKSkpPj42KSYxKSA9PSAwKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJyZWdfYWRkPT0weCUwOHgsdmFsdWU9PTB4JTA4eCwgaW92cmVmICBvcmcgPT0weCUwOHggICAlMDhkbVZcbiIsRERSMF9QVUJfTVI2LAoJCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlLGlvdnJlZl9vcmcsKCgoKCgoaW92cmVmX29yZyYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSk7CgkJCQkJCXByaW50ZigicmVnX2FkZD09MHglMDh4LHZhbHVlPT0weCUwOHgsIGlvdnJlZl9keDBnY3I2ID09MHglMDh4ICAgJTA4ZG1WXG4iLEREUjBfUFVCX0RYMEdDUjYsCgkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSwocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpLAoJCQkJCQkJCSgoKCgoKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwR0NSNikpKSkmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSkpOwoKCQkJCQl9CgkJCQkJaWYgKCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX01SNikpKSk+PjYpJjEpCgkJCQkJewoJCQkJCQlwcmludGYoInJlZ19hZGQ9PTB4JTA4eCx2YWx1ZT09MHglMDh4LCBpb3ZyZWYgIG9yZyA9PTB4JTA4eCAgICUwOGRtVlxuIixERFIwX1BVQl9NUjYsCgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWUsaW92cmVmX29yZywoKCgoKChpb3ZyZWZfb3JnJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpKTsKCQkJCQkJcHJpbnRmKCJyZWdfYWRkPT0weCUwOHgsdmFsdWU9PTB4JTA4eCwgaW92cmVmX2R4MGdjcjYgPT0weCUwOHggICAlMDhkbVZcbiIsRERSMF9QVUJfRFgwR0NSNiwKCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMEdDUjYpKSkpLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwR0NSNikpKSksCgkJCQkJCQkJKCgoKCgoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBHQ1I2KSkpKSYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSk7CgoJCQkJCX0KCgkJCQl9CgoJCQkJaW92cmVmX29yZz0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzcpKSkpJjB4M2Y7ICAvLwoJCQkJaW92cmVmX2xlZj0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKT4+OCkmMHgzZjsKCQkJCWlvdnJlZl9yaWc9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSk+PjE2KSYweDNmOwoJCQkJaW92cmVmX3Rlc3Rfc3RlcD0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKT4+MjQpJjB4M2Y7CgoKCgkJCQlwcmludGYoIlxudHJhaW5pbmdfc3RlcD09MHglMDh4XG4gIix0cmFpbmluZ19zdGVwKTsKCQkJCXByaW50ZigiXG5pb3ZyZWZfdGVzdF9zdGVwPT0weCUwOHhcbiAiLGlvdnJlZl90ZXN0X3N0ZXApOwoJCQkJcHJpbnRmKCJcbmlvdnJlZl9sZWY9PTB4JTA4eFxuICIsaW92cmVmX2xlZik7CgkJCQlwcmludGYoIlxuaW92cmVmX3JpZz09MHglMDh4XG4gIixpb3ZyZWZfcmlnKTsKCQkJCWlmICh2cmVmX3NldF90ZXN0X3N0ZXApCgkJCQl7aWYoaW92cmVmX3Rlc3Rfc3RlcD09MCkKCQkJCQlpb3ZyZWZfdGVzdF9zdGVwPXZyZWZfc2V0X3Rlc3Rfc3RlcDsKCQkJCX0KCQkJCWlmIChpb3ZyZWZfdGVzdF9zdGVwPDIpCgkJCQl7CgkJCQkJaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPT0gMCkKCQkJCQl7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9sZWY7CgoJCQkJCX0KCQkJCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA9PSAxKQoJCQkJCXsKCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3JpZzsKCQkJCQl9CgkJCQkJLy9pb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfbGVmLXRyYWluaW5nX3N0ZXA7CgkJCQkJcHJpbnRmKCJcbmlvdnJlZiAgdGVtcD09MHglMDh4XG4gIixpb3ZyZWZfdGVtcF92YWx1ZSk7CgkJCQkJcHJpbnRmKCJcbmlvdnJlZl90ZXN0X3JlYWQ9PTB4JTA4eFxuICIsaW92cmVmX3Rlc3RfcmVhZCk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJaWYgKChpb3ZyZWZfb3JnID09IGlvdnJlZl9sZWYpICYmIChpb3ZyZWZfb3JnID09IGlvdnJlZl9yaWcpKSB7CgkJCQkJCXByaW50ZigiXG5maXJzdCB0ZXN0Iik7CgkJCQkJfQoJCQkJCWVsc2UgaWYoaW92cmVmX3Rlc3RfcmVhZCE9aW92cmVmX3RlbXBfdmFsdWUpCgkJCQkJe3RlbXBfdGVzdF9lcnJvcj0xOwoJCQkJCX0KCgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHdhdGNoZG9nX3RpbWVfcyk7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQl7CgkJCQkJCXsKCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQkJewoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQkJLy8JLyoKCQkJCQkJewoJCQkJCQkJewoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgoJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQl7CgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVswXSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzJdKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVszXSk7ICAvLwoKCQkJCQkJCQl9CgkJCQkJCQl9CgoKCQkJCQkJfQoJCQkJCQkvLyovCgkJCQkJfQoKCgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXByaW50ZigiXG52cmVmICBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA9PSAwKQoJCQkJCQl7CgoJCQkJCQkJaW92cmVmX2xlZj0oKGlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXApPDB4MzIpPygoaW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcCkpOigweDMyKTsKCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9vcmc7CgkJCQkJCX0KCQkJCQkJaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPT0gMSkKCQkJCQkJewoKCQkJCQkJCWlvdnJlZl9yaWc9KGlvdnJlZl90ZW1wX3ZhbHVlPnRyYWluaW5nX3N0ZXApPygoaW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcCkpOigwKTsKCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9vcmc7CgkJCQkJCX0KCQkJCQkJaW92cmVmX3Rlc3Rfc3RlcCsrOwoJCQkJCQkvLwlicmVhazsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbmlvdnJlZl9sZWYxPSV4XG4iLGlvdnJlZl9sZWYpOwoJCQkJCQlwcmludGYoIlxuaW92cmVmX3Rlc3Rfc3RlcD0leFxuIixpb3ZyZWZfdGVzdF9zdGVwKTsKCQkJCQkJaWYgKGlvdnJlZl90ZXN0X3N0ZXAgPT0gMCkKCQkJCQkJewoJCQkJCQkJcHJpbnRmKCJcbmlvdnJlZl9sZWYxXzI9JXhcbiIsKGlvdnJlZl90ZW1wX3ZhbHVlLXRyYWluaW5nX3N0ZXApKTsKCQkJCQkJCWlvdnJlZl9sZWY9KGlvdnJlZl90ZW1wX3ZhbHVlPnRyYWluaW5nX3N0ZXApPygoaW92cmVmX3RlbXBfdmFsdWUtdHJhaW5pbmdfc3RlcCkpOigwKTsKCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl9sZWY7CgkJCQkJCQlpZiAoaW92cmVmX2xlZiA9PSAwKQoJCQkJCQkJewoJCQkJCQkJCWlvdnJlZl90ZXN0X3N0ZXArKzsKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfb3JnOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmIChpb3ZyZWZfdGVzdF9zdGVwID09IDEpCgkJCQkJCXsKCQkJCQkJCWlvdnJlZl9yaWc9KChpb3ZyZWZfdGVtcF92YWx1ZSt0cmFpbmluZ19zdGVwKTwweDMyKT8oaW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcCk6KDB4MzIpOwoJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3JpZzsKCQkJCQkJCWlmIChpb3ZyZWZfcmlnID09IDB4MzIpCgkJCQkJCQkJaW92cmVmX3Rlc3Rfc3RlcCsrOwoJCQkJCQl9CgkJCQkJCXByaW50ZigiXG5pb3ZyZWZfbGVmMj0leFxuIixpb3ZyZWZfbGVmKTsKCQkJCQl9CgkJCQkJewoKCgkJCQkJCXdycl9yZWcoKFBSRUdfU1RJQ0tZX1JFRzcpLGlvdnJlZl9vcmd8KGlvdnJlZl9sZWY8PDgpfCgoaW92cmVmX3JpZzw8MTYpKXwoaW92cmVmX3Rlc3Rfc3RlcDw8MjQpKTsKCQkJCQkJcHJpbnRmKCJcbmRkcjRyYW0gdnJlZiB0ZXN0IHdpbGwgcmVib290IHVzZSBuZXcgZHJhbSB2cmVmIHNldHRpbmc9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKFBSRUdfU1RJQ0tZX1JFRzcpKSkpOwoJCQkJCQljaGFyIHN0clsxMDBdOwoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAgMHgleCIsZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrLGlvdnJlZl90ZW1wX3ZhbHVlfCgodnJlZl9kcmFtX3JhbmdlJjEpPDw2KSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQkvL3J1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxNyAxMTAwIDAgMCAweHNvYyAweGRyYW0gIiwwKTsvLwoJCQkJCX0KCQkJCX0KCgkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7CgkJCQlpZiAoaW92cmVmX3Rlc3Rfc3RlcCA+PSAyKQoJCQkJewoJCQkJCXByaW50ZigiXG5cbmRyYW0gIGlvdnJlZiB0ZXN0IGNsaz09JWRcbiIsZHJhbV9pb3ZyZWZfdGVzdF9kZHJfY2xrKTsKCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICB2ZGRxPTEuMnYsaWYgdXNlIG90aGVyIHZkZHEgLHBsZWFzZSByZWNvdW50XG4iKTsKCQkJCQlwcmludGYoIlxuZGRyNHJhbSB2cmVmIHRlc3QgZmluaXNoIGlvdnJlZl90ZXN0X3N0ZXA9PTB4JTA4eFxuICIsaW92cmVmX3Rlc3Rfc3RlcCk7CgkJCQkJaW92cmVmX29yZz0ocmRyX3JlZygodW5zaWduZWQgaW50ICkoKFBSRUdfU1RJQ0tZX1JFRzcpKSkpJjB4M2Y7ICAvLwoJCQkJCWlvdnJlZl9sZWY9KChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoUFJFR19TVElDS1lfUkVHNykpKSk+PjgpJjB4M2Y7CgkJCQkJaW92cmVmX3JpZz0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKT4+MTYpJjB4M2Y7CgkJCQkJaW92cmVmX3Rlc3Rfc3RlcD0oKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChQUkVHX1NUSUNLWV9SRUc3KSkpKT4+MjQpJjB4M2Y7CgkJCQkJaW92cmVmX21pZD0oaW92cmVmX2xlZitpb3ZyZWZfcmlnKS8yOwoJCQkJCWlmICh2cmVmX2RyYW1fcmFuZ2UgPT0gMCkKCQkJCQl7CgkJCQkJCXByaW50ZigiaW92cmVmX29yZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX2xlZj09MHglMDh4LCUwOGRtVnx8aW92cmVmX3JpZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX21pZDB4JTA4eCwlMDhkbVZcbiIsCgkJCQkJCQkJaW92cmVmX29yZywoKCgoKChpb3ZyZWZfb3JnJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9sZWYsKCgoKCgoaW92cmVmX2xlZiYwWDNGKSo2NSkrNjAwMCkqMTIwMCkvMTAwMDApKSwKCQkJCQkJCQlpb3ZyZWZfcmlnLCgoKCgoKGlvdnJlZl9yaWcmMFgzRikqNjUpKzYwMDApKjEyMDApLzEwMDAwKSksaW92cmVmX21pZCwoKCgoKChpb3ZyZWZfbWlkJjBYM0YpKjY1KSs2MDAwKSoxMjAwKS8xMDAwMCkpKTsKCQkJCQl9CgkJCQkJaWYgKHZyZWZfZHJhbV9yYW5nZSkKCQkJCQl7CgkJCQkJCXByaW50ZigiaW92cmVmX29yZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX2xlZj09MHglMDh4LCUwOGRtVnx8aW92cmVmX3JpZz09MHglMDh4LCUwOGRtVnx8aW92cmVmX21pZDB4JTA4eCwlMDhkbVZcbiIsCgkJCQkJCQkJaW92cmVmX29yZywoKCgoKChpb3ZyZWZfb3JnJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpLGlvdnJlZl9sZWYsKCgoKCgoaW92cmVmX2xlZiYwWDNGKSo2NSkrNDUwMCkqMTIwMCkvMTAwMDApKSwKCQkJCQkJCQlpb3ZyZWZfcmlnLCgoKCgoKGlvdnJlZl9yaWcmMFgzRikqNjUpKzQ1MDApKjEyMDApLzEwMDAwKSksaW92cmVmX21pZCwoKCgoKChpb3ZyZWZfbWlkJjBYM0YpKjY1KSs0NTAwKSoxMjAwKS8xMDAwMCkpKTsKCQkJCQl9CgkJCQkJaWYgKGlvdnJlZl9yaWcgPT0gMHgzMikKCQkJCQl7CgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgIHJpZyByZWFjaCByZWcgbWF4XG4iKTsKCQkJCQl9CgkJCQkJaWYgKGlvdnJlZl9yaWcgPT0gMHgwKQoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgbGVmIHJlYWNoIHJlZyBtaW5cbiIpOwoJCQkJCX0KCQkJCQkvL2NoYXIgc3RyMlsxMDBdOwoJCQkJCS8vc3ByaW50ZihzdHIyLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCAweCV4IixnbG9iYWxfZGRyX2Nsayxpb3ZyZWZfb3JnKTsKCQkJCQkvL3ByaW50ZigiXG5zdHIyPSVzXG4iLHN0cjIpOwoJCQkJCS8vcnVuX2NvbW1hbmQoc3RyMiwwKTsKCQkJCQl7CgkJCQkJCXsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfZHJhbV9pb3ZyZWZfb3JnIik7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iixpb3ZyZWZfb3JnKTsKCQkJCQkJCXNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCX0KCQkJCQkJewoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl9kcmFtX2lvdnJlZl9sZWYiKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLGlvdnJlZl9sZWYpOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCQl7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX2RyYW1faW92cmVmX3JpZyIpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsaW92cmVmX3JpZyk7CgkJCQkJCQlzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl9CgkJCQkJCXsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfZHJhbV92cmVmX3JhbmdlIik7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4Iix2cmVmX2RyYW1fcmFuZ2UpOwoJCQkJCQkJc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJfQoJCQkJCX0KCgoKCgoKCgoKCgoKCgoKCgoKCgkJCQl9CgoKCgkJCX0KCgoKCgoKCQl9CgoJfQoKCgoKCXJldHVybiAwOwoKdXNhZ2U6CgljbWRfdXNhZ2UoY21kdHApOwojZW5kaWYKCXJldHVybiAxOwoKfQoKI2VuZGlmCmludCBkb19kZHI0X3Rlc3RfZHJhbV9hY192cmVmKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCgkvLy8qCgkvLyB1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHI9dGVzdF9zdGFydF9hZGRyOwoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyNCBwaHlfYWMgb3IgZGRyMyBkcmFtIGRhdGEgdnJlZiBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoJLy8gIHVuc2lnbmVkIGludCAgIGxvb3AgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2kgPSAxOwoJLy8gICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2o9IDE7CgkvLyAgICB1bnNpZ25lZCBpbnQgICB0ZW1wX2NvdW50X2s9IDE7Cgl1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I9IDA7CglpbnQgdHJhaW5pbmdfc2VlZD0wOwoJaW50IHRyYWluaW5nX3N0ZXA9MDsKCgljaGFyICplbmRwOwoJLy8gIHVuc2lnbmVkIGludCAgICpwX3N0YXJ0X2FkZHI7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X2RyYW1fYWNfZGF0YT0wOwoJLy8gIHVuc2lnbmVkIGludCAgIHRlc3RfdGltZXM9MTsKCXVuc2lnbmVkIGludCAgIHJlZ19hZGQ9MDsKCXVuc2lnbmVkIGludCAgIHJlZ19iYXNlX2Fkaj0wOwoJdW5zaWduZWQgaW50ICAgY2hhbm5lbF9hX2VuID0gMDsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYl9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0aW5nX2NoYW5uZWwgPSAwOwoJdW5zaWduZWQgaW50ICAgZHhubGNkbHIxWzRdOwoJLy8gdW5zaWduZWQgaW50ICAgZHhubGNkbHI0WzRdOwoKCiNkZWZpbmUgIENIQU5ORUxfQSAgMAojZGVmaW5lICBDSEFOTkVMX0IgIDEKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCS8vICAgI2RlZmluZSBERFIwX1BVQl9SRUdfQkFTRQkJCQkJMHhjODgzNjAwMAojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjQgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I0ICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDIwNCAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDJHQ1I0ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyNDQgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgzR0NSNCAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4Mjg0ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYMEdDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDFjNSAgPDwgMiApICkKI2RlZmluZSBERFIwX1BVQl9EWDFHQ1I1ICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgyMDUgIDw8IDIgKSApCiNkZWZpbmUgRERSMF9QVUJfRFgyR0NSNSAgICAgICggRERSMF9QVUJfUkVHX0JBU0UgKyAoIDB4MjQ1ICA8PCAyICkgKQojZGVmaW5lIEREUjBfUFVCX0RYM0dDUjUgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDI4NSAgPDwgMiApICkKCgkvLyNkZWZpbmUgRERSMF9QVUJfSU9WQ1IwICAgICAgICAoIEREUjBfUFVCX1JFR19CQVNFICsgKCAweDE0OCA8PCAyICkgKSAvLyBSL1cgLSBJTyBWUkVGIENvbnRyb2wgUmVnaXN0ZXIgMAoJLy8jZGVmaW5lIEREUjBfUFVCX0lPVkNSMSAgICAgICAgKCBERFIwX1BVQl9SRUdfQkFTRSArICggMHgxNDkgPDwgMiApICkgLy8gUi9XIC0gSU8gVlJFRiBDb250cm9sIFJlZ2lzdGVyIDEKCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoKCS8vICAgdW5zaWduZWQgaW50ICAgYWNfYmRscl9sZWZbMTBdOwoJLy8gICB1bnNpZ25lZCBpbnQgICBhY19iZGxyX3JpZ1sxMF07CglpbnQgICBpb3ZyZWZfdGVtcF92YWx1ZTsKCS8vICAgIGludCAgIGlvdnJlZl90ZW1wX3JlZ192YWx1ZTsKCS8vICAgIHVuc2lnbmVkIGludCAgcmVnX3NlZWRfdmFsdWU7CgkvLwkgICB1bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZTsKCWludCAgIGlvdnJlZl9vcmc7CglpbnQgICBpb3ZyZWZfbGVmOwoJaW50ICAgaW92cmVmX3JpZzsKCS8vICB1bnNpZ25lZCBpbnQgICB0ZW1wX3Rlc3RfZXJyb3I7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9pPTA7CgkvLwl1bnNpZ25lZCBpbnQgdGVtcF9qPTA7CgkvL3Vuc2lnbmVkIGludCByZWdfYWRkPTA7CgkvLwkJc3RhdGljIHVuc2lnbmVkIGludCB0cmFpbmluZ19lbmFibGVkPTE7CgoJLy8JIGlvdnJlZl9sZWY9MHg0OTsKCS8vIHByaW50ZigiXG5cbiBpb3ZyZWYgIG9yZyAgICAgICAgICAgICAgICAgICAgID09MHglMDh4ICAgJTA4ZG1WXG4iLGlvdnJlZl9sZWYsKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSk7CgkvLyNkZWZpbmUgRERSX1RFU1RfQUNMQ0RMUgoKCglpZiAoYXJnYyA9PSAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApKQoJCQljaGFubmVsX2FfZW4gPSAxOwoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgkJCWNoYW5uZWxfYl9lbiA9IDE7CgkJZWxzZQoJCQlnb3RvIHVzYWdlOwoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgkJCWNoYW5uZWxfYV9lbiA9IDE7CgkJaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzJdLCAiQiIpID09IDApKQoJCQljaGFubmVsX2JfZW4gPSAxOwoJfQoJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWlmIChhcmdjID4zKSB7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9CgoJfQoJaWYgKGFyZ2MgPjQpIHsKCQl0ZXN0X2RyYW1fYWNfZGF0YSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdGVzdF9kcmFtX2FjX2RhdGEgPSAwOwoJCX0KCQlpZiAoICB0ZXN0X2RyYW1fYWNfZGF0YSApCgkJCXRlc3RfZHJhbV9hY19kYXRhID0gMTsKCgl9Cgl0cmFpbmluZ19zZWVkID0gMDsKCWlmIChhcmdjID41KSB7CgkJdHJhaW5pbmdfc2VlZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCX0KCgoJfQoKCgl0cmFpbmluZ19zdGVwID0gMDsKCWlmIChhcmdjID42KSB7CgkJdHJhaW5pbmdfc3RlcCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJdHJhaW5pbmdfc3RlcCA9IDA7CgkJfQoKCgoJfQoJaW50IHZyZWZfYWxsPTA7CglpZiAoYXJnYyA+NykgewoJCXZyZWZfYWxsID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl2cmVmX2FsbCA9MDsvLyAweDJlOwoJCX19CglpbnQgdnJlZl9sY2Rscl9vZmZzZXQ9MDsKCWlmIChhcmdjID44KSB7CgkJdnJlZl9sY2Rscl9vZmZzZXQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOF0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXZyZWZfbGNkbHJfb2Zmc2V0ID0wOwoJCX19CglpbnQgc29jX2RyYW1faGV4X2RlYz0wOwoJaWYgKGFyZ2MgPjkpCgl7CgkJc29jX2RyYW1faGV4X2RlYyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls5XSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXNvY19kcmFtX2hleF9kZWMgPSAwOwoJCX0KCX0KCWlmICh0cmFpbmluZ19zZWVkID09MCkgLy8gMHgyZTsKCXt0cmFpbmluZ19zZWVkPTB4OTsKCX0KCWlmIChzb2NfZHJhbV9oZXhfZGVjKQoJewoJCWlmIChhcmdjID41KSB7CgkJCXRyYWluaW5nX3NlZWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdHJhaW5pbmdfc2VlZCA9MDsvLyAweDJlOwoJCQl9CgoKCQl9CgkJaWYgKHRyYWluaW5nX3NlZWQgPT0wKSAvLyAweDJlOwoJCXt0cmFpbmluZ19zZWVkPTUwOwoJCX0KCQlpZiAodHJhaW5pbmdfc2VlZDw0NSkKCQkJdHJhaW5pbmdfc2VlZD00NTsKCQlpZiAodHJhaW5pbmdfc2VlZD44OCkKCQkJdHJhaW5pbmdfc2VlZD04ODsKCQl0cmFpbmluZ19zZWVkID0oKCh0cmFpbmluZ19zZWVkKjEwMDAtNDQwNzApLzY5OCkpOwoKCX0KCgoKCXByaW50ZigiXG5cbiBpb3ZyZWYgIHRyYWluaW5nX3NlZWQgICAgICAgICAgICAgPT0weCUwOHggICAlMDhkbVZcbiIsdHJhaW5pbmdfc2VlZCwoKCgoKHRyYWluaW5nX3NlZWQmMFgzRikqNykrNDQwKSozKS8yKSsxKTsKCXByaW50ZigiXG5jaGFubmVsX2FfZW49PSAweCUwOHhcbiIsIGNoYW5uZWxfYV9lbik7CglwcmludGYoIlxuY2hhbm5lbF9iX2VuPT0gMHglMDh4XG4iLCBjaGFubmVsX2JfZW4pOwoJcHJpbnRmKCJcbmRkcl90ZXN0X3NpemU9PSAweCUwOHhcbiIsIGRkcl90ZXN0X3NpemUpOwoJcHJpbnRmKCJcbnRlc3RfZHJhbV9hY19kYXRhPT0gMHglMDh4XG4iLCB0ZXN0X2RyYW1fYWNfZGF0YSk7CglwcmludGYoIlxudnJlZl9hbGw9PSAweCUwOHhcbiIsIHZyZWZfYWxsKTsKCXByaW50ZigiXG52cmVmX2xjZGxyX29mZnNldD09IDB4JTA4eFxuIiwgdnJlZl9sY2Rscl9vZmZzZXQpOwoJaWYgKCBjaGFubmVsX2FfZW4pCgl7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCQlPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7Cgl9CglpZiAoIGNoYW5uZWxfYl9lbikKCXsKCQlPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCX0KCgkvL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyBkcXMgdmFsdWUKCWlmIChjaGFubmVsX2FfZW4gfHwgY2hhbm5lbF9iX2VuKQoJewoJCS8vZGNhY2hlX2Rpc2FibGUoKTsKCQkvL3NlcmlhbF9wdXRzKCJcbmRlYnVnIGZvciBkZHJ0ZXN0ICxqaWF4aW5nIGRpc2FibGUgZGNhY2hlIik7Cgl9Ly8vL3NhdmUgYW5kIHByaW50IG9yZyB0cmFpbmluZyAgdmFsdWUKCgoKCXsKCQkvLy8vdHVuZSBhbmQgc2F2ZSB0cmFpbmluZyBkcXMgdmFsdWUKCQlpZiAoY2hhbm5lbF9hX2VuIHx8IGNoYW5uZWxfYl9lbikKCgkJewoJCQlmb3IgKCh0ZXN0aW5nX2NoYW5uZWw9MCk7KHRlc3RpbmdfY2hhbm5lbDwoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbikpOyh0ZXN0aW5nX2NoYW5uZWwrKykpCgkJCXsKCgkJCQlpZiAoKCBjaGFubmVsX2FfZW4pICYmICggY2hhbm5lbF9iX2VuID09IDApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0FfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmKCggY2hhbm5lbF9iX2VuKSYmKCBjaGFubmVsX2FfZW49PTApKQoJCQkJewoJCQkJCXJlZ19iYXNlX2Fkaj1DSEFOTkVMX0JfUkVHX0JBU0U7CgkJCQl9CgkJCQllbHNlIGlmICgoY2hhbm5lbF9hX2VuK2NoYW5uZWxfYl9lbik9PTIpCgkJCQl7CgkJCQkJaWYgKCB0ZXN0aW5nX2NoYW5uZWwgPT0gQ0hBTk5FTF9BKQoJCQkJCXsKCQkJCQkJcmVnX2Jhc2VfYWRqPUNIQU5ORUxfQV9SRUdfQkFTRTsKCQkJCQl9CgkJCQkJZWxzZSBpZiggdGVzdGluZ19jaGFubmVsPT1DSEFOTkVMX0IpCgkJCQkJewoJCQkJCQlyZWdfYmFzZV9hZGo9Q0hBTk5FTF9CX1JFR19CQVNFOwoJCQkJCX0KCQkJCX0KCgkJCQlpZiAocmVnX2Jhc2VfYWRqID09IENIQU5ORUxfQV9SRUdfQkFTRSkKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBBIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwcmludGYoIlxudGVzdCBCIGNoYW5uZWwgZGF0YSBsYW5lXG4iKTsKCQkJCX0KCgoJCQkJewoKCiNkZWZpbmUgd3JyX3JlZyhhZGRyLCBkYXRhKQkoKigodm9sYXRpbGUgIHVuc2lnbmVkIGludCAgKikoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGludCApYWRkcikpKT0oZGF0YSkgIC8vd3JfcmVnKGFkZHIsIGRhdGEpCiNkZWZpbmUgcmRyX3JlZyhhZGRyKQkJICh1bnNpZ25lZCBpbnQgKSgqKCh2b2xhdGlsZSAgdW5zaWduZWQgaW50ICAqKSgodW5zaWduZWQgbG9uZykodW5zaWduZWQgaW50IClhZGRyKSkpICAvL3JkX3JlZyhhZGRyKQoJCQkJCXVuc2lnbmVkIGludCAgIGR4bm1kbHI9MDsKCQkJCQlyZWdfYWRkPUREUjBfUFVCX0RYME1ETFIwK3JlZ19iYXNlX2FkajsKCQkJCQlkeG5tZGxyPSgocmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKSk+PjE2KSYweDFmZjsKCQkJCQkvLwlyZWdfc2VlZF92YWx1ZT0odHJhaW5pbmdfc2VlZHwoMHgwPDw4KXwoMHgwPDwxNil8KDB4MDw8MjQpKTsKCQkJCQlwcmludGYoIlxuZHhubWRscj09MHglMDh4XG4gIixkeG5tZGxyKTsKCQkJCQkvL3R1cm4gb2ZmIGRkcjQgcGh5IHJlYWQgdnJlZiBnYXRlLG9ubHkgb3V0cHV0IGFjIGxhbmUgdnJlZgoJCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgwR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQkJd3JyX3JlZygoKChERFIwX1BVQl9EWDFHQ1I0KSkpLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgxR0NSNCkpKSYofigxPDwyOCkpKXwoNzw8MjUpfCgweGY8PDIpKTsKCQkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0RYMkdDUjQpKSksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDJHQ1I0KSkpJih+KDE8PDI4KSkpfCg3PDwyNSl8KDB4Zjw8MikpOwoJCQkJCXdycl9yZWcoKCgoRERSMF9QVUJfRFgzR0NSNCkpKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkmKH4oMTw8MjgpKSl8KDc8PDI1KXwoMHhmPDwyKSk7CgkJCQkJcHJpbnRmKCJcbm9yZyBERFIwX1BVQl9JT1ZDUjA9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMCkpKSk7CgkJCQkJcHJpbnRmKCJcbm9yZyBERFIwX1BVQl9JT1ZDUjE9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMSkpKSk7CgkJCQkJd3JyX3JlZygoKChERFIwX1BVQl9JT1ZDUjApKSksdHJhaW5pbmdfc2VlZHwodHJhaW5pbmdfc2VlZDw8OCl8KHRyYWluaW5nX3NlZWQ8PDE2KXwoMHgxZjw8MjQpKTsKCQkJCQl3cnJfcmVnKCgoKEREUjBfUFVCX0lPVkNSMSkpKSwweDEwOSk7CgkJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYMEdDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMEdDUjQpKSkpOwoJCQkJCXByaW50ZigiXG5ERFIwX1BVQl9EWDFHQ1I0PT0weCUwOHhcbiAiLChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFHQ1I0KSkpKTsKCQkJCQlwcmludGYoIlxuRERSMF9QVUJfRFgyR0NSND09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyR0NSNCkpKSk7CgkJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0RYM0dDUjQ9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYM0dDUjQpKSkpOwoJCQkJCXByaW50ZigiXG5ERFIwX1BVQl9JT1ZDUjA9PTB4JTA4eFxuICIsKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0lPVkNSMCkpKSk7CgkJCQkJcHJpbnRmKCJcbkREUjBfUFVCX0lPVkNSMT09MHglMDh4XG4gIiwocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfSU9WQ1IxKSkpKTsKCQkJCQl1bnNpZ25lZCBpbnQgICB0ZW1wX2k9MDsKCgkJCQkJZm9yICgoICB0ZW1wX2k9MCk7KHRlbXBfaTw0KTsoIHRlbXBfaSsrKSkKCQkJCQl7CgkJCQkJCXsKCQkJCQkJCWR4bmxjZGxyMVt0ZW1wX2ldPShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikrdGVtcF9pKihERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSkpKTsKCgkJCQkJCQlwcmludGYoIlxuZHhubGNkbHIxWyUwOHhdPT0weCUwOHgsZHhubGNkbHIxWyUwOHhdPT0weCUwOHhcbiAiLHRlbXBfaSxkeG5sY2RscjFbdGVtcF9pXSx0ZW1wX2ksZHhubGNkbHIxW3RlbXBfaV0pOwoKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZWdfYWRkPUREUjBfUFVCX0lPVkNSMCtyZWdfYmFzZV9hZGo7CgkJCQkJaW92cmVmX3RlbXBfdmFsdWU9cmRyX3JlZygodW5zaWduZWQgaW50IClyZWdfYWRkKTsKCQkJCQlpb3ZyZWZfb3JnPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoJCQkJCS8vCSBpb3ZyZWZfbGVmPTB4NDk7CgoJCQkJCXsKCQkJCQkJcHJpbnRmKCJyZWdfYWRkPT0weCUwOHgsdmFsdWU9PTB4JTA4eCwgaW92cmVmICBvcmcgPT0weCUwOHggICAlMDhkbVZcbiIscmVnX2FkZCwKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZSxpb3ZyZWZfb3JnLCgoKCgoKGlvdnJlZl90ZW1wX3ZhbHVlJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTUvMTUpOwoJCQkJCX0KCgoJCQkJCXdycl9yZWcoKHJlZ19hZGQpLGlvdnJlZl90ZW1wX3ZhbHVlKTsgIC8vCgkJCQkJaW92cmVmX2xlZj0oaW92cmVmX29yZykmMHhmZjsKCQkJCQlpb3ZyZWZfcmlnPShpb3ZyZWZfb3JnKSYweGZmOwoKCQkJCX0KCgkJCQlwcmludGYoIlxudHJhaW5pbmdfc3RlcD09MHglMDh4XG4gIix0cmFpbmluZ19zdGVwKTsKCgoJCQkJewoKCgoKCgoJCQkJCXsKCgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoKCQkJCQkJd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPjB4MCkKCQkJCQkJewoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwOwoJCQkJCQkJaWYgKGlvdnJlZl90ZW1wX3ZhbHVlPHRyYWluaW5nX3N0ZXApCgkJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9MDsKCQkJCQkJCXByaW50ZigiXG5pb3ZyZWYgbGVmIHRlbXA9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoKCgkJCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwoMHgxZjAwMDAwMHxpb3ZyZWZfdGVtcF92YWx1ZXwoaW92cmVmX3RlbXBfdmFsdWU8PDgpfChpb3ZyZWZfdGVtcF92YWx1ZTw8MTYpKSk7CgoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsKCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJCXsKCQkJCQkJCQl7CgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCgkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoKCQkJCQkJCQkJewoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQkJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCQkJCQkJewoJCQkJCQkJCXsKCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoKCgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoKCQkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgoJCQkJCQkJCQl7CgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzJdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgkJCQkJCQkJCX0KCgkJCQkJCQkJfQoKCQkJCQkJCX0KCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcHJpbnRmKCJcbnZyZWYgZG93biBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPWlvdnJlZl90ZW1wX3ZhbHVlK3RyYWluaW5nX3N0ZXA7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXByaW50ZigiXG4gZG93biBlZGdlIGRldGVjdCBcbiIpOwoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICAgICAgICAgICAgICAgICAgICAgICBkb3duIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQlpb3ZyZWZfbGVmPWlvdnJlZl90ZW1wX3ZhbHVlOwoKCQkJCQkJd3JyX3JlZygocmVnX2FkZCksaW92cmVmX29yZyk7ICAvLwoJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8KCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCgkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgoKCQkJCQl9CgoJCQkJCXsKCgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPXJkcl9yZWcoKHVuc2lnbmVkIGludCApcmVnX2FkZCk7CgkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPSgoaW92cmVmX3RlbXBfdmFsdWUpJjB4ZmYpOwoKCQkJCQkJd2hpbGUgKGlvdnJlZl90ZW1wX3ZhbHVlPDB4M2YpCgkJCQkJCXsKCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCQkJaW92cmVmX3RlbXBfdmFsdWU9aW92cmVmX3RlbXBfdmFsdWUrdHJhaW5pbmdfc3RlcDsKCQkJCQkJCWlmIChpb3ZyZWZfdGVtcF92YWx1ZT4weDNmKQoJCQkJCQkJCWlvdnJlZl90ZW1wX3ZhbHVlPTB4M2Y7CgkJCQkJCQlwcmludGYoIlxuaW92cmVmIHJpZyB0ZW1wPT0weCUwOHhcbiAiLGlvdnJlZl90ZW1wX3ZhbHVlKTsKCgkJCQkJCQl3cnJfcmVnKChyZWdfYWRkKSwoMHgxZjAwMDAwMHxpb3ZyZWZfdGVtcF92YWx1ZXwoaW92cmVmX3RlbXBfdmFsdWU8PDgpfChpb3ZyZWZfdGVtcF92YWx1ZTw8MTYpKSk7CgoJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIscmVnX2FkZCxyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKXJlZ19hZGQpKTsKCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJCWlmICh2cmVmX2xjZGxyX29mZnNldCkKCQkJCQkJCXsKCQkJCQkJCQl7CgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpK3ZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopKSkrdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSt2cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCgoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMExDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYM0xDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCgkJCQkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoKCQkJCQkJCQkJewoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzBdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMV0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzNdKTsgIC8vCgoJCQkJCQkJCQl9CgoJCQkJCQkJCX0KCgkJCQkJCQl9CgoJCQkJCQkJaWYgKHZyZWZfbGNkbHJfb2Zmc2V0KQoJCQkJCQkJewoJCQkJCQkJCXsKCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDFMQ0RMUjErcmVnX2Jhc2VfYWRqKSwoKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSktdnJlZl9sY2Rscl9vZmZzZXQpKTsgIC8vCgkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLCgocmRyX3JlZygodW5zaWduZWQgaW50ICkoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaikpKS12cmVmX2xjZGxyX29mZnNldCkpOyAgLy8KCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaiksKChyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKShERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpLXZyZWZfbGNkbHJfb2Zmc2V0KSk7ICAvLwoKCgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgwTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoJCQkJCQkJCQlwcmludGYoIlxuIHJlZ19hZGQgMHglMDh4PT0gMHglMDh4XG4gIiwoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSwKCQkJCQkJCQkJCQkocmRyX3JlZygodW5zaWduZWQgaW50ICkoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopKSkpKTsKCQkJCQkJCQkJcHJpbnRmKCJcbiByZWdfYWRkIDB4JTA4eD09IDB4JTA4eFxuICIsKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSksCgkJCQkJCQkJCQkJKHJkcl9yZWcoKHVuc2lnbmVkIGludCApKChERFIwX1BVQl9EWDJMQ0RMUjErcmVnX2Jhc2VfYWRqKSkpKSk7CgkJCQkJCQkJCXByaW50ZigiXG4gcmVnX2FkZCAweCUwOHg9PSAweCUwOHhcbiAiLCgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpLAoJCQkJCQkJCQkJCShyZHJfcmVnKCh1bnNpZ25lZCBpbnQgKSgoRERSMF9QVUJfRFgzTENETFIxK3JlZ19iYXNlX2FkaikpKSkpOwoKCQkJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgoJCQkJCQkJCQl7CgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8KCQkJCQkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMUxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsxXSk7ICAvLwoJCQkJCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgyTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzJdKTsgIC8vCgkJCQkJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgkJCQkJCQkJCX0KCgkJCQkJCQkJfQoKCQkJCQkJCX0KCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcHJpbnRmKCJcbnZyZWYgdXAgZWRnZSBkZXRlY3QgXG4iKTsKCQkJCQkJCQlpb3ZyZWZfdGVtcF92YWx1ZT1pb3ZyZWZfdGVtcF92YWx1ZS10cmFpbmluZ19zdGVwOwoJCQkJCQkJCWJyZWFrOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlwcmludGYoIlxuIHVwIGVkZ2UgZGV0ZWN0IFxuIik7CgkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICAgICAgICAgICAgICAgICAgICAgIHVwIGVkZ2U9PTB4JTA4eFxuICIsaW92cmVmX3RlbXBfdmFsdWUpOwoJCQkJCQlpb3ZyZWZfcmlnPWlvdnJlZl90ZW1wX3ZhbHVlOwoKCQkJCQkJd3JyX3JlZygocmVnX2FkZCksaW92cmVmX29yZyk7ICAvLwoJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDBMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbMF0pOyAgLy8KCQkJCQkJd3JyX3JlZygoRERSMF9QVUJfRFgxTENETFIxK3JlZ19iYXNlX2FkaiksZHhubGNkbHIxWzFdKTsgIC8vCgkJCQkJCXdycl9yZWcoKEREUjBfUFVCX0RYMkxDRExSMStyZWdfYmFzZV9hZGopLGR4bmxjZGxyMVsyXSk7ICAvLwoJCQkJCQl3cnJfcmVnKChERFIwX1BVQl9EWDNMQ0RMUjErcmVnX2Jhc2VfYWRqKSxkeG5sY2RscjFbM10pOyAgLy8KCgoKCQkJCQl9CgoKCgkJCQkJewoJCQkJCQlwcmludGYoIlxuXG4gaW92cmVmICB2ZGRxPTEuNXYsaWYgdXNlIG90aGVyIHZkZHEgLHBsZWFzZSByZWNvdW50XG4iKTsKCQkJCQkJcHJpbnRmKCJcbiB2ZGRxPTEuNXYgaW92cmVmICBhYytkcmFtX2RhdGEgb3JnPT0weCUwOHggICAlMDhkbVZ8fGRvd24gZWRnZT09MHglMDh4ICUwOGRtVnx8dXAgZWRnZT09MHglMDh4ICUwOGRtVnx8bWlkPT0weCUwOHggICAlMDhkbVZcbiIsCgkJCQkJCQkJaW92cmVmX29yZywoKCgoKCgoaW92cmVmX29yZyYwWDNGKSo3KSs0NDApKjMpLzIpKzEpKjE1LzE1KSxpb3ZyZWZfbGVmLCgoKCgoKChpb3ZyZWZfbGVmJjBYM0YpKjcpKzQ0MCkqMykvMikrMSkqMTUvMTUpLAoJCQkJCQkJCWlvdnJlZl9yaWcsKCgoKCgoKGlvdnJlZl9yaWcmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxNS8xNSksKChpb3ZyZWZfbGVmK2lvdnJlZl9yaWcpLzIpLAoJCQkJCQkJCSgoKCgoKCgoKGlvdnJlZl9sZWYraW92cmVmX3JpZykvMikmMFgzRikqNykrNDQwKSozKS8yKSsxKSoxNS8xNSkKCQkJCQkJCSAgKTsKCgkJCQkJCWlmIChpb3ZyZWZfbGVmID09IDB4MCkKCQkJCQkJewoJCQkJCQkJcHJpbnRmKCJcblxuIGlvdnJlZiAgIGRvd24gZWRnZSByZWFjaCAgcmVnIGxpbWl0ZWRcbiIpOwoJCQkJCQl9CgkJCQkJCWlmIChpb3ZyZWZfcmlnID09IDB4M2YpCgkJCQkJCXsKCQkJCQkJCXByaW50ZigiXG5cbiBpb3ZyZWYgICB1cCBlZGdlIHJlYWNoICByZWcgbGltaXRlZFxuIik7CgkJCQkJCX0KCQkJCQl9CgoKCgoKCgoKCgoKCgoKCQkJCX0KCgoKCQkJfQoKCgoKCgoJCX0KCgl9CgoKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CgkvLyovCiNlbmRpZgoJcmV0dXJuIDE7Cgp9Ci8vCgppbnQgcGxsX2NvbnZlcnRfdG9fZGRyX2Nsa19nMTJhKHVuc2lnbmVkIGludCBkZHJfcGxsKQp7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsaz0wOwoJdW5zaWduZWQgaW50IG9kX2Rpdj0weGZmZjsKCWRkcl9wbGw9ZGRyX3BsbCYweGZmZmZmOwojaWYgMS8vIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkvL3Vuc2lnbmVkIGludCBkZHJfY2xrID0gMiooKCgoMjQgKiAoKGRkcl9wbGw+PjQpJjB4MWZmKSkvKChkZHJfcGxsPj4xNikmMHgxZikpPj4oKCgoZGRyX3BsbD4+MCkmMHgzKT09Myk/KDIpOigoKGRkcl9wbGw+PjApJjB4MykpKSkvKCgoZGRyX3BsbD4+MikmMHgzKSsxKSk7ICAvL29kMSAgb2QKCWlmKCgoZGRyX3BsbD4+MTYpJjcpPT0wKQoJCW9kX2Rpdj0yOwoJaWYoKChkZHJfcGxsPj4xNikmNyk9PTEpCgkJb2RfZGl2PTM7CgoJaWYoKChkZHJfcGxsPj4xNikmNyk9PTIpCgkJb2RfZGl2PTQ7CgoJaWYoKChkZHJfcGxsPj4xNikmNyk9PTMpCgkJb2RfZGl2PTY7CgoJaWYoKChkZHJfcGxsPj4xNikmNyk9PTQpCgkJb2RfZGl2PTg7CgoJaWYoKChkZHJfcGxsPj4xMCkmMHgxZikpCgkJZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj4wKSYweDFmZikpLygoZGRyX3BsbD4+MTApJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjE5KSYweDEpPT0xKT8oMik6KDEpKSkpL29kX2RpdjsKCiNlbHNlCglkZHJfY2xrID0gMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKI2VuZGlmCgoKCXJldHVybiBkZHJfY2xrOwp9CgoKaW50IGRkcl9jbGtfY29udmVydF90b19wbGxfZzEyYSh1bnNpZ25lZCBpbnQgZGRyX2NsaywgdW5zaWduZWQgY2hhciBwbGxfYnlwYXNzX2VuKQp7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19jdHJsPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19tPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19uPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19jdHJsX29kPTA7Cgl1aW50MzJfdCBkZHJfcGxsX3Zjb19jdHJsX29kMT0wOwoJZGRyX3BsbF92Y29fbj0xOwoJaWYgKHBsbF9ieXBhc3NfZW4gPT0gMCkgewoJCWlmICgoZGRyX2NsayA+PTQ4MDAvNCkpIHsKCQkJLy9kYXRhcmF0ZT09dmNvIHNob3VsZCAzLTQuOGcKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0xOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDI7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjMpLzI0OyAvLzYKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPjQ4MDAvNikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0yOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDI7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjQpLzI0OyAvLzgKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPiA0ODAwLzgpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MzsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgyOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo2KS8yNDsgLy8xMgoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+IDQ4MDAvMTIpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9NDsKCQkJZGRyX3BsbF92Y29fY3RybF9vZDE9MHgyOyAvLzAKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo4KS8yNDsgLy8xNgoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA+IDM2MCkpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0zOwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDM7IC8vMAoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjEyKS8yNDsKCQl9CgkJZWxzZSB7CgkJCS8vMzIgICBzaG91bGQgPjIwME0KCQkJZGRyX3BsbF92Y29fY3RybF9vZD00OwoJCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDM7Ly8wCgkJCWRkcl9wbGxfdmNvX209KGRkcl9jbGsqMTYpLzI0OwoJCX0KCX0KCWlmIChwbGxfYnlwYXNzX2VuID09IDEpIHsKCQlkZHJfcGxsX3Zjb19jdHJsX29kMT0weDM7Ly8wCgkJaWYgKChkZHJfY2xrID49ODAwKSkgewoJCQkvL2RhdGFyYXRlPT12Y28gc2hvdWxkIDIuNC00LjhnCgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MDsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2Nsayo0KS8yNDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPCA0ODAwLzYpKSB7CgkJCWRkcl9wbGxfdmNvX2N0cmxfb2Q9MTsKCQkJZGRyX3BsbF92Y29fbT0oZGRyX2NsayoyKjMpLzI0OwoJCX0KCQllbHNlIGlmICgoZGRyX2NsayA8IDQ4MDAvOCkpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0yOwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqNCkvMjQ7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrIDwgNDgwMC8xMikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD0zOwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqNikvMjQ7CgkJfQoJCWVsc2UgaWYgKChkZHJfY2xrIDwgNDgwMC8xNikpIHsKCQkJZGRyX3BsbF92Y29fY3RybF9vZD00OwoJCQlkZHJfcGxsX3Zjb19tPShkZHJfY2xrKjIqOCkvMjQ7CgkJfQoJfQoJZGRyX3BsbF92Y29fY3RybD1kZHJfcGxsX3Zjb19tfChkZHJfcGxsX3Zjb19uPDwxMCl8KGRkcl9wbGxfdmNvX2N0cmxfb2Q8PDE2KXwoZGRyX3BsbF92Y29fY3RybF9vZDE8PDE5KTsKCXJldHVybiBkZHJfcGxsX3Zjb19jdHJsOwoKCS8vcmV0dXJuIGRkcl9wbGxfdmNvX2N0cmw7Cn0KaW50IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsodW5zaWduZWQgaW50IGRkcl9wbGwpCnsKCXVuc2lnbmVkIGludCBkZHJfY2xrPTA7CglkZHJfcGxsPWRkcl9wbGwmMHhmZmZmZjsKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgkvLyAgIHByaW50ZigiXG5nMTIgZGRyX3BsbD09ICUwOHggXG4iLCBkZHJfcGxsKTsKCWRkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2Nsa19nMTJhKCAgZGRyX3BsbCk7CglyZXR1cm4gZGRyX2NsazsKI2VuZGlmCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJLy91bnNpZ25lZCBpbnQgZGRyX2NsayA9IDIqKCgoKDI0ICogKChkZHJfcGxsPj40KSYweDFmZikpLygoZGRyX3BsbD4+MTYpJjB4MWYpKT4+KCgoKGRkcl9wbGw+PjApJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4wKSYweDMpKSkpLygoKGRkcl9wbGw+PjIpJjB4MykrMSkpOwoJaWYoKChkZHJfcGxsPj4xNikmMHgxZikpCgoJCWRkcl9jbGsgPSAyKigoKCgyNCAqICgoZGRyX3BsbD4+NCkmMHgxZmYpKS8oKGRkcl9wbGw+PjE2KSYweDFmKSk+PigoKChkZHJfcGxsPj4wKSYweDMpPT0zKT8oMik6KCgoZGRyX3BsbD4+MCkmMHgzKSkpKT4+KCgoKGRkcl9wbGw+PjIpJjB4Myk9PTMpPygyKTooKChkZHJfcGxsPj4yKSYweDMpKSkpOwoKI2Vsc2UKCWlmKChkZHJfcGxsPj45KSYweDFmKQoJCWRkcl9jbGsgPSAyKigoKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKSk7CgojZW5kaWYKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gUF9ERFJfUEhZX0RFRkFVTFQpCglpZigoZGRyX3BsbD4+OSkmMHgxZikKCQlkZHJfY2xrID0gMiooKDI0ICogKGRkcl9wbGwmMHgxZmYpKS8oKGRkcl9wbGw+PjkpJjB4MWYpKT4+KChkZHJfcGxsPj4xNikmMHgzKTsKI2VuZGlmCgoJcmV0dXJuIGRkcl9jbGs7Cn0KCmludCBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHVuc2lnbmVkIGludCBkZHJfY2xrKQp7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbD0weDEwMjIxOwoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCWRkcl9wbGw9ZGRyX2Nsa19jb252ZXJ0X3RvX3BsbF9nMTJhKCAgZGRyX2NsaywwKTsKCXJldHVybiBkZHJfcGxsOwojZW5kaWYKCgkvKiBzZXQgZGRyIHBsbCByZWcgKi8KCWlmICgoZGRyX2NsayA+PSA0MCkgJiYgKGRkcl9jbGsgPCA3NTApKSB7CgkJLy8JCQkJCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDIgPDwgMTYpIHwgKDEgPDwgOSkgfCAoKCgoZGRyX2Nsay82KSo2KS8xMikgPDwgMCk7Cgl9CgllbHNlIGlmKChkZHJfY2xrID49IDc1MCkgJiYgKGRkcl9jbGsgPCAyMDAwKSkgewoJCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJCWRkcl9wbGw9ICgxIDw8IDE2KSB8ICgxIDw8IDkpIHwgKCgoKGRkcl9jbGsvMTIpKjEyKS8yNCkgPDwgMCk7Cgl9CgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCWRkcl9wbGw9MHgwMDEwNGM1OwoJLyogc2V0IGRkciBwbGwgcmVnICovCgkvKgoJICAgaWYgKChkZHJfY2xrID49IDQwKSAmJiAoZGRyX2NsayA8IDc1MCkpIHsKCS8vCQkJCQkJCU9ECQkJTgkJCQkJTQoJZGRyX3BsbD0gKDIgPDwgMikgfCAoMSA8PCAxNikgfCAoKCgoZGRyX2Nsay82KSo2KS8xMikgPDwgNCk7Cgl9CgllbHNlIGlmKChkZHJfY2xrID49IDc1MCkgJiYgKGRkcl9jbGsgPCAyMDAwKSkgewoJLy8JCQkJCQkJT0QJCQlOCQkJCQlNCglkZHJfcGxsPSAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrLzEyKSoxMikvMjQpIDw8IDQpOwoJfQoJKi8KCWlmICgoZGRyX2NsayA8IDIwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMiA8PCAwKSB8ICgzIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqNikvNikvMykgPDwgNCk7Cgl9CgllbHNlIGlmICgoZGRyX2Nsaz49IDIwMCkgJiYgKGRkcl9jbGs8IDQwMCkpIHsKCQkvLwkJCQkJCQlPRDEJCQlPRAkJCU4JCQkJCU0KCQlkZHJfcGxsPSAoMiA8PCAwKSB8ICgxIDw8IDIpIHwgKDEgPDwgMTYpIHwgKCgoKGRkcl9jbGsqNikvNikvNikgPDwgNCk7Cgl9CgllbHNlIGlmICgoZGRyX2Nsaz49IDQwMCkgJiYgKGRkcl9jbGsgPCA4MDApKSB7CgkJLy8JCQkJCQkJT0QxCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDEgPDwgMCkgfCAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrKjEyKS8xMikvMTIpIDw8IDQpOwoJfQoJZWxzZSBpZiAoKGRkcl9jbGsgPj0gODAwKSAmJiAoZGRyX2NsayA8IDIwMDApKSB7CgkJLy8JCQkJCQkJT0QxCQkJT0QJCQlOCQkJCQlNCgkJZGRyX3BsbD0gKDAgPDwgMCkgfCAoMSA8PCAyKSB8ICgxIDw8IDE2KSB8ICgoKChkZHJfY2xrKjEyKS8xMikvMjQpIDw8IDQpOwoJfQojZW5kaWYKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gUF9ERFJfUEhZX0RFRkFVTFQpCgl7CgoKCQlpZiAoKGRkcl9jbGsgPCA3NTApKSB7CgkJCS8vCQlPRAkJCU4JCU0KCQkJZGRyX3BsbD0gKDIgPDwgMTYpIHwgKDEgPDwgOSkgfCAoKChkZHJfY2xrLzI0KSoyKTw8IDApIDsKCQl9CgkJZWxzZSBpZiAoKGRkcl9jbGsgPj0gNzUwKSkgewoJCQkvLwkJT0QJCQlOCQlNCgkJCWRkcl9wbGw9ICgxIDw8IDE2KSB8ICgxIDw8IDkpIHwgKChkZHJfY2xrLzI0KTw8IDApIDsKCQl9CgoJfQojZW5kaWYKCglyZXR1cm4gZGRyX3BsbDsKfQoKCmludCBkb19kZHI0X3Rlc3RfZHJhbV9jbGsoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLy8qCglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoJY2hhciAqZW5kcDsKCiNkZWZpbmUgVEVTVF9EUkFNX0NMS19VU0VfRU5WICAxCglwcmludGYoIlxudHVuZSBkZHIgQ0xLIHVzZSB1Ym9vdCBlbnZcbiIpOwoKI2RlZmluZSAgRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFICAgMHgyMDAwMAojZGVmaW5lICBERFJfVEVTVF9NSU5fRlJFUV9MSU1JVEVEICA1MAojZGVmaW5lICBERFJfVEVTVF9NSU5fRlJFUSAgMzAwCiNkZWZpbmUgIEREUl9URVNUX01BWF9GUkVRICAzMDAwCgoJdW5zaWduZWQgaW50ICAgZGRyX3Rlc3Rfc2l6ZT0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJdW5zaWduZWQgaW50IHN0YXJ0X2ZyZXE9RERSX1RFU1RfTUlOX0ZSRVE7Cgl1bnNpZ25lZCBpbnQgZW5kX2ZyZXE9RERSX1RFU1RfTUFYX0ZSRVE7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sb29wcz0xOwoJLy9wcmludGYoIlxuMTExdHVuZSBkZHIgQ0xLIHVzZSB1Ym9vdCBlbnZcbiIpOwoJaWYgKGFyZ2MgPT0gMSkKCXsKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgkJZGRyX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQlzdGFydF9mcmVxPUREUl9URVNUX01JTl9GUkVROwoJCWVuZF9mcmVxPUREUl9URVNUX01BWF9GUkVROwoKCX0KCglpZiAoYXJnYyA9PSAyKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlzdGFydF9mcmVxPUREUl9URVNUX01JTl9GUkVROwoJCWVuZF9mcmVxPUREUl9URVNUX01BWF9GUkVROwoJfQoJaWYgKGFyZ2M9PSAzKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlzdGFydF9mcmVxPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQllbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCgl9CglpZiAoYXJnYz09IDQpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCXN0YXJ0X2ZyZXE9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWVuZF9mcmVxPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoKCX0KCWlmIChhcmdjPiA0KQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlzdGFydF9mcmVxPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQllbmRfZnJlcT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQl0ZXN0X2xvb3BzPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJfQoJdW5zaWduZWQgaW50IHRlbXBfdGVzdF9lcnJvcj0weDA7Cgl1bnNpZ25lZCBpbnQgZGRyX3BsbD0wOwoJdW5zaWduZWQgaW50IGRkcl9jbGtfb3JnPTA7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsa19ob3BlX3Rlc3Q9MDsKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCgkvLyNkZWZpbmUgQU1fRERSX1BMTF9DTlRMMCAgICAgCSAgICAgICAoIE1NQ19SRUdfQkFTRSArICggMHgwCTw8IDIgKSApCglkZHJfcGxsID0gcmRfcmVnKEcxMl9BTV9ERFJfUExMX0NOVEwwKTsKI2Vsc2UKCWRkcl9wbGwgPSByZF9yZWcoQU1fRERSX1BMTF9DTlRMKTsKI2VuZGlmCgkvL2Rkcl9wbGw9ZGRyX3BsbF9vcmc7CglwcmludGYoIlxuZGRyX3BsbD09ICUwOHhcbiIsIGRkcl9wbGwpOwojaWYgIDAgCiNlbHNlCgl1bnNpZ25lZCBpbnQgZGRyX2NsayA9IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CglkZHJfY2xrX29yZz1kZHJfY2xrOwoJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CglwcmludGYoIlxuc3RhcnRfZnJlcT09ICVkTUh6XG4iLCBzdGFydF9mcmVxKTsKCXByaW50ZigiXG5lbmRfZnJlcT09ICVkTUh6XG4iLCBlbmRfZnJlcSk7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKI2VuZGlmCgoJLy8JewoJLy8Jd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkvLwlkZHJfdWRlbGF5KDIwMDApOwoJLy99CgoKCXVuc2lnbmVkIGludCBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbKEREUl9URVNUX01BWF9GUkVRKS8xMl07IC8vIHN0ZXAgPTAgaW5pdCAgLDEgdGVzdCBmYWlsLCAsMiB0ZXN0IHBhc3MsMyB0ZXN0IHNraXA7CgkvLyAgY2hhciBjaGFyX2ZyZXFfbmFtZV90YWJsZVszMF07CgkvLyAgY29uc3QgY2hhciAqcF9jaGFyX2ZyZXFfdGFibGU7CgoJY29uc3QgY2hhciAqcF9jaGFyX2Rkcl90ZXN0X3N0ZXA7Cgljb25zdCBjaGFyICogcF9jaGFyX2ZyZXFfb3JnOwoJY2hhciBjaGFyX2ZyZXFfb3JnWzMwXTsKCWludCAgZGRyX2ZlcV90ZXN0X3N0ZXA9MDsgLy8gc3RlcCA9MCBpbml0ICwxIGdvaW5nICwyIGRvbmU7CgoJY29uc3QgY2hhciAqIHBfY2hhcl9mcmVxX25hbWVfdGFibGU7CgljaGFyIGNoYXJfZnJlcV9uYW1lX3RhYmxlWzMwXTsKCWNoYXIgY2hhcl9jbWRfdGFibGVbMTAwXTsKCWNoYXIgKiBwX2NoYXJfc3RvcmVfYm9vdDsKCS8vICBjaGFyIGNoYXJfZnJlcV9zdG9yZV9ib290WzIwMF07CgoJLy9jb25zdCBjaGFyICpwX2ZyZXFfdGFibGVfaW50OwoJLy9jaGFyIGNoYXJfZGRyX2ZlcV90ZXN0X3N0ZXBbXT0iZGRyX2ZlcV90ZXN0X3N0ZXAiOwoJLy8gY29uc3QgY2hhciAqdmFybmFtZTsKCS8vIGNvbnN0IGNoYXIgKnZhcnZhbHVlOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2NvdW50X3N1Yj0wOwoKCgkvLwoJcF9jaGFyX2Rkcl90ZXN0X3N0ZXA9IGdldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiKTsKCWlmIChwX2NoYXJfZGRyX3Rlc3Rfc3RlcCkKCXsKCQlwcmludGYoIiVzIixwX2NoYXJfZGRyX3Rlc3Rfc3RlcCk7CgoJCWRkcl9mZXFfdGVzdF9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX2NoYXJfZGRyX3Rlc3Rfc3RlcCwgJmVuZHAsIDApOwoJCXByaW50ZigiZGRyX2ZlcV90ZXN0X3N0ZXA9JWRcbiIsZGRyX2ZlcV90ZXN0X3N0ZXApOwoJfQoJaWYgKGRkcl9mZXFfdGVzdF9zdGVwKSB7CgkJcF9jaGFyX2ZyZXFfb3JnPSBnZXRlbnYoImRkcl9mZXFfb3JnIik7CgkJaWYgKHBfY2hhcl9mcmVxX29yZykKCQl7CgkJCXByaW50ZigiJXMiLHBfY2hhcl9mcmVxX29yZyk7CgoJCQlkZHJfY2xrX29yZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfb3JnLCAmZW5kcCwgMTApOyAvL211c3QgdXNlIDEwICxmcmVxICAwNzkyIG1heWJlIG5vdCByZWFkIHN1c3NjZWZ1bCB1c2UgMCBhdXRvIHJlYWQKCQkJcHJpbnRmKCJkZHJfY2xrX29yZz0lZFxuIixkZHJfY2xrX29yZyk7CgkJfQoJfQoJaWYgKGRkcl9mZXFfdGVzdF9zdGVwID09IDApCgl7CgkJZGRyX2ZlcV90ZXN0X3N0ZXA9MTsKCQlkZHJfY2xrX29yZz1kZHJfY2xrOwoJCXNwcmludGYoY2hhcl9mcmVxX29yZywiJTA0ZCIsZGRyX2Nsayk7CgkJcHJpbnRmKCJcbmRkcl9vcmdfZnJlcT0lc1xuIixjaGFyX2ZyZXFfb3JnKTsKCQlzZXRlbnYoImRkcl9mZXFfb3JnIiwgY2hhcl9mcmVxX29yZyk7CgoJCXRlbXBfY291bnQ9KEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQvMTIpOwoJCXdoaWxlICh0ZW1wX2NvdW50PChERFJfVEVTVF9NQVhfRlJFUS8xMikpIHsKCgkJCS8vIHNwcmludGYoZnJlcV90YWJsZSwiJXMlMDRkICUwMWQgJTAxZCAgIixmcmVxX3RhYmxlLCh0ZW1wX2NvdW50KjEyKSwwLDApOwoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjAiKTsKCQkJc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIxIik7CgkJCXRlbXBfY291bnQrKzsKCQl9CgkJdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChzdGFydF9mcmVxKS8xMikpIHsKCgkJCS8vIHNwcmludGYoZnJlcV90YWJsZSwiJXMlMDRkICUwMWQgJTAxZCAgIixmcmVxX3RhYmxlLCh0ZW1wX2NvdW50KjEyKSwwLDApOwoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCXNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjMiKTsKCQkJc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIxIik7CgkJCXRlbXBfY291bnQrKzsKCQl9CgkJd2hpbGUgKHRlbXBfY291bnQ+KChlbmRfZnJlcSkvMTIpKSB7CgoJCQkvLyBzcHJpbnRmKGZyZXFfdGFibGUsIiVzJTA0ZCAlMDFkICUwMWQgICIsZnJlcV90YWJsZSwodGVtcF9jb3VudCoxMiksMCwwKTsKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwoJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQlzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIzIik7CgkJCXNldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJCQl0ZW1wX2NvdW50Kys7CgkJfQoKCQlwX2NoYXJfc3RvcmVfYm9vdD0gZ2V0ZW52KCJzdG9yZWJvb3QiKTsKCQlpZiAocF9jaGFyX3N0b3JlX2Jvb3QpCgkJCXByaW50Zigic3RvcmVib290ICAgJXNcbiIscF9jaGFyX3N0b3JlX2Jvb3QpOwoJCXNwcmludGYoY2hhcl9jbWRfdGFibGUsImRkcl90ZXN0X2NtZCAweDFjICAweCUwOHggJWQgJWQgJWQ7JXM7IixkZHJfdGVzdF9zaXplLHN0YXJ0X2ZyZXEsZW5kX2ZyZXEsdGVzdF9sb29wcyxwX2NoYXJfc3RvcmVfYm9vdCk7CgkJc2V0ZW52KCJzdG9yZWJvb3QiLCBjaGFyX2NtZF90YWJsZSk7CgoJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgl9CgoJaWYgKGRkcl9mZXFfdGVzdF9zdGVwID09IDEpCgl7CgoJCXRlbXBfY291bnQ9KEREUl9URVNUX01JTl9GUkVRX0xJTUlURUQvMTIpOwoJCXdoaWxlICh0ZW1wX2NvdW50PCgoRERSX1RFU1RfTUFYX0ZSRVEpLzEyKSkgewoKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSkpOwoJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKCQkJcF9jaGFyX2ZyZXFfbmFtZV90YWJsZT0gZ2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJaWYgKHBfY2hhcl9mcmVxX25hbWVfdGFibGUpCgkJCXsKCQkJCXByaW50ZigiJXNcbiIscF9jaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCQkJZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX2NoYXJfZnJlcV9uYW1lX3RhYmxlLCAmZW5kcCwgMCk7CgkJCQlwcmludGYoIiVzIHwgJWRcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUsZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCQkJfQoJCQl0ZW1wX2NvdW50Kys7CgkJfQoKCQl0ZW1wX2NvdW50PShERFJfVEVTVF9NSU5fRlJFUV9MSU1JVEVELzEyKTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKEREUl9URVNUX01BWF9GUkVRKS8xMikpIHsKCQkJZGRyX2Nsa19ob3BlX3Rlc3Q9KHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpOwoJCQlpZiAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID09MSkKCQkJewoJCQkJdGVtcF9jb3VudF9zdWI9dGVtcF9jb3VudCsxOwoJCQkJd2hpbGUgKChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudF9zdWIqMTIpKSkgPT0KCQkJCQkJKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKQoJCQkJe3RlbXBfY291bnRfc3ViPXRlbXBfY291bnRfc3ViKzE7CgkJCQl9CgkJCQl3aGlsZSAodGVtcF9jb3VudF9zdWI8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgkJCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnRfc3ViKjEyKSkpKTsKCQkJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkJCS8vIGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50X3N1Yl0gPTE7CgkJCQkJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJCQkJCXRlbXBfY291bnRfc3ViKys7CgkJCQl9CgkJCQl7CgkJCQkJZGRyX2ZlcV90ZXN0X3N0ZXArKzsKCQkJCQlzZXRlbnYoImRkcl9mZXFfdGVzdF9zdGVwIiwgIjIiKTsKCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJCQkJfQoJCQkJe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfb3JnOwoJCQkJfQoJCQkJc3ByaW50ZihjaGFyX2NtZF90YWJsZSwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAiLGRkcl9jbGtfaG9wZV90ZXN0KTsKCQkJCXByaW50ZigiXG5jaGFyX2NtZF90YWJsZT0lc1xuIixjaGFyX2NtZF90YWJsZSk7CgkJCQlydW5fY29tbWFuZChjaGFyX2NtZF90YWJsZSwwKTsKCgkJCX0KCQkJaWYgKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9PTApCgkJCXsKCQkJCWlmICgoZGRyX2Nsa19ob3BlX3Rlc3QpICE9IChkZHJfY2xrKSkKCQkJCXsKCQkJCQlzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCIsZGRyX2Nsa19ob3BlX3Rlc3QpOwoJCQkJCXByaW50ZigiXG5jaGFyX2NtZF90YWJsZT0lc1xuIixjaGFyX2NtZF90YWJsZSk7CgkJCQkJcnVuX2NvbW1hbmQoY2hhcl9jbWRfdGFibGUsMCk7CgkJCQl9CgkJCQlpZiAoKGRkcl9jbGtfaG9wZV90ZXN0KSA9PSAoZGRyX2NsaykpCgkJCQl7CgoJCQkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKCQkJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9MTsKCQkJCQlzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIxIik7CgkJCQkJcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJd2hpbGUgKHRlc3RfbG9vcHMtLSkgewoJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCX0KCQkJCQkvL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0xOwoJCQkJCQlzZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIxIik7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9MjsKCQkJCQkJc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMiIpOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgoJCQkJCWRkcl9jbGtfaG9wZV90ZXN0PSh0ZW1wX2NvdW50KjEyKSsxMjsKCQkJCQl3aGlsZSAoKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrX2hvcGVfdGVzdCkpKSA9PQoJCQkJCQkJKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKQoJCQkJCXtkZHJfY2xrX2hvcGVfdGVzdD1kZHJfY2xrX2hvcGVfdGVzdCsxMjsKCQkJCQl9CgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7ZGRyX2Nsa19ob3BlX3Rlc3Q9ZGRyX2Nsa19vcmc7CgkJCQkJfQoJCQkJCXNwcmludGYoY2hhcl9jbWRfdGFibGUsImRkcl90ZXN0X2NtZCAweDE3ICVkIDAgMCAwIixkZHJfY2xrX2hvcGVfdGVzdCk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfY21kX3RhYmxlPSVzXG4iLGNoYXJfY21kX3RhYmxlKTsKCQkJCQlydW5fY29tbWFuZChjaGFyX2NtZF90YWJsZSwwKTsKCQkJCX0KCgkJCX0KCQkJdGVtcF9jb3VudCsrOwoJCX0KCQlkZHJfZmVxX3Rlc3Rfc3RlcCsrOwoJCXNldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMiIpOwoJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgl9CgoJaWYgKGRkcl9mZXFfdGVzdF9zdGVwID49IDIpCgl7CgkJcHJpbnRmKCJcbmZpbmlzaCB0ZXN0IGRkcl9mZXFfdGVzdF9zdGVwPSVkXG4iLGRkcl9mZXFfdGVzdF9zdGVwKTsKCQl0ZW1wX2NvdW50PShERFJfVEVTVF9NSU5fRlJFUV9MSU1JVEVELzEyKTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKEREUl9URVNUX01BWF9GUkVRKS8xMikpIHsKCgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpKTsKCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCgkJCXBfY2hhcl9mcmVxX25hbWVfdGFibGU9IGdldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCWlmIChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKQoJCQl7CgkJCQlwcmludGYoIiVzXG4iLHBfY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSwgJmVuZHAsIDApOwoJCQkJcHJpbnRmKCIlcyB8ICVkXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCX0KCQkJdGVtcF9jb3VudCsrOwoJCX0KCgkJcHJpbnRmKCJcbnByaW50IHRlc3QgZGRyX2ZlcV90ZXN0X3Jlc3VsdCEhIVxuIik7CgkJdGVtcF9jb3VudD0oRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRC8xMik7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMTIpKSB7CgoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSk7CgkJCXBfY2hhcl9mcmVxX25hbWVfdGFibGU9IGdldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCWlmIChwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKQoJCQl7CgkJCQkvLwlwcmludGYoIiVzXG4iLHBfY2hhcl9mcmVxX25hbWVfdGFibGUpOwoKCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSwgJmVuZHAsIDApOwoJCQkJLy9wcmludGYoIiVkXG4iLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQlpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDApIHsKCQkJCQlwcmludGYoIiUwNGQgIG5vIGluaXQgICAgICVkIFxuIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMTIpKSksZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCQkJCX0KCQkJCWlmICggKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSkgPT0gMSkgewoJCQkJCXByaW50ZigiJTA0ZCAgZmFpbCAgICAgICVkXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoxMikpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJfQoJCQkJaWYgKCAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKSA9PSAyKSB7CgkJCQkJcHJpbnRmKCIlMDRkICBwYXNzICAgICAgJWRcbiIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQl9CgkJCQlpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID49IDMpIHsKCQkJCQlwcmludGYoIiUwNGQgIHNraXAgdGVzdCAlZCBcbiIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjEyKSkpLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQl9CgkJCQl0ZW1wX2NvdW50Kys7CgkJCX0KCQl9CgoJfQoJLy9zcHJpbnRmKHN0ciwiZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93ICBhIDAgIDB4JTA4eCAgJWQgIDB4JTA4eCIsZGRyX3Rlc3Rfc2l6ZSx0ZXN0X2FjX3NldHVwX2hvbGQsKCBsYW5lX3N0ZXApKTsKCS8vCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgoKCgkvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwoJLy8gIHNldGVudigiZW52X2RkcnRlc3QiLCBzdHIpOwoKCgkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCgkvLyovCglyZXR1cm4gMTsKCn0KaW50IHVwZGF0ZV9kZHJfenEodW5zaWduZWQgaW50IHpxMHByKQp7Cgl3cl9yZWcoIEREUjBfUFVCX1pRMFBSLHpxMHByKTsKCXdyX3JlZyggRERSMF9QVUJfWlFDUiwocmRfcmVnKEREUjBfUFVCX1pRQ1IpKXwoMTw8Mil8KDE8PDI3KSk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRQ1IsKHJkX3JlZyhERFIwX1BVQl9aUUNSKSkmKH4oKDE8PDIpfCgxPDwyNykpKSk7CglwcmludGYoIlxudXBkYXRlIHpxIHpxMHByPTB4JTA4eCx6cTBkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTBQUikscmRfcmVnKEREUjBfUFVCX1pRMERSKSk7CglyZXR1cm4gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKfQoKaW50IGRvX2Rkcl90ZXN0X2Rkcl9tYXhfZnJlcShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBUZXN0IGRkciBtYXggZnJlcXVlbmN5ICBmdW5jdGlvblxuIik7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgICBhZGRfZnJlcT0xOwoJdW5zaWduZWQgaW50ICAgc3ViX2ZyZXE9MTsKCXVuc2lnbmVkIGludCAgIG1heF9mcmVxPTc5MjsKCXVuc2lnbmVkIGludCAgIG1pbl9mcmVxPTc5MjsKCXVuc2lnbmVkIGludCAgIGxvb3BfbWF4X2ZyZXE9NzkyOwoJdW5zaWduZWQgaW50ICAgIGxvb3BfbWluX2ZyZXE9NzkyOwoKCXVuc2lnbmVkIGludCBkZHJfcGxsPTB4MTAyMjE7Cgl1bnNpZ25lZCBpbnQgZGRyX2Nsa19vcmc9NzkyOwoJdW5zaWduZWQgaW50IGRkcl9wbGxfb3JnID0gcmRfcmVnKEFNX0REUl9QTExfQ05UTCk7CglkZHJfcGxsPWRkcl9wbGxfb3JnOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPSBwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCXByaW50ZigiXG5kZHJfY2xrX29yZz09ICVkTUh6XG4iLCBkZHJfY2xrX29yZyk7CgoJdW5zaWduZWQgaW50IHpxMHByID0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCXByaW50ZigiXG5kZHJfenEwcHI9PSAweCUwOHhcbiIsIHpxMHByKTsKCglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCgl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCWRkcl91ZGVsYXkoMjAwMCk7CgoJbWF4X2ZyZXE9ZGRyX2Nsa19vcmc7CgltaW5fZnJlcT1kZHJfY2xrX29yZzsKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA9PSAxKQoJewoJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJdGVzdF9sb29wPTE7CgkJYWRkX2ZyZXE9MTsKCQlzdWJfZnJlcT0xOwoJfQoKCWlmIChhcmdjID09IDIpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X2xvb3A9MTsKCQlhZGRfZnJlcT0xOwoJCXN1Yl9mcmVxPTE7Cgl9CglpZiAoYXJnYz09IDMpCgl7CgkJZGRyX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDE2KTsKCQl0ZXN0X2xvb3A9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlhZGRfZnJlcT0xOwoJCXN1Yl9mcmVxPTE7Cgl9CglpZiAoYXJnYyA+PSA0KQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJYWRkX2ZyZXE9MTsKCQlzdWJfZnJlcT0xOwoJCWlmICgoc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpKSA9PSAxKQoJCXsKCQkJYWRkX2ZyZXE9MTsKCQkJc3ViX2ZyZXE9MDsKCQl9CgkJZWxzZSBpZigoc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpKT09MCkKCQl7CgkJCWFkZF9mcmVxPTA7CgkJCXN1Yl9mcmVxPTE7CgkJfQoJfQoKCXVuc2lnbmVkIGludCAgCXRlbXBfdGVzdF9lcnJvcj0wOwoJd2hpbGUgKHRlc3RfdGltZXM8KHRlc3RfbG9vcCsxKSkKCXsKCQlwcmludGYoIlxudGVzdF90aW1lcz09ICVkIHRpbWVzXG4iLCB0ZXN0X3RpbWVzKTsKCgkJaWYgKGFkZF9mcmVxKQoJCXsKCgkJCXdoaWxlIChkZHJfY2xrPDE1MDApCgkJCXsKCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJCQkJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgkJCQl7CgoJCQkJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMCk7CgkJCQkJcHJpbnRmKCJcbnRlc3RpbmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCQkJCX0KCgkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJbWF4X2ZyZXE9ZGRyX2Nsay0xMjsKCQkJCQlwcmludGYoIlxubWF4X2Rkcl9jbGs9PSAlZE1IelxuIiwgbWF4X2ZyZXEpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJfQoKCQkJd2hpbGUgKGRkcl9jbGs+ZGRyX2Nsa19vcmcpCgkJCXsKCQkJCWRkcl9jbGs9ZGRyX2Nsay0xMjsKCQkJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCQkJewoKCQkJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDApOwoJCQkJfQoJCQl9CgkJCXByaW50ZigiXG5iYWNrIHRvICBvcmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJCX0KCgkJaWYgKHN1Yl9mcmVxKQoJCXsKCgkJCXdoaWxlIChkZHJfY2xrPjI0KQoJCQl7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCWRkcl9jbGs9ZGRyX2Nsay0xMjsKCQkJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCQkJewoKCQkJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDApOwoJCQkJCXByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgkJCQl9CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCW1pbl9mcmVxPWRkcl9jbGsrMTI7CgkJCQkJcHJpbnRmKCJcbm1pbl9kZHJfY2xrPT0gJWRNSHpcbiIsIG1pbl9mcmVxKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQlicmVhazsKCQkJCX0KCgkJCX0KCgkJCXdoaWxlIChkZHJfY2xrPGRkcl9jbGtfb3JnKQoJCQl7CgkJCQlkZHJfY2xrPWRkcl9jbGsrMTI7CgkJCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQkJCXsKCgkJCQkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJCQkJZGRyX3VkZWxheSgyMDAwKTsKCQkJCX0KCQkJfQoJCQlwcmludGYoIlxuYmFjayB0byAgb3JnX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgoKCQl9CgoJCWlmICh0ZXN0X3RpbWVzID09IDEpCgkJewoKCQkJbG9vcF9tYXhfZnJlcT1tYXhfZnJlcTsKCQkJbG9vcF9taW5fZnJlcT1taW5fZnJlcTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKGxvb3BfbWF4X2ZyZXE+bWF4X2ZyZXEpCgkJCXsKCQkJCWxvb3BfbWF4X2ZyZXE9bWF4X2ZyZXE7CgkJCX0KCQkJaWYgKG1pbl9mcmVxPmxvb3BfbWluX2ZyZXEpCgkJCXsKCQkJCWxvb3BfbWluX2ZyZXE9bWluX2ZyZXE7CgkJCX0KCQl9CgkJdGVzdF90aW1lcysrOwoKCX0KCglwcmludGYoIlxubG9vcF9taW5fZnJlcT09ICVkTUh6LHBsbD09MHglMDh4XG4iLCBsb29wX21pbl9mcmVxLGRkcl9jbGtfY29udmVydF90b19wbGwobG9vcF9taW5fZnJlcSkpOwoJcHJpbnRmKCJcbmxvb3BfbWF4X2ZyZXE9PSAlZE1IeixwbGw9PTB4JTA4eFxuIiwgbG9vcF9tYXhfZnJlcSxkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGxvb3BfbWF4X2ZyZXEpKTsKCglyZXR1cm4gbG9vcF9tYXhfZnJlcTsKfQoKCmludCBkb19kZHJfdGVzdF9kZHJfenEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgVGVzdCBkZHIgenEgIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCXVuc2lnbmVkIGludCAgIHRlc3RfbG9vcD0xOwoJdW5zaWduZWQgaW50ICAgdGVzdF90aW1lcz0xOwoJdW5zaWduZWQgaW50ICAgYWRkX2ZyZXE9MTsKCXVuc2lnbmVkIGludCAgIHN1Yl9mcmVxPTE7Cgl1bnNpZ25lZCBpbnQgICBtYXhfZnJlcT03OTI7Cgl1bnNpZ25lZCBpbnQgICBtaW5fZnJlcT03OTI7Cgl1bnNpZ25lZCBpbnQgICBsb29wX21heF9mcmVxPTc5MjsKCXVuc2lnbmVkIGludCAgICBsb29wX21pbl9mcmVxPTc5MjsKCgl1bnNpZ25lZCBpbnQgZGRyX3BsbD0weDEwMjIxOwoJdW5zaWduZWQgaW50IGRkcl9jbGtfb3JnPTc5MjsKCXVuc2lnbmVkIGludCBkZHJfcGxsX29yZyA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpOwoJZGRyX3BsbD1kZHJfcGxsX29yZzsKCXVuc2lnbmVkIGludCBkZHJfY2xrID0gcGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfcGxsKTsKCWRkcl9jbGtfb3JnPWRkcl9jbGs7CglwcmludGYoIlxuZGRyX2Nsa19vcmc9PSAlZE1IelxuIiwgZGRyX2Nsa19vcmcpOwoKCXVuc2lnbmVkIGludCB6cTBwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJLy8JdW5zaWduZWQgaW50IHpxMHByX2Jlc3Q7Cgl1bnNpZ25lZCBpbnQgenEwcHI9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CgkvLwl6cTBwcl9iZXN0PXpxMHByX29yZzsKCXVuc2lnbmVkIGludCB6cTBwcl9kcnZfbWF4OwoJdW5zaWduZWQgaW50IHpxMHByX2Rydl9taW47Cgl1bnNpZ25lZCBpbnQgenEwcHJfb2R0X21heDsKCXVuc2lnbmVkIGludCB6cTBwcl9vZHRfbWluOwoJdW5zaWduZWQgaW50IHpxMHByX2Rydl9mbGFnPTE7Cgl1bnNpZ25lZCBpbnQgenEwcHJfb2R0X2ZsYWc9MTsKCgoJcHJpbnRmKCJcbnpxMHByX29yZz09IDB4JTA4eFxuIiwgenEwcHJfb3JnKTsKCglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCgoJewoKCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQlkZHJfdWRlbGF5KDIwMDApOwoJfQoKCgoKCgoJbWF4X2ZyZXE9ZGRyX2Nsa19vcmc7CgltaW5fZnJlcT1kZHJfY2xrX29yZzsKCgoKCgojZGVmaW5lICBERFJfQ09SU1NfVEFMS19URVNUX1NJWkUgICAweDIwMDAwCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoKCgoJaWYgKGFyZ2MgPT0gMSkKCXsKCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCXRlc3RfbG9vcD0xOwoJCWFkZF9mcmVxPTE7CgkJc3ViX2ZyZXE9MTsKCX0KCglpZiAoYXJnYyA9PSAyKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPTE7CgkJYWRkX2ZyZXE9MTsKCQlzdWJfZnJlcT0xOwoJfQoJaWYgKGFyZ2M9PSAzKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJYWRkX2ZyZXE9MTsKCQlzdWJfZnJlcT0xOwoJfQoJaWYgKGFyZ2MgPj0gNCkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCWFkZF9mcmVxPTE7CgkJc3ViX2ZyZXE9MTsKCQlpZiAoKHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KSkgPT0gMSkKCQl7CgkJCWFkZF9mcmVxPTE7CgkJCXN1Yl9mcmVxPTA7CgkJfQoJCWVsc2UgaWYoKHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDE2KSk9PTApCgkJewoJCQlhZGRfZnJlcT0wOwoJCQlzdWJfZnJlcT0xOwoJCX0KCX0KCglpZiAoYXJnYz40KQoJewoJCWlmICgoc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpKSA9PSAxKQoJCXsKCQkJenEwcHJfZHJ2X2ZsYWc9MDsKCQkJenEwcHJfb2R0X2ZsYWc9MTsKCQl9CgkJZWxzZSBpZigoc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpKT09MCkKCQl7CgkJCXpxMHByX2Rydl9mbGFnPTE7CgkJCXpxMHByX29kdF9mbGFnPTA7CgkJfQoKCX0KCgoJdW5zaWduZWQgaW50ICAJdGVtcF90ZXN0X2Vycm9yPTA7CgoKCXRlc3RfdGltZXM9MTsKCXRlbXBfdGVzdF9lcnJvcj0wOwoJd2hpbGUgKHRlc3RfdGltZXM8KHRlc3RfbG9vcCsxKSkKCXsKCQlwcmludGYoIlxudGVzdF90aW1lcz09ICVkIHRpbWVzXG4iLCB0ZXN0X3RpbWVzKTsKCgkJaWYgKGFkZF9mcmVxKQoJCXsKCgkJCXdoaWxlIChkZHJfY2xrPDE1MDApCgkJCXsKCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJCQkJZGRyX3BsbCA9IGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsayk7CgkJCQl7CgoJCQkJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMCk7CgkJCQkJcHJpbnRmKCJcbnRlc3RpbmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCQkJCX0KCgkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfYWRkX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJbWF4X2ZyZXE9ZGRyX2Nsay0xMjsKCQkJCQlwcmludGYoIlxubWF4X2Rkcl9jbGs9PSAlZE1IelxuIiwgbWF4X2ZyZXEpOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJfQoKCQkJd2hpbGUgKGRkcl9jbGs+ZGRyX2Nsa19vcmcpCgkJCXsKCQkJCWRkcl9jbGs9ZGRyX2Nsay0xMjsKCQkJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCQkJewoKCQkJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDApOwoJCQkJfQoJCQl9CgkJCXByaW50ZigiXG5iYWNrIHRvICBvcmdfZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgoJCX0KCgkJaWYgKHN1Yl9mcmVxKQoJCXsKCgkJCXdoaWxlIChkZHJfY2xrPjI0KQoJCQl7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCWRkcl9jbGs9ZGRyX2Nsay0xMjsKCQkJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCQkJewoKCQkJCQl3cl9yZWcoQU1fRERSX1BMTF9DTlRMLCAoKChyZF9yZWcoQU1fRERSX1BMTF9DTlRMKSkmKH4oMHhmZmZmZikpKXwoZGRyX3BsbCkpKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDApOwoJCQkJCXByaW50ZigiXG50ZXN0aW5nX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgkJCQl9CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCW1pbl9mcmVxPWRkcl9jbGsrMTI7CgkJCQkJcHJpbnRmKCJcbm1pbl9kZHJfY2xrPT0gJWRNSHpcbiIsIG1pbl9mcmVxKTsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9MDsKCQkJCQlicmVhazsKCQkJCX0KCgkJCX0KCgkJCXdoaWxlIChkZHJfY2xrPGRkcl9jbGtfb3JnKQoJCQl7CgkJCQlkZHJfY2xrPWRkcl9jbGsrMTI7CgkJCQlkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCQkJCXsKCgkJCQkJd3JfcmVnKEFNX0REUl9QTExfQ05UTCwgKCgocmRfcmVnKEFNX0REUl9QTExfQ05UTCkpJih+KDB4ZmZmZmYpKSl8KGRkcl9wbGwpKSk7CgkJCQkJZGRyX3VkZWxheSgyMDAwKTsKCQkJCX0KCQkJfQoJCQlwcmludGYoIlxuYmFjayB0byAgb3JnX2Rkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CgoKCQl9CgoJCWlmICh0ZXN0X3RpbWVzID09IDEpCgkJewoKCQkJbG9vcF9tYXhfZnJlcT1tYXhfZnJlcTsKCQkJbG9vcF9taW5fZnJlcT1taW5fZnJlcTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKGxvb3BfbWF4X2ZyZXE+bWF4X2ZyZXEpCgkJCXsKCQkJCWxvb3BfbWF4X2ZyZXE9bWF4X2ZyZXE7CgkJCX0KCQkJaWYgKG1pbl9mcmVxPmxvb3BfbWluX2ZyZXEpCgkJCXsKCQkJCWxvb3BfbWluX2ZyZXE9bWluX2ZyZXE7CgkJCX0KCQl9CgkJdGVzdF90aW1lcysrOwoKCX0KCglwcmludGYoIlxubG9vcF9taW5fZnJlcT09ICVkTUh6LHBsbD09MHglMDh4XG4iLCBsb29wX21pbl9mcmVxLGRkcl9jbGtfY29udmVydF90b19wbGwobG9vcF9taW5fZnJlcSkpOwoJcHJpbnRmKCJcbmxvb3BfbWF4X2ZyZXE9PSAlZE1IeixwbGw9PTB4JTA4eFxuIiwgbG9vcF9tYXhfZnJlcSxkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGxvb3BfbWF4X2ZyZXEpKTsKCgoJd2hpbGUgKGRkcl9jbGsKCQkJPGxvb3BfbWF4X2ZyZXEpCgl7CgkJZGRyX2Nsaz1kZHJfY2xrKzEyOwoJCWRkcl9wbGwgPSBkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKGRkcl9jbGspOwoJCXsKCgkJCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJCQlkZHJfdWRlbGF5KDIwMDApOwoJCX0KCX0KCXByaW50ZigiXG5zZXQgdG8gIGxvb3BfbWF4X2ZyZXE9PSAlZE1IelxuIiwgbG9vcF9tYXhfZnJlcSk7CgoJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgoJenEwcHJfZHJ2X21heD0oenEwcHImMHhmKTsKCXpxMHByX2Rydl9taW49KHpxMHByJjB4Zik7Cgl6cTBwcl9vZHRfbWF4PSh6cTBwciYweGYwKTsKCXpxMHByX29kdF9taW49KHpxMHByJjB4ZjApOwoKCWlmICh6cTBwcl9kcnZfZmxhZykKCXsKCQl3aGlsZSAoKHpxMHByJjB4Zik8MHhmKQoJCXsKCQkJenEwcHIrKzsKCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQl6cTBwci0tOwoJCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCQlicmVhazsKCgoJCQl9CgkJfQoJCXpxMHByX2Rydl9tYXg9KHpxMHByJjB4Zik7CgkJcHJpbnRmKCJcbnpxMHByX2Rydl9tYXg9PSAweCUwOHhcbiIsIHpxMHByX2Rydl9tYXgpOwoKCQl1cGRhdGVfZGRyX3pxKHpxMHByX29yZyk7CgoJCXdoaWxlICgoenEwcHImMHhmKT4weDApCgkJewoJCQl6cTBwci0tOwoJCQl1cGRhdGVfZGRyX3pxKHpxMHByKTsKCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXpxMHByKys7CgkJCQl1cGRhdGVfZGRyX3pxKHpxMHByKTsKCQkJCWJyZWFrOwoKCgkJCX0KCQl9CgoKCQl6cTBwcl9kcnZfbWluPSh6cTBwciYweGYpOwoJCXByaW50ZigiXG56cTBwcl9kcnZfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9kcnZfbWluKTsKCX0KCglpZiAoenEwcHJfb2R0X2ZsYWcpCgl7CgkJd2hpbGUgKCh6cTBwciYweGYwKTwweGYwKQoJCXsKCQkJenEwcHI9enEwcHIrMHgxMDsKCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCXRlbXBfdGVzdF9lcnJvcj0wOwoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19hZGRfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQl6cTBwcj16cTBwci0weDEwOwoJCQkJdXBkYXRlX2Rkcl96cSh6cTBwcik7CgkJCQlicmVhazsKCgoJCQl9CgkJfQoJCXpxMHByX29kdF9tYXg9KHpxMHByJjB4ZjApOwoJCXByaW50ZigiXG56cTBwcl9vZHRfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9vZHRfbWF4KTsKCgkJdXBkYXRlX2Rkcl96cSh6cTBwcl9vcmcpOwoKCgkJd2hpbGUgKCh6cTBwciYweGYwKT4weDApCgkJewoJCQl6cTBwcj16cTBwci0weDEwOwoJCQl1cGRhdGVfZGRyX3pxKHpxMHByKTsKCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXpxMHByPXpxMHByKzB4MTA7CgkJCQl1cGRhdGVfZGRyX3pxKHpxMHByKTsKCQkJCWJyZWFrOwoKCgkJCX0KCQl9CgkJenEwcHJfb2R0X21pbj0oenEwcHImMHhmMCk7CgkJcHJpbnRmKCJcbnpxMHByX29kdF9taW49PSAweCUwOHhcbiIsIHpxMHByX29kdF9taW4pOwoJfQoJdXBkYXRlX2Rkcl96cSh6cTBwcl9vcmcpOwoKCXByaW50ZigiXG56cTBwcl9kcnZfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9kcnZfbWF4KTsKCXByaW50ZigiXG56cTBwcl9kcnZfbWluPT0gMHglMDh4XG4iLCB6cTBwcl9kcnZfbWluKTsKCXByaW50ZigiXG56cTBwcl9vZHRfbWF4PT0gMHglMDh4XG4iLCB6cTBwcl9vZHRfbWF4KTsKCXByaW50ZigiXG56cTBwcl9vZHRfbWluPT0gMHglMDh4XG4iLCB6cTBwcl9vZHRfbWluKTsKCglyZXR1cm4gbG9vcF9tYXhfZnJlcTsKCgoKfQoKaW50IGNsZWFyX2Rkcl9iYW5kX21vbml0b3IodW5zaWduZWQgaW50IHBvcnQsdW5zaWduZWQgaW50IHBvcnRfaWQsdW5zaWduZWQgaW50IHRpbWVyX2NvdW50ZXIpCnsKCXdyX3JlZyhETUNfTU9OX0NUUkwzLCB0aW1lcl9jb3VudGVyKTsKCXdyX3JlZyhETUNfTU9OX0NUUkwyLCAocG9ydF9pZDw8MCl8KHBvcnQ8PDE2KXwoMDw8MjApfCgxPDwzMCkpOwoJZGRyX3VkZWxheSgxKTsKCWlmICgoKHJkX3JlZyhETUNfTU9OX0NUUkwyKSk+PjMwKSA9PSAxKQoJCXJldHVybiAxOwoJZWxzZQoJCXJldHVybiAwOwoKCn0KaW50IG9wZW5fZGRyX2JhbmRfbW9uaXRvcih1bnNpZ25lZCBpbnQgcG9ydCx1bnNpZ25lZCBpbnQgcG9ydF9pZCx1bnNpZ25lZCBpbnQgdGltZXJfY291bnRlcikKewoJd3JfcmVnKERNQ19NT05fQ1RSTDMsIHRpbWVyX2NvdW50ZXIpOwoJd3JfcmVnKERNQ19NT05fQ1RSTDIsICgocmRfcmVnKERNQ19NT05fQ1RSTDIpKSYoMTw8MzApKXwocG9ydF9pZDw8MCl8KHBvcnQ8PDE2KXwoMDw8MjApfCgxPDwzMSkpOwoKCXJldHVybiAxOwp9CgppbnQgZmluaXNoX2Rkcl9iYW5kX21vbml0b3IodW5zaWduZWQgaW50IHBvcnQsdW5zaWduZWQgaW50IHBvcnRfaWQsdW5zaWduZWQgaW50IHRpbWVyX2NvdW50ZXIpCnsKCS8vd3JfcmVnKERNQ19NT05fQ1RSTDMsIHRpbWVyX3RpbWUpOwoJaWYgKCgocmRfcmVnKERNQ19NT05fQ1RSTDIpKT4+MzEpID09IDApCgl7CgkJcHJpbnRmKCJcbmRkciBiYW5kd2lkdGggdGltZXIgZmluaXNoIGNvdW50IGFuZCBwcmludCByZXN1bHRcbiIpOwoJCXByaW50ZigiXG5ETUNfTU9OX3BvcnQJPT0gMHglMDh4IHBvcnRfaWQ9PTB4JTA4eCB0aW1lcl90aW1lPT0weCUwOHgiLHBvcnQscG9ydF9pZCx0aW1lcl9jb3VudGVyKTsKCQlwcmludGYoIlxuRE1DX01PTl9BTExfUkVRX0NOVAk9PSAweCUwOHgiLChyZF9yZWcoRE1DX01PTl9BTExfUkVRX0NOVCkpKTsKCgkJcHJpbnRmKCJcbkRNQ19NT05fQUxMX0dSQU5UX0NOVAk9PSAweCUwOHgiLChyZF9yZWcoRE1DX01PTl9BTExfR1JBTlRfQ05UKSkpOwoJCXByaW50ZigiXG5ETUNfTU9OX0FMTF9HUkFOVF9DTlRfYmFuZAk9PSAweCUwOHgga2J5dGUsZGVjPT0gJWQgTWJ5dGUiLCgocmRfcmVnKERNQ19NT05fQUxMX0dSQU5UX0NOVCkpKig4KSkvMTAyNCwoKHJkX3JlZyhETUNfTU9OX0FMTF9HUkFOVF9DTlQpKSooOCkpLygxMDI0KjEwMjQpKTsKCQlwcmludGYoIlxuRE1DX01PTl9PTkUgX0dSQU5UX0NOVCBmb3Igc2VsZWN0ZWQgcG9ydCBhbmQgc3ViaWRzCT09IDB4JTA4eCIsKHJkX3JlZyhETUNfTU9OX09ORV9HUkFOVF9DTlQpKSk7CgkJcHJpbnRmKCJcbkRNQ19NT05fT05FIF9HUkFOVF9DTlRfYmFuZCBmb3Igc2VsZWN0ZWQgcG9ydCBhbmQgc3ViaWRzCT09IDB4JTA4eCxkZWM9PSAlZE1ieXRlIiwoKHJkX3JlZyhETUNfTU9OX09ORV9HUkFOVF9DTlQpKSooOCkpLzEwMjQsKChyZF9yZWcoRE1DX01PTl9PTkVfR1JBTlRfQ05UKSkqKDgpKS8oMTAyNCoxMDI0KSk7Cgl9CgkvL3dyX3JlZyhETUNfTU9OX0NUUkwyLCAoKHJkX3JlZyhETUNfTU9OX0NUUkwyKSkmKDE8PDMwKSl8KHBvcnRfaWQ8PDApfChwb3J0PDwxNil8KDA8PDIwKXwoMTw8MzEpKTsKCglyZXR1cm4gMTsKfQoKCgppbnQgZG9fZGRyX3Rlc3RfYmFuZHdpZHRoKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIFRlc3QgZGRyIGJhbmR3aWR0aCAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgoJY2hhciAqZW5kcDsKCS8vICB1bnNpZ25lZCBpbnQgICAqcF9zdGFydF9hZGRyOwoJdW5zaWduZWQgaW50ICAgdGVzdF9sb29wPTE7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X3RpbWVzPTE7Cgl1bnNpZ25lZCBpbnQgdGltZXJfdGltZV9tcz0xMDAwOwoKCgl1bnNpZ25lZCBpbnQgZGRyX3BsbD0weDEwMjIxOwoJdW5zaWduZWQgaW50IGRkcl9jbGtfb3JnPTc5MjsKCXVuc2lnbmVkIGludCBkZHJfcGxsX29yZyA9IHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpJih+KDE8PDI5KSk7CglkZHJfcGxsPWRkcl9wbGxfb3JnOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPSBwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJZGRyX2Nsa19vcmc9ZGRyX2NsazsKCXByaW50ZigiXG5kZHJfY2xrX29yZz09ICVkTUh6XG4iLCBkZHJfY2xrX29yZyk7CgoJdW5zaWduZWQgaW50IHpxMHByID0gcmRfcmVnKEREUjBfUFVCX1pRMFBSKTsKCXByaW50ZigiXG5kZHJfenEwcHI9PSAweCUwOHhcbiIsIHpxMHByKTsKCglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKCgl1bnNpZ25lZCBpbnQgICBkZHJfdGVzdF9zaXplPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgoJdW5zaWduZWQgaW50IHRlc3RfcG9ydD0wOwoJdW5zaWduZWQgaW50IHRlc3RfcG9ydF9zdWJfaWQ9MTsKCgoJaWYgKGFyZ2MgPT0gMSkKCXsKCQlkZHJfdGVzdF9zaXplID0gRERSX0NPUlNTX1RBTEtfVEVTVF9TSVpFOwoJCXRlc3RfbG9vcD0xOwoKCX0KCglpZiAoYXJnYyA9PSAyKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPTE7CgoJfQoJaWYgKGFyZ2M9PSAzKQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgoJfQoJaWYgKGFyZ2MgPj0gNCkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCXRlc3RfbG9vcD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMTYpOwoJCXRlc3RfcG9ydD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoKCgl9CglpZiAoYXJnYyA+PSA1KQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAxNik7CgkJdGVzdF9sb29wPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJdGVzdF9wb3J0PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJdGVzdF9wb3J0X3N1Yl9pZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMTYpOwoKCX0KCWlmIChhcmdjID41KQoJewoKCQl0aW1lcl90aW1lX21zPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAxNik7CgoJfQoKCS8vdW5zaWduZWQgaW50ICAJdGVtcF90ZXN0X2Vycm9yPTA7Cgl1bnNpZ25lZCBpbnQgdGltZXJfY291bnRlcj0wOwoJdGltZXJfY291bnRlcj0odGltZXJfdGltZV9tcyoxMDAwKmRkcl9jbGsvMik7CgkvL3doaWxlKHRlc3RfdGltZXM8KHRlc3RfbG9vcCsxKSkKCXsKCQl7CgkJCWNsZWFyX2Rkcl9iYW5kX21vbml0b3IoIHRlc3RfcG9ydCwgdGVzdF9wb3J0X3N1Yl9pZCwgdGltZXJfY291bnRlcik7CgkJCW9wZW5fZGRyX2JhbmRfbW9uaXRvciggdGVzdF9wb3J0LCB0ZXN0X3BvcnRfc3ViX2lkLCB0aW1lcl9jb3VudGVyKTsKCQkJd2hpbGUgKHRlc3RfdGltZXM8KHRlc3RfbG9vcCsxKSkKCQkJewoJCQkJcHJpbnRmKCJcbnRlc3RfdGltZXM9PSAlZCB0aW1lc1xuIiwgdGVzdF90aW1lcyk7CgkJCQlkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCXRlc3RfdGltZXMrKzsKCQkJfQoJCQlmaW5pc2hfZGRyX2JhbmRfbW9uaXRvciggdGVzdF9wb3J0LCB0ZXN0X3BvcnRfc3ViX2lkLCB0aW1lcl9jb3VudGVyKTsKCQkJcHJpbnRmKCJcbnRpbWVyX3RpbWVfbXM9PSAlZCBtc1xuIiwgdGltZXJfdGltZV9tcyk7CgoJCQlwcmludGYoIlxuZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCgkJfQoJfQoKCXJldHVybiAxOwp9CgppbnQgZG9fZGRyX2ZpbmVfdHVuZV9sY2Rscl9lbnYoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgZGRyX2ZpbmVfdHVuZV9sY2Rscl9lbnYgIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCiNkZWZpbmUgV1JfUkRfQURKX1VTRV9FTlYgIDEKI2RlZmluZSBXUl9SRF9BREpfVVNFX1VBUlRfSU5QVVQgMgoJdW5zaWduZWQgaW50ICAgd3JfcmRfYWRqX2lucHV0X3NyYz0xOwoKCWludCB3cl9hZGpfcGVyWzEyXT17CgkJMTAwCSwKCQkxMDAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoKCX07CglpbnQgcmRfYWRqX3BlclsxMl09ewoJCTEwMAksCgkJMTAwCSwKCQk4MAksCgkJODAJLAoJCTgwCSwKCQk4MAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgkJMTAwCSwKCQkxMDAJLAoJCTEwMAksCgl9OwoJaWYgKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJaWYgKGFyZ2MgPj0gMikKCXsKCQl3cl9yZF9hZGpfaW5wdXRfc3JjID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoKCQl1bnNpZ25lZCBpbnQgaT0wOwoJCWlmICh3cl9yZF9hZGpfaW5wdXRfc3JjID09IFdSX1JEX0FESl9VU0VfVUFSVF9JTlBVVCkKCQl7CgkJCXByaW50ZigiXG50dW5lIGRkciBsY2RsciB1c2UgdWFydCBpbnB1dFxuIik7CgkJCWlmIChhcmdjPjI0KzIpCgkJCXthcmdjPTI0KzI7fQoJCQl7CgoJCQkJZm9yIChpID0gMjtpPGFyZ2M7aSsrKQoJCQkJewoJCQkJCWlmIChpPCgyKzEyKSkgewoJCQkJCQl3cl9hZGpfcGVyW2ktMl09c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2ldLCAmZW5kcCwgMTApOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlyZF9hZGpfcGVyW2ktMTRdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDEwKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJfQoJCWlmICh3cl9yZF9hZGpfaW5wdXRfc3JjID09IFdSX1JEX0FESl9VU0VfRU5WKQoJCXtwcmludGYoIlxudHVuZSBkZHIgbGNkbHIgdXNlIHVib290IGVudlxuIik7CgkJCXsKCQkJCS8vY2hhciBzdHJbMjRdOwoJCQkJY29uc3QgY2hhciAqczsKCgkJCQkvLyBjaGFyICp2YXJuYW1lOwoJCQkJaW50IHZhbHVlPTA7CgoJCQkJLy8qdmFybmFtZT0iZW52X2RkcnRlc3QiOwoJCQkJcyA9IGdldGVudigiZW52X3dyX2xjZGxyX3ByIik7CgkJCQlpZiAocykKCQkJCXsvL2k9MDsKCQkJCQkvL3doaWxlKHNfdGVtcCkKCQkJCQl7CgkJCQkJCXByaW50ZigiJXMiLHMpOwoJCQkJCQkvL3NzY2FuZihzLCJkJSwiLHdyX2Fkal9wZXIpOwoJCQkJCQkvL3NwcmludGYoc3RyLCJkJSIscyk7CgkJCQkJCS8vZ2V0YwoKCQkJCQl9CgkJCQkJdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHMsICZlbmRwLCAxNik7CgkJCQkJcHJpbnRmKCIlZCIsdmFsdWUpOwoJCQkJfQoJCQkJcyA9IGdldGVudigiZW52X3JkX2xjZGxyX3ByIik7CgoJCQkJaWYgKHMpCgkJCQl7Ly9pPTA7CgkJCQkJLy93aGlsZShzX3RlbXApCgkJCQkJewoJCQkJCQlwcmludGYoIiVzIixzKTsKCQkJCQkJLy9zc2NhbmYocywiZCUsIixyZF9hZGpfcGVyKTsKCgkJCQkJfQoJCQkJCS8vdmFsdWUgPSBzaW1wbGVfc3RydG91bGxfZGRyKHMsICZlbmRwLCAxNik7CgkJCQl9CgoJCQkJLy9zcHJpbnRmKHN0ciwgIiVseCIsIHZhbHVlKTsKCQkJCS8vICBzZXRlbnYoImVudl9kZHJ0ZXN0Iiwgc3RyKTsKCgoJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCX0KCgkJCWlmIChhcmdjPjI0KzIpCgkJCQlhcmdjPTI0KzI7CgkJCWZvciAoaSA9IDI7aTxhcmdjO2krKykKCQkJewoJCQkJaWYgKGk8KDIrMTIpKSB7CgkJCQkJd3JfYWRqX3BlcltpLTJdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDE2KTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlyZF9hZGpfcGVyW2ktMTRdPXNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltpXSwgJmVuZHAsIDE2KTsKCQkJCX0KCQkJfQoKCgkJfQoJCXByaW50ZigiIGludCB3cl9hZGpfcGVyWzEyXT17XG4iKTsKCQlmb3IgKGkgPSAwO2k8MTI7aSsrKQoJCXsKCQkJcHJpbnRmKCIlMDRkICxcbiIsd3JfYWRqX3BlcltpXSk7CgkJfQoJCXByaW50ZigifTtcbiIpOwoJCXByaW50ZigiIGludCByZF9hZGpfcGVyWzEyXT17XG4iKTsKCQlmb3IgKGkgPSAwO2k8MTI7aSsrKQoJCXsKCQkJcHJpbnRmKCIlMDRkICxcbiIscmRfYWRqX3BlcltpXSk7CgkJfQoJCXByaW50ZigifTtcbiIpOwoKCiNpZiAoQ09ORklHX0REUl9QSFkgPT0gIFBfRERSX1BIWV85MDVYKQoJCQl3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpfCgxPDwyOSkpOwoJCQl3cl9yZWcoRERSMF9QVUJfUEdDUjYsIChyZF9yZWcoRERSMF9QVUJfUEdDUjYpKXwoMTw8MCkpOwoJCQl3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpfCgxPDwyOSkpOwoJCQl3cl9yZWcoRERSMV9QVUJfUEdDUjYsIChyZF9yZWcoRERSMV9QVUJfUEdDUjYpKXwoMTw8MCkpOwojZWxzZQoJCQl3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpfCgxPDwyOSkpOwoJCQl3cl9yZWcoRERSMF9QVUJfUEdDUjEsIChyZF9yZWcoRERSMF9QVUJfUEdDUjEpKXwoMTw8MjYpKTsKCQkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKXwoMTw8MjkpKTsKCQkJd3JfcmVnKEREUjFfUFVCX1BHQ1IxLCAocmRfcmVnKEREUjFfUFVCX1BHQ1IxKSl8KDE8PDI2KSk7CiNlbmRpZgoKCQkJaW50IGxjZGxyX3c9MCxsY2Rscl9yPTA7CgkJCXVuc2lnbmVkIHRlbXBfcmVnPTA7CgkJCWludCB0ZW1wX2NvdW50PTA7CgkJCWZvciAoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDI7dGVtcF9jb3VudCsrKQoJCQl7ICAgICB0ZW1wX3JlZz0odW5zaWduZWQpKEREUjBfUFVCX0FDTENETFIrKHRlbXBfY291bnQ8PDIpKTsKCQkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkFDTENETFJfTUFYKTsKCQkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJaWYgKHRlbXBfY291bnQgPT0gMSkKCQkJCQlsY2Rscl93PWxjZGxyX3cmQUNCRExSX01BWDsKCQkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLCgobGNkbHJfdykmQUNMQ0RMUl9NQVgpKTsKCQkJfQojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCQkJZm9yICggdGVtcF9jb3VudD0yO3RlbXBfY291bnQ8Njt0ZW1wX2NvdW50KyspCgkJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfRFgwTENETFIxKyhERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CgkJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnK0REUjBfUFVCX0RYMExDRExSMy1ERFIwX1BVQl9EWDBMQ0RMUjEpKSkpJkRRTENETFJfTUFYKTsKCQkJCWxjZGxyX3I9bGNkbHJfcj9sY2Rscl9yOjE7CgkJCQlsY2Rscl93PShsY2Rscl93Kih3cl9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJbGNkbHJfcj0obGNkbHJfcioocmRfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZykpLChsY2Rscl93KSk7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMF9QVUJfRFgwTENETFIzLUREUjBfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMF9QVUJfRFgwTENETFI0LUREUjBfUFVCX0RYMExDRExSMSkpLChsY2Rscl9yKSk7CgkJCX0KI2Vsc2UKCQkJZm9yICggdGVtcF9jb3VudD0yO3RlbXBfY291bnQ8Njt0ZW1wX2NvdW50KyspCgkJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMF9QVUJfRFgwTENETFIxKyhERFIwX1BVQl9EWDFMQ0RMUjEtRERSMF9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC0yKSk7CgkJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZEUUxDRExSX01BWCk7CgkJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQkJbGNkbHJfcj0oaW50KSgoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpPj44KSZEUUxDRExSX01BWCk7CgkJCQlsY2Rscl9yPWxjZGxyX3I/bGNkbHJfcjoxOwoJCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCWxjZGxyX3I9KGxjZGxyX3IqKHJkX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKChsY2Rscl9yPDwxNil8KGxjZGxyX3I8PDgpfChsY2Rscl93KSkpKTsKCQkJfQojZW5kaWYKCQkJZm9yICggdGVtcF9jb3VudD02O3RlbXBfY291bnQ8ODt0ZW1wX2NvdW50KyspCgkJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfQUNMQ0RMUisoKHRlbXBfY291bnQtNik8PDIpKTsKCgkJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSZBQ0xDRExSX01BWCk7CgkJCQlsY2Rscl93PWxjZGxyX3c/bGNkbHJfdzoxOwoJCQkJbGNkbHJfdz0obGNkbHJfdyood3JfYWRqX3Blclt0ZW1wX2NvdW50XSkpLzEwMDsKCQkJCWlmICh0ZW1wX2NvdW50ID09IDcpCgkJCQkJbGNkbHJfdz1sY2Rscl93JkFDQkRMUl9NQVg7CgkJCQl3cl9yZWcoKCh1aW50NjRfdCkodGVtcF9yZWcpKSwoKGxjZGxyX3cpJkFDTENETFJfTUFYKSk7CgkJCX0KI2lmIChDT05GSUdfRERSX1BIWSA9PSAgUF9ERFJfUEhZXzkwNVgpCgkJCWZvciAoIHRlbXBfY291bnQ9ODt0ZW1wX2NvdW50PDEyO3RlbXBfY291bnQrKykKCQkJeyAgICAgdGVtcF9yZWc9KHVuc2lnbmVkKShERFIxX1BVQl9EWDBMQ0RMUjErKEREUjFfUFVCX0RYMUxDRExSMS1ERFIxX1BVQl9EWDBMQ0RMUjEpKih0ZW1wX2NvdW50LTIpKTsKCQkJCWxjZGxyX3c9KGludCkoKHJkX3JlZygodWludDY0X3QpKHRlbXBfcmVnKSkpJkRRTENETFJfTUFYKTsKCQkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCQlsY2Rscl9yPShpbnQpKCgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcrRERSMV9QVUJfRFgwTENETFIzLUREUjFfUFVCX0RYMExDRExSMSkpKSkmRFFMQ0RMUl9NQVgpOwoJCQkJbGNkbHJfcj1sY2Rscl9yP2xjZGxyX3I6MTsKCQkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCQlsY2Rscl9yPShsY2Rscl9yKihyZF9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKGxjZGxyX3cpKTsKCQkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZytERFIxX1BVQl9EWDBMQ0RMUjMtRERSMV9QVUJfRFgwTENETFIxKSksKGxjZGxyX3IpKTsKCQkJCXdyX3JlZygoKHVpbnQ2NF90KSh0ZW1wX3JlZytERFIxX1BVQl9EWDBMQ0RMUjQtRERSMV9QVUJfRFgwTENETFIxKSksKGxjZGxyX3IpKTsKCQkJfQojZWxzZQoJCQlmb3IgKCB0ZW1wX2NvdW50PTg7dGVtcF9jb3VudDwxMjt0ZW1wX2NvdW50KyspCgkJCXsgICAgIHRlbXBfcmVnPSh1bnNpZ25lZCkoRERSMV9QVUJfRFgwTENETFIxKyhERFIxX1BVQl9EWDFMQ0RMUjEtRERSMV9QVUJfRFgwTENETFIxKSoodGVtcF9jb3VudC04KSk7CgkJCQlsY2Rscl93PShpbnQpKChyZF9yZWcoKHVpbnQ2NF90KSh0ZW1wX3JlZykpKSYweGZmKTsKCQkJCWxjZGxyX3c9bGNkbHJfdz9sY2Rscl93OjE7CgkJCQlsY2Rscl9yPShpbnQpKCgocmRfcmVnKCh1aW50NjRfdCkodGVtcF9yZWcpKSk+PjgpJjB4ZmYpOwoJCQkJbGNkbHJfcj1sY2Rscl9yP2xjZGxyX3I6MTsKCQkJCWxjZGxyX3c9KGxjZGxyX3cqKHdyX2Fkal9wZXJbdGVtcF9jb3VudF0pKS8xMDA7CgkJCQlsY2Rscl9yPShsY2Rscl9yKihyZF9hZGpfcGVyW3RlbXBfY291bnRdKSkvMTAwOwoJCQkJd3JfcmVnKCgodWludDY0X3QpKHRlbXBfcmVnKSksKCgobGNkbHJfcjw8MTYpfChsY2Rscl9yPDw4KXwobGNkbHJfdykpKSk7CgkJCX0KI2VuZGlmCgojaWYgKENPTkZJR19ERFJfUEhZID09ICBQX0REUl9QSFlfOTA1WCkKCgoJCQl3cl9yZWcoRERSMF9QVUJfUEdDUjYsIChyZF9yZWcoRERSMF9QVUJfUEdDUjYpKSYofigxPDwwKSkpOwoJCQl3cl9yZWcoRERSMF9QVUJfUElSLCAocmRfcmVnKEREUjBfUFVCX1BJUikpJih+KDE8PDI5KSkpOwoKCQkJd3JfcmVnKEREUjFfUFVCX1BHQ1I2LCAocmRfcmVnKEREUjFfUFVCX1BHQ1I2KSkmKH4oMTw8MCkpKTsKCQkJd3JfcmVnKEREUjFfUFVCX1BJUiwgKHJkX3JlZyhERFIxX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKCgojZWxzZQoJCQl3cl9yZWcoRERSMF9QVUJfUEdDUjEsIChyZF9yZWcoRERSMF9QVUJfUEdDUjEpKSYofigxPDwyNikpKTsKCQkJd3JfcmVnKEREUjBfUFVCX1BJUiwgKHJkX3JlZyhERFIwX1BVQl9QSVIpKSYofigxPDwyOSkpKTsKCgkJCXdyX3JlZyhERFIxX1BVQl9QR0NSMSwgKHJkX3JlZyhERFIxX1BVQl9QR0NSMSkpJih+KDE8PDI2KSkpOwoJCQl3cl9yZWcoRERSMV9QVUJfUElSLCAocmRfcmVnKEREUjFfUFVCX1BJUikpJih+KDE8PDI5KSkpOwojZW5kaWYKCQkJcHJpbnRmKCJcbmVuZCBhZGp1c3QgbGNkbHJcbiIpOwoKCQkJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQkJQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCX0KCgoKCXJldHVybiAxOwoKfQovLyovCmludCBkb19kZHJfbW9kaWZ5X3JlZ191c2VfbWFzayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciBkZHJfbW9kaWZ5X3JlZ191c2VfbWFzayAgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCgoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgkvLyAgdW5zaWduZWQgaW50ICAgKnBfc3RhcnRfYWRkcjsKCgl1bnNpZ25lZCBpbnQgICByZWdfYWRkPTA7Cgl1bnNpZ25lZCBpbnQgICB3cl9yZWdfdmFsdWU9MDsKCXVuc2lnbmVkIGludCAgIHJkX3JlZ192YWx1ZT0wOwoJdW5zaWduZWQgaW50ICAgd3JfcmVnX2FuZF9tYXNrXzE9MHhmZmZmZmZmZjsKCS8vIHVuc2lnbmVkIGludCAgIHdyX3JlZ19vcl9tYXNrXzI9MHgwOwoKCgoJCWlmIChhcmdjID09IDEpCgkJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJCQlwcmludGYoIlxuZXhhbXBsZSBvbmx5IGNoYW5nZSAweGM4ODM2ODAwIDB4OGMwMTAyMjYgMHgwMDBmZmZmZiBiaXQyMC1iaXQzMSxubyBjaGFuZ2UgcGxsIG9kIG9jIFxuIik7CgkJCXByaW50ZigiXG5kZHJfdGVzdF9jbWQgOSAweGM4ODM2ODAwIDB4OGMwMTAyMjYgMHgwMDBmZmZmZlxuIik7CgkJfQoJCWVsc2UgewoJCQlpZiAoYXJnYyA+PSAyKQoJCQl7CgkJCQlyZWdfYWRkID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTApOwoJCQl9CgkJCWlmIChhcmdjID49IDMpCgkJCXsKCQkJCXdyX3JlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDEwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgkJCQl3cl9yZWdfYW5kX21hc2tfMSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDEwKTsKCgkJCX0KCQkJcmRfcmVnX3ZhbHVlPSAocmRfcmVnKHJlZ19hZGQpKTsKCQkJd3JfcmVnKHJlZ19hZGQsKHJkX3JlZ192YWx1ZSZ3cl9yZWdfYW5kX21hc2tfMSl8KHdyX3JlZ192YWx1ZSYofndyX3JlZ19hbmRfbWFza18xKSkgKTsKCQkJLy9yZF9yZWdfdmFsdWU9IChyZF9yZWcocmVnX2FkZCkpOwoJCQkvL3dyX3JlZyhyZWdfYWRkLChyZF9yZWdfdmFsdWUmKH53cl9yZWdfb3JfbWFza18yKSl8KHdyX3JlZ192YWx1ZSYod3JfcmVnX29yX21hc2tfMikpICk7CgoJCQlwcmludGYoIlxubW9kaWZ5IG9rIHJlYWQ9PTB4JTA4eFxuIiwocmRfcmVnKHJlZ19hZGQpKSk7CgoKCQkJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQkJQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQl9CgoJcmV0dXJuIDE7Cgp9CmludCBkb19kZHJfc2V0X3pxKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIHNldCBkZHIgenEgIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgoJdW5zaWduZWQgaW50IHpxMHByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7Cgl1bnNpZ25lZCBpbnQgenExcHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMVBSKTsKCXVuc2lnbmVkIGludCB6cTJwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEyUFIpOwoJLy8JdW5zaWduZWQgaW50IHpxMHByX2Jlc3Q7Cgl1bnNpZ25lZCBpbnQgenEwcHIwPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJdW5zaWduZWQgaW50IHpxMXByMD0gcmRfcmVnKEREUjBfUFVCX1pRMVBSKTsKCXVuc2lnbmVkIGludCB6cTJwcjA9IHJkX3JlZyhERFIwX1BVQl9aUTJQUik7CgoJaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCQlwcmludGYoIlxuZXhhbXBsZSBvbmx5IGNoYW5nZSB6cSBcbiIpOwoJCXByaW50ZigiXG5kZHJfdGVzdF9jbWQgMTAgMHgxOVxuIik7Cgl9CgllbHNlewoJCWlmIChhcmdjID49IDIpCgkJewoJCQkvLyB6cTBwcjAgPSBhcmd2WzFdOwoJCQl6cTBwcjA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCX0KCgkJaWYgKGFyZ2MgPj0gMykKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCXpxMXByMD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoKCQlpZiAoYXJnYyA+PSA0KQoJCXsKCQkJLy8genEycHIwID1hcmd2WzNdOwoJCQl6cTJwcjA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoKCQl9fQoKCXByaW50ZigiXG56cTBwcl9vcmc9PSAweCUwOHhcbiIsIHpxMHByX29yZyk7CglwcmludGYoIlxuenExcHJfb3JnPT0gMHglMDh4XG4iLCB6cTFwcl9vcmcpOwoJcHJpbnRmKCJcbnpxMnByX29yZz09IDB4JTA4eFxuIiwgenEycHJfb3JnKTsKCXdyX3JlZyggRERSMF9QVUJfWlFDUiwocmRfcmVnKEREUjBfUFVCX1pRQ1IpKXwoMTw8Mil8KDE8PDI3KSk7CglwcmludGYoIlxub3JnIGNoYW5uZWwgMCB6cSB6cTBwcj0weCUwOHgsenEwZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEwUFIpLHJkX3JlZyhERFIwX1BVQl9aUTBEUikpOwoJcHJpbnRmKCJcbm9yZyBjaGFubmVsIDAgenEgenExcHI9MHglMDh4LHpxMWRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMVBSKSxyZF9yZWcoRERSMF9QVUJfWlExRFIpKTsKCXByaW50ZigiXG5vcmcgY2hhbm5lbCAwIHpxIHpxMnByPTB4JTA4eCx6cTJkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTJQUikscmRfcmVnKEREUjBfUFVCX1pRMkRSKSk7CgoJd3JfcmVnKCBERFIwX1BVQl9aUTBQUix6cTBwcjApOwoJd3JfcmVnKCBERFIwX1BVQl9aUTFQUix6cTFwcjApOwoJd3JfcmVnKCBERFIwX1BVQl9aUTJQUix6cTJwcjApOwoJd3JfcmVnKCBERFIwX1BVQl9aUUNSLChyZF9yZWcoRERSMF9QVUJfWlFDUikpfCgxPDwyKXwoMTw8MjcpKTsKCXdyX3JlZyggRERSMF9QVUJfWlFDUiwocmRfcmVnKEREUjBfUFVCX1pRQ1IpKSYofigoMTw8Mil8KDE8PDI3KSkpKTsKCXByaW50ZigiXG51cGRhdGUgY2hhbm5lbCAwIHpxIHpxMHByPTB4JTA4eCx6cTBkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTBQUikscmRfcmVnKEREUjBfUFVCX1pRMERSKSk7CglwcmludGYoIlxudXBkYXRlIGNoYW5uZWwgMCB6cSB6cTFwcj0weCUwOHgsenExZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlExUFIpLHJkX3JlZyhERFIwX1BVQl9aUTFEUikpOwoJcHJpbnRmKCJcbnVwZGF0ZSBjaGFubmVsIDAgenEgenEycHI9MHglMDh4LHpxMmRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMlBSKSxyZF9yZWcoRERSMF9QVUJfWlEyRFIpKTsKCgl3cl9yZWcoIEREUjBfUFVCX1pRMFBSLHpxMHByMCk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRMVBSLHpxMXByMCk7Cgl3cl9yZWcoIEREUjBfUFVCX1pRMlBSLHpxMnByMCk7CglwcmludGYoIlxudXBkYXRlIGNoYW5uZWwgMCB6cSB6cTBwcj0weCUwOHgsenEwZHI9MHglMDh4LFxuIixyZF9yZWcoRERSMF9QVUJfWlEwUFIpLHJkX3JlZyhERFIwX1BVQl9aUTBEUikpOwoJcHJpbnRmKCJcbnVwZGF0ZSBjaGFubmVsIDAgenEgenExcHI9MHglMDh4LHpxMWRyPTB4JTA4eCxcbiIscmRfcmVnKEREUjBfUFVCX1pRMVBSKSxyZF9yZWcoRERSMF9QVUJfWlExRFIpKTsKCXByaW50ZigiXG51cGRhdGUgY2hhbm5lbCAwIHpxIHpxMnByPTB4JTA4eCx6cTJkcj0weCUwOHgsXG4iLHJkX3JlZyhERFIwX1BVQl9aUTJQUikscmRfcmVnKEREUjBfUFVCX1pRMkRSKSk7CgoJLy93cl9yZWcoIEREUjFfUFVCX1pRQ1IsKHJkX3JlZyhERFIxX1BVQl9aUUNSKSl8KDE8PDIpfCgxPDwyNykpOwoJLy93cl9yZWcoIEREUjFfUFVCX1pRQ1IsKHJkX3JlZyhERFIxX1BVQl9aUUNSKSkmKH4oKDE8PDIpfCgxPDwyNykpKSk7CglDTE9TRV9DSEFOTkVMX0FfUEhZX0NMSygpOwoJQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCXJldHVybiAxOwoKfQoKCmludCBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbMzFdWzJdID0gewoJeyAweDFjMDAwMCwgIDg2MH0sCgl7IDB4MWIwMDAxLCAgODcwfSwKCXsgMHgxYTAwMDIsICA4ODB9LAoJeyAweDE5MDAwMywgIDg5MH0sCgl7IDB4MTgwMDA0LCAgOTAwfSwKCXsgMHgxNzAwMDUsICA5MTB9LAoJeyAweDE2MDAwNiwgIDkyMH0sCgl7IDB4MTUwMDA3LCAgOTMwfSwKCXsgMHgxNDAwMDgsICA5NDB9LAoJeyAweDEzMDAwOSwgIDk1MH0sCgl7IDB4MTIwMDBhLCAgOTYwfSwKCXsgMHgxMTAwMGIsICA5NzB9LAoJeyAweDEwMDAwYywgIDk4MH0sCgl7IDB4MGYwMDBkLCAgOTkwfSwKCXsgMHgwZTAwMGUsIDEwMDB9LAoJeyAweDBkMDAwZiwgMTAxMH0sCgl7IDB4MGMwMDEwLCAxMDIwfSwKCXsgMHgwYjAwMTEsIDEwMzB9LAoJeyAweDBhMDAxMiwgMTA0MH0sCgl7IDB4MDkwMDEzLCAxMDUwfSwKCXsgMHgwODAwMTQsIDEwNjB9LAoJeyAweDA3MDAxNSwgMTA3MH0sCgl7IDB4MDYwMDE2LCAxMDgwfSwKCXsgMHgwNTAwMTcsIDEwOTB9LAoJeyAweDA0MDAxOCwgMTEwMH0sCgl7IDB4MDMwMDE5LCAxMTEwfSwKCXsgMHgwMjAwMWEsIDExMjB9LAoJeyAweDAxMDAxYiwgMTEzMH0sCgl7IDB4MDAwMDFjLCAxMTQwfQp9OwoKCnZvaWQgZGRyX3Rlc3RfcHdtX3NldF92b2x0YWdlKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHZvbHRhZ2UpCnsKCWludCB0bzsKCiNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCgoJZW51bSBwd21faWQgewoJCXB3bV9hID0gMCwKCQlwd21fYiwKCQlwd21fYywKCQlwd21fZCwKCQlwd21fZSwKCQlwd21fZiwKCX07CgoJLy9wcmludGYoInRlc3QgZGRyIGluaXQgcHdtICBpZCAlMDhkIFxuIixpZCk7CgoJdW5zaWduZWQgIHJlZzsKCS8qCgkgKiBUT0RPOiBzdXBwb3J0IG1vcmUgcHdtIGNvbnRyb2xsZXJzLCByaWdodCBub3cgb25seSBzdXBwb3J0CgkgKiBQV01fQiwgUFdNX0QKCSAqLwoJc3dpdGNoIChpZCkgewoJCWNhc2UgcHdtX2I6CgkJCXJlZyA9KiAoUF9QV01fTUlTQ19SRUdfQUIpOwoJCQlyZWcgJj0gfigweDdmIDw8IDE2KTsKCQkJcmVnIHw9ICAoKDEgPDwgMjMpIHwgKDEgPDwgMSkpOwoJCQkqKFBfUFdNX01JU0NfUkVHX0FCKSA9IHJlZzsKCQkJLyoKCQkJICogZGVmYXVsdCBzZXQgdG8gbWF4IHZvbHRhZ2UKCQkJICovCgkJCSooUF9QV01fUFdNX0IpID0gZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW0FSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSAtIDFdWzBdOwoJCQlyZWcgID0gKihQX1BJTl9NVVhfUkVHMSk7CgkJCXJlZyAmPSB+KDEgPDwgMTApOwoJCQkqKFBfUElOX01VWF9SRUcxKSA9IHJlZzsKCgkJCXJlZyAgPSAqKFBfUElOX01VWF9SRUcyKTsKCQkJcmVnICY9IH4oMSA8PCA1KTsKCQkJcmVnIHw9ICAoMSA8PCAxMSk7CQkvLyBlbmFibGUgUFdNX0IKCQkJKihQX1BJTl9NVVhfUkVHMikgPSByZWc7CgkJCWJyZWFrOwoKCQljYXNlIHB3bV9kOgoJCQlyZWcgPSooIFBfUFdNX01JU0NfUkVHX0NEKTsKCQkJcmVnICY9IH4oMHg3ZiA8PCAxNik7CgkJCXJlZyB8PSAgKCgxIDw8IDIzKSB8ICgxIDw8IDEpKTsKCQkJKihQX1BXTV9NSVNDX1JFR19DRCkgPSByZWc7CgkJCS8qCgkJCSAqIGRlZmF1bHQgc2V0IHRvIG1heCB2b2x0YWdlCgkJCSAqLwoJCQkqKFBfUFdNX1BXTV9EICk9IGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVtBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxXVswXTsKCQkJcmVnICA9KiggUF9QSU5fTVVYX1JFRzEpOwoJCQlyZWcgJj0gfigxIDw8IDkpOwoJCQlyZWcgJj0gfigxIDw8IDExKTsKCQkJKihQX1BJTl9NVVhfUkVHMSkgPSByZWc7CgoJCQlyZWcgID0gKihQX1BJTl9NVVhfUkVHMik7CgkJCXJlZyB8PSAgKDEgPDwgMTIpOwkJLy8gZW5hYmxlIFBXTV9ECgkJCSooUF9QSU5fTVVYX1JFRzIgKT0gcmVnOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KCglkZHJfdWRlbGF5KDIwMCk7CgoJLy9wcmludGYoInRlc3QgZGRyIHNldCB2ZGRlZSB0byAgJTA4ZCBtdlxuIix2b2x0YWdlKTsKCglmb3IgKHRvID0gMDsgdG8gPCBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSk7IHRvKyspIHsKCQlpZiAoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVsxXSA+PSB2b2x0YWdlKSB7CgkJCWJyZWFrOwoJCX0KCX0KCWlmICh0byA+PSBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkpIHsKCQl0byA9IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSAtIDE7Cgl9Cglzd2l0Y2ggKGlkKSB7CgkJY2FzZSBwd21fYjoKCQkJKihQX1BXTV9QV01fQikgPSBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzBdOwoJCQlicmVhazsKCgkJY2FzZSBwd21fZDoKCQkJKihQX1BXTV9QV01fRCkgPSBkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzBdOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCX0KCWRkcl91ZGVsYXkoMjAwKTsKfQoKaW50IGRvX2Rkcl90ZXN0X3B3bV9jbWQgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl90ZXN0X3B3bV9jbWQgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCgljaGFyICplbmRwOwoKCgl1bnNpZ25lZCBpbnQgaWQ9MDsKCS8vICB1bnNpZ25lZCBpbnQgdm9sdGFnZT0xMDAwOwoJdW5zaWduZWQgaW50IHB3bV9sb3c9MHgxZjsKCXVuc2lnbmVkIGludCBwd21faGlnaD0wOwoKCgl7CgoKCgkJaWYgKGFyZ2MgPT0gMSkKCQl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJCX0KCQllbHNlewoJCQlpZiAoYXJnYyA+PSAyKQoJCQl7CgkJCQkvLyB6cTBwcjAgPSBhcmd2WzFdOwoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCWlkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQkJCS8vdm9sdGFnZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJCX0KCgkJCWlmIChhcmdjID49IDMpCgkJCXsKCgkJCQlwd21fbG93PSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PSA0KQoJCQl7CgoJCQkJcHdtX2hpZ2g9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCQl9CgkJCXB3bV9sb3c9KHB3bV9sb3c+MHgxZik/KDB4MWYpOihwd21fbG93KTsKCQkJcHdtX2hpZ2g9KHB3bV9oaWdoPjB4MWYpPygweDFmKToocHdtX2hpZ2gpOwoKCQkJcHJpbnRmKCJcbnB3bV9sb3c9PSAweCUwOGQgMC0xZlxuIiwgcHdtX2xvdyk7CgkJCXByaW50ZigiXG5wd21faGlnaD09IDB4JTA4ZCAgMC0xZlxuIiwgcHdtX2hpZ2gpOwoJCQlwcmludGYoIlxucHdtX2lkPT0gMHglMDhkXG4iLCBpZCk7CgkJCXByaW50ZigiXG5wd21faWQgMD09IHB3bV9hXG4iKTsKCQkJcHJpbnRmKCJcbnB3bV9pZCAxPT0gcHdtX2JcbiIpOwoJCQlwcmludGYoIlxucHdtX2lkIDI9PSBwd21fY1xuIik7CgkJCXByaW50ZigiXG5wd21faWQgMz09IHB3bV9kXG4iKTsKCQkJcHJpbnRmKCJcbnB3bV9pZCA0PT0gcHdtX2VcbiIpOwoJCQlwcmludGYoIlxucHdtX2lkIDU9PSBwd21fZlxuIik7CgkJCS8vZGRyX3Rlc3RfcHdtX3NldF92b2x0YWdlKGlkLHZvbHRhZ2UpOwoKCQkJewoKCgoKI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKCgoKCgoKCQkJCWVudW0gcHdtX2lkIHsKCQkJCQlwd21fYSA9IDAsCgkJCQkJcHdtX2IsCgkJCQkJcHdtX2MsCgkJCQkJcHdtX2QsCgkJCQkJcHdtX2UsCgkJCQkJcHdtX2YsCgkJCQl9OwoKCgkJCQkvL3ByaW50ZigidGVzdCBkZHIgaW5pdCBwd20gIGlkICUwOGQgXG4iLGlkKTsKCgkJCQl1bnNpZ25lZCBpbnQgcmVnOwoKCQkJCS8qCgkJCQkgKiBUT0RPOiBzdXBwb3J0IG1vcmUgcHdtIGNvbnRyb2xsZXJzLCByaWdodCBub3cgb25seSBzdXBwb3J0CgkJCQkgKiBQV01fQiwgUFdNX0QKCQkJCSAqLwoKCQkJCXN3aXRjaCAoaWQpIHsKCQkJCQljYXNlIHB3bV9iOgoJCQkJCQlyZWcgPSAqKFBfUFdNX01JU0NfUkVHX0FCKTsKCQkJCQkJcmVnICY9IH4oMHg3ZiA8PCAxNik7CgkJCQkJCXJlZyB8PSAgKCgxIDw8IDIzKSB8ICgxIDw8IDEpKTsKCQkJCQkJKihQX1BXTV9NSVNDX1JFR19BQikgPSByZWc7CgkJCQkJCS8qCgkJCQkJCSAqIGRlZmF1bHQgc2V0IHRvIG1heCB2b2x0YWdlCgkJCQkJCSAqLwoJCQkJCQkqKFBfUFdNX1BXTV9CKSA9MHgwMDAwMWY7Ly9wd21fbG93fChwd21faGlnaDw8MTYpOy8vIGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZVtBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSkgLSAxXVswXTsKCQkJCQkJcmVnICA9ICooUF9QSU5fTVVYX1JFRzEpOwoJCQkJCQlyZWcgJj0gfigxIDw8IDEwKTsKCQkJCQkJKihQX1BJTl9NVVhfUkVHMSkgPSByZWc7CgoJCQkJCQlyZWcgID0gKihQX1BJTl9NVVhfUkVHMik7CgkJCQkJCXJlZyAmPSB+KDEgPDwgNSk7CgkJCQkJCXJlZyB8PSAgKDEgPDwgMTEpOwkJLy8gZW5hYmxlIFBXTV9CCgkJCQkJCSooUF9QSU5fTVVYX1JFRzIgKT0gcmVnOwoJCQkJCQlicmVhazsKCgkJCQkJY2FzZSBwd21fZDoKCQkJCQkJcmVnID0gKihQX1BXTV9NSVNDX1JFR19DRCk7CgkJCQkJCXJlZyAmPSB+KDB4N2YgPDwgMTYpOwoJCQkJCQlyZWcgfD0gICgoMSA8PCAyMykgfCAoMSA8PCAxKSk7CgkJCQkJCSooUF9QV01fTUlTQ19SRUdfQ0QpID0gcmVnOwoJCQkJCQkvKgoJCQkJCQkgKiBkZWZhdWx0IHNldCB0byBtYXggdm9sdGFnZQoJCQkJCQkgKi8KCQkJCQkJKihQX1BXTV9QV01fRCApPSAweDAwMDAxZjsvL3B3bV9sb3d8KHB3bV9oaWdoPDwxNik7Ly9kZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpIC0gMV1bMF07CgkJCQkJCXJlZyAgPSooIFBfUElOX01VWF9SRUcxKTsKCQkJCQkJcmVnICY9IH4oMSA8PCA5KTsKCQkJCQkJcmVnICY9IH4oMSA8PCAxMSk7CgkJCQkJCSooUF9QSU5fTVVYX1JFRzEpID0gcmVnOwoKCQkJCQkJcmVnICA9ICooUF9QSU5fTVVYX1JFRzIpOwoJCQkJCQlyZWcgfD0gICgxIDw8IDEyKTsJCS8vIGVuYWJsZSBQV01fRAoJCQkJCQkqKFBfUElOX01VWF9SRUcyKSA9IHJlZzsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJZGRyX3VkZWxheSgyMDApOwoKCQkJCS8vcHJpbnRmKCJ0ZXN0IGRkciBzZXQgdmRkZWUgdG8gICUwOGQgbXZcbiIsdm9sdGFnZSk7CgoJCQkJLy9mb3IgKHRvID0gMDsgdG8gPCBBUlJBWV9TSVpFKGRkcl9lZV9wd21fdm9sdGFnZV90YWJsZSk7IHRvKyspIHsKCQkJCS8vCWlmIChkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGVbdG9dWzFdID49IHZvbHRhZ2UpIHsKCQkJCS8vCQlicmVhazsKCQkJCS8vCX0KCQkJCS8vfQoJCQkJLy9pZiAodG8gPj0gQVJSQVlfU0laRShkZHJfZWVfcHdtX3ZvbHRhZ2VfdGFibGUpKSB7CgkJCQkvLwl0byA9IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKSAtIDE7CgkJCQkvL30KCgkJCQlzd2l0Y2ggKGlkKSB7CgkJCQkJY2FzZSBwd21fYjoKCQkJCQkJKihQX1BXTV9QV01fQikgPSBwd21fbG93fChwd21faGlnaDw8MTYpOy8vZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVswXTsKCQkJCQkJYnJlYWs7CgoJCQkJCWNhc2UgcHdtX2Q6CgkJCQkJCSooUF9QV01fUFdNX0QpID0gcHdtX2xvd3wocHdtX2hpZ2g8PDE2KTsvL2Rkcl9lZV9wd21fdm9sdGFnZV90YWJsZVt0b11bMF07CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJZGRyX3VkZWxheSgyMDApOwoJCQl9CgoJCQl1bnNpZ25lZCBpbnQgICBkZGxfMTAwc3RlcF9wcz0gMDsKCQkJZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZik7CgkJCXByaW50ZigiXG5kZGxfMTAwc3RlcF9wcz09ICUwOGQsMF81Y3ljbGVfcHM9PSAlMDhkLDBfNWN5Y2xlPT0weCUwOHhcbiIsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLAoJCQkJCSgoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZikpOwoKCQkJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQkJQ0xPU0VfQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCgoJCX0KCgl9CglyZXR1cm4gMTsKCn0KaW50IGRvX2Rkcl90ZXN0X3B3bV9kZGwgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl90ZXN0X3B3bV9kZGwgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgoJLy93cml0ZWwoKDApLCAweGM4ODM2YzAwKTsKCU9QRU5fQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCWNoYXIgKmVuZHA7CgoJdW5zaWduZWQgaW50IGlkPTA7Cgl1bnNpZ25lZCBpbnQgdm9sdGFnZT0xMDAwOwoJdW5zaWduZWQgaW50IGxvb3A9MDsKCWludCB0bzsKCglpZiAoYXJnYyA9PSAxKQoJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCX0KCWVsc2V7CgkJaWYgKGFyZ2MgPj0gMikKCQl7CgkJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJCXZvbHRhZ2U9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCX0KCgkJaWYgKGFyZ2MgPj0gMykKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCWlkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQl9CgkJaWYgKGFyZ2MgPj0gNCkKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCWxvb3A9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCX0KCgkJcHJpbnRmKCJcbnZvbHRhZ2U9PSAlMDhkXG4iLCB2b2x0YWdlKTsKCQlwcmludGYoIlxucHdtX2lkPT0gJTA4ZFxuIiwgaWQpOwoJCXByaW50ZigiXG5wd21faWQgMD09IHB3bV9hXG4iKTsKCQlwcmludGYoIlxucHdtX2lkIDE9PSBwd21fYlxuIik7CgkJcHJpbnRmKCJcbnB3bV9pZCAyPT0gcHdtX2NcbiIpOwoJCXByaW50ZigiXG5wd21faWQgMz09IHB3bV9kXG4iKTsKCQlwcmludGYoIlxucHdtX2lkIDQ9PSBwd21fZVxuIik7CgkJcHJpbnRmKCJcbnB3bV9pZCA1PT0gcHdtX2ZcbiIpOwoJCWRkcl90ZXN0X3B3bV9zZXRfdm9sdGFnZShpZCx2b2x0YWdlKTsKCQl1bnNpZ25lZCBpbnQgICBkZGxfMTAwc3RlcF9wcz0gMDsKCQlkZGxfMTAwc3RlcF9wcz0oKDEwMCoxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSkvKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjApKSk+PjE2KSYweGZmKTsKCQlwcmludGYoIlxudm9sdGFnZSA9PSUwOGQsZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLHZvbHRhZ2UsIGRkbF8xMDBzdGVwX3BzLCgoMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLAoJCQkJKCgoKHJlYWRsKEREUjBfUFVCX0FDTURMUjApKSk+PjE2KSYweGZmKSk7CgoJCWlmIChsb29wKQoJCXsKCgkJCWZvciAodG8gPSAwOyB0byA8IEFSUkFZX1NJWkUoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlKTsgdG8rKykgewoKCQkJCWRkcl90ZXN0X3B3bV9zZXRfdm9sdGFnZShpZCwoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVsxXSkpOwoJCQkJZGRsXzEwMHN0ZXBfcHM9KCgxMDAqMTAwMCoxMDAwKS8oMipnbG9iYWxfZGRyX2NsaykpLygoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZik7CgkJCQlwcmludGYoIlxudm9sdGFnZSA9PSUwOGQsZGRsXzEwMHN0ZXBfcHM9PSAlMDhkLDBfNWN5Y2xlX3BzPT0gJTA4ZCwwXzVjeWNsZT09MHglMDh4XG4iLAoJCQkJCQkoZGRyX2VlX3B3bV92b2x0YWdlX3RhYmxlW3RvXVsxXSksZGRsXzEwMHN0ZXBfcHMsKCgxMDAwKjEwMDApLygyKmdsb2JhbF9kZHJfY2xrKSksCgkJCQkJCSgoKChyZWFkbChERFIwX1BVQl9BQ01ETFIwKSkpPj4xNikmMHhmZikpOwoJCQl9CgkJfQoKCgkJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQlDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCgl9CgoJcmV0dXJuIDE7Cgp9CgppbnQgZG9fZGRyX3Rlc3Rfc2hpZnRfZGRyX2NsayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciB0ZXN0IHNoaWZ0IGRkciBjbGsgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCglpbnQgdGVzdF9hcHBfcHJhWzRdID0gezAsMCwwLDB9OwoKCWNoYXIgKmVuZHA7CgoKCWlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJfQoJZWxzZXsKCQlpZiAoYXJnYyA+PSAyKQoJCXsKCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJdGVzdF9hcHBfcHJhWzBdPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDMpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl0ZXN0X2FwcF9wcmFbMV09IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCX0KCgkJaWYgKGFyZ2MgPj0gNCkKCQl7CgkJCS8vIHpxMnByMCA9YXJndlszXTsKCQkJdGVzdF9hcHBfcHJhWzJdPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCgkJfQoJfQoKCgkvL3NoaWZ0IGRkciBmcmVxdWVuY3kgdGVzdAoJcHJpbnRmKCJ0ZXN0X2FwcF9wcmFbMF09PTB4JTA4eFxuIix0ZXN0X2FwcF9wcmFbMF0gKTsKCXByaW50ZigidGVzdF9hcHBfcHJhWzFdPT0weCUwOHhcbiIsdGVzdF9hcHBfcHJhWzFdICk7CglwcmludGYoInRlc3RfYXBwX3ByYVsyXT09MHglMDh4XG4iLHRlc3RfYXBwX3ByYVsyXSApOwoJdW5zaWduZWQgaW50IHJlZ192YWx1ZVs0XSA9IHswfTsKCXVuc2lnbmVkIGludCBkZWxheV9tc190aW1lPTMwOwoJdW5zaWduZWQgaW50IHRlc3RfdGltZXM9MHhmZmZmOwoJdW5zaWduZWQgaW50IHRlc3RfY291bnQ9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xvb3BfZmxhZz0wOwoJcmVnX3ZhbHVlWzBdPTB4YzRhYWU4NjAgOwoJd3JfcmVnKCAweGM4ODM2MDFjLChyZWdfdmFsdWVbMF0pKTsKCS8vdXBkYXRlX3JlZ19kZWJ1Z192YWx1ZSgmKHJlZ192YWx1ZVswXSksMHhjODgzNjAxYyApOwoJcmVnX3ZhbHVlWzFdPTB4MDAwZWEyMDMgIDsKCXdyX3JlZyggMHhjODgzNzAwNCwocmVnX3ZhbHVlWzFdKSk7CgkvL3VwZGF0ZV9yZWdfZGVidWdfdmFsdWUoJihyZWdfdmFsdWVbMV0pLDB4Yzg4MzcwMDQgICk7CgoJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NDAgIDsKCWlmICgodGVzdF9hcHBfcHJhWzFdKSkKCXtkZWxheV9tc190aW1lPSh0ZXN0X2FwcF9wcmFbMV0pOwoJfQoJaWYgKCh0ZXN0X2FwcF9wcmFbMl0pKQoJe3Rlc3RfdGltZXM9KHRlc3RfYXBwX3ByYVsyXSk7CgkJaWYgKHRlc3RfdGltZXMgPT0gMHhmZmZmZmZmZikKCQkJdGVzdF9sb29wX2ZsYWc9MTsKCX0KCXByaW50ZigiZGVsYXlfbXNfdGltZT09JWRcbiIsZGVsYXlfbXNfdGltZSApOwoJcHJpbnRmKCJ0ZXN0X3RpbWVzPT0lZFxuIix0ZXN0X3RpbWVzICk7CglpZiAodGVzdF9hcHBfcHJhWzBdID09MCkKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJaWYgKHRlc3RfYXBwX3ByYVswXSA9PTEpCgkJcmVnX3ZhbHVlWzJdPTB4MDNlM2I3NTQgIDsKCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT0yKQoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU4ICA7CglpZiAodGVzdF9hcHBfcHJhWzBdID09MykKCQlyZWdfdmFsdWVbMl09MHgwM2UzYjc1YyAgOwoKCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT00KQoJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzUwICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NTQgIDsKCX0KCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT01KQoJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzUwICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NTggIDsKCX0KCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT02KQoJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzUwICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NWMgIDsKCX0KCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT03KQoJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU0ICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NTggIDsKCX0KCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT04KQoJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU0ICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NWMgIDsKCX0KCWlmICh0ZXN0X2FwcF9wcmFbMF0gPT05KQoJewoJCXJlZ192YWx1ZVsyXT0weDAzZTNiNzU4ICA7CgkJcmVnX3ZhbHVlWzNdPTB4MDNlM2I3NWMgIDsKCX0KCXdoaWxlICgxKSB7dGVzdF9jb3VudCsrOwoJCS8vCXJlZ192YWx1ZVsyXT0weDAzZTNiNzUwICA7CgkJLy91cGRhdGVfcmVnX2RlYnVnX3ZhbHVlKCYocmVnX3ZhbHVlWzJdKSwweGM4ODM3MDBjICApOwoKCQl3cl9yZWcoIDB4Yzg4MzcwMTAsKDB4MDAxYzAxMDEpKTsKCQlkZHJfdWRlbGF5KGRlbGF5X21zX3RpbWUgKiAxMDAwKTsKCQl3cl9yZWcoIDB4Yzg4MzcwMGMsKHJlZ192YWx1ZVsyXSkpOwoJCXByaW50ZigiXG51cGRhdGUgIHJlZyAweGM4ODM3MDBjPTB4JTA4eFxuIixyZF9yZWcoMHhjODgzNzAwYykpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXdyX3JlZyggMHhjODgzNzAxMCwoMHgwMDBjMDEwMSkpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXdyX3JlZyggMHhjODgzNzAxMCwoMHgwMDFjMDEwMSkpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCS8vdXNsZWVwKDEwMDAgKiAxMDAwKTsKCQkvL3JlZ192YWx1ZVszXT0weDAzZTNiNzQwICA7CgkJLy91cGRhdGVfcmVnX2RlYnVnX3ZhbHVlKCYocmVnX3ZhbHVlWzNdKSwweGM4ODM3MDBjICAgKTsKCQl3cl9yZWcoIDB4Yzg4MzcwMGMsKHJlZ192YWx1ZVszXSkpOwoJCXByaW50ZigiXG51cGRhdGUgIHJlZyAweGM4ODM3MDBjPTB4JTA4eFxuIixyZF9yZWcoMHhjODgzNzAwYykpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXdyX3JlZyggMHhjODgzNzAxMCwoMHgwMDBjMDEwMSkpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXByaW50ZigiXG50ZXN0aW5nICVkIHRpbWVzXG4iLCh0ZXN0X2NvdW50KSk7CgkJaWYgKCF0ZXN0X2xvb3BfZmxhZykKCQl7CgkJCWlmICh0ZXN0X2NvdW50ID09IHRlc3RfdGltZXMpCgkJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIDE7Cgp9CgojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQojZWxzZQppbnQgZG9fZGRyX3Rlc3Rfc2hpZnRfZGRyX2Nsa190eGwoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglwcmludGYoIlxuRW50ZXIgdGVzdCBzaGlmdCBkZHIgY2xrIGZ1bmN0aW9uXG4iKTsKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJaW50IHRlc3RfYXBwX3ByYVs0XSA9IHswLDAsMCwwfTsKCgljaGFyICplbmRwOwoJaWYgKGFyZ2MgPT0gMSkKCXsgIHByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCgl9CgllbHNlewoJCWlmIChhcmdjID49IDIpCgkJewoJCQkvLyB6cTBwcjAgPSBhcmd2WzFdOwoJCQl0ZXN0X2FwcF9wcmFbMF09IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCX0KCgkJaWYgKGFyZ2MgPj0gMykKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCXRlc3RfYXBwX3ByYVsxXT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoKCQlpZiAoYXJnYyA+PSA0KQoJCXsKCQkJLy8genEycHIwID1hcmd2WzNdOwoJCQl0ZXN0X2FwcF9wcmFbMl09IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoKCQl9fQoJaWYgKGFyZ2MgPj0gNSkKCXsKCQkvLyB6cTJwcjAgPWFyZ3ZbM107CgkJdGVzdF9hcHBfcHJhWzNdPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCgl9CgoKCgoKCS8vc2hpZnQgZGRyIGZyZXF1ZW5jeSB0ZXN0CglwcmludGYoInRlc3RfYXBwX3ByYVswXT09MHglMDh4XG4iLHRlc3RfYXBwX3ByYVswXSApOwoJcHJpbnRmKCJ0ZXN0X2FwcF9wcmFbMV09PTB4JTA4eFxuIix0ZXN0X2FwcF9wcmFbMV0gKTsKCXByaW50ZigidGVzdF9hcHBfcHJhWzJdPT0weCUwOHhcbiIsdGVzdF9hcHBfcHJhWzJdICk7CglwcmludGYoInRlc3RfYXBwX3ByYVszXT09MHglMDh4XG4iLHRlc3RfYXBwX3ByYVszXSApOwoJLy8gICB1bnNpZ25lZCBpbnQgcmVnX3ZhbHVlWzRdID0gezB9OwoJdW5zaWduZWQgaW50IGRlbGF5X21zX3RpbWU9MzA7Cgl1bnNpZ25lZCBpbnQgdGVzdF90aW1lcz0weGZmZmY7Cgl1bnNpZ25lZCBpbnQgdGVzdF9jb3VudD0wOwoJdW5zaWduZWQgaW50IHRlc3RfbG9vcF9mbGFnPTA7CgkvL3JlZ192YWx1ZVswXT0wIDsKCS8vCXJlZ192YWx1ZVsxXT0weDAwMGVhMjAyICA7CgkvL3dyX3JlZyggMHhjODgzNzAwNCwocmVnX3ZhbHVlWzFdKSk7CgkvL3VwZGF0ZV9yZWdfZGVidWdfdmFsdWUoJihyZWdfdmFsdWVbMV0pLDB4Yzg4MzcwMDQgICk7CgoKCWlmICgodGVzdF9hcHBfcHJhWzFdKSkKCXtkZWxheV9tc190aW1lPSh0ZXN0X2FwcF9wcmFbMV0pOwoJfQoJaWYgKCh0ZXN0X2FwcF9wcmFbMl0pKQoJe3Rlc3RfdGltZXM9KHRlc3RfYXBwX3ByYVsyXSk7CgkJaWYgKHRlc3RfdGltZXMgPT0gMHhmZmZmZmZmZikKCQkJdGVzdF9sb29wX2ZsYWc9MTsKCX0KCWRlbGF5X21zX3RpbWU9MDsKCXByaW50ZigiZGVsYXlfbXNfdGltZT09JWRcbiIsZGVsYXlfbXNfdGltZSApOwoJcHJpbnRmKCJ0ZXN0X3RpbWVzPT0lZFxuIix0ZXN0X3RpbWVzICk7CgoKCS8vCSAgcHJpbnRmKCJcbnRlc3RpbmcgcmVnX3ZhbHVlWzJdID09JTA4eDsgXG4iLChyZWdfdmFsdWVbMikpOwoKCgl3aGlsZSAoMSkge3Rlc3RfY291bnQrKzsKCQkvLwlyZWdfdmFsdWVbMl09MHgwM2UzYjc1MCAgOwoJCS8vdXBkYXRlX3JlZ19kZWJ1Z192YWx1ZSgmKHJlZ192YWx1ZVsyXSksMHhjODgzNzAwYyAgKTsKCgkJd3JfcmVnKCAweGZmNjM3MDBjLDB4M2UzYjc3NCk7CgkJLy8Jd3JfcmVnKCAweGZmNjM3MDBjLCgocmRfcmVnKDB4ZmY2MzcwMGMpKSYofigweDc8MikpKXwocmVnX3ZhbHVlWzJdPDwyKXwoMTw8NCkpOwoJCXByaW50ZigiXG51cGRhdGUgIHJlZyAweGZmNjM3MDBjPTB4JTA4eFxuIixyZF9yZWcoMHhmZjYzNzAwYykpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoJCXdyX3JlZyggMHhmZjYzNzAwYywweDNlM2I3NjQpOwoJCS8vd3JfcmVnKCAweGZmNjM3MDBjLCgocmRfcmVnKDB4ZmY2MzcwMGMpKSYofigweDc8MikpKXwocmVnX3ZhbHVlWzJdPDwyKXwoMTw8NCkpOwoJCXByaW50ZigiXG4uLi51cGRhdGUgIHJlZyAweGZmNjM3MDBjPTB4JTA4eFxuIixyZF9yZWcoMHhmZjYzNzAwYykpOwoJCWRkcl91ZGVsYXkoZGVsYXlfbXNfdGltZSAqIDEwMDApOwoKCgoJCXByaW50ZigiXG50ZXN0aW5nICVkIHRpbWVzXG4iLCh0ZXN0X2NvdW50KSk7CgkJaWYgKCF0ZXN0X2xvb3BfZmxhZykKCQl7CgkJCWlmICh0ZXN0X2NvdW50ID09IHRlc3RfdGltZXMpCgkJCQlicmVhazsKCQl9Cgl9CgoJcmV0dXJuIDE7Cn0KI2VuZGlmCgp2b2lkIGRkcl9tZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVpbnQzMl90IGxlbikKewoJLy9lbmFibGVfbW11X2VsMV9zKCk7CgkvL3ByaW50ZigiXG5sZW49PSVkLCIsbGVuKTsKCS8vcHJpbnRmKGxlbik7CgkvL3NlcmlhbF9wdXRzKCJcbiIpOwoJLy91aW50MzJfdCBkZHJfdGVzdF9zdGFydF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCS8vY29uc3QgY2hhciAqcyA9IHNyYzsKCS8vY2hhciAqZCA9IGRzdDsKCWxlbj0obGVuPj4zKTsKCWNvbnN0IGxvbmcgbG9uZyAqcyA9IHNyYzsKCWxvbmcgbG9uZyAqZCA9IGRzdDsKCSNpZmRlZiBURVNUX0wxX0NBQ0hFCgl2b2lkICpib3VuZD0odm9pZCAqKXNyYysxNioxMDI0OyAvL2RlYnVnIGZvciB0ZXN0IEwxIGNhY2hlICxpZiBvbmx5IHJlYWQgd3JpdGUgc21hbGwgYXJlYWQKCSNlbmRpZgoJd2hpbGUgKGxlbikKCXsKCQkvL2Rkcl9wbGRfY2FjaGUocykgOwoJCS8vLzEgdGltZXMgICBsZW49PTMzNTU0NDMyICAgY29weSB0aW1lPT0xODE5MiB1cyAgIDEuMmcgIGJhbmR3aWR0aCAzNjg4TS9TCgkJLy8gNHRpbWVzICAgbGVuPT0zMzU1NDQzMiAgIGNvcHkgdGltZT09MTE4NDQgdXMgICAxLjJnICBiYW5kd2lkdGggNTY2Nk0vUwoJCS8vIDh0aW1lcyAgIGxlbj09MzM1NTQ0MzIgICBjb3B5IHRpbWU9PTExODQ0IHVzICAgMS4yZyAgYmFuZHdpZHRoIDU2NjZNL1MKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQkqZCsrID0gKnMrKzsKCQlsZW49bGVuLTQ7CgkJI2lmZGVmIFRFU1RfTDFfQ0FDSEUKCQlpZiAoKHZvaWQgKilzID49Ym91bmQpCgkJCXsKCQkJICBzPXNyYzsKCQkgICAgICAgICBkPWRzdDsKCQkJIH0KCQkjZW5kaWYKCX0KCS8vCXVpbnQzMl90IGRkcl90ZXN0X2VuZF90aW1lX3VzPWdldF91c190aW1lKCk7ICAvLyBjaGVjayBjb3N0IHRpbWUKCS8vCXNlcmlhbF9wdXRzKCJcbmNvcHkgdGltZT09Iik7CgkvLwlzZXJpYWxfcHV0X2RlYyhkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKTsKCS8vCXNlcmlhbF9wdXRzKCJcbiIpOwoJLy9wcmludGYoIlxuY29weSB0aW1lPT0lZCB1cywiLChkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKSk7Cn0KCiNkZWZpbmUgUEFUVEVSTl9NQVRSSVhfWCAgICgzKzMyKzE2KzE3KSAgICAgLy82OCozMj09MjE3NiAvLy8yLjJrIC0weDg4MC0xIGxvb3AKI2RlZmluZSBQQVRURVJOX01BVFJJWF9ZICAoMzIpCiNkZWZpbmUgUEFUVEVSTl9NQVRSSVhfTE9PUF9TSVpFICAgKChQQVRURVJOX01BVFJJWF9YKSooUEFUVEVSTl9NQVRSSVhfWSkqNCkKCnVuc2lnbmVkIGludCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcih1bnNpZ25lZCBpbnQgYWRkX29mZnNldCApCnsJCgoJdW5zaWduZWQgaW50IHBhdHRlcm5fc2VsZWN0PTA7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl92YWx1ZT0wOwoJLy90ZXN0X3NpemU9KHRlc3Rfc2l6ZT4weDEwMDAwKT90ZXN0X3NpemU6MHgxMDAwMDsKCS8vCXVpbnQzMl90IHdyaXRlX2FkZHIgPSBzdGFydF9hZGQ7Cgl1aW50MzJfdCBtYXJ0aXhfeF9zZWxlY3Q9IDA7Cgl1aW50MzJfdCBtYXJ0aXhfeV9zZWxlY3Q9IDA7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl92YWx1ZV90ZW1wXzE2PTA7Cgl7CgkJLy8JdWludDMyX3QgdGVzdF9lbmRfYWRkID0gc3RhcnRfYWRkK3Rlc3Rfc2l6ZTsKCQkvLwlmb3IoKHdyaXRlX2FkZHI9c3RhcnRfYWRkKTsod3JpdGVfYWRkcjx0ZXN0X2VuZF9hZGQpOykKCQl7CgkJCXBhdHRlcm5fc2VsZWN0PSgoYWRkX29mZnNldCklKChQQVRURVJOX01BVFJJWF9ZKSooUEFUVEVSTl9NQVRSSVhfWCkpKTsKCQkJbWFydGl4X3hfc2VsZWN0PXBhdHRlcm5fc2VsZWN0LyhQQVRURVJOX01BVFJJWF9ZKTsKCQkJbWFydGl4X3lfc2VsZWN0PXBhdHRlcm5fc2VsZWN0JShQQVRURVJOX01BVFJJWF9ZKTsKCQkJLy93cml0ZV9hZGRyX25pYmJsZV9zdGFydD0oKCgoYWRkX29mZnNldC9QQVRURVJOX01BVFJJWF9ZKS9QQVRURVJOX01BVFJJWF9YKSkqCgkJCS8vCSgoKFBBVFRFUk5fTUFUUklYX1kpKlBBVFRFUk5fTUFUUklYX1gpKSk7CgkJCS8vd3JpdGVfYWRkcl9uaWJibGVfc3RhcnQ9KCgoYWRkX29mZnNldCklUEFUVEVSTl9NQVRSSVhfWSklUEFUVEVSTl9NQVRSSVhfWCkKCQkJewoJCQkJaWYobWFydGl4X3hfc2VsZWN0PT0wKQoJCQkJCXBhdHRlcm5fdmFsdWU9MHhhYWFhNTU1NTsgIC8vZm9yIDE2IGJpdCBidXMgcGF0dGVybgoKCQkJCWlmKG1hcnRpeF94X3NlbGVjdD09MSkKCQkJCQlwYXR0ZXJuX3ZhbHVlPTB4MDAwMGZmZmY7IC8vZm9yIDE2IGJpdCBidXMgcGF0dGVybgoKCQkJCWlmKG1hcnRpeF94X3NlbGVjdD09MikKCQkJCQlwYXR0ZXJuX3ZhbHVlPTA7CgoJCQkJaWYoKG1hcnRpeF94X3NlbGVjdD4yKSYmKG1hcnRpeF94X3NlbGVjdDwoMyszMikpKQoJCQkJewoJCQkJCXBhdHRlcm5fdmFsdWU9MTw8KG1hcnRpeF94X3NlbGVjdC0zKTsKCQkJCX0KCQkJCWlmKChtYXJ0aXhfeF9zZWxlY3Q+KDIrMzIpKSYmKG1hcnRpeF94X3NlbGVjdDwoMyszMisxNikpKSAgIC8vZm9yIDE2IGJpdCBidXMgcGF0dGVybgoJCQkJewoJCQkJCXBhdHRlcm5fdmFsdWVfdGVtcF8xNj0oMTw8KG1hcnRpeF94X3NlbGVjdC0zLTMyKSk7CgkJCQkJcGF0dGVybl92YWx1ZT1wYXR0ZXJuX3ZhbHVlX3RlbXBfMTZ8KCh+cGF0dGVybl92YWx1ZV90ZW1wXzE2KTw8MTYpOwoJCQkJfQoJCQkJaWYoKG1hcnRpeF94X3NlbGVjdD4oMiszMisxNikpJiYobWFydGl4X3hfc2VsZWN0PCgzKzMyKzE2KzE3KSkpICAgLy9mb3IgZGJpIGJ1cyBwYXR0ZXJuICAxNyBncm91cAoJCQkJewoJCQkJCXBhdHRlcm5fdmFsdWVfdGVtcF8xNj0oMHgwZjBmKzB4ZjBmKihtYXJ0aXhfeF9zZWxlY3QtMy0zMi0xNikpOwoJCQkJCXBhdHRlcm5fdmFsdWU9cGF0dGVybl92YWx1ZV90ZW1wXzE2fCgofnBhdHRlcm5fdmFsdWVfdGVtcF8xNik8PDE2KTsJCQkJCQkJCQkKCQkJCX0KCQkJfQoJCQlpZihtYXJ0aXhfeV9zZWxlY3QlMikKCQkJcGF0dGVybl92YWx1ZT1+cGF0dGVybl92YWx1ZTsKCQl9Cgl9CgkvLwlzZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc0Iik7CglyZXR1cm4gcGF0dGVybl92YWx1ZTsKfQoKdm9pZCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2FyZWEodW5zaWduZWQgaW50IHRlc3RfaW5pdF9zdGFydCx1bnNpZ25lZCBpbnQgdGVzdF9zaXplLHVuc2lnbmVkIGludCBwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyApCnsKCS8vCXByaW50ZigiXG4gMTExIik7CglpZihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZz09MCkKCXBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nPTE7ICAvL2ZvciBkaWZmZXJlbnQgIGZyZXF1ZW5jeSBwYXR0ZXJuCgl0ZXN0X3NpemU9KHRlc3Rfc2l6ZT4oKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkpP3Rlc3Rfc2l6ZTooKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkvL3Vuc2lnbmVkIGludCB0ZXN0X3N0YXJ0PTB4MTA4MDAwMDsKCXVuc2lnbmVkIGludCB3cml0ZV9hZGQ9dGVzdF9pbml0X3N0YXJ0OwoJdW5zaWduZWQgaW50IHNpemVfbG9vcD0wOwoJdW5zaWduZWQgaW50IHNpemVfbG9vcF9tYXg9MDsKCS8vdW5zaWduZWQgaW50IGNvdW50PTA7Cglmb3IoOyhzaXplX2xvb3A8KChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKTspCgl7CgkJLy9zZXJpYWxfcHV0cygiXG5jcHVfdGVzdF9kZHJfZGVidWc1Iik7CgoJCS8vCWZvciggIGNvdW50PTA7Y291bnQ8KHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKTspCgkJewoJCQl3cml0ZV9hZGQgPSAodWludDMyX3QpKHNpemVfbG9vcCArIHRlc3RfaW5pdF9zdGFydCk7CgkJCXdyX3JlZygodW5zaWduZWQgbG9uZyl3cml0ZV9hZGQsIGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKChzaXplX2xvb3A+PjIpL3BhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSk7CgkJCXNpemVfbG9vcD1zaXplX2xvb3ArNDsKCQl9CgkJLy8Jc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNiIpOwoKCQkvLwlzZXJpYWxfcHV0cygiICIpOwoJCSNpZiAwCgkJc2VyaWFsX3B1dF9oZXgoc2l6ZV9sb29wLDMyKTsKCQlzZXJpYWxfcHV0cygiICIpOwoJCXNlcmlhbF9wdXRfaGV4KGNwdV9kZHJfdGVzdF9pbml0X3BhdHRlcm5fZ2VuZXJhdGVyKHNpemVfbG9vcD4+MiksMzIpOwoJCSNlbmRpZgoJfQoJc2l6ZV9sb29wPTE7CglzaXplX2xvb3BfbWF4PSgodGVzdF9zaXplLygoKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkpKSsxKTsKCWZvcig7KHNpemVfbG9vcDxzaXplX2xvb3BfbWF4KTspCgl7CgkJLy8Jc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNDEiKTsKCQlkZHJfbWVtY3B5KCh2b2lkICopKHVpbnQ2NF90KSh0ZXN0X2luaXRfc3RhcnQrKChQQVRURVJOX01BVFJJWF9MT09QX1NJWkUpKihwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpKihzaXplX2xvb3ApKSwgKHZvaWQgKikodWludDY0X3QpdGVzdF9pbml0X3N0YXJ0LCAoKFBBVFRFUk5fTUFUUklYX0xPT1BfU0laRSkqKHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKSkpOwoJCS8vc2VyaWFsX3B1dHMoIlxuY3B1X3Rlc3RfZGRyX2RlYnVnNDIiKTsKCQlzaXplX2xvb3ArKzsKCX0KfQoKdW5zaWduZWQgaW50IGNwdV9kZHJfdGVzdCh1bnNpZ25lZCB0ZXN0X2luaXRfc3RhcnQsdW5zaWduZWQgaW50IHN0YXJ0X2FkZCwgdW5zaWduZWQgaW50IHRlc3Rfc2l6ZSwgdW5zaWduZWQgaW50IHRlc3RfZGF0YV9iaXRfZW5hYmxlLHVuc2lnbmVkIGludCBwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykKewoJLy9wcmludGYoIlxuIDExMTIiKTsKCgl1bnNpZ25lZCBpbnQgc3JjX2FkZD10ZXN0X2luaXRfc3RhcnQ7Cgl1bnNpZ25lZCBpbnQgcGF0dGVybl92YWx1ZT0wOwoJdW5zaWduZWQgaW50IHNpemVfbG9vcD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2Vycm9yPTA7Cgl1bnNpZ25lZCBpbnQgcmVhZF9hZGQ9MDsKCXVuc2lnbmVkIGludCByZWFkX3ZhbHVlPTA7Cgl0ZXN0X3NpemU9KHRlc3Rfc2l6ZT4weDIwMDApPyh0ZXN0X3NpemUpOigweDIwMDApOwoJLy9jcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2FyZWEodGVzdF9zaXplKTsKCXVpbnQzMl90IGRkcl90ZXN0X3N0YXJ0X3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJZGRyX21lbWNweSgodm9pZCAqKSh1aW50NjRfdClzdGFydF9hZGQsICh2b2lkICopKHVpbnQ2NF90KXNyY19hZGQsIHRlc3Rfc2l6ZSk7Cgl1aW50MzJfdCBkZHJfdGVzdF9lbmRfdGltZV91cz1nZXRfdXNfdGltZSgpOyAgLy8gY2hlY2sgY29zdCB0aW1lCglwcmludGYoIlxuY3B1X2Rkcl90ZXN0X3Rlc3RfY29weV9iYW5kd2lkdGg9PSVkIE1ieXRlL3NcbiIsKDEqdGVzdF9zaXplKjIpLyhkZHJfdGVzdF9lbmRfdGltZV91cy1kZHJfdGVzdF9zdGFydF90aW1lX3VzKSk7CgoJZm9yKDtzaXplX2xvb3A8KHRlc3Rfc2l6ZSk7KQoJewoJCXJlYWRfYWRkID0gKHVpbnQzMl90KShzaXplX2xvb3AgKyBzdGFydF9hZGQpOwoJCXJlYWRfdmFsdWU9KHJkX3JlZygodW5zaWduZWQgbG9uZylyZWFkX2FkZCkpOwoJCXBhdHRlcm5fdmFsdWU9KCBjcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2dlbmVyYXRlcigoc2l6ZV9sb29wPj4yKS9wYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZykpOwoJCWlmKCgodGVzdF9kYXRhX2JpdF9lbmFibGUpJnJlYWRfdmFsdWUpIT0oKHRlc3RfZGF0YV9iaXRfZW5hYmxlKSZwYXR0ZXJuX3ZhbHVlKSkKCQl7CgkJCSNpZiAxCgkJCXByaW50ZigiZXJyb3IgZGF0YSAgZW5hYmxlICUwOHggcmVhZF92YWx1ZSAlMDh4ICBwYXR0ZXJuX3ZhbHVlICUwOHgiLHRlc3RfZGF0YV9iaXRfZW5hYmxlLHJlYWRfdmFsdWUscGF0dGVybl92YWx1ZSk7CgkJCSNpZiAwCgkJCXNlcmlhbF9wdXRzKCJcbmVycm9yIGRhdGEgIik7CgkJCXNlcmlhbF9wdXRfaGV4KHRlc3RfZGF0YV9iaXRfZW5hYmxlLDMyKTsKCQkJc2VyaWFsX3B1dHMoIiAiKTsKCQkJc2VyaWFsX3B1dF9oZXgocmVhZF92YWx1ZSwzMik7CgkJCXNlcmlhbF9wdXRzKCIgIik7CgkJCXNlcmlhbF9wdXRfaGV4KHBhdHRlcm5fdmFsdWUsMzIpOwoJCQlzZXJpYWxfcHV0cygiXG4iKTsKCQkJI2VuZGlmCgkJCSNlbmRpZgoJCQlkZHJfdGVzdF9lcnJvcisrOwoJCQlyZXR1cm4gZGRyX3Rlc3RfZXJyb3I7CgkJfQoJCXNpemVfbG9vcD1zaXplX2xvb3ArKDE8PDIpOy8vIHVzZSBiaWcgc3RlcCB3aWxsIGZhc3QgdGVzdCAsYnV0IGxvc2UgYWNjdXJhY3kuCgl9CgkvL3ByaW50ZigiXG4gMTExNCIpOwoJcmV0dXJuIGRkcl90ZXN0X2Vycm9yOwp9CgppbnQgZG9fY3B1X2Rkcl90ZXN0IChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vZGRyX2NwdV90ZXN0IDB4MTA4MDAwMCAweDEwMDAwMDAwIDB4MjAwMDAwMCAweGZmZmZmZmZmIDEwICAvL3NpemUgZG8gbm90IG92ZXJsYXAKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9Cgl1bnNpZ25lZCBpbnQgaW5pdF9zdGFydF9hZGQ9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FkZD0wOwoJdW5zaWduZWQgaW50IHRlc3Rfc2l6ZT0wOwoJdW5zaWduZWQgaW50IHRlc3RfZGF0YV9iaXRfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sb29wcz0wOwoJdW5zaWduZWQgaW50IHRlc3RfbG9vcD0wOwoJdW5zaWduZWQgaW50IHRlc3RfZXJyb3JzPTA7Cgl1bnNpZ25lZCBpbnQgcGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmcgPTE7CgljaGFyICplbmRwOwoJaWYgKGFyZ2MgPT0gMSkKCQlwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgllbHNlCgl7CgkJaWYgKGFyZ2MgPj0gMikKCQl7CgkJCS8vIHpxMHByMCA9IGFyZ3ZbMV07CgkJCWluaXRfc3RhcnRfYWRkPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQl9CgoJCWlmIChhcmdjID49IDMpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl0ZXN0X2FkZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJfQoJCWlmIChhcmdjID49IDQpCgkJewoJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQl0ZXN0X3NpemU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCX0KCQlpZiAoYXJnYyA+PSA1KQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9kYXRhX2JpdF9lbmFibGU9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCX0KCQlpZiAoYXJnYyA+PSA2KQoJCXsKCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJdGVzdF9sb29wcz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCWlmKHRlc3RfbG9vcHM9PTApCgkJCXRlc3RfbG9vcHM9MTsKCQl9CgkJaWYgKGFyZ2MgPj0gNykKCQl7CgkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCXBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQkJaWYocGFydHRlcm5fZnJlcXVlbmN5X3NldHRpbmc9PTApCgkJCXBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nPTE7CgkJfQoJfQoJdWludDMyX3QgZGRyX3Rlc3Rfc3RhcnRfdGltZV91cz1nZXRfdXNfdGltZSgpOyAgLy8gY2hlY2sgY29zdCB0aW1lCgljcHVfZGRyX3Rlc3RfaW5pdF9wYXR0ZXJuX2FyZWEoaW5pdF9zdGFydF9hZGQsdGVzdF9zaXplLHBhcnR0ZXJuX2ZyZXF1ZW5jeV9zZXR0aW5nKTsKCWZvcih0ZXN0X2xvb3A9MDt0ZXN0X2xvb3A8dGVzdF9sb29wczspCgl7CgkJdGVzdF9lcnJvcnM9dGVzdF9lcnJvcnMrY3B1X2Rkcl90ZXN0KGluaXRfc3RhcnRfYWRkLHRlc3RfYWRkLHRlc3Rfc2l6ZSx0ZXN0X2RhdGFfYml0X2VuYWJsZSxwYXJ0dGVybl9mcmVxdWVuY3lfc2V0dGluZyk7CgkJdGVzdF9sb29wKys7CgkJcHJpbnRmKCJcbmNwdV9kZHJfdGVzdF90ZXN0X3RpbWVzPT0lZCAgdGVzdF9lcnJvcnM9PSVkIix0ZXN0X2xvb3AsdGVzdF9lcnJvcnMpOwoJfQoJdWludDMyX3QgZGRyX3Rlc3RfZW5kX3RpbWVfdXM9Z2V0X3VzX3RpbWUoKTsgIC8vIGNoZWNrIGNvc3QgdGltZQoJcHJpbnRmKCJcbmNwdV9kZHJfdGVzdF90ZXN0X2FuZCBjb21wYXJlX2JhbmR3aWR0aD09JWQgTWJ5dGUvc1xuIiwodGVzdF9sb29wcyp0ZXN0X3NpemUqMikvKGRkcl90ZXN0X2VuZF90aW1lX3VzLWRkcl90ZXN0X3N0YXJ0X3RpbWVfdXMpKTsKCXJldHVybiB0ZXN0X2Vycm9yczsKfQpVX0JPT1RfQ01EKAoJZGRyX2NwdV90ZXN0LAkzMCwJMSwJZG9fY3B1X2Rkcl90ZXN0LAoJImRkcl90ZXN0X2NtZCBjbWQgYXJnMSBhcmcyIGFyZzMuLi4iLAoJImRkcl90ZXN0X2NtZCBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKCmludCBkb19kZHJfdGVzdF93cml0ZV9yZWFkIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vLyoKCXsKCQlwcmludGYoIlxuRW50ZXIgZG9fZGRyX3Rlc3RfZGRyX3dyaXRlX3JlYWRfY3VycmVudFxuIik7CgkJLy8gICBpZighYXJnYykKCQkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCQlpbnQgaT0wOwoJCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCQlmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJewoJCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCQl9CgoJCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CgkJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJCU9QRU5fQ0hBTk5FTF9CX1BIWV9DTEsoKTsKCQkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCQljaGFyICplbmRwOwoKCQl1bnNpZ25lZCBpbnQgcGF0dGVybl9pZD0xOwoJCXVuc2lnbmVkIGludCBwYXR0ZXJuWzRdID17MH07CgkJdW5zaWduZWQgaW50IHdyaXRlX3JlYWQ9MDsKCQl1bnNpZ25lZCBpbnQgcmVhZF9wYXR0ZXJuWzRdPXswfSA7CgkJdW5zaWduZWQgaW50IGxvb3A9MTsKCQl1bnNpZ25lZCBpbnQgIHN0YXJ0X2FkZHIgPSBERFJfVEVTVF9TVEFSVF9BRERSOwoJCXVuc2lnbmVkIGludCAgdGVzdF9zaXplID0gRERSX1RFU1RfU0laRTsKCQl1bnNpZ25lZCBpbnQgIGNvcHlfb2Zmc2V0PSBERFJfVEVTVF9TSVpFOwoJCXVuc2lnbmVkIGludCAgbm9fc2hvd19pbmZvPSAwOwoJCXVuc2lnbmVkIGludCAgdXNfZGVsYXlfY291bnRlcj0gMDsKCgoJCWlmIChhcmdjID09IDEpCgkJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCQllbHNlIHsKCQkJaWYgKGFyZ2MgPj0gMikKCQkJewoJCQkJLy8genEwcHIwID0gYXJndlsxXTsKCQkJCXdyaXRlX3JlYWQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCQl9CgoJCQlpZiAoYXJnYyA+PSAzKQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJcGF0dGVybl9pZD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj0gNCkKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCWxvb3A9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49NSkKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXN0YXJ0X2FkZHI9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCQl9CgkJCWlmIChhcmdjID49NikKCQkJewoJCQkJLy8genExcHIwID0gYXJndlsyXTsKCQkJCXRlc3Rfc2l6ZT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJCX0KCQkJaWYgKGFyZ2MgPj03KQoJCQl7CgkJCQkvLyB6cTFwcjAgPSBhcmd2WzJdOwoJCQkJbm9fc2hvd19pbmZvPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQkJfQoJCQlpZiAoYXJnYyA+PTgpCgkJCXsKCQkJCS8vIHpxMXByMCA9IGFyZ3ZbMl07CgkJCQl1c19kZWxheV9jb3VudGVyPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQkJfQoJCX0KCQlwcmludGYoIlxud3JpdGVfcmVhZD09IDB4JTA4ZFxuIiwgd3JpdGVfcmVhZCk7CgkJcHJpbnRmKCJcbnBhdHRlcm5faWQ9PSAweCUwOGRcbiIsIHBhdHRlcm5faWQpOwoJCXByaW50ZigiXG5sb29wPT0gMHglMDhkXG4iLCBsb29wKTsKCQlwcmludGYoIlxuc3RhcnRfYWRkcj09IDB4JTA4eFxuIiwgc3RhcnRfYWRkcik7CgkJcHJpbnRmKCJcbnRlc3Rfc2l6ZT09IDB4JTA4eFxuIiwgdGVzdF9zaXplKTsKCQlwcmludGYoIlxudXNfZGVsYXlfY291bnRlcj09ICVkXG4iLCB1c19kZWxheV9jb3VudGVyKTsKCQljb3B5X29mZnNldD10ZXN0X3NpemU7CgoJCXVuc2lnbmVkIGludCAgKnA7CgkJdW5zaWduZWQgaW50ICAgajsKCgoJCXAgPSAodW5zaWduZWQgaW50ICAqICkoaW50X2NvbnZ0ZXJfcChzdGFydF9hZGRyKSk7CgoJCWlmIChwYXR0ZXJuX2lkID09IDApCgkJewoJCQlwYXR0ZXJuWzBdPTA7CgkJCXBhdHRlcm5bMV09MDsKCQkJcGF0dGVyblsyXT0wOwoJCQlwYXR0ZXJuWzNdPTA7CgkJfQoJCWlmIChwYXR0ZXJuX2lkID09IDEpCgkJewoJCQlwYXR0ZXJuWzBdPTB4ZmZmZmZmZmY7CgkJCXBhdHRlcm5bMV09MHhmZmZmZmZmZjsKCQkJcGF0dGVyblsyXT0weGZmZmZmZmZmOwoJCQlwYXR0ZXJuWzNdPTB4ZmZmZmZmZmY7CgkJfQoKCgkJZG8KCQl7CgkJCWlmICh3cml0ZV9yZWFkID09IDApCgkJCXsgCgkJCQlpZighbm9fc2hvd19pbmZvKQoJCQkJCXByaW50ZigiXG5sb29wOjB4JTA4eDpTdGFydCB3cml0aW5nIGF0IDB4JTA4eCAtIDB4JTA4eC4uLiIsIGxvb3Asc3RhcnRfYWRkciwgc3RhcnRfYWRkciArIHRlc3Rfc2l6ZSk7CgkJCQlmb3IgKGo9MDtqPHRlc3Rfc2l6ZS80OykKCQkJCXsKCQkJCQkqKHAraik9KHBhdHRlcm5bMF0pOwoJCQkJCSoocCtqKzEpPShwYXR0ZXJuWzFdKTsKCQkJCQkqKHAraisyKT0ocGF0dGVyblsyXSk7CgkJCQkJKihwK2orMyk9KHBhdHRlcm5bM10pOwoJCQkJCWo9ais0OwoJCQkJfQoJCQl9CgkJCWlmICh3cml0ZV9yZWFkID09IDEpCgkJCXsgIAoJCQkJaWYoIW5vX3Nob3dfaW5mbykKCQkJCQlwcmludGYoIlxubG9vcDoweCUwOHg6U3RhcnQgcmVhZGluZyBhdCAweCUwOHggLSAweCUwOHguLi4iLCBsb29wLHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIgKyB0ZXN0X3NpemUpOwoJCQkJZm9yIChqPTA7ajx0ZXN0X3NpemUvNDspCgkJCQl7CgkJCQkJcmVhZF9wYXR0ZXJuWzBdPSAqKHAraik7CgkJCQkJcmVhZF9wYXR0ZXJuWzFdPSAqKHAraisxKTsKCQkJCQlyZWFkX3BhdHRlcm5bMl09KihwK2orMik7CgkJCQkJcmVhZF9wYXR0ZXJuWzNdPSAqKHAraiszKTsKCQkJCQlqPWorNDsKCQkJCX0KCQkJCWlmIChsb29wID09IDEpIHsKCQkJCQlpZighbm9fc2hvd19pbmZvKQoJCQkJCQlwcmludGYoIiBcbmxvb3A6MHglMDh4OlN0YXJ0IHJlYWRpbmcgcmVhZF9wYXR0ZXJuWzBdIDB4JTA4eCwgcGF0dGVyblsxXSAweCUwOHgscGF0dGVyblsyXSAweCUwOHgscGF0dGVyblszXSAweCUwOHgiLAoJCQkJCQkJCWxvb3AscmVhZF9wYXR0ZXJuWzBdLCByZWFkX3BhdHRlcm5bMV0scmVhZF9wYXR0ZXJuWzJdLHJlYWRfcGF0dGVyblszXQoJCQkJCQkJICApOyAgfQoJCQl9CgkJCWlmICh3cml0ZV9yZWFkID09IDIpCgkJCXsgICAKCQkJCWlmKCFub19zaG93X2luZm8pCgkJCQkJcHJpbnRmKCJcbmxvb3A6MHglMDh4OlN0YXJ0IGNvcHlpbmcgYXQgMHglMDh4IC0gMHglMDh4Li4uIiwgbG9vcCxzdGFydF9hZGRyLCBzdGFydF9hZGRyICsgdGVzdF9zaXplKTsKCQkJCWZvciAoaj0wO2o8dGVzdF9zaXplLzQ7KQoJCQkJewoJCQkJCSoocCtqK2NvcHlfb2Zmc2V0LzQpPSAqKHAraik7CgkJCQkJKihwK2orMStjb3B5X29mZnNldC80KT0gKihwK2orMSk7CgkJCQkJKihwK2orMitjb3B5X29mZnNldC80KT0gKihwK2orMik7CgkJCQkJKihwK2orMytjb3B5X29mZnNldC80KT0gKihwK2orMyk7CgkJCQkJaj1qKzQ7CgkJCQl9CgkJCX0KCQkJaWYodXNfZGVsYXlfY291bnRlcikKCQkJewoJCQkJZGRyX3VkZWxheSh1c19kZWxheV9jb3VudGVyKTsKCQkJfQoJCX13aGlsZShsb29wLS0pOwoKCgkJQ0xPU0VfQ0hBTk5FTF9BX1BIWV9DTEsoKTsKCQlDTE9TRV9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCQlwcmludGYoIlxudGVzdCBlbmRcbiIpOwoKCQlyZXR1cm4gMTsKCX0KCS8vKi8KfQoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKCiNkZWZpbmUgVEVTVF9NSU5fRERSX0VFX1ZPTFRBR0UgIDY4MQojZGVmaW5lIFRFU1RfTUFYX0REUl9FRV9WT0xUQUdFICA5NjIKI2RlZmluZSAgICBHMTJfQU9fUFdNX1BXTV9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4ZmY4MDcwMDAgKyAoMHgwMDEgPDwgMikpCnN0YXRpYyBpbnQgcHdtX3ZvbHRhZ2VfdGFibGVfZWVbXVsyXSA9CnsKCXsgMHgxYzAwMDAsICA2ODF9LAoJeyAweDFiMDAwMSwgIDY5MX0sCgl7IDB4MWEwMDAyLCAgNzAxfSwKCXsgMHgxOTAwMDMsICA3MTF9LAoJeyAweDE4MDAwNCwgIDcyMX0sCgl7IDB4MTcwMDA1LCAgNzMxfSwKCXsgMHgxNjAwMDYsICA3NDF9LAoJeyAweDE1MDAwNywgIDc1MX0sCgl7IDB4MTQwMDA4LCAgNzYxfSwKCXsgMHgxMzAwMDksICA3NzJ9LAoJeyAweDEyMDAwYSwgIDc4Mn0sCgl7IDB4MTEwMDBiLCAgNzkyfSwKCXsgMHgxMDAwMGMsICA4MDJ9LAoJeyAweDBmMDAwZCwgIDgxMn0sCgl7IDB4MGUwMDBlLCAgODIyfSwKCXsgMHgwZDAwMGYsICA4MzJ9LAoJeyAweDBjMDAxMCwgIDg0Mn0sCgl7IDB4MGIwMDExLCAgODUyfSwKCXsgMHgwYTAwMTIsICA4NjJ9LAoJeyAweDA5MDAxMywgIDg3Mn0sCgl7IDB4MDgwMDE0LCAgODgyfSwKCXsgMHgwNzAwMTUsICA4OTJ9LAoJeyAweDA2MDAxNiwgIDkwMn0sCgl7IDB4MDUwMDE3LCAgOTEyfSwKCXsgMHgwNDAwMTgsICA5MjJ9LAoJeyAweDAzMDAxOSwgIDkzMn0sCgl7IDB4MDIwMDFhLCAgOTQyfSwKCXsgMHgwMTAwMWIsICA5NTJ9LAoJeyAweDAwMDAxYywgIDk2Mn0KfTsKdWludDMyX3QgZmluZF92ZGRlZV92b2x0YWdlX2luZGV4KHVuc2lnbmVkIGludCB0YXJnZXRfdm9sdGFnZSkKewoJdW5zaWduZWQgaW50IHRvOwoJZm9yICh0byA9IDA7IHRvIDwgQVJSQVlfU0laRShwd21fdm9sdGFnZV90YWJsZV9lZSk7IHRvKyspIHsKCQlpZiAocHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG9dWzFdID49IHRhcmdldF92b2x0YWdlKSB7CgkJCWJyZWFrOwoJCX0KCX0KCWlmICh0byA+PSBBUlJBWV9TSVpFKHB3bV92b2x0YWdlX3RhYmxlX2VlKSkgewoJCXRvID0gQVJSQVlfU0laRShwd21fdm9sdGFnZV90YWJsZV9lZSkgLSAxOwoJfQoJcmV0dXJuIHRvOwp9Cgp2b2lkIHNldF9lZV92b2x0YWdlKHVpbnQzMl90IGVlX292ZXJfcmlkZV92b2x0YWdlKQp7Cgl1bnNpZ25lZCBpbnQgdG87Cglmb3IgKHRvID0gIChBUlJBWV9TSVpFKHB3bV92b2x0YWdlX3RhYmxlX2VlKSk7KCB0byA+MCk7IHRvLS0pIHsKCQlpZiAoKHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvLTFdWzFdPGVlX292ZXJfcmlkZV92b2x0YWdlKSAmJiAocHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG9dWzFdID49IGVlX292ZXJfcmlkZV92b2x0YWdlKSkgewoJCQlicmVhazsKCQl9Cgl9CglpZiAoZWVfb3Zlcl9yaWRlX3ZvbHRhZ2UpIHsKCQl3cml0ZWwocHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG9dWzBdLEcxMl9BT19QV01fUFdNX0IpOwoJCXByaW50ZiAoIlxuRERSX292ZXJpZGVfRUVfdm9sdGFnZSA9PSVkIG12IC9uIixwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVsxXSk7Cgl9Cn0KCnVuc2lnbmVkIGludCByZWFkX2VlX3ZvbHRhZ2Uodm9pZCkKewoJdW5zaWduZWQgaW50IHRvOwoJdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoJcmVnX3ZhbHVlPXJlYWRsKEcxMl9BT19QV01fUFdNX0IpOwoJdG89cmVnX3ZhbHVlJjB4ZmY7CglyZXR1cm4gcHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG9dWzFdOwp9CnVpbnQzMl90IGdldF9iZGxyXzEwMHN0ZXAodWludDMyX3QgZGRyX2ZyZXF1ZW5jeSkKewoJdWludDMyX3QgYmRscl8xMDBzdGVwPTA7CgkvL3VpbnQzMl90IHBzPTA7CgkvL3BzPShyZF9yZWcoRE1DX0RSQU1fRlJFUV9DVFJMKSkmMTsKCWR3Y19kZHJwaHlfYXBiX3dyKCgoKCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweGUzKSkpKSwweGMwMCk7CgliZGxyXzEwMHN0ZXA9KDEwMDAwMDAwMC8oMipkZHJfZnJlcXVlbmN5KSkvKChkd2NfZGRycGh5X2FwYl9yZCgoKCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweGU0KSkpKSkmMHgzZmYpOwoJcmV0dXJuIGJkbHJfMTAwc3RlcDsKfQoKaW50IGRvX2Rkcl90ZXN0X3B3bV9iZGxyIChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWNoYXIgKmVuZHA7CglwcmludGYoIlxuRW50ZXIgZzEyIGRvX2Rkcl90ZXN0X3B3bV9iZGwgZnVuY3Rpb25cbiIpOwoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgkvL2lmIChhcmdjIDwgMikKCS8vCWdvdG8gdXNhZ2U7CgoKCXVuc2lnbmVkIGludCBhcmdjX2NvdW50PTE7Cgl1bnNpZ25lZCBpbnQgIHBhcmFfbWV0ZXJbMzBdPXswLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLH07Cgl3aGlsZShhcmdjX2NvdW50PGFyZ2MpCgl7cGFyYV9tZXRlclthcmdjX2NvdW50LTFdPSBzaW1wbGVfc3RydG91bChhcmd2W2FyZ2NfY291bnRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2W2FyZ2NfY291bnRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlwYXJhX21ldGVyW2FyZ2NfY291bnQtMV0gPSAwOwoJCX0KCQlhcmdjX2NvdW50Kys7Cgl9CgoJLy91aW50MzJfdCBpZD1wYXJhX21ldGVyWzBdOwoJLy91aW50MzJfdCB2b2x0YWdlPXBhcmFfbWV0ZXJbMV07Cgl1aW50MzJfdCBsb29wPXBhcmFfbWV0ZXJbMF07Cgl1aW50MzJfdCB2b2x0YWdlX21pbj1wYXJhX21ldGVyWzFdOwoJdWludDMyX3Qgdm9sdGFnZV9tYXg9cGFyYV9tZXRlclsyXTsKCXVpbnQzMl90IHNob3dfY291bnRfbWVzc2FnZT1wYXJhX21ldGVyWzNdOwoKCS8vI2RlZmluZSBQV01fSURfREVGQVVMVCAgIDA8PDAKCS8vI2RlZmluZSBQV01fVk9MVEFHRV9ERUZBVUxUICAgODAwPDwwCgkjZGVmaW5lIFBXTV9MT09QX0RFRkFVTFQgICAxMDw8MAoJI2RlZmluZSBQV01fVk9MVEFHRV9NSU5fREVGQVVMVCAgIFRFU1RfTUlOX0REUl9FRV9WT0xUQUdFCgkjZGVmaW5lIFBXTV9WT0xUQUdFX01BWF9ERUZBVUxUICAgVEVTVF9NQVhfRERSX0VFX1ZPTFRBR0UKCgoJLy9pZD1pZD9pZDpQV01fSURfREVGQVVMVDsKCS8vdm9sdGFnZT12b2x0YWdlP3ZvbHRhZ2U6UFdNX1ZPTFRBR0VfREVGQVVMVDsKCWxvb3A9bG9vcD9sb29wOlBXTV9MT09QX0RFRkFVTFQ7Cgl2b2x0YWdlX21pbj0odm9sdGFnZV9taW48UFdNX1ZPTFRBR0VfTUlOX0RFRkFVTFQpP1BXTV9WT0xUQUdFX01JTl9ERUZBVUxUOnZvbHRhZ2VfbWluOwoJdm9sdGFnZV9tYXg9KHZvbHRhZ2VfbWF4PlBXTV9WT0xUQUdFX01BWF9ERUZBVUxUKT9QV01fVk9MVEFHRV9NQVhfREVGQVVMVDp2b2x0YWdlX21heDsKCXZvbHRhZ2VfbWF4PSh2b2x0YWdlX21heDxQV01fVk9MVEFHRV9NSU5fREVGQVVMVCk/UFdNX1ZPTFRBR0VfTUFYX0RFRkFVTFQ6dm9sdGFnZV9tYXg7CgoJLy8JICBwcmludGYoIlxudm9sdGFnZV9taW49JWRcbiIsdm9sdGFnZV9taW4pOwoJLy8JICAJCSAgcHJpbnRmKCJcbnZvbHRhZ2VfbWF4PSVkXG4iLHZvbHRhZ2VfbWF4KTsKCXVpbnQxNl90IGJkbHJfMTAwX21pbj0wOwoJdWludDE2X3QgYmRscl8xMDBfYXZlcmFnZT0wOwoJdWludDE2X3QgYmRscl8xMDBfbWF4PTA7Cgl1aW50MTZfdCBiZGxyXzEwMF9jdXI9MDsKCS8vdWludDE2X3QgY3VyX2Rkcl9mcmVxdWVuY3k9MDsKCXVpbnQzMl90IGNvdW50PTE7CgoJYmRscl8xMDBfY3VyPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJYmRscl8xMDBfbWluPWJkbHJfMTAwX2N1cjsKCWJkbHJfMTAwX21heD1iZGxyXzEwMF9jdXI7CgliZGxyXzEwMF9hdmVyYWdlPWJkbHJfMTAwX2N1cjsKCgl1bnNpZ25lZCBpbnQgdG89MDsKCXVuc2lnbmVkIGludCB0b19taW49MDsKCXVuc2lnbmVkIGludCB0b19tYXg9KEFSUkFZX1NJWkUocHdtX3ZvbHRhZ2VfdGFibGVfZWUpKS0xOwoJLy91bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJcHJpbnRmKCJcbnJlYWQgb3JnX0VFX3ZvbHRhZ2UgJWQgbXYgXG4iLHJlYWRfZWVfdm9sdGFnZSgpKTsKCXRvX21pbj1maW5kX3ZkZGVlX3ZvbHRhZ2VfaW5kZXgodm9sdGFnZV9taW4pOwoJdG9fbWF4PWZpbmRfdmRkZWVfdm9sdGFnZV9pbmRleCh2b2x0YWdlX21heCk7Cglmb3IgKHRvID0odG9fbWF4KzEpICA7KCB0byA+dG9fbWluKTsgdG8tLSkgewoJCS8vICBwcmludGYoIlxuVE89JWRcbiIsdG8pOwoJCXdyaXRlbChwd21fdm9sdGFnZV90YWJsZV9lZVt0by0xXVswXSxHMTJfQU9fUFdNX1BXTV9CKTsKCQl1ZGVsYXkoMTAwMCk7CgkJYmRscl8xMDBfY3VyPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJCWJkbHJfMTAwX21pbj1iZGxyXzEwMF9jdXI7CgkJYmRscl8xMDBfbWF4PWJkbHJfMTAwX2N1cjsKCQliZGxyXzEwMF9hdmVyYWdlPWJkbHJfMTAwX2N1cjsKCQljb3VudD0xOwoKCQkvLwlwcmludGYoIlxuRERSX3NldCBFRV92b2x0YWdlICVkICBiZGxyXzEwMF9hdmVyYWdlICVkICBiZGxyXzEwMF9taW4gJWQgYmRscl8xMDBfbWF4ICVkIGNvdW50ICVkLGJkbHJfMTAwX2N1ciAlZCBcbiIscHdtX3ZvbHRhZ2VfdGFibGVfZWVbdG8tMV1bMV0sCgkJLy9iZGxyXzEwMF9hdmVyYWdlLGJkbHJfMTAwX21pbixiZGxyXzEwMF9tYXgsY291bnQsYmRscl8xMDBfY3VyKTsKCgkJZG8gewoJCQliZGxyXzEwMF9jdXI9KDEwMDAwMDAwMC8oMipnbG9iYWxfZGRyX2NsaykpLygoZHdjX2RkcnBoeV9hcGJfcmQoKCgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHhlNCkpKSkpJjB4M2ZmKTsKCQkJYmRscl8xMDBfbWluPShiZGxyXzEwMF9jdXI8YmRscl8xMDBfbWluKT9iZGxyXzEwMF9jdXI6YmRscl8xMDBfbWluOwoJCQliZGxyXzEwMF9tYXg9KGJkbHJfMTAwX2N1cj5iZGxyXzEwMF9tYXgpP2JkbHJfMTAwX2N1cjpiZGxyXzEwMF9tYXg7CgkJCWJkbHJfMTAwX2F2ZXJhZ2U9KGJkbHJfMTAwX2N1citiZGxyXzEwMF9hdmVyYWdlKmNvdW50KS8oY291bnQrMSk7CgkJCWNvdW50Kys7CgkJCWlmKHNob3dfY291bnRfbWVzc2FnZSkKCQkJCXByaW50ZigiJWRcbiIsYmRscl8xMDBfY3VyKTsKCgkJfXdoaWxlKGNvdW50PGxvb3ApOwoJCXByaW50ZigiXG5ERFJfc2V0IEVFX3ZvbHRhZ2UgJWQgIGJkbHJfMTAwX2F2ZXJhZ2UgJWQgIGJkbHJfMTAwX21pbiAlZCBiZGxyXzEwMF9tYXggJWQgY291bnQgJWQiLHB3bV92b2x0YWdlX3RhYmxlX2VlW3RvLTFdWzFdLAoJCQkJYmRscl8xMDBfYXZlcmFnZSxiZGxyXzEwMF9taW4sYmRscl8xMDBfbWF4LGNvdW50KTsKCgoJfQoKCgoKCXJldHVybiAxOwoKfQoKdHlwZWRlZiBzdHJ1Y3QgZGRyX3NoYV9zIHsKCXVuc2lnbmVkIGNoYXIgc2hhMltTSEEyNTZfU1VNX0xFTl07CglkZHJfc2V0X3QgZGRyczsKfSBkZHJfc2hhX3Q7CgpkZHJfc2hhX3QgZGRyX3NoYSA9IHt7MH19OwpkZHJfc2V0X3QgKmRkcl9zZXRfdF9wX2FycmFyeSA9ICZkZHJfc2hhLmRkcnM7CmludCBkb19kZHJfZGlzcGxheV9nMTJfZGRyX2luZm9ybWF0aW9uKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJZGRyX3NldF90ICpkZHJfc2V0X3RfcD1OVUxMOwoJZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJLy9kZHJfc2V0X3RfcD0gKGRkcl9zZXRfdCAqKUcxMl9ETUNfU1RJQ0tZXzA7CgkvL2lmIChzaXplb2YoZGRyX3NldF90KTxsb29wX21heCkKCXByaW50ZigiXG5kZHJfc2V0X3RfcD09MHglMDh4XG4iLCh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfdF9wKSk7Cgl1aW50MzJfdCBsb29wPTA7IAoJdWludDMyX3QgbG9vcF9tYXggPSAoNCsoMHgzZjw8MikpOy8vKChETUNfU1RJQ0tZXzYzLURNQ19TVElDS1lfMCkpOwoJLy8JbG9vcF9tYXg9c2l6ZW9mKGRkcl9zZXRfdCk7Cglmb3IgKGxvb3AgPSAwOyBsb29wIDxsb29wX21heDsgbG9vcCs9NCkgewoJCXdyX3JlZygoKHVpbnQ2NF90KShkZHJfc2V0X3RfcCkgKyBsb29wKSwgcmRfcmVnKEcxMl9ETUNfU1RJQ0tZXzAgKyBsb29wKSk7Cgl9CgkJCQp7CgkJdWludDE2X3QJZHFfYml0X2RlbGF5WzcyXTsKCQl1bnNpZ25lZAljaGFyIHRfY291bnQ9MDsKCQl1aW50MTZfdCAgZGVsYXlfb3JnPTA7CgkJdWludDE2X3QgIGRlbGF5X3RlbXA9MDsKCQl1aW50MzJfdCAgYWRkX29mZnNldD0wOwoJCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMHgwKTsKCQliZGxyXzEwMHN0ZXA9Z2V0X2JkbHJfMTAwc3RlcChnbG9iYWxfZGRyX2Nsayk7CgkJdWlfMV8zMl8xMDBzdGVwPSgxMDAwMDAwKjEwMC8oZ2xvYmFsX2Rkcl9jbGsqMiozMikpOwoKCQl7CgkJLy8JCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDIwKSxwX2Rldi0+cF9kZHJzLT5kZmlfbXJsKTsgIC8vREZJTVJMCgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KDE8PDEyKXwoMHgyMCkscF9kZXYtPnBfZGRycy0+ZGZpX21ybCk7ICAvL0RGSU1STAoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgyPDwxMil8KDB4MjApLHBfZGV2LT5wX2RkcnMtPmRmaV9tcmwpOyAgLy9ERklNUkwKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMzw8MTIpfCgweDIwKSxwX2Rldi0+cF9kZHJzLT5kZmlfbXJsKTsgIC8vREZJTVJMCgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHgyMCkscF9kZXYtPnBfZGRycy0+ZGZpX21ybCk7ICAvL0h3dE1STAoJCS8vZGRyX3NldF90X3AtPmRmaV9tcmw7CgkJLy9kZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybDsKCQlkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbD0wOwoJCXByaW50ZigiXG4gQVJkUHRySW5pdFZhbCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwoMDw8MTIpfCgweDJlKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5BUmRQdHJJbml0VmFsPWRlbGF5X29yZzsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJCgkJcHJpbnRmKCJcbiBkZmltcmwwIGRmaW1ybDEgZGZpbXJsMiBkZmltcmwzIEh3dE1STCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5kZmlfbXJsPWRlbGF5X29yZzsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgxPDwxMil8KDB4MjApKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMSxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMjw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDIsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDM8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwzLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMjw8MTYpfCgwPDwxMil8KDB4MjApKTsKCQlkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgoJCWRkcl9zZXRfdF9wLT5kZmlfaHd0bXJsPWRlbGF5X29yZzsKCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgkJfQoJewoJCXByaW50ZigiXG4gY291bnRfaW5kZXggICAgIGRlbGF5X3ZhbHVlICAgICByZWdpc3Rlcl9hZGQgICAgIHJlZ2lzdGVyX3ZhbHVlIFxuICIpOwoJCXByaW50ZigiXG4gYWRkcmVzcyBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgIC0tc3RlcD09MS8zMlVJICxiaXQgNiBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxMDt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgwPDwxNil8KHRfY291bnQ8PDEyKXwoMHg4MCkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoJCQlkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkJcHJpbnRmKCJcbiB0ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOSBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHhkMCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCQoJCQlkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCQoJCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCX0KCXsKCQlwcmludGYoIlxuIHJ4ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSxubyBjb2Fyc2UiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweDhjKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJCXByaW50ZigiXG4gd3JpdGUgZHFfYml0IGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOCBpcyBjb2Fyc2UgIC0tc3RlcD09MVUiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCWZvcih0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJCXsKCQkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweGMwKygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQkJZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJfQoJewoJCXByaW50ZigiXG4gcmVhZCBkcV9iaXQgZGVsYXkgKiBCRExSeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PWJkbHIgc3RlcCBzaXplIGFib3V0IDVwcyxubyBjb2Fyc2UiLGJkbHJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweDY4KygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oKGRlbGF5X29yZyYweDNmKSk7CgkJCQoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcV9iaXRfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkJcHJpbnRmKCJcbiByZWFkIGRxcyBnYXRlIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAsYml0IDYtMTAgaXMgY29hcnNlIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCgkJcHJpbnRmKCJcbiBzb2MgdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLjA0NyArIFZyZWZEQUMwWzY6MF0qMC4wMDM2NyAgIEREUjQgLS1WUkVGID0gVkREUSooMC41MTAgKyBWcmVmREFDMFs2OjBdKjAuMDAzNDUiKTsKCQkvLygoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSkJCgkJdWludDMyX3QgdnJlZl90X2NvdW50PTA7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgoKHRfY291bnQlMzYpJTkpPDw4KXwoMHg0MCkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KChkZWxheV9vcmcpKTsKCQkJaWYodF9jb3VudDwzNSkKCQkJewoJCQkJdnJlZl90X2NvdW50PSgoKCh0X2NvdW50JTM2KS85KSo4KSsodF9jb3VudCU5KSk7CgkJCQlkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmW3ZyZWZfdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJfQoJCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCQlwcmludGYoIlxuIGRyYW0gdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4gICBERFI0IC0tVlJFRiA9IFZERFEqKDAuICsgVnJlZkRBQzBbNjowXSowLiIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDA4MikpOwoJCWRlbGF5X3RlbXA9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDMyO3RfY291bnQrKykKCQl7CgkJCWRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RfY291bnRdPWRlbGF5X3RlbXA7CgoJCQkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV90ZW1wKTsKCX0KCgkvLwlpZihvdmVyX3JpZGVfaW5kZXggPT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUkVUUkFJTklORykKCXsJLy8JaWYgKHJlYWRfd3JpdGU9PVJFR0lTVEVSX1JFQUQpCgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDQ7dF9jb3VudCsrKQoJCQl7Ly9wX2Rldi0+cF9kZHJzLT50ZHFzMmRxPWxwZGRyNF90ZHFzMmRxOwoJCQkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1swXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhYSkpOyAgLy9QcHRDdGxTdGF0aWMKCQkJCS8vZGRyX3NldF90X3AtPnJldHJhaW5pbmdbMV09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4YWUpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazAKCQkJCS8vZGRyX3NldF90X3AtPnJldHJhaW5pbmdbMl09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4YWYpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazEKCQkJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCswXT0oZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKSkmMHhmZjsgIC8vUHB0Q3RsU3RhdGljCgkJCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMV09KGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFhKSkpPj44OyAgLy9QcHRDdGxTdGF0aWMKCQkJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCsyXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhZSkpOyAgLy9QcHREcXNDbnRJbnZUcm5UZzAgIHBzMCByYW5rMCBsYW5lIDAtMwoJCQkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzNdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxIGxhbmUgMC0zCgkJCX0KCX0KfQoKewoJCXVpbnQzMl90ICBjb3VudD0wOwoJCXVpbnQzMl90ICByZWdfYWRkX29mZnNldD0wOwoJCXVpbnQxNl90ICByZWdfdmFsdWU9MDsKCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxucGN0bCB0aW1taW5nOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCSNkZWZpbmUgRE1DX0RSQU1fVERQRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDFkICA8PCAyKSArIDB4ZmY2Mzg0MDApCgkJI2RlZmluZSBETUNfRFJBTV9UTVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODQwMCkKCQkjZGVmaW5lIEcxMl9ETUNfU1RJQ0tZXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDAwMDAgIDw8IDIpICsgMHhmZjYzODgwMCkKCgkJcHJpbnRmKCJcbiBQQ1RMIHRpbW1pbmc6IDB4Iik7CgoJCWZvciAoY291bnQ9MDtjb3VudDwoRE1DX0RSQU1fVERQRC1ETUNfRFJBTV9UTVJEKTspIHsKCQkJcmVnX2FkZF9vZmZzZXQ9KERNQ19EUkFNX1RNUkQrKGNvdW50KSk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfYWRkX29mZnNldCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRfaGV4KHJlYWRsKHJlZ19hZGRfb2Zmc2V0KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAgIAoJCQlwcmludGYoIlxuIHJlZ19hZGRfb2Zmc2V0OiAlMDh4ICUwOHggJTA4eCAiLHJlZ19hZGRfb2Zmc2V0LHJlYWRsKHJlZ19hZGRfb2Zmc2V0KSxyZWdfYWRkX29mZnNldCk7CgkJCWNvdW50PWNvdW50KzQ7CgkJfQoJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG5tcnMgcmVnaXN0ZXI6IGJhc2UgKDB4NTQwMDA8PDEpK2ZlMDAwMDAwLGJ5dGUgb2Zmc2V0XG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJcHJpbnRmKCJcbiBtcnMgcmVnaXN0ZXI6ICIpOwoJCXByaW50ZigiXG4gbXJzIHJlZ2lzdGVyOiBiYXNlICgweDU0MDAwPDwxKStmZTAwMDAwMCwlMDh4ICBieXRlIG9mZnNldFxuIiwoMHg1NDAwMDw8MSkrMHhmZTAwMDAwMCk7CgkJZm9yIChjb3VudD0wO2NvdW50PDB4ODA7KSB7CgkJCXJlZ19hZGRfb2Zmc2V0PTB4NTQwMDArY291bnQ7Ly9kd2NfZGRycGh5X2FwYl93cigweDU0MDA4LDB4MTAwMSk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiXG4iLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJLy9kZHJfbG9nX3NlcmlhbF9wdXRzKCI6ICIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKCQkJcmVnX3ZhbHVlPSAoKCoodm9sYXRpbGUgdWludDE2X3QgKikoKHVpbnQ2NF90KSgoKDB4NTQwMDArKGNvdW50Pj4xKSkpIDw8IDEpKzB4ZmUwMDAwMDApKT4+KCgoY291bnQpJTIpPzg6MCkpOy8vZHdjX2RkcnBoeV9hcGJfcmQoMHg1NDAwMCthZGRfb2Zmc2V0KzEpOwoJCQlyZWdfdmFsdWU9cmVnX3ZhbHVlJjB4ZmY7CgkJCS8vZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZWdfdmFsdWUsMzIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsgICAKCQkJcHJpbnRmKCJcbiByZWdfYWRkX29mZnNldDogJTA4eCAlMDh4ICUwOHgiLHJlZ19hZGRfb2Zmc2V0LHJlZ192YWx1ZSwoKCgoMHg1NDAwMCsoY291bnQ+PjEpKSkgPDwgMSkrMHhmZTAwMDAwMCkpOwoJCQljb3VudD1jb3VudCsxOwoJCX0KCQkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIlxudGltbWluZy5jOlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoKCgkJcHJpbnRmKCJcbiBzdGlja3kgcmVnaXN0ZXI6ICIpOwoJCXsKCQkJdWludDMyX3QgbG9vcF9tYXggPSAwOwoJCQlsb29wX21heD02NDw8MjsvL3NpemVvZihkZHJfc2V0X3QpOwoJCQkvL3VpbnQzMl90IGxvb3AgPSAwOwoJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsb29wX21heDsgY291bnQrPTQpIHsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZF9yZWcoKHVpbnQ2NF90KShwX2Rldi0+cF9kZHJzKSArIGNvdW50KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAgIAoJCQkJLy8JY291bnQ9Y291bnQrNDsKCQkJCXByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShHMTJfRE1DX1NUSUNLWV8wKSArIGNvdW50KSwoKEcxMl9ETUNfU1RJQ0tZXzApICsgY291bnQpKTsKCQkJfQoJCX0KCgkJewoJCQl1aW50MzJfdCBsb29wX21heCA9IDA7CgkJCWxvb3BfbWF4PXNpemVvZihkZHJfc2V0X3QpOwoJCQl1aW50MzJfdCBjb3VudCA9IDA7CgkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BfbWF4OyApIHsKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIlxuIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChjb3VudCwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAKCQkJCS8vCWRkcl9sb2dfc2VyaWFsX3B1dHMoIjogIixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOwoJCQkJLy8JZGRyX2xvZ19zZXJpYWxfcHV0X2hleChyZF9yZWcoKHVpbnQ2NF90KShwX2Rldi0+cF9kZHJzKSArIGNvdW50KSwzMixwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWwpOyAgIAoJCQkJcHJpbnRmKCJcbiUwOHggJTA4eCIsY291bnQscmRfcmVnKCh1aW50NjRfdCkoZGRyX3NldF90X3ApICsgY291bnQpKTsKCQkJCWNvdW50PWNvdW50KzQ7CgkJCQkvL3ByaW50ZigiXG4gcmVnX2FkZF9vZmZzZXQ6ICUwOHggJTA4eCAlMDh4Iixjb3VudCxyZF9yZWcoKHVpbnQ2NF90KShHMTJfRE1DX1NUSUNLWV8wKSArIGNvdW50KSwoKEcxMl9ETUNfU1RJQ0tZXzApICsgY291bnQpKTsKCQkJfQoJCX0KCQkvLwlkZHJfbG9nX3NlcmlhbF9wdXRzKCJcbiIscF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsKTsKfQoKCXByaW50ZigiXG4gIik7CgoKCS8vZGRyX3NldF90ICpkZHJfc2V0X3RfcDsKCS8vZGRyX3NldF90X3A9IChkZHJfc2V0X3QgKilHMTJfRE1DX1NUSUNLWV8wOwoJLy97CgkvL2Rkcl9zZXRfdF9wLT5kZHJfZnVuYzsKCS8vc3lzdGVtIHJlc2VydmUsZG8gbm90IG1vZGlmeQoJLyogYWxpZ244ICovCgoJLy91bnNpZ25lZAlsb25nCXJzdl9sb25nMFsyXTsKCS8qIHYxIGVuZCAqLwoJLy8JLyoKCgkvLwlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTZdOwoJLy8JZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5WzcyXTsKCS8vCWRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbMTZdOwoJLy8JKi8KCS8vCWRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbNzJdOwoJLy8JZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdOwoJLy8JZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlszMl07CgkvLwlkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlszMl07CgkvLy8qCgkvLwlkZHJfc2V0X3RfcC0+ZHFfZHFzX2RlbGF5X2ZsYWc7Ly9yZWFkX2RxcyAgcmVhZF9kcSx3cml0ZV9kcXMsIHdyaXRlX2RxCgkvLwlkZHJfc2V0X3RfcC0+ZGZpX21ybDsKCS8vCWRkcl9zZXRfdF9wLT5kZmlfaHd0bXJsOwoJLy8JZGRyX3NldF90X3AtPkFSZFB0ckluaXRWYWw7CgkvL30KCXVpbnQzMl90IHRlbXBfY291bnQ9MDsKCXsKCQlwcmludGYoIlxuLm1hZ2ljPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPm1hZ2ljLGRkcl9zZXRfdF9wLT5tYWdpYyk7CgkJZm9yKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw0O3RlbXBfY291bnQrKykKCQkJcHJpbnRmKCJcbi5mYXN0X2Jvb3RbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+ZmFzdF9ib290W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbdGVtcF9jb3VudF0pOwoJCS8vcHJpbnRmKCJcbi5yc3ZfaW50MD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yc3ZfaW50MCxkZHJfc2V0X3RfcC0+cnN2X2ludDApOwoJCXByaW50ZigiXG4uYm9hcmRfaWQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+Ym9hcmRfaWQsZGRyX3NldF90X3AtPmJvYXJkX2lkKTsKCQlwcmludGYoIlxuLnZlcnNpb249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dmVyc2lvbixkZHJfc2V0X3RfcC0+dmVyc2lvbik7CgkJcHJpbnRmKCJcbi5EcmFtVHlwZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EcmFtVHlwZSxkZHJfc2V0X3RfcC0+RHJhbVR5cGUpOwoJCXByaW50ZigiXG4uRGlzYWJsZWREYnl0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EaXNhYmxlZERieXRlLGRkcl9zZXRfdF9wLT5EaXNhYmxlZERieXRlKTsKCQlwcmludGYoIlxuLklzMlR0aW1pbmc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+SXMyVHRpbWluZyxkZHJfc2V0X3RfcC0+SXMyVHRpbWluZyk7CgkJcHJpbnRmKCJcbi5IZHRDdHJsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkhkdEN0cmwsZGRyX3NldF90X3AtPkhkdEN0cmwpOwoJCXByaW50ZigiXG4uZHJhbV9yYW5rX2NvbmZpZz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX3JhbmtfY29uZmlnLGRkcl9zZXRfdF9wLT5kcmFtX3JhbmtfY29uZmlnKTsKCQlwcmludGYoIlxuLmRpYWdub3NlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRpYWdub3NlLGRkcl9zZXRfdF9wLT5kaWFnbm9zZSk7CgkJcHJpbnRmKCJcbi5pbWVtX2xvYWRfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfYWRkcixkZHJfc2V0X3RfcC0+aW1lbV9sb2FkX2FkZHIpOwoJCXByaW50ZigiXG4uZG1lbV9sb2FkX2FkZHI9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX2FkZHIsZGRyX3NldF90X3AtPmRtZW1fbG9hZF9hZGRyKTsKCQlwcmludGYoIlxuLmltZW1fbG9hZF9zaXplPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmltZW1fbG9hZF9zaXplLGRkcl9zZXRfdF9wLT5pbWVtX2xvYWRfc2l6ZSk7CgkJcHJpbnRmKCJcbi5kbWVtX2xvYWRfc2l6ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kbWVtX2xvYWRfc2l6ZSxkZHJfc2V0X3RfcC0+ZG1lbV9sb2FkX3NpemUpOwoJCXByaW50ZigiXG4uZGRyX2Jhc2VfYWRkcj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfYmFzZV9hZGRyLGRkcl9zZXRfdF9wLT5kZHJfYmFzZV9hZGRyKTsKCQlwcmludGYoIlxuLmRkcl9zdGFydF9vZmZzZXQ9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX3N0YXJ0X29mZnNldCxkZHJfc2V0X3RfcC0+ZGRyX3N0YXJ0X29mZnNldCk7CgkJcHJpbnRmKCJcbi5kcmFtX2NzMF9zaXplX01CPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fY3MwX3NpemVfTUIsZGRyX3NldF90X3AtPmRyYW1fY3MwX3NpemVfTUIpOwoJCXByaW50ZigiXG4uZHJhbV9jczFfc2l6ZV9NQj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2NzMV9zaXplX01CLGRkcl9zZXRfdF9wLT5kcmFtX2NzMV9zaXplX01CKTsKCQlwcmludGYoIlxuLnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMF0sZGRyX3NldF90X3AtPnRyYWluaW5nX1NlcXVlbmNlQ3RybFswXSk7CgkJcHJpbnRmKCJcbi50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+dHJhaW5pbmdfU2VxdWVuY2VDdHJsWzFdLGRkcl9zZXRfdF9wLT50cmFpbmluZ19TZXF1ZW5jZUN0cmxbMV0pOwoJCXByaW50ZigiXG4ucGh5X29kdF9jb25maWdfcmFua1swXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzBdLGRkcl9zZXRfdF9wLT5waHlfb2R0X2NvbmZpZ19yYW5rWzBdKTsKCQlwcmludGYoIlxuLnBoeV9vZHRfY29uZmlnX3JhbmtbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1sxXSxkZHJfc2V0X3RfcC0+cGh5X29kdF9jb25maWdfcmFua1sxXSk7CgkJcHJpbnRmKCJcbi5yZXZlcjE9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmV2ZXIxLGRkcl9zZXRfdF9wLT5yZXZlcjEpOwoJCXByaW50ZigiXG4ucmV2ZXIyPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJldmVyMixkZHJfc2V0X3RfcC0+cmV2ZXIyKTsKCQkvLwl1bnNpZ25lZAljaGFyCXBoeV9vZHRfY29uZmlnX3JhbmtbMl07CgkJLy8JdW5zaWduZWQJY2hhcgkgZGRyX2Zhc3RfYm9vdF9mdW5jdGlvbjsKCQkvLwl1bnNpZ25lZAljaGFyCSBkcXNfb2Zmc2V0X3ZhbHVlOwoJCXByaW50ZigiXG4uZGZpX29kdF9jb25maWc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX29kdF9jb25maWcsZGRyX3NldF90X3AtPmRmaV9vZHRfY29uZmlnKTsKCQlwcmludGYoIlxuLkRSQU1GcmVxWzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzBdLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVswXSk7CgkJcHJpbnRmKCJcbi5EUkFNRnJlcVsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVsxXSxkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMV0pOwoJCXByaW50ZigiXG4uRFJBTUZyZXFbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+RFJBTUZyZXFbMl0sZGRyX3NldF90X3AtPkRSQU1GcmVxWzJdKTsKCQlwcmludGYoIlxuLkRSQU1GcmVxWzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPkRSQU1GcmVxWzNdLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVszXSk7CgkJcHJpbnRmKCJcbi5QbGxCeXBhc3NFbj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5QbGxCeXBhc3NFbixkZHJfc2V0X3RfcC0+UGxsQnlwYXNzRW4pOwoJCXByaW50ZigiXG4uZGRyX3JkYmlfd3JfZW5hYmxlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9yZGJpX3dyX2VuYWJsZSxkZHJfc2V0X3RfcC0+ZGRyX3JkYmlfd3JfZW5hYmxlKTsKCQlwcmludGYoIlxuLmRkcl9yZmNfdHlwZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfcmZjX3R5cGUsZGRyX3NldF90X3AtPmRkcl9yZmNfdHlwZSk7CgkJcHJpbnRmKCJcbi5lbmFibGVfbHBkZHI0eF9tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmVuYWJsZV9scGRkcjR4X21vZGUsZGRyX3NldF90X3AtPmVuYWJsZV9scGRkcjR4X21vZGUpOwoJCXByaW50ZigiXG4ucGxsX3NzY19tb2RlPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnBsbF9zc2NfbW9kZSxkZHJfc2V0X3RfcC0+cGxsX3NzY19tb2RlKTsKCQlwcmludGYoIlxuLmNsa19kcnZfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNsa19kcnZfb2htLGRkcl9zZXRfdF9wLT5jbGtfZHJ2X29obSk7CgkJcHJpbnRmKCJcbi5jc19kcnZfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmNzX2Rydl9vaG0sZGRyX3NldF90X3AtPmNzX2Rydl9vaG0pOwoJCXByaW50ZigiXG4uYWNfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19kcnZfb2htLGRkcl9zZXRfdF9wLT5hY19kcnZfb2htKTsKCQlwcmludGYoIlxuLnNvY19kYXRhX2Rydl9vaG1fcD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX3AsZGRyX3NldF90X3AtPnNvY19kYXRhX2Rydl9vaG1fcCk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9kcnZfb2htX249MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfZHJ2X29obV9uLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9kcnZfb2htX24pOwoJCXByaW50ZigiXG4uc29jX2RhdGFfb2R0X29obV9wPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fcCxkZHJfc2V0X3RfcC0+c29jX2RhdGFfb2R0X29obV9wKTsKCQlwcmludGYoIlxuLnNvY19kYXRhX29kdF9vaG1fbj0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9vZHRfb2htX24sZGRyX3NldF90X3AtPnNvY19kYXRhX29kdF9vaG1fbik7CgkJcHJpbnRmKCJcbi5kcmFtX2RhdGFfZHJ2X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfZHJ2X29obSxkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX2Rydl9vaG0pOwoJCXByaW50ZigiXG4uZHJhbV9kYXRhX29kdF9vaG09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9kYXRhX29kdF9vaG0sZGRyX3NldF90X3AtPmRyYW1fZGF0YV9vZHRfb2htKTsKCQlwcmludGYoIlxuLmRyYW1fYWNfb2R0X29obT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2FjX29kdF9vaG0sZGRyX3NldF90X3AtPmRyYW1fYWNfb2R0X29obSk7CgkJcHJpbnRmKCJcbi5zb2NfY2xrX3NsZXdfcmF0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfY2xrX3NsZXdfcmF0ZSxkZHJfc2V0X3RfcC0+c29jX2Nsa19zbGV3X3JhdGUpOwoJCXByaW50ZigiXG4uc29jX2NzX3NsZXdfcmF0ZT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlLGRkcl9zZXRfdF9wLT5zb2NfY3Nfc2xld19yYXRlKTsKCQlwcmludGYoIlxuLnNvY19hY19zbGV3X3JhdGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2FjX3NsZXdfcmF0ZSxkZHJfc2V0X3RfcC0+c29jX2FjX3NsZXdfcmF0ZSk7CgkJcHJpbnRmKCJcbi5zb2NfZGF0YV9zbGV3X3JhdGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2RhdGFfc2xld19yYXRlLGRkcl9zZXRfdF9wLT5zb2NfZGF0YV9zbGV3X3JhdGUpOwoJCXByaW50ZigiXG4udnJlZl9vdXRwdXRfcGVybWlsID0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwgLGRkcl9zZXRfdF9wLT52cmVmX291dHB1dF9wZXJtaWwgKTsKCQlwcmludGYoIlxuLnZyZWZfcmVjZWl2ZXJfcGVybWlsID0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT52cmVmX3JlY2VpdmVyX3Blcm1pbCAsZGRyX3NldF90X3AtPnZyZWZfcmVjZWl2ZXJfcGVybWlsICk7CgkJcHJpbnRmKCJcbi52cmVmX2RyYW1fcGVybWlsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnZyZWZfZHJhbV9wZXJtaWwsZGRyX3NldF90X3AtPnZyZWZfZHJhbV9wZXJtaWwpOwoJCXByaW50ZigiXG4ubWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5PTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPm1heF9jb3JlX3RpbW1taW5nX2ZyZXF1ZW5jeSxkZHJfc2V0X3RfcC0+bWF4X2NvcmVfdGltbW1pbmdfZnJlcXVlbmN5KTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzBdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVswXSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVsxXSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMV0pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbMl0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzJdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzNdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVszXSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs0XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNF0pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbNV0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzVdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzZdLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs2XSk7CgkJcHJpbnRmKCJcbi5hY190cmFjZV9kZWxheVs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs3XSxkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbN10pOwoJCXByaW50ZigiXG4uYWNfdHJhY2VfZGVsYXlbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbOF0sZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzhdKTsKCQlwcmludGYoIlxuLmFjX3RyYWNlX2RlbGF5WzldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3RyYWNlX2RlbGF5WzldLGRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVs5XSk7CgkJcHJpbnRmKCJcbi5scGRkcjRfZHJhbV92b3V0X3ZvbHRhZ2VfMV8zXzJfNV9zZXR0aW5nPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmcsZGRyX3NldF90X3AtPmxwZGRyNF9kcmFtX3ZvdXRfdm9sdGFnZV8xXzNfMl81X3NldHRpbmcpOwoJCXByaW50ZigiXG4ubHBkZHI0X3g4X21vZGU9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+bHBkZHI0X3g4X21vZGUsZGRyX3NldF90X3AtPmxwZGRyNF94OF9tb2RlKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFswXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzFdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzJdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbM10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFszXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzRdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs1XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzVdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbNl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs2XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzddLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbN10pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFs4XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzhdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbOV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFs5XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMF0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxMF0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTFdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTFdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEyXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzEyXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxM10sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxM10pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTRdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTRdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE1XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE1XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxNl0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzE3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTddLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMTddKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsxOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE4XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzE4XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMTldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsxOV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzIwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjBdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjBdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIxXSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzIxXSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMl0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyMl0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzIzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjNdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjNdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI0XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI0XSk7CgkJcHJpbnRmKCJcbi5hY19waW5tdXhbMjVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNV0sZGRyX3NldF90X3AtPmFjX3Bpbm11eFsyNV0pOwoJCXByaW50ZigiXG4uYWNfcGlubXV4WzI2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjZdLGRkcl9zZXRfdF9wLT5hY19waW5tdXhbMjZdKTsKCQlwcmludGYoIlxuLmFjX3Bpbm11eFsyN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI3XSxkZHJfc2V0X3RfcC0+YWNfcGlubXV4WzI3XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzFdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzFdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbM10sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbM10pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFs0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzRdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzRdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs1XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs1XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzZdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbNl0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFs3XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzddLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzddKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbOF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs4XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFs4XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzldPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbOV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMF0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTBdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTFdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzExXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzEyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzEyXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxMl0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxM10sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTNdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTRdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE0XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE1XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxNl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTZdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMTddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTddLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE3XSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzE4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzE4XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxOF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsxOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsxOV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMTldKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMjBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjBdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIwXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzIxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIxXSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMV0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsyMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyMl0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjJdKTsKCQlwcmludGYoIlxuLmRmaV9waW5tdXhbMjNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjNdLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzIzXSk7CgkJcHJpbnRmKCJcbi5kZmlfcGlubXV4WzI0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfcGlubXV4WzI0XSxkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyNF0pOwoJCXByaW50ZigiXG4uZGZpX3Bpbm11eFsyNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX3Bpbm11eFsyNV0sZGRyX3NldF90X3AtPmRmaV9waW5tdXhbMjVdKTsKCQlwcmludGYoIlxuLnNsdF90ZXN0X2Z1bmN0aW9uWzBdICA9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c2x0X3Rlc3RfZnVuY3Rpb25bMF0gICxkZHJfc2V0X3RfcC0+c2x0X3Rlc3RfZnVuY3Rpb25bMF0gICk7CgkJcHJpbnRmKCJcbi5zbHRfdGVzdF9mdW5jdGlvblsxXSAgPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzFdICAsZGRyX3NldF90X3AtPnNsdF90ZXN0X2Z1bmN0aW9uWzFdICApOwoJCXByaW50ZigiXG4udGRxczJkcT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT50ZHFzMmRxLGRkcl9zZXRfdF9wLT50ZHFzMmRxKTsKCQlwcmludGYoIlxuLmRyYW1fZGF0YV93cl9vZHRfb2htPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRyYW1fZGF0YV93cl9vZHRfb2htLGRkcl9zZXRfdF9wLT5kcmFtX2RhdGFfd3Jfb2R0X29obSk7CgkJcHJpbnRmKCJcbi5iaXRUaW1lQ29udHJvbF8yZD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5iaXRUaW1lQ29udHJvbF8yZCxkZHJfc2V0X3RfcC0+Yml0VGltZUNvbnRyb2xfMmQpOwoJCXByaW50ZigiXG4uZGRyX2RtY19yZW1hcFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsxXSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFsxXSk7CgkJcHJpbnRmKCJcbi5kZHJfZG1jX3JlbWFwWzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMl0sZGRyX3NldF90X3AtPmRkcl9kbWNfcmVtYXBbMl0pOwoJCXByaW50ZigiXG4uZGRyX2RtY19yZW1hcFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdLGRkcl9zZXRfdF9wLT5kZHJfZG1jX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuLmRkcl9kbWNfcmVtYXBbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFs0XSxkZHJfc2V0X3RfcC0+ZGRyX2RtY19yZW1hcFs0XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9jYV9yZW1hcFswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFswXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfY2FfcmVtYXBbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzFdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2NhX3JlbWFwWzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2NhX3JlbWFwWzJdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFsyXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9jYV9yZW1hcFszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9jYV9yZW1hcFszXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfY2FfcmVtYXBbM10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzBdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzNdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzRdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs0XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs1XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbNl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzZdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzddLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs3XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFs4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFs4XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbOV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzldKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzEwXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEwXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTFdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxMV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEyXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTJdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzEzXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxM10sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzEzXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTRdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE1XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTVdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxNl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE2XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMTddLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxN10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMThdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE4XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMThdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzE5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsxOV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzE5XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjBdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMF0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjFdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIxXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjFdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzIyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyMl0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzIyXSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyM109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjNdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyM10pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjRdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI0XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjRdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI1XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI1XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjZdLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyNl0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjddPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI3XSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjddKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzI4XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOF0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzI4XSk7CgkJcHJpbnRmKCJcbi5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMjldLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFsyOV0pOwoJCXByaW50ZigiXG4uZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMwXSxkZHJfc2V0X3RfcC0+ZGRyX2xwZGRyMzRfZHFfcmVtYXBbMzBdKTsKCQlwcmludGYoIlxuLmRkcl9scGRkcjM0X2RxX3JlbWFwWzMxXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZHJfbHBkZHIzNF9kcV9yZW1hcFszMV0sZGRyX3NldF90X3AtPmRkcl9scGRkcjM0X2RxX3JlbWFwWzMxXSk7CgkJcHJpbnRmKCJcbi5kcmFtX3J0dF9ub21fd3JfcGFya1swXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX3J0dF9ub21fd3JfcGFya1swXSxkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMF0pOwoJCXByaW50ZigiXG4uZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHJhbV9ydHRfbm9tX3dyX3BhcmtbMV0sZGRyX3NldF90X3AtPmRyYW1fcnR0X25vbV93cl9wYXJrWzFdKTsKCQlwcmludGYoIlxuLmRkcl9mdW5jPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRkcl9mdW5jLGRkcl9zZXRfdF9wLT5kZHJfZnVuYyk7CgoJCS8qCgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVswXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVswXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMF0pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbMV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMV0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzFdKTsKCQlwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzJdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsyXSk7CgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVszXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVszXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbM10pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbNF09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbNF0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzRdKTsKCQlwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzVdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzVdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs1XSk7CgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVs2XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs2XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbNl0pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbN109MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbN10sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzddKTsKCQlwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzhdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzhdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs4XSk7CgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVs5XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVs5XSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbOV0pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbMTBdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzEwXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTBdKTsKCQlwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzExXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxMV0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzExXSk7CgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVsxMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTJdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxMl0pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbMTNdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzEzXSxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTNdKTsKCQlwcmludGYoIlxuLnJlYWRfZHFzX2RlbGF5WzE0XT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxNF0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5WzE0XSk7CgkJcHJpbnRmKCJcbi5yZWFkX2Rxc19kZWxheVsxNV09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbMTVdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19kZWxheVsxNV0pOwoJCXByaW50ZigiXG4ucmVhZF9kcV9iaXRfZGVsYXlbNzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5WzcyXSxkZHJfc2V0X3RfcC0+cmVhZF9kcV9iaXRfZGVsYXlbNzJdKTsKCQlwcmludGYoIlxuLndyaXRlX2Rxc19kZWxheVsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5WzE2XSxkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5WzE2XSk7CgkJcHJpbnRmKCJcbi53cml0ZV9kcV9iaXRfZGVsYXlbNzJdPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVs3Ml0sZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVs3Ml0pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZ2F0ZV9kZWxheVsxNl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVsxNl0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdKTsKCQlwcmludGYoIlxuLnNvY19iaXRfdnJlZlszMl09MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmWzMyXSxkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmWzMyXSk7CgkJcHJpbnRmKCJcbi5kcmFtX2JpdF92cmVmWzMyXT0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmWzMyXSxkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlszMl0pOwoJCXByaW50ZigiXG4uZHFfZHFzX2RlbGF5X2ZsYWc9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZHFfZHFzX2RlbGF5X2ZsYWcsZGRyX3NldF90X3AtPmRxX2Rxc19kZWxheV9mbGFnKTsKCQlwcmludGYoIlxuLmRmaV9tcmw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+ZGZpX21ybCxkZHJfc2V0X3RfcC0+ZGZpX21ybCk7CgkJcHJpbnRmKCJcbi5kZmlfaHd0bXJsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9od3RtcmwsZGRyX3NldF90X3AtPmRmaV9od3RtcmwpOwoJCXByaW50ZigiXG4uQVJkUHRySW5pdFZhbD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5BUmRQdHJJbml0VmFsLGRkcl9zZXRfdF9wLT5BUmRQdHJJbml0VmFsKTsKCQkqLwoKCQkvL3ByaW50ZigiXG4ucmVhZF9kcV9iaXRfZGVsYXlbNzJdPSVkLCIsZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5WzcyXSk7CgkJLy9wcmludGYoIlxuLndyaXRlX2Rxc19kZWxheVsxNl09JWQsIixkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5WzE2XSk7CgkJLy9wcmludGYoIlxuLndyaXRlX2RxX2JpdF9kZWxheVs3Ml09JWQsIixkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5WzcyXSk7CgkJLy9wcmludGYoIlxuLnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdPSVkLCIsZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbMTZdKTsKCQkvL3ByaW50ZigiXG4uc29jX2JpdF92cmVmWzMyXT0lZCwiLGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbMzJdKTsKCQkvL3ByaW50ZigiXG4uZHJhbV9iaXRfdnJlZlszMl09JWQsIixkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlszMl0pOwoJCS8vcHJpbnRmKCJcbi5kcV9kcXNfZGVsYXlfZmxhZz0lZCwiLGRkcl9zZXRfdF9wLT5kcV9kcXNfZGVsYXlfZmxhZyk7CgkJLy9wcmludGYoIlxuLmRmaV9tcmw9JWQsIixkZHJfc2V0X3RfcC0+ZGZpX21ybCk7CgkJLy9wcmludGYoIlxuLmRmaV9od3Rtcmw9JWQsIixkZHJfc2V0X3RfcC0+ZGZpX2h3dG1ybCk7CgkJLy9wcmludGYoIlxuLkFSZFB0ckluaXRWYWw9JWQsIixkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCk7CgoJCWZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MTY7dGVtcF9jb3VudCsrKQoJCXByaW50ZigiXG4ucmVhZF9kcXNfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZGVsYXlbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RlbXBfY291bnRdKTsKCQlmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDcyO3RlbXBfY291bnQrKykKCQlwcmludGYoIlxuLnJlYWRfZHFfYml0X2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJlYWRfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSk7CgkJZm9yKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDwxNjt0ZW1wX2NvdW50KyspCgkJLy9wcmludGYoIlxuLndyaXRlX2Rxc19kZWxheVslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbdGVtcF9jb3VudF0pOwoJCXByaW50ZigiXG4ud3JpdGVfZHFzX2RlbGF5WyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPndyaXRlX2Rxc19kZWxheVt0ZW1wX2NvdW50XSxkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RlbXBfY291bnRdKTsKCQlmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDcyO3RlbXBfY291bnQrKykKCQkvL3ByaW50ZigiXG4ud3JpdGVfZHFfYml0X2RlbGF5WyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPndyaXRlX2RxX2JpdF9kZWxheVt0ZW1wX2NvdW50XSk7CgkJcHJpbnRmKCJcbi53cml0ZV9kcV9iaXRfZGVsYXlbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+d3JpdGVfZHFfYml0X2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbdGVtcF9jb3VudF0pOwoJCWZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MTY7dGVtcF9jb3VudCsrKQoJCS8vcHJpbnRmKCJcbi5yZWFkX2Rxc19nYXRlX2RlbGF5WyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJlYWRfZHFzX2dhdGVfZGVsYXlbdGVtcF9jb3VudF0pOwoJCXByaW50ZigiXG4ucmVhZF9kcXNfZ2F0ZV9kZWxheVslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5yZWFkX2Rxc19nYXRlX2RlbGF5W3RlbXBfY291bnRdKTsKCQlmb3IoIHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50PDMyO3RlbXBfY291bnQrKykKCQkvL3ByaW50ZigiXG4uc29jX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt0ZW1wX2NvdW50XSk7CgkJcHJpbnRmKCJcbi5zb2NfYml0X3ZyZWZbJWRdPTB4JTA4eCwvLyAlZCIsdGVtcF9jb3VudCxkZHJfc2V0X3RfcC0+c29jX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5zb2NfYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCWZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MzI7dGVtcF9jb3VudCsrKQoJCS8vcHJpbnRmKCJcbi5kcmFtX2JpdF92cmVmWyVkXT0lZCwiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPmRyYW1fYml0X3ZyZWZbdGVtcF9jb3VudF0pOwoJCXByaW50ZigiXG4uZHJhbV9iaXRfdnJlZlslZF09MHglMDh4LC8vICVkIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdLGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdKTsKCgkJLy9kZHJfc2V0X3RfcC0+ZHFfZHFzX2RlbGF5X2ZsYWc9MHhmZjsKCQlwcmludGYoIlxuLnJldmVyMz0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5yZXZlcjMsZGRyX3NldF90X3AtPnJldmVyMyk7CgkJcHJpbnRmKCJcbi5kZmlfbXJsPTB4JTA4eCwvLyAlZCIsZGRyX3NldF90X3AtPmRmaV9tcmwsZGRyX3NldF90X3AtPmRmaV9tcmwpOwoJCXByaW50ZigiXG4uZGZpX2h3dG1ybD0weCUwOHgsLy8gJWQiLGRkcl9zZXRfdF9wLT5kZmlfaHd0bXJsLGRkcl9zZXRfdF9wLT5kZmlfaHd0bXJsKTsKCQlwcmludGYoIlxuLkFSZFB0ckluaXRWYWw9MHglMDh4LC8vICVkIixkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCxkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbCk7CgoJCWZvciggdGVtcF9jb3VudD0wO3RlbXBfY291bnQ8MTY7dGVtcF9jb3VudCsrKQoJCQkvL3ByaW50ZigiXG4uZHJhbV9iaXRfdnJlZlslZF09JWQsIix0ZW1wX2NvdW50LGRkcl9zZXRfdF9wLT5kcmFtX2JpdF92cmVmW3RlbXBfY291bnRdKTsKCQkJcHJpbnRmKCJcbi5yZXRyYWluaW5nWyVkXT0weCUwOHgsLy8gJWQiLHRlbXBfY291bnQsZGRyX3NldF90X3AtPnJldHJhaW5pbmdbdGVtcF9jb3VudF0sZGRyX3NldF90X3AtPnJldHJhaW5pbmdbdGVtcF9jb3VudF0pOwoKCQlwcmludGYoIlxuIik7Ci8qCgkJcHJpbnRmKCJcbmRkcl9zZXRfdF9wLT5tYWdpYzolMDh4IixkZHJfc2V0X3RfcC0+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+ZHFfYml0X2RlbGF5WzcyXSk7CiovCgl9CglyZXR1cm4gMTsKfQoKCmludCBkb19kZHJfZmFzdGJvb3RfY29uZmlnKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCWludCBpPTA7CglpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgZW5hYmxlX2Rkcl9mYXN0X2Jvb3Q9MDsgIC8vIDAgcGF1c2UgMSxyZXN1bWUKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CglpZiAoYXJnYyA9PSAxKQoJCXByaW50ZigiXG5wbGVhc2UgcmVhZCBoZWxwXG4iKTsKCWVsc2UgaWYgKGFyZ2MgPiAxKQoJewoJCWNvdW50PTA7CgkJZW5hYmxlX2Rkcl9mYXN0X2Jvb3Q9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQllbmFibGVfZGRyX2Zhc3RfYm9vdCA9IDA7CgkJfQoJCS8vCWNvdW50Kys7Cgl9CglpZighZW5hYmxlX2Rkcl9mYXN0X2Jvb3QpCgkJcmV0dXJuIDE7CgoJZGRyX3NldF90ICpkZHJfc2V0X3RfcD1OVUxMOwoJZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJLy9kZHJfc2V0X3RfcD0gKGRkcl9zZXRfdCAqKUcxMl9ETUNfU1RJQ0tZXzA7CgkvL2lmIChzaXplb2YoZGRyX3NldF90KTxsb29wX21heCkKCXVpbnQzMl90ICBkZHJfc2V0X2FkZD0wOwoJdWludDMyX3QgIGRkcl9zZXRfc2l6ZT0wOwoJZGRyX3NldF9hZGQ9KHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApOwoJZGRyX3NldF9zaXplPXNpemVvZihkZHJfc2V0X3QpOwoJcHJpbnRmKCJcbmRkcl9zZXRfdF9wPT0weCUwOHhcbiIsZGRyX3NldF9hZGQpOwoJdWludDMyX3QgbG9vcD0wOyAKCXVpbnQzMl90IGxvb3BfbWF4ID0gKDQrKDB4M2Y8PDIpKTsvLygoRE1DX1NUSUNLWV82My1ETUNfU1RJQ0tZXzApKTsKCS8vCWxvb3BfbWF4PXNpemVvZihkZHJfc2V0X3QpOwoJZm9yIChsb29wID0gMDsgbG9vcCA8bG9vcF9tYXg7IGxvb3ArPTQpIHsKCQl3cl9yZWcoKCh1aW50NjRfdCkoZGRyX3NldF90X3ApICsgbG9vcCksIHJkX3JlZyhHMTJfRE1DX1NUSUNLWV8wICsgbG9vcCkpOwoJfQoJCQkKewoJdWludDE2X3QJZHFfYml0X2RlbGF5WzcyXTsKCXVuc2lnbmVkCWNoYXIgdF9jb3VudD0wOwoJdWludDE2X3QgIGRlbGF5X29yZz0wOwoJdWludDE2X3QgIGRlbGF5X3RlbXA9MDsKCXVpbnQzMl90ICBhZGRfb2Zmc2V0PTA7Cglkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDB4MCk7CgoJY2hhciBkbWNfdGVzdF93b3JzdF93aW5kb3dfcng9MDsKCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTA7CgoJewoJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMHhkPDwxNil8KDA8PDEyKXwoMHgwKSwwKTsgLy8gRFdDX0REUlBIWUFfQVBCT05MWTBfTWljcm9Db250TXV4U2VsCgoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMikpOwoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDBjMykpOwoJaWYoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PjMwKQoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTMwOwoJaWYoZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PjMwKQoJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3J4PTMwOwovLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgxYzIpLHQ0X3dyaXRlX3dvcnN0X21hcmdpbl9yYW5rMSk7Ci8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDFjMyksdDRfcmVhZF93b3JzdF9tYXJnaW5fcmFuazEpOwoJZGRyX3NldF90X3AtPmZhc3RfYm9vdFsxXT0oKChkbWNfdGVzdF93b3JzdF93aW5kb3dfdHgvMik8PDQpKXwoKChkbWNfdGVzdF93b3JzdF93aW5kb3dfcngvMikpKTsKCQkJCX0KCQoJewoJLy9wcmludGYoIlxuIEFSZFB0ckluaXRWYWwiKTsKCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwoMDw8MTIpfCgweDJlKSk7CglkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CglkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbD1kZWxheV9vcmc7CgkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCgkvL3ByaW50ZigiXG4gZGZpbXJsMCBkZmltcmwxIGRmaW1ybDIgZGZpbXJsMyBId3RNUkwiKTsKCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDIwKSk7CglkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CglkZHJfc2V0X3RfcC0+ZGZpX21ybD1kZWxheV9vcmc7CgkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMTw8MTIpfCgweDIwKSk7CglkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDEsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMjw8MTIpfCgweDIwKSk7CglkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDIsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMzw8MTIpfCgweDIwKSk7CglkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDMsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweDIwKSk7CglkZWxheV9vcmc9ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgoJZGRyX3NldF90X3AtPmRmaV9od3Rtcmw9ZGVsYXlfb3JnOwoJLy9wcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7Cgl9Cgl7CgkvL3ByaW50ZigiXG4gY291bnRfaW5kZXggICAgIGRlbGF5X3ZhbHVlICAgICByZWdpc3Rlcl9hZGQgICAgIHJlZ2lzdGVyX3ZhbHVlIFxuICIpOwoJLy9wcmludGYoIlxuIGFkZHJlc3MgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lICAtLXN0ZXA9PTEvMzJVSSAsYml0IDYgaXMgY29hcnNlICAtLXN0ZXA9PTFVSSIsdWlfMV8zMl8xMDBzdGVwKTsKCWZvcih0X2NvdW50PTA7dF9jb3VudDwxMDt0X2NvdW50KyspCgl7CgkJYWRkX29mZnNldD0oKDA8PDIwKXwoMDw8MTYpfCh0X2NvdW50PDwxMil8KDB4ODApKTsKCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQlkZHJfc2V0X3RfcC0+YWNfdHJhY2VfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7Cgl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHRkcXMgZGVsYXkgKiAxLzMyVUl4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09MS8zMlVJICxiaXQgNi05IGlzIGNvYXJzZSAgLS1zdGVwPT0xVUkiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweGQwKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJCgkJCWRkcl9zZXRfdF9wLT53cml0ZV9kcXNfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkJCgkJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHJ4ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSxubyBjb2Fyc2UiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweDhjKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHdyaXRlIGRxX2JpdCBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLS1zdGVwPT0xLzMyVUkgLGJpdCA2LTggaXMgY29hcnNlICAtLXN0ZXA9PTFVIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCQl7CgkJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoMHhjMCsoKHRfY291bnQlOSk8PDgpKyh0X2NvdW50LzM2KSkpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJCWRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCgkJCQkKCQkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByZWFkIGRxX2JpdCBkZWxheSAqIEJETFJ4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09YmRsciBzdGVwIHNpemUgYWJvdXQgNXBzLG5vIGNvYXJzZSIsYmRscl8xMDBzdGVwKTsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KDB4NjgrKCh0X2NvdW50JTkpPDw4KSsodF9jb3VudC8zNikpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgoZGVsYXlfb3JnJjB4M2YpKTsKCQkJCgkJCWRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByZWFkIGRxcyBnYXRlIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAsYml0IDYtMTAgaXMgY29hcnNlIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoKCQkJCgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9CgoJLy8JcHJpbnRmKCJcbiBzb2MgdnJlZiA6IGxwZGRyNC0tIFZSRUYgPSBWRERRKigwLjA0NyArIFZyZWZEQUMwWzY6MF0qMC4wMDM2NyAgIEREUjQgLS1WUkVGID0gVkREUSooMC41MTAgKyBWcmVmREFDMFs2OjBdKjAuMDAzNDUiKTsKCQkvLygoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSkJCgkJdWludDMyX3QgdnJlZl90X2NvdW50PTA7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgoKHRfY291bnQlMzYpJTkpPDw4KXwoMHg0MCkpOwoJCQlkcV9iaXRfZGVsYXlbdF9jb3VudF09ZHdjX2RkcnBoeV9hcGJfcmQoYWRkX29mZnNldCk7CgkJCWRlbGF5X29yZz1kcV9iaXRfZGVsYXlbdF9jb3VudF07CgkJCWRlbGF5X3RlbXA9KChkZWxheV9vcmcpKTsKCgkJCWlmKHRfY291bnQ8MzUpCgkJCXsKCQkJCXZyZWZfdF9jb3VudD0oKCgodF9jb3VudCUzNikvOSkqOCkrKHRfY291bnQlOSkpOwoJCQkJZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt2cmVmX3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCX0KCQkJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJCS8vcHJpbnRmKCJcbiBkcmFtIHZyZWYgOiBscGRkcjQtLSBWUkVGID0gVkREUSooMC4gKyBWcmVmREFDMFs2OjBdKjAuICAgRERSNCAtLVZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4iKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwODIpKTsKCQlkZWxheV90ZW1wPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwzMjt0X2NvdW50KyspCgkJewoJCQlkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X3RlbXApOwoKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NDt0X2NvdW50KyspCgkJey8vcF9kZXYtPnBfZGRycy0+dGRxczJkcT1scGRkcjRfdGRxczJkcTsKCQkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1swXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhYSkpOyAgLy9QcHRDdGxTdGF0aWMKCQkJLy9kZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1sxXT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHhhZSkpOyAgLy9QcHREcXNDbnRJbnZUcm5UZzAgIHBzMCByYW5rMAoJCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzJdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxCgkJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCswXT0oZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKSkmMHhmZjsgIC8vUHB0Q3RsU3RhdGljCgkJCWRkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzQqdF9jb3VudCsxXT0oZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWEpKSk+Pjg7ICAvL1BwdEN0bFN0YXRpYwoJCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMl09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWUpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazAgbGFuZSAwLTMKCQkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzNdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxIGxhbmUgMC0zCgkJfQoJfQp9CgoJY2hhciBzdHJbMTAyNF09IiI7CgkvL3N0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHg3N2Y4MWNmMCAweDMwMAoJLy9wcmludGYoIlxuICIpOwoKCWlmKGVuYWJsZV9kZHJfZmFzdF9ib290PT0xKQoJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF09MHhmZjsKCglpZihlbmFibGVfZGRyX2Zhc3RfYm9vdD09MikKCQlkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdPTA7CgoJewoJCSNpZiAxCgkJcHJpbnRmKCImZGRyX3NoYS5kZHJzIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5kZHJzKTsKCQlwcmludGYoIiZkZHJfc2hhLnNoYTIgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLnNoYTIpOwoJCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KWRkcl9zZXRfYWRkKTsKCgkJc2hhMjU2X2NzdW1fd2QoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJCS8vc2hhMigodW5zaWduZWQgY2hhciAqKSh1aW50NjRfdClkZHJfc2V0X2FkZCwgc2l6ZW9mKGRkcl9zZXRfdCksIGRkcl9zaGEuc2hhMiwgMCk7CgkJcHJpbnRmKCJwcmludCBzaGFcbiIpOwoJCXNwcmludGYoc3RyLCJtZCAlMDh4IDB4MTAwIiwgKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF9hZGQtMzIpKTsKCQlydW5fY29tbWFuZChzdHIsMCk7CgkJI2VuZGlmCgkJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sZGRyX3NldF9zaXplK1NIQTI1Nl9TVU1fTEVOKTsKCQkjZWxzZQoJCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJCSNlbmRpZgoJCS8vCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZCxkZHJfc2V0X3NpemUpOwoJCS8vCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoKCXJldHVybiAxOwp9CiNlbHNlCmludCBkb19kZHJfZGlzcGxheV9kZHJfaW5mb3JtYXRpb24oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvLyAgIGlmKCFhcmdjKQoJLy8gICAgZ290byBERFJfVFVORV9EUVNfU1RBUlQ7CglpbnQgaT0wOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoKCS8vd3JpdGVsKCgwKSwgMHhjODgzNmMwMCk7CglPUEVOX0NIQU5ORUxfQV9QSFlfQ0xLKCk7CglPUEVOX0NIQU5ORUxfQl9QSFlfQ0xLKCk7CgkvL3dyaXRlbCgoMCksIDB4Yzg4MzZjMDApOwoKCS8vIGNoYXIgKmVuZHA7CgoJdW5zaWduZWQgaW50IHpxMHByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7Cgl1bnNpZ25lZCBpbnQgenExcHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMVBSKTsKCXVuc2lnbmVkIGludCB6cTJwcl9vcmcgPSByZF9yZWcoRERSMF9QVUJfWlEyUFIpOwoJdW5zaWduZWQgaW50IHNvY19hY19kcnYzPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2FjX2RydjRfdXA9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfZHJ2NF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2FjX29kdDM9MDsKCXVuc2lnbmVkIGludCBzb2NfYWNfb2R0ND0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMDFfZHJ2Mz0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMDFfZHJ2NF91cD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMDFfZHJ2NF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEwMV9vZHQzPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEwMV9vZHQ0PTA7CgoJdW5zaWduZWQgaW50IHNvY19kYXRhMjNfZHJ2Mz0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMjNfZHJ2NF91cD0wOwoJdW5zaWduZWQgaW50IHNvY19kYXRhMjNfZHJ2NF9kb3duPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEyM19vZHQzPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGEyM19vZHQ0PTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9kcnY9MDsKCXVuc2lnbmVkIGludCBkcmFtX29kdD0wOwoJdW5zaWduZWQgaW50IGRyYW1fZGRyNF9kcnY9MDsKCXVuc2lnbmVkIGludCBkcmFtX2RkcjRfb2R0PTA7CgkvL3Vuc2lnbmVkIGludCBzb2NfenFfb2R0X2Rpdj00ODA7CgoJdW5zaWduZWQgaW50IHB1Yl9kY3I9IHJkX3JlZyhERFIwX1BVQl9EQ1IpOwoJdW5zaWduZWQgaW50IHB1Yl9tcjE9IHJkX3JlZyhERFIwX1BVQl9NUjEpOwoJdW5zaWduZWQgaW50IHJlZ192YWx1ZT0wOwoJI2RlZmluZSBERFJfVFlQRV9MUEREUjIgIDAKCSNkZWZpbmUgRERSX1RZUEVfTFBERFIzICAxCgkjZGVmaW5lIEREUl9UWVBFX0REUjMgIDMKCSNkZWZpbmUgRERSX1RZUEVfRERSNCAgNAoJdW5zaWduZWQgaW50IGRkcl90eXBlPSBwdWJfZGNyJjB4NzsgLy8wIC1scGRkcjIgIHwgIDEtIGxwZGRyMyAgfCAgIDItIHJldiAgfCAgMyAtZGRyMyAgIHwgNC0gZGRyNAoKCXsKCQlpZiAoZGRyX3R5cGU9PTApCgkJCXByaW50ZigiXG5kZHJfdHlwZT09bHBkZHIyXG4iKTsKCQlpZiAoZGRyX3R5cGU9PTEpCgkJCXByaW50ZigiXG5kZHJfdHlwZT09bHBkZHIzXG4iKTsKCQlpZiAoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCXByaW50ZigiXG5kZHJfdHlwZT09ZGRyM1xuIik7CgkJaWYgKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQlwcmludGYoIlxuZGRyX3R5cGU9PWRkcjRcbiIpOwoKCQlzb2NfYWNfZHJ2Mz16cTBwcl9vcmcmMHhmOwoJCXNvY19hY19vZHQzPSh6cTBwcl9vcmc+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+MTQpIHsKCQllcnJvcl9mbGFnX3JlZ19hZGQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzE0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQllcnJvcl9mbGFnX3JlZ19hZGQ9IDA7CgkJfQoJfQoJcHJpbnRmKCJlcnJvcl9mbGFnX3JlZ19hZGQ9PTB4JTA4eFxuIixlcnJvcl9mbGFnX3JlZ19hZGQpOwoJcHJpbnRmKCJcbnRlc3QgdXNlIHVib290IHN0aWNreSByZWdpc3RlclxuIik7CgoJLy9ETUNfU1RJQ0tZXzAKCWNoYXIgc3RyWzEwMjRdPSIiOwoJLy9jaGFyIHN0cl90ZW1wMVsxMDI0XT0iIjsKCS8vY2hhciBzdHJfdGVtcDJbMTAyNF09IiI7Cgl2b2xhdGlsZSB1aW50MTZfdCAgKm51bV9hcnJ5PU5VTEw7CgkvL3ZvbGF0aWxlIHVpbnQxNl90ICAqcF9udW1fYXJyeTsKCWludCBpOwoJLy91bnNpZ25lZCBpbnQgc3RpY2tfYmFzZV9hZGQ9MDsKCS8vdWludDMyX3QgZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcodWludDMyX3QgYmFzZV9hZGRyLHVpbnQzMl90IHNpemUsdWludDMyX3Qgb2Zmc2V0X2luZGV4LHVpbnQzMl90IHZhbHVlKQoKCXN0aWNreV9yZWdfYmFzZV9hZGQ9KEREUjBfUFVCX1JFR19CQVNFJjB4ZmZmZjAwMDApKygoRE1DX1NUSUNLWV9HMTJBXzApJjB4ZmZmZik7CgkvL251bV9hcnJ5ID0gKHVpbnQxNl90ICopKHVpbnQ2NF90ICkoc3RpY2t5X3JlZ19iYXNlX2FkZCk7CgkvL251bV9hcnJ5PXBfbnVtX2Fycnk7Cglmb3IgKGkgPSAwOyBpIDwgNjQqNDsgaSsrKSB7CgkJbnVtX2FycnlbaV09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LGkpOwoJCWlmKChpPT0wKXx8KGk9PTMyKXx8KGk9PSgzMisxMCozKSl8fChpPT0oMzIrMTAqMysxNiozKSl8fChpPT0oMzIrMTAqMysxNiozKzE2KjMpKSkKCQl7CgkJCXByaW50ZigiXG4gbnVtYXJyeVslZF0iICxpKTsKCQl9CgkJcHJpbnRmKCIgJWQgIixudW1fYXJyeVtpXSk7Cgl9CgoJLyoKCSNkZWZpbmUgIFRFU1RfQVJHXzFfQ01EMCAgMQoJLy8jZGVmaW5lICBURVNUX0FSR18xX0NNRDEgIDEKCSNkZWZpbmUgIFRFU1RfQVJHXzJfU1RFUCAgMgoJI2RlZmluZSAgVEVTVF9BUkdfM19GUkVRICAzCgkjZGVmaW5lICBURVNUX0FSR180X1NURVBfU1RBVFVTICA0CgkjZGVmaW5lICBURVNUX0FSR181X0JPT1RfVElNRVMgIDUKCSNkZWZpbmUgIFRFU1RfQVJHXzZfTENETFJfVEVNUF9DT1VOVCA2CgkjZGVmaW5lICBURVNUX0FSR183X0RNQ19TVElDS1lfTUFHSUMgIDcKCSovCgoJdWludDE2X3QgdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlID0zMjsgIAoJdWludDE2X3QgdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZSA9MzI7ICAKCXVpbnQxNl90IHRlc3RfYm9vdF90aW1lcyA9MDsgIAoJdWludDE2X3QgdGVzdF9kZHJfZnJlcXVlbmN5ID0wOyAgCgkvL3VpbnQxNl90IHRlbXBfc3ViX3ZhbHVlX2EgPTA7ICAKCS8qCgl1aW50MTZfdCB0ZXN0X2FyZ18xX2NtZDAgPTE7ICAvL21hc3RlciBjbWQKCXVpbnQxNl90IHRlc3RfYXJnXzFfY21kMSA9MDsgIC8vbWluIGNtZAoJdWludDE2X3QgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgbGFuZTAgdyBtaW4gIC0yIGxhbmUwIHcgbWF4IC0zIGxhbmUwIHIgbWluICAgIDQgbGFuZTAgciBtYXggLS0tLS01IGxhbmUxIHcgbWluIC4uLgoJdWludDE2X3QgdGVzdF9hcmdfM19mcmVxID0wOwoJdWludDE2X3QgdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdGVzdF9hcmdfMF9jbWQwPW51bV9hcnJ5WzBdOwoJdGVzdF9hcmdfMV9jbWQxPW51bV9hcnJ5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJ5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJ5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz1udW1fYXJyeVs0XTsKCS8vYm9vdF90aW1lcz1udW1fYXJyeVs1XTsKCS8vbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyeVs2XTsKCSovCglwcmludGYoIlxuVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDXSk7CglwcmludGYoIlxuVEVTVF9BUkdfMV9DTUQwPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXSk7CglwcmludGYoIlRFU1RfQVJHXzJfU1RFUD09MHglMDh4XG4iLG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJcHJpbnRmKCJURVNUX0FSR18zX0FMTF9UT0dIVEVSPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfM19BTExfVE9HSFRFUl0pOwoJcHJpbnRmKCJURVNUX0FSR19GUkVRX05JQkJMRV9MPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfTF0pOwoJcHJpbnRmKCJURVNUX0FSR19GUkVRX05JQkJMRV9IPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfSF0pOwoJcHJpbnRmKCJURVNUX0FSR19CT09UX1RJTUVTX0w9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdKTsKCXByaW50ZigiVEVTVF9BUkdfQk9PVF9USU1FU19IPT0weCUwOHhcbiIsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXSk7CglwcmludGYoIlRFU1RfQVJHX0VSUk9SX0ZMQUc9PTB4JTA4eFxuIixudW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgoJcHJpbnRmKCJURVNUX0FSR19GUkVRPT0lZE1cbiIsKG51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdPDw4KXwobnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfTF08PDApKTsKCXByaW50ZigiVEVTVF9BUkdfQk9PVF9USU1FUz09JWRcbiIsKG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF08PDgpfChudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdPDwwKSk7Cgl0ZXN0X2Jvb3RfdGltZXM9KG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfSF08PDgpfChudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0xdPDwwKTsKCXRlc3RfZGRyX2ZyZXF1ZW5jeT0obnVtX2FycnlbVEVTVF9BUkdfRlJFUV9OSUJCTEVfSF08PDgpfChudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9MXTw8MCk7CglpZigobnVtX2FycnlbVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDXT09KERNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzEmMHhmZikpJiYKCShudW1fYXJyeVtURVNUX0FSR18xX0NNRDBdPT0oRE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMSYweGZmKSkgKSAvL2ZvciBjaGVjayBtYWdpYyBudW1iZXIgbWFrZSBzdW1lIGVudGVyIHRlc3QgY29tbWFuZAoJewoJCS8vbnVtX2FycnlbVEVTVF9BUkdfNV9CT09UX1RJTUVTXSsrOwoJCXRlc3RfYm9vdF90aW1lcysrOwoJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF09dGVzdF9ib290X3RpbWVzJjB4ZmY7CgkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXT0odGVzdF9ib290X3RpbWVzPj44KSYweGZmOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0wsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfSCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdKTsKCgkJaWYoIHRlc3RfZGRyX2ZyZXF1ZW5jeSE9Z2xvYmFsX2Rkcl9jbGspICAvLwoJCXsKCQkJcHJpbnRmKCJydW5uaW5nIGRkciBmcmVxPT0lZCxidXQgdGVzdCBmcmVxIGlzJWQsd2lsbCByZWJvb3QgdXNlIGQycGxsIFxuIixnbG9iYWxfZGRyX2Nsayx0ZXN0X2Rkcl9mcmVxdWVuY3kpOwoJCQlzcHJpbnRmKHN0ciwiZDJwbGwgICVkIix0ZXN0X2Rkcl9mcmVxdWVuY3kpOwoJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoJZWxzZQoJewoJCXRlc3RfYm9vdF90aW1lcz0wOwoJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF09dGVzdF9ib290X3RpbWVzJjB4ZmY7CgkJbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19IXT0odGVzdF9ib290X3RpbWVzPj44KSYweGZmOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR19CT09UX1RJTUVTX0wsbnVtX2FycnlbVEVTVF9BUkdfQk9PVF9USU1FU19MXSk7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfSCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdKTsKCQludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTA7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCxudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCX0KCXByaW50ZigidGVzdF9zdGlja3kgaXMgbm90IG1hZ2ljIG51bW1iZXIsYm9vdCB0aW1lcz09JWRcbiIsdGVzdF9ib290X3RpbWVzKTsKCgkvL2lmKGNvbmZpZ19yZWdpc3Rlcj09MSkKCXsKCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrVEVTVF9BUkdfQ1MwX1RFU1RfU1RBUlRfSU5ERVgpLCBjczBfdGVzdF9zdGFydCk7CgkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkK1RFU1RfQVJHX0NTMF9URVNUX1NJWkVfSU5ERVgpLCBjczBfdGVzdF9zaXplKTsKCQl3cl9yZWcoKHN0aWNreV9yZWdfYmFzZV9hZGQrVEVTVF9BUkdfQ1MxX1RFU1RfU1RBUlRfSU5ERVgpLCBjczFfdGVzdF9zdGFydCk7CgkJd3JfcmVnKChzdGlja3lfcmVnX2Jhc2VfYWRkK1RFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVgpLCBjczFfdGVzdF9zaXplKTsKCQl7CgkJCW51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWF09d2F0Y2hkb2dfdGltZV9zJjB4ZmY7CgkJCW51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCsxXT0od2F0Y2hkb2dfdGltZV9zPj44KSYweGZmOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYLG51bV9hcnJ5W1RFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWF0pOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsKFRFU1RfQVJHX1dBVENIRE9HX1RJTUVfU0laRV9JTkRFWCsxKSxudW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgrMV0pOwoJCX0KCQludW1fYXJyeVtURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWF09dGVzdF9pbmRleF9lbmFibGU7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYLG51bV9hcnJ5W1RFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYXSk7CgkJaWYgKGNvbmZpZ19yZWdpc3RlciA9PSAxKQoJCQl7CgkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0wOwoJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18yX1NURVAsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJCX0KCQludW1fYXJyeVtURVNUX0FSR18zX0FMTF9UT0dIVEVSXT1hbGxfdG9naHRlcl9lbmFibGU7CgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzNfQUxMX1RPR0hURVIsbnVtX2FycnlbVEVTVF9BUkdfM19BTExfVE9HSFRFUl0pOwoJfQoKCWlmKCggbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk9PTApCgl7CgkJewoJCQludW1fYXJyeVtURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUNdPURNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzE7CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxURVNUX0FSR18wX0RNQ19TVElDS1lfTUFHSUMsbnVtX2FycnlbVEVTVF9BUkdfMF9ETUNfU1RJQ0tZX01BR0lDXSk7CgkJCW51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF09RE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMTsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzFfQ01EMCxudW1fYXJyeVtURVNUX0FSR18xX0NNRDBdKTsKCQkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pOwoJCQl7CgkJCQl0ZXN0X2Jvb3RfdGltZXM9MDsKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF09dGVzdF9ib290X3RpbWVzJjB4ZmY7CgkJCQludW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdPSh0ZXN0X2Jvb3RfdGltZXM+PjgpJjB4ZmY7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfQk9PVF9USU1FU19MLG51bV9hcnJ5W1RFU1RfQVJHX0JPT1RfVElNRVNfTF0pOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0JPT1RfVElNRVNfSCxudW1fYXJyeVtURVNUX0FSR19CT09UX1RJTUVTX0hdKTsKCQkJfQoJCQl7CgkJCQl0ZXN0X2Rkcl9mcmVxdWVuY3k9Z2xvYmFsX2Rkcl9jbGs7CgkJCQludW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9MXT10ZXN0X2Rkcl9mcmVxdWVuY3kmMHhmZjsKCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0ZSRVFfTklCQkxFX0hdPSh0ZXN0X2Rkcl9mcmVxdWVuY3k+PjgpJjB4ZmY7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfRlJFUV9OSUJCTEVfTCxudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9MXSk7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfRlJFUV9OSUJCTEVfSCxudW1fYXJyeVtURVNUX0FSR19GUkVRX05JQkJMRV9IXSk7CgkJCX0KCgkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfTlVMTDsKCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHX0VSUk9SX0ZMQUcsbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCX0KCgoJCWZvciAobmliYmxlX3N0ZXAgPSAwOyBuaWJibGVfc3RlcCA8IDcyOyBuaWJibGVfc3RlcCsrKQoJCXsKCQkJLy9pZihsYW5lX3N0ZXAlMikKCQkJewoJCQkJLy9udW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX09SR109MHhmZmZmOwoJCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT0xNjsKCQkJCWlmKG5pYmJsZV9zdGVwPDEwKQoJCQkJewoJCQkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT0zMjsKCQkJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTMyOwoJCQkJfQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOXT10ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU7CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVhdPXRlc3RfcmlnaHRfbWF4X2luaXRfdmFsdWU7CgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVNdPTA7Ly8wCgkJCQkJLy9kZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsaSxudW1fYXJyeVtpXSk7CgkJCX0KCgkJCXsKCQkJCWlmIChuaWJibGVfc3RlcDwzMikKCQkJCXsKCQkJCQlpZigoKG5pYmJsZV9tYXNrWzBdKT4+bmliYmxlX3N0ZXApJjEpCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJCX0KCQkJCWVsc2UgaWYgKG5pYmJsZV9zdGVwPDY0KQoJCQkJewoJCQkJCWlmKCgobmliYmxlX21hc2tbMV0pPj4obmliYmxlX3N0ZXAtMzIpKSYxKQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCQl9CgkJCQllbHNlIGlmIChuaWJibGVfc3RlcDw5NikKCQkJCXsKCQkJCQlpZigoKG5pYmJsZV9tYXNrWzJdKT4+KG5pYmJsZV9zdGVwLTY0KSkmMSkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQkJfQoJCQkJaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJewoJCQkJCWlmKChuaWJibGVfc3RlcD09MCl8fChuaWJibGVfc3RlcD09MTApfHwobmliYmxlX3N0ZXA9PSgxMCsxNikpKQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTA7CgkJCQkJZWxzZQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURStuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCQl9CgkJCX0KCQkvL251bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTXT0weGZmZmY7Ly8wCgkJfQoKCQl7CgkJCS8vcHJpbnRmKCIuLm51bV9hcnJ5W1RFU1RfQVJHXzFfQ01EMF09JWRcbiIsbnVtX2FycnlbVEVTVF9BUkdfMV9DTUQwXSk7CgkJCWZvciAoaSA9IFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFOyBpIDwgNzIqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEU7IGkrKykgewoJCQkJLy8JbnVtX2FycnlbaV09MDsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCxpLG51bV9hcnJ5W2ldKTsKCQkJCS8vCWRkcl93cl8xNmJpdF9vbl8zMnJlZygoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MSkpLG51bV9hcnJ5W2ldKTsKCQkJCS8vCXByaW50ZigibnVtX2FycnlbMHglMDh4XSA9PTB4JTA4eFxuIixpLG51bV9hcnJ5W2ldKTsKCQkJfQoKCQkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCQl9CgoJfQoKaWYgKGFsbF90b2dodGVyX2VuYWJsZSkKewoJZm9yIChuaWJibGVfc3RlcCA9IDA7IG5pYmJsZV9zdGVwIDwgNzI7IG5pYmJsZV9zdGVwKyspCgl7CgkJaWYgKChuaWJibGVfc3RlcCA9PSAwKSB8fCAobmliYmxlX3N0ZXAgPT0gMTApIHx8IChuaWJibGVfc3RlcCA9PSAoMTArMTYpKSkKCQl7CgkJCS8vbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT0wOwoJCX0KCQllbHNlCgkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCX0KfQoKaWYoY29uZmlnX3JlZ2lzdGVyPT0xKQp7CgludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTA7CglkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKfQoKaWYoKCBudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSkKewpmb3IodGVzdF9pbmRleD1udW1fYXJyeVtURVNUX0FSR18yX1NURVBdO3Rlc3RfaW5kZXg8dGVzdF9pbmRleF9tYXggO3Rlc3RfaW5kZXgrKyApCnsKCXByaW50ZigiXG50ZXN0X2luZGV4PSVkXG4iLHRlc3RfaW5kZXgpOwoJaWYoKCgodGVzdF9pbmRleF9lbmFibGUpPj4odGVzdF9pbmRleC0xKSkmMSk9PTApCgl7CgkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0oKG51bV9hcnJ5W1RFU1RfQVJHXzJfU1RFUF0pKzEpOy8vd2h5IGNhbiBub3QgdXNlICsrCgkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCwJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkJY29udGludWU7Cgl9Cgl7CgkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTEwOwoJCQluaWJibGVfbWFza1swXT0gMHgzMDsKCQkJaWYoKGRyYW1fdHlwZT09Q09ORklHX0REUl9UWVBFX0xQRERSMykpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNlMzsKCQkJfQoJCQlpZigoZHJhbV90eXBlPT1DT05GSUdfRERSX1RZUEVfTFBERFI0KSkKCQkJewoJCQkJbmliYmxlX21hc2tbMF09IDB4MjczOwoJCQkJaWYoKGNoYW5uZWxfbW9kZT09Q09ORklHX0REUjBfMzJCSVRfUkFOSzAxX0NIMCkpCgkJCQkJbmliYmxlX21hc2tbMF09IDB4M2YzOwoJCQl9CgkJCXRlc3RfbGVmdF9tYXhfaW5pdF92YWx1ZT02NDsKCQkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT02NDsKCQl9CgkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCXsKCQkJbmliYmxlX3NhdmVfb2Zmc2V0PTEwOwoJCQluaWJibGVfbWF4PTE2OwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweGZmMDA7CgkJCX0KCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJewoJCQluaWJibGVfc2F2ZV9vZmZzZXQ9KDEwKSsoMTYpOwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweGZmMDA7CgkJCX0KCQkJbmliYmxlX21heD0xNjsKCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTcyOwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzFdPSAweGZmZmZmZmYwOwoJCQkJbmliYmxlX21hc2tbMl09IDB4ZmZmZmZmZmY7CgkJCX0KCQkJdGVzdF9sZWZ0X21heF9pbml0X3ZhbHVlPTE2OwoJCQl0ZXN0X3JpZ2h0X21heF9pbml0X3ZhbHVlPTE2OwoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkKCQl7CgkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQluaWJibGVfbWF4PTcyOwoJCQlpZigoY3MxX3Rlc3Rfc2l6ZT09MCkpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzFdPSAweGZmZmZmZmYwOwoJCQkJbmliYmxlX21hc2tbMl09IDB4ZmZmZmZmZmY7CgkJCX0KCQkKCQl0ZXN0X2xlZnRfbWF4X2luaXRfdmFsdWU9NjQ7CgkJdGVzdF9yaWdodF9tYXhfaW5pdF92YWx1ZT02NDt9CgkJLy9uaWJibGVfbWF4PTg7Ly8JCgkJLy8gaWYobmliYmxlX21heD4zMCkgIGNhbiBub3Qgb3ZlciBzdGlja3kgcmVnaXN0ZXIgc2l6ZQoJCS8vIAluaWJibGVfbWF4PTMwOwoJCWZvciAoKG5pYmJsZV9zdGVwPTApOyhuaWJibGVfc3RlcDxuaWJibGVfbWF4KTsobmliYmxlX3N0ZXArKykpCgkJewoJCQlpZiAobmliYmxlX3N0ZXA8MzIpCgkJCXsKCQkJCWlmKCgobmliYmxlX21hc2tbMF0pPj5uaWJibGVfc3RlcCkmMSkKCQkJCQludW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURStMQ0RfQkRMUl9TVEFUVVNdPTQ7CgkJCX0KCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8NjQpCgkJCXsKCQkJCWlmKCgobmliYmxlX21hc2tbMV0pPj4obmliYmxlX3N0ZXAtMzIpKSYxKQoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKyhuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFK0xDRF9CRExSX1NUQVRVU109NDsKCQkJfQoJCQllbHNlIGlmIChuaWJibGVfc3RlcDw5NikKCQkJewoJCQkJaWYoKChuaWJibGVfbWFza1syXSk+PihuaWJibGVfc3RlcC02NCkpJjEpCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUrTENEX0JETFJfU1RBVFVTXT00OwoJCQl9CgkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQl9Cgl9Cgp7Cglmb3IgKChuaWJibGVfc3RlcD0wKTsobmliYmxlX3N0ZXA8bmliYmxlX21heCk7KG5pYmJsZV9zdGVwKyspKQoJewoJCWlmKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT00KQoJCQljb250aW51ZTsKCQlwcmludGYoIm5pYmJsZV9zdGVwID09JWRcbiIsbmliYmxlX3N0ZXApOwoKCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpCgkJewoJCQlpZihuaWJibGVfc3RlcCUyKQoJCQl7CgkJCQkvL25pYmJsZV9zYXZlX29mZnNldAoJCQkJLy9udW1fYXJyeVtURVNUX0FSR18yX1NURVBdPTE7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pLAkKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwLTErbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKSwJCgkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcC0xK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKTsKCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXAtMStuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkvL25pYmJsZV9zdGVwKys7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCWlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJewoJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQl9CgoJCWlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkKCQl7CgkJCWlmKG5pYmJsZV9zdGVwPjcpCgkJCXsKCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJfQoJCX0KCQlpZih0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpCgkJewoJCQlpZihuaWJibGVfc3RlcD43KQoJCQl7CgkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCX0KCQl9CgkJaWYodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpCgkJewoJCQlpZihuaWJibGVfc3RlcD4zNSkKCQkJewoJCQkJdGVzdF9zdGFydF9hZGRyPWNzMV90ZXN0X3N0YXJ0OwoJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQl9CgkJfQoJCWlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJCXsKCQkJaWYobmliYmxlX3N0ZXA+MzUpCgkJCXsKCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJfQoJCX0KCQl7CgkJCWlmIChuaWJibGVfc3RlcDwzMikKCQkJewoJCQkJbmliYmxlX21hc2tbMF09KCgweGZmZmZmZmZmKSYofigxPDxuaWJibGVfc3RlcCkpKTsKCQkJCW5pYmJsZV9tYXNrWzFdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMl09KCgweGZmZmZmZmZmKSk7CgkJCX0KCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8NjQpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMV09KCgweGZmZmZmZmZmKSYofigxPDwobmliYmxlX3N0ZXAtMzIpKSkpOwoJCQkJbmliYmxlX21hc2tbMl09KCgweGZmZmZmZmZmKSk7CgkJCX0KCQkJZWxzZSBpZiAobmliYmxlX3N0ZXA8OTYpCgkJCXsKCQkJCW5pYmJsZV9tYXNrWzBdPSgoMHhmZmZmZmZmZikpOwoJCQkJbmliYmxlX21hc2tbMV09KCgweGZmZmZmZmZmKSk7CgkJCQluaWJibGVfbWFza1syXT0oKDB4ZmZmZmZmZmYpJih+KDE8PChuaWJibGVfc3RlcC02NCkpKSk7CgkJCX0KCQl9CgkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSkKCQl7CgkJCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpCgkJCXsKCQkJCW5pYmJsZV9zYXZlX29mZnNldD0wOwoJCQkJbmliYmxlX21heD0xMDsKCQkJCW5pYmJsZV9tYXNrWzBdPSAweDMwOwoJCQkJbmliYmxlX21hc2tbMV09IDA7CgkJCQluaWJibGVfbWFza1syXT0gMDsKCQkJCWlmICgoZHJhbV90eXBlID09IENPTkZJR19ERFJfVFlQRV9MUEREUjMpKQoJCQkJewoJCQkJCW5pYmJsZV9tYXNrWzBdPSAweDNlMzsKCQkJCX0KCQkJCWlmICgoZHJhbV90eXBlID09IENPTkZJR19ERFJfVFlQRV9MUEREUjQpKQoJCQkJewoJCQkJCW5pYmJsZV9tYXNrWzBdPSAweDI3MzsKCQkJCQlpZiAoKGNoYW5uZWxfbW9kZSA9PSBDT05GSUdfRERSMF8zMkJJVF9SQU5LMDFfQ0gwKSkKCQkJCQkJbmliYmxlX21hc2tbMF09IDB4M2YzOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJbmliYmxlX21hc2tbMF09IDA7CgkJCQluaWJibGVfbWFza1sxXT0gMDsKCQkJCW5pYmJsZV9tYXNrWzJdPSAwOwoJCQl9CgkJfQoKCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUod2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgkJaWYoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0weGZmZmYpCgkJfHwobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTApCgkJfHwobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTEpICkKCQl7CgkJCXByaW50ZigiXG5uaWJibGVfc3RlcCAgPT0lZCAiLCBuaWJibGVfc3RlcCk7CgkJCWlmKChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MHhmZmZmKQoJCQl8fChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MCkpCgkJCXsKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTE7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCgkJCQlpZihudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXT09MCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXT0KCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXS0xOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXSk7CgkJCQl9CgoJCQkJewoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJfQoKCQkJCS8vaWYoYWxsX3RvZ2h0ZXJfZW5hYmxlKQoJCQkJLy8Jc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LDAsMCwwLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCS8vCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCS8vZWxzZQoJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSAmJiBjczFfdGVzdF9zaXplKQoJCQkJewoJCQkJCXRlc3Rfc3RhcnRfYWRkcj1jczFfdGVzdF9zdGFydDsKCQkJCQlkZHJfdGVzdF9zaXplPWNzMV90ZXN0X3NpemU7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MwX3Rlc3Rfc3RhcnQ7CgkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczBfdGVzdF9zaXplOwoJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCX0KCQkJCWlmKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCS8vCQoJCQkJCWlmKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJewoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF93YXRjaGRvZ19zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIixrZXJuZWxfd2F0Y2hkb2dfcyk7CgkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQl9CgkJCQkJLyoJCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKSwJCgkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJKi8KCQkJCX0KCQkJfQoJCQllbHNlIGlmIChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MSkKCQkJey8vZ28gb24gZmluZCBsZWZ0IGVkZ2UKCgkJCQlpZihudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXT09MCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCQlpZigobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pPT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1MpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19OVUxMOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJfQoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgkJCQlpZigobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pPT1URVNUX0FSR19FUlJPUl9GTEFHX0ZBSUwpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pXT0KCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0tMTsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NSU4pLAkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pOwoJCQkJCX0KCQkJCQl7CgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCX0KCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsICggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUlOKV0pKTsKCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkvLwlpZihhbGxfdG9naHRlcl9lbmFibGUpCgkJCQkvLwkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LDAsMCwwLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCS8vCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKSk7CgkJCQkvLwllbHNlCgkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgICVkICAweCUwOHggMHglMDh4ICAweCUwOHggICVkICVkIix0ZXN0X2luZGV4LG5pYmJsZV9tYXNrWzBdLG5pYmJsZV9tYXNrWzFdLG5pYmJsZV9tYXNrWzJdLEREUl9QQVJBTUVURVJfTEVGVCwKCQkJCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildKSk7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAoYWxsX3RvZ2h0ZXJfZW5hYmxlICYmIGNzMV90ZXN0X3NpemUpCgkJCQkJewoJCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQkJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl9CgkJCQkJaWYodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJLy8JCgkJCQkJCWlmKCFlbmFibGVfa2VybmVsX3Rlc3QpCgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfUEFTUzsKCQkJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLGtlcm5lbF93YXRjaGRvZ19zKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJfQoJCQkJCQkvKgkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09MjsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV0pOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkqLwoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLwlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCX0KCQkKCQlpZigobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTIpfHwKCQkobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTMpKQoJCXsKCQkJcHJpbnRmKCJcbm5pYmJsZV9zdGVwICA9PSVkICIsIG5pYmJsZV9zdGVwKTsKCQkJaWYoKG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPT0yKQoJCQl8fChudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT09MikpCgkJCXsKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTM7CgkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCgkJCQlpZihudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT09MCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT00OwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT0KCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXS0xOwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCQl9CgoJCQkJewoJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJVEVTVF9BUkdfRVJST1JfRkxBRywJCgkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJfQoJCQkvLwlpZihhbGxfdG9naHRlcl9lbmFibGUpCgkJCS8vCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhICAlZCAgMHglMDh4IDB4JTA4eCAgMHglMDh4ICAlZCAlZCIsdGVzdF9pbmRleCwwLDAsMCxERFJfUEFSQU1FVEVSX1JJR0hULAoJCQkvLwludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXSk7CgkJCS8vCWVsc2UKCQkJCXNwcmludGYoc3RyLCJkZHJfZzEyX29mZnNldF9kYXRhICAlZCAgMHglMDh4IDB4JTA4eCAgMHglMDh4ICAlZCAlZCIsdGVzdF9pbmRleCxuaWJibGVfbWFza1swXSxuaWJibGVfbWFza1sxXSxuaWJibGVfbWFza1syXSxERFJfUEFSQU1FVEVSX1JJR0hULAoJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pOwoJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCWlmIChhbGxfdG9naHRlcl9lbmFibGUgJiYgY3MxX3Rlc3Rfc2l6ZSkKCQkJCXsKCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQkJZGRyX3Rlc3Rfc2l6ZT1jczFfdGVzdF9zaXplOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQkJCWRkcl90ZXN0X3NpemU9Y3MwX3Rlc3Rfc2l6ZTsKCQkJCQkvL3RlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl9CgkJCS8vCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCS8vCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQlpZih0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkvLwkKCQkJCQlpZighZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19QQVNTOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfd2F0Y2hkb2dfcyk7IC8vcwoJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsa2VybmVsX3dhdGNoZG9nX3MpOwoJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJfQoJCQkJCS8qCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldPTI7CgkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyldKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCSovCgkJCQl9CgkJCX0KCQkJZWxzZSBpZiAobnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfU1RBVFVTKV09PTMpCgkJCXsvL2dvIG9uIGZpbmQgbGVmdCBlZGdlCgkJCQlpZihudW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT09MCkKCQkJCXsKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT00OwoJCQkJCWRkcl93cl84XzE2Yml0X29uXzMycmVnKHN0aWNreV9yZWdfYmFzZV9hZGQsOCwKCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpLAkKCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCX0KCgkJCQlpZigobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pPT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1MpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT00OwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR109VEVTVF9BUkdfRVJST1JfRkxBR19OVUxMOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCVRFU1RfQVJHX0VSUk9SX0ZMQUcsCQoJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXSk7CgkJCQkJfQoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl9CgkJCQlpZigobnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pPT1URVNUX0FSR19FUlJPUl9GTEFHX0ZBSUwpCgkJCQl7CgkJCQkJewoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpXT0KCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0tMTsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQkoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9NQVgpLAkKCQkJCQkJbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pOwoJCQkJCX0KCQkJCQl7CgkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddPVRFU1RfQVJHX0VSUk9SX0ZMQUdfRkFJTDsKCQkJCQkJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LAoJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAkKCQkJCQkJbnVtX2FycnlbVEVTVF9BUkdfRVJST1JfRkxBR10pOwoJCQkJCX0KCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsICggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pKTsKCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkvLwlpZihhbGxfdG9naHRlcl9lbmFibGUpCgkJCQkvLwlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsMCwwLDAsRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJCS8vCSggbnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV0pKTsKCQkJCS8vCWVsc2UKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAgJWQgIDB4JTA4eCAweCUwOHggIDB4JTA4eCAgJWQgJWQiLHRlc3RfaW5kZXgsbmliYmxlX21hc2tbMF0sbmliYmxlX21hc2tbMV0sbmliYmxlX21hc2tbMl0sRERSX1BBUkFNRVRFUl9SSUdIVCwKCQkJCQkoIG51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01BWCldKSk7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZiAoYWxsX3RvZ2h0ZXJfZW5hYmxlICYmIGNzMV90ZXN0X3NpemUpCgkJCQkJewoJCQkJCQl0ZXN0X3N0YXJ0X2FkZHI9Y3MxX3Rlc3Rfc3RhcnQ7CgkJCQkJCWRkcl90ZXN0X3NpemU9Y3MxX3Rlc3Rfc2l6ZTsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQkJdGVzdF9zdGFydF9hZGRyPWNzMF90ZXN0X3N0YXJ0OwoJCQkJCQlkZHJfdGVzdF9zaXplPWNzMF90ZXN0X3NpemU7CgkJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl9CgkJCQkJLy90ZW1wX3Rlc3RfZXJyb3I9dGVtcF90ZXN0X2Vycm9yK2Rkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQlpZih0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlpZighZW5hYmxlX2tlcm5lbF90ZXN0KQoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVtURVNUX0FSR19FUlJPUl9GTEFHXT1URVNUX0FSR19FUlJPUl9GTEFHX1BBU1M7CgkJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCQlURVNUX0FSR19FUlJPUl9GTEFHLAkKCQkJCQkJCW51bV9hcnJ5W1RFU1RfQVJHX0VSUk9SX0ZMQUddKTsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUoa2VybmVsX3dhdGNoZG9nX3MpOyAvL3MKCQkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIixrZXJuZWxfd2F0Y2hkb2dfcyk7CgkJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCX0KCgkJCQkJCS8qCQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXT0yOwoJCQkJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsCgkJCQkJCShURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX1NUQVRVUyksCQoJCQkJCQludW1fYXJyeVsoVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUX0JZVEUrKChuaWJibGVfc3RlcCtuaWJibGVfc2F2ZV9vZmZzZXQpKlRFU1RfQVJHX05JQkJMRV9XSURUSF9CWVRFKStMQ0RfQkRMUl9TVEFUVVMpXSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCSovCgkJCQkJfQoJCQkJfQoJCQl9CgkJCS8vCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJfQoKCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCXsKCQkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJCX0KCX0KCglwcmludGYoIjExbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT09JWRcbiIsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgludW1fYXJyeVtURVNUX0FSR18yX1NURVBdPShudW1fYXJyeVtURVNUX0FSR18yX1NURVBdKSsxOwoJZGRyX3dyXzhfMTZiaXRfb25fMzJyZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCw4LFRFU1RfQVJHXzJfU1RFUCwJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CglwcmludGYoIjIybnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT09JWRcbiIsbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXSk7CgkvL30KCglkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJLy99CgkvL2Zvcih0ZXN0X2luZGV4PTE7dGVzdF9pbmRleDx0ZXN0X2luZGV4X21heCA7dGVzdF9pbmRleCsrICkKCXsKCQl1bnNpZ25lZCBpbnQgIHVpXzFfMzJfMTAwc3RlcD0gMDsKCQl1bnNpZ25lZCBpbnQgIGJkbHJfMTAwc3RlcD0gMDsKCQl1aV8xXzMyXzEwMHN0ZXA9KDEwMDAwMDAqMTAwLyhnbG9iYWxfZGRyX2NsayoyKjMyKSk7CgkJYmRscl8xMDBzdGVwPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJCS8vaWYoKCgodGVzdF9pbmRleF9lbmFibGUpPj4odGVzdF9pbmRleC0xKSkmMSk9PTApCgoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLGJkbHJfMTAwc3RlcD0lZCBwcyx1aV8xXzMyXzEwMHN0ZXA9JWQgcHMsXG4iLDAsMCxnbG9iYWxfZGRyX2NsaywKCQliZGxyXzEwMHN0ZXAsdWlfMV8zMl8xMDBzdGVwKTsKCgkJcHJpbnRmKCJcbiB0ZXN0IHJlc3VsdCBpbmRleD09Iik7CgkJcHJpbnRmKCIlMDhkIix0ZXN0X2luZGV4KTsKCgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCQlwcmludGYoIiBhYyB3aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQkJcHJpbnRmKCIgdHhkcXMgd2luZG93OiIpOwoJCQlwcmludGYoIiBzdGVwX3NpemUgcHM9PSIpOwoJCQlwcmludGYoIiUwOGQiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCXByaW50ZigiLzEwMCBwcyAiKTsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJCXByaW50ZigiIHJ4X2Nsa193aW5kb3c6Iik7CgkJCXByaW50ZigiIHN0ZXBfc2l6ZSBwcz09Iik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIvMTAwIHBzICIpOwoJCX0KCQlpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCQlwcmludGYoIiB0eF9iaXRfZHFfd2luZG93OiIpOwoJCQlwcmludGYoIiBzdGVwX3NpemUgcHM9PSIpOwoJCQlwcmludGYoIiUwOGQiLHVpXzFfMzJfMTAwc3RlcCk7CgkJCXByaW50ZigiLzEwMCBwcyAiKTsKCQl9CgkJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQkJcHJpbnRmKCIgcnhfYml0X2RxX3dpbmRvdyIpOwoJCQlwcmludGYoIiBzdGVwX3NpemUgcHM9PSIpOwoJCQlwcmludGYoIiUwOGQiLGJkbHJfMTAwc3RlcCk7Ly80ODBwcwoJCQlwcmludGYoIi8xMDAgcHMgIik7CgkJfQoJCXByaW50ZigiZGRyIGNsayBmcmVxdWVuY3kgOiAiKTsKCQlwcmludGYoIiUwOGQiLChnbG9iYWxfZGRyX2NsaykpOwoJCXByaW50ZigiTWh6ICIpOwoJCXByaW50ZihzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJpbmRleCAgICBvcmcgICAgICBtaW4gICAgICBtYXggICAgICBsZWZ0ICAgICByaWdodCAgICBkZWMgdnJlZl9yYW5nZSB2cmVmX2NvdW50Iik7CgkJcHJpbnRmKHN0cmluZ19wcmludF9mbGFnKTsKCgkJY2hhciBkZWxheV9sZWZ0X21hcmdpbj0wOwoJCWNoYXIgZGVsYXlfcmlnaHRfbWFyZ2luPTA7CgkJaWYgKGFsbF90b2dodGVyX2VuYWJsZSA9PSAxKQoJCXsKCQkJbmliYmxlX21heD0xOwoJCX0KCQlmb3IgKCBuaWJibGVfc3RlcD0wO25pYmJsZV9zdGVwPG5pYmJsZV9tYXg7bmliYmxlX3N0ZXArKykKCQl7CgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKGRlbGF5X21hcnRpeFtjb3VudF0uYWRkX2luZGV4LDgpOwoJCQlwcmludGYoIiUwOGQiLG5pYmJsZV9zdGVwKTsKCQkJcHJpbnRmKCIgIik7CgkJCXByaW50ZigiJTA4ZCIsMCk7CgkJCS8vc2VyaWFsX3B1dHMoIiAiKTsKCQkJLy9pZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSApCgkJCXsKCQkJCXsKCQkJCQlwcmludGYoIiAiKTsKCQkJCQlwcmludGYoIiUwOGQiLDAvL251bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfTUlOXQoJCQkJCQkpOwoJCQkJfQoJCQl9CgkJCXsKCQkJCXsKCQkJCQlwcmludGYoIiAiKTsKCQkJCQlwcmludGYoIiUwOGQiLDAvL251bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfTUFYXQoJCQkJCQkpOwoJCQkJfQoJCQl9CgkJCQkKCQkJLy8JZGVsYXlfbGVmdF9tYXJnaW49KChudW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX09SR10+bnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NSU5dKT8KCQkJLy8JCShudW1fYXJyeVtURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVQrbmliYmxlX3N0ZXAqVEVTVF9BUkdfTklCQkxFX1dJRFRIK0xDRF9CRExSX09SR10tbnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NSU5dKTowKTsKCQkJLy8JZGVsYXlfcmlnaHRfbWFyZ2luPSgobnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NQVhdPm51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfT1JHXSk/CgkJCS8vCQkobnVtX2FycnlbVEVTVF9BUkdfTklCQkxFX1NBVkVfT0ZGU0VUK25pYmJsZV9zdGVwKlRFU1RfQVJHX05JQkJMRV9XSURUSCtMQ0RfQkRMUl9NQVhdLW51bV9hcnJ5W1RFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVCtuaWJibGVfc3RlcCpURVNUX0FSR19OSUJCTEVfV0lEVEgrTENEX0JETFJfT1JHXSk6MCk7CgkJCWRlbGF5X2xlZnRfbWFyZ2luPW51bV9hcnJ5WyhURVNUX0FSR19OSUJCTEVfU0FWRV9PRkZTRVRfQllURSsoKG5pYmJsZV9zdGVwK25pYmJsZV9zYXZlX29mZnNldCkqVEVTVF9BUkdfTklCQkxFX1dJRFRIX0JZVEUpK0xDRF9CRExSX01JTildOwoJCQlkZWxheV9yaWdodF9tYXJnaW49bnVtX2FycnlbKFRFU1RfQVJHX05JQkJMRV9TQVZFX09GRlNFVF9CWVRFKygobmliYmxlX3N0ZXArbmliYmxlX3NhdmVfb2Zmc2V0KSpURVNUX0FSR19OSUJCTEVfV0lEVEhfQllURSkrTENEX0JETFJfTUFYKV07CgkJCXByaW50ZigiICIpOwoJCQlwcmludGYoIiUwOGQiLGRlbGF5X2xlZnRfbWFyZ2luKTsKCgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKChkZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X29yZz5kZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X21pbik/KGRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfb3JnLWRlbGF5X21hcnRpeFtjb3VudF0uZGVsYXlfbWluKTowLDgpOwoJCQlwcmludGYoIiAiKTsKCQkJcHJpbnRmKCIlMDhkIixkZWxheV9yaWdodF9tYXJnaW4pOwoJCQkvL3NlcmlhbF9wdXRfZGVjX291dF9hbGlnbigoZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9tYXg+ZGVsYXlfbWFydGl4W2NvdW50XS5kZWxheV9vcmcpPyhkZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X21heC1kZWxheV9tYXJ0aXhbY291bnRdLmRlbGF5X29yZyk6MCw4KTsKCQkJcHJpbnRmKCIgICAgICIpOwoJCQlwcmludGYoIiUwOGQiLDApOwoJCQlwcmludGYoIiAgICIpOwoJCQlwcmludGYoIiUwOGQiLDApOwoJCQlwcmludGYoIiAgIDJkLWV5ZSIpOyAvL3BfZGV2LT5jdXJfdHlwZQoJCQlwcmludGYoIiBkcmFtdHlwZSAiKTsKCQkJcHJpbnRmKCIlMDhkIiwwKTsKCQkJcHJpbnRmKCIgIik7CgkJCXByaW50ZigiJTA4ZCIsKGdsb2JhbF9kZHJfY2xrKSk7CgkJCXByaW50ZigiIE0gYmRsICIpOwoJCQlwcmludGYoIiUwOGQiLGJkbHJfMTAwc3RlcCk7Ly80ODBwcwoJCQlwcmludGYoIiAvMTAwIHBzICIpOwoJCQlwcmludGYoIjEvMzJzdGVwPT0gIik7CgkJCXByaW50ZigiJTA4ZCIsdWlfMV8zMl8xMDBzdGVwKTsKCQkJcHJpbnRmKCIgLzEwMCBwcyAiKTsKCQkJLy9zZXJpYWxfcHV0cygiYml0X2luaXRfdmFsdWUgIik7CgkJCS8vc2VyaWFsX3B1dF9kZWNfb3V0X2FsaWduKChwX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfcmVhZF9wZXJfYml0X2luaXRfdmFsdWUpLDQpOwoJCQkvL2lmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSl7CgkJCS8vc2VyaWFsX3B1dHMoInR4ZHFzZGx5X3NlY29uZF90dW5lX21pbl92YWx1ZSAiKTsKCQkJLy9zZXJpYWxfcHV0X2RlY19vdXRfYWxpZ24odHhkcXNkbHlfc2Vjb25kX3R1bmVfdmFsdWVbY291bnRdLDQpOwoJCQkJLy99CgkJCXByaW50ZihzdHJpbmdfcHJpbnRfZmxhZyk7CgkJCS8vc2VyaWFsX3B1dHMoIlxuIik7CgkJfQoJfQp9Cn0KfQoKCWlmKGNvbmZpZ19yZWdpc3Rlcj09MSkKCXsKCQlpZihudW1fYXJyeVtURVNUX0FSR18yX1NURVBdPT0wKQoJCXsKCQkJbnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT0xOwoJCQlkZHJfd3JfOF8xNmJpdF9vbl8zMnJlZyhzdGlja3lfcmVnX2Jhc2VfYWRkLDgsVEVTVF9BUkdfMl9TVEVQLAludW1fYXJyeVtURVNUX0FSR18yX1NURVBdKTsKCQl9Cgl9CgoJCWlmICgoZW5hYmxlX2tlcm5lbF90ZXN0KSAmJiAobnVtX2FycnlbVEVTVF9BUkdfMl9TVEVQXT4xKSkKCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CglyZXR1cm4gcmVnX3ZhbHVlOwp9CiNlbHNlCmludCBkb19kZHJfdGVzdF9kcXNfd2luZG93X3N0aWNreShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlcmRkcl90ZXN0X2Rxc193aW5kb3cgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJcbmRkcl90ZXN0X2NtZCAweDI3IGEgMCAweDgwMDAwIG5zIGxhbmVfZGlzYWJsZSBhZGRfdGVzdF9zaXplICAgLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKCXVuc2lnbmVkIGludCAgIGNoYW5uZWxfYV9lbiA9IDA7Cgl1bnNpZ25lZCBpbnQgICBjaGFubmVsX2JfZW4gPSAwOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJLy8gdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgoJdW5zaWduZWQgaW50ICAgbGFuZV9zdGVwPSAwOwoJdW5zaWduZWQgaW50ICAgcmVnX3ZhbHVlPSAwOwoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCWNoYXIgKmVuZHA7CgljaGFyICpidWY7CglidWY9IiI7CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlpZiAoKHN0cmNtcChhcmd2WzFdLCAiYSIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIkEiKSA9PSAwKSkKCgkJe2NoYW5uZWxfYV9lbiA9IDE7CgkJfQoJCWVsc2UgaWYgICAoKHN0cmNtcChhcmd2WzFdLCAiYiIpID09IDApfHwoc3RyY21wKGFyZ3ZbMV0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCgoJfQoJaWYgKGFyZ2MgPiAyKQoJewoJCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJhIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQSIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImEiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJBIikgPT0gMCkpCgoJCXtjaGFubmVsX2FfZW4gPSAxOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbMV0sICJiIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiQiIpID09IDApIHx8IChzdHJjbXAoYXJndlsyXSwgImIiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMl0sICJCIikgPT0gMCkpCgoJCXtjaGFubmVsX2JfZW4gPSAxOwoJCX0KCX0KCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CglpZiAoYXJnYyA+MykgewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfQoJfQoKCgoJaWYgKGFyZ2MgPjQpIHsKCQl3YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zPSAyMDsKCQl9Cgl9CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCgl1bnNpZ25lZCBpbnQgICBsYW5lX2Rpc2FibGU9IDA7CgoJaWYgKGFyZ2MgPjUpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsKCgl1bnNpZ25lZCBpbnQgIGFkZF90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCglpZiAoYXJnYyA+NikgewoJCWFkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJYWRkX3Rlc3Rfc2l6ZT0gZGRyX3Rlc3Rfc2l6ZTsKCQl9Cgl9CglwcmludGYoImFkZF90ZXN0X3NpemU9PTB4JTA4eFxuIixhZGRfdGVzdF9zaXplKTsKCS8vYXJnYzI9NTsKCS8vZm9yKGkgPSAxO2k8KGFyZ2MpO2krKykKCXsKCQkvL2FyZ3YyW2ktMV09YXJndltpXTsKCX0KCgkvL2FyZ3YyWzBdPWFyZ3ZbMV07CgkvL2FyZ3YyWzFdPWFyZ3ZbMl07CgkvL2FyZ3YyWzJdPWFyZ3ZbM107CgkvLyNpbmNsdWRlIDxzdGRpby5oPgoJLy8gICB1bnNpZ25lZCBpbnQgICB3cl9hZGpfcGVyWzI0XSA7CgkvL2lmKDEpCgoJcHJpbnRmKCJcbnRlc3QgdXNlIHVib290IHN0aWNreSByZWdpc3RlclxuIik7CgoJLy9ETUNfU1RJQ0tZXzAKCgoJY2hhciBzdHJbMTAyNF09IiI7CgljaGFyIHN0cl90ZW1wMVsxMDI0XT0iIjsKCWNoYXIgc3RyX3RlbXAyWzEwMjRdPSIiOwoJLy9jb25zdCBjaGFyICpzOwoJdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzQ4XTsKCS8vc3RyX2J1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSoxMDI0KTsKCgl1bnNpZ25lZCBpbnQgKm51bV9hcnJ5OwoJLy91bnNpZ25lZCBpbnQgKm51bV9hcnJ5X3RlbXA7CgkvL3Vuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTA9TlVMTDsKCS8vdW5zaWduZWQgaW50ICpudW1fYXJyeV9sYW5lMT1OVUxMOwoJLy91bnNpZ25lZCBpbnQgKm51bV9hcnJ5X2xhbmUyPU5VTEw7CgkvL3Vuc2lnbmVkIGludCAqbnVtX2FycnlfbGFuZTM9TlVMTDsKCS8vY2hhciAqbmFtZV9sYW5lMDsgCgkvL2NoYXIgKm5hbWVfbGFuZTE7IAoJLy9jaGFyICpuYW1lX2xhbmUyOyAKCS8vY2hhciAqbmFtZV9sYW5lMzsgCgludW1fYXJyeSA9ICh1bnNpZ25lZCBpbnQgKikoJnN0cl90b19udW1hcnJ5KTsKCWludCBpOwoJLy9jaGFyICp2YXJuYW1lOyAgY2hhciAqZW52X2xjZGxyX3RlbXBfY291bnQ7Cgl1bnNpZ25lZCBpbnQgbGNkbHJfdGVtcF9jb3VudD0wOwoJLy8gY29uc3QgY2hhciAqdGVtcF9zO2NvbnN0IGNoYXIgKnRlbXBfczE7CgkvLyBpbnQgdmFsdWU9MDsKCgkvLyNkZWZpbmUgRE1DX1NUSUNLWV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgwMDAwICA8PCAyKSArIDB4ZmY2Mzk4MDApCgkvLyNkZWZpbmUgRE1DX1NUSUNLWV9NQUdJQ18wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAoJLy8jZGVmaW5lIERNQ19TVElDS1lfTUFHSUNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWJjZGJlYWQKCS8vdW5zaWduZWQgaW50IGRtY19zdGlja3lbNjRdOwoJLy91bnNpZ25lZCBpbnQgc3RpY2t5X3JlZ19iYXNlX2FkZD0wOwoJLy92YXJuYW1lPSJlbnZfZGRydGVzdF9kYXRhX2xhbmUiOwoJLy9uYW1lX2xhbmUwPSJkZHJfdGVzdF9kYXRhX2xhbmUwIjsKCS8vbmFtZV9sYW5lMT0iZGRyX3Rlc3RfZGF0YV9sYW5lMSI7CgkvL25hbWVfbGFuZTI9ImRkcl90ZXN0X2RhdGFfbGFuZTIiOwoJLy9uYW1lX2xhbmUzPSJkZHJfdGVzdF9kYXRhX2xhbmUzIjsKCS8vZW52X2xjZGxyX3RlbXBfY291bnQ9ImxjZGxyX3RlbXBfY291bnQiOwoKCgl7Ly9pPTA7CgkJLy93aGlsZShzX3RlbXApCgkJewoKCgoJCQlzdGlja3lfcmVnX2Jhc2VfYWRkPShERFIwX1BVQl9SRUdfQkFTRSYweGZmZmYwMDAwKSsoKERNQ19TVElDS1lfMCkmMHhmZmZmKTsKCgkJCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKSB7CgkJCQlkbWNfc3RpY2t5W2ldPXJkX3JlZyhzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSk7CgkJCQkvL3ByaW50Zigic3RyX3RvX251bWFycnlbJWRdPT0lZFxuIixpLG51bV9hcnJ5W2ldKTsKCQkJfQoKCQkJZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCQkJCW51bV9hcnJ5W2ldPWRtY19zdGlja3lbaV07CgkJCQlwcmludGYoInN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeVtpXSk7CgkJCX0KCgkJCS8vbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyeVs1XTsKCgoKCQl9Cgl9CgoKCgoJLy8vKgoJLy9pZigxKQoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX2NtZDAgPTA7ICAvL21hc3RlciBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX2NtZDEgPTA7ICAvL21pbiBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18yX3N0ZXAgPTA7IC8vc3RlcCAwICBpbml0ICAtMSBsYW5lMCB3IG1pbiAgLTIgbGFuZTAgdyBtYXggLTMgbGFuZTAgciBtaW4gICAgNCBsYW5lMCByIG1heCAtLS0tLTUgbGFuZTEgdyBtaW4gLi4uCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfM19mcmVxID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCS8vICB1bnNpZ25lZCBpbnQgICBsYW5lX3N0ZXA9IDA7CgkvL2NoYXIgc3RyWzI0XTsKCXVuc2lnbmVkIGludCBib290X3RpbWVzPTA7CgoJdGVzdF9hcmdfMF9jbWQwPW51bV9hcnJ5WzBdOwoJdGVzdF9hcmdfMV9jbWQxPW51bV9hcnJ5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJ5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJ5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz1udW1fYXJyeVs0XTsKCWJvb3RfdGltZXM9bnVtX2FycnlbNV07CglsY2Rscl90ZW1wX2NvdW50PW51bV9hcnJ5WzZdOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2NtZDA9PSVkXG4iLHRlc3RfYXJnXzBfY21kMCk7CglwcmludGYoInRlc3RfYXJnXzBfY21kMT09JWRcbiIsdGVzdF9hcmdfMV9jbWQxKTsKCXByaW50ZigidGVzdF9hcmdfMl9zdGVwPT0lZFxuIix0ZXN0X2FyZ18yX3N0ZXApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18zX2ZyZXE9PSVkXG4iLHRlc3RfYXJnXzNfZnJlcSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9PSVkXG4iLHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMpOwoJcHJpbnRmKCJ0ZXN0X2FyZ181IGJvb3R0aW1lcz0lZFxuIixudW1fYXJyeVs1XSk7CglwcmludGYoInRlc3RfYXJnXzYgbGNkbHJfdGVtcF9jb3VudD0lZFxuIixudW1fYXJyeVs2XSk7CglwcmludGYoInRlc3RfYXJnXzc9JWRcbiIsbnVtX2FycnlbN10pOwoKCWlmKChudW1fYXJyeVs3XT09RE1DX1NUSUNLWV9NQUdJQ18xKSkgLy9mb3IgY2hlY2sgbWFnaWMgbnVtYmVyIG1ha2Ugc3VtZSBlbnRlciB0ZXN0IGNvbW1hbmQKCXtib290X3RpbWVzKys7CgoJfQoJZWxzZQoJe2Jvb3RfdGltZXM9MDsKCQlwcmludGYoInRlc3Rfc3RpY2t5IGlzIG5vdCBtYWdpYyBudW1tYmVyLGJvb3QgdGltZXM9PSVkXG4iLGJvb3RfdGltZXMpOwoJCS8vIHdyaXRlbChETUNfU1RJQ0tZX01BR0lDXzAsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJd3JpdGVsKERNQ19TVElDS1lfTUFHSUNfMSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNzw8MikpKTsKCQl0ZXN0X2FyZ18yX3N0ZXA9MDsKCQludW1fYXJyeVs2XT0wOwoJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkvL3JldHVybiAxOwoJfQoJbnVtX2FycnlbNV09Ym9vdF90aW1lczsKCgl3cml0ZWwobnVtX2FycnlbNV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDU8PDIpKSk7CgoJLy9pZih0ZXN0X2FyZ18yX3N0ZXApCglpZih0ZXN0X2FyZ18yX3N0ZXApCgl7CgkJaWYodGVzdF9hcmdfM19mcmVxIT1nbG9iYWxfZGRyX2NsaykgIC8vCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgkJewoJCQl0ZXN0X2FyZ18wX2NtZDA9MHgyMjsKCQkJdGVzdF9hcmdfMV9jbWQxPTA7CgkJCXRlc3RfYXJnXzJfc3RlcD0xOwoJCQl0ZXN0X2FyZ18zX2ZyZXE9Z2xvYmFsX2Rkcl9jbGs7CgkJCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9MDsKCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQludW1fYXJyeVswXT10ZXN0X2FyZ18wX2NtZDA7CgkJCW51bV9hcnJ5WzFdPXRlc3RfYXJnXzFfY21kMTsKCQkJbnVtX2FycnlbMl09dGVzdF9hcmdfMl9zdGVwOwoJCQludW1fYXJyeVszXT10ZXN0X2FyZ18zX2ZyZXE7CgkJCW51bV9hcnJ5WzRdPXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM7CgkJCW51bV9hcnJ5WzVdPWJvb3RfdGltZXM7CgkJCWxjZGxyX3RlbXBfY291bnQ9bnVtX2FycnlbNl07CgkJCW51bV9hcnJ5WzZdPWxjZGxyX3RlbXBfY291bnQ7CgkJCW51bV9hcnJ5WzddPURNQ19TVElDS1lfTUFHSUNfMTsKCQkJZm9yIChpID0gODsgaSA8IDQ4OyBpKyspIHsKCQkJCW51bV9hcnJ5W2ldPTA7CgkJCX0KCgkJCWZvciAobGFuZV9zdGVwID0gMDsgbGFuZV9zdGVwIDwgNDsgbGFuZV9zdGVwKyspCgkJCXsKCQkJCS8vaWYobGFuZV9zdGVwJTIpCgkJCQl7CiNpZiAoIENPTkZJR19ERFJfUEhZPFBfRERSX1BIWV85MDVYKQoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF09KChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKSkmMHhmZik7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF09KCgocmVhZGwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKSk+PjgpJjB4ZmYpOwojZWxzZQoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF09KChyZWFkbCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKSkmMHgxZmYpOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdPSgoKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjMtCgkJCQkJCQkJCQkJRERSMF9QVUJfRFgwTENETFIzKQoJCQkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMykpPj4wKSYweDFmZik7CgoJCQkJCXByaW50ZigibGNkbHIxICVkICAlMDh4LCUwOHgsJTA4eFxuIiwgbGFuZV9zdGVwLCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCQkJCQlERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJCQkJK0REUjBfUFVCX0RYMExDRExSMSksCgkJCQkJCQkoKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCQkJCQkJCSBERFIwX1BVQl9EWDBMQ0RMUjEpCgkJCQkJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpKSYweDFmZiksZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXSk7CgkJCQkJcHJpbnRmKCJsY2RscjMgJWQgICUwOHgsJTA4eCwlMDh4XG4iLCBsYW5lX3N0ZXAsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjMtCgkJCQkJCQkJCUREUjBfUFVCX0RYMExDRExSMykKCQkJCQkJCQkrRERSMF9QVUJfRFgwTENETFIzKSwKCQkJCQkJCSgoKHJlYWRsKChsYW5lX3N0ZXApKihERFIwX1BVQl9EWDFMQ0RMUjMtCgkJCQkJCQkJCQkJCSAgRERSMF9QVUJfRFgwTENETFIzKQoJCQkJCQkJCQkgK0REUjBfUFVCX0RYMExDRExSMykpPj4wKSYweDFmZiksZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0pOwojZW5kaWYKCgkJCQkJLy9wcmludGYoImxjZGxyMSAlZCAgJTA4eFxuIiwgbGFuZV9zdGVwLCgobGFuZV9zdGVwKSooRERSMF9QVUJfRFgxTENETFIxLQoJCQkJCS8vRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCS8vK0REUjBfUFVCX0RYMExDRExSMSkpOwoJCQkJCS8vcHJpbnRmKCJsY2RscjMgJWQgICUwOHhcbiIsIGxhbmVfc3RlcCwoKGxhbmVfc3RlcCkqKEREUjBfUFVCX0RYMUxDRExSMy0KCQkJCQkvL0REUjBfUFVCX0RYMExDRExSMykKCQkJCQkvLytERFIwX1BVQl9EWDBMQ0RMUjMpKTsKCQkJCQkvL2RxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdPTA7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF09MHhmZmZmOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdPTB4ZmZmZjsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkJfQoJCQkJLy9lbHNlCgkJCQl7CgkJCQkJLy9kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdPTA7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXT0weGZmZmY7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWF4X2FbbGFuZV9zdGVwXT0weGZmZmY7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkJfQoJCQl9CgoJCQl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E9KChyZWFkbChERFIwX1BVQl9BQ0xDRExSKSkmQUNMQ0RMUl9NQVgpOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hPTB4ZmZmZjsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYT0weGZmZmY7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9MDsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfb3JnX2E9KChyZWFkbChERFIwX1BVQl9BQ0JETFIwKSkmQUNCRExSX01BWCk7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hPTB4ZmZmZjsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E9MHhmZmZmOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0wOwoJCQl9CgoKCiNpZiAxIC8vKCBDT05GSUdfRERSX1BIWTxQX0REUl9QSFlfOTA1WCkKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDBHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDFHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDJHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDNHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpKTsKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDBHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfDE7ICAgICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8MSk7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Mik7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Myk7ICAgCgojZW5kaWYKCQkJaWYobGFuZV9kaXNhYmxlKQoJCQl7aWYobGFuZV9kaXNhYmxlJjB4MSl7CgkJCQkJCQkJCSBkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVswXT00OwoJCQkJCQkJCQkgZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hWzBdPTQ7CgkJCQkJCQkJIH0KCQkJaWYobGFuZV9kaXNhYmxlJjB4Mil7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVsxXT00OwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hWzFdPTQ7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4NCl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVsyXT00OwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hWzJdPTQ7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4OCl7CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVszXT00OwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hWzNdPTQ7CgkJCX0KCQkJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PSV4XG4iLGxhbmVfZGlzYWJsZSk7CgkJCWlmKGxhbmVfZGlzYWJsZSYweDEwKXsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT00OwoJCQkJcHJpbnRmKCJkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PSV4XG4iLGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYSk7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4MjApewoJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT00OwoJCQkJcHJpbnRmKCJkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0leFxuIixkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hKTsKCgkJCX0KCQkJfQoKCQkJewoJCQkJZm9yIChsYW5lX3N0ZXAgPSAwOyBsYW5lX3N0ZXAgPCA0OyBsYW5lX3N0ZXArKykKCgoJCQkJewoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJCX0KCgoKCgkJCQlsYW5lX3N0ZXA9NDsKCQkJCXsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF09ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hOwoJCQkJfQoJCQl9CgoKCgkJfQoKCgoKCQlmb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJLy9zZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCX0KCgoKCX0KCgl0ZXN0X2FyZ18yX3N0ZXArKzsKCW51bV9hcnJ5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCXNwcmludGYoc3RyLCAiMHglMDh4IiwgbnVtX2FycnlbMF0pOwoJcHJpbnRmKCIlZCAgJWRcbiIsIDAsbnVtX2FycnlbMF0pOwoJZm9yIChpID0gMTsgaSA8IDQ4OyBpKyspIHsKCQkvL251bV9hcnJ5W2ldPTA7CgkJc3ByaW50ZihzdHIsICIlczsweCUwOHgiLCBzdHIsbnVtX2FycnlbaV0pOwoJCXByaW50ZigiJWQgICVkXG4iLCBpLG51bV9hcnJ5W2ldKTsKCgl9CgkvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwoJcHJpbnRmKCIlcyIsIHN0cik7CgkvLyBzZXRlbnYodmFybmFtZSwgc3RyKTsKCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCWZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CgoJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCX0KCgoJZm9yIChpID0gODsgaSA8IDQ4OyBpKyspIHsKCQludW1fYXJyeVtpXT1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQlwcmludGYoImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQ9PSVkXG4iLGksbnVtX2FycnlbaV0pOwoJfQoKCS8vLyoKCXsKCQlmb3IgKGxhbmVfc3RlcCA9IDA7IGxhbmVfc3RlcCA8IDQ7IGxhbmVfc3RlcCsrKQoJCXsKCQkJewoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMF07CgkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXTsKCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM107CgkJCX0KCQkJewoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdOwoJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddOwoJCQl9CgoKCQl9CgkJbGFuZV9zdGVwPTQ7CgkJewoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9taW5fYT1udW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV07CgkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWF4X2E9bnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XTsKCQl9Cgl9CgkvLyovCgoKCgoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCgkJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBkcXMgd2luZG93IGxhbmUgYVxuIik7CgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgoJCQkvKgoJCQkgICB7CgkJCSAgIGxjZGxyX3RlbXBfY291bnQ9ZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZTsKCQkJICAgc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJICAgcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCSAgIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJICAgfQoJCQkgICAqLwoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTApCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTApKQoJCQkJewkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0xOwoJCQkJCXsKCQkJCQkJewoJCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQkJfQoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJLy8gICAgIHNldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCwgYnVmKTsKCQkJCQkJLy8JCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQl9CgoJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMCksMik7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoKCQkJCX0KCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTEpCgkJCQl7CgkJCQkJLy8gIHRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkvLwkgaWYodGVtcF9zKQoJCQkJCS8vCSAJewoJCQkJCS8vCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJLy8KCQkJCQkvLwkgCX0KCQkJCQlsY2Rscl90ZW1wX2NvdW50PXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTI7CgkJCQl9CgoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrMV09ZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXTsKCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF07CgkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrM109ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCgkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQl7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzE7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkvLwkgc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkvLwkgc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkvLyAgICAgIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQl9CgoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKXx8CgkJCQkJKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpKQoJCQl7CgkJCQkvLwlpZigoZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSk9PTB4ZmZmZikKCQkJCS8vCQl7ZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT0wOwoJCQkJLy8JCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQkvLyAgICAgICAgICAgICBydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJLy8JCX0KCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV93ZHFfc3RhdHVzX2FbbGFuZV9zdGVwXT09MikKCQkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdPTM7CgkJCQkJCXsKCQkJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiszXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJCX0KCQkJCQkJewoJCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJCXByaW50ZiggIiVzIiwgYnVmKTsKCQkJCQkJCS8vICAgICAgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQkvLwkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIDEiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMiswKSwxKTsKCQkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCgkJCQkJfQoJCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09PTMpCgkJCQkJewoJCQkJCQkvLyAgIHRlbXBfcz0gZ2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJLy8gaWYodGVtcF9zKQoJCQkJCQkvLwl7CgkJCQkJCS8vCgkJCQkJCS8vCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJCS8vIAl9CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCQkJCQl9CgoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMiswXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdOwoJCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX21heF9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJCS8vbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJCQl7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCsyOwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkvLyAgcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJfQoKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MHhmZmZmKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0xKQoJCQkgICkKCQkJewoJCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpCgkJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKSkKCQkJCXsJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTE7CgkJCQkJewoJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJfQoJCQkJCXsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCS8vICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCS8vCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJLy9pPTY7CgkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQl9CgoJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMik7CgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSkKCQkJCXsKCQkJCQkvLyAgdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCS8vIGlmKHRlbXBfcykKCQkJCQkvLyAJewoJCQkJCS8vCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJLy8gCX0KCQkJCQlsY2Rscl90ZW1wX2NvdW50PSByZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsgCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzZdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs1OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJLy8gICAgICAgIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQl9CgoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0yKXx8CgkJCQkJKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0zKSkKCQkJewoKCQkJCXsKCQkJCQlpZihkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MikKCQkJCQl7CQoKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MzsKCQkJCQkJewoJCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJCQkvLwkgc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCQl9CgoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkJLy8gICAgICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJLy8JCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIDEiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXAqMisxKSwxKTsKCQkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTQ7CgoJCQkJCX0KCQkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MykKCQkJCQl7CgkJCQkJCS8vICB0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCS8vCSBpZih0ZW1wX3MpCgkJCQkJCS8vIAl7CgkJCQkJCS8vCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJCS8vIAl9CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOyAKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF09bGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09NDsKCQkJCQl9CgoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis1XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXTsKCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzddPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdOwoJCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCQkvLwludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoKCQkJCQl7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs2OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy8gIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCQkJLyoKCQkJICAgaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpfHwKCQkJICAgKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKSkKCQkJICAge2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCSAgIHNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDIpOwoJCQkgICBwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSl8fAoJCQkoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpKQoJCQl7ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQkqLwkKCgoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQl7cHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJCQl9CgoKCQl9CgoKCgl9CgoJaWYgKGNoYW5uZWxfYV9lbikKCXsKCgkJLy8qKGNoYXIgICAgICopKGFyZ3YyWzBdKT0iYSI7CgkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQlwcmludGYoIlxudGVzdCBsY2RsciBhYyBiZGxyIHdpbmRvdyBsYW5lIGEuLi5cbiIpOwoKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHdhdGNoZG9nX3RpbWVfcyk7CgkJCXByaW50ZigiXG5kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2EgJWQgXG4iLGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYSk7CgkJCWxhbmVfc3RlcD00OwoJCQkvL2Vudl9sY2Rscl90ZW1wX2NvdW50PSJsY2Rscl90ZW1wX2NvdW50X2EiOwoJCQlpZigoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPj0weGZmZmYpCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0wKQoJCQkJCXx8KGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MSkKCQkJICApCgkJCXsKCQkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E+PTB4ZmZmZikKCQkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0wKSkKCQkJCXsJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0xOwoJCQkJCXsKCQkJCQkJewoJCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQkJcHJpbnRmKCJhY2xjZGxyX3N0YXR1c19hPT0weCUwOHhcbiIsbnVtX2FycnlbaV0pOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCgkJCQkJCX0KCQkJCQkJcHJpbnRmKCJcbjIyMnRlc3QgbGNkbHIgYWMgYmRsciB3aW5kb3cgbGFuZSBhLi4uXG4iKTsKCQkJCQkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCS8vICAgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCS8vCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQl9CgoJCQkJCXByaW50ZigiXG4zMzN0ZXN0IGxjZGxyIGFjIGJkbHIgd2luZG93IGxhbmUgYS4uLlxuIik7CgkJCQkJLy9kZHJfdHVuZV9hY2xjZGxyX3N0ZXAKCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHglMDh4ICVkICVkIDEiLGFkZF90ZXN0X3NpemUsKCAwKSwyKTsKCQkJCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJcHJpbnRmKCJhY2xjZGxyX3N0YXR1c19hMT09MHglMDh4XG4iLG51bV9hcnJ5W2ldKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT0yOwoKCQkJCX0KCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MSkKCQkJCXsKCQkJCQkvLyAgICAgdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCS8vIGlmKHRlbXBfcykKCQkJCQkvLyAJewoJCQkJCS8vbGNkbHJfdGVtcF9jb3VudD0gc2ltcGxlX3N0cnRvdWxsX2Rkcih0ZW1wX3MsICZlbmRwLCAwKTsKCQkJCQkvLyAJfQoJCQkJCWxjZGxyX3RlbXBfY291bnQ9cmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPTI7CgkJCQl9CgoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2E7CgkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCgkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkvL251bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCQl7CgkJCQkJaT04K2xhbmVfc3RlcCo4KzE7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQlpPTgrbGFuZV9zdGVwKjgrMzsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCS8vIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJLy8gIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQl9CgoKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9PTIpfHwKCQkJCQkoZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX3N0YXR1c19hPT0zKSkKCQkJewoJCQkJLy8JaWYoKGRxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0pPT0weGZmZmYpCgkJCQkvLwkJe2RxX2xjZF9iZGxfdmFsdWVfd2RxX3N0YXR1c19hW2xhbmVfc3RlcF09MDsKCQkJCS8vCQludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJLy8gICAgICAgICAgICAgcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCS8vCQl9CgoJCQkJewoJCQkJCWlmKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MikKCQkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9MzsKCQkJCQkJewoJCQkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCszOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCQl9CgkJCQkJCXsKCQkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJCXNwcmludGYoYnVmLCAiMHglMDh4IiwgbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJCQlwcmludGYoICIlcyIsIGJ1Zik7CgkJCQkJCQkvLyAgICAgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCQkvLwkJCXJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJfQoKCQkJCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2FjbGNkbHJfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCAxIixhZGRfdGVzdF9zaXplLCggMCksMSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfc3RhdHVzX2E9NDsKCgkJCQkJfQoJCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT09MykKCQkJCQl7CgkJCQkJCS8vICAgdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkvLwkgaWYodGVtcF9zKQoJCQkJCQkvLyAJewoJCQkJCQkvLwlsY2Rscl90ZW1wX2NvdW50PSBzaW1wbGVfc3RydG91bGxfZGRyKHRlbXBfcywgJmVuZHAsIDApOwoJCQkJCQkvLyAJfQoJCQkJCQlsY2Rscl90ZW1wX2NvdW50PSByZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21heF9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYT00OwoJCQkJCX0KCgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzBdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYTsKCQkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisxXT1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMisyXT1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2E7CgkJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzNdPWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9zdGF0dXNfYTsKCQkJCQkvL2Rkcl91ZGVsYXkoMTAwMDAwMCk7CgkJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJCXsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzI7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkvLwkgc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4KzM7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkvLyAgcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJfQoKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0weGZmZmYpCgkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MCkKCQkJCQl8fChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0xKQoJCQkgICkKCQkJewoJCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTB4ZmZmZikKCQkJCQkJfHwoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MCkpCgkJCQl7CQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPTE7CgkJCQkJewoJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCX0KCQkJCQl7CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkJCQkJc3ByaW50ZihidWYsICIweCUwOHgiLCBsY2Rscl90ZW1wX2NvdW50KTsKCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkvLyAgICBzZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQsIGJ1Zik7CgkJCQkJCS8vCQlydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJCQkJCXdyaXRlbChudW1fYXJyeVs2XSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQl9CgoJCQkJCXNwcmludGYoc3RyLCJkZHJfdHVuZV9hY2xjZGxyX3N0ZXAgIGEgMCAweCUwOHggJWQgJWQgMSIsYWRkX3Rlc3Rfc2l6ZSwoIDEpLDIpOwoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlkZHJfdWRlbGF5KDIwMDAwMDApOwoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9MjsKCgkJCQl9CgkJCQllbHNlIGlmIChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hPT0xKQoJCQkJewoJCQkJCS8vICB0ZW1wX3M9IGdldGVudihlbnZfbGNkbHJfdGVtcF9jb3VudCk7CgkJCQkJLy8JIGlmKHRlbXBfcykKCQkJCQkvLyAJewoJCQkJCS8vCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJLy8gCX0KCQkJCQlsY2Rscl90ZW1wX2NvdW50PSByZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNjw8MikpKTsKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21pbl9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0yOwoJCQkJfQoKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hOwoJCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2E7CgkJCQkvL251bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXTsKCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hOwoJCQkJLy9kZHJfdWRlbGF5KDEwMDAwMDApOwoJCQkJLy9udW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoJCQkJewoJCQkJCWk9OCtsYW5lX3N0ZXAqOCs1OwoJCQkJCXNwcmludGYoc3RyX3RlbXAxLCJkZHJfdGVzdF9kYXRhX251bV8lMDRkIixpKTsKCQkJCQlzcHJpbnRmKHN0cl90ZW1wMiwiMHglMDh4IixudW1fYXJyeVtpXSk7CgkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkvL3J1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJaT04K2xhbmVfc3RlcCo4Kzc7CgkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkvLyBzZXRlbnYoc3RyX3RlbXAxLCBzdHJfdGVtcDIpOwoJCQkJCS8vICAgIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQl9CgoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoKCQkJaWYoKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTIpfHwKCQkJCQkoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MykpCgkJCXsKCgkJCQl7CgkJCQkJaWYoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT09MikKCQkJCQl7CQoKCQkJCQkJZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYT0zOwoJCQkJCQl7CgkJCQkJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9zdGF0dXNfYTsKCQkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDEsImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQiLGkpOwoJCQkJCQkJc3ByaW50ZihzdHJfdGVtcDIsIjB4JTA4eCIsbnVtX2FycnlbaV0pOwoJCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCQl9CgoJCQkJCQl7CgkJCQkJCQlsY2Rscl90ZW1wX2NvdW50PTA7CgkJCQkJCQlzcHJpbnRmKGJ1ZiwgIjB4JTA4eCIsIGxjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkJcHJpbnRmKCAiJXMiLCBidWYpOwoJCQkJCQkJLy8gICAgc2V0ZW52KGVudl9sY2Rscl90ZW1wX2NvdW50LCBidWYpOwoJCQkJCQkJLy8JcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQkJd3JpdGVsKG51bV9hcnJ5WzZdLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCQl9CgoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHglMDh4ICVkICVkIDEiLGFkZF90ZXN0X3NpemUsKCAxKSwxKTsKCQkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYiAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWRkcl91ZGVsYXkoMjAwMDAwMCk7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9NDsKCgkJCQkJfQoJCQkJCWVsc2UgaWYgKGRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9PTMpCgkJCQkJewoJCQkJCQkvLyAgdGVtcF9zPSBnZXRlbnYoZW52X2xjZGxyX3RlbXBfY291bnQpOwoJCQkJCQkvLyBpZih0ZW1wX3MpCgkJCQkJCS8vIAl7CgkJCQkJCS8vCWxjZGxyX3RlbXBfY291bnQ9IHNpbXBsZV9zdHJ0b3VsbF9kZHIodGVtcF9zLCAmZW5kcCwgMCk7CgkJCQkJCS8vIAl9CgkJCQkJCWxjZGxyX3RlbXBfY291bnQ9IHJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyg2PDwyKSkpOwoJCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hPWxjZGxyX3RlbXBfY291bnQ7CgkJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfc3RhdHVzX2E9NDsKCQkJCQl9CgoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis0XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hOwoJCQkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzVdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis2XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX21heF9hOwoJCQkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX3N0YXR1c19hOwoJCQkJCS8vZGRyX3VkZWxheSgxMDAwMDAwKTsKCQkJCQkvLwludW1fdG9fZW52KHZhcm5hbWUsbnVtX2FycnkpOwoKCQkJCQl7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs2OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8JIHNldGVudihzdHJfdGVtcDEsIHN0cl90ZW1wMik7CgkJCQkJCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkJCQkJCWk9OCtsYW5lX3N0ZXAqOCs3OwoJCQkJCQlzcHJpbnRmKHN0cl90ZW1wMSwiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZCIsaSk7CgkJCQkJCXNwcmludGYoc3RyX3RlbXAyLCIweCUwOHgiLG51bV9hcnJ5W2ldKTsKCQkJCQkJLy8gc2V0ZW52KHN0cl90ZW1wMSwgc3RyX3RlbXAyKTsKCQkJCQkJLy8gIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQkJd3JpdGVsKG51bV9hcnJ5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJfQoKCQkJfQoKCQkJLyoKCQkJICAgaWYoKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0weGZmZmYpfHwKCQkJICAgKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPT0wKSkKCQkJICAge2RxX2xjZF9iZGxfdmFsdWVfcmRxc19zdGF0dXNfYVtsYW5lX3N0ZXBdPTA7CgkJCSAgIHNwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4JTA4eCAlZCAlZCIsZGRyX3Rlc3Rfc2l6ZSwoIGxhbmVfc3RlcCoyKzEpLDIpOwoJCQkgICBwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCS8vc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHg4MDAwMCAlZCIsKCBsYW5lX3N0ZXApKTsKCQkJLy9wcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MTsKCQkJbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzRdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNV09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21pbl9hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzJdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrN109ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF07CgkJCW51bV90b19lbnYodmFybmFtZSxudW1fYXJyeSk7CgkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCgkJCWlmKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT09MSl8fAoJCQkoZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09PTIpKQoJCQl7ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX3N0YXR1c19hW2xhbmVfc3RlcF09MjsKCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBhIDAgMHglMDh4ICVkICVkIixkZHJfdGVzdF9zaXplLCggbGFuZV9zdGVwKjIrMSksMSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGIgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXT0zOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNF09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF07CgkJCS8vbnVtX2FycnlbOCtsYW5lX3N0ZXAqNCoyKzFdPWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdOwoJCQludW1fYXJyeVs4K2xhbmVfc3RlcCo0KjIrNl09ZHFfbGNkX2JkbF92YWx1ZV9yZHFzX21heF9hW2xhbmVfc3RlcF07CgkJCW51bV9hcnJ5WzgrbGFuZV9zdGVwKjQqMis3XT1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfc3RhdHVzX2FbbGFuZV9zdGVwXTsKCQkJbnVtX3RvX2Vudih2YXJuYW1lLG51bV9hcnJ5KTsKCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQkqLwkKCgoJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQl7cHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJCQl9CgoKCQl9CgoKCgl9CgoJaWYgKGNoYW5uZWxfYl9lbikKCXsvLyooY2hhciAgICAgKikoYXJndjJbMF0pPSJiIjsKCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDExIGEgMCAweDgwMDAwICAiLDApOwoJCXByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgbGFuZSBiXG4iKTsKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw4KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJLy9zcHJpbnRmKHN0ciwiZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAweDgwMDAwICVkIiwoIGxhbmVfc3RlcCkpOwoJCQkvL3ByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJc3ByaW50ZihzdHIsImRkcl90dW5lX2Rxc19zdGVwICBiIDAgMHglMDh4ICVkIDEiLGRkcl90ZXN0X3NpemUsKCBsYW5lX3N0ZXApKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgoJCX0KCX0KCgl1bnNpZ25lZCBpbnQgICBhY21kbHI9IDA7Cgl1bnNpZ25lZCBpbnQgIGRlbGF5X3N0ZXBfeDEwMD0gMDsKCWlmIChjaGFubmVsX2FfZW4pCgl7CgkJYWNtZGxyPSgocmVhZGwoKEREUjBfUFVCX0FDTURMUikpKSZBQ0xDRExSX01BWCk7CgkJZGVsYXlfc3RlcF94MTAwPTEwMCoxMDAwMDAwLygyKmdsb2JhbF9kZHJfY2xrKmFjbWRscik7CgkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsc3RlcD0lZCBwcywxMHN0ZXA9JWQgcHMsMTAwc3RlcD0lZCBwcyxcbiIsYWNtZGxyLGFjbWRscixnbG9iYWxfZGRyX2NsaywKCQkJCWRlbGF5X3N0ZXBfeDEwMC8xMDAsZGVsYXlfc3RlcF94MTAwLzEwLGRlbGF5X3N0ZXBfeDEwMCk7CgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8d2RxX29yZyAweCUwOHggIHx3ZHFfbWluIDB4JTA4eCB8d2RxX21heCAweCUwOHggOjp8cmRxc19vcmcgIDB4JTA4eCAgfHJkcXNfbWluIDB4JTA4eCB8cmRxc19tYXggMHglMDh4ICBcbiIsCgkJCQkJbGFuZV9zdGVwLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0sCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfbWluX2FbbGFuZV9zdGVwXSxkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19vcmdfYVtsYW5lX3N0ZXBdLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdLGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdKTsKCQl9CgkJewoJCQlwcmludGYoIlxuYWNfbGFuZV8weCUwOHh8bGNkX29yZyAweCUwOHggIHxsY2RfbWluIDB4JTA4eCB8bGNkX21heCAweCUwOHggOjp8YmRscl9vcmcgIDB4JTA4eCAgfGJkbHJfbWluIDB4JTA4eCB8YmRscl9tYXggMHglMDh4ICBcbiIsCgkJCQkJNCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX21pbl9hLGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYSwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hLAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2EsZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYSk7CgkJfQoJCXByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOwoJCXsKCQkJcHJpbnRmKCJcbiBhY19sYW5lXzB4MDAwMDAwMHwgIGxjZGxyX29yZyAgfGxjZGxyX3NldCBwc3xsY2Rscl9ob2xkIHBzOnxcCgkJCQkJY2xrX3NldHVwICBwc3wgY2xrX2hvbGQgcHN8YWRqX3BlcmNlbnRbMTAwXVxuIik7CgoJCQlwcmludGYoIlxuIGFjX2xhbmUweCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQk0LAoJCQkJCWRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWF4X2EtZHFfbGNkX2JkbF92YWx1ZV9hY2xjZGxyX29yZ19hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9vcmdfYS1kcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2EpKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYStkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2EpLygKCQkJCQkJMipkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfb3JnX2EpKTsKCQkJcHJpbnRmKCJcbiBja19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQlkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hLAoJCQkJCTAsCgkJCQkJMCwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hLWRxX2xjZF9iZGxfdmFsdWVfYmRscjBfbWluX2EpKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV9iZGxyMF9tYXhfYS1kcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkxMDAqKGRxX2xjZF9iZGxfdmFsdWVfYWNsY2Rscl9tYXhfYStkcV9sY2RfYmRsX3ZhbHVlX2FjbGNkbHJfbWluX2EpLygKCQkJCQkJMipkcV9sY2RfYmRsX3ZhbHVlX2JkbHIwX29yZ19hKSk7CgkJfQoJCXByaW50ZigiXG4gYV9sYW5lXzB4MDAwMDAwMDB8IHdyZHFfb3JnIDB4MHx3X3NldHVwIHggcHN8d19ob2xkICB4IHBzOjp8XAoJCQkJcmRfc2V0dXAgIHBzfHJkX2hvbGQgeCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdLWRxX2xjZF9iZGxfdmFsdWVfd2RxX29yZ19hW2xhbmVfc3RlcF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgoZHFfbGNkX2JkbF92YWx1ZV93ZHFfb3JnX2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3dkcV9taW5fYVtsYW5lX3N0ZXBdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihkcV9sY2RfYmRsX3ZhbHVlX3dkcV9tYXhfYVtsYW5lX3N0ZXBdK2RxX2xjZF9iZGxfdmFsdWVfd2RxX21pbl9hW2xhbmVfc3RlcF0pLygKCQkJCQkJMipkcV9sY2RfYmRsX3ZhbHVlX3dkcV9vcmdfYVtsYW5lX3N0ZXBdKSk7CgoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0sCgkJCQkJMCwKCQkJCQkwLAoKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWluX2FbbGFuZV9zdGVwXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChkcV9sY2RfYmRsX3ZhbHVlX3JkcXNfbWF4X2FbbGFuZV9zdGVwXS1kcV9sY2RfYmRsX3ZhbHVlX3JkcXNfb3JnX2FbbGFuZV9zdGVwXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkxMDAqKGRxX2xjZF9iZGxfdmFsdWVfcmRxc19tYXhfYVtsYW5lX3N0ZXBdK2RxX2xjZF9iZGxfdmFsdWVfcmRxc19taW5fYVtsYW5lX3N0ZXBdKS8oCgkJCQkJCTIqZHFfbGNkX2JkbF92YWx1ZV9yZHFzX29yZ19hW2xhbmVfc3RlcF0pKTsKCgoKCQl9Cgl9CgoKCglpZiAoY2hhbm5lbF9iX2VuKQoJewoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJezsKCQl9Cgl9CgoJcmV0dXJuIHJlZ192YWx1ZTsKfQoKCnVuc2lnbmVkIGludCBkb19kZHJfdWJvb3Rfd2luZG93X2luaXQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGFyICplbmRwOwoJdW5zaWduZWQgdGVtcF9jb3VudD0wOwoJZm9yKDt0ZW1wX2NvdW50PGFyZ2M7dGVtcF9jb3VudCsrKQoJewoJCXByaW50ZigiYXJnWyVkXT09JXM7XG4iLGFyZ2MsYXJndlt0ZW1wX2NvdW50XSk7Cgl9CgoJaWYgKGFyZ2MgPjEpIHsKCQlnX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX2RhdGFfc291cmNlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlnX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX2RhdGFfc291cmNlID0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9ETUNfU1RJQ0tZOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9kYXRhX3NvdXJjZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCQl9Cgl9CgkvKgoJICAgZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl9kYXRhX3NvdXJjZQk9CgkgICBnX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX2RhdGFfdGVzdF9zaXplCT0KCSAgIGdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfYWRkcmVzc190ZXN0X3NpemUJPQoJICAgZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl90ZXN0X3dhdGNoZG9nX3RpbWVzX3MJPQoJICAgZ19kZHJfdGVzdF9zdHJ1Y3QtPmRkcl90ZXN0X2xhbmVfZGlzYWJsZQk9CgkgICBnX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX2FkZHJlc3NfdGVzdF9zaXplCT0KCSAgIGdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfYWRkcmVzc190ZXN0X3NpemUJPQoJICAgKi8KCglyZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50IGRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2Rscih1bnNpZ25lZCBpbnQgcmFua19pbmRleCx1bnNpZ25lZCBpbnQgZGF0YV9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCS8vY2hhciAqZW5kcDsKCXVuc2lnbmVkIHJlYWRfdmFsdWU9MDsKCgkvL3JldHVybiByZWFkX3ZhbHVlOwoKI2lmIDEKCXVuc2lnbmVkIHJlZ19hZGQ9MDsKCXsKI2lmICggQ09ORklHX0REUl9QSFk8UF9ERFJfUEhZXzkwNVgpCgkJewoJCQlyZWdfYWRkPSgoZGF0YV9pbmRleD4+MSkqKEREUjBfUFVCX0RYMUxDRExSMS0KCQkJCQkJRERSMF9QVUJfRFgwTENETFIxKQoJCQkJCStERFIwX1BVQl9EWDBMQ0RMUjEpOwoJCQlpZigoZGF0YV9pbmRleCUyKT09MCkKCQkJewoJCQkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1JFQUQpCgkJCQl7CgkJCQkJbGNkbHJfdmFsdWU9KChyZWFkbChyZWdfYWRkKSkmMHhmZik7CgkJCQl9CgkJCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfV1JJVEUpCgkJCQl7CgkJCQkJd3JfcmVnKHJlZ19hZGQsICgocmVhZGwocmVnX2FkZCkpJjB4ZmZmZmZmMDApfChsY2Rscl92YWx1ZSYweGZmKSk7CgkJCQl9CgkJCX0KCQkJaWYoKGRhdGFfaW5kZXglMik9PTEpCgkJCXsKCQkJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9SRUFEKQoJCQkJewoJCQkJCWxjZGxyX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKT4+OCkmMHhmZik7CgkJCQl9CgkJCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfV1JJVEUpCgkJCQl7CgkJCQkJd3JfcmVnKHJlZ19hZGQsICgocmVhZGwocmVnX2FkZCkpJjB4ZmZmZjAwZmYpfCgobGNkbHJfdmFsdWUmMHhmZik8PDgpKTsKCQkJCX0KCQkJfQoJCX0KCiNlbHNlCgoJCWlmKChkYXRhX2luZGV4JTIpPT0wKQoJCXsKCQkJcmVnX2FkZD0oKGRhdGFfaW5kZXg+PjEpKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkrRERSMF9QVUJfRFgwTENETFIxKTsKCgkJfQoJCWlmKChkYXRhX2luZGV4JTIpPT0xKQoJCXsKCQkJcmVnX2FkZD0oKGRhdGFfaW5kZXg+PjEpKihERFIwX1BVQl9EWDFMQ0RMUjEtCgkJCQkJCUREUjBfUFVCX0RYMExDRExSMSkKCQkJCQkrRERSMF9QVUJfRFgwTENETFIzKTsKCgkJfQoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9SRUFEKQoJCXsKCQkJbGNkbHJfdmFsdWU9KCgocmVhZGwocmVnX2FkZCkpPj4wKSYweDFmZik7CgkJfQoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9XUklURSkKCQl7CgkJCXdyX3JlZyhyZWdfYWRkLCAoKGxjZGxyX3ZhbHVlJjB4MWZmKTw8MCkpOwoJCX0KCiNlbmRpZgoJfQoKCgoJcHJpbnRmKCJsY2RsciAlZCAgJTA4eCwlMDh4XG4iLCBkYXRhX2luZGV4LHJlZ19hZGQsCgkJCShyZWFkbChyZWdfYWRkKSkpOwoJcmVhZF92YWx1ZT1sY2Rscl92YWx1ZTsKCglyZXR1cm4gcmVhZF92YWx1ZTsKCiNlbmRpZiAKfQp1bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfYWNtZGxyKHZvaWQgKQp7CgoJdW5zaWduZWQgcmVnX3ZhbHVlPTA7CiNpZiAoIENPTkZJR19ERFJfUEhZPD1QX0REUl9QSFlfOTA1WCkKCXJlZ192YWx1ZT0ocmVhZGwoRERSMF9QVUJfQUNNRExSMCkpOwoJcmVnX3ZhbHVlPShyZWdfdmFsdWU+PjE2KSYweDFmZjsKI2VuZGlmCglyZXR1cm4gcmVnX3ZhbHVlOwp9CnVuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2Rscih1bnNpZ25lZCBpbnQgcmFua19pbmRleCx1bnNpZ25lZCBpbnQgYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkKewoJdW5zaWduZWQgcmVnX2FkZD0wOwoKCWlmKGFkZF9pbmRleD09MCkKCQlyZWdfYWRkPShERFIwX1BVQl9BQ0xDRExSKTsKCWlmKGFkZF9pbmRleD09MSkKCQlyZWdfYWRkPShERFIwX1BVQl9BQ0JETFIwKTsKCXsKCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfUkVBRCkKCQl7CgkJCWxjZGxyX3ZhbHVlPSgoKHJlYWRsKHJlZ19hZGQpKT4+MCkmMHgxZmYpOwoJCX0KCQlpZihyZWFkX3dyaXRlX2ZsYWc9PUREUl9QQVJBTUVURVJfV1JJVEUpCgkJewoJCQl3cl9yZWcocmVnX2FkZCwgKChsY2Rscl92YWx1ZSYweDFmZik8PDApKTsKCQl9CgoJfQoJcHJpbnRmKCJsY2RsciAlZCAgJTA4eCwlMDh4XG4iLCBhZGRfaW5kZXgscmVnX2FkZCwKCQkJKHJlYWRsKHJlZ19hZGQpKSk7CglyZXR1cm4gbGNkbHJfdmFsdWU7Cn0KCmludCBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfbWV0aG9kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoKCS8vc2V0ZW52IGJvb3RjbWQgImRkcl90ZXN0X2NtZCAweDMxIDIgNiAgMjAgMCAweDEwMDAwMCAweDQwMDAwMDAiCglwcmludGYoIlxuc2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MzIgMiA2ICAyMCAwIDB4MTAwMDAwIDB4NDAwMDAwMCBcbiIpOwoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSBmdW5jdGlvblxuIik7CglwcmludGYoIlxuLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKI2RlZmluZSBERFJfVEVTVF9OVUxMICAwCiNkZWZpbmUgRERSX1RFU1RfUEFTUyAgMQojZGVmaW5lIEREUl9URVNUX0ZBSUwgMgoKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsYW5lX2Rpc2FibGU9IDA7Cgl1bnNpZ25lZCBpbnQgICBkYXRhX3NvdXJjZT0gMDsKCXVuc2lnbmVkIGludCAgZGRyX2RhdGFfdGVzdF9zaXplPTB4MTAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX2FkZF90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoKCXVuc2lnbmVkIGludCAgYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz0xNTsKCXVuc2lnbmVkIGludCAgdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MTsgIC8vZm9yIHF1aWNrIG91dCBvZiBlcnJvcgoJaWYgKGFyZ2MgPjEpIHsKCQlkYXRhX3NvdXJjZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkYXRhX3NvdXJjZT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9VQk9PVF9FTlY7CgkJfQoJfQoJaWYgKGFyZ2MgPjIpIHsKCQl3YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zPSAxNTsKCQl9Cgl9CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCS8vdGVzdF93YXRjaGRvZ190aW1lX3M9YWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfczsKCWlmIChhcmdjID4zKSB7CgkJYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPSB3YXRjaGRvZ190aW1lX3M7CgkJfQoJfQoJcHJpbnRmKCJhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPT0lZFxuIixhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCS8vbGFuZV9kaXNhYmxlPWdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfdGVzdF9sYW5lX2Rpc2FibGU7CglpZiAoYXJnYyA+NCkgewoJCWxhbmVfZGlzYWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlsYW5lX2Rpc2FibGU9IDA7CgkJfQoJfQoJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PTB4JTA4eFxuIixsYW5lX2Rpc2FibGUpOyAgIAoKCWlmIChhcmdjID41KSB7CgkJZGRyX2RhdGFfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9kYXRhX3Rlc3Rfc2l6ZT0gMHgxMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfZGF0YV90ZXN0X3NpemU9PTB4JTA4eFxuIixkZHJfZGF0YV90ZXN0X3NpemUpOwoJaWYgKGFyZ2MgPjYpIHsKCQlkZHJfYWRkX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfYWRkX3Rlc3Rfc2l6ZT0gMHgxMDAwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl9hZGRfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2FkZF90ZXN0X3NpemUpOwoKCXVuc2lnbmVkIGludCByYW5rX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4PTEwMDsKCXVuc2lnbmVkIGludCBudW1fYXJyYXlbMTAwXTsvLzggZmxhZyAzMl9kYXRhIGFkZF84ICAzMl9kYXRhIGFkZF84CgoJdW5zaWduZWQgaW50IHRlbXBfdGVzdF9lcnJvcj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21pbj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJbWVtc2V0KG51bV9hcnJheSwgMCwgc2l6ZW9mKG51bV9hcnJheSkpOwoJY2hhciBzdHJbMTAyNF09IiI7CgoJaWYoZGF0YV9zb3VyY2U9PUREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSkKCQlkZHJfdGVzdF9kYXRhX2FycmF5X21heD02NDsKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg7IHRlbXBfY291bnQrKykgCgl7CgkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEICk7CgkJcHJpbnRmKCJyZWFkIG51bWFycnlbJWRdPT0lZFxuIix0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9CgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZSA9MDsgIC8vYmVzdF9sY2Rscl92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnID0wOyAgLy9taW4gY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgbGFuZTAgdyBtaW4gIC0yIGxhbmUwIHcgbWF4IC0zIGxhbmUwIHIgbWluICAgIDQgbGFuZTAgciBtYXggLS0tLS01IGxhbmUxIHcgbWluIC4uLgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X21hZ2ljX251bWJlciA9MDsKCXVuc2lnbmVkIGludCBvcmdfbGNkbHJfdmFsdWVfdGVtcD0wOwoJdW5zaWduZWQgaW50IGFjbWRscj0wOwoJYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoKCXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT1udW1fYXJyYXlbMF07Cgl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZz1udW1fYXJyYXlbMV07Cgl0ZXN0X2FyZ18yX3N0ZXA9bnVtX2FycmF5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJheVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycmF5WzRdOwoJdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPW51bV9hcnJheVs1XTsKCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyYXlbNl07Cgl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1udW1fYXJyYXlbN107CglwcmludGYoInRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT09JWRcbiIsdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlKTsKCXByaW50ZigidGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9PSVkXG4iLHRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnKTsKCXByaW50ZigidGVzdF9hcmdfMl9zdGVwPT0lZFxuIix0ZXN0X2FyZ18yX3N0ZXApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18zX2ZyZXE9PSVkXG4iLHRlc3RfYXJnXzNfZnJlcSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9PSVkXG4iLHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMpOwoJcHJpbnRmKCJ0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9JWRcbiIsbnVtX2FycmF5WzVdKTsKCXByaW50ZigidGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSVkXG4iLG51bV9hcnJheVs2XSk7CglwcmludGYoInRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPSVkXG4iLG51bV9hcnJheVs3XSk7CgoKCglpZigodGVzdF9hcmdfN19tYWdpY19udW1iZXI9PURNQ19TVElDS1lfTUFHSUNfMSkpIC8vZm9yIGNoZWNrIG1hZ2ljIG51bWJlciBtYWtlIHN1bWUgZW50ZXIgdGVzdCBjb21tYW5kCgl7Cgl9CgllbHNlCgl7CgoJCXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT0wOwoJCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT0wOwoJCXRlc3RfYXJnXzJfc3RlcD0wOwoJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCX0KCS8vcHJpbnRmKCJib290IHRpbWVzPT0lZFxuIix0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUpOwoJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlCQk7CgludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOwoJbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCXsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7Cgl9CgoKCglpZih0ZXN0X2FyZ18yX3N0ZXApCgl7CgkJaWYodGVzdF9hcmdfM19mcmVxIT1nbG9iYWxfZGRyX2NsaykgIC8vCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgkJewoJCQl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9MDsKCQkJdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9MDsKCQkJdGVzdF9hcmdfMl9zdGVwPTE7CgkJCXRlc3RfYXJnXzNfZnJlcT1nbG9iYWxfZGRyX2NsazsKCQkJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz0wOwoJCQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9MDsKCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWxjZGxyX21pbjsKCQkJdGVzdF9hcmdfN19tYWdpY19udW1iZXI9RE1DX1NUSUNLWV9NQUdJQ18xOwoJCQludW1fYXJyYXlbMF0JPQl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWUJCTsKCQkJbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsKCQkJbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgkJCW51bV9hcnJheVszXQk9CXRlc3RfYXJnXzNfZnJlcQkJOwoJCQludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCQkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCgoJCQlmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgkJCXsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl9CgoKCQkJLy9mb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJLy8JCW51bV9hcnJheVt0ZW1wX2NvdW50XT0wOwoJCQkvL30KCgkJCWZvciAodGVtcF9jb3VudCA9IDg7IHRlbXBfY291bnQgPCAoMzIrOCk7IHRlbXBfY291bnQrKykgICAvL2RhdGEKCQkJewoJCQkJLy9wcmludGYoIjF0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsKCQkJCQlpZigoKHRlbXBfY291bnQtOCkvNCk8OCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD0oZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vaWYobGFuZV9zdGVwPT05KQoJCQkJCQkvL2xjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJfQoJCQkJCWVsc2UgaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDEwKSAgCgkJCQkJewoJCQkJCQlsY2Rscl9taW49MDsKCQkJCQkJbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQlpZigoKHRlbXBfY291bnQtOCkvNCk9PTkpCgkJCQkJCQlsY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQkvL3ByaW50ZigiMnRlbXBfY291bnQ9JWRcbiIsdGVtcF9jb3VudCk7CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOCk+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzFdPWxjZGxyX21pbjsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsyXT1sY2Rscl9tYXg7Ly9udW1fYXJyYXlbdGVtcF9jb3VudF07CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrM109MDsKCQkJCQkvL3RlbXBfY291bnQ9dGVtcF9jb3VudCs0OwoJCQkJfQoKCgoJCQl9CgoJCQlmb3IgKHRlbXBfY291bnQgPSAzMis4OyB0ZW1wX2NvdW50IDwgKDMyKzgrOCk7IHRlbXBfY291bnQrKykgIC8vYWRkCgkJCXsKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsJCgkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDgpICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQllbHNlIGlmKCgodGVtcF9jb3VudC04KS80KTwxMCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPT05KQoJCQkJCQkJbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LCgodGVtcF9jb3VudC04LTMyKT4+MiksbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrMV09bGNkbHJfbWluOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzJdPWxjZGxyX21heDsvL251bV9hcnJheVt0ZW1wX2NvdW50XTsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCszXT0wOwoJCQkJfQoKCgkJCX0KCgoKCiNpZiAgKENPTkZJR19ERFJfUEhZPD1QX0REUl9QSFlfOTA1WCkKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDBHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDFHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDJHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDNHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpKTsKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDBHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfDE7ICAgICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8MSk7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Mik7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Myk7ICAgCgojZW5kaWYKCQkJaWYobGFuZV9kaXNhYmxlKQoJCQl7aWYobGFuZV9kaXNhYmxlJjB4MSl7CgkJCQkJCQkJCSBudW1fYXJyYXlbOCszXT0weGZmZmY7CgkJCQkJCQkJCSBudW1fYXJyYXlbOCs0KzNdPTB4ZmZmZjsKCQkJCQkJCQkgfQoJCQlpZihsYW5lX2Rpc2FibGUmMHgyKXsKCQkJCW51bV9hcnJheVs4KzMrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzhdPTB4ZmZmZjsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHg0KXsKCQkJCW51bV9hcnJheVs4KzMrOCs4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4OCl7CgkJCQludW1fYXJyYXlbOCszKzgrOCs4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4KzhdPTB4ZmZmZjsKCQkJfQoJCQlwcmludGYoImxhbmVfZGlzYWJsZT09JXhcbiIsbGFuZV9kaXNhYmxlKTsKCQkJaWYobGFuZV9kaXNhYmxlJjB4MTApewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4MjApewoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4KzhdPTB4ZmZmZjsKCgkJCX0KCQkJfQoKCgkJfQoKCgoKCQlmb3IgKHRlbXBfY291bnQ9IDA7IHRlbXBfY291bnQ8IDQ4O3RlbXBfY291bnQrKykgewoJCQludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJfQoJfQoKCXRlc3RfYXJnXzJfc3RlcCsrOwoJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCWZvciAodGVtcF9jb3VudCA9IDE7IHRlbXBfY291bnQgPCA0ODsgdGVtcF9jb3VudCsrKSAKCXsKCQlwcmludGYoIiVkICAlZFxuIiwgdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoJdGVtcF9jb3VudD0yOwoJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCS8vZm9yIChpID0gMDsgaSA8IDQ4OyBpKyspIHsKCgkvLwkgd3JpdGVsKG51bV9hcnJheVtpXSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCS8vfQoKCgkvL2ZvciAoaSA9IDg7IGkgPCA0ODsgaSsrKSB7CgkvL251bV9hcnJheVtpXT1yZWFkbCgoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpKTsKCS8vcHJpbnRmKCJkZHJfdGVzdF9kYXRhX251bV8lMDRkPT0lZFxuIixpLG51bV9hcnJheVtpXSk7CgkvL30KCgkvLy8qCgl1bnNpZ25lZCBpbnQgbGFuZV9zdGVwPTA7CgoJcHJpbnRmKCJcbnN0YXJ0IGxvb3AgdGVzdFxuIik7CgoJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8MTApOyhsYW5lX3N0ZXArKykpICAgLy9maW5kIG5lZWQgdGVzdCBkYXRhIHN0ZXAKCXsKCQlpZigobnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzMrOF08MHg0KSkKCQl7YnJlYWs7CgkJfQoJfQoJcHJpbnRmKCJcbnN0YXJ0ICB0ZXN0IGxhbmVfc3RlcCA9JWRcbiIsbGFuZV9zdGVwKTsKCWlmKGxhbmVfc3RlcDwxMCkKCXsKCQlpZihsYW5lX3N0ZXA8OCkKCQl7CgkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfZGF0YV90ZXN0X3NpemU7CgkJCS8vbGNkbHJfbWluPTA7CgkJCS8vbGNkbHJfbWF4PShkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJfQoJCWVsc2UKCQl7CgkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CgkJCWRkcl90ZXN0X3NpemU9ZGRyX2FkZF90ZXN0X3NpemU7CgkJCS8vbGNkbHJfbWluPTA7CgkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCX0KCgkJaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0wKSkgICAvL3Rlc3QgbGVmdCBlZGdlIGJlZ2luCgkJewoJCQkvKgoJCQkgICBudW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOy8vMSBwYXNzIDIgZXJyb3IKCQkJICAgbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgkJCSAgIG51bV9hcnJheVszXQk9CXRlc3RfYXJnXzNfZnJlcQkJOwoJCQkgICBudW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgkJCSAgIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJCQkgICBudW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCQkJICAgbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCQkJICAgKi8KCQkJLy8gICAgICAgICB0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsKCQkJLy8JIG51bV9hcnJheVswXT10ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU7CgkJCS8vCSB0ZW1wX2NvdW50PTA7CgkJCS8vCSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCS8vIAkgdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJdGVtcF9jb3VudD0xOwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJbnVtX2FycmF5WzVdPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk7ICAvL2VkZ2UgbGNkbHIKCQkJdGVtcF9jb3VudD01OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF0pOyAgCgkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk+PjEpOwoJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLy90ZW1wX2xjZGxyCgkJCXRlbXBfY291bnQ9NjsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsICAvL3RlbXBfbGNkbHIKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIC8vbGFuZSBzdGF0dXMKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQl0ZW1wX2NvdW50PTE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl3aGlsZSgxKTsKCgkJCX0KCQl9CgkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTEpKSAgIC8vdGVzdCBsZWZ0IGVkZ2Ugb25nb2luZyAgICAtbG9vcAoJCXsKCgkJCWlmKChudW1fYXJyYXlbNV0rMSk+PShudW1fYXJyYXlbNl0pKQoJCQl7CgkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJfQoKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0yOyAgLy91cGRhdGUgc3RhdHVzCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs1XT0wOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJdGVtcF9jb3VudD01OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzZdKzE7ICAgLy91cGRhdGUgQgoJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgICAvL3VwZGF0ZSBCCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCS8vICB0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9MDsvLyhudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7CgkJCQkvLyBudW1fYXJyYXlbMF09dGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlOwoJCQkJLy8gdGVtcF9jb3VudD0wOwoJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsgCgkJCQl3aGlsZSgxKTsKCgkJCX0KCQkJZWxzZSAKCQkJeyAKCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCXtwcmludGYoImRlZmF1bHQgdmFsdWUgbm90IHN0YWJsZSAsb3IgcmVjb3Zlcnkgc3RpY2t5P1xuIik7CgkJCQl9CgkJCQllbHNlICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQl7CgoKCgkJCQkJewoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07ICAgLy91cGRhdGUgQgoJCQkJCQkvLyB0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCXsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCXdoaWxlKDEpOwoKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQllbHNlCSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJewoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIG1pbiB2YWx1ZQoJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tdXBkYXRlIGN1cmVudAoJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgoJCQkJCX0KCgkJCQl9CgkJCX0KCgoJCX0KCgkJZWxzZSAgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0yKSkgICAvL3Rlc3QgcmlnaHQgZWRnZSBiZWdpbgoJCXsKCQkJLyoKCQkJICAgbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsvLzEgcGFzcyAyIGVycm9yCgkJCSAgIG51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQkgICBudW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJICAgbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQkgICBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJICAgbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCSAgIG51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgkJCSAgICovCgkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCXRlbXBfY291bnQ9MTsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXTsvL2xjZGxyX21heDsgIC8vZWRnZSBsY2RscgoJCQl0ZW1wX2NvdW50PTU7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsvLwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLy90ZW1wX2xjZGxyCgkJCXRlbXBfY291bnQ9NjsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsICAvL3RlbXBfbGNkbHIKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIC8vbGFuZSBzdGF0dXMKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQl7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQl0ZW1wX2NvdW50PTE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl3aGlsZSgxKTsKCgkJCX0KCQl9CgkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTMpKSAgIC8vdGVzdCByaWdodCBlZGdlIG9uZ29pbmcgICAgLWxvb3AKCQl7CgoJCQlpZigobnVtX2FycmF5WzZdKzEpPj0obnVtX2FycmF5WzVdKSkKCQkJewoJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9OVUxMKQoJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCX0KCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTQ7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzVdPTA7ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQl0ZW1wX2NvdW50PTU7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbNl0tMTsgICAvL3VwZGF0ZSBCCgkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdOyAgIC8vdXBkYXRlIEIKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsgCgkJCQl3aGlsZSgxKTsKCQkJfQoJCQllbHNlIAoJCQl7IAoJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9OVUxMKQoJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCX0KCQkJCWVsc2UgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCXsKCgoKCQkJCQl7CgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTM7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCQkJbnVtX2FycmF5WzVdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCQkJdGVtcF9jb3VudD01OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsgICAvL3VwZGF0ZSBCCgkJCQkJCS8vIHRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJewoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJd2hpbGUoMSk7CgoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWVsc2UJICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQl7CgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MzsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgbWF4IHZhbHVlCgkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS11cGRhdGUgY3VyZW50CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJCXsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl3aGlsZSgxKTsKCgkJCQkJfQoKCQkJCX0KCQkJfQoKCgkJfQoJfQoKCWlmKGxhbmVfc3RlcD49MTApIC8vZmluaXNoCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7Cgl9CgoJLy8gdW5zaWduZWQgaW50ICAgYWNtZGxyPSAwOwoJdW5zaWduZWQgaW50ICBkZWxheV9zdGVwX3gxMDA9IDA7CgoJewoJCS8vYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXSwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XSk7CgkJfQoJCWxhbmVfc3RlcD00OwoJCXsKCQkJcHJpbnRmKCJcbmFjX2xhbmVfMHglMDh4fGxjZF9vcmcgMHglMDh4ICB8bGNkX21pbiAweCUwOHggfGxjZF9tYXggMHglMDh4IDo6fGJkbHJfb3JnICAweCUwOHggIHxiZGxyX21pbiAweCUwOHggfGJkbHJfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCQl7CgkJCXByaW50ZigiXG4gYWNfbGFuZV8weDAwMDAwMDB8ICBsY2Rscl9vcmcgIHxsY2Rscl9zZXQgcHN8bGNkbHJfaG9sZCBwczp8XAoJCQkJCWNsa19zZXR1cCAgcHN8IGNsa19ob2xkIHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCQkJcHJpbnRmKCJcbiBhY19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKTsKCQkJcHJpbnRmKCJcbiBja19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLAoJCQkJCTAsCgkJCQkJMCwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKTsKCQl9CgkJcHJpbnRmKCJcbiBhX2xhbmVfMHgwMDAwMDAwMHwgd3JkcV9vcmcgMHgwfHdfc2V0dXAgeCBwc3x3X2hvbGQgIHggcHM6OnxcCgkJCQlyZF9zZXR1cCAgcHN8cmRfaG9sZCB4IHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKTsKCgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLAoJCQkJCTAsCgkJCQkJMCwKCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKTsKCgoKCQl9Cgl9CgoJdGVzdF9hcmdfMl9zdGVwPTB4MTAwMDA7CgludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoKCgoJdGVtcF9jb3VudD0yOwoJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJcmV0dXJuIDE7Cn0KCmludCBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2UoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoJLy9zZXRlbnYgYm9vdGNtZCAiZGRyX3Rlc3RfY21kIDB4MzEgMiA2ICAyMCAwIDB4MTAwMDAwIDB4NDAwMDAwMCIKCXByaW50ZigiXG5zZXRlbnYgYm9vdGNtZCBkZHJfdGVzdF9jbWQgMHgzMSAyIDYgIDIwIDAgMHgxMDAwMDAgMHg0MDAwMDAwIFxuIik7CglwcmludGYoIlxuRW50ZXIgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlIGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiXG4tLS0gd2F0Y2hkb2cgc2hvdWxkID4xNXNcbiIpOwoKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsYW5lX2Rpc2FibGU9IDA7Cgl1bnNpZ25lZCBpbnQgICBkYXRhX3NvdXJjZT0gMDsKCXVuc2lnbmVkIGludCAgZGRyX2RhdGFfdGVzdF9zaXplPTB4MTAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX2FkZF90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoKCXVuc2lnbmVkIGludCAgYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz0xNTsKCXVuc2lnbmVkIGludCAgdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7CgoJZXJyb3Jfb3V0b2ZfY291bnRfZmxhZyA9MTsgIC8vZm9yIHF1aWNrIG91dCBvZiBlcnJvcgoJaWYgKGFyZ2MgPjEpIHsKCQlkYXRhX3NvdXJjZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkYXRhX3NvdXJjZT0gRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9VQk9PVF9FTlY7CgkJfQoJfQoJaWYgKGFyZ2MgPjIpIHsKCQl3YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJd2F0Y2hkb2dfdGltZV9zPSAxNTsKCQl9Cgl9CglwcmludGYoIndhdGNoZG9nX3RpbWVfcz09JWRcbiIsd2F0Y2hkb2dfdGltZV9zKTsKCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPXdhdGNoZG9nX3RpbWVfczsKCS8vdGVzdF93YXRjaGRvZ190aW1lX3M9YWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfczsKCWlmIChhcmdjID4zKSB7CgkJYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPSB3YXRjaGRvZ190aW1lX3M7CgkJfQoJfQoJcHJpbnRmKCJhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPT0lZFxuIixhZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCS8vbGFuZV9kaXNhYmxlPWdfZGRyX3Rlc3Rfc3RydWN0LT5kZHJfdGVzdF9sYW5lX2Rpc2FibGU7CglpZiAoYXJnYyA+NCkgewoJCWxhbmVfZGlzYWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlsYW5lX2Rpc2FibGU9IDA7CgkJfQoJfQoJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PTB4JTA4eFxuIixsYW5lX2Rpc2FibGUpOyAgIAoKCWlmIChhcmdjID41KSB7CgkJZGRyX2RhdGFfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl9kYXRhX3Rlc3Rfc2l6ZT0gMHgxMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfZGF0YV90ZXN0X3NpemU9PTB4JTA4eFxuIixkZHJfZGF0YV90ZXN0X3NpemUpOwoJaWYgKGFyZ2MgPjYpIHsKCQlkZHJfYWRkX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls2XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls2XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfYWRkX3Rlc3Rfc2l6ZT0gMHgxMDAwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl9hZGRfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2FkZF90ZXN0X3NpemUpOwoKCXVuc2lnbmVkIGludCByYW5rX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4PTEwMDsKCXVuc2lnbmVkIGludCBudW1fYXJyYXlbMTAwXTsvLzggZmxhZyAzMl9kYXRhIGFkZF84ICAzMl9kYXRhIGFkZF84CgoJdW5zaWduZWQgaW50IHRlbXBfdGVzdF9lcnJvcj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21pbj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJbWVtc2V0KG51bV9hcnJheSwgMCwgc2l6ZW9mKG51bV9hcnJheSkpOwoJY2hhciBzdHJbMTAyNF09IiI7CgoJaWYoZGF0YV9zb3VyY2U9PUREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSkKCQlkZHJfdGVzdF9kYXRhX2FycmF5X21heD02NDsKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg7IHRlbXBfY291bnQrKykgCgl7CgkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEICk7CgkJcHJpbnRmKCJyZWFkIG51bWFycnlbJWRdPT0lZFxuIix0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9CgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzBfY21kMCA9MDsgIC8vbWFzdGVyIGNtZAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzFfY21kMSA9MDsgIC8vbWluIGNtZAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzJfc3RlcCA9MDsgLy9zdGVwIDAgIGluaXQgIC0xIGxhbmUwIHcgbWluICAtMiBsYW5lMCB3IG1heCAtMyBsYW5lMCByIG1pbiAgICA0IGxhbmUwIHIgbWF4IC0tLS0tNSBsYW5lMSB3IG1pbiAuLi4KCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18zX2ZyZXEgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzVfYm9vdHRpbWVzID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X21hZ2ljX251bWJlciA9MDsKCXVuc2lnbmVkIGludCBvcmdfbGNkbHJfdmFsdWVfdGVtcD0wOwoJdW5zaWduZWQgaW50IGFjbWRscj0wOwoJYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoKCXRlc3RfYXJnXzBfY21kMD1udW1fYXJyYXlbMF07Cgl0ZXN0X2FyZ18xX2NtZDE9bnVtX2FycmF5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJheVsyXTsKCXRlc3RfYXJnXzNfZnJlcT1udW1fYXJyYXlbM107Cgl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPW51bV9hcnJheVs0XTsKCXRlc3RfYXJnXzVfYm9vdHRpbWVzPW51bV9hcnJheVs1XTsKCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyYXlbNl07Cgl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1udW1fYXJyYXlbN107CglwcmludGYoInRlc3RfYXJnXzBfY21kMD09JWRcbiIsdGVzdF9hcmdfMF9jbWQwKTsKCXByaW50ZigidGVzdF9hcmdfMF9jbWQxPT0lZFxuIix0ZXN0X2FyZ18xX2NtZDEpOwoJcHJpbnRmKCJ0ZXN0X2FyZ18yX3N0ZXA9PSVkXG4iLHRlc3RfYXJnXzJfc3RlcCk7CglwcmludGYoInRlc3RfYXJnXzNfZnJlcT09JWRcbiIsdGVzdF9hcmdfM19mcmVxKTsKCXByaW50ZigidGVzdF9hcmdfNF9zdGVwX3N0YXR1cz09JWRcbiIsdGVzdF9hcmdfNF9zdGVwX3N0YXR1cyk7CglwcmludGYoInRlc3RfYXJnXzVfYm9vdHRpbWVzPSVkXG4iLG51bV9hcnJheVs1XSk7CglwcmludGYoInRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0lZFxuIixudW1fYXJyYXlbNl0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ183X21hZ2ljX251bWJlcj0lZFxuIixudW1fYXJyYXlbN10pOwoKCgoJaWYoKHRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPT1ETUNfU1RJQ0tZX01BR0lDXzEpKSAvL2ZvciBjaGVjayBtYWdpYyBudW1iZXIgbWFrZSBzdW1lIGVudGVyIHRlc3QgY29tbWFuZAoJe3Rlc3RfYXJnXzVfYm9vdHRpbWVzKys7CgoJfQoJZWxzZQoJe3Rlc3RfYXJnXzVfYm9vdHRpbWVzPTA7CgkJdGVzdF9hcmdfMl9zdGVwPTA7CgkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7CgkJdGVzdF9hcmdfN19tYWdpY19udW1iZXI9RE1DX1NUSUNLWV9NQUdJQ18xOwoJfQoJcHJpbnRmKCJib290IHRpbWVzPT0lZFxuIix0ZXN0X2FyZ181X2Jvb3R0aW1lcyk7CgludW1fYXJyYXlbMF0JPQl0ZXN0X2FyZ18wX2NtZDAJCTsKCW51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfY21kMQkJOwoJbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYm9vdHRpbWVzCQk7CgludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCW51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgoJZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJewoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCX0KCgoKCWlmKHRlc3RfYXJnXzJfc3RlcCkKCXsKCQlpZih0ZXN0X2FyZ18zX2ZyZXEhPWdsb2JhbF9kZHJfY2xrKSAgLy8KCQl7CgkJCXByaW50ZigicnVubmluZyBkZHIgZnJlcT09JWQsYnV0IHRlc3QgZnJlcSBpcyVkLHdpbGwgcmVib290IHVzZSBkMnBsbCBcbiIsZ2xvYmFsX2Rkcl9jbGssdGVzdF9hcmdfM19mcmVxKTsKCQkJc3ByaW50ZihzdHIsImQycGxsICAlZCIsdGVzdF9hcmdfM19mcmVxKTsKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCXdoaWxlKDEpOwoJCX0KCX0KCWlmKHRlc3RfYXJnXzJfc3RlcD09MCkKCXsKCQl7CgkJCXRlc3RfYXJnXzBfY21kMD0wWDMxOy8vRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9XSU5ET1c7CgkJCXRlc3RfYXJnXzFfY21kMT0wOwoJCQl0ZXN0X2FyZ18yX3N0ZXA9MTsKCQkJdGVzdF9hcmdfM19mcmVxPWdsb2JhbF9kZHJfY2xrOwoJCQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPTA7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1sY2Rscl9taW47CgkJCW51bV9hcnJheVswXQk9CXRlc3RfYXJnXzBfY21kMAkJOwoJCQludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX2NtZDEJCTsKCQkJbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgkJCW51bV9hcnJheVszXQk9CXRlc3RfYXJnXzNfZnJlcQkJOwoJCQludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYm9vdHRpbWVzCQk7CgkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCQkJZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJCQl7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCgkJCS8vZm9yICh0ZW1wX2NvdW50ID0gODsgdGVtcF9jb3VudDwgNDg7dGVtcF9jb3VudCsrKSB7CgkJCS8vCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJLy99CgoJCQlmb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50IDwgKDMyKzgpOyB0ZW1wX2NvdW50KyspICAgLy9kYXRhCgkJCXsKCQkJCS8vcHJpbnRmKCIxdGVtcF9jb3VudD0lZFxuIix0ZW1wX2NvdW50KTsKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsKCQkJCQkvL3ByaW50ZigiMnRlbXBfY291bnQ9JWRcbiIsdGVtcF9jb3VudCk7CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOCk+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoKCQkJCX0KCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0xKSAgLy9taW4KCQkJCXsJCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPTA7CgkJCQl9CgkJCQlpZigodGVtcF9jb3VudCU0KT09MikgLy9tYXgKCQkJCXsJCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWFjbWRscjsKCQkJCX0KCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0zKSAvL3N0YXR1cwoJCQkJewkKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCX0KCgoJCQl9CgoJCQlmb3IgKHRlbXBfY291bnQgPSAzMis4OyB0ZW1wX2NvdW50IDwgKDMyKzgrOCk7IHRlbXBfY291bnQrKykgIC8vYWRkCgkJCXsKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsJCgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LCgodGVtcF9jb3VudC04LTMyKT4+MiksbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCk7CgoJCQkJfQoJCQkJaWYoKHRlbXBfY291bnQlNCk9PTEpICAvL21pbgoJCQkJewkKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCX0KCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0yKSAvL21heAoJCQkJewkKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudF09YWNtZGxyKjM7CgkJCQkJaWYodGVtcF9jb3VudD09KDMyKzgrNCsyKSkKCQkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPTB4M2Y7Ly9iZGxyMCBtYXggdmFsdWUKCQkJCX0KCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0zKSAvL3N0YXR1cwoJCQkJewkKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCX0KCgoJCQl9CgoKCgojaWYgIChDT05GSUdfRERSX1BIWTw9UF9ERFJfUEhZXzkwNVgpCgkJCXByaW50ZigiRERSMF9QVUJfRFgwR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMEdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgxR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgyR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSk7CgkJCXByaW50ZigiRERSMF9QVUJfRFgzR0NSMD09JXhcbiIsKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSk7CgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwxOyAgICAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMUdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDEpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYMkdDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDIpOyAgIAoJCQlpZigoKHJlYWRsKEREUjBfUFVCX0RYM0dDUjApKSYxKT09MCkKCQkJCWxhbmVfZGlzYWJsZT0gICBsYW5lX2Rpc2FibGV8KDE8PDMpOyAgIAoKI2VuZGlmCgkJCWlmKGxhbmVfZGlzYWJsZSkKCQkJe2lmKGxhbmVfZGlzYWJsZSYweDEpewoJCQkJCQkJCQkgbnVtX2FycmF5WzgrM109MHhmZmZmOwoJCQkJCQkJCQkgbnVtX2FycmF5WzgrNCszXT0weGZmZmY7CgkJCQkJCQkJIH0KCQkJaWYobGFuZV9kaXNhYmxlJjB4Mil7CgkJCQludW1fYXJyYXlbOCszKzhdPTB4ZmZmZjsKCQkJCW51bV9hcnJheVs4KzQrMys4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4NCl7CgkJCQludW1fYXJyYXlbOCszKzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDgpewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJcHJpbnRmKCJsYW5lX2Rpc2FibGU9PSV4XG4iLGxhbmVfZGlzYWJsZSk7CgkJCWlmKGxhbmVfZGlzYWJsZSYweDEwKXsKCQkJCW51bV9hcnJheVs4KzMrOCs4KzgrOF09MHhmZmZmOwoJCQl9CgkJCWlmKGxhbmVfZGlzYWJsZSYweDIwKXsKCQkJCW51bV9hcnJheVs4KzQrMys4KzgrOCs4XT0weGZmZmY7CgoJCQl9CgkJCX0KCgoJCX0KCgoKCgkJZm9yICh0ZW1wX2NvdW50PSAwOyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCX0KCgl0ZXN0X2FyZ18yX3N0ZXArKzsKCW51bV9hcnJheVsyXT10ZXN0X2FyZ18yX3N0ZXA7Cglmb3IgKHRlbXBfY291bnQgPSAxOyB0ZW1wX2NvdW50IDwgNDg7IHRlbXBfY291bnQrKykgCgl7CgkJcHJpbnRmKCIlZCAgJWRcbiIsIHRlbXBfY291bnQsbnVtX2FycmF5W3RlbXBfY291bnRdKTsKCX0KCXRlbXBfY291bnQ9MjsKCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkvL2ZvciAoaSA9IDA7IGkgPCA0ODsgaSsrKSB7CgoJLy8JIHdyaXRlbChudW1fYXJyYXlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkvL30KCgoJLy9mb3IgKGkgPSA4OyBpIDwgNDg7IGkrKykgewoJLy9udW1fYXJyYXlbaV09cmVhZGwoKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7CgkvL3ByaW50ZigiZGRyX3Rlc3RfZGF0YV9udW1fJTA0ZD09JWRcbiIsaSxudW1fYXJyYXlbaV0pOwoJLy99CgoJLy8vKgoJdW5zaWduZWQgaW50IGxhbmVfc3RlcD0wOwoKCXByaW50ZigiXG5zdGFydCBsb29wIHRlc3RcbiIpOwoKCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDEwKTsobGFuZV9zdGVwKyspKSAgIC8vZmluZCBuZWVkIHRlc3QgZGF0YSBzdGVwCgl7CgkJaWYoKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSszKzhdPDB4NCkpCgkJe2JyZWFrOwoJCX0KCX0KCXByaW50ZigiXG5zdGFydCAgdGVzdCBsYW5lX3N0ZXAgPSVkXG4iLGxhbmVfc3RlcCk7CglpZihsYW5lX3N0ZXA8MTApCgl7CgkJaWYobGFuZV9zdGVwPDgpCgkJewoJCQl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkJCWRkcl90ZXN0X3NpemU9ZGRyX2RhdGFfdGVzdF9zaXplOwoJCQlsY2Rscl9taW49MDsKCQkJbGNkbHJfbWF4PShudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly9kb19kZHJfcmVhZF9hY21kbHIoKTsKCQl9CgkJZWxzZQoJCXsKCQkJdGVzdF93YXRjaGRvZ190aW1lX3M9YWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfczsKCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfYWRkX3Rlc3Rfc2l6ZTsKCQkJbGNkbHJfbWluPTA7CgkJCWxjZGxyX21heD0obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJfQoKCQlpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTApKSAgIC8vdGVzdCBsZWZ0IGVkZ2UgYmVnaW4KCQl7CgkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTE7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1sY2Rscl9taW47CgkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgoJCQl0ZW1wX2NvdW50PTY7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJaWYobGFuZV9zdGVwPDgpCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MjsgIC8vbGVmdCBmaW5pc2gKCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgoKCgkJCX0KCQl9CgkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTEpKSAgIC8vdGVzdCBsZWZ0IGVkZ2Ugb25nb2luZyAgICAtbG9vcAoJCXsKCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MTsKCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50Kys7CgkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgoJCQl0ZW1wX2NvdW50PTY7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJaWYobGFuZV9zdGVwPDgpCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0yOyAgLy9sZWZ0IGZpbmlzaAoKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQludW1fYXJyYXlbdGVtcF9jb3VudF09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7CgkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCgoKCQkJfQoJCX0KCQllbHNlIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09MikpICAgLy90ZXN0IHJpZ2h0IGVkZ2UgYmVnaW4KCQl7CgkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTM7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1sY2Rscl9tYXg7CgkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgoJCQl0ZW1wX2NvdW50PTY7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJaWYobGFuZV9zdGVwPDgpCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT00OyAgLy9yaWdodCBmaW5pc2gKCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgoKCgkJCX0KCQl9CgkJZWxzZSBpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTMpKSAgIC8vdGVzdCByaWdodCBlZGdlIG9uZ29pbmcgICAgLWxvb3AKCQl7CgkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTM7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudC0tOwoJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoKCQkJdGVtcF9jb3VudD02OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109NDsgIC8vcmlnaHQgZmluaXNoCgoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsKCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoKCgoJCQl9CgkJfQoJfQoKCWlmKGxhbmVfc3RlcD49MTApIC8vZmluaXNoCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7Cgl9CgoJLy8gdW5zaWduZWQgaW50ICAgYWNtZGxyPSAwOwoJdW5zaWduZWQgaW50ICBkZWxheV9zdGVwX3gxMDA9IDA7CgoJewoJCS8vYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXSwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XSk7CgkJfQoJCWxhbmVfc3RlcD00OwoJCXsKCQkJcHJpbnRmKCJcbmFjX2xhbmVfMHglMDh4fGxjZF9vcmcgMHglMDh4ICB8bGNkX21pbiAweCUwOHggfGxjZF9tYXggMHglMDh4IDo6fGJkbHJfb3JnICAweCUwOHggIHxiZGxyX21pbiAweCUwOHggfGJkbHJfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCQl7CgkJCXByaW50ZigiXG4gYWNfbGFuZV8weDAwMDAwMDB8ICBsY2Rscl9vcmcgIHxsY2Rscl9zZXQgcHN8bGNkbHJfaG9sZCBwczp8XAoJCQkJCWNsa19zZXR1cCAgcHN8IGNsa19ob2xkIHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCQkJcHJpbnRmKCJcbiBhY19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKTsKCQkJcHJpbnRmKCJcbiBja19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLAoJCQkJCTAsCgkJCQkJMCwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKTsKCQl9CgkJcHJpbnRmKCJcbiBhX2xhbmVfMHgwMDAwMDAwMHwgd3JkcV9vcmcgMHgwfHdfc2V0dXAgeCBwc3x3X2hvbGQgIHggcHM6OnxcCgkJCQlyZF9zZXR1cCAgcHN8cmRfaG9sZCB4IHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKTsKCgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLAoJCQkJCTAsCgkJCQkJMCwKCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKTsKCgoKCQl9Cgl9CgoJdGVzdF9hcmdfMl9zdGVwPTB4MTAwMDA7CgludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoKCgoJdGVtcF9jb3VudD0yOwoJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJcmV0dXJuIDE7Cn0KCgppbnQgZG9fZGRyX3Vib290X2tlcm5lbF93aW5kb3dfdXNlX3NvdXJjZV9xdWlja19tZXRob2QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgkvL3NldGVudiBzdG9yZWJvb3QgImRkcl90ZXN0X2NtZCAweDMzIDIgNiAgMjAgMCAweDEwMDAwMCAweDQwMDAwMDAiCglwcmludGYoIlxuc2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MzMgMiA2ICAyMCAwIDB4MTAwMDAwIDB4NDAwMDAwMCBcbiIpOwoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSBmdW5jdGlvblxuIik7CglwcmludGYoIlxuLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKI2RlZmluZSBERFJfVEVTVF9OVUxMICAwCiNkZWZpbmUgRERSX1RFU1RfUEFTUyAgMQojZGVmaW5lIEREUl9URVNUX0ZBSUwgMgoKI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgICA0ICAvLyBQUkVHX1NUSUNLWV9SRUc0CiNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICAgIDUgIC8vNDUvLyBQUkVHX1NUSUNLWV9SRUc0CgkvL1BSRUdfU1RJQ0tZX1JFRzUKCgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HICAgMQojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0ggMgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HICAzCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0ggNAoKI2RlZmluZSBERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yICAgMSAgIC8vQUIgTUVUSE9EICBBIGlzIGZhaWxpbmcgQiBpcyBwYXNzaW5nIHZhbHVlCiNkZWZpbmUgRERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFICAgMgoKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgICBsYW5lX2Rpc2FibGU9IDA7Cgl1bnNpZ25lZCBpbnQgICBkYXRhX3NvdXJjZT0gMDsKCXVuc2lnbmVkIGludCAgZGRyX2RhdGFfdGVzdF9tZXRob2Q9RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMjsKCXVuc2lnbmVkIGludCAgZGRyX2FkZF90ZXN0X21ldGhvZD1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9tZXRob2Q9RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMjsKCgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3Rfc2l6ZT0weDEwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9zaXplPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCgl1bnNpZ25lZCBpbnQgIGFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7ICAvL2ZvciBxdWljayBvdXQgb2YgZXJyb3IKCWlmIChhcmdjID4xKSB7CgkJZGF0YV9zb3VyY2UgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGF0YV9zb3VyY2U9IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMTU7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkvL3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CglpZiAoYXJnYyA+MykgewoJCWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz0gd2F0Y2hkb2dfdGltZV9zOwoJCX0KCX0KCXByaW50ZigiYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz09JWRcbiIsYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkvL2xhbmVfZGlzYWJsZT1nX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX3Rlc3RfbGFuZV9kaXNhYmxlOwoJaWYgKGFyZ2MgPjQpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsgICAKCglpZiAoYXJnYyA+NSkgewoJCWRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZGF0YV90ZXN0X3NpemU9IDB4MTAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2RhdGFfdGVzdF9zaXplKTsKCWlmIChhcmdjID42KSB7CgkJZGRyX2FkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X3NpemU9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9zaXplKTsKCWlmIChhcmdjID43KSB7CgkJZGRyX2RhdGFfdGVzdF9tZXRob2QgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2RhdGFfdGVzdF9tZXRob2Q9IEREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7CgkJfQoJfQoJcHJpbnRmKCJkZHJfZGF0YV90ZXN0X21ldGhvZD09MHglMDh4XG4iLGRkcl9kYXRhX3Rlc3RfbWV0aG9kKTsKCWlmIChhcmdjID44KSB7CgkJZGRyX2FkZF90ZXN0X21ldGhvZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfYWRkX3Rlc3RfbWV0aG9kPSBERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoJCX0KCX0KCXByaW50ZigiZGRyX2FkZF90ZXN0X21ldGhvZD09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9tZXRob2QpOwoKCXVuc2lnbmVkIGludCByYW5rX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4PTEwMDsKCXVuc2lnbmVkIGludCBudW1fYXJyYXlbMTAwXTsvLzggZmxhZyAzMl9kYXRhIGFkZF84ICAzMl9kYXRhIGFkZF84CgoJdW5zaWduZWQgaW50IHRlbXBfdGVzdF9lcnJvcj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21pbj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJbWVtc2V0KG51bV9hcnJheSwgMCwgc2l6ZW9mKG51bV9hcnJheSkpOwoJY2hhciBzdHJbMTAyNF09IiI7CgoJaWYoZGF0YV9zb3VyY2U9PUREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSkKCQlkZHJfdGVzdF9kYXRhX2FycmF5X21heD02NDsKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg7IHRlbXBfY291bnQrKykgCgl7CgkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEICk7CgkJcHJpbnRmKCJyZWFkIG51bWFycnlbJWRdPT0lZFxuIix0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9CgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZSA9MDsgIC8vYmVzdF9sY2Rscl92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnID0wOyAgLy9taW4gY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgIFVCT09UIE9OR09JTkcgIDIgVUJPT1QgRklOSVNIICAzIEtFUk5FTCBPTkdPSU5HIDQgS0VSTkVMIEZJTklTSAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X21hZ2ljX251bWJlciA9MDsKCXVuc2lnbmVkIGludCBvcmdfbGNkbHJfdmFsdWVfdGVtcD0wOwoJdW5zaWduZWQgaW50IGFjbWRscj0wOwoJYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoKCXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT1udW1fYXJyYXlbMF07Cgl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZz1udW1fYXJyYXlbMV07Cgl0ZXN0X2FyZ18yX3N0ZXA9bnVtX2FycmF5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJheVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycmF5WzRdOwoJdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPW51bV9hcnJheVs1XTsKCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyYXlbNl07Cgl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1udW1fYXJyYXlbN107CglwcmludGYoInRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT09JWRcbiIsdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlKTsKCXByaW50ZigidGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9PSVkXG4iLHRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnKTsKCXByaW50ZigidGVzdF9hcmdfMl9zdGVwPT0lZFxuIix0ZXN0X2FyZ18yX3N0ZXApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18zX2ZyZXE9PSVkXG4iLHRlc3RfYXJnXzNfZnJlcSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9PSVkXG4iLHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMpOwoJcHJpbnRmKCJ0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9JWRcbiIsbnVtX2FycmF5WzVdKTsKCXByaW50ZigidGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSVkXG4iLG51bV9hcnJheVs2XSk7CglwcmludGYoInRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPSVkXG4iLG51bV9hcnJheVs3XSk7CgoKCglpZigodGVzdF9hcmdfN19tYWdpY19udW1iZXI9PURNQ19TVElDS1lfTUFHSUNfMSkpIC8vZm9yIGNoZWNrIG1hZ2ljIG51bWJlciBtYWtlIHN1bWUgZW50ZXIgdGVzdCBjb21tYW5kCgl7Cgl9CgllbHNlCgl7CgoJCXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT0wOwoJCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT0wOwoJCXRlc3RfYXJnXzJfc3RlcD0wOwoJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCX0KCS8vcHJpbnRmKCJib290IHRpbWVzPT0lZFxuIix0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUpOwoJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlCQk7CgludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOwoJbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCXsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7Cgl9CgoKCglpZih0ZXN0X2FyZ18yX3N0ZXApCgl7CgkJaWYodGVzdF9hcmdfM19mcmVxIT1nbG9iYWxfZGRyX2NsaykgIC8vCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgkJewoKCgoJCQl0ZXN0X2FyZ18wX2FiX2Jlc3RfbGNkbHJfdmFsdWU9MDsKCQkJdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9MDsKCQkJdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HOwoJCQl0ZXN0X2FyZ18zX2ZyZXE9Z2xvYmFsX2Rkcl9jbGs7CgkJCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9MDsKCQkJdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPTA7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1sY2Rscl9taW47CgkJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCQkJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlCQk7CgkJCW51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7CgkJCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCW51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgoKCQkJZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJCQl7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCS8vIAkgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgLHRlc3RfYXJnXzJfc3RlcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJLy9mb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJLy8JCW51bV9hcnJheVt0ZW1wX2NvdW50XT0wOwoJCQkvL30KCgkJCWZvciAodGVtcF9jb3VudCA9IDg7IHRlbXBfY291bnQgPCAoMzIrOCk7IHRlbXBfY291bnQrKykgICAvL2RhdGEKCQkJewoJCQkJLy9wcmludGYoIjF0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsKCQkJCQlpZigoKHRlbXBfY291bnQtOCkvNCk8OCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD0oZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vaWYobGFuZV9zdGVwPT05KQoJCQkJCQkvL2xjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJfQoJCQkJCWVsc2UgaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDEwKSAgCgkJCQkJewoJCQkJCQlsY2Rscl9taW49MDsKCQkJCQkJbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQlpZigoKHRlbXBfY291bnQtOCkvNCk9PTkpCgkJCQkJCQlsY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQkvL3ByaW50ZigiMnRlbXBfY291bnQ9JWRcbiIsdGVtcF9jb3VudCk7CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOCk+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzFdPWxjZGxyX21pbjsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsyXT1sY2Rscl9tYXg7Ly9udW1fYXJyYXlbdGVtcF9jb3VudF07CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrM109MDsKCQkJCQkvL3RlbXBfY291bnQ9dGVtcF9jb3VudCs0OwoJCQkJfQoKCgoJCQl9CgoJCQlmb3IgKHRlbXBfY291bnQgPSAzMis4OyB0ZW1wX2NvdW50IDwgKDMyKzgrOCk7IHRlbXBfY291bnQrKykgIC8vYWRkCgkJCXsKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsJCgkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDgpICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQllbHNlIGlmKCgodGVtcF9jb3VudC04KS80KTwxMCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPT05KQoJCQkJCQkJbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LCgodGVtcF9jb3VudC04LTMyKT4+MiksbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrMV09bGNkbHJfbWluOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzJdPWxjZGxyX21heDsvL251bV9hcnJheVt0ZW1wX2NvdW50XTsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCszXT0wOwoJCQkJfQoKCgkJCX0KCgoKCiNpZiAgKENPTkZJR19ERFJfUEhZPD1QX0REUl9QSFlfOTA1WCkKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDBHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDFHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDJHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDNHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpKTsKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDBHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfDE7ICAgICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8MSk7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Mik7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Myk7ICAgCgojZW5kaWYKCQkJaWYobGFuZV9kaXNhYmxlKQoJCQl7aWYobGFuZV9kaXNhYmxlJjB4MSl7CgkJCQkJCQkJCSBudW1fYXJyYXlbOCszXT0weGZmZmY7CgkJCQkJCQkJCSBudW1fYXJyYXlbOCs0KzNdPTB4ZmZmZjsKCQkJCQkJCQkgfQoJCQlpZihsYW5lX2Rpc2FibGUmMHgyKXsKCQkJCW51bV9hcnJheVs4KzMrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzhdPTB4ZmZmZjsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHg0KXsKCQkJCW51bV9hcnJheVs4KzMrOCs4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4OCl7CgkJCQludW1fYXJyYXlbOCszKzgrOCs4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4KzhdPTB4ZmZmZjsKCQkJfQoJCQlwcmludGYoImxhbmVfZGlzYWJsZT09JXhcbiIsbGFuZV9kaXNhYmxlKTsKCQkJaWYobGFuZV9kaXNhYmxlJjB4MTApewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4MjApewoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4KzhdPTB4ZmZmZjsKCgkJCX0KCQkJfQoKCgkJfQoKCgoKCQlmb3IgKHRlbXBfY291bnQ9IDA7IHRlbXBfY291bnQ8IDQ4O3RlbXBfY291bnQrKykgewoJCQludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJfQoJfQoKCS8vdGVzdF9hcmdfMl9zdGVwKys7CgludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoJZm9yICh0ZW1wX2NvdW50ID0gMTsgdGVtcF9jb3VudCA8IDQ4OyB0ZW1wX2NvdW50KyspIAoJewoJCXByaW50ZigiJWQgICVkXG4iLCB0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9Cgl0ZW1wX2NvdW50PTI7CgludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy8JIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJLy8gCSBERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsdGVzdF9hcmdfMl9zdGVwLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy9mb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoKCS8vCSB3cml0ZWwobnVtX2FycmF5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJLy99CgoKCS8vZm9yIChpID0gODsgaSA8IDQ4OyBpKyspIHsKCS8vbnVtX2FycmF5W2ldPXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJLy9wcmludGYoImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQ9PSVkXG4iLGksbnVtX2FycmF5W2ldKTsKCS8vfQoKCS8vLyoKCXVuc2lnbmVkIGludCBsYW5lX3N0ZXA9MDsKCglwcmludGYoIlxuc3RhcnQgbG9vcCB0ZXN0XG4iKTsKCglmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkgICAvL2ZpbmQgbmVlZCB0ZXN0IGRhdGEgc3RlcAoJewoJCWlmKHRlc3RfYXJnXzJfc3RlcDxERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORykKCQl7CgkJCWlmKChudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMys4XTwoMHg0KSkpCgkJCXticmVhazsKCQkJfQoJCX0KCX0KCglpZih0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HKQoJe2lmKGxhbmVfc3RlcD45KQoJCXsKCQkJdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0g7CgkJCXByaW50ZigidWJvb3QgdGVzdCByZXN1bHQ6IFxuIik7CgkJfQoJfQoKCWlmKHRlc3RfYXJnXzJfc3RlcD5ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIKQoJewoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDEwKTsobGFuZV9zdGVwKyspKSAgIC8vZmluZCBuZWVkIHRlc3QgZGF0YSBzdGVwCgkJewoKCQkJewoJCQkJaWYoKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSszKzhdPCgweDQrNCkpKQoJCQkJe2JyZWFrOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWlmKHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCkvL3x8KHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0gpCgl7CgkJLy90ZXN0X2FyZ18yX3N0ZXA9RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkc7Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJcbnN0YXJ0ICB0ZXN0IGxhbmVfc3RlcCA9JWRcbiIsbGFuZV9zdGVwKTsKCQlpZihsYW5lX3N0ZXA8MTApCgkJewoJCQlpZihsYW5lX3N0ZXA8OCkKCQkJewoJCQkJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJCQkJZGRyX3Rlc3Rfc2l6ZT1kZHJfZGF0YV90ZXN0X3NpemU7CgkJCQlkZHJfdGVzdF9tZXRob2Q9ZGRyX2RhdGFfdGVzdF9tZXRob2Q7CgkJCQkvL2xjZGxyX21pbj0wOwoJCQkJLy9sY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly9kb19kZHJfcmVhZF9hY21kbHIoKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXRlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CgkJCQlkZHJfdGVzdF9zaXplPWRkcl9hZGRfdGVzdF9zaXplOwoJCQkJZGRyX3Rlc3RfbWV0aG9kPWRkcl9hZGRfdGVzdF9tZXRob2Q7CgkJCQkvL2xjZGxyX21pbj0wOwoJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJLy9pZihsYW5lX3N0ZXA9PTkpCgkJCQkvL2xjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCX0KCgkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpICAvL2Zyb20ga2VybmVsIAoJCQl7CgkJCQludW1fYXJyYXlbMV09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCS8vIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgkJCWlmKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTApKXx8KChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NCkpKSAgIC8vdGVzdCBsZWZ0IGVkZ2UgYmVnaW4KCQkJewoJCQkJLyoKCQkJCSAgIG51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7Ly8xIHBhc3MgMiBlcnJvcgoJCQkJICAgbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgkJCQkgICBudW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJCSAgIG51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCQkJCSAgIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJCQkJICAgbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCQkgICBudW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoJCQkJICAgKi8KCQkJCS8vICAgICAgICAgdGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXSk7CgkJCQkvLwkgbnVtX2FycmF5WzBdPXRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZTsKCQkJCS8vCSB0ZW1wX2NvdW50PTA7CgkJCQkvLwkgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJLy8gCSB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQl0ZW1wX2NvdW50PTE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJewoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzVdPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk7ICAvL2VkZ2UgbGNkbHIKCQkJCXRlbXBfY291bnQ9NTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsgIAoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKT4+MSk7CgkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcF9sY2RscgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsICAvL3RlbXBfbGNkbHIKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXSsxKTsKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIC8vbGFuZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQl7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJfQoJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkvL2hlcmUgd2lsbCBkZWFkCgoJCQkJewoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCX0KCQkJCS8vaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgoKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQl7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQl7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0xKXx8KChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NSkpKSAgIC8vdGVzdCBsZWZ0IGVkZ2UgYmVnaW4pICAgLy90ZXN0IGxlZnQgZWRnZSBvbmdvaW5nICAgIC1sb29wCgkJCXsKCgkJCQlpZigobnVtX2FycmF5WzZdKzEpPj0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pKQoJCQkJewoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJCX0KCgoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPSBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXSsxOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzM7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQludW1fYXJyYXlbNV09MDsgIC8vdXBkYXRlIGVkZ2UgbGNkbHIKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XSsxOyAgIC8vdXBkYXRlIEIKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgICAvL3VwZGF0ZSBCCgkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJLy8JbnVtX2FycmF5WzFdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJLy8gRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgkJCQkJLy8gIHRlc3RfYXJnXzBfYWJfYmVzdF9sY2Rscl92YWx1ZT0wOy8vKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsKCQkJCQkvLyBudW1fYXJyYXlbMF09dGVzdF9hcmdfMF9hYl9iZXN0X2xjZGxyX3ZhbHVlOwoJCQkJCS8vIHRlbXBfY291bnQ9MDsKCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7IAoJCQkJCXdoaWxlKDEpOwoKCQkJCX0KCQkJCWVsc2UgCgkJCQl7IAoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJCX0KCQkJCQllbHNlICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJewoKCgoJCQkJCQl7CgkJCQkJCQkvLyAgIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7CgkJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgkJCQkJCQkvLyAgIHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsgICAvL3VwZGF0ZSBCCgkJCQkJCQkvLyB0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQl7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoKCgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCXsKCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCgoJCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbHNlCSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCXsKCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIG1pbiB2YWx1ZQoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXSk+PjEpOwoJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKSsxKTsKCQkJCQkJLy8gICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tdXBkYXRlIGN1cmVudAoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCXsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCXsKCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCXsKCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgoJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoKCgkJCX0KCgkJCWVsc2UgIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09Mil8fCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109PTYpKSkgICAvL3Rlc3QgcmlnaHQgZWRnZSBiZWdpbgoJCQl7CgkJCQkvKgoJCQkJICAgbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsvLzEgcGFzcyAyIGVycm9yCgkJCQkgICBudW1fYXJyYXlbMl0JPQl0ZXN0X2FyZ18yX3N0ZXAJCTsKCQkJCSAgIG51bV9hcnJheVszXQk9CXRlc3RfYXJnXzNfZnJlcQkJOwoJCQkJICAgbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQkJICAgbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlCQk7CgkJCQkgICBudW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCQkJCSAgIG51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgkJCQkgICAqLwoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQl0ZW1wX2NvdW50PTE7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJewoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCgoJCQkJbnVtX2FycmF5WzVdPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdOy8vbGNkbHJfbWF4OyAgLy9lZGdlIGxjZGxyCgkJCQl0ZW1wX2NvdW50PTU7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsvLwoJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7CgkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSktMSk7CgkJCQkvL3Rlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcF9sY2RscgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsICAvL3RlbXBfbGNkbHIKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdKzE7CgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAvL2xhbmUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgoJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQl3aGlsZSgxKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQl7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoKCQkJCX0KCQkJfQoJCQllbHNlIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09Myl8fChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NykpICAgLy90ZXN0IHJpZ2h0IGVkZ2Ugb25nb2luZyAgICAtbG9vcAoJCQl7CgoJCQkJaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKzEpPj0obnVtX2FycmF5WzZdKSkKCQkJCXsKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109IG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdKzE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCW51bV9hcnJheVs1XT0wOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbNl0tMTsgICAvL3VwZGF0ZSBCCgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbNl07ICAgLy91cGRhdGUgQgoJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PTA7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCXRlbXBfY291bnQ9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRlc3QgZXJyb3IgZmxhZwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOyAKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UgCgkJCQl7IAoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJCX0KCQkJCQllbHNlICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJewoKCgoJCQkJCQl7CgkJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJCQludW1fYXJyYXlbNV09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCQkJdGVtcF9jb3VudD01OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJCQkJLy8gIHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsgICAvL3VwZGF0ZSBCCgkJCQkJCQkvLyB0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQl7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoKCgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCXsKCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQkJewoJCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJCX0KCgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWVsc2UJICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJewoJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0zOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgbWF4IHZhbHVlCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7CgkJCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0UpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJCQkvLyAgICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tdXBkYXRlIGN1cmVudAoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJewoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQl7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQl7CgkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJfQoKCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoKCQkJCQkJfQoKCQkJCQl9CgkJCQl9CgoKCQkJfQoJCX0KCX0KCWlmKGxhbmVfc3RlcD49MTApIC8vZmluaXNoCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQlwcmludGYoImNsb3NlICB3YXRjaGRvZ1xuIik7Cgl9CgoJLy8gdW5zaWduZWQgaW50ICAgYWNtZGxyPSAwOwoJdW5zaWduZWQgaW50ICBkZWxheV9zdGVwX3gxMDA9IDA7CgoJewoJCS8vYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCXByaW50ZigiXG5hY21kbHI9MHglMDh4LS0+ZGVjICVkLGRkciBjbGs9PSVkLHN0ZXA9JWQgcHMsMTBzdGVwPSVkIHBzLDEwMHN0ZXA9JWQgcHMsXG4iLGFjbWRscixhY21kbHIsZ2xvYmFsX2Rkcl9jbGssCgkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCQlmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDw0KTsobGFuZV9zdGVwKyspKQoJCXsKCQkJcHJpbnRmKCJcbiBhX2xhbmVfMHglMDh4fHdkcV9vcmcgMHglMDh4ICB8d2RxX21pbiAweCUwOHggfHdkcV9tYXggMHglMDh4IDo6fHJkcXNfb3JnICAweCUwOHggIHxyZHFzX21pbiAweCUwOHggfHJkcXNfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsyXSwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XSk7CgkJfQoJCWxhbmVfc3RlcD00OwoJCXsKCQkJcHJpbnRmKCJcbmFjX2xhbmVfMHglMDh4fGxjZF9vcmcgMHglMDh4ICB8bGNkX21pbiAweCUwOHggfGxjZF9tYXggMHglMDh4IDo6fGJkbHJfb3JnICAweCUwOHggIHxiZGxyX21pbiAweCUwOHggfGJkbHJfbWF4IDB4JTA4eCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCQl7CgkJCXByaW50ZigiXG4gYWNfbGFuZV8weDAwMDAwMDB8ICBsY2Rscl9vcmcgIHxsY2Rscl9zZXQgcHN8bGNkbHJfaG9sZCBwczp8XAoJCQkJCWNsa19zZXR1cCAgcHN8IGNsa19ob2xkIHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCQkJcHJpbnRmKCJcbiBhY19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKTsKCQkJcHJpbnRmKCJcbiBja19sYW5lMHglMDh4fCAweCUwOHggIHwgICAlMDhkIHwgICAlMDhkIDo6fCAgICAlMDhkIHwgICAlMDhkIHwgICAlMDhkICBcbiIsCgkJCQkJNCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLAoJCQkJCTAsCgkJCQkJMCwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs2XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKTsKCQl9CgkJcHJpbnRmKCJcbiBhX2xhbmVfMHgwMDAwMDAwMHwgd3JkcV9vcmcgMHgwfHdfc2V0dXAgeCBwc3x3X2hvbGQgIHggcHM6OnxcCgkJCQlyZF9zZXR1cCAgcHN8cmRfaG9sZCB4IHBzfGFkal9wZXJjZW50WzEwMF1cbiIpOwoKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgoJCQkJCTAsCgkJCQkJMCwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKTsKCgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCWxhbmVfc3RlcCwKCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdLAoJCQkJCTAsCgkJCQkJMCwKCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkxMDAqKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkvKAoJCQkJCQkyKm51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKTsKCgoKCQl9Cgl9CgoKCWlmKHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCkvL3x8KHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0gpCgl7CgkJdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HOwoJCW51bV9hcnJheVsyXT10ZXN0X2FyZ18yX3N0ZXA7CgkJdGVtcF9jb3VudD0yOwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCXdoaWxlKDEpOwoKCX0KCglpZih0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HKS8vfHwodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSCkKCXsKCQl0ZXN0X2FyZ18yX3N0ZXA9RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0g7CgkJbnVtX2FycmF5WzJdPXRlc3RfYXJnXzJfc3RlcDsKCQl0ZW1wX2NvdW50PTI7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCUREUl9URVNUX1NUQVRVU19TVEVQX0ZMQUdfQUREX09SR19TVElDS1lfT0ZGU0VUICx0ZXN0X2FyZ18yX3N0ZXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJbnVtX2FycmF5WzFdPUREUl9URVNUX05VTEw7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCXsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CgoKCgoKCgkvLyBpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCgoKCXJldHVybiAxOwp9CgoKaW50IGRvX2Rkcl91Ym9vdF9rZXJuZWxfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfbWV0aG9kcyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vc2V0ZW52IHN0b3JlYm9vdCAiZGRyX3Rlc3RfY21kIDB4MzQgMiA2ICAyMCAwIDB4MTAwMDAwIDB4NDAwMDAwMCIKCXByaW50ZigiXG5zZXRlbnYgYm9vdGNtZCBkZHJfdGVzdF9jbWQgMHgzNCAyIDYgIDIwIDAgMHgxMDAwMDAgMHg0MDAwMDAwIFxuIik7CglwcmludGYoIlxuRW50ZXIgZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlIGZ1bmN0aW9uXG4iKTsKCXByaW50ZigiXG4tLS0gd2F0Y2hkb2cgc2hvdWxkID4xNXNcbiIpOwojZGVmaW5lIEREUl9URVNUX05VTEwgIDAKI2RlZmluZSBERFJfVEVTVF9QQVNTICAxCiNkZWZpbmUgRERSX1RFU1RfRkFJTCAyCgojZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgIDQgIC8vIFBSRUdfU1RJQ0tZX1JFRzQKI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgICAgNSAgLy80NS8vIFBSRUdfU1RJQ0tZX1JFRzQKCS8vUFJFR19TVElDS1lfUkVHNQoKCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX1VCT09UX09OR09JTkcgICAxCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCAyCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkcgIDMKI2RlZmluZSBERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSCA0CgojZGVmaW5lIEREUl9URVNUX01FVEhPRF9ESVZJREVSXzIgICAxICAgLy9BQiBNRVRIT0QgIEEgaXMgZmFpbGluZyBCIGlzIHBhc3NpbmcgdmFsdWUKI2RlZmluZSBERFJfVEVTVF9NRVRIT0RfREVDUkVBU0UgICAyCiNkZWZpbmUgRERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSAgIDMKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoJdW5zaWduZWQgaW50ICAgZGF0YV9zb3VyY2U9IDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3RfbWV0aG9kPUREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9tZXRob2Q9RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMjsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfbWV0aG9kPUREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7CgoJdW5zaWduZWQgaW50ICBkZHJfZW5hYmxlX2tlcm5lbF93aW5kb3dfdGVzdF9mbGFnPTA7CgoJdW5zaWduZWQgaW50ICBkZHJfZGF0YV90ZXN0X3NpemU9MHgxMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfYWRkX3Rlc3Rfc2l6ZT0weDEwMDAwMDAwOwoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9zaXplPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9sY2Rscl90ZXN0X29mZnNldD0wOwoJLy91bnNpZ25lZCBpbnQgIGRkcl9sY2Rscl90ZXN0X29yZ19zYXZlPTA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MDsKCgl1bnNpZ25lZCBpbnQgIGFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M9MTU7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoKCWVycm9yX291dG9mX2NvdW50X2ZsYWcgPTE7ICAvL2ZvciBxdWljayBvdXQgb2YgZXJyb3IKCWlmIChhcmdjID4xKSB7CgkJZGF0YV9zb3VyY2UgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGF0YV9zb3VyY2U9IEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fVUJPT1RfRU5WOwoJCX0KCX0KCWlmIChhcmdjID4yKSB7CgkJd2F0Y2hkb2dfdGltZV9zID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCXdhdGNoZG9nX3RpbWVfcz0gMTU7CgkJfQoJfQoJcHJpbnRmKCJ3YXRjaGRvZ190aW1lX3M9PSVkXG4iLHdhdGNoZG9nX3RpbWVfcyk7Cgl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkvL3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3M7CglpZiAoYXJnYyA+MykgewoJCWFkZHJlc3NfdGVzdF93YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz0gd2F0Y2hkb2dfdGltZV9zOwoJCX0KCX0KCXByaW50ZigiYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcz09JWRcbiIsYWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkvL2xhbmVfZGlzYWJsZT1nX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX3Rlc3RfbGFuZV9kaXNhYmxlOwoJaWYgKGFyZ2MgPjQpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsgICAKCglpZiAoYXJnYyA+NSkgewoJCWRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZGF0YV90ZXN0X3NpemU9IDB4MTAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2RhdGFfdGVzdF9zaXplKTsKCWlmIChhcmdjID42KSB7CgkJZGRyX2FkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X3NpemU9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9zaXplKTsKCWlmIChhcmdjID43KSB7CgkJZGRyX2RhdGFfdGVzdF9tZXRob2QgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2RhdGFfdGVzdF9tZXRob2Q9IEREUl9URVNUX01FVEhPRF9ESVZJREVSXzI7CgkJfQoJfQoJcHJpbnRmKCJkZHJfZGF0YV90ZXN0X21ldGhvZD09MHglMDh4XG4iLGRkcl9kYXRhX3Rlc3RfbWV0aG9kKTsKCWlmIChhcmdjID44KSB7CgkJZGRyX2FkZF90ZXN0X21ldGhvZCA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfYWRkX3Rlc3RfbWV0aG9kPSBERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yOwoJCX0KCX0KCXByaW50ZigiZGRyX2FkZF90ZXN0X21ldGhvZD09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9tZXRob2QpOwoKCWlmIChhcmdjID45KSB7CgkJZGRyX2VuYWJsZV9rZXJuZWxfd2luZG93X3Rlc3RfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls5XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls5XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZW5hYmxlX2tlcm5lbF93aW5kb3dfdGVzdF9mbGFnPSAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2VuYWJsZV9rZXJuZWxfd2luZG93X3Rlc3RfZmxhZz09MHglMDh4XG4iLGRkcl9lbmFibGVfa2VybmVsX3dpbmRvd190ZXN0X2ZsYWcpOwoKCXVuc2lnbmVkIGludCByYW5rX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgdGVtcF9jb3VudD0wOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4PTEwMDsKCXVuc2lnbmVkIGludCBudW1fYXJyYXlbMTAwXTsvLzggZmxhZyAzMl9kYXRhIGFkZF84ICAzMl9kYXRhIGFkZF84CgoJdW5zaWduZWQgaW50IHRlbXBfdGVzdF9lcnJvcj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21pbj0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJbWVtc2V0KG51bV9hcnJheSwgMCwgc2l6ZW9mKG51bV9hcnJheSkpOwoJY2hhciBzdHJbMTAyNF09IiI7CgoJaWYoZGF0YV9zb3VyY2U9PUREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fRE1DX1NUSUNLWSkKCQlkZHJfdGVzdF9kYXRhX2FycmF5X21heD02NDsKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg7IHRlbXBfY291bnQrKykgCgl7CgkJbnVtX2FycmF5W3RlbXBfY291bnRdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9SRUFEICk7CgkJcHJpbnRmKCJyZWFkIG51bWFycnlbJWRdPT0lZFxuIix0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9CgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZSA9MDsgIC8vYmVzdF9sY2Rscl92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnID0wOyAgLy9taW4gY21kCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfMl9zdGVwID0wOyAvL3N0ZXAgMCAgaW5pdCAgLTEgIFVCT09UIE9OR09JTkcgIDIgVUJPT1QgRklOSVNIICAzIEtFUk5FTCBPTkdPSU5HIDQgS0VSTkVMIEZJTklTSAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzNfZnJlcSA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ183X21hZ2ljX251bWJlciA9MDsKCXVuc2lnbmVkIGludCBvcmdfbGNkbHJfdmFsdWVfdGVtcD0wOwoJdW5zaWduZWQgaW50IGFjbWRscj0wOwoJYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoKCXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT1udW1fYXJyYXlbMF07Cgl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZz1udW1fYXJyYXlbMV07Cgl0ZXN0X2FyZ18yX3N0ZXA9bnVtX2FycmF5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJheVszXTsKCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9bnVtX2FycmF5WzRdOwoJdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPW51bV9hcnJheVs1XTsKCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyYXlbNl07Cgl0ZXN0X2FyZ183X21hZ2ljX251bWJlcj1udW1fYXJyYXlbN107CglwcmludGYoInRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT09JWRcbiIsdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlKTsKCXByaW50ZigidGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9PSVkXG4iLHRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnKTsKCXByaW50ZigidGVzdF9hcmdfMl9zdGVwPT0lZFxuIix0ZXN0X2FyZ18yX3N0ZXApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18zX2ZyZXE9PSVkXG4iLHRlc3RfYXJnXzNfZnJlcSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9PSVkXG4iLHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMpOwoJcHJpbnRmKCJ0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWU9JWRcbiIsbnVtX2FycmF5WzVdKTsKCXByaW50ZigidGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSVkXG4iLG51bV9hcnJheVs2XSk7CglwcmludGYoInRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPSVkXG4iLG51bV9hcnJheVs3XSk7CgoKCglpZigodGVzdF9hcmdfN19tYWdpY19udW1iZXI9PURNQ19TVElDS1lfTUFHSUNfMSkpIC8vZm9yIGNoZWNrIG1hZ2ljIG51bWJlciBtYWtlIHN1bWUgZW50ZXIgdGVzdCBjb21tYW5kCgl7Cgl9CgllbHNlCgl7CgoJCXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT0wOwoJCXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZT0wOwoJCXRlc3RfYXJnXzJfc3RlcD0wOwoJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0wOwoJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCX0KCS8vcHJpbnRmKCJib290IHRpbWVzPT0lZFxuIix0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUpOwoJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlCQk7CgludW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOwoJbnVtX2FycmF5WzJdCT0JdGVzdF9hcmdfMl9zdGVwCQk7CgludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9zdGF0dXMJCTsKCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfYWJfZWRnZV9sY2Rscl92YWx1ZQkJOwoJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X21hZ2ljX251bWJlcgkJOwoKCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCXsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7Cgl9CgoKCglpZih0ZXN0X2FyZ18yX3N0ZXApCgl7CgkJaWYodGVzdF9hcmdfM19mcmVxIT1nbG9iYWxfZGRyX2NsaykgIC8vCgkJewoJCQlwcmludGYoInJ1bm5pbmcgZGRyIGZyZXE9PSVkLGJ1dCB0ZXN0IGZyZXEgaXMlZCx3aWxsIHJlYm9vdCB1c2UgZDJwbGwgXG4iLGdsb2JhbF9kZHJfY2xrLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXNwcmludGYoc3RyLCJkMnBsbCAgJWQiLHRlc3RfYXJnXzNfZnJlcSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQl3aGlsZSgxKTsKCQl9Cgl9CglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgkJewoKCgoJCQl0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9MDsKCQkJdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWc9MDsKCQkJdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HOwoJCQl0ZXN0X2FyZ18zX2ZyZXE9Z2xvYmFsX2Rkcl9jbGs7CgkJCXRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9MDsKCQkJdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlPTA7CgkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1sY2Rscl9taW47CgkJCXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyPURNQ19TVElDS1lfTUFHSUNfMTsKCQkJbnVtX2FycmF5WzBdCT0JdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlCQk7CgkJCW51bV9hcnJheVsxXQk9CXRlc3RfYXJnXzFfdGVzdF9lcnJvcl9mbGFnCQk7CgkJCW51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQludW1fYXJyYXlbM10JPQl0ZXN0X2FyZ18zX2ZyZXEJCTsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50CQk7CgkJCW51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgoKCQkJZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJCQl7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCS8vIAkgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgLHRlc3RfYXJnXzJfc3RlcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJLy9mb3IgKHRlbXBfY291bnQgPSA4OyB0ZW1wX2NvdW50PCA0ODt0ZW1wX2NvdW50KyspIHsKCQkJLy8JCW51bV9hcnJheVt0ZW1wX2NvdW50XT0wOwoJCQkvL30KCgkJCWZvciAodGVtcF9jb3VudCA9IDg7IHRlbXBfY291bnQgPCAoMzIrOCk7IHRlbXBfY291bnQrKykgICAvL2RhdGEKCQkJewoJCQkJLy9wcmludGYoIjF0ZW1wX2NvdW50PSVkXG4iLHRlbXBfY291bnQpOwoKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsKCQkJCQlpZigoKHRlbXBfY291bnQtOCkvNCk8OCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD0oZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vaWYobGFuZV9zdGVwPT05KQoJCQkJCQkvL2xjZGxyX21heD0weDNmOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJfQoJCQkJCWVsc2UgaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDEwKSAgCgkJCQkJewoJCQkJCQlsY2Rscl9taW49MDsKCQkJCQkJbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQlpZigoKHRlbXBfY291bnQtOCkvNCk9PTkpCgkJCQkJCQlsY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQkvL3ByaW50ZigiMnRlbXBfY291bnQ9JWRcbiIsdGVtcF9jb3VudCk7CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwoKHRlbXBfY291bnQtOCk+PjIpLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzFdPWxjZGxyX21pbjsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCsyXT1sY2Rscl9tYXg7Ly9udW1fYXJyYXlbdGVtcF9jb3VudF07CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrM109MDsKCQkJCQkvL3RlbXBfY291bnQ9dGVtcF9jb3VudCs0OwoJCQkJfQoKCgoJCQl9CgoJCQlmb3IgKHRlbXBfY291bnQgPSAzMis4OyB0ZW1wX2NvdW50IDwgKDMyKzgrOCk7IHRlbXBfY291bnQrKykgIC8vYWRkCgkJCXsKCQkJCWlmKCh0ZW1wX2NvdW50JTQpPT0wKSAgLy9vcmcKCQkJCXsJCgkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPDgpICAKCQkJCQl7CgkJCQkJCWxjZGxyX21pbj0wOwoJCQkJCQlsY2Rscl9tYXg9KGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJLy9sY2Rscl9tYXg9NCooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCQkJLy9sY2Rscl9tYXg9MHgzZjsvLy8vMyooZG9fZGRyX3JlYWRfYWNtZGxyKCkpOwoJCQkJCX0KCQkJCQllbHNlIGlmKCgodGVtcF9jb3VudC04KS80KTwxMCkgIAoJCQkJCXsKCQkJCQkJbGNkbHJfbWluPTA7CgkJCQkJCWxjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkJCS8vbGNkbHJfbWF4PTQqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsvLyhudW1fYXJyYXlbKGxhbmVfc3RlcDw8MikrMis4XSk7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQkJaWYoKCh0ZW1wX2NvdW50LTgpLzQpPT05KQoJCQkJCQkJbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJCQl9CgkJCQkJLy9udW1fYXJyYXlbdGVtcF9jb3VudF09MDsKCQkJCQkvL3Vuc2lnbmVkIGludCBkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGRhdGFfYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkpCgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnRdPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LCgodGVtcF9jb3VudC04LTMyKT4+MiksbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCQkJbnVtX2FycmF5W3RlbXBfY291bnQrMV09bGNkbHJfbWluOwoJCQkJCW51bV9hcnJheVt0ZW1wX2NvdW50KzJdPWxjZGxyX21heDsvL251bV9hcnJheVt0ZW1wX2NvdW50XTsKCQkJCQludW1fYXJyYXlbdGVtcF9jb3VudCszXT0wOwoJCQkJfQoKCgkJCX0KCgoKCiNpZiAgKENPTkZJR19ERFJfUEhZPD1QX0REUl9QSFlfOTA1WCkKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDBHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgwR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDFHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDJHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpKTsKCQkJcHJpbnRmKCJERFIwX1BVQl9EWDNHQ1IwPT0leFxuIiwocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpKTsKCQkJaWYoKChyZWFkbChERFIwX1BVQl9EWDBHQ1IwKSkmMSk9PTApCgkJCQlsYW5lX2Rpc2FibGU9ICAgbGFuZV9kaXNhYmxlfDE7ICAgICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgxR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8MSk7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgyR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Mik7ICAgCgkJCWlmKCgocmVhZGwoRERSMF9QVUJfRFgzR0NSMCkpJjEpPT0wKQoJCQkJbGFuZV9kaXNhYmxlPSAgIGxhbmVfZGlzYWJsZXwoMTw8Myk7ICAgCgojZW5kaWYKCQkJaWYobGFuZV9kaXNhYmxlKQoJCQl7aWYobGFuZV9kaXNhYmxlJjB4MSl7CgkJCQkJCQkJCSBudW1fYXJyYXlbOCszXT0weGZmZmY7CgkJCQkJCQkJCSBudW1fYXJyYXlbOCs0KzNdPTB4ZmZmZjsKCQkJCQkJCQkgfQoJCQlpZihsYW5lX2Rpc2FibGUmMHgyKXsKCQkJCW51bV9hcnJheVs4KzMrOF09MHhmZmZmOwoJCQkJbnVtX2FycmF5WzgrNCszKzhdPTB4ZmZmZjsKCQkJfQoJCQlpZihsYW5lX2Rpc2FibGUmMHg0KXsKCQkJCW51bV9hcnJheVs4KzMrOCs4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4OCl7CgkJCQludW1fYXJyYXlbOCszKzgrOCs4XT0weGZmZmY7CgkJCQludW1fYXJyYXlbOCs0KzMrOCs4KzhdPTB4ZmZmZjsKCQkJfQoJCQlwcmludGYoImxhbmVfZGlzYWJsZT09JXhcbiIsbGFuZV9kaXNhYmxlKTsKCQkJaWYobGFuZV9kaXNhYmxlJjB4MTApewoJCQkJbnVtX2FycmF5WzgrMys4KzgrOCs4XT0weGZmZmY7CgkJCX0KCQkJaWYobGFuZV9kaXNhYmxlJjB4MjApewoJCQkJbnVtX2FycmF5WzgrNCszKzgrOCs4KzhdPTB4ZmZmZjsKCgkJCX0KCQkJfQoKCgkJfQoKCgoKCQlmb3IgKHRlbXBfY291bnQ9IDA7IHRlbXBfY291bnQ8IDQ4O3RlbXBfY291bnQrKykgewoJCQludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJfQoJfQoKCS8vdGVzdF9hcmdfMl9zdGVwKys7CgludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoJZm9yICh0ZW1wX2NvdW50ID0gMTsgdGVtcF9jb3VudCA8IDQ4OyB0ZW1wX2NvdW50KyspIAoJewoJCXByaW50ZigiJWQgICVkXG4iLCB0ZW1wX2NvdW50LG51bV9hcnJheVt0ZW1wX2NvdW50XSk7Cgl9Cgl0ZW1wX2NvdW50PTI7CgludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy8JIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJLy8gCSBERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsdGVzdF9hcmdfMl9zdGVwLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy9mb3IgKGkgPSAwOyBpIDwgNDg7IGkrKykgewoKCS8vCSB3cml0ZWwobnVtX2FycmF5W2ldLChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJLy99CgoKCS8vZm9yIChpID0gODsgaSA8IDQ4OyBpKyspIHsKCS8vbnVtX2FycmF5W2ldPXJlYWRsKChzdGlja3lfcmVnX2Jhc2VfYWRkKyhpPDwyKSkpOwoJLy9wcmludGYoImRkcl90ZXN0X2RhdGFfbnVtXyUwNGQ9PSVkXG4iLGksbnVtX2FycmF5W2ldKTsKCS8vfQoKCS8vLyoKCXVuc2lnbmVkIGludCBsYW5lX3N0ZXA9MDsKCXVuc2lnbmVkIGludCBsYW5lX3N0ZXBfY291bnQ9MDsKCglwcmludGYoIlxuc3RhcnQgbG9vcCB0ZXN0XG4iKTsKCglmb3IgKChsYW5lX3N0ZXA9MCk7KGxhbmVfc3RlcDwxMCk7KGxhbmVfc3RlcCsrKSkgICAvL2ZpbmQgbmVlZCB0ZXN0IGRhdGEgc3RlcAoJewoJCWlmKGRkcl9lbmFibGVfa2VybmVsX3dpbmRvd190ZXN0X2ZsYWc9PTApCgkJewoJCQlpZigobnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzMrOF08KDB4NCkpKQoJCQl7YnJlYWs7CgkJCX0KCQl9CgkJZWxzZSBpZih0ZXN0X2FyZ18yX3N0ZXA8RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9PTkdJTkcpCgkJewoJCQlpZigobnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzMrOF08KDB4NCkpKQoJCQl7YnJlYWs7CgkJCX0KCQl9Cgl9CgoJaWYodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfT05HT0lORykKCXtpZihsYW5lX3N0ZXA+OSkKCQl7CgkJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIOwoJCQlwcmludGYoInVib290IHRlc3QgcmVzdWx0OiBcbiIpOwoJCX0KCX0KCgoJaWYoZGRyX2VuYWJsZV9rZXJuZWxfd2luZG93X3Rlc3RfZmxhZykKCXsKCQlpZih0ZXN0X2FyZ18yX3N0ZXA+RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSCkKCQl7CgkJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDEwKTsobGFuZV9zdGVwKyspKSAgIC8vZmluZCBuZWVkIHRlc3QgZGF0YSBzdGVwCgkJCXsKCgkJCQl7CgkJCQkJaWYoKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSszKzhdPCgweDQrNCkpKQoJCQkJCXticmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfVUJPT1RfRklOSVNIKS8vfHwodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX0ZJTklTSCkKCXsKCQkvL3Rlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORzsKCX0KCWVsc2UKCXsKCQlwcmludGYoIlxuc3RhcnQgIHRlc3QgbGFuZV9zdGVwID0lZFxuIixsYW5lX3N0ZXApOwoJCWlmKGxhbmVfc3RlcDwxMCkKCQl7CgkJCWlmKGxhbmVfc3RlcDw4KQoJCQl7CgkJCQl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkJCQlkZHJfdGVzdF9zaXplPWRkcl9kYXRhX3Rlc3Rfc2l6ZTsKCQkJCWRkcl90ZXN0X21ldGhvZD1kZHJfZGF0YV90ZXN0X21ldGhvZDsKCQkJCS8vbGNkbHJfbWluPTA7CgkJCQkvL2xjZGxyX21heD0oZG9fZGRyX3JlYWRfYWNtZGxyKCkpOy8vKG51bV9hcnJheVsobGFuZV9zdGVwPDwyKSsyKzhdKTsvL2RvX2Rkcl9yZWFkX2FjbWRscigpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJdGVzdF93YXRjaGRvZ190aW1lX3M9YWRkcmVzc190ZXN0X3dhdGNoZG9nX3RpbWVfczsKCQkJCWRkcl90ZXN0X3NpemU9ZGRyX2FkZF90ZXN0X3NpemU7CgkJCQlkZHJfdGVzdF9tZXRob2Q9ZGRyX2FkZF90ZXN0X21ldGhvZDsKCQkJCS8vbGNkbHJfbWluPTA7CgkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkvL2xjZGxyX21heD00Kihkb19kZHJfcmVhZF9hY21kbHIoKSk7Ly8obnVtX2FycmF5WyhsYW5lX3N0ZXA8PDIpKzIrOF0pOy8vLy8zKihkb19kZHJfcmVhZF9hY21kbHIoKSk7CgkJCQkvL2lmKGxhbmVfc3RlcD09OSkKCQkJCS8vbGNkbHJfbWF4PTB4M2Y7Ly8vLzMqKGRvX2Rkcl9yZWFkX2FjbWRscigpKTsKCQkJfQoKCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkgIC8vZnJvbSBrZXJuZWwgCgkJCXsKCQkJCW51bV9hcnJheVsxXT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJLy8gRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJaWYoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09MCkpfHwoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT00KSkpICAgLy90ZXN0IGxlZnQgZWRnZSBiZWdpbgoJCQl7CgkJCQkvKgoJCQkJICAgbnVtX2FycmF5WzFdCT0JdGVzdF9hcmdfMV90ZXN0X2Vycm9yX2ZsYWcJCTsvLzEgcGFzcyAyIGVycm9yCgkJCQkgICBudW1fYXJyYXlbMl0JPQl0ZXN0X2FyZ18yX3N0ZXAJCTsKCQkJCSAgIG51bV9hcnJheVszXQk9CXRlc3RfYXJnXzNfZnJlcQkJOwoJCQkJICAgbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX3N0YXR1cwkJOwoJCQkJICAgbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9hYl9lZGdlX2xjZGxyX3ZhbHVlCQk7CgkJCQkgICBudW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQJCTsKCQkJCSAgIG51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbWFnaWNfbnVtYmVyCQk7CgkJCQkgICAqLwoJCQkJLy8gICAgICAgICB0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsKCQkJCS8vCSBudW1fYXJyYXlbMF09dGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlOwoJCQkJLy8JIHRlbXBfY291bnQ9MDsKCQkJCS8vCSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkvLyAJIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJewoJCQkJCXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pOwoJCQkJCW51bV9hcnJheVswXT10ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU7CgkJCQkJdGVtcF9jb3VudD0wOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCgkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfTlVMTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCXRlbXBfY291bnQ9MTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQl7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJfQoKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQludW1fYXJyYXlbNV09KG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKTsgIC8vZWRnZSBsY2RscgoJCQkJdGVtcF9jb3VudD01OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF0pOyAgCgkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF0pPj4xKTsKCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0UpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKSsxKTsKCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgoJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8vdGVtcF9sY2RscgoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsICAvL3RlbXBfbGNkbHIKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPShudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXSsxKTsKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIC8vbGFuZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQl7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJfQoKCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCXsKCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVswXTsvL3Rlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZTsvL251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOwoJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwwLAoJCQkJCQkJKG51bV9hcnJheVswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0xKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJewoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzFdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD04KTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCXsKCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMV0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJaWYobGFuZV9zdGVwX2NvdW50PT05KQoJCQkJCQl7aWYgKGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MHgzZjsKCQkJCQkJfQoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJewoJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgkJCQl9CgoJCQkJLy9oZXJlIHdpbGwgZGVhZAoKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl9CgkJCQkvL2lmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoKCgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PTA7Ly90ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQtbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJewoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCWlmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQl7aWYgKGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJCX0KCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgoJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQl7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0xKXx8KChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NSkpKSAgIC8vdGVzdCBsZWZ0IGVkZ2UgYmVnaW4pICAgLy90ZXN0IGxlZnQgZWRnZSBvbmdvaW5nICAgIC1sb29wCgkJCXsKCgkJCQlpZigobnVtX2FycmF5WzZdKzEpPj0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pKQoJCQkJewoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJCX0KCgoKCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJewoJCQkJCQkvL2Rkcl9sY2Rscl90ZXN0X29mZnNldD0wOy8vdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOwoJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoKCQkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPSBudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXSsxOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCQlsYW5lX3N0ZXBfY291bnQ9OCsobGFuZV9zdGVwX2NvdW50PDwyKSszOwoJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10rMTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoJCQkJCW51bV9hcnJheVs1XT0wOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCS8vICAgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkvLyAgICAgICBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbNl0rMTsgICAvL3VwZGF0ZSBCCgkJCQkJLy8gICAgICAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCS8vICAgICAgbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzZdOyAgIC8vdXBkYXRlIEIKCQkJCQkvLwkgdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgoKCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJewoKCQkJCQkJdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlPSBudW1fYXJyYXlbMF07CgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKzEtdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlOwoJCQkJCQl9CgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfUEFTUykKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKzAtdGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlOwoJCQkJCQl9CgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCWlmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCXsKCQkJCQkJCQlpZigobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KT4weDNmKQoJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTB4M2Y7CgkJCQkJCQl9CgkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJCSg4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzIpICxkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgoKCQkJCQl9CgkJCQkJZWxzZSAKCQkJCQl7CgkJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdPW51bV9hcnJheVs2XSsxOyAgIC8vdXBkYXRlIEIKCQkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzZdOyAgIC8vdXBkYXRlIEIKCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCXsKCQkJCQkJLy8JbnVtX2FycmF5WzFdPSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJLy8gRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgkJCQkJLy8gIHRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT0wOy8vKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdKTsKCQkJCQkvLyBudW1fYXJyYXlbMF09dGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlOwoJCQkJCS8vIHRlbXBfY291bnQ9MDsKCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7IAoJCQkJCXdoaWxlKDEpOwoKCQkJCX0KCQkJCWVsc2UgCgkJCQl7IAoJCQkJCWlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfTlVMTCkKCQkJCQl7cHJpbnRmKCJkZWZhdWx0IHZhbHVlIG5vdCBzdGFibGUgLG9yIHJlY292ZXJ5IHN0aWNreT9cbiIpOwoJCQkJCX0KCQkJCQllbHNlICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX0ZBSUwpCgkJCQkJewoKCgoJCQkJCQl7CgkJCQkJCQkvLyAgIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTE7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7CgkJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgkJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoJCQkJCQkJLy8gICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy0tdXBkYXRlIGN1cmVudAoJCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07ICAgLy91cGRhdGUgQgoJCQkJCQkJLy8gdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzE7CgkJCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJewoJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCX0KCgoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQl7CgoJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQtbnVtX2FycmF5WzBdOy8vdG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOwoJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwwLAoJCQkJCQkJCQkJKG51bV9hcnJheVswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0xKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJewoJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzFdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJfQoJCQkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD04KTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCXsKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMV0rZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQkJaWYobGFuZV9zdGVwX2NvdW50PT05KQoJCQkJCQkJCQl7aWYgKGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MHgzZjsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgoJCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJfQoJCQkJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJCQl7CgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UKCQkJCQkJCXsKCQkJCQkJCQlpZiggbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJCQl7CgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgoJCQkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCgkJCQkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJCQkJewoJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PTA7Ly90ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQtbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV07CgkJCQkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCQkJewoJCQkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCQkJCWlmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQkJCQl7aWYgKGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJCQkJCX0KCQkJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJfQoKCgkJCQkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJCX0KCgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWVsc2UJICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJewoJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0xOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMV09bnVtX2FycmF5WzZdOyAgLy91cGRhdGUgbWluIHZhbHVlCgkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsxOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7CgkJCQkJCWVsc2UgaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0UpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pKzEpOwoJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSkrMSk7CgkJCQkJCS8vICAgdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdKT4+MSk7ICAvL2N1cnJlbl90ZXN0ICtCICAvLyhBK0IpLzIKCQkJCQkJbnVtX2FycmF5WzZdPXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLXVwZGF0ZSBjdXJlbnQKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX0ZBSUw7ICAvLzEgLy9wYXNzIDIgZXJyb3IKCQkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQl7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCgkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQl7CgkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVswXTsvL3RudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsKCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwwLAoJCQkJCQkJCQkobnVtX2FycmF5WzBdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJewoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzFdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsxXStkZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCWlmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQl7aWYgKGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0weDNmOwoJCQkJCQkJCX0KCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgkJCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJewoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQl7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQkJewoJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9MDsvL3Rlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudC1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsKCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdK2Rkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCQkJCQlpZihsYW5lX3N0ZXBfY291bnQ9PTkpCgkJCQkJCQkJCQl7aWYgKGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU+MHgzZikKCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTB4M2Y7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LChsYW5lX3N0ZXBfY291bnQtOCksCgkJCQkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQl9CgoJCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJewoJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCQkJCQkJfQoKCQkJCQl9CgkJCQl9CgoKCQkJfQoKCQkJZWxzZSAgaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPT0yKXx8KChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NikpKSAgIC8vdGVzdCByaWdodCBlZGdlIGJlZ2luCgkJCXsKCQkJCS8qCgkJCQkgICBudW1fYXJyYXlbMV0JPQl0ZXN0X2FyZ18xX3Rlc3RfZXJyb3JfZmxhZwkJOy8vMSBwYXNzIDIgZXJyb3IKCQkJCSAgIG51bV9hcnJheVsyXQk9CXRlc3RfYXJnXzJfc3RlcAkJOwoJCQkJICAgbnVtX2FycmF5WzNdCT0JdGVzdF9hcmdfM19mcmVxCQk7CgkJCQkgICBudW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzCQk7CgkJCQkgICBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X2FiX2VkZ2VfbGNkbHJfdmFsdWUJCTsKCQkJCSAgIG51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudAkJOwoJCQkJICAgbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19tYWdpY19udW1iZXIJCTsKCQkJCSAgICovCgoJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJewoJCQkJCXRlc3RfYXJnXzBfb3JndF9zdG9yZV9sY2Rscl92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pOwoJCQkJCW51bV9hcnJheVswXT10ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU7CgkJCQkJdGVtcF9jb3VudD0wOwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJdGVtcF9jb3VudD0xOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCXsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQl9CgoKCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXTsvL2xjZGxyX21heDsgIC8vZWRnZSBsY2RscgoJCQkJdGVtcF9jb3VudD01OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07Ly8KCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfRElWSURFUl8yKQoJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRSkKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCS8vdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7CgkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLy90ZW1wX2xjZGxyCgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgIC8vdGVtcF9sY2RscgoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10rMTsKCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIC8vbGFuZSBzdGF0dXMKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQlwcmludGYoIlxuZW5hYmxlICVkcyB3YXRjaGRvZyBcbiIsdGVzdF93YXRjaGRvZ190aW1lX3MpOwoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQl7CgkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PW51bV9hcnJheVswXS10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LDAsCgkJCQkJCQkobnVtX2FycmF5WzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTEpOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQl7CgkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJewoJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkvL2lmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJe2lmICgobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl0pPChkZHJfbGNkbHJfdGVzdF9vZmZzZXQpKQoJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0wOwoJCQkJCQl9CgkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCWVsc2UgaWYobGFuZV9zdGVwPDEwKQoJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJfQoJCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQl7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCgkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJewoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9bnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMF07CgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJewoJCQkJCQkJZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0PTA7Ly9udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXS10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJewoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCS8vaWYobGFuZV9zdGVwX2NvdW50PT05KQoJCQkJCQkJCS8vCXtpZiAoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdPGRkcl9sY2Rscl90ZXN0X29mZnNldCkKCQkJCQkJCQkvLwlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTA7CgkJCQkJCQkJLy8JfQoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LChsYW5lX3N0ZXBfY291bnQtOCksCgkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsKCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCxvcmdfbGNkbHJfdmFsdWVfdGVtcCxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJdGVtcF9jb3VudD0xOwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQl7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJfQoKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoKCQkJCX0KCQkJfQoJCQllbHNlIGlmKChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09Myl8fChudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT09NykpICAgLy90ZXN0IHJpZ2h0IGVkZ2Ugb25nb2luZyAgICAtbG9vcAoJCQl7CgoJCQkJaWYoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKzEpPj0obnVtX2FycmF5WzZdKSkKCQkJCXsKCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX05VTEwpCgkJCQkJe3ByaW50ZigiZGVmYXVsdCB2YWx1ZSBub3Qgc3RhYmxlICxvciByZWNvdmVyeSBzdGlja3k/XG4iKTsKCQkJCQl9CgoKCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJewoJCQkJCQkvL2Rkcl9sY2Rscl90ZXN0X29mZnNldD0wOy8vdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzFdOwoJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoKCQkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPSBudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXSsxOyAgLy91cGRhdGUgc3RhdHVzCgkJCQkJCQlsYW5lX3N0ZXBfY291bnQ9OCsobGFuZV9zdGVwX2NvdW50PDwyKSszOwoJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT0gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10rMTsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoJCQkJCW51bV9hcnJheVs1XT0wOyAgLy91cGRhdGUgZWRnZSBsY2RscgoJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCS8vICAgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQkvLyAgICAgbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdLTE7ICAgLy91cGRhdGUgQgoJCQkJCS8vICAgICBpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJLy8gICAgIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XTsgICAvL3VwZGF0ZSBCCgkJCQkJLy8JIHRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSsyOwoJCQkJCS8vCSByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJLy8JIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQl7CgoJCQkJCQl0ZXN0X2FyZ18wX29yZ3Rfc3RvcmVfbGNkbHJfdmFsdWU9IG51bV9hcnJheVswXTsKCQkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCQl7CgkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9dGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlLW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKzE7CgkJCQkJCX0KCQkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCQl7CgkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9dGVzdF9hcmdfMF9vcmd0X3N0b3JlX2xjZGxyX3ZhbHVlLW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKzA7CgkJCQkJCX0KCQkJCQkJdGVtcF9jb3VudD04KyhsYW5lX3N0ZXA8PDIpKzI7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0xKTsobGFuZV9zdGVwX2NvdW50PDEwKTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQl7CgkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMl08ZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KQoJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MDsKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJKDgrKGxhbmVfc3RlcF9jb3VudDw8MikrMikgLGRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgoJCQkJCX0KCQkJCQllbHNlIAoJCQkJCXsKCQkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9GQUlMKQoJCQkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl09bnVtX2FycmF5WzZdLTE7ICAgLy91cGRhdGUgQgoJCQkJCQlpZihudW1fYXJyYXlbMV09PUREUl9URVNUX1BBU1MpCgkJCQkJCQludW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXT1udW1fYXJyYXlbNl07ICAgLy91cGRhdGUgQgoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoKCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9MDsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCW51bV9hcnJheVs2XT10ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8tLXVwZGF0ZSBjdXJlbnQKCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJdGVtcF9jb3VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGVzdCBlcnJvciBmbGFnCgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJewoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7IAoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQkJZWxzZSAKCQkJCXsgCgkJCQkJaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9OVUxMKQoJCQkJCXtwcmludGYoImRlZmF1bHQgdmFsdWUgbm90IHN0YWJsZSAsb3IgcmVjb3Zlcnkgc3RpY2t5P1xuIik7CgkJCQkJfQoJCQkJCWVsc2UgIGlmKG51bV9hcnJheVsxXT09RERSX1RFU1RfRkFJTCkKCQkJCQl7CgoKCgkJCQkJCXsKCQkJCQkJCS8vIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPTM7ICAvL3VwZGF0ZSBzdGF0dXMKCQkJCQkJCXRlbXBfY291bnQ9OCsobGFuZV9zdGVwPDwyKSszOwoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCQkJCW51bV9hcnJheVs1XT1udW1fYXJyYXlbNl07ICAvL3VwZGF0ZSBlZGdlIGxjZGxyCgkJCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ESVZJREVSXzIpCgkJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdK251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdKT4+MSk7CgkJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XSktMSk7CgkJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJCQkJLy8gIHRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOyAgLy9jdXJyZW5fdGVzdCArQiAgLy8oQStCKS8yCgkJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLS11cGRhdGUgY3VyZW50CgkJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkvLyBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXT1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsxXTsgICAvL3VwZGF0ZSBCCgkJCQkJCQkvLyB0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMTsKCQkJCQkJCS8vIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9GQUlMOyAgLy8xIC8vcGFzcyAyIGVycm9yCgkJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQl7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJfQoKCgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCQkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFX0FMTF9TQU1FVElNRSkKCQkJCQkJCXsKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9bnVtX2FycmF5WzBdLXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsMCwKCQkJCQkJCQkJCShudW1fYXJyYXlbMF0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJCXsKCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCQkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQl7CgkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdLWRkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCQkJCS8vaWYobGFuZV9zdGVwX2NvdW50PT05KQoJCQkJCQkJCQl7aWYgKChudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXSk8KGRkcl9sY2Rscl90ZXN0X29mZnNldCkpCgkJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPTA7CgkJCQkJCQkJCX0KCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LChsYW5lX3N0ZXBfY291bnQtOCksCgkJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWlmKGxhbmVfc3RlcDw4KQoJCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD1kb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXAtOCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJCXsKCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCWlmKCBudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSszXT40KQoJCQkJCQkJCXsKCQkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCgkJCQkJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzBdOwoJCQkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X29mZnNldD0wOy8vbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0tdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OwoJCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQkJCXsKCQkJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCQkJCShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQkJfQoJCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCQl7CgkJCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0obnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrMF0tZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KTsKCQkJCQkJCQkJCQkvL2lmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQkJCQkvLwl7aWYgKChudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSswXTxkZHJfbGNkbHJfdGVzdF9vZmZzZXQpCgkJCQkJCQkJCQkJLy8JZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCQkJCS8vCX0KCQkJCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCQl9CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQkJZWxzZSBpZihsYW5lX3N0ZXA8MTApCgkJCQkJCQkJCQkJb3JnX2xjZGxyX3ZhbHVlX3RlbXA9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsb3JnX2xjZGxyX3ZhbHVlX3RlbXAsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJbnVtX2FycmF5WzFdPUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJCQkJCXRlbXBfY291bnQ9MTsKCQkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQl9CgoJCQkJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCQl9CgoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoKCQkJCQllbHNlCSAgaWYobnVtX2FycmF5WzFdPT1ERFJfVEVTVF9QQVNTKQoJCQkJCXsKCQkJCQkJLy8gbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM109MzsgIC8vdXBkYXRlIHN0YXR1cwoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdPW51bV9hcnJheVs2XTsgIC8vdXBkYXRlIG1heCB2YWx1ZQoJCQkJCQl0ZW1wX2NvdW50PTgrKGxhbmVfc3RlcDw8MikrMjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJCWlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RJVklERVJfMikKCQkJCQkJCXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudD0oKG51bV9hcnJheVs1XStudW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSsyXSk+PjEpOwoJCQkJCQllbHNlIGlmKGRkcl90ZXN0X21ldGhvZD09RERSX1RFU1RfTUVUSE9EX0RFQ1JFQVNFKQoJCQkJCQkJdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50PSgobnVtX2FycmF5WzVdKS0xKTsKCQkJCQkJZWxzZSBpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0pLTEpOwoJCQkJCQkvLyAgICB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9KChudW1fYXJyYXlbNV0rbnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrMl0pPj4xKTsgIC8vY3VycmVuX3Rlc3QgK0IgIC8vKEErQikvMgoJCQkJCQludW1fYXJyYXlbNl09dGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tdXBkYXRlIGN1cmVudAoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfRkFJTDsgIC8vMSAvL3Bhc3MgMiBlcnJvcgoJCQkJCQl0ZW1wX2NvdW50PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0ZXN0IGVycm9yIGZsYWcKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcDw8MikrM10+NCkKCQkJCQkJewoJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQkJCQkJCUREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICxudW1fYXJyYXlbMV0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0KCgoJCQkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJaWYoZGRyX3Rlc3RfbWV0aG9kPT1ERFJfVEVTVF9NRVRIT0RfREVDUkVBU0VfQUxMX1NBTUVUSU1FKQoJCQkJCQl7CgkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9bnVtX2FycmF5WzBdLXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwwLAoJCQkJCQkJCQkobnVtX2FycmF5WzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MSk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQkJewoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9OCk7KGxhbmVfc3RlcF9jb3VudDwxMCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCXsKCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF90ZW1wX3ZhbHVlPShudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSsyXS1kZHJfbGNkbHJfdGVzdF9vZmZzZXQpOwoJCQkJCQkJCS8vaWYobGFuZV9zdGVwX2NvdW50PT05KQoJCQkJCQkJCXtpZiAoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzJdKTwoZGRyX2xjZGxyX3Rlc3Rfb2Zmc2V0KSkKCQkJCQkJCQkJZGRyX2xjZGxyX3Rlc3RfdGVtcF92YWx1ZT0wOwoJCQkJCQkJCX0KCQkJCQkJCQlpZihudW1fYXJyYXlbOCsobGFuZV9zdGVwX2NvdW50PDwyKSszXTw5KQoJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCwobGFuZV9zdGVwX2NvdW50LTgpLAoJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7CgkJCQkJCQlpZihsYW5lX3N0ZXA8OCkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcCx0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQl0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQ9ZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLTgsdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50LEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CgkJCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCQkJdGVtcF90ZXN0X2Vycm9yPWRkcl90ZXN0X3NfY3Jvc3NfdGFsa19wYXR0ZXJuKGRkcl90ZXN0X3NpemUpOwoKCQkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQkJewoJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCXdoaWxlKDEpOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQl7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJCQkJd2hpbGUoMSk7CgkJCQkJCQl9CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1udW1fYXJyYXlbOCsobGFuZV9zdGVwPDwyKSswXTsKCQkJCQkJCQlpZihkZHJfdGVzdF9tZXRob2Q9PUREUl9URVNUX01FVEhPRF9ERUNSRUFTRV9BTExfU0FNRVRJTUUpCgkJCQkJCQkJewoJCQkJCQkJCQlkZHJfbGNkbHJfdGVzdF9vZmZzZXQ9MDsvL251bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzJdLXRlc3RfYXJnXzZfbGNkbHJfdGVtcF9jb3VudDsKCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJCQkJewoJCQkJCQkJCQkJaWYobnVtX2FycmF5WzgrKGxhbmVfc3RlcF9jb3VudDw8MikrM108OSkKCQkJCQkJCQkJCQlkb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCQkJCQkJKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTgpOyhsYW5lX3N0ZXBfY291bnQ8MTApOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCQkJCXsKCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9KG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdLWRkcl9sY2Rscl90ZXN0X29mZnNldCk7CgkJCQkJCQkJCQkvL2lmKGxhbmVfc3RlcF9jb3VudD09OSkKCQkJCQkJCQkJCS8vCXtpZiAoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzBdPGRkcl9sY2Rscl90ZXN0X29mZnNldCkKCQkJCQkJCQkJCS8vCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWU9MDsKCQkJCQkJCQkJCS8vCX0KCQkJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXBfY291bnQ8PDIpKzNdPDkpCgkJCQkJCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKGxhbmVfc3RlcF9jb3VudC04KSwKCQkJCQkJCQkJCQkJCWRkcl9sY2Rscl90ZXN0X3RlbXBfdmFsdWUsRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCXsKCQkJCQkJCQkJaWYobGFuZV9zdGVwPDgpCgkJCQkJCQkJCQlvcmdfbGNkbHJfdmFsdWVfdGVtcD1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwLG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCQllbHNlIGlmKGxhbmVfc3RlcDwxMCkKCQkJCQkJCQkJCW9yZ19sY2Rscl92YWx1ZV90ZW1wPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcC04LG9yZ19sY2Rscl92YWx1ZV90ZW1wLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCQkJCQkJCQludW1fYXJyYXlbMV09RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQkJCQl0ZW1wX2NvdW50PTE7CgkJCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCWlmKG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgkJCQkJCQkJewoJCQkJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X2ZsYWcoRERSX1BBUkFNRVRFUl9TT1VSQ0VfRlJPTV9PUkdfU1RJQ0tZLCAKCQkJCQkJCQkJCQlERFJfVEVTVF9TVEFUVVNfUEFTU19GQUlMX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsbnVtX2FycmF5WzFdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQkJCX0KCgkJCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJCQl3aGlsZSgxKTsKCQkJCQkJCX0KCgkJCQkJCX0KCgkJCQkJfQoJCQkJfQoKCgkJCX0KCQl9Cgl9CglpZihsYW5lX3N0ZXA+PTEwKSAvL2ZpbmlzaAoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoJfQoKCS8vIHVuc2lnbmVkIGludCAgIGFjbWRscj0gMDsKCXVuc2lnbmVkIGludCAgZGVsYXlfc3RlcF94MTAwPSAwOwoKCXsKCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQlkZWxheV9zdGVwX3gxMDA9MTAwKjEwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGsqYWNtZGxyKTsKCQlwcmludGYoIlxuYWNtZGxyPTB4JTA4eC0tPmRlYyAlZCxkZHIgY2xrPT0lZCxzdGVwPSVkIHBzLDEwc3RlcD0lZCBwcywxMDBzdGVwPSVkIHBzLFxuIixhY21kbHIsYWNtZGxyLGdsb2JhbF9kZHJfY2xrLAoJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgkJZm9yICgobGFuZV9zdGVwPTApOyhsYW5lX3N0ZXA8NCk7KGxhbmVfc3RlcCsrKSkKCQl7CgkJCXByaW50ZigiXG4gYV9sYW5lXzB4JTA4eHx3ZHFfb3JnIDB4JTA4eCAgfHdkcV9taW4gMHglMDh4IHx3ZHFfbWF4IDB4JTA4eCA6OnxyZHFzX29yZyAgMHglMDh4ICB8cmRxc19taW4gMHglMDh4IHxyZHFzX21heCAweCUwOHggIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMl0sCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdLG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0pOwoJCX0KCQlsYW5lX3N0ZXA9NDsKCQl7CgkJCXByaW50ZigiXG5hY19sYW5lXzB4JTA4eHxsY2Rfb3JnIDB4JTA4eCAgfGxjZF9taW4gMHglMDh4IHxsY2RfbWF4IDB4JTA4eCA6OnxiZGxyX29yZyAgMHglMDh4ICB8YmRscl9taW4gMHglMDh4IHxiZGxyX21heCAweCUwOHggIFxuIiwKCQkJCQk0LAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCsxXSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLAoJCQkJCW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0sbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSxudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdKTsKCQl9CgkJcHJpbnRmKCJcblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CgkJewoJCQlwcmludGYoIlxuIGFjX2xhbmVfMHgwMDAwMDAwfCAgbGNkbHJfb3JnICB8bGNkbHJfc2V0IHBzfGxjZGxyX2hvbGQgcHM6fFwKCQkJCQljbGtfc2V0dXAgIHBzfCBjbGtfaG9sZCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgkJCXByaW50ZigiXG4gYWNfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgkJCXByaW50ZigiXG4gY2tfbGFuZTB4JTA4eHwgMHglMDh4ICB8ICAgJTA4ZCB8ICAgJTA4ZCA6OnwgICAgJTA4ZCB8ICAgJTA4ZCB8ICAgJTA4ZCAgXG4iLAoJCQkJCTQsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzVdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNl0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgkJfQoJCXByaW50ZigiXG4gYV9sYW5lXzB4MDAwMDAwMDB8IHdyZHFfb3JnIDB4MHx3X3NldHVwIHggcHN8d19ob2xkICB4IHBzOjp8XAoJCQkJcmRfc2V0dXAgIHBzfHJkX2hvbGQgeCBwc3xhZGpfcGVyY2VudFsxMDBdXG4iKTsKCgoJCWZvciAoKGxhbmVfc3RlcD0wKTsobGFuZV9zdGVwPDQpOyhsYW5lX3N0ZXArKykpCgkJewoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJKCgobnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCswXS1udW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzFdKSpkZWxheV9zdGVwX3gxMDAKCQkJCQkgKS8xMDApLAoKCQkJCQkwLAoJCQkJCTAsCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzJdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrMV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzBdKSk7CgoJCQlwcmludGYoIlxuIGFfbGFuZV8weCUwOHh8IDB4JTA4eCAgfCAgICUwOGQgfCAgICUwOGQgOjp8ICAgICUwOGQgfCAgICUwOGQgfCAgICUwOGQgIFxuIiwKCQkJCQlsYW5lX3N0ZXAsCgkJCQkJbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs0XSwKCQkJCQkwLAoJCQkJCTAsCgoJCQkJCSgoKG51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0tbnVtX2FycmF5WzgrKGxhbmVfc3RlcCkqOCs1XSkqZGVsYXlfc3RlcF94MTAwCgkJCQkJICkvMTAwKSwKCQkJCQkoKChudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdLW51bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNF0pKmRlbGF5X3N0ZXBfeDEwMAoJCQkJCSApLzEwMCksCgkJCQkJMTAwKihudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzZdK251bV9hcnJheVs4KyhsYW5lX3N0ZXApKjgrNV0pLygKCQkJCQkJMipudW1fYXJyYXlbOCsobGFuZV9zdGVwKSo4KzRdKSk7CgoKCgkJfQoJfQoKCglpZih0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0gpLy98fCh0ZXN0X2FyZ18yX3N0ZXA9PUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIKQoJewoJCXRlc3RfYXJnXzJfc3RlcD1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORzsKCQludW1fYXJyYXlbMl09dGVzdF9hcmdfMl9zdGVwOwoJCXRlbXBfY291bnQ9MjsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl3aGlsZSgxKTsKCgl9CgoJaWYodGVzdF9hcmdfMl9zdGVwPT1ERFJfVEVTVF9TVEFUVVNfS0VSTkVMX09OR0lORykvL3x8KHRlc3RfYXJnXzJfc3RlcD09RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0gpCgl7CgkJdGVzdF9hcmdfMl9zdGVwPUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIOwoJCW51bV9hcnJheVsyXT10ZXN0X2FyZ18yX3N0ZXA7CgkJdGVtcF9jb3VudD0yOwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9mbGFnKEREUl9QQVJBTUVURVJfU09VUkNFX0ZST01fT1JHX1NUSUNLWSwgCgkJCQlERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAsdGVzdF9hcmdfMl9zdGVwLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCW51bV9hcnJheVsxXT1ERFJfVEVTVF9OVUxMOwoJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfZmxhZyhERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX09SR19TVElDS1ksIAoJCQkJRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgLG51bV9hcnJheVsxXSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJd2hpbGUoMSk7CgkJfQoJfQoKCgoKCgoJLy8gaWYoIG51bV9hcnJheVs4KyhsYW5lX3N0ZXA8PDIpKzNdPjQpCgoKCglyZXR1cm4gMTsKfQoKaW50IGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZV9hbGxfc2FtZV9pbmNyZWFzZShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5zZXRlbnYgYm9vdGNtZCBkZHJfdGVzdF9jbWQgMHgzNSA0IDYgIDYwIDAgMHgxMDAwMDAgMHg0MDAwMDAwICAwIDB4MTAwMDEwIDBcbiIpOwoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSBmdW5jdGlvblxuIik7CglwcmludGYoIlxuLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKCiNkZWZpbmUgRERSX1RFU1RfTlVMTCAgMAojZGVmaW5lIEREUl9URVNUX1BBU1MgIDEKI2RlZmluZSBERFJfVEVTVF9GQUlMIDIKCgojZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgIDQgIC8vIFBSRUdfU1RJQ0tZX1JFRzQKI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgICAgNSAgLy80NS8vIFBSRUdfU1RJQ0tZX1JFRzQKCS8vUFJFR19TVElDS1lfUkVHNAoJLy9QUkVHX1NUSUNLWV9SRUc1CgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HICAgMQojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0ggMgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HICAzCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0ggNAoJLy8jZGVmaW5lIEREUl9URVNUX0ZBSUwgMgoKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoJdW5zaWduZWQgaW50ICAgZGF0YV9zb3VyY2U9IDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3Rfc2l6ZT0weDEwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9zaXplPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NsZWFyX2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfaW5pdF9vZmZzZXQ9MDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrPTA7CgoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF91Ym9vdF9sb29wPTA7CgoJdW5zaWduZWQgaW50ICBrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3M9NjA7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0xOyAgLy9mb3IgcXVpY2sgb3V0IG9mIGVycm9yCglpZiAoYXJnYyA+MSkgewoJCWRhdGFfc291cmNlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRhdGFfc291cmNlPSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOVjsKCQl9Cgl9CglpZiAoYXJnYyA+MikgewoJCXdhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl3YXRjaGRvZ190aW1lX3M9IDE1OwoJCX0KCX0KCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJLy90ZXN0X3dhdGNoZG9nX3RpbWVfcz1hZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zOwoJaWYgKGFyZ2MgPjMpIHsKCQlrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPSB3YXRjaGRvZ190aW1lX3M7CgkJfQoJfQoJcHJpbnRmKCJrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3M9PSVkXG4iLGtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkvL2xhbmVfZGlzYWJsZT1nX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX3Rlc3RfbGFuZV9kaXNhYmxlOwoJaWYgKGFyZ2MgPjQpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsgICAKCglpZiAoYXJnYyA+NSkgewoJCWRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZGF0YV90ZXN0X3NpemU9IDB4MTAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2RhdGFfdGVzdF9zaXplKTsKCWlmIChhcmdjID42KSB7CgkJZGRyX2FkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X3NpemU9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9zaXplKTsKCglpZiAoYXJnYyA+NykgewoJCWRkcl90ZXN0X2NsZWFyX2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfY2xlYXJfZmxhZz0gMHgxMDAwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl90ZXN0X2NsZWFyX2ZsYWc9PTB4JTA4eFxuIixkZHJfdGVzdF9jbGVhcl9mbGFnKTsKCglpZiAoYXJnYyA+OCkgewoJCWRkcl90ZXN0X2luaXRfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzhdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X2luaXRfb2Zmc2V0PSAwOwoJCX0KCX0KCXByaW50ZigiZGRyX3Rlc3RfaW5pdF9vZmZzZXQ9PTB4JTA4eFxuIixkZHJfdGVzdF9pbml0X29mZnNldCk7CgoJaWYgKGFyZ2MgPjkpIHsKCQlkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2sgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrPSAwOwoJCX0KCX0KCXByaW50ZigiZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrPT0weCUwOHhcbiIsZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrKTsKCglpZiAoYXJnYyA+MTApIHsKCQlkZHJfdGVzdF91Ym9vdF9sb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEwXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfdWJvb3RfbG9vcD0gMDsKCQl9Cgl9CglwcmludGYoImRkcl90ZXN0X3Vib290X2xvb3A9PTB4JTA4eFxuIixkZHJfdGVzdF91Ym9vdF9sb29wKTsKCgl1bnNpZ25lZCBpbnQgcmFua19pbmRleD0wOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9kYXRhX2FycmF5X21heD0xMDsKCXVuc2lnbmVkIGludCBudW1fYXJyYXlbMTBdOy8vOCBmbGFnIDMyX2RhdGEgYWRkXzggIDMyX2RhdGEgYWRkXzgKCgl1bnNpZ25lZCBpbnQgdGVtcF90ZXN0X2Vycm9yPTA7CgkvL3Vuc2lnbmVkIGludCBsY2Rscl9taW49MDsKCS8vdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJbWVtc2V0KG51bV9hcnJheSwgMCwgc2l6ZW9mKG51bV9hcnJheSkpOwoJLy9jaGFyIHN0clsxMDI0XT0iIjsKCgoJZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9MTA7CgoJZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCBkZHJfdGVzdF9kYXRhX2FycmF5X21heDsgdGVtcF9jb3VudCsrKSAKCXsKCQludW1fYXJyYXlbdGVtcF9jb3VudF09IHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1JFQUQgKTsKCQlwcmludGYoInJlYWQgbnVtYXJyeVslZF09PSVkXG4iLHRlbXBfY291bnQsbnVtX2FycmF5W3RlbXBfY291bnRdKTsKCX0KCgl1bnNpZ25lZCBpbnQgcmVnX2RlZl92YWx1ZV9kYXRhWzRdOyAvL3dyaXRlX2xjZGxyX3ZhbHVlK3JlYWRfbGNkbHJfdmFsdWU8PDE2OwoKCS8vI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1NURVBfRkxBR19BRERfT1JHX1NUSUNLWV9PRkZTRVQgICA0ICAvLyBQUkVHX1NUSUNLWV9SRUc0CgkvLyNkZWZpbmUgIEREUl9URVNUX1NUQVRVU19QQVNTX0ZBSUxfQUREX09SR19TVElDS1lfT0ZGU0VUICAgIDUgIC8vNDUvLyBQUkVHX1NUSUNLWV9SRUc0CgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0ID0wOyAgLy91c2UgZm9yIGtlcm5lbAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQgPTA7IC8vdXNlIGZvciBrZXJuZWwKCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNl9zdGVwX3N0YXR1cyA9MDsgLy91Ym9vdCB0ZXN0IHdlIHNob3VsZCByZWFkIGVycm9yIHRoZW4gZG9uZSBzdGF0dXMuICAwIG5vIHRlc3QgMSBvbmdvaW5nIDIgdGhpcyBzdGVwIGRvbmUgIGZhaWwgb3IgcGFzcwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0ID0wOyAvL2xlZnRfbGNkbHIrcmlnaHRfbGNkbHI8PDE2IAoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wgPTA7IC8vbGVmdF9sY2RscgoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9MDsgLy9yaWdodF9sY2RscgoJdW5zaWduZWQgaW50ICBkZWxheV9zdGVwX3gxMDA9IDA7CgoJLy91bnNpZ25lZCBpbnQgdGVzdF9hcmdfNl9sY2Rscl90ZW1wX2NvdW50ID0wOwoJdW5zaWduZWQgaW50IHRlc3RfbGNkbHJfdGVtcF92YWx1ZTEgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMiA9MDsKCXVuc2lnbmVkIGludCB0ZXN0X2xjZGxyX3RlbXBfdmFsdWUgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcgPTA7CgoJdW5zaWduZWQgaW50IGFjbWRscj0wOwoJYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoKCXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnPTA7CglyZWdfZGVmX3ZhbHVlX2RhdGFbMF09bnVtX2FycmF5WzBdOwoJcmVnX2RlZl92YWx1ZV9kYXRhWzFdPW51bV9hcnJheVsxXTsKCXJlZ19kZWZfdmFsdWVfZGF0YVsyXT1udW1fYXJyYXlbMl07CglyZWdfZGVmX3ZhbHVlX2RhdGFbM109bnVtX2FycmF5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9bnVtX2FycmF5WzRdOwoJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1udW1fYXJyYXlbNV07Cgl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPW51bV9hcnJheVs2XTsKCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PW51bV9hcnJheVs3XTsKCgoKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzBdPT0weCUwOHhcbiIsbnVtX2FycmF5WzBdKTsKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzFdPT0weCUwOHhcbiIsbnVtX2FycmF5WzFdKTsKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzJdPT0weCUwOHhcbiIsbnVtX2FycmF5WzJdKTsKCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzNdPT0weCUwOHhcbiIsbnVtX2FycmF5WzNdKTsKCXByaW50ZigidGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzRdKTsKCXByaW50ZigidGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0lZFxuIixudW1fYXJyYXlbNV0pOwoJcHJpbnRmKCJ0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPSVkXG4iLG51bV9hcnJheVs2XSk7CglwcmludGYoIlxudGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9MHglMDh4XG4iLG51bV9hcnJheVs3XSk7CgoKCgoJLy9mb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgkvLwl7CgkvLwkgcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJLy8gCSB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkvL30KCgoJaWYoZGRyX3Rlc3RfY2xlYXJfZmxhZykKCXsgICAgICAgICAgICB0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTA7CgkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCXRlbXBfY291bnQ9NjsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJcHJpbnRmKCJcbiBjbGVhciBzdGlja3kgcmVnaXN0ZXIgc2hvdWxkIHJlc2V0LHRoZW4gb3ZlciB3cml0ZSAuLi4uXG4iKTsKCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCXdoaWxlKDEpOwoJfQoKCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTApCgl7CgkJewoKCQkJLy90ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTE7CgoKCQkJZm9yICh0ZW1wX2NvdW50ID0gMDsgdGVtcF9jb3VudCA8ICg4KTsgdGVtcF9jb3VudCsrKSAgIC8vZGF0YQoJCQl7CgkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCx0ZW1wX2NvdW50LHRlc3RfbGNkbHJfdGVtcF92YWx1ZTEsRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCXRlbXBfY291bnQ9dGVtcF9jb3VudCsxOwoJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMj1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsKHRlbXBfY291bnQpLHRlc3RfbGNkbHJfdGVtcF92YWx1ZTIsRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCXJlZ19kZWZfdmFsdWVfZGF0YVt0ZW1wX2NvdW50LzJdPXRlc3RfbGNkbHJfdGVtcF92YWx1ZTF8KHRlc3RfbGNkbHJfdGVtcF92YWx1ZTI8PDE2KTsKCQkJCXByaW50ZigibnVtX2FycmF5WyVkXT0lMDh4XG4iLHRlbXBfY291bnQvMixudW1fYXJyYXlbdGVtcF9jb3VudC8yXSk7CgkJCX0KCgkJfQoJCXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PTA7CgkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0wOwoJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9MDsKCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0wOwoJCWlmKGRkcl90ZXN0X2luaXRfb2Zmc2V0KQoJCXt0ZXN0X2FyZ183X2xjZGxyX29mZnNldD1kZHJfdGVzdF9pbml0X29mZnNldDsKCQl9CgkJbnVtX2FycmF5WzBdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzBdCQk7CgkJbnVtX2FycmF5WzFdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzFdCQk7CgkJbnVtX2FycmF5WzJdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzJdCQk7CgkJbnVtX2FycmF5WzNdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzNdCQk7CgkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsgIC8vdXNlIGZvciBrZXJuZWwKCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7Ly91c2UgZm9yIGtlcm5lbAoJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoKCgoJCWZvciAodGVtcF9jb3VudD0gMDt0ZW1wX2NvdW50IDwgODsgdGVtcF9jb3VudCsrKSAKCQl7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJfQoKCgl9CgllbHNlCgl7CgkJZm9yICh0ZW1wX2NvdW50ID0gMDsgdGVtcF9jb3VudCA8ICg4KTsgdGVtcF9jb3VudCsrKSAgIC8vZGF0YQoJCXsKCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMT1kb19kZHJfcmVhZF93cml0ZV9kZHJfZGF0YV93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsdGVtcF9jb3VudCx0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCXRlbXBfY291bnQ9dGVtcF9jb3VudCsxOwoJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWUyPWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCwodGVtcF9jb3VudCksdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMixERFJfUEFSQU1FVEVSX1JFQUQpOwoJCQlyZWdfZGVmX3ZhbHVlX2RhdGFbdGVtcF9jb3VudC8yXT10ZXN0X2xjZGxyX3RlbXBfdmFsdWUxfCh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUyPDwxNik7CgkJCW51bV9hcnJheVt0ZW1wX2NvdW50LzJdPXJlZ19kZWZfdmFsdWVfZGF0YVt0ZW1wX2NvdW50LzJdOwoJCQlwcmludGYoInJlLW51bV9hcnJheVslZF09JTA4eFxuIix0ZW1wX2NvdW50LzIsbnVtX2FycmF5W3RlbXBfY291bnQvMl0pOwoJCX0KCX0KCglpZihkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2smMSkKCXtwcmludGYoInNraXAgdWJvb3QgdGVzdCBzaG91bGQgaW5pdCBrZXJuZWwgb2Zmc2V0ICB2YWx1ZT09MHglMDh4XG4iLG51bV9hcnJheVs3XSk7Cgl9CgoJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXQmMHhmZmZmKTsKCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9KCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldD4+MTYpJjB4ZmZmZik7Cgl1bnNpZ25lZCBpbnQgbGFuZV9zdGVwX2NvdW50PTA7Cgl7CgoJCXsKCQkJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJCQlkZHJfdGVzdF9zaXplPWRkcl9kYXRhX3Rlc3Rfc2l6ZTsKCgkJfQoKCQlwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVswXT09MHglMDh4XG4iLG51bV9hcnJheVswXSk7CgkJcHJpbnRmKCJyZWdfZGVmX3ZhbHVlX2RhdGFbMV09PTB4JTA4eFxuIixudW1fYXJyYXlbMV0pOwoJCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzJdPT0weCUwOHhcbiIsbnVtX2FycmF5WzJdKTsKCQlwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVszXT09MHglMDh4XG4iLG51bV9hcnJheVszXSk7CgkJcHJpbnRmKCJ0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0lZFxuIixudW1fYXJyYXlbNF0pOwoJCXByaW50ZigidGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0lZFxuIixudW1fYXJyYXlbNV0pOwoJCXByaW50ZigidGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0lZFxuIixudW1fYXJyYXlbNl0pOwoJCXByaW50ZigidGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzddKTsKCgkJaWYodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NCkgLy91Ym9vdCBmaW5pc2gKCQl7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCXByaW50ZigiY2xvc2UgIHdhdGNoZG9nXG4iKTsKCgkJCS8vIHVuc2lnbmVkIGludCAgIGFjbWRscj0gMDsKCgoJCQl7CgkJCQkvL2FjbWRscj1kb19kZHJfcmVhZF9hY21kbHIoKTsKCQkJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCQkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsc3RlcD0lZCBwcywxMHN0ZXA9JWQgcHMsMTAwc3RlcD0lZCBwcyxcbiIsYWNtZGxyLGFjbWRscixnbG9iYWxfZGRyX2NsaywKCQkJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgoJCQkJcHJpbnRmKCJcbmxjZF9vZmZzZXQ9MHglMDh4LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSU0ZCAgICx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSU0ZCAgICIsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKTsKCQkJCXByaW50ZigiXG5sY2Rfb2Zmc2V0PTB4JTA4eCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0lNGQgcHMsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0lNGQgcHMiLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wqZGVsYXlfc3RlcF94MTAwLzEwMCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKmRlbGF5X3N0ZXBfeDEwMC8xMDApOwoKCQkJCXByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOwoKCgkJCX0KCQkJaWYoZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrJjIpCgkJCXsKCQkJCWlmKGRkcl90ZXN0X3Vib290X2xvb3ApCgkJCQl7CgkJCQkJeyAgICAgICAgICAgIHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9MDsKCQkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCXByaW50ZigiXG4gY2xlYXIgc3RpY2t5IHJlZ2lzdGVyIHNob3VsZCByZXNldCx0aGVuIG92ZXIgd3JpdGUgLi4uLlxuIik7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJCXJldHVybiAxOwoJCQl9CgkJfQoKCgoJCS8vaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTApKSAgIC8vMCB0ZXN0IGxlZnQgZWRnZSBiZWdpbiAgICAgMSB0ZXN0IGxlZnQgZWRnZSBvbmdvaW5nICAgICAyLy9sZWZ0X2ZpbmlzaCAgICAgMyByaWdodCBlZGdlIG9uZ29pbmcgICAgNCByaWdodCBmaW5pc2ggIC8vNSBrZXJuZWwgbGVmdCBlZGdlIG9uZ29pbmcgNiBrZXJuZWwgbGVmdCBmaW5pc2ggICAgNyBrZXJuZWwgcmlnaHQgb25nb2luZwoJCS8vICB1Ym9vdCBmaW5kIGZyb20gcGFzcyB0byBmYWlsIG9mZnNldCAwLT5tYXgKCQkvL2tlcm5lbCBmaW5kIGZyb20gZmFpbCB0byBwYXNzIG9mZnNldCBmcm9tIG1heCAtPjAgCgkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM8NCkpICAvLy8vICB1Ym9vdCBmaW5kIGZyb20gcGFzcyB0byBmYWlsIG9mZnNldCAwLT5tYXgKCQl7CgkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTIpCgkJCQkJfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT02KQoJCQkgICkKCQkJewoJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09Myl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQl7CgkJCQlpZih0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9QQVNTKSAvL3Bhc3MgMiBlcnJvciAxCgkJCQl7CgkJCQkJLy8JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJewoKCQkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8PXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJewoJCQkJCQkJCQl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz10ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZysxOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCQl9CgkJCQkJCQl9CgoJCQkJCQl9CgoKCgoJCQkJCX0KCQkJCQlpZih0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZykKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwkJCQoJCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQkJd2hpbGUoMSk7CgkJCQkJfQoJCQkJfQoKCQkJCWVsc2UgCWlmKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX0ZBSUwpIC8vcGFzcyAxIGVycm9yIDIKCQkJCXsKCgkJCQkJLy8gIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7CgkJCQkJLy8gdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0oKHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0Pj4xNikmMHhmZmZmKTsKCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sLTE7CgkJCQkJfQoJCQkJCWVsc2UgCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCQkJewoJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3ItMTsgIAoJCQkJCX0KCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbHwodGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjw8MTYpKTsKCQkJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoJCQkJCXRlbXBfY291bnQ9NzsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCgkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9OVUxMOwoJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsJCQkKCQkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQkJdGVtcF9jb3VudD02OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQl9CgoKCgkJCS8vICAgIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7CgkJCS8vIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9KCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldD4+MTYpJjB4ZmZmZik7CgkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSkpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCXsKCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCsxOwoJCQl9CgkJCWVsc2UgCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQl7CgkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IrMTsgIAoJCQl9CgkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sfCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPDwxNikpOwoJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTc7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD01OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgoKCQkJewoKCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQl7CgkJCQkJcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgICAgKG51bV9hcnJheVslZF0pID09JTA4eCBcbiIsbGFuZV9zdGVwX2NvdW50LzIsKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pKTsKCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCXsKCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpLXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w7CgkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZiktdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbDsKCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQl7dGVzdF9sY2Rscl90ZW1wX3ZhbHVlPTA7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCQkJewoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZikrdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjsKCQkJCQkJfQoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpK3Rlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I7CgoJCQkJCQl9CgkJCQkJfQoKCgoJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkodGVzdF9sY2Rscl90ZW1wX3ZhbHVlKSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCX0KCgoKCgkJCX0KCgkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJaWYodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz40KQoJCQl7CgkJCQkvL2Rkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUoa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCQkvLyAgdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJLy8gbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJLy8gdGVtcF9jb3VudD01OwoJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJcnVuX2NvbW1hbmQoInJ1biBzdG9yZWJvb3QiLDApOwoJCQkJd2hpbGUoMSk7CgkJCX0gZWxzZQoJCQl7CgkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCX0KCgkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCXsKCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQl3aGlsZSgxKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgoKCgkJCQl7CgkJCQkJLy93cml0ZSBvcmcgdmFsdWUKCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCXsKCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpOwoJCQkJCQl9CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZik7CgkJCQkJCX0KCQkJCQkJZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2RhdGFfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkodGVzdF9sY2Rscl90ZW1wX3ZhbHVlKSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoKCgoJCQkJfQoKCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCXRlbXBfY291bnQ9NTsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCXdoaWxlKDEpOwoKCgoKCgkJCX0KCQl9CgoKCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT02KSkKCQl7CgkJCXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0g7CgkJCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCXRlbXBfY291bnQ9NDsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsvL0REUl9URVNUX05VTEw7CgkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD01OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQl9CgkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM+PTQpKSAgIC8vLy9rZXJuZWwgZmluZCBmcm9tIGZhaWwgdG8gcGFzcyBvZmZzZXQgZnJvbSBtYXggLT4wIAoJCXsKCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTApfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MikKCQkJCQl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT00KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTYpCgkJCSAgKQoJCQl7CgkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsKCQkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQkJCXRlbXBfY291bnQ9NjsKCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQl9CgoJCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCXsKCQkJCWlmKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX1BBU1MpIC8vcGFzcyAyIGVycm9yIDEKCQkJCXsKCQkJCQkvLwl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsKCgkJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9OVUxMOwoJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQl7CgoJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQl7CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQkJewoKCQkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTw9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCQl7CgkJCQkJCQkJCXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnPXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnKzE7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJCXsKCQkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZik8PXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQkJewoJCQkJCQkJCQl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz10ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZysxOwoJCQkJCQkJCX0KCQkJCQkJCX0KCgkJCQkJCX0KCgoKCgkJCQkJfQoJCQkJCS8vIGlmKHRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnKQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CQkJCgkJCQkJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQkJCQkJdGVtcF9jb3VudD02OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl3aGlsZSgxKTsKCQkJCQl9CgkJCQl9CgoJCQkJZWxzZSAJaWYoKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX0ZBSUwpIAoJCQkJCQkvL3x8KHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX05VTEwpKS8vcGFzcyAyIGVycm9yIDEKCQkJCQkpCgkJCQkJewoKCQkJCQkJLy8gIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7CgkJCQkJCS8vIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9KCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldD4+MTYpJjB4ZmZmZik7CgkJCQkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSkpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbC0xOwoJCQkJCQl9CgkJCQkJCWVsc2UgCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCQkJCXsKCQkJCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfci0xOyAgCgkJCQkJCX0KCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2x8KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I8PDE2KSk7CgkJCQkJCW51bV9hcnJheVs3XQk9CXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0CQk7CgkJCQkJCXRlbXBfY291bnQ9NzsKCQkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgoKCQkJCQkJLy8gdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9OVUxMOwoJCQkJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7CgkJCQkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQkJdGVtcF9jb3VudD01OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgkJCQkJfQoJCQkJZWxzZSBpZiAodGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD09RERSX1RFU1RfTlVMTCkvL3Bhc3MgMiBlcnJvciAxCgkJCQl7cHJpbnRmKCJcbmZpbmQgZHJvcCBwb3dlcix0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PSVkIFxuIix0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0KTsKCQkJCX0KCgkJCQlkZHJfdGVzdF93YXRjaGRvZ19lbmFibGUodGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCQlkZHJfdGVzdF93YXRjaGRvZ19jbGVhcigpOwoKCQkJCXsKCgkJCQkJZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQl7CgkJCQkJCXByaW50ZigiXG4gICAgICAgICAgICAgICAgICAgIChudW1fYXJyYXlbJWRdKSA9PSUwOHggXG4iLGxhbmVfc3RlcF9jb3VudC8yLChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKSk7CgkJCQkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSkpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJCXsKCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpLXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w7CgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCQl7dGVzdF9sY2Rscl90ZW1wX3ZhbHVlPTA7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpLXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w7CgkJCQkJCQkJaWYoKCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik8dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCQl7dGVzdF9sY2Rscl90ZW1wX3ZhbHVlPTA7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQkJCQl7CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKSt0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yOwoJCQkJCQkJfQoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpK3Rlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I7CgoJCQkJCQkJfQoJCQkJCQl9CgoKCgkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJKHRlc3RfbGNkbHJfdGVtcF92YWx1ZSksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJfQoKCgoKCQkJCX0KCgkJCQkvL2hlcmUgd2lsbCBkZWFkCgkJCQlpZih0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPjQpCgkJCQl7CgkJCQkJLy9kZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCQkvLyAgdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJCS8vIG51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJCQkvLyB0ZW1wX2NvdW50PTU7CgkJCQkJLy8gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCS8vIHRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9IGVsc2UKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3I9ZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQl9CgoJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCXsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgkJCQkJewoJCQkJCQkvL3dyaXRlIG9yZyB2YWx1ZQoJCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCQl7CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTsKCQkJCQkJCX0KCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKTsKCQkJCQkJCX0KCQkJCQkJCWRvX2Rkcl9yZWFkX3dyaXRlX2Rkcl9kYXRhX3dpbmRvd19sY2RsciggcmFua19pbmRleCxsYW5lX3N0ZXBfY291bnQsCgkJCQkJCQkJCSh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCQl9CQkJCQkJCSAKCgkJCQkJfQoKCQkJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX1BBU1M7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz49OCkgLy9maW5pc2gKCXsKCQlkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJCXByaW50ZigiY2xvc2UgIHdhdGNoZG9nXG4iKTsKCgoKCQl7CgkJCS8vYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoJCQlkZWxheV9zdGVwX3gxMDA9MTAwKjEwMDAwMDAvKDIqZ2xvYmFsX2Rkcl9jbGsqYWNtZGxyKTsKCQkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsc3RlcD0lZCBwcywxMHN0ZXA9JWQgcHMsMTAwc3RlcD0lZCBwcyxcbiIsYWNtZGxyLGFjbWRscixnbG9iYWxfZGRyX2NsaywKCQkJCQlkZWxheV9zdGVwX3gxMDAvMTAwLGRlbGF5X3N0ZXBfeDEwMC8xMCxkZWxheV9zdGVwX3gxMDApOwoKCgkJCXByaW50ZigiXG5sY2Rfb2Zmc2V0PTB4JTA4eCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0lNGQgICAsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0lNGQgICAiLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcik7CgkJCXByaW50ZigiXG5sY2Rfb2Zmc2V0PTB4JTA4eCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0lNGQgcHMsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0lNGQgcHMiLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wqZGVsYXlfc3RlcF94MTAwLzEwMCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKmRlbGF5X3N0ZXBfeDEwMC8xMDApOwoJCQlwcmludGYoIlxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKCgkJCXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX1NUQVRVU19LRVJORUxfRklOSVNIOwoJCQludW1fYXJyYXlbNF0JPQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTQ7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJfQoJfQoKCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9MHhmZmZmOwoJewoJCS8vCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwoJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQl0ZW1wX2NvdW50PTY7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJfQoJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCS8vICB0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7ICAvL3Bhc3MgMiBlcnJvciAxCglydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7Cgl3aGlsZSgxKTsKCXJldHVybiAxOwp9CgoKaW50IGRvX2RkcjRfdGVzdF9kcmFtX2Nsa191c2Vfc3RpY2t5KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8vKgoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCWNoYXIgKmVuZHA7CgojZGVmaW5lIFRFU1RfRFJBTV9DTEtfVVNFX0VOViAgMQoJcHJpbnRmKCJcbnR1bmUgZGRyIENMSyB1c2UgdWJvb3Qgc3RpY2t5IHJlZ2lzdGVyXG4iKTsKCiNkZWZpbmUgIEREUl9DT1JTU19UQUxLX1RFU1RfU0laRSAgIDB4MjAwMDAKI2RlZmluZSAgRERSX1RFU1RfTUlOX0ZSRVFfTElNSVRFRCAgNTAKI2RlZmluZSAgRERSX1RFU1RfTUlOX0ZSRVEgIDMwMAoJLy8gICAjZGVmaW5lICBERFJfVEVTVF9NQVhfRlJFUSAgMzAwMAoKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCBzdGFydF9mcmVxPUREUl9URVNUX01JTl9GUkVROwoJdW5zaWduZWQgaW50IGVuZF9mcmVxPUREUl9URVNUX01BWF9GUkVROwoJdW5zaWduZWQgaW50IHRlc3RfbG9vcHM9MTsKCWlmIChhcmdjID09IDEpCgl7CgkJcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJc3RhcnRfZnJlcT1ERFJfVEVTVF9NSU5fRlJFUTsKCQllbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCgl9CgoJaWYgKGFyZ2MgPT0gMikKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT1ERFJfVEVTVF9NSU5fRlJFUTsKCQllbmRfZnJlcT1ERFJfVEVTVF9NQVhfRlJFUTsKCX0KCWlmIChhcmdjPT0gMykKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJZW5kX2ZyZXE9RERSX1RFU1RfTUFYX0ZSRVE7CgoJfQoJaWYgKGFyZ2M9PSA0KQoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlzdGFydF9mcmVxPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAwKTsKCQllbmRfZnJlcT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCgl9CglpZiAoYXJnYz4gNCkKCXsKCQlkZHJfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJc3RhcnRfZnJlcT0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJZW5kX2ZyZXE9c2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJdGVzdF9sb29wcz1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCX0KCXVuc2lnbmVkIGludCB0ZW1wX3Rlc3RfZXJyb3I9MHgwOwoJdW5zaWduZWQgaW50IGRkcl9wbGw9MDsKCXVuc2lnbmVkIGludCBkZHJfY2xrX29yZz0wOwoJdW5zaWduZWQgaW50IGRkcl9jbGtfaG9wZV90ZXN0PTA7CglkZHJfcGxsID0gcmRfcmVnKEFNX0REUl9QTExfQ05UTCk7CgkvL2Rkcl9wbGw9ZGRyX3BsbF9vcmc7Cgl1bnNpZ25lZCBpbnQgZGRyX2NsayA9IHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CglkZHJfY2xrX29yZz1kZHJfY2xrOwoJcHJpbnRmKCJcbmRkcl9jbGs9PSAlZE1IelxuIiwgZGRyX2Nsayk7CglwcmludGYoIlxuc3RhcnRfZnJlcT09ICVkTUh6XG4iLCBzdGFydF9mcmVxKTsKCXByaW50ZigiXG5lbmRfZnJlcT09ICVkTUh6XG4iLCBlbmRfZnJlcSk7CglkZHJfcGxsID0gZGRyX2Nsa19jb252ZXJ0X3RvX3BsbChkZHJfY2xrKTsKCS8vCXsKCS8vCXdyX3JlZyhBTV9ERFJfUExMX0NOVEwsICgoKHJkX3JlZyhBTV9ERFJfUExMX0NOVEwpKSYofigweGZmZmZmKSkpfChkZHJfcGxsKSkpOwoJLy8JZGRyX3VkZWxheSgyMDAwKTsKCS8vfQoKCgl1bnNpZ25lZCBpbnQgZnJlcV90YWJsZV90ZXN0X3ZhbHVlWyhERFJfVEVTVF9NQVhfRlJFUSkvMjRdOyAvLyBzdGVwID0wIGluaXQgICwxIHRlc3QgZmFpbCwgLDIgdGVzdCBwYXNzLDMgdGVzdCBza2lwOwoJLy8gIGNoYXIgY2hhcl9mcmVxX25hbWVfdGFibGVbMzBdOwoJLy8gIGNvbnN0IGNoYXIgKnBfY2hhcl9mcmVxX3RhYmxlOwoKCS8vIGNvbnN0IGNoYXIgKnBfY2hhcl9kZHJfdGVzdF9zdGVwOwoJLy8gY29uc3QgY2hhciAqIHBfY2hhcl9mcmVxX29yZzsKCWNoYXIgY2hhcl9mcmVxX29yZ1szMF07CglpbnQgIGRkcl9mZXFfdGVzdF9zdGVwPTA7IC8vIHN0ZXAgPTAgaW5pdCAsMSBnb2luZyAsMiBkb25lOwoKCS8vIGNvbnN0IGNoYXIgKiBwX2NoYXJfZnJlcV9uYW1lX3RhYmxlOwoJY2hhciBjaGFyX2ZyZXFfbmFtZV90YWJsZVszMF07CgljaGFyIGNoYXJfY21kX3RhYmxlWzEwMF07CgkvL2NoYXIgKiBwX2NoYXJfc3RvcmVfYm9vdDsKCS8vICBjaGFyIGNoYXJfZnJlcV9zdG9yZV9ib290WzIwMF07CgoJLy9jb25zdCBjaGFyICpwX2ZyZXFfdGFibGVfaW50OwoJLy9jaGFyIGNoYXJfZGRyX2ZlcV90ZXN0X3N0ZXBbXT0iZGRyX2ZlcV90ZXN0X3N0ZXAiOwoJLy8gY29uc3QgY2hhciAqdmFybmFtZTsKCS8vIGNvbnN0IGNoYXIgKnZhcnZhbHVlOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCB0ZW1wX2NvdW50X3N1Yj0wOwoKCgoJdW5zaWduZWQgaW50IHN0cl90b19udW1hcnJ5WzY0XTsKCXVuc2lnbmVkIGludCAqbnVtX2Fycnk7CgoJbnVtX2FycnkgPSAodW5zaWduZWQgaW50ICopKCZzdHJfdG9fbnVtYXJyeSk7CgkvL2ludCBpOwoKCXVuc2lnbmVkIGludCBsY2Rscl90ZW1wX2NvdW50PTA7Cgl7CgkJewoKCQkJc3RpY2t5X3JlZ19iYXNlX2FkZD0oRERSMF9QVUJfUkVHX0JBU0UmMHhmZmZmMDAwMCkrKChETUNfU1RJQ0tZXzApJjB4ZmZmZik7CgoJCQlmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykgewoJCQkJZG1jX3N0aWNreVtpXT1yZF9yZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCsoaTw8MikpOwoJCQkJLy9wcmludGYoInN0cl90b19udW1hcnJ5WyVkXT09JWRcbiIsaSxudW1fYXJyeVtpXSk7CgkJCX0KCgkJCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKSB7CgkJCQludW1fYXJyeVtpXT1kbWNfc3RpY2t5W2ldOwoJCQkJcHJpbnRmKCJzdHJfdG9fbnVtYXJyeVslZF09PSVkXG4iLGksbnVtX2FycnlbaV0pOwoJCQl9CgoJCX0KCX0KCiNkZWZpbmUgCUREUl9GRVFfVEVTVF9TVEVQX09GRlNFVCAgOAoJLy8jZGVmaW5lIAlERFJfRkVRX1RFU1RfU1RFUF9PRkZTRVQgIDgKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18wX2NtZDAgPTA7ICAvL21hc3RlciBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18xX2NtZDEgPTA7ICAvL21pbiBjbWQKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ18yX3N0ZXAgPTA7IC8vc3RlcCAwICBpbml0ICAtMSBsYW5lMCB3IG1pbiAgLTIgbGFuZTAgdyBtYXggLTMgbGFuZTAgciBtaW4gICAgNCBsYW5lMCByIG1heCAtLS0tLTUgbGFuZTEgdyBtaW4gLi4uCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfM19mcmVxID0wOwoJdW5zaWduZWQgaW50IHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMgPTA7IC8vdWJvb3QgdGVzdCB3ZSBzaG91bGQgcmVhZCBlcnJvciB0aGVuIGRvbmUgc3RhdHVzLiAgMCBubyB0ZXN0IDEgb25nb2luZyAyIHRoaXMgc3RlcCBkb25lICBmYWlsIG9yIHBhc3MKCS8vICB1bnNpZ25lZCBpbnQgICBsYW5lX3N0ZXA9IDA7CgkvL2NoYXIgc3RyWzI0XTsKCXVuc2lnbmVkIGludCBib290X3RpbWVzPTA7CgoJdGVzdF9hcmdfMF9jbWQwPW51bV9hcnJ5WzBdOwoJdGVzdF9hcmdfMV9jbWQxPW51bV9hcnJ5WzFdOwoJdGVzdF9hcmdfMl9zdGVwPW51bV9hcnJ5WzJdOwoJdGVzdF9hcmdfM19mcmVxPW51bV9hcnJ5WzNdOwoJdGVzdF9hcmdfNF9zdGVwX3N0YXR1cz1udW1fYXJyeVs0XTsKCWJvb3RfdGltZXM9bnVtX2FycnlbNV07CglsY2Rscl90ZW1wX2NvdW50PW51bV9hcnJ5WzZdOwoJcHJpbnRmKCJ0ZXN0X2FyZ18wX2NtZDA9PSVkXG4iLHRlc3RfYXJnXzBfY21kMCk7CglwcmludGYoInRlc3RfYXJnXzBfY21kMT09JWRcbiIsdGVzdF9hcmdfMV9jbWQxKTsKCXByaW50ZigidGVzdF9hcmdfMl9zdGVwPT0lZFxuIix0ZXN0X2FyZ18yX3N0ZXApOwoJcHJpbnRmKCJ0ZXN0X2FyZ18zX2ZyZXE9PSVkXG4iLHRlc3RfYXJnXzNfZnJlcSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9zdGF0dXM9PSVkXG4iLHRlc3RfYXJnXzRfc3RlcF9zdGF0dXMpOwoJcHJpbnRmKCJ0ZXN0X2FyZ181IGJvb3R0aW1lcz0lZFxuIixudW1fYXJyeVs1XSk7CglwcmludGYoInRlc3RfYXJnXzYgbGNkbHJfdGVtcF9jb3VudD0lZFxuIixudW1fYXJyeVs2XSk7CglwcmludGYoInRlc3RfYXJnXzc9JWRcbiIsbnVtX2FycnlbN10pOwoKCWlmKChudW1fYXJyeVs3XT09RE1DX1NUSUNLWV9NQUdJQ18xKSkgLy9mb3IgY2hlY2sgbWFnaWMgbnVtYmVyIG1ha2Ugc3VtZSBlbnRlciB0ZXN0IGNvbW1hbmQKCXtib290X3RpbWVzKys7CgoJfQoJZWxzZQoJe2Jvb3RfdGltZXM9MDsKCQlwcmludGYoInRlc3Rfc3RpY2t5IGlzIG5vdCBtYWdpYyBudW1tYmVyLGJvb3QgdGltZXM9PSVkXG4iLGJvb3RfdGltZXMpOwoJCS8vIHdyaXRlbChETUNfU1RJQ0tZX01BR0lDXzAsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDY8PDIpKSk7CgkJd3JpdGVsKERNQ19TVElDS1lfTUFHSUNfMSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoNzw8MikpKTsKCQl0ZXN0X2FyZ18yX3N0ZXA9MDsKCQludW1fYXJyeVs2XT0wOwoJCWxjZGxyX3RlbXBfY291bnQ9MDsKCQkvL3JldHVybiAxOwoJfQoJbnVtX2FycnlbNV09Ym9vdF90aW1lczsKCgl3cml0ZWwobnVtX2FycnlbNV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKDU8PDIpKSk7CgoKCglpZih0ZXN0X2FyZ18yX3N0ZXA9PTApCgl7CgoJCXRlc3RfYXJnXzBfY21kMD0weDI4OwoJCXRlc3RfYXJnXzFfY21kMT0wOwoJCXRlc3RfYXJnXzJfc3RlcD0xOwoJCXRlc3RfYXJnXzNfZnJlcT1nbG9iYWxfZGRyX2NsazsKCQl0ZXN0X2FyZ180X3N0ZXBfc3RhdHVzPTA7CgkJbGNkbHJfdGVtcF9jb3VudD0wOwoJCW51bV9hcnJ5WzBdPXRlc3RfYXJnXzBfY21kMDsKCQludW1fYXJyeVsxXT10ZXN0X2FyZ18xX2NtZDE7CgkJbnVtX2FycnlbMl09dGVzdF9hcmdfMl9zdGVwOwoJCW51bV9hcnJ5WzNdPXRlc3RfYXJnXzNfZnJlcTsKCQludW1fYXJyeVs0XT10ZXN0X2FyZ180X3N0ZXBfc3RhdHVzOwoJCW51bV9hcnJ5WzVdPWJvb3RfdGltZXM7CgkJbGNkbHJfdGVtcF9jb3VudD1udW1fYXJyeVs2XTsKCQludW1fYXJyeVs2XT1sY2Rscl90ZW1wX2NvdW50OwoJCW51bV9hcnJ5WzddPURNQ19TVElDS1lfTUFHSUNfMTsKCQlmb3IgKGkgPSA4OyBpIDwgNjM7IGkrKykgewoJCQludW1fYXJyeVtpXT0wOwoJCX0KCX0KCglmb3IgKGkgPSAwOyBpIDwgNjM7IGkrKykgewoKCQl3cml0ZWwobnVtX2FycnlbaV0sKHN0aWNreV9yZWdfYmFzZV9hZGQrKGk8PDIpKSk7Cgl9CgoKCWRkcl9mZXFfdGVzdF9zdGVwPXJkX3JlZyhzdGlja3lfcmVnX2Jhc2VfYWRkKyg4PDwyKSk7CgkvLwoJLy9wX2NoYXJfZGRyX3Rlc3Rfc3RlcD0gZ2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIpOwoJLy8gaWYgKHBfY2hhcl9kZHJfdGVzdF9zdGVwKQoJewoJCS8vCXByaW50ZigiJXMiLHBfY2hhcl9kZHJfdGVzdF9zdGVwKTsKCgkJLy8gZGRyX2ZlcV90ZXN0X3N0ZXAgPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfY2hhcl9kZHJfdGVzdF9zdGVwLCAmZW5kcCwgMCk7CgkJcHJpbnRmKCJkZHJfZmVxX3Rlc3Rfc3RlcD0lZFxuIixkZHJfZmVxX3Rlc3Rfc3RlcCk7Cgl9CglpZiAoZGRyX2ZlcV90ZXN0X3N0ZXApIHsKCQkvL3BfY2hhcl9mcmVxX29yZz0gZ2V0ZW52KCJkZHJfZmVxX29yZyIpOwoJCS8vaWYgKHBfY2hhcl9mcmVxX29yZykKCQl7CgkJCS8vcHJpbnRmKCIlcyIscF9jaGFyX2ZyZXFfb3JnKTsKCgkJCS8vIGRkcl9jbGtfb3JnID0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX2NoYXJfZnJlcV9vcmcsICZlbmRwLCAxMCk7IC8vbXVzdCB1c2UgMTAgLGZyZXEgIDA3OTIgbWF5YmUgbm90IHJlYWQgc3Vzc2NlZnVsIHVzZSAwIGF1dG8gcmVhZAoJCQlkZHJfY2xrX29yZz1yZF9yZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCsoOTw8MikpOwoJCQlwcmludGYoImRkcl9jbGtfb3JnPSVkXG4iLGRkcl9jbGtfb3JnKTsKCQl9Cgl9CglpZiAoZGRyX2ZlcV90ZXN0X3N0ZXAgPT0gMCkKCXsKCQlkZHJfZmVxX3Rlc3Rfc3RlcD0xOwoJCWRkcl9jbGtfb3JnPWRkcl9jbGs7CgkJc3ByaW50ZihjaGFyX2ZyZXFfb3JnLCIlMDRkIixkZHJfY2xrKTsKCQlwcmludGYoIlxuZGRyX29yZ19mcmVxPSVzXG4iLGNoYXJfZnJlcV9vcmcpOwoJCS8vc2V0ZW52KCJkZHJfZmVxX29yZyIsIGNoYXJfZnJlcV9vcmcpOwoJCXdyaXRlbChkZHJfY2xrLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg5PDwyKSkpOwoKCgkJdGVtcF9jb3VudD0oc3RhcnRfZnJlcS8yNCk7CgkJd2hpbGUgKHRlbXBfY291bnQ8KEREUl9URVNUX01BWF9GUkVRLzI0KSkgewoKCQkJLy8gc3ByaW50ZihmcmVxX3RhYmxlLCIlcyUwNGQgJTAxZCAlMDFkICAiLGZyZXFfdGFibGUsKHRlbXBfY291bnQqMTIpLDAsMCk7CgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpKTsKCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJLy9zZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIwIik7CgkJCS8vc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIxIik7CgkJCXdyaXRlbCgwLChzdGlja3lfcmVnX2Jhc2VfYWRkKygoMTArdGVtcF9jb3VudC0oc3RhcnRfZnJlcS8yNCkpPDwyKSkpOwoJCQl3cml0ZWwoMSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoODw8MikpKTsKCQkJdGVtcF9jb3VudCsrOwoJCX0KCQl0ZW1wX2NvdW50PShzdGFydF9mcmVxLzI0KTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKHN0YXJ0X2ZyZXEpLzI0KSkgewoKCQkJLy8gc3ByaW50ZihmcmVxX3RhYmxlLCIlcyUwNGQgJTAxZCAlMDFkICAiLGZyZXFfdGFibGUsKHRlbXBfY291bnQqMTIpLDAsMCk7CgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpKTsKCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJLy9zZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUsICIzIik7CgkJCS8vc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIxIik7CgkJCXdyaXRlbCgzLChzdGlja3lfcmVnX2Jhc2VfYWRkKygoMTArdGVtcF9jb3VudC0oc3RhcnRfZnJlcS8yNCkpPDwyKSkpOwoJCQl3cml0ZWwoMSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoODw8MikpKTsKCQkJdGVtcF9jb3VudCsrOwoJCX0KCQl3aGlsZSAodGVtcF9jb3VudD4oKGVuZF9mcmVxKS8yNCkpIHsKCgkJCS8vIHNwcmludGYoZnJlcV90YWJsZSwiJXMlMDRkICUwMWQgJTAxZCAgIixmcmVxX3RhYmxlLCh0ZW1wX2NvdW50KjEyKSwwLDApOwoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgkJCS8vc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJCQkvL3NldGVudigiZGRyX2ZlcV90ZXN0X3N0ZXAiLCAiMSIpOwoJCQl3cml0ZWwoMywoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpKTsKCQkJd3JpdGVsKDEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDg8PDIpKSk7CgkJCXRlbXBfY291bnQrKzsKCQl9CgoJCS8vcF9jaGFyX3N0b3JlX2Jvb3Q9IGdldGVudigic3RvcmVib290Iik7CgkJLy9pZiAocF9jaGFyX3N0b3JlX2Jvb3QpCgkJLy9wcmludGYoInN0b3JlYm9vdCAgICVzXG4iLHBfY2hhcl9zdG9yZV9ib290KTsKCQkvLwlzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxYyAgMHglMDh4ICVkICVkICVkOyVzOyIsZGRyX3Rlc3Rfc2l6ZSxzdGFydF9mcmVxLGVuZF9mcmVxLHRlc3RfbG9vcHMscF9jaGFyX3N0b3JlX2Jvb3QpOwoJCS8vCXNldGVudigic3RvcmVib290IiwgY2hhcl9jbWRfdGFibGUpOwoKCQkvLwkgcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCgoJCXsKCQl9CgoJfQoKCWlmIChkZHJfZmVxX3Rlc3Rfc3RlcCA9PSAxKQoJewoKCQl0ZW1wX2NvdW50PShzdGFydF9mcmVxLzI0KTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKEREUl9URVNUX01BWF9GUkVRKS8yNCkpIHsKCgkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpKTsKCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJZGRyX2ZlcV90ZXN0X3N0ZXA9cmRfcmVnKHN0aWNreV9yZWdfYmFzZV9hZGQrKDg8PDIpKTsKCQkJLy8JcF9jaGFyX2ZyZXFfbmFtZV90YWJsZT0gZ2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJLy8gaWYgKHBfY2hhcl9mcmVxX25hbWVfdGFibGUpCgkJCXsKCQkJCS8vCXByaW50ZigiJXNcbiIscF9jaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCQkJLy8gIGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSwgJmVuZHAsIDApOwoJCQkJZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID1yZF9yZWcoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpOwoJCQkJcHJpbnRmKCIlcyB8ICVkXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgoKCQkJfQoJCQl0ZW1wX2NvdW50Kys7CgkJfQoKCQl0ZW1wX2NvdW50PShzdGFydF9mcmVxLzI0KTsKCQl3aGlsZSAodGVtcF9jb3VudDwoKEREUl9URVNUX01BWF9GUkVRKS8yNCkpIHsKCQkJZGRyX2Nsa19ob3BlX3Rlc3Q9KHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpOwoJCQlpZiAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID09MSkKCQkJewoJCQkJdGVtcF9jb3VudF9zdWI9dGVtcF9jb3VudCsxOwoJCQkJd2hpbGUgKChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudF9zdWIqMjQpKSkgPT0KCQkJCQkJKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpKQoJCQkJe3RlbXBfY291bnRfc3ViPXRlbXBfY291bnRfc3ViKzE7CgkJCQl9CgkJCQl3aGlsZSAodGVtcF9jb3VudF9zdWI8KChERFJfVEVTVF9NQVhfRlJFUSkvMjQpKSB7CgkJCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnRfc3ViKjI0KSkpKTsKCQkJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkJCS8vIGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50X3N1Yl0gPTE7CgkJCQkJLy8Jc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMyIpOwoJCQkJCXdyaXRlbCgzLChzdGlja3lfcmVnX2Jhc2VfYWRkKygoMTArdGVtcF9jb3VudF9zdWItKHN0YXJ0X2ZyZXEvMjQpKTw8MikpKTsKCgkJCQkJdGVtcF9jb3VudF9zdWIrKzsKCQkJCX0KCQkJCXsKCQkJCQlkZHJfZmVxX3Rlc3Rfc3RlcCsrOwoJCQkJCS8vc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIyIik7CgkJCQkJLy8gcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJCQkJCXdyaXRlbCgyLChzdGlja3lfcmVnX2Jhc2VfYWRkKyg4PDwyKSkpOwoKCQkJCX0KCQkJCXtkZHJfY2xrX2hvcGVfdGVzdD1kZHJfY2xrX29yZzsKCQkJCX0KCQkJCXNwcmludGYoY2hhcl9jbWRfdGFibGUsImRkcl90ZXN0X2NtZCAweDE3ICVkIDAgMCAwIixkZHJfY2xrX2hvcGVfdGVzdCk7CgkJCQlwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwoJCQkJcnVuX2NvbW1hbmQoY2hhcl9jbWRfdGFibGUsMCk7CgoJCQl9CgkJCWlmIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPT0wKQoJCQl7CgkJCQlpZiAoKGRkcl9jbGtfaG9wZV90ZXN0KSAhPSAoZGRyX2NsaykpCgkJCQl7CgkJCQkJc3ByaW50ZihjaGFyX2NtZF90YWJsZSwiZGRyX3Rlc3RfY21kIDB4MTcgJWQgMCAwIDAiLGRkcl9jbGtfaG9wZV90ZXN0KTsKCQkJCQlwcmludGYoIlxuY2hhcl9jbWRfdGFibGU9JXNcbiIsY2hhcl9jbWRfdGFibGUpOwoJCQkJCXJ1bl9jb21tYW5kKGNoYXJfY21kX3RhYmxlLDApOwoJCQkJfQoJCQkJaWYgKChkZHJfY2xrX2hvcGVfdGVzdCkgPT0gKGRkcl9jbGspKQoJCQkJewoKCQkJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCQkJcHJpbnRmKCJcbmNoYXJfZnJlcV9uYW1lX3RhYmxlPSVzXG4iLGNoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCQkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPTE7CgkJCQkJLy8gc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMSIpOwoJCQkJCS8vIHJ1bl9jb21tYW5kKCJzYXZlIiwwKTsKCQkJCQl3cml0ZWwoMSwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpKTsKCgoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCQl3aGlsZSAodGVzdF9sb29wcy0tKSB7CgkJCQkJCXRlbXBfdGVzdF9lcnJvcj10ZW1wX3Rlc3RfZXJyb3IrZGRyX3Rlc3Rfc19jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgkJCQkJfQoJCQkJCS8vdGVtcF90ZXN0X2Vycm9yPXRlbXBfdGVzdF9lcnJvcitkZHJfdGVzdF9zX2FkZF9jcm9zc190YWxrX3BhdHRlcm4oZGRyX3Rlc3Rfc2l6ZSk7CgoJCQkJCXNwcmludGYoY2hhcl9mcmVxX25hbWVfdGFibGUsImRkcl9mcmVfJTA0ZCIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpKTsKCQkJCQlwcmludGYoIlxuY2hhcl9mcmVxX25hbWVfdGFibGU9JXNcbiIsY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJewoJCQkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPTE7CgkJCQkJCS8vIHNldGVudihjaGFyX2ZyZXFfbmFtZV90YWJsZSwgIjEiKTsKCQkJCQkJd3JpdGVsKDEsKHN0aWNreV9yZWdfYmFzZV9hZGQrKCgxMCt0ZW1wX2NvdW50LShzdGFydF9mcmVxLzI0KSk8PDIpKSk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9MjsKCQkJCQkJLy8gc2V0ZW52KGNoYXJfZnJlcV9uYW1lX3RhYmxlLCAiMiIpOwoJCQkJCQl3cml0ZWwoMiwoc3RpY2t5X3JlZ19iYXNlX2FkZCsoKDEwK3RlbXBfY291bnQtKHN0YXJ0X2ZyZXEvMjQpKTw8MikpKTsKCQkJCQl9CgkJCQkJLy8gcnVuX2NvbW1hbmQoInNhdmUiLDApOwoKCQkJCQlkZHJfY2xrX2hvcGVfdGVzdD0odGVtcF9jb3VudCoyNCkrMjQ7CgkJCQkJd2hpbGUgKChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwoZGRyX2Nsa19ob3BlX3Rlc3QpKSkgPT0KCQkJCQkJCShwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSkKCQkJCQl7ZGRyX2Nsa19ob3BlX3Rlc3Q9ZGRyX2Nsa19ob3BlX3Rlc3QrMjQ7CgkJCQkJfQoJCQkJCWlmICh0ZW1wX3Rlc3RfZXJyb3IpCgkJCQkJe2Rkcl9jbGtfaG9wZV90ZXN0PWRkcl9jbGtfb3JnOwoJCQkJCX0KCQkJCQlzcHJpbnRmKGNoYXJfY21kX3RhYmxlLCJkZHJfdGVzdF9jbWQgMHgxNyAlZCAwIDAgMCIsZGRyX2Nsa19ob3BlX3Rlc3QpOwoJCQkJCXByaW50ZigiXG5jaGFyX2NtZF90YWJsZT0lc1xuIixjaGFyX2NtZF90YWJsZSk7CgkJCQkJcnVuX2NvbW1hbmQoY2hhcl9jbWRfdGFibGUsMCk7CgkJCQl9CgoJCQl9CgoKCgoKCQkJdGVtcF9jb3VudCsrOwoJCX0KCQlkZHJfZmVxX3Rlc3Rfc3RlcCsrOwoJCS8vc2V0ZW52KCJkZHJfZmVxX3Rlc3Rfc3RlcCIsICIyIik7CgkJLy9ydW5fY29tbWFuZCgic2F2ZSIsMCk7CgkJd3JpdGVsKDIsKHN0aWNreV9yZWdfYmFzZV9hZGQrKDg8PDIpKSk7CgoJfQoKCWlmIChkZHJfZmVxX3Rlc3Rfc3RlcCA+PSAyKQoJewoJCXByaW50ZigiXG5maW5pc2ggdGVzdCBkZHJfZmVxX3Rlc3Rfc3RlcD0lZFxuIixkZHJfZmVxX3Rlc3Rfc3RlcCk7CgkJdGVtcF9jb3VudD0oc3RhcnRfZnJlcS8yNCk7CgkJd2hpbGUgKHRlbXBfY291bnQ8KChERFJfVEVTVF9NQVhfRlJFUSkvMjQpKSB7CgoJCQlzcHJpbnRmKGNoYXJfZnJlcV9uYW1lX3RhYmxlLCJkZHJfZnJlXyUwNGQiLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSk7CgkJCXByaW50ZigiXG5jaGFyX2ZyZXFfbmFtZV90YWJsZT0lc1xuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSk7CgoJCQkvLwlwX2NoYXJfZnJlcV9uYW1lX3RhYmxlPSBnZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkvLyBpZiAocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSkKCQkJewoJCQkJLy8JcHJpbnRmKCIlc1xuIixwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCgkJCQkvLyBmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPSBzaW1wbGVfc3RydG91bGxfZGRyKHBfY2hhcl9mcmVxX25hbWVfdGFibGUsICZlbmRwLCAwKTsKCQkJCWZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSA9cmRfcmVnKHN0aWNreV9yZWdfYmFzZV9hZGQrKCgxMCt0ZW1wX2NvdW50LShzdGFydF9mcmVxLzI0KSk8PDIpKTsKCQkJCXByaW50ZigiJXMgfCAlZFxuIixjaGFyX2ZyZXFfbmFtZV90YWJsZSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQl9CgkJCXRlbXBfY291bnQrKzsKCQl9CgoJCXByaW50ZigiXG5wcmludCB0ZXN0IGRkcl9mZXFfdGVzdF9yZXN1bHQhISFcbiIpOwoJCXRlbXBfY291bnQ9KHN0YXJ0X2ZyZXEvMjQpOwoJCXdoaWxlICh0ZW1wX2NvdW50PCgoRERSX1RFU1RfTUFYX0ZSRVEpLzI0KSkgewoKCQkJc3ByaW50ZihjaGFyX2ZyZXFfbmFtZV90YWJsZSwiZGRyX2ZyZV8lMDRkIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSkpOwoJCQkvLwlwX2NoYXJfZnJlcV9uYW1lX3RhYmxlPSBnZXRlbnYoY2hhcl9mcmVxX25hbWVfdGFibGUpOwoJCQkvLyBpZiAocF9jaGFyX2ZyZXFfbmFtZV90YWJsZSkKCQkJewoJCQkJLy8JcHJpbnRmKCIlc1xuIixwX2NoYXJfZnJlcV9uYW1lX3RhYmxlKTsKCgkJCQkvLyAgZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdID0gc2ltcGxlX3N0cnRvdWxsX2RkcihwX2NoYXJfZnJlcV9uYW1lX3RhYmxlLCAmZW5kcCwgMCk7CgkJCQlmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0gPXJkX3JlZyhzdGlja3lfcmVnX2Jhc2VfYWRkKygoMTArdGVtcF9jb3VudC0oc3RhcnRfZnJlcS8yNCkpPDwyKSk7CgoJCQkJLy9wcmludGYoIiVkXG4iLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQlpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID09IDApIHsKCQkJCQlwcmludGYoIiUwNGQgIG5vIGluaXQgICAgICVkIFxuIiwocGxsX2NvbnZlcnRfdG9fZGRyX2NsayhkZHJfY2xrX2NvbnZlcnRfdG9fcGxsKHRlbXBfY291bnQqMjQpKSksZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKTsKCQkJCX0KCQkJCWlmICggKGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSkgPT0gMSkgewoJCQkJCXByaW50ZigiJTA0ZCAgZmFpbCAgICAgICVkXG4iLChwbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9jbGtfY29udmVydF90b19wbGwodGVtcF9jb3VudCoyNCkpKSxmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pOwoJCQkJfQoJCQkJaWYgKCAoZnJlcV90YWJsZV90ZXN0X3ZhbHVlW3RlbXBfY291bnRdKSA9PSAyKSB7CgkJCQkJcHJpbnRmKCIlMDRkICBwYXNzICAgICAgJWRcbiIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQl9CgkJCQlpZiAoIChmcmVxX3RhYmxlX3Rlc3RfdmFsdWVbdGVtcF9jb3VudF0pID49IDMpIHsKCQkJCQlwcmludGYoIiUwNGQgIHNraXAgdGVzdCAlZCBcbiIsKHBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX2Nsa19jb252ZXJ0X3RvX3BsbCh0ZW1wX2NvdW50KjI0KSkpLGZyZXFfdGFibGVfdGVzdF92YWx1ZVt0ZW1wX2NvdW50XSk7CgkJCQl9CgkJCQl0ZW1wX2NvdW50Kys7CgkJCX0KCQl9CgoJfQoJLy9zcHJpbnRmKHN0ciwiZGRyX3Rlc3RfYWNfYml0X3NldHVwX2hvbGRfd2luZG93ICBhIDAgIDB4JTA4eCAgJWQgIDB4JTA4eCIsZGRyX3Rlc3Rfc2l6ZSx0ZXN0X2FjX3NldHVwX2hvbGQsKCBsYW5lX3N0ZXApKTsKCS8vCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgkvL3NwcmludGYoc3RyLCAiJWx4IiwgdmFsdWUpOwoJLy8gIHNldGVudigiZW52X2RkcnRlc3QiLCBzdHIpOwoKCS8vcnVuX2NvbW1hbmQoInNhdmUiLDApOwoJLy8qLwoJcmV0dXJuIDE7Cgp9CgoKaW50IGRvX2RkcjRfdGVzdF9iaXN0X3Rlc3RfdXNlX3N0aWNreShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfWlEgICAgIDAKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9BQ19CSVRfU0VUVVAgICAgICAxCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfQUNfQklUX0hPTEQgICAgIDIKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1dSSVRFX0JJVF9TRVRVUCAgICAgIDMKI2RlZmluZSBERFJfVEVTVF9DTURfVEVTVF9EQVRBX1dSSVRFX0JJVF9IT0xEICAgICAgNAojZGVmaW5lIEREUl9URVNUX0NNRF9URVNUX0RBVEFfUkVBRF9CSVRfU0VUVVAgICAgICA1CiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9SRUFEX0JJVF9IT0xEICAgICA2CiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfREFUQV9WUkVGICAgICA3CiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfQ0xLX0lOVkVURVIgICAgIDgKCiNkZWZpbmUgRERSX1RFU1RfQ01EX1RFU1RfRlVMTFRFU1QgICAgIDB4ZmZmZmZmZmYKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgcGxsLCB6cWNyOwoJdW5zaWduZWQgaW50IHpxcHJfc29jX2RyYW09MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9jbWRfc29jX3ZyZWY9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9jbWRfZHJhbV92cmVmPTA7Ly8weDNmOwoJdW5zaWduZWQgaW50IGRkcl90ZXN0X2NtZF96cV92cmVmPTA7Ly8weDNmOwoKCgl1bnNpZ25lZCBpbnQgZGRyX2Z1bGxfdGVzdF9lbmFibGU9MDsKCS8qCiNkZWZpbmUgRERSM19EUlZfNDBPSE0JCTAKI2RlZmluZSBERFIzX0RSVl8zNE9ITQkJMQojZGVmaW5lIEREUjNfT0RUXzBPSE0JCTAKI2RlZmluZSBERFIzX09EVF82ME9ITQkJMQojZGVmaW5lIEREUjNfT0RUXzEyME9ITQkJMgojZGVmaW5lIEREUjNfT0RUXzQwT0hNCQkzCiNkZWZpbmUgRERSM19PRFRfMjBPSE0JCTQKI2RlZmluZSBERFIzX09EVF8zME9ITQkJNQoKCS8vIGxwZGRyMiBkcnYgb2R0IAojZGVmaW5lIExQRERSMl9EUlZfMzRPSE0JMQojZGVmaW5lIExQRERSMl9EUlZfNDBPSE0JMgojZGVmaW5lIExQRERSMl9EUlZfNDhPSE0JMwojZGVmaW5lIExQRERSMl9EUlZfNjBPSE0JNAojZGVmaW5lIExQRERSMl9EUlZfODBPSE0JNgojZGVmaW5lIExQRERSMl9EUlZfMTIwT0hNCTcKI2RlZmluZSBMUEREUjJfT0RUXzBPSE0JCTAKCgkvLyBscGRkcjMgZHJ2IG9kdCAKI2RlZmluZSBMUEREUjNfRFJWXzM0T0hNCTEKI2RlZmluZSBMUEREUjNfRFJWXzQwT0hNCTIKI2RlZmluZSBMUEREUjNfRFJWXzQ4T0hNCTMKI2RlZmluZSBMUEREUjNfRFJWXzYwT0hNCTQKI2RlZmluZSBMUEREUjNfRFJWXzgwT0hNCTYKI2RlZmluZSBMUEREUjNfRFJWXzM0XzQwT0hNCTkKI2RlZmluZSBMUEREUjNfRFJWXzQwXzQ4T0hNCTEwCiNkZWZpbmUgTFBERFIzX0RSVl8zNF80OE9ITQkxMQojZGVmaW5lIExQRERSM19PRFRfME9ITQkJMAojZGVmaW5lIExQRERSM19PRFRfNjBPSE0JMQojZGVmaW5lIExQRERSM19PRFRfMTJPSE0JMgojZGVmaW5lIExQRERSM19PRFRfMjQwSE0JMwoKI2RlZmluZSBERFI0X0RSVl8zNE9ITQkJMAojZGVmaW5lIEREUjRfRFJWXzQ4T0hNCQkxCiNkZWZpbmUgRERSNF9PRFRfME9ITQkJMAojZGVmaW5lIEREUjRfT0RUXzYwT0hNCQkxCiNkZWZpbmUgRERSNF9PRFRfMTIwT0hNCQkyCiNkZWZpbmUgRERSNF9PRFRfNDBPSE0JCTMKI2RlZmluZSBERFI0X09EVF8yNDBPSE0JCTQKI2RlZmluZSBERFI0X09EVF80OE9ITQkJNQojZGVmaW5lIEREUjRfT0RUXzgwT0hNCQk2CiNkZWZpbmUgRERSNF9PRFRfMzRPSE0JCTcKKi8KCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWludCBpIDsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29kdAkJCQk9IDA7Cgl1bnNpZ25lZCBpbnQgYmlzdF90ZXN0X2RxX2luZGV4CQkJCT0gMHhmZjsKCS8vdW5zaWduZWQgaW50IGRyYW1fZHJ2CQkJCT0gMDsKCS8vdW5zaWduZWQgaW50IGRyYW1fb2R0CQkJCT0gMDsKCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cyAqLwoJaWYgKGFyZ2MgPCAyKQoJCWdvdG8gdXNhZ2U7CgoJcGxsID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwwKTsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlwcmludGYgKCJFcnJvcjogV3JvbmcgZm9ybWF0IHBhcmFtZW50IVxuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoYXJnYyA+MikKCXsKCQl6cWNyID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQl6cWNyID0gMDsKCQl9Cgl9CgllbHNlCgl7CgkJenFjciA9IDA7Cgl9CgliaXN0X3Rlc3RfZHFfaW5kZXg9MHhmZjsKCWlmKHpxY3I9PTB4ZmZmZmZmZmYpCgl7CgkJZGRyX2Z1bGxfdGVzdF9lbmFibGU9MTsKCQl6cWNyPTA7fQoKCWVsc2UgaWYoenFjcj4+MjQpCgl7CgkJYmlzdF90ZXN0X2RxX2luZGV4PTArKHpxY3I+PjI0KTsKCQl6cWNyPXpxY3ImMHgwMGZmZmZmZjsKCX0KCglwcmludGYoImJpc3RfdGVzdF9kcV9pbmRleFslZF0sXG4iLCBiaXN0X3Rlc3RfZHFfaW5kZXgpOwoKCWlmIChhcmdjID4zKQoJewoJCS8vIHNvY19kYXRhX2Rydl9vZHQ9enFwcl9zb2NfZHJhbSYweGZmZmZmOwoJCS8vIGRyYW1fZHJ2PSh6cXByX3NvY19kcmFtPj4yMCkmMHhmOwoJCS8vICBkcmFtX29kdD0oenFwcl9zb2NfZHJhbT4+MjQpJjB4ZjsKCQkvL2JpdDI4IGVuYWJsZSBzb2NfenFwciAsYml0IDI5IGVuYWJlIGRyYW1fZHJ2IGJpdCAzMCBlbmFiZWwgZHJhbV9vZHQKCQl6cXByX3NvY19kcmFtID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzNdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQl6cXByX3NvY19kcmFtID0gMDsKCQl9Cgl9CgllbHNlCgl7CgkJenFwcl9zb2NfZHJhbSA9IDA7Cgl9CgoJaWYgKGFyZ2MgPjQpCgl7CgkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWYgPSAwOwoJCX0KCX0KCWVsc2UKCXsKCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWYgPSAwOwoJfQoJaWYgKGFyZ2MgPjUpCgl7CgkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IDA7CgkJfQoJfQoJdW5zaWduZWQgaW50IHNvY19kcmFtX2hleF9kZWM9MDsKCWlmIChhcmdjID42KQoJewoJCXNvY19kcmFtX2hleF9kZWMgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXNvY19kcmFtX2hleF9kZWMgPSAwOwoJCX0KCX0KCWlmIChhcmdjID43KQoJewoJCWRkcl90ZXN0X2NtZF96cV92cmVmID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzddLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzddID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlkZHJfdGVzdF9jbWRfenFfdnJlZiA9IDA7CgkJfQoJfQoJdW5zaWduZWQgaW50IHNvY19kcmFtX2Rydl9vZHRfdXNlX3ZsYXVlPTA7Cgl1bnNpZ25lZCBpbnQgc29jX2FjX2Rydj0wOwoJdW5zaWduZWQgaW50IHNvY19hY19vZHQ9MDsKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9kcnY9MDsKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHQ9MDsKCXVuc2lnbmVkIGludCBkcmFtX2Rydj0wOwoJdW5zaWduZWQgaW50IGRyYW1fb2R0PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29kdF9hZGpfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9hZGpfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9hZGpfZW5hYmxlPTA7CgoJdW5zaWduZWQgaW50IHpxMHByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7Cgl1bnNpZ25lZCBpbnQgenExcHJfb3JnID0gcmRfcmVnKEREUjBfUFVCX1pRMVBSKTsKCXVuc2lnbmVkIGludCBwdWJfZGNyPSByZF9yZWcoRERSMF9QVUJfRENSKTsKI2RlZmluZSBERFJfVFlQRV9MUEREUjIgIDAKI2RlZmluZSBERFJfVFlQRV9MUEREUjMgIDEKI2RlZmluZSBERFJfVFlQRV9ERFIzICAzCiNkZWZpbmUgRERSX1RZUEVfRERSNCAgNAoJdW5zaWduZWQgaW50IGRkcl90eXBlPSBwdWJfZGNyJjB4NzsgLy8wIC1scGRkcjIgIHwgIDEtIGxwZGRyMyAgfCAgIDItIHJldiAgfCAgMyAtZGRyMyAgIHwgNC0gZGRyNAoJLy8JdW5zaWduZWQgaW50IHpxMnByX29yZyA9IHJkX3JlZyhERFIwX1BVQl9aUTJQUik7CglpZiAoYXJnYyA+OCkKCXsKCQlzb2NfZHJhbV9kcnZfb2R0X3VzZV92bGF1ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls4XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls4XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc29jX2RyYW1fZHJ2X29kdF91c2VfdmxhdWUgPSAwOwoJCX0KCX0KCWlmKHNvY19kcmFtX2Rydl9vZHRfdXNlX3ZsYXVlKQoJe2lmKHpxY3IpCgkJe3ByaW50ZigienFjclsweCUwOHhdLFxuIiwgenFjcik7CgkJCXsKCQkJCXNvY19hY19kcnY9enFjciUxMDA7CgkJCQlpZihzb2NfYWNfZHJ2PjEwMCkKCQkJCXtzb2NfYWNfZHJ2PTA7fQoJCQkJaWYoc29jX2FjX2Rydj09MCkKCQkJCXtzb2NfYWNfZHJ2PTE7fQoJCQkJc29jX2FjX2Rydj0oNDgwL3NvY19hY19kcnYpLTE7CgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJaWYoc29jX2FjX2Rydj4weGYpCgkJCQkJe3NvY19hY19kcnY9enEwcHJfb3JnJjB4Zjt9CgkJCQl9CgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlpZihzb2NfYWNfZHJ2PjB4ZikKCQkJCQl7c29jX2FjX2Rydj0oenEwcHJfb3JnPj44KSYweGY7fQoJCQkJfQoJCQl9CgoKCQkJewoJCQkJc29jX2FjX29kdD16cWNyLzEwMDsKCQkJCWlmKHNvY19hY19vZHQ+MjQwKQoJCQkJe3NvY19hY19vZHQ9NDgwO30KCQkJCWlmKHNvY19hY19vZHQ9PTApCgkJCQl7c29jX2FjX29kdD0xO30KCgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJc29jX2FjX29kdD0oMzYwL3NvY19hY19vZHQpLTE7CgkJCQkJaWYoc29jX2FjX29kdD4weGYpCgkJCQkJe3NvY19hY19vZHQ9KHpxMHByX29yZz4+NCkmMHhmO30KCQkJCX0KCQkJCWlmKGRkcl90eXBlPT1ERFJfVFlQRV9ERFI0KQoJCQkJewoJCQkJCXNvY19hY19vZHQ9KDQ4MC9zb2NfYWNfb2R0KS0xOwoJCQkJCWlmKHNvY19hY19vZHQ+MHhmKQoJCQkJCXtzb2NfYWNfb2R0PSh6cTBwcl9vcmc+PjE2KSYweGY7fQoJCQkJfQoJCQl9CgoJCQl6cWNyPShzb2NfYWNfb2R0PDwxNil8KHNvY19hY19kcnY8PDEyKXwoc29jX2FjX2Rydjw8OCl8KHNvY19hY19vZHQ8PDQpfChzb2NfYWNfZHJ2KTsKCQkJcHJpbnRmKCJ6cWNyWzB4JTA4eF0sc29jX2FjX29kdCBbMHglMDh4XSxzb2NfYWNfZHJ2IFsweCUwOHhdXG4iLCB6cWNyLHNvY19hY19vZHQsc29jX2FjX2Rydik7CgkJfQoJCWlmKHpxcHJfc29jX2RyYW0pCgkJe3ByaW50ZigienFwcl9zb2NfZHJhbVsweCUwOHhdLFxuIiwgenFwcl9zb2NfZHJhbSk7CgkJCXsKCQkJCXNvY19kYXRhX2Rydj16cXByX3NvY19kcmFtJTEwMDsKCQkJCXByaW50Zigic29jX2RhdGFfZHJ2WyVkXSxcbiIsIHNvY19kYXRhX2Rydik7CgkJCQlpZihzb2NfZGF0YV9kcnY+MTAwKQoJCQkJe3NvY19kYXRhX2Rydj0wOwoKCQkJCX0KCQkJCWlmKHNvY19kYXRhX2Rydj09MCkKCQkJCXtzb2NfZGF0YV9kcnY9MTsKCQkJCQkvL3NvY19kYXRhX2Rydl9vZHRfYWRqX2VuYWJsZT0wOwoJCQkJfQoJCQkJZWxzZQoJCQkJey8vc29jX2RhdGFfZHJ2X29kdF9hZGpfZW5hYmxlPTE7CgkJCQl9CgkJCQlzb2NfZGF0YV9kcnY9KDQ4MC9zb2NfZGF0YV9kcnYpLTE7CgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJaWYoc29jX2RhdGFfZHJ2PjB4ZikKCQkJCQl7c29jX2RhdGFfZHJ2PXpxMXByX29yZyYweGY7fQoJCQkJfQoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjQpCgkJCQl7CgkJCQkJaWYoc29jX2RhdGFfZHJ2PjB4ZikKCQkJCQl7c29jX2RhdGFfZHJ2PSh6cTFwcl9vcmc+PjgpJjB4Zjt9CgkJCQl9CgkJCX0KCgoJCQl7CgkJCQlzb2NfZGF0YV9vZHQ9KHpxcHJfc29jX2RyYW0vMTAwKSUxMDAwOwoJCQkJcHJpbnRmKCJzb2NfZGF0YV9vZHRbJWRdLFxuIiwgc29jX2RhdGFfb2R0KTsKCQkJCWlmKHNvY19kYXRhX29kdD4yNDApCgkJCQl7c29jX2RhdGFfb2R0PTM2MDt9CgkJCQlpZihzb2NfZGF0YV9vZHQ9PTApCgkJCQl7c29jX2RhdGFfb2R0PTE7fQoKCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJCXsKCQkJCQlzb2NfZGF0YV9vZHQ9KDM2MC9zb2NfZGF0YV9vZHQpLTE7CgkJCQkJaWYoc29jX2RhdGFfb2R0PjB4ZikKCQkJCQl7c29jX2RhdGFfb2R0PSh6cTFwcl9vcmc+PjQpJjB4Zjt9CgkJCQl9CgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlzb2NfZGF0YV9vZHQ9KDQ4MC9zb2NfZGF0YV9vZHQpLTE7CgkJCQkJaWYoc29jX2RhdGFfb2R0PjB4ZikKCQkJCQl7c29jX2RhdGFfb2R0PSh6cTFwcl9vcmc+PjE2KSYweGY7fQoJCQkJfQoKCQkJfQoKCQkJc29jX2RhdGFfZHJ2X29kdF9hZGpfZW5hYmxlPTE7CgoJCQl7CgkJCQlkcmFtX2Rydj0oenFwcl9zb2NfZHJhbS8xMDAwMDApJTEwMDsKCQkJCXByaW50ZigiZHJhbV9kcnZbJWRdLFxuIiwgZHJhbV9kcnYpOwoKCQkJCWlmKGRyYW1fZHJ2PjEwMCkKCQkJCXtkcmFtX2Rydj0wO30KCQkJCWlmKGRyYW1fZHJ2PT0wKQoJCQkJewoJCQkJCWRyYW1fZGF0YV9kcnZfYWRqX2VuYWJsZT0wO30KCQkJCWVsc2UKCQkJCXtkcmFtX2RhdGFfZHJ2X2Fkal9lbmFibGU9MTsKCQkJCX0KCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSMykKCQkJCXsKCQkJCQlpZihkcmFtX2Rydj49NDApCgkJCQkJe2RyYW1fZHJ2PTA7fQoKCQkJCQllbHNlCgkJCQkJe2RyYW1fZHJ2PTE7CgkJCQkJfQoJCQkJfQoKCgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlpZihkcmFtX2Rydjw0OCkKCQkJCQl7ZHJhbV9kcnY9MDt9CgoJCQkJCWVsc2UKCQkJCQl7ZHJhbV9kcnY9MTsKCQkJCQl9CgkJCQl9CgkJCX0KCgoJCQl7CgkJCQlkcmFtX29kdD0oenFwcl9zb2NfZHJhbS8xMDAwMDApLzEwMDsKCQkJCXByaW50ZigiZHJhbV9vZHRbJWRdLFxuIiwgZHJhbV9vZHQpOwoJCQkJaWYoZHJhbV9vZHQ+MjQwKQoJCQkJe2RyYW1fb2R0PTQ4MDt9CgkJCQlpZihkcmFtX29kdD09MCkKCQkJCXsKCQkJCQlkcmFtX2RhdGFfb2R0X2Fkal9lbmFibGU9MDsKCQkJCX0KCQkJCWVsc2UKCQkJCXtkcmFtX2RhdGFfb2R0X2Fkal9lbmFibGU9MTsKCQkJCX0KCgoJCQkJaWYoZGRyX3R5cGU9PUREUl9UWVBFX0REUjMpCgkJCQl7CgkJCQkJaWYoZHJhbV9vZHQ+MTYwKQoJCQkJCXtkcmFtX29kdD0wO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD45MCkKCQkJCQl7ZHJhbV9vZHQ9Mjt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+NTApCgkJCQkJe2RyYW1fb2R0PTE7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjM1KQoJCQkJCXtkcmFtX29kdD0zO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4yNSkKCQkJCQl7ZHJhbV9vZHQ9NTt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ8PTI1KQoJCQkJCXtkcmFtX29kdD00O30KCgkJCQl9CgkJCQlpZihkZHJfdHlwZT09RERSX1RZUEVfRERSNCkKCQkJCXsKCQkJCQlpZihkcmFtX29kdD4yODApCgkJCQkJe2RyYW1fb2R0PTA7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjE4MCkKCQkJCQl7ZHJhbV9vZHQ9NDt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+MTAwKQoJCQkJCXtkcmFtX29kdD0yO30KCQkJCQllbHNlIGlmIChkcmFtX29kdD43MCkKCQkJCQl7ZHJhbV9vZHQ9Njt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ+NTQpCgkJCQkJe2RyYW1fb2R0PTE7fQoJCQkJCWVsc2UgaWYgKGRyYW1fb2R0PjQ0KQoJCQkJCXtkcmFtX29kdD01O30KCQkJCQllbHNlIGlmIChkcmFtX29kdD4zNykKCQkJCQl7ZHJhbV9vZHQ9Mzt9CgkJCQkJZWxzZSBpZiAoZHJhbV9vZHQ8PTM0KQoJCQkJCXtkcmFtX29kdD03O30KCgkJCQl9CgoKCgkJCX0KCgkJCXpxcHJfc29jX2RyYW09KGRyYW1fZGF0YV9vZHRfYWRqX2VuYWJsZTw8MzApfChkcmFtX2RhdGFfZHJ2X2Fkal9lbmFibGU8PDI5KXwoc29jX2RhdGFfZHJ2X29kdF9hZGpfZW5hYmxlPDwyOCl8CgkJCQkoZHJhbV9vZHQ8PDI0KXwoZHJhbV9kcnY8PDIwKXwoc29jX2RhdGFfb2R0PDwxNil8KHNvY19kYXRhX2Rydjw8MTIpfChzb2NfZGF0YV9kcnY8PDgpfChzb2NfZGF0YV9vZHQ8PDQpfChzb2NfZGF0YV9kcnYpOwoJCX0KCX0KCgoJaWYgKHNvY19kcmFtX2hleF9kZWMpCgl7CgkJaWYgKGFyZ2MgPjQpCgkJewoJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQkJZGRyX3Rlc3RfY21kX3NvY192cmVmID0gMDsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWYgPSAwOwoJCX0KCQlpZiAoYXJnYyA+NSkKCQl7CgkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2WzVdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZiA9IDA7CgkJCX0KCQl9CgkJaWYgKGFyZ2MgPjcpCgkJewoJCQlkZHJfdGVzdF9jbWRfenFfdnJlZiA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls3XSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCQlkZHJfdGVzdF9jbWRfenFfdnJlZiA9IDA7CgkJCX0KCQl9CgkJaWYgKGRkcl90ZXN0X2NtZF9zb2NfdnJlZikKCQl7CgkJCWlmIChkZHJfdGVzdF9jbWRfc29jX3ZyZWY8NDUpCgkJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWY9NDU7CgkJCWlmIChkZHJfdGVzdF9jbWRfc29jX3ZyZWY+ODgpCgkJCQlkZHJfdGVzdF9jbWRfc29jX3ZyZWY9ODg7CgkJCWRkcl90ZXN0X2NtZF9zb2NfdnJlZj0oZGRyX3Rlc3RfY21kX3NvY192cmVmKjEwMC00NDA3KS83MDsKCQl9CgoJCWlmIChkZHJfdGVzdF9jbWRfZHJhbV92cmVmKQoJCXsKCQkJaWYgKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY8NDUpCgkJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmPTQ1OwoJCQlpZiAoZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj45MikKCQkJCWRkcl90ZXN0X2NtZF9kcmFtX3ZyZWY9OTI7CgkJCWlmIChkZHJfdGVzdF9jbWRfZHJhbV92cmVmPjYwKSB7CgkJCQlkZHJfdGVzdF9jbWRfZHJhbV92cmVmPShkZHJfdGVzdF9jbWRfZHJhbV92cmVmKjEwMC02MDAwKS82NTsKCQkJfQoJCQllbHNlewoJCQkJZGRyX3Rlc3RfY21kX2RyYW1fdnJlZj0oKGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYqMTAwLTQ1MDApLzY1KXwoMTw8Nik7CgkJCX0KCQl9CgoKCQlwcmludGYoIlxuU2V0IGRkcl90ZXN0X2NtZF9kcmFtX3ZyZWYgWzB4JTA4eF1cbiIsZGRyX3Rlc3RfY21kX2RyYW1fdnJlZik7CgkJaWYgKGRkcl90ZXN0X2NtZF96cV92cmVmID09IDApCgkJCWRkcl90ZXN0X2NtZF96cV92cmVmPTA7CgkJaWYgKGRkcl90ZXN0X2NtZF96cV92cmVmKSB7CgkJCWlmIChkZHJfdGVzdF9jbWRfenFfdnJlZjw0NSkKCQkJCWRkcl90ZXN0X2NtZF96cV92cmVmPTQ1OwoJCQlpZiAoZGRyX3Rlc3RfY21kX3pxX3ZyZWY+ODgpCgkJCQlkZHJfdGVzdF9jbWRfenFfdnJlZj04ODsKCQkJZGRyX3Rlc3RfY21kX3pxX3ZyZWY9KGRkcl90ZXN0X2NtZF96cV92cmVmKjEwMC00NDA3KS83MDsKCQl9Cgl9CgoJLy9pZihkZHJfdGVzdF9jbWRfdHlwZT09RERSX1RFU1RfQ01EX1RFU1RfQUNfQklUX0hPTEQpCgkvL3tpZiAoZGRyX3Rlc3RfY21kX2Nsa19zZWVkID09MCkKCS8vZGRyX3Rlc3RfY21kX2Nsa19zZWVkID0gMHgzZjsKCS8vaWYgKGRkcl90ZXN0X2NtZF9hY2JkbF94X3NlZWQgPT0wKQoJLy9kZHJfdGVzdF9jbWRfYWNiZGxfeF9zZWVkID0gMHgzZjsKCS8vfQoKI2lmIGRlZmluZWQoQ09ORklHX002VFYpIHx8IGRlZmluZWQoQ09ORklHX002VFZEKQoJd3JpdGVsKHpxY3IgfCAoMHgzYyA8PCAyNCksIFBSRUdfU1RJQ0tZX1JFRzApOwojZWxzZQoJd3JpdGVsKHpxY3IgfCAoMHhmMTQgPDwgMjApLCBQUkVHX1NUSUNLWV9SRUcwKTsKI2VuZGlmCiNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKCXdyaXRlbCgoZGRyX3Rlc3RfY21kX3pxX3ZyZWY8PDI0KXwoZGRyX3Rlc3RfY21kX3NvY192cmVmPDw4KXxkZHJfdGVzdF9jbWRfZHJhbV92cmVmICwgUFJFR19TVElDS1lfUkVHOSk7Cgl3cml0ZWwoKHpxcHJfc29jX2RyYW08PDApICwgUFJFR19TVElDS1lfUkVHOCk7Cglzb2NfZGF0YV9kcnZfb2R0PXpxcHJfc29jX2RyYW0mMHhmZmZmZjsKCWRyYW1fZHJ2PSh6cXByX3NvY19kcmFtPj4yMCkmMHhmOwoJZHJhbV9vZHQ9KHpxcHJfc29jX2RyYW0+PjI0KSYweGY7CglwcmludGYoInNldHRpbmcgenFwcl9zb2NfZHJhbSBbMHglMDh4XSwuLmJpdDI4IGVuYWJsZSBzb2NfenFwciAsICAgYml0IDI5IGVuYWJlIGRyYW1fZHJ2LCAgIGJpdCAzMCBlbmFiZWwgZHJhbV9vZHRcbiIsIHpxcHJfc29jX2RyYW0pOwoJcHJpbnRmKCJzb2NfZGF0YV9kcnZfb2R0IFsweCUwOHhdLGRyYW1fZHJ2IFsweCUwOHhdLGRyYW1fb2R0IFsweCUwOHhdXG4iLCBzb2NfZGF0YV9kcnZfb2R0LGRyYW1fZHJ2LGRyYW1fb2R0KTsKCXBsbD1wbGx8KGJpc3RfdGVzdF9kcV9pbmRleDw8MTIpOwoKCWlmKGRkcl9mdWxsX3Rlc3RfZW5hYmxlKQoJewoJCXBsbD0oZGRyX2Z1bGxfdGVzdF9lbmFibGU8PDIxKXxwbGw7CgkJcHJpbnRmKCJkZHJfZnVsbF90ZXN0X2VuYWJsZSAlMDh4LHNldCBzdGlja3kgcmVnMSBiaXQgMjEgMVxuIiwgZGRyX2Z1bGxfdGVzdF9lbmFibGUpOwoJfQoKI2VuZGlmCgoKCXdyaXRlbChwbGwsIFBSRUdfU1RJQ0tZX1JFRzEpOwoKCXByaW50ZigiU2V0IHBsbCBkb25lIFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUcxKSk7CglwcmludGYoIlNUSUNLWV9SRUcxIHBsbCBiaXQgMTItMTkgdXNlIGZvciBiaXN0IGRxIGluZGV4IHRlc3QgMHhmZiBpcyBhbGwgMSAtLT4gZHEwICwyLS0tPmRxMSBcbiIpOwoJcHJpbnRmKCJTZXQgU1RJQ0tZX1JFRzAgWzB4JTA4eF1cbiIsIHJlYWRsKFBSRUdfU1RJQ0tZX1JFRzApKTsKCXByaW50ZigiU2V0IFNUSUNLWV9SRUcxIFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUcxKSk7CiNpZiAoIENPTkZJR19ERFJfUEhZPj1QX0REUl9QSFlfOTA1WCkKCXByaW50ZigiU2V0IFNUSUNLWV9SRUc5IFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUc5KSk7CglwcmludGYoIlNldCBTVElDS1lfUkVHOCBbMHglMDh4XVxuIiwgcmVhZGwoUFJFR19TVElDS1lfUkVHOCkpOwoKI2VuZGlmCglwcmludGYoIlxuYmVnaW4gcmVzZXQgMTExLi4uLi4uLi4uLi5cbiIpOwoJcHJpbnRmKCJcbmJlZ2luIHJlc2V0IDIuLi4uLi4uLi4uLlxuIik7CglwcmludGYoIlxuYmVnaW4gcmVzZXQgMy4uLi4uLi4uLi4uXG4iKTsKCiNpZmRlZiBDT05GSUdfTThCCglwcmludGYoIiB0MSBcbiIpOwoJd3JpdGVsKDB4ZjA4MDAwMCB8IDIwMDAsIFdBVENIRE9HX1RDKTsKI2Vsc2UKCXByaW50ZigiIHQyIFxuIik7CgkvLyAgd3JpdGVsKFdBVENIRE9HX1RDLCAweGY0MDAwMDAgfCAyMDAwKTsKCS8vICpQX1dBVENIRE9HX1JFU0VUID0gMDsKCWRkcl90ZXN0X3dhdGNoZG9nX3Jlc2V0X3N5c3RlbSgpOwojZW5kaWYKCXdoaWxlKDEpOwoJcmV0dXJuIDA7Cgp1c2FnZToKCglwcmludGYoIiBkZHJfdGVzdF9jbWQgMHgxNyBjbGsgenFfYWMgenFfc29jX2RyYW0gc29jX3ZyZWYgZHJhbV92cmVmIGRlY19oZXggenFfdnJlZiAwXG4iKTsKCXByaW50ZigiZXhhbXBsZSBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCA1MCA4MSAxIDUwIFxuIik7CglwcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCAweDA5IDB4MjAgMCA1MCBcbiIpOwoJcHJpbnRmKCJvciAgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCA2MDM0IDYwMzQ2MDM0IDAgMCAwIDAgMSBcbiIpOwoJcHJpbnRmKCJzZXR0aW5nIHpxcHJfc29jX2RyYW0gLC4uYml0MjggZW5hYmxlIHNvY196cXByICwgICBiaXQgMjkgZW5hYmUgZHJhbV9kcnYsICAgYml0IDMwIGVuYWJlbCBkcmFtX29kdFxuIik7CglwcmludGYoInNldHRpbmcgenFwcl9zb2NfZHJhbSAsYml0MC1iaXQxOSAgc29jX2RhdGFfZHJ2X29kdCxiaXQyMC1iaXQyNCAgZHJhbV9kcnYgLCAgYml0MjQtYml0MjggIGRyYW1fb2R0XG4iKTsKCXByaW50Zigic2V0dGluZyB6cXByX3NvY19kcmFtICxiaXQwLWJpdDE5IGJpdCAwLTcgdXNlIGZvciBkZHIzo6xiaXQ4LTE5IHVzZSBmb3IgZGRyNCxvZHRfZG93bl91cFxuIik7CglwcmludGYoInNldHRpbmcgenFwcl9zb2NfZHJhbSAsc29jX2Rydj0oNDgwLygoc2V0dGluZykrMSkpO2RkcjQtLS1zb2Nfb2R0PSg0ODAvKHNldHRpbmcpKzEpKTtkZHIzLS0tc29jX29kdD0oMzYwLyhzZXR0aW5nKSsxKSk7XG4iKTsKCglwcmludGYoIiBERFIzX0RSVl80ME9ITQkJMFxuIik7CglwcmludGYoIiBERFIzX0RSVl8zNE9ITQkJMVxuXG4iKTsKCglwcmludGYoIiBERFIzX09EVF8wT0hNCQkwXG4iKTsKCXByaW50ZigiIEREUjNfT0RUXzYwT0hNCQkxXG4iKTsKCXByaW50ZigiIEREUjNfT0RUXzEyME9ITQkyXG4iKTsKCXByaW50ZigiIEREUjNfT0RUXzQwT0hNCQkzXG4iKTsKCXByaW50ZigiIEREUjNfT0RUXzIwT0hNCQk0XG4iKTsKCXByaW50ZigiIEREUjNfT0RUXzMwT0hNCQk1XG5cblxuIik7CgoJcHJpbnRmKCIgTFBERFIyX0RSVl8zNE9ITQkxXG4iKTsKCXByaW50ZigiIExQRERSMl9EUlZfNDBPSE0JMlxuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzQ4T0hNCTNcbiIpOwoJcHJpbnRmKCIgTFBERFIyX0RSVl82ME9ITQk0XG4iKTsKCXByaW50ZigiIExQRERSMl9EUlZfODBPSE0JNlxuIik7CglwcmludGYoIiBMUEREUjJfRFJWXzEyME9ITQk3XG5cbiIpOwoKCXByaW50ZigiIExQRERSMl9PRFRfME9ITQkwXG5cblxuIik7CgoKCXByaW50ZigiIExQRERSM19EUlZfMzRPSE0JMVxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzQwT0hNCTJcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl80OE9ITQkzXG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfNjBPSE0JNFxuIik7CglwcmludGYoIiBMUEREUjNfRFJWXzgwT0hNCTZcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl8zNF80ME9ITQk5XG4iKTsKCXByaW50ZigiIExQRERSM19EUlZfNDBfNDhPSE0JMTBcbiIpOwoJcHJpbnRmKCIgTFBERFIzX0RSVl8zNF80OE9ITQkxMVxuXG4iKTsKCglwcmludGYoIiBMUEREUjNfT0RUXzBPSE0JCTBcbiIpOwoJcHJpbnRmKCIgTFBERFIzX09EVF82ME9ITQkxXG4iKTsKCXByaW50ZigiIExQRERSM19PRFRfMTJPSE0JMlxuIik7CglwcmludGYoIiBMUEREUjNfT0RUXzI0MEhNCTNcblxuXG4iKTsKCglwcmludGYoIiBERFI0X0RSVl8zNE9ITQkJMFxuIik7CglwcmludGYoIiBERFI0X0RSVl80OE9ITQkJMVxuXG4iKTsKCglwcmludGYoIiBERFI0X09EVF8wT0hNCQkwXG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzYwT0hNCQkxXG4iKTsKCXByaW50ZigiIEREUjRfT0RUXzEyME9ITQkJMlxuIik7CglwcmludGYoIiBERFI0X09EVF80ME9ITQkJM1xuIik7CglwcmludGYoIiBERFI0X09EVF8yNDBPSE0JCTRcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfNDhPSE0JCTVcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfODBPSE0JCTZcbiIpOwoJcHJpbnRmKCIgRERSNF9PRFRfMzRPSE0JCTdcblxuXG5cbiIpOwoKCgljbWRfdXNhZ2UoY21kdHApOwoJcmV0dXJuIDE7Cn0KCgppbnQgZG9fZGRyX3NldF9iaXN0X3Rlc3Rfc2l6ZV91c2Vfc3RpY2t5XzYoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgljaGFyICplbmRwOwoKCXVuc2lnbmVkIGludCBkZHJfYmlzdF90ZXN0X3NpemU9MDsKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgoJZGRyX2Jpc3RfdGVzdF9zaXplID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwwKTsKCWRkcl9iaXN0X3Rlc3Rfc2l6ZT1kZHJfYmlzdF90ZXN0X3NpemUmMHhmZmZmZmZlMDsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlkZHJfYmlzdF90ZXN0X3NpemU9MHgzZjAqMjsKCX0KCglwcmludGYoImRkcl9iaXN0X3Rlc3Rfc2l6ZSAweFslMDh4XSxcbiIsIGRkcl9iaXN0X3Rlc3Rfc2l6ZSk7CgojaWYgKCBDT05GSUdfRERSX1BIWT49UF9ERFJfUEhZXzkwNVgpCgl3cml0ZWwoKGRkcl9iaXN0X3Rlc3Rfc2l6ZTw8MCkgLCBQUkVHX1NUSUNLWV9SRUc2KTsKCXByaW50ZigiU2V0IFNUSUNLWV9SRUc2IFsweCUwOHhdXG4iLCByZWFkbChQUkVHX1NUSUNLWV9SRUc2KSk7CiNlbmRpZgoKCXJldHVybiAxOwp9Cgp1bnNpZ25lZCBpbnQgZG9fZGRyX3JlYWRfd3JpdGVfZGRyX2FkZF9fZGF0YV93aW5kb3dfbGNkbHIodW5zaWduZWQgaW50IHJhbmtfaW5kZXgsdW5zaWduZWQgaW50IGFkZF9pbmRleCx1bnNpZ25lZCBpbnQgbGNkbHJfdmFsdWUsdW5zaWduZWQgaW50IHJlYWRfd3JpdGVfZmxhZyApCnsKCXVuc2lnbmVkIHJlZ19hZGQ9MDsKCglpZihhZGRfaW5kZXg9PTApCgkJcmVnX2FkZD0oRERSMF9QVUJfQUNMQ0RMUik7CglpZihhZGRfaW5kZXg9PTEpCgkJcmVnX2FkZD0oRERSMF9QVUJfQUNCRExSMCk7Cgl7CgkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1JFQUQpCgkJewoJCQlsY2Rscl92YWx1ZT0oKChyZWFkbChyZWdfYWRkKSk+PjApJjB4MWZmKTsKCQl9CgkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1dSSVRFKQoJCXsKCQkJd3JfcmVnKHJlZ19hZGQsICgobGNkbHJfdmFsdWUmMHgxZmYpPDwwKSk7CgkJfQoKCX0KCXByaW50ZigibGNkbHIgJWQgICUwOHgsJTA4eFxuIiwgYWRkX2luZGV4LHJlZ19hZGQsCgkJCShyZWFkbChyZWdfYWRkKSkpOwoJcmV0dXJuIGxjZGxyX3ZhbHVlOwp9CgojZW5kaWYKLy9vdXlhbmcKCiNkZWZpbmUgZHdjX2RkcnBoeV9hcGJfd3IoYWRkciwgZGF0KSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKzB4ZmUwMDAwMDApKT0oKHVpbnQxNl90KWRhdCkKI2RlZmluZSBkd2NfZGRycGh5X2FwYl9yZChhZGRyKSAgICoodm9sYXRpbGUgdWludDE2X3QgKikoaW50X2NvbnZ0ZXJfcCgoKGFkZHIpIDw8IDEpKzB4ZmUwMDAwMDApKQojZGVmaW5lIEFDWF9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCgovL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDI8PDE2KXwoMDw8MTIpfCgweGIwKSwwKTsKLy9kd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDApOwovL2R3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLy8qKHZvbGF0aWxlIHVpbnQzMl90ICopKGludF9jb252dGVyX3AodGVzdF9hZGRyKSk9ZGVzX3BhdHRlcm4odGVtcF9pLDIsdGVtcF9rLHRlbXBfaSk7Ci8vZHdjX2RkcnBoeV9hcGJfd3IoKHBzPDwyMCl8KDA8PDE2KXwoaW5zdGFuY2VfbnVtPDwxMil8KDB4ODApLCk7CgovL2Rkcl90ZXN0X2FjeF9nMTJhIGEgbGVuZ3RoIHN0ZXAgdGVzdF9tb2RlIEFDeAovL2Rkcl90ZXN0X2FjeF9nMTJhICBhICAgICAgIDB4ODAwMDAwMCAgMSAgICAgICAgICAwICAgICAgICAgMHgxCi8vYXJndlswXSAgICAgICAgICAgYXJndlsxXSAgYXJndlsyXSAgICBhcmd2WzNdICAgIGFyZ3ZbNF0gICBhcmd2WzVdCi8vYXJndlsxXSxhCi8vYXJndlsyXSx0ZXN0IGxlbmd0aAovL2FyZ3ZbM10sdGVzdCBzdGVwCi8vYXJndls0XSx0ZXN0X21vZGUsZGlyZWN0aW9uLDAsdXA7ICAgIDEsZG93bjsgICAgMixkb3duIGZpcnN0LHVwIGZvbGxvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi8vYXJndls1XSxBQ3g7MC1BQzAsMS1BQzEsMi1BQzIuLi4sOS1BQzkKCiNpZiAwCmludCBkb19kZHJfdGVzdF9hY3hfZzEyYShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5FbnRlciB0ZXN0IGRkciBhYyBiaXQgd2luZG93ICBmdW5jdGlvblxuIik7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CgkvL3Vuc2lnbmVkIGludCAgIGRkbF8xMDBzdGVwX3BzPSAwOwoKCXVuc2lnbmVkIGludCAgIHRlbXBfdGVzdF9lcnJvcj0gMDsKCXVuc2lnbmVkIGludCAgIHRlbXBfY291bnQ9IDA7CgkvL3Vuc2lnbmVkIGludCAgIHRlbXBfcmVnX3ZhbHVlWzQwXTsKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgdGVzdF9tb2RlPTA7Cgl1bnNpZ25lZCBpbnQgICB0ZXN0X0FDeD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICAgcmVnX2Jhc2VfYWRqPTA7CgoJdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX29yZz0wOwoJdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX21pbj0wOwoJdW5zaWduZWQgaW50ICAgYWNiZGxyX3hfcmVnX21heD0wOwoKCXVpbnQxNl90ICAgZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZT0wOwoJdWludDE2X3QgICB0ZXN0X3N0ZXA9MTsKCXVuc2lnbmVkIGludCAgIGRkcl90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCglpZiAoYXJnYyA8PSAyKQoJewoJCWdvdG8gdXNhZ2U7Cgl9CgllbHNlIAoJewoJCWRkcl90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMl0sICZlbmRwLCAxNik7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X3NpemUgPSBERFJfQ09SU1NfVEFMS19URVNUX1NJWkU7CgkJfSAgCgl9CglpZiAoYXJnYyA+MykgCgl7CgkJdGVzdF9zdGVwID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzNdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X3N0ZXAgPSAxOwoJCX0gIAoJfQoJaWYgKGFyZ2MgPjQpIAoJewoJCXRlc3RfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls0XSwgJmVuZHAsIDE2KTsgLy+y4srUt73P8goJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X21vZGUgPSAwOwoJCX0KCQlpZiAgICgoc3RyY21wKGFyZ3ZbNF0sICJsIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzRdLCAiTCIpID09IDApKQoJCXsKCQkJdGVzdF9tb2RlID0gMjsKCQl9Cgl9CglpZiAodGVzdF9tb2RlID4yKSB0ZXN0X21vZGUgPSAyOwoKCXRlc3RfQUN4ID0wOwoJaWYgKGFyZ2MgPjUpIAoJewoKCQl0ZXN0X0FDeD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzVdLCAmZW5kcCwgMTYpOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl0ZXN0X0FDeCA9IDA7CgkJfQoJCWlmICh0ZXN0X0FDeD45KQoJCQl0ZXN0X0FDeCA9MDsvL2RlZmF1bHQgdGVzdCBBQzAKCX0KCglwcmludGYoImRkcl90ZXN0X3NpemUgID0gMHglMDh4XG4iLCBkZHJfdGVzdF9zaXplKTsKCXByaW50ZigidGVzdF9tb2RlID0gMHglMDh4XG4iLCB0ZXN0X21vZGUpOwoJcHJpbnRmKCJ0ZXN0X0FDeCA9ICAgICAweCUwOHhcbiIsIHRlc3RfQUN4KTsKCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMCk7Ly9tdyBmZTFhMDAwMCAgMAoJcmVnX2Jhc2VfYWRqPTB4ZmUwMDAwMDA7CglyZWdfYWRkPSgoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSk8PDEpICsgcmVnX2Jhc2VfYWRqOwoKCXsKCgkJewoJCQlwcmludGYoInRlc3QgQUMlZCB3aW5kb3cgc3RhcnRcbiAiLHRlc3RfQUN4KTsKCgkJCWlmICgodGVzdF9tb2RlID09IDEpIHx8ICh0ZXN0X21vZGUgPT0gMikpCgkJCXsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSk7CgkJCQlyZWdfYWRkPSgoKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpPDwxKSArIHJlZ19iYXNlX2Fkaik7CgkJCQlhY2JkbHJfeF9yZWdfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpOzsKCQkJCXdoaWxlIChkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPjApCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2Vycm9yPTA7CgkJCQkJZm9yKHRlbXBfY291bnQ9MDt0ZW1wX2NvdW50IDwgdGVzdF9zdGVwO3RlbXBfY291bnQrKykKCQkJCQl7CgkJCQkJCWlmKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9PTApIGJyZWFrOwoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLS07ICAgICAgIAoJCQkJCX07CgkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZS0tOwoJCQkJCXByaW50ZigiXG4gcmVnX2FkZD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHZhbHVlPT0weCUwOHgiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtYWNiZGxyX3hfcmVnX29yZyk7CgkJCQkJewoJCQkJCQlkd2NfZGRycGh5X2FwYl93cigoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJfQoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUrKzsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcHJpbnRmKCJcbiBsZWZ0IGVkZ2UgZGV0ZWN0ICxyZWc9PTB4JTA4eFxuIixyZWdfYWRkKTsKCQkJCXByaW50ZigiXG4gb3JnPT0weCUwOHgsbGVmdCBlZGdlPT0weCUwOHhcbiAiLGFjYmRscl94X3JlZ19vcmcsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgoJCQkJYWNiZGxyX3hfcmVnX21pbj0gKGludClkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfbWluPT0weCUwOHhcbiIsYWNiZGxyX3hfcmVnX21pbik7ICAgICAgIAoKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCQkJCS8vu9a4tMSsyM/WtQoJCQkJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSwodWludDE2X3QpYWNiZGxyX3hfcmVnX29yZyk7ICAgICAgCgkJCX0KCgkJCWlmICgodGVzdF9tb2RlID09IDApIHx8ICh0ZXN0X21vZGUgPT0gMikpCgkJCXsKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSk7CgkJCQlyZWdfYWRkPSgoKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpPDwxKSArIHJlZ19iYXNlX2Fkaik7CgkJCQlhY2JkbHJfeF9yZWdfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpOwoJCQkJd2hpbGUgKGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU8QUNYX01BWCkKCQkJCXsKCQkJCQl0ZW1wX3Rlc3RfZXJyb3IgPSAwOwoJCQkJCWZvcih0ZW1wX2NvdW50PTA7dGVtcF9jb3VudCA8IHRlc3Rfc3RlcDt0ZW1wX2NvdW50KyspCgkJCQkJewoJCQkJCQlpZihkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlPj1BQ1hfTUFYKSBicmVhazsKCQkJCQkJZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSsrOyAgICAgICAKCQkJCQl9OwoJCQkJCXByaW50ZigiXG4gcmVnX2FkZD09MHglMDh4LHJpZ2h0IHRlbXA9PTB4JTA4eFxuLHZhbHVlPT0weCUwOHgiLHJlZ19hZGQsZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSwKCQkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtYWNiZGxyX3hfcmVnX29yZyk7CgkJCQkJewoJCQkJCQlkd2NfZGRycGh5X2FwYl93cigoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSksZHFfbGNkX2JkbF90ZW1wX3JlZ192YWx1ZSk7CgkJCQkJfQoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCgkJCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJCQl7CgkJCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWUtLTsKCQkJCQkJdGVtcF90ZXN0X2Vycm9yID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcHJpbnRmKCJyaWdodCBlZGdlIGRldGVjdCAscmVnID0gMHglMDh4XG4iLHJlZ19hZGQpOwoJCQkJcHJpbnRmKCJvcmcgPSAweCUwOHgscmlnaHQgZWRnZSA9IDB4JTA4eCx2YWx1ZSA9IDB4JTA4eFxuICIsYWNiZGxyX3hfcmVnX29yZyxkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLAoJCQkJCQlkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlLWFjYmRscl94X3JlZ19vcmcpOwoKCQkJCWFjYmRscl94X3JlZ19tYXg9KGludClkcV9sY2RfYmRsX3RlbXBfcmVnX3ZhbHVlOwoJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfbWF4ID0gMHglMDh4XG4iLGFjYmRscl94X3JlZ19tYXgpOwoKCQkJCWRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU9MDsKCQkJCS8vu9a4tMSsyM/WtQoJCQkJZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9BQ3g8PDEyKXwoMHg4MCkpLCh1aW50KWFjYmRscl94X3JlZ19vcmcpOwoJCQl9CgkJCWlmICh0ZXN0X21vZGUgPT0gMikKCQkJewoJCQkJLy/PyM35z8Ky4qOs1NnN+cnPsuKjrLLiytS94cr4o6y08tOhveG5+woJCQkJcHJpbnRmKCJ0ZXN0IEFDJWQgd2luZG93IGZpbmlzaFxuICIsdGVzdF9BQ3gpOwoJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfbWluID0gMHglMDh4XG4iLGFjYmRscl94X3JlZ19taW4pOwoJCQkJcHJpbnRmKCJhY2JkbHJfeF9yZWdfbWF4ID0gMHglMDh4XG4iLGFjYmRscl94X3JlZ19tYXgpOyAgICAKCQkJfSAgCgkJfQoJCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMSk7CgkJcmV0dXJuIGRxX2xjZF9iZGxfdGVtcF9yZWdfdmFsdWU7Cgp1c2FnZToKCQljbWRfdXNhZ2UoY21kdHApOwoJCXJldHVybiAxOwoKCX0KCn0KClVfQk9PVF9DTUQoCglkZHJfdGVzdF9hY3hfZzEyYSwJOCwJMSwJZG9fZGRyX3Rlc3RfYWN4X2cxMmEsCgkiZGRyX3Rlc3RfYWN4X2cxMmEgYSBsZW5ndGggc3RlcCBkaXJlY3Rpb24gQUN4IiwKCSJkZHJfdGVzdF9hY3hfZzEyYSBhIDB4ODAwMDAwMCAxIDAgMCAgXG4iCik7CgovL2Rkcl9yZWFkX3dyaXRlX2FjeF9nMTJhIGEgcmQvd3IgQUMwIEFDMSBBQzIgQUMzIEFDNCBBQzUgQUM2IEFDNyBBQzggQUM5Ci8vZGRyX3Rlc3RfYWN4X2cxMmEgIGEgICAgICAgMCAgICAgICAgICAgMSAgICAgICAgICAwICAgICAgICAgMHgxCi8vYXJndlswXSAgICAgICAgICAgYXJndlsxXSAgYXJndlsyXSAgICBhcmd2WzNdICAgIGFyZ3ZbNF0gICBhcmd2WzVdCi8vYXJndlsxXSxhICAgICAgICAgLG5vIHVzZSxyZXNlcnZlLGp1c3QgZm9yIGZsYWcKLy9hcmd2WzJdLHJkL3dyLDA9cmVhZCwxPXdyaXRlCi8vYXJndlszXSxBQzAKLy9hcmd2WzRdLEFDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLy9hcmd2WzVdLEFDMjsuLi4sOS1BQzkKCmludCBkb19kZHJfcmVhZF93cml0ZV9hY3hfZzEyYShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsgIAoJdW5zaWduZWQgaW50ICAgICByZWFkX3dyaXRlX2ZsYWc9IDA7ICAKCS8vdW5zaWduZWQgaW50ICAgdGVtcF90ZXN0X2Vycm9yPSAwOwoJdW5zaWduZWQgaW50ICAgICB0ZW1wX2NvdW50PSAwOwoJLy91bnNpZ25lZCBpbnQgICB0ZW1wX3JlZ192YWx1ZVs0MF07ICAKCXVpbnQxNl90ICAgICAgICAgQUN4WzEwXTsKCWNoYXIgICAgICAgICAgICAgKmVuZHA7CgoJcHJpbnRmKCJFbnRlciBkZHJfcmVhZF93cml0ZV9hY3hfZzEyYSAgZnVuY3Rpb25cbiIpOwoJcHJpbnRmKCJhcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCglpZiAoYXJnYyA8PSAyKQoJewoJCWdvdG8gdXNhZ2U7Cgl9CgllbHNlIAoJewoJCXJlYWRfd3JpdGVfZmxhZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDE2KTsKCQlpZiAoKmFyZ3ZbMl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJcmVhZF93cml0ZV9mbGFnID0gMDsKCQl9ICAKCX0KCWlmICgoYXJnYyA+MTIpICYmIChyZWFkX3dyaXRlX2ZsYWcgPT0gMSkpIAoJewoJCWZvcih0ZW1wX2NvdW50PTA7dGVtcF9jb3VudCA8IDEwO3RlbXBfY291bnQrKykKCQl7CgkJCS8vcmVhZCBBQzAtQUM5IHRvIEFDeFswLTldCgkJCUFDeFt0ZW1wX2NvdW50XSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlt0ZW1wX2NvdW50KzNdLCAmZW5kcCwgMTYpOwoJCX0KCX0KCWVsc2UKCXsKCQlyZWFkX3dyaXRlX2ZsYWcgPSAwOwoJfQoKCWR3Y19kZHJwaHlfYXBiX3dyKDB4ZDAwMDAsMCk7Ly9tdyBmZTFhMDAwMCAgMAoJLy8weGZlMDAwMDAwOwoJLy8oKCgwPDwyMCl8KDA8PDE2KXwodGVzdF9hY2JkbDw8MTIpfCgweDgwKSk8PDEpICsgMHhmZTAwMDAwMDsKCXsKCQlpZiAocmVhZF93cml0ZV9mbGFnID09IDApCgkJewoJCQlmb3IodGVtcF9jb3VudD0wO3RlbXBfY291bnQgPCAxMDt0ZW1wX2NvdW50KyspCgkJCXsKCQkJCUFDeFt0ZW1wX2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgwPDwxNil8KHRlbXBfY291bnQ8PDEyKXwoMHg4MCkpOwoJCQkJcHJpbnRmKCJSZWFkOiBBQyVkWzB4JTA4eF09PTB4JTA4eFxuIix0ZW1wX2NvdW50LCgoKDA8PDIwKXwoMDw8MTYpfCh0ZW1wX2NvdW50PDwxMil8KDB4ODApKTw8MSkgKyAweGZlMDAwMDAwLEFDeFt0ZW1wX2NvdW50XSk7ICAgIAoJCQl9OwoJCX0KCgkJaWYgKHJlYWRfd3JpdGVfZmxhZyA9PSAxKQoJCXsKCgkJCWZvcih0ZW1wX2NvdW50PTA7dGVtcF9jb3VudCA8IDEwO3RlbXBfY291bnQrKykKCQkJewoJCQkJZHdjX2RkcnBoeV9hcGJfd3IoKCgwPDwyMCl8KDA8PDE2KXwodGVtcF9jb3VudDw8MTIpfCgweDgwKSksQUN4W3RlbXBfY291bnRdKTsKCQkJCXByaW50ZigiV3JpdGU6IEFDJWRbMHglMDh4XT09MHglMDh4XG4iLHRlbXBfY291bnQsKCgoMDw8MjApfCgwPDwxNil8KHRlbXBfY291bnQ8PDEyKXwoMHg4MCkpPDwxKSArIDB4ZmUwMDAwMDAsZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMDw8MTYpfCh0ZW1wX2NvdW50PDwxMil8KDB4ODApKSk7ICAgIAoJCQl9OyAgICAKCQl9CgkJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwxKTsKCQlyZXR1cm4gMDsKCnVzYWdlOgoJCWNtZF91c2FnZShjbWR0cCk7CgkJcmV0dXJuIDE7Cgl9Cn0KClVfQk9PVF9DTUQoCglkZHJfcmVhZF93cml0ZV9hY3hfZzEyYSwJMTgsCTEsCWRvX2Rkcl9yZWFkX3dyaXRlX2FjeF9nMTJhLAoJImRkcl9yZWFkX3dyaXRlX2FjeF9nMTJhIGEgcmQvd3IgYWMwLWFjOSIsCgkiZGRyX3JlYWRfd3JpdGVfYWN4X2cxMmEgYSAwIDMgMyAzICBcbiIKKTsKI2VuZGlmCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCiNkZWZpbmUgIEcxMl9EQVRBX1JFQURfT0ZGU0VUX01BWCAgICgwWDNGKQojZGVmaW5lICBHMTJfREFUQV9XUklURV9PRkZTRVRfTUFYICAgKDBYM0YrNyozMikKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1CiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkgIDYKCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UgIDB4MTEKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYgIDB4MTIKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRFJBTV9WUkVGICAgIDB4MTMKCnVpbnQzMl90ICBkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAoY2hhciB0ZXN0X2luZGV4LHVpbnQzMl90IHZhbHVlKQp7CgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSAxCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZIDIKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkgIDMKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSAgNAoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZICA1Cgl1aW50MzJfdCByZXN1bHQ9MDsKCS8qCgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKSB7CgkgICByZXN1bHQ9MzIqKCgodmFsdWU+PjYpJjEpKygodmFsdWU+PjUpJjEpKSt2YWx1ZSYweDFmOwoJICAgfQoJICAgaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkgICByZXN1bHQ9MzIqKCgodmFsdWU+PjYpJjB4ZikrKCh2YWx1ZT4+NSkmMSkpK3ZhbHVlJjB4MWY7CgkgICB9CgkgICBpZiAodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCSAgIHJlc3VsdD0zMiooKCh2YWx1ZT4+NikmMHhmKSsoKHZhbHVlPj41KSYxKSkrdmFsdWUmMHgxZjsKCSAgIH0KCSAgICovCiNpZiAwCglpZiAoKHRlc3RfaW5kZXggPD0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpICl7CgkJcmVzdWx0PSgzMiooKCh2YWx1ZT4+NikmMHhmKSsoKHZhbHVlPj41KSYxKSkrKHZhbHVlJjB4MWYpKTsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjB4ZikrKCgodmFsdWU+PjUpJjEpKjEpKSsodmFsdWUmMHgxZikpOyAvL2JpdCA1IGNoYW5nZSB0byAxIFVJIDIwMTgwNzExIAoJCS8vcmVzdWx0PSgzMiooKCgodmFsdWU+PjUpJjEpKjEpKSsodmFsdWUmMHgxZikpOyAvL2JpdCA1IGNoYW5nZSB0byAxIFVJIDIwMTgwNzExIAoJfQoKCWlmICgodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkpewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjB4MWYpKygoKHZhbHVlPj41KSYxKSoxKSkrKHZhbHVlJjB4MWYpKTsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJcmVzdWx0PXZhbHVlJjB4M2Y7Cgl9CgojZWxzZQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCXJlc3VsdD0oMzIqKCgodmFsdWU+PjYpJjEpKygodmFsdWU+PjUpJjEpKSkrKHZhbHVlJjB4MWYpOwoJfQoJLy91c2UgZm9yIHR4ZHFkbHkgcmVnaXN0ZXIgLGJlY2F1c2Ugb2YgdGhpcyByZWdpc3RlciBiaXQgNSBpcyBubyB1c2UgamlheGluZyAyMDE4MDgxNAoJCWVsc2UJaWYoICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKXx8KHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSkgIHsKCQlyZXN1bHQ9KDMyKigoKHZhbHVlPj42KSY3KSkpKyh2YWx1ZSYweDNmKTsKCX0KCWVsc2UgIC8vb3RoZXIgcmVnaXN0ZXIgYml0NSBpcyBlZmZlY3QgLGJ1dCBjYW4gbm90IG1vZGlmeSBjb2Fyc2UgZGVsYXkgd2h5ICA/ICBqaWF4aW5nIDIwMTgwODE0CgkJcmVzdWx0PXZhbHVlJjB4M2Y7CiNlbmRpZgoJaWYgKHRlc3RfaW5kZXggPj0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0VFX1ZPTFRBR0UpIHsKCQlyZXN1bHQ9dmFsdWU7Cgl9CglyZXR1cm4gcmVzdWx0Owp9Cgp1aW50MzJfdCBkZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKGNoYXIgdGVzdF9pbmRleCx1aW50MzJfdCB2YWx1ZSApCnsKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZIAoJLy8jZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZICAzCgkvLyNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkgIDQKCS8vI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQoJdWludDMyX3QgcmVzdWx0PTA7CglpZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgKSB7CgkJaWYgKHZhbHVlPDY0KSB7CgkJCXJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkJfQoJCWVsc2UgewoJCQlyZXN1bHQ9KDM8PDUpKyh2YWx1ZSUzMik7CgkJfQoJfQoJLyoKCSAgIGlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJICAgcmVzdWx0PSgodmFsdWUvMzIpPDw2KSt2YWx1ZSUzMjsKCSAgIH0KCSAgIGlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkgewoJICAgcmVzdWx0PSgodmFsdWUvMzIpPDw2KSt2YWx1ZSUzMjsKCSAgIH0KCSAgICovCgkgICBlbHNlIGlmKCh0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkKCQkJICAgfHwodGVzdF9pbmRleD09RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKQoJCQkgICB8fCh0ZXN0X2luZGV4PT1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkpIHsKCQkgICAvL3Jlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlNjQ7CgkJICAgcmVzdWx0PXZhbHVlJTY0OwoJCQlpZiAoKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpfHwodGVzdF9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkpIHsgIC8vdXNlIGZvciB0eGRxZGx5IHJlZ2lzdGVyICxiZWNhdXNlIG9mIHRoaXMgcmVnaXN0ZXIgYml0IDUgaXMgbm8gdXNlIGppYXhpbmcgMjAxODA4MTQKCQkJICAgcmVzdWx0PSgodmFsdWUvMzIpPDw2KSt2YWx1ZSUzMjsKCQkgICB9CgkgICB9CgkgICBlbHNlIGlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKSB7CgkJICAgcmVzdWx0PXZhbHVlJjB4M2Y7CgkgICB9CgkgICBlbHNlIGlmKHRlc3RfaW5kZXg9PURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewojaWYgMQoJCSAgIHJlc3VsdD0oKHZhbHVlLzMyKTw8NikrdmFsdWUlMzI7CgkJLyoKCQkgICBpZihlbmFibGVfYml0NSkKCQkgICB7CgkJCSAgIGlmKChyZXN1bHQ+PjYpJjEpCgkJCSAgIHtyZXN1bHQ9KHJlc3VsdCYweGZmYmYpfCgxPDw1KTsKCQkJICAgfQoJCSAgIH0KCQkqLwojZWxzZQoJCSAgIHJlc3VsdD12YWx1ZSU2NDsKI2VuZGlmCgkgICB9CgkgICBlbHNlIGlmKHRlc3RfaW5kZXg+RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQkgICByZXN1bHQ9dmFsdWU7CgkgICB9CgoJICAgcmV0dXJuIHJlc3VsdDsKfQoKdW5zaWduZWQgaW50IGRvX2Rkcl9nMTJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2Rscih1bnNpZ25lZCBpbnQgcmFua19pbmRleCx1bnNpZ25lZCBpbnQgYWRkX2luZGV4LHVuc2lnbmVkIGludCBsY2Rscl92YWx1ZSx1bnNpZ25lZCBpbnQgcmVhZF93cml0ZV9mbGFnICkKewoJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwwKTsvL213IGZlMWEwMDAwICAwCgkvLyAgcmVnX2Jhc2VfYWRqPTB4ZmUwMDAwMDA7CgkvLyByZWdfYWRkPSgoKDA8PDIwKXwoMDw8MTYpfCh0ZXN0X0FDeDw8MTIpfCgweDgwKSk8PDEpICsgcmVnX2Jhc2VfYWRqOwoJCWlmKHJlYWRfd3JpdGVfZmxhZz09RERSX1BBUkFNRVRFUl9SRUFEKQoJCXsKCgkJCWxjZGxyX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDA8PDE2KXwoYWRkX2luZGV4PDwxMil8KDB4ODApKTsKCQl9CgkJaWYocmVhZF93cml0ZV9mbGFnPT1ERFJfUEFSQU1FVEVSX1dSSVRFKQoJCXsKCgkJCWR3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgwPDwxNil8KGFkZF9pbmRleDw8MTIpfCgweDgwKSksIGxjZGxyX3ZhbHVlKTsKCQl9CgoJcHJpbnRmKCJyYW5rX2luZGV4ICVkICAgYWRkX2luZGV4ICVkICBsY2Rscj09ICVkIFxuIiwgcmFua19pbmRleCxhZGRfaW5kZXgsbGNkbHJfdmFsdWUpOwoJcmV0dXJuIGxjZGxyX3ZhbHVlOwp9Cgp2b2lkIGR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX2RxKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLAoJdWludDMyX3Qgc3RlcF92YWx1ZSkKewoJdWludDMyX3QgZGVsYXlfb2xkX3ZhbHVlPTA7Cgl1aW50MzJfdCBkZWxheV9yZWdfdmFsdWU9MDsKCgl1aW50NjRfdCByZWdfYWRkPTA7CglpZiAoIW92ZXJfcmlkZV9pbmRleCkKCQlyZXR1cm47CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPjI1NSkKCQkJCWRlbGF5X3JlZ192YWx1ZT0yNTU7CgkJfQoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSE9MCkKCQl7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT5zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQllbHNlCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkKzQsZGVsYXlfcmVnX3ZhbHVlKTsKCgl9CgpwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKzB4ZmUwMDAwMDApKSwKCQkJZGVsYXlfb2xkX3ZhbHVlLGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpLGRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSksCgkJCSh1bnNpZ25lZCBpbnQpZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCkpKTsKCn0KCnZvaWQgZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoJdWludDY0X3QgcmVnX2FkZD0wOwoJLy8JaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfQVRYRExZKQoJLy9wX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX2Rkcl9sb2dfbGV2ZWw9MDsKCS8vc2VyaWFsX3B1dHMoIlxuc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nPT0iKTsKCS8vc2VyaWFsX3B1dF9kZWMocF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmcpOwoJLy9zZXJpYWxfcHV0cygiXG4iKTsKCglpZiAoIW92ZXJfcmlkZV9pbmRleCkgewoJCXJldHVybjsKCX0KCS8vZGRyX2RtY191cGRhdGVfZGVsYXlfcmVnaXN0ZXJfYmVmb3JlKCk7CgkvL2NoYXIgZW5hYmxlX2JpdDU9MDsKCS8vCWlmICgocF9kZXYtPnBfZGRycy0+RHJhbVR5cGUgPT0gQ09ORklHX0REUl9UWVBFX0xQRERSNCkgJiYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpKQoJLy8JCXtlbmFibGVfYml0NT0xO30KCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlKTsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDA8PDE2KXwob3Zlcl9yaWRlX3N1Yl9pbmRleDw8MTIpfCgweDgwKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTgpPj4xKTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKygob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKTw8OCkpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCgkJLy8Je2VuYWJsZV9iaXQ1PShkZWxheV9vbGRfdmFsdWU+PjUpJjE7fQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUsZW5hYmxlX2JpdDUpOwoKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWUpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDE4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksKGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpLXBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfcGh5X3JlYWRfZHFzX25pYmJsZV9vZmZzZXQpOwoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OTArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSksKGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpKTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxOTArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLChkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKS1wX2Rldi0+ZGRyX2dsb2FibF9tZXNzYWdlLnN0aWNrX3BoeV9yZWFkX2Rxc19uaWJibGVfb2Zmc2V0KTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKCgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHhjMCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhFTkRMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHg4MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweDE4MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7Cgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikgewoJCS8vCWRlbGF5X29sZF92YWx1ZT0gaW5pdF9zb2NfdnJlZihwX2Rldi0+Y3VyX3R5cGUgICwob3Zlcl9yaWRlX3ZhbHVlPj44KSYweGZmLCBvdmVyX3JpZGVfdmFsdWUsIG92ZXJfcmlkZV9zdWJfaW5kZXggLHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfZGRyX2xvZ19sZXZlbCk7CgkJLy8Jc2V0X3NvY192cmVmKCBwX2Rldi0+Y3VyX3R5cGUgLCAgKG92ZXJfcmlkZV92YWx1ZT4+OCkmMHhmZiwgb3Zlcl9yaWRlX3ZhbHVlLCBvdmVyX3JpZGVfc3ViX2luZGV4ICk7CgkJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpOwoJfQoKCXByaW50ZigicmVnX2FkZCAlMDh4IG9sZF92YWx1ZSAlMDh4IHVwZGF0ZV90byAlMDh4IGRlYyAlZCB0byAlZCBcbiIsKCh1bnNpZ25lZCBpbnQpKCgocmVnX2FkZCkgPDwgMSkrMHhmZTAwMDAwMCkpLAoJCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCQkJKHVuc2lnbmVkIGludClkZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpKTsKfQoKdm9pZCBkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIoY2hhciBvdmVyX3JpZGVfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX3N1Yl9pbmRleCx1aW50MzJfdCBvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsCgl1aW50MzJfdCBzdGVwX3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCXVpbnQzMl90IGRlbGF5X3JlZ192YWx1ZT0wOwoKCXVpbnQ2NF90IHJlZ19hZGQ9MDsKCWlmICghb3Zlcl9yaWRlX2luZGV4KQoJCXJldHVybjsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoKCQlyZWdfYWRkPSgoMDw8MjApfCgwPDwxNil8KG92ZXJfcmlkZV9zdWJfaW5kZXg8PDEyKXwoMHg4MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT45NSkKCQkJZGVsYXlfcmVnX3ZhbHVlPTk1OwoJCX0KCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UhPTApCgkJewoJCQlpZihkZWxheV9yZWdfdmFsdWU+PXN0ZXBfdmFsdWUpCgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cigocmVnX2FkZCksZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4ZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC80KSksZGVsYXlfcmVnX3ZhbHVlKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgoKLy9zb21lIGNhc2Ugd2lsbCBoYXBwZW4gdGRxcyBmcm9tIDB4MWYgdG8gMHgwIG9yIDB4MCB0byAweDFmICx0aGVuIGZhc3QgYm9vdCB3cml0ZSBiYWNrIHdpbGwgaGFwcGVuIGVycm9yICxiZWNhdXNlCi8vIGZhc3QgYm9vdCB3cml0ZSBiYWNrIHdpbGwgcmUtY2FsY3VsYXRlIGNvYXJzZSBVSSx0aGVuIHJlc3VsdCBkcSBwaGFzZSBmYWlsLgovKgoJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQogICAgLy8gIGlmKG92ZXJfcmlkZV92YWx1ZT5kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LGRlbGF5X29sZF92YWx1ZSkpCiAgICAgIAl7ZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKStzdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJaWYoKChkZWxheV9vbGRfdmFsdWUmMHgzZikrc3RlcF92YWx1ZSk+MHgzZikKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLDB4M2Z8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKICAgICAgCX0KCWVsc2UgCgkJey8vZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKS1zdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCWlmKCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpPHN0ZXBfdmFsdWUpKQoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsKGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQllbHNlCgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKS1zdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCX0KCiovCglpZigob3Zlcl9yaWRlX3N1Yl9pbmRleCUyKT09MCkKCXsKCQljaGFyCXRlbXBfdGVzdF9pbmRleD1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWTsKCQljaGFyIHRlbXBfY291bnQ9MDsKCQkvLwlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlmb3IgKCB0ZW1wX2NvdW50PTA7dGVtcF9jb3VudDw5O3RlbXBfY291bnQrKykKCQkJewoJCQkJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfZHEodGVtcF90ZXN0X2luZGV4CgkJCQksKCgob3Zlcl9yaWRlX3N1Yl9pbmRleCk+PjEpKjkrdGVtcF9jb3VudCksCQkoIW92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSksc3RlcF92YWx1ZSkgOwoJCQl9CgkJfQoJfQoKCgkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KChvdmVyX3JpZGVfc3ViX2luZGV4JTQpPDwxMil8KDB4MWQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCgkJLy8Je2VuYWJsZV9iaXQ1PShkZWxheV9vbGRfdmFsdWU+PjUpJjE7fQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUsZW5hYmxlX2JpdDUpOwoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUURMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweGMwKygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPjI1NSkKCQkJCWRlbGF5X3JlZ192YWx1ZT0yNTU7CgkJfQoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSE9MCkKCQl7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT5zdGVwX3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1zdGVwX3ZhbHVlOwoJCQllbHNlIAoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7CgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZSk7CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhDTEtETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHg4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPjk1KQoJCQkJZGVsYXlfcmVnX3ZhbHVlPTk1OwoJCX0KCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UhPTApCgkJewoJCQlpZihkZWxheV9yZWdfdmFsdWU+c3RlcF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWUpOwoKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJewoJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlK3N0ZXBfdmFsdWU7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT42MykKCQkJCWRlbGF5X3JlZ192YWx1ZT02MzsKCQl9CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlIT0wKQoJCXsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPnN0ZXBfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLXN0ZXBfdmFsdWU7CgkJCWVsc2UgCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYRU5ETFkpIHsKCQkvLy8qCgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDgwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKICAgIC8vICBpZihvdmVyX3JpZGVfdmFsdWU+ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCxkZWxheV9vbGRfdmFsdWUpKQogICAgICAJewoJCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpK3N0ZXBfdmFsdWUpfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJCWlmKCgoZGVsYXlfb2xkX3ZhbHVlJjB4M2YpK3N0ZXBfdmFsdWUpPjB4M2YpCgkJCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLDB4M2Z8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCSAgICB9CgkJZWxzZQoJCXsKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoKGRlbGF5X29sZF92YWx1ZSYweDNmKS1zdGVwX3ZhbHVlKXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCQlpZigoKGRlbGF5X29sZF92YWx1ZSYweDNmKTxzdGVwX3ZhbHVlKSkKCQkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCX0KCS8vCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCS8vCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJLy8qLwoJfQoKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1NPQ19WUkVGKSB7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApLG92ZXJfcmlkZV92YWx1ZSk7CgkJLy9yZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoMHg2OCsoKG92ZXJfcmlkZV9zdWJfaW5kZXglOSk8PDgpKyhvdmVyX3JpZGVfc3ViX2luZGV4LzM2KSkpOwoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpJTkpPDw4KXwoMHg0MCkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrc3RlcF92YWx1ZTsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPjEyNykKCQkJCWRlbGF5X3JlZ192YWx1ZT0xMjc7CgkJfQoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZSE9MCkKCQl7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT49c3RlcF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtc3RlcF92YWx1ZTsKCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZSk7Cgl9CglwcmludGYoInJlZ19hZGQgJTA4eCBvbGRfdmFsdWUgJTA4eCB1cGRhdGVfdG8gJTA4eCBkZWMgJWQgdG8gJWQgXG4iLCgodW5zaWduZWQgaW50KSgoKHJlZ19hZGQpIDw8IDEpKzB4ZmUwMDAwMDApKSwKCQkJZGVsYXlfb2xkX3ZhbHVlLGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpLGRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSksCgkJCSh1bnNpZ25lZCBpbnQpZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCkpKTsKCn0KCgp2b2lkIGR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzKGNoYXIgb3Zlcl9yaWRlX2luZGV4LHVpbnQzMl90IG92ZXJfcmlkZV9zdWJfaW5kZXgsdWludDMyX3Qgb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLAoJdWludDMyX3Qgb2Zmc2V0X3ZhbHVlKQp7Cgl1aW50MzJfdCBkZWxheV9vbGRfdmFsdWU9MDsKCS8vdWludDMyX3QgZGVsYXlfcmVnX3ZhbHVlPTA7Cgl1aW50MzJfdCB0ZW1wX2NvdW50XzM9MDsKCS8vCXVpbnQzMl90IGRlbGF5X29sZF92YWx1ZV9jYWNsPTA7CgkvLwl1aW50MzJfdCBkZWxheV9yZWdfdmFsdWVfY2FjbD0wOwoJLy91aW50MzJfdCBvdmVyX3JpZGVfdmFsdWU9MDsKCS8vCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkKCS8vcF9kZXYtPmRkcl9nbG9hYmxfbWVzc2FnZS5zdGlja19kZHJfbG9nX2xldmVsPTA7CgkvL3NlcmlhbF9wdXRzKCJcbnN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9iZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZz09Iik7CgkvL3NlcmlhbF9wdXRfZGVjKHBfZGV2LT5kZHJfZ2xvYWJsX21lc3NhZ2Uuc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nKTsKCS8vc2VyaWFsX3B1dHMoIlxuIik7Cgl1aW50NjRfdCByZWdfYWRkPTA7CglpZiAoIW92ZXJfcmlkZV9pbmRleCkgewoJCXJldHVybjsKCX0KCgkvL2RlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgb3Zlcl9yaWRlX3ZhbHVlKTsKCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX0FUWERMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDA8PDE2KXwob3Zlcl9yaWRlX3N1Yl9pbmRleDw8MTIpfCgweDgwKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCWZvciggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7CgkJCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9Cgl9CgoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFkpIHsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KT4+MSk8PDEyKXwoMHhkMCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSsoKG92ZXJfcmlkZV9zdWJfaW5kZXglMik8PDgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU0KTw8MTIpfCgweGQwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzQpKSxkZWxheV9yZWdfdmFsdWUpOwoJCS8vCWR3Y19kZHJwaHlfYXBiX3dyKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglNCk8PDEyKXwoMHgxZDArKG92ZXJfcmlkZV9zdWJfaW5kZXgvNCkpLGRlbGF5X3JlZ192YWx1ZSk7CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCXsKCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJCWlmKGRlbGF5X3JlZ192YWx1ZT45NikKCQkJCWRlbGF5X3JlZ192YWx1ZT05NjsKCQl9CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQoJCXsKCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPj1vZmZzZXRfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCX0KCQlkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCQkvL2R3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQrNCxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKCgkJLy8Je2VuYWJsZV9iaXQ1PShkZWxheV9vbGRfdmFsdWU+PjUpJjE7fQoJCS8vZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBvdmVyX3JpZGVfdmFsdWUsZW5hYmxlX2JpdDUpOwoJKi8KCWZvciggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCXsKCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCX0KCX0KCWlmIChvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk+PjEpPDwxMil8KDB4OGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkrKChvdmVyX3JpZGVfc3ViX2luZGV4JTIpPDw4KSkpOwoJCWRlbGF5X29sZF92YWx1ZT1kd2NfZGRycGh5X2FwYl9yZChyZWdfYWRkKTsKCQkvKgoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfZGVsYXlfYWxsX3N0ZXAob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9vbGRfdmFsdWUpOwoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQl7CgkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrb2Zmc2V0X3ZhbHVlOwoJCQlpZihkZWxheV9yZWdfdmFsdWU+OTYpCgkJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJfQoJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQl7CgkJCQlpZihkZWxheV9vbGRfdmFsdWU+PW9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCQl9CgkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCs0LGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCSovCgkJCWZvciggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9CgoJCS8qCgkJICAgZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoKG92ZXJfcmlkZV9zdWJfaW5kZXglOCk8PDEyKXwoMHgxOGMrKG92ZXJfcmlkZV9zdWJfaW5kZXgvOCkpKTsKCQkgICBpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTApCgkJICAgZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X29sZF92YWx1ZSsxOwoJCSAgIGlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQkgICBkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlLTE7CgkJICAgZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDE4Yysob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJICAgZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDE5MCsob3Zlcl9yaWRlX3N1Yl9pbmRleC84KSksZGVsYXlfcmVnX3ZhbHVlfChkZWxheV9vbGRfdmFsdWUmMHhmZmMwKSk7CgkJICAgKi8JCgl9CglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZKSB7CgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4YzArKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCQkJZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X29sZF92YWx1ZSk7CgkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCQl7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJaWYoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJCX0KCQkJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MSkKCQl7CgkJCQlpZihkZWxheV9yZWdfdmFsdWU+PW9mZnNldF92YWx1ZSkKCQkJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUtb2Zmc2V0X3ZhbHVlOwoJCQkJZWxzZSAKCQkJCWRlbGF5X3JlZ192YWx1ZT0wOwoJCQl9CgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCxkZWxheV9vbGRfdmFsdWUpKzE7CgkJLy9pZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTEpCgkJLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCxkZWxheV9vbGRfdmFsdWUpLTE7CgkJLy9kd2NfZGRycGh5X2FwYl93cigoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4YzArKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKSxkZWxheV9yZWdfdmFsdWV8KGRlbGF5X29sZF92YWx1ZSYweGZmYzApKTsKZGVsYXlfcmVnX3ZhbHVlPWRkcl9jYWNsX3BoeV9vdmVyX3JpZGVfYmFja19yZWcob3Zlcl9yaWRlX2luZGV4LCBkZWxheV9yZWdfdmFsdWUpOwoJCWR3Y19kZHJwaHlfYXBiX3dyKHJlZ19hZGQsZGVsYXlfcmVnX3ZhbHVlKTsKCQkqLwoJCQkJCWZvciggdGVtcF9jb3VudF8zPTA7dGVtcF9jb3VudF8zPG9mZnNldF92YWx1ZTt0ZW1wX2NvdW50XzMrKykKCQl7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIob3Zlcl9yaWRlX2luZGV4CgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleCkpLAkJb3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlLDEpIDsKCQl9CgoJfQoJaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSkgewoJCXJlZ19hZGQ9KCgwPDwyMCl8KDE8PDE2KXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KS85KTw8MTIpfCgweDY4Kygob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KTw8OCkrKG92ZXJfcmlkZV9zdWJfaW5kZXgvMzYpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X29sZF92YWx1ZTsKCQkJCWlmKG92ZXJfcmlkZV9pbmNyZWFzZV9kZWNyZWFzZT09MCkKCQkJewoJCWRlbGF5X3JlZ192YWx1ZT1kZWxheV9yZWdfdmFsdWUrb2Zmc2V0X3ZhbHVlOwoJCWlmKGRlbGF5X3JlZ192YWx1ZT45NikKCQkJZGVsYXlfcmVnX3ZhbHVlPTk2OwoJCQl9CgkJCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTEpCgkJewoJCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPj1vZmZzZXRfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQkJCWVsc2UgCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQkJfQpkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoJCSovCgkJCQkJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCglpZiAob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWEVORExZKSB7CgkJCgkJcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU4KTw8MTIpfCgweDgwKyhvdmVyX3JpZGVfc3ViX2luZGV4LzgpKSk7CgkJZGVsYXlfb2xkX3ZhbHVlPWR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpOwoJCS8qCglkZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKTsKCQkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCQl7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJaWYoZGVsYXlfcmVnX3ZhbHVlPjk2KQoJCQlkZWxheV9yZWdfdmFsdWU9OTY7CgkJCX0KCQlpZihvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2U9PTEpCgkJewoJCQkJaWYoZGVsYXlfcmVnX3ZhbHVlPj1vZmZzZXRfdmFsdWUpCgkJCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfcmVnX3ZhbHVlLW9mZnNldF92YWx1ZTsKCQkJCWVsc2UgCgkJCQlkZWxheV9yZWdfdmFsdWU9MDsKCQkJfQoJCWRlbGF5X3JlZ192YWx1ZT1kZHJfY2FjbF9waHlfb3Zlcl9yaWRlX2JhY2tfcmVnKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfcmVnX3ZhbHVlKTsKCQlkd2NfZGRycGh5X2FwYl93cihyZWdfYWRkLGRlbGF5X3JlZ192YWx1ZXwoZGVsYXlfb2xkX3ZhbHVlJjB4ZmZjMCkpOwoJCSovCgkJCQkJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCQl9CgoKaWYgKG92ZXJfcmlkZV9pbmRleCA9PSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfU09DX1ZSRUYpIHsKCQoJCS8vZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpOwoJCS8vcmVnX2FkZD0oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KDB4NjgrKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPDw4KSsob3Zlcl9yaWRlX3N1Yl9pbmRleC8zNikpKTsKCQlyZWdfYWRkPSgoMDw8MjApfCgxPDwxNil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNikvOSk8PDEyKXwoKChvdmVyX3JpZGVfc3ViX2luZGV4JTM2KSU5KTw8OCl8KDB4NDApKTsKCQlkZWxheV9vbGRfdmFsdWU9ZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCk7CgkJLyoKCQlkZWxheV9yZWdfdmFsdWU9ZGVsYXlfb2xkX3ZhbHVlOwoJCQkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0wKQoJCQl7CgkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZStvZmZzZXRfdmFsdWU7CgkJaWYoZGVsYXlfcmVnX3ZhbHVlPjEyNykKCQkJZGVsYXlfcmVnX3ZhbHVlPTEyNzsKCQkJfQoJCQkJaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQoJCXsKCQkJCWlmKGRlbGF5X3JlZ192YWx1ZT49b2Zmc2V0X3ZhbHVlKQoJCQkJZGVsYXlfcmVnX3ZhbHVlPWRlbGF5X3JlZ192YWx1ZS1vZmZzZXRfdmFsdWU7CgkJCQllbHNlIAoJCQkJZGVsYXlfcmVnX3ZhbHVlPTA7CgkJCX0KLy9kZWxheV9yZWdfdmFsdWU9ZGRyX2NhY2xfcGh5X292ZXJfcmlkZV9iYWNrX3JlZyhvdmVyX3JpZGVfaW5kZXgsIGRlbGF5X3JlZ192YWx1ZSk7CgkJZHdjX2RkcnBoeV9hcGJfd3IocmVnX2FkZCxkZWxheV9yZWdfdmFsdWUpOwoqLwoJZm9yKCB0ZW1wX2NvdW50XzM9MDt0ZW1wX2NvdW50XzM8b2Zmc2V0X3ZhbHVlO3RlbXBfY291bnRfMysrKQoJCXsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1YihvdmVyX3JpZGVfaW5kZXgKCQksKChvdmVyX3JpZGVfc3ViX2luZGV4KSksCQlvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UsMSkgOwoJCX0KCX0KCnByaW50Zigib3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0lZFxuIixvdmVyX3JpZGVfaW5jcmVhc2VfZGVjcmVhc2UpOwoKaWYob3Zlcl9yaWRlX2luY3JlYXNlX2RlY3JlYXNlPT0xKQp7CnVuc2lnbmVkIGludCBvcmdfY2FjbF92YWx1ZT0oZGVsYXlfb2xkX3ZhbHVlKSYweDNmOwpwcmludGYoIm9yZ19jYWNsX3ZhbHVlPT0lZFxuIixvcmdfY2FjbF92YWx1ZSk7CnByaW50Zigib2Zmc2V0X3ZhbHVlPT0lZFxuIixvZmZzZXRfdmFsdWUpOwoJaWYoKG9yZ19jYWNsX3ZhbHVlJjB4M2YpPG9mZnNldF92YWx1ZSl7CgoJY2hhciB0ZW1wX3Rlc3RfaW5kZXhfMj0wOwoJY2hhciB0ZW1wX2NvdW50XzQ9MDsKCWNoYXIgdGVtcF9jb3VudF8yPTA7CglpZihvdmVyX3JpZGVfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKQoJCXsKCXRlbXBfdGVzdF9pbmRleF8yPURNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRRExZOwoJaWYob3Zlcl9yaWRlX3N1Yl9pbmRleCUyPT0wKXsKCWZvcih0ZW1wX2NvdW50XzI9MDt0ZW1wX2NvdW50XzI8OTt0ZW1wX2NvdW50XzIrKykKCQl7Zm9yKHRlbXBfY291bnRfND0wO3RlbXBfY291bnRfNDwob2Zmc2V0X3ZhbHVlLW9yZ19jYWNsX3ZhbHVlKTt0ZW1wX2NvdW50XzQrKykKewoJZHdjX3dpbmRvd19yZWdfYWZ0ZXJfdHJhaW5pbmdfdXBkYXRlX2luY3JlYXNfc3ViKHRlbXBfdGVzdF9pbmRleF8yCgkJLCgob3Zlcl9yaWRlX3N1Yl9pbmRleD4+MSkqOSt0ZW1wX2NvdW50XzIpLAkJMCwxKSA7CgkJfQoJCX0KCQl9Ci8qCgl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfVFhEUVNETFk7Cglkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQksKChvdmVyX3JpZGVfaW5kZXglMik/CgkJKG92ZXJfcmlkZV9pbmRleC0xKToKCQkob3Zlcl9yaWRlX2luZGV4KzEpKSwJCTApIDsKCQl9CiovCQoJCX0KaWYob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkKewoJdGVtcF90ZXN0X2luZGV4XzI9RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFk7Cgpmb3IoIHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw0O3RlbXBfY291bnRfMisrKQoJZm9yKHRlbXBfY291bnRfND0wO3RlbXBfY291bnRfNDwoKChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpKnVpXzFfMzJfMTAwc3RlcCkvYmRscl8xMDBzdGVwKTt0ZW1wX2NvdW50XzQrKykKCQl7CnsKCWR3Y193aW5kb3dfcmVnX2FmdGVyX3RyYWluaW5nX3VwZGF0ZV9pbmNyZWFzX3N1Yih0ZW1wX3Rlc3RfaW5kZXhfMgoJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgvMikqOSsKCQl0ZW1wX2NvdW50XzIrKG92ZXJfcmlkZV9zdWJfaW5kZXglMikqNCksCQkwLDEpIDsKCQoJCQkJfQoJCX0KfQoKCQkJaWYob3Zlcl9yaWRlX2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWFBCRExZKQoJCQl7CgkJCQl0ZW1wX3Rlc3RfaW5kZXhfMj1ETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWTsKCgkJCQlmb3IoIHRlbXBfY291bnRfMj0wO3RlbXBfY291bnRfMjw0O3RlbXBfY291bnRfMisrKQoJCQkJewoJCQkJCWlmKHRlbXBfY291bnRfMj09KChvdmVyX3JpZGVfc3ViX2luZGV4JTkpJTQpKQoJCQkJCQl0ZW1wX2NvdW50XzIrKzsKZm9yKHRlbXBfY291bnRfND0wO3RlbXBfY291bnRfNDwob2Zmc2V0X3ZhbHVlLW9yZ19jYWNsX3ZhbHVlKTt0ZW1wX2NvdW50XzQrKykKCQkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQkJCQkJCSwoKG92ZXJfcmlkZV9zdWJfaW5kZXgvOSkqOSsKCQl0ZW1wX2NvdW50XzIrKCgob3Zlcl9yaWRlX3N1Yl9pbmRleCU5KT4zKT80OjApKSwJCTAsMSkgOwoKCQkJCX0KCQkJCS8vYmRscl8xMDBzdGVwICAob3JnX2NhY2xfdmFsdWU8b2Zmc2V0X3ZhbHVlKQoJCQkJaWYoKCgob2Zmc2V0X3ZhbHVlLW9yZ19jYWNsX3ZhbHVlKSpiZGxyXzEwMHN0ZXApL3VpXzFfMzJfMTAwc3RlcCkpCgkJCQl7CgkJCQkJdGVtcF90ZXN0X2luZGV4XzI9RE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZOwoJZm9yKHRlbXBfY291bnRfND0wO3RlbXBfY291bnRfNDwoKChvZmZzZXRfdmFsdWUtb3JnX2NhY2xfdmFsdWUpKmJkbHJfMTAwc3RlcCkvdWlfMV8zMl8xMDBzdGVwKTt0ZW1wX2NvdW50XzQrKykKCQkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhc19zdWIodGVtcF90ZXN0X2luZGV4XzIKCQkJCQkJCSwoKChvdmVyX3JpZGVfc3ViX2luZGV4LzkpPDwxKSsKCQkJCQkJCQkoKChvdmVyX3JpZGVfc3ViX2luZGV4JTkpPjMpPzE6MCkKCQkpLAkJMCwxKSA7CgkJCQl9CgkJCX0KCQl9Cn0KCXByaW50ZigicmVnX2FkZCAlMDh4IG9sZF92YWx1ZSAlMDh4IHVwZGF0ZV90byAlMDh4IGRlYyAlZCB0byAlZCBcbiIsKCh1bnNpZ25lZCBpbnQpKCgocmVnX2FkZCkgPDwgMSkrMHhmZTAwMDAwMCkpLAoJCQlkZWxheV9vbGRfdmFsdWUsZHdjX2RkcnBoeV9hcGJfcmQocmVnX2FkZCksZGRyX2NhY2xfcGh5X2RlbGF5X2FsbF9zdGVwKG92ZXJfcmlkZV9pbmRleCwgZGVsYXlfb2xkX3ZhbHVlKSwKCWRkcl9jYWNsX3BoeV9kZWxheV9hbGxfc3RlcChvdmVyX3JpZGVfaW5kZXgsIGR3Y19kZHJwaHlfYXBiX3JkKHJlZ19hZGQpKSk7CgkvL2Rkcl9sb2dfc2VyaWFsX3B1dHMoIiAiLDApOwoJLy9kZHJfbG9nX3NlcmlhbF9wdXRfaGV4KGRlbGF5X3JlZ192YWx1ZSwxNiwwKTsKCS8vZGRyX2xvZ19zZXJpYWxfcHV0cygiICIsMCk7CgkvLwlkZHJfZG1jX3VwZGF0ZV9kZWxheV9yZWdpc3Rlcl9hZnRlcigpOwp9CgppbnQgZG9fZGRyMnBsbF9nMTJfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewojZGVmaW5lIERNQ19XSU5ET1dfQ01EICAgMjAxODAwMTAgIC8vZzEyX2QycGxsIDE1ODQgMCAwIDAgMCAweDgKCS8vZzEyX2QycGxsIDE2MDAgNSAwIDB4MTAgMQoJLy9nMTJfZDJwbGwgMTYwMCAwIDAgMCAwIDB4MTAgMCAxCgkvL2cxMl9kMnBsbCAxNDAwIDAgMCAwIDAgMCAwIDAgMCAxIDEyMDAgIDE5MDAgICAgdGVzdCBkZHIgZnJlcXVlbmN5IAoJLy9nMTJfZDJwbGwgMTQwMCAwIDAgMCAwIDAgMCAwIDAgMyAxMjAwICAxOTAwICAgIHRlc3QgZGRyIGZyZXF1ZW5jeSB3aXRoIEVFIHZvbHRhZ2UKCS8vZzEyX2QycGxsIDE2MDAgMCAwIDAgMCAwIDAgMCAxICAvL2Z1bGwgdGVzdAoJLy9nMTJfZDJwbGwgMTYwMCAwIDAgMCAwIDAgMCAwIDEgIDAgMCAwIDg3MiAvL2Z1bGwgdGVzdCB3aXRoIDg3Mm12IEVFCgkvL2cxMl9kMnBsbCAxNjAwIDAgMCAwIDAgMHgxMCAwIDMgIC8vb25seSB0ZXN0IHNwZWMgc3ViX2luZGV4IGRlbGF5IHdpbmRvdwoJLy9nMTJfZDJwbGwgMTYwMCAgY21kX2luZGV4IGNtZF9wYXJhMSBjbWRfcGFyYTIuLi4uCgkvL2cxMl9kMnBsbCAxNjAwICAweDEgICAgb3ZlcnJpZGVfb3B0aW9uX2FjX2RhdGFfZGVsYXlfdnJlZiAgb3ZlcnJpZGVfaW5kZXggICBvdmVyX3JpZGVfdmFsdWUKCS8vZzEyX2QycGxsIDE2MDAgIDB4MiAgICBvdmVycmlkZSBwbHVzIGZ1bGx0ZXN0CgkvL2cxMl9kMnBsbCAxNjAwICAweDMgICAgb3ZlcnJpZGUgcGx1cy4uLm90aGVyIGZ1bmN0aW9uCgkvL2cxMl9kMnBsbCAxNjAwICAweDExICAgd2luZG93X3Rlc3QKCS8vZzEyX2QycGxsIDE2MDAgIDB4MjEgICBmcmVxdWVuY3kgdGFibGUgdGVzdAoJLy9nMTJfZDJwbGwgMTYwMCAgMHgzMSAgIHN3ZWVwX2VlX3ZvbHRhZ2VfZnJlcXVlbmN5IHRhYmxlIHRlc3QKCgoJLy9nMTJfZDJwbGwgMTgwMCAgMSAgLy9kbWMgZnVsbHRlc3QKCS8vZzEyX2QycGxsIDE4MDAgIDIgMSAxIDEgMDMgIDIgMiAxNDIgIDB4MTEgMCA5NTAgICBvdmVycmlkZSBhZnRlcl90cmFpbmluZ19mbGFnICBvdmVycmlkZV9pbmRleCBzdWJfaW5kZXggdmFsdWUgb3ZlcnJpZGVfaW5kZXgyIHN1Yl9pbmRleDIgdmFsdWUyIG92ZXJyaWRlX2luZGV4MyBzdWJfaW5kZXgzIHZhbHVlMwoJLy9vdmVycmlkZSAxIDIgMyA0IDUgMHgxMQoJLy9nMTJfZDJwbGwgMTgwMCAyIDEgMHgxMiAgMHgxIDB4MGY2ICAgb3ZlcnJpZGVfc29jX3ZyZWYgICBwaW5faW5kZXggICh2cmVmX3JhbmdlPDw4KXwodnJlZl92YWx1ZSkKCgkvL2cxMl9kMnBsbCAxODAwICA0ICA0LzUvYSAgIC8vb3ZlcnJpZGVfdHJhaW5pbmdfaGR0bF9jdGwgdmFsdWUKCgkvL2cxMl9kMnBsbCAxODAwICAweDIxICAgLy9kbWMgc3VzcGVuZCB0ZXN0CgkvL2cxMl9kMnBsbCAxODAwICAweDExICAweDFmIDAgMCAwIDEwICAweDIwIC8vZG1jIHdpbmRvdyB0ZXN0ICBtYXNrMSBtYXNrMiBtYXNrMyBzdWJfaW5kZXggcmVhZF9iaXRfaW5pdF92YWx1ZSh1c2UgZm9yIHZlcnkgaGlnaCBzcGVlZCkKCS8vZzEyX2QycGxsIDE4MDAgIDB4MzIgIDEzMDAgMTUwMCAgNzkwICA4MjAgIC8vZG1jIHN3ZWVwIGZyZXEgYW5kIGVlIHZvbHRhZ2UgdGVzdCAgZnJlcXVlbmN5X21pbiBmcmVxdWVuY3lfbWF4IGVlX3ZvbHRhZ2VfbWluICBlZV92b2x0YWdlX21heAoJLy9nMTJfZDJwbGwgMTgwMCAgMHg0MSAyIDAgMHhmZSAgMCAwICAxIDB4MDEgIDAgIDAgMSAyICAweDEwMDAwMCAvL2RtYyAgZXllX3Rlc3RfZW5hYmxlIGluaXRfcmFuZ2VfMCByYW5nZTAgX3ZhbHVlICB2cmVmX3N0YXJ0IHZyZWZfZW5kCgkvL2luaXRfcmFuZ2VfMiAgcmFuZ2UyX3ZhbHVlIHZyZWZfc3RhcnQyIHZyZWZfZW5kMiBwaW5faW5kZXhfbWluIHBpbl9pbmRleF9tYXggIHRlc3Rfc2l6ZQoKCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9ETUNfRlVMTF9URVNUICAgMHgwMQojZGVmaW5lIEcxMl9EMlBMTF9DTURfT1ZFUl9SSURFICAgMHgwMgojZGVmaW5lIEcxMl9EMlBMTF9DTURfT1ZFUl9SSURFX1BMVVNfRlVMTFRFU1QgIDB4MDMKI2RlZmluZSBHMTJfRDJQTExfQ01EX09WRVJfUklERV9UUkFJTklOR19IRFRMICAweDA0CiNkZWZpbmUgRzEyX0QyUExMX0NNRF9XSU5ET1dfVEVTVCAgMHgxMQojZGVmaW5lIEcxMl9EMlBMTF9DTURfV0lORE9XX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERSAgMHgxMgojZGVmaW5lIEcxMl9EMlBMTF9DTURfU1VTUEVORF9URVNUICAweDIxCgkvLyNkZWZpbmUgRzEyX0QyUExMX0NNRF9GUkVRVUVOQ1lfVEFCTEVfVEVTVCAgMHgzMQojZGVmaW5lIEcxMl9EMlBMTF9DTURfU1dFRVBfRUVfVk9MVEFHRV9GUkVRVUVOQ1lfVEFCTEVfVEVTVCAgMHgzMgojZGVmaW5lIEcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUICAweDQxCiNkZWZpbmUgRzEyX0QyUExMX0NNRF9ERFJfRVlFX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERSAgICAweDQyCgoKI2RlZmluZSBHMTJfRDJQTExfQ01EX0REUl9EVkZTX1RFU1QgIDB4NTEKCgkvL09WRVJSSURFX09QVElPTgojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkgMQojZGVmaW5lIERNQ19URVNUX1dJTkRPV19JTkRFWF9UWERRU0RMWSAyCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYQ0xLRExZICAzCiNkZWZpbmUgRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkgIDQKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfUlhQQkRMWSAgNQoKI2RlZmluZSBETUNfVEVTVF9XSU5ET1dfSU5ERVhfRUVfVk9MVEFHRSAgMHgxMQoKCWNoYXIgKmVuZHA7Cgl1bnNpZ25lZCBpbnQgcGxsOwoJdW5zaWduZWQgaW50ICB3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWU9MDsKI2lmIDAKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2NtZF9pbmRleD0wOyAgLy8gIDEgIG92ZXJyaWRlX2NtZCAgIDIKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlPTA7IC8vIGJpdCAwIGFjICAxICBkYXRhIGRxcyB3cml0ZSAgIDIgZGF0YSBkcXMgcmVhZCAgMyBkYXRhIGJpdCB3cml0ZSAgIDQgZGF0YSBiaXQgcmVhZCAgNS8vZGF0YSB3cml0ZSB2cmVmICAgNiAvL2RhdGEgcmVhZCB2cmVmICAKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXg9MDsKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWU9MDsKCXVuc2lnbmVkIGludCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfYmVmb3JlX2FmdGVyX3RyYWluaW5nX3NldHRpbmc9MDsgIC8vMCAgYmVmb3JlICAsMSBhZnRlciB0cmFpbmluZwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfbWFzaz0wOwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlX3NwZWNfc3ViX2luZGV4PTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZT0wOwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZT0wOwoKCXVuc2lnbmVkIGludCBzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWluPTA7Cgl1bnNpZ25lZCBpbnQgc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21heD0wOwoJdW5zaWduZWQgaW50IHN0aWNrX2RtY19kZHJfYmwyX2VlX3ZvbHRhZ2U9MDsKI2VuZGlmCgkvL2lmKHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlKQoJewoJCS8vc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0oKHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlPj4yNCkmMHhmKTsvL2JpdCAwIGFjICBiaXQxIHdyaXRlIGRxIGJpdCAyIHJlYWQgZHEKCQkvL3N0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD0oKHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlPj4xNikmMHhmZik7CgkJLy9zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWU9KHdpbmRvd190ZXN0X3N0aWNrX3ZhbHVlJjB4ZmYpOwoJfQoJLyogbmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzICovCglpZiAoYXJnYyA8IDIpCgkJZ290byB1c2FnZTsKCglwbGwgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCAmZW5kcCwwKTsKCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQlwcmludGYgKCJFcnJvcjogV3JvbmcgZm9ybWF0IHBhcmFtZW50IXBsbD0weCUwOHhcbiIscGxsKTsKCQlyZXR1cm4gMTsKCX0KCXVuc2lnbmVkIGludCBhcmdjX2NvdW50PTE7Cgl1bnNpZ25lZCBpbnQgIHBhcmFfbWV0ZXJbMzBdPXswLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLH07Cgl3aGlsZShhcmdjX2NvdW50PGFyZ2MpCgl7cGFyYV9tZXRlclthcmdjX2NvdW50LTFdPSBzaW1wbGVfc3RydG91bChhcmd2W2FyZ2NfY291bnRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2W2FyZ2NfY291bnRdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlwYXJhX21ldGVyW2FyZ2NfY291bnQtMV0gPSAwOwoJCX0KCQlhcmdjX2NvdW50Kys7Cgl9CgoJLy9pZihzdGlja190ZXN0X2NtZF9pbmRleD09KQojaWYgMAoJaWYgKGFyZ2MgPjQpCgl7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZT0wOwoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGUgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlID0gMDsKCQl9CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4ID0gMDsKCQl9CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYXJndls0XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls0XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlID0gMDsKCQl9Cgl9CgllbHNlCgl7CXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9lbmFibGU9MDsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSAwOwoJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZSA9IDA7Cgl9CgoJaWYgKGFyZ2MgPjUpCgl7CgkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nID0gc2ltcGxlX3N0cnRvdWwoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NikKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+NykKCXsKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrID0gc2ltcGxlX3N0cnRvdWwoYXJndls3XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls3XSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfbWFzayA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjgpCgl7CgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGVfc3BlY19zdWJfaW5kZXggPSBzaW1wbGVfc3RydG91bChhcmd2WzhdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9zcGVjX3N1Yl9pbmRleCA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjkpCgl7CgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9kbWNfZnVsbF90ZXN0X2VuYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbOV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZG1jX2Z1bGxfdGVzdF9lbmFibGUgPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMCkKCXsKCQlzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfZWVfdm9sdGFnZV9lbmFibGUgPSBzaW1wbGVfc3RydG91bChhcmd2WzEwXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZSA9IDA7CgkJfQoJfQoJaWYgKGFyZ2MgPjExKQoJewoJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9taW4gPSBzaW1wbGVfc3RydG91bChhcmd2WzExXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMV0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CgkJCXN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9taW4gPSAwOwoJCX0KCX0KCWlmIChhcmdjID4xMikKCXsKCQlzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWF4ID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxMl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMTJdID09IDAgfHwgKmVuZHAgIT0gMCkgewoJCQlzdGlja19kbWNfZGRyX2JsMl9zd2VlcF9mcmVxdWVuY3lfbWF4ID0gMDsKCQl9Cgl9CglpZiAoYXJnYyA+MTMpCgl7CgkJc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMTNdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzEzXSA9PSAwIHx8ICplbmRwICE9IDApIHsKCQkJc3RpY2tfZG1jX2Rkcl9ibDJfZWVfdm9sdGFnZSA9IDA7CgkJfQoJfQoKCiNpZiBkZWZpbmVkKENPTkZJR19NNlRWKSB8fCBkZWZpbmVkKENPTkZJR19NNlRWRCkKCXdyX3JlZyggUFJFR19TVElDS1lfUkVHMCwwIHwgKDB4M2MgPDwgMjQpKTsKI2Vsc2UKCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcwLDAgfCAoMHhmMTMgPDwgMjApKTsKI2VuZGlmCgoJaWYoc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9lbmFibGUpCgl7CgkJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzAsKChzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9zcGVjX3N1Yl9pbmRleCYweGZmKTw8OCl8KHN0aWNrX2RtY19kZHJfd2luZG93X3Rlc3RfZW5hYmxlJjB4ZmYpIHwgKDB4ZjEyPDwgMjApKTsKCX0KCS8vd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzEscGxsIHwgKHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcxKSkpOwoJd3JfcmVnKFBSRUdfU1RJQ0tZX1JFRzEscGxsICk7Cgl3cl9yZWcoUFJFR19TVElDS1lfUkVHMiwoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX3ZhbHVlJjB4ZmZmZikgfCgoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2luZGV4JjB4ZmYpPDwxNikKCQkJfCgoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2VuYWJsZSYweDcpPDwyOSkKCQkJfCgoc3RpY2tfdGVzdF9kZHJfd2luZG93X2RlbGF5X292ZXJyaWRlX2JlZm9yZV9hZnRlcl90cmFpbmluZ19zZXR0aW5nJjB4MSk8PDI4KSk7CglpZihzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUczLChzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2VuYWJsZV9tYXNrKSk7Cgl9CgkvLwlpZihzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2RtY19mdWxsX3Rlc3RfZW5hYmxlKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUc0LChzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X2RtY19mdWxsX3Rlc3RfZW5hYmxlPDwzMSl8KHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZTw8MjkpKTsKCX0KCWlmKHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9lZV92b2x0YWdlX2VuYWJsZSkKCXsKCQl3cl9yZWcoUFJFR19TVElDS1lfUkVHNSwoc3RpY2tfZG1jX2Rkcl9ibDJfc3dlZXBfZnJlcXVlbmN5X21pbjw8MCl8KHN0aWNrX2RtY19kZHJfYmwyX3N3ZWVwX2ZyZXF1ZW5jeV9tYXg8PDE2KSk7Cgl9CglpZihzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUc2LChzdGlja19kbWNfZGRyX2JsMl9lZV92b2x0YWdlPDwwKSk7Cgl9CiNlbmRpZiAKCWFyZ2NfY291bnQ9MjsKCXdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT1wYXJhX21ldGVyW2FyZ2NfY291bnQtMV07CglpZigod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlPT1HMTJfRDJQTExfQ01EX09WRVJfUklERSl8fCh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWU9PUcxMl9EMlBMTF9DTURfT1ZFUl9SSURFX1BMVVNfRlVMTFRFU1QpKQoJewoJCXBhcmFfbWV0ZXJbM109KHBhcmFfbWV0ZXJbM108PDI0KXwocGFyYV9tZXRlcls0XTw8MTYpfChwYXJhX21ldGVyWzVdPDwwKTsKCQlwYXJhX21ldGVyWzRdPShwYXJhX21ldGVyWzZdPDwyNCl8KHBhcmFfbWV0ZXJbN108PDE2KXwocGFyYV9tZXRlcls4XTw8MCk7CgkJcGFyYV9tZXRlcls1XT0ocGFyYV9tZXRlcls5XTw8MjQpfChwYXJhX21ldGVyWzEwXTw8MTYpfChwYXJhX21ldGVyWzExXTw8MCk7CgoJfQoJaWYoKHdpbmRvd190ZXN0X3N0aWNrX2NtZF92YWx1ZT09RzEyX0QyUExMX0NNRF9XSU5ET1dfVEVTVCl8fCh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWU9PUcxMl9EMlBMTF9DTURfV0lORE9XX1RFU1RfQU5EX1NUSUNLWV9PVkVSUklERSkpCgl7CgkJLy9wYXJhX21ldGVyWzhdICBzaXplICAgOSAgc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9ub191c2VfZHFzX2RxX2NvcnJlY3Rpb24gICAxMCBkaXNhYmxlX3NjcmFtYmxlX3VzZV9kZWZpbmVfcGF0dGVybiAgMTEgc3RpY2tfZG1jX3dpbmRvd190ZXN0X2xvb3BfZmxhZyB3aW5kb3cgbG9vcCB0ZXN0CgkJLy8xMiBpZiByZWluaXQgd2hlbiB0ZXN0IGRxICAxMyBwYXNzX3RvX2ZhaWxfZmxhZyAgICAxNCAgdGVzdF9kbWNfb3JfY3B1CgkJcGFyYV9tZXRlcls1XT0ocGFyYV9tZXRlcls5XTw8MjgpfChwYXJhX21ldGVyWzEwXTw8MjQpfChwYXJhX21ldGVyWzExXTw8MjApfChwYXJhX21ldGVyWzEyXTw8MjEpfChwYXJhX21ldGVyWzEzXTw8MjIpfChwYXJhX21ldGVyWzE0XTw8MjUpfChwYXJhX21ldGVyWzVdPDwwKTsKCgl9CglpZigod2luZG93X3Rlc3Rfc3RpY2tfY21kX3ZhbHVlPT1HMTJfRDJQTExfQ01EX0REUl9FWUVfVEVTVCl8fCh3aW5kb3dfdGVzdF9zdGlja19jbWRfdmFsdWU9PUcxMl9EMlBMTF9DTURfRERSX0VZRV9URVNUX0FORF9TVElDS1lfT1ZFUlJJREUpKQoJewoKCQlwYXJhX21ldGVyWzNdPShwYXJhX21ldGVyWzNdPDwwKXwocGFyYV9tZXRlcls0XTw8OCl8KHBhcmFfbWV0ZXJbNV08PDE2KXwocGFyYV9tZXRlcls2XTw8MjQpOwoJCXBhcmFfbWV0ZXJbNF09KHBhcmFfbWV0ZXJbN108PDApfChwYXJhX21ldGVyWzhdPDw4KXwocGFyYV9tZXRlcls5XTw8MTYpfChwYXJhX21ldGVyWzEwXTw8MjQpOwoJCXBhcmFfbWV0ZXJbNV09cGFyYV9tZXRlclsxMV07Ly8ocGFyYV9tZXRlclsxMV08PDApfChwYXJhX21ldGVyWzEyXTw8OCl8KHBhcmFfbWV0ZXJbMTNdPDwxNil8KHBhcmFfbWV0ZXJbMTRdPDwyNCk7CgkJcGFyYV9tZXRlcls2XT1wYXJhX21ldGVyWzEyXTsvL3BhcmFfbWV0ZXJbMTVdOwoJCXBhcmFfbWV0ZXJbN109cGFyYV9tZXRlclsxM107Ly9wYXJhX21ldGVyWzE2XTsKCQlwYXJhX21ldGVyWzhdPXBhcmFfbWV0ZXJbMTRdOy8vcGFyYV9tZXRlclsxN107Cgl9Cgl3cl9yZWcoUFJFR19TVElDS1lfUkVHMCwocmRfcmVnKFBSRUdfU1RJQ0tZX1JFRzApJjB4ZmZmZikgfCAoMHhmMTMgPDwgMjApKTsKCWFyZ2NfY291bnQ9MDsKCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcgWzB4JTA4eF0gIFsweCUwOHhdPT1bMHglMDh4XVxuIiwgYXJnY19jb3VudCwoUFJFR19TVElDS1lfUkVHMCsoYXJnY19jb3VudDw8MikpLHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcwKyhhcmdjX2NvdW50PDwyKSkpOwoJYXJnY19jb3VudD0xOwoJLy93aGlsZShhcmdjX2NvdW50PGFyZ2MpCgl3aGlsZShhcmdjX2NvdW50PDEwKQoJewoJCXdyX3JlZyhQUkVHX1NUSUNLWV9SRUcwKyhhcmdjX2NvdW50PDwyKSxwYXJhX21ldGVyW2FyZ2NfY291bnQtMV0pOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcgWzB4JTA4eF0gIFsweCUwOHhdPT1bMHglMDh4XVxuIiwgYXJnY19jb3VudCwoUFJFR19TVElDS1lfUkVHMCsoYXJnY19jb3VudDw8MikpLHJkX3JlZyhQUkVHX1NUSUNLWV9SRUcwKyhhcmdjX2NvdW50PDwyKSkpOwoJCWFyZ2NfY291bnQrKzsKCX0KCS8qCQoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcwIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMCkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcxIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMSkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUcyIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMikpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUczIFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHMykpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUc0IFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHNCkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUc1IFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHNSkpOwoJCXByaW50ZigiUF9QUkVHX1NUSUNLWV9SRUc2IFsweCUwOHhdXG4iLCByZF9yZWcoUFJFR19TVElDS1lfUkVHNikpOwoJCSovCglwcmludGYoInJlc2V0Li4uXG4iKTsKCglkZHJfdGVzdF93YXRjaGRvZ19yZXNldF9zeXN0ZW0oKTsKCgoJcmV0dXJuIDA7Cgp1c2FnZToKCWNtZF91c2FnZShjbWR0cCk7CglyZXR1cm4gMTsKfQoKClVfQk9PVF9DTUQoCglnMTJfZDJwbGwsCTE4LAkxLAlkb19kZHIycGxsX2cxMl9jbWQsCgkiZzEyX2QycGxsIDEzMDAgIDEgMHgxMCAwIiwKCSJnMTJfZDJwbGwgIGNsayBkZWxheV9pbmRleCBkZWxheV92YWx1ZSBiZWZvcmVfYWZ0ZXJfdHJhaW5pbmdfc2V0dGluZ1xuIgopOwoKaW50IGRvX2Rkcl9nMTJfdWJvb3RfZG1jX3Rlc3QoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CglyZXR1cm4gMTsKCgkvKgoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCWlmIChhcmdjIDwgMikKCWdvdG8gdXNhZ2U7CgoKCXVuc2lnbmVkIGludCBhcmdjX2NvdW50PTE7Cgl1bnNpZ25lZCBpbnQgIHBhcmFfbWV0ZXJbMzBdPXswLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLCAwLDAsMCwwLDAsIDAsMCwwLDAsMCwgMCwwLDAsMCwwLH07Cgl3aGlsZShhcmdjX2NvdW50PGFyZ2MpCgl7cGFyYV9tZXRlclthcmdjX2NvdW50LTFdPSBzaW1wbGVfc3RydG91bChhcmd2W2FyZ2NfY291bnRdLCAmZW5kcCwgMCk7CglpZiAoKmFyZ3ZbYXJnY19jb3VudF0gPT0gMCB8fCAqZW5kcCAhPSAwKSB7CglwYXJhX21ldGVyW2FyZ2NfY291bnQtMV0gPSAwOwoJfQoJYXJnY19jb3VudCsrOwoJfQoKCXVpbnQzMl90IGRtY190ZXN0X3N0YXJ0X2FkZD1wYXJhX21ldGVyWzBdOwoJdWludDMyX3QgZG1jX3Rlc3Rfc3RhcnRfZW5kPXBhcmFfbWV0ZXJbMV07Cgl1aW50MzJfdCB0ZXN0X3dyaXRlX2xvb3BzPXBhcmFfbWV0ZXJbMl07Cgl1aW50MzJfdCB0ZXN0X3JlYWRfbG9vcHM9cGFyYV9tZXRlclszXTsKI2RlZmluZSBETUNfVEVTVF9TVEFSVF9BRERfREVGQVVMVCAgIDE8PDIwCiNkZWZpbmUgRE1DX1RFU1RfRU5EX0FERF9ERUZBVUxUICAgNTEyPDwyMAojZGVmaW5lIERNQ19URVNUX1dSSVRFX0xPT1BfREVGQVVMVCAgIDEKI2RlZmluZSBETUNfVEVTVF9SRUFEX0xPT1BfREVGQVVMVCAgIDEKZG1jX3Rlc3Rfc3RhcnRfYWRkPWRtY190ZXN0X3N0YXJ0X2FkZD9kbWNfdGVzdF9zdGFydF9hZGQ6RE1DX1RFU1RfU1RBUlRfQUREX0RFRkFVTFQ7CmRtY190ZXN0X3N0YXJ0X2VuZD1kbWNfdGVzdF9zdGFydF9lbmQ/ZG1jX3Rlc3Rfc3RhcnRfZW5kOkRNQ19URVNUX0VORF9BRERfREVGQVVMVDsKdGVzdF93cml0ZV9sb29wcz10ZXN0X3dyaXRlX2xvb3BzP3Rlc3Rfd3JpdGVfbG9vcHM6RE1DX1RFU1RfV1JJVEVfTE9PUF9ERUZBVUxUOwp0ZXN0X3JlYWRfbG9vcHM9dGVzdF9yZWFkX2xvb3BzP3Rlc3RfcmVhZF9sb29wczpETUNfVEVTVF9SRUFEX0xPT1BfREVGQVVMVDsKCndoaWxlKCh0ZXN0X3dyaXRlX2xvb3BzKXx8KHRlc3RfcmVhZF9sb29wcykpCnsKCmlmKHRlc3Rfd3JpdGVfbG9vcHMpCmRkcl9iaXN0X3Rlc3RfZXJyb3I9ZG1jX2Rkcl90ZXN0KGRyYW1fYmFzZSwxLDAsMCx0ZXN0X3NpemUsMSwwKStkZHJfYmlzdF90ZXN0X2Vycm9yOwoKCl91ZGVsYXkodGVzdF9kZWxheV90aW1lX21zKjEwMDApOwoKCgoKI2lmZGVmIENGR19FTkFCTEVfRERSX0RNQ19URVNUCmlmKHRlc3RfcmVhZF9sb29wcykKZGRyX2Jpc3RfdGVzdF9lcnJvcj1kbWNfZGRyX3Rlc3QoZHJhbV9iYXNlLDAsMSwxLHRlc3Rfc2l6ZSwxLDApK2Rkcl9iaXN0X3Rlc3RfZXJyb3I7CnNlcmlhbF9wdXRzKCJcbmRtYyBmdWxsIHRlc3QgcmVzdWx0PT0iKTsKc2VyaWFsX3B1dF9kZWMoZGRyX2Jpc3RfdGVzdF9lcnJvcik7CnNlcmlhbF9wdXRzKCJcbiIpOwojZW5kaWYKaWYodGVzdF93cml0ZV9sb29wcykKdGVzdF93cml0ZV9sb29wcy0tOwppZih0ZXN0X3JlYWRfbG9vcHMpCnRlc3RfcmVhZF9sb29wcy0tOwp9Cgp7Cgp1aW50MTZfdAlkcV9iaXRfZGVsYXlbNzJdOwp1bnNpZ25lZAljaGFyIHRfY291bnQ9MDsKdWludDE2X3QgIGRlbGF5X29yZz0wOwp1aW50MTZfdCAgZGVsYXlfdGVtcD0wOwp1aW50MzJfdCAgYWRkX29mZnNldD0wOwpkd2NfZGRycGh5X2FwYl93cigweGQwMDAwLDB4MCk7CgoJe3ByaW50ZigiXG4gd3JpdGUgZHFfYml0IGRlbGF5ICogMS8zMlVJIik7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDcyO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTM2KS85KTw8MTIpfCgweGMwKygodF9jb3VudCU5KTw8OCkrKHRfY291bnQvMzYpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCXByaW50ZigiXG4gdF9jb3VudDogJWQgJWQiLHRfY291bnQsZGVsYXlfdGVtcCk7CgkJfQoJfQoKfQoKCgoKCgoKcmV0dXJuIDE7CiovCgp9CiNlbmRpZgoKI2lmIDAKaW50IGRvX2Rkcl91Ym9vdF93aW5kb3dfZzEyYV91c2Vfc291cmNlX3Rlc3RfYWRkX2NsayhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCXByaW50ZigiXG5zZXRlbnYgYm9vdGNtZCBkZHJfdGVzdF9jbWQgMHgzNiA0IDYgIDYwIDAgMHgxMDAwMDAgMHg0MDAwMDAwICAwIDB4MTAwMDEwIDBcbiIpOwoJcHJpbnRmKCJcbkVudGVyIGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSBmdW5jdGlvblxuIik7CglwcmludGYoIlxuLS0tIHdhdGNoZG9nIHNob3VsZCA+MTVzXG4iKTsKCiNkZWZpbmUgRERSX1RFU1RfTlVMTCAgMAojZGVmaW5lIEREUl9URVNUX1BBU1MgIDEKI2RlZmluZSBERFJfVEVTVF9GQUlMIDIKCgojZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgIDQgIC8vIFBSRUdfU1RJQ0tZX1JFRzQKI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgICAgNSAgLy80NS8vIFBSRUdfU1RJQ0tZX1JFRzQKCS8vUFJFR19TVElDS1lfUkVHNAoJLy9QUkVHX1NUSUNLWV9SRUc1CgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9PTkdPSU5HICAgMQojZGVmaW5lIEREUl9URVNUX1NUQVRVU19VQk9PVF9GSU5JU0ggMgojZGVmaW5lIEREUl9URVNUX1NUQVRVU19LRVJORUxfT05HSU5HICAzCiNkZWZpbmUgRERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0ggNAoJLy8jZGVmaW5lIEREUl9URVNUX0ZBSUwgMgoKCgljaGFyICplbmRwOwoJdW5zaWduZWQgaW50ICAgbGFuZV9kaXNhYmxlPSAwOwoJdW5zaWduZWQgaW50ICAgZGF0YV9zb3VyY2U9IDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9kYXRhX3Rlc3Rfc2l6ZT0weDEwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl9hZGRfdGVzdF9zaXplPTB4MTAwMDAwMDA7Cgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X3NpemU9MHgxMDAwMDAwMDsKCgl1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NsZWFyX2ZsYWc9MDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfaW5pdF9vZmZzZXQ9MDsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrPTA7CgoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF91Ym9vdF9sb29wPTA7CgoJdW5zaWduZWQgaW50ICBrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3M9NjA7Cgl1bnNpZ25lZCBpbnQgIHRlc3Rfd2F0Y2hkb2dfdGltZV9zPTE1OwoKCS8vdWludDMyX3QgICBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfZW5hYmxlPTA7Cgl1aW50MzJfdCAgIHN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV9pbmRleD0wOwoJdWludDMyX3QgICBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWU9MDsKCgljaGFyIHN0clsxMDI0XT0iIjsKCgllcnJvcl9vdXRvZl9jb3VudF9mbGFnID0xOyAgLy9mb3IgcXVpY2sgb3V0IG9mIGVycm9yCglpZiAoYXJnYyA+MSkgewoJCWRhdGFfc291cmNlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRhdGFfc291cmNlPSBERFJfUEFSQU1FVEVSX1NPVVJDRV9GUk9NX1VCT09UX0VOVjsKCQl9Cgl9CglpZiAoYXJnYyA+MikgewoJCXdhdGNoZG9nX3RpbWVfcyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQl3YXRjaGRvZ190aW1lX3M9IDE1OwoJCX0KCX0KCXByaW50Zigid2F0Y2hkb2dfdGltZV9zPT0lZFxuIix3YXRjaGRvZ190aW1lX3MpOwoJdGVzdF93YXRjaGRvZ190aW1lX3M9d2F0Y2hkb2dfdGltZV9zOwoJLy90ZXN0X3dhdGNoZG9nX3RpbWVfcz1hZGRyZXNzX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zOwoJaWYgKGFyZ2MgPjMpIHsKCQlrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3MgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJa2VybmVsX3Rlc3Rfd2F0Y2hkb2dfdGltZV9zPSB3YXRjaGRvZ190aW1lX3M7CgkJfQoJfQoJcHJpbnRmKCJrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3M9PSVkXG4iLGtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkvL2xhbmVfZGlzYWJsZT1nX2Rkcl90ZXN0X3N0cnVjdC0+ZGRyX3Rlc3RfbGFuZV9kaXNhYmxlOwoJaWYgKGFyZ2MgPjQpIHsKCQlsYW5lX2Rpc2FibGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNF0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJbGFuZV9kaXNhYmxlPSAwOwoJCX0KCX0KCXByaW50ZigibGFuZV9kaXNhYmxlPT0weCUwOHhcbiIsbGFuZV9kaXNhYmxlKTsgICAKCglpZiAoYXJnYyA+NSkgewoJCWRkcl9kYXRhX3Rlc3Rfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndls1XSwgJmVuZHAsIDApOwoJCWlmICgqYXJndls1XSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlkZHJfZGF0YV90ZXN0X3NpemU9IDB4MTAwMDAwOwoJCX0KCX0KCXByaW50ZigiZGRyX2RhdGFfdGVzdF9zaXplPT0weCUwOHhcbiIsZGRyX2RhdGFfdGVzdF9zaXplKTsKCWlmIChhcmdjID42KSB7CgkJZGRyX2FkZF90ZXN0X3NpemUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbNl0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbNl0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX2FkZF90ZXN0X3NpemU9IDB4MTAwMDAwMDA7CgkJfQoJfQoJcHJpbnRmKCJkZHJfYWRkX3Rlc3Rfc2l6ZT09MHglMDh4XG4iLGRkcl9hZGRfdGVzdF9zaXplKTsKCglpZiAoYXJnYyA+NykgewoJCWRkcl90ZXN0X2NsZWFyX2ZsYWcgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbN10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbN10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfY2xlYXJfZmxhZz0gMHgxMDAwMDAwMDsKCQl9Cgl9CglwcmludGYoImRkcl90ZXN0X2NsZWFyX2ZsYWc9PTB4JTA4eFxuIixkZHJfdGVzdF9jbGVhcl9mbGFnKTsKCglpZiAoYXJnYyA+OCkgewoJCWRkcl90ZXN0X2luaXRfb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzhdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzhdID09IDAgfHwgKmVuZHAgIT0gMCkKCQl7CgkJCWRkcl90ZXN0X2luaXRfb2Zmc2V0PSAwOwoJCX0KCX0KCXByaW50ZigiZGRyX3Rlc3RfaW5pdF9vZmZzZXQ9PTB4JTA4eFxuIixkZHJfdGVzdF9pbml0X29mZnNldCk7CgoJaWYgKGFyZ2MgPjkpIHsKCQlkZHJfdGVzdF91Ym9vdF9rZXJuZWxfZW5hYmxlX21hc2sgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbOV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbOV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrPSAwOwoJCX0KCX0KCXByaW50ZigiZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrPT0weCUwOHhcbiIsZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrKTsKCglpZiAoYXJnYyA+MTApIHsKCQlkZHJfdGVzdF91Ym9vdF9sb29wID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzEwXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxMF0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCXsKCQkJZGRyX3Rlc3RfdWJvb3RfbG9vcD0gMDsKCQl9Cgl9CglwcmludGYoImRkcl90ZXN0X3Vib290X2xvb3A9PTB4JTA4eFxuIixkZHJfdGVzdF91Ym9vdF9sb29wKTsKCglpZiAoYXJnYyA+MTEpIHsKCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXggPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMTFdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzExXSA9PSAwIHx8ICplbmRwICE9IDApCgkJewoJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXg9IDA7CgkJfQoJfQoJcHJpbnRmKCJzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXg9PTB4JTA4eFxuIixzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXgpOwoKCgl1bnNpZ25lZCBpbnQgcmFua19pbmRleD0wOwoJdW5zaWduZWQgaW50IHRlbXBfY291bnQ9MDsKCXVuc2lnbmVkIGludCBkZHJfdGVzdF9kYXRhX2FycmF5X21heD0xMDsKCXVuc2lnbmVkIGludCBudW1fYXJyYXlbMTBdOy8vOCBmbGFnIDMyX2RhdGEgYWRkXzggIDMyX2RhdGEgYWRkXzgKCgl1bnNpZ25lZCBpbnQgdGVtcF90ZXN0X2Vycm9yPTA7CgkvL3Vuc2lnbmVkIGludCBsY2Rscl9taW49MDsKCS8vdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJbWVtc2V0KG51bV9hcnJheSwgMCwgc2l6ZW9mKG51bV9hcnJheSkpOwoJLy9jaGFyIHN0clsxMDI0XT0iIjsKCgoJZGRyX3Rlc3RfZGF0YV9hcnJheV9tYXg9ODsKCglmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IGRkcl90ZXN0X2RhdGFfYXJyYXlfbWF4OyB0ZW1wX2NvdW50KyspIAoJewoJCW51bV9hcnJheVt0ZW1wX2NvdW50XT0gcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfUkVBRCApOwoJCXByaW50ZigicmVhZCBudW1hcnJ5WyVkXT09JWRcbiIsdGVtcF9jb3VudCxudW1fYXJyYXlbdGVtcF9jb3VudF0pOwoJfQoKCXVuc2lnbmVkIGludCByZWdfZGVmX3ZhbHVlX2RhdGFbNF07IC8vd3JpdGVfbGNkbHJfdmFsdWUrcmVhZF9sY2Rscl92YWx1ZTw8MTY7CgoJLy8jZGVmaW5lICBERFJfVEVTVF9TVEFUVVNfU1RFUF9GTEFHX0FERF9PUkdfU1RJQ0tZX09GRlNFVCAgIDQgIC8vIFBSRUdfU1RJQ0tZX1JFRzQKCS8vI2RlZmluZSAgRERSX1RFU1RfU1RBVFVTX1BBU1NfRkFJTF9BRERfT1JHX1NUSUNLWV9PRkZTRVQgICAgNSAgLy80NS8vIFBSRUdfU1RJQ0tZX1JFRzQKCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQgPTA7ICAvL3VzZSBmb3Iga2VybmVsCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldCA9MDsgLy91c2UgZm9yIGtlcm5lbAoKCXVuc2lnbmVkIGludCB0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzID0wOyAvL3Vib290IHRlc3Qgd2Ugc2hvdWxkIHJlYWQgZXJyb3IgdGhlbiBkb25lIHN0YXR1cy4gIDAgbm8gdGVzdCAxIG9uZ29pbmcgMiB0aGlzIHN0ZXAgZG9uZSAgZmFpbCBvciBwYXNzCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQgPTA7IC8vbGVmdF9sY2RscityaWdodF9sY2Rscjw8MTYgCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCA9MDsgLy9sZWZ0X2xjZGxyCgl1bnNpZ25lZCBpbnQgdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0wOyAvL3JpZ2h0X2xjZGxyCgl1bnNpZ25lZCBpbnQgIGRlbGF5X3N0ZXBfeDEwMD0gMDsKCgkvL3Vuc2lnbmVkIGludCB0ZXN0X2FyZ182X2xjZGxyX3RlbXBfY291bnQgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMSA9MDsKCS8vdW5zaWduZWQgaW50IHRlc3RfbGNkbHJfdGVtcF92YWx1ZTIgPTA7Cgl1bnNpZ25lZCBpbnQgdGVzdF9sY2Rscl90ZW1wX3ZhbHVlID0wOwoJdW5zaWduZWQgaW50IHRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnID0wOwoKCgl0ZXN0X2xjZGxyX3JlYWNoX2xjZGxyX2xpbWl0ZWRfZmxhZz0wOwoJcmVnX2RlZl92YWx1ZV9kYXRhWzBdPW51bV9hcnJheVswXTsKCXJlZ19kZWZfdmFsdWVfZGF0YVsxXT1udW1fYXJyYXlbMV07CglyZWdfZGVmX3ZhbHVlX2RhdGFbMl09bnVtX2FycmF5WzJdOwoJcmVnX2RlZl92YWx1ZV9kYXRhWzNdPW51bV9hcnJheVszXTsKCXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PW51bV9hcnJheVs0XTsKCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9bnVtX2FycmF5WzVdOwoJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz1udW1fYXJyYXlbNl07Cgl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD1udW1fYXJyYXlbN107CgoKCglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVswXT09MHglMDh4XG4iLG51bV9hcnJheVswXSk7CglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsxXT09MHglMDh4XG4iLG51bV9hcnJheVsxXSk7CglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsyXT09MHglMDh4XG4iLG51bV9hcnJheVsyXSk7CglwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVszXT09MHglMDh4XG4iLG51bV9hcnJheVszXSk7CglwcmludGYoInRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PSVkXG4iLG51bV9hcnJheVs0XSk7CglwcmludGYoInRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWRcbiIsbnVtX2FycmF5WzVdKTsKCXByaW50ZigidGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0lZFxuIixudW1fYXJyYXlbNl0pOwoJcHJpbnRmKCJcbnRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PTB4JTA4eFxuIixudW1fYXJyYXlbN10pOwoKCgoKCS8vZm9yICh0ZW1wX2NvdW50PSAwO3RlbXBfY291bnQgPCA4OyB0ZW1wX2NvdW50KyspIAoJLy8JewoJLy8JIHJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCS8vIAkgdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJLy99CgoKCWlmKGRkcl90ZXN0X2NsZWFyX2ZsYWcpCgl7ICAgICAgICAgICAgdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0wOwoJCW51bV9hcnJheVs2XQk9CXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMJCTsKCQl0ZW1wX2NvdW50PTY7CgkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCXByaW50ZigiXG4gY2xlYXIgc3RpY2t5IHJlZ2lzdGVyIHNob3VsZCByZXNldCx0aGVuIG92ZXIgd3JpdGUgLi4uLlxuIik7CgkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQl3aGlsZSgxKTsKCX0KCglpZih0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKQoJewoJCXsKCgkJCS8vdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0xOwoKCgkJCS8vZm9yICh0ZW1wX2NvdW50ID0gMDsgdGVtcF9jb3VudCA8ICg4KTsgdGVtcF9jb3VudCsrKSAgIC8vZGF0YQoKCQkJewoJCQkJdGVtcF9jb3VudD1zdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXg7CgkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxPWRvX2Rkcl9nMTJfcmVhZF93cml0ZV9kZHJfYWRkX3dpbmRvd19sY2RsciggcmFua19pbmRleCx0ZW1wX2NvdW50LHRlc3RfbGNkbHJfdGVtcF92YWx1ZTEsRERSX1BBUkFNRVRFUl9SRUFEKTsKCQkJCS8vcmVnX2RlZl92YWx1ZV9kYXRhWzNdPXRlc3RfbGNkbHJfdGVtcF92YWx1ZTE7CgkJCQlyZWdfZGVmX3ZhbHVlX2RhdGFbM109dGVzdF9sY2Rscl90ZW1wX3ZhbHVlMTsKCQkJCW51bV9hcnJheVszXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVszXQkJOwoJCQkJcHJpbnRmKCJudW1fYXJyYXlbJWRdPSUwOHhcbiIsMyxudW1fYXJyYXlbM10pOwoJCQl9CgoJCX0KCQl0ZXN0X2FyZ180X3N0ZXBfZmxhZ19hZGRfc3RpY2t5X29mZnNldD0wOwoJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9MDsKCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPTA7CgkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9MDsKCQlpZihkZHJfdGVzdF9pbml0X29mZnNldCkKCQl7dGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9ZGRyX3Rlc3RfaW5pdF9vZmZzZXQ7CgkJfQoJCS8vbnVtX2FycmF5WzBdCT0JcmVnX2RlZl92YWx1ZV9kYXRhWzBdCQk7CgkJLy9udW1fYXJyYXlbMV0JPQlyZWdfZGVmX3ZhbHVlX2RhdGFbMV0JCTsKCQkvL251bV9hcnJheVsyXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVsyXQkJOwoJCW51bV9hcnJheVszXQk9CXJlZ19kZWZfdmFsdWVfZGF0YVszXQkJOwoJCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7ICAvL3VzZSBmb3Iga2VybmVsCgkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOy8vdXNlIGZvciBrZXJuZWwKCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQJCTsKCgoKCQlmb3IgKHRlbXBfY291bnQ9IDA7dGVtcF9jb3VudCA8IDg7IHRlbXBfY291bnQrKykgCgkJewoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCX0KCgoJfQoJZWxzZQoJewoJCS8vZm9yICh0ZW1wX2NvdW50ID0gMDsgdGVtcF9jb3VudCA8ICg4KTsgdGVtcF9jb3VudCsrKSAgIC8vZGF0YQoJCXsKCQkJLy90ZW1wX2NvdW50PTQ7CgkJCS8vdGVzdF9sY2Rscl90ZW1wX3ZhbHVlMT1kb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsdGVtcF9jb3VudCx0ZXN0X2xjZGxyX3RlbXBfdmFsdWUxLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCS8vdGVtcF9jb3VudD10ZW1wX2NvdW50KzE7CgkJCS8vdGVtcF9jb3VudD01OwoJCQkvL3Rlc3RfbGNkbHJfdGVtcF92YWx1ZTI9ZG9fZGRyX2cxMl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LCh0ZW1wX2NvdW50KSx0ZXN0X2xjZGxyX3RlbXBfdmFsdWUyLEREUl9QQVJBTUVURVJfUkVBRCk7CgkJCS8vcmVnX2RlZl92YWx1ZV9kYXRhWzNdPXRlc3RfbGNkbHJfdGVtcF92YWx1ZTF8KHRlc3RfbGNkbHJfdGVtcF92YWx1ZTI8PDE2KTsKCQkJLy9udW1fYXJyYXlbM109cmVnX2RlZl92YWx1ZV9kYXRhWzNdOwoJCQlwcmludGYoInJlLW51bV9hcnJheVslZF09JTA4eFxuIiwzLG51bV9hcnJheVszXSk7CgkJfQoJfQoKCWlmKGRkcl90ZXN0X3Vib290X2tlcm5lbF9lbmFibGVfbWFzayYxKQoJe3ByaW50Zigic2tpcCB1Ym9vdCB0ZXN0IHNob3VsZCBpbml0IGtlcm5lbCBvZmZzZXQgIHZhbHVlPT0weCUwOHhcbiIsbnVtX2FycmF5WzddKTsKCX0KCgl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldCYweGZmZmYpOwoJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0oKHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0Pj4xNikmMHhmZmZmKTsKCXVuc2lnbmVkIGludCBsYW5lX3N0ZXBfY291bnQ9MDsKCXsKCgkJewoJCQl0ZXN0X3dhdGNoZG9nX3RpbWVfcz13YXRjaGRvZ190aW1lX3M7CgkJCWRkcl90ZXN0X3NpemU9ZGRyX2RhdGFfdGVzdF9zaXplOwoKCQl9CgoJCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzBdPT0weCUwOHhcbiIsbnVtX2FycmF5WzBdKTsKCQlwcmludGYoInJlZ19kZWZfdmFsdWVfZGF0YVsxXT09MHglMDh4XG4iLG51bV9hcnJheVsxXSk7CgkJcHJpbnRmKCJyZWdfZGVmX3ZhbHVlX2RhdGFbMl09PTB4JTA4eFxuIixudW1fYXJyYXlbMl0pOwoJCXByaW50ZigicmVnX2RlZl92YWx1ZV9kYXRhWzNdPT0weCUwOHhcbiIsbnVtX2FycmF5WzNdKTsKCQlwcmludGYoInRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PSVkXG4iLG51bV9hcnJheVs0XSk7CgkJcHJpbnRmKCJ0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PSVkXG4iLG51bV9hcnJheVs1XSk7CgkJcHJpbnRmKCJ0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPSVkXG4iLG51bV9hcnJheVs2XSk7CgkJcHJpbnRmKCJ0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0lZFxuIixudW1fYXJyYXlbN10pOwoKCQlpZih0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT00KSAvL3Vib290IGZpbmlzaAoJCXsKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoKCQkJLy8gdW5zaWduZWQgaW50ICAgYWNtZGxyPSAwOwoKCgkJCXsKCQkJCS8vYWNtZGxyPWRvX2Rkcl9yZWFkX2FjbWRscigpOwoJCQkJdW5zaWduZWQgaW50IGFjbWRscj0zMjsKCQkJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayozMik7IC8vMTAwKi8zMiBwcwoJCQkJcHJpbnRmKCJcbmFjbWRscj0weCUwOHgtLT5kZWMgJWQsZGRyIGNsaz09JWQsc3RlcD0lZCBwcywxMHN0ZXA9JWQgcHMsMTAwc3RlcD0lZCBwcyxcbiIsYWNtZGxyLGFjbWRscixnbG9iYWxfZGRyX2NsaywKCQkJCQkJZGVsYXlfc3RlcF94MTAwLzEwMCxkZWxheV9zdGVwX3gxMDAvMTAsZGVsYXlfc3RlcF94MTAwKTsKCgoJCQkJcHJpbnRmKCJcbmxjZF9vZmZzZXQ9MHglMDh4LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSU0ZCAgICx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSU0ZCAgICIsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKTsKCQkJCXByaW50ZigiXG5sY2Rfb2Zmc2V0PTB4JTA4eCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0lNGQgcHMsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0lNGQgcHMiLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wqZGVsYXlfc3RlcF94MTAwLzEwMCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKmRlbGF5X3N0ZXBfeDEwMC8xMDApOwoKCQkJCXByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOwoKCgkJCX0KCQkJaWYoZGRyX3Rlc3RfdWJvb3Rfa2VybmVsX2VuYWJsZV9tYXNrJjIpCgkJCXsKCQkJCWlmKGRkcl90ZXN0X3Vib290X2xvb3ApCgkJCQl7CgkJCQkJeyAgICAgICAgICAgIHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9MDsKCQkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCXByaW50ZigiXG4gY2xlYXIgc3RpY2t5IHJlZ2lzdGVyIHNob3VsZCByZXNldCx0aGVuIG92ZXIgd3JpdGUgLi4uLlxuIik7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoJCQkJfQoJCQkJZWxzZQoJCQkJCXJldHVybiAxOwoJCQl9CgkJfQoKCgoJCS8vaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTApKSAgIC8vMCB0ZXN0IGxlZnQgZWRnZSBiZWdpbiAgICAgMSB0ZXN0IGxlZnQgZWRnZSBvbmdvaW5nICAgICAyLy9sZWZ0X2ZpbmlzaCAgICAgMyByaWdodCBlZGdlIG9uZ29pbmcgICAgNCByaWdodCBmaW5pc2ggIC8vNSBrZXJuZWwgbGVmdCBlZGdlIG9uZ29pbmcgNiBrZXJuZWwgbGVmdCBmaW5pc2ggICAgNyBrZXJuZWwgcmlnaHQgb25nb2luZwoJCS8vICB1Ym9vdCBmaW5kIGZyb20gcGFzcyB0byBmYWlsIG9mZnNldCAwLT5tYXgKCQkvL2tlcm5lbCBmaW5kIGZyb20gZmFpbCB0byBwYXNzIG9mZnNldCBmcm9tIG1heCAtPjAgCgkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM8NCkpICAvLy8vICB1Ym9vdCBmaW5kIGZyb20gcGFzcyB0byBmYWlsIG9mZnNldCAwLT5tYXgKCQl7CgkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0wKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTIpCgkJCQkJfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT02KQoJCQkgICkKCQkJewoJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgkJCQludW1fYXJyYXlbNl0JPQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzCQk7CgkJCQl0ZW1wX2NvdW50PTY7CgkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJfQoKCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09Myl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQl7CgkJCQlpZih0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9QQVNTKSAvL3Bhc3MgMiBlcnJvciAxCgkJCQl7CgkJCQkJLy8JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJaWYoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCQkJewoKCQkJCQkJLy8gZm9yICgobGFuZV9zdGVwX2NvdW50PTApOyhsYW5lX3N0ZXBfY291bnQ8OCk7KGxhbmVfc3RlcF9jb3VudCsrKSkgICAKCQkJCQkJewoJCQkJCQkJbGFuZV9zdGVwX2NvdW50PTY7CgkJCQkJCQkvL2lmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCQl7CgoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQkvKgoJCQkJCQkJICAgaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJCSAgIHsKCQkJCQkJCSAgIGlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKTw9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCSAgIHsKCQkJCQkJCSAgIHRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnPXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnKzE7CgkJCQkJCQkgICB9CgkJCQkJCQkgICB9CgkJCQkJCQkgICAqLwoKCQkJCQkJfQoKCgoKCQkJCQl9CgkJCQkJaWYodGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcpCgkJCQkJewoJCQkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsJCQkKCQkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCX0KCgkJCQllbHNlIAlpZih0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9GQUlMKSAvL3Bhc3MgMSBlcnJvciAyCgkJCQl7CgoJCQkJCS8vICB0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sPSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldCYweGZmZmYpOwoJCQkJCS8vIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9KCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldD4+MTYpJjB4ZmZmZik7CgkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQl7CgkJCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbC0xOwoJCQkJCX0KCQkJCQllbHNlIAlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQkJCXsKCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yLTE7ICAKCQkJCQl9CgkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQ9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2x8KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I8PDE2KSk7CgkJCQkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQJCTsKCQkJCQl0ZW1wX2NvdW50PTc7CgkJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfTlVMTDsKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCgkJCQkJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CQkJCgkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCXRlbXBfY291bnQ9NjsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0KCQkJfQoKCgkJCS8vKHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9PUREUl9URVNUX05VTEwpCgkJCS8vICAgIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9KHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0JjB4ZmZmZik7CgkJCS8vIHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I9KCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldD4+MTYpJjB4ZmZmZik7CgkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MSkpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSkpCgkJCXsKCQkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCsxOwoJCQl9CgkJCWVsc2UgCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTcpKQoJCQl7CgkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IrMTsgIAoJCQl9CgkJCXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sfCh0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPDwxNikpOwoJCQludW1fYXJyYXlbN10JPQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTc7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCW51bV9hcnJheVs1XQk9CXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD01OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsgLy9zCgkJCXByaW50ZigiXG5lbmFibGUgJWRzIHdhdGNoZG9nIFxuIix0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7CgkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgoKCQkJewoKCQkJCS8vIGZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQl7CgkJCQkJbGFuZV9zdGVwX2NvdW50PTY7CgkJCQkJcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgICAgKG51bV9hcnJheVslZF0pID09JTA4eCBcbiIsbGFuZV9zdGVwX2NvdW50LzIsKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pKTsKCQkJCQlpZigoKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTEpKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCXsKCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpLXRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2w7CgkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJe3Rlc3RfbGNkbHJfdGVtcF92YWx1ZT0wOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTEpCgkJCQkJCXsKCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZiktdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbDsKCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X2wpCgkJCQkJCQl7dGVzdF9sY2Rscl90ZW1wX3ZhbHVlPTA7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCQkJewoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZikrdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjsKCQkJCQkJfQoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpK3Rlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I7CgoJCQkJCQl9CgkJCQkJfQoKCgkJCQkJewoJCQkJCQkvL3NwcmludGYoc3RyLCJkZHJfdHVuZV9kcXNfc3RlcCAgYSAwIDB4ODAwMDAgJWQiLCggbGFuZV9zdGVwKSk7CgkJCQkJCS8vcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCQkJCQlzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfdmFsdWU9dGVzdF9sY2Rscl90ZW1wX3ZhbHVlOwoJCQkJCQlzcHJpbnRmKHN0ciwiZzEyX2QycGxsICAlZCAgMHglMDh4IDB4JTA4eCIsZ2xvYmFsX2Rkcl9jbGssKCBzdGlja190ZXN0X2Rkcl93aW5kb3dfZGVsYXlfb3ZlcnJpZGVfaW5kZXgpLAoJCQkJCQkJCXN0aWNrX3Rlc3RfZGRyX3dpbmRvd19kZWxheV9vdmVycmlkZV92YWx1ZSk7CgkJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkJCQkvLyAgICAgICAgICBydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCQl3aGlsZSgxKTsKCgkJCQkJfQoJCQkJCS8vIAlkb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCS8vCSh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJfQoKCgoKCQkJfQoKCQkJLy9oZXJlIHdpbGwgZGVhZAoJCQlpZih0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPjQpCgkJCXsKCQkJCS8vZGRyX3Rlc3Rfd2F0Y2hkb2dfZGlzYWJsZSgpOyAvL3MKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZShrZXJuZWxfdGVzdF93YXRjaGRvZ190aW1lX3MpOyAvL3MKCQkJCS8vICB0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkvLyBudW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkvLyB0ZW1wX2NvdW50PTU7CgkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkvLyB0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicnVuIHN0b3JlYm9vdCIsMCk7CgkJCQl3aGlsZSgxKTsKCQkJfSBlbHNlCgkJCXsKCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJfQoKCQkJaWYgKHRlbXBfdGVzdF9lcnJvcikKCQkJewoJCQkJcnVuX2NvbW1hbmQoInJlc2V0IiwwKTsKCQkJCXdoaWxlKDEpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCgoKCQkJCXsKCQkJCQkvL3dyaXRlIG9yZyB2YWx1ZQoJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJewoJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0wKQoJCQkJCQl7CgkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZik7CgkJCQkJCX0KCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJewoJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKTsKCQkJCQkJfQoJCQkJCQlkb19kZHJfZzEyX3JlYWRfd3JpdGVfZGRyX2FkZF93aW5kb3dfbGNkbHIoIHJhbmtfaW5kZXgsbGFuZV9zdGVwX2NvdW50LAoJCQkJCQkJCSh0ZXN0X2xjZGxyX3RlbXBfdmFsdWUpLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCX0KCgoKCgkJCQl9CgoJCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9QQVNTOyAgLy9wYXNzIDIgZXJyb3IgMQoJCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJdGVtcF9jb3VudD01OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJd2hpbGUoMSk7CgoKCgoKCQkJfQoJCX0KCgoJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT00KXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTYpKQoJCXsKCQkJdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfU1RBVFVTX1VCT09UX0ZJTklTSDsKCQkJbnVtX2FycmF5WzRdCT0JdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQJCTsKCQkJdGVtcF9jb3VudD00OwoJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCQkJdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD1ERFJfVEVTVF9GQUlMOy8vRERSX1RFU1RfTlVMTDsKCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQl0ZW1wX2NvdW50PTU7CgkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCX0KCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz49NCkpICAgLy8vL2tlcm5lbCBmaW5kIGZyb20gZmFpbCB0byBwYXNzIG9mZnNldCBmcm9tIG1heCAtPjAgCgkJewoJCQlpZigodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MCl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0yKQoJCQkJCXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTQpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NikKCQkJICApCgkJCXsKCQkJCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwoJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJdGVtcF9jb3VudD02OwoJCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCX0KCgkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTMpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJewoJCQkJaWYodGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD09RERSX1RFU1RfUEFTUykgLy9wYXNzIDIgZXJyb3IgMQoJCQkJewoJCQkJCS8vCXRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9dGVzdF9hcmdfNl9zdGVwX3N0YXR1cysxOwoKCQkJCQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX05VTEw7CgkJCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJCXRlbXBfY291bnQ9NTsKCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoJCQkJCWlmKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKXx8KHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM9PTUpKQoJCQkJCXsKCgkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCXsKCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCQl7CgoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpPD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWc9dGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcrMTsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJewoJCQkJCQkJCWlmKCgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4xNikmMHhmZmZmKTw9dGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCkKCQkJCQkJCQl7CgkJCQkJCQkJCXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnPXRlc3RfbGNkbHJfcmVhY2hfbGNkbHJfbGltaXRlZF9mbGFnKzE7CgkJCQkJCQkJfQoJCQkJCQkJfQoKCQkJCQkJfQoKCgoKCQkJCQl9CgkJCQkJLy8gaWYodGVzdF9sY2Rscl9yZWFjaF9sY2Rscl9saW1pdGVkX2ZsYWcpCgkJCQkJewoJCQkJCQl0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPXRlc3RfYXJnXzZfc3RlcF9zdGF0dXMrMTsJCQkKCQkJCQkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCQkJCQl0ZW1wX2NvdW50PTY7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJCXdoaWxlKDEpOwoJCQkJCX0KCQkJCX0KCgkJCQllbHNlIAlpZigodGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD09RERSX1RFU1RfRkFJTCkgCgkJCQkJCS8vfHwodGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldD09RERSX1RFU1RfTlVMTCkpLy9wYXNzIDIgZXJyb3IgMQoJCQkJCSkKCQkJCQl7CgoJCQkJCQkvLyAgdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXQmMHhmZmZmKTsKCQkJCQkJLy8gdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj0oKHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0Pj4xNikmMHhmZmZmKTsKCQkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbD10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sLTE7CgkJCQkJCX0KCQkJCQkJZWxzZSAJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0zKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT03KSkKCQkJCQkJewoJCQkJCQkJdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcj10ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yLTE7ICAKCQkJCQkJfQoJCQkJCQl0ZXN0X2FyZ183X2xjZGxyX29mZnNldD0odGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbHwodGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjw8MTYpKTsKCQkJCQkJbnVtX2FycmF5WzddCT0JdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQJCTsKCQkJCQkJdGVtcF9jb3VudD03OwoJCQkJCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJCQkJdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoKCgoJCQkJCQkvLyB0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX05VTEw7CgkJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsKCQkJCQkJbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJCQl0ZW1wX2NvdW50PTU7CgkJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7CgoKCQkJCQl9CgkJCQllbHNlIGlmICh0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PT1ERFJfVEVTVF9OVUxMKS8vcGFzcyAyIGVycm9yIDEKCQkJCXtwcmludGYoIlxuZmluZCBkcm9wIHBvd2VyLHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9JWQgXG4iLHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQpOwoJCQkJfQoKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2VuYWJsZSh0ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJcHJpbnRmKCJcbmVuYWJsZSAlZHMgd2F0Y2hkb2cgXG4iLHRlc3Rfd2F0Y2hkb2dfdGltZV9zKTsKCQkJCWRkcl90ZXN0X3dhdGNoZG9nX2NsZWFyKCk7CgoJCQkJewoKCQkJCQlmb3IgKChsYW5lX3N0ZXBfY291bnQ9MCk7KGxhbmVfc3RlcF9jb3VudDw4KTsobGFuZV9zdGVwX2NvdW50KyspKSAgIAoJCQkJCXsKCQkJCQkJcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgICAgKG51bV9hcnJheVslZF0pID09JTA4eCBcbiIsbGFuZV9zdGVwX2NvdW50LzIsKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pKTsKCQkJCQkJaWYoKCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT0xKSl8fCh0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPT01KSkKCQkJCQkJewoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MCkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjApJjB4ZmZmZiktdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbDsKCQkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXt0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9MDsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZiktdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbDsKCQkJCQkJCQlpZigoKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MCkmMHhmZmZmKTx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9sKQoJCQkJCQkJCXt0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9MDsKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCWlmKCgodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09MykpfHwodGVzdF9hcmdfNl9zdGVwX3N0YXR1cz09NykpCgkJCQkJCXsKCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpK3Rlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3I7CgkJCQkJCQl9CgkJCQkJCQlpZigobGFuZV9zdGVwX2NvdW50JTIpPT0xKQoJCQkJCQkJewoJCQkJCQkJCXRlc3RfbGNkbHJfdGVtcF92YWx1ZT0oKChudW1fYXJyYXlbbGFuZV9zdGVwX2NvdW50LzJdKT4+MTYpJjB4ZmZmZikrdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfcjsKCgkJCQkJCQl9CgkJCQkJCX0KCgoKCQkJCQkJZG9fZGRyX2cxMl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkodGVzdF9sY2Rscl90ZW1wX3ZhbHVlKSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQl9CgoKCgoJCQkJfQoKCQkJCS8vaGVyZSB3aWxsIGRlYWQKCQkJCWlmKHRlc3RfYXJnXzZfc3RlcF9zdGF0dXM+NCkKCQkJCXsKCQkJCQkvL2Rkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfZW5hYmxlKGtlcm5lbF90ZXN0X3dhdGNoZG9nX3RpbWVfcyk7IC8vcwoJCQkJCS8vICB0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0PUREUl9URVNUX0ZBSUw7ICAvL3Bhc3MgMiBlcnJvciAxCgkJCQkJLy8gbnVtX2FycmF5WzVdCT0JdGVzdF9hcmdfNV9wYXNzX2ZhaWxfZmxhZ19hZGRfc3RpY2t5X29mZnNldAkJOwoJCQkJCS8vIHRlbXBfY291bnQ9NTsKCQkJCQkvLyByZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQkJLy8gdGVtcF9jb3VudCAsbnVtX2FycmF5W3RlbXBfY291bnRdLEREUl9QQVJBTUVURVJfV1JJVEUpOwoJCQkJCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCQkJCQl3aGlsZSgxKTsKCQkJCX0gZWxzZQoJCQkJewoJCQkJCXRlbXBfdGVzdF9lcnJvcj1kZHJfdGVzdF9zX2Nyb3NzX3RhbGtfcGF0dGVybihkZHJfdGVzdF9zaXplKTsKCQkJCX0KCgkJCQlpZiAodGVtcF90ZXN0X2Vycm9yKQoJCQkJewoJCQkJCXJ1bl9jb21tYW5kKCJyZXNldCIsMCk7CgkJCQkJd2hpbGUoMSk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJZGRyX3Rlc3Rfd2F0Y2hkb2dfY2xlYXIoKTsKCQkJCQl7CgkJCQkJCS8vd3JpdGUgb3JnIHZhbHVlCgkJCQkJCWZvciAoKGxhbmVfc3RlcF9jb3VudD0wKTsobGFuZV9zdGVwX2NvdW50PDgpOyhsYW5lX3N0ZXBfY291bnQrKykpICAgCgkJCQkJCXsKCQkJCQkJCWlmKChsYW5lX3N0ZXBfY291bnQlMik9PTApCgkJCQkJCQl7CgkJCQkJCQkJdGVzdF9sY2Rscl90ZW1wX3ZhbHVlPSgoKG51bV9hcnJheVtsYW5lX3N0ZXBfY291bnQvMl0pPj4wKSYweGZmZmYpOwoJCQkJCQkJfQoJCQkJCQkJaWYoKGxhbmVfc3RlcF9jb3VudCUyKT09MSkKCQkJCQkJCXsKCQkJCQkJCQl0ZXN0X2xjZGxyX3RlbXBfdmFsdWU9KCgobnVtX2FycmF5W2xhbmVfc3RlcF9jb3VudC8yXSk+PjE2KSYweGZmZmYpOwoJCQkJCQkJfQoJCQkJCQkJZG9fZGRyX2cxMl9yZWFkX3dyaXRlX2Rkcl9hZGRfd2luZG93X2xjZGxyKCByYW5rX2luZGV4LGxhbmVfc3RlcF9jb3VudCwKCQkJCQkJCQkJKHRlc3RfbGNkbHJfdGVtcF92YWx1ZSksRERSX1BBUkFNRVRFUl9XUklURSk7CgkJCQkJCX0JCQkJCQkJIAoKCQkJCQl9CgoJCQkJCXRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfUEFTUzsgIC8vcGFzcyAyIGVycm9yIDEKCQkJCQludW1fYXJyYXlbNV0JPQl0ZXN0X2FyZ181X3Bhc3NfZmFpbF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCQkJdGVtcF9jb3VudD01OwoJCQkJCXJlYWRfd3JpdGVfd2luZG93X3Rlc3RfcGFyYW1ldGVyKGRhdGFfc291cmNlLCAKCQkJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQkJCQlydW5fY29tbWFuZCgicmVzZXQiLDApOwoJCQkJCXdoaWxlKDEpOwoKCQkJCX0KCQkJfQoJCX0KCX0KCglpZih0ZXN0X2FyZ182X3N0ZXBfc3RhdHVzPj04KSAvL2ZpbmlzaAoJewoJCWRkcl90ZXN0X3dhdGNoZG9nX2Rpc2FibGUoKTsgLy9zCgkJcHJpbnRmKCJjbG9zZSAgd2F0Y2hkb2dcbiIpOwoKCgoJCXsKCQkJLy9hY21kbHI9ZG9fZGRyX3JlYWRfYWNtZGxyKCk7CgkJCXVfaW50MzJfdCBhY21kbHI9MzI7CgkJCWRlbGF5X3N0ZXBfeDEwMD0xMDAqMTAwMDAwMC8oMipnbG9iYWxfZGRyX2NsayphY21kbHIpOwoJCQlwcmludGYoIlxuYWNtZGxyPTB4JTA4eC0tPmRlYyAlZCxkZHIgY2xrPT0lZCxzdGVwPSVkIHBzLDEwc3RlcD0lZCBwcywxMDBzdGVwPSVkIHBzLFxuIixhY21kbHIsYWNtZGxyLGdsb2JhbF9kZHJfY2xrLAoJCQkJCWRlbGF5X3N0ZXBfeDEwMC8xMDAsZGVsYXlfc3RlcF94MTAwLzEwLGRlbGF5X3N0ZXBfeDEwMCk7CgoKCQkJcHJpbnRmKCJcbmxjZF9vZmZzZXQ9MHglMDh4LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSU0ZCAgICx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSU0ZCAgICIsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yKTsKCQkJcHJpbnRmKCJcbmxjZF9vZmZzZXQ9MHglMDh4LHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0PSU0ZCBwcyx0ZXN0X2FyZ183X2xjZGxyX29mZnNldF9yPSU0ZCBwcyIsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXQsdGVzdF9hcmdfN19sY2Rscl9vZmZzZXRfbCpkZWxheV9zdGVwX3gxMDAvMTAwLHRlc3RfYXJnXzdfbGNkbHJfb2Zmc2V0X3IqZGVsYXlfc3RlcF94MTAwLzEwMCk7CgkJCXByaW50ZigiXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOwoKCQkJdGVzdF9hcmdfNF9zdGVwX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfU1RBVFVTX0tFUk5FTF9GSU5JU0g7CgkJCW51bV9hcnJheVs0XQk9CXRlc3RfYXJnXzRfc3RlcF9mbGFnX2FkZF9zdGlja3lfb2Zmc2V0CQk7CgkJCXRlbXBfY291bnQ9NDsKCQkJcmVhZF93cml0ZV93aW5kb3dfdGVzdF9wYXJhbWV0ZXIoZGF0YV9zb3VyY2UsIAoJCQkJCXRlbXBfY291bnQgLG51bV9hcnJheVt0ZW1wX2NvdW50XSxERFJfUEFSQU1FVEVSX1dSSVRFKTsKCQl9Cgl9CgoJdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz0weGZmZmY7Cgl7CgkJLy8JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cz10ZXN0X2FyZ182X3N0ZXBfc3RhdHVzKzE7CgkJbnVtX2FycmF5WzZdCT0JdGVzdF9hcmdfNl9zdGVwX3N0YXR1cwkJOwoJCXRlbXBfY291bnQ9NjsKCQlyZWFkX3dyaXRlX3dpbmRvd190ZXN0X3BhcmFtZXRlcihkYXRhX3NvdXJjZSwgCgkJCQl0ZW1wX2NvdW50ICxudW1fYXJyYXlbdGVtcF9jb3VudF0sRERSX1BBUkFNRVRFUl9XUklURSk7Cgl9CglkZHJfdGVzdF93YXRjaGRvZ19kaXNhYmxlKCk7IC8vcwoJLy8gIHRlc3RfYXJnXzVfcGFzc19mYWlsX2ZsYWdfYWRkX3N0aWNreV9vZmZzZXQ9RERSX1RFU1RfRkFJTDsgIC8vcGFzcyAyIGVycm9yIDEKCXJ1bl9jb21tYW5kKCJydW4gc3RvcmVib290IiwwKTsKCXdoaWxlKDEpOwoJcmV0dXJuIDE7Cn0KI2VuZGlmIAojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQoKaW50IGRvX2Rkcl9nMTJfb3ZlcnJpZGVfZGF0YShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCgkvL2Rkcl90ZXN0X2NtZCAweDI1IDEgMSAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAgMTAKCglwcmludGYoIlwxMm5tIHBoeSByZWFkIHdyaXRlIHJlZ2lzdGVyIHNob3VsZCBjbG9zZCBhcGQgYW5kIGFzciBmdW5jaXRvblxuIik7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjMwKTsKCXdyaXRlbCgoMCksIDB4ZmY2Mzg2MzQpOwojZGVmaW5lICBHMTJfREFUQV9SRUFEX09GRlNFVF9NQVggICAoMFgzRikKI2RlZmluZSAgRzEyX0RBVEFfV1JJVEVfT0ZGU0VUX01BWCAgICgwWDNGKzcqMzIpCgojaWYgMQoJLy8gICBpZighYXJnYykKCS8vICAgIGdvdG8gRERSX1RVTkVfRFFTX1NUQVJUOwoJaW50IGk9MDsKCXByaW50ZigiXG5hcmdjPT0gMHglMDh4XG4iLCBhcmdjKTsKCWZvciAoaSA9IDA7aTxhcmdjO2krKykKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCWNoYXIgKmVuZHA7CgkvL3JhbmtfaW5kZXggIGRxX2luZGV4ICB3cml0ZV9yZWFkIGxlZnQvcmlnaHQgIG9mZnNldF92YWx1ZQoJdW5zaWduZWQgaW50IHRlc3RfaW5kZXg9MDsgLy8gMSBhYyAsMHgyLCB3cml0ZSBkcXMgLDB4NCxyZWFkIGRxcywweDgsd3JpdGUgZHEsMHgxMCByZWFkIGRxCgl1bnNpZ25lZCBpbnQgZHFfaW5kZXg9MDsgIC8vMC04IHJhbmswIGxhbmUwICxyYW5rMCA5LTE3IGxhbmUxLHJhbmswIDE4LTI2IGxhbmUyLCByYW5rMCAyNy0zNSBsYW5lMywgIDM2KzAtOCByYW5rMSBsYW5lMCAscmFuazEgIDM2KzktMTcgbGFuZTEscmFuazEgIDM2KzE4LTI2IGxhbmUyLCByYW5rMSAgMzYrMjctMzUgbGFuZTMKCS8vCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMT0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy8JdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18yPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4CgkvLwl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzM9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCS8vdW5zaWduZWQgaW50IHdyaXRlX3JlYWRfZmxhZz0wOy8vIDIgd3JpdGUgLDEgcmVhZCAjZGVmaW5lIAlERFJfUEFSQU1FVEVSX1JFQUQJMSAgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfV1JJVEUJCTIKCS8vICAgIHVuc2lnbmVkIGludCBsZWZ0X3JpZ2h0X2ZsYWc9MDsvLyAgMSBsZWZ0ICwyIHJpZ2h0ICAgI2RlZmluZSAgRERSX1BBUkFNRVRFUl9MRUZUCQkxICAgICAjZGVmaW5lIAlERFJfUEFSQU1FVEVSX1JJR0hUCQkyCgl1bnNpZ25lZCBpbnQgb3ZycmlkZV92YWx1ZT0wOy8vCgoJLy8gICB1bnNpZ25lZCBpbnQgb2Zmc2V0X2VuYWJsZT0wOy8vCgoJLy8JIHVuc2lnbmVkIGludCB0ZW1wX3ZhbHVlPTA7Ly8KCXVuc2lnbmVkIGludCBjb3VudD0wOwoJLy8JdW5zaWduZWQgaW50IGNvdW50MT0wOwoJLy8JdW5zaWduZWQgaW50IGNvdW50X21heD0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJLy8JdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vCXVuc2lnbmVkIGludCByZWdfdmFsdWU9MDsKCglpZiAoYXJnYyA9PSAxKQoJeyAgcHJpbnRmKCJcbnBsZWFzZSByZWFkIGhlbHBcbiIpOwoKCX0KCWVsc2UgaWYgIChhcmdjID40KQoJey8vb2Zmc2V0X2VuYWJsZT0xOwoKCQl7CgkJCWNvdW50PTA7CgkJCXRlc3RfaW5kZXg9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndltjb3VudCsxXSwgJmVuZHAsIDApOwoJCQlpZiAoKmFyZ3ZbY291bnQrMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQl7CgkJCQl0ZXN0X2luZGV4ID0gMDsKCQkJfQoKCQl9CgkJewoJCQljb3VudCsrOwoJCQlkcV9pbmRleD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCWRxX2luZGV4ID0gMDsKCQkJfQoKCQl9CgoKCgkJewoJCQljb3VudCsrOwoJCQlvdnJyaWRlX3ZhbHVlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJb3ZycmlkZV92YWx1ZSA9IDA7CgkJCX0KCgkJfQoKCgl9CgllbHNlIHsgCgkJcmV0dXJuIDE7Cgl9CglwcmludGYoImxjZGxyX21heCAlZCxcbiIsbGNkbHJfbWF4KTsKCgl7CgoKCQl7CgoJCQl7CgkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGUodGVzdF9pbmRleCwKCQkJCQkJZHFfaW5kZXgsCgkJCQkJCW92cnJpZGVfdmFsdWUpOwoJCQl9CgoJCX0KCX0KCgojZW5kaWYKCXJldHVybiAxOwp9ClVfQk9PVF9DTUQoCglkZHJfZzEyX292ZXJyaWRlX2RhdGEsCTIwLAkxLAlkb19kZHJfZzEyX292ZXJyaWRlX2RhdGEsCgkiZGRyX2cxMl9vdmVycmlkZV9kYXRhICAxIDAgIDAgMCAgMSAzIiwKCSJkZHJfZzEyX292ZXJyaWRlX2RhdGEgIHRlc3RfaW5kZXggIGRxX2luZGV4IG92cnJpZGVfdmFsdWUgICBcbiIKKTsKaW50IGRvX2Rkcl9nMTJfb2Zmc2V0X2RhdGEoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQp7CgoJLy9kZHJfdGVzdF9jbWQgMHgyNSAxIDEgIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwIDEwCgoKI2RlZmluZSAgRzEyX0RBVEFfUkVBRF9PRkZTRVRfTUFYICAgKDBYM0YpCiNkZWZpbmUgIEcxMl9EQVRBX1dSSVRFX09GRlNFVF9NQVggICAoMFgzRis3KjMyKQoJcHJpbnRmKCJcMTJubSBwaHkgcmVhZCB3cml0ZSByZWdpc3RlciBzaG91bGQgY2xvc2QgYXBkIGFuZCBhc3IgZnVuY2l0b25cbiIpOwoJd3JpdGVsKCgwKSwgMHhmZjYzODYzMCk7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjM0KTsKI2lmIDEKCS8vICAgaWYoIWFyZ2MpCgkvLyAgICBnb3RvIEREUl9UVU5FX0RRU19TVEFSVDsKCWludCBpPTA7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgl7CgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7Cgl9CgljaGFyICplbmRwOwoJLy9yYW5rX2luZGV4ICBkcV9pbmRleCAgd3JpdGVfcmVhZCBsZWZ0L3JpZ2h0ICBvZmZzZXRfdmFsdWUKCXVuc2lnbmVkIGludCB0ZXN0X2luZGV4PTA7IC8vIDEgYWMgLDB4Miwgd3JpdGUgZHFzICwweDQscmVhZCBkcXMsMHg4LHdyaXRlIGRxLDB4MTAgcmVhZCBkcQoJLy8gIHVuc2lnbmVkIGludCBkcV9pbmRleD0wOyAgLy8wLTggcmFuazAgbGFuZTAgLHJhbmswIDktMTcgbGFuZTEscmFuazAgMTgtMjYgbGFuZTIsIHJhbmswIDI3LTM1IGxhbmUzLCAgMzYrMC04IHJhbmsxIGxhbmUwICxyYW5rMSAgMzYrOS0xNyBsYW5lMSxyYW5rMSAgMzYrMTgtMjYgbGFuZTIsIHJhbmsxICAzNisyNy0zNSBsYW5lMwoJdW5zaWduZWQgaW50IHRlc3RfZHFfbWFza18xPTA7IC8vZWFjaCBiaXQgbWFzayBjb3JyZXNzcG9uZCB3aXRoIGRxX2luZGV4Cgl1bnNpZ25lZCBpbnQgdGVzdF9kcV9tYXNrXzI9MDsgLy9lYWNoIGJpdCBtYXNrIGNvcnJlc3Nwb25kIHdpdGggZHFfaW5kZXgKCXVuc2lnbmVkIGludCB0ZXN0X2RxX21hc2tfMz0wOyAvL2VhY2ggYml0IG1hc2sgY29ycmVzc3BvbmQgd2l0aCBkcV9pbmRleAoJLy91bnNpZ25lZCBpbnQgd3JpdGVfcmVhZF9mbGFnPTA7Ly8gMiB3cml0ZSAsMSByZWFkICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUkVBRAkxICAgICAgI2RlZmluZSAJRERSX1BBUkFNRVRFUl9XUklURQkJMgoJdW5zaWduZWQgaW50IGxlZnRfcmlnaHRfZmxhZz0wOy8vICAxIGxlZnQgLDIgcmlnaHQgICAjZGVmaW5lICBERFJfUEFSQU1FVEVSX0xFRlQJCTEgICAgICNkZWZpbmUgCUREUl9QQVJBTUVURVJfUklHSFQJCTIKCXVuc2lnbmVkIGludCBvZmZzZXRfdmFsdWU9MDsvLwoKCS8vICAgdW5zaWduZWQgaW50IG9mZnNldF9lbmFibGU9MDsvLwoKCS8vCSB1bnNpZ25lZCBpbnQgdGVtcF92YWx1ZT0wOy8vCgl1bnNpZ25lZCBpbnQgY291bnQ9MDsKCS8vdW5zaWduZWQgaW50IGNvdW50MT0wOwoJdW5zaWduZWQgaW50IGNvdW50X21heD0wOwoJdW5zaWduZWQgaW50IGxjZGxyX21heD0wOwoJLy8JdW5zaWduZWQgaW50IHJlZ19hZGQ9MDsKCS8vCXVuc2lnbmVkIGludCByZWdfdmFsdWU9MDsKCgoJYmRscl8xMDBzdGVwPWdldF9iZGxyXzEwMHN0ZXAoZ2xvYmFsX2Rkcl9jbGspOwoJdWlfMV8zMl8xMDBzdGVwPSgxMDAwMDAwKjEwMC8oZ2xvYmFsX2Rkcl9jbGsqMiozMikpOwoKCWlmIChhcmdjID09IDEpCgl7ICBwcmludGYoIlxucGxlYXNlIHJlYWQgaGVscFxuIik7CgoJfQoJZWxzZSBpZiAgKGFyZ2MgPjYpCgl7Ly9vZmZzZXRfZW5hYmxlPTE7CgoJCXsKCQkJY291bnQ9MDsKCQkJdGVzdF9pbmRleD0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCXRlc3RfaW5kZXggPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18xPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzEgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18yPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzIgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCXRlc3RfZHFfbWFza18zPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJdGVzdF9kcV9tYXNrXzMgPSAwOwoJCQl9CgoJCX0KCQl7CgkJCWNvdW50Kys7CgkJCWxlZnRfcmlnaHRfZmxhZz0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2W2NvdW50KzFdLCAmZW5kcCwgMCk7CgkJCWlmICgqYXJndltjb3VudCsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCXsKCQkJCWxlZnRfcmlnaHRfZmxhZyA9IDA7CgkJCX0KCgkJfQoJCXsKCQkJY291bnQrKzsKCQkJb2Zmc2V0X3ZhbHVlPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbY291bnQrMV0sICZlbmRwLCAwKTsKCQkJaWYgKCphcmd2W2NvdW50KzFdID09IDAgfHwgKmVuZHAgIT0gMCkKCQkJewoJCQkJb2Zmc2V0X3ZhbHVlID0gMDsKCQkJfQoKCQl9CgoKCX0KCWVsc2UgeyAKCQlyZXR1cm4gMTsKCX0KCXByaW50ZigibGNkbHJfbWF4ICVkLFxuIixsY2Rscl9tYXgpOwoJaWYobGVmdF9yaWdodF9mbGFnPT1ERFJfUEFSQU1FVEVSX1JJR0hUKQoJCXByaW50Zigib2Zmc2V0IHJpZ2h0ICsrICBsZWZ0X3JpZ2h0X2ZsYWcgJWQsXG4iLGxlZnRfcmlnaHRfZmxhZyk7CglpZihsZWZ0X3JpZ2h0X2ZsYWc9PUREUl9QQVJBTUVURVJfTEVGVCkKCQlwcmludGYoIm9mZnNldCBsZWZ0IC0tbGVmdF9yaWdodF9mbGFnICVkLFxuIixsZWZ0X3JpZ2h0X2ZsYWcpOwoKCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9BVFhETFkpIHsKCQljb3VudF9tYXg9MTA7CgoJCWxjZGxyX21heD0zKjMyOy8vMHgzZmY7Cgl9CgoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFTRExZKSB7CgkJY291bnRfbWF4PTE2OwoKCQlsY2Rscl9tYXg9MTYqMzI7Ly8weDNmZjsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9SWENMS0RMWSkgewoJCWNvdW50X21heD0xNjsKCQlsY2Rscl9tYXg9OTY7Ly8weDNmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1RYRFFETFkpIHsKCQljb3VudF9tYXg9MzYqMjsKCQlsY2Rscl9tYXg9OCozMjsvLzB4MWZmOwoJfQoJaWYgKHRlc3RfaW5kZXggPT0gRE1DX1RFU1RfV0lORE9XX0lOREVYX1JYUEJETFkpIHsKCQljb3VudF9tYXg9MzYqMjsKCQlsY2Rscl9tYXg9MHgzZjsKCX0KCWlmICh0ZXN0X2luZGV4ID09IERNQ19URVNUX1dJTkRPV19JTkRFWF9TT0NfVlJFRikgewoJCWNvdW50X21heD0zNioxOwoJCWxjZGxyX21heD0weDNmOwoJCXByaW50ZigiIHNvYyB2cmVmIHJhbmswIGFuZCByYW5rMSBzaGFyZSB2cmVmIGRhY1xuIik7Cgl9CgoKCgljb3VudD0wOwoJZm9yICg7Y291bnQ8Y291bnRfbWF4O2NvdW50KyspIHsKCQlpZiAoKGNvdW50PDMyKSkgewoJCQlpZiAodGVzdF9kcV9tYXNrXzEmKDE8PChjb3VudCUzMikpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCX0KCQlpZiAoKGNvdW50PjMxKSAmJiAoY291bnQ8NjMpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMiYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoJCWlmICgoY291bnQ+NjMpKSB7CgkJCWlmICh0ZXN0X2RxX21hc2tfMyYoMTw8KGNvdW50JTMyKSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvLwlmb3IgKGNvdW50MT0wO2NvdW50MTxvZmZzZXRfdmFsdWU7Y291bnQxKyspIAoJCXsKCQkJaWYobGVmdF9yaWdodF9mbGFnPT1ERFJfUEFSQU1FVEVSX1JJR0hUKQoJCQl7CgkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhcyh0ZXN0X2luZGV4LAoJCQkJCQljb3VudCwKCQkJCQkJMCxvZmZzZXRfdmFsdWUpOwoJCQl9CgkJCWlmKGxlZnRfcmlnaHRfZmxhZz09RERSX1BBUkFNRVRFUl9MRUZUKQoJCQl7CgkJCQlkd2Nfd2luZG93X3JlZ19hZnRlcl90cmFpbmluZ191cGRhdGVfaW5jcmVhcyh0ZXN0X2luZGV4LAoJCQkJCQljb3VudCwKCQkJCQkJMSxvZmZzZXRfdmFsdWUpOwoJCQl9CgkJfQoJfQoKCiNlbmRpZgoJcmV0dXJuIDE7Cn0KCgpVX0JPT1RfQ01EKAoJZGRyX2cxMl9vZmZzZXRfZGF0YSwJMjAsCTEsCWRvX2Rkcl9nMTJfb2Zmc2V0X2RhdGEsCgkiZGRyX2cxMl9vZmZzZXRfZGF0YSAgMSAwICAwIDAgIDEgMyIsCgkiZGRyX2cxMl9vZmZzZXRfZGF0YSAgdGVzdF9pbmRleCAgbWFzazEgbWFzazIgbWFzazMgIGxlZnQvcmlnaHQgIG9mZnNldF92YWx1ZSBcbiIKKTsKCiNlbmRpZgoKCiNpZiAwIApVX0JPT1RfQ01EKAoJZGRyX2cxMl9vZmZzZXRfZGF0YV9sY2RsciwJMTAsCTEsCWRvX2Rkcl9nMTJfb2Zmc2V0X2RhdGFfbGNkbHIsCgkiZGRyX2cxMl9vZmZzZXRfZGF0YV9sY2RsciAgMCAxICAyICAyICAzIiwKCSJkZHJfZzEyX29mZnNldF9kYXRhX2xjZGxyICByYW5rX2luZGV4ICBkcV9pbmRleCAgd3JpdGVfcmVhZCBsZWZ0L3JpZ2h0ICBvZmZzZXRfdmFsdWUgXG4iCik7CiNlbmRpZgoKY2hhciBDTURfVkVSW10gPSAiVmVyXzEwIjsKaW50IGRvX2Rkcl90ZXN0X2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCS8vZGRyX3Rlc3Rfd2F0Y2hkb2dfaW5pdCg0MDAwKTsKCS8vcHJpbnRmKCJcbm9wZW4gd2F0Y2hkb2cgJWRtc1xuIiw0MDAwKTsKCXByaW50ZigiXG4gZGRyIHRlc3QgY21kIHZlcnNpb249PSAlc1xuIiwgQ01EX1ZFUik7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCgkJcHJpbnRmKCJcbmFyZ3ZbJWRdPSVzXG4iLGksYXJndltpXSk7CgoJLyogbmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzICovCglpZiAoYXJnYyA8IDIpCgkJZ290byB1c2FnZTsKCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJoIikgPT0gMCkpCgkJZ290byB1c2FnZTsKCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCglwcmludGYoIlwxMm5tIHBoeSByZWFkIHdyaXRlIHJlZ2lzdGVyIHNob3VsZCBjbG9zZCBhcGQgYW5kIGFzciBmdW5jaXRvblxuIik7Cgl3cml0ZWwoKDApLCAweGZmNjM4NjMwKTsKCXdyaXRlbCgoMCksIDB4ZmY2Mzg2MzQpOwojZWxzZQoJT1BFTl9DSEFOTkVMX0FfUEhZX0NMSygpOwoJT1BFTl9DSEFOTkVMX0JfUEhZX0NMSygpOwoKCXVuc2lnbmVkIGludCBkZHJfcGxsID0gcmRfcmVnKEFNX0REUl9QTExfQ05UTDApOwoJdW5zaWduZWQgaW50IGRkcl9jbGsgPTA7CgkvLyNpZiggQ09ORklHX0REUl9QSFkgICA+PVBfRERSX1BIWV9HMTIpCgkvL2Rkcl9jbGs9cGxsX2NvbnZlcnRfdG9fZGRyX2Nsa19nMTJhKGRkcl9wbGwpOwoJLy8jZWxzZQoJZGRyX2Nsaz1wbGxfY29udmVydF90b19kZHJfY2xrKGRkcl9wbGwpOwoJLy8jZW5kaWYKCS8vLzIqKCgoMjQgKiAoZGRyX3BsbCYweDFmZikpLygoZGRyX3BsbD4+OSkmMHgxZikpPj4oKGRkcl9wbGw+PjE2KSYweDMpKTsKCglwcmludGYoIlxuZGRyX2Nsaz09ICVkTUh6XG4iLCBkZHJfY2xrKTsKCWdsb2JhbF9kZHJfY2xrPWRkcl9jbGs7Cgl1bnNpZ25lZCBpbnQgenEwcHIgPSByZF9yZWcoRERSMF9QVUJfWlEwUFIpOwoJcHJpbnRmKCJcbmRkcl96cTBwcj09IDB4JTA4eFxuIiwgenEwcHIpOwoKI2VuZGlmCiNpZiAoIENPTkZJR19ERFJfUEhZID49IFBfRERSX1BIWV9HMTIpCgl1bnNpZ25lZCBpbnQgZGRyX3BsbCA9IHJkX3JlZyhHMTJfQU1fRERSX1BMTF9DTlRMMCk7Cgl1bnNpZ25lZCBpbnQgZGRyX2NsayA9MDsKCS8vI2lmKCBDT05GSUdfRERSX1BIWSAgID49UF9ERFJfUEhZX0cxMikKCS8vZGRyX2Nsaz1wbGxfY29udmVydF90b19kZHJfY2xrX2cxMmEoZGRyX3BsbCk7CgkvLyNlbHNlCglkZHJfY2xrPXBsbF9jb252ZXJ0X3RvX2Rkcl9jbGsoZGRyX3BsbCk7CgkvLyNlbmRpZgoJLy8vMiooKCgyNCAqIChkZHJfcGxsJjB4MWZmKSkvKChkZHJfcGxsPj45KSYweDFmKSk+PigoZGRyX3BsbD4+MTYpJjB4MykpOwoKCXByaW50ZigiXG5kZHJfY2xrPT0gJWRNSHpcbiIsIGRkcl9jbGspOwoJZ2xvYmFsX2Rkcl9jbGs9ZGRyX2NsazsKCS8vCXVuc2lnbmVkIGludCB6cTBwciA9IHJkX3JlZyhERFIwX1BVQl9aUTBQUik7CgkvLwlwcmludGYoIlxuZGRyX3pxMHByPT0gMHglMDh4XG4iLCB6cTBwcik7CiNlbmRpZgoKI2RlZmluZSAgRERSX1RFU1RfQ01EX19OT05FICAgMAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUICAgICAgICAgMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0FDTENETFIgICAgICAgIDIKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9NQVhfQ0xLICAgICAzICAgLy9kZHJfdGVzdF9jbWQgMyAweDgwMDAwMDAgMyAxCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RVTkVfWlEgICAgIDQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9WUkVGICAgIDUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfR1hUVkJCX0NST1NTVEFMSyAgICA2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0JBTkRXSURUSF9URVNUICAgNwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9MQ0RMUl9FTlZfVFVORSAgIDgKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfTU9ESUZZX1JFR19VU0VfTUFTSyAgIDkKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfRERSX1RVTkVfQUNfQ0xLICAgMHhhCgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRaUSAgIDB4MTAKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9EUVMgIDB4MTEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1RFU1RfU1RBUlRfQUREICAweDEyCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfQUNfQklUX1NFVFVQX0hPTERfTUFSR0lOICAweDEzCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfREFUQV9CSVRfU0VUVVBfSE9MRF9NQVJHSU4gIDB4MTQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9BQ19MQU5FX0JJVF9NQVJHSU4gIDB4MTUKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9FRV9WT0xUQUdFX01ETFJfU1RFUCAgMHgxNgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0QyUExMX0NNRCAgMHgxNwojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0RBVEFfTEFORV9CSVRfTUFSR0lOICAweDE4CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9UVU5FX1BIWV9WUkVGICAgMHgxOQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVFVORV9EUkFNX1ZSRUYgICAweDFBCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9UVU5FX0FDX1ZSRUYgICAweDFiCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9TV0VFUF9EUkFNX0NMS19VU0VfRDJQTEwgICAweDFjCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSNF9URVNUX1NISUZUX0REUl9GUkVRVUVOQ1kgIDB4MWQKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1RFU1RfREFUQV9XUlRJRV9SRUFEICAweDFlCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1RFU1RfUFdNX0NNRCAgICAgICAgICAgICAgMHgxZgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1NJICAgICAgICAgICAgIDB4MjAKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVEVTVF9WRERRX1NJICAgICAgICAgICAgIDB4MjEKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfVFVORV9ERFJfREFUQV9XSU5ET1dfRU5WICAgICAgICAgICAgMHgyMgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUjRfVEVTVF9TSElGVF9ERFJfRlJFUVVFTkNZX1RYTCAgMHgyMwojZGVmaW5lICBERFJfVEVTVF9DTURfX0RJU1BMQVlfRERSX0lORk9STUFUSU9OICAweDI0CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fT0ZGU0VUX0xDRExSICAweDI1CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fU0VUX1dBVENIX0RPR19WQUxVRSAgMHgyNgojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9UVU5FX0REUl9EQVRBX1dJTkRPV19TVElDS1kgIDB4MjcKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X1NXRUVQX0RSQU1fQ0xLX1VTRV9EMlBMTF9TVElDS1kgIDB4MjgKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFI0X0REUl9CSVNUX1RFU1RfVVNFX0QyUExMX1NUSUNLWSAgMHgyOQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfQklTVF9URVNUX1NJWkVfU1RJQ0tZXzYgIDB4MzAKI2RlZmluZSAgRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX1NUT1JFX1dJTkRPVyAgMHgzMQojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfU1RPUkVfUVVJQ0tfV0lORE9XICAweDMyCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9LRVJORUxfU1RPUkVfUVVJQ0tfV0lORE9XICAweDMzCiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9LRVJORUxfU1RPUkVfUVVJQ0tfV0lORE9XX01VTFRJICAweDM0CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9LRVJORUxfV0lORE9XX1NBTUVfQ0hBTkdFICAweDM1CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9HMTJfUkVDT05GSUdfQ01EICAweDM2CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRElTUExBWV9HMTJfRERSX0lORk9STUFUSU9OICAweDM3CiNkZWZpbmUgIEREUl9URVNUX0NNRF9fRERSX0cxMl9ETUNfVEVTVCAgMHgzOAojZGVmaW5lICBERFJfVEVTVF9DTURfX0REUl9HMTJfRUVfQkRMUl9URVNUICAweDM5CgoJdW5zaWduZWQgaW50ICBkZHJfdGVzdF9jbWQ9MDsKCXVuc2lnbmVkIGludCAgYXJnWzMwXT17MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsfTsKCWNoYXIgKmVuZHA7CglkZHJfdGVzdF9jbWQgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCWZvciAoaSA9IDI7aTxhcmdjO2krKykKCQlhcmdbaS0yXT1zaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbaV0sICZlbmRwLCAwKTsKCXByaW50ZigiXG5kZHJfdGVzdF9jbWQ9PSAweCUwOHhcbiIsIGRkcl90ZXN0X2NtZCk7CgoJZm9yIChpID0gMDtpPChhcmdjLTIpO2krKykKCQlwcmludGYoIlxuYXJnWyUwOHhdPSUwOHhcbiIsaSxhcmdbaV0pOwoJLy9pbnQgYXJnYzJfbGVuZ3RoOwoJLy9hcmdjMl9sZW5ndGg9KGFyZ2MtMik7CgkvL2NtZF90YmxfdCAqY21kdHAyOwoJLy9pbnQgZmxhZzI7CglpbnQgYXJnYzI7CgljaGFyKiBhcmd2MlszMF07CgoJYXJnYzI9YXJnYy0xOwoJZm9yIChpID0gMTtpPChhcmdjKTtpKyspCgkJYXJndjJbaS0xXT1hcmd2W2ldOwoJLy9hcmd2Mj0oY2hhciAgICAqKWFyZ3YrKzsKCXsKCQlydW5fY29tbWFuZCgiZGNhY2hlIG9mZiIsMCk7CgkJcnVuX2NvbW1hbmQoImRjYWNoZSBvbiIsMCk7CgkJcHJpbnRmKCJcbiBjYWNoZSBvZmYgb24iKTsJCgkJc3dpdGNoIChkZHJfdGVzdF9jbWQpCgkJe2Nhc2UoRERSX1RFU1RfQ01EX19OT05FKToKCQkJewoJCQkJcHJpbnRmKCJcbiAgMHgwIGhlbHBcbiIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxIGRkcnRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDEgc3RhcnRfYWRkIHRlc3Rfc2l6ZSBsb29wcyAgIik7CgkJCQlwcmludGYoIlxuICAweDIgdGVzdCBhY2xjZGxyICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MiBzdGFydF9hZGQgdGVzdF9zaXplIGxvb3BzICAgIGRkcl90ZXN0X2NtZCAweDIgYSAwIDB4ODAwMDAwMCAgMSIpOwoJCQkJcHJpbnRmKCJcbiAgMHgzIHRlc3QgbWF4X3BsbGNsayAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDMgIHRlc3Rfc2l6ZSBsb29wcyBhZGRfZnJlcSBzdWJfZnJlcSAiKTsKCQkJCXByaW50ZigiXG4gIDB4NCB0ZXN0IHpxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NCAgdGVzdF9zaXplIGxvb3BzIGFkZF9mcmVxIHN1Yl9mcmVxIGRydl9vZHRfZmxhZyAiKTsKCQkJCXByaW50ZigiXG4gIDB4NSB0ZXN0IHZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4NSAgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHg2IHRlc3QgZ3h0dmJiX2Nyb3NzdGFsayAgICAgICAgIGRkcl90ZXN0X2NtZCAweDYgIGxvb3BzIHBhdHRlcm5fZmxhZyAiKTsKCQkJCXByaW50ZigiXG4gIDB4NyB0ZXN0IGJhbmR3aWR0aCAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHg3IHNpemUgbG9vcHMgcG9ydCBzdWJfaWQgdGltZXJfbXMgIik7CgkJCQlwcmludGYoIlxuICAweDggdGVzdCBsY2Rscl91c2VfZW52X3VhcnQgICAgICBkZHJfdGVzdF9jbWQgMHg4IGlucHV0X3NyYyB3cl9hZGpfcGVyW10gcmRfYWRqX3BlcltdW10gIik7CgkJCQlwcmludGYoIlxuICAweDkgdGVzdF9yZWdfdXNlX21hc2sgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHg5IHJlZ19hZGQgdmFsdWUgbWFzayAgIik7CgkJCQlwcmludGYoIlxuICAweGEgdGVzdCBhY19jbGsgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHhhIHN0YXJ0X2FkZCB0ZXN0X3NpemUgbG9vcHMgICBkZHJfdGVzdF9jbWQgMHhhIGEgMCAweDgwMDAwMDAgIDEgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhiIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweGMgLi4uICAiKTsKCQkJCXByaW50ZigiXG4gIDB4ZCAuLi4gICIpOwoJCQkJcHJpbnRmKCJcbiAgMHhlIC4uLiAgIik7CgkJCQlwcmludGYoIlxuICAweGYgLi4uICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTAgdGVzdCBzZXQgenEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxMCB6cTBwcjAgenExcHIwIHpxMnByMCAgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxMSB0ZXN0IHR1bmUgZHFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxMSBhIDAgdGVzdF9zaXplICAgZGRyX3Rlc3RfY21kIDB4MTEgYSAwIDB4ODAwMDAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTIgdGVzdCBzZXQgc3RhcnRfYWRkICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxMiBzdGFydF9hZGQgICAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTMgdGVzdCBhY19iaXRfc2V0dXBfaG9sZCB0aW1lICAgICAgICBkZHJfdGVzdF9jbWQgMHgxMyBhIDAgc2l6ZSBtZXRob2QgIHBpbl9pZCAgIGRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMCAgMHhjIik7CgkJCQlwcmludGYoIlxuICAweDE0IHRlc3QgZGF0YV9iaXRfc2V0dXBfaG9sZCB0aW1lICAgICAgZGRyX3Rlc3RfY21kIDB4MTQgYSAwIHNpemUgc2V0dXAvaG9sZCBwaW5faWQgICBkZHJfdGVzdF9jbWQgMHgxNCBhIDAgMHg4MDAwMCAwIDMgIik7CgkJCQlwcmludGYoIlxuICAweDE1IHRlc3QgYWNfbGFuZV9zZXR1cF9ob2xkICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDE1IGEgMCBzaXplICAgIik7CgkJCQlwcmludGYoIlxuICAweDE2IHRlc3QgZWUgbWRsciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDE2ICB2b2x0YWdlIHB3bV9pZCBsb29wcyAgICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxNyBkMnBsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxNyBjbGsgenFfYWMgenFfc29jX2RyYW0gc29jX3ZyZWYgZHJhbV92cmVmIGRlY19oZXggenFfdnJlZiAwXG4gXAoJCQkJCQlleGFtcGxlIGRkcl90ZXN0X2NtZCAweDE3IDEyMDAgMHgyYWE0YSAweDIwMTU5OTVkIDUwIDgxIDEgNTAgXG4gXAoJCQkJCQlvciAgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCAweDJhYTRhIDB4MjAxNTk5NWQgMHgwOSAweDIwIDAgNTAgXG4iKTsgCgkJCQlwcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDYwMzQgNjAzNDYwMzQgMCAwIDAgMCAxIFxuIik7CgkJCQlwcmludGYoIlxuICAweDE4IHRlc3QgZGF0YV9sYW5lX3NldHVwX2hvbGQgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTggYSAwIHNpemUgcmFuZ2Ugc3RhcnRfcGluX2lkIGVuZF9waW5faWQgIGRkcl90ZXN0X2NtZCAweDE4IGEgMCAweDgwMDAwIDEgMCA5NiAiKTsKCQkJCXByaW50ZigiXG4gIDB4MTkgdGVzdCBwaHkgdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4ODAwMDAgIDEgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHNlZWRfaGV4X2RlYyAgXAoJCQkJCQlkZHJfdGVzdF9jbWQgMHgxOSBhIDAgMHgxMDAwMDAwICAxICA2MyAgMSAxICAweDggMCAxICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxYSB0ZXN0IGRyYW0gdnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFBIGEgMCAweDgwMDAwICBjbGVhciBzZWVkIHN0ZXAgdnJlZl9hbGwgdnJlZl9sY2Rscl9vZmZzZXQgdGVzdF9kb3duX3VwX3N0ZXAgdnJlZl9yYW5nZSBzZWVkX2hleF9kZWMgXAoJCQkJCQlcbiBzZXRlbnYgIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiBkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHgwODAwMDAwICAwICAweDE0IDEgIDAgIDB4OCAwIDAgMCA7IHNldGVudiAgc3RvcmVib290ICBydW4gZGRyX3Rlc3RfZGRyNHJhbV92cmVmIDtzYXZlO3Jlc2V0ICIpOwoJCQkJcHJpbnRmKCJcbiAgMHgxYiB0ZXN0IGFjIHZyZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MUIgYSAwIDB4ODAwMDAgIGNsZWFyIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCBzZWVkX2hleF9kZWMiKTsKCQkJCXByaW50ZigiXG4gIDB4MWMgc3dlZXAgZHJhbSBjbGsgdXNlIGQycGxsX2VudiAgICAgZGRyX3Rlc3RfY21kIDB4MWMgIHRlc3Rfc2l6ZSBzdGFydF9mcmVxIGVuZF9mcmVxIHRlc3RfbG9vcHMgIGRkcl90ZXN0X2NtZCAweDFjIDB4ODAwMDAwMCA4MDAgMTUwMCAxIik7CgkJCQlwcmludGYoIlxuICAweDFkIHRlc3Qgc2hpZnQgY2xrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFkIHR5cGUgZGVsYXlfbXMgdGltZXMiKTsKCQkJCXByaW50ZigiXG4gIDB4MWUgdGVzdCB3cml0ZV9yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgxZSB3cml0ZV9yZWFkIHBhdHRlcm5faWQgbG9vcCBzdGFydF9hZGQgdGVzdF9zaXplIik7CgkJCQlwcmludGYoIlxuICAweDFmIHRlc3QgcHdtX2NtZCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkcl90ZXN0X2NtZCAweDFmIHB3bWlkICAgcHdtX2xvdyBwd21faGlnaCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyMiB0ZXN0IGRkcl93aW5kb3cgdXNlIGVudiAgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIHRlc3Rfc2l6ZSB3YXRjaGRvZ190aW1lIFwKCQkJCQkJbGFuZV9kaXNhYmxlX21hc3JrIGFkZF90ZXN0X3NpemUgIHNldGVudiBib290Y21kICBkZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMDAgMTUgMCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gZGVmZW52O3NhdmU7c2V0ZW52IGJvb3RjbWQgZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAwIDE4IDB4MCAweDgwMDAwMDAiKTsKCQkJCXByaW50ZigiXG4gc2V0ZW52IGVudl9kZHJ0ZXN0X2RhdGFfbGFuZSAgMHgyMjtzYXZlO3Jlc2V0Iik7CQoJCQkJcHJpbnRmKCJcbiAgMHgyMyB0ZXN0IHNoaWZ0IGRkciBmcmVxdWVuY3kgICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjMiKTsKCQkJCXByaW50ZigiXG4gIDB4MjQgZGlzcGxheSBkZHJfaW5mb3JtYXRpb24gICAgICAgICAgZGRyX3Rlc3RfY21kIDB4MjQiKTsKCQkJCXByaW50ZigiXG4gIDB4MjUgb2Zmc2V0IGRkcl9sY2RsciAgICAgICAgICBkZHJfdGVzdF9jbWQgMHgyNSIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyNiBzZXQgd2F0Y2hkb2dfdmFsdWUgICAgICAgIGRkcl90ZXN0X2NtZCAweDI2IDMwIik7CgkJCQlwcmludGYoIlxuICAweDI3IHRlc3QgZGRyX3dpbmRvdyB1c2Ugc3RpY2t5IHJlZ2lzdGVyICAgICAgICBkZHJfdGVzdF9jbWQgMHgyNyBhIDAgdGVzdF9zaXplIHdhdGNoZG9nX3RpbWUgXAoJCQkJCQlsYW5lX2Rpc2FibGVfbWFzcmsgYWRkX3Rlc3Rfc2l6ZSAgc2V0ZW52IGJvb3RjbWQgIGRkcl90ZXN0X2NtZCAweDI3IGEgMCAweDgwMDAwMCAxNSAwIDB4ODAwMDAwMCIpOwoJCQkJcHJpbnRmKCJcbiAgMHgyOCAgc3dlZXAgZHJhbSBjbGsgdXNlIGQycGxsX3N0aWNreSAgICAgZGRyX3Rlc3RfY21kIDB4MjggIHRlc3Rfc2l6ZSBzdGFydF9mcmVxIGVuZF9mcmVxIHRlc3RfbG9vcHMgIGRkcl90ZXN0X2NtZCAweDI4IDB4ODAwMDAwMCA4MDAgMTUwMCAxIik7CgoJCQkJLyoKCQkJCSAgIGRkcl90dW5lX2Rxc19zdGVwICBhIDAgIDB4ODAwMDAwIDEgMglsYW5lMC03CW1pbgoJCQkJICAgZGRyX3R1bmVfZHFzX3N0ZXAgIGEgMCAgMHg4MDAwMDAgMSAxCWxhbmUwLTcJbWF4CgoJCQkJICAgZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHg4MDAwMDAwIDEgMglsYW5lMC0xCW1pbgoJCQkJICAgZGRyX3R1bmVfYWNsY2Rscl9zdGVwICBhIDAgMHg4MDAwMDAwIDEgMQlsYW5lMC0xCW1heAoKCQkJCSAgIHNldGVudiBib290Y21kICAiZGRyX3Rlc3RfY21kIDB4MjIgYSAwIDB4ODAwMDAwIDE4IDAgMHg4MDAwMDAwIgkJIHdhdGNoZG9nX3RpbWUgo6xsYW5lX2Rpc2FibGVfbWFzayxhZGRfdGVzdF9zaXplCgkJCQkgICBzZXRlbnYgZW52X2RkcnRlc3RfZGF0YV9sYW5lICAweDIyCcno1sPD/MHuv6rKvLHq1r4JCgkJCQkgICBzYXZlCSB3YXRjaGRvZ190aW1lIKOsbGFuZV9kaXNhYmxlX21hc2ssYWRkX3Rlc3Rfc2l6ZQkKCQkJCSAgIGQycGxsIDEyMDAJCQoKCQkJCSAgIHNldGVudiBkZHJfc29jX2lvdnJlZl90ZXN0X2Rkcl9jbGsgIjB4MDAwMDAwMCI7CQkKCQkJCSAgIHNldGVudiBkZHJfc29jX2lvdnJlZl9sZWYgIjB4MDAwMDAwMCI7CQkKCQkJCSAgIHNldGVudiBkZHJfc29jX2lvdnJlZl9vcmcgIjB4MCI7CQkKCQkJCSAgIHNldGVudiBkZHJfc29jX2lvdnJlZl9yaWcgICIweDAwMDAwMCAiOwkJCgkJCQkgICBzYXZlCQkKCQkJCSAgIGQycGxsIDExMDQJCQoJCQkJICAgZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4ODAwMDAgIDEgIDcwICAxIDEgIDB4OCAwIDEJCQoKCgoJCQkJICAg1tiy4tKqtfS156Osyv2+3bTm1NpzdGljayC8xLTmxvfBywkJCgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX3Rlc3RfZGRyX2NsayAiMHgwMDAwMDAwIjsJCQoJCQkJICAgc2V0ZW52IGRkcl9kcmFtX2lvdnJlZl9sZWYgIjB4MDAwMDAwMCI7CQkKCQkJCSAgIHNldGVudiBkZHJfZHJhbV9pb3ZyZWZfb3JnICIweDAiOwkJCgkJCQkgICBzZXRlbnYgZGRyX2RyYW1faW92cmVmX3JpZyAgIjB4MDAwMDAwICI7CQkKCQkJCSAgIHNldGVudiAgZGRyX3Rlc3RfZGRyNHJhbV92cmVmICJkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHgwODAwMDAgIDAgIDcwIDAgIDAgIDB4MDggMCAwIDEiCQkKCQkJCSAgIHNldGVudiBib290Y21kICAgInJ1biBkZHJfdGVzdF9kZHI0cmFtX3ZyZWYiCQkKCQkJCSAgIHNhdmUJCQoJCQkJICAgtfS158nPtecJCQoJCQkJICAgZDJwbGwgMTEwNAkJCgkJCQkgICAqLwoKCgkJCX0KCQkJcmV0dXJuIDE7CgoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcnRlc3QgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDEgc3Rhcl9hZGQgdGVzdF9zaXplIGxvb3BzCgkJCQkvLyBkb19kZHJfdGVzdChjbWR0cCwgIGZsYWcsIGFyZ2MyLGFyZ3YpOwoJCQkJZG9fZGRyX3Rlc3QoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsKGFyZ3YyKSk7CgkJCQlicmVhazsKCQkJfQoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfQUNMQ0RMUik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciBhIDAgIDB4ODAwMDAwMCAzIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MiBhIDAgMHg4MDAwMDAwICAxCgkJCQlkb19kZHJfdGVzdF9hY193aW5kb3dzX2FjbGNkbHIoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0REUl9UVU5FX0FDX0NMSyk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdHVuZV9kZHJfYWNfYWNiZGxyX2NrIGEgMCAweDgwMDAwMDAgMyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweEEgYSAwIDB4ODAwMDAwMCAgMQoJCQkJZG9fZGRyX3Rlc3RfYWNfd2luZG93c19hY2JkbHJfY2soKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9NQVhfQ0xLKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAzIDB4ODAwMDAwMCAwIiwwKTsKCQkJCXByaW50ZigiXG5UZXN0IGRkciBtYXggZnJlcXVlbmN5IHNob3VsZCB1c2UgbWF4IHRpbW1pbmcgLHN1Y2ggYXMgMTQtMTQtMTRcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2Rkcl9tYXhfZnJlcSgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVFVORV9aUSk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciAweDEwMDAwMDAwIDB4ODAwMDAwMCAzIiwwKTsKCQkJCXByaW50ZigiXG5UZXN0IHpxLHNob3VsZCBmaXJzdCB0ZXN0IG1heCBkZHIgZnJlcXVlbmN5IHVzZSBkZWZhdWx0IHpxIHZhbHVlXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9kZHJfenEoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0dYVFZCQl9DUk9TU1RBTEspOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3R1bmVfZGRyX2FjX2FjbGNkbHIgMHgxMDAwMDAwMCAweDgwMDAwMDAgMyIsMCk7CgkJCQlwcmludGYoIlxuVGVzdCBHWFRWQkIgY3Jvc3MgdGFsayx0ZXN0IG9ubHkgY2hhbm5lbCAwIC0tMHgxMDAwMDAwMCBjaGFubmVsIDEgLS0weDEwMDAwNDAwIDMyYnl0ZVxuIik7CgoJCQkJZG9fZGRyX2d4dHZiYl9jcm9zc3RhbGsoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0JBTkRXSURUSF9URVNUKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90dW5lX2Rkcl9hY19hY2xjZGxyIDB4MTAwMDAwMDAgMHg4MDAwMDAwIDMiLDApOwoJCQkJcHJpbnRmKCJcbk5PVEUgdGVzdCBERFIgYmFuZHdpZHRoIGluIHVib290IGxpbWl0ZWQgYnkgY3B1IHNwZWVkIFxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfYmFuZHdpZHRoKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9MQ0RMUl9FTlZfVFVORSk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciAweDEwMDAwMDAwIDB4ODAwMDAwMCAzIiwwKTsKCQkJCXByaW50ZigiXG50dW5lIGRkciBsY2RsciB1c2UgdWJvb3QgZW52IG9yIHVhcnQgaW5wdXQgXG4iKTsKCgkJCQlkb19kZHJfZmluZV90dW5lX2xjZGxyX2VudigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfTU9ESUZZX1JFR19VU0VfTUFTSyk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdHVuZV9kZHJfYWNfYWNsY2RsciAweDEwMDAwMDAwIDB4ODAwMDAwMCAzIiwwKTsKCQkJCXByaW50ZigiXG5tb2RpZnkgZGRyIHJlZyB1c2UgbWFzayBcbiIpOwoKCQkJCWRvX2Rkcl9tb2RpZnlfcmVnX3VzZV9tYXNrKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRaUSk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMCAgMHg1OSAweDVkIDB4NWIgICIsMCk7CgkJCQlwcmludGYoIlxuc2V0IGRkciB6cSBcbiIpOwoKCQkJCWRvX2Rkcl9zZXRfenEoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKI2lmICggQ09ORklHX0REUl9QSFkgPj0gUF9ERFJfUEhZX0cxMikKI2Vsc2UKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX0RRUyk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxMSBhIDAgMHg4MDAwMCAgIiwwKTsKCQkJCXByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9kcXNfd2luZG93KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRfVEVTVF9TVEFSVF9BREQpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDEyICAweDQxMDgwMDAwICAiLDApOwoKCgkJCQl0ZXN0X3N0YXJ0X2FkZHI9YXJnWzBdOwoJCQkJaWYgKHRlc3Rfc3RhcnRfYWRkciA9PSAwKQoJCQkJCXRlc3Rfc3RhcnRfYWRkcj0weDEwODAwMDA7CgkJCQlwcmludGYoIlxuc2V0IGRkciAgdGVzdCB0ZXN0X3N0YXJ0X2FkZHI9PTB4JTA4eCBcbiIsdGVzdF9zdGFydF9hZGRyKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0FDX0JJVF9TRVRVUF9IT0xEX01BUkdJTik6CgkJCXsgIC8vY2xrIHNlZWQgdXNlIGZvciBjbGsgdG9vIGVhcmx5LGNsayBtdXN0IGRlbGF5CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTMgYSAwIDB4ODAwMDAwMCAwICAweGMgICIsMCk7IGNzMCBzZXR1cAoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMSAgMHhjICAiLDApOyBjczAgaG9sZAoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMiAgMHhjICAiLDApOyBjczAgaG9sZCAgIC8vc29tZSB0aW1lcyBkZHIgZnJlcXVlbmN5IHRvbyBoaWdoIGNhbm5vdCBtb3ZlIGNsayBkZWxheS50aGVuIHNob3VsZCBvbmx5IG1vdmUgY21kIGJkbAoJCQkJLy9zbyBzaG91bGR0IHRlc3QgaG9sZCB0aW1lIHVzZSBtZXRob2QgMSBhbmQgbWV0aG9kIDItLS0tdGVzdCBob2xkIHRpbWUgdGFrZSBjYXJlLS0yMDE2MDgwNC1qaWF4aW5nCgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTMgYSAwIDB4ODAwMDAwMCAwICAweGQgICIsMCk7IGNzMSBzZXR1cAoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDEzIGEgMCAweDgwMDAwMDAgMSAgMHhkICAgIiwwKTsgY3MxIGhvbGQKCQkJCXByaW50ZigiXG50ZXN0IEFDIGJpdCB3aW5kb3cgXG4iKTsKCgkJCQlkb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3coKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQkJLy9kb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAwIGMKCQkJfQoJCQlicmVhazsKCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVF9EMlBMTF9DTUQpOgoJCQl7CgkJCQkvL3ByaW50ZigiIGRkcl90ZXN0X2NtZCAweDE3IGNsayB6cV9hYyB6cV9zb2NfZHJhbSBzb2NfdnJlZiBkcmFtX3ZyZWYgZGVjX2hleCB6cV92cmVmIDBcbiIpOwoJCQkJLy9wcmludGYoImV4YW1wbGUgZGRyX3Rlc3RfY21kIDB4MTcgMTIwMCAweDJhYTRhIDB4MjAxNTk5NWQgNTAgODEgMSA1MCBcbiIpOwoJCQkJLy9wcmludGYoIm9yICBkZHJfdGVzdF9jbWQgMHgxNyAxMjAwIDB4MmFhNGEgMHgyMDE1OTk1ZCAweDA5IDB4MjAgMCA1MCBcbiIpOwoJCQkJcHJpbnRmKCJcbnRlc3QgZDJwbGwgY21kICxzZWUgZGRyX3Rlc3RfY21kIDB4MTcgaGVscCBcbiIpOwoKCQkJCWRvX2RkcjJwbGxfY21kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0VFX1ZPTFRBR0VfTURMUl9TVEVQKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE2IDEwMDAgMSAxIiwwKTsvL3Rlc3QgRUUgMTAwMG1WIGRkbCBzdGVwIHB3bWIgIC0xIDIxMSAgICAyMTItLXB3bWQtLTMKCQkJCS8vMTAwMCAxIDEgIC0tLTEwMDBtdiAgcHdtaWQgIGxvb3AgLGlmIGxvb3AgdGhlbiB0ZXN0IGFsbCBwd20gdm9sdGFnZQoJCQkJLy9kZHJfdGVzdF9jbWQgMHgxNiAxMDAwIDEgICBzZXQgdG8gMTAwMG12CgkJCQlwcmludGYoIlxudGVzdCBlZSB2b2x0YWdlIGRkbCBzdGVwIFxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfcHdtX2RkbCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfVEVTVF9BQ19MQU5FX0JJVF9NQVJHSU4pOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTUgYSAwIDB4ODAwMDAwIDAiLDApOwoJCQkJcHJpbnRmKCJcbnRlc3QgYWMgbGFuZSBiaXQgbWFyZ2luIG5vdCBpbmNsdWRlIGNzIHBpbiBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2FjX2JpdF9tYXJnaW4oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQkJLy9kb19kZHJfdGVzdF9hY19iaXRfc2V0dXBfaG9sZF93aW5kb3cgYSAwIDB4ODAwMDAwMCAwIGMKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX0RBVEFfQklUX1NFVFVQX0hPTERfTUFSR0lOKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE0IGEgMCAweDgwMDAwIHNldHVwL2hvbGQgcGluX2lkIiwwKTsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxNCBhIDAgMHg4MDAwMCAwIDMiLDApOwoJCQkJcHJpbnRmKCJcbnRlc3QgZGF0YSBsYW5lIGJpdCBzZXR1cCBob2xkIFxuIik7CgoJCQkJZG9fZGRyX3Rlc3RfZGF0YV9iaXRfc2V0dXBfaG9sZF93aW5kb3coKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfREFUQV9MQU5FX0JJVF9NQVJHSU4pOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTggYSAwIDB4ODAwMDAgMCIsMCk7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MTggYSAwIDB4ODAwMDAgMSAwIDk2IiwwKTsKCQkJCXByaW50ZigiXG50ZXN0IGRhdGEgbGFuZSBiaXQgbWFyZ2luICBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2RhdGFfYml0X21hcmdpbigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9UVU5FX1BIWV9WUkVGKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDE5IGEgMCAweDgwMDAwICAxIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCB0ZXN0X2Rvd25fdXBfc3RlcCBzZWVkX2hleF9kZWMiLDApOwoJCQkJLy9kZHJfdGVzdF9jbWQgMHgxOSBhIDAgMHgxMDAwMDAwICAxICAweDFhICAxIDEgIDB4OCAwIDAKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MTkgYSAwIDB4MTAwMDAwMCAgMSAgNjMgIDEgMSAgMHg4IDAgMQoJCQkJcHJpbnRmKCJcbnRlc3QgZGRyNCBwaHkgdnJlZiAgXG4iKTsKCgkJCQlkb19kZHI0X3Rlc3RfcGh5X3ZyZWYoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9UVU5FX0RSQU1fVlJFRik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHg4MDAwMCAgY2xlYXIgc2VlZCBzdGVwIHZyZWZfYWxsIHZyZWZfbGNkbHJfb2Zmc2V0IHRlc3RfZG93bl91cF9zdGVwIHZyZWZfcmFuZ2Ugc2VlZF9oZXhfZGVjIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MUEgYSAwIDB4MTAwMDAwMCAgMCAgMCAzICAwICAweDEwCgkJCQkvL3NldGVudiAgZGRyX3Rlc3RfZGRyNHJhbV92cmVmICJkZHJfdGVzdF9jbWQgMHgxQSBhIDAgMHgwODAwMDAwICAwICAweDE0IDAgIDAgIDB4OCAwIDAgMCIKCQkJCS8vc2V0ZW52IHN0b3JlYm9vdCAicnVuIGRkcl90ZXN0X2RkcjRyYW1fdnJlZiIKCQkJCXByaW50ZigiXG50ZXN0IGRkcjQgRFJBTSB2cmVmICBcbiIpOwoKCQkJCWRvX2RkcjRfdGVzdF9kcmFtX3ZyZWYoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9UVU5FX0FDX1ZSRUYpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MUIgYSAwIDB4ODAwMDAgIGNsZWFyIHNlZWQgc3RlcCB2cmVmX2FsbCB2cmVmX2xjZGxyX29mZnNldCBzZWVkX2hleF9kZWMiLDApOwoJCQkJLy9kZHJfdGVzdF9jbWQgMHgxQiBhIDAgMHgxMDAwMDAwICAwICAwIDEgIDAgIDB4MTAgMAoJCQkJcHJpbnRmKCJcbnRlc3QgZGRyNCBBQyBvciBkZDMgZHJhbSBhY19kYXRhIHZyZWYgIFxuIik7CgoJCQkJZG9fZGRyNF90ZXN0X2RyYW1fYWNfdnJlZigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgoJCQkvL0REUl9URVNUX0NNRF9fRERSNF9TV0VFUF9EUkFNX0NMS19VU0VfRDJQTEwKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfU1dFRVBfRFJBTV9DTEtfVVNFX0QyUExMKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDFjICB0ZXN0X3NpemUgc3RhcnRfZnJlcSBlbmRfZnJlcSB0ZXN0X2xvb3BzIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MWMgMHg4MDAwMDAwIDgwMCAxNTAwIDMKCQkJCXByaW50ZigiXG50ZXN0IGRkcjQgc3dlZXAgZGRyIGNsayB1c2UgZDJwbGwgXG4iKTsKCgkJCQlkb19kZHI0X3Rlc3RfZHJhbV9jbGsoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9URVNUX1NISUZUX0REUl9GUkVRVUVOQ1kpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWQgIiwwKTsKCQkJCS8vZGRyX3Rlc3RfY21kIDB4MWQgdHlwZSBkZWxheV9tcyB0aW1lcyAvL2Rkcl90ZXN0X2NtZCAweDFkIDAgMTAwMCAxMDAwMDAKCQkJCS8vdGltZXMgPTB4ZmZmZmZmZmYgd2lsbCBhdXRvIGxvb3AKCQkJCXByaW50ZigiXG50ZXN0IGRkciBzaGlmdCBkZHIgY2xrICBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3NoaWZ0X2Rkcl9jbGsoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQkvL0REUl9URVNUX0NNRF9fRERSNF9URVNUX0RBVEFfV1JUSUVfUkVBRAoKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9URVNUX1BXTV9DTUQpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWYgMHgxIDB4MiAweDFBICIsMCk7Ly90ZXN0IEVFICAgcHdtYiAgLS0xIDIxMSAgICAyMTItLXB3bWQtLTMKCQkJCS8vMTAwMCAxIDEgIC0tLXB3bWlkICAgcHdtX2xvdyBwd21faGlnaCAgIHB3bV9sb3crcHdtX2hpZ2g9PW5vcm1hbD0yOAoJCQkJcHJpbnRmKCJcbnB3bWlkICAgcHdtX2xvdyBwd21faGlnaCBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3B3bV9jbWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RFU1RfRUVfU0kpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MjAgMHgxIDB4MiAweDFBICIsMCk7Ly90ZXN0IEVFICAgcHdtYiAgLS0xIDIxMSAgICAyMTItLXB3bWQtLTMKCQkJCS8vMTAwMCAxIDEgIC0tLXB3bWlkICAgcHdtX2xvdyBwd21faGlnaCAgIHB3bV9sb3crcHdtX2hpZ2g9PW5vcm1hbD0yOAoJCQkJLy8gZG9fZGRyX3Rlc3RfZWVfc2koKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwojaWYgKCBDT05GSUdfRERSX1BIWSA+PSBQX0REUl9QSFlfRzEyKQojZWxzZQoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX1RVTkVfRERSX0RBVEFfV0lORE9XX0VOVik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgyMiBhIDAgMHg4MDAwMCAgIiwwKTsKCQkJCXByaW50ZigiXG50ZXN0IGRxcyB3aW5kb3cgdXNlIGVudiBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2Rxc193aW5kb3dfZW52KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVEVTVF9TSElGVF9ERFJfRlJFUVVFTkNZX1RYTCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgxZCAiLDApOwoJCQkJLy9kZHJfdGVzdF9jbWQgMHgxZCB0eXBlIGRlbGF5X21zIHRpbWVzIC8vZGRyX3Rlc3RfY21kIDB4MWQgMCAxMDAwIDEwMDAwMAoJCQkJLy90aW1lcyA9MHhmZmZmZmZmZiB3aWxsIGF1dG8gbG9vcAoJCQkJcHJpbnRmKCJcbnRlc3QgZGRyIHNoaWZ0IGRkciBjbGsgIFxuIik7CgoJCQkJZG9fZGRyX3Rlc3Rfc2hpZnRfZGRyX2Nsa190eGwoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwojZW5kaWYKCQkJY2FzZShERFJfVEVTVF9DTURfX0RJU1BMQVlfRERSX0lORk9STUFUSU9OKToKCQkJewoKCQkJCXByaW50ZigiXG5kaXNwbGF5IGRkcl9pbmZvcm1hdGlvbiAgXG4iKTsKCgkJCQlkb19kZHJfZGlzcGxheV9kZHJfaW5mb3JtYXRpb24oKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fT0ZGU0VUX0xDRExSKToKCQkJewoKCQkJCXByaW50ZigiXG5vZmZzZXQgZGRyIGxjZGxyIFxuIik7CgoJCQkJZG9fZGRyX29mZnNldF9kZHJfbGNkbHIoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlKEREUl9URVNUX0NNRF9fU0VUX1dBVENIX0RPR19WQUxVRSk6CgkJCXsKCQkJCXByaW50ZigiXG5zZXQgd2F0Y2hkb2cgdmFsdWUgXG4iKTsKCQkJCWRvX2Rkcl9zZXRfd2F0Y2hkb2dfdmFsdWUgKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSNF9TV0VFUF9EUkFNX0NMS19VU0VfRDJQTExfU1RJQ0tZKToKCQkJewoJCQkJLy8JcnVuX2NvbW1hbmQoImRkcl90ZXN0X2NtZCAweDI4IAoJCQkJcHJpbnRmKCJcbnRlc3QgZGRyIGZyZXF1ZW5jeSB1c2Ugc3RpY2t5IHJlZ2lzdGVyXG4iKTsKCgkJCQlkb19kZHI0X3Rlc3RfZHJhbV9jbGtfdXNlX3N0aWNreSgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFI0X0REUl9CSVNUX1RFU1RfVVNFX0QyUExMX1NUSUNLWSk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgyOSAKCQkJCXByaW50ZigiXG50ZXN0IGRkciBiaXN0IHRlc3QgdXNlIHN0aWNreSByZWdpc3RlclxuIik7CgoJCQkJZG9fZGRyNF90ZXN0X2Jpc3RfdGVzdF91c2Vfc3RpY2t5KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRfQklTVF9URVNUX1NJWkVfU1RJQ0tZXzYpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzAKCQkJCXByaW50ZigiXG5zZXQgZGRyIGJpc3QgdGVzdCBzaXplIHVzZSBzdGlja3k2IHJlZ2lzdGVyXG4iKTsKCgkJCQlkb19kZHJfc2V0X2Jpc3RfdGVzdF9zaXplX3VzZV9zdGlja3lfNigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX1NUT1JFX1dJTkRPVyk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzMQoJCQkJcHJpbnRmKCJcbnNldCBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2VcbiIpOwoKCQkJCWRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZSgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX1NUT1JFX1FVSUNLX1dJTkRPVyk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzMgoJCQkJcHJpbnRmKCJcbnNldCBkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfdGVzdFxuIik7CgoJCQkJZG9fZGRyX3Vib290X3dpbmRvd191c2Vfc291cmNlX3F1aWNrX21ldGhvZCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9TVE9SRV9RVUlDS19XSU5ET1cpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzMKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X2tlcm5lbF93aW5kb3dfdXNlX3NvdXJjZV9xdWlja19tZXRob2RcbiIpOwoKCQkJCWRvX2Rkcl91Ym9vdF9rZXJuZWxfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfbWV0aG9kKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9TRVRfVUJPT1RfS0VSTkVMX1NUT1JFX1FVSUNLX1dJTkRPV19NVUxUSSk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzNAoJCQkJcHJpbnRmKCJcbnNldCBkb19kZHJfdWJvb3Rfa2VybmVsX3dpbmRvd191c2Vfc291cmNlX3F1aWNrX21ldGhvZHNcbiIpOwoKCQkJCWRvX2Rkcl91Ym9vdF9rZXJuZWxfd2luZG93X3VzZV9zb3VyY2VfcXVpY2tfbWV0aG9kcygoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCS8vaW50IGRvX2Rkcl91Ym9vdF93aW5kb3dfdXNlX3NvdXJjZV9hbGxfc2FtZV9pbmNyZWFzZShjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0tFUk5FTF9XSU5ET1dfU0FNRV9DSEFOR0UpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzUKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X2tlcm5lbF93aW5kb3dfdXNlX2FsbCBsY2RsciBzYW1lIGNoYW5uZ2UgXG4iKTsKCgkJCQlkb19kZHJfdWJvb3Rfd2luZG93X3VzZV9zb3VyY2VfYWxsX3NhbWVfaW5jcmVhc2UoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQkjZW5kaWYKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUl9UVU5FX0REUl9EQVRBX1dJTkRPV19TVElDS1kpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MjcgCgkJCQlwcmludGYoIlxudGVzdCBkcXMgd2luZG93IHVzZSBzdGlja3kgcmVnaXN0ZXJcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X2Rxc193aW5kb3dfc3RpY2t5KChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQkJY2FzZShERFJfVEVTVF9DTURfX0REUjRfVEVTVF9EQVRBX1dSVElFX1JFQUQpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MWUgIHdyaXRlX3JlYWQgIHBhdHRlcm5faWQgbG9vcCBzdGFydF9hZGRyIHRlc3Rfc2l6ZSBkZWxheV91cyIsMCk7CgkJCQkvL2Rkcl90ZXN0X2NtZCAweDFlIDEgMiAxMCAweDQwMDAwMDAwIDB4MTAwMDAwMDAKCQkJCS8vdGltZXMgPTB4ZmZmZmZmZmYgd2lsbCBhdXRvIGxvb3AKCQkJCXByaW50ZigiXG50ZXN0IGRkciB3cml0ZSByZWFkICBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3dyaXRlX3JlYWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoJCQkvL0REUl9URVNUX0NNRF9fRERSX1NFVF9VQk9PVF9HMTJfUkVDT05GSUdfQ01ECgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfU0VUX1VCT09UX0cxMl9SRUNPTkZJR19DTUQpOgoJCQl7CgkJCQkvLwlydW5fY29tbWFuZCgiZGRyX3Rlc3RfY21kIDB4MzYKCQkJCXByaW50ZigiXG5zZXQgZG9fZGRyX3Vib290X3JlY29uZmlnIGNtZFxuIik7CgoJCQkJZG9fZGRyX3Vib290X25ld19jbWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsIChhcmd2MikpOwoJCQl9CgkJCWJyZWFrOwoKCQkJY2FzZShERFJfVEVTVF9DTURfX0RJU1BMQVlfRzEyX0REUl9JTkZPUk1BVElPTik6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzNwoJCQkJcHJpbnRmKCJcbnNob3cgZzEyIGRkciBpbmZvcm1hdGlvblxuIik7CgoJCQkJZG9fZGRyX2Rpc3BsYXlfZzEyX2Rkcl9pbmZvcm1hdGlvbigoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgoJCQljYXNlKEREUl9URVNUX0NNRF9fRERSX0cxMl9ETUNfVEVTVCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzOAoJCQkJcHJpbnRmKCJcblVib290IGRtYyB0ZXN0IFxuIik7CgoJCQkJZG9fZGRyX2cxMl91Ym9vdF9kbWNfdGVzdCgoY21kX3RibF90ICogKWNtZHRwLCAoaW50KSBmbGFnLCggaW50KSBhcmdjMiwgKGFyZ3YyKSk7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UoRERSX1RFU1RfQ01EX19ERFJfRzEyX0VFX0JETFJfVEVTVCk6CgkJCXsKCQkJCS8vCXJ1bl9jb21tYW5kKCJkZHJfdGVzdF9jbWQgMHgzOQoJCQkJcHJpbnRmKCJcblVib290IEJETFIgdGVzdCBcbiIpOwoKCQkJCWRvX2Rkcl90ZXN0X3B3bV9iZGxyKChjbWRfdGJsX3QgKiApY21kdHAsIChpbnQpIGZsYWcsKCBpbnQpIGFyZ2MyLCAoYXJndjIpKTsKCQkJfQoJCQlicmVhazsKCQl9CgkJcmV0dXJuIDE7Ly90ZXN0X3N0YXJ0X2FkZHIKCX0KCnVzYWdlOgoJY21kX3VzYWdlKGNtZHRwKTsKCXJldHVybiAxOwoKfQpVX0JPT1RfQ01EKAoJZGRyX3Rlc3RfY21kLAkzMCwJMSwJZG9fZGRyX3Rlc3RfY21kLAoJImRkcl90ZXN0X2NtZCBjbWQgYXJnMSBhcmcyIGFyZzMuLi4iLAoJImRkcl90ZXN0X2NtZCBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKCmludCBkb19kZHJfYXV0b190ZXN0X3dpbmRvdyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCnsKCWdsb2JhbF9ib290X3RpbWVzPXJkX3JlZyhQUkVHX1NUSUNLWV9HMTJBX1JFRzApOwoJcHJpbnRmKCJcbmdsb2JhbF9ib290X3RpbWVzPT0gJWRcbiIsIGdsb2JhbF9ib290X3RpbWVzKTsKCglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglwcmludGYoIlxuYXJnYz09IDB4JTA4eFxuIiwgYXJnYyk7CglpbnQgaSA7Cglmb3IgKGkgPSAwO2k8YXJnYztpKyspCQkKCXsKCQlwcmludGYoIlxuYXJndlslZF09JXNcbiIsaSxhcmd2W2ldKTsKCX0KCgljaGFyIHN0clsxMDI0XT0iIjsKCXVuc2lnbmVkIGludCAgZGRyX3Rlc3RfY21kPTA7Cgl1bnNpZ25lZCBpbnQgIHRlbXBfcmVnX2FkZD0wOwoJdW5zaWduZWQgaW50ICBudW1fYXJyeVszMl09ezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CgoJLy9pbnQgYXJnYzI7CgkvL2NoYXIgICAgICogIGFyZ3YyWzMwXTsKCgl0ZW1wX3JlZ19hZGQ9KChETUNfU1RJQ0tZX0cxMkFfMCkpOwoJLy9udW1fYXJyeSA9ICh1aW50MTZfdCAqKSh1aW50NjRfdCApKHN0aWNreV9yZWdfYmFzZV9hZGQpOwoJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKCQkJbnVtX2FycnlbaV09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDgsaSk7CgkJCWlmKChpPT0wKXx8KGk9PTE2KSl7CgkJCQlwcmludGYoIlxuIG51bWFycnlbJWRdIiAsaSk7CgkJCX0KCQlwcmludGYoIiAlZCAiLG51bV9hcnJ5W2ldKTsKCX0KCglkZHJfdGVzdF9jbWQ9bnVtX2FycnlbMF07CgoJdW5zaWduZWQgaW50ICAgY3MwX3Rlc3Rfc3RhcnQ9IDB4MTA4MDAwMDsKCXVuc2lnbmVkIGludCAgIGNzMF90ZXN0X3NpemU9IEREUl9DT1JTU19UQUxLX1RFU1RfU0laRTsKCXVuc2lnbmVkIGludCAgIGNzMV90ZXN0X3N0YXJ0PSAwOwoJdW5zaWduZWQgaW50ICAgY3MxX3Rlc3Rfc2l6ZT0gMDsKCXVuc2lnbmVkIGludCAgIHdhdGNoZG9nX3RpbWVfcz0wOwoJdW5zaWduZWQgaW50ICAgdGVzdF9pbmRleF9lbmFibGU9MDsKCXVuc2lnbmVkIGludCBhbGxfdG9naHRlcl9lbmFibGU9MDsKCS8vdW5zaWduZWQgaW50ICAgbmliYmxlX21hc2tbM109ezAsMCwwfTsKCWNzMF90ZXN0X3N0YXJ0PSgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU1RBUlRfSU5ERVhdKXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYKzFdKTw8OCl8CgkJKChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TVEFSVF9JTkRFWCsyXSk8PDE2KXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMF9URVNUX1NUQVJUX0lOREVYKzNdKTw8MjQpKTsKCWNzMF90ZXN0X3NpemU9KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYKzFdKTw8OCl8CgkJKChudW1fYXJyeVtURVNUX0FSR19DUzBfVEVTVF9TSVpFX0lOREVYKzJdKTw8MTYpfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MwX1RFU1RfU0laRV9JTkRFWCszXSk8PDI0KSk7CgljczFfdGVzdF9zdGFydD0oKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NUQVJUX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCsxXSk8PDgpfAoJCSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU1RBUlRfSU5ERVgrMl0pPDwxNil8KChudW1fYXJyeVtURVNUX0FSR19DUzFfVEVTVF9TVEFSVF9JTkRFWCszXSk8PDI0KSk7CgljczFfdGVzdF9zaXplPSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWF0pfCgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCsxXSk8PDgpfAoJCSgobnVtX2FycnlbVEVTVF9BUkdfQ1MxX1RFU1RfU0laRV9JTkRFWCsyXSk8PDE2KXwoKG51bV9hcnJ5W1RFU1RfQVJHX0NTMV9URVNUX1NJWkVfSU5ERVgrM10pPDwyNCkpOwoJd2F0Y2hkb2dfdGltZV9zPSgobnVtX2FycnlbVEVTVF9BUkdfV0FUQ0hET0dfVElNRV9TSVpFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19XQVRDSERPR19USU1FX1NJWkVfSU5ERVgrMV0pPDw4KSk7Cgl0ZXN0X2luZGV4X2VuYWJsZT0oKG51bV9hcnJ5W1RFU1RfQVJHX1RFU1RfSU5ERVhfRU5BTEJFX0lOREVYXSl8KChudW1fYXJyeVtURVNUX0FSR19URVNUX0lOREVYX0VOQUxCRV9JTkRFWCsxXSk8PDgpKTsKCWFsbF90b2dodGVyX2VuYWJsZT0obnVtX2FycnlbVEVTVF9BUkdfM19BTExfVE9HSFRFUl0pOwoJc3dpdGNoIChkZHJfdGVzdF9jbWQpCgl7CQoJCWNhc2UoRE1DX1NUSUNLWV9VQk9PVF9XSU5ET1dfTUFHSUNfMSk6CgkJaWYobnVtX2FycnlbMV09PURNQ19TVElDS1lfVUJPT1RfV0lORE9XX01BR0lDXzEpCgkJewoJCQkvL2FyZ2MyPTEwOwoJCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MjcgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggXAoJCQkweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eCAgMHglMDh4IixjczBfdGVzdF9zdGFydCxjczBfdGVzdF9zaXplLGNzMV90ZXN0X3N0YXJ0LGNzMV90ZXN0X3NpemUsCgkJCXdhdGNoZG9nX3RpbWVfcyx0ZXN0X2luZGV4X2VuYWJsZSwwLDAsMCwwLDAsMCxhbGxfdG9naHRlcl9lbmFibGUJKTsKCQkJLy8JZm9yIChpID0gMTtpPChhcmdjMik7aSsrKQoJCQkvLwl7CgkJCS8vCWFyZ3YyW2ldPShhcmdbaV0pOwoJCQkvLwlzcHJpbnRmKHN0ciwiIDB4JTA4eCAiLChhcmdbaV0pKTsKCQkJLy8JfQoKCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkvLyBkZHJfdGVzdF9jbWQoKGNtZF90YmxfdCAqICljbWR0cCwgKGludCkgZmxhZywoIGludCkgYXJnYzIsKGFyZ3YyKSk7CgkJCWJyZWFrOwoJCX0KCX0KCglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX2F1dG9fdGVzdF93aW5kb3csCTMwLAkxLAlkb19kZHJfYXV0b190ZXN0X3dpbmRvdywKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7CgkKaW50IGRvX2Rkcl9hdXRvX3NjYW5fZHJ2KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJLy8gZGRyX3R5cGUgMiBscGRkcjQgICByYW5rX2NvbmZpZwoJI2RlZmluZSAgQVVUT19TQ0FOX0REUjMgIDAKCSNkZWZpbmUgIEFVVE9fU0NBTl9ERFI0ICAxCgkjZGVmaW5lICBBVVRPX1NDQU5fTFBERFIzICAyCgkjZGVmaW5lICBBVVRPX1NDQU5fTFBERFI0ICAzCgoJI2RlZmluZSAgQVVUT19TQ0FOX0NPTkZJR19SQU5LMCAgMAoJI2RlZmluZSAgQVVUT19TQ0FOX0NPTkZJR19SQU5LMDEgIDEKCgljaGFyICpzdHJpbmdfcHJpbnRfZmxhZz0gICAiIHdpbmRvdy1sb29wIFxuIjsKCWdsb2JhbF9ib290X3RpbWVzPXJkX3JlZyhQUkVHX1NUSUNLWV9HMTJBX1JFRzApOwogIAoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJcHJpbnRmKCJcbmFyZ2M9PSAweCUwOHhcbiIsIGFyZ2MpOwoJaW50IGkgOwoJZm9yIChpID0gMDtpPGFyZ2M7aSsrKQoJewoJCXByaW50ZigiXG5hcmd2WyVkXT0lc1xuIixpLGFyZ3ZbaV0pOwoJfQoKCXVuc2lnbmVkIGludCAgZGRyX3R5cGU9MDsKCXVuc2lnbmVkIGludCAgZGRyX2NoYW5uZWxfcmFua19jb25maWc9MDsKCXVuc2lnbmVkIGludCAgbG9vcD0wOwoJY2hhciAqZW5kcDsKCWlmIChhcmdjPjEpCgl7CgkJZGRyX3R5cGUgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbMV0sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbMV0gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlkZHJfdHlwZT0wOwoJfQoJaWYgKGFyZ2M+MikKCXsKCQlkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZyA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWRkcl9jaGFubmVsX3JhbmtfY29uZmlnPTA7Cgl9CiAgICBpZiAoYXJnYz4zKQoJewoJCWxvb3AgPSBzaW1wbGVfc3RydG91bGxfZGRyKGFyZ3ZbM10sICZlbmRwLCAwKTsKCQlpZiAoKmFyZ3ZbM10gPT0gMCB8fCAqZW5kcCAhPSAwKQoJCQlsb29wPTA7Cgl9Cgl1bnNpZ25lZCBpbnQgIHRlbXBfcmVnX2FkZD0wOwoJewoJCXRlbXBfcmVnX2FkZD0oKERNQ19TVElDS1lfRzEyQV8wKSk7Cgl9CgoJY2hhciBzdHJbMTAyNF09IiI7CgkvLyB1bnNpZ25lZCBpbnQgIGRkcl90ZXN0X2NtZD0wOwoJLy8gdW5zaWduZWQgaW50ICB0ZW1wX3JlZ19hZGQ9MDsKCS8vIHVuc2lnbmVkIGludCAgbnVtX2FycnlbMzJdPXswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwoKCXVuc2lnbmVkIGludCBjb3VudGVyX2xvb3A9MDsKCXVuc2lnbmVkIGludCBkZHJfZnJlcXVlbmN5PTA7Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9wPTA7Ly83NCAgLy9jb25maWcgc29jIGRhdGEgcGluIHB1bGwgdXAgZHJpdmVyIHN0ZW5ndGgsc2VsZWN0IDAsMjgsMzAsMzIsMzQsMzcsNDAsNDMsNDgsNTMsNjAsNjgsODAsOTYsMTIwb2htCgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9uPTA7Ly83NgoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdF9vaG1fcD0wOy8vNzggIC8vY29uZmlnIHNvYyBkYXRhIHBpbiBvZHQgcHVsbCB1cCBzdGVuZ3RoLHNlbGVjdCAwLDI4LDMwLDMyLDM0LDM3LDQwLDQzLDQ4LDUzLDYwLDY4LDgwLDk2LDEyMG9obQoJdW5zaWduZWQgaW50IHNvY19kYXRhX29kdF9vaG1fbj0wOy8vODAKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfZHJ2X29obT0wOy8vODIgIC8vY29uZmlnIGRyYW0gZGF0YSBwaW4gcHVsbCB1cCBwdWxsIGRvd24gZHJpdmVyIHN0ZW5ndGgsZGRyMyBzZWxlY3QgMzQsNDBvaG0sZGRyNCBzZWxlY3QgMzQsNDhvaG0sbHBkZHI0IHNlbGVjdCA0MCw0OCw2MCw4MCwxMjAsMjQwb2htCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9vaG09MDsvLzg0ICAvL2NvbmZpZyBkcmFtIGRhdGEgcGluIG9kdCBwdWxsIHVwIGRvd24gc3Rlbmd0aCxkZHIzIHNlbGVjdCA0MCw2MCwxMjBvaG0sZGRyNCBzZWxlY3QgMzQsNDAsNDgsNjAsMTIwLDI0MG9obSxscGRkcjQgc2VsZWN0IDQwLDQ4LDYwLDgwLDEyMCwyNDBvaG0KCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfd3Jfb2R0X29obT0wOyAvLzE3NCBjaGFyIDEKCWk9NzQvMjsKCXNvY19kYXRhX2Rydl9vaG1fcD1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTc2LzI7Cglzb2NfZGF0YV9kcnZfb2htX249ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDE2LGkpOwoJaT03OC8yOwoJc29jX2RhdGFfb2R0X29obV9wPWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCwxNixpKTsKCWk9ODAvMjsKCXNvY19kYXRhX29kdF9vaG1fbj1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTgyLzI7CglkcmFtX2RhdGFfZHJ2X29obT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTg0LzI7CglkcmFtX2RhdGFfb2R0X29obT1kZHJfcmRfOF8xNmJpdF9vbl8zMnJlZyh0ZW1wX3JlZ19hZGQsMTYsaSk7CglpPTE3NC8xOwoJZHJhbV9kYXRhX3dyX29kdF9vaG09ZGRyX3JkXzhfMTZiaXRfb25fMzJyZWcodGVtcF9yZWdfYWRkLDgsaSk7CglpPTUyLzI7CglkZHJfZnJlcXVlbmN5PWRkcl9yZF84XzE2Yml0X29uXzMycmVnKHRlbXBfcmVnX2FkZCwxNixpKTsKCS8vZGRyX2ZyZXF1ZW5jeT1nbG9iYWxfZGRyX2NsazsKCWlmKGdsb2JhbF9ib290X3RpbWVzPT0xKQoJewoJCXByaW50ZigiXG5vcmdfZ2xvYmFsX2Jvb3RfdGltZXM9PSAlZCAlcyIsIGdsb2JhbF9ib290X3RpbWVzLHN0cmluZ19wcmludF9mbGFnKTsKCQkvL3ByaW50ZigiXG5tYXhfY291bnRlcj0lZCAgJWQgJXMiLG1heF9jb3VudGVyX3RvdGFsLG1heF9jb3VudGVyX3RvdGFsKjIsc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5zb2NfZGF0YV9kcnZfb2htX3A9JWQgJXMiLHNvY19kYXRhX2Rydl9vaG1fcCxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbnNvY19kYXRhX2Rydl9vaG1fbj0lZCAlcyIsc29jX2RhdGFfZHJ2X29obV9uLHN0cmluZ19wcmludF9mbGFnKTsKCQlwcmludGYoIlxuc29jX2RhdGFfb2R0X29obV9wPSVkICVzIixzb2NfZGF0YV9vZHRfb2htX3Asc3RyaW5nX3ByaW50X2ZsYWcpOwoJCXByaW50ZigiXG5zb2NfZGF0YV9vZHRfb2htX249JWQgJXMiLHNvY19kYXRhX29kdF9vaG1fbixzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbmRyYW1fZGF0YV9kcnZfb2htPSVkICVzIixkcmFtX2RhdGFfZHJ2X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbmRyYW1fZGF0YV9vZHRfb2htPSVkICVzIixkcmFtX2RhdGFfb2R0X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CgkJcHJpbnRmKCJcbmRyYW1fZGF0YV93cl9vZHRfb2htPSVkICVzIixkcmFtX2RhdGFfd3Jfb2R0X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7Cgl9Cgl1bnNpZ25lZCBpbnQgc29jX2RhdGFfZHJ2X29obV9wX3RbXT17MzQsNDAsNDgsNjB9OwkKCS8vIHVuc2lnbmVkIGludCBzb2NfZGF0YV9kcnZfb2htX25fdFtdPXszNCw0MCw0OCw2MH07CgoJdW5zaWduZWQgaW50IGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyM1tdPXs0MCw2MCwxMjB9OwkvL2RkcjMKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfb2R0X29obV90X2RkcjRbXT17NDAsNDgsNjAsMTIwfTsJLy9kZHI0Cgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjRbXT17NDAsNDgsNjAsMTIwfTsJLy9scGRkcjQKCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHIzW109ezM0LDQwfTsJLy9kZHIzCgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHI0W109ezM0LDQ4fTsJLy9kZHI0Cgl1bnNpZ25lZCBpbnQgZHJhbV9kYXRhX2Rydl9vaG1fdF9scGRkcjRbXT17NDAsNDgsNjB9OwkvL2xwZGRyNAoKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX3BfdFtdPXs0MCw0OCw2MCw4MCwxMjB9OwkKCXVuc2lnbmVkIGludCBzb2NfZGF0YV9vZHRfb2htX25fdFtdPXs0MCw0OCw2MCw4MCwxMjB9OwoKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjNbXT17NjAsMTIwLDB9OwkvL2RkcjMKCXVuc2lnbmVkIGludCBkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjRbXT17ODAsMTIwLDB9OwkvL2RkcjQKCgl1bnNpZ25lZCBpbnQgICpwX3NvY19kYXRhX2Rydl9vaG1fcD1OVUxMOwoJLy8gIHVuc2lnbmVkIGludCAgKnBfc29jX2RhdGFfZHJ2X29obV9uPU5VTEw7Cgl1bnNpZ25lZCBpbnQgICpwX3NvY19kYXRhX29kdF9vaG1fcD1OVUxMOwoJdW5zaWduZWQgaW50ICAqcF9zb2NfZGF0YV9vZHRfb2htX249TlVMTDsKCgoJdW5zaWduZWQgaW50ICAqcF9kcmFtX2RhdGFfZHJ2X29obT1OVUxMOwoJdW5zaWduZWQgaW50ICAqcF9kcmFtX2RhdGFfb2R0X29obT1OVUxMOwoJdW5zaWduZWQgaW50ICAqcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1OVUxMOwoKCXBfc29jX2RhdGFfZHJ2X29obV9wPXNvY19kYXRhX2Rydl9vaG1fcF90OwoJLy8gcF9zb2NfZGF0YV9kcnZfb2htX249c29jX2RhdGFfZHJ2X29obV9uX3Q7CglwX3NvY19kYXRhX29kdF9vaG1fcD1zb2NfZGF0YV9vZHRfb2htX3BfdDsKCXBfc29jX2RhdGFfb2R0X29obV9uPXNvY19kYXRhX29kdF9vaG1fbl90OwoKCglwX2RyYW1fZGF0YV9kcnZfb2htPWRyYW1fZGF0YV9kcnZfb2htX3RfZGRyMzsKCXBfZHJhbV9kYXRhX29kdF9vaG09ZHJhbV9kYXRhX29kdF9vaG1fdF9kZHIzOwoJcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1kcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjM7CgoJdW5zaWduZWQgaW50IG1heF9jb3VudGVyX2xvb3BfdzE9KHNpemVvZihzb2NfZGF0YV9kcnZfb2htX3BfdCkpLyhzaXplb2Yoc29jX2RhdGFfZHJ2X29obV9wX3RbMF0pKTsKCXVuc2lnbmVkIGludCBtYXhfY291bnRlcl9sb29wX3cyPShzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9kZHIzKSkvKHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2RkcjNbMF0pKTsKCXVuc2lnbmVkIGludCBtYXhfY291bnRlcl9sb29wX3IxPShzaXplb2YoZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHIzKSkvKHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2RkcjNbMF0pKTsKCXVuc2lnbmVkIGludCBtYXhfY291bnRlcl9sb29wX3IyPShzaXplb2Yoc29jX2RhdGFfb2R0X29obV9wX3QpKS8oc2l6ZW9mKHNvY19kYXRhX29kdF9vaG1fcF90WzBdKSk7Cgl1bnNpZ25lZCBpbnQgbWF4X2NvdW50ZXJfbG9vcF93cjE9MTsKCWlmKGRkcl9jaGFubmVsX3JhbmtfY29uZmlnKQoJewoJCW1heF9jb3VudGVyX2xvb3Bfd3IxPShzaXplb2YoZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHIzKSkvKHNpemVvZihkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjNbMF0pKTsKCX0KCS8vZGRyX2NoYW5uZWxfcmFua19jb25maWdDT05GSUdfRERSMF8zMkJJVF9SQU5LMDFfQ0gwCQoJaWYoZGRyX3R5cGU9PUFVVE9fU0NBTl9ERFI0KQoJewoJCXBfZHJhbV9kYXRhX2Rydl9vaG09ZHJhbV9kYXRhX2Rydl9vaG1fdF9kZHI0OwoJCXBfZHJhbV9kYXRhX29kdF9vaG09ZHJhbV9kYXRhX29kdF9vaG1fdF9kZHI0OwoJCXBfZHJhbV9kYXRhX3dyX29kdF9vaG09ZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHI0OwoJCW1heF9jb3VudGVyX2xvb3BfdzI9KHNpemVvZihkcmFtX2RhdGFfb2R0X29obV90X2RkcjQpKS8oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfZGRyNFswXSkpOwoJCW1heF9jb3VudGVyX2xvb3BfcjE9KHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2RkcjQpKS8oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfZGRyNFswXSkpOwoKCQlpZihkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZykKCQl7CgkJCW1heF9jb3VudGVyX2xvb3Bfd3IxPShzaXplb2YoZHJhbV9kYXRhX3dyX29kdF9vaG1fdF9kZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfd3Jfb2R0X29obV90X2RkcjRbMF0pKTsKCQl9Cgl9CglpZihkZHJfdHlwZT09QVVUT19TQ0FOX0xQRERSNCkKCXsKCQlwX2RyYW1fZGF0YV9kcnZfb2htPWRyYW1fZGF0YV9kcnZfb2htX3RfbHBkZHI0OwoJCXBfZHJhbV9kYXRhX29kdF9vaG09ZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjQ7CgkJLy8JcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1kcmFtX2RhdGFfd3Jfb2R0X29obV90X2xwZGRyNDsKCQltYXhfY291bnRlcl9sb29wX3cyPShzaXplb2YoZHJhbV9kYXRhX29kdF9vaG1fdF9scGRkcjQpKS8oc2l6ZW9mKGRyYW1fZGF0YV9vZHRfb2htX3RfbHBkZHI0WzBdKSk7CgkJbWF4X2NvdW50ZXJfbG9vcF9yMT0oc2l6ZW9mKGRyYW1fZGF0YV9kcnZfb2htX3RfbHBkZHI0KSkvKHNpemVvZihkcmFtX2RhdGFfZHJ2X29obV90X2xwZGRyNFswXSkpOwoJCW1heF9jb3VudGVyX2xvb3BfcjI9KHNpemVvZihzb2NfZGF0YV9vZHRfb2htX25fdCkpLyhzaXplb2Yoc29jX2RhdGFfb2R0X29obV9uX3RbMF0pKTsKCgkJLy8JdW5zaWduZWQgaW50ICAqcF9kcmFtX2RhdGFfd3Jfb2R0X29obT1kcmFtX2RhdGFfd3Jfb2R0X29obV90X2xwZGRyNDsKCQlpZihkZHJfY2hhbm5lbF9yYW5rX2NvbmZpZykKCQl7CgkJCW1heF9jb3VudGVyX2xvb3Bfd3IxPTE7CgkJfQoJfQoKICAgIHVuc2lnbmVkIGludCBtYXhfY291bnRlcl90b3RhbD0obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSptYXhfY291bnRlcl9sb29wX3dyMTsKCS8vYWRkIDIgdGltZXMgcmVjb3ZlciAKCS8qCglzd2l0Y2ggKGdsb2JhbF9ib290X3RpbWVzKQoJewkKCQljYXNlKDEpOgoJCXsKCQkJYnJlYWs7CgkJfQoJfQoJKi8KCS8vZWFjaCBhcnJhcnkgdGVzdCAyIHRpbWVzICxmb3IgbWF5YmUgMXRpbWVzIHdpbGwgZmFpbCx0aGVuIG5leHQgdGltZSB3aWxsIHJlY292ZXJ5IC8vamlheGluZyAyMDE4MTExNAoJY291bnRlcl9sb29wPSgoKGdsb2JhbF9ib290X3RpbWVzLTEpLzIpJW1heF9jb3VudGVyX3RvdGFsKTsKCWRyYW1fZGF0YV93cl9vZHRfb2htPTA7CglpZihtYXhfY291bnRlcl9sb29wX3dyMT4xKQoJewoJCWRyYW1fZGF0YV93cl9vZHRfb2htPXBfZHJhbV9kYXRhX3dyX29kdF9vaG1bKGNvdW50ZXJfbG9vcC8obWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSldOwoJfQoJaWYoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSk8KG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MikpCgl7CgkJc29jX2RhdGFfZHJ2X29obV9wPXBfc29jX2RhdGFfZHJ2X29obV9wWygoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSkpJW1heF9jb3VudGVyX2xvb3BfdzEpXTsKCQlzb2NfZGF0YV9kcnZfb2htX249c29jX2RhdGFfZHJ2X29obV9wOwoJCWRyYW1fZGF0YV9vZHRfb2htPXBfZHJhbV9kYXRhX29kdF9vaG1bICAoKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpKS9tYXhfY291bnRlcl9sb29wX3cxKV07Cgl9CgllbHNlIGlmKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpPT0oKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MikrMCkpCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfcmVzZXRfc3lzdGVtKCk7CgkJLy8Jc3ByaW50ZihzdHIsImcxMl9kMnBsbCAxMjAwICAweDExICAweDYgMCAweDAgMCAwIDAgMHg4MDAwMDAgICAgMCAxICAgIgoJCS8vCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkvLwlydW5fY29tbWFuZChzdHIsMCk7Cgl9CgllbHNlIGlmKChjb3VudGVyX2xvb3AlKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MittYXhfY291bnRlcl9sb29wX3IxKm1heF9jb3VudGVyX2xvb3BfcjIrMikpPChtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzItMSkpCgl7CgkJZHJhbV9kYXRhX2Rydl9vaG09cF9kcmFtX2RhdGFfZHJ2X29obVsoKCgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKSktKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MisxKSklbWF4X2NvdW50ZXJfbG9vcF9yMSldOwoJCXNvY19kYXRhX29kdF9vaG1fcD1wX3NvY19kYXRhX29kdF9vaG1fcFsoKCgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKSktKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MisxKSkvbWF4X2NvdW50ZXJfbG9vcF9yMSldOwoJCXNvY19kYXRhX29kdF9vaG1fbj0wOwoJCWlmKGRkcl90eXBlPT1DT05GSUdfRERSX1RZUEVfTFBERFI0KQoJCXsKCQkJc29jX2RhdGFfb2R0X29obV9wPTA7CgkJCXNvY19kYXRhX29kdF9vaG1fbj1wX3NvY19kYXRhX29kdF9vaG1fblsoKCgoY291bnRlcl9sb29wJShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzIpKSktKG1heF9jb3VudGVyX2xvb3BfdzEqbWF4X2NvdW50ZXJfbG9vcF93MisxKSkvbWF4X2NvdW50ZXJfbG9vcF9yMSldOwoJCX0KCX0KCWVsc2UgaWYoKGNvdW50ZXJfbG9vcCUobWF4X2NvdW50ZXJfbG9vcF93MSptYXhfY291bnRlcl9sb29wX3cyK21heF9jb3VudGVyX2xvb3BfcjEqbWF4X2NvdW50ZXJfbG9vcF9yMisyKSk9PShtYXhfY291bnRlcl9sb29wX3cxKm1heF9jb3VudGVyX2xvb3BfdzIrbWF4X2NvdW50ZXJfbG9vcF9yMSptYXhfY291bnRlcl9sb29wX3IyKzItMSkpCgl7CgkJZGRyX3Rlc3Rfd2F0Y2hkb2dfcmVzZXRfc3lzdGVtKCk7Cgl9CglwcmludGYoIlxuZ2xvYmFsX2Jvb3RfdGltZXM9PSAlZCAlcyIsIGdsb2JhbF9ib290X3RpbWVzLHN0cmluZ19wcmludF9mbGFnKTsKCWlmKGxvb3ApCgl7CgkJaWYoKChnbG9iYWxfYm9vdF90aW1lcy0xKS8yKT5tYXhfY291bnRlcl90b3RhbCkKCQkJcmV0dXJuIDE7Cgl9CglwcmludGYoIlxubWF4X2NvdW50ZXI9JWQgICVkICVzIixtYXhfY291bnRlcl90b3RhbCxtYXhfY291bnRlcl90b3RhbCoyLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5zb2NfZGF0YV9kcnZfb2htX3A9JWQgJXMiLHNvY19kYXRhX2Rydl9vaG1fcCxzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuc29jX2RhdGFfZHJ2X29obV9uPSVkICVzIixzb2NfZGF0YV9kcnZfb2htX24sc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbnNvY19kYXRhX29kdF9vaG1fcD0lZCAlcyIsc29jX2RhdGFfb2R0X29obV9wLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5zb2NfZGF0YV9vZHRfb2htX249JWQgJXMiLHNvY19kYXRhX29kdF9vaG1fbixzdHJpbmdfcHJpbnRfZmxhZyk7CglwcmludGYoIlxuZHJhbV9kYXRhX2Rydl9vaG09JWQgJXMiLGRyYW1fZGF0YV9kcnZfb2htLHN0cmluZ19wcmludF9mbGFnKTsKCXByaW50ZigiXG5kcmFtX2RhdGFfb2R0X29obT0lZCAlcyIsZHJhbV9kYXRhX29kdF9vaG0sc3RyaW5nX3ByaW50X2ZsYWcpOwoJcHJpbnRmKCJcbmRyYW1fZGF0YV93cl9vZHRfb2htPSVkICVzIixkcmFtX2RhdGFfd3Jfb2R0X29obSxzdHJpbmdfcHJpbnRfZmxhZyk7CnsKCWlmKHNvY19kYXRhX2Rydl9vaG1fcCkKCXsKCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MzYgMHgyMDE4MDAzMCAweDEgNzQgJWQgMiAgMCAgICIsCgkJc29jX2RhdGFfZHJ2X29obV9wKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJaWYoc29jX2RhdGFfZHJ2X29obV9uKQoJewoJCXNwcmludGYoc3RyLCJkZHJfdGVzdF9jbWQgMHgzNiAweDIwMTgwMDMwIDB4MSA3NiAlZCAyICAwICAgIiwKCQlzb2NfZGF0YV9kcnZfb2htX24pOwoJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQlydW5fY29tbWFuZChzdHIsMCk7Cgl9CglpZihzb2NfZGF0YV9vZHRfb2htX3ApCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDc4ICVkIDIgIDAgICAiLAoJCXNvY19kYXRhX29kdF9vaG1fcCk7CgkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCX0KCWlmKHNvY19kYXRhX29kdF9vaG1fbikKCXsKCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MzYgMHgyMDE4MDAzMCAweDEgODAgJWQgMiAgMCAgICIsCgkJc29jX2RhdGFfb2R0X29obV9uKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJaWYoZHJhbV9kYXRhX2Rydl9vaG0pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDgyICVkIDIgIDAgICAiLAoJCWRyYW1fZGF0YV9kcnZfb2htKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJaWYoZHJhbV9kYXRhX29kdF9vaG0pCgl7CgkJc3ByaW50ZihzdHIsImRkcl90ZXN0X2NtZCAweDM2IDB4MjAxODAwMzAgMHgxIDg0ICVkIDIgIDAgICAiLAoJCWRyYW1fZGF0YV9vZHRfb2htKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoJLy9pZihkcmFtX2RhdGFfd3Jfb2R0X29obSkKCXsKCQlzcHJpbnRmKHN0ciwiZGRyX3Rlc3RfY21kIDB4MzYgMHgyMDE4MDAzMCAweDEgMTc0ICVkIDEgIDAgICAiLAoJCWRyYW1fZGF0YV93cl9vZHRfb2htKTsKCQlwcmludGYoIlxuc3RyPSVzXG4iLHN0cik7CgkJcnVuX2NvbW1hbmQoc3RyLDApOwoJfQoKCXNwcmludGYoc3RyLCJnMTJfZDJwbGwgJWQgIDB4MTIgIDB4NiAwIDB4MCAwIDAgMCAweDgwMDAwMCAgICAwIDEgICAiLGRkcl9mcmVxdWVuY3kpOwoJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoJcnVuX2NvbW1hbmQoc3RyLDApOwp9CgpyZXR1cm4gMTsKfQoKaW50IGRvX2Rkcl9hdXRvX2Zhc3Rib290X2NoZWNrKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKewoJI2RlZmluZSBETUNfVEVTVF9TTFRfRU5BQkxFX0REUl9BVVRPX0ZBU1RfQk9PVCAoMTw8NSkKCSNkZWZpbmUgIEFVVE9fV0lORE9XX1RFU1RfRU5BQkxFX0lURU0gICAoKDE8PDEpfCgxPDwyKSkKCS8vCWludCBpPTA7CgkvLwlpbnQgY291bnQ9MDsKCWNoYXIgKmVuZHA7CgkvL3Vuc2lnbmVkIGludCBlbmFibGVfZGRyX2Zhc3RfYm9vdD0wOyAgLy8gMCBwYXVzZSAxLHJlc3VtZQoJY2hhciBhdXRvX3dpbmRvd190ZXN0X2VuYWJsZV9pdGVtPURNQ19URVNUX1NMVF9FTkFCTEVfRERSX0FVVE9fRkFTVF9CT09UOwoJdWludDMyX3QgYXV0b193aW5kb3dfdGVzdF9kcV9zaXplPTA7CgljaGFyIHBhdHRlcm5fZGlzX3NjcmFtYmxlPTA7Cgl1aW50MzJfdCBzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfdnJlZl9vZmZzZXRfdmFsdWU9MDsKCWlmIChhcmdjPjEpCgl7CgkJYXV0b193aW5kb3dfdGVzdF9lbmFibGVfaXRlbSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsxXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsxXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWF1dG9fd2luZG93X3Rlc3RfZW5hYmxlX2l0ZW09RE1DX1RFU1RfU0xUX0VOQUJMRV9ERFJfQVVUT19GQVNUX0JPT1Q7Cgl9CglpZiAoYXJnYz4yKQoJewoJCWF1dG9fd2luZG93X3Rlc3RfZHFfc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlsyXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlsyXSA9PSAwIHx8ICplbmRwICE9IDApCgkJCWF1dG9fd2luZG93X3Rlc3RfZHFfc2l6ZT0wOwoJfQoJaWYgKGFyZ2M+MykKCXsKCQlwYXR0ZXJuX2Rpc19zY3JhbWJsZSA9IHNpbXBsZV9zdHJ0b3VsbF9kZHIoYXJndlszXSwgJmVuZHAsIDApOwoJCWlmICgqYXJndlszXSA9PSAwIHx8ICplbmRwICE9IDApCgkJcGF0dGVybl9kaXNfc2NyYW1ibGU9MDsKCX0KCWlmIChhcmdjPjQpCgl7CgkJc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9yZWFkX3ZyZWZfb2Zmc2V0X3ZhbHVlID0gc2ltcGxlX3N0cnRvdWxsX2Rkcihhcmd2WzRdLCAmZW5kcCwgMCk7CgkJaWYgKCphcmd2WzRdID09IDAgfHwgKmVuZHAgIT0gMCkKCQlzdGlja19kbWNfZGRyX3dpbmRvd190ZXN0X3JlYWRfdnJlZl9vZmZzZXRfdmFsdWU9MDsKCX0KCWNoYXIgc3RyWzEwMjRdPSIiOwoJZGRyX3NldF90ICpkZHJfc2V0X3RfcD1OVUxMOwoJZGRyX3NldF90X3A9KGRkcl9zZXRfdCAqKShkZHJfc2V0X3RfcF9hcnJhcnkpOwoJLy9kZHJfc2V0X3RfcD0gKGRkcl9zZXRfdCAqKUcxMl9ETUNfU1RJQ0tZXzA7CgkvL2lmIChzaXplb2YoZGRyX3NldF90KTxsb29wX21heCkKCXVpbnQzMl90ICBkZHJfc2V0X2FkZD0wOwoJdWludDMyX3QgIGRkcl9zZXRfc2l6ZT0wOwoJZGRyX3NldF9hZGQ9KHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF90X3ApOwoJZGRyX3NldF9zaXplPXNpemVvZihkZHJfc2V0X3QpOwoJcHJpbnRmKCJcbmRkcl9zZXRfdF9wPT0weCUwOHhcbiIsZGRyX3NldF9hZGQpOwoJdWludDMyX3QgbG9vcD0wOyAKCXVpbnQzMl90IGxvb3BfbWF4ID0gKDQrKDB4M2Y8PDIpKTsvLygoRE1DX1NUSUNLWV82My1ETUNfU1RJQ0tZXzApKTsKCS8vCWxvb3BfbWF4PXNpemVvZihkZHJfc2V0X3QpOwoJZm9yIChsb29wID0gMDsgbG9vcCA8bG9vcF9tYXg7IGxvb3ArPTQpIHsKCQl3cl9yZWcoKCh1aW50NjRfdCkoZGRyX3NldF90X3ApICsgbG9vcCksIHJkX3JlZyhHMTJfRE1DX1NUSUNLWV8wICsgbG9vcCkpOwoJfQoKLy8JaWYoKGRkcl9zZXRfdF9wLT5zbHRfdGVzdF9mdW5jdGlvblswXSkmRE1DX1RFU1RfU0xUX0VOQUJMRV9ERFJfQVVUT19GQVNUX0JPT1QpCi8vCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKT49MHhmZSkKCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSkKCXsKCQlwcmludGYoIlxudWJvb3QgZW5hYmxlIGF1dG8gZmFzdCBib290IGZ1bmNpdG9uIFxuIik7Cgl9CgllbHNlCgkJcmV0dXJuIDEgOwoKCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKT09MHhmZikKCXsKCQlwcmludGYoIlxudWJvb3QgIGF1dG8gZmFzdCBib290ICBhdXRvIHdpbmRvdyB0ZXN0IGlzIGRvbmUgXG4iKTsKCQlyZXR1cm4gMSA7Cgl9CgoJcHJpbnRmKCJcbihkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKT09MHglMDh4XG4iLChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKSk7CnsKCQl1aW50MTZfdAlkcV9iaXRfZGVsYXlbNzJdOwoJCXVuc2lnbmVkCWNoYXIgdF9jb3VudD0wOwoJCXVpbnQxNl90ICBkZWxheV9vcmc9MDsKCQl1aW50MTZfdCAgZGVsYXlfdGVtcD0wOwoJCXVpbnQzMl90ICBhZGRfb2Zmc2V0PTA7CgkJZHdjX2RkcnBoeV9hcGJfd3IoMHhkMDAwMCwweDApOwoKCQl7CgkvLwlwcmludGYoIlxuIEFSZFB0ckluaXRWYWwiKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgwPDwxNil8KDA8PDEyKXwoMHgyZSkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQlkZHJfc2V0X3RfcC0+QVJkUHRySW5pdFZhbD1kZWxheV9vcmc7CgkvLwlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4IiwwLGRlbGF5X29yZywoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRlbGF5X29yZyk7CgoJLy8JcHJpbnRmKCJcbiBkZmltcmwwIGRmaW1ybDEgZGZpbXJsMiBkZmltcmwzIEh3dE1STCIpOwoJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweDIwKSk7CgkJZGVsYXlfb3JnPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWRkcl9zZXRfdF9wLT5kZmlfbXJsPWRlbGF5X29yZzsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDAsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDE8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDEsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDI8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDIsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDM8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLDMsZGVsYXlfb3JnLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfb3JnKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgyPDwxNil8KDA8PDEyKXwoMHgyMCkpOwoJCWRlbGF5X29yZz1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCgkJZGRyX3NldF90X3AtPmRmaV9od3Rtcmw9ZGVsYXlfb3JnOwoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV9vcmcsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkZWxheV9vcmcpOwoJCX0KCXsKCS8vCXByaW50ZigiXG4gY291bnRfaW5kZXggICAgIGRlbGF5X3ZhbHVlICAgICByZWdpc3Rlcl9hZGQgICAgIHJlZ2lzdGVyX3ZhbHVlIFxuICIpOwoJLy8JcHJpbnRmKCJcbiBhZGRyZXNzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAgLS1zdGVwPT0xLzMyVUkgLGJpdCA2IGlzIGNvYXJzZSAgLS1zdGVwPT0xVUkiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDEwO3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDA8PDE2KXwodF9jb3VudDw8MTIpfCgweDgwKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgkJCWRkcl9zZXRfdF9wLT5hY190cmFjZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiB0ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSAsYml0IDYtOSBpcyBjb2Fyc2UgIC0tc3RlcD09MVVJIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHhkMCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+d3JpdGVfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHJ4ZHFzIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAtLXN0ZXA9PTEvMzJVSSxubyBjb2Fyc2UiLHVpXzFfMzJfMTAwc3RlcCk7CgkJZm9yKHRfY291bnQ9MDt0X2NvdW50PDE2O3RfY291bnQrKykKCQl7CgkJCWFkZF9vZmZzZXQ9KCgwPDwyMCl8KDE8PDE2KXwoKCh0X2NvdW50JTgpPj4xKTw8MTIpfCgweDhjKyh0X2NvdW50LzgpKygodF9jb3VudCUyKTw8OCkpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgzMiooKChkZWxheV9vcmc+PjYpJjB4ZikrKChkZWxheV9vcmc+PjUpJjEpKSsoZGVsYXlfb3JnJjB4MWYpKTsKCQkJZGRyX3NldF90X3AtPnJlYWRfZHFzX2RlbGF5W3RfY291bnRdPWRlbGF5X3RlbXA7CgkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQl9Cgl9Cgl7CgkvLwlwcmludGYoIlxuIHdyaXRlIGRxX2JpdCBkZWxheSAqIDEvMzJVSXgxMDA9PSVkIHBzIGJpdDAtNCBmaW5lIHR1bmUgLS1zdGVwPT0xLzMyVUkgLGJpdCA2LTggaXMgY29hcnNlICAtLXN0ZXA9PTFVIix1aV8xXzMyXzEwMHN0ZXApOwoJCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCQl7CgkJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoMHhjMCsoKHRfY291bnQlOSk8PDgpKyh0X2NvdW50LzM2KSkpOwoJCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJCWRlbGF5X3RlbXA9KDMyKigoKGRlbGF5X29yZz4+NikmMHhmKSsoKGRlbGF5X29yZz4+NSkmMSkpKyhkZWxheV9vcmcmMHgxZikpOwoKCQkJCWRkcl9zZXRfdF9wLT53cml0ZV9kcV9iaXRfZGVsYXlbdF9jb3VudF09ZGVsYXlfdGVtcDsKCQkvLwkJcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsdF9jb3VudCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZHFfYml0X2RlbGF5W3RfY291bnRdKTsKCQkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByZWFkIGRxX2JpdCBkZWxheSAqIEJETFJ4MTAwPT0lZCBwcyBiaXQwLTQgZmluZSB0dW5lIC0tc3RlcD09YmRsciBzdGVwIHNpemUgYWJvdXQgNXBzLG5vIGNvYXJzZSIsYmRscl8xMDBzdGVwKTsKCQlmb3IodF9jb3VudD0wO3RfY291bnQ8NzI7dF9jb3VudCsrKQoJCXsKCQkJYWRkX29mZnNldD0oKDA8PDIwKXwoMTw8MTYpfCgoKHRfY291bnQlMzYpLzkpPDwxMil8KDB4NjgrKCh0X2NvdW50JTkpPDw4KSsodF9jb3VudC8zNikpKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgoZGVsYXlfb3JnJjB4M2YpKTsKCgkJCWRkcl9zZXRfdF9wLT5yZWFkX2RxX2JpdF9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJCS8vCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJfQoJewoJLy8JcHJpbnRmKCJcbiByZWFkIGRxcyBnYXRlIGRlbGF5ICogMS8zMlVJeDEwMD09JWQgcHMgYml0MC00IGZpbmUgdHVuZSAsYml0IDYtMTAgaXMgY29hcnNlIix1aV8xXzMyXzEwMHN0ZXApOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwxNjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCU4KT4+MSk8PDEyKXwoMHg4MCsodF9jb3VudC84KSsoKHRfY291bnQlMik8PDgpKSk7CgkJCWRxX2JpdF9kZWxheVt0X2NvdW50XT1kd2NfZGRycGh5X2FwYl9yZChhZGRfb2Zmc2V0KTsKCQkJZGVsYXlfb3JnPWRxX2JpdF9kZWxheVt0X2NvdW50XTsKCQkJZGVsYXlfdGVtcD0oMzIqKCgoZGVsYXlfb3JnPj42KSYweGYpKygoZGVsYXlfb3JnPj41KSYxKSkrKGRlbGF5X29yZyYweDFmKSk7CgoJCQlkZHJfc2V0X3RfcC0+cmVhZF9kcXNfZ2F0ZV9kZWxheVt0X2NvdW50XT1kZWxheV90ZW1wOwoJLy8JCXByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoKCS8vCXByaW50ZigiXG4gc29jIHZyZWYgOiBscGRkcjQtLSBWUkVGID0gVkREUSooMC4wNDcgKyBWcmVmREFDMFs2OjBdKjAuMDAzNjcgICBERFI0IC0tVlJFRiA9IFZERFEqKDAuNTEwICsgVnJlZkRBQzBbNjowXSowLjAwMzQ1Iik7CgkJLy8oKDA8PDIwKXwoMTw8MTYpfCgoKG92ZXJfcmlkZV9zdWJfaW5kZXglMzYpLzkpPDwxMil8KCgob3Zlcl9yaWRlX3N1Yl9pbmRleCUzNiklOSk8PDgpfCgweDQwKSxvdmVyX3JpZGVfdmFsdWUpCQoJCXVpbnQzMl90IHZyZWZfdF9jb3VudD0wOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDw3Mjt0X2NvdW50KyspCgkJewoJCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KCgodF9jb3VudCUzNikvOSk8PDEyKXwoKCh0X2NvdW50JTM2KSU5KTw8OCl8KDB4NDApKTsKCQkJZHFfYml0X2RlbGF5W3RfY291bnRdPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCQlkZWxheV9vcmc9ZHFfYml0X2RlbGF5W3RfY291bnRdOwoJCQlkZWxheV90ZW1wPSgoZGVsYXlfb3JnKSk7CgoJCQlpZih0X2NvdW50PDM1KQoJCQl7CgkJCQkJCXZyZWZfdF9jb3VudD0oKCgodF9jb3VudCUzNikvOSkqOCkrKHRfY291bnQlOSkpOwoKCQkJCQkJZGRyX3NldF90X3AtPnNvY19iaXRfdnJlZlt2cmVmX3RfY291bnRdPWRlbGF5X3RlbXA7CgkJCX0KCS8vCQlwcmludGYoIlxuIHRfY291bnQ6ICUwNGQgJTA0ZCAgJTA4eCAlMDh4Iix0X2NvdW50LGRlbGF5X3RlbXAsKCgoKGFkZF9vZmZzZXQpIDw8IDEpKzB4ZmUwMDAwMDApKSxkcV9iaXRfZGVsYXlbdF9jb3VudF0pOwoJCX0KCgkJLy8JcHJpbnRmKCJcbiBkcmFtIHZyZWYgOiBscGRkcjQtLSBWUkVGID0gVkREUSooMC4gKyBWcmVmREFDMFs2OjBdKjAuICAgRERSNCAtLVZSRUYgPSBWRERRKigwLiArIFZyZWZEQUMwWzY6MF0qMC4iKTsKCQlhZGRfb2Zmc2V0PSgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwODIpKTsKCQlkZWxheV90ZW1wPWR3Y19kZHJwaHlfYXBiX3JkKGFkZF9vZmZzZXQpOwoJCWZvcih0X2NvdW50PTA7dF9jb3VudDwzMjt0X2NvdW50KyspCgkJewoJCQlkZHJfc2V0X3RfcC0+ZHJhbV9iaXRfdnJlZlt0X2NvdW50XT1kZWxheV90ZW1wOwoJCQkvL3ByaW50ZigiXG4gdF9jb3VudDogJTA0ZCAlMDRkICAlMDh4ICUwOHgiLHRfY291bnQsZGVsYXlfdGVtcCwoKCgoYWRkX29mZnNldCkgPDwgMSkrMHhmZTAwMDAwMCkpLGRxX2JpdF9kZWxheVt0X2NvdW50XSk7CgkJfQoJLy8JcHJpbnRmKCJcbiB0X2NvdW50OiAlMDRkICUwNGQgICUwOHggJTA4eCIsMCxkZWxheV90ZW1wLCgoKChhZGRfb2Zmc2V0KSA8PCAxKSsweGZlMDAwMDAwKSksZGVsYXlfdGVtcCk7Cgl9Cglmb3IodF9jb3VudD0wO3RfY291bnQ8NDt0X2NvdW50KyspCgl7CS8vcF9kZXYtPnBfZGRycy0+dGRxczJkcT1scGRkcjRfdGRxczJkcTsKCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzBdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFhKSk7ICAvL1BwdEN0bFN0YXRpYwoJCS8vZGRyX3NldF90X3AtPnJldHJhaW5pbmdbMV09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4YWUpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazAKCQkvL2Rkcl9zZXRfdF9wLT5yZXRyYWluaW5nWzJdPWR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwoMDw8MTIpfCgweGFmKSk7ICAvL1BwdERxc0NudEludlRyblRnMCAgcHMwIHJhbmsxCgkJZGRyX3NldF90X3AtPnJldHJhaW5pbmdbNCp0X2NvdW50KzBdPShkd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KHRfY291bnQ8PDEyKXwoMHhhYSkpKSYweGZmOyAgLy9QcHRDdGxTdGF0aWMKCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMV09KGR3Y19kZHJwaHlfYXBiX3JkKCgwPDwyMCl8KDE8PDE2KXwodF9jb3VudDw8MTIpfCgweGFhKSkpPj44OyAgLy9QcHRDdGxTdGF0aWMKCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrMl09ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWUpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazAgbGFuZSAwLTMKCQlkZHJfc2V0X3RfcC0+cmV0cmFpbmluZ1s0KnRfY291bnQrM109ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCh0X2NvdW50PDwxMil8KDB4YWYpKTsgIC8vUHB0RHFzQ250SW52VHJuVGcwICBwczAgcmFuazEgbGFuZSAwLTMKCX0KfQoKCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKTwweGZlKQoJewoJCXByaW50ZigiXG51Ym9vdCAgYXV0byBmYXN0IGJvb3QgIGF1dG8gd2luZG93IHRlc3QgYmVnaW4gXG4iKTsKCQl7CgkJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF09MHhmZTsKCQkJI2lmIDEKCQkJcHJpbnRmKCImZGRyX3NoYS5kZHJzIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5kZHJzKTsKCQkJcHJpbnRmKCImZGRyX3NoYS5zaGEyIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5zaGEyKTsKCQkJcHJpbnRmKCJkZHJfc2V0X2FkZCA6IDB4JXhcbiIsICh1aW50MzJfdCkodWludDY0X3QpZGRyX3NldF9hZGQpOwoKCQkJc2hhMjU2X2NzdW1fd2QoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJCQkvL3NoYTIoKHVuc2lnbmVkIGNoYXIgKikodWludDY0X3QpZGRyX3NldF9hZGQsIHNpemVvZihkZHJfc2V0X3QpLCBkZHJfc2hhLnNoYTIsIDApOwoJCQlwcmludGYoInByaW50IHNoYVxuIik7CgkJCXNwcmludGYoc3RyLCJtZCAlMDh4IDB4MTAwIiwgKHVpbnQzMl90KSh1aW50NjRfdCkoZGRyX3NldF9hZGQtMzIpKTsKCQkJcnVuX2NvbW1hbmQoc3RyLDApOwoJCQkjZW5kaWYKCgkJCXsKCQkJCSNpZmRlZiBVU0VfRk9SX1VCT09UXzIwMTgKCQkJCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sZGRyX3NldF9zaXplK1NIQTI1Nl9TVU1fTEVOKTsKCQkJCSNlbHNlCgkJCQlzcHJpbnRmKHN0ciwic3RvcmUgZGRyX3BhcmFtZXRlciB3cml0ZSAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sZGRyX3NldF9zaXplK1NIQTI1Nl9TVU1fTEVOKTsKCQkJCSNlbmRpZgoJCQkJCQkvLwkJc3ByaW50ZihzdHIsInN0b3JlIGRkcl9wYXJhbWV0ZXIgd3JpdGUgMHglMDh4IDB4JTA4eCAiLGRkcl9zZXRfYWRkLGRkcl9zZXRfc2l6ZSk7CgkJCQkJCS8vCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQsZGRyX3NldF9zaXplKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJfQoJCQlzcHJpbnRmKHN0ciwiZzEyX2QycGxsICVkIDB4MTEgJWQgMCAwIDAgMCAlZCAweCUwOHggIDAgJWQiLGRkcl9zZXRfdF9wLT5EUkFNRnJlcVswXSwKCQkJCWF1dG9fd2luZG93X3Rlc3RfZW5hYmxlX2l0ZW0sc3RpY2tfZG1jX2Rkcl93aW5kb3dfdGVzdF9yZWFkX3ZyZWZfb2Zmc2V0X3ZhbHVlLGF1dG9fd2luZG93X3Rlc3RfZHFfc2l6ZSxwYXR0ZXJuX2Rpc19zY3JhbWJsZSk7CgkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCgkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQl9CgkJcmV0dXJuIDEgOwoJfQoKCWlmKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzBdKT09MHhmZSkKCXsKCQljaGFyIGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD0wOwoJCWNoYXIgZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTA7CgoJCXsKCQkJZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMHhkPDwxNil8KDA8PDEyKXwoMHgwKSwwKTsgLy8gRFdDX0REUlBIWUFfQVBCT05MWTBfTWljcm9Db250TXV4U2VsCgoJCQlkbWNfdGVzdF93b3JzdF93aW5kb3dfdHg9ZHdjX2RkcnBoeV9hcGJfcmQoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MGMyKSk7CgkJCWRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD1kd2NfZGRycGh5X2FwYl9yZCgoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgwYzMpKTsKCQkJcHJpbnRmKCJcbmRtY190ZXN0X3dvcnN0X3dpbmRvd190eCA9JWQgXG4iLGRtY190ZXN0X3dvcnN0X3dpbmRvd190eCk7CgkJCXByaW50ZigiXG5kbWNfdGVzdF93b3JzdF93aW5kb3dfcng9JWQgXG4iLGRtY190ZXN0X3dvcnN0X3dpbmRvd19yeCk7CgkJCWlmKGRtY190ZXN0X3dvcnN0X3dpbmRvd190eD4zMCkKCQkJZG1jX3Rlc3Rfd29yc3Rfd2luZG93X3R4PTMwOwoJCQlpZihkbWNfdGVzdF93b3JzdF93aW5kb3dfcng+MzApCgkJCWRtY190ZXN0X3dvcnN0X3dpbmRvd19yeD0zMDsKCQkJLy8JZHdjX2RkcnBoeV9hcGJfd3IoKDA8PDIwKXwoMTw8MTYpfCgwPDwxMil8KDB4MWMyKSx0NF93cml0ZV93b3JzdF9tYXJnaW5fcmFuazEpOwoJCQkvLwlkd2NfZGRycGh5X2FwYl93cigoMDw8MjApfCgxPDwxNil8KDA8PDEyKXwoMHgxYzMpLHQ0X3JlYWRfd29yc3RfbWFyZ2luX3JhbmsxKTsKCQkJZGRyX3NldF90X3AtPmZhc3RfYm9vdFsxXT0oKChkbWNfdGVzdF93b3JzdF93aW5kb3dfdHgvMik8PDQpKXwoKChkbWNfdGVzdF93b3JzdF93aW5kb3dfcngvMikpKTsKCQl9CgoJCWRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMF09MHhmZjsKCQl7CgkJCXByaW50ZigiXG51Ym9vdCAgYXV0byBmYXN0IGJvb3QgIGF1dG8gd2luZG93IHRlc3QgZmluaXNoIFxuIik7CgoJCQlpZihkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKQoJCQl7CgkJCQlpZigoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg3KQoJCQkJewoJCQkJCWlmKCgoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg4KSkKCQkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMyAweDAgIDAgMCAxICVkICIsKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4Nyk7CgkJCQkJZWxzZQoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAzIDB4MCAgMCAwIDIgJWQgIiwoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg3KTsKCgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQl9CgkJCQlpZigoZGRyX3NldF90X3AtPmZhc3RfYm9vdFsyXSkmMHg3MCkKCQkJCXsKCQkJCQlpZigoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pJjB4ODApKQoJCQkJCQlzcHJpbnRmKHN0ciwiZGRyX2cxMl9vZmZzZXRfZGF0YSAyIDB4MCAgMCAwIDEgJWQgIiwoKGRkcl9zZXRfdF9wLT5mYXN0X2Jvb3RbMl0pPj40KSYweDcpOwoJCQkJCWVsc2UKCQkJCQkJc3ByaW50ZihzdHIsImRkcl9nMTJfb2Zmc2V0X2RhdGEgMiAweDAgIDAgMCAyICVkICIsKChkZHJfc2V0X3RfcC0+ZmFzdF9ib290WzJdKT4+NCkmMHg3KTsKCgkJCQkJcHJpbnRmKCJcbnN0cj0lc1xuIixzdHIpOwoKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQl9CgoJCQkJc3ByaW50ZihzdHIsImRkcl9mYXN0X2Jvb3QgMSAiKTsKCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCXJ1bl9jb21tYW5kKHN0ciwwKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCSNpZiAxCgkJCQlwcmludGYoIiZkZHJfc2hhLmRkcnMgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KSZkZHJfc2hhLmRkcnMpOwoJCQkJcHJpbnRmKCImZGRyX3NoYS5zaGEyIDogMHgleFxuIiwgKHVpbnQzMl90KSh1aW50NjRfdCkmZGRyX3NoYS5zaGEyKTsKCQkJCXByaW50ZigiZGRyX3NldF9hZGQgOiAweCV4XG4iLCAodWludDMyX3QpKHVpbnQ2NF90KWRkcl9zZXRfYWRkKTsKCgkJCQlzaGEyNTZfY3N1bV93ZCgodW5zaWduZWQgY2hhciAqKSh1aW50NjRfdClkZHJfc2V0X2FkZCwgc2l6ZW9mKGRkcl9zZXRfdCksIGRkcl9zaGEuc2hhMiwgMCk7CgkJCQlwcmludGYoInByaW50IHNoYVxuIik7CgkJCQlzcHJpbnRmKHN0ciwibWQgJTA4eCAweDEwMCIsICh1aW50MzJfdCkodWludDY0X3QpKGRkcl9zZXRfYWRkLTMyKSk7CgkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQkjZW5kaWYKCgkJCQl7CgkJCQkJI2lmZGVmIFVTRV9GT1JfVUJPT1RfMjAxOAoJCQkJCXNwcmludGYoc3RyLCJzdG9yZSByc3Ygd3JpdGUgZGRyLXBhcmFtZXRlciAweCUwOHggMHglMDh4ICIsZGRyX3NldF9hZGQtU0hBMjU2X1NVTV9MRU4sZGRyX3NldF9zaXplK1NIQTI1Nl9TVU1fTEVOKTsKCQkJCQkjZWxzZQoJCQkJCXNwcmludGYoc3RyLCJzdG9yZSBkZHJfcGFyYW1ldGVyIHdyaXRlIDB4JTA4eCAweCUwOHggIixkZHJfc2V0X2FkZC1TSEEyNTZfU1VNX0xFTixkZHJfc2V0X3NpemUrU0hBMjU2X1NVTV9MRU4pOwoJCQkJCSNlbmRpZgoJCQkJCXByaW50ZigiXG5zdHI9JXNcbiIsc3RyKTsKCQkJCQlydW5fY29tbWFuZChzdHIsMCk7CgkJCQl9CgoJCQl9CgkJCXJldHVybiAxOwoJCX0KCX0KCglyZXR1cm4gMTsKfQpVX0JPT1RfQ01EKAoJZGRyX2F1dG9fc2Nhbl9kcnYsCTMwLAkxLAlkb19kZHJfYXV0b19zY2FuX2RydiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfdGVzdF9jbWQgY21kIGFyZzEgYXJnMiBhcmczLi4uIFxuIGRjYWNoZSBvZmYgPyBcbiIKCSk7ClVfQk9PVF9DTUQoCglkZHJfZmFzdF9ib290LAkzMCwJMSwJZG9fZGRyX2Zhc3Rib290X2NvbmZpZywKCSJkZHJfZmFzdGJvb3RfY29uZmlnIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiIsCgkiZGRyX2Zhc3Rib290X2NvbmZpZyBjbWQgYXJnMSBhcmcyIGFyZzMuLi4gXG4gZGNhY2hlIG9mZiA/IFxuIgoJKTsKVV9CT09UX0NNRCgKCWRkcl9hdXRvX2Zhc3RfYm9vdF9jaGVjaywJMzAsCTEsCWRvX2Rkcl9hdXRvX2Zhc3Rib290X2NoZWNrLAoJImRkcl9mYXN0Ym9vdF9jb25maWcgY21kIGFyZzEgYXJnMiBhcmczLi4uIiwKCSJkZHJfZmFzdGJvb3RfY29uZmlnIGNtZCBhcmcxIGFyZzIgYXJnMy4uLiBcbiBkY2FjaGUgb2ZmID8gXG4iCgkpOwoK