LyoKICogTVNXU09DSyBzcGVjaWZpYyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IChDKSAyMDAzIEFuZHLpIEpvaGFuc2VuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJtc3dzb2NrLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXN3c29jayk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjY2VwdEV4IChNU1dTT0NLLkApCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhY2NlcHQgYSBuZXcgY29ubmVjdGlvbiwgZ2V0IHRoZSBsb2NhbCBhbmQgcmVtb3RlCiAqIGFkZHJlc3MsIGFuZCByZWNlaXZlIHRoZSBpbml0aWFsIGJsb2NrIG9mIGRhdGEgc2VudCBieSB0aGUgY2xpZW50LgogKgogKiBUT0RPCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHN0dWIuCiAqLwoKQk9PTCBXSU5BUEkgQWNjZXB0RXgoCglTT0NLRVQgc0xpc3RlblNvY2tldCwgLyogW2luXSBEZXNjcmlwdG9yIGlkZW50aWZ5aW5nIGEgc29ja2V0IHRoYXQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggdGhlIGxpc3RlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAqLwoJU09DS0VUIHNBY2NlcHRTb2NrZXQsIC8qIFtpbl0gRGVzY3JpcHRvciBpZGVudGlmeWluZyBhIHNvY2tldCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdG8gYWNjZXB0IGFuIGluY29taW5nIGNvbm5lY3Rpb24gKi8KCVBWT0lEIGxwT3V0cHV0QnVmZmVyLCAvKiBbaW5dICBQb2ludGVyIHRvIGEgYnVmZmVyICovCglEV09SRCBkd1JlY2VpdmVEYXRhTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiBscE91dHB1dEJ1ZmZlcgoJCQkJICAgICAgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGFjdHVhbCByZWNlaXZlIGRhdGEKCQkJCSAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLwoJRFdPUkQgZHdMb2NhbEFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCSAgICAgICBsb2NhbCBhZGRyZXNzIGluZm9ybWF0aW9uICovCglEV09SRCBkd1JlbW90ZUFkZHJlc3NMZW5ndGgsIC8qIFtpbl0gTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUKCQkJCQlyZW1vdGUgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJTFBEV09SRCBscGR3Qnl0ZXNSZWNlaXZlZCwgLyogW291dF0gUG9pbnRlciB0byBhIERXT1JEIHRoYXQgcmVjZWl2ZXMKCQkJCSAgICAgIHRoZSBjb3VudCBvZiBieXRlcyByZWNlaXZlZCAqLwoJTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCkgLyogW2luXSBTcGVjaWZ5IGluIG9yZGVyIHRvIGFjaGlldmUgYW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBlZCAoYXN5bmNocm9ub3VzKSBJL08gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uICovCnsKICAgIEZJWE1FKCIobGlzdGVuPSVsZCwgYWNjZXB0PSVsZCwgJXAsICVkLCAlZCwgJWQsICVwLCAlcCksIG5vdCBpbXBsZW1lbnRlZFxuIiwKCXNMaXN0ZW5Tb2NrZXQsc0FjY2VwdFNvY2tldCxscE91dHB1dEJ1ZmZlcixkd1JlY2VpdmVEYXRhTGVuZ3RoLAoJZHdMb2NhbEFkZHJlc3NMZW5ndGgsZHdSZW1vdGVBZGRyZXNzTGVuZ3RoLGxwZHdCeXRlc1JlY2VpdmVkLGxwT3ZlcmxhcHBlZAogICAgKTsKICAgIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRBY2NlcHRFeFNvY2thZGRycyAoTVNXU09DSy5AKQogKi8KVk9JRCBXSU5BUEkgR2V0QWNjZXB0RXhTb2NrYWRkcnMoCglQVk9JRCBscE91dHB1dEJ1ZmZlciwgLyogW2luXSBQb2ludGVyIHRvIGEgYnVmZmVyICovCglEV09SRCBkd1JlY2VpdmVEYXRhTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHVzZWQKCQkJCSAgICAgIGZvciByZWNlaXZpbmcgdGhlIGZpcnN0IGRhdGEgKi8KCURXT1JEIGR3TG9jYWxBZGRyZXNzTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyByZXNlcnZlZCBmb3IgdGhlCgkJCQkgICAgICAgbG9jYWwgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLwoJRFdPUkQgZHdSZW1vdGVBZGRyZXNzTGVuZ3RoLCAvKiBbaW5dIE51bWJlciBvZiBieXRlcyByZXNlcnZlZCBmb3IgdGhlCgkJCQkJcmVtb3RlIGFkZHJlc3MgaW5mb3JtYXRpb24gKi8KCXN0cnVjdCBzb2NrYWRkciAqKkxvY2FsU29ja2FkZHIsIC8qIFtvdXRdIFBvaW50ZXIgdG8gdGhlIHNvY2thZGRyCgkJCQkJICAgIHN0cnVjdHVyZSB0aGF0IHJlY2VpdmVzIHRoZSBsb2NhbAoJCQkJCSAgICBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW9uICAqLwoJTFBJTlQgTG9jYWxTb2NrYWRkckxlbmd0aCwgLyogW291dF0gU2l6ZSBpbiBieXRlcyBvZiB0aGUgbG9jYWwKCQkJCSAgICAgIGFkZHJlc3MgKi8KCXN0cnVjdCBzb2NrYWRkciAqKlJlbW90ZVNvY2thZGRyLCAvKiBbb3V0XSBQb2ludGVyIHRvIHRoZSBzb2NrYWRkcgoJCQkJCSAgICAgc3RydWN0dXJlIHRoYXQgcmVjZWl2ZXMgdGhlIHJlbW90ZQoJCQkJCSAgICAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiAqLwoJTFBJTlQgUmVtb3RlU29ja2FkZHJMZW5ndGgpIC8qIFtvdXRdIFNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbW90ZSBhZGRyZXNzICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVRyYW5zbWl0RmlsZSAoTVNXU09DSy5AKQogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJhbnNtaXQgYSBmaWxlIG92ZXIgc29ja2V0LgogKgogKiBUT0RPCiAqICBUaGlzIGZ1bmN0aW9uIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHN0dWIuCiAqLwoKQk9PTCBXSU5BUEkgVHJhbnNtaXRGaWxlKAogICAgICAgIFNPQ0tFVCBoU29ja2V0LCAvKiBbaW5dIEhhbmRsZSB0byBhIGNvbm5lY3RlZCBzb2NrZXQgKi8KCUhBTkRMRSBoRmlsZSwgICAvKiBbaW5dIEhhbmRsZSB0byB0aGUgb3BlbiBmaWxlIHRoYXQgc2hvdWxkIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkICovCglEV09SRCBuTnVtYmVyT2ZCeXRlc1RvV3JpdGUsIC8qIFtpbl0gTnVtYmVyIG9mIGZpbGUgYnl0ZXMgdG8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdCAqLwoJRFdPUkQgbk51bWJlck9mQnl0ZXNQZXJTZW5kLCAvKiBbaW5dIFNpemUgaW4gYnl0ZXMgb2YgZWFjaCBibG9jayBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc2VudCBpbiBlYWNoIHNlbmQgb3BlcmF0aW9uICovCglMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkLCAvKiBbaW5dIFNwZWNpZnkgaW4gb3JkZXIgdG8gYWNoaWV2ZSBhbiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwcGVkIChhc3luY2hyb25vdXMpIEkvTyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gKi8KCUxQVFJBTlNNSVRfRklMRV9CVUZGRVJTIGxwVHJhbnNtaXRCdWZmZXJzLCAKCQkvKiBbaW5dIENvbnRhaW5zIHBvaW50ZXJzIHRvIGRhdGEgdG8gc2VuZCBiZWZvcmUgYW5kIGFmdGVyCiAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBkYXRhIGlzIHNlbnQgKi8KCURXT1JEIGR3RmxhZ3MpIC8qIFtpbl0gRmxhZ3MgKi8KewogICAgRklYTUUoIm5vdCBpbXBsZW1lbnRlZFxuIik7CgogICAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVdTQVJlY3ZFeCAoTVNXU09DSy5AKQogKi8KSU5UIFdJTkFQSSBXU0FSZWN2RXgoCglTT0NLRVQgcywgICAvKiBbaW5dIERlc2NyaXB0b3IgaWRlbnRpZnlpbmcgYSBjb25uZWN0ZWQgc29ja2V0ICovCgljaGFyICpidWYsICAvKiBbb3V0XSBCdWZmZXIgZm9yIHRoZSBpbmNvbWluZyBkYXRhICovCglJTlQgbGVuLCAgICAvKiBbaW5dIExlbmd0aCBvZiBidWYsIGluIGJ5dGVzICovCiAgICAgICAgSU5UICpmbGFncykgLyogW2luL291dF0gSW5kaWNhdG9yIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbWVzc2FnZSBpcwoJICAgICAgICAgICAgICAgZnVsbHkgb3IgcGFydGlhbGx5IHJlY2VpdmVkIGZvciBkYXRhZ3JhbSBzb2NrZXRzICovCnsKICAgIEZJWE1FKCJub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgCiAgICByZXR1cm4gU09DS0VUX0VSUk9SOwp9Cg==