Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBVcHNhbXBsaW5nIC8gZG93bnNhbXBsaW5nIGZpbHRlcnMKLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBfRklMVEVSU19IXwojZGVmaW5lIF9GSUxURVJTX0hfCgovKioKIENHZW5lcmljRmlsdGVyIGlzIGEgZ2VuZXJpYyBhYnN0cmFjdCBmaWx0ZXIgY2xhc3MgdXNlZCB0byBhY2Nlc3MgdG8gdGhlIGZpbHRlciBsaWJyYXJ5Ljxicj4KIEZpbHRlcnMgdXNlZCBpbiB0aGlzIGxpYnJhcnkgaGF2ZSBiZWVuIG1haW5seSB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyA6IDxicj4KPGI+TWFpbiByZWZlcmVuY2U8L2I+IDogPGJyPgpQYXVsIEhlY2tiZXJ0LCBDIGNvZGUgdG8gem9vbSByYXN0ZXIgaW1hZ2VzIHVwIG9yIGRvd24sIHdpdGggbmljZSBmaWx0ZXJpbmcuIApVQyBCZXJrZWxleSwgQXVndXN0IDE5ODkuIFtvbmxpbmVdIGh0dHA6Ly93d3ctMi5jcy5jbXUuZWR1L2Fmcy9jcy5jbXUuZWR1L1dlYi9QZW9wbGUvcGgvaGVja2JlcnQuaHRtbAoKPGI+SGVja2JlcnQgcmVmZXJlbmNlczwvYj4gOiA8YnI+Cjx1bD4KPGxpPk9wcGVuaGVpbSBBLlYuLCBTY2hhZmVyIFIuVy4sIERpZ2l0YWwgU2lnbmFsIFByb2Nlc3NpbmcsIFByZW50aWNlLUhhbGwsIDE5NzUKPGxpPkhhbW1pbmcgUi5XLiwgRGlnaXRhbCBGaWx0ZXJzLCBQcmVudGljZS1IYWxsLCBFbmdsZXdvb2QgQ2xpZmZzLCBOSiwgMTk4Mwo8bGk+UHJhdHQgVy5LLiwgRGlnaXRhbCBJbWFnZSBQcm9jZXNzaW5nLCBKb2huIFdpbGV5IGFuZCBTb25zLCAxOTc4CjxsaT5Ib3UgSC5TLiwgQW5kcmV3cyBILkMuLCAiQ3ViaWMgU3BsaW5lcyBmb3IgSW1hZ2UgSW50ZXJwb2xhdGlvbiBhbmQgRGlnaXRhbCBGaWx0ZXJpbmciLCAKSUVFRSBUcmFucy4gQWNvdXN0aWNzLCBTcGVlY2gsIGFuZCBTaWduYWwgUHJvYy4sIHZvbC4gQVNTUC0yNiwgbm8uIDYsIHBwLiA1MDgtNTE3LCBEZWMuIDE5NzguCjwvdWw+CgoqLwpjbGFzcyBDR2VuZXJpY0ZpbHRlcgp7CnByb3RlY3RlZDoKCiAgICAjZGVmaW5lIEZJTFRFUl9QSSAgZG91YmxlICgzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCiAgICAjZGVmaW5lIEZJTFRFUl8yUEkgZG91YmxlICgyLjAgKiAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCiAgICAjZGVmaW5lIEZJTFRFUl80UEkgZG91YmxlICg0LjAgKiAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUpCgogICAgLy8vIEZpbHRlciBzdXBwb3J0Cglkb3VibGUgIG1fZFdpZHRoOwoKcHVibGljOgogICAgCiAgICAvLy8gQ29uc3RydWN0b3IKCUNHZW5lcmljRmlsdGVyIChkb3VibGUgZFdpZHRoKSA6IG1fZFdpZHRoIChkV2lkdGgpIHt9CgkvLy8gRGVzdHJ1Y3RvcgogICAgdmlydHVhbCB+Q0dlbmVyaWNGaWx0ZXIoKSB7fQoKICAgIC8vLyBSZXR1cm5zIHRoZSBmaWx0ZXIgc3VwcG9ydAoJZG91YmxlIEdldFdpZHRoKCkgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kV2lkdGg7IH0KCS8vLyBDaGFuZ2UgdGhlIGZpbHRlciBzdXBvcnQKICAgIHZvaWQgICBTZXRXaWR0aCAoZG91YmxlIGRXaWR0aCkgICAgIHsgbV9kV2lkdGggPSBkV2lkdGg7IH0KCiAgICAvLy8gUmV0dXJucyBGKGRWYWwpIHdoZXJlIEYgaXMgdGhlIGZpbHRlcidzIGltcHVsc2UgcmVzcG9uc2UKCXZpcnR1YWwgZG91YmxlIEZpbHRlciAoZG91YmxlIGRWYWwpID0gMDsKfTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEZpbHRlcnMgbGlicmFyeQovLyBBbGwgZmlsdGVycyBhcmUgY2VudGVyZWQgb24gMAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyoqCiBCb3ggZmlsdGVyPGJyPgogQm94LCBwdWxzZSwgRm91cmllciB3aW5kb3csIDFzdCBvcmRlciAoY29uc3RhbnQpIGItc3BsaW5lLjxicj48YnI+CgogPGI+UmVmZXJlbmNlPC9iPiA6IDxicj4KIEdsYXNzbmVyIEEuUy4sIFByaW5jaXBsZXMgb2YgZGlnaXRhbCBpbWFnZSBzeW50aGVzaXMuIE1vcmdhbiBLYXVmbWFubiBQdWJsaXNoZXJzLCBJbmMsIFNhbiBGcmFuY2lzY28sIFZvbC4gMiwgMTk5NQoqLwpjbGFzcyBDQm94RmlsdGVyIDogcHVibGljIENHZW5lcmljRmlsdGVyCnsKcHVibGljOgogICAgLyoqCglDb25zdHJ1Y3Rvcjxicj4KCURlZmF1bHQgZml4ZWQgd2lkdGggPSAwLjUKCSovCiAgICBDQm94RmlsdGVyKCkgOiBDR2VuZXJpY0ZpbHRlcigwLjUpIHt9CiAgICB2aXJ0dWFsIH5DQm94RmlsdGVyKCkge30KCiAgICBkb3VibGUgRmlsdGVyIChkb3VibGUgZFZhbCkgeyByZXR1cm4gKGZhYnMoZFZhbCkgPD0gbV9kV2lkdGggPyAxLjAgOiAwLjApOyB9Cn07CgovKiogQmlsaW5lYXIgZmlsdGVyCiovCmNsYXNzIENCaWxpbmVhckZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgp7CnB1YmxpYzoKCiAgICBDQmlsaW5lYXJGaWx0ZXIgKCkgOiBDR2VuZXJpY0ZpbHRlcigxKSB7fQogICAgdmlydHVhbCB+Q0JpbGluZWFyRmlsdGVyKCkge30KCiAgICBkb3VibGUgRmlsdGVyIChkb3VibGUgZFZhbCkgewoJCWRWYWwgPSBmYWJzKGRWYWwpOyAKCQlyZXR1cm4gKGRWYWwgPCBtX2RXaWR0aCA/IG1fZFdpZHRoIC0gZFZhbCA6IDAuMCk7IAoJfQp9OwoKCi8qKgogTWl0Y2hlbGwgJiBOZXRyYXZhbGkncyB0d28tcGFyYW0gY3ViaWMgZmlsdGVyPGJyPgoKIFRoZSBwYXJhbWV0ZXJzIGIgYW5kIGMgY2FuIGJlIHVzZWQgdG8gYWRqdXN0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdWJpYy4gCiBUaGV5IGFyZSBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgImJsdXJyaW5nIiBhbmQgInJpbmdpbmciIHJlc3BlY3RpdmVseS4gCiBUaGUgZGVmYXVsdCBpcyBiID0gMS8zIGFuZCBjID0gMS8zLCB3aGljaCB3ZXJlIHRoZSB2YWx1ZXMgcmVjb21tZW5kZWQgYnkgCiBNaXRjaGVsbCBhbmQgTmV0cmF2YWxpIGFzIHlpZWxkaW5nIHRoZSBtb3N0IHZpc3VhbGx5IHBsZWFzaW5nIHJlc3VsdHMgaW4gc3ViamVjdGl2ZSB0ZXN0cyBvZiBodW1hbiBiZWluZ3MuIAogTGFyZ2VyIHZhbHVlcyBvZiBiIGFuZCBjIGNhbiBwcm9kdWNlIGludGVyZXN0aW5nIG9wLWFydCBlZmZlY3RzLS1mb3IgZXhhbXBsZSwgdHJ5IGIgPSAwIGFuZCBjID0gLTUuIDxicj48YnI+CgogPGI+UmVmZXJlbmNlPC9iPiA6IDxicj4KIERvbiBQLiBNaXRjaGVsbCBhbmQgQXJ1biBOLiBOZXRyYXZhbGksIFJlY29uc3RydWN0aW9uIGZpbHRlcnMgaW4gY29tcHV0ZXIgZ3JhcGhpY3MuIAogSW4gSm9obiBEaWxsLCBlZGl0b3IsIENvbXB1dGVyIEdyYXBoaWNzIChTSUdHUkFQSCAnODggUHJvY2VlZGluZ3MpLCBWb2wuIDIyLCBOby4gNCwgQXVndXN0IDE5ODgsIHBwLiAyMjEtMjI4LgoqLwpjbGFzcyBDQmljdWJpY0ZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgp7CnByb3RlY3RlZDoKCS8vIGRhdGEgZm9yIHBhcmFtZXRlcml6ZWQgTWl0Y2hlbGwgZmlsdGVyCiAgICBkb3VibGUgcDAsIHAyLCBwMzsKICAgIGRvdWJsZSBxMCwgcTEsIHEyLCBxMzsKCnB1YmxpYzoKICAgIC8qKgoJQ29uc3RydWN0b3I8YnI+CglEZWZhdWx0IGZpeGVkIHdpZHRoID0gMgoJQHBhcmFtIGIgRmlsdGVyIHBhcmFtZXRlciAoZGVmYXVsdCB2YWx1ZSBpcyAxLzMpCglAcGFyYW0gYyBGaWx0ZXIgcGFyYW1ldGVyIChkZWZhdWx0IHZhbHVlIGlzIDEvMykKCSovCiAgICBDQmljdWJpY0ZpbHRlciAoZG91YmxlIGIgPSAoMS8oZG91YmxlKTMpLCBkb3VibGUgYyA9ICgxLyhkb3VibGUpMykpIDogQ0dlbmVyaWNGaWx0ZXIoMikgewoJCXAwID0gKDYgLSAyKmIpIC8gNjsKCQlwMiA9ICgtMTggKyAxMipiICsgNipjKSAvIDY7CgkJcDMgPSAoMTIgLSA5KmIgLSA2KmMpIC8gNjsKCQlxMCA9ICg4KmIgKyAyNCpjKSAvIDY7CgkJcTEgPSAoLTEyKmIgLSA0OCpjKSAvIDY7CgkJcTIgPSAoNipiICsgMzAqYykgLyA2OwoJCXEzID0gKC1iIC0gNipjKSAvIDY7Cgl9CiAgICB2aXJ0dWFsIH5DQmljdWJpY0ZpbHRlcigpIHt9CgogICAgZG91YmxlIEZpbHRlcihkb3VibGUgZFZhbCkgeyAKCQlkVmFsID0gZmFicyhkVmFsKTsKCQlpZihkVmFsIDwgMSkKCQkJcmV0dXJuIChwMCArIGRWYWwqZFZhbCoocDIgKyBkVmFsKnAzKSk7CgkJaWYoZFZhbCA8IDIpCgkJCXJldHVybiAocTAgKyBkVmFsKihxMSArIGRWYWwqKHEyICsgZFZhbCpxMykpKTsKCQlyZXR1cm4gMDsKCX0KfTsKCi8qKgogQ2F0bXVsbC1Sb20gc3BsaW5lLCBPdmVyaGF1c2VyIHNwbGluZTxicj4KCiBXaGVuIHVzaW5nIENCaWN1YmljRmlsdGVyIGZpbHRlcnMsIHlvdSBoYXZlIHRvIHNldCBwYXJhbWV0ZXJzIGIgYW5kIGMgc3VjaCB0aGF0IDxicj4KIGIgKyAyICogYyA9IDE8YnI+CiBpbiBvcmRlciB0byB1c2UgdGhlIG51bWVyaWNhbGx5IG1vc3QgYWNjdXJhdGUgZmlsdGVyLjxicj4KIFRoaXMgZ2l2ZXMgZm9yIGIgPSAwIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBjID0gMC41LCB3aGljaCBpcyB0aGUgQ2F0bXVsbC1Sb20gCiBzcGxpbmUgYW5kIGEgZ29vZCBzdWdnZXN0aW9uIGZvciBzaGFycG5lc3MuPGJyPjxicj4KCgogPGI+UmVmZXJlbmNlczwvYj4gOiA8YnI+CiA8dWw+CiA8bGk+TWl0Y2hlbGwgRG9uIFAuLCBOZXRyYXZhbGkgQXJ1biBOLiwgUmVjb25zdHJ1Y3Rpb24gZmlsdGVycyBpbiBjb21wdXRlciBncmFwaGljcy4gCiBJbiBKb2huIERpbGwsIGVkaXRvciwgQ29tcHV0ZXIgR3JhcGhpY3MgKFNJR0dSQVBIICc4OCBQcm9jZWVkaW5ncyksIFZvbC4gMjIsIE5vLiA0LCBBdWd1c3QgMTk4OCwgcHAuIDIyMS0yMjguCiA8bGk+S2V5cyBSLkcuLCBDdWJpYyBDb252b2x1dGlvbiBJbnRlcnBvbGF0aW9uIGZvciBEaWdpdGFsIEltYWdlIFByb2Nlc3NpbmcuIAogSUVFRSBUcmFucy4gQWNvdXN0aWNzLCBTcGVlY2gsIGFuZCBTaWduYWwgUHJvY2Vzc2luZywgdm9sLiAyOSwgbm8uIDYsIHBwLiAxMTUzLTExNjAsIERlYy4gMTk4MS4KIDwvdWw+CgoqLwpjbGFzcyBDQ2F0bXVsbFJvbUZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgp7CnB1YmxpYzoKCiAgICAvKioKCUNvbnN0cnVjdG9yPGJyPgoJRGVmYXVsdCBmaXhlZCB3aWR0aCA9IDIKCSovCglDQ2F0bXVsbFJvbUZpbHRlcigpIDogQ0dlbmVyaWNGaWx0ZXIoMikge30KICAgIHZpcnR1YWwgfkNDYXRtdWxsUm9tRmlsdGVyKCkge30KCiAgICBkb3VibGUgRmlsdGVyKGRvdWJsZSBkVmFsKSB7IAoJCWlmKGRWYWwgPCAtMikgcmV0dXJuIDA7CgkJaWYoZFZhbCA8IC0xKSByZXR1cm4gKDAuNSooNCArIGRWYWwqKDggKyBkVmFsKig1ICsgZFZhbCkpKSk7CgkJaWYoZFZhbCA8IDApICByZXR1cm4gKDAuNSooMiArIGRWYWwqZFZhbCooLTUgLSAzKmRWYWwpKSk7CgkJaWYoZFZhbCA8IDEpICByZXR1cm4gKDAuNSooMiArIGRWYWwqZFZhbCooLTUgKyAzKmRWYWwpKSk7CgkJaWYoZFZhbCA8IDIpICByZXR1cm4gKDAuNSooNCArIGRWYWwqKC04ICsgZFZhbCooNSAtIGRWYWwpKSkpOwoJCXJldHVybiAwOwoJfQp9OwoKLyoqCiBMYW5jem9zLXdpbmRvd2VkIHNpbmMgZmlsdGVyPGJyPgogCiBMYW5jem9zMyBmaWx0ZXIgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gQ0JpY3ViaWNGaWx0ZXIgd2l0aCBoaWdoIHZhbHVlcyBvZiBjIGFib3V0IDAuNiAuLi4gMC43NSAKIHdoaWNoIHByb2R1Y2VzIHF1aXRlIHN0cm9uZyBzaGFycGVuaW5nLiBJdCB1c3VhbGx5IG9mZmVycyBiZXR0ZXIgcXVhbGl0eSAoZmV3ZXIgYXJ0aWZhY3RzKSBhbmQgYSBzaGFycCBpbWFnZS48YnI+PGJyPgoKKi8KY2xhc3MgQ0xhbmN6b3MzRmlsdGVyIDogcHVibGljIENHZW5lcmljRmlsdGVyCnsKcHVibGljOgogICAgLyoqCglDb25zdHJ1Y3Rvcjxicj4KCURlZmF1bHQgZml4ZWQgd2lkdGggPSAzCgkqLwoJQ0xhbmN6b3MzRmlsdGVyKCkgOiBDR2VuZXJpY0ZpbHRlcigzKSB7fQogICAgdmlydHVhbCB+Q0xhbmN6b3MzRmlsdGVyKCkge30KCiAgICBkb3VibGUgRmlsdGVyKGRvdWJsZSBkVmFsKSB7IAoJCWRWYWwgPSBmYWJzKGRWYWwpOyAKCQlpZihkVmFsIDwgbV9kV2lkdGgpCXsKCQkJcmV0dXJuIChzaW5jKGRWYWwpICogc2luYyhkVmFsIC8gbV9kV2lkdGgpKTsKCQl9CgkJcmV0dXJuIDA7Cgl9Cgpwcml2YXRlOgoJZG91YmxlIHNpbmMoZG91YmxlIHZhbHVlKSB7CgkJaWYodmFsdWUgIT0gMCkgewoJCQl2YWx1ZSAqPSBGSUxURVJfUEk7CgkJCXJldHVybiAoc2luKHZhbHVlKSAvIHZhbHVlKTsKCQl9IAoJCXJldHVybiAxOwoJfQp9OwoKLyoqCiA0dGggb3JkZXIgKGN1YmljKSBiLXNwbGluZTxicj4KCiovCmNsYXNzIENCU3BsaW5lRmlsdGVyIDogcHVibGljIENHZW5lcmljRmlsdGVyCnsKcHVibGljOgoKICAgIC8qKgoJQ29uc3RydWN0b3I8YnI+CglEZWZhdWx0IGZpeGVkIHdpZHRoID0gMgoJKi8KCUNCU3BsaW5lRmlsdGVyKCkgOiBDR2VuZXJpY0ZpbHRlcigyKSB7fQogICAgdmlydHVhbCB+Q0JTcGxpbmVGaWx0ZXIoKSB7fQoKICAgIGRvdWJsZSBGaWx0ZXIoZG91YmxlIGRWYWwpIHsgCgoJCWRWYWwgPSBmYWJzKGRWYWwpOwoJCWlmKGRWYWwgPCAxKSByZXR1cm4gKDQgKyBkVmFsKmRWYWwqKC02ICsgMypkVmFsKSkgLyA2OwoJCWlmKGRWYWwgPCAyKSB7CgkJCWRvdWJsZSB0ID0gMiAtIGRWYWw7CgkJCXJldHVybiAodCp0KnQgLyA2KTsKCQl9CgkJcmV0dXJuIDA7Cgl9Cn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXaW5kb3cgZnVuY3Rpb24gbGlicmFyeQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyoqIAogQmxhY2ttYW4gd2luZG93CiovCmNsYXNzIENCbGFja21hbkZpbHRlciA6IHB1YmxpYyBDR2VuZXJpY0ZpbHRlcgp7CnB1YmxpYzoKICAgIC8qKgoJQ29uc3RydWN0b3I8YnI+CglEZWZhdWx0IHdpZHRoID0gMC41CgkqLwogICAgQ0JsYWNrbWFuRmlsdGVyIChkb3VibGUgZFdpZHRoID0gZG91YmxlKDAuNSkpIDogQ0dlbmVyaWNGaWx0ZXIoZFdpZHRoKSB7fQogICAgdmlydHVhbCB+Q0JsYWNrbWFuRmlsdGVyKCkge30KCiAgICBkb3VibGUgRmlsdGVyIChkb3VibGUgZFZhbCkgewoJCWlmKGZhYnMgKGRWYWwpID4gbV9kV2lkdGgpIHsKCQkJcmV0dXJuIDA7IAogICAgICAgIH0KICAgICAgICBkb3VibGUgZE4gPSAyICogbV9kV2lkdGggKyAxOyAKCQlkVmFsIC89IChkTiAtIDEpOwogICAgICAgIHJldHVybiAwLjQyICsgMC41KmNvcyhGSUxURVJfMlBJKmRWYWwpICsgMC4wOCpjb3MoRklMVEVSXzRQSSpkVmFsKTsgCiAgICB9Cn07CgojZW5kaWYgIC8vIF9GSUxURVJTX0hfCg==