LyoKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpMmMtYWxnby1pdGUuYyBpMmMgZHJpdmVyIGFsZ29yaXRobXMgZm9yIElURSBhZGFwdGVycwkgICAgCiAgIAogICBIYWktUGFvIEZhbiwgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgogICBocGZhbkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCgogICBDb3B5cmlnaHQgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBUaGlzIGZpbGUgd2FzIGhpZ2hseSBsZXZlcmFnZWQgZnJvbSBpMmMtYWxnby1wY2YuYywgd2hpY2ggd2FzIGNyZWF0ZWQKICAgYnkgU2ltb24gRy4gVm9nbCBhbmQgSGFucyBCZXJnbHVuZDoKCgogICAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IFNpbW9uIEcuIFZvZ2wKICAgICAgICAgICAgICAgICAgIDE5OTgtMjAwMCBIYW5zIEJlcmdsdW5kCgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCAKICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiAsYW5kIGFsc28gZnJvbSBNYXJ0aW4gQmFpbGV5CiAgIDxtYmFpbGV5QGxpdHRsZWZlZXQtaW5jLmNvbT4gKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgoKI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvaTJjLWFsZ28taXRlLmg+CiNpbmNsdWRlICJpMmMtYWxnby1pdGUuaCIKCiNkZWZpbmUJUE1fRFNSCQlJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9QTV9EU1IKI2RlZmluZQlQTV9JQlNSCQlJVDgxNzJfUENJX0lPX0JBU0UgKyBJVF9QTV9EU1IgKyAweDA0IAojZGVmaW5lIEdQSU9fQ0NSCUlUODE3Ml9QQ0lfSU9fQkFTRSArIElUX0dQQ0NSCgojZGVmaW5lIERFQjIoeCkgaWYgKGkyY19kZWJ1Zz49MikgeAojZGVmaW5lIERFQjMoeCkgaWYgKGkyY19kZWJ1Zz49MykgeCAvKiBwcmludCBzZXZlcmFsIHN0YXRpc3RpY2FsIHZhbHVlcyovCiNkZWZpbmUgREVGX1RJTUVPVVQgMTYKCgovKiBtb2R1bGUgcGFyYW1ldGVyczoKICovCnN0YXRpYyBpbnQgaTJjX2RlYnVnOwpzdGF0aWMgaW50IGlpY190ZXN0OwkvKiBzZWUgaWYgdGhlIGxpbmUtc2V0dGluZyBmdW5jdGlvbnMgd29yawkqLwoKLyogLS0tIHNldHRpbmcgc3RhdGVzIG9uIHRoZSBidXMgd2l0aCB0aGUgcmlnaHQgdGltaW5nOiAtLS0tLS0tLS0tLS0tLS0JKi8KCiNkZWZpbmUgZ2V0X2Nsb2NrKGFkYXApIGFkYXAtPmdldGNsb2NrKGFkYXAtPmRhdGEpCiNkZWZpbmUgaWljX291dHcoYWRhcCwgcmVnLCB2YWwpIGFkYXAtPnNldGlpYyhhZGFwLT5kYXRhLCByZWcsIHZhbCkKI2RlZmluZSBpaWNfaW53KGFkYXAsIHJlZykgYWRhcC0+Z2V0aWljKGFkYXAtPmRhdGEsIHJlZykKCgovKiAtLS0gb3RoZXIgYXV4aWxpYXJ5IGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwoKc3RhdGljIHZvaWQgaWljX3N0YXJ0KHN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCkKewoJaWljX291dHcoYWRhcCxJVEVfSTJDSENSLElURV9DTUQpOwp9CgpzdGF0aWMgdm9pZCBpaWNfc3RvcChzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXApCnsKCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0hDUiwwKTsKCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0hTUixJVEVfSTJDSFNSX1RESSk7Cn0KCnN0YXRpYyB2b2lkIGlpY19yZXNldChzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXApCnsKCWlpY19vdXR3KGFkYXAsIFBNX0lCU1IsIGlpY19pbncoYWRhcCwgUE1fSUJTUikgfCAweDgwKTsKfQoKCnN0YXRpYyBpbnQgd2FpdF9mb3JfYmIoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQp7CglpbnQgdGltZW91dCA9IERFRl9USU1FT1VUOwoJc2hvcnQgc3RhdHVzOwoKCXN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7CiNpZm5kZWYgU1RVQl9JMkMKCXdoaWxlICh0aW1lb3V0LS0gJiYgKHN0YXR1cyAmIElURV9JMkNIU1JfSEIpKSB7CgkJdWRlbGF5KDEwMDApOyAvKiBIb3cgbXVjaCBpcyB0aGlzPyAqLwoJCXN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Cgl9CiNlbmRpZgoJaWYgKHRpbWVvdXQ8PTApIHsKCQlwcmludGsoS0VSTl9FUlIgIlRpbWVvdXQsIGhvc3QgaXMgYnVzeVxuIik7CgkJaWljX3Jlc2V0KGFkYXApOwoJfQoJcmV0dXJuKHRpbWVvdXQ8PTApOwp9CgovKiBBZnRlciB3ZSBpc3N1ZSBhIHRyYW5zYWN0aW9uIG9uIHRoZSBJSUMgYnVzLCB0aGlzIGZ1bmN0aW9uCiAqIGlzIGNhbGxlZC4gIEl0IHB1dHMgdGhpcyBwcm9jZXNzIHRvIHNsZWVwIHVudGlsIHdlIGdldCBhbiBpbnRlcnJ1cHQgZnJvbQogKiBmcm9tIHRoZSBjb250cm9sbGVyIHRlbGxpbmcgdXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2UgcmVxdWVzdGVkIGluIGNvbXBsZXRlLgogKi8Kc3RhdGljIGludCB3YWl0X2Zvcl9waW4oc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLCBzaG9ydCAqc3RhdHVzKSB7CgoJaW50IHRpbWVvdXQgPSBERUZfVElNRU9VVDsKCQoJdGltZW91dCA9IHdhaXRfZm9yX2JiKGFkYXApOwoJaWYgKHRpbWVvdXQpIHsKICAJCURFQjIocHJpbnRrKCJUaW1lb3V0IHdhaXRpbmcgZm9yIGhvc3Qgbm90IGJ1c3lcbiIpOykKICAJCXJldHVybiAtRUlPOwoJfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJdGltZW91dCA9IERFRl9USU1FT1VUOwoKCSpzdGF0dXMgPSBpaWNfaW53KGFkYXAsIElURV9JMkNIU1IpOwojaWZuZGVmIFNUVUJfSTJDCgl3aGlsZSAodGltZW91dC0tICYmICEoKnN0YXR1cyAmIElURV9JMkNIU1JfVERJKSkgewoJICAgYWRhcC0+d2FpdGZvcnBpbigpOwoJICAgKnN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0hTUik7Cgl9CiNlbmRpZgoJaWYgKHRpbWVvdXQgPD0gMCkKCQlyZXR1cm4oLTEpOwoJZWxzZQoJCXJldHVybigwKTsKfQoKc3RhdGljIGludCB3YWl0X2Zvcl9mZShzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsIHNob3J0ICpzdGF0dXMpCnsKCWludCB0aW1lb3V0ID0gREVGX1RJTUVPVVQ7CgoJKnN0YXR1cyA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0ZTUik7CiNpZm5kZWYgU1RVQl9JMkMgCgl3aGlsZSAodGltZW91dC0tICYmICgqc3RhdHVzICYgSVRFX0kyQ0ZTUl9GRSkpIHsKCQl1ZGVsYXkoMTAwMCk7CgkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKCX0KI2VuZGlmCglpZiAodGltZW91dCA8PSAwKSAKCQlyZXR1cm4oLTEpOwoJZWxzZQoJCXJldHVybigwKTsKfQoKc3RhdGljIGludCBpaWNfaW5pdCAoc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwKQp7CglzaG9ydCBpOwoKCS8qIENsZWFyIGJpdCA3IHRvIHNldCBJMkMgdG8gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCglpPWlpY19pbncoYWRhcCwgUE1fRFNSKSYgMHhmZjdmOwoJaWljX291dHcoYWRhcCwgUE1fRFNSLCBpKTsKCgkvKiBzZXQgSVRfR1BDQ1IgcG9ydCBDIGJpdCAyJjMgYXMgZnVuY3Rpb24gMiAqLwoJaSA9IGlpY19pbncoYWRhcCwgR1BJT19DQ1IpICYgMHhmYzBmOwoJaWljX291dHcoYWRhcCxHUElPX0NDUixpKTsKCgkvKiBDbGVhciBzbGF2ZSBhZGRyZXNzL3N1Yi1hZGRyZXNzICovCglpaWNfb3V0dyhhZGFwLElURV9JMkNTQVIsIDApOwoJaWljX291dHcoYWRhcCxJVEVfSTJDU1NBUiwgMCk7CgoJLyogU2V0IGNsb2NrIGNvdW50ZXIgcmVnaXN0ZXIgKi8KCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0NLQ05ULCBnZXRfY2xvY2soYWRhcCkpOwoKCS8qIFNldCBTVEFSVC9yZVNUQVJUL1NUT1AgdGltZSByZWdpc3RlcnMgKi8KCWlpY19vdXR3KGFkYXAsSVRFX0kyQ1NIRFIsIDB4MGEpOwoJaWljX291dHcoYWRhcCxJVEVfSTJDUlNVUiwgMHgwYSk7CglpaWNfb3V0dyhhZGFwLElURV9JMkNQU1VSLCAweDBhKTsKCgkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiBjb21wbGV0aW5nIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCglpaWNfb3V0dyhhZGFwLElURV9JMkNIQ1IsIElURV9JMkNIQ1JfSUUgfCBJVEVfSTJDSENSX0hDRSk7CgoJLyogQ2xlYXIgdHJhbnNmZXIgY291bnQgKi8KCWlpY19vdXR3KGFkYXAsSVRFX0kyQ0ZCQ1IsIDB4MCk7CgoJREVCMihwcmludGsoImlpY19pbml0OiBJbml0aWFsaXplZCBJSUMgb24gSVRFIDB4JXhcbiIsCgkJaWljX2ludyhhZGFwLCBJVEVfSTJDSFNSKSkpOwoJcmV0dXJuIDA7Cn0KCgovKgogKiBTYW5pdHkgY2hlY2sgZm9yIHRoZSBhZGFwdGVyIGhhcmR3YXJlIC0gY2hlY2sgdGhlIHJlYWN0aW9uIG9mCiAqIHRoZSBidXMgbGluZXMgb25seSBpZiBpdCBzZWVtcyB0byBiZSBpZGxlLgogKi8Kc3RhdGljIGludCB0ZXN0X2J1cyhzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAsIGNoYXIgKm5hbWUpIHsKI2lmIDAKCWludCBzY2wsc2RhOwoJc2RhPWdldHNkYShhZGFwKTsKCWlmIChhZGFwLT5nZXRzY2w9PU5VTEwpIHsKCQlwcmludGsoInRlc3RfYnVzOiBXYXJuaW5nOiBBZGFwdGVyIGNhbid0IHJlYWQgZnJvbSBjbG9jayBsaW5lIC0gc2tpcHBpbmcgdGVzdC5cbiIpOwoJCXJldHVybiAwOwkJCgl9CglzY2w9Z2V0c2NsKGFkYXApOwoJcHJpbnRrKCJ0ZXN0X2J1czogQWRhcHRlcjogJXMgc2NsOiAlZCAgc2RhOiAlZCAtLSB0ZXN0aW5nLi4uXG4iLAoJbmFtZSxnZXRzY2woYWRhcCksZ2V0c2RhKGFkYXApKTsKCWlmICghc2NsIHx8ICFzZGEgKSB7CgkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgc2VlbXMgdG8gYmUgYnVzeS5cbiIsYWRhcC0+bmFtZSk7CgkJZ290byBiYWlsb3V0OwoJfQoJc2RhbG8oYWRhcCk7CglwcmludGsoInRlc3RfYnVzOjEgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAoJICAgICAgIGdldHNkYShhZGFwKSk7CglpZiAoIDAgIT0gZ2V0c2RhKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSBzdHVjayBoaWdoIVxuIixuYW1lKTsKCQlzZGFoaShhZGFwKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNDTCB1bmV4cGVjdGVkIGxvdyB3aGlsZSBwdWxsaW5nIFNEQSBsb3chXG4iLAoJCQluYW1lKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CQkKCXNkYWhpKGFkYXApOwoJcHJpbnRrKCJ0ZXN0X2J1czoyIHNjbDogJWQgIHNkYTogJWRcbiIsIGdldHNjbChhZGFwKSwKCSAgICAgICBnZXRzZGEoYWRhcCkpOwoJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgc3R1Y2sgbG93IVxuIixuYW1lKTsKCQlzZGFoaShhZGFwKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglpZiAoIDAgPT0gZ2V0c2NsKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNDTCB1bmV4cGVjdGVkIGxvdyB3aGlsZSBTREEgaGlnaCFcbiIsCgkJICAgICAgIGFkYXAtPm5hbWUpOwoJZ290byBiYWlsb3V0OwoJfQoJc2NsbG8oYWRhcCk7CglwcmludGsoInRlc3RfYnVzOjMgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAoJICAgICAgIGdldHNkYShhZGFwKSk7CglpZiAoIDAgIT0gZ2V0c2NsKGFkYXApICkgewoKCQlzY2xoaShhZGFwKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglpZiAoIDAgPT0gZ2V0c2RhKGFkYXApICkgewoJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSB1bmV4cGVjdGVkIGxvdyB3aGlsZSBwdWxsaW5nIFNDTCBsb3chXG4iLAoJCQluYW1lKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglzY2xoaShhZGFwKTsKCXByaW50aygidGVzdF9idXM6NCBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCgkgICAgICAgZ2V0c2RhKGFkYXApKTsKCWlmICggMCA9PSBnZXRzY2woYWRhcCkgKSB7CgkJcHJpbnRrKCJ0ZXN0X2J1czogJXMgU0NMIHN0dWNrIGxvdyFcbiIsbmFtZSk7CgkJc2NsaGkoYWRhcCk7CgkJZ290byBiYWlsb3V0OwoJfQoJaWYgKCAwID09IGdldHNkYShhZGFwKSApIHsKCQlwcmludGsoInRlc3RfYnVzOiAlcyBTREEgdW5leHBlY3RlZCBsb3cgd2hpbGUgU0NMIGhpZ2ghXG4iLAoJCQluYW1lKTsKCQlnb3RvIGJhaWxvdXQ7Cgl9CglwcmludGsoInRlc3RfYnVzOiAlcyBwYXNzZWQgdGVzdC5cbiIsbmFtZSk7CglyZXR1cm4gMDsKYmFpbG91dDoKCXNkYWhpKGFkYXApOwoJc2NsaGkoYWRhcCk7CglyZXR1cm4gLUVOT0RFVjsKI2VuZGlmCglyZXR1cm4gKDApOwp9CgovKiAtLS0tLSBVdGlsaXR5IGZ1bmN0aW9ucwogKi8KCgovKiBWZXJpZnkgdGhlIGRldmljZSB3ZSB3YW50IHRvIHRhbGsgdG8gb24gdGhlIElJQyBidXMgcmVhbGx5IGV4aXN0cy4gKi8Kc3RhdGljIGlubGluZSBpbnQgdHJ5X2FkZHJlc3Moc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgYWRkciwgaW50IHJldHJpZXMpCnsKCWludCBpLCByZXQgPSAtMTsKCXNob3J0IHN0YXR1czsKCglmb3IgKGk9MDtpPHJldHJpZXM7aSsrKSB7CgkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUiwgYWRkcik7CgkJaWljX3N0YXJ0KGFkYXApOwoJCWlmICh3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cykgPT0gMCkgewoJCQlpZiAoKHN0YXR1cyAmIElURV9JMkNIU1JfRE5FKSA9PSAwKSB7IAoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkNSLCBJVEVfSTJDRkNSX0ZMVVNIKTsKCQkJCXJldD0xOwoJCQkJYnJlYWs7CS8qIHN1Y2Nlc3MhICovCgkJCX0KCQl9CgkJaWljX3N0b3AoYWRhcCk7CgkJdWRlbGF5KGFkYXAtPnVkZWxheSk7Cgl9CglERUIyKGlmIChpKSBwcmludGsoInRyeV9hZGRyZXNzOiBuZWVkZWQgJWQgcmV0cmllcyBmb3IgMHgleFxuIixpLAoJICAgICAgICAgICAgICAgICAgIGFkZHIpKTsKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IGlpY19zZW5kYnl0ZXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCxjb25zdCBjaGFyICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpCnsKCXN0cnVjdCBpMmNfYWxnb19paWNfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CglpbnQgd3Jjb3VudD0wLCB0aW1lb3V0OwoJc2hvcnQgc3RhdHVzOwoJaW50IGxvb3BzLCByZW1haW5kZXIsIGksIGo7Cgl1bmlvbiB7CgkJY2hhciBieXRlWzJdOwoJCXVuc2lnbmVkIHNob3J0IHdvcmQ7Cgl9IHRtcDsKICAgCglpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU1NBUiwgKHVuc2lnbmVkIHNob3J0KWJ1Zlt3cmNvdW50KytdKTsKCWNvdW50LS07CglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gLUVJTzsKCglsb29wcyA9ICBjb3VudCAvIDMyOwkJLyogMzItYnl0ZSBGSUZPICovCglyZW1haW5kZXIgPSBjb3VudCAlIDMyOwoKCWlmKGxvb3BzKSB7CgkJZm9yKGk9MDsgaTxsb29wczsgaSsrKSB7CgoJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgMzIpOwoJCQlmb3Ioaj0wOyBqPDMyLzI7IGorKykgewoJCQkJdG1wLmJ5dGVbMV0gPSBidWZbd3Jjb3VudCsrXTsKCQkJCXRtcC5ieXRlWzBdID0gYnVmW3dyY291bnQrK107CgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkRSLCB0bXAud29yZCk7IAoJCQl9CgoJCQkvKiBzdGF0dXMgRklGTyBvdmVycnVuICovCgkJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0ZTUik7CgkJCWlpY19pbncoYWRhcCwgSVRFX0kyQ0ZCQ1IpOwoKCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1dSSVRFKTsJLyogSXNzdWUgV1JJVEUgY29tbWFuZCAqLwoKCQkJLyogV2FpdCBmb3IgdHJhbnNtaXNzaW9uIHRvIGNvbXBsZXRlICovCgkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7CgkJCWlmKHRpbWVvdXQpIHsKCQkJCWlpY19zdG9wKGFkYXApOwoJCQkJcHJpbnRrKCJpaWNfc2VuZGJ5dGVzOiAlcyB3cml0ZSB0aW1lb3V0LlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KICAgICAJfQoJCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgewoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQkJcmV0dXJuIC1FUkVNT1RFSU87IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KCQkJfQoJCX0KCX0KCWlmKHJlbWFpbmRlcikgewoJCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQkNSLCByZW1haW5kZXIpOwoJCWZvcihpPTA7IGk8cmVtYWluZGVyLzI7IGkrKykgewoJCQl0bXAuYnl0ZVsxXSA9IGJ1Zlt3cmNvdW50KytdOwoJCQl0bXAuYnl0ZVswXSA9IGJ1Zlt3cmNvdW50KytdOwoJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkRSLCB0bXAud29yZCk7CgkJfQoKCQkvKiBzdGF0dXMgRklGTyBvdmVycnVuICovCgkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKCQlpaWNfaW53KGFkYXAsIElURV9JMkNGQkNSKTsKCgkJaWljX291dHcoYWRhcCwgSVRFX0kyQ0hDUiwgSVRFX1dSSVRFKTsgIC8qIElzc3VlIFdSSVRFIGNvbW1hbmQgKi8KCgkJdGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKCQlpZih0aW1lb3V0KSB7CgkJCWlpY19zdG9wKGFkYXApOwoJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIHRpbWVvdXQuXG4iLCBpMmNfYWRhcC0+bmFtZSk7CgkJCXJldHVybiAtRVJFTU9URUlPOyAvKiBnb3QgYSBiZXR0ZXIgb25lID8/ICovCgkJfQojaWZuZGVmIFNUVUJfSTJDCgkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsgCgkJCWlpY19zdG9wKGFkYXApOwoJCQlwcmludGsoImlpY19zZW5kYnl0ZXM6ICVzIHdyaXRlIGVycm9yIC0gbm8gYWNrLlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQlyZXR1cm4gLUVSRU1PVEVJTzsgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLwoJCX0KI2VuZGlmCgl9CglpaWNfc3RvcChhZGFwKTsKCXJldHVybiB3cmNvdW50Owp9CgoKc3RhdGljIGludCBpaWNfcmVhZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGNoYXIgKmJ1ZiwgaW50IGNvdW50LAoJaW50IHNyZWFkKQp7CglpbnQgcmRjb3VudD0wLCBpLCB0aW1lb3V0OwoJc2hvcnQgc3RhdHVzOwoJc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKCWludCBsb29wcywgcmVtYWluZGVyLCBqOwoJdW5pb24gewoJCWNoYXIgYnl0ZVsyXTsKCQl1bnNpZ25lZCBzaG9ydCB3b3JkOwoJfSB0bXA7CgkJCglsb29wcyA9IGNvdW50IC8gMzI7CQkJCS8qIDMyLWJ5dGUgRklGTyAqLwoJcmVtYWluZGVyID0gY291bnQgJSAzMjsKCglpZihsb29wcykgewoJCWZvcihpPTA7IGk8bG9vcHM7IGkrKykgewoJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgMzIpOwoJCQlpZiAoc3JlYWQpCgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfU1JFQUQpOwoJCQllbHNlCgkJCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDSENSLCBJVEVfUkVBRCk7CQkvKiBJc3N1ZSBSRUFEIGNvbW1hbmQgKi8KCgkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cyk7CgkJCWlmKHRpbWVvdXQpIHsKCQkJCWlpY19zdG9wKGFkYXApOwoJCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgcmVhZCB0aW1lb3V0LlxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQkJcmV0dXJuICgtMSk7CgkJCX0KI2lmbmRlZiBTVFVCX0kyQwoJCQlpZiAoc3RhdHVzICYgSVRFX0kyQ0hTUl9EQikgewoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICVzIHJlYWQgZXJyb3IgLSBubyBhY2suXG4iLCBpMmNfYWRhcC0+bmFtZSk7CgkJCQlyZXR1cm4gKC0xKTsKCQkJfQojZW5kaWYKCgkJCXRpbWVvdXQgPSB3YWl0X2Zvcl9mZShhZGFwLCAmc3RhdHVzKTsKCQkJaWYodGltZW91dCkgewoJCQkJaWljX3N0b3AoYWRhcCk7CgkJCQlwcmludGsoImlpY19yZWFkYnl0ZXM6ICAlcyBGSUZPIGlzIGVtcHR5XG4iLCBpMmNfYWRhcC0+bmFtZSk7CgkJCQlyZXR1cm4gKC0xKTsgCgkJCX0KCgkJCWZvcihqPTA7IGo8MzIvMjsgaisrKSB7CgkJCQl0bXAud29yZCA9IGlpY19pbncoYWRhcCwgSVRFX0kyQ0ZEUik7CgkJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzFdOwoJCQkJYnVmW3JkY291bnQrK10gPSB0bXAuYnl0ZVswXTsKCQkJfQoKCQkJLyogc3RhdHVzIEZJRk8gdW5kZXJydW4gKi8KCQkJaWljX2ludyhhZGFwLCBJVEVfSTJDRlNSKTsKCgkJfQoJfQoKCglpZihyZW1haW5kZXIpIHsKCQlyZW1haW5kZXI9KHJlbWFpbmRlcisxKS8yICogMjsKCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkJDUiwgcmVtYWluZGVyKTsKCQlpZiAoc3JlYWQpCgkJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9TUkVBRCk7CgkJZWxzZQoJCWlpY19vdXR3KGFkYXAsIElURV9JMkNIQ1IsIElURV9SRUFEKTsJCS8qIElzc3VlIFJFQUQgY29tbWFuZCAqLwoKCQl0aW1lb3V0ID0gd2FpdF9mb3JfcGluKGFkYXAsICZzdGF0dXMpOwoJCWlmKHRpbWVvdXQpIHsKCQkJaWljX3N0b3AoYWRhcCk7CgkJCXByaW50aygiaWljX3JlYWRieXRlczogICVzIHJlYWQgdGltZW91dC5cbiIsIGkyY19hZGFwLT5uYW1lKTsKCQkJcmV0dXJuICgtMSk7CgkJfQojaWZuZGVmIFNUVUJfSTJDCgkJaWYgKHN0YXR1cyAmIElURV9JMkNIU1JfREIpIHsKCQkJaWljX3N0b3AoYWRhcCk7CgkJCXByaW50aygiaWljX3JlYWRieXRlczogJXMgcmVhZCBlcnJvciAtIG5vIGFjay5cbiIsIGkyY19hZGFwLT5uYW1lKTsKCQkJcmV0dXJuICgtMSk7CgkJfQojZW5kaWYKCQl0aW1lb3V0ID0gd2FpdF9mb3JfZmUoYWRhcCwgJnN0YXR1cyk7CgkJaWYodGltZW91dCkgewoJCQlpaWNfc3RvcChhZGFwKTsKCQkJcHJpbnRrKCJpaWNfcmVhZGJ5dGVzOiAgJXMgRklGTyBpcyBlbXB0eVxuIiwgaTJjX2FkYXAtPm5hbWUpOwoJCQlyZXR1cm4gKC0xKTsKCQl9ICAgICAgICAgCgoJCWZvcihpPTA7IGk8KHJlbWFpbmRlcisxKS8yOyBpKyspIHsKCQkJdG1wLndvcmQgPSBpaWNfaW53KGFkYXAsIElURV9JMkNGRFIpOwoJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzFdOwoJCQlidWZbcmRjb3VudCsrXSA9IHRtcC5ieXRlWzBdOwoJCX0KCgkJLyogc3RhdHVzIEZJRk8gdW5kZXJydW4gKi8KCQlpaWNfaW53KGFkYXAsIElURV9JMkNGU1IpOwoKCX0KCglpaWNfc3RvcChhZGFwKTsKCXJldHVybiByZGNvdW50Owp9CgoKLyogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGNvbWJpbmVkIHRyYW5zYWN0aW9ucy4gIENvbWJpbmVkCiAqIHRyYW5zYWN0aW9ucyBjb25zaXN0IG9mIGNvbWJpbmF0aW9ucyBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGJsb2NrcyBvZiBkYXRhLgogKiBFYWNoIHRyYW5zZmVyIChpLmUuIGEgcmVhZCBvciBhIHdyaXRlKSBpcyBzZXBhcmF0ZWQgYnkgYSByZXBlYXRlZCBzdGFydAogKiBjb25kaXRpb24uCiAqLwojaWYgMApzdGF0aWMgaW50IGlpY19jb21iaW5lZF90cmFuc2FjdGlvbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSkgCnsKICAgaW50IGk7CiAgIHN0cnVjdCBpMmNfbXNnICpwbXNnOwogICBpbnQgcmV0OwoKICAgREVCMihwcmludGsoIkJlZ2lubmluZyBjb21iaW5lZCB0cmFuc2FjdGlvblxuIikpOwoKICAgZm9yKGk9MDsgaTwobnVtLTEpOyBpKyspIHsKICAgICAgcG1zZyA9ICZtc2dzW2ldOwogICAgICBpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CiAgICAgICAgIERFQjIocHJpbnRrKCIgIFRoaXMgb25lIGlzIGEgcmVhZFxuIikpOwogICAgICAgICByZXQgPSBpaWNfcmVhZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX0NPTUJJTkVEX1hGRVIpOwogICAgICB9CiAgICAgIGVsc2UgaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgewogICAgICAgICBERUIyKHByaW50aygiVGhpcyBvbmUgaXMgYSB3cml0ZVxuIikpOwogICAgICAgICByZXQgPSBpaWNfc2VuZGJ5dGVzKGkyY19hZGFwLCBwbXNnLT5idWYsIHBtc2ctPmxlbiwgSUlDX0NPTUJJTkVEX1hGRVIpOwogICAgICB9CiAgIH0KICAgLyogTGFzdCByZWFkIG9yIHdyaXRlIHNlZ21lbnQgbmVlZHMgdG8gYmUgdGVybWluYXRlZCB3aXRoIGEgc3RvcCAqLwogICBwbXNnID0gJm1zZ3NbaV07CgogICBpZihwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CiAgICAgIERFQjIocHJpbnRrKCJEb2luZyB0aGUgbGFzdCByZWFkXG4iKSk7CiAgICAgIHJldCA9IGlpY19yZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCBJSUNfU0lOR0xFX1hGRVIpOwogICB9CiAgIGVsc2UgaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgewogICAgICBERUIyKHByaW50aygiRG9pbmcgdGhlIGxhc3Qgd3JpdGVcbiIpKTsKICAgICAgcmV0ID0gaWljX3NlbmRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4sIElJQ19TSU5HTEVfWEZFUik7CiAgIH0KCiAgIHJldHVybiByZXQ7Cn0KI2VuZGlmCgoKLyogV2hlbmV2ZXIgd2UgaW5pdGlhdGUgYSB0cmFuc2FjdGlvbiwgdGhlIGZpcnN0IGJ5dGUgY2xvY2tlZAogKiBvbnRvIHRoZSBidXMgYWZ0ZXIgdGhlIHN0YXJ0IGNvbmRpdGlvbiBpcyB0aGUgYWRkcmVzcyAoNyBiaXQpIG9mIHRoZQogKiBkZXZpY2Ugd2Ugd2FudCB0byB0YWxrIHRvLiAgVGhpcyBmdW5jdGlvbiBtYW5pcHVsYXRlcyB0aGUgYWRkcmVzcyBzcGVjaWZpZWQKICogc28gdGhhdCBpdCBtYWtlcyBzZW5zZSB0byB0aGUgaGFyZHdhcmUgd2hlbiB3cml0dGVuIHRvIHRoZSBJSUMgcGVyaXBoZXJhbC4KICoKICogTm90ZTogMTAgYml0IGFkZHJlc3NlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGRyaXZlciwgYWx0aG91Z2ggdGhleSBhcmUKICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gIFRoaXMgZnVuY3Rpb25hbGl0eSBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IGlpY19kb0FkZHJlc3Moc3RydWN0IGkyY19hbGdvX2lpY19kYXRhICphZGFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2csIGludCByZXRyaWVzKSAKewoJdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSBtc2ctPmZsYWdzOwoJdW5zaWduZWQgaW50IGFkZHI7CglpbnQgcmV0OwoKLyogVGVuIGJpdCBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cgKi8KCWlmICggKGZsYWdzICYgSTJDX01fVEVOKSAgKSB7IAojaWYgMAoJCWFkZHIgPSAweGYwIHwgKCggbXNnLT5hZGRyID4+IDcpICYgMHgwMyk7CgkJREVCMihwcmludGsoImFkZHIwOiAlZFxuIixhZGRyKSk7CgkJcmV0ID0gdHJ5X2FkZHJlc3MoYWRhcCwgYWRkciwgcmV0cmllcyk7CgkJaWYgKHJldCE9MSkgewoJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgZXh0ZW5kZWQgYWRkcmVzcyBjb2RlLlxuIik7CgkJCXJldHVybiAtRVJFTU9URUlPOwoJCX0KCQlpaWNfb3V0dyhhZGFwLG1zZy0+YWRkciAmIDB4N2YpOwoJCWlmIChyZXQgIT0gMSkgewoJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgMm5kIGFkZHJlc3MgY29kZS5cbiIpOwoJCQlyZXR1cm4gLUVSRU1PVEVJTzsKCQl9CgkJaWYgKCBmbGFncyAmIEkyQ19NX1JEICkgewoJCQlpMmNfcmVwc3RhcnQoYWRhcCk7CgkJCWFkZHIgfD0gMHgwMTsKCQkJcmV0ID0gdHJ5X2FkZHJlc3MoYWRhcCwgYWRkciwgcmV0cmllcyk7CgkJCWlmIChyZXQhPTEpIHsKCQkJCXByaW50aygiaWljX2RvQWRkcmVzczogZGllZCBhdCBleHRlbmRlZCBhZGRyZXNzIGNvZGUuXG4iKTsKCQkJCXJldHVybiAtRVJFTU9URUlPOwoJCQl9CgkJfQojZW5kaWYKCX0gZWxzZSB7CgoJCWFkZHIgPSAoIG1zZy0+YWRkciA8PCAxICk7CgojaWYgMAoJCWlmIChmbGFncyAmIEkyQ19NX1JEICkKCQkJYWRkciB8PSAxOwoJCWlmIChmbGFncyAmIEkyQ19NX1JFVl9ESVJfQUREUiApCgkJCWFkZHIgXj0gMTsKI2VuZGlmCgoJCWlmIChpaWNfaW53KGFkYXAsIElURV9JMkNTQVIpICE9IGFkZHIpIHsKCQkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUiwgYWRkcik7CgkJCXJldCA9IHRyeV9hZGRyZXNzKGFkYXAsIGFkZHIsIHJldHJpZXMpOwoJCQlpZiAocmV0IT0xKSB7CgkJCQlwcmludGsoImlpY19kb0FkZHJlc3M6IGRpZWQgYXQgYWRkcmVzcyBjb2RlLlxuIik7CgkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKCQkJfQoJCX0KCiAgfQoKCXJldHVybiAwOwp9CgoKLyogRGVzY3JpcHRpb246IFByZXBhcmVzIHRoZSBjb250cm9sbGVyIGZvciBhIHRyYW5zYWN0aW9uIChjbGVhcmluZyBzdGF0dXMKICogcmVnaXN0ZXJzLCBkYXRhIGJ1ZmZlcnMsIGV0YyksIGFuZCB0aGVuIGNhbGxzIGVpdGhlciBpaWNfcmVhZGJ5dGVzIG9yCiAqIGlpY19zZW5kYnl0ZXMgdG8gZG8gdGhlIGFjdHVhbCB0cmFuc2FjdGlvbi4KICoKICogc3RpbGwgdG8gYmUgZG9uZTogQmVmb3JlIHdlIGlzc3VlIGEgdHJhbnNhY3Rpb24sIHdlIHNob3VsZAogKiB2ZXJpZnkgdGhhdCB0aGUgYnVzIGlzIG5vdCBidXN5IG9yIGluIHNvbWUgdW5rbm93biBzdGF0ZS4KICovCnN0YXRpYyBpbnQgaWljX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKCQkgICAgc3RydWN0IGkyY19tc2cgKm1zZ3MsIAoJCSAgICBpbnQgbnVtKQp7CglzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwoJc3RydWN0IGkyY19tc2cgKnBtc2c7CglpbnQgaSA9IDA7CglpbnQgcmV0LCB0aW1lb3V0OwogICAgCglwbXNnID0gJm1zZ3NbaV07CgoJaWYoIXBtc2ctPmxlbikgewoJCURFQjIocHJpbnRrKCJpaWNfeGZlcjogcmVhZC93cml0ZSBsZW5ndGggaXMgMFxuIik7KQoJCXJldHVybiAtRUlPOwoJfQoJaWYoIShwbXNnLT5mbGFncyAmIEkyQ19NX1JEKSAmJiAoIShwbXNnLT5sZW4pJTIpICkgewoJCURFQjIocHJpbnRrKCJpaWNfeGZlcjogd3JpdGUgYnVmZmVyIGxlbmd0aCBpcyBub3Qgb2RkXG4iKTspCgkJcmV0dXJuIC1FSU87IAoJfQoKCS8qIFdhaXQgZm9yIGFueSBwZW5kaW5nIHRyYW5zZmVycyB0byBjb21wbGV0ZSAqLwoJdGltZW91dCA9IHdhaXRfZm9yX2JiKGFkYXApOwoJaWYgKHRpbWVvdXQpIHsKCQlERUIyKHByaW50aygiaWljX3hmZXI6IFRpbWVvdXQgd2FpdGluZyBmb3IgaG9zdCBub3QgYnVzeVxuIik7KQoJCXJldHVybiAtRUlPOwoJfQoKCS8qIEZsdXNoIEZJRk8gKi8KCWlpY19vdXR3KGFkYXAsIElURV9JMkNGQ1IsIElURV9JMkNGQ1JfRkxVU0gpOwoKCS8qIExvYWQgYWRkcmVzcyAqLwoJcmV0ID0gaWljX2RvQWRkcmVzcyhhZGFwLCBwbXNnLCBpMmNfYWRhcC0+cmV0cmllcyk7CglpZiAocmV0KQoJCXJldHVybiAtRUlPOwoKI2lmIDAKCS8qIENvbWJpbmVkIHRyYW5zYWN0aW9uIChyZWFkIGFuZCB3cml0ZSkgKi8KCWlmKG51bSA+IDEpIHsKICAgICAgICAgICBERUIyKHByaW50aygiaWljX3hmZXI6IENhbGwgY29tYmluZWQgdHJhbnNhY3Rpb25cbiIpKTsKICAgICAgICAgICByZXQgPSBpaWNfY29tYmluZWRfdHJhbnNhY3Rpb24oaTJjX2FkYXAsIG1zZ3MsIG51bSk7CiAgfQojZW5kaWYKCglERUIzKHByaW50aygiaWljX3hmZXI6IE1zZyAlZCwgYWRkcj0weCV4LCBmbGFncz0weCV4LCBsZW49JWRcbiIsCgkJaSwgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmZsYWdzLCBtc2dzW2ldLmxlbik7KQoKCWlmKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIAkJLyogUmVhZCAqLwoJCXJldCA9IGlpY19yZWFkYnl0ZXMoaTJjX2FkYXAsIHBtc2ctPmJ1ZiwgcG1zZy0+bGVuLCAwKTsKCWVsc2UgewkJCQkJCQkJCQkJCQkvKiBXcml0ZSAqLyAKCQl1ZGVsYXkoMTAwMCk7CgkJcmV0ID0gaWljX3NlbmRieXRlcyhpMmNfYWRhcCwgcG1zZy0+YnVmLCBwbXNnLT5sZW4pOwoJfQoKCWlmIChyZXQgIT0gcG1zZy0+bGVuKQoJCURFQjMocHJpbnRrKCJpaWNfeGZlcjogZXJyb3Igb3IgZmFpbCBvbiByZWFkL3dyaXRlICVkIGJ5dGVzLlxuIixyZXQpKTsgCgllbHNlCgkJREVCMyhwcmludGsoImlpY194ZmVyOiByZWFkL3dyaXRlICVkIGJ5dGVzLlxuIixyZXQpKTsKCglyZXR1cm4gcmV0Owp9CgoKLyogSW1wbGVtZW50cyBkZXZpY2Ugc3BlY2lmaWMgaW9jdGxzLiAgSGlnaGVyIGxldmVsIGlvY3RscyBjYW4KICogYmUgZm91bmQgaW4gaTJjLWNvcmUuYyBhbmQgYXJlIHR5cGljYWwgb2YgYW55IGkyYyBjb250cm9sbGVyIChzcGVjaWZ5aW5nCiAqIHNsYXZlIGFkZHJlc3MsIHRpbWVvdXRzLCBldGMpLiAgVGhlc2UgaW9jdGxzIHRha2UgYWR2YW50YWdlIG9mIGFueSBoYXJkd2FyZQogKiBmZWF0dXJlcyBidWlsdCBpbnRvIHRoZSBjb250cm9sbGVyIGZvciB3aGljaCB0aGlzIGFsZ29yaXRobS1hZGFwdGVyIHNldAogKiB3YXMgd3JpdHRlbi4gIFRoZXNlIGlvY3RscyBhbGxvdyB5b3UgdG8gdGFrZSBjb250cm9sIG9mIHRoZSBkYXRhIGFuZCBjbG9jawogKiBsaW5lcyBhbmQgc2V0IHRoZSBlaXRoZXIgaGlnaCBvciBsb3csCiAqIHNpbWlsYXIgdG8gYSBHUElPIHBpbi4KICovCnN0YXRpYyBpbnQgYWxnb19jb250cm9sKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgCgl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoKICBzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmFkYXAgPSBhZGFwdGVyLT5hbGdvX2RhdGE7CiAgc3RydWN0IGkyY19paWNfbXNnIHNfbXNnOwogIGNoYXIgKmJ1ZjsKCWludCByZXQ7CgogIGlmIChjbWQgPT0gSTJDX1NSRUFEKSB7CgkJaWYoY29weV9mcm9tX3VzZXIoJnNfbXNnLCAoc3RydWN0IGkyY19paWNfbXNnICopYXJnLCAKCQkJCXNpemVvZihzdHJ1Y3QgaTJjX2lpY19tc2cpKSkgCgkJCXJldHVybiAtRUZBVUxUOwoJCWJ1ZiA9IGttYWxsb2Moc19tc2cubGVuLCBHRlBfS0VSTkVMKTsKCQlpZiAoYnVmPT0gTlVMTCkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qIEZsdXNoIEZJRk8gKi8KCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDRkNSLCBJVEVfSTJDRkNSX0ZMVVNIKTsKCgkJLyogTG9hZCBhZGRyZXNzICovCgkJaWljX291dHcoYWRhcCwgSVRFX0kyQ1NBUixzX21zZy5hZGRyPDwxKTsKCQlpaWNfb3V0dyhhZGFwLCBJVEVfSTJDU1NBUixzX21zZy53YWRkciAmIDB4ZmYpOwoKCQlyZXQgPSBpaWNfcmVhZGJ5dGVzKGFkYXB0ZXIsIGJ1Ziwgc19tc2cubGVuLCAxKTsKCQlpZiAocmV0Pj0wKSB7CgkJCWlmKGNvcHlfdG9fdXNlciggc19tc2cuYnVmLCBidWYsIHNfbXNnLmxlbikgKSAKCQkJCXJldCA9IC1FRkFVTFQ7CgkJfQoJCWtmcmVlKGJ1Zik7Cgl9CglyZXR1cm4gMDsKfQoKCnN0YXRpYyB1MzIgaWljX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTCB8IEkyQ19GVU5DXzEwQklUX0FERFIgfCAKCSAgICAgICBJMkNfRlVOQ19QUk9UT0NPTF9NQU5HTElORzsgCn0KCi8qIC0tLS0tZXhwb3J0ZWQgYWxnb3JpdGhtIGRhdGE6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KCnN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpaWNfYWxnbyA9IHsKCS5tYXN0ZXJfeGZlcgk9IGlpY194ZmVyLAoJLmFsZ29fY29udHJvbAk9IGFsZ29fY29udHJvbCwgLyogaW9jdGwgKi8KCS5mdW5jdGlvbmFsaXR5CT0gaWljX2Z1bmMsCn07CgoKLyogCiAqIHJlZ2lzdGVyaW5nIGZ1bmN0aW9ucyB0byBsb2FkIGFsZ29yaXRobXMgYXQgcnVudGltZSAKICovCmludCBpMmNfaWljX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQp7CglzdHJ1Y3QgaTJjX2FsZ29faWljX2RhdGEgKmlpY19hZGFwID0gYWRhcC0+YWxnb19kYXRhOwoKCWlmIChpaWNfdGVzdCkgewoJCWludCByZXQgPSB0ZXN0X2J1cyhpaWNfYWRhcCwgYWRhcC0+bmFtZSk7CgkJaWYgKHJldDwwKQoJCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglERUIyKHByaW50aygiaTJjLWFsZ28taXRlOiBodyByb3V0aW5lcyBmb3IgJXMgcmVnaXN0ZXJlZC5cbiIsCgkgICAgICAgICAgICBhZGFwLT5uYW1lKSk7CgoJLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLwoJYWRhcC0+YWxnbyA9ICZpaWNfYWxnbzsKCglhZGFwLT50aW1lb3V0ID0gMTAwOwkvKiBkZWZhdWx0IHZhbHVlcywgc2hvdWxkCSovCglhZGFwLT5yZXRyaWVzID0gMzsJCS8qIGJlIHJlcGxhY2VkIGJ5IGRlZmluZXMJKi8KCWFkYXAtPmZsYWdzID0gMDsKCglpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CglpaWNfaW5pdChpaWNfYWRhcCk7CgoJcmV0dXJuIDA7Cn0KCgppbnQgaTJjX2lpY19kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKewoJaW50IHJlczsKCWlmICgocmVzID0gaTJjX2RlbF9hZGFwdGVyKGFkYXApKSA8IDApCgkJcmV0dXJuIHJlczsKCURFQjIocHJpbnRrKCJpMmMtYWxnby1pdGU6IGFkYXB0ZXIgdW5yZWdpc3RlcmVkOiAlc1xuIixhZGFwLT5uYW1lKSk7CgoJcmV0dXJuIDA7Cn0KCgppbnQgX19pbml0IGkyY19hbGdvX2lpY19pbml0ICh2b2lkKQp7CglwcmludGsoS0VSTl9JTkZPICJJVEUgaWljIChpMmMpIGFsZ29yaXRobSBtb2R1bGVcbiIpOwoJcmV0dXJuIDA7Cn0KCgp2b2lkIGkyY19hbGdvX2lpY19leGl0KHZvaWQpCnsKCXJldHVybjsKfQoKCkVYUE9SVF9TWU1CT0woaTJjX2lpY19hZGRfYnVzKTsKRVhQT1JUX1NZTUJPTChpMmNfaWljX2RlbF9idXMpOwoKLyogVGhlIE1PRFVMRV8qIG1hY3JvcyByZXNvbHZlIHRvIG5vdGhpbmcgaWYgTU9EVUxFUyBpcyBub3QgZGVmaW5lZAogKiB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZC4KICovCk1PRFVMRV9BVVRIT1IoIk1vbnRhVmlzdGEgU29mdHdhcmUgPHd3dy5tdmlzdGEuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIklURSBpaWMgYWxnb3JpdGhtIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShpaWNfdGVzdCwgYm9vbCwgMCk7Cm1vZHVsZV9wYXJhbShpMmNfZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwoKTU9EVUxFX1BBUk1fREVTQyhpaWNfdGVzdCwgIlRlc3QgaWYgdGhlIEkyQyBidXMgaXMgYXZhaWxhYmxlIik7Ck1PRFVMRV9QQVJNX0RFU0MoaTJjX2RlYnVnLAogICAgICAgICJkZWJ1ZyBsZXZlbCAtIDAgb2ZmOyAxIG5vcm1hbDsgMiwzIG1vcmUgdmVyYm9zZTsgOSBpaWMtcHJvdG9jb2wiKTsKCgovKiBUaGlzIGZ1bmN0aW9uIHJlc29sdmVzIHRvIGluaXRfbW9kdWxlICh0aGUgZnVuY3Rpb24gaW52b2tlZCB3aGVuIGEgbW9kdWxlCiAqIGlzIGxvYWRlZCB2aWEgaW5zbW9kKSB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCB3aXRoIE1PRFVMRVMgZGVmaW5lZC4KICogT3RoZXJ3aXNlIChpLmUuIGlmIHlvdSB3YW50IHRoaXMgZHJpdmVyIHN0YXRpY2FsbHkgbGlua2VkIHRvIHRoZSBrZXJuZWwpLAogKiBhIHBvaW50ZXIgdG8gdGhpcyBmdW5jdGlvbiBpcyBzdG9yZWQgaW4gYSB0YWJsZSBhbmQgY2FsbGVkCiAqIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGtlcm5lbCAoaW4gZG9fYmFzaWNfc2V0dXAgaW4gL2luaXQvbWFpbi5jKSAKICoKICogQWxsIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjb21wbGVtZW50cyBvZiB0aGUgbWFjcm9zIGRlZmluZWQgaW4gbGludXgvaW5pdC5oCiAqLwptb2R1bGVfaW5pdChpMmNfYWxnb19paWNfaW5pdCk7CgoKLyogSWYgTU9EVUxFUyBpcyBkZWZpbmVkIHdoZW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkLCB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbAogKiByZXNvbHZlZCB0byBjbGVhbnVwX21vZHVsZS4KICovCm1vZHVsZV9leGl0KGkyY19hbGdvX2lpY19leGl0KTsK