LyogbWNvb2tpZS5jIC0tIEdlbmVyYXRlcyByYW5kb20gbnVtYmVycyBmb3IgeGF1dGgKICogQ3JlYXRlZDogRnJpIEZlYiAgMyAxMDo0Mjo0OCAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUKICogUmV2aXNlZDogRnJpIE1hciAxOSAwNzo0ODowMSAxOTk5IGJ5IGZhaXRoQGFjbS5vcmcKICogUHVibGljIERvbWFpbiAxOTk1LCAxOTk5IFJpY2thcmQgRS4gRmFpdGggKGZhaXRoQGFjbS5vcmcpCiAqIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuCiAqIAogKiBUaGlzIHByb2dyYW0gZ2F0aGVycyBzb21lIHJhbmRvbSBiaXRzIG9mIGRhdGEgYW5kIHVzZWQgdGhlIE1ENQogKiBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0gdG8gZ2VuZXJhdGUgYSAxMjgtYml0IGhleGFkZWNpbWFsIG51bWJlciBmb3IKICogdXNlIHdpdGggeGF1dGgoMSkuCiAqCiAqIE5PVEU6IFVubGVzcyAvZGV2L3JhbmRvbSBpcyBhdmFpbGFibGUsIHRoaXMgcHJvZ3JhbSBkb2VzIG5vdCBhY3R1YWxseQogKiBnYXRoZXIgMTI4IGJpdHMgb2YgcmFuZG9tIGluZm9ybWF0aW9uLCBzbyB0aGUgbWFnaWMgY29va2llIGdlbmVyYXRlZAogKiB3aWxsIGJlIGNvbnNpZGVyYWJseSBlYXNpZXIgdG8gZ3Vlc3MgdGhhbiBvbmUgbWlnaHQgZXhwZWN0LgogKgogKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKiAxOTk5LTAzLTIxIGFlYjogQWRkZWQgc29tZSBmcmFnbWVudHMgb2YgY29kZSBmcm9tIENvbGluIFBsdW1iLgogKgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSAibWQ1LmgiCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlICJubHMuaCIKCiNkZWZpbmUgQlVGRkVSU0laRSA0MDk2CgpzdHJ1Y3Qgcm5ncyB7CiAgIGNvbnN0IGNoYXIgKnBhdGg7CiAgIGludCBtaW5sZW5ndGgsIG1heGxlbmd0aDsKfSBybmdzW10gPSB7CiAgIHsgIi9kZXYvcmFuZG9tIiwgICAgICAgICAgICAgIDE2LCAgMTYgfSwgLyogMTYgYnl0ZXMgPSAxMjggYml0cyBzdWZmaWNlICovCiAgIHsgIi9wcm9jL2ludGVycnVwdHMiLCAgICAgICAgICAwLCAgIDAgfSwKICAgeyAiL3Byb2Mvc2xhYmluZm8iLCAgICAgICAgICAgIDAsICAgMCB9LAogICB7ICIvcHJvYy9zdGF0IiwgICAgICAgICAgICAgICAgMCwgICAwIH0sCiAgIHsgIi9kZXYvdXJhbmRvbSIsICAgICAgICAgICAgIDMyLCAgNjQgfSwKfTsKI2RlZmluZSBSTkdTIChzaXplb2Yocm5ncykvc2l6ZW9mKHN0cnVjdCBybmdzKSkKCmludCBWZXJib3NlID0gMDsKCi8qIFRoZSBiYXNpYyBmdW5jdGlvbiB0byBoYXNoIGEgZmlsZSAqLwpzdGF0aWMgb2ZmX3QKaGFzaF9maWxlKHN0cnVjdCBNRDVDb250ZXh0ICpjdHgsIGludCBmZCkKewogICBvZmZfdCBjb3VudCA9IDA7CiAgIHNzaXplX3QgcjsKICAgdW5zaWduZWQgY2hhciBidWZbQlVGRkVSU0laRV07CgogICB3aGlsZSAoKHIgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkgPiAwKSB7CiAgICAgIE1ENVVwZGF0ZShjdHgsIGJ1Ziwgcik7CiAgICAgIGNvdW50ICs9IHI7CiAgIH0KICAgLyogU2VwYXJhdGUgZmlsZXMgd2l0aCBhIG51bGwgYnl0ZSAqLwogICBidWZbMF0gPSAwOwogICBNRDVVcGRhdGUoY3R4LCBidWYsIDEpOwogICByZXR1cm4gY291bnQ7Cn0KCmludCBtYWluKCBpbnQgYXJnYywgY2hhciAqKmFyZ3YgKQp7CiAgIGludCAgICAgICAgICAgICAgIGk7CiAgIHN0cnVjdCBNRDVDb250ZXh0IGN0eDsKICAgdW5zaWduZWQgY2hhciAgICAgZGlnZXN0WzE2XTsKICAgdW5zaWduZWQgY2hhciAgICAgYnVmW0JVRkZFUlNJWkVdOwogICBpbnQgICAgICAgICAgICAgICBmZDsKICAgaW50ICAgICAgICAgICAgICAgYzsKICAgcGlkX3QgICAgICAgICAgICAgcGlkOwogICBjaGFyICAgICAgICAgICAgICAqZmlsZSA9IE5VTEw7CiAgIGludCAgICAgICAgICAgICAgIHI7CiAgIHN0cnVjdCB0aW1ldmFsICAgIHR2OwogICBzdHJ1Y3QgdGltZXpvbmUgICB0ejsKCiAgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKICAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKICAgdGV4dGRvbWFpbihQQUNLQUdFKTsKCiAgIHdoaWxlICgoYyA9IGdldG9wdCggYXJnYywgYXJndiwgInZmOiIgKSkgIT0gLTEpCiAgICAgIHN3aXRjaCAoYykgewogICAgICBjYXNlICd2JzogKytWZXJib3NlOyAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2YnOiBmaWxlID0gb3B0YXJnOyBicmVhazsKICAgICAgfQoKICAgTUQ1SW5pdCggJmN0eCApOwogICBnZXR0aW1lb2ZkYXkoICZ0diwgJnR6ICk7CiAgIE1ENVVwZGF0ZSggJmN0eCwgKHVuc2lnbmVkIGNoYXIgKikmdHYsIHNpemVvZiggdHYgKSApOwoKICAgcGlkID0gZ2V0cHBpZCgpOwogICBNRDVVcGRhdGUoICZjdHgsICh1bnNpZ25lZCBjaGFyICopJnBpZCwgc2l6ZW9mKCBwaWQgKSk7CiAgIHBpZCA9IGdldHBpZCgpOwogICBNRDVVcGRhdGUoICZjdHgsICh1bnNpZ25lZCBjaGFyICopJnBpZCwgc2l6ZW9mKCBwaWQgKSk7CgogICBpZiAoZmlsZSkgewogICAgICBpbnQgY291bnQgPSAwOwogICAgICAKICAgICAgaWYgKGZpbGVbMF0gPT0gJy0nICYmICFmaWxlWzFdKQoJIGZkID0gZmlsZW5vKHN0ZGluKTsKICAgICAgZWxzZQoJIGZkID0gb3BlbiggZmlsZSwgT19SRE9OTFkgKTsKCiAgICAgIGlmIChmZCA8IDApIHsKCSBmcHJpbnRmKCBzdGRlcnIsIF8oIkNvdWxkIG5vdCBvcGVuICVzXG4iKSwgZmlsZSApOwogICAgICB9IGVsc2UgewogICAgICAgICBjb3VudCA9IGhhc2hfZmlsZSggJmN0eCwgZmQgKTsKCSBpZiAoVmVyYm9zZSkKCSAgICBmcHJpbnRmKCBzdGRlcnIsIF8oIkdvdCAlZCBieXRlcyBmcm9tICVzXG4iKSwgY291bnQsIGZpbGUgKTsKCgkgaWYgKGZpbGVbMF0gIT0gJy0nIHx8IGZpbGVbMV0pIGNsb3NlKCBmZCApOwogICAgICB9CiAgIH0KCiAgIGZvciAoaSA9IDA7IGkgPCBSTkdTOyBpKyspIHsKICAgICAgaWYgKChmZCA9IG9wZW4oIHJuZ3NbaV0ucGF0aCwgT19SRE9OTFl8T19OT05CTE9DSyApKSA+PSAwKSB7CgkgaW50IGNvdW50ID0gc2l6ZW9mKGJ1Zik7CgoJIGlmIChybmdzW2ldLm1heGxlbmd0aCAmJiBjb3VudCA+IHJuZ3NbaV0ubWF4bGVuZ3RoKQoJICAgIGNvdW50ID0gcm5nc1tpXS5tYXhsZW5ndGg7CgkgciA9IHJlYWQoIGZkLCBidWYsIGNvdW50ICk7CgkgaWYgKHIgPiAwKQoJICAgIE1ENVVwZGF0ZSggJmN0eCwgYnVmLCByICk7CgkgZWxzZQoJICAgIHIgPSAwOwoJIGNsb3NlKCBmZCApOwoJIGlmIChWZXJib3NlKQoJICAgIGZwcmludGYoIHN0ZGVyciwgXygiR290ICVkIGJ5dGVzIGZyb20gJXNcbiIpLCByLCBybmdzW2ldLnBhdGggKTsKCSBpZiAocm5nc1tpXS5taW5sZW5ndGggJiYgciA+PSBybmdzW2ldLm1pbmxlbmd0aCkKCSAgICBicmVhazsKICAgICAgfSBlbHNlIGlmIChWZXJib3NlKQoJIGZwcmludGYoIHN0ZGVyciwgXygiQ291bGQgbm90IG9wZW4gJXNcbiIpLCBybmdzW2ldLnBhdGggKTsKICAgfQoKICAgTUQ1RmluYWwoIGRpZ2VzdCwgJmN0eCApOwogICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgcHJpbnRmKCAiJTAyeCIsIGRpZ2VzdFtpXSApOwogICBwdXRjaGFyICggJ1xuJyApOwogICAKICAgLyoKICAgICogVGhlIGZvbGxvd2luZyBpcyBpbXBvcnRhbnQgZm9yIGNhc2VzIGxpa2UgZGlzayBmdWxsLCBzbyBzaGVsbCBzY3JpcHRzCiAgICAqIGNhbiBib21iIG91dCBwcm9wZXJseSByYXRoZXIgdGhhbiB0aGluayB0aGV5IHN1Y2NlZWRlZC4KICAgICovCiAgIGlmIChmZmx1c2goc3Rkb3V0KSA8IDAgfHwgZmNsb3NlKHN0ZG91dCkgPCAwKQogICAgICByZXR1cm4gMTsKCiAgIHJldHVybiAwOwp9Cg==