LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fZmlsdGVyLmMKICogVmVyc2lvbjogICAgICAgCiAqIERlc2NyaXB0aW9uOiAgIAogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgRnJpIEphbiAyOSAxMToxNjozOCAxOTk5CiAqIE1vZGlmaWVkIGF0OiAgIFNhdCBPY3QgMzAgMTI6NTg6NDUgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY29tbW9uLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9maWx0ZXIuaD4KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2ZpbHRlcl9yZXF1ZXN0IChzZWxmLCBza2IpCiAqCiAqICAgIEhhbmRsZSBmaWx0ZXIgcmVxdWVzdCBmcm9tIGNsaWVudCBwZWVyIGRldmljZQogKgogKi8Kdm9pZCBpcmxhbl9maWx0ZXJfcmVxdWVzdChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9ESVJFQ1RFRCkgJiYgCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9vcGVyYXRpb24gPT0gRFlOQU1JQykpCgl7CgkJSVJEQV9ERUJVRygwLCAiR2l2aW5nIHBlZXIgYSBkeW5hbWljIEV0aGVybmV0IGFkZHJlc3NcbiIpOwoJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzBdID0gMHg0MDsKCQlzZWxmLT5wcm92aWRlci5tYWNfYWRkcmVzc1sxXSA9IDB4MDA7CgkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbMl0gPSAweDAwOwoJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzNdID0gMHgwMDsKCQkKCQkvKiBVc2UgYXJiaXRyYXRpb24gdmFsdWUgdG8gZ2VuZXJhdGUgTUFDIGFkZHJlc3MgKi8KCQlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpIHsKCQkJc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3NbNF0gPSAKCQkJCXNlbGYtPnByb3ZpZGVyLnNlbmRfYXJiX3ZhbCAmIDB4ZmY7CgkJCXNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzWzVdID0gCgkJCQkoc2VsZi0+cHJvdmlkZXIuc2VuZF9hcmJfdmFsID4+IDgpICYgMHhmZjsKCQl9IGVsc2UgewoJCQkvKiBKdXN0IGdlbmVyYXRlIHNvbWV0aGluZyBmb3Igbm93ICovCgkJCWdldF9yYW5kb21fYnl0ZXMoc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3MrNCwgMSk7CgkJCWdldF9yYW5kb21fYnl0ZXMoc2VsZi0+cHJvdmlkZXIubWFjX2FkZHJlc3MrNSwgMSk7CgkJfQoKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzICovCgkJc2tiLT5kYXRhWzFdID0gMHgwMzsKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsKCQlpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc2tiLCAiTUFYX0VOVFJZIiwgMHgwMDAxKTsKCQlpcmxhbl9pbnNlcnRfYXJyYXlfcGFyYW0oc2tiLCAiRklMVEVSX0VOVFJZIiwgCgkJCQkJIHNlbGYtPnByb3ZpZGVyLm1hY19hZGRyZXNzLCA2KTsKCQlyZXR1cm47Cgl9CgkKCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fRElSRUNURUQpICYmIAoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBGSUxURVIpKQoJewoJCUlSREFfREVCVUcoMCwgIkRpcmVjdGVkIGZpbHRlciBvblxuIik7CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CgkJcmV0dXJuOwoJfQoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9ESVJFQ1RFRCkgJiYgCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IE5PTkUpKQoJewoJCUlSREFfREVCVUcoMCwgIkRpcmVjdGVkIGZpbHRlciBvZmZcbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCglpZiAoKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID09IElSTEFOX0JST0FEQ0FTVCkgJiYgCgkgICAgKHNlbGYtPnByb3ZpZGVyLmZpbHRlcl9tb2RlID09IEZJTFRFUikpCgl7CgkJSVJEQV9ERUJVRygwLCAiQnJvYWRjYXN0IGZpbHRlciBvblxuIik7CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CgkJcmV0dXJuOwoJfQoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9CUk9BRENBU1QpICYmIAoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBOT05FKSkKCXsKCQlJUkRBX0RFQlVHKDAsICJCcm9hZGNhc3QgZmlsdGVyIG9mZlxuIik7CgkJc2tiLT5kYXRhWzBdID0gMHgwMDsgLyogU3VjY2VzcyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CgkJcmV0dXJuOwoJfQoJaWYgKChzZWxmLT5wcm92aWRlci5maWx0ZXJfdHlwZSA9PSBJUkxBTl9NVUxUSUNBU1QpICYmIAoJICAgIChzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9PSBGSUxURVIpKQoJewoJCUlSREFfREVCVUcoMCwgIk11bHRpY2FzdCBmaWx0ZXIgb25cbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fTVVMVElDQVNUKSAmJiAKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPT0gTk9ORSkpCgl7CgkJSVJEQV9ERUJVRygwLCAiTXVsdGljYXN0IGZpbHRlciBvZmZcbiIpOwoJCXNrYi0+ZGF0YVswXSA9IDB4MDA7IC8qIFN1Y2Nlc3MgKi8KCQlza2ItPmRhdGFbMV0gPSAweDAwOwoJCXJldHVybjsKCX0KCWlmICgoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPT0gSVJMQU5fTVVMVElDQVNUKSAmJiAKCSAgICAoc2VsZi0+cHJvdmlkZXIuZmlsdGVyX29wZXJhdGlvbiA9PSBHRVQpKQoJewoJCUlSREFfREVCVUcoMCwgIk11bHRpY2FzdCBmaWx0ZXIgZ2V0XG4iKTsKCQlza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBTdWNjZXNzPyAqLwoJCXNrYi0+ZGF0YVsxXSA9IDB4MDI7CgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJOT05FIik7CgkJaXJsYW5faW5zZXJ0X3Nob3J0X3BhcmFtKHNrYiwgIk1BWF9FTlRSWSIsIDE2KTsKCQlyZXR1cm47Cgl9Cglza2ItPmRhdGFbMF0gPSAweDAwOyAvKiBDb21tYW5kIG5vdCBzdXBwb3J0ZWQgKi8KCXNrYi0+ZGF0YVsxXSA9IDB4MDA7CgoJSVJEQV9ERUJVRygwLCAiTm90IGltcGxlbWVudGVkIVxuIik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGNoZWNrX3JlcXVlc3RfcGFyYW0gKHNlbGYsIHBhcmFtLCB2YWx1ZSkKICoKICogICAgQ2hlY2sgcGFyYW1ldGVycyBpbiByZXF1ZXN0IGZyb20gcGVlciBkZXZpY2UKICoKICovCnZvaWQgaXJsYW5fY2hlY2tfY29tbWFuZF9wYXJhbShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGNoYXIgKnBhcmFtLCBjaGFyICp2YWx1ZSkKewoJX191OCAqYnl0ZXM7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJYnl0ZXMgPSB2YWx1ZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCUlSREFfREVCVUcoNCwgIiVzLCAlc1xuIiwgcGFyYW0sIHZhbHVlKTsKCgkvKgoJICogIFRoaXMgaXMgZXhwZXJpbWVudGFsISEgREIuCgkgKi8KCSBpZiAoc3RyY21wKHBhcmFtLCAiTU9ERSIpID09IDApIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlzZWxmLT51c2VfdWRhdGEgPSBUUlVFOwoJCXJldHVybjsKCX0KCgkvKgoJICogIEZJTFRFUl9UWVBFCgkgKi8KCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfVFlQRSIpID09IDApIHsKCQlpZiAoc3RyY21wKHZhbHVlLCAiRElSRUNURUQiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl90eXBlID0gSVJMQU5fRElSRUNURUQ7CgkJCXJldHVybjsKCQl9CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIk1VTFRJQ0FTVCIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPSBJUkxBTl9NVUxUSUNBU1Q7CgkJCXJldHVybjsKCQl9CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkJST0FEQ0FTVCIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX3R5cGUgPSBJUkxBTl9CUk9BRENBU1Q7CgkJCXJldHVybjsKCQl9Cgl9CgkvKgoJICogIEZJTFRFUl9NT0RFCgkgKi8KCWlmIChzdHJjbXAocGFyYW0sICJGSUxURVJfTU9ERSIpID09IDApIHsKCQlpZiAoc3RyY21wKHZhbHVlLCAiQUxMIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9IEFMTDsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoc3RyY21wKHZhbHVlLCAiRklMVEVSIikgPT0gMCkgewoJCQlzZWxmLT5wcm92aWRlci5maWx0ZXJfbW9kZSA9IEZJTFRFUjsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoc3RyY21wKHZhbHVlLCAiTk9ORSIpID09IDApIHsKCQkJc2VsZi0+cHJvdmlkZXIuZmlsdGVyX21vZGUgPSBGSUxURVI7CgkJCXJldHVybjsKCQl9Cgl9CgkvKgoJICogIEZJTFRFUl9PUEVSQVRJT04KCSAqLwoJaWYgKHN0cmNtcChwYXJhbSwgIkZJTFRFUl9PUEVSQVRJT04iKSA9PSAwKSB7CgkJaWYgKHN0cmNtcCh2YWx1ZSwgIkRZTkFNSUMiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9vcGVyYXRpb24gPSBEWU5BTUlDOwoJCQlyZXR1cm47CgkJfQoJCWlmIChzdHJjbXAodmFsdWUsICJHRVQiKSA9PSAwKSB7CgkJCXNlbGYtPnByb3ZpZGVyLmZpbHRlcl9vcGVyYXRpb24gPSBHRVQ7CgkJCXJldHVybjsKCQl9Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3ByaW50X2ZpbHRlciAoZmlsdGVyX3R5cGUsIGJ1ZikKICoKICogICAgUHJpbnQgc3RhdHVzIG9mIGZpbHRlci4gVXNlZCBieSAvcHJvYyBmaWxlIHN5c3RlbQogKgogKi8KI2lmZGVmIENPTkZJR19QUk9DX0ZTCiNkZWZpbmUgTUFTSzJTVFIobSxzKQl7IC5tYXNrID0gbSwgLnN0ciA9IHMgfQoKdm9pZCBpcmxhbl9wcmludF9maWx0ZXIoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBmaWx0ZXJfdHlwZSkKewoJc3RhdGljIHN0cnVjdCB7CgkJaW50IG1hc2s7CgkJY29uc3QgY2hhciAqc3RyOwoJfSBmaWx0ZXJfbWFzazJzdHJbXSA9IHsKCQlNQVNLMlNUUihJUkxBTl9ESVJFQ1RFRCwJIkRJUkVDVEVEIiksCgkJTUFTSzJTVFIoSVJMQU5fRlVOQ1RJT05BTCwJIkZVTkNUSU9OQUwiKSwKCQlNQVNLMlNUUihJUkxBTl9HUk9VUCwJCSJHUk9VUCIpLAoJCU1BU0syU1RSKElSTEFOX01BQ19GUkFNRSwJIk1BQ19GUkFNRSIpLAoJCU1BU0syU1RSKElSTEFOX01VTFRJQ0FTVCwJIk1VTFRJQ0FTVCIpLAoJCU1BU0syU1RSKElSTEFOX0JST0FEQ0FTVCwJIkJST0FEQ0FTVCIpLAoJCU1BU0syU1RSKElSTEFOX0lQWF9TT0NLRVQsCSJJUFhfU09DS0VUIiksCgkJTUFTSzJTVFIoMCwJCQlOVUxMKQoJfSwgKnA7CgoJZm9yIChwID0gZmlsdGVyX21hc2syc3RyOyBwLT5zdHI7IHArKykgewoJCWlmIChmaWx0ZXJfdHlwZSAmIHAtPm1hc2spCgkJCXNlcV9wcmludGYoc2VxLCAiJXMgIiwgcC0+c3RyKTsKCX0KCXNlcV9wdXRjKHNlcSwgJ1xuJyk7Cn0KI3VuZGVmIE1BU0syU1RSCiNlbmRpZgo=