LyoKICogV2luZWZpbGUKICogR2VybWFuIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDIwMDAgTWFydGluIEZ1Y2hzCiAqIENvcHlyaWdodCAyMDAyIFN0ZXZlbiBFZHdhcmRzCiAqIENvcHlyaWdodCAyMDAyIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU4KI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKCgovKiBNZW51ICovCgpJRE1fV0lORUZJTEUgTUVOVSBGSVhFRCBJTVBVUkUKewoJUE9QVVAgIiZEYXRlaSIgIHsKCQlNRU5VSVRFTSAi1iZmZm5lblx0RWluZ2FiZXRhc3RlIiAsCQkJMTAxCgkJTUVOVUlURU0gIiZWZXJzY2hpZWJlbi4uLlx0RjciICwgCQkJMTA2CgkJTUVOVUlURU0gIiZLb3BpZXJlbi4uLlx0RjgiICwJCQkxMDcKCQlNRU5VSVRFTSAiJkluIFp3aXNjaGVuYWJsYWdlLi4uXHRGOSIgLAkJMTE4CgkJTUVOVUlURU0gIiZM9nNjaGVuXHRFbnRmIiAsCQkJMTA4CgkJTUVOVUlURU0gIiZVbWJlbmVubmVuLi4uIiAsCQkJMTA5CgkJTUVOVUlURU0gIiZFaWdlbnNjaGFmdGVuLi4uXHRBbHQrRWluZ2FiZXRhc3RlIiAsIElEX0VESVRfUFJPUEVSVElFUwoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJLJm9tcHJpbWllcmVuLi4uIiAsCQkxMTkKCQlNRU5VSVRFTSAiRGVrbyZtcHJpbWllcmVuLi4uIiAsCQkxMjAKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkF1c2b8aHJlbi4uLiIgLAkJCUlEX0VYRUNVVEUKCQlNRU5VSVRFTSAiJkRydWNrZW4uLi4iICwgCQkJMTAyCgkJTUVOVUlURU0gIlp1b3JkJm5lbi4uLiIgLAkJMTAzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIlZlciZ6ZWljaG5pcyBlcnN0ZWxsZW4uLi4iICwJCQkxMTEKCQlNRU5VSVRFTSAiJlN1Y2hlbi4uLiIgLAkJCTEwNAoJCU1FTlVJVEVNICJEYXRlaWVuIGF1cyZ35GhsZW4uLi4iICwJCQkxMTYKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJkJlZW5kZW5cdEFsdCtYIiAsIAkJCUlEX0ZJTEVfRVhJVAoJfQoKCVBPUFVQICJEYSZ0ZW50cuRnZXIiICB7CgkJTUVOVUlURU0gIkRhdGVudHLkZ2VyICZrb3BpZXJlbi4uLiIgLAkJCTIwMQoJCU1FTlVJVEVNICJEYXRlbnRy5GdlciAmYmVuZW5uZW4uLi4iICwJCQkyMDIKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiRGF0ZW50cuRnZXIgJmZvcm1hdGllcmVuLi4uIiAsCQkJMjAzCiNpZmRlZiBfV0lOOTUKCQlNRU5VSVRFTSAiLi4uIiwJCQktMQkvL0BACiNlbmRpZgoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJOZXR6d2Vya2xhdWZ3ZXJrICZ2ZXJiaW5kZW4uLi4iICwJCQkyNTIKCQlNRU5VSVRFTSAiTmV0endlcmtsYXVmd2VyayAmdHJlbm5lbi4uLiIgLAkJMjUzCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkYmcmVpZ2ViZW4gYWxzLi4uIiAsCQkJMjU0CgkJTUVOVUlURU0gIkZyZWlnYWJlIGJlZW4mZGVuLi4uIiAsCQkJMjU1CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkxhdWZ3ZXJrIGF1cyZ35GhsZW4uLi4iICwJCQkyNTEKCX0KCgoJUE9QVVAgIiZWZXJ6ZWljaG5pc3NlIiAgewoJCU1FTlVJVEVNICImTuRjaHN0ZSBFYmVuZSBlaW5ibGVuZGVuXHQrIiAsCQkJMzAxCgkJTUVOVUlURU0gIiZad2VpZyBlaW5ibGVuZGVuXHQqIiAsCQkzMDIKCQlNRU5VSVRFTSAiQWxsZSAmRWJlbmVuIGVpbmJsZW5kZW5cdFN0cmcrKiIgLAkJMzAzCgkJTUVOVUlURU0gIlp3ZWlnICZhdXNibGVuZGVuXHQtIiAsCQkJMzA0CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZWZXJ6d2VpZ3VuZ2VuIGtlbm56ZWljaG5lbiIgLAkJCQk1MDUKCX0KCglQT1BVUCAiJkFuc2ljaHQiICB7CgkJTUVOVUlURU0gIlN0cnVrdHVyICZ1bmQgVmVyemVpY2huaXMiICwJCQk0MTMKCQlNRU5VSVRFTSAiTnVyIFN0JnJ1a3R1ciIgLAkJCTQxMQoJCU1FTlVJVEVNICJOdXIgJlZlcnplaWNobmlzIiAsCQkJNDEyCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZUZWlsZW4iICwJCQk0MTQKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiJk5hbWUiICwJCQlJRF9WSUVXX05BTUUKCQlNRU5VSVRFTSAiQSZsbGUgRGF0ZWlhbmdhYmVuIiAsCQkJCUlEX1ZJRVdfQUxMX0FUVFJJQlVURVMsIENIRUNLRUQKCQlNRU5VSVRFTSAiJkJlc3RpbW10ZSBEYXRlaWFuZ2FiZW4uLi4iICwJCQlJRF9WSUVXX1NFTEVDVEVEX0FUVFJJQlVURVMKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAiTmFjaCBOJmFtZSIgLAkJNDA0CgkJTUVOVUlURU0gIk5hY2ggVCZ5cCIgLAkJNDA1CgkJTUVOVUlURU0gIk5hY2ggJkdy9t9lIiAsIAkJNDA2CgkJTUVOVUlURU0gIk5hY2ggJkRhdHVtIiAsIAkJNDA3CgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIkFuZ2FiZW4gYXVzdybkaGxlbi4uLiIgLAkJCTQwOQoJfQoKCVBPUFVQICImT3B0aW9uZW4iICB7CgkJTUVOVUlURU0gIiZCZXN05HRpZ2VuLi4uIiAsCQktMQoJCU1FTlVJVEVNICJTY2hyaWZ0JmFydC4uLiIgLAkJCS0xCgkJTUVOVUlURU0gIlN5bWJvbGxlaXN0ZSAmZGVmaW5pZXJlbi4uLiIgLCAtMQoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICJTeSZtYm9sbGVpc3RlIiAsCQlJRF9WSUVXX1RPT0xfQkFSLCBDSEVDS0VECgkJTUVOVUlURU0gIkxhdWYmd2Vya2xlaXN0ZSIgLAkJSURfVklFV19EUklWRV9CQVIsIENIRUNLRUQKCQlNRU5VSVRFTSAiJlN0YXR1c2xlaXN0ZSIgLAlJRF9WSUVXX1NUQVRVU0JBUiwgQ0hFQ0tFRAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gIlZvbGxiJmlsZFx0U3RyZytVbXNjaGFsdCtTIiAsIAlJRF9WSUVXX0ZVTExTQ1JFRU4KI2VuZGlmCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIiZTeW1ib2wgbmFjaCBQcm9ncmFtbXN0YXJ0IiAsCQktMQoJCU1FTlVJVEVNICImRWluc3RlbGx1bmdlbiBiZWltIEJlZW5kZW4gc3BlaWNoZXJuIiAsCQkJNTExCgl9CgoJUE9QVVAgIiZTaWNoZXJoZWl0IiAgewoJCU1FTlVJVEVNICImQmVyZWNodGlndW5nZW4uLi4iICwJCTYwNQoJCU1FTlVJVEVNICLcYmVyJndhY2hlbi4uLiIgLAkJCTYwNgoJCU1FTlVJVEVNICJCZXNpJnR6ZXIuLi4iICwJCTYwNwoJfQoKCVBPUFVQICImRmVuc3RlciIgIHsKCQlNRU5VSVRFTSAiTmV1ZXMgJkZlbnN0ZXIiICwJCQlJRF9XSU5ET1dfTkVXCgkJTUVOVUlURU0gItxiZXImbGFwcGVuZFx0VW1zY2hhbHQrRjUiICwJCUlEX1dJTkRPV19DQVNDQURFCgkJTUVOVUlURU0gIiZVbnRlcmVpbmFuZGVyIiAsCQlJRF9XSU5ET1dfVElMRV9IT1JaCgkJTUVOVUlURU0gIiZOZWJlbmVpbmFuZGVyXHRVbXNjaGFsdCtGNCIgLAkJSURfV0lORE9XX1RJTEVfVkVSVAojaWZuZGVmIF9OT19FWFRFTlNJT05TCgkJTUVOVUlURU0gImF1JnRvbWF0aXNjaCBhbm9yZG5lbiIgLAkJSURfV0lORE9XX0FVVE9TT1JUCiNlbmRpZgoJCU1FTlVJVEVNICImU3ltYm9sZSBhbm9yZG5lbiIgLAkJSURfV0lORE9XX0FSUkFOR0UKCQlNRU5VSVRFTSAiJkFrdHVhbGlzaWVyZW5cdEY1IiAsCQlJRF9SRUZSRVNICgl9CgoJUE9QVVAgIiY/IiAgewoJCU1FTlVJVEVNICImSGlsZmV0aGVtZW5cdEYxIiAsCQkJSURfSEVMUAoJCU1FTlVJVEVNICImU3VjaGVuLi4uXHRGMSIgLAkJCUlEX0hFTFAKCQlNRU5VSVRFTSAiSGlsZmUgJnZlcndlbmRlblx0RjEiICwJCQlJRF9IRUxQX1VTSU5HCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJUE9QVVAgIkluZiZvLi4uIiAgewoJCSAgTUVOVUlURU0gIkluZm8g/GJlciAmV2luZS4uLiIgLAkJCUlEX0FCT1VUX1dJTkUKLy8JCSAgTUVOVUlURU0gIiZMaXplbnoiCQlJRF9MSUNFTlNFCi8vCQkgIE1FTlVJVEVNICImS0VJTkUgR0FSQU5USUUiCQlJRF9OT19XQVJSQU5UWQoJCX0KCX0KfQoKCklERF9FWEVDVVRFIERJQUxPRyBGSVhFRCBJTVBVUkUgMTUsIDEzLCAyMTAsIDYzClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkF1c2b8aHJlbiIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglDT05UUk9MIAkJIiIsIDEwMSwgIlN0YXRpYyIsIFNTX1NJTVBMRXxTU19OT1BSRUZJWCwgMywgNiwgMTYyLCAxMAoJQ09OVFJPTCAJCSJCZWZlaGxzJnplaWxlOiIgLCAtMSwgIlN0YXRpYyIsIFNTX0xFRlROT1dPUkRXUkFQfFdTX0dST1VQLCAzLCAxOCwgNjAsIDEwCglFRElUVEVYVAkJMjAxLCAzLCAyOSwgMTM0LCAxMiwgRVNfQVVUT0hTQ1JPTEwKCUNPTlRST0wgCQkiQWxzICZTeW1ib2wiICwgMjE0LCAiQnV0dG9uIiwgQlNfQVVUT0NIRUNLQk9YfFdTX1RBQlNUT1AsMywgNDUsIDcxLCAxMgoJREVGUFVTSEJVVFRPTgkiT0siICwgMSwgMTU4LCA2LCA0NywgMTQKCVBVU0hCVVRUT04JCSJBYmJyZWNoZW4iICwgMiwgMTU4LCAyMywgNDcsIDE0CglQVVNIQlVUVE9OCQkiJkhpbGZlIiAsIDI1NCwgMTU4LCA0MywgNDcsIDE0Cn0K