ZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3NjNTIwL01ha2VmaWxlIGIvY3B1L2kzODYvc2M1MjAvTWFrZWZpbGUKaW5kZXggZGRmZWMyMy4uODc4MzViMiAxMDA2NDQKLS0tIGEvY3B1L2kzODYvc2M1MjAvTWFrZWZpbGUKKysrIGIvY3B1L2kzODYvc2M1MjAvTWFrZWZpbGUKQEAgLTMyLDYgKzMyLDEwIEBACiBMSUIJOj0gJChvYmopbGliJChTT0MpLmEKIAogQ09CSlMtJChDT05GSUdfU1lTX1NDNTIwKSArPSBzYzUyMC5vCitDT0JKUy0kKENPTkZJR19TWVNfU0M1MjBfU1NJKSArPSBzYzUyMF9zc2kubworQ09CSlMtJChDT05GSUdfU1lTX1NDNTIwX1RJTUVSKSArPSBzYzUyMF90aW1lci5vCitDT0JKUy0kKENPTkZJR19QQ0kpICs9IHNjNTIwX3BjaS5vCisKIFNPQkpTLSQoQ09ORklHX1NZU19TQzUyMCkgKz0gc2M1MjBfYXNtLm8KIAogU1JDUwk6PSAkKFNPQkpTLXk6Lm89LlMpICQoQ09CSlMteToubz0uYykKZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3NjNTIwL3NjNTIwLmMgYi9jcHUvaTM4Ni9zYzUyMC9zYzUyMC5jCmluZGV4IDJhYzNmZDQuLmFlM2I1MDAgMTAwNjQ0Ci0tLSBhL2NwdS9pMzg2L3NjNTIwL3NjNTIwLmMKKysrIGIvY3B1L2kzODYvc2M1MjAvc2M1MjAuYwpAQCAtMjQsMTUgKzI0LDggQEAKIC8qIHN0dWZmIHNwZWNpZmljIGZvciB0aGUgc2M1MjAsCiAgKiBidXQgaWRlcGVuZGVudCBvZiBpbXBsZW1lbnRhdGlvbiAqLwogCi0jaW5jbHVkZSA8Y29uZmlnLmg+CiAjaW5jbHVkZSA8Y29tbW9uLmg+Ci0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jaW5jbHVkZSA8cGNpLmg+Ci0jaWZkZWYgQ09ORklHX1NZU19TQzUyMF9TU0kKLSNpbmNsdWRlIDxhc20vaWMvc3NpLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CiAKIERFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwpAQCAtNTAsMTMgKzQzLDYgQEAKICAqCiAgKiB2b2lkIGluaXRfc2M1MjAodm9pZCkKICAqIHVuc2lnbmVkIGxvbmcgaW5pdF9zYzUyMF9kcmFtKHZvaWQpCi0gKiB2b2lkIHBjaV9zYzUyMF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKLSAqCi0gKiB2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCi0gKiB1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKLSAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCi0gKiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCi0gKgogICovCiAKIHN0YXRpYyB1MzIgbW1jcl9iYXNlPSAweGZmZmVmMDAwOwpAQCAtMjQxLDI2OSArMjI3LDYgQEAKIAlyZXR1cm4gZHJhbV9wcmVzZW50OwogfQogCi0KLSNpZmRlZiBDT05GSUdfUENJCi0KLQotc3RhdGljIHN0cnVjdCB7Ci0JdTggcHJpb3JpdHk7Ci0JdTE2IGxldmVsX3JlZzsKLQl1OCBsZXZlbF9iaXQ7Ci19IHNjNTIwX2lycVtdID0gewotCXsgU0M1MjBfSVJRMCwgIFNDNTIwX01QSUNNT0RFLCAgMHgwMSB9LAotCXsgU0M1MjBfSVJRMSwgIFNDNTIwX01QSUNNT0RFLCAgMHgwMiB9LAotCXsgU0M1MjBfSVJRMiwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDIgfSwKLQl7IFNDNTIwX0lSUTMsICBTQzUyMF9NUElDTU9ERSwgIDB4MDggfSwKLQl7IFNDNTIwX0lSUTQsICBTQzUyMF9NUElDTU9ERSwgIDB4MTAgfSwKLQl7IFNDNTIwX0lSUTUsICBTQzUyMF9NUElDTU9ERSwgIDB4MjAgfSwKLQl7IFNDNTIwX0lSUTYsICBTQzUyMF9NUElDTU9ERSwgIDB4NDAgfSwKLQl7IFNDNTIwX0lSUTcsICBTQzUyMF9NUElDTU9ERSwgIDB4ODAgfSwKLQotCXsgU0M1MjBfSVJROCwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDEgfSwKLQl7IFNDNTIwX0lSUTksICBTQzUyMF9TTDFQSUNNT0RFLCAweDAyIH0sCi0JeyBTQzUyMF9JUlExMCwgU0M1MjBfU0wxUElDTU9ERSwgMHgwNCB9LAotCXsgU0M1MjBfSVJRMTEsIFNDNTIwX1NMMVBJQ01PREUsIDB4MDggfSwKLQl7IFNDNTIwX0lSUTEyLCBTQzUyMF9TTDFQSUNNT0RFLCAweDEwIH0sCi0JeyBTQzUyMF9JUlExMywgU0M1MjBfU0wxUElDTU9ERSwgMHgyMCB9LAotCXsgU0M1MjBfSVJRMTQsIFNDNTIwX1NMMVBJQ01PREUsIDB4NDAgfSwKLQl7IFNDNTIwX0lSUTE1LCBTQzUyMF9TTDFQSUNNT0RFLCAweDgwIH0KLX07Ci0KLQotLyogVGhlIGludGVycnVwdCB1c2VkIGZvciBQQ0kgSU5UQS1JTlREICAqLwotaW50IHNjNTIwX3BjaV9pbnRzWzE1XSA9IHsKLQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0JCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCi19OwotCi0vKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBhIHBjaSBpbnRlcnJ1cHQgKi8KLWludCBwY2lfc2M1MjBfc2V0X2lycShpbnQgcGNpX3BpbiwgaW50IGlycSkKLXsKLQlpbnQgaTsKLQotIyBpZiAxCi0JcHJpbnRmKCJzZXRfaXJxKCk6IG1hcCBJTlQlYyB0byBJUlElZFxuIiwgcGNpX3BpbiArICdBJywgaXJxKTsKLSNlbmRpZgotCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7Ci0JCXJldHVybiAtMTsgLyogaWxsZWdhbCBpcnEgKi8KLQl9Ci0KLQlpZiAocGNpX3BpbiA8IDAgfHwgcGNpX3BpbiA+IDE1KSB7Ci0JCXJldHVybiAtMTsgLyogaWxsZWdhbCBwY2kgaW50IHBpbiAqLwotCX0KLQotCS8qIGZpcnN0IGRpc2FibGUgYW55IG5vbi1wY2kgaW50ZXJydXB0IHNvdXJjZSB0aGF0IHVzZQotCSAqIHRoaXMgbGV2ZWwgKi8KLQlmb3IgKGk9U0M1MjBfR1BUTVIwTUFQO2k8PVNDNTIwX0dQMTBJTUFQO2krKykgewotCQlpZiAoaT49U0M1MjBfUENJSU5UQU1BUCYmaTw9U0M1MjBfUENJSU5URE1BUCkgewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHJlYWRfbW1jcl9ieXRlKGkpID09IHNjNTIwX2lycVtpcnFdLnByaW9yaXR5KSB7Ci0JCQl3cml0ZV9tbWNyX2J5dGUoaSwgU0M1MjBfSVJRX0RJU0FCTEVEKTsKLQkJfQotCX0KLQotCS8qIFNldCB0aGUgdHJpZ2dlciB0byBsZXZlbCAqLwotCXdyaXRlX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcsCi0JCQlyZWFkX21tY3JfYnl0ZShzYzUyMF9pcnFbaXJxXS5sZXZlbF9yZWcpIHwgc2M1MjBfaXJxW2lycV0ubGV2ZWxfYml0KTsKLQotCi0JaWYgKHBjaV9waW4gPCA0KSB7Ci0JCS8qIFBDSSBJTlRBLUlOVEQgKi8KLQkJLyogcm91dGUgdGhlIGludGVycnVwdCAqLwotCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUENJSU5UQU1BUCArIHBjaV9waW4sIHNjNTIwX2lycVtpcnFdLnByaW9yaXR5KTsKLQotCi0JfSBlbHNlIHsKLQkJLyogR1BJUlEwLUdQSVJRMTAgdXNlZCBmb3IgYWRkaXRpb25hbCBQQ0kgSU5UUyAqLwotCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AwSU1BUCArIHBjaV9waW4gLSA0LCBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSk7Ci0KLQkJLyogYWxzbyBzZXQgdGhlIHBvbGFyaXR5IGluIHRoaXMgY2FzZSAqLwotCQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfSU5UUElOUE9MLAotCQkJCXJlYWRfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCkgfCAoMSA8PCAocGNpX3Bpbi00KSkpOwotCi0JfQotCi0JLyogcmVnaXN0ZXIgdGhlIHBpbiAqLwotCXNjNTIwX3BjaV9pbnRzW3BjaV9waW5dID0gaXJxOwotCi0KLQlyZXR1cm4gMDsgLyogT0sgKi8KLX0KLQotdm9pZCBwY2lfc2M1MjBfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCi17Ci0JaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOwotCWhvc2UtPmxhc3RfYnVzbm8gPSAweGZmOwotCi0JLyogU3lzdGVtIG1lbW9yeSBzcGFjZSAqLwotCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyAwLAotCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9CVVMsCi0JCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX1BIWVMsCi0JCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX1NJWkUsCi0JCSAgICAgICBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fU1lTX01FTU9SWSk7Ci0KLQkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCi0JcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCi0JCSAgICAgICBTQzUyMF9QQ0lfTUVNX0JVUywKLQkJICAgICAgIFNDNTIwX1BDSV9NRU1fUEhZUywKLQkJICAgICAgIFNDNTIwX1BDSV9NRU1fU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKLQotCS8qIElTQS9QQ0kgbWVtb3J5IHNwYWNlICovCi0JcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCi0JCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKLQkJICAgICAgIFNDNTIwX0lTQV9NRU1fUEhZUywKLQkJICAgICAgIFNDNTIwX0lTQV9NRU1fU0laRSwKLQkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKLQotCS8qIFBDSSBJL08gc3BhY2UgKi8KLQlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKLQkJICAgICAgIFNDNTIwX1BDSV9JT19CVVMsCi0JCSAgICAgICBTQzUyMF9QQ0lfSU9fUEhZUywKLQkJICAgICAgIFNDNTIwX1BDSV9JT19TSVpFLAotCQkgICAgICAgUENJX1JFR0lPTl9JTyk7Ci0KLQkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLwotCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyA0LAotCQkgICAgICAgU0M1MjBfSVNBX0lPX0JVUywKLQkJICAgICAgIFNDNTIwX0lTQV9JT19QSFlTLAotCQkgICAgICAgU0M1MjBfSVNBX0lPX1NJWkUsCi0JCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKLQotCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDU7Ci0KLQlwY2lfc2V0dXBfdHlwZTEoaG9zZSwKLQkJCVNDNTIwX1JFR19BRERSLAotCQkJU0M1MjBfUkVHX0RBVEEpOwotCi0JcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7Ci0KLQlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKLQotCS8qIGVuYWJsZSB0YXJnZXQgbWVtb3J5IGFjY2VzZXMgb24gaG9zdCBicmlnZSAqLwotCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwKLQkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUik7Ci0KLX0KLQotCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfVElNRVIKLQotCi12b2lkIHJlc2V0X3RpbWVyKHZvaWQpCi17Ci0Jd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgMCk7Ci0Jd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKLQotfQotCi11bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKLXsKLQkvKiBmaXhtZTogMzAgb3IgMzMgKi8KLQlyZXR1cm4JcmVhZF9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05UKSAvIDMzOwotfQotCi12b2lkIHNldF90aW1lcih1bG9uZyB0KQotewotCS8qIEZpeE1lOiB1c2UgdHdvIGNhc2NhZGUgY291cGxlZCB0aW1lcnMgKi8KLQl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDQwMDEpOwotCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQsIHQqMzMpOwotCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NjAwMSk7Ci19Ci0KLQotdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQotewotCWludCBtPTA7Ci0JbG9uZyB1OwotCi0JcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUxMSSk7Ci0JcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUNSTyk7Ci0KLSNpZiAwCi0JLyogZG8gbm90IGVuYWJsZSB0aGlzIGxpbmUsIHVkZWxheSBpcyB1c2VkIGluIHRoZSBzZXJpYWwgZHJpdmVyIC0+IHJlY3Vyc2lvbiAqLwotCXByaW50ZigidWRlbGF5OiAlbGQgbS51ICVkLiVkICB0bS50dSAlZC4lZFxuIiwgdXNlYywgbSwgdSwgdG0sIHR1KTsKLSNlbmRpZgotCXdoaWxlICgxKSB7Ci0KLQkJbSArPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JTExJKTsKLQkJdSA9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pICsgKG0gKiAxMDAwKTsKLQotCQlpZiAodXNlYyA8PSB1KSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotI2VuZGlmCi0KLWludCBzc2lfc2V0X2ludGVyZmFjZShpbnQgZnJlcSwgaW50IGxzYl9maXJzdCwgaW50IGludl9jbG9jaywgaW50IGludl9waGFzZSkKLXsKLQl1OCB0ZW1wPTA7Ci0KLQlpZiAoZnJlcSA+PSA4MTkyKSB7Ci0JCXRlbXAgfD0gQ1RMX0NMS19TRUxfNDsKLQl9IGVsc2UgaWYgKGZyZXEgPj0gNDA5NikgewotCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzg7Ci0JfSBlbHNlIGlmIChmcmVxID49IDIwNDgpIHsKLQkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xNjsKLQl9IGVsc2UgaWYgKGZyZXEgPj0gMTAyNCkgewotCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzMyOwotCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTIpIHsKLQkJdGVtcCB8PSBDVExfQ0xLX1NFTF82NDsKLQl9IGVsc2UgaWYgKGZyZXEgPj0gMjU2KSB7Ci0JCXRlbXAgfD0gQ1RMX0NMS19TRUxfMTI4OwotCX0gZWxzZSBpZiAoZnJlcSA+PSAxMjgpIHsKLQkJdGVtcCB8PSBDVExfQ0xLX1NFTF8yNTY7Ci0JfSBlbHNlIHsKLQkJdGVtcCB8PSBDVExfQ0xLX1NFTF81MTI7Ci0JfQotCi0JaWYgKCFsc2JfZmlyc3QpIHsKLQkJdGVtcCB8PSBNU0JGX0VOQjsKLQl9Ci0KLQlpZiAoaW52X2Nsb2NrKSB7Ci0JCXRlbXAgfD0gQ0xLX0lOVl9FTkI7Ci0JfQotCi0JaWYgKGludl9waGFzZSkgewotCQl0ZW1wIHw9IFBIU19JTlZfRU5COwotCX0KLQotCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDVEwsIHRlbXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXU4IHNzaV90eHJ4X2J5dGUodTggZGF0YSkKLXsKLQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7Ci0Jd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOwotCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1hNSVRSQ1YpOwotCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKLQlyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKLX0KLQotCi12b2lkIHNzaV90eF9ieXRlKHU4IGRhdGEpCi17Ci0Jd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSVhNSVQsIGRhdGEpOwotCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKLQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUKTsKLX0KLQotdTggc3NpX3J4X2J5dGUodm9pZCkKLXsKLQl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7Ci0Jd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfUkNWKTsKLQl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7Ci0JcmV0dXJuIHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVJDVik7Ci19Ci0KICNpZmRlZiBDT05GSUdfU1lTX1NDNTIwX1JFU0VUCiB2b2lkIHJlc2V0X2NwdSh1bG9uZyBhZGRyKQogewpkaWZmIC0tZ2l0IGEvY3B1L2kzODYvc2M1MjAvc2M1MjBfcGNpLmMgYi9jcHUvaTM4Ni9zYzUyMC9zYzUyMF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI4MzdlCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2kzODYvc2M1MjAvc2M1MjBfcGNpLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgeworCXU4IHByaW9yaXR5OworCXUxNiBsZXZlbF9yZWc7CisJdTggbGV2ZWxfYml0OworfSBzYzUyMF9pcnFbXSA9IHsKKwl7IFNDNTIwX0lSUTAsICBTQzUyMF9NUElDTU9ERSwgIDB4MDEgfSwKKwl7IFNDNTIwX0lSUTEsICBTQzUyMF9NUElDTU9ERSwgIDB4MDIgfSwKKwl7IFNDNTIwX0lSUTIsICBTQzUyMF9TTDFQSUNNT0RFLCAweDAyIH0sCisJeyBTQzUyMF9JUlEzLCAgU0M1MjBfTVBJQ01PREUsICAweDA4IH0sCisJeyBTQzUyMF9JUlE0LCAgU0M1MjBfTVBJQ01PREUsICAweDEwIH0sCisJeyBTQzUyMF9JUlE1LCAgU0M1MjBfTVBJQ01PREUsICAweDIwIH0sCisJeyBTQzUyMF9JUlE2LCAgU0M1MjBfTVBJQ01PREUsICAweDQwIH0sCisJeyBTQzUyMF9JUlE3LCAgU0M1MjBfTVBJQ01PREUsICAweDgwIH0sCisKKwl7IFNDNTIwX0lSUTgsICBTQzUyMF9TTDFQSUNNT0RFLCAweDAxIH0sCisJeyBTQzUyMF9JUlE5LCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMiB9LAorCXsgU0M1MjBfSVJRMTAsIFNDNTIwX1NMMVBJQ01PREUsIDB4MDQgfSwKKwl7IFNDNTIwX0lSUTExLCBTQzUyMF9TTDFQSUNNT0RFLCAweDA4IH0sCisJeyBTQzUyMF9JUlExMiwgU0M1MjBfU0wxUElDTU9ERSwgMHgxMCB9LAorCXsgU0M1MjBfSVJRMTMsIFNDNTIwX1NMMVBJQ01PREUsIDB4MjAgfSwKKwl7IFNDNTIwX0lSUTE0LCBTQzUyMF9TTDFQSUNNT0RFLCAweDQwIH0sCisJeyBTQzUyMF9JUlExNSwgU0M1MjBfU0wxUElDTU9ERSwgMHg4MCB9Cit9OworCisKKy8qIFRoZSBpbnRlcnJ1cHQgdXNlZCBmb3IgUENJIElOVEEtSU5URCAgKi8KK2ludCBzYzUyMF9wY2lfaW50c1sxNV0gPSB7CisJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorfTsKKworLyogdXRpbGl0eSBmdW5jdGlvbiB0byBjb25maWd1cmUgYSBwY2kgaW50ZXJydXB0ICovCitpbnQgcGNpX3NjNTIwX3NldF9pcnEoaW50IHBjaV9waW4sIGludCBpcnEpCit7CisJaW50IGk7CisKKyMgaWYgMQorCXByaW50Zigic2V0X2lycSgpOiBtYXAgSU5UJWMgdG8gSVJRJWRcbiIsIHBjaV9waW4gKyAnQScsIGlycSk7CisjZW5kaWYKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPiAxNSkgeworCQlyZXR1cm4gLTE7IC8qIGlsbGVnYWwgaXJxICovCisJfQorCisJaWYgKHBjaV9waW4gPCAwIHx8IHBjaV9waW4gPiAxNSkgeworCQlyZXR1cm4gLTE7IC8qIGlsbGVnYWwgcGNpIGludCBwaW4gKi8KKwl9CisKKwkvKiBmaXJzdCBkaXNhYmxlIGFueSBub24tcGNpIGludGVycnVwdCBzb3VyY2UgdGhhdCB1c2UKKwkgKiB0aGlzIGxldmVsICovCisJZm9yIChpPVNDNTIwX0dQVE1SME1BUDtpPD1TQzUyMF9HUDEwSU1BUDtpKyspIHsKKwkJaWYgKGk+PVNDNTIwX1BDSUlOVEFNQVAmJmk8PVNDNTIwX1BDSUlOVERNQVApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyZWFkX21tY3JfYnl0ZShpKSA9PSBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSkgeworCQkJd3JpdGVfbW1jcl9ieXRlKGksIFNDNTIwX0lSUV9ESVNBQkxFRCk7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIHRyaWdnZXIgdG8gbGV2ZWwgKi8KKwl3cml0ZV9tbWNyX2J5dGUoc2M1MjBfaXJxW2lycV0ubGV2ZWxfcmVnLAorCQkJcmVhZF9tbWNyX2J5dGUoc2M1MjBfaXJxW2lycV0ubGV2ZWxfcmVnKSB8IHNjNTIwX2lycVtpcnFdLmxldmVsX2JpdCk7CisKKworCWlmIChwY2lfcGluIDwgNCkgeworCQkvKiBQQ0kgSU5UQS1JTlREICovCisJCS8qIHJvdXRlIHRoZSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEFNQVAgKyBwY2lfcGluLCBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSk7CisKKworCX0gZWxzZSB7CisJCS8qIEdQSVJRMC1HUElSUTEwIHVzZWQgZm9yIGFkZGl0aW9uYWwgUENJIElOVFMgKi8KKwkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMElNQVAgKyBwY2lfcGluIC0gNCwgc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpOworCisJCS8qIGFsc28gc2V0IHRoZSBwb2xhcml0eSBpbiB0aGlzIGNhc2UgKi8KKwkJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0lOVFBJTlBPTCwKKwkJCQlyZWFkX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wpIHwgKDEgPDwgKHBjaV9waW4tNCkpKTsKKworCX0KKworCS8qIHJlZ2lzdGVyIHRoZSBwaW4gKi8KKwlzYzUyMF9wY2lfaW50c1twY2lfcGluXSA9IGlycTsKKworCisJcmV0dXJuIDA7IC8qIE9LICovCit9CisKK3ZvaWQgcGNpX3NjNTIwX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlKQoreworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKworCS8qIFN5c3RlbSBtZW1vcnkgc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMCwKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfQlVTLAorCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9QSFlTLAorCQkgICAgICAgU0M1MjBfUENJX01FTU9SWV9TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CisKKwkvKiBQQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCisJCSAgICAgICBTQzUyMF9QQ0lfTUVNX0JVUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1fUEhZUywKKwkJICAgICAgIFNDNTIwX1BDSV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIElTQS9QQ0kgbWVtb3J5IHNwYWNlICovCisJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDIsCisJCSAgICAgICBTQzUyMF9JU0FfTUVNX0JVUywKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fUEhZUywKKwkJICAgICAgIFNDNTIwX0lTQV9NRU1fU0laRSwKKwkJICAgICAgIFBDSV9SRUdJT05fTUVNKTsKKworCS8qIFBDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMywKKwkJICAgICAgIFNDNTIwX1BDSV9JT19CVVMsCisJCSAgICAgICBTQzUyMF9QQ0lfSU9fUEhZUywKKwkJICAgICAgIFNDNTIwX1BDSV9JT19TSVpFLAorCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CisKKwkvKiBJU0EvUENJIEkvTyBzcGFjZSAqLworCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyA0LAorCQkgICAgICAgU0M1MjBfSVNBX0lPX0JVUywKKwkJICAgICAgIFNDNTIwX0lTQV9JT19QSFlTLAorCQkgICAgICAgU0M1MjBfSVNBX0lPX1NJWkUsCisJCSAgICAgICBQQ0lfUkVHSU9OX0lPKTsKKworCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDU7CisKKwlwY2lfc2V0dXBfdHlwZTEoaG9zZSwKKwkJCVNDNTIwX1JFR19BRERSLAorCQkJU0M1MjBfUkVHX0RBVEEpOworCisJcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CisKKwlob3NlLT5sYXN0X2J1c25vID0gcGNpX2hvc2Vfc2Nhbihob3NlKTsKKworCS8qIGVuYWJsZSB0YXJnZXQgbWVtb3J5IGFjY2VzZXMgb24gaG9zdCBicmlnZSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCgwLCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUik7CisKK30KZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3NjNTIwL3NjNTIwX3NzaS5jIGIvY3B1L2kzODYvc2M1MjAvc2M1MjBfc3NpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2NjdjYQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9pMzg2L3NjNTIwL3NjNTIwX3NzaS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vaWMvc3NpLmg+CisjaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CisKK2ludCBzc2lfc2V0X2ludGVyZmFjZShpbnQgZnJlcSwgaW50IGxzYl9maXJzdCwgaW50IGludl9jbG9jaywgaW50IGludl9waGFzZSkKK3sKKwl1OCB0ZW1wPTA7CisKKwlpZiAoZnJlcSA+PSA4MTkyKSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNDsKKwl9IGVsc2UgaWYgKGZyZXEgPj0gNDA5NikgeworCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzg7CisJfSBlbHNlIGlmIChmcmVxID49IDIwNDgpIHsKKwkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xNjsKKwl9IGVsc2UgaWYgKGZyZXEgPj0gMTAyNCkgeworCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzMyOworCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTIpIHsKKwkJdGVtcCB8PSBDVExfQ0xLX1NFTF82NDsKKwl9IGVsc2UgaWYgKGZyZXEgPj0gMjU2KSB7CisJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMTI4OworCX0gZWxzZSBpZiAoZnJlcSA+PSAxMjgpIHsKKwkJdGVtcCB8PSBDVExfQ0xLX1NFTF8yNTY7CisJfSBlbHNlIHsKKwkJdGVtcCB8PSBDVExfQ0xLX1NFTF81MTI7CisJfQorCisJaWYgKCFsc2JfZmlyc3QpIHsKKwkJdGVtcCB8PSBNU0JGX0VOQjsKKwl9CisKKwlpZiAoaW52X2Nsb2NrKSB7CisJCXRlbXAgfD0gQ0xLX0lOVl9FTkI7CisJfQorCisJaWYgKGludl9waGFzZSkgeworCQl0ZW1wIHw9IFBIU19JTlZfRU5COworCX0KKworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDVEwsIHRlbXApOworCisJcmV0dXJuIDA7Cit9CisKK3U4IHNzaV90eHJ4X2J5dGUodTggZGF0YSkKK3sKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJWE1JVCwgZGF0YSk7CisJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOworCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1hNSVRSQ1YpOworCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKKwlyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKK30KKworCit2b2lkIHNzaV90eF9ieXRlKHU4IGRhdGEpCit7CisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSVhNSVQsIGRhdGEpOworCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKKwl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJQ01ELCBTU0lDTURfQ01EX1NFTF9YTUlUKTsKK30KKwordTggc3NpX3J4X2J5dGUodm9pZCkKK3sKKwl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CisJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfUkNWKTsKKwl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CisJcmV0dXJuIHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVJDVik7Cit9CmRpZmYgLS1naXQgYS9jcHUvaTM4Ni9zYzUyMC9zYzUyMF90aW1lci5jIGIvY3B1L2kzODYvc2M1MjAvc2M1MjBfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTc4NTExCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2kzODYvc2M1MjAvc2M1MjBfdGltZXIuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiA8ZGFuaWVsQG9taWNyb24uc2U+LgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIHN0dWZmIHNwZWNpZmljIGZvciB0aGUgc2M1MjAsIGJ1dCBpbmRlcGVuZGVudCBvZiBpbXBsZW1lbnRhdGlvbiAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgorCit2b2lkIHJlc2V0X3RpbWVyKHZvaWQpCit7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCwgMCk7CisJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKKworfQorCit1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKK3sKKwkvKiBmaXhtZTogMzAgb3IgMzMgKi8KKwlyZXR1cm4JcmVhZF9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05UKSAvIDMzOworfQorCit2b2lkIHNldF90aW1lcih1bG9uZyB0KQoreworCS8qIEZpeE1lOiB1c2UgdHdvIGNhc2NhZGUgY291cGxlZCB0aW1lcnMgKi8KKwl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ1RMLCAweDQwMDEpOworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQsIHQqMzMpOworCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NjAwMSk7Cit9CisKKwordm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQoreworCWludCBtPTA7CisJbG9uZyB1OworCisJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUxMSSk7CisJcmVhZF9tbWNyX3dvcmQoU0M1MjBfU1dUTVJNSUNSTyk7CisKKyNpZiAwCisJLyogZG8gbm90IGVuYWJsZSB0aGlzIGxpbmUsIHVkZWxheSBpcyB1c2VkIGluIHRoZSBzZXJpYWwgZHJpdmVyIC0+IHJlY3Vyc2lvbiAqLworCXByaW50ZigidWRlbGF5OiAlbGQgbS51ICVkLiVkICB0bS50dSAlZC4lZFxuIiwgdXNlYywgbSwgdSwgdG0sIHR1KTsKKyNlbmRpZgorCXdoaWxlICgxKSB7CisKKwkJbSArPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JTExJKTsKKwkJdSA9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pICsgKG0gKiAxMDAwKTsKKworCQlpZiAodXNlYyA8PSB1KSB7CisJCQlicmVhazsKKwkJfQorCX0KK30K