LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgZ2lyYmlsLmMKICogVmVyc2lvbjogICAgICAgMS4yCiAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgR3JlZW53aWNoIEdJckJJTCBkb25nbGUKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBGZWIgIDYgMjE6MDI6MzMgMTk5OQogKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjIwIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiAKICogICAgIENvcHlyaWdodCAoYykgMTk5OSBEYWcgQnJhdHRsaSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgICAKICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAogKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqICAKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKiAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgoKc3RhdGljIGludCAgZ2lyYmlsX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOwpzdGF0aWMgdm9pZCBnaXJiaWxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOwpzdGF0aWMgdm9pZCBnaXJiaWxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOwpzdGF0aWMgaW50ICBnaXJiaWxfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOwoKLyogQ29udHJvbCByZWdpc3RlciAxICovCiNkZWZpbmUgR0lSQklMX1RYRU4gICAgMHgwMSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KI2RlZmluZSBHSVJCSUxfUlhFTiAgICAweDAyIC8qIEVuYWJsZSByZWNlaXZlciAqLwojZGVmaW5lIEdJUkJJTF9FQ0FOICAgIDB4MDQgLyogQ2FuY2VsIHNlbGYgZW1taXRlZCBkYXRhICovCiNkZWZpbmUgR0lSQklMX0VDSE8gICAgMHgwOCAvKiBFY2hvIGNvbnRyb2wgY2hhcmFjdGVycyAqLwoKLyogTEVEIEN1cnJlbnQgUmVnaXN0ZXIgKDB4MikgKi8KI2RlZmluZSBHSVJCSUxfSElHSCAgICAweDIwCiNkZWZpbmUgR0lSQklMX01FRElVTSAgMHgyMQojZGVmaW5lIEdJUkJJTF9MT1cgICAgIDB4MjIKCi8qIEJhdWQgcmVnaXN0ZXIgKDB4MykgKi8KI2RlZmluZSBHSVJCSUxfMjQwMCAgICAweDMwCiNkZWZpbmUgR0lSQklMXzQ4MDAgICAgMHgzMQkKI2RlZmluZSBHSVJCSUxfOTYwMCAgICAweDMyCiNkZWZpbmUgR0lSQklMXzE5MjAwICAgMHgzMwojZGVmaW5lIEdJUkJJTF8zODQwMCAgIDB4MzQJCiNkZWZpbmUgR0lSQklMXzU3NjAwICAgMHgzNQkKI2RlZmluZSBHSVJCSUxfMTE1MjAwICAweDM2CgovKiBNb2RlIHJlZ2lzdGVyICgweDQpICovCiNkZWZpbmUgR0lSQklMX0lSREEgICAgMHg0MAojZGVmaW5lIEdJUkJJTF9BU0sgICAgIDB4NDEKCi8qIENvbnRyb2wgcmVnaXN0ZXIgMiAoMHg1KSAqLwojZGVmaW5lIEdJUkJJTF9MT0FEICAgIDB4NTEgLyogTG9hZCB0aGUgbmV3IGJhdWQgcmF0ZSB2YWx1ZSAqLwoKc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKCS50eXBlID0gSVJEQV9HSVJCSUxfRE9OR0xFLAoJLm9wZW4gPSBnaXJiaWxfb3BlbiwKCS5jbG9zZSA9IGdpcmJpbF9jbG9zZSwKCS5yZXNldCA9IGdpcmJpbF9yZXNldCwKCS5jaGFuZ2Vfc3BlZWQgPSBnaXJiaWxfY2hhbmdlX3NwZWVkLAoJLm93bmVyID0gVEhJU19NT0RVTEUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBnaXJiaWxfaW5pdCh2b2lkKQp7CglyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgZ2lyYmlsX2NsZWFudXAodm9pZCkKewoJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cn0KCnN0YXRpYyB2b2lkIGdpcmJpbF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKewoJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMzsKfQoKc3RhdGljIHZvaWQgZ2lyYmlsX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQp7CgkvKiBQb3dlciBvZmYgZG9uZ2xlICovCglzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGdpcmJpbF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCiAqCiAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBHaXJiaWwgdHlwZSBkb25nbGUuCiAqCiAqLwpzdGF0aWMgaW50IGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKewoJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CglfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CglfX3U4IGNvbnRyb2xbMl07CglpbnQgcmV0ID0gMDsKCglzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKCglzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CgljYXNlIElSREFfVEFTS19JTklUOgoJCS8qIE5lZWQgdG8gcmVzZXQgdGhlIGRvbmdsZSBhbmQgZ28gdG8gOTYwMCBicHMgYmVmb3JlCiAgICAgICAgICAgICAgICAgICBwcm9ncmFtbWluZyAqLwoJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBnaXJiaWxfcmVzZXQsIE5VTEwsIHRhc2ssIAoJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKQoJCXsKCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCgkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKCgkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCgkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CgkJfQoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKCQlXQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0ID0gLTE7CgkJYnJlYWs7CgljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgoJCS8qIFNldCBEVFIgYW5kIENsZWFyIFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKCgkJc3dpdGNoIChzcGVlZCkgewoJCWNhc2UgOTYwMDoKCQlkZWZhdWx0OgoJCQljb250cm9sWzBdID0gR0lSQklMXzk2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTkyMDA6CgkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfMTkyMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzQ4MDA6CgkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfMzg0MDA7CgkJCWJyZWFrOwoJCWNhc2UgNTc2MDA6CgkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfNTc2MDA7CgkJCWJyZWFrOwoJCWNhc2UgMTE1MjAwOgoJCQljb250cm9sWzBdID0gR0lSQklMXzExNTIwMDsKCQkJYnJlYWs7CgkJfQoJCWNvbnRyb2xbMV0gPSBHSVJCSUxfTE9BRDsKCQkKCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCgkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCBjb250cm9sLCAyKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CgkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDApOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfV0FJVDoKCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCgkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CgkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUVSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CgkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CgkJcmV0ID0gLTE7CgkJYnJlYWs7Cgl9CglyZXR1cm4gcmV0Owp9CgovKgogKiBGdW5jdGlvbiBnaXJiaWxfcmVzZXQgKGRyaXZlcikKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgZ2lyYmlsIGRvbmdsZS4KICoKICogICAgICBBbGdvcml0aG06CiAqICAgIAkgIDAuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDUgbXMgCiAqICAgICAgICAxLiBjbGVhciBSVFMgCiAqLwpzdGF0aWMgaW50IGdpcmJpbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQp7Cglkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKCV9fdTggY29udHJvbCA9IEdJUkJJTF9UWEVOIHwgR0lSQklMX1JYRU47CglpbnQgcmV0ID0gMDsKCglzZWxmLT5yZXNldF90YXNrID0gdGFzazsKCglzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CgljYXNlIElSREFfVEFTS19JTklUOgoJCS8qIFJlc2V0IGRvbmdsZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOwoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMSk7CgkJLyogU2xlZXAgYXQgbGVhc3QgNSBtcyAqLwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CgkJLyogU2V0IERUUiBhbmQgY2xlYXIgUlRTIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOwoJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMik7CgkJcmV0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CgkJYnJlYWs7CgljYXNlIElSREFfVEFTS19XQUlUMjoKCQkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsICZjb250cm9sLCAxKTsKCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDMpOwoJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOwoJCWJyZWFrOwoJY2FzZSBJUkRBX1RBU0tfV0FJVDM6CgkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLwoJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwoJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlFUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CgkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwoJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOwoJCXJldCA9IC0xOwoJCWJyZWFrOwoJfQoJcmV0dXJuIHJldDsKfQoKTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Ck1PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNCIpOyAvKiBJUkRBX0dJUkJJTF9ET05HTEUgKi8KCQovKgogKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKICoKICogICAgSW5pdGlhbGl6ZSBHaXJiaWwgbW9kdWxlCiAqCiAqLwptb2R1bGVfaW5pdChnaXJiaWxfaW5pdCk7CgovKgogKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKICoKICogICAgQ2xlYW51cCBHaXJiaWwgbW9kdWxlCiAqCiAqLwptb2R1bGVfZXhpdChnaXJiaWxfY2xlYW51cCk7Cgo=