PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMi8vRU4iPgo8aHRtbD4KCTxoZWFkPgoJCTx0aXRsZT5wb2ludGVyX2Nhc3QuaHBwPC90aXRsZT4KCTwvaGVhZD4KCTxib2R5PgoJCTxoMT48SU1HIGhlaWdodD0iODYiIGFsdD0iQysrIEJvb3N0IiBzcmM9Ii4uLy4uL2Jvb3N0LnBuZyIgd2lkdGg9IjI3NyIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPSIwIj5Qb2ludGVyIAoJCQljYXN0IGZ1bmN0aW9uczwvaDE+CgkJPHA+VGhlIHBvaW50ZXIgY2FzdCBmdW5jdGlvbnMgKDxjb2RlPmJvb3N0OjpzdGF0aWNfcG9pbnRlcl9jYXN0PC9jb2RlPiA8Y29kZT5ib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8L2NvZGU+CgkJCTxjb2RlPmJvb3N0OjpyZWludGVycHJldF9wb2ludGVyX2Nhc3Q8L2NvZGU+IDxjb2RlPmJvb3N0Ojpjb25zdF9wb2ludGVyX2Nhc3Q8L2NvZGU+KSAKCQkJcHJvdmlkZSBhIHdheSB0byB3cml0ZSBnZW5lcmljIHBvaW50ZXIgY2FzdGluZ3MgZm9yIHJhdyBwb2ludGVycy4gVGhlIGZ1bmN0aW9ucyAKCQkJYXJlIGRlZmluZWQgaW4gPENJVEU+PEEgaHJlZj0iLi4vLi4vYm9vc3QvcG9pbnRlcl9jYXN0LmhwcCI+Ym9vc3QvcG9pbnRlcl9jYXN0LmhwcDwvQT4uPC9DSVRFPjwvcD4KCQk8UD5UaGVyZSBpcyB0ZXN0L2V4YW1wbGUgY29kZSBpbiA8Q0lURT48QSBocmVmPSJ0ZXN0L3BvaW50ZXJfY2FzdF90ZXN0LmNwcCI+cG9pbnRlcl9jYXN0X3Rlc3QuY3BwPC9BPjwvQ0lURT4uPC9wPgoJCQk8aDI+PGEgbmFtZT0icmF0aW9uYWxlIj5SYXRpb25hbGU8L2E+PC9oMj4KCQk8UD5Cb29zdCBzbWFydCBwb2ludGVycyB1c3VhbGx5IG92ZXJsb2FkIHRob3NlIGZ1bmN0aW9ucyB0byBwcm92aWRlIGEgbWVjaGFuaXNtIHRvIAoJCQllbXVsYXRlIHBvaW50ZXJzIGNhc3RzLiBGb3IgZXhhbXBsZSwgPGNvZGU+Ym9vc3Q6OnNoYXJlZF9wdHImbHQ7Li4uJmd0OzwvY29kZT4gaW1wbGVtZW50cyAKCQkJYSBzdGF0aWMgcG9pbnRlciBjYXN0IHRoaXMgd2F5OjwvUD4KCQk8cHJlPgp0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwogICAgc2hhcmVkX3B0ciZsdDtUJmd0OyBzdGF0aWNfcG9pbnRlcl9jYXN0KHNoYXJlZF9wdHImbHQ7VSZndDsgY29uc3QgJmFtcDtyKTsKPC9wcmU+CgkJPFA+UG9pbnRlciBjYXN0IGZ1bmN0aW9ucyBmcm9tIDxDSVRFPjxBIGhyZWY9Ii4uLy4uL2Jvb3N0L3BvaW50ZXJfY2FzdC5ocHAiPmJvb3N0L3BvaW50ZXJfY2FzdC5ocHA8L0E+PC9DSVRFPgoJCQlhcmUgb3ZlcmxvYWRzIG9mIDxjb2RlPmJvb3N0OjpzdGF0aWNfcG9pbnRlcl9jYXN0PC9jb2RlPiwgPGNvZGU+Ym9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PC9jb2RlPiwKCQkJPGNvZGU+Ym9vc3Q6OnJlaW50ZXJwcmV0X3BvaW50ZXJfY2FzdDwvY29kZT4gYW5kIDxjb2RlPmJvb3N0Ojpjb25zdF9wb2ludGVyX2Nhc3Q8L2NvZGU+CgkJCWZvciByYXcgcG9pbnRlcnMuIFRoaXMgd2F5IHdoZW4gZGV2ZWxvcGluZyBwb2ludGVyIHR5cGUgaW5kZXBlbmRlbnQgY2xhc3NlcywgCgkJCWZvciBleGFtcGxlLCBtZW1vcnkgbWFuYWdlcnMgb3Igc2hhcmVkIG1lbW9yeSBjb21wYXRpYmxlIGNsYXNzZXMsIHRoZSBzYW1lIGNvZGUgCgkJCWNhbiBiZSB1c2VkIGZvciByYXcgYW5kIHNtYXJ0IHBvaW50ZXJzLjwvcD4KCQkJPEgyPjxBIG5hbWU9InN5bm9wc2lzIj5TeW5vcHNpczwvQT48L0gyPgoJCQk8QkxPQ0tRVU9URT4KCQkJCTxQUkU+Cm5hbWVzcGFjZSBib29zdCB7Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwppbmxpbmUgVCogc3RhdGljX3BvaW50ZXJfY2FzdChVICpwdHIpCiAgeyByZXR1cm4gc3RhdGljX2Nhc3QmbHQ7VComZ3Q7KHB0cik7IH0KCnRlbXBsYXRlJmx0O2NsYXNzIFQsIGNsYXNzIFUmZ3Q7CmlubGluZSBUKiBkeW5hbWljX3BvaW50ZXJfY2FzdChVICpwdHIpCiAgeyByZXR1cm4gZHluYW1pY19jYXN0Jmx0O1QqJmd0OyhwdHIpOyB9Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwppbmxpbmUgVCogY29uc3RfcG9pbnRlcl9jYXN0KFUgKnB0cikKICB7IHJldHVybiBjb25zdF9jYXN0Jmx0O1QqJmd0OyhwdHIpOyB9Cgp0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBVJmd0OwppbmxpbmUgVCogcmVpbnRlcnByZXRfcG9pbnRlcl9jYXN0KFUgKnB0cikKICB7IHJldHVybiByZWludGVycHJldF9jYXN0Jmx0O1QqJmd0OyhwdHIpOyB9CiAgCn0gLy8gbmFtZXNwYWNlIGJvb3N0CjwvUFJFPgoJCQk8L0JMT0NLUVVPVEU+CgkJPFA+QXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgYWJvdmUgc3lub3BzaXMsIHRoZSBwb2ludGVyIGNhc3QgZnVuY3Rpb25zIGFyZSBqdXN0IAoJCQl3cmFwcGVycyBhcm91bmQgc3RhbmRhcmQgQysrIGNhc3Qgb3BlcmF0b3JzLjwvUD4KCQk8SDI+PEEgbmFtZT0iZXhhbXBsZSI+RXhhbXBsZTwvQT48L0gyPgoJCTxCTE9DS1FVT1RFPgoJCQk8UFJFPgojaW5jbHVkZSAmbHQ7Ym9vc3QvcG9pbnRlcl9jYXN0LmhwcCZndDsKI2luY2x1ZGUgJmx0O2Jvb3N0L3NoYXJlZF9wdHIuaHBwJmd0OwoKY2xhc3MgYmFzZQp7CnB1YmxpYzoKCiAgIHZpcnR1YWwgfmJhc2UoKQogICB7CiAgIH0KfTsKCmNsYXNzIGRlcml2ZWQ6IHB1YmxpYyBiYXNlCnsKfTsKCnRlbXBsYXRlICZsdDtjbGFzcyBCYXNlUHRyJmd0Owp2b2lkIGNoZWNrX2lmX2l0X2lzX2Rlcml2ZWQoY29uc3QgQmFzZVB0ciAmYW1wO3B0cikKewogICBhc3NlcnQoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0Jmx0O2Rlcml2ZWQmZ3Q7KHB0cikgIT0gMCk7Cn0KCmludCBtYWluKCkKewogICA8ST4vLyBDcmVhdGUgYSByYXcgYW5kIGEgc2hhcmVkX3B0cjwvST4KCiAgIGJhc2UgKnB0ciA9IG5ldyBkZXJpdmVkOwogICBib29zdDo6c2hhcmVkX3B0ciZsdDtiYXNlJmd0OyBzcHRyKG5ldyBkZXJpdmVkKTsKICAgCiAgIDxJPi8vIENoZWNrIHRoYXQgYmFzZSBwb2ludGVyIHBvaW50cyBhY3R1YWxseSB0byBkZXJpdmVkIGNsYXNzPC9JPgoKICAgY2hlY2tfaWZfaXRfaXNfZGVyaXZlZChwdHIpOwogICBjaGVja19pZl9pdF9pc19kZXJpdmVkKHNwdHIpOwogICAKICAgLy8gPEVNPk9rITwvRU0+CiAgIAogICBkZWxldGUgcHRyOwogICByZXR1cm4gMDsKfTwvUFJFPgoJCTwvQkxPQ0tRVU9URT4KCQk8UD5UaGUgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRoZSBnZW5lcmljIHBvaW50ZXIgY2FzdHMgaGVscCB1cyBjcmVhdGUgcG9pbnRlciAKCQkJaW5kZXBlbmRlbnQgY29kZS48L1A+CgkJPGhyPgoJCTxwPlJldmlzZWQ6ICREYXRlOiAyMDA1LTEyLTA2IDA4OjI2OjEzIC0wNTAwIChUdWUsIDA2IERlYyAyMDA1KSAkPC9wPgoJCTxwPkNvcHlyaWdodCAyMDA1IElvbiBHYXp0YfFhZ2EuIFVzZSwgbW9kaWZpY2F0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIAoJCQl0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgPEEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij4KCQkJCUxJQ0VOU0VfMV8wLnR4dDwvQT4gb3IgYSBjb3B5IGF0ICZsdDs8QSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPmh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvQT4mZ3Q7Lik8L3A+Cgk8L2JvZHk+CjwvaHRtbD4K