LyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgSHVtYXggQ28uLCBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIEh1bWF4IENvLiwgTHRkLiAoIkh1bWF4IikgaGVyZWJ5IHByb3ZpZGVzIHBlcm1pc3Npb24sIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkKICogcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb3VyY2UgY29kZSwgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcwogKiBzb3VyY2UgY29kZSB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCiAqIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogcGVybWlzc2lvbiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSFVNQVggIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQUNDVVJBQ1ksIENPTVBMRVRFTkVTUywKICogQ1VSUkVOQ1ksIEFWQUlMQUJJTElUWSwgVElUTEUgT1IgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgSFVNQVggT1IKICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCiAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CiAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAogKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgogKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSElTCiAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKiBUaGUgdmlld3MgYW5kIGNvbmNsdXNpb24gY29udGFpbmVkIGluIHRoZSBzb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbiBhcmUKICogdGhvc2Ugb2YgdGhlIGF1dGhvcnMgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgcmVwcmVzZW50aW5nIG9mZmljaWFsCiAqIHBvbGljaWVzLCBlaXRoZXIgZXhwcmVzc2VkIG9yIGltcGxpZWQsIG9mIEh1bWF4LgogKgogKiBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCB1bmRlciBubyBjaXJjdW1zdGFuY2VzIG1heSB5b3UgY29tYmluZSB0aGlzCiAqIHNvZnR3YXJlIGluIGFueSB3YXkgd2l0aCBhbnkgb3RoZXIgSHVtYXi/cyBzb2Z0d2FyZSBwcm92aWRlZCB1bmRlciBhIGxpY2Vuc2UKICogb3RoZXIgdGhhbiB0aGUgYWJvdmUgbGljZW5zZSwgd2l0aG91dCBIdW1heCdzIGV4cHJlc3MgcHJpb3Igd3JpdHRlbiBjb25zZW50LgogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqIEZpbGUgRGVzY3JpcHRpb24gKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRmlsZSBOYW1lOiAgICAgICAgICAgJFdvcmtmaWxlOiAgIGhteF91cHJhZGVfZmxhc2guYyAgJAogKiBWZXJzaW9uOiAgICAgICAgICAgICAkUmV2aXNpb246ICAgMS4wICAkCiAqIE9yaWdpbmFsIEF1dGhvcjogICAgIFlhbmcgSHl1biBVayAkCiAqIEN1cnJlbnQgQXV0aG9yOiAgICAgICRBdXRob3I6IGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tICQKICogRGF0ZTogICAgICAgICAgICAgICAgJERhdGU6IDIwMTEuMDkuMzAKICogRmlsZSBEZXNjcmlwdGlvbjogICAgSHVtYXggVXBncmFkZSBBUElzCiAqIE1vZHVsZToKICogUmVtYXJrczoKICovCgovKioKICogQGRlZmdyb3VwIFVQR1JBREVfRkxBU0ggRmxhc2hpbmcgQVBJcyBmb3IgVXBncmFkZSBNb2R1bGUKICogQGluZ3JvdXAgVVBHUkFERQogKgogKi8KCi8qKgogKiBAYXV0aG9yIEh5dW51ayBZYW5nKGh1eWFuZ0BodW1heGRpZ2l0YWwuY29tKQogKiBAZGF0ZSAzMCBTZXB0IDIwMTEKICovCgogLypAeyovCgovKioKICogQGZpbGUgaG14X3VwZ3JhZGVfZmxhc2guYwogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBIZWFkZXIgRmlsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IEluY2x1ZGluZyBIZWFkZXIgRmlsZXMgKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvbW91bnQuaD4KI2luY2x1ZGUgPG10ZC9tdGQtdXNlci5oPgovKiBFbmQgSW5jbHVkaW5nIEhlYWRlcnMgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBkZWZpbmUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBTdGFydCAjZGVmaW5lICovCi8qIHRoaXMgaXMgZm9yIHRlc3QgKi8KI2RlZmluZSBUQVJHRVRfTlZSQU1fTVREICAgICAgICAiL2Rldi9tdGQvaG52cmFtIgovKiBFbmQgI2RlZmluZSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdHlwZWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogU3RhcnQgdHlwZWRlZiAqLwovKiBFbmQgdHlwZWRlZiAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IGdsb2JhbCB2YXJpYWJsZSAqLwppbnQgbGlidXBncmFkZV92ZXJib3NlID0gMTsKLyogRW5kIGdsb2JhbCB2YXJpYWJsZSAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqIHN0YXRpYyB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIFN0YXJ0IHN0YXRpYyB2YXJpYWJsZSAqLwovKiBFbmQgc3RhdGljIHZhcmlhYmxlICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKiBzdGF0aWMgZnVudGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgSE1YX1VQR1JBREVfTlZSQU1fV3JpdGUodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUgKQp7CiAgaW50IHJldDsKICB2b2lkICpidWY7CiAgY2hhciAqcnBhdGg7CiAgY2hhciAqcDsKICBpbnQgZmRfbnZyYW07CgogIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4bHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOwoKICBidWYgPSBtYWxsb2Moc2l6ZSk7CiAgaWYgKCFidWYpIHsKICAgIHBlcnJvcigibWFsbG9jIik7CiAgICByZXR1cm4gLTE7CiAgfQoKICBycGF0aCA9IHJlYWxwYXRoKFRBUkdFVF9OVlJBTV9NVEQsIE5VTEwpOwogIGlmICghcnBhdGgpIHsKICAgIHBlcnJvcigicmVhbHBhdGgiKTsKICAgIGZyZWUoYnVmKTsKICAgIHJldHVybiAtMTsKICB9CgogIGZkX252cmFtID0gb3BlbihycGF0aCwgKE9fUkRXUiB8IE9fU1lOQykpOwogIGlmIChmZF9udnJhbSA8IDApIHsKICAgIHJldCA9IC0xOwogICAgcGVycm9yKHJwYXRoKTsKICAgIGdvdG8gb3V0X2ZyZWU7CiAgfQoKICByZXQgPSBsc2VlayhmZF9udnJhbSwgb2Zmc2V0LCBTRUVLX1NFVCk7CiAgaWYgKHJldCA8IDApIHsKICAgIHBlcnJvcigibHNlZWsiKTsKICAgIGdvdG8gb3V0X2Nsb3NlOwogIH0KCiAgcmV0ID0gcmVhZChmZF9udnJhbSwgYnVmLCBzaXplKTsKICBpZiAocmV0IDwgMCkgewogICAgcGVycm9yKCJyZWFkIik7CiAgICBnb3RvIG91dF9jbG9zZTsKICB9CgogIC8qIE9ubHkgd3JpdGUgdG8gZmxhc2ggaWYgZGF0YSBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuICovCiAgaWYgKHJldCA9PSBzaXplICYmICFtZW1jbXAoZGF0YSwgYnVmLCBzaXplKSkgewogICAgcmV0ID0gMDsKICAgIGdvdG8gb3V0X2Nsb3NlOwogIH0KCiAgcmV0ID0gbHNlZWsoZmRfbnZyYW0sIG9mZnNldCwgU0VFS19TRVQpOwogIGlmIChyZXQgPCAwKSB7CiAgICBwZXJyb3IoImxzZWVrIik7CiAgICBnb3RvIG91dF9jbG9zZTsKICB9CgogIHJldCA9IHdyaXRlKGZkX252cmFtLCBkYXRhLCBzaXplKTsKICBpZiAocmV0IDwgMCkgewogICAgcGVycm9yKCJ3cml0ZSIpOwogICAgZ290byBvdXRfY2xvc2U7CiAgfQoKICAvKgogICAqIElmIGhudnJhbSBpcyBvbiBNTUMgcGFydGl0aW9uLCB3ZSBjYW5ub3QgZmx1c2ggdGhlIHBhcnRpdGlvbi4KICAgKiBJbnN0ZWFkLCB3ZSBuZWVkIHRvIGZsdXNoIHRoZSBlbnRpcmUgTU1DIGRldmljZS4KICAgKiBGb3IgZXhhbXBsZSwgR0ZDSDEwMCBobnZyYW0gcGFydGl0aW9uIGlzIGF0IC9kZXYvbW1jYmxrMHAxLAogICAqIHNvIHdlIG5lZWQgdG8gZmx1c2ggL2Rldi9tbWNibGswLgogICAqLwogIHAgPSBzdHJzdHIocnBhdGgsICJtbWNibGsiKTsKICBpZiAocCkgewogICAgcCA9IHN0cmNocihwICsgNiwgJ3AnKTsKICAgIGlmIChwKSB7CiAgICAgICpwID0gJ1wwJzsKICAgICAgY2xvc2UoZmRfbnZyYW0pOwogICAgICBmZF9udnJhbSA9IG9wZW4ocnBhdGgsIChPX1JEV1IgfCBPX1NZTkMpKTsKICAgICAgaWYgKGZkX252cmFtIDwgMCkgewogICAgICAgIHJldCA9IC0xOwogICAgICAgIHBlcnJvcihycGF0aCk7CiAgICAgICAgZ290byBvdXRfZnJlZTsKICAgICAgfQogICAgfQogIH0KCiAgLyoKICAgKiBXcml0ZXMgdG8gL2Rldi9tdGRibG9ja1ggYXJlIGNhY2hlZCBpbmRlZmluaXRlbHkgdW50aWwgdGhlIGxhc3QgZmlsZQogICAqIGRlc2NyaXB0b3IgaXMgY2xvc2VkLiBGbHVzaCB0aGlzIGNhY2hlIGFmdGVyIHdyaXRpbmcuIFRoZSB1c2VyIGRlcGVuZHMgb24KICAgKiBkYXRhIGJlaW5nIHBoeXNpY2FsbHkgd3JpdHRlbiB0byBmbGFzaCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAgKiBSZXF1aXJlcyBDQVBfU1lTX0FETUlOLgogICAqLwogIHJldCA9IGlvY3RsKGZkX252cmFtLCBCTEtGTFNCVUYsIDApOwogIGlmIChyZXQgPCAwKSB7CiAgICBwZXJyb3IoImlvY3RsKGhudnJhbSwgQkxLRkxTQlVGLCAwKSIpOwogICAgZ290byBvdXRfY2xvc2U7CiAgfQoKICByZXQgPSAwOwoKb3V0X2Nsb3NlOgogIGNsb3NlKGZkX252cmFtKTsKb3V0X2ZyZWU6CiAgZnJlZShycGF0aCk7CiAgZnJlZShidWYpOwogIHJldHVybiByZXQ7Cn0KCmludCBITVhfVVBHUkFERV9OVlJBTV9SZWFkKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBjaGFyICogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUgKQp7CiAgY2hhciAqcnBhdGg7CiAgaW50IGZkX252cmFtOwogIGludCByZXQ7CgogIGlmIChsaWJ1cGdyYWRlX3ZlcmJvc2UpIHByaW50ZigiWyVzXSBvZmZzZXQgJTA4bHgsIHNpemUgJWQsIGRhdGEgPSAlMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9mZnNldCwgc2l6ZSwgZGF0YVswXSApOwoKICBycGF0aCA9IHJlYWxwYXRoKFRBUkdFVF9OVlJBTV9NVEQsIE5VTEwpOwogIGlmICghcnBhdGgpIHsKICAgIHBlcnJvcigicmVhbHBhdGgiKTsKICAgIHJldHVybiAtMTsKICB9CgogIGZkX252cmFtID0gb3BlbihycGF0aCwgKE9fUkRXUiB8IE9fU1lOQykpOwogIGlmIChmZF9udnJhbSA8IDApIHsKICAgIHJldCA9IC0xOwogICAgcGVycm9yKHJwYXRoKTsKICAgIGdvdG8gb3V0X2ZyZWU7CiAgfQoKICByZXQgPSBsc2VlayhmZF9udnJhbSwgb2Zmc2V0LCBTRUVLX1NFVCk7CiAgaWYgKHJldCA8IDApIHsKICAgIHBlcnJvcigibHNlZWsiKTsKICAgIGdvdG8gb3V0X2Nsb3NlOwogIH0KCiAgcmV0ID0gcmVhZChmZF9udnJhbSwgZGF0YSwgc2l6ZSk7CiAgaWYgKHJldCA8IDApIHsKICAgIHBlcnJvcigicmVhZCIpOwogICAgZ290byBvdXRfY2xvc2U7CiAgfQoKICByZXQgPSAwOwoKb3V0X2Nsb3NlOgogIGNsb3NlKGZkX252cmFtKTsKb3V0X2ZyZWU6CiAgZnJlZShycGF0aCk7CiAgcmV0dXJuIHJldDsKfQoKCi8qQH0qLwo=