IyEvdXNyL2Jpbi9lbnYgdGNsc2gKIyAtKi1UQ0wtKi0KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICAgICAgICAgICAgICAgICAgICAgIENBREVOQ0UgQ09QWVJJR0hUIE5PVElDRQojICAgICAgICAgqSAyMDA4LTIwMTMgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIEZvdW5kYXRpb24gRmxvdyBpcyBwcm92aWRlZCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBwZXJmb3JtIHNwZWNpYWxpemVkCiMgdGFza3MuCiMKIyBUaGlzIHdvcmsgbWF5IG5vdCBiZSBjb3BpZWQsIHJlLXB1Ymxpc2hlZCwgdXBsb2FkZWQsIG9yIGRpc3RyaWJ1dGVkIGluIGFueSB3YXksCiMgaW4gYW55IG1lZGl1bSwgd2hldGhlciBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgojIGZyb20gQ2FkZW5jZS4gTm90d2l0aHN0YW5kaW5nIGFueSByZXN0cmljdGlvbnMgaGVyZWluLCBzdWJqZWN0IHRvIGNvbXBsaWFuY2UKIyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ2FkZW5jZSBzb2Z0d2FyZSBsaWNlbnNlIGFncmVlbWVudCB1bmRlcgojIHdoaWNoIHRoaXMgbWF0ZXJpYWwgd2FzIHByb3ZpZGVkLCB0aGlzIG1hdGVyaWFsIG1heSBiZSBjb3BpZWQgYW5kIGludGVybmFsbHkKIyBkaXN0cmlidXRlZCBzb2xlbHkgZm9yIGludGVybmFsIHB1cnBvc2VzIGZvciB1c2Ugd2l0aCBDYWRlbmNlIHRvb2xzLgojCiMgVGhpcyB3b3JrIGlzIENhZGVuY2UgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCBtYXkgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBiZQojIGdpdmVuIHRvIHRoaXJkIHBhcnRpZXMsIG5laXRoZXIgaW4gb3JpZ2luYWwgbm9yIGluIG1vZGlmaWVkIHZlcnNpb25zLCB3aXRob3V0CiMgZXhwbGljaXQgd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQ2FkZW5jZS4gVGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMKIyB0aGUgcHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBvZiBDYWRlbmNlIG9yIGl0cyBsaWNlbnNvcnMsIGFuZAojIGlzIHN1cHBsaWVkIHN1YmplY3QgdG8sIGFuZCBtYXkgYmUgdXNlZCBvbmx5IGJ5IENhZGVuY2UncyBjdXJyZW50IGN1c3RvbWVycwojIGluIGFjY29yZGFuY2Ugd2l0aCwgYSBwcmV2aW91c2x5IGV4ZWN1dGVkIGxpY2Vuc2UgYWdyZWVtZW50IGJldHdlZW4gQ2FkZW5jZQojIGFuZCBpdHMgY3VzdG9tZXIuCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRISVMgTUFURVJJQUwgSVMgUFJPVklERUQgQlkgQ0FERU5DRSAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECiMgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgojIElOIE5PIEVWRU5UIFNIQUxMIENBREVOQ0UgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTAojIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCiMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCiMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAgTUFURVJJQUwsIEVWRU4gSUYKIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKc291cmNlIEZGL3ZhcnMudGNsCgppZiB7IVtpbmZvIGV4aXN0cyBlbnYoVlBBVEgpXX0gewogICBzZXQgZW52KFZQQVRIKSAibWFrZSIKfQoKaWYge1tpbmZvIGV4aXN0cyBlbnYoRkZfU1RBUlQpXX0gewogICBpZiB7W2ZpbGUgZXhpc3RzICRlbnYoVlBBVEgpLyRlbnYoRkZfU1RBUlQpXX0gewogICAgICBleGVjIHJtICRlbnYoVlBBVEgpLyRlbnYoRkZfU1RBUlQpCiAgIH0KICAgc2V0IHN0YXJ0X3N0ZXAgJGVudihGRl9TVEFSVCkKfSBlbHNlIHsKICAgc2V0IHN0YXJ0X3N0ZXAgaW5pdAp9CmlmIHtbaW5mbyBleGlzdHMgZW52KEZGX1NUT1ApXX0gewogICBzZXQgc3RvcF9zdGVwICRlbnYoRkZfU1RPUCkKfSBlbHNlIHsKICAgc2V0IHN0b3Bfc3RlcCBzaWdub2ZmCn0KCiMKIyBTdGFydCB3aXRoIGFsbCBwb3NzaWJsZSBzdGVwcyBpbiB0aGUgZmxvdyB0aGF0IHdlIGNhbiBleGVjdXRlLiAgVGhlbiBmaW5kCiMgdGhlIHN1YnNldCBvZiBzdGVwcyB0aGF0IHdlIGdlbmVyYXRlZCBhIFRjbCBjb250cm9sIGZpbGUgZm9yCiMKCnNldCB2YXJzKHNpbmdsZSkgdHJ1ZQoKc2V0IGZvdW5kX3N0ZXBzIFtsaXN0XQpmb3JlYWNoIHN0ZXAgJHZhcnMoYnN0ZXBzKSB7CiAgIHNldCBydW5fZmlsZSgkc3RlcCkgIiR2YXJzKHNjcmlwdF9kaXIpL0lOTk9WVVMvcnVuXyRzdGVwLnRjbCIKICAgaWYge1tmaWxlIGV4aXN0cyAkcnVuX2ZpbGUoJHN0ZXApXX0gewogICAgICBsYXBwZW5kIGZvdW5kX3N0ZXBzICRzdGVwCiAgIH0KfQojc2V0IHN0ZXBzICRmb3VuZF9zdGVwcwoKc2V0IHRpbWUgMApzZXQgaW5kZXggMApmb3JlYWNoIHN0ZXAgJGZvdW5kX3N0ZXBzIHsKICAgaWYge1tmaWxlIGV4aXN0cyAkZW52KFZQQVRIKS8kc3RlcF19IHsKICAgICAgaWYge1tmaWxlIG10aW1lICRlbnYoVlBBVEgpLyRzdGVwXSA+ICR0aW1lfSB7CiAgICAgICAgIGlmIHtbbGluZGV4ICRmb3VuZF9zdGVwcyAkaW5kZXhdID09ICJzaWdub2ZmIn0gewogICAgICAgICAgICBwdXRzICI8RkY+IFNURVAgc2lnbm9mZiBDT01QTEVURSAuLi4gTk9USElORyBUTyBETyIKICAgICAgICAgICAgZXhpdAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgc3RhcnRfc3RlcCBbbGluZGV4ICRmb3VuZF9zdGVwcyBbZXhwciAkaW5kZXggKyAxXV0KICAgICAgICAgfQogICAgICB9CiAgIH0gZWxzZSB7CiAgICAgIHNldCBzdGFydF9zdGVwICRzdGVwCiAgICAgIGJyZWFrCiAgIH0KICAgaW5jciBpbmRleAp9CgpwdXRzICI8RkY+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgppZiB7JHN0YXJ0X3N0ZXAgPT0gJHN0b3Bfc3RlcH0gewogICBwdXRzICI8RkY+IFJVTk5JTkcgU1RFUCAkc3RhcnRfc3RlcCAuLi4iCn0gZWxzZSB7CiAgIHB1dHMgIjxGRj4gUlVOTklORyBTVEVQICRzdGFydF9zdGVwIHRocm91Z2ggJHN0b3Bfc3RlcCAuLi4iCn0KcHV0cyAiPEZGPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKc2xlZXAgNQoKIwojIEVtdWxhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICJtYWtlIiBwcm9ncmFtLiAgSWYgYSBmaWxlIGRvZXNuJ3QgZXhpc3QsCiMgb3IgaWYgaXQncyBwcmVkZWNlc3NvciBzdGVwIGhhcyBleGVjdXRlZCBtb3JlIHJlY2VudGx5LCBydW4gdGhlIGN1cnJlbnQKIyBzdGVwIGFuZCB1cGRhdGUgdGhlIHRpbWUvZGF0ZSBzdGFtcHMgb2YgdGhlIGZpbGVzIHdlIHRyYWNrIHByb2dyZXNzIHdpdGgKIwoKc2V0IHZhcnMoc3RvcF9zdGVwKSAkc3RvcF9zdGVwCgpzZXQgbGFzdF9zdGVwICIiCnNldCB2YXJzKHNpbmdsZSkgMQppZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKICAgc2V0IGNoZWNrX3FvciAkdmFycyhzY3JpcHRfZGlyKS9jaGVja19xb3IudGNsCn0KZXhlYyBta2RpciAtcCBtYWtlCmZvcmVhY2ggc3RlcCAkZm91bmRfc3RlcHMgewogICBzZXQgdmFycyhzdGVwKSAkc3RlcAogICBwdXRzICI8RkY+IFNURVAgJHZhcnMoc3RlcCkgLi4uIgogICBzZXQgdGhpc19zZW1hcGhvcmUgIiRlbnYoVlBBVEgpLyRzdGVwIgogICBzZXQgbGFzdF9zZW1hcGhvcmUgIiRlbnYoVlBBVEgpLyRsYXN0X3N0ZXAiCgogICBzZXQgcnVuX3N0ZXAgZmFsc2UKICAgaWYgeyFbZmlsZSBleGlzdHMgJHRoaXNfc2VtYXBob3JlXX0gewogICAgICBzZXQgcnVuX3N0ZXAgdHJ1ZQogICB9IGVsc2VpZiB7JGxhc3Rfc3RlcCAhPSAiIn0gewogICAgICBmaWxlIHN0YXQgJHRoaXNfc2VtYXBob3JlIHRoaXNfc3RhdAogICAgICBmaWxlIHN0YXQgJGxhc3Rfc2VtYXBob3JlIGxhc3Rfc3RhdAogICAgICBpZiB7JHRoaXNfc3RhdChtdGltZSkgPCAkbGFzdF9zdGF0KG10aW1lKX0gewogICAgICAgICBzZXQgcnVuX3N0ZXAgdHJ1ZQogICAgICB9CiAgIH0KCiAgICMKICAgIyBDaGVjayB0aGUgcXVhbGl0eSBvZiByZXN1bHRzIGZyb20gdGhlIGxhc3Qgc3RlcC4gIElmIHRoZSByZXN1bHRzIGFyZW4ndAogICAjIGFzIGV4cGVjdGVkLCBkb24ndCBwcm9jZWVkIHRvIHRoZSBuZXh0IHN0ZXAKICAgIwogICBpZiB7JHZhcnMoZW5hYmxlX3Fvcl9jaGVjayl9IHsKICAgICAgaWYgeyRzdGVwICE9ICJpbml0In0gewogICAgICAgICBzZXQgcW9yIFtjYXRjaCB7ZXhlYyAkY2hlY2tfcW9yICRsYXN0X3NlbWFwaG9yZX0gbXNnXQogICAgICAgICBpZiB7JHFvcn0gewogICAgICAgICAgICBwdXRzICI8RkY+IEVSUk9SOiBRT1IgUkVTVUxUIENIRUNLIElORElDQVRFUyBBIFBST0JMRU0gSU4gU1RFUCAkbGFzdF9zdGVwIgogICAgICAgICAgICBleGl0IC0xMTEKICAgICAgICAgfQogICAgICB9CiAgIH0KCiAgIHNldCBsYXN0X3N0ZXAgJHN0ZXAKICAgaWYgeyEkcnVuX3N0ZXB9IHsKICAgICAgY29udGludWUKICAgfQoKICAgIwogICAjIFNvdXJjZSB0aGUgY29udHJvbCBmaWxlIHRoYXQgcnVucyB0aGUgc3RlcC4gIElmIGl0IGhhZCBhbiBlcnJvciwgZXhpdAogICAjIGltbWVkaWF0ZWx5LiAgT3RoZXJ3aXNlLCB1cGRhdGUgdGhlIHRpbWUvZGF0ZSBzdGFtcCBvZiB0aGUgY29ycmVzcG9uZGluZwogICAjCiAgICMKCiAgIGlmIHtbY2F0Y2gge3NvdXJjZSAkcnVuX2ZpbGUoJHN0ZXApfSBtZXNzYWdlXX0gewogICAgICBwdXRzICRtZXNzYWdlCiAgICAgIGV4aXQgLTExMQogICB9CgogICAjCiAgICMgSWYgdGhlcmUgaXMgYSBRT1IgY2hlY2sgZmlsZSBmb3IgdGhpcyBzdGVwLCBleGVjdXRlIGl0IGFuZCBwbGFjZSB0aGUKICAgIyByZXN1bHQgaW50byB0aGUgbWFrZSBmaWxlLiAgT3RoZXJ3aXNlIGp1c3QgdG91Y2ggdGhlIGZpbGUKICAgIwoKICAgaWYgeyR2YXJzKGVuYWJsZV9xb3JfY2hlY2spfSB7CiAgICAgIGlmIHtbaW5mbyBleGlzdHMgdmFycygkc3RlcCxxb3JfdGNsXX0gewogICAgICAgICBzZXQgcW9yX2ZpbGUgJHZhcnMoJHN0ZXAscW9yX3RjbCkKICAgICAgICAgaWYge1tmaWxlIGV4aXN0cyAkcW9yX2ZpbGVdfSB7CiAgICAgICAgICAgIHNldCBxb3IgW2NhdGNoIHtleGVjICRxb3JfZmlsZX0gbXNnXQogICAgICAgICAgICBzZXQgbWFrZV9maWxlIFtvcGVuICR0aGlzX3NlbWFwaG9yZSB3XQogICAgICAgICAgICBwdXRzICRtYWtlX2ZpbGUgIiRxb3IiCiAgICAgICAgICAgIGNsb3NlICRtYWtlX2ZpbGUKICAgICAgICAgfQogICAgICB9CiAgIH0KICAgZXhlYyAvYmluL3RvdWNoICR0aGlzX3NlbWFwaG9yZQoKICAgaWYgeyRzdGVwID09ICRzdG9wX3N0ZXB9IHsKICAgICAgZXhpdCAKICAgfQp9Cg==