LyogQm9vc3QuTXVsdGlJbmRleCBleGFtcGxlIG9mIHVzZSBvZiBoYXNoZWQgaW5kaWNlcy4KICoKICogQ29weXJpZ2h0IDIwMDMtMjAwOCBKb2FxdWluIE0gTG9wZXogTXVub3ouCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAogKiBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqCiAqIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL211bHRpX2luZGV4IGZvciBsaWJyYXJ5IGhvbWUgcGFnZS4KICovCgojaWYgIWRlZmluZWQoTkRFQlVHKQojZGVmaW5lIEJPT1NUX01VTFRJX0lOREVYX0VOQUJMRV9JTlZBUklBTlRfQ0hFQ0tJTkcKI2RlZmluZSBCT09TVF9NVUxUSV9JTkRFWF9FTkFCTEVfU0FGRV9NT0RFCiNlbmRpZgoKI2luY2x1ZGUgPGJvb3N0L211bHRpX2luZGV4X2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxib29zdC9tdWx0aV9pbmRleC9oYXNoZWRfaW5kZXguaHBwPgojaW5jbHVkZSA8Ym9vc3QvbXVsdGlfaW5kZXgvbWVtYmVyLmhwcD4KI2luY2x1ZGUgPGJvb3N0L211bHRpX2luZGV4L29yZGVyZWRfaW5kZXguaHBwPgojaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnVzaW5nIGJvb3N0OjptdWx0aV9pbmRleF9jb250YWluZXI7CnVzaW5nIG5hbWVzcGFjZSBib29zdDo6bXVsdGlfaW5kZXg7CgovKiB3b3JkX2NvdW50ZXIga2VlcHMgdGhlIG9jdXJyZW5jZXMgb2Ygd29yZHMgaW5zZXJ0ZWQuIEEgaGFzaGVkCiAqIGluZGV4IGFsbG93cyBmb3IgZmFzdCBjaGVja2luZyBvZiBwcmVleGlzdGluZyBlbnRyaWVzLgogKi8KCnN0cnVjdCB3b3JkX2NvdW50ZXJfZW50cnkKewogIHN0ZDo6c3RyaW5nICB3b3JkOwogIHVuc2lnbmVkIGludCBvY2N1cnJlbmNlczsKCiAgd29yZF9jb3VudGVyX2VudHJ5KHN0ZDo6c3RyaW5nIHdvcmRfKTp3b3JkKHdvcmRfKSxvY2N1cnJlbmNlcygwKXt9Cn07CgovKiBzZWUgQ29tcGlsZXIgc3BlY2lmaWNzOiBVc2Ugb2YgbWVtYmVyX29mZnNldCBmb3IgaW5mbyBvbgogKiBCT09TVF9NVUxUSV9JTkRFWF9NRU1CRVIKICovCgp0eXBlZGVmIG11bHRpX2luZGV4X2NvbnRhaW5lcjwKICB3b3JkX2NvdW50ZXJfZW50cnksCiAgaW5kZXhlZF9ieTwKICAgIG9yZGVyZWRfbm9uX3VuaXF1ZTwKICAgICAgQk9PU1RfTVVMVElfSU5ERVhfTUVNQkVSKHdvcmRfY291bnRlcl9lbnRyeSx1bnNpZ25lZCBpbnQsb2NjdXJyZW5jZXMpLAogICAgICBzdGQ6OmdyZWF0ZXI8dW5zaWduZWQgaW50PiAvKiBzb3J0ZWQgYmVnaW5uaW5nIHdpdGggbW9zdCBmcmVxdWVudCAqLwogICAgPiwKICAgIGhhc2hlZF91bmlxdWU8CiAgICAgIEJPT1NUX01VTFRJX0lOREVYX01FTUJFUih3b3JkX2NvdW50ZXJfZW50cnksc3RkOjpzdHJpbmcsd29yZCkKICAgID4KICA+Cj4gd29yZF9jb3VudGVyOwoKLyogdXRpbGl0aWVzICovCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgaW5jcmVtZW50CnsKICB2b2lkIG9wZXJhdG9yKCkoVCYgeCljb25zdHsrK3g7fQp9OwoKdHlwZWRlZiBib29zdDo6dG9rZW5pemVyPGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPiA+IHRleHRfdG9rZW5pemVyOwoKaW50IG1haW4oKQp7CiAgLyogYm9vc3RpbnNwZWN0Om5vYXNjaWkgKi8KCiAgc3RkOjpzdHJpbmcgdGV4dD0KICAgICJFbiB1biBsdWdhciBkZSBsYSBNYW5jaGEsIGRlIGN1eW8gbm9tYnJlIG5vIHF1aWVybyBhY29yZGFybWUsIG5vIGhhICIKICAgICJtdWNobyB0aWVtcG8gcXVlIHZpdu1hIHVuIGhpZGFsZ28gZGUgbG9zIGRlIGxhbnphIGVuIGFzdGlsbGVybywgYWRhcmdhICIKICAgICJhbnRpZ3VhLCByb2PtbiBmbGFjbyB5IGdhbGdvIGNvcnJlZG9yLiBVbmEgb2xsYSBkZSBhbGdvIG3hcyB2YWNhIHF1ZSAiCiAgICAiY2FybmVybywgc2FscGlj824gbGFzIG3hcyBub2NoZXMsIGR1ZWxvcyB5IHF1ZWJyYW50b3MgbG9zIHPhYmFkb3MsICIKICAgICJsYW50ZWphcyBsb3Mgdmllcm5lcywgYWxn+m4gcGFsb21pbm8gZGUgYfFhZGlkdXJhIGxvcyBkb21pbmdvcywgIgogICAgImNvbnN1be1hbiBsYXMgdHJlcyBwYXJ0ZXMgZGUgc3UgaGFjaWVuZGEuIEVsIHJlc3RvIGRlbGxhIGNvbmNsde1hbiBzYXlvICIKICAgICJkZSB2ZWxhcnRlLCBjYWx6YXMgZGUgdmVsbHVkbyBwYXJhIGxhcyBmaWVzdGFzLCBjb24gc3VzIHBhbnR1ZmxvcyBkZSBsbyAiCiAgICAibWVzbW8sIHkgbG9zIGTtYXMgZGUgZW50cmVzZW1hbmEgc2UgaG9ucmFiYSBjb24gc3UgdmVsbG9y7SBkZSBsbyBt4XMgIgogICAgImZpbm8uIFRlbu1hIGVuIHN1IGNhc2EgdW5hIGFtYSBxdWUgcGFzYWJhIGRlIGxvcyBjdWFyZW50YSwgeSB1bmEgIgogICAgInNvYnJpbmEgcXVlIG5vIGxsZWdhYmEgYSBsb3MgdmVpbnRlLCB5IHVuIG1vem8gZGUgY2FtcG8geSBwbGF6YSwgcXVlICIKICAgICJhc+0gZW5zaWxsYWJhIGVsIHJvY+1uIGNvbW8gdG9tYWJhIGxhIHBvZGFkZXJhLiBGcmlzYWJhIGxhIGVkYWQgZGUgIgogICAgIm51ZXN0cm8gaGlkYWxnbyBjb24gbG9zIGNpbmN1ZW50YSBh8W9zOyBlcmEgZGUgY29tcGxleGnzbiByZWNpYSwgc2VjbyAiCiAgICAiZGUgY2FybmVzLCBlbmp1dG8gZGUgcm9zdHJvLCBncmFuIG1hZHJ1Z2Fkb3IgeSBhbWlnbyBkZSBsYSBjYXphLiAiCiAgICAiUXVpZXJlbiBkZWNpciBxdWUgdGVu7WEgZWwgc29icmVub21icmUgZGUgUXVpamFkYSwgbyBRdWVzYWRhLCBxdWUgZW4gIgogICAgImVzdG8gaGF5IGFsZ3VuYSBkaWZlcmVuY2lhIGVuIGxvcyBhdXRvcmVzIHF1ZSBkZXN0ZSBjYXNvIGVzY3JpYmVuOyAiCiAgICAiYXVucXVlLCBwb3IgY29uamV0dXJhcyB2ZXJvc+1taWxlcywgc2UgZGVqYSBlbnRlbmRlciBxdWUgc2UgbGxhbWFiYSAiCiAgICAiUXVlamFuYS4gUGVybyBlc3RvIGltcG9ydGEgcG9jbyBhIG51ZXN0cm8gY3VlbnRvOyBiYXN0YSBxdWUgZW4gbGEgIgogICAgIm5hcnJhY2nzbiBk6Wwgbm8gc2Ugc2FsZ2EgdW4gcHVudG8gZGUgbGEgdmVyZGFkLiI7CgogIC8qIGZlZWQgdGhlIHRleHQgaW50byB0aGUgY29udGFpbmVyICovCgogIHdvcmRfY291bnRlciAgIHdjOwogIHRleHRfdG9rZW5pemVyIHRvayh0ZXh0LGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPigiIFx0XG4uLDs6IT8nXCItIikpOwogIHVuc2lnbmVkIGludCAgIHRvdGFsX29jY3VycmVuY2VzPTA7CiAgZm9yKHRleHRfdG9rZW5pemVyOjppdGVyYXRvciBpdD10b2suYmVnaW4oKSxpdF9lbmQ9dG9rLmVuZCgpOwogICAgICBpdCE9aXRfZW5kOysraXQpewogICAgLyogSW5zZXJ0IHRoZSB3b3JkIGludG8gdGhlIGNvbnRhaW5lci4gSWYgZHVwbGljYXRlLCB3aXQgd2lsbCBwb2ludCB0bwogICAgICogdGhlIHByZWV4aXN0ZW50IGVudHJ5LgogICAgICovCgogICAgKyt0b3RhbF9vY2N1cnJlbmNlczsKICAgIHdvcmRfY291bnRlcjo6aXRlcmF0b3Igd2l0PXdjLmluc2VydCgqaXQpLmZpcnN0OwoKICAgIC8qIEluY3JlbWVudCBvY2N1cnJlbmNlcy4KICAgICAqIEluIGEgbGFtYmRhLWNhcGFibGUgY29tcGlsZXIsIHRoaXMgY2FuIGJlIHdyaXR0ZW4gYXM6CiAgICAgKiAgIHdjLm1vZGlmeV9rZXkod2l0LCsrXzEpOwogICAgICovCgogICAgd2MubW9kaWZ5X2tleSh3aXQsaW5jcmVtZW50PHVuc2lnbmVkIGludD4oKSk7CiAgfQoKICAvKiBsaXN0IHdvcmRzIGJ5IGZyZXF1ZW5jeSBvZiBhcHBlYXJhbmNlICovCgogIHN0ZDo6Y291dDw8c3RkOjpmaXhlZDw8c3RkOjpzZXRwcmVjaXNpb24oMik7CiAgZm9yKHdvcmRfY291bnRlcjo6aXRlcmF0b3Igd2l0PXdjLmJlZ2luKCksd2l0X2VuZD13Yy5lbmQoKTsKICAgICAgd2l0IT13aXRfZW5kOysrd2l0KXsKICAgIHN0ZDo6Y291dDw8c3RkOjpzZXR3KDExKTw8d2l0LT53b3JkPDwiOiAiCiAgICAgICAgICAgICA8PHN0ZDo6c2V0dyg1KSA8PDEwMC4wKndpdC0+b2NjdXJyZW5jZXMvdG90YWxfb2NjdXJyZW5jZXM8PCIlIgogICAgICAgICAgICAgPDxzdGQ6OmVuZGw7CiAgfQoKICByZXR1cm4gMDsKfQo=