LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsKCS4gPSAweDM4N2MwMDAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFdoZXJlIGJvb3Rjb2RlIGluIHRoZSBmbGFzaCBpcyBtYXBwZWQgKi8KCS50ZXh0ICA6IHsgKigudGV4dCk7IH0KCgkuID0gQUxJR04oNCk7Cgkucm9kYXRhIDogeyAqKC5yb2RhdGEpICooLnJvZGF0YS5zdHIxLjEpICooLnJvZGF0YS5zdHIxLjMyKSB9CgoJLiA9IDB4NDAwMDAwOwkgICAgICAgICAgICAgICAgICAgIC8qIFJhbSBkYXRhIHNlZ21lbnQgdG8gdXNlICovCglfaTM4NmJvb3Rfcm9tZGF0YV9kZXN0ID0gQUJTT0xVVEUoLik7CgkuZGF0YSA6IEFUICggTE9BREFERFIoLnJvZGF0YSkgKyBTSVpFT0YoLnJvZGF0YSkgKSB7ICooLmRhdGEpIH0KCV9pMzg2Ym9vdF9yb21kYXRhX3N0YXJ0ID0gTE9BREFERFIoLmRhdGEpOwoKCS4gPSBBTElHTig0KTsKCS5nb3QgOiBBVCAoIExPQURBRERSKC5kYXRhKSArIFNJWkVPRiguZGF0YSkgKSB7ICooLmdvdCkgfQoJX2kzODZib290X3JvbWRhdGFfc2l6ZSA9IFNJWkVPRiguZGF0YSkgKyBTSVpFT0YoLmdvdCk7CgoKCS4gPSBBTElHTig0KTsKCV9pMzg2Ym9vdF9ic3Nfc3RhcnQgPSBBQlNPTFVURSguKTsKCS5ic3MgKE5PTE9BRCkgOiB7ICooLmJzcykgfQoJX2kzODZib290X2Jzc19zaXplID0gU0laRU9GKC5ic3MpOwoKCgkvKiAxNmJpdCByZWFsbW9kZSB0cmFtcG9saW5lIGNvZGUgKi8KCS5yZWFsbW9kZSAweDdjMCA6IEFUICggTE9BREFERFIoLmdvdCkgKyBTSVpFT0YoLmdvdCkgKSB7ICooLnJlYWxtb2RlKSB9CgoJX2kzODZib290X3JlYWxtb2RlID0gTE9BREFERFIoLnJlYWxtb2RlKTsKCV9pMzg2Ym9vdF9yZWFsbW9kZV9zaXplID0gU0laRU9GKC5yZWFsbW9kZSk7CgoJLyogMTZiaXQgQklPUyBlbXVsYXRpb24gY29kZSAoanVzdCBlbm91Z2ggdG8gYm9vdCBMaW51eCkgKi8KCS5iaW9zIDAgOiBBVCAoIExPQURBRERSKC5yZWFsbW9kZSkgKyBTSVpFT0YoLnJlYWxtb2RlKSApIHsgKiguYmlvcykgfQoKCV9pMzg2Ym9vdF9iaW9zID0gTE9BREFERFIoLmJpb3MpOwoJX2kzODZib290X2Jpb3Nfc2l6ZSA9IFNJWkVPRiguYmlvcyk7CgoKICAuID0gLjsKICBfX3VfYm9vdF9jbWRfc3RhcnQgPSAuOwogIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CiAgX191X2Jvb3RfY21kX2VuZCA9IC47CgoKCS8qIFRoZSBsb2FkIGFkZHJlc3NlcyBiZWxvdyBhc3N1bWVzIHRoYXQgdGhlIGZsYXNoCgkgKiB3aWxsIGJlIG1hcHBlZCBzbyB0aGF0IDB4Mzg3ZjAwMDAgPT0gMHhmZmZmMDAwMAoJICogYXQgcmVzZXQgdGltZQoJICoKCSAqIFRoZSBmZTAwIGFuZCBmZjAwIG9mZnNldHMgb2YgdGhlIHN0YXJ0MzIgYW5kIHN0YXJ0MTYKCSAqIHNlZ21lbnRzIGFyZSBhcmJpdHJhcnksIHRoZSBqdXN0IGhhdmUgdG8gYmUgbWFwcGVkCgkgKiBhdCByZXNldCBhbmQgdGhlIGNvZGUgaGF2ZSB0byBmaXQuCgkgKiBUaGUgZmZmMCBvZmZzZXQgb2YgcmVzZXQgaXMgaW1wb3J0YW50LCBob3dldmVyLgoJICovCgoKCS4gPSAweGZmZmZmZTAwOwoJLnN0YXJ0MzIgOiBBVCAoMHgzODdmZmUwMCkgeyAqKC5zdGFydDMyKTsgfQoKCS4gPSAweGZmMDA7Cgkuc3RhcnQxNiA6IEFUICgweDM4N2ZmZjAwKSB7ICooLnN0YXJ0MTYpOyB9CgoJLiA9IDB4ZmZmMDsKCS5yZXNldCA6IEFUICgweDM4N2ZmZmYwKSB7ICooLnJlc2V0KTsgfQoJX2kzODZib290X2VuZCA9IChMT0FEQUREUigucmVzZXQpICsgU0laRU9GKC5yZXNldCkgKTsKfQo=