ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAxOGZmNjNkLi4wODY3NjBiIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjA1IEBACitNb24gTm92ICAxIDE0OjQwOjIxIDE5OTMgIGp1bGxpYXJkQGRpLmVwZmwuY2ggKEFsZXhhbmRyZSBKdWxsaWFyZCkKKworCSogW2lmMTYzMi91c2VyLnNwZWNdCisJUmVtb3ZlZCBzb21lIGR1cGxpY2F0ZSBlbnRyaWVzLgorCisJKiBbaW5jbHVkZS9kaWFsb2cuaF0gW3dpbmRvd3MvZGlhbG9nLmNdCisJSW1wbGVtZW50ZWQgZGlhbG9nIHVuaXRzIGFuZCBmb250cy4KKwlBZGRlZCBwcmVsaW1pbmFyeSBsb2FkaW5nIG9mIGRpYWxvZyByZXNvdXJjZXMuCisJUHJlbGltaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgRGlhbG9nQm94KCkuCisJSW1wbGVtZW50ZWQgR2V0L1NldERsZ0l0ZW0qIGZ1bmN0aW9ucy4KKworCSogW3dpbmRvd3Mvd2luLmNdCisJSW1wbGVtZW50ZWQgV01fUEFSRU5UTk9USUZZIG1lc3NhZ2UuCisJSW1wbGVtZW50ZWQgQ3JlYXRlV2luZG93RXgoKSBhbmQgR2V0V2luZG93KCkuCisJQ29tcGxldGVkIERlc3Ryb3lXaW5kb3coKS4KKworTW9uIE5vdiAgMSAxODoxOTozNCAxOTkzICBFcmlrIEJvcworCisJKiBbbG9hZGVyL3NpZ25hbC5jXQorCUFkZGVkIHN1cHBvcnQgZm9yIGludCAweDExICYgMHgxMi4KKworICAgICAgICAqIFtsb2FkZXIvaW50MjEuY10KKwlJbXByb3ZlZCBmdW5jdGlvbiBoYW5kbGluZy4KKworU3VuIE9jdCAzMSAxMjozODowOSAxOTkzICBEYXZpZCBNZXRjYWxmZSA8ZGF2aWRAcHJpc20uZGVtb24uY28udWs+CisKKwkqIFtvYmplY3RzL2ZvbnQuY10KKwlJbXBsZW1lbnRlZCBHZXRDaGFyV2lkdGgoKS4KKworV2VkIE9jdCAyNyAwOTo1NjowNiAxOTkzICBKb2huIEJyZXphayA8YnJlemFrQGNoLmhwLmNvbT4KKworCSogW01ha2VmaWxlXQorICAgICAgICBVc2UgR05VIG1hbGxvYy4KKworCSogW2luY2x1ZGUvaW50MjEuaCBpbmNsdWRlL3dpbmUuaF0KKyAgICAgICAgQ2hhbmdlIHNjX2VmbGFncyB0byBzY19lZmwgLgorCisJKiBbaW5jbHVkZS93aW5lLmhdCisgICAgICAgIEZpeCBtaXNwbGFjZWQgI2VuZGlmCisgICAgICAgIEluY2x1ZGUgPHNpZ25hbC5oPiBmb3IgTmV0QlNECisKKwkqIFtsb2FkZXIvaW50MjEuY10KKyAgICAgICAgRG9uJ3QgaW5jbHVkZSA8c3lzL3Zmcy5oPiBpbiBOZXRCU0QKKyAgICAgICAgRG8gaW5jbHVkZSA8c3lzL21vdW50Lmg+IGluIE5ldEJTRAorICAgICAgICBDbGVhbnVwIHNvbWUgbGludC4KKworTW9uIE9jdCAyNiAxNzo1OTowMSAxOTkzICBFcmlrIEJvcworCisgICAgICAgICogW2luY2x1ZGUvaW50MjEuaF0KKyAgICAgICAgQWRkZWQuCisKKyAgICAgICAgKiBbbG9hZGVyL2ludDIxLmNdCisgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIG1hbnkgZG9zIGludHMuCisKKyAgICAgICAgKiBbbWlzYy9maWxlLmNdIFtpbmNsdWRlL2ZpbGVzLmhdCisgICAgICAgIE1vdmVkIE9QRU5fTUFYIGFuZCBEb3NEcml2ZVN0cnVjdCB0byBmaWxlcy5oLgorCitTdW4gT2N0IDI0IDEzOjM2OjUwIDE5OTMgIERhdmlkIE1ldGNhbGZlIDxkYXZpZEBwcmlzbS5kZW1vbi5jby51az4KKworCSogW2NvbnRyb2xzL2J1dHRvbi5jXQorCUltcGxlbWVudGVkIENIRUNLQk9YLCBBVVRPQ0hFQ0tCT1gsIDNTVEFURSwgQVVUTzNTVEFURSwKKwlSQURJT0JVVFRPTiwgQVVUT1JBRElPQlVUVE9OLCBHUk9VUEJPWCBjb250cm9scywgdG9nZXRoZXIgd2l0aAorCWEgcHJlbGltaW5hcnkgVVNFUkJVVFRPTiBjb250cm9sLgorCisJKiBbb2JqZWN0cy90ZXh0LmNdCisJQ29ycmVjdGVkIGJ1Z3MgaW4gVEVYVF9OZXh0TGluZSgpIGFuZCBhZGRlZCBoYW5kbGluZyBvZiBwcmVmaXgKKwljaGFyYWN0ZXIuCisKKwkqIFtjb250cm9scy9idXR0b24uY10KKwlEaXNhYmxlZCBmb2N1cyBoYW5kbGluZyBieSBjb21tZW50aW5nIG91dCBTZXRGb2N1cygpIGNhbGxzIHVudGlsCisJc2VyaW91cyBidWcgY2FuIGJlIGZvdW5kLgorCitPY3QgIDIwLCA5MyBtYXJ0aW4yQHRyZ2NvcnAuc29sdWNvcnAucWMuY2EgKE1hcnRpbiBBeW90dGUpCisKKwkqIFtjb250cm9scy9saXN0Ym94LmNdCisJTGlzdGJveCBjb250cm9sIHdpbmRvdworCQlQYWludGluZyBjbGVhbnVwLCBuZXcgbWVzc2FnZXMgcHJvY2Vzc2VkLgorCisJKiBbY29udHJvbHMvc2Nyb2xsLmNdCisJU2Nyb2xsIGJhciBjb250cm9sIHdpbmRvdworCQlQYWludGluZyBjbGVhbnVwLgorCisJKiBbY29udHJvbHMvY29tYm8uY10KKwlDb21ibyBib3ggY29udHJvbCB3aW5kb3cKKwkJUGFpbnRpbmcgY2xlYW51cC4KKworVHVlIE9jdCAxMiAxNzo1MDoxMSAxOTkzICBqdWxsaWFyZEBkaS5lcGZsLmNoIChBbGV4YW5kcmUgSnVsbGlhcmQpCisKKwkqIFtvYmplY3RzL2NvbG9yLmNdIFtvYmplY3RzL3BhbGV0dGUuY10gW3dpbmRvd3Mvc3lzY29sb3IuY10KKwlCZXR0ZXIgc3VwcG9ydCBmb3IgdGhlIHByaXZhdGUgY29sb3IgbWFwLgorCVVzaW5nIGEgcHJpdmF0ZSBtYXAgaXMgbm93IHRoZSBkZWZhdWx0LgorCisJKiBbd2luZG93cy93aW4uY10KKwlCdWcgZml4LgorCisJKiBbaW5jbHVkZS9kaWFsb2cuaF0gW3dpbmRvd3MvZGlhbG9nLmNdCisJSW1wbGVtZW50ZWQgQ3JlYXRlRGlhbG9nKigpIGFuZCBJc0RpYWxvZ01lc3NhZ2UoKS4KKworCSogW21pc2MveHQuY10gW3dpbmRvd3MvZGVmd25kLmNdCisJTW92ZWQgRGVmV2luZG93UHJvYygpIHRvIGRlZnduZC5jLgorCUFkZGVkIFdNX05DQ1JFQVRFLCBXTV9OQ0RFU1RST1kgYW5kIFdNX0NUTENPTE9SIGhhbmRsaW5nLgorCisJKiBbd2luZG93cy9kZWZkbGcuY10KKwlTdGFydGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWZEbGdQcm9jKCkuCisKKwkqIFt3aW5kb3dzL3dpbi5jXQorCUFkZGVkIFdNX05DQ1JFQVRFIGFuZCBXTV9OQ0RFU1RST1kgbWVzc2FnZXMuCisJSW1wbGVtZW50ZWQgSXNDaGlsZCgpLgorCitUdWUgT2N0IDEyIDE3OjUwOjIwIDE5OTMgIERhdmlkIE1ldGNhbGZlIDxkYXZpZEBwcmlzbS5kZW1vbi5jby51az4KKworCSogW3dpbmRvd3MvZm9jdXMuY10KKwlJbXBsZW1lbnRlZCBHZXRGb2N1cygpIGFuZCBTZXRGb2N1cygpLgorCisJKiBbd2luZG93cy9ldmVudC5jXQorCUFkZGVkIHByb2Nlc3Npbmcgb2YgRm9jdXNJbiBhbmQgRm9jdXNPdXQgZXZlbnRzLgorCisJKiBbd2luZG93cy9ncmFwaGljcy5jXQorCUFkZGVkIERyYXdGb2N1c1JlY3QoKS4KKworU2F0IE9jdCAgOSAxNDozNjo1NyAxOTkzICBFcmlrIEJvcworCisJKiBbbG9hZGVyL2ludDFhLmNdCisJQWRkZWQgbW9yZSBmdW5jdGlvbiBoYW5kbGluZy4KKworV2VkIE9jdCAgNiAxMjoyMToyMiAxOTkzICBFcmlrIEJvcworCisJKiBbbG9hZGVyL3NpZ25hbC5jXQorCVNwbGl0IHNpZ25hbC5jIGludG8gaW50MWEuYywgaW50MjEuYyBhbmQgc2lnbmFsLmMuCisKK1R1ZSBPY3QgIDUgMjI6MTI6NDAgMTk5MyAgRGF2aWQgTWV0Y2FsZmUKKworCSogW2NvbnRyb2xzL3N0YXRpYy5jXSBbY29udHJvbC93aWRnZXRzLmNdCisJU3RhdGljIGNvbnRyb2wgY2xhc3MuCisKKwkqIFtvYmplY3RzL3RleHQuY10KKwlBZGRlZCBwcm9jZXNzaW5nIG9mIGFkZGl0aW9uYWwgRFRfIGZsYWdzIHRvIERyYXdUZXh0KCkuCisKKwkqIFt3aW5kb3dzL3dpbi5jXSBbbWlzYy94dC5jXQorCUFkZGVkIFNldFdpbmRvd1RleHQoKSBhbmQgV01fU0VUVEVYVCBwcm9jZXNzaW5nLgorCitUdWUgT2N0ICA1IDIyOjEyOjQwIDE5OTMgIE1hcnRpbiBBeW90dGUKKworCSogW2NvbnRyb2xzL2xpc3Rib3guY10KKwlMaXN0Ym94IGNvbnRyb2wgd2luZG93CisKKwkqIFtjb250cm9scy9zY3JvbGwuY10KKwlTY3JvbGwgYmFyIGNvbnRyb2wgd2luZG93CisKKwkqIFtjb250cm9scy9jb21iby5jXQorCUNvbWJvIGJveCBjb250cm9sIHdpbmRvdworCisJKiBbaW5jbHVkZS9jb21iby5oXQorCUNvbWJvIGJveCBkZWZpbml0aW9ucworCisJKiBbaW5jbHVkZS9saXN0Ym94LmhdCisJTGlzdGJveCBkZWZpbml0aW9ucworCisJKiBbaW5jbHVkZS9zY3JvbGwuaF0KKwlTY3JvbGwgYmFyIGRlZmluaXRpb25zCisKK1NhdCBPY3QgIDIgMDk6MzU6NTQgMTk5MyAgQm9iIEFtc3RhZHQgIChib2IgYXQgcG9vaCkKKworCSogW2lmMTYzMi9jYWxsYmFjay5jXQorCUZpeGVkIGJ1ZyBpbiBNYWtlUHJvY0luc3RhbmNlKCkuCisKKwkqIFtkZWJ1Z2dlci9pbmZvLmNdCisJQ2hhbmdlZCB4L3cgYW5kIHgvYiB0byBkaXNwbGF5IGluIGhleC4KKworCSogW2RlYnVnZ2VyL2kzODYtcGluc24uY10KKwlBZGRlZCBjb2RlIHRvIHByb3Blcmx5IHVuYXNzZW1ibGUgMTYtYml0IGluZGV4aW5nLgorCitGcmkgT2N0ICAxIDA4OjI5OjA1IDE5OTMgIEJvYiBBbXN0YWR0ICAoYm9iIGF0IHBvb2gpCisKKwkqIFtsb2FkZXIvZmlsZXMuY10gW21pc2MvcHJvZmlsZS5jXQorCVN5c3RlbSBpbml0aWFsaXphdGlvbiBmaWxlIGlzIG5vdyBjYWxsZWQgIndpbmUuaW5pIiBhbmQgY2FuCisJYmUgbG9jYXRlZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnksCisJb3IgYW55IGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiB0aGUgV0lORVBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKwkqIFt0b29scy9idWlsZC5jXSBbaWYxNjMyL2NhbGwuU10gW2luY2x1ZGUvcmVnZnVuYy5oXQorCUNoYW5nZWQgcmVnaXN0ZXIgZnVuY3Rpb24gc3RhY2sgdG8gbWF0Y2ggc2lnY29udGV4dCBzdHJ1Y3R1cmUuCisKK1RodSBTZXAgMzAgMjI6MzA6MjEgMTk5MyAgQm9iIEFtc3RhZHQgIChib2IgYXQgcG9vaCkKKworCSogW2xvYWRlci9maWxlcy5jXQorCUNyZWF0ZWQgZnVuY3Rpb24gdG8gc2VhcmNoIGEgcGF0aCBmb3IgZmlsZXMgdG8gbG9hZC4KKworCSogW2xvYWRlci93aW5lLmNdCisJTW9kaWZpZWQgZXhlIGFuZCBkbGwgZmlsZSBsb2FkaW5nIHRvIHNlYXJjaCB0aHJvdWdoIHBhdGgKKwlzcGVjaWZpZWQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFdJTkVQQVRILgorCitUaHUgU2VwIDMwIDIyOjMwOjIxIDE5OTMgIEVyaWMgWW91bmdkYWxlCisKKwkqIFtsb2FkZXIvc2lnbmFsLmNdCisJQnVnIGZpeC4KKworVGh1IFNlcCAzMCAyMjozMDoyMSAxOTkzICBKb2huIEJyZXphaworCisJKiBbZGVidWdnZXIvZGJnLnldIFtkZWJ1Z2dlci9kZWJ1Zy5sXSBbZGVidWdnZXIvZHRlc3QuY10gCisJICBbZGVidWdnZXIvb2JzdGFjay5oXQorCVVwZGF0ZXMgdG8gYWxsb3cgZGVidWdnZXIgdG8gZnVuY3Rpb24gdW5kZXIgTmV0QlNELgorCiBUdWUgU2VwIDI4IDE5OjU5OjIxIDE5OTMgIERhdmlkIE1ldGNhbGZlCiAKIAkqIFt3aW5kb3dzL3dpbi5jXQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBiNmQzMjM2Li44YjUwOGQ5IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw2ICsxLDYgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVGhlc2UgdmFyaWFibGVzIGFyZSBpbmhlcml0ZWQgYnkgdGhlIHN1Yi1tYWtlZmlsZXMKLURFQlVHT1BUUz0KK0RFQlVHT1BUUz0tRERFQlVHX1JFU09VUkNFCiBDT1BUUz0tTzIgLW00ODYKIElOQ0xVREVfRElSPWluY2x1ZGUKIExERkxBR1M9CkBAIC0xOCw3ICsxOCw3IEBACiBkdW1teToKIAogY2xlYW46Ci0Jcm0gLWYgKn4gKi5vCisJcm0gLWYgKn4gKi5vICojCiAJQGZvciBpIGluIHRvb2xzICQoU1VCRElSUyk7IGRvIChjZCAkJGkgJiYgJChNQUtFKSBjbGVhbikgfHwgZXhpdDsgZG9uZQogCiAkKFRBUkdFVCk6IGR1bW15CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggYmRjMjhlMi4uOWUzMjZkNiAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMTgsMTUgKzE4LDQyIEBACiBBbGw6CiAKIFRvIGJ1aWxkIFdpbmUsIGZpcnN0IGRvIGEgIm1ha2UgZGVwZW5kIiBhbmQgdGhlbiBhICJtYWtlIi4gIFRoZQotZXhlY3V0YWJsZSAid2luZSIgd2lsbCBiZSBidWlsdC4KK2V4ZWN1dGFibGUgIndpbmUiIHdpbGwgYmUgYnVpbHQuICAid2luZSIgd2lsbCBsb2FkIGFuZCBydW4gV2luZG93cycKK2V4ZWN1dGFibGVzLiAgWW91IG11c3Qgc3BlY2lmeSB0aGUgZW50aXJlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUsCitoYXZlIHRoZSBleGVjdXRhYmxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgb3Igc3BlY2lmeSBhIGxvYWQKK3BhdGggd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBXSU5FUEFUSC4KIAotR3JhYiBhIGNvcHkgb2YgV2luZG93cyBzb2wuZXhlIChTb2xpdGFpcmUpIGFuZCBydW4gaXQgd2l0aCB0aGUgY29tbWFuZDoKK0ZvciBleGFtcGxlLCB0byBydW4gV2luZG93cycgc29saXRhaXJlOgogCi0Jd2luZSBzb2wuZXhlCisJZXhwb3J0IFdJTkVQQVRIPS9kb3Mvd2luZG93czsvZG9zL3dpbmRvd3Mvc3lzdGVtCisJd2luZSBzb2wKIAogSGF2ZSBhIG5pY2UgZ2FtZSBvZiBzb2xpdGFpcmUsIGJ1dCBiZSBjYXJlZnVsLiAgRW11bGF0aW9uIGlzbid0IHBlcmZlY3QuCiBTbywgb2NjYXNzaW9uYWxseSBpdCB3aWxsIGNyYXNoLgogCitXSEFUJ1MgTkVXIHdpdGggdmVyc2lvbiAwLjQuNzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBNb3JlIGRpYWxvZyBib3ggZnVuY3Rpb25zCisJLSBNb3JlIERPUyBpbnRlcnJ1cHRzCisJLSBOZXRCU0QgY29tcGF0aWJpbGl0eSBwYXRjaGVzCisKK1dIQVQnUyBORVcgd2l0aCB2ZXJzaW9uIDAuNC41OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIEJ1ZyBmaXhlcworCS0gZm9jdXMgcm91dGluZXMKKwktIGRpYWxvZyBib3ggZnVuY3Rpb25zCisJLSBpbXByb3ZlbWVudHMgdG8gY29udHJvbCB3aW5kb3dzCisKK1dIQVQnUyBORVcgd2l0aCB2ZXJzaW9uIDAuNC40OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIEJ1ZyBmaXhlcworCS0gTmV3IHN0YXRpYyBjb250cm9sIGNsYXNzCisJLSBQcmVsaW1pbmFyeSBsaXN0Ym94LCBjb21ib2JveCBhbmQgc2Nyb2xsYmFyIGNvbnRyb2xzCisJLSBTeXN0ZW0gaW5pdGlhbGl6YXRpb24gZmlsZSBpcyBub3cgY2FsbGVkICJ3aW5lLmluaSIsIGFuZAorCSAgbWF5IGJlIGxvY2F0ZWQgaW4gdGhlIHVzZXIncyBjdXJyZW50IGRpcmVjdG9yeSwgdGhlCisJICB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgb3IgYW55IGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKKwkgIHRoZSBXSU5FUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKwktIFRoZSBsb2FkZXIgbm93IHNlYXJjaGVzIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgdGhlCisJICBXSU5FUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgcHJvZ3JhbXMgYW5kIERMTHMuCisJLSBJbnRlcm5hbCBkZWJ1Z2dlciBub3cgd29ya3Mgb24gMzg2QlNELgorCiBXSEFUJ1MgTkVXIHdpdGggdmVyc2lvbiAwLjQuMzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCiAJLSBCdWcgZml4ZXMKIAktIFJlc291cmNlIGxvYWRpbmcgbm93IGFibGUgdG8gbG9hZCBETEwgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9SRUFETUUuREVCVUdHRVIgYi9SRUFETUUuREVCVUdHRVIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNmZmOTkuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLkRFQlVHR0VSCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotRGF0ZTogU3VuLCAyNiBTZXAgOTMgMDM6MTg6MTkgRURUCi1Gcm9tOiBlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbCAoRXJpYyBZb3VuZ2RhbGUpCi1NZXNzYWdlLUlkOiA8OTMwOTI2MDcxOC5BQTEzOTY2QHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbD4KLVRvOiBib2JAYW1zY29ucy5hbXNjb25zLmNvbQotQ2M6IGxpbnV4LWFjdGl2aXN0c0BOaWtzdWxhLmh1dC5maQotSW4tUmVwbHktVG86IEJvYiBBbXN0YWR0J3MgbWVzc2FnZSBvZiBTYXQsIDI1IFNlcCAxOTkzIDIzOjM2OjMyICswMzAwCi0gICAgPG0wb2dnTXQtMDAwQ3JoQ0BhbXNjb25zLmFtc2NvbnMuY29tPgotWC1Nbi1LZXk6IFdBQkkKLQotCi0KLT5JIG1heSBqdXN0IGJlIGRyZWFtaW5nLCBidXQgSSdtIGJlZ2lubmluZyB0byBsaWtlIHRoZSBpZGVhIG9mIGEgYnVpbHQKLT5pbiBkZWJ1Z2dlci4KLQotCVNvIGRvIEkuICBJIGxpa2UgaXQgc28gbXVjaCB0aGF0IEkgd3JvdGUgb25lLiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlCi1kaXNhc3NlbWJseSBjb2RlIGluIGdkYiBpcyBwcmV0dHkgbXVjaCBsb2NhbGl6ZWQgdG8gb25lIHNvdXJjZSBmaWxlLCBhbmQgdGhpcwotd2FzIGVhc3kgdG8gc3BsaWNlIGludG8gYSBzaW1wbGUgcHJvZ3JhbS4gIEluIGFkZGl0aW9uLCB0aGVyZSBhcmUgMiB2YXJpYWJsZXMKLXRoYXQgeW91IHNldCBpZiB5b3UgYXJlIGRpc2Fzc2VtYmxpbmcgMTYgYml0IGNvZGUsIHNvIGl0IG1ha2VzIGl0IGFsbCB0aGUKLWJldHRlci4KLQotCUFueXdheSwgdGhlcmUgaXMgYSBwYXJzZXIgdGhhdCB1bmRlcnN0YW5kcyBhIGxpbWl0ZWQgc2V0IG9mIGdkYgotY29tbWFuZHMgKHZlcnkgbGltaXRlZCwgYnV0IHRoZSAneCcgY29tbWFuZCBpcyBwcmV0dHkgZnVuY3Rpb25hbCBhcyBsb25nIGFzIHlvdQotc3RpY2sgdG8gbnVtZXJpYyByYXRoZXIgdGhhbiBzeW1ib2xpYyBhZGRyZXNzZXMpLiAgVGhlIHBhcnNlciB1bmRlcnN0YW5kcyAkcGMKLWFuZCAkc3AgZm9yIHlvdXIgY29udmVuaWVuY2UsIGFuZCB5b3UgY2FuIGRvIHRoaW5ncyBsaWtlICJ4LzEwaSAkcGMiIGFuZCAiaW5mbwotcmVncyIgdG8gc2VlIHdoYXQgaXMgZ29pbmcgb24uICBJbiBwcmluY2lwbGUgeW91IGNhbiBkbyAieC94IiwgIngvcyIsICJ4L2QiLAotIngvdyIsICJ4L2IiLCAieC9pIiBhbmQgIngvYyIuICBJIGltcGxlbWVudGVkIGFuICJpbmZvIHN0YWNrIiBjb21tYW5kIHRoYXQKLXNpbXBseSBkdW1wcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdGFjayBvbnRvIHRoZSBzY3JlZW4sIGJ1dCBpdCBjdXJyZW50bHkKLW1ha2VzIG5vIGF0dGVtcHQgdG8gYWN0dWFsbHkgaW50ZXJwcmV0IHRoZSBzdGFjayBmcmFtZXMuCi0KLQlUaGlzIHdpbGwgcHJvYmFibHkgbm90IHdvcmsgb24gbm9uLWxpbnV4IHN5c3RlbXMsIGFuZCBJIGhhdmUgbm8gaWRlYQotaG93IG11Y2ggd29yayBpdCB3aWxsIGJlIHRvIGZpeCBpdC4gIFRvIHN0YXJ0IHdpdGggd2UgbmVlZCBzb21lIHNpbXBsZSBtYWNyb3MKLXRvIGRldGVybWluZSAoYmFzZWQgdXBvbiBhIHNlZ21lbnQgc2VsZWN0b3IpIHdoZXRoZXIgd2UgYXJlIGluIGEgMTYgYml0IG9yIGEgMzIKLWJpdCBzZWdtZW50LCBidXQgdGhpcyBzaG91bGQgYmUgcHJldHR5IGVhc3kgdG8gZml4LiAgSSBzaGFtZWxlc3NseSByaXBwZWQgb2ZmIGEKLWJ1bmNoIG9mIGZpbGVzIGZyb20gZ2RiLCBhbmQgSSBvYnZpb3VzbHkgcGlja2VkIHRoZSBvbmVzIGZvciBsaW51eC4gIEZvciBvdGhlcgotc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gbWFrZSBhZGp1c3RtZW50cyB0byB0aGVzZSBmaWxlcyBzb21laG93LiAgSXQgaXMgdG9vCi1sYXRlIGluIHRoZSBldmVuaW5nIHRvIHdvcnJ5IGFib3V0IHRoaXMgbm93LgotCi0JSXQgd2lsbCBwcm9iYWJseSBiZSBlYXN5IHRvIG1vZGlmeSB0aGUgcGFyc2VyIHRvIGFsbG93IHlvdSB0byBjaGFuZ2UKLW1lbW9yeSBsb2NhdGlvbnMgYW5kL29yIHJlZ2lzdGVyIHZhbHVlcyBhbmQgdGhlbiBjb250aW51ZSBleGVjdXRpb24uICBBbHNvLAotc29tZSBvZiB0aGUgaG9va3MgZm9yIHVzaW5nIHJlYWRsaW5lIHdpdGggdGhlIHBhcnNlciBhcmUgaW4gcGxhY2UsIGJ1dCBpdCBkb2VzCi1ub3Qgd29yayByZWxpYWJseSBmb3Igc29tZSByZWFzb24sIHNvIEkgbGVmdCBpdCBvdXQgZm9yIG5vdy4gIEFkZGluZyBnbnUKLXJlYWRsaW5lIHJlYWxseSB3b3VsZCBibG9hdCB0aGUgcGFja2FnZSBhIGxvdC4gIEluc3RlYWQgSSBjb3VsZCB1c2UgUmljaCBTYWx6J3MKLWVkaXRsaWIgKHRoZSBjYW5vbmljYWwgdGVzdCBjYXNlIGZvciB0aGUgRExMIHRvb2xzKSwgd2hpY2ggaGFzIGEgY29tbWFuZCBsaW5lCi1oaXN0b3J5IGZlYXR1cmUgdGhhdCBjb3VsZCBiZSBhbiBhY2NlcHRhYmxlIHN1YnN0aXR1dGUgLSB0aGlzIGlzIG11Y2ggc21hbGxlcgotdGhhbiBnbnUgcmVhZGxpbmUsIGJ1dCBJIGFtIG5vdCBzdXJlIHdoYXQgZmVhdHVyZXMgYXJlIHByZXNlbnQuCi0KLS1FcmljCmRpZmYgLS1naXQgYS9ic2RtYWtlLnBhdGNoIGIvYnNkbWFrZS5wYXRjaAppbmRleCA3YmUyODkzLi45OWZhNTdhIDEwMDY0NAotLS0gYS9ic2RtYWtlLnBhdGNoCisrKyBiL2JzZG1ha2UucGF0Y2gKQEAgLTYsNyArNiw3IEBACiAgIyBUaGVzZSBkZWZpbml0aW9ucyBhcmUgZm9yIHRoZSB0b3AgbGV2ZWwKICBUQVJHRVQ9d2luZQogLUxJQlM9LUwuIC1ML3Vzci9YMzg2L2xpYiAtbFhleHQgLWxYYXcgLWxYdCAtbFhtdSAtbFgxMSAtbG0KLStMSUJTPS1MLiAtTC91c3IvWDM4Ni9saWIgLWxYZXh0IC1sWGF3IC1sWHQgLWxYbXUgLWxYMTEgLWxtIC1saTM4NgorK0xJQlM9LUwuIC1ML3Vzci9YMzg2L2xpYiAtbFhleHQgLWxYYXcgLWxYdCAtbFhtdSAtbFgxMSAtbG0gLWxpMzg2IC1sZ251bWFsbG9jCiAgT0JKUz1pZjE2MzIvaWYxNjMyLm8gY29udHJvbHMvY29udHJvbHMubyBsb2FkZXIvbG9hZGVyLm8gXAogIAltZW1vcnkvbWVtb3J5Lm8gbWlzYy9taXNjLm8gb2JqZWN0cy9vYmplY3RzLm8gd2luZG93cy93aW5kb3dzLm8KICBTVUJESVJTPWlmMTYzMiBjb250cm9scyBsb2FkZXIgbWVtb3J5IG1pc2Mgb2JqZWN0cyB3aW5kb3dzCkBAIC0xMjIsMyArMTIyLDEyIEBACiArLmlmIGV4aXN0cyguZGVwZW5kKQogKy5pbmNsdWRlICIuZGVwZW5kIgogKy5lbmRpZgorLS0tIGRlYnVnZ2VyL01ha2VmaWxlLm9yaWcJVGh1IFNlcCAzMCAwNzoyOTozOSAxOTkzCisrKysgZGVidWdnZXIvTWFrZWZpbGUJVGh1IFNlcCAzMCAwNzoyNzowMCAxOTkzCitAQCAtMzcsMyArMzcsNiBAQAorIGRlcGVuZDogZGJnLnRhYi5jIGRiZy50YWIuaCBsZXgueXkuYworIAkkKENDKSAkKENGTEFHUykgLU0gKi5jID4gLmRlcGVuZAorIAorKy5pZiBleGlzdHMoLmRlcGVuZCkKKysuaW5jbHVkZSAiLmRlcGVuZCIKKysuZW5kaWYKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL01ha2VmaWxlIGIvY29udHJvbHMvTWFrZWZpbGUKaW5kZXggNDZhOTNiYS4uMmY0YzA4MSAxMDA2NDQKLS0tIGEvY29udHJvbHMvTWFrZWZpbGUKKysrIGIvY29udHJvbHMvTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiBDRkxBR1M9JChDT1BUUykgJChERUJVR09QVFMpIC1JJChJTkNMVURFX0RJUikKIAotT0JKUz1tZW51Lm8gd2lkZ2V0cy5vIGJ1dHRvbi5vIFNtZU1lbnVCdXR0by5vIFdpbkxhYmVsLm8gV2luQ29tbWFuZC5vIFwKLSAgICAgV2luTWVudUJ1dHRvLm8KK09CSlM9bWVudS5vIHdpZGdldHMubyBidXR0b24ubyBzY3JvbGwubyBsaXN0Ym94Lm8gY29tYm8ubyBzdGF0aWMubyBcCisJU21lTWVudUJ1dHRvLm8gV2luTGFiZWwubyBXaW5Db21tYW5kLm8gXAorCVdpbk1lbnVCdXR0by5vCiAKIGRlZmF1bHQ6IGNvbnRyb2xzLm8KIApAQCAtOSw3ICsxMCw3IEBACiAJJChMRCkgLXIgLW8gY29udHJvbHMubyAkKE9CSlMpCiAKIGNsZWFuOgotCXJtIC1mICoubyAqfiAqLnMgZGxsXyogKi5hCisJcm0gLWYgKi5vICp+ICoucyBkbGxfKiAqLmEgKiMKIAogZGVwZW5kOgogCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCmRpZmYgLS1naXQgYS9jb250cm9scy9idXR0b24uYyBiL2NvbnRyb2xzL2J1dHRvbi5jCmluZGV4IGY4NDNiZWIuLjFhMTNiOWQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2J1dHRvbi5jCisrKyBiL2NvbnRyb2xzL2J1dHRvbi5jCkBAIC0xLDMzICsxLDUzIEBACi0vKiBGaWxlOiBidXR0b24uYyAtLSBNUy1XaW5kb3dzKHRtKSBjb21wYXRpYmxlICJCdXR0b24iIHJlcGxhY2VtZW50IHdpZGdldAorLyogRmlsZTogYnV0dG9uLmMgLS0gQnV0dG9uIHR5cGUgd2lkZ2V0cwogICoKLSAqICAgICAgICAgICAgICAgICAgIHByb2dyYW1tZWQgYnkgSm9oYW5uZXMgUnVzY2hlaW5za2kgZm9yIHRoZSBMaW51eCBXQUJJCi0gKiAgICAgICAgICAgICAgICAgICBwcm9qZWN0LgotICoJCSAgICAgKEMpIDE5OTMgYnkgSm9oYW5uZXMgUnVzY2hlaW5za2kKLSAqCi0gKiAgICAgICAgICAgICAgICAgICBNb2RpZmljYXRpb25zIGJ5IERhdmlkIE1ldGNhbGZlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgSm9oYW5uZXMgUnVzY2hlaW5za2kKKyAqIENvcHlyaWdodCAoQykgMTk5MyBEYXZpZCBNZXRjYWxmZQogICovCiAKK3N0YXRpYyBjaGFyIENvcHlyaWdodDFbXSA9ICJDb3B5cmlnaHQgSm9oYW5uZXMgUnVzY2hlaW5za2ksIDE5OTMiOworc3RhdGljIGNoYXIgQ29weXJpZ2h0MltdID0gIkNvcHlyaWdodCBEYXZpZCBNZXRjYWxmZSwgMTk5MyI7CisKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSAid2luLmgiCiAKIExPTkcgQnV0dG9uV25kUHJvYyhIV05EIGhXbmQsIFdPUkQgdU1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKIAotc3RhdGljIENPTE9SUkVGIGNvbG9yX3dpbmRvd2ZyYW1lLCBjb2xvcl9idG5mYWNlLCBjb2xvcl9idG5zaGFkb3csCi0JCWNvbG9yX2J0bnRleHQsIGNvbG9yX2J0bmhpZ2hsaWdodDsKK3N0YXRpYyBDT0xPUlJFRiBjb2xvcl93aW5kb3d0ZXh0LCBjb2xvcl93aW5kb3dmcmFtZSwgY29sb3JfYnRuZmFjZSwgCisgICAgICAgICAgICAgICAgY29sb3JfYnRuc2hhZG93LCBjb2xvcl9idG50ZXh0LCBjb2xvcl9idG5oaWdobGlnaHQ7CiAKIHN0YXRpYyBCT09MIHByZXNzZWQ7CiAKICNkZWZpbmUgTk9USUZZX1BBUkVOVChoV25kQ250cmwsIHdOb3RpZnlDb2RlKSBcCiAJU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmRDbnRybCksIFdNX0NPTU1BTkQsIFwKLQkJICAgIEdldERsZ0N0cmxJRChoV25kQ250cmwpLCBNQUtFTFBBUkFNKGhXbmRDbnRybCwgd05vdGlmeUNvZGUpKTsKKwkJR2V0RGxnQ3RybElEKGhXbmRDbnRybCksIE1BS0VMUEFSQU0oaFduZENudHJsLCB3Tm90aWZ5Q29kZSkpOwogI2RlZmluZSBESU0oYXJyYXkpCSgoc2l6ZW9mIGFycmF5KS8oc2l6ZW9mIGFycmF5WzBdKSkKIAogc3RhdGljIExPTkcgUEJfUGFpbnQoSFdORCBoV25kKTsKIHN0YXRpYyBMT05HIFBCX0xCdXR0b25Eb3duKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKIHN0YXRpYyBMT05HIFBCX0xCdXR0b25VcChIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CiBzdGF0aWMgTE9ORyBQQl9MQnV0dG9uRGJsQ2xrKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKK3N0YXRpYyBMT05HIFBCX0tpbGxGb2N1cyhIV05EIGh3bmQpOwogc3RhdGljIHZvaWQgRHJhd1JhaXNlZFB1c2hCdXR0b24oSERDIGhEQywgSFdORCBoQnV0dG9uLCBSRUNUIHJjKTsKIHN0YXRpYyB2b2lkIERyYXdQcmVzc2VkUHVzaEJ1dHRvbihIREMgaERDLCBIV05EIGhCdXR0b24sIFJFQ1QgcmMpOworc3RhdGljIExPTkcgQ0JfUGFpbnQoSFdORCBoV25kKTsKK3N0YXRpYyBMT05HIENCX0xCdXR0b25Eb3duKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKK3N0YXRpYyBMT05HIENCX0xCdXR0b25VcChIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CitzdGF0aWMgTE9ORyBDQl9MQnV0dG9uRGJsQ2xrKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKK3N0YXRpYyBMT05HIENCX0tpbGxGb2N1cyhIV05EIGhXbmQpOworc3RhdGljIExPTkcgQ0JfU2V0Q2hlY2soSFdORCBoV25kLCBXT1JEIHdQYXJhbSk7CitzdGF0aWMgTE9ORyBDQl9HZXRDaGVjayhIV05EIGhXbmQpOworc3RhdGljIExPTkcgUkJfUGFpbnQoSFdORCBoV25kKTsKK3N0YXRpYyBMT05HIFJCX0xCdXR0b25Eb3duKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKK3N0YXRpYyBMT05HIFJCX0xCdXR0b25VcChIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CitzdGF0aWMgTE9ORyBSQl9MQnV0dG9uRGJsQ2xrKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKK3N0YXRpYyBMT05HIFJCX0tpbGxGb2N1cyhIV05EIGhXbmQpOworc3RhdGljIExPTkcgUkJfU2V0Q2hlY2soSFdORCBoV25kLCBXT1JEIHdQYXJhbSk7CitzdGF0aWMgTE9ORyBSQl9HZXRDaGVjayhIV05EIGhXbmQpOworc3RhdGljIExPTkcgR0JfUGFpbnQoSFdORCBoV25kKTsKK3N0YXRpYyBMT05HIFVCX1BhaW50KEhXTkQgaFduZCk7CitzdGF0aWMgTE9ORyBVQl9MQnV0dG9uRG93bihIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CitzdGF0aWMgTE9ORyBVQl9MQnV0dG9uVXAoSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOworc3RhdGljIExPTkcgVUJfS2lsbEZvY3VzKEhXTkQgaFduZCk7CiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0zNSw5ICs1NSwxMiBAQAogICAgIExPTkcgKCpsQnV0dG9uRG93bmZuKSgpOwogICAgIExPTkcgKCpsQnV0dG9uVXBmbikoKTsKICAgICBMT05HICgqbEJ1dHRvbkRibENsa2ZuKSgpOworICAgIExPTkcgKCpraWxsRm9jdXNmbikoKTsKKyAgICBMT05HICgqc2V0Q2hlY2tmbikoKTsKKyAgICBMT05HICgqZ2V0Q2hlY2tmbikoKTsKIH0gQlRORk47CiAKLSNkZWZpbmUgTUFYX0JUTl9UWVBFICAyCisjZGVmaW5lIE1BWF9CVE5fVFlQRSAgMTAKIAogc3RhdGljIEJUTkZOIGJ0bmZuW01BWF9CVE5fVFlQRV0gPQogewpAQCAtNDUsMTMgKzY4LDkxIEBACiAJKExPTkcoKikoKSlQQl9QYWludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTX1BVU0hCVVRUT04gKi8KIAkoTE9ORygqKSgpKVBCX0xCdXR0b25Eb3duLAogCShMT05HKCopKCkpUEJfTEJ1dHRvblVwLAotCShMT05HKCopKCkpUEJfTEJ1dHRvbkRibENsaworCShMT05HKCopKCkpUEJfTEJ1dHRvbkRibENsaywKKwkoTE9ORygqKSgpKVBCX0tpbGxGb2N1cywKKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlOVUxMCiAgICAgfSwKICAgICB7IAogCShMT05HKCopKCkpUEJfUGFpbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBCU19ERUZQVVNIQlVUVE9OICovCiAJKExPTkcoKikoKSlQQl9MQnV0dG9uRG93biwKIAkoTE9ORygqKSgpKVBCX0xCdXR0b25VcCwKLQkoTE9ORygqKSgpKVBCX0xCdXR0b25EYmxDbGsKKwkoTE9ORygqKSgpKVBCX0xCdXR0b25EYmxDbGssCisJKExPTkcoKikoKSlQQl9LaWxsRm9jdXMsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTAorICAgIH0sCisgICAgeworCShMT05HKCopKCkpQ0JfUGFpbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBCU19DSEVDS0JPWCAqLworCShMT05HKCopKCkpQ0JfTEJ1dHRvbkRvd24sCisJKExPTkcoKikoKSlDQl9MQnV0dG9uVXAsCisJKExPTkcoKikoKSlDQl9MQnV0dG9uRGJsQ2xrLAorCShMT05HKCopKCkpQ0JfS2lsbEZvY3VzLAorCShMT05HKCopKCkpQ0JfU2V0Q2hlY2ssCisJKExPTkcoKikoKSlDQl9HZXRDaGVjaworICAgIH0sCisgICAgeworCShMT05HKCopKCkpQ0JfUGFpbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBCU19BVVRPQ0hFQ0tCT1ggKi8KKwkoTE9ORygqKSgpKUNCX0xCdXR0b25Eb3duLAorCShMT05HKCopKCkpQ0JfTEJ1dHRvblVwLAorCShMT05HKCopKCkpQ0JfTEJ1dHRvbkRibENsaywKKwkoTE9ORygqKSgpKUNCX0tpbGxGb2N1cywKKwkoTE9ORygqKSgpKUNCX1NldENoZWNrLAorCShMT05HKCopKCkpQ0JfR2V0Q2hlY2sKKyAgICB9LAorICAgIHsKKwkoTE9ORygqKSgpKVJCX1BhaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogQlNfUkFESU9CVVRUT04gKi8KKwkoTE9ORygqKSgpKVJCX0xCdXR0b25Eb3duLAorCShMT05HKCopKCkpUkJfTEJ1dHRvblVwLAorCShMT05HKCopKCkpUkJfTEJ1dHRvbkRibENsaywKKwkoTE9ORygqKSgpKVJCX0tpbGxGb2N1cywKKwkoTE9ORygqKSgpKVJCX1NldENoZWNrLAorCShMT05HKCopKCkpUkJfR2V0Q2hlY2sKKyAgICB9LAorICAgIHsKKwkoTE9ORygqKSgpKUNCX1BhaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogQlNfM1NUQVRFICovCisJKExPTkcoKikoKSlDQl9MQnV0dG9uRG93biwKKwkoTE9ORygqKSgpKUNCX0xCdXR0b25VcCwKKwkoTE9ORygqKSgpKUNCX0xCdXR0b25EYmxDbGssCisJKExPTkcoKikoKSlDQl9LaWxsRm9jdXMsCisJKExPTkcoKikoKSlDQl9TZXRDaGVjaywKKwkoTE9ORygqKSgpKUNCX0dldENoZWNrCisgICAgfSwKKyAgICB7CisJKExPTkcoKikoKSlDQl9QYWludCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEJTX0FVVE8zU1RBVEUgKi8KKwkoTE9ORygqKSgpKUNCX0xCdXR0b25Eb3duLAorCShMT05HKCopKCkpQ0JfTEJ1dHRvblVwLAorCShMT05HKCopKCkpQ0JfTEJ1dHRvbkRibENsaywKKwkoTE9ORygqKSgpKUNCX0tpbGxGb2N1cywKKwkoTE9ORygqKSgpKUNCX1NldENoZWNrLAorCShMT05HKCopKCkpQ0JfR2V0Q2hlY2sKKyAgICB9LAorICAgIHsKKwkoTE9ORygqKSgpKUdCX1BhaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogQlNfR1JPVVBCT1ggKi8KKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTCwKKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTAorICAgIH0sCisgICAgeworCShMT05HKCopKCkpVUJfUGFpbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBCU19VU0VSQlVUVE9OICovCisJKExPTkcoKikoKSlVQl9MQnV0dG9uRG93biwKKwkoTE9ORygqKSgpKVVCX0xCdXR0b25VcCwKKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlVQl9LaWxsRm9jdXMsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTAorICAgIH0sCisgICAgeworCShMT05HKCopKCkpUkJfUGFpbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBCU19BVVRPUkFESU9CVVRUT04gKi8KKwkoTE9ORygqKSgpKVJCX0xCdXR0b25Eb3duLAorCShMT05HKCopKCkpUkJfTEJ1dHRvblVwLAorCShMT05HKCopKCkpUkJfTEJ1dHRvbkRibENsaywKKwkoTE9ORygqKSgpKVJCX0tpbGxGb2N1cywKKwkoTE9ORygqKSgpKVJCX1NldENoZWNrLAorCShMT05HKCopKCkpUkJfR2V0Q2hlY2sKICAgICB9CiB9OwogCkBAIC04MCw0MiArMTgxLDQ5IEBACiAJCWVsc2UKIAkJewogCQkgICAgLyogaW5pdGlhbGlzZSBjb2xvdXJzIHVzZWQgZm9yIGJ1dHRvbiByZW5kZXJpbmc6ICovCisJCSAgICBjb2xvcl93aW5kb3d0ZXh0ICAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dURVhUKTsKIAkJICAgIGNvbG9yX3dpbmRvd2ZyYW1lICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV0ZSQU1FKTsKIAkJICAgIGNvbG9yX2J0bmZhY2UgICAgICA9IEdldFN5c0NvbG9yKENPTE9SX0JUTkZBQ0UpOwogCQkgICAgY29sb3JfYnRuc2hhZG93ICAgID0gR2V0U3lzQ29sb3IoQ09MT1JfQlROU0hBRE9XKTsKIAkJICAgIGNvbG9yX2J0bnRleHQgICAgICA9IEdldFN5c0NvbG9yKENPTE9SX0JUTlRFWFQpOwogCQkgICAgY29sb3JfYnRuaGlnaGxpZ2h0ID0gR2V0U3lzQ29sb3IoQ09MT1JfQlROSElHSExJR0hUKTsKIAorCQkgICAgKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSA9IDA7CiAJCSAgICBwcmVzc2VkID0gRkFMU0U7CiAJCSAgICBsUmVzdWx0ID0gMEw7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIFdNX1BBSU5UOgotCQkoYnRuZm5bc3R5bGVdLnBhaW50Zm4pKGhXbmQpOworCQlpZiAoYnRuZm5bc3R5bGVdLnBhaW50Zm4pCisJCSAgICAoYnRuZm5bc3R5bGVdLnBhaW50Zm4pKGhXbmQpOwogCQlicmVhazsKIAogCWNhc2UgV01fTEJVVFRPTkRPV046Ci0JCShidG5mbltzdHlsZV0ubEJ1dHRvbkRvd25mbikoaFduZCwgd1BhcmFtLCBsUGFyYW0pOworCQlpZiAoYnRuZm5bc3R5bGVdLmxCdXR0b25Eb3duZm4pCisJCSAgICAoYnRuZm5bc3R5bGVdLmxCdXR0b25Eb3duZm4pKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNX0xCVVRUT05VUDoKLQkJKGJ0bmZuW3N0eWxlXS5sQnV0dG9uVXBmbikoaFduZCwgd1BhcmFtLCBsUGFyYW0pOworCQlpZiAoYnRuZm5bc3R5bGVdLmxCdXR0b25VcGZuKQorCQkgICAgKGJ0bmZuW3N0eWxlXS5sQnV0dG9uVXBmbikoaFduZCwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgV01fTEJVVFRPTkRCTENMSzoKLQkJKGJ0bmZuW3N0eWxlXS5sQnV0dG9uRGJsQ2xrZm4pKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKKwkJaWYgKGJ0bmZuW3N0eWxlXS5sQnV0dG9uRGJsQ2xrZm4pCisJCSAgICAoYnRuZm5bc3R5bGVdLmxCdXR0b25EYmxDbGtmbikoaFduZCwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKIAogCWNhc2UgV01fU0VURk9DVVM6CiAJCWJyZWFrOwogCiAJY2FzZSBXTV9LSUxMRk9DVVM6Ci0JCUludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKLQkJVXBkYXRlV2luZG93KGhXbmQpOworCQlpZiAoYnRuZm5bc3R5bGVdLmtpbGxGb2N1c2ZuKQorCQkgICAgKGJ0bmZuW3N0eWxlXS5raWxsRm9jdXNmbikoaFduZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTV9TWVNDT0xPUkNIQU5HRToKKwkJY29sb3Jfd2luZG93dGV4dCAgID0gR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XVEVYVCk7CiAJCWNvbG9yX3dpbmRvd2ZyYW1lICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV0ZSQU1FKTsKIAkJY29sb3JfYnRuZmFjZSAgICAgID0gR2V0U3lzQ29sb3IoQ09MT1JfQlRORkFDRSk7CiAJCWNvbG9yX2J0bnNoYWRvdyAgICA9IEdldFN5c0NvbG9yKENPTE9SX0JUTlNIQURPVyk7CkBAIC0xMjQsNiArMjMyLDE2IEBACiAJCUludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIFRSVUUpOwogCQlicmVhazsKIAorCWNhc2UgQk1fU0VUQ0hFQ0s6CisJCWlmIChidG5mbltzdHlsZV0uc2V0Q2hlY2tmbikKKwkJICAgIChidG5mbltzdHlsZV0uc2V0Q2hlY2tmbikoaFduZCwgd1BhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEJNX0dFVENIRUNLOgorCQlpZiAoYnRuZm5bc3R5bGVdLmdldENoZWNrZm4pCisJCSAgICAoYnRuZm5bc3R5bGVdLmdldENoZWNrZm4pKGhXbmQpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jKGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CkBAIC0xNTUsNyArMjczLDcgQEAKIAogc3RhdGljIExPTkcgUEJfTEJ1dHRvbkRvd24oSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0vKiAgU2V0Rm9jdXMoaFduZCk7ICAgKi8KKy8qICAgIFNldEZvY3VzKGhXbmQpOyAqLwogICAgIFNldENhcHR1cmUoaFduZCk7CiAgICAgcHJlc3NlZCA9IFRSVUU7CiAgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOwpAQCAtMTg0LDYgKzMwMiwxMyBAQAogCU5PVElGWV9QQVJFTlQoaFduZCwgQk5fRE9VQkxFQ0xJQ0tFRCk7CiB9CiAKK3N0YXRpYyBMT05HIFBCX0tpbGxGb2N1cyhIV05EIGhXbmQpCit7CisgICAgcHJlc3NlZCA9IEZBTFNFOworICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKKyAgICBVcGRhdGVXaW5kb3coaFduZCk7Cit9CisKIHN0YXRpYyB2b2lkIERyYXdSYWlzZWRQdXNoQnV0dG9uKEhEQyBoREMsIEhXTkQgaEJ1dHRvbiwgUkVDVCByYykKIHsKIAlIUEVOIGhPbGRQZW4sIGhGcmFtZVBlbjsKQEAgLTI1NSwxOSArMzgwLDE2IEBACiAJQ29tYmluZVJnbihyZ24sIHJnbjEsIHJnbjIsIFJHTl9BTkQpOwogCUZpbGxSZ24oaERDLCByZ24yLCBoU2hhZG93QnJ1c2gpOwogCi0jaWYgMAogCS8qIGRvIHdlIGhhdmUgdGhlIGZvY3VzPyAqLwogCWlmIChsZW4gPj0gMSAmJiBHZXRGb2N1cygpID09IGhCdXR0b24pIHsKIAkJZHdUZXh0U2l6ZSA9IEdldFRleHRFeHRlbnQoaERDLCB0ZXh0LCBsZW4pOwotCQlkZWx0YSA9ICgocmMucmlnaHQgLSByYy5sZWZ0KSAtIExPV09SRChkd1RleHRTaXplKSArIDEpID4+IDE7CisJCWRlbHRhID0gKChyYy5yaWdodCAtIHJjLmxlZnQpIC0gTE9XT1JEKGR3VGV4dFNpemUpIC0gMSkgPj4gMTsKIAkJcmMubGVmdCArPSBkZWx0YTsJcmMucmlnaHQgLT0gZGVsdGE7CiAJCUdldFRleHRNZXRyaWNzKGhEQywgJnRtKTsKLQkJZGVsdGEgPSAoKHJjLmJvdHRvbSAtIHJjLnRvcCkgLQotCQkJIHRtLnRtSGVpZ2h0ICsgdG0udG1JbnRlcm5hbExlYWRpbmcpID4+IDE7CisJCWRlbHRhID0gKChyYy5ib3R0b20gLSByYy50b3ApIC0gdG0udG1IZWlnaHQgLSAxKSA+PiAxOwogCQlyYy50b3AgKz0gZGVsdGE7IAlyYy5ib3R0b20gLT0gZGVsdGE7CiAJCURyYXdGb2N1c1JlY3QoaERDLCAmcmMpOwogCX0KLSNlbmRpZgogCiAJU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloT2xkUGVuKTsKIAlTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhPbGRCcnVzaCk7CkBAIC0yNzUsMTAgKzM5Nyw4IEBACiAJRGVsZXRlT2JqZWN0KChIQU5ETEUpaFNoYWRvd0JydXNoKTsKIAlEZWxldGVPYmplY3QoKEhBTkRMRSloQmFja2dybmRCcnVzaCk7CiAJRGVsZXRlT2JqZWN0KChIQU5ETEUpcmduMSk7Ci0jaWYgMAogCURlbGV0ZU9iamVjdCgoSEFORExFKXJnbjIpOwogCURlbGV0ZU9iamVjdCgoSEFORExFKXJnbik7Ci0jZW5kaWYKIH0KIAogCkBAIC0zMjAsMTkgKzQ0MCwxNiBAQAogCQkJIERUX1NJTkdMRUxJTkUgfCBEVF9DRU5URVJ8IERUX1ZDRU5URVIpOwogCX0KIAotI2lmIDAKIAkvKiBkbyB3ZSBoYXZlIHRoZSBmb2N1cz8gKi8KIAlpZiAobGVuID49IDEgJiYgR2V0Rm9jdXMoKSA9PSBoQnV0dG9uKSB7CiAJCWR3VGV4dFNpemUgPSBHZXRUZXh0RXh0ZW50KGhEQywgdGV4dCwgbGVuKTsKLQkJZGVsdGEgPSAoKHJjLnJpZ2h0IC0gcmMubGVmdCkgLSBMT1dPUkQoZHdUZXh0U2l6ZSkpID4+IDE7CisJCWRlbHRhID0gKChyYy5yaWdodCAtIHJjLmxlZnQpIC0gTE9XT1JEKGR3VGV4dFNpemUpIC0gMSkgPj4gMTsKIAkJcmMubGVmdCArPSBkZWx0YTsJcmMucmlnaHQgLT0gZGVsdGE7CiAJCUdldFRleHRNZXRyaWNzKGhEQywgJnRtKTsKLQkJZGVsdGEgPSAoKHJjLmJvdHRvbSAtIHJjLnRvcCkgLQotCQkJIHRtLnRtSGVpZ2h0ICsgdG0udG1JbnRlcm5hbExlYWRpbmcpID4+IDE7CisJCWRlbHRhID0gKChyYy5ib3R0b20gLSByYy50b3ApIC0gdG0udG1IZWlnaHQgLSAxKSA+PiAxOwogCQlyYy50b3AgKz0gZGVsdGE7IAlyYy5ib3R0b20gLT0gZGVsdGE7CiAJCURyYXdGb2N1c1JlY3QoaERDLCAmcmMpOwogCX0KLSNlbmRpZgogCiAJU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloT2xkUGVuKTsKIAlTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhPbGRCcnVzaCk7CkBAIC0zNDIsMTAgKzQ1OSw0OTggQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgQ2hlY2sgQm94IEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBMT05HIENCX1BhaW50KEhXTkQgaFduZCkKK3sKKyAgICBQQUlOVFNUUlVDVCBwczsKKyAgICBSRUNUIHJjLCByYzM7CisgICAgSERDIGhEQzsKKyAgICBIUEVOIGhQZW4sIGhPbGRQZW47CisgICAgSEJSVVNIIGhCcnVzaCwgaEdyYXlCcnVzaDsKKyAgICBpbnQgdGV4dGxlbiwgZGVsdGE7CisgICAgY2hhciAqdGV4dDsKKyAgICBIQU5ETEUgaFRleHQ7CisgICAgVEVYVE1FVFJJQyB0bTsKKyAgICBTSVpFIHNpemU7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKworICAgIGhEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisKKyAgICBoUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCBjb2xvcl93aW5kb3d0ZXh0KTsKKyAgICBoT2xkUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloUGVuKTsKKyAgICBoR3JheUJydXNoID0gKEhCUlVTSClHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpOworCisgICAgaEJydXNoID0gU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9DVExDT0xPUiwgKFdPUkQpaERDLAorCQkJIE1BS0VMUEFSQU0oaFduZCwgQ1RMQ09MT1JfQlROKSk7CisgICAgRmlsbFJlY3QoaERDLCAmcmMsIGhCcnVzaCk7CisKKyAgICB0ZXh0bGVuID0gR2V0V2luZG93VGV4dExlbmd0aChoV25kKTsKKyAgICBoVGV4dCA9IExvY2FsQWxsb2MoTE1FTV9NT1ZFQUJMRSwgdGV4dGxlbisxKTsKKyAgICB0ZXh0ID0gTG9jYWxMb2NrKGhUZXh0KTsKKyAgICBHZXRXaW5kb3dUZXh0KGhXbmQsIHRleHQsIHRleHRsZW4rMSk7CisgICAgR2V0VGV4dE1ldHJpY3MoaERDLCAmdG0pOworCisgICAgZGVsdGEgPSAocmMuYm90dG9tIC0gcmMudG9wIC0gdG0udG1IZWlnaHQpID4+IDE7CisgICAgUmVjdGFuZ2xlKGhEQywgMCwgcmMudG9wICsgZGVsdGEsIHRtLnRtSGVpZ2h0LCB0bS50bUhlaWdodCArIGRlbHRhKTsKKyAgICBpZiAocHJlc3NlZCkKKwlSZWN0YW5nbGUoaERDLCAxLCByYy50b3AgKyBkZWx0YSArIDEsIHRtLnRtSGVpZ2h0IC0gMSwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLnRtSGVpZ2h0ICsgZGVsdGEgLSAxKTsKKworICAgIHN3aXRjaCAoKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSkKKyAgICB7CisgICAgY2FzZSAxOgorCU1vdmVUbyhoREMsIDAsIHJjLnRvcCArIGRlbHRhKTsKKwlMaW5lVG8oaERDLCB0bS50bUhlaWdodCAtIDEsIHRtLnRtSGVpZ2h0ICsgZGVsdGEgLSAxKTsKKwlNb3ZlVG8oaERDLCAwLCB0bS50bUhlaWdodCArIGRlbHRhIC0gMSk7CisJTGluZVRvKGhEQywgdG0udG1IZWlnaHQgLSAxLCByYy50b3AgKyBkZWx0YSk7CisJYnJlYWs7CisKKyAgICBjYXNlIDI6CisJcmMzLmxlZnQgPSAxOworCXJjMy50b3AgPSByYy50b3AgKyBkZWx0YSArIDE7CisJcmMzLnJpZ2h0ID0gdG0udG1IZWlnaHQgLSAxOworCXJjMy5ib3R0b20gPSB0bS50bUhlaWdodCArIGRlbHRhIC0gMTsKKwlGaWxsUmVjdChoREMsICZyYzMsIGhHcmF5QnJ1c2gpOworCWJyZWFrOworICAgIH0KKworICAgIHJjLmxlZnQgPSB0bS50bUhlaWdodCArIHRtLnRtQXZlQ2hhcldpZHRoIC8gMjsKKyAgICBEcmF3VGV4dChoREMsIHRleHQsIHRleHRsZW4sICZyYywgRFRfU0lOR0xFTElORSB8IERUX1ZDRU5URVIpOworCisgICAgLyogZG8gd2UgaGF2ZSB0aGUgZm9jdXM/ICovCisgICAgaWYgKEdldEZvY3VzKCkgPT0gaFduZCkKKyAgICB7CisJR2V0VGV4dEV4dGVudFBvaW50KGhEQywgdGV4dCwgdGV4dGxlbiwgJnNpemUpOworCXJjLnRvcCArPSBkZWx0YSAtIDE7CisJcmMuYm90dG9tIC09IGRlbHRhICsgMTsKKwlyYy5sZWZ0LS07CisJcmMucmlnaHQgPSByYy5sZWZ0ICsgc2l6ZS5jeCArIDI7CisJRHJhd0ZvY3VzUmVjdChoREMsICZyYyk7CisgICAgfQorCisgICAgTG9jYWxVbmxvY2soaFRleHQpOworICAgIExvY2FsRnJlZShoVGV4dCk7CisgICAgR2xvYmFsVW5sb2NrKGhXbmQpOworICAgIEVuZFBhaW50KGhXbmQsICZwcyk7Cit9CisKK3N0YXRpYyBMT05HIENCX0xCdXR0b25Eb3duKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIFJFQ1QgcmM7CisgICAgSERDIGhEQzsKKyAgICBURVhUTUVUUklDIHRtOworICAgIGludCBkZWx0YTsKKworICAgIGhEQyA9IEdldERDKGhXbmQpOworICAgIEdldFRleHRNZXRyaWNzKGhEQywgJnRtKTsKKyAgICBSZWxlYXNlREMoaFduZCwgaERDKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisgICAgZGVsdGEgPSAocmMuYm90dG9tIC0gcmMudG9wIC0gdG0udG1IZWlnaHQpID4+IDE7CisgICAgcmMudG9wICs9IGRlbHRhOworICAgIHJjLmJvdHRvbSA9IHRtLnRtSGVpZ2h0ICsgZGVsdGE7CisgICAgcmMucmlnaHQgPSB0bS50bUhlaWdodDsKKyAgICBpZiAoUHRJblJlY3QoJnJjLCBNQUtFUE9JTlQobFBhcmFtKSkpCisgICAgeworLyoJU2V0Rm9jdXMoaFduZCk7ICovCisJU2V0Q2FwdHVyZShoV25kKTsKKwlwcmVzc2VkID0gVFJVRTsKKwlJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisJVXBkYXRlV2luZG93KGhXbmQpOworICAgIH0KK30KKworc3RhdGljIExPTkcgQ0JfTEJ1dHRvblVwKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIFJFQ1QgcmM7CisgICAgSERDIGhEQzsKKyAgICBURVhUTUVUUklDIHRtOworICAgIGludCBkZWx0YTsKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworICAgIExPTkcgc3R5bGU7CisKKyAgICBwcmVzc2VkID0gRkFMU0U7CisgICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgICBoREMgPSBHZXREQyhoV25kKTsKKyAgICBHZXRUZXh0TWV0cmljcyhoREMsICZ0bSk7CisgICAgUmVsZWFzZURDKGhXbmQsIGhEQyk7CisgICAgR2V0Q2xpZW50UmVjdChoV25kLCAmcmMpOworICAgIGRlbHRhID0gKHJjLmJvdHRvbSAtIHJjLnRvcCAtIHRtLnRtSGVpZ2h0KSA+PiAxOworICAgIHJjLnRvcCArPSBkZWx0YTsKKyAgICByYy5ib3R0b20gPSB0bS50bUhlaWdodCArIGRlbHRhOworICAgIHJjLnJpZ2h0ID0gdG0udG1IZWlnaHQ7CisKKyAgICBpZiAoUHRJblJlY3QoJnJjLCBNQUtFUE9JTlQobFBhcmFtKSkpCisgICAgeworCXN0eWxlID0gd25kUHRyLT5kd1N0eWxlICYgMHgwMDAwMDAwRjsKKwlpZiAoc3R5bGUgPT0gQlNfQVVUT0NIRUNLQk9YKQorCXsKKwkgICAgc3dpdGNoICgoV09SRCkoKih3bmRQdHItPndFeHRyYSkpKQorCSAgICB7CisJICAgIGNhc2UgMDoKKwkJKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSA9IDE7CisJCWJyZWFrOworCisJICAgIGNhc2UgMToKKwkJKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSA9IDA7CisJCWJyZWFrOworCSAgICB9CisJfQorCWVsc2UgaWYgKHN0eWxlID09IEJTX0FVVE8zU1RBVEUpCisJeworCSAgICBzd2l0Y2ggKChXT1JEKSgqKHduZFB0ci0+d0V4dHJhKSkpCisJICAgIHsKKwkgICAgY2FzZSAwOgorCQkoV09SRCkoKih3bmRQdHItPndFeHRyYSkpID0gMTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAxOgorCQkoV09SRCkoKih3bmRQdHItPndFeHRyYSkpID0gMjsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAyOgorCQkoV09SRCkoKih3bmRQdHItPndFeHRyYSkpID0gMDsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisJTk9USUZZX1BBUkVOVChoV25kLCBCTl9DTElDS0VEKTsKKyAgICB9CisgICAgR2xvYmFsVW5sb2NrKGhXbmQpOworICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKKyAgICBVcGRhdGVXaW5kb3coaFduZCk7Cit9CisKK3N0YXRpYyBMT05HIENCX0xCdXR0b25EYmxDbGsoSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgUkVDVCByYzsKKyAgICBIREMgaERDOworICAgIFRFWFRNRVRSSUMgdG07CisgICAgaW50IGRlbHRhOworCisgICAgaERDID0gR2V0REMoaFduZCk7CisgICAgR2V0VGV4dE1ldHJpY3MoaERDLCAmdG0pOworICAgIFJlbGVhc2VEQyhoV25kLCBoREMpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBkZWx0YSA9IChyYy5ib3R0b20gLSByYy50b3AgLSB0bS50bUhlaWdodCkgPj4gMTsKKyAgICByYy50b3AgKz0gZGVsdGE7CisgICAgcmMuYm90dG9tID0gdG0udG1IZWlnaHQgKyBkZWx0YTsKKyAgICByYy5yaWdodCA9IHRtLnRtSGVpZ2h0OworICAgIGlmIChQdEluUmVjdCgmcmMsIE1BS0VQT0lOVChsUGFyYW0pKSkKKwlOT1RJRllfUEFSRU5UKGhXbmQsIEJOX0RPVUJMRUNMSUNLRUQpOworfQorCitzdGF0aWMgTE9ORyBDQl9LaWxsRm9jdXMoSFdORCBoV25kKQoreworICAgIHByZXNzZWQgPSBGQUxTRTsKKyAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGhXbmQpOworfQorCitzdGF0aWMgTE9ORyBDQl9TZXRDaGVjayhIV05EIGhXbmQsIFdPUkQgd1BhcmFtKQoreworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKyAgICBpZiAoKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSAhPSB3UGFyYW0pCisgICAgeworCShXT1JEKSgqKHduZFB0ci0+d0V4dHJhKSkgPSB3UGFyYW07CisJSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworCVVwZGF0ZVdpbmRvdyhoV25kKTsKKyAgICB9CisgICAgR2xvYmFsVW5sb2NrKGhXbmQpOworfQorCitzdGF0aWMgTE9ORyBDQl9HZXRDaGVjayhIV05EIGhXbmQpCit7CisgICAgV09SRCB3UmVzdWx0OworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKyAgICB3UmVzdWx0ID0gKFdPUkQpKCood25kUHRyLT53RXh0cmEpKTsKKyAgICBHbG9iYWxVbmxvY2soaFduZCk7CisgICAgcmV0dXJuIChMT05HKXdSZXN1bHQ7Cit9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFJhZGlvIEJ1dHRvbiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgTE9ORyBSQl9QYWludChIV05EIGhXbmQpCit7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgUkVDVCByYzsKKyAgICBIREMgaERDOworICAgIEhQRU4gaFBlbiwgaE9sZFBlbjsKKyAgICBIQlJVU0ggaEJydXNoLCBoT2xkQnJ1c2g7CisgICAgaW50IHRleHRsZW4sIGRlbHRhOworICAgIGNoYXIgKnRleHQ7CisgICAgSEFORExFIGhUZXh0OworICAgIFRFWFRNRVRSSUMgdG07CisgICAgU0laRSBzaXplOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKyAgICBoREMgPSBCZWdpblBhaW50KGhXbmQsICZwcyk7CisgICAgR2V0Q2xpZW50UmVjdChoV25kLCAmcmMpOworCisgICAgaFBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgY29sb3Jfd2luZG93dGV4dCk7CisgICAgaE9sZFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoREMsIChIQU5ETEUpaFBlbik7CisKKyAgICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZCksIFdNX0NUTENPTE9SLCAoV09SRCloREMsCisJCQkgTUFLRUxQQVJBTShoV25kLCBDVExDT0xPUl9CVE4pKTsKKyAgICBGaWxsUmVjdChoREMsICZyYywgaEJydXNoKTsKKworICAgIHRleHRsZW4gPSBHZXRXaW5kb3dUZXh0TGVuZ3RoKGhXbmQpOworICAgIGhUZXh0ID0gTG9jYWxBbGxvYyhMTUVNX01PVkVBQkxFLCB0ZXh0bGVuKzEpOworICAgIHRleHQgPSBMb2NhbExvY2soaFRleHQpOworICAgIEdldFdpbmRvd1RleHQoaFduZCwgdGV4dCwgdGV4dGxlbisxKTsKKyAgICBHZXRUZXh0TWV0cmljcyhoREMsICZ0bSk7CisKKyAgICBkZWx0YSA9IChyYy5ib3R0b20gLSByYy50b3AgLSB0bS50bUhlaWdodCkgPj4gMTsKKyAgICBFbGxpcHNlKGhEQywgMCwgcmMudG9wICsgZGVsdGEsIHRtLnRtSGVpZ2h0LCB0bS50bUhlaWdodCArIGRlbHRhKTsKKyAgICBpZiAocHJlc3NlZCkKKwlFbGxpcHNlKGhEQywgMSwgcmMudG9wICsgZGVsdGEgKyAxLCB0bS50bUhlaWdodCAtIDEsIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS50bUhlaWdodCArIGRlbHRhIC0gMSk7CisKKyAgICBpZiAoKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSA9PSAxKQorICAgIHsKKwloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNvbG9yX3dpbmRvd3RleHQpOworCWhPbGRCcnVzaCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloQnJ1c2gpOworCUVsbGlwc2UoaERDLCAzLCByYy50b3AgKyBkZWx0YSArIDMsIHRtLnRtSGVpZ2h0IC0gMywKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLnRtSGVpZ2h0ICsgZGVsdGEgLTMpOyAKKwlTZWxlY3RPYmplY3QoaERDLCAoSEFORExFKWhPbGRCcnVzaCk7CisJRGVsZXRlT2JqZWN0KChIQU5ETEUpaEJydXNoKTsKKyAgICB9CisKKyAgICByYy5sZWZ0ID0gdG0udG1IZWlnaHQgKyB0bS50bUF2ZUNoYXJXaWR0aCAvIDI7CisgICAgRHJhd1RleHQoaERDLCB0ZXh0LCB0ZXh0bGVuLCAmcmMsIERUX1NJTkdMRUxJTkUgfCBEVF9WQ0VOVEVSKTsKKworICAgIC8qIGRvIHdlIGhhdmUgdGhlIGZvY3VzPyAqLworICAgIGlmIChHZXRGb2N1cygpID09IGhXbmQpCisgICAgeworCUdldFRleHRFeHRlbnRQb2ludChoREMsIHRleHQsIHRleHRsZW4sICZzaXplKTsKKwlyYy50b3AgKz0gZGVsdGEgLSAxOworCXJjLmJvdHRvbSAtPSBkZWx0YSArIDE7CisJcmMubGVmdC0tOworCXJjLnJpZ2h0ID0gcmMubGVmdCArIHNpemUuY3ggKyAyOworCURyYXdGb2N1c1JlY3QoaERDLCAmcmMpOworICAgIH0KKworICAgIExvY2FsVW5sb2NrKGhUZXh0KTsKKyAgICBMb2NhbEZyZWUoaFRleHQpOworICAgIEdsb2JhbFVubG9jayhoV25kKTsKKyAgICBFbmRQYWludChoV25kLCAmcHMpOworfQorCitzdGF0aWMgTE9ORyBSQl9MQnV0dG9uRG93bihIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgICBSRUNUIHJjOworICAgIEhEQyBoREM7CisgICAgVEVYVE1FVFJJQyB0bTsKKyAgICBpbnQgZGVsdGE7CisKKyAgICBoREMgPSBHZXREQyhoV25kKTsKKyAgICBHZXRUZXh0TWV0cmljcyhoREMsICZ0bSk7CisgICAgUmVsZWFzZURDKGhXbmQsIGhEQyk7CisgICAgR2V0Q2xpZW50UmVjdChoV25kLCAmcmMpOworICAgIGRlbHRhID0gKHJjLmJvdHRvbSAtIHJjLnRvcCAtIHRtLnRtSGVpZ2h0KSA+PiAxOworICAgIHJjLnRvcCArPSBkZWx0YTsKKyAgICByYy5ib3R0b20gPSB0bS50bUhlaWdodCArIGRlbHRhOworICAgIHJjLnJpZ2h0ID0gdG0udG1IZWlnaHQ7CisgICAgaWYgKFB0SW5SZWN0KCZyYywgTUFLRVBPSU5UKGxQYXJhbSkpKQorICAgIHsKKy8qCVNldEZvY3VzKGhXbmQpOyAqLworCVNldENhcHR1cmUoaFduZCk7CisJcHJlc3NlZCA9IFRSVUU7CisJSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworCVVwZGF0ZVdpbmRvdyhoV25kKTsKKyAgICB9Cit9CisKK3N0YXRpYyBMT05HIFJCX0xCdXR0b25VcChIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgICBSRUNUIHJjOworICAgIEhEQyBoREM7CisgICAgVEVYVE1FVFJJQyB0bTsKKyAgICBpbnQgZGVsdGE7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBMT05HIHN0eWxlOworCisgICAgcHJlc3NlZCA9IEZBTFNFOworICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgaERDID0gR2V0REMoaFduZCk7CisgICAgR2V0VGV4dE1ldHJpY3MoaERDLCAmdG0pOworICAgIFJlbGVhc2VEQyhoV25kLCBoREMpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBkZWx0YSA9IChyYy5ib3R0b20gLSByYy50b3AgLSB0bS50bUhlaWdodCkgPj4gMTsKKyAgICByYy50b3AgKz0gZGVsdGE7CisgICAgcmMuYm90dG9tID0gdG0udG1IZWlnaHQgKyBkZWx0YTsKKyAgICByYy5yaWdodCA9IHRtLnRtSGVpZ2h0OworCisgICAgaWYgKFB0SW5SZWN0KCZyYywgTUFLRVBPSU5UKGxQYXJhbSkpKQorICAgIHsKKwlzdHlsZSA9IHduZFB0ci0+ZHdTdHlsZSAmIDB4MDAwMDAwMEY7CisJaWYgKHN0eWxlID09IEJTX0FVVE9SQURJT0JVVFRPTikKKwkgICAgKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSA9IDE7CisJTk9USUZZX1BBUkVOVChoV25kLCBCTl9DTElDS0VEKTsKKyAgICB9CisgICAgR2xvYmFsVW5sb2NrKGhXbmQpOworICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKKyAgICBVcGRhdGVXaW5kb3coaFduZCk7Cit9CisKK3N0YXRpYyBMT05HIFJCX0xCdXR0b25EYmxDbGsoSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgUkVDVCByYzsKKyAgICBIREMgaERDOworICAgIFRFWFRNRVRSSUMgdG07CisgICAgaW50IGRlbHRhOworCisgICAgaERDID0gR2V0REMoaFduZCk7CisgICAgR2V0VGV4dE1ldHJpY3MoaERDLCAmdG0pOworICAgIFJlbGVhc2VEQyhoV25kLCBoREMpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBkZWx0YSA9IChyYy5ib3R0b20gLSByYy50b3AgLSB0bS50bUhlaWdodCkgPj4gMTsKKyAgICByYy50b3AgKz0gZGVsdGE7CisgICAgcmMuYm90dG9tID0gdG0udG1IZWlnaHQgKyBkZWx0YTsKKyAgICByYy5yaWdodCA9IHRtLnRtSGVpZ2h0OworICAgIGlmIChQdEluUmVjdCgmcmMsIE1BS0VQT0lOVChsUGFyYW0pKSkKKwlOT1RJRllfUEFSRU5UKGhXbmQsIEJOX0RPVUJMRUNMSUNLRUQpOworfQorCitzdGF0aWMgTE9ORyBSQl9LaWxsRm9jdXMoSFdORCBoV25kKQoreworICAgIHByZXNzZWQgPSBGQUxTRTsKKyAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGhXbmQpOworfQorCitzdGF0aWMgTE9ORyBSQl9TZXRDaGVjayhIV05EIGhXbmQsIFdPUkQgd1BhcmFtKQoreworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKyAgICBpZiAoKFdPUkQpKCood25kUHRyLT53RXh0cmEpKSAhPSB3UGFyYW0pCisgICAgeworCShXT1JEKSgqKHduZFB0ci0+d0V4dHJhKSkgPSB3UGFyYW07CisJSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworCVVwZGF0ZVdpbmRvdyhoV25kKTsKKyAgICB9CisgICAgR2xvYmFsVW5sb2NrKGhXbmQpOworfQorCitzdGF0aWMgTE9ORyBSQl9HZXRDaGVjayhIV05EIGhXbmQpCit7CisgICAgV09SRCB3UmVzdWx0OworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisKKyAgICB3UmVzdWx0ID0gKFdPUkQpKCood25kUHRyLT53RXh0cmEpKTsKKyAgICBHbG9iYWxVbmxvY2soaFduZCk7CisgICAgcmV0dXJuIChMT05HKXdSZXN1bHQ7Cit9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIEdyb3VwIEJveCBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgTE9ORyBHQl9QYWludChIV05EIGhXbmQpCit7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgUkVDVCByYzsKKyAgICBIREMgaERDOworICAgIEhQRU4gaFBlbiwgaE9sZFBlbjsKKyAgICBIQlJVU0ggaEJydXNoOworICAgIGludCB0ZXh0bGVuOworICAgIGNoYXIgKnRleHQ7CisgICAgSEFORExFIGhUZXh0OworICAgIFNJWkUgc2l6ZTsKKworICAgIGhEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisKKyAgICBoUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCBjb2xvcl93aW5kb3d0ZXh0KTsKKyAgICBoT2xkUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhEQywgKEhBTkRMRSloUGVuKTsKKworICAgIGhCcnVzaCA9IFNlbmRNZXNzYWdlKEdldFBhcmVudChoV25kKSwgV01fQ1RMQ09MT1IsIChXT1JEKWhEQywKKwkJCSBNQUtFTFBBUkFNKGhXbmQsIENUTENPTE9SX0JUTikpOworICAgIEZpbGxSZWN0KGhEQywgJnJjLCBoQnJ1c2gpOworCisgICAgdGV4dGxlbiA9IEdldFdpbmRvd1RleHRMZW5ndGgoaFduZCk7CisgICAgaFRleHQgPSBMb2NhbEFsbG9jKExNRU1fTU9WRUFCTEUsIHRleHRsZW4rMSk7CisgICAgdGV4dCA9IExvY2FsTG9jayhoVGV4dCk7CisgICAgR2V0V2luZG93VGV4dChoV25kLCB0ZXh0LCB0ZXh0bGVuKzEpOworICAgIEdldFRleHRFeHRlbnRQb2ludChoREMsIHRleHQsIHRleHRsZW4sICZzaXplKTsKKworICAgIHJjLnRvcCA9IDU7CisgICAgUmVjdGFuZ2xlKGhEQywgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCwgcmMuYm90dG9tKTsKKyAgICByYy5sZWZ0ID0gMTA7CisgICAgcmMudG9wID0gMDsKKyAgICByYy5yaWdodCA9IHJjLmxlZnQgKyBzaXplLmN4ICsgMTsKKyAgICByYy5ib3R0b20gPSBzaXplLmN5OworICAgIERyYXdUZXh0KGhEQywgdGV4dCwgdGV4dGxlbiwgJnJjLCBEVF9TSU5HTEVMSU5FKTsKKworICAgIExvY2FsVW5sb2NrKGhUZXh0KTsKKyAgICBMb2NhbEZyZWUoaFRleHQpOworICAgIEVuZFBhaW50KGhXbmQsICZwcyk7Cit9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFVzZXIgQnV0dG9uIEZ1bmN0aW9ucworICovCisKK3N0YXRpYyBMT05HIFVCX1BhaW50KEhXTkQgaFduZCkKK3sKKyAgICBQQUlOVFNUUlVDVCBwczsKKyAgICBIREMgaERDOworICAgIFJFQ1QgcmM7CisgICAgSEJSVVNIIGhCcnVzaDsKKworICAgIGhEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisKKyAgICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZCksIFdNX0NUTENPTE9SLCAoV09SRCloREMsCisJCQkgTUFLRUxQQVJBTShoV25kLCBDVExDT0xPUl9CVE4pKTsKKyAgICBGaWxsUmVjdChoREMsICZyYywgaEJydXNoKTsKKworICAgIE5PVElGWV9QQVJFTlQoaFduZCwgQk5fUEFJTlQpOworCisgICAgLyogZG8gd2UgaGF2ZSB0aGUgZm9jdXM/ICovCisgICAgaWYgKEdldEZvY3VzKCkgPT0gaFduZCkKKwlEcmF3Rm9jdXNSZWN0KGhEQywgJnJjKTsKKworICAgIEVuZFBhaW50KGhXbmQsICZwcyk7Cit9CisKK3N0YXRpYyBMT05HIFVCX0xCdXR0b25Eb3duKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIFJFQ1QgcmM7CisKKy8qICAgIFNldEZvY3VzKGhXbmQpOyAqLworICAgIFNldENhcHR1cmUoaFduZCk7CisgICAgR2V0Q2xpZW50UmVjdChoV25kLCAmcmMpOworICAgIGlmIChQdEluUmVjdCgmcmMsIE1BS0VQT0lOVChsUGFyYW0pKSkKKwlOT1RJRllfUEFSRU5UKGhXbmQsIEJOX0hJTElURSk7CisgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworICAgIFVwZGF0ZVdpbmRvdyhoV25kKTsKK30KKworc3RhdGljIExPTkcgVUJfTEJ1dHRvblVwKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIFJFQ1QgcmM7CisKKyAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBpZiAoUHRJblJlY3QoJnJjLCBNQUtFUE9JTlQobFBhcmFtKSkpCisJTk9USUZZX1BBUkVOVChoV25kLCBCTl9VTkhJTElURSk7CisgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgRkFMU0UpOworICAgIFVwZGF0ZVdpbmRvdyhoV25kKTsKK30KKworc3RhdGljIExPTkcgVUJfS2lsbEZvY3VzKEhXTkQgaFduZCkKK3sKKyAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisgICAgVXBkYXRlV2luZG93KGhXbmQpOworfQogCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21iby5jIGIvY29udHJvbHMvY29tYm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTkwOTYyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIEludGVyZmFjZSBjb2RlIHRvIENPTUJPQk9YIHdpZGdldAorICoKKyAqIENvcHlyaWdodCAgTWFydGluIEF5b3R0ZSwgMTk5MworICoKKyAqLworCisvKgorI2RlZmluZSBERUJVR19DT01CTworKi8KKworc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IE1hcnRpbiBBeW90dGUsIDE5OTMiOworCisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2luY2x1ZGUgPFgxMS9TdHJpbmdEZWZzLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImNvbWJvLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImRpcmVudC5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK0xQSEVBRENPTUJPIENvbWJvR2V0U3RvcmFnZUhlYWRlcihIV05EIGh3bmQpOworaW50IENyZWF0ZUNvbWJvU3RydWN0KEhXTkQgaHduZCk7CisKKwordm9pZCBDT01CT0JPWF9DcmVhdGVDb21ib0JveChMUFNUUiBjbGFzc05hbWUsIExQU1RSIGNvbWJvTGFiZWwsIEhXTkQgaHduZCkKK3sKKyAgICBXTkQgKnduZFB0ciAgICA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIFdORCAqcGFyZW50UHRyID0gV0lOX0ZpbmRXbmRQdHIod25kUHRyLT5od25kUGFyZW50KTsKKyAgICBEV09SRCBzdHlsZTsKKyAgICBjaGFyIHdpZGdldE5hbWVbMTVdOworCisjaWZkZWYgREVCVUdfQ09NQk8KKyAgICBwcmludGYoImNvbWJvOiBsYWJlbCA9ICVzLCB4ID0gJWQsIHkgPSAlZFxuIiwgY29tYm9MYWJlbCwKKwkgICB3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCk7CisgICAgcHJpbnRmKCIgICAgICAgIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLAorCSAgIHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAtIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCSAgIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLSB3bmRQdHItPnJlY3RDbGllbnQudG9wKTsKKyNlbmRpZgorCisgICAgaWYgKCF3bmRQdHIpCisJcmV0dXJuOworCisgICAgc3R5bGUgPSB3bmRQdHItPmR3U3R5bGUgJiAweDAwMDBGRkZGOworLyoKKyAgICBpZiAoKHN0eWxlICYgTEJTX05PVElGWSkgPT0gTEJTX05PVElGWSkKKyovICAgIAorICAgIHNwcmludGYod2lkZ2V0TmFtZSwgIiVzJWQiLCBjbGFzc05hbWUsIHduZFB0ci0+d0lEbWVudSk7CisgICAgd25kUHRyLT53aW5XaWRnZXQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCh3aWRnZXROYW1lLAorCQkJCSAgICBjb21wb3NpdGVXaWRnZXRDbGFzcywKKwkJCQkgICAgcGFyZW50UHRyLT53aW5XaWRnZXQsCisJCQkJICAgIFh0TngsIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCQkJCSAgICBYdE55LCB3bmRQdHItPnJlY3RDbGllbnQudG9wLAorCQkJCSAgICBYdE53aWR0aCwgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0KKwkJCQkgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCQkJCSAgICBYdE5oZWlnaHQsIDE2LAorCQkJCSAgICBOVUxMICk7CisgICAgR2xvYmFsVW5sb2NrKGh3bmQpOworICAgIEdsb2JhbFVubG9jayh3bmRQdHItPmh3bmRQYXJlbnQpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJREdFVFNfQ29tYm9XbmRQcm9jCisgKi8KK0xPTkcgQ09NQk9CT1hfQ29tYm9Cb3hXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwKKwkJCSAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCit7ICAgIAorICAgIFdPUkQJd1JldDsKKyAgICBSRUNUCXJlY3Q7CisgICAgaW50CQl5OworICAgIGludAkJd2lkdGgsIGhlaWdodDsKKyAgICBXTkQgIAkqd25kUHRyOworICAgIExQSEVBRENPTUJPIGxwaGM7CisgICAgY2hhcglzdHJbMTI4XTsKKyAgICBzdGF0aWMgUkVDVCByZWN0c2VsOworICAgIHN3aXRjaChtZXNzYWdlKQorICAgIHsKKyAgICBjYXNlIFdNX0NSRUFURToKKwlDcmVhdGVDb21ib1N0cnVjdChod25kKTsKKwl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKwl3aWR0aCA9IHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAtIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0OworCWhlaWdodCA9IHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLSB3bmRQdHItPnJlY3RDbGllbnQudG9wOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7CisJbHBoYy0+aFduZERyb3AgPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsICIiLCAKKyAgICAgICAgCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCisgICAgICAgIAl3aWR0aCAtIDE2LCAwLCAxNiwgMTYsIGh3bmQsIDEsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJbHBoYy0+aFduZEVkaXQgPSBDcmVhdGVXaW5kb3coIlNUQVRJQyIsICIiLCAKKyAgICAgICAgCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IFNTX0xFRlQsCisgICAgICAgIAkwLCAwLCB3aWR0aCAtIDE2LCAxNiwgaHduZCwgMSwgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKKwlscGhjLT5oV25kTEJveCA9IENyZWF0ZVdpbmRvdygiTElTVEJPWCIsICIiLCAKKyAgICAgICAgCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19OT1RJRlksCisgICAgICAgIAl3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCArIDE2LCB3aWR0aCwgaGVpZ2h0LCAKKyAgICAgICAgCXduZFB0ci0+aHduZFBhcmVudCwgMSwgd25kUHRyLT5oSW5zdGFuY2UsIChMUFNUUilNQUtFTE9ORygwLCBod25kKSk7CisvKgorICAgICAgICBTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19ISURFKTsKKyovCisgICAgICAgIEludmFsaWRhdGVSZWN0KGxwaGMtPmhXbmRFZGl0LCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGxwaGMtPmhXbmRFZGl0KTsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QobHBoYy0+aFduZERyb3AsIE5VTEwsIFRSVUUpOworICAgICAgICBVcGRhdGVXaW5kb3cobHBoYy0+aFduZERyb3ApOworI2lmZGVmIERFQlVHX0NPTUJPCisgICAgICAgIHByaW50ZigiQ29tYm8gQ3JlYXRpb24gRHJvcD0lWCBMQm94PSVYIVxuIiwgbHBoYy0+aFduZERyb3AsIGxwaGMtPmhXbmRMQm94KTsKKyNlbmRpZgorCXJldHVybiAwOworICAgIGNhc2UgV01fREVTVFJPWToKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCURlc3Ryb3lXaW5kb3cobHBoYy0+aFduZERyb3ApOworCURlc3Ryb3lXaW5kb3cobHBoYy0+aFduZEVkaXQpOworCURlc3Ryb3lXaW5kb3cobHBoYy0+aFduZExCb3gpOworCWZyZWUobHBoYyk7CisjaWZkZWYgREVCVUdfQ09NQk8KKyAgICAgICAgcHJpbnRmKCJDb21ibyBXTV9ERVNUUk9ZICFcbiIpOworI2VuZGlmCisJcmV0dXJuIDA7CisJCisgICAgY2FzZSBXTV9DT01NQU5EOgorCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgICAgIGlmIChMT1dPUkQobFBhcmFtKSA9PSBscGhjLT5oV25kRHJvcCkgeworCSAgICBpZiAoSElXT1JEKGxQYXJhbSkgIT0gQk5fQ0xJQ0tFRCkgcmV0dXJuIDA7CisjaWZkZWYgREVCVUdfQ09NQk8KKwkgICAgcHJpbnRmKCJDQl9TSE9XRFJPUERPV04gIVxuIik7CisjZW5kaWYKKwkgICAgbHBoYy0+ZHdTdGF0ZSA9IGxwaGMtPmR3U3RhdGUgXiBDQl9TSE9XRFJPUERPV047CisJICAgIGlmICgobHBoYy0+ZHdTdGF0ZSAmIENCX1NIT1dEUk9QRE9XTikgPT0gQ0JfU0hPV0RST1BET1dOKSB7CisJCVNob3dXaW5kb3cobHBoYy0+aFduZExCb3gsIFNXX1NIT1cpOworCQl9CisJICAgIGVsc2UgeworCQlTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19ISURFKTsKKwkJeSA9IFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRDVVJTRUwsIDAsIDBMKTsKKwkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQsIChXT1JEKXksIChMUEFSQU0pc3RyKTsKKwkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIFdNX1NFVFRFWFQsIChXT1JEKXksIChMUEFSQU0pc3RyKTsKKwkJcHJpbnRmKCJjb21ibyBoaWRlXG4iKTsKKwkJfQorICAgICAgICAgICAgfQorICAgICAgICBpZiAoTE9XT1JEKGxQYXJhbSkgPT0gbHBoYy0+aFduZExCb3gpIHsKKyAgICAgICAgICAgIHN3aXRjaChISVdPUkQobFBhcmFtKSkKKyAgICAgICAgCXsKKyAgICAgICAgCWNhc2UgTEJOX1NFTENIQU5HRToKKwkJICAgIGxwaGMtPmR3U3RhdGUgPSBscGhjLT5kd1N0YXRlIF4gQ0JfU0hPV0RST1BET1dOOworCQkgICAgU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7CisJCSAgICB5ID0gU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOworCQkgICAgU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQsIChXT1JEKXksIChMUEFSQU0pc3RyKTsKKwkJICAgIFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRFZGl0LCBXTV9TRVRURVhULCAoV09SRCl5LCAoTFBBUkFNKXN0cik7CisJCSAgICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NPTU1BTkQsIHduZFB0ci0+d0lEbWVudSwKKwkJCSAgICAgICAgCU1BS0VMT05HKGh3bmQsIENCTl9TRUxDSEFOR0UpKTsKKyAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgCWNhc2UgTEJOX0RCTENMSzoKKwkJICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fQ09NTUFORCwgd25kUHRyLT53SURtZW51LAorCQkJICAgICAgICAJTUFLRUxPTkcoaHduZCwgQ0JOX0RCTENMSykpOworICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAJfQorICAgICAgICAgICAgfQorCWJyZWFrOworICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisgICAgICAgIHByaW50ZigiQ29tYm8gV01fTEJVVFRPTkRPV04gd1BhcmFtPSV4IGxQYXJhbT0lbFggIVxuIiwgd1BhcmFtLCBsUGFyYW0pOworCWJyZWFrOworICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgcHJpbnRmKCJDb21ibyBXTV9LRVlET1dOIHdQYXJhbSAlWCFcbiIsIHdQYXJhbSk7CisJYnJlYWs7CisgICAgY2FzZSBXTV9DVExDT0xPUjoKKyAgICAJcmV0dXJuKFNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fQ1RMQ09MT1IsIHdQYXJhbSwgbFBhcmFtKSk7CisgICAgY2FzZSBXTV9QQUlOVDoKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgICAgICBJbnZhbGlkYXRlUmVjdChscGhjLT5oV25kRWRpdCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhscGhjLT5oV25kRWRpdCk7CisgICAgICAgIEludmFsaWRhdGVSZWN0KGxwaGMtPmhXbmREcm9wLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGxwaGMtPmhXbmREcm9wKTsKKyAgICAgICAgaWYgKChscGhjLT5kd1N0YXRlICYgQ0JfU0hPV0RST1BET1dOKSA9PSBDQl9TSE9XRFJPUERPV04pIHsKKwkgICAgSW52YWxpZGF0ZVJlY3QobHBoYy0+aFduZExCb3gsIE5VTEwsIFRSVUUpOworCSAgICBVcGRhdGVXaW5kb3cobHBoYy0+aFduZExCb3gpOworCSAgICB9CisJYnJlYWs7CisgICAgY2FzZSBXTV9NT1VTRU1PVkU6CisgICAgICAgIGlmICgod1BhcmFtICYgTUtfTEJVVFRPTikgIT0gMCkgeworICAgICAgICAgICAgeSA9IEhJV09SRChsUGFyYW0pOworCSAgICBpZiAoeSA8IDQpIHsKKwkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKwkJfQorCSAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKwkgICAgaWYgKHkgPiAocmVjdC5ib3R0b20gLSA0KSkgeworCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCQl9CisJICAgIH0KKyAgICBjYXNlIENCX0FERFNUUklORzoKKyNpZmRlZiBERUJVR19DT01CTworICAgICAgICBwcmludGYoIkNCX0FERFNUUklORyAnJXMnICFcbiIsIChMUFNUUilsUGFyYW0pOworI2VuZGlmCisJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9BRERTVFJJTkcsIHdQYXJhbSwgbFBhcmFtKSk7CisgICAgY2FzZSBDQl9HRVRMQlRFWFQ6CisgICAgICAgIHByaW50ZigiQ0JfR0VUTEJURVhUICMldSAhXG4iLCB3UGFyYW0pOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVCwgd1BhcmFtLCBsUGFyYW0pKTsKKyAgICBjYXNlIENCX0lOU0VSVFNUUklORzoKKyAgICAgICAgcHJpbnRmKCJDQl9JTlNFUlRTVFJJTkcgJyVzJyAhXG4iLCAoTFBTVFIpbFBhcmFtKTsKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0lOU0VSVFNUUklORywgd1BhcmFtLCBsUGFyYW0pKTsKKyAgICBjYXNlIENCX0RFTEVURVNUUklORzoKKyAgICAgICAgcHJpbnRmKCJDQl9ERUxFVEVTVFJJTkcgIyV1ICFcbiIsIHdQYXJhbSk7CisJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9ERUxFVEVTVFJJTkcsIHdQYXJhbSwgMEwpKTsKKyAgICBjYXNlIENCX1JFU0VUQ09OVEVOVDoKKyAgICAgICAgcHJpbnRmKCJDQl9SRVNFVENPTlRFTlQgIVxuIik7CisJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9SRVNFVENPTlRFTlQsIDAsIDBMKSk7CisgICAgY2FzZSBDQl9ESVI6CisgICAgICAgIHByaW50ZigiQ29tYm9Cb3ggQ0JfRElSICFcbiIpOworICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0RJUiwgd1BhcmFtLCBsUGFyYW0pKTsKKyAgICBjYXNlIENCX0ZJTkRTVFJJTkc6CisgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfRklORFNUUklORywgd1BhcmFtLCBsUGFyYW0pKTsKKyAgICBjYXNlIENCX0dFVENPVU5UOgorICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENPVU5ULCAwLCAwTCkpOworICAgIGNhc2UgQ0JfR0VUQ1VSU0VMOgorICAgICAgICBwcmludGYoIkNvbWJvQm94IENCX0dFVENVUlNFTCAhXG4iKTsKKyAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRDT1VOVCwgMCwgMEwpKTsKKyAgICBjYXNlIENCX1NFVENVUlNFTDoKKyAgICAgICAgcHJpbnRmKCJDb21ib0JveCBDQl9TRVRDVVJTRUwgd1BhcmFtPSV4ICFcbiIsIHdQYXJhbSk7CisgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ09VTlQsIHdQYXJhbSwgMEwpKTsKKwkKKyAgICBkZWZhdWx0OgorCXJldHVybiBEZWZXaW5kb3dQcm9jKCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOworICAgIH0KK3JldHVybiAwOworfQorCisKKworTFBIRUFEQ09NQk8gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgICBXTkQgICp3bmRQdHI7CisgICAgTFBIRUFEQ09NQk8gbHBoYzsKKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBscGhjID0gKigoTFBIRUFEQ09NQk8gKikmd25kUHRyLT53RXh0cmFbMV0pOworICAgIHJldHVybiBscGhjOworfQorCisKKworaW50IENyZWF0ZUNvbWJvU3RydWN0KEhXTkQgaHduZCkKK3sKKyAgICBXTkQgICp3bmRQdHI7CisgICAgTFBIRUFEQ09NQk8gbHBoYzsKKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBscGhjID0gKExQSEVBRENPTUJPKW1hbGxvYyhzaXplb2YoSEVBRENPTUJPKSk7CisgICAgKigoTFBIRUFEQ09NQk8gKikmd25kUHRyLT53RXh0cmFbMV0pID0gbHBoYzsKKyAgICBscGhjLT5kd1N0YXRlID0gMDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJhZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0wLDAgKzEsOTYzIEBACisvKgorICogSW50ZXJmYWNlIGNvZGUgdG8gbGlzdGJveCB3aWRnZXRzCisgKgorICogQ29weXJpZ2h0ICBNYXJ0aW4gQXlvdHRlLCAxOTkzCisgKgorICovCisKKy8qCisjZGVmaW5lIERFQlVHX0xJU1RCT1gKKyovCisKK3N0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCBNYXJ0aW4gQXlvdHRlLCAxOTkzIjsKKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYMTEvU3RyaW5nRGVmcy5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImxpc3Rib3guaCIKKyNpbmNsdWRlICJzY3JvbGwuaCIKKyNpbmNsdWRlICJkaXJlbnQuaCIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjZGVmaW5lIEdNRU1fWkVST0lOSVQgMHgwMDQwCisKKworTFBIRUFETElTVCBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShIV05EIGh3bmQsIFdORCAqKnduZFB0cik7CitMUEhFQURMSVNUIExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCk7Cit2b2lkIFN0ZERyYXdMaXN0Qm94KEhXTkQgaHduZCk7Cit2b2lkIE93bmVyRHJhd0xpc3RCb3goSFdORCBod25kKTsKK2ludCBMaXN0Qm94RmluZE1vdXNlKEhXTkQgaHduZCwgaW50IFgsIGludCBZKTsKK2ludCBDcmVhdGVMaXN0Qm94U3RydWN0KEhXTkQgaHduZCk7CitpbnQgTGlzdEJveEFkZFN0cmluZyhIV05EIGh3bmQsIExQU1RSIG5ld3N0cik7CitpbnQgTGlzdEJveEluc2VydFN0cmluZyhIV05EIGh3bmQsIFVJTlQgdUluZGV4LCBMUFNUUiBuZXdzdHIpOworaW50IExpc3RCb3hHZXRUZXh0KEhXTkQgaHduZCwgVUlOVCB1SW5kZXgsIExQU1RSIE91dFN0cik7CitpbnQgTGlzdEJveERlbGV0ZVN0cmluZyhIV05EIGh3bmQsIFVJTlQgdUluZGV4KTsKK2ludCBMaXN0Qm94RmluZFN0cmluZyhIV05EIGh3bmQsIFVJTlQgbkZpcnN0LCBMUFNUUiBNYXRjaFN0cik7CitpbnQgTGlzdEJveFJlc2V0Q29udGVudChIV05EIGh3bmQpOworaW50IExpc3RCb3hTZXRDdXJTZWwoSFdORCBod25kLCBXT1JEIHdJbmRleCk7CitpbnQgTGlzdEJveFNldFNlbChIV05EIGh3bmQsIFdPUkQgd0luZGV4KTsKK2ludCBMaXN0Qm94RGlyZWN0b3J5KEhXTkQgaHduZCwgVUlOVCBhdHRyaWIsIExQU1RSIGZpbGVzcGVjKTsKK2ludCBMaXN0Qm94R2V0SXRlbVJlY3QoSFdORCBod25kLCBXT1JEIHdJbmRleCwgTFBSRUNUIHJlY3QpOworaW50IExpc3RCb3hTZXRJdGVtSGVpZ2h0KEhXTkQgaHduZCwgV09SRCB3SW5kZXgsIGxvbmcgaGVpZ2h0KTsKK2ludCBMaXN0Qm94RGVmYXVsdEl0ZW0oSFdORCBod25kLCBXTkQgKnduZFB0ciwgCisJTFBIRUFETElTVCBscGhsLCBMUExJU1RTVFJVQ1QgbHBscyk7CitpbnQgTGlzdEJveEZpbmROZXh0TWF0Y2goSFdORCBod25kLCBXT1JEIHdDaGFyKTsKKworCisKK3ZvaWQgTElTVEJPWF9DcmVhdGVMaXN0Qm94KExQU1RSIGNsYXNzTmFtZSwgTFBTVFIgbGlzdGJveExhYmVsLCBIV05EIGh3bmQpCit7CisgICAgV05EICp3bmRQdHIgICAgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBXTkQgKnBhcmVudFB0ciA9IFdJTl9GaW5kV25kUHRyKHduZFB0ci0+aHduZFBhcmVudCk7CisgICAgRFdPUkQgc3R5bGU7CisgICAgY2hhciB3aWRnZXROYW1lWzE1XTsKKworI2lmZGVmIERFQlVHX0xJU1RCT1gKKyAgICBwcmludGYoImxpc3Rib3g6IGxhYmVsID0gJXMsIHggPSAlZCwgeSA9ICVkXG4iLCBsaXN0Ym94TGFiZWwsCisJICAgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsIHduZFB0ci0+cmVjdENsaWVudC50b3ApOworICAgIHByaW50ZigiICAgICAgICB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwKKwkgICB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdCwKKwkgICB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcCk7CisjZW5kaWYKKworICAgIGlmICghd25kUHRyKQorCXJldHVybjsKKworICAgIHN0eWxlID0gd25kUHRyLT5kd1N0eWxlICYgMHgwMDAwRkZGRjsKKy8qCisgICAgaWYgKChzdHlsZSAmIExCU19OT1RJRlkpID09IExCU19OT1RJRlkpCisgICAgaWYgKChzdHlsZSAmIExCU19TT1JUKSA9PSBMQlNfU09SVCkKKyovICAgIAorICAgIHNwcmludGYod2lkZ2V0TmFtZSwgIiVzJWQiLCBjbGFzc05hbWUsIHduZFB0ci0+d0lEbWVudSk7CisgICAgd25kUHRyLT53aW5XaWRnZXQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldCh3aWRnZXROYW1lLAorCQkJCSAgICBjb21wb3NpdGVXaWRnZXRDbGFzcywKKwkJCQkgICAgcGFyZW50UHRyLT53aW5XaWRnZXQsCisJCQkJICAgIFh0TngsIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCQkJCSAgICBYdE55LCB3bmRQdHItPnJlY3RDbGllbnQudG9wLAorCQkJCSAgICBYdE53aWR0aCwgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0KKwkJCQkgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCQkJCSAgICBYdE5oZWlnaHQsIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLQorCQkJCSAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCwKKwkJCQkgICAgTlVMTCApOworICAgIEdsb2JhbFVubG9jayhod25kKTsKKyAgICBHbG9iYWxVbmxvY2sod25kUHRyLT5od25kUGFyZW50KTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJREdFVFNfTGlzdEJveFduZFByb2MKKyAqLworTE9ORyBMSVNUQk9YX0xpc3RCb3hXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwKKwkJCSAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCit7ICAgIAorICAgIFdORCAgKnduZFB0cjsKKyAgICBMUEhFQURMSVNUICBscGhsOworICAgIFdPUkQJd1JldDsKKyAgICBSRUNUCXJlY3Q7CisgICAgaW50CQl5OworICAgIGludAkJd2lkdGgsIGhlaWdodDsKKyAgICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdDsKKyAgICBzdGF0aWMgUkVDVCByZWN0c2VsOworICAgIHN3aXRjaChtZXNzYWdlKQorICAgIHsKKyAgICBjYXNlIFdNX0NSRUFURToKKwlDcmVhdGVMaXN0Qm94U3RydWN0KGh3bmQpOworCWxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKKwljcmVhdGVTdHJ1Y3QgPSAoQ1JFQVRFU1RSVUNUICopbFBhcmFtOworICAgICAJaWYgKEhJV09SRChjcmVhdGVTdHJ1Y3QtPmxwQ3JlYXRlUGFyYW1zKSAhPSAwKQorCSAgICBscGhsLT5oV25kTG9naWNQYXJlbnQgPSAoSFdORClISVdPUkQoY3JlYXRlU3RydWN0LT5scENyZWF0ZVBhcmFtcyk7CisJZWxzZQorCSAgICBscGhsLT5oV25kTG9naWNQYXJlbnQgPSBHZXRQYXJlbnQoaHduZCk7CisJd2lkdGggPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKKwloZWlnaHQgPSB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKKwlscGhsLT5oV25kU2Nyb2xsID0gQ3JlYXRlV2luZG93KCJTQ1JPTExCQVIiLCAiIiwKKwkJV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19DTElQU0lCTElOR1MgfCBTQlNfVkVSVCwKKwkJd2lkdGggLSAxNywgMCwgMTYsIGhlaWdodCwgaHduZCwgMSwgd25kUHRyLT5oSW5zdGFuY2UsIE5VTEwpOworICAgIAlTaG93V2luZG93KGxwaGwtPmhXbmRTY3JvbGwsIFNXX0hJREUpOworCVNldFNjcm9sbFJhbmdlKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIDEsIGxwaGwtPkl0ZW1zQ291bnQsIFRSVUUpOworCXJldHVybiAwOworICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCUxpc3RCb3hSZXNldENvbnRlbnQoaHduZCk7CisJRGVzdHJveVdpbmRvdyhscGhsLT5oV25kU2Nyb2xsKTsKKwlmcmVlKGxwaGwpOworICAgICAgICBwcmludGYoIkxpc3RCb3ggV01fREVTVFJPWSAhXG4iKTsKKwlyZXR1cm4gMDsKKworICAgIGNhc2UgV01fVlNDUk9MTDoKKyAgICAgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgICAgICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICAgICAgeSA9IGxwaGwtPkZpcnN0VmlzaWJsZTsKKyAgICAgICAgc3dpdGNoKHdQYXJhbSkgeworICAgICAgICAgICAgY2FzZSBTQl9MSU5FVVA6CisJCWlmIChscGhsLT5GaXJzdFZpc2libGUgPiAxKQorCQkgICAgbHBobC0+Rmlyc3RWaXNpYmxlLS07CisJCWJyZWFrOworICAgICAgICAgICAgY2FzZSBTQl9MSU5FRE9XTjoKKwkJaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IGxwaGwtPkl0ZW1zQ291bnQpCisJCSAgICBscGhsLT5GaXJzdFZpc2libGUrKzsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0JfUEFHRVVQOgorCQlpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMSkgIAorCQkgICAgbHBobC0+Rmlyc3RWaXNpYmxlIC09IGxwaGwtPkl0ZW1zVmlzaWJsZTsKKwkJYnJlYWs7CisJICAgIGNhc2UgU0JfUEFHRURPV046CisJCWlmIChscGhsLT5GaXJzdFZpc2libGUgPCBscGhsLT5JdGVtc0NvdW50KSAgCisJCSAgICBscGhsLT5GaXJzdFZpc2libGUgKz0gbHBobC0+SXRlbXNWaXNpYmxlOworCQlicmVhazsKKwkgICAgY2FzZSBTQl9USFVNQlRSQUNLOgorCSAgICAJbHBobC0+Rmlyc3RWaXNpYmxlID0gTE9XT1JEKGxQYXJhbSk7CisJCWJyZWFrOworCSAgICB9CisJaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IDEpICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IDE7CisJaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IGxwaGwtPkl0ZW1zQ291bnQpCisJICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IGxwaGwtPkl0ZW1zQ291bnQ7CisJaWYgKHkgIT0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CisJICAgIFNldFNjcm9sbFBvcyhscGhsLT5oV25kU2Nyb2xsLCBXTV9WU0NST0xMLCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOworCSAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKwkgICAgVXBkYXRlV2luZG93KGh3bmQpOworICAgICAgICAgICAgfQorCXJldHVybiAwOworCQorICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisgICAgICAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICAgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7CisJbHBobC0+UHJldlNlbGVjdGVkID0gbHBobC0+SXRlbVNlbGVjdGVkOworICAgICAgICB3UmV0ID0gTGlzdEJveEZpbmRNb3VzZShod25kLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOworCUxpc3RCb3hTZXRDdXJTZWwoaHduZCwgd1JldCk7CisJTGlzdEJveEdldEl0ZW1SZWN0KGh3bmQsIHdSZXQsICZyZWN0c2VsKTsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKwlyZXR1cm4gMDsKKyAgICBjYXNlIFdNX0xCVVRUT05VUDoKKwlscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CisgICAgICAgIGlmIChscGhsID09IE5VTEwpIHJldHVybiAwOworCWlmIChscGhsLT5QcmV2U2VsZWN0ZWQgIT0gbHBobC0+SXRlbVNlbGVjdGVkKQorCSAgICBTZW5kTWVzc2FnZShscGhsLT5oV25kTG9naWNQYXJlbnQsIFdNX0NPTU1BTkQsIHduZFB0ci0+d0lEbWVudSwKKwkJICAgICAgICAJTUFLRUxPTkcoaHduZCwgTEJOX1NFTENIQU5HRSkpOworCXJldHVybiAwOworICAgIGNhc2UgV01fUkJVVFRPTlVQOgorICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKKwlscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CisgICAgICAgIGlmIChscGhsID09IE5VTEwpIHJldHVybiAwOworICAgICAgICBTZW5kTWVzc2FnZShscGhsLT5oV25kTG9naWNQYXJlbnQsIFdNX0NPTU1BTkQsIHduZFB0ci0+d0lEbWVudSwKKwkJICAgICAgICAJTUFLRUxPTkcoaHduZCwgTEJOX0RCTENMSykpOworICAgICAgICBwcmludGYoIkxpc3RCb3ggU2VuZCBMQk5fREJMQ0xLICFcbiIpOworCXJldHVybiAwOworICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgcHJpbnRmKCJMaXN0Qm94IFdNX0tFWURPV04gd1BhcmFtICVYIVxuIiwgd1BhcmFtKTsKKwlMaXN0Qm94RmluZE5leHRNYXRjaChod25kLCB3UGFyYW0pOworCWJyZWFrOworICAgIGNhc2UgV01fUEFJTlQ6CisJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisJaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpID09IExCU19PV05FUkRSQVdGSVhFRCkgeworCSAgICBPd25lckRyYXdMaXN0Qm94KGh3bmQpOworCSAgICBicmVhazsKKwkgICAgfQorCWlmICgod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKSA9PSBMQlNfT1dORVJEUkFXVkFSSUFCTEUpIHsKKwkgICAgT3duZXJEcmF3TGlzdEJveChod25kKTsKKwkgICAgYnJlYWs7CisJICAgIH0KKwlTdGREcmF3TGlzdEJveChod25kKTsKKwlicmVhazsKKyAgICBjYXNlIFdNX01PVVNFTU9WRToKKyAgICAgICAgaWYgKCh3UGFyYW0gJiBNS19MQlVUVE9OKSAhPSAwKSB7CisgICAgICAgICAgICB5ID0gSElXT1JEKGxQYXJhbSk7CisJICAgIGlmICh5IDwgNCkgeworCSAgICAgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCQlpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMSkgeworCQkgICAgbHBobC0+Rmlyc3RWaXNpYmxlLS07CisJCSAgICBTZXRTY3JvbGxQb3MobHBobC0+aFduZFNjcm9sbCwgV01fVlNDUk9MTCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKKwkJICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCQkgICAgVXBkYXRlV2luZG93KGh3bmQpOworCQkgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7CisJICAgIGlmICh5ID4gKHJlY3QuYm90dG9tIC0gNCkpIHsKKwkgICAgICAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKwkJaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IGxwaGwtPkl0ZW1zQ291bnQpIHsKKwkJICAgIGxwaGwtPkZpcnN0VmlzaWJsZSsrOworCQkgICAgU2V0U2Nyb2xsUG9zKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CisJCSAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKwkJICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKwkJICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIGlmICgoeSA+IDApICYmICh5IDwgKHJlY3QuYm90dG9tIC0gNCkpKSB7CisJCWlmICgoeSA8IHJlY3RzZWwudG9wKSB8fCAoeSA+IHJlY3RzZWwuYm90dG9tKSkgeworCQkgICAgd1JldCA9IExpc3RCb3hGaW5kTW91c2UoaHduZCwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKTsKKwkJICAgIExpc3RCb3hTZXRDdXJTZWwoaHduZCwgd1JldCk7CisJCSAgICBMaXN0Qm94R2V0SXRlbVJlY3QoaHduZCwgd1JldCwgJnJlY3RzZWwpOworCQkgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisJCSAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJCSAgICB9CisJICAgICAgICAKKwkJfQorCSAgICB9CisJYnJlYWs7CisKKyAgICBjYXNlIExCX1JFU0VUQ09OVEVOVDoKKyAgICAgICAgcHJpbnRmKCJMaXN0Qm94IExCX1JFU0VUQ09OVEVOVCAhXG4iKTsKKwlMaXN0Qm94UmVzZXRDb250ZW50KGh3bmQpOworCXJldHVybiAwOworICAgIGNhc2UgTEJfRElSOgorICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfRElSICFcbiIpOworCXdSZXQgPSBMaXN0Qm94RGlyZWN0b3J5KGh3bmQsIHdQYXJhbSwgKExQU1RSKWxQYXJhbSk7CisgICAgICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9BRERTVFJJTkc6CisJd1JldCA9IExpc3RCb3hBZGRTdHJpbmcoaHduZCwgKExQU1RSKWxQYXJhbSk7CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9HRVRURVhUOgorCXdSZXQgPSBMaXN0Qm94R2V0VGV4dChod25kLCB3UGFyYW0sIChMUFNUUilsUGFyYW0pOworICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfR0VUVEVYVCAjJXUgJyVzJyAhXG4iLCB3UGFyYW0sIChMUFNUUilsUGFyYW0pOworCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfSU5TRVJUU1RSSU5HOgorCXdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGh3bmQsIHdQYXJhbSwgKExQU1RSKWxQYXJhbSk7CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9ERUxFVEVTVFJJTkc6CisgICAgICAgIHByaW50ZigiTGlzdEJveCBMQl9ERUxFVEVTVFJJTkcgIyV1ICFcbiIsIHdQYXJhbSk7CisJd1JldCA9IExpc3RCb3hEZWxldGVTdHJpbmcoaHduZCwgd1BhcmFtKTsKKwlyZXR1cm4gd1JldDsKKyAgICBjYXNlIExCX0ZJTkRTVFJJTkc6CisJd1JldCA9IExpc3RCb3hGaW5kU3RyaW5nKGh3bmQsIHdQYXJhbSwgKExQU1RSKWxQYXJhbSk7CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9HRVRDQVJFVElOREVYOgorCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfR0VUQ09VTlQ6CisgICAgICAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKwlyZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKKyAgICBjYXNlIExCX0dFVENVUlNFTDoKKwlscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgICAgIHByaW50ZigiTGlzdEJveCBMQl9HRVRDVVJTRUwgJXUgIVxuIiwgbHBobC0+SXRlbVNlbGVjdGVkKTsKKwlpZiAobHBobC0+SXRlbVNlbGVjdGVkID09IDApIHJldHVybiBMQl9FUlI7CisJcmV0dXJuIGxwaGwtPkl0ZW1TZWxlY3RlZDsKKyAgICBjYXNlIExCX0dFVEhPUklaT05UQUxFWFRFTlQ6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9HRVRJVEVNREFUQToKKwlyZXR1cm4gd1JldDsKKyAgICBjYXNlIExCX0dFVElURU1IRUlHSFQ6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9HRVRJVEVNUkVDVDoKKwlyZXR1cm4gd1JldDsKKyAgICBjYXNlIExCX0dFVFNFTDoKKwlyZXR1cm4gd1JldDsKKyAgICBjYXNlIExCX0dFVFNFTENPVU5UOgorCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfR0VUU0VMSVRFTVM6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9HRVRURVhUTEVOOgorCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfR0VUVE9QSU5ERVg6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9TRUxFQ1RTVFJJTkc6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0U6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9TRVRDQVJFVElOREVYOgorCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfU0VUQ09MVU1OV0lEVEg6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9TRVRIT1JJWk9OVEFMRVhURU5UOgorCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfU0VUSVRFTURBVEE6CisJcmV0dXJuIHdSZXQ7CisgICAgY2FzZSBMQl9TRVRUQUJTVE9QUzoKKwlyZXR1cm4gd1JldDsKKyAgICBjYXNlIExCX1NFVENVUlNFTDoKKyNpZmRlZiBERUJVR19MSVNUQk9YCisgICAgICAgIHByaW50ZigiTGlzdEJveCBMQl9TRVRDVVJTRUwgd1BhcmFtPSV4ICFcbiIsIHdQYXJhbSk7CisjZW5kaWYKKwl3UmV0ID0gTGlzdEJveFNldEN1clNlbChod25kLCB3UGFyYW0pOworICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGh3bmQpOworCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfU0VUU0VMOgorICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfU0VUU0VMIHdQYXJhbT0leCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKKwl3UmV0ID0gTGlzdEJveFNldFNlbChod25kLCB3UGFyYW0pOworICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGh3bmQpOworCXJldHVybiB3UmV0OworICAgIGNhc2UgTEJfU0VUVE9QSU5ERVg6CisgICAgICAgIHByaW50ZigiTGlzdEJveCBMQl9TRVRUT1BJTkRFWCB3UGFyYW09JXggIVxuIiwgd1BhcmFtKTsKKyAgICAgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCWxwaGwtPkZpcnN0VmlzaWJsZSA9IHdQYXJhbTsKKwlTZXRTY3JvbGxQb3MobHBobC0+aFduZFNjcm9sbCwgV01fVlNDUk9MTCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKwlicmVhazsKKyAgICBjYXNlIExCX1NFVElURU1IRUlHSFQ6CisjaWZkZWYgREVCVUdfTElTVEJPWAorICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfU0VUSVRFTUhFSUdIVCB3UGFyYW09JXggbFBhcmFtPSVsWCAhXG4iLCB3UGFyYW0sIGxQYXJhbSk7CisjZW5kaWYKKwl3UmV0ID0gTGlzdEJveFNldEl0ZW1IZWlnaHQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGh3bmQpOworCXJldHVybiB3UmV0OworCQorICAgIGRlZmF1bHQ6CisJcmV0dXJuIERlZldpbmRvd1Byb2MoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CisgICAgfQorcmV0dXJuIDA7Cit9CisKKworTFBIRUFETElTVCBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShIV05EIGh3bmQsIFdORCAqKnduZFB0cikKK3sKKyAgICBXTkQgICpQdHI7CisgICAgTFBIRUFETElTVCBscGhsOworICAgICood25kUHRyKSA9IFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIGxwaGwgPSAqKChMUEhFQURMSVNUICopJlB0ci0+d0V4dHJhWzFdKTsKKyAgICByZXR1cm4gbHBobDsKK30KKworCitMUEhFQURMSVNUIExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgICBXTkQgICp3bmRQdHI7CisgICAgTFBIRUFETElTVCBscGhsOworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIGxwaGwgPSAqKChMUEhFQURMSVNUICopJnduZFB0ci0+d0V4dHJhWzFdKTsKKyAgICByZXR1cm4gbHBobDsKK30KKworCit2b2lkIFN0ZERyYXdMaXN0Qm94KEhXTkQgaHduZCkKK3sKKwlMUEhFQURMSVNUICBscGhsOworCUxQTElTVFNUUlVDVCBscGxzOworCVBBSU5UU1RSVUNUIHBzOworCUhCUlVTSCBoQnJ1c2g7CisJSFdORAloV25kUGFyZW50OworCUhEQyBoZGM7CisJUkVDVCByZWN0OworCVVJTlQgIGksIGgsIGgyOworCWNoYXIJQ1sxMjhdOworCWggPSAwOworCWhkYyA9IEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOworCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworICAgICAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisJaWYgKGxwaGwgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OworCWhCcnVzaCA9IFNlbmRNZXNzYWdlKGxwaGwtPmhXbmRMb2dpY1BhcmVudCwgV01fQ1RMQ09MT1IsIChXT1JEKWhkYywKKwkJICAgIE1BS0VMT05HKGh3bmQsIENUTENPTE9SX0xJU1RCT1gpKTsKKwlpZiAoaEJydXNoID09IChIQlJVU0gpTlVMTCkgIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKKwlpZiAobHBobC0+SXRlbXNDb3VudCA+IGxwaGwtPkl0ZW1zVmlzaWJsZSkgcmVjdC5yaWdodCAtPSAxNjsKKwlGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworCWlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIGdvdG8gRW5kT2ZQYWludDsKKwlscGxzID0gbHBobC0+bHBGaXJzdDsKKwlpZiAobHBscyA9PSBOVUxMKSBnb3RvIEVuZE9mUGFpbnQ7CisJbHBobC0+SXRlbXNWaXNpYmxlID0gMDsKKwlmb3IoaSA9IDE7IGkgPD0gbHBobC0+SXRlbXNDb3VudDsgaSsrKSB7CisJICAgIGlmIChpID49IGxwaGwtPkZpcnN0VmlzaWJsZSkgeworCQloMiA9IGxwbHMtPmRpcy5yY0l0ZW0uYm90dG9tIC0gbHBscy0+ZGlzLnJjSXRlbS50b3A7CisJCWxwbHMtPmRpcy5yY0l0ZW0udG9wID0gaDsKKwkJbHBscy0+ZGlzLnJjSXRlbS5ib3R0b20gPSBoICsgaDI7CisJCWxwbHMtPmRpcy5yY0l0ZW0ucmlnaHQgPSByZWN0LnJpZ2h0OworCQlUZXh0T3V0KGhkYywgNSwgaCArIDIsIChjaGFyICopbHBscy0+ZGlzLml0ZW1EYXRhLCAKKwkJCXN0cmxlbigoY2hhciAqKWxwbHMtPmRpcy5pdGVtRGF0YSkpOworCQlpZiAobHBscy0+ZGlzLml0ZW1TdGF0ZSAhPSAwKSB7CisJCSAgICBJbnZlcnRSZWN0KGhkYywgJmxwbHMtPmRpcy5yY0l0ZW0pOworCQkgICAgfQorCQloICs9IGgyOworCQlscGhsLT5JdGVtc1Zpc2libGUrKzsKKwkJaWYgKGggPiByZWN0LmJvdHRvbSkgYnJlYWs7CisJCX0KKwkgICAgaWYgKGxwbHMtPmxwTmV4dCA9PSBOVUxMKSBnb3RvIEVuZE9mUGFpbnQ7CisJICAgIGxwbHMgPSAoTFBMSVNUU1RSVUNUKWxwbHMtPmxwTmV4dDsKKwl9CitFbmRPZlBhaW50OgorICAgIEVuZFBhaW50KCBod25kLCAmcHMgKTsKKyAgICBpZiAobHBobC0+SXRlbXNDb3VudCA+IGxwaGwtPkl0ZW1zVmlzaWJsZSkgeworICAgICAgICBJbnZhbGlkYXRlUmVjdChscGhsLT5oV25kU2Nyb2xsLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGxwaGwtPmhXbmRTY3JvbGwpOworIAl9Cit9CisKKworCit2b2lkIE93bmVyRHJhd0xpc3RCb3goSFdORCBod25kKQoreworCUxQSEVBRExJU1QgIGxwaGw7CisJTFBMSVNUU1RSVUNUIGxwbHM7CisJSEFORExFCWhUZW1wOworCVBBSU5UU1RSVUNUIHBzOworCUhCUlVTSCAJaEJydXNoOworCUhXTkQJaFduZFBhcmVudDsKKwlIREMgaGRjOworCVJFQ1QgcmVjdDsKKwlVSU5UICBpLCBoLCBoMjsKKwljaGFyCUNbMTI4XTsKKwloID0gMDsKKwloZGMgPSBCZWdpblBhaW50KCBod25kLCAmcHMgKTsKKwlHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgICAgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCWlmIChscGhsID09IE5VTEwpIGdvdG8gRW5kT2ZQYWludDsKKwloQnJ1c2ggPSBTZW5kTWVzc2FnZShscGhsLT5oV25kTG9naWNQYXJlbnQsIFdNX0NUTENPTE9SLCAoV09SRCloZGMsCisJCSAgICBNQUtFTE9ORyhod25kLCBDVExDT0xPUl9MSVNUQk9YKSk7CisJaWYgKGhCcnVzaCA9PSAoSEJSVVNIKU5VTEwpICBoQnJ1c2ggPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CisJaWYgKGxwaGwtPkl0ZW1zQ291bnQgPiBscGhsLT5JdGVtc1Zpc2libGUpIHJlY3QucmlnaHQgLT0gMTY7CisJRmlsbFJlY3QoaGRjLCAmcmVjdCwgaEJydXNoKTsKKwlpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSBnb3RvIEVuZE9mUGFpbnQ7CisJbHBscyA9IGxwaGwtPmxwRmlyc3Q7CisJaWYgKGxwbHMgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OworCWxwaGwtPkl0ZW1zVmlzaWJsZSA9IDA7CisJZm9yKGkgPSAxOyBpIDw9IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgeworCSAgICBpZiAoaSA+PSBscGhsLT5GaXJzdFZpc2libGUpIHsKKwkJbHBscy0+ZGlzLmhEQyA9IGhkYzsKKwkJbHBscy0+ZGlzLml0ZW1JRCA9IGk7CisJCWgyID0gbHBscy0+ZGlzLnJjSXRlbS5ib3R0b20gLSBscGxzLT5kaXMucmNJdGVtLnRvcDsKKwkJbHBscy0+ZGlzLnJjSXRlbS50b3AgPSBoOworCQlscGxzLT5kaXMucmNJdGVtLmJvdHRvbSA9IGggKyBoMjsKKwkJbHBscy0+ZGlzLnJjSXRlbS5yaWdodCA9IHJlY3QucmlnaHQ7CisJCWxwbHMtPmRpcy5pdGVtQWN0aW9uID0gT0RBX0RSQVdFTlRJUkU7CisJCWlmIChscGxzLT5kaXMuaXRlbVN0YXRlICE9IDApIHsKKwkJICAgIGxwbHMtPmRpcy5pdGVtQWN0aW9uIHw9IE9EQV9TRUxFQ1Q7CisJCSAgICB9CisjaWZkZWYgREVCVVRfTElTVEJPWAorCQlwcmludGYoIkxCT1ggV01fRFJBV0lURU0gIyVkIGxlZnQ9JWQgdG9wPSVkIHJpZ2h0PSVkIGJvdHRvbT0lZCAhXG4iLCAKKwkJCWksIGxwbHMtPmRpcy5yY0l0ZW0ubGVmdCwgbHBscy0+ZGlzLnJjSXRlbS50b3AsIAorCQkJbHBscy0+ZGlzLnJjSXRlbS5yaWdodCwgbHBscy0+ZGlzLnJjSXRlbS5ib3R0b20pOworCQlwcmludGYoIkxCT1ggV01fRFJBV0lURU0gUGFyZW50PSVYICZkaXM9JWxYIEN0bElEPSV1ICFcbiIsIAorCQkJaFduZFBhcmVudCwgKExPTkcpJmxwbHMtPmRpcywgbHBscy0+ZGlzLkN0bElEKTsKKyNlbmRpZgorCQlwcmludGYoIkxCT1ggV01fRFJBV0lURU0gJyVzJyAhXG4iLCBscGxzLT5kaXMuaXRlbURhdGEpOworCQlTZW5kTWVzc2FnZShscGhsLT5oV25kTG9naWNQYXJlbnQsIFdNX0RSQVdJVEVNLCBpLCAoTFBBUkFNKSZscGxzLT5kaXMpOworCQlHbG9iYWxVbmxvY2soaFRlbXApOworCQlHbG9iYWxGcmVlKGhUZW1wKTsKKwkJaWYgKGxwbHMtPmRpcy5pdGVtU3RhdGUgIT0gMCkgeworCQkgICAgSW52ZXJ0UmVjdChoZGMsICZscGxzLT5kaXMucmNJdGVtKTsKKwkJICAgIH0KKwkJaCArPSBoMjsKKwkJbHBobC0+SXRlbXNWaXNpYmxlKys7CisJCWlmIChoID4gcmVjdC5ib3R0b20pIGJyZWFrOworCQl9CisJICAgIGlmIChscGxzLT5scE5leHQgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OworCSAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisJfQorRW5kT2ZQYWludDoKKyAgICBFbmRQYWludCggaHduZCwgJnBzICk7CisgICAgaWYgKGxwaGwtPkl0ZW1zQ291bnQgPiBscGhsLT5JdGVtc1Zpc2libGUpIHsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QobHBobC0+aFduZFNjcm9sbCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhscGhsLT5oV25kU2Nyb2xsKTsKKyAgICAgICAgfQorfQorCisKKworaW50IExpc3RCb3hGaW5kTW91c2UoSFdORCBod25kLCBpbnQgWCwgaW50IFkpCit7CitMUEhFQURMSVNUIAlscGhsOworTFBMSVNUU1RSVUNUCWxwbHM7CitSRUNUIHJlY3Q7CitVSU5UICBpLCBoLCBoMjsKK2NoYXIJQ1sxMjhdOworaCA9IDA7CitscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CitpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworaWYgKGxwaGwtPkl0ZW1zQ291bnQgPT0gMCkgcmV0dXJuIExCX0VSUjsKK2xwbHMgPSBscGhsLT5scEZpcnN0OworaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKK2ZvcihpID0gMTsgaSA8PSBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKKyAgICBpZiAoaSA+PSBscGhsLT5GaXJzdFZpc2libGUpIHsKKwloMiA9IGg7CisJaCArPSBscGxzLT5kaXMucmNJdGVtLmJvdHRvbSAtIGxwbHMtPmRpcy5yY0l0ZW0udG9wOworCWlmICgoWSA+IGgyKSAmJiAoWSA8IGgpKSByZXR1cm4oaSk7CisJfQorICAgIGlmIChscGxzLT5scE5leHQgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisgICAgfQorcmV0dXJuKExCX0VSUik7Cit9CisKKworCitpbnQgQ3JlYXRlTGlzdEJveFN0cnVjdChIV05EIGh3bmQpCit7CisgICAgV05EICAqd25kUHRyOworICAgIExQSEVBRExJU1QgbHBobDsKKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBscGhsID0gKExQSEVBRExJU1QpbWFsbG9jKHNpemVvZihIRUFETElTVCkpOworICAgIGxwaGwtPmxwRmlyc3QgPSBOVUxMOworICAgICooKExQSEVBRExJU1QgKikmd25kUHRyLT53RXh0cmFbMV0pID0gbHBobDsgCS8qIEhFQUQgb2YgTGlzdCAqLworICAgIGxwaGwtPkl0ZW1zQ291bnQgPSAwOworICAgIGxwaGwtPkl0ZW1zVmlzaWJsZSA9IDA7CisgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gMTsKKyAgICBscGhsLT5TdGRJdGVtSGVpZ2h0ID0gMTU7CisgICAgbHBobC0+RHJhd0N0bFR5cGUgPSBPRFRfTElTVEJPWDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitpbnQgTGlzdEJveEFkZFN0cmluZyhIV05EIGh3bmQsIExQU1RSIG5ld3N0cikKK3sKKyAgICBXTkQgIAkqd25kUHRyOworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHNuZXc7CisgICAgSEFORExFIAloVGVtcDsKKyAgICBMUFNUUiAJc3RyOworICAgIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKKyAgICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGhUZW1wID0gVVNFUl9IRUFQX0FMTE9DKEdNRU1fTU9WRUFCTEUsIHNpemVvZihMSVNUU1RSVUNUKSk7CisgICAgbHBsc25ldyA9IChMUExJU1RTVFJVQ1QpIFVTRVJfSEVBUF9BRERSKGhUZW1wKTsKKyAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgICBpZiAobHBscyAhPSBOVUxMKSB7CisJd2hpbGUobHBscy0+bHBOZXh0ICE9IE5VTEwpIHsKKwkgICAgbHBscyA9IChMUExJU1RTVFJVQ1QpbHBscy0+bHBOZXh0OworCSAgICB9CisJbHBscy0+bHBOZXh0ID0gbHBsc25ldzsKKyAJfQorICAgIGVsc2UKKwlscGhsLT5scEZpcnN0ID0gbHBsc25ldzsKKyAgICBscGhsLT5JdGVtc0NvdW50Kys7CisjaWZkZWYgREVCVUdfTElTVEJPWAorICAgIHByaW50ZigiSXRlbXMgQ291bnQgPSAldVxuIiwgbHBobC0+SXRlbXNDb3VudCk7CisjZW5kaWYKKyAgICBoVGVtcCA9IDA7CisgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfSEFTU1RSSU5HUykgIT0gTEJTX0hBU1NUUklOR1MpIHsKKwlpZiAoKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpICE9IExCU19PV05FUkRSQVdGSVhFRCkgJiYKKwkgICAgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpICE9IExCU19PV05FUkRSQVdWQVJJQUJMRSkpIHsKKwkgICAgaFRlbXAgPSBVU0VSX0hFQVBfQUxMT0MoR01FTV9NT1ZFQUJMRSwgc3RybGVuKG5ld3N0cikgKyAxKTsKKwkgICAgc3RyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKGhUZW1wKTsKKwkgICAgaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4gTEJfRVJSU1BBQ0U7CisJICAgIHN0cmNweShzdHIsIG5ld3N0cik7CisJICAgIG5ld3N0ciA9IHN0cjsKKwkgICAgfQorCX0KKyAgICBMaXN0Qm94RGVmYXVsdEl0ZW0oaHduZCwgd25kUHRyLCBscGhsLCBscGxzbmV3KTsKKyAgICBscGxzbmV3LT5oTWVtID0gaFRlbXA7CisgICAgbHBsc25ldy0+bHBOZXh0ID0gTlVMTDsKKyAgICBscGxzbmV3LT5kaXMuaXRlbUlEID0gbHBobC0+SXRlbXNDb3VudDsKKyAgICBscGxzbmV3LT5kaXMuaXRlbURhdGEgPSAoRFdPUkQpbmV3c3RyOworICAgIGxwbHNuZXctPmhEYXRhID0gaFRlbXA7CisgICAgU2V0U2Nyb2xsUmFuZ2UobHBobC0+aFduZFNjcm9sbCwgV01fVlNDUk9MTCwgMSwgbHBobC0+SXRlbXNDb3VudCwgVFJVRSk7CisgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+PSAobHBobC0+SXRlbXNDb3VudCAtIGxwaGwtPkl0ZW1zVmlzaWJsZSkpIHsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKyAgICAgICAgfQorICAgIGlmICgobHBobC0+SXRlbXNDb3VudCAtIGxwaGwtPkZpcnN0VmlzaWJsZSkgPT0gbHBobC0+SXRlbXNWaXNpYmxlKSAKKyAgICAJU2hvd1dpbmRvdyhscGhsLT5oV25kU2Nyb2xsLCBTV19OT1JNQUwpOworICAgIHJldHVybiBscGhsLT5JdGVtc0NvdW50OworfQorCisKK2ludCBMaXN0Qm94SW5zZXJ0U3RyaW5nKEhXTkQgaHduZCwgVUlOVCB1SW5kZXgsIExQU1RSIG5ld3N0cikKK3sKKyAgICBXTkQgIAkqd25kUHRyOworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHNuZXc7CisgICAgSEFORExFCWhUZW1wOworICAgIExQU1RSCXN0cjsKKyAgICBVSU5UCUNvdW50OworICAgIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKKyAgICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGlmICh1SW5kZXggPCAxIHx8IHVJbmRleCA+IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBMQl9FUlI7CisgICAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CisgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAodUluZGV4ID4gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKyAgICBmb3IoQ291bnQgPSAxOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgeworCWlmIChscGxzLT5scE5leHQgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisgICAgfQorICAgIGhUZW1wID0gVVNFUl9IRUFQX0FMTE9DKEdNRU1fTU9WRUFCTEUsIHNpemVvZihMSVNUU1RSVUNUKSk7CisgICAgbHBsc25ldyA9IChMUExJU1RTVFJVQ1QpIFVTRVJfSEVBUF9BRERSKGhUZW1wKTsKKyAgICBMaXN0Qm94RGVmYXVsdEl0ZW0oaHduZCwgd25kUHRyLCBscGhsLCBscGxzbmV3KTsKKyAgICBscGxzbmV3LT5oTWVtID0gaFRlbXA7CisgICAgbHBscy0+bHBOZXh0ID0gbHBsc25ldzsKKyAgICBscGhsLT5JdGVtc0NvdW50Kys7CisgICAgaFRlbXAgPSAwOworICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYgTEJTX0hBU1NUUklOR1MpICE9IExCU19IQVNTVFJJTkdTKSB7CisJaWYgKCgod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKSAhPSBMQlNfT1dORVJEUkFXRklYRUQpICYmCisJICAgICgod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKSAhPSBMQlNfT1dORVJEUkFXVkFSSUFCTEUpKSB7CisJICAgIGhUZW1wID0gVVNFUl9IRUFQX0FMTE9DKEdNRU1fTU9WRUFCTEUsIHN0cmxlbihuZXdzdHIpICsgMSk7CisJICAgIHN0ciA9IChMUFNUUilVU0VSX0hFQVBfQUREUihoVGVtcCk7CisJICAgIGlmIChzdHIgPT0gTlVMTCkgcmV0dXJuIExCX0VSUlNQQUNFOworCSAgICBzdHJjcHkoc3RyLCBuZXdzdHIpOworCSAgICBuZXdzdHIgPSBzdHI7CisJICAgIH0KKwl9CisgICAgbHBsc25ldy0+bHBOZXh0ID0gTlVMTDsKKyAgICBscGxzbmV3LT5kaXMuaXRlbUlEID0gbHBobC0+SXRlbXNDb3VudDsKKyAgICBscGxzbmV3LT5kaXMuaXRlbURhdGEgPSAoRFdPUkQpbmV3c3RyOworICAgIGxwbHNuZXctPmhEYXRhID0gaFRlbXA7CisgICAgU2V0U2Nyb2xsUmFuZ2UobHBobC0+aFduZFNjcm9sbCwgV01fVlNDUk9MTCwgMSwgbHBobC0+SXRlbXNDb3VudCwgVFJVRSk7CisgICAgaWYgKCgobHBobC0+SXRlbXNDb3VudCAtIGxwaGwtPkZpcnN0VmlzaWJsZSkgPT0gbHBobC0+SXRlbXNWaXNpYmxlKSAmJiAKKyAgICAgICAgKGxwaGwtPkl0ZW1zVmlzaWJsZSAhPSAwKSkgCisgICAgCVNob3dXaW5kb3cobHBobC0+aFduZFNjcm9sbCwgU1dfTk9STUFMKTsKKyAgICBpZiAoKGxwaGwtPkZpcnN0VmlzaWJsZSA8PSB1SW5kZXgpICYmCisgICAgICAgICgobHBobC0+Rmlyc3RWaXNpYmxlICsgbHBobC0+SXRlbXNWaXNpYmxlKSA+PSB1SW5kZXgpKSB7CisgICAgICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CisgICAgICAgIH0KKyAgICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKK30KKworCitpbnQgTGlzdEJveEdldFRleHQoSFdORCBod25kLCBVSU5UIHVJbmRleCwgTFBTVFIgT3V0U3RyKQoreworICAgIFdORCAgCSp3bmRQdHI7CisgICAgTFBIRUFETElTVCAJbHBobDsKKyAgICBMUExJU1RTVFJVQ1QgbHBsczsKKyAgICBVSU5UCUNvdW50OworICAgIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKKyAgICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGlmICh1SW5kZXggPCAxIHx8IHVJbmRleCA+IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBMQl9FUlI7CisgICAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CisgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAodUluZGV4ID4gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKyAgICBmb3IoQ291bnQgPSAxOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgeworCWlmIChscGxzLT5scE5leHQgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisgICAgfQorICAgIGlmICgoKHduZFB0ci0+ZHdTdHlsZSAmIExCU19PV05FUkRSQVdGSVhFRCkgPT0gTEJTX09XTkVSRFJBV0ZJWEVEKSB8fAorCSAgICAoKHduZFB0ci0+ZHdTdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkgPT0gTEJTX09XTkVSRFJBV1ZBUklBQkxFKSkgeworCWlmICgod25kUHRyLT5kd1N0eWxlICYgTEJTX0hBU1NUUklOR1MpICE9IExCU19IQVNTVFJJTkdTKSB7IAorCSAgICAqKChsb25nICopT3V0U3RyKSA9IGxwbHMtPmRpcy5pdGVtRGF0YTsKKwkgICAgcmV0dXJuIDQ7CisJICAgIH0KKwl9CisJCisgICAgc3RyY3B5KE91dFN0ciwgKGNoYXIgKilscGxzLT5kaXMuaXRlbURhdGEpOworICAgIHJldHVybiBzdHJsZW4oT3V0U3RyKTsKK30KKworCitpbnQgTGlzdEJveERlbGV0ZVN0cmluZyhIV05EIGh3bmQsIFVJTlQgdUluZGV4KQoreworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICAgIFVJTlQJQ291bnQ7CisgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgaWYgKHVJbmRleCA8IDEgfHwgdUluZGV4ID4gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGlmICh1SW5kZXggPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworICAgIGZvcihDb3VudCA9IDE7IENvdW50IDwgdUluZGV4OyBDb3VudCsrKSB7CisJaWYgKGxwbHMtPmxwTmV4dCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworCWxwbHMyID0gbHBsczsKKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisgICAgfQorICAgIGxwbHMyLT5scE5leHQgPSAoTFBMSVNUU1RSVUNUKWxwbHMtPmxwTmV4dDsKKyAgICBscGhsLT5JdGVtc0NvdW50LS07CisgICAgaWYgKGxwbHMtPmhEYXRhICE9IDApIFVTRVJfSEVBUF9GUkVFKGxwbHMtPmhEYXRhKTsKKyAgICBpZiAobHBscy0+aE1lbSAhPSAwKSBVU0VSX0hFQVBfRlJFRShscGxzLT5oTWVtKTsKKyAgICBTZXRTY3JvbGxSYW5nZShscGhsLT5oV25kU2Nyb2xsLCBXTV9WU0NST0xMLCAxLCBscGhsLT5JdGVtc0NvdW50LCBUUlVFKTsKKyAgICBpZiAobHBobC0+SXRlbXNDb3VudCA8IGxwaGwtPkl0ZW1zVmlzaWJsZSkgCisgICAgCVNob3dXaW5kb3cobHBobC0+aFduZFNjcm9sbCwgU1dfSElERSk7CisgICAgaWYgKChscGhsLT5GaXJzdFZpc2libGUgPD0gdUluZGV4KSAmJgorICAgICAgICAoKGxwaGwtPkZpcnN0VmlzaWJsZSArIGxwaGwtPkl0ZW1zVmlzaWJsZSkgPj0gdUluZGV4KSkgeworICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKyAgICAgICAgVXBkYXRlV2luZG93KGh3bmQpOworICAgICAgICB9CisgICAgcmV0dXJuIGxwaGwtPkl0ZW1zQ291bnQ7Cit9CisKKworaW50IExpc3RCb3hGaW5kU3RyaW5nKEhXTkQgaHduZCwgVUlOVCBuRmlyc3QsIExQU1RSIE1hdGNoU3RyKQoreworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHM7CisgICAgVUlOVAlDb3VudDsKKyAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAobkZpcnN0IDwgMSB8fCBuRmlyc3QgPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgQ291bnQgPSAxOworICAgIHdoaWxlKGxwbHMgIT0gTlVMTCkgeworICAgIAlpZiAoc3RyY21wKChjaGFyICopbHBscy0+ZGlzLml0ZW1EYXRhLCBNYXRjaFN0cikgPT0gMCkKKwkgICAgcmV0dXJuIENvdW50OworCWxwbHMgPSAoTFBMSVNUU1RSVUNUKWxwbHMtPmxwTmV4dDsKKwlDb3VudCsrOworICAgICAgICB9CisgICAgcmV0dXJuIExCX0VSUjsKK30KKworCitpbnQgTGlzdEJveFJlc2V0Q29udGVudChIV05EIGh3bmQpCit7CisgICAgV05EICAqd25kUHRyOworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICAgIFVJTlQJaTsKKyAgICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGZvcihpID0gMDsgaSA8PSBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKKwlscGxzMiA9IGxwbHM7CisJbHBscyA9IChMUExJU1RTVFJVQ1QpbHBscy0+bHBOZXh0OworCWlmIChpICE9IDApIHsKKyNpZmRlZiBERUJVR19MSVNUQk9YCisJICAgIHByaW50ZigiUmVzZXRDb250ZW50ICMldVxuIiwgaSk7CisjZW5kaWYKKwkgICAgaWYgKGxwbHMyLT5oRGF0YSAhPSAwKSBVU0VSX0hFQVBfRlJFRShscGxzLT5oRGF0YSk7CisJICAgIGlmIChscGxzMi0+aE1lbSAhPSAwKSBVU0VSX0hFQVBfRlJFRShscGxzLT5oTWVtKTsKKwkgICAgfSAgCisJaWYgKGxwbHMgPT0gTlVMTCkgIGJyZWFrOworICAgIH0KKyAgICBscGhsLT5scEZpcnN0ID0gTlVMTDsKKyAgICBscGhsLT5GaXJzdFZpc2libGUgPSAxOworICAgIGxwaGwtPkl0ZW1zQ291bnQgPSAwOworICAgIGxwaGwtPkl0ZW1TZWxlY3RlZCA9IDA7CisgICAgbHBobC0+UHJldlNlbGVjdGVkID0gMDsKKyAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmJiBMQlNfTk9USUZZKSAhPSAwKQorCVNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgV01fQ09NTUFORCwgCisgICAgCSAgICB3bmRQdHItPndJRG1lbnUsIE1BS0VMT05HKGh3bmQsIExCTl9TRUxDSEFOR0UpKTsKKworICAgIFNldFNjcm9sbFJhbmdlKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIDEsIGxwaGwtPkl0ZW1zQ291bnQsIFRSVUUpOworICAgIFNob3dXaW5kb3cobHBobC0+aFduZFNjcm9sbCwgU1dfSElERSk7CisgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgVXBkYXRlV2luZG93KGh3bmQpOworICAgIHJldHVybiBUUlVFOworfQorCisKK2ludCBMaXN0Qm94U2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCB3SW5kZXgpCit7CisgICAgV05EICAqd25kUHRyOworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICAgIFVJTlQJaTsKKyAgICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGhsLT5JdGVtU2VsZWN0ZWQgPSBMQl9FUlI7CisgICAgaWYgKHdJbmRleCA8IDEgfHwgd0luZGV4ID4gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGZvcihpID0gMTsgaSA8PSBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKKwlscGxzMiA9IGxwbHM7CisJbHBscyA9IChMUExJU1RTVFJVQ1QpbHBscy0+bHBOZXh0OworCWlmIChpID09IHdJbmRleCkKKwkgICAgbHBsczItPmRpcy5pdGVtU3RhdGUgPSAxOworCWVsc2UgCisJICAgIGlmIChscGxzMi0+ZGlzLml0ZW1TdGF0ZSAhPSAwKQorCSAgICAgICAgbHBsczItPmRpcy5pdGVtU3RhdGUgPSAwOworCWlmIChscGxzID09IE5VTEwpICBicmVhazsKKyAgICB9CisgICAgbHBobC0+SXRlbVNlbGVjdGVkID0gd0luZGV4OworICAgIGlmICgod25kUHRyLT5kd1N0eWxlICYmIExCU19OT1RJRlkpICE9IDApCisJU2VuZE1lc3NhZ2Uod25kUHRyLT5od25kUGFyZW50LCBXTV9DT01NQU5ELCAKKyAgICAJICAgIHduZFB0ci0+d0lEbWVudSwgTUFLRUxPTkcoaHduZCwgTEJOX1NFTENIQU5HRSkpOworICAgIHJldHVybiBMQl9FUlI7Cit9CisKKworCitpbnQgTGlzdEJveFNldFNlbChIV05EIGh3bmQsIFdPUkQgd0luZGV4KQoreworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICAgIFVJTlQJaTsKKyAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAod0luZGV4IDwgMSB8fCB3SW5kZXggPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgZm9yKGkgPSAxOyBpIDw9IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgeworCWxwbHMyID0gbHBsczsKKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisJaWYgKGkgPT0gd0luZGV4KSB7CisJICAgIGxwbHMyLT5kaXMuaXRlbVN0YXRlID0gMTsKKwkgICAgYnJlYWs7CisJICAgIH0gIAorCWlmIChscGxzID09IE5VTEwpICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIExCX0VSUjsKK30KKworCitpbnQgTGlzdEJveERpcmVjdG9yeShIV05EIGh3bmQsIFVJTlQgYXR0cmliLCBMUFNUUiBmaWxlc3BlYykKK3sKK0RJUiAgICAgICAgICAgCSpkaXJwOworc3RydWN0IGRpcmVudCAJKmRwOworc3RydWN0IHN0YXQJc3Q7CitjaGFyCQlzdHJbMTI4XTsKK2ludAkJd1JldDsKK2RpcnAgPSBvcGVuZGlyKCIuIik7Cit3aGlsZSAoIChkcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIAorICAgIHsKKyAgICBzdGF0KGRwLT5kX25hbWUsICZzdCk7CisjaWZkZWYgREVCVUdfTEJESVIKKyAgICBwcmludGYoIkxCX0RJUiA6IHN0X21vZGU9JWxYIC8gZF9uYW1lPSclcydcbiIsIHN0LnN0X21vZGUsIGRwLT5kX25hbWUpOworI2VuZGlmCisgICAgaWYgU19JU0RJUihzdC5zdF9tb2RlKSB7CisJc3ByaW50ZihzdHIsICJbJXNdIiwgZHAtPmRfbmFtZSk7CisJfQorICAgIGVsc2UKKwlzdHJjcHkoc3RyLCBkcC0+ZF9uYW1lKTsKKyAgICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhod25kLCBzdHIpOworICAgIGlmICh3UmV0ID09IExCX0VSUikgYnJlYWs7CisgICAgfQorY2xvc2VkaXIoZGlycCk7CQorcmV0dXJuIHdSZXQ7Cit9CisKKworaW50IExpc3RCb3hHZXRJdGVtUmVjdChIV05EIGh3bmQsIFdPUkQgd0luZGV4LCBMUFJFQ1QgbHByZWN0KQoreworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICAgIFVJTlQJaTsKKyAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAod0luZGV4IDwgMSB8fCB3SW5kZXggPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgZm9yKGkgPSAwOyBpIDw9IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgeworCWxwbHMyID0gbHBsczsKKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisJaWYgKGkgPT0gd0luZGV4KSB7CisJICAgICoobHByZWN0KSA9IGxwbHMyLT5kaXMucmNJdGVtOworCSAgICBicmVhazsKKwkgICAgfSAgCisJaWYgKGxwbHMgPT0gTlVMTCkgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gTEJfRVJSOworfQorCisKKworaW50IExpc3RCb3hTZXRJdGVtSGVpZ2h0KEhXTkQgaHduZCwgV09SRCB3SW5kZXgsIGxvbmcgaGVpZ2h0KQoreworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICAgIFVJTlQJaTsKKyAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAod0luZGV4IDwgMSB8fCB3SW5kZXggPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgZm9yKGkgPSAwOyBpIDw9IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgeworCWxwbHMyID0gbHBsczsKKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisJaWYgKGkgPT0gd0luZGV4KSB7CisJICAgIGxwbHMyLT5kaXMucmNJdGVtLmJvdHRvbSA9IGxwbHMyLT5kaXMucmNJdGVtLnRvcCArIChzaG9ydCloZWlnaHQ7CisJICAgIGJyZWFrOworCSAgICB9ICAKKwlpZiAobHBscyA9PSBOVUxMKSAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBMQl9FUlI7Cit9CisKKworCisKKworaW50IExpc3RCb3hEZWZhdWx0SXRlbShIV05EIGh3bmQsIFdORCAqd25kUHRyLCAKKwlMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKQoreworICAgIFJFQ1QJcmVjdDsKKyAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgICBTZXRSZWN0KCZscGxzLT5kaXMucmNJdGVtLCAwLCAwLCByZWN0LnJpZ2h0LCBscGhsLT5TdGRJdGVtSGVpZ2h0KTsKKyAgICBscGxzLT5kaXMuQ3RsVHlwZSA9IGxwaGwtPkRyYXdDdGxUeXBlOworICAgIGxwbHMtPmRpcy5DdGxJRCA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBscGxzLT5kaXMuaXRlbUlEID0gMDsKKyAgICBscGxzLT5kaXMuaXRlbUFjdGlvbiA9IDA7CisgICAgbHBscy0+ZGlzLml0ZW1TdGF0ZSA9IDA7CisgICAgbHBscy0+ZGlzLmh3bmRJdGVtID0gaHduZDsKKyAgICBscGxzLT5kaXMuaERDID0gMDsKKyAgICBscGxzLT5kaXMuaXRlbURhdGEgPSAwOworfQorCisKKworaW50IExpc3RCb3hGaW5kTmV4dE1hdGNoKEhXTkQgaHduZCwgV09SRCB3Q2hhcikKK3sKKyAgICBXTkQgIAkqd25kUHRyOworICAgIExQSEVBRExJU1QgCWxwaGw7CisgICAgTFBMSVNUU1RSVUNUIGxwbHM7CisgICAgVUlOVAlDb3VudDsKKyAgICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CisgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGlmICh3Q2hhciA8ICcgJykgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAoKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpID09IExCU19PV05FUkRSQVdGSVhFRCkgfHwKKwkgICAgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpID09IExCU19PV05FUkRSQVdWQVJJQUJMRSkpIHsKKwlpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIExCU19IQVNTVFJJTkdTKSAhPSBMQlNfSEFTU1RSSU5HUykgeyAKKwkgICAgcmV0dXJuIExCX0VSUjsKKwkgICAgfQorCX0KKyAgICBDb3VudCA9IDE7CisgICAgd2hpbGUobHBscyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChDb3VudCA+IGxwaGwtPkl0ZW1TZWxlY3RlZCkgeworCSAgICBpZiAoKigoY2hhciAqKWxwbHMtPmRpcy5pdGVtRGF0YSkgPT0gKGNoYXIpd0NoYXIpIHsKKwkJbHBobC0+Rmlyc3RWaXNpYmxlID0gQ291bnQgLSBscGhsLT5JdGVtc1Zpc2libGUgLyAyOworCQlpZiAobHBobC0+Rmlyc3RWaXNpYmxlIDwgMSkgbHBobC0+Rmlyc3RWaXNpYmxlID0gMTsKKwkJTGlzdEJveFNldEN1clNlbChod25kLCBDb3VudCk7CisJCVNldFNjcm9sbFBvcyhscGhsLT5oV25kU2Nyb2xsLCBXTV9WU0NST0xMLCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOworCSAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisJICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJICAgICAgICByZXR1cm4gQ291bnQ7CisJICAgICAgICB9CisJICAgIH0KKwlscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisJQ291bnQrKzsKKwl9CisgICAgQ291bnQgPSAxOworICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICAgIHdoaWxlKGxwbHMgIT0gTlVMTCkgeworCWlmICgqKChjaGFyICopbHBscy0+ZGlzLml0ZW1EYXRhKSA9PSAoY2hhcil3Q2hhcikgeworCSAgICBpZiAoQ291bnQgPT0gbHBobC0+SXRlbVNlbGVjdGVkKSAgICByZXR1cm4gTEJfRVJSOworCSAgICBscGhsLT5GaXJzdFZpc2libGUgPSBDb3VudCAtIGxwaGwtPkl0ZW1zVmlzaWJsZSAvIDI7CisJICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPCAxKSBscGhsLT5GaXJzdFZpc2libGUgPSAxOworCSAgICBMaXN0Qm94U2V0Q3VyU2VsKGh3bmQsIENvdW50KTsKKwkgICAgU2V0U2Nyb2xsUG9zKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CisJICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCSAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJICAgIHJldHVybiBDb3VudDsKKwkgICAgfQorCWxwbHMgPSAoTFBMSVNUU1RSVUNUKWxwbHMtPmxwTmV4dDsKKwlDb3VudCsrOworICAgICAgICB9CisgICAgcmV0dXJuIExCX0VSUjsKK30KKworCmRpZmYgLS1naXQgYS9jb250cm9scy9zY3JvbGwuYyBiL2NvbnRyb2xzL3Njcm9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODE2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cm9scy9zY3JvbGwuYwpAQCAtMCwwICsxLDM3OSBAQAorLyoKKyAqIEludGVyZmFjZSBjb2RlIHRvIFNDUk9MTEJBUiB3aWRnZXQKKyAqCisgKiBDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMKKyAqCisgKi8KKworLyoKKyNkZWZpbmUgREVCVUdfU0NST0xMCisqLworCitzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgTWFydGluIEF5b3R0ZSwgMTk5MyI7CisKKyNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CisjaW5jbHVkZSA8WDExL1N0cmluZ0RlZnMuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAic2Nyb2xsLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImRpcmVudC5oIgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK0xQSEVBRFNDUk9MTCBTY3JvbGxCYXJHZXRXaW5kb3dBbmRTdG9yYWdlKEhXTkQgaHduZCwgV05EICoqd25kUHRyKTsKK0xQSEVBRFNDUk9MTCBTY3JvbGxCYXJHZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCk7Cit2b2lkIFN0ZERyYXdTY3JvbGxCYXIoSFdORCBod25kKTsKK2ludCBDcmVhdGVTY3JvbGxCYXJTdHJ1Y3QoSFdORCBod25kKTsKKworCit2b2lkIFNDUk9MTEJBUl9DcmVhdGVTY3JvbGxCYXIoTFBTVFIgY2xhc3NOYW1lLCBMUFNUUiBzY3JvbGxMYWJlbCwgSFdORCBod25kKQoreworICAgIFdORCAqd25kUHRyICAgID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgV05EICpwYXJlbnRQdHIgPSBXSU5fRmluZFduZFB0cih3bmRQdHItPmh3bmRQYXJlbnQpOworICAgIERXT1JEIHN0eWxlOworICAgIGNoYXIgd2lkZ2V0TmFtZVsxNV07CisKKyNpZmRlZiBERUJVR19TQ1JPTExCQVIKKyAgICBwcmludGYoInNjcm9sbDogbGFiZWwgPSAlcywgeCA9ICVkLCB5ID0gJWRcbiIsIHNjcm9sbExhYmVsLAorCSAgIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LCB3bmRQdHItPnJlY3RDbGllbnQudG9wKTsKKyAgICBwcmludGYoIiAgICAgICAgd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsCisJICAgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCisJICAgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3ApOworI2VuZGlmCisKKyAgICBpZiAoIXduZFB0cikKKwlyZXR1cm47CisKKyAgICBzdHlsZSA9IHduZFB0ci0+ZHdTdHlsZSAmIDB4MDAwMEZGRkY7CisvKgorICAgIGlmICgoc3R5bGUgJiBTQlNfTk9USUZZKSA9PSBTQlNfTk9USUZZKQorKi8gICAgCisgICAgc3ByaW50Zih3aWRnZXROYW1lLCAiJXMlZCIsIGNsYXNzTmFtZSwgd25kUHRyLT53SURtZW51KTsKKyAgICB3bmRQdHItPndpbldpZGdldCA9IFh0VmFDcmVhdGVNYW5hZ2VkV2lkZ2V0KHdpZGdldE5hbWUsCisJCQkJICAgIGNvbXBvc2l0ZVdpZGdldENsYXNzLAorCQkJCSAgICBwYXJlbnRQdHItPndpbldpZGdldCwKKwkJCQkgICAgWHROeCwgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCisJCQkJICAgIFh0TnksIHduZFB0ci0+cmVjdENsaWVudC50b3AsCisJCQkJICAgIFh0TndpZHRoLCB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLQorCQkJCSAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCisJCQkJICAgIFh0TmhlaWdodCwgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtCisJCQkJICAgICAgICB3bmRQdHItPnJlY3RDbGllbnQudG9wLAorCQkJCSAgICBOVUxMICk7CisgICAgR2xvYmFsVW5sb2NrKGh3bmQpOworICAgIEdsb2JhbFVubG9jayh3bmRQdHItPmh3bmRQYXJlbnQpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV0lER0VUU19TY3JvbGxCYXJXbmRQcm9jCisgKi8KK0xPTkcgU0NST0xMQkFSX1Njcm9sbEJhclduZFByb2MoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLAorCQkJICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3sgICAgCisgICAgV09SRAl3UmV0OworICAgIHNob3J0CXgsIHk7CisgICAgV05EICAJKnduZFB0cjsKKyAgICBMUEhFQURTQ1JPTEwgbHBoczsKKyAgICBSRUNUIHJlY3Q7CisgICAgc3RhdGljIFJFQ1QgcmVjdHNlbDsKKyAgICBzd2l0Y2gobWVzc2FnZSkKKyAgICB7CisgICAgY2FzZSBXTV9DUkVBVEU6CisJQ3JlYXRlU2Nyb2xsQmFyU3RydWN0KGh3bmQpOworI2lmZGVmIERFQlVHX1NDUk9MTAorICAgICAgICBwcmludGYoIlNjcm9sbEJhciBDcmVhdGlvbiB1cD0lWCBkb3duPSVYIVxuIiwgbHBocy0+aFduZFVwLCBscGhzLT5oV25kRG93bik7CisjZW5kaWYKKwlyZXR1cm4gMDsKKyAgICBjYXNlIFdNX0RFU1RST1k6CisJbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisJRGVzdHJveVdpbmRvdyhscGhzLT5oV25kVXApOworCURlc3Ryb3lXaW5kb3cobHBocy0+aFduZERvd24pOworCWZyZWUobHBocyk7CisgICAgICAgIHByaW50ZigiU2Nyb2xsQmFyIFdNX0RFU1RST1kgIVxuIik7CisJcmV0dXJuIDA7CisJCisgICAgY2FzZSBXTV9DT01NQU5EOgorI2lmZGVmIERFQlVHX1NDUk9MTAorICAgICAgICBwcmludGYoIlNjcm9sbEJhciBXTV9DT01NQU5EIHdQYXJhbT0lWCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKKyNlbmRpZgorCWxwaHMgPSBTY3JvbGxCYXJHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOworCWlmIChISVdPUkQobFBhcmFtKSAhPSBCTl9DTElDS0VEKSByZXR1cm4gMDsKKyAgICAgICAgaWYgKExPV09SRChsUGFyYW0pID09IGxwaHMtPmhXbmRVcCkKKyAgICAgICAgICAgIFNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgbHBocy0+RGlyZWN0aW9uLCAKKyAgICAgICAgICAgIAlTQl9MSU5FVVAsIE1BS0VMT05HKDAsIGh3bmQpKTsKKyAgICAgICAgaWYgKExPV09SRChsUGFyYW0pID09IGxwaHMtPmhXbmREb3duKQorICAgICAgICAgICAgU2VuZE1lc3NhZ2Uod25kUHRyLT5od25kUGFyZW50LCBscGhzLT5EaXJlY3Rpb24sIAorICAgICAgICAgICAgCVNCX0xJTkVET1dOLCBNQUtFTE9ORygwLCBod25kKSk7CisJcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgorCWxwaHMgPSBTY3JvbGxCYXJHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOworCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworCWlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkgeworCSAgICB5ID0gSElXT1JEKGxQYXJhbSk7CisjaWZkZWYgREVCVUdfU0NST0xMCisJICAgIHByaW50ZigiV01fTEJVVFRPTkRPV04geT0lZCBjdXIrcmlnaHQ9JWQgJWRcbiIsIAorCSAgICAJeSwgbHBocy0+Q3VyUGl4ICsgcmVjdC5yaWdodCwgbHBocy0+Q3VyUGl4ICsgKHJlY3QucmlnaHQgPDwgMSkpOworI2VuZGlmCisJICAgIGlmICh5IDwgKGxwaHMtPkN1clBpeCArIHJlY3QucmlnaHQpKSAKKwkgICAgICAgIFNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgbHBocy0+RGlyZWN0aW9uLCAKKwkgICAgICAgIAlTQl9QQUdFVVAsIE1BS0VMT05HKDAsIGh3bmQpKTsKKwkgICAgaWYgKHkgPiAobHBocy0+Q3VyUGl4ICsgKHJlY3QucmlnaHQgPDwgMSkpKSAKKwkgICAgICAgIFNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgbHBocy0+RGlyZWN0aW9uLCAKKwkgICAgICAgIAlTQl9QQUdFRE9XTiwgTUFLRUxPTkcoMCwgaHduZCkpOworCSAgICBpZiAoKHkgPiAobHBocy0+Q3VyUGl4ICsgcmVjdC5yaWdodCkpICYmCisJICAgICAgICAoeSA8IChscGhzLT5DdXJQaXggKyAocmVjdC5yaWdodCA8PCAxKSkpKSB7CisJICAgICAgICBscGhzLT5UaHVtYkFjdGl2ZSA9IFRSVUU7CisjaWZkZWYgREVCVUdfU0NST0xMCisJICAgICAgICBwcmludGYoIlRIVU1CIERPV04gIVxuIik7CisjZW5kaWYKKwkgICAgICAgIH0KKwkgICAgfQorCWVsc2UgeworCSAgICB4ID0gTE9XT1JEKGxQYXJhbSk7CisjaWZkZWYgREVCVUdfU0NST0xMCisJICAgIHByaW50ZigiV01fTEJVVFRPTkRPV04geD0lZCBDdXIrYm90dG9tPSVkICVkXG4iLAorCSAgICAJIHgsIGxwaHMtPkN1clBpeCArIHJlY3QuYm90dG9tLCBscGhzLT5DdXJQaXggKyAocmVjdC5ib3R0b20gPDwgMSkpOworI2VuZGlmCisJICAgIGlmICh4IDwgKGxwaHMtPkN1clBpeCArIHJlY3QuYm90dG9tKSkKKwkgICAgICAgIFNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgbHBocy0+RGlyZWN0aW9uLCAKKwkgICAgICAgIAlTQl9QQUdFVVAsIE1BS0VMT05HKDAsIGh3bmQpKTsKKwkgICAgaWYgKHggPiAobHBocy0+Q3VyUGl4ICsgKHJlY3QuYm90dG9tIDw8IDEpKSkKKwkgICAgICAgIFNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgbHBocy0+RGlyZWN0aW9uLCAKKwkgICAgICAgIAlTQl9QQUdFRE9XTiwgTUFLRUxPTkcoMCwgaHduZCkpOworCSAgICBpZiAoKHggPiAobHBocy0+Q3VyUGl4ICsgcmVjdC5ib3R0b20pKSAmJgorCQkoeCA8IChscGhzLT5DdXJQaXggKyAocmVjdC5ib3R0b20gPDwgMSkpKSkgeworCSAgICAgICAgbHBocy0+VGh1bWJBY3RpdmUgPSBUUlVFOworI2lmZGVmIERFQlVHX1NDUk9MTAorCSAgICAgICAgcHJpbnRmKCJUSFVNQiBET1dOICFcbiIpOworI2VuZGlmCisJCX0KKwkgICAgfQorCWJyZWFrOworICAgIGNhc2UgV01fTEJVVFRPTlVQOgorICAgICAgICBscGhzLT5UaHVtYkFjdGl2ZSA9IEZBTFNFOworCWJyZWFrOworCisgICAgY2FzZSBXTV9LRVlET1dOOgorICAgICAgICBwcmludGYoIlNjcm9sbEJhciBXTV9LRVlET1dOIHdQYXJhbSAlWCFcbiIsIHdQYXJhbSk7CisJYnJlYWs7CisgICAgY2FzZSBXTV9QQUlOVDoKKwlTdGREcmF3U2Nyb2xsQmFyKGh3bmQpOworCWJyZWFrOworICAgIGNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICBpZiAoKHdQYXJhbSAmIE1LX0xCVVRUT04pICE9IDApIHsKKwkgICAgbHBocyA9IFNjcm9sbEJhckdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CisJICAgIGlmIChscGhzLT5UaHVtYkFjdGl2ZSA9PSAwKSBicmVhazsKKwkgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7CisJICAgIGlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkKKwkJeSA9IEhJV09SRChsUGFyYW0pIC0gcmVjdC5yaWdodCAtIChyZWN0LnJpZ2h0ID4+IDEpOworCSAgICBlbHNlCisJCXkgPSBMT1dPUkQobFBhcmFtKSAtIHJlY3QuYm90dG9tIC0gKHJlY3QuYm90dG9tID4+IDEpOworCSAgICB4ID0gKHkgKiAobHBocy0+TWF4VmFsIC0gbHBocy0+TWluVmFsKSAvIAorCSAgICAJCWxwaHMtPk1heFBpeCkgKyBscGhzLT5NaW5WYWw7CisjaWZkZWYgREVCVUdfU0NST0xMCisJICAgIHByaW50ZigiV01fTU9VU0VNT1ZFIHZhbD0lZCBwaXg9JWRcbiIsIHgsIHkpOworI2VuZGlmCisgICAgICAgICAgICBTZW5kTWVzc2FnZSh3bmRQdHItPmh3bmRQYXJlbnQsIGxwaHMtPkRpcmVjdGlvbiwgCisgICAgICAgICAgICAJCVNCX1RIVU1CVFJBQ0ssIE1BS0VMT05HKHgsIGh3bmQpKTsKKwkgICAgfQorCWJyZWFrOworICAgIGRlZmF1bHQ6CisJcmV0dXJuIERlZldpbmRvd1Byb2MoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CisgICAgfQorcmV0dXJuKDApOworfQorCisKKworTFBIRUFEU0NST0xMIFNjcm9sbEJhckdldFdpbmRvd0FuZFN0b3JhZ2UoSFdORCBod25kLCBXTkQgKip3bmRQdHIpCit7CisgICAgV05EICAqUHRyOworICAgIExQSEVBRFNDUk9MTCBscGhzOworICAgICood25kUHRyKSA9IFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIGxwaHMgPSAqKChMUEhFQURTQ1JPTEwgKikmUHRyLT53RXh0cmFbMV0pOworICAgIHJldHVybiBscGhzOworfQorCisKK0xQSEVBRFNDUk9MTCBTY3JvbGxCYXJHZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgICBXTkQgICp3bmRQdHI7CisgICAgTFBIRUFEU0NST0xMIGxwaHM7CisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgbHBocyA9ICooKExQSEVBRFNDUk9MTCAqKSZ3bmRQdHItPndFeHRyYVsxXSk7CisgICAgcmV0dXJuIGxwaHM7Cit9CisKKwordm9pZCBTdGREcmF3U2Nyb2xsQmFyKEhXTkQgaHduZCkKK3sKKwlMUEhFQURTQ1JPTEwgbHBoczsKKwlQQUlOVFNUUlVDVCBwczsKKwlIQlJVU0ggaEJydXNoOworCUhEQyBoZGM7CisJUkVDVCByZWN0OworCVVJTlQgIGksIHcsIGgsIHNpejsKKwljaGFyCUNbMTI4XTsKKwloZGMgPSBCZWdpblBhaW50KCBod25kLCAmcHMgKTsKKwloQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCAoV09SRCloZGMsCisJCSAgICBNQUtFTE9ORyhod25kLCBDVExDT0xPUl9TQ1JPTExCQVIpKTsKKwlpZiAoaEJydXNoID09IChIQlJVU0gpTlVMTCkgIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCk7CisJbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisJaWYgKGxwaHMgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OworCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworCXcgPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworCWggPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOworCWlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkgeworCSAgICByZWN0LnRvcCArPSB3OworCSAgICByZWN0LmJvdHRvbSAtPSB3OworCSAgICB9CisJZWxzZSB7CisJICAgIHJlY3QubGVmdCArPSBoOworCSAgICByZWN0LnJpZ2h0IC09IGg7CisJICAgIH0KKwlGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworCWlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkKKwkgICAgU2V0UmVjdCgmcmVjdCwgMCwgbHBocy0+Q3VyUGl4ICsgdywgCisJICAgIAkJdywgbHBocy0+Q3VyUGl4ICsgKHcgPDwgMSkpOworCWVsc2UKKwkgICAgU2V0UmVjdCgmcmVjdCwgbHBocy0+Q3VyUGl4ICsgaCwgCisJICAgIAkJMCwgbHBocy0+Q3VyUGl4ICsgKGggPDwgMSksIGgpOworCUZyYW1lUmVjdChoZGMsICZyZWN0LCBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOworCUluZmxhdGVSZWN0KCZyZWN0LCAtMSwgLTEpOworCUZpbGxSZWN0KGhkYywgJnJlY3QsIEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCkpOworCURyYXdSZWxpZWZSZWN0KGhkYywgcmVjdCwgMiwgMCk7CisJSW5mbGF0ZVJlY3QoJnJlY3QsIC0zLCAtMyk7CisJRHJhd1JlbGllZlJlY3QoaGRjLCByZWN0LCAxLCAxKTsKK0VuZE9mUGFpbnQ6CisJRW5kUGFpbnQoIGh3bmQsICZwcyApOworICAgICAgICBJbnZhbGlkYXRlUmVjdChscGhzLT5oV25kVXAsIE5VTEwsIFRSVUUpOworICAgICAgICBVcGRhdGVXaW5kb3cobHBocy0+aFduZFVwKTsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QobHBocy0+aFduZERvd24sIE5VTEwsIFRSVUUpOworICAgICAgICBVcGRhdGVXaW5kb3cobHBocy0+aFduZERvd24pOworfQorCisKKworaW50IENyZWF0ZVNjcm9sbEJhclN0cnVjdChIV05EIGh3bmQpCit7CisgICAgUkVDVAlyZWN0OworICAgIGludAkJd2lkdGgsIGhlaWdodDsKKyAgICBXTkQgICp3bmRQdHI7CisgICAgTFBIRUFEU0NST0xMIGxwaHM7CisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgbHBocyA9IChMUEhFQURTQ1JPTEwpbWFsbG9jKHNpemVvZihIRUFEU0NST0xMKSk7CisgICAgKigoTFBIRUFEU0NST0xMICopJnduZFB0ci0+d0V4dHJhWzFdKSA9IGxwaHM7CisgICAgbHBocy0+VGh1bWJBY3RpdmU7CisgICAgbHBocy0+TWluVmFsID0gMDsKKyAgICBscGhzLT5NYXhWYWwgPSAxMDA7CisgICAgbHBocy0+Q3VyVmFsID0gMDsKKyAgICBscGhzLT5DdXJQaXggPSAwOworICAgIHdpZHRoID0gd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQ7CisgICAgaGVpZ2h0ID0gd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3A7CisgICAgbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaHMgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKHdpZHRoIDw9IGhlaWdodCkKKwl7CisJbHBocy0+TWF4UGl4ID0gaGVpZ2h0IC0gMyAqIHdpZHRoOworCWxwaHMtPkRpcmVjdGlvbiA9IFdNX1ZTQ1JPTEw7CisJbHBocy0+aFduZFVwID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiIiwgCisgICAgICAgIAlXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorICAgICAgICAJMCwgMCwgd2lkdGgsIHdpZHRoLCBod25kLCAxLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOworCWxwaHMtPmhXbmREb3duID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiIiwgCisgICAgICAgIAlXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorICAgICAgICAJMCwgaGVpZ2h0IC0gd2lkdGgsIHdpZHRoLCB3aWR0aCwgaHduZCwgMiwKKyAgICAgICAgCXduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJfQorICAgIGVsc2UKKwl7CisJbHBocy0+TWF4UGl4ID0gd2lkdGggLSAzICogaGVpZ2h0OworCWxwaHMtPkRpcmVjdGlvbiA9IFdNX0hTQ1JPTEw7CisJbHBocy0+aFduZFVwID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiIiwgCisgICAgICAgIAlXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorICAgICAgICAJMCwgMCwgaGVpZ2h0LCBoZWlnaHQsIGh3bmQsIDAsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJbHBocy0+aFduZERvd24gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsICIiLCAKKyAgICAgICAgCVdTX0NISUxEIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCisgICAgICAgIAl3aWR0aCAtIGhlaWdodCwgMCwgaGVpZ2h0LCBoZWlnaHQsIGh3bmQsIDAsCisgICAgICAgIAl3bmRQdHItPmhJbnN0YW5jZSwgMEwpOworCX0KKyAgICBpZiAobHBocy0+TWF4UGl4IDwgMSkgIGxwaHMtPk1heFBpeCA9IDE7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCitpbnQgR2V0U2Nyb2xsUG9zKEhXTkQgaHduZCwgaW50IG5CYXIpCit7CisgICAgTFBIRUFEU0NST0xMIGxwaHM7CisgICAgbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaHMgPT0gTlVMTCkgcmV0dXJuOworICAgIHJldHVybiBscGhzLT5DdXJWYWw7Cit9CisKKworCit2b2lkIEdldFNjcm9sbFJhbmdlKEhXTkQgaHduZCwgaW50IG5CYXIsIExQSU5UIGxwTWluLCBMUElOVCBscE1heCkKK3sKKyAgICBMUEhFQURTQ1JPTEwgbHBoczsKKyAgICBscGhzID0gU2Nyb2xsQmFyR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICBpZiAobHBocyA9PSBOVUxMKSByZXR1cm47CisgICAgKmxwTWluID0gbHBocy0+TWluVmFsOworICAgICpscE1heCA9IGxwaHMtPk1heFZhbDsKK30KKworCisKK2ludCBTZXRTY3JvbGxQb3MoSFdORCBod25kLCBpbnQgbkJhciwgaW50IG5Qb3MsIEJPT0wgYlJlZHJhdykKK3sKKyAgICBpbnQgblJldDsKKyAgICBMUEhFQURTQ1JPTEwgbHBoczsKKyAgICBscGhzID0gU2Nyb2xsQmFyR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICBpZiAobHBocyA9PSBOVUxMKSByZXR1cm47CisgICAgblJldCA9IGxwaHMtPkN1clZhbDsKKyAgICBscGhzLT5DdXJWYWwgPSAoc2hvcnQpblBvczsKKyAgICBpZiAobHBocy0+TWF4VmFsICE9IGxwaHMtPk1pblZhbCkKKwlscGhzLT5DdXJQaXggPSBscGhzLT5NYXhQaXggKiAoYWJzKChzaG9ydCluUG9zKSAtIGFicyhscGhzLT5NaW5WYWwpKSAvIAorICAgIAkJKGFicyhscGhzLT5NYXhWYWwpIC0gYWJzKGxwaHMtPk1pblZhbCkpOworICAgIGlmIChscGhzLT5DdXJQaXggPiBscGhzLT5NYXhQaXgpICBscGhzLT5DdXJQaXggPSBscGhzLT5NYXhQaXg7CisjaWZkZWYgREVCVUdfU0NST0xMCisgICAgcHJpbnRmKCJTZXRTY3JvbGxQb3MgdmFsPSVkIHBpeHZhbD0lZCBwaXhtYXglZFxuIiwKKwkgICAgKHNob3J0KW5Qb3MsIGxwaHMtPkN1clBpeCwgbHBocy0+TWF4UGl4KTsKKyAgICBwcmludGYoIlNldFNjcm9sbFBvcyBtaW49JWQgbWF4PSVkXG4iLCAKKwkgICAgbHBocy0+TWluVmFsLCBscGhzLT5NYXhWYWwpOworI2VuZGlmCisgICAgaWYgKGJSZWRyYXcpIHsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKyAgICAgICAgfQorICAgIHJldHVybiBuUmV0OworfQorCisKKwordm9pZCBTZXRTY3JvbGxSYW5nZShIV05EIGh3bmQsIGludCBuQmFyLCBpbnQgTWluUG9zLCBpbnQgTWF4UG9zLCBCT09MIGJSZWRyYXcpCit7CisgICAgTFBIRUFEU0NST0xMIGxwaHM7CisgICAgbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaHMgPT0gTlVMTCkgcmV0dXJuOworICAgIGxwaHMtPk1pblZhbCA9IChzaG9ydClNaW5Qb3M7CisgICAgbHBocy0+TWF4VmFsID0gKHNob3J0KU1heFBvczsKKyAgICBpZiAobHBocy0+TWF4VmFsICE9IGxwaHMtPk1pblZhbCkKKwlscGhzLT5DdXJQaXggPSBhYnMobHBocy0+TWF4VmFsKSAqIAorCQkoYWJzKGxwaHMtPkN1clZhbCkgLSBhYnMobHBocy0+TWluVmFsKSkgLyAKKyAgICAJCShhYnMobHBocy0+TWF4VmFsKSAtIGFicyhscGhzLT5NaW5WYWwpKTsKKyAgICBpZiAobHBocy0+Q3VyUGl4ID4gbHBocy0+TWF4UGl4KSAgbHBocy0+Q3VyUGl4ID0gbHBocy0+TWF4UGl4OworI2lmZGVmIERFQlVHX1NDUk9MTAorICAgIHByaW50ZigiU2V0U2Nyb2xsUmFuZ2UgbWluPSVkIG1heD0lZFxuIiwgbHBocy0+TWluVmFsLCBscGhzLT5NYXhWYWwpOworI2VuZGlmCisgICAgaWYgKGJSZWRyYXcpIHsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKyAgICAgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXRpYy5jIGIvY29udHJvbHMvc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlNWZiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyb2xzL3N0YXRpYy5jCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogU3RhdGljIGNvbnRyb2wKKyAqCisgKiBDb3B5cmlnaHQgIERhdmlkIFcuIE1ldGNhbGZlLCAxOTkzCisgKgorICovCisKK3N0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAgRGF2aWQgVy4gTWV0Y2FsZmUsIDE5OTMiOworCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgInVzZXIuaCIKKworTE9ORyBTdGF0aWNXbmRQcm9jKEhXTkQgaFduZCwgV09SRCB1TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOworCitzdGF0aWMgTE9ORyBQYWludFRleHRmbihIV05EIGh3bmQpOworc3RhdGljIExPTkcgUGFpbnRSZWN0Zm4oSFdORCBod25kKTsKK3N0YXRpYyBMT05HIFBhaW50RnJhbWVmbihIV05EIGh3bmQpOworCitzdGF0aWMgQ09MT1JSRUYgY29sb3Jfd2luZG93ZnJhbWUsIGNvbG9yX2JhY2tncm91bmQsIGNvbG9yX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3Jfd2luZG93dGV4dDsKKworI2RlZmluZSBOT1RJRllfUEFSRU5UKGhXbmRDbnRybCwgd05vdGlmeUNvZGUpIFwKKwlTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZENudHJsKSwgV01fQ09NTUFORCwgXAorCQkgICAgR2V0RGxnQ3RybElEKGhXbmRDbnRybCksIE1BS0VMUEFSQU0oaFduZENudHJsLCB3Tm90aWZ5Q29kZSkpOworI2RlZmluZSBESU0oYXJyYXkpCSgoc2l6ZW9mIGFycmF5KS8oc2l6ZW9mIGFycmF5WzBdKSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMT05HICgqcGFpbnRmbikoKTsKK30gU1RBVElDRk47CisKKyNkZWZpbmUgTUFYX1NUQVRJQ19UWVBFICAxMgorCitzdGF0aWMgU1RBVElDRk4gc3RhdGljZm5bTUFYX1NUQVRJQ19UWVBFXSA9Cit7CisgICAgeyAoTE9ORygqKSgpKVBhaW50VGV4dGZuIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19MRUZUICovCisgICAgeyAoTE9ORygqKSgpKVBhaW50VGV4dGZuIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19DRU5URVIgKi8KKyAgICB7IChMT05HKCopKCkpUGFpbnRUZXh0Zm4gfSwgICAgICAgICAgICAgICAgICAgIC8qIFNTX1JJR0hUICovCisgICAgeyAoTE9ORygqKSgpKU5VTEwgICAgICAgIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19JQ09OICovCisgICAgeyAoTE9ORygqKSgpKVBhaW50UmVjdGZuIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19CTEFDS1JFQ1QgKi8KKyAgICB7IChMT05HKCopKCkpUGFpbnRSZWN0Zm4gfSwgICAgICAgICAgICAgICAgICAgIC8qIFNTX0dSQVlSRUNUICovCisgICAgeyAoTE9ORygqKSgpKVBhaW50UmVjdGZuIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19XSElURVJFQ1QgKi8KKyAgICB7IChMT05HKCopKCkpUGFpbnRGcmFtZWZuIH0sICAgICAgICAgICAgICAgICAgIC8qIFNTX0JMQUNLRlJBTUUgKi8KKyAgICB7IChMT05HKCopKCkpUGFpbnRGcmFtZWZuIH0sICAgICAgICAgICAgICAgICAgIC8qIFNTX0dSQVlGUkFNRSAqLworICAgIHsgKExPTkcoKikoKSlQYWludEZyYW1lZm4gfSwgICAgICAgICAgICAgICAgICAgLyogU1NfV0hJVEVGUkFNRSAqLworICAgIHsgKExPTkcoKikoKSlQYWludFRleHRmbiB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfU0lNUExFICovCisgICAgeyAoTE9ORygqKSgpKVBhaW50VGV4dGZuIH0gICAgICAgICAgICAgICAgICAgICAvKiBTU19MRUZUTk9XT1JEV1JBUCAqLworfTsKKworCitMT05HIFN0YXRpY1duZFByb2MoSFdORCBoV25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKwlMT05HIGxSZXN1bHQgPSAwOworCUhEQyBoREM7CisJUkVDVCByYzsKKwlMUFNUUiB0ZXh0UHRyOworCisJV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKwlMT05HIHN0eWxlID0gd25kUHRyLT5kd1N0eWxlICYgMHgwMDAwMDAwRjsKKworCXN3aXRjaCAodU1zZykgeworCWNhc2UgV01fRU5BQkxFOgorCSAgICBJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBGQUxTRSk7CisJICAgIGJyZWFrOworCisJY2FzZSBXTV9DUkVBVEU6CisJICAgIGlmIChzdHlsZSA8IDBMIHx8IHN0eWxlID49IChMT05HKURJTShzdGF0aWNmbikpCisJCWxSZXN1bHQgPSAtMUw7CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBpbml0aWFsaXNlIGNvbG91cnMgKi8KKwkJY29sb3Jfd2luZG93ZnJhbWUgID0gR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XRlJBTUUpOworCQljb2xvcl9iYWNrZ3JvdW5kICAgPSBHZXRTeXNDb2xvcihDT0xPUl9CQUNLR1JPVU5EKTsKKwkJY29sb3Jfd2luZG93ICAgICAgID0gR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XKTsKKwkJY29sb3Jfd2luZG93dGV4dCAgID0gR2V0U3lzQ29sb3IoQ09MT1JfV0lORE9XVEVYVCk7CisJCWxSZXN1bHQgPSAwTDsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgV01fUEFJTlQ6CisJICAgIGlmIChzdGF0aWNmbltzdHlsZV0ucGFpbnRmbikKKwkJKHN0YXRpY2ZuW3N0eWxlXS5wYWludGZuKShoV25kKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFdNX1NZU0NPTE9SQ0hBTkdFOgorCSAgICBjb2xvcl93aW5kb3dmcmFtZSAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dGUkFNRSk7CisJICAgIGNvbG9yX2JhY2tncm91bmQgICA9IEdldFN5c0NvbG9yKENPTE9SX0JBQ0tHUk9VTkQpOworCSAgICBjb2xvcl93aW5kb3cgICAgICAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1cpOworCSAgICBjb2xvcl93aW5kb3d0ZXh0ICAgPSBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1dURVhUKTsKKwkgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgVFJVRSk7CisJICAgIGJyZWFrOworCisJY2FzZSBXTV9TRVRURVhUOgorCSAgICBpZiAod25kUHRyLT5oVGV4dCkKKwkJVVNFUl9IRUFQX0ZSRUUod25kUHRyLT5oVGV4dCk7CisKKwkgICAgd25kUHRyLT5oVGV4dCA9IFVTRVJfSEVBUF9BTExPQyhHTUVNX01PVkVBQkxFLCAKKwkJCQkJICAgIHN0cmxlbigoTFBTVFIpbFBhcmFtKSArIDEpOworCSAgICB0ZXh0UHRyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKHduZFB0ci0+aFRleHQpOworCSAgICBzdHJjcHkodGV4dFB0ciwgKExQU1RSKWxQYXJhbSk7CisJICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIFRSVUUpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJCWxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jKGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisJfQorCisJR2xvYmFsVW5sb2NrKGhXbmQpOworCXJldHVybiBsUmVzdWx0OworfQorCisKK3N0YXRpYyBMT05HIFBhaW50VGV4dGZuKEhXTkQgaHduZCkKK3sKKyAgICBQQUlOVFNUUlVDVCBwczsKKyAgICBSRUNUIHJjOworICAgIEhEQyBoZGM7CisgICAgSEJSVVNIIGhCcnVzaDsKKyAgICBIQU5ETEUgaFRleHQ7CisgICAgY2hhciAqdGV4dDsKKyAgICBpbnQgdGV4dGxlbjsKKyAgICBXT1JEIHdGb3JtYXQ7CisKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIExPTkcgc3R5bGUgPSB3bmRQdHItPmR3U3R5bGU7CisKKyAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7CisgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmMpOworCisgICAgdGV4dGxlbiA9IEdldFdpbmRvd1RleHRMZW5ndGgoaHduZCk7CisgICAgaFRleHQgPSBMb2NhbEFsbG9jKExNRU1fTU9WRUFCTEUsIHRleHRsZW4rMSk7CisgICAgdGV4dCA9IExvY2FsTG9jayhoVGV4dCk7CisgICAgR2V0V2luZG93VGV4dChod25kLCB0ZXh0LCB0ZXh0bGVuKzEpOworCisgICAgc3dpdGNoIChzdHlsZSAmIDB4MDAwMDAwMEYpCisgICAgeworICAgIGNhc2UgU1NfTEVGVDoKKwl3Rm9ybWF0ID0gRFRfTEVGVCB8IERUX0VYUEFORFRBQlMgfCBEVF9XT1JEQlJFQUs7CisJYnJlYWs7CisKKyAgICBjYXNlIFNTX0NFTlRFUjoKKwl3Rm9ybWF0ID0gRFRfQ0VOVEVSIHwgRFRfRVhQQU5EVEFCUyB8IERUX1dPUkRCUkVBSzsKKwlicmVhazsKKworICAgIGNhc2UgU1NfUklHSFQ6CisJd0Zvcm1hdCA9IERUX1JJR0hUIHwgRFRfRVhQQU5EVEFCUyB8IERUX1dPUkRCUkVBSzsKKwlicmVhazsKKworICAgIGNhc2UgU1NfU0lNUExFOgorCXdGb3JtYXQgPSBEVF9MRUZUIHwgRFRfU0lOR0xFTElORSB8IERUX1ZDRU5URVI7CisJYnJlYWs7CisKKyAgICBjYXNlIFNTX0xFRlROT1dPUkRXUkFQOgorCXdGb3JtYXQgPSBEVF9MRUZUIHwgRFRfU0lOR0xFTElORSB8IERUX0VYUEFORFRBQlMgfCBEVF9WQ0VOVEVSOworCWJyZWFrOworICAgIH0KKworICAgIGlmIChzdHlsZSAmIFNTX05PUFJFRklYKQorCXdGb3JtYXQgfD0gRFRfTk9QUkVGSVg7CisKKyAgICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCAoV09SRCloZGMsCisJCSAgICBNQUtFTE9ORyhod25kLCBDVExDT0xPUl9TVEFUSUMpKTsKKyAgICBpZiAoaEJydXNoID09IChIQlJVU0gpTlVMTCkgaEJydXNoID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOworICAgIEZpbGxSZWN0KGhkYywgJnJjLCBoQnJ1c2gpOworICAgIERyYXdUZXh0KGhkYywgdGV4dCwgdGV4dGxlbiwgJnJjLCB3Rm9ybWF0KTsKKworICAgIExvY2FsVW5sb2NrKGhUZXh0KTsKKyAgICBMb2NhbEZyZWUoaFRleHQpOworICAgIEdsb2JhbFVubG9jayhod25kKTsKKyAgICBFbmRQYWludChod25kLCAmcHMpOworfQorCitzdGF0aWMgTE9ORyBQYWludFJlY3RmbihIV05EIGh3bmQpCit7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgUkVDVCByYzsKKyAgICBIREMgaGRjOworICAgIEhQRU4gaE9sZFBlbiwgaFBlbjsKKyAgICBIQlJVU0ggaE9sZEJydXNoLCBoQnJ1c2g7CisKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCisgICAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJjKTsKKyAgICAKKyAgICBzd2l0Y2ggKHduZFB0ci0+ZHdTdHlsZSAmIDB4MDAwMDAwMEYpCisgICAgeworICAgIGNhc2UgU1NfQkxBQ0tSRUNUOgorCWhQZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIGNvbG9yX3dpbmRvd2ZyYW1lKTsKKwloQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKGNvbG9yX3dpbmRvd2ZyYW1lKTsKKwlicmVhazsKKworICAgIGNhc2UgU1NfR1JBWVJFQ1Q6CisJaFBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgY29sb3JfYmFja2dyb3VuZCk7CisJaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaChjb2xvcl9iYWNrZ3JvdW5kKTsKKwlicmVhazsKKworICAgIGNhc2UgU1NfV0hJVEVSRUNUOgorCWhQZW4gPSBDcmVhdGVQZW4oUFNfU09MSUQsIDEsIGNvbG9yX3dpbmRvdyk7CisJaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaChjb2xvcl93aW5kb3cpOworCWJyZWFrOworICAgIH0KKworICAgIGhPbGRQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QoaGRjLCAoSEFORExFKWhQZW4pOworICAgIGhPbGRCcnVzaCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGhkYywgKEhBTkRMRSloQnJ1c2gpOworICAgIFJlY3RhbmdsZShoZGMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQsIHJjLmJvdHRvbSk7CisKKyAgICBTZWxlY3RPYmplY3QoaGRjLCAoSEFORExFKWhPbGRQZW4pOworICAgIFNlbGVjdE9iamVjdChoZGMsIChIQU5ETEUpaE9sZEJydXNoKTsKKyAgICBEZWxldGVPYmplY3QoKEhBTkRMRSloUGVuKTsKKyAgICBEZWxldGVPYmplY3QoKEhBTkRMRSloQnJ1c2gpOworCisgICAgR2xvYmFsVW5sb2NrKGh3bmQpOworICAgIEVuZFBhaW50KGh3bmQsICZwcyk7Cit9CisKK3N0YXRpYyBMT05HIFBhaW50RnJhbWVmbihIV05EIGh3bmQpCit7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgUkVDVCByYzsKKyAgICBIREMgaGRjOworICAgIEhQRU4gaE9sZFBlbiwgaFBlbjsKKyAgICBIQlJVU0ggaE9sZEJydXNoLCBoQnJ1c2g7CisKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCisgICAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJjKTsKKyAgICAKKyAgICBzd2l0Y2ggKHduZFB0ci0+ZHdTdHlsZSAmIDB4MDAwMDAwMEYpCisgICAgeworICAgIGNhc2UgU1NfQkxBQ0tGUkFNRToKKwloUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCBjb2xvcl93aW5kb3dmcmFtZSk7CisJYnJlYWs7CisKKyAgICBjYXNlIFNTX0dSQVlGUkFNRToKKwloUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCBjb2xvcl9iYWNrZ3JvdW5kKTsKKwlicmVhazsKKworICAgIGNhc2UgU1NfV0hJVEVGUkFNRToKKwloUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCBjb2xvcl93aW5kb3cpOworCWJyZWFrOworICAgIH0KKworICAgIGhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goY29sb3Jfd2luZG93KTsKKyAgICBoT2xkUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhkYywgKEhBTkRMRSloUGVuKTsKKyAgICBoT2xkQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChoZGMsIChIQU5ETEUpaEJydXNoKTsKKyAgICBSZWN0YW5nbGUoaGRjLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOworCisgICAgU2VsZWN0T2JqZWN0KGhkYywgKEhBTkRMRSloT2xkUGVuKTsKKyAgICBTZWxlY3RPYmplY3QoaGRjLCAoSEFORExFKWhPbGRCcnVzaCk7CisgICAgRGVsZXRlT2JqZWN0KChIQU5ETEUpaFBlbik7CisgICAgRGVsZXRlT2JqZWN0KChIQU5ETEUpaEJydXNoKTsKKworICAgIEdsb2JhbFVubG9jayhod25kKTsKKyAgICBFbmRQYWludChod25kLCAmcHMpOworfQorCisKKworCisKKworCmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggOTAyNzJlNS4uNjczMzQ4NiAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtOCwyMSArOCwzMiBAQAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImRpYWxvZy5oIgogCiAKIExPTkcgQnV0dG9uV25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotc3RhdGljIExPTkcgV0lER0VUU19TdGF0aWNXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwKK0xPTkcgU3RhdGljV25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworCitMT05HIFNDUk9MTEJBUl9TY3JvbGxCYXJXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwKKwkJCQkgICBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK0xPTkcgTElTVEJPWF9MaXN0Qm94V25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsCisJCQkJICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitMT05HIENPTUJPQk9YX0NvbWJvQm94V25kUHJvYyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsCiAJCQkJICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CiAKLSNkZWZpbmUgTkJfQlVJTFRJTl9DTEFTU0VTICAyCiAKLXN0YXRpYyBXTkRDTEFTUyBXSURHRVRTX0J1aWx0aW5DbGFzc2VzW05CX0JVSUxUSU5fQ0xBU1NFU10gPQorc3RhdGljIFdORENMQVNTIFdJREdFVFNfQnVpbHRpbkNsYXNzZXNbXSA9CiB7Ci0gICAgeyAwLCAoTE9ORygqKSgpKUJ1dHRvblduZFByb2MsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsICJCVVRUT04iIH0sCi0gICAgeyAwLCAoTE9ORygqKSgpKVdJREdFVFNfU3RhdGljV25kUHJvYywgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgIlNUQVRJQyIgfQorICAgIHsgMCwgKExPTkcoKikoKSlCdXR0b25XbmRQcm9jLCAwLCAyLCAwLCAwLCAwLCAwLCBOVUxMLCAiQlVUVE9OIiB9LAorICAgIHsgMCwgKExPTkcoKikoKSlTdGF0aWNXbmRQcm9jLCAwLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCAiU1RBVElDIiB9LAorICAgIHsgMCwgKExPTkcoKikoKSlTQ1JPTExCQVJfU2Nyb2xsQmFyV25kUHJvYywgMCwgOCwgMCwgMCwgMCwgMCwgTlVMTCwgIlNDUk9MTEJBUiIgfSwKKyAgICB7IDAsIChMT05HKCopKCkpTElTVEJPWF9MaXN0Qm94V25kUHJvYywgMCwgOCwgMCwgMCwgMCwgMCwgTlVMTCwgIkxJU1RCT1giIH0sCisgICAgeyAwLCAoTE9ORygqKSgpKUNPTUJPQk9YX0NvbWJvQm94V25kUHJvYywgMCwgOCwgMCwgMCwgMCwgMCwgTlVMTCwgIkNPTUJPQk9YIiB9LAorICAgIHsgMCwgKExPTkcoKikoKSlEZWZEbGdQcm9jLCAwLCBETEdXSU5ET1dFWFRSQSwgMCwgMCwgMCwgMCwgTlVMTCwgRElBTE9HX0NMQVNTX05BTUUgfQogfTsKIAotc3RhdGljIEZBUlBST0MgV25kUHJvYzMyW05CX0JVSUxUSU5fQ0xBU1NFU107CisjZGVmaW5lIE5CX0JVSUxUSU5fQ0xBU1NFUyBcCisgICAgICAgICAoc2l6ZW9mKFdJREdFVFNfQnVpbHRpbkNsYXNzZXMpL3NpemVvZihXSURHRVRTX0J1aWx0aW5DbGFzc2VzWzBdKSkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMzLDU2ICs0NCw5IEBACiBCT09MIFdJREdFVFNfSW5pdCgpCiB7CiAgICAgaW50IGk7Ci0gICAgV05EQ0xBU1MgKiBwQ2xhc3MgPSBXSURHRVRTX0J1aWx0aW5DbGFzc2VzOwotICAgICAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQlVJTFRJTl9DTEFTU0VTOyBpKyssIHBDbGFzcysrKQorICAgIGZvciAoaSA9IDA7IGkgPCBOQl9CVUlMVElOX0NMQVNTRVM7IGkrKykKICAgICB7Ci0JaWYgKCFSZWdpc3RlckNsYXNzKHBDbGFzcykpIHJldHVybiBGQUxTRTsKKwlpZiAoIVJlZ2lzdGVyQ2xhc3MoJldJREdFVFNfQnVpbHRpbkNsYXNzZXNbaV0pKSByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwogfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFdJREdFVFNfQ2FsbDMyV25kUHJvYwotICoKLSAqIENhbGwgdGhlIHdpbmRvdyBwcm9jZWR1cmUgb2YgYSBidWlsdC1pbiBjbGFzcy4KLSAqLwotTE9ORyBXSURHRVRTX0NhbGwzMlduZFByb2MoIEZBUlBST0MgZnVuYywgSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsCi0JCQkgICAgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLXsKLSAgICB1bnNpZ25lZCBpbnQgaSA9ICh1bnNpZ25lZCBpbnQpIGZ1bmM7Ci0gICAgaWYgKCFpIHx8IChpID4gTkJfQlVJTFRJTl9DTEFTU0VTKSkgcmV0dXJuIDA7ICAgIAotICAgIHJldHVybiAoKlduZFByb2MzMltpLTFdKSggaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXSURHRVRTX1N0YXRpY1duZFByb2MKLSAqLwotc3RhdGljIExPTkcgV0lER0VUU19TdGF0aWNXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwKLQkJCQkgICBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQoteyAgICAKLSAgICBzd2l0Y2gobWVzc2FnZSkKLSAgICB7Ci0gICAgY2FzZSBXTV9DUkVBVEU6Ci0JcmV0dXJuIDA7Ci0JCi0gICAgY2FzZSBXTV9QQUlOVDoKLQl7Ci0JICAgIEhEQyBoZGM7Ci0JICAgIFBBSU5UU1RSVUNUIHBzOwotCSAgICBSRUNUIHJlY3Q7Ci0JCi0JICAgIGhkYyA9IEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOwotCSAgICBHZXRDbGllbnRSZWN0KCBod25kLCAmcmVjdCApOwotCSAgICBEcmF3VGV4dChoZGMsICJTdGF0aWMiLCAtMSwgJnJlY3QsCi0JCSAgICAgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIgKTsKLQkgICAgRW5kUGFpbnQoIGh3bmQsICZwcyApOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JCi0gICAgZGVmYXVsdDoKLQlyZXR1cm4gRGVmV2luZG93UHJvYyggaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9NYWtlZmlsZSBiL2RlYnVnZ2VyL01ha2VmaWxlCmluZGV4IDQ5MzI5N2EuLjc4OTU0YzAgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL01ha2VmaWxlCisrKyBiL2RlYnVnZ2VyL01ha2VmaWxlCkBAIC0xLDYgKzEsMTAgQEAKLUNGTEFHUz0tZyAtSS4uL2luY2x1ZGUgIyAtRFVTRV9SRUFETElORQorQ0ZMQUdTPS1nIC1JLi4vaW5jbHVkZSAtRFVTRV9SRUFETElORQogTElCUz0gcmVhZGxpbmUvbGliZWRpdC5hCiBPQkpTPWRiZy50YWIubyBoYXNoLm8gbGV4Lnl5Lm8gaW5mby5vIGkzODYtcGluc24ubworI1lBQ0M9Ymlzb24gLXYgLWQKK1lBQ0M9eWFjYyAtYiBkYmcgLWQKKyNMRVg9ZmxleAorTEVYPWxleAogCiBkZWJ1Z2dlci5vOiAke09CSlN9IHJlYWRsaW5lL2xpYmVkaXQuYQogCShjZCByZWFkbGluZTsgbWFrZSkKQEAgLTE4LDEwICsyMiwxMCBAQAogCiAKIGxleC55eS5jOiBkZWJ1Zy5sCi0JZmxleCAtSSBkZWJ1Zy5sCisJJHtMRVh9IC1JIGRlYnVnLmwKIAogZGJnLnRhYi5jIGRiZy50YWIuaDogZGJnLnkKLQliaXNvbiAtdiAtZCAgZGJnLnkKKwkke1lBQ0N9IGRiZy55CiAKIGR0ZXN0OiBkdGVzdC5vIGRlYnVnZ2VyLm8KIAlnY2MgLW8gZHRlc3QgZHRlc3QubyBkZWJ1Z2dlci5vCkBAIC0yOSwzICszMyw3IEBACiBjbGVhbjoKIAlybSAtZiAqLm8gbWFpbiBkYmcudGFiLiogbGV4Lnl5LiogKi5vdXRwdXQgKn4gKiMgZHRlc3QKIAkoY2QgcmVhZGxpbmU7IG1ha2UgY2xlYW4pCisKK2RlcGVuZDogZGJnLnRhYi5jIGRiZy50YWIuaCBsZXgueXkuYworCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCisKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZy55IGIvZGVidWdnZXIvZGJnLnkKaW5kZXggODBlOGQzNC4uYTYyNzk2MiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGJnLnkKKysrIGIvZGVidWdnZXIvZGJnLnkKQEAgLTExNSw3ICsxMTUsNyBAQAogCXl5aW4gPSBzdGRpbjsKIAlyZWd2YWwgPSByZWdzOwogCi0JLyogVGhpcyBvbmx5IHdvcmtzIGZvciBsaW51eCAtIE5ldEJTRCB3aWxsIG5lZWQgc29tZXRoaW5nIGRpZmZlcmVudCBoZXJlLiAqLworI2lmZGVmIGxpbnV4ICAgICAgICAKIAlpZigoU0NfQ1MgJiA3KSAhPSA3KSB7CiAJCWRiZ19tYXNrID0gMHhmZmZmZmZmZjsKIAkJZGJnX21vZGUgPSAzMjsKQEAgLTEyMyw2ICsxMjMsMTYgQEAKIAkJZGJnX21hc2sgPSAweGZmZmY7CiAJCWRiZ19tb2RlID0gMTY7CiAJfTsKKyNlbmRpZgorI2lmZGVmIF9fTmV0QlNEX18KKwlpZihTQ19DUyA9PSAweDFmKSB7CisJCWRiZ19tYXNrID0gMHhmZmZmZmZmZjsKKwkJZGJnX21vZGUgPSAzMjsKKwl9IGVsc2UgeworCQlkYmdfbWFzayA9IDB4ZmZmZjsKKwkJZGJnX21vZGUgPSAxNjsKKwl9OworI2VuZGlmCiAKIAkvKiBUaGlzIGlzIGludGVuZGVkIHRvIHJlYWQgdGhlIGVudHJ5IHBvaW50cyBmcm9tIHRoZSBXaW5kb3dzIGltYWdlLCBhbmQKIAkgICBpbnNlcnQgdGhlbSBpbiB0aGUgaGFzaCB0YWJsZS4gIEl0IGRvZXMgbm90IHdvcmsgeWV0LCBzbyBpdCBpcyBjb21tZW50ZWQgb3V0LiAqLwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGVidWcubCBiL2RlYnVnZ2VyL2RlYnVnLmwKaW5kZXggZGFjN2QzZi4uNmRlNjNhNCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGVidWcubAorKysgYi9kZWJ1Z2dlci9kZWJ1Zy5sCkBAIC0yNCw2ICsyNCw3IEBACiBzdGF0aWMgY2hhciAqIG1ha2Vfc3ltYm9sKGNoYXIgKik7CiB2b2lkIGZsdXNoX3N5bWJvbHMoKTsKIHN0YXRpYyBpbnQgc3ludGF4X2Vycm9yOworZXh0ZXJuIGludCB5eWx2YWw7CiAlfQogCiBESUdJVAlbMC05XQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZHRlc3QuYyBiL2RlYnVnZ2VyL2R0ZXN0LmMKaW5kZXggNGQ3MDAwOC4uYmJhZDA0ZSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZHRlc3QuYworKysgYi9kZWJ1Z2dlci9kdGVzdC5jCkBAIC01NiwyNSArNTYsMTYgQEAKIAljaGFyICogcG50OwogI2lmZGVmIGxpbnV4CiAJc2Vndl9hY3Quc2FfaGFuZGxlciA9IChfX3NpZ2hhbmRsZXJfdCkgd2luX2ZhdWx0OwotCS8qIFBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBtaW51cyA0IGp1c3QgaW4gY2FzZSwgYW5kIG1ha2UKLQkgICBpdCBhbGlnbmVkICAqLwogCXNpZ2FjdGlvbihTSUdTRUdWLCAmc2Vndl9hY3QsIE5VTEwpOwogI2VuZGlmCiAjaWZkZWYgX19OZXRCU0RfXwotICAgICAgICBzdHJ1Y3Qgc2lnc3RhY2sgc3M7CiAgICAgICAgIHNpZ3NldF90IHNpZ19tYXNrOwogICAgICAgICAKLSAgICAgICAgc3Muc3Nfc3AgPSAoY2hhciAqKSAoKCh1bnNpZ25lZCBpbnQpKGNzdGFjayArIHNpemVvZihjc3RhY2spIC0gNCkpICYgfjMpOwotICAgICAgICBzcy5zc19vbnN0YWNrID0gMDsKLSAgICAgICAgaWYgKHNpZ3N0YWNrKCZzcywgTlVMTCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcGVycm9yKCJzaWdzdGFjayIpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KICAgICAgICAgc2lnZW1wdHlzZXQoJnNpZ19tYXNrKTsKICAgICAgICAgc2Vndl9hY3Quc2FfaGFuZGxlciA9IChfX3NpZ2hhbmRsZXJfdCkgd2luX2ZhdWx0OwotCXNlZ3ZfYWN0LnNhX2ZsYWdzID0gU0FfT05TVEFDSzsKKwlzZWd2X2FjdC5zYV9mbGFncyA9IDA7CiAgICAgICAgIHNlZ3ZfYWN0LnNhX21hc2sgPSBzaWdfbWFzazsKLQlpZiAoc2lnYWN0aW9uKFNJR0JVUywgJnNlZ3ZfYWN0LCBOVUxMKSA8IDApIHsKKwlpZiAoc2lnYWN0aW9uKFNJR1NFR1YsICZzZWd2X2FjdCwgTlVMTCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcGVycm9yKCJzaWdhY3Rpb24iKTsKICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9pMzg2LXBpbnNuLmMgYi9kZWJ1Z2dlci9pMzg2LXBpbnNuLmMKaW5kZXggYmQyMmE5My4uOWE2MzM2MSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvaTM4Ni1waW5zbi5jCisrKyBiL2RlYnVnZ2VyL2kzODYtcGluc24uYwpAQCAtMTQ2Nyw2ICsxNDY3LDU3IEBACiAgICAgfQogICAKICAgYXBwZW5kX3ByZWZpeCAoKTsKKworICBpZiAoYnl0ZW1vZGUgPT0gd19tb2RlIHx8IChieXRlbW9kZSA9PSB2X21vZGUgJiYgIWRmbGFnKSkKKyAgeworICAgICAgaWYgKG1vZCA9PSAwICYmIHJtID09IDYpCisgICAgICB7CisJICBzcHJpbnRmKHNjcmF0Y2hidWYsICIlMDQuNHgiLCBnZXQxNigpKTsKKwkgIG9hcHBlbmQoc2NyYXRjaGJ1Zik7CisJICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZGlzcCA9IDA7CisgICAgICBpZiAobW9kID09IDEpCisJICBkaXNwID0gKihjaGFyICopY29kZXArKzsKKyAgICAgIGVsc2UgaWYgKG1vZCA9PSAyKQorCSAgZGlzcCA9IGdldDE2KCk7CisgICAgICBpZiAoZGlzcCAhPSAwKQorICAgICAgeworCSAgc3ByaW50ZihzY3JhdGNoYnVmLCAiMHgleCIsIGRpc3ApOworCSAgb2FwcGVuZChzY3JhdGNoYnVmKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChybSkKKyAgICAgIHsKKwljYXNlIDA6CisJICBvYXBwZW5kKCIoJWJ4LCVzaSkiKTsKKwkgIGJyZWFrOworCWNhc2UgMToKKwkgIG9hcHBlbmQoIiglYngsJWRpKSIpOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgb2FwcGVuZCgiKCVicCwlc2kpIik7CisJICBicmVhazsKKwljYXNlIDM6CisJICBvYXBwZW5kKCIoJWJwLCVkaSkiKTsKKwkgIGJyZWFrOworCWNhc2UgNDoKKwkgIG9hcHBlbmQoIiglc2kpIik7CisJICBicmVhazsKKwljYXNlIDU6CisJICBvYXBwZW5kKCIoJWRpKSIpOworCSAgYnJlYWs7CisJY2FzZSA2OgorCSAgb2FwcGVuZCgiKCVicCkiKTsKKwkgIGJyZWFrOworCWNhc2UgNzoKKwkgIG9hcHBlbmQoIiglYngpIik7CisJICBicmVhazsKKyAgICAgIH0JICAKKyAgICAgIHJldHVybiAwOworICB9CisgIAogICBpZiAocm0gPT0gNCkKICAgICB7CiAgICAgICBoYXZlc2liID0gMTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2luZm8uYyBiL2RlYnVnZ2VyL2luZm8uYwppbmRleCA5NjA0NmU4Li4wNjM0NDdhIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9pbmZvLmMKKysrIGIvZGVidWdnZXIvaW5mby5jCkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogCQl3ZHVtcCA9ICh1bnNpZ25lZCBzaG9ydCBpbnQgKikgYWRkcjsKIAkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSAKIAkJewotCQkJZnByaW50ZihzdGRlcnIsIiAlZCIsICp3ZHVtcCsrKTsKKwkJCWZwcmludGYoc3RkZXJyLCIgJXgiLCAqd2R1bXArKyk7CiAJCQlpZiAoKGkgJSAxMCkgPT0gNykgewogCQkJCWZwcmludGYoc3RkZXJyLCJcbiIpOwotCQkJCXByaW50X2FkZHJlc3MoKHVuc2lnbmVkIGludCkgZHVtcCwgc3RkZXJyKTsKKwkJCQlwcmludF9hZGRyZXNzKCh1bnNpZ25lZCBpbnQpIHdkdW1wLCBzdGRlcnIpOwogCQkJCWZwcmludGYoc3RkZXJyLCI6ICAiKTsKIAkJCX07CiAJCX0KQEAgLTE3MiwxMCArMTcyLDEwIEBACiAJCXBudCA9IChjaGFyICopIGFkZHI7CiAJCWZvcihpPTA7IGk8Y291bnQ7IGkrKykgCiAJCXsKLQkJCWZwcmludGYoc3RkZXJyLCIgJWQiLCAqcG50KyspOworCQkJZnByaW50ZihzdGRlcnIsIiAldyIsICpwbnQrKyk7CiAJCQlpZiAoKGkgJSAzMikgPT0gNykgewogCQkJCWZwcmludGYoc3RkZXJyLCJcbiIpOwotCQkJCXByaW50X2FkZHJlc3MoKHVuc2lnbmVkIGludCkgZHVtcCwgc3RkZXJyKTsKKwkJCQlwcmludF9hZGRyZXNzKCh1bnNpZ25lZCBpbnQpIHBudCwgc3RkZXJyKTsKIAkJCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7CiAJCQl9OwogCQl9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9vYnN0YWNrLmggYi9kZWJ1Z2dlci9vYnN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4MzJlZQotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL29ic3RhY2suaApAQCAtMCwwICsxLDQ2NyBAQAorLyogb2JzdGFjay5oIC0gb2JqZWN0IHN0YWNrIG1hY3JvcworICAgQ29weXJpZ2h0IChDKSAxOTg4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CitsYXRlciB2ZXJzaW9uLgorCitUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KKworLyogU3VtbWFyeToKKworQWxsIHRoZSBhcHBhcmVudCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGFyZSBtYWNyb3MuIFRoZSBpZGVhCitpcyB0aGF0IHlvdSB3b3VsZCB1c2UgdGhlc2UgcHJlLXRlc3RlZCBtYWNyb3MgdG8gc29sdmUgYQordmVyeSBzcGVjaWZpYyBzZXQgb2YgcHJvYmxlbXMsIGFuZCB0aGV5IHdvdWxkIHJ1biBmYXN0LgorQ2F1dGlvbjogbm8gc2lkZS1lZmZlY3RzIGluIGFyZ3VtZW50cyBwbGVhc2UhISBUaGV5IG1heSBiZQorZXZhbHVhdGVkIE1BTlkgdGltZXMhIQorCitUaGVzZSBtYWNyb3Mgb3BlcmF0ZSBhIHN0YWNrIG9mIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdGFydHMgbGlmZQorc21hbGwsIGFuZCBtYXkgZ3JvdyB0byBtYXR1cml0eS4gIChDb25zaWRlciBidWlsZGluZyBhIHdvcmQgc3lsbGFibGUKK2J5IHN5bGxhYmxlLikgIEFuIG9iamVjdCBjYW4gbW92ZSB3aGlsZSBpdCBpcyBncm93aW5nLiAgT25jZSBpdCBoYXMKK2JlZW4gImZpbmlzaGVkIiBpdCBuZXZlciBjaGFuZ2VzIGFkZHJlc3MgYWdhaW4uICBTbyB0aGUgInRvcCBvZiB0aGUKK3N0YWNrIiBpcyB0eXBpY2FsbHkgYW4gaW1tYXR1cmUgZ3Jvd2luZyBvYmplY3QsIHdoaWxlIHRoZSByZXN0IG9mIHRoZQorc3RhY2sgaXMgb2YgbWF0dXJlLCBmaXhlZCBzaXplIGFuZCBmaXhlZCBhZGRyZXNzIG9iamVjdHMuCisKK1RoZXNlIHJvdXRpbmVzIGdyYWIgbGFyZ2UgY2h1bmtzIG9mIG1lbW9yeSwgdXNpbmcgYSBmdW5jdGlvbiB5b3UKK3N1cHBseSwgY2FsbGVkIGBvYnN0YWNrX2NodW5rX2FsbG9jJy4gIE9uIG9jY2FzaW9uLCB0aGV5IGZyZWUgY2h1bmtzLAorYnkgY2FsbGluZyBgb2JzdGFja19jaHVua19mcmVlJy4gIFlvdSBtdXN0IGRlZmluZSB0aGVtIGFuZCBkZWNsYXJlCit0aGVtIGJlZm9yZSB1c2luZyBhbnkgb2JzdGFjayBtYWNyb3MuCisKK0VhY2ggaW5kZXBlbmRlbnQgc3RhY2sgaXMgcmVwcmVzZW50ZWQgYnkgYSBgc3RydWN0IG9ic3RhY2snLgorRWFjaCBvZiB0aGUgb2JzdGFjayBtYWNyb3MgZXhwZWN0cyBhIHBvaW50ZXIgdG8gc3VjaCBhIHN0cnVjdHVyZQorYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorCitPbmUgbW90aXZhdGlvbiBmb3IgdGhpcyBwYWNrYWdlIGlzIHRoZSBwcm9ibGVtIG9mIGdyb3dpbmcgY2hhciBzdHJpbmdzCitpbiBzeW1ib2wgdGFibGVzLiAgVW5sZXNzIHlvdSBhcmUgImZhc2Npc3QgcGlnIHdpdGggYSByZWFkLW9ubHkgbWluZCIKK1tHb3NwZXIncyBpbW1vcnRhbCBxdW90ZSBmcm9tIEhBS01FTSBpdGVtIDE1NCwgb3V0IG9mIGNvbnRleHRdIHlvdQord291bGQgbm90IGxpa2UgdG8gcHV0IGFueSBhcmJpdHJhcnkgdXBwZXIgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB5b3VyCitzeW1ib2xzLgorCitJbiBwcmFjdGljZSB0aGlzIG9mdGVuIG1lYW5zIHlvdSB3aWxsIGJ1aWxkIG1hbnkgc2hvcnQgc3ltYm9scyBhbmQgYQorZmV3IGxvbmcgc3ltYm9scy4gIEF0IHRoZSB0aW1lIHlvdSBhcmUgcmVhZGluZyBhIHN5bWJvbCB5b3UgZG9uJ3Qga25vdworaG93IGxvbmcgaXQgaXMuICBPbmUgdHJhZGl0aW9uYWwgbWV0aG9kIGlzIHRvIHJlYWQgYSBzeW1ib2wgaW50byBhCitidWZmZXIsIHJlYWxsb2MoKWF0aW5nIHRoZSBidWZmZXIgZXZlcnkgdGltZSB5b3UgdHJ5IHRvIHJlYWQgYSBzeW1ib2wKK3RoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgYmVhdXQsIGJ1dCB5b3Ugc3RpbGwgd2lsbAord2FudCB0byBjb3B5IHRoZSBzeW1ib2wgZnJvbSB0aGUgYnVmZmVyIHRvIGEgbW9yZSBwZXJtYW5lbnQKK3N5bWJvbC10YWJsZSBlbnRyeSBzYXkgYWJvdXQgaGFsZiB0aGUgdGltZS4KKworV2l0aCBvYnN0YWNrcywgeW91IGNhbiB3b3JrIGRpZmZlcmVudGx5LiAgVXNlIG9uZSBvYnN0YWNrIGZvciBhbGwgc3ltYm9sCituYW1lcy4gIEFzIHlvdSByZWFkIGEgc3ltYm9sLCBncm93IHRoZSBuYW1lIGluIHRoZSBvYnN0YWNrIGdyYWR1YWxseS4KK1doZW4gdGhlIG5hbWUgaXMgY29tcGxldGUsIGZpbmFsaXplIGl0LiAgVGhlbiwgaWYgdGhlIHN5bWJvbCBleGlzdHMgYWxyZWFkeSwKK2ZyZWUgdGhlIG5ld2x5IHJlYWQgbmFtZS4KKworVGhlIHdheSB3ZSBkbyB0aGlzIGlzIHRvIHRha2UgYSBsYXJnZSBjaHVuaywgYWxsb2NhdGluZyBtZW1vcnkgZnJvbQorbG93IGFkZHJlc3Nlcy4gIFdoZW4geW91IHdhbnQgdG8gYnVpbGQgYSBzeW1ib2wgaW4gdGhlIGNodW5rIHlvdSBqdXN0CithZGQgY2hhcnMgYWJvdmUgdGhlIGN1cnJlbnQgImhpZ2ggd2F0ZXIgbWFyayIgaW4gdGhlIGNodW5rLiAgV2hlbiB5b3UKK2hhdmUgZmluaXNoZWQgYWRkaW5nIGNoYXJzLCBiZWNhdXNlIHlvdSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sLAoreW91IGtub3cgaG93IGxvbmcgdGhlIGNoYXJzIGFyZSwgYW5kIHlvdSBjYW4gY3JlYXRlIGEgbmV3IG9iamVjdC4KK01vc3RseSB0aGUgY2hhcnMgd2lsbCBub3QgYnVyc3Qgb3ZlciB0aGUgaGlnaGVzdCBhZGRyZXNzIG9mIHRoZSBjaHVuaywKK2JlY2F1c2UgeW91IHdvdWxkIHR5cGljYWxseSBleHBlY3QgYSBjaHVuayB0byBiZSAoc2F5KSAxMDAgdGltZXMgYXMKK2xvbmcgYXMgYW4gYXZlcmFnZSBvYmplY3QuCisKK0luIGNhc2UgdGhhdCBpc24ndCBjbGVhciwgd2hlbiB3ZSBoYXZlIGVub3VnaCBjaGFycyB0byBtYWtlIHVwCit0aGUgb2JqZWN0LCBUSEVZIEFSRSBBTFJFQURZIENPTlRJR1VPVVMgSU4gVEhFIENIVU5LIChndWFyYW50ZWVkKQorc28gd2UganVzdCBwb2ludCB0byBpdCB3aGVyZSBpdCBsaWVzLiAgTm8gbW92aW5nIG9mIGNoYXJzIGlzCituZWVkZWQgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCB3aW46IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5ncyBuZWVkCituZXZlciBiZSBleHBsaWNpdGx5IHNodWZmbGVkLiBPbmNlIGFuIG9iamVjdCBpcyBmb3JtZWQsIGl0IGRvZXMgbm90CitjaGFuZ2UgaXRzIGFkZHJlc3MgZHVyaW5nIGl0cyBsaWZldGltZS4KKworV2hlbiB0aGUgY2hhcnMgYnVyc3Qgb3ZlciBhIGNodW5rIGJvdW5kYXJ5LCB3ZSBhbGxvY2F0ZSBhIGxhcmdlcgorY2h1bmssIGFuZCB0aGVuIGNvcHkgdGhlIHBhcnRseSBmb3JtZWQgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkCitjaHVuayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgbGFyZ2VyIGNodW5rLiAgV2UgdGhlbiBjYXJyeSBvbgorYWNjcmV0aW5nIGNoYXJhY3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgb2JqZWN0IGFzIHdlIG5vcm1hbGx5IHdvdWxkLgorCitBIHNwZWNpYWwgbWFjcm8gaXMgcHJvdmlkZWQgdG8gYWRkIGEgc2luZ2xlIGNoYXIgYXQgYSB0aW1lIHRvIGEKK2dyb3dpbmcgb2JqZWN0LiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiByZWdpc3RlciB2YXJpYWJsZXMsIHdoaWNoCiticmVhayB0aGUgb3JkaW5hcnkgJ2dyb3d0aCcgbWFjcm8uCisKK1N1bW1hcnk6CisJV2UgYWxsb2NhdGUgbGFyZ2UgY2h1bmtzLgorCVdlIGNhcnZlIG91dCBvbmUgb2JqZWN0IGF0IGEgdGltZSBmcm9tIHRoZSBjdXJyZW50IGNodW5rLgorCU9uY2UgY2FydmVkLCBhbiBvYmplY3QgbmV2ZXIgbW92ZXMuCisJV2UgYXJlIGZyZWUgdG8gYXBwZW5kIGRhdGEgb2YgYW55IHNpemUgdG8gdGhlIGN1cnJlbnRseQorCSAgZ3Jvd2luZyBvYmplY3QuCisJRXhhY3RseSBvbmUgb2JqZWN0IGlzIGdyb3dpbmcgaW4gYW4gb2JzdGFjayBhdCBhbnkgb25lIHRpbWUuCisJWW91IGNhbiBydW4gb25lIG9ic3RhY2sgcGVyIGNvbnRyb2wgYmxvY2suCisJWW91IG1heSBoYXZlIGFzIG1hbnkgY29udHJvbCBibG9ja3MgYXMgeW91IGRhcmUuCisJQmVjYXVzZSBvZiB0aGUgd2F5IHdlIGRvIGl0LCB5b3UgY2FuIGB1bndpbmQnIGEgb2JzdGFjaworCSAgYmFjayB0byBhIHByZXZpb3VzIHN0YXRlLiAoWW91IG1heSByZW1vdmUgb2JqZWN0cyBtdWNoCisJICBhcyB5b3Ugd291bGQgd2l0aCBhIHN0YWNrLikKKyovCisKKworLyogRG9uJ3QgZG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtb3JlIHRoYW4gb25jZS4gICovCisKKyNpZm5kZWYgX19PQlNUQUNLU19fCisjZGVmaW5lIF9fT0JTVEFDS1NfXworDAorLyogV2UgdXNlIHN1YnRyYWN0aW9uIG9mIChjaGFyICopMCBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8gaW50CisgICBiZWNhdXNlIG9uIHdvcmQtYWRkcmVzc2FibGUgbWFjaGluZXMgYSBzaW1wbGUgY2FzdCB0byBpbnQKKyAgIG1heSBpZ25vcmUgdGhlIGJ5dGUtd2l0aGluLXdvcmQgZmllbGQgb2YgdGhlIHBvaW50ZXIuICAqLworCisjaWZuZGVmIF9fUFRSX1RPX0lOVAorI2RlZmluZSBfX1BUUl9UT19JTlQoUCkgKChQKSAtIChjaGFyICopMCkKKyNlbmRpZgorCisjaWZuZGVmIF9fSU5UX1RPX1BUUgorI2RlZmluZSBfX0lOVF9UT19QVFIoUCkgKChQKSArIChjaGFyICopMCkKKyNlbmRpZgorCitzdHJ1Y3QgX29ic3RhY2tfY2h1bmsJCS8qIExpdmVzIGF0IGZyb250IG9mIGVhY2ggY2h1bmsuICovCit7CisgIGNoYXIgICpsaW1pdDsJCQkvKiAxIHBhc3QgZW5kIG9mIHRoaXMgY2h1bmsgKi8KKyAgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwcmV2OwkvKiBhZGRyZXNzIG9mIHByaW9yIGNodW5rIG9yIE5VTEwgKi8KKyAgY2hhcgljb250ZW50c1s0XTsJCS8qIG9iamVjdHMgYmVnaW4gaGVyZSAqLworfTsKKworc3RydWN0IG9ic3RhY2sJCS8qIGNvbnRyb2wgY3VycmVudCBvYmplY3QgaW4gY3VycmVudCBjaHVuayAqLworeworICBsb25nCWNodW5rX3NpemU7CQkvKiBwcmVmZXJyZWQgc2l6ZSB0byBhbGxvY2F0ZSBjaHVua3MgaW4gKi8KKyAgc3RydWN0IF9vYnN0YWNrX2NodW5rKiBjaHVuazsJLyogYWRkcmVzcyBvZiBjdXJyZW50IHN0cnVjdCBvYnN0YWNrX2NodW5rICovCisgIGNoYXIJKm9iamVjdF9iYXNlOwkJLyogYWRkcmVzcyBvZiBvYmplY3Qgd2UgYXJlIGJ1aWxkaW5nICovCisgIGNoYXIJKm5leHRfZnJlZTsJCS8qIHdoZXJlIHRvIGFkZCBuZXh0IGNoYXIgdG8gY3VycmVudCBvYmplY3QgKi8KKyAgY2hhcgkqY2h1bmtfbGltaXQ7CQkvKiBhZGRyZXNzIG9mIGNoYXIgYWZ0ZXIgY3VycmVudCBjaHVuayAqLworICBpbnQJdGVtcDsJCQkvKiBUZW1wb3JhcnkgZm9yIHNvbWUgbWFjcm9zLiAgKi8KKyAgaW50ICAgYWxpZ25tZW50X21hc2s7CQkvKiBNYXNrIG9mIGFsaWdubWVudCBmb3IgZWFjaCBvYmplY3QuICovCisgIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKCk7IC8qIFVzZXIncyBmY24gdG8gYWxsb2NhdGUgYSBjaHVuay4gICovCisgIHZvaWQgKCpmcmVlZnVuKSAoKTsJCS8qIFVzZXIncyBmdW5jdGlvbiB0byBmcmVlIGEgY2h1bmsuICAqLworICB2b2lkCSphcmVhX2lkOwkJLyogU2VsZWN0IHdoaWNoIHJlZ2lvbiB0byBhbGxvYy9mcmVlIGluICovCisgIGludCAgIGZsYWdzOwkJCS8qIE1pc2NlbGxhbmVvdXMgc3BlY2lhbCBwdXJwb3NlIGZsYWdzICovCit9OworCisvKiBEZWNsYXJlIGJpdHMgZm9yIGZsYWdzIHdvcmQuICovCisKKy8qIE1lYW5zIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhlIGN1cnJlbnQgY2h1bmsgY29udGFpbnMgYSB6ZXJvLWxlbmd0aAorICAgb2JqZWN0LiAgVGhpcyBwcmV2ZW50cyBmcmVlaW5nIHRoZSBjaHVuayBpZiB3ZSBhbGxvY2F0ZSBhIGJpZ2dlciBjaHVuaworICAgdG8gcmVwbGFjZSBpdC4gICovCisKKyNkZWZpbmUgT0JTVEFDS19NQVlCRV9FTVBUWV9PQkpFQ1QJKDEgPDwgMCkKKworLyogTWVhbnMgdGhhdCB0aGUgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyB0YWtlIHR3byBhcmd1bWVudHMsCisgICBhbGEgdGhlIG1tYWxsb2MgcGFja2FnZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGdlbmVyaWMgcG9pbnRlciB0aGF0CisgICBpcyBzYXZlZCBpbiB0aGUgYXJlYV9pZCBtZW1iZXIgb2YgdGhlIG9ic3RhY2sgc3RydWN0LiAqLworCisjZGVmaW5lIE9CU1RBQ0tfTU1BTExPQ19MSUtFCQkoMSA8PCAxKQorCisvKiBEZWNsYXJlIHRoZSBleHRlcm5hbCBmdW5jdGlvbnMgd2UgdXNlOyB0aGV5IGFyZSBpbiBvYnN0YWNrLmMuICAqLworCisjaWZkZWYgX19TVERDX18KKyAgZXh0ZXJuIHZvaWQgX29ic3RhY2tfbmV3Y2h1bmsgKHN0cnVjdCBvYnN0YWNrICosIGludCk7CisgIGV4dGVybiB2b2lkIF9vYnN0YWNrX2ZyZWUgKHN0cnVjdCBvYnN0YWNrICosIHZvaWQgKik7CisgIGV4dGVybiB2b2lkIF9vYnN0YWNrX2JlZ2luIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQsIGludCwKKwkJCSAgICAgIHZvaWQgKigqKSAoaW50KSwgdm9pZCAoKikgKGludCksIHZvaWQgKiwgaW50KTsKKyNlbHNlCisgIGV4dGVybiB2b2lkIF9vYnN0YWNrX25ld2NodW5rICgpOworICBleHRlcm4gdm9pZCBfb2JzdGFja19mcmVlICgpOworICBleHRlcm4gdm9pZCBfb2JzdGFja19iZWdpbiAoKTsKKyNlbmRpZgorDAorI2lmZGVmIF9fU1REQ19fCisKKy8qIERvIHRoZSBmdW5jdGlvbi1kZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdHMKKyAgIGJ1dCBiZWZvcmUgZGVmaW5pbmcgdGhlIG1hY3Jvcy4gICovCisKK3ZvaWQgb2JzdGFja19pbml0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7CisKK3ZvaWQgKiBvYnN0YWNrX2FsbG9jIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOworCit2b2lkICogb2JzdGFja19jb3B5IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOwordm9pZCAqIG9ic3RhY2tfY29weTAgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICphZGRyZXNzLCBpbnQgc2l6ZSk7CisKK3ZvaWQgb2JzdGFja19mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYmxvY2spOworCit2b2lkIG9ic3RhY2tfYmxhbmsgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7CisKK3ZvaWQgb2JzdGFja19ncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSwgaW50IHNpemUpOwordm9pZCBvYnN0YWNrX2dyb3cwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSwgaW50IHNpemUpOworCit2b2lkIG9ic3RhY2tfMWdyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgZGF0YV9jaGFyKTsKK3ZvaWQgb2JzdGFja19wdHJfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEpOwordm9pZCBvYnN0YWNrX2ludF9ncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOworCit2b2lkICogb2JzdGFja19maW5pc2ggKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKKworaW50IG9ic3RhY2tfb2JqZWN0X3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKKworaW50IG9ic3RhY2tfcm9vbSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwordm9pZCBvYnN0YWNrXzFncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgZGF0YV9jaGFyKTsKK3ZvaWQgb2JzdGFja19wdHJfZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSk7Cit2b2lkIG9ic3RhY2tfaW50X2dyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBkYXRhKTsKK3ZvaWQgb2JzdGFja19ibGFua19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOworCit2b2lkICogb2JzdGFja19iYXNlIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Cit2b2lkICogb2JzdGFja19uZXh0X2ZyZWUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKK2ludCBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7CitpbnQgb2JzdGFja19jaHVua19zaXplIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7CisKKyNlbmRpZiAvKiBfX1NURENfXyAqLworCisvKiBOb24tQU5TSSBDIGNhbm5vdCByZWFsbHkgc3VwcG9ydCBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMgZm9yIHRoZXNlIG1hY3JvcywKKyAgIHNvIHdlIGRvIG5vdCBkZWNsYXJlIHRoZW0uICAqLworDAorLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2Ygb2JqZWN0IGJlaW5nIGFsbG9jYXRlZCBvciB0byBiZSBhbGxvY2F0ZWQgbmV4dC4KKyAgIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUgb2JqZWN0CisgICBiZWNhdXNlIGEgbmV3IGNodW5rIG1pZ2h0IGJlIG5lZWRlZCB0byBob2xkIHRoZSBmaW5hbCBzaXplLiAgKi8KKworI2RlZmluZSBvYnN0YWNrX2Jhc2UoaCkgKChoKS0+b2JqZWN0X2Jhc2UpCisKKy8qIFNpemUgZm9yIGFsbG9jYXRpbmcgb3JkaW5hcnkgY2h1bmtzLiAgKi8KKworI2RlZmluZSBvYnN0YWNrX2NodW5rX3NpemUoaCkgKChoKS0+Y2h1bmtfc2l6ZSkKKworLyogUG9pbnRlciB0byBuZXh0IGJ5dGUgbm90IHlldCBhbGxvY2F0ZWQgaW4gY3VycmVudCBjaHVuay4gICovCisKKyNkZWZpbmUgb2JzdGFja19uZXh0X2ZyZWUoaCkJKChoKS0+bmV4dF9mcmVlKQorCisvKiBNYXNrIHNwZWNpZnlpbmcgbG93IGJpdHMgdGhhdCBzaG91bGQgYmUgY2xlYXIgaW4gYWRkcmVzcyBvZiBhbiBvYmplY3QuICAqLworCisjZGVmaW5lIG9ic3RhY2tfYWxpZ25tZW50X21hc2soaCkgKChoKS0+YWxpZ25tZW50X21hc2spCisKKyNkZWZpbmUgb2JzdGFja19pbml0KGgpIFwKKyAgX29ic3RhY2tfYmVnaW4gKChoKSwgMCwgMCwgXAorCQkgICh2b2lkICooKikgKCkpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAoKSlvYnN0YWNrX2NodW5rX2ZyZWUsICh2b2lkICopIDAsIDApCisKKyNkZWZpbmUgb2JzdGFja19iZWdpbihoLCBzaXplKSBcCisgIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgMCwgXAorCQkgICh2b2lkICooKikgKCkpIG9ic3RhY2tfY2h1bmtfYWxsb2MsICh2b2lkICgqKSAoKSlvYnN0YWNrX2NodW5rX2ZyZWUsICh2b2lkICopIDAsIDApCisKKyNkZWZpbmUgb2JzdGFja19mdWxsX2JlZ2luKGgsc2l6ZSxhbGlnbm1lbnQsY2h1bmtmdW4sZnJlZWZ1bixhcmVhX2lkLGZsYWdzKSBcCisgIF9vYnN0YWNrX2JlZ2luICgoaCksIChzaXplKSwgKGFsaWdubWVudCksIFwKKwkJICAodm9pZCAqKCopICgpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKCkpIChmcmVlZnVuKSwgXAorCQkgIChhcmVhX2lkKSwgKGZsYWdzKSkKKworI2RlZmluZSBvYnN0YWNrX2NodW5rZnVuKGgsIG5ld2NodW5rZnVuKSBcCisgICgoaCkgLT4gY2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikoKSkgKG5ld2NodW5rZnVuKSkKKworI2RlZmluZSBvYnN0YWNrX2ZyZWVmdW4oaCwgbmV3ZnJlZWZ1bikgXAorICAoKGgpIC0+IGZyZWVmdW4gPSAodm9pZCAoKikoKSkgKG5ld2ZyZWVmdW4pKQorCisjZGVmaW5lIG9ic3RhY2tfMWdyb3dfZmFzdChoLGFjaGFyKSAoKigoaCktPm5leHRfZnJlZSkrKyA9IGFjaGFyKQorCisjZGVmaW5lIG9ic3RhY2tfYmxhbmtfZmFzdChoLG4pICgoaCktPm5leHRfZnJlZSArPSAobikpCisMCisjaWYgZGVmaW5lZCAoX19HTlVDX18pICYmIGRlZmluZWQgKF9fU1REQ19fKQorI2lmIF9fR05VQ19fIDwgMgorI2RlZmluZSBfX2V4dGVuc2lvbl9fCisjZW5kaWYKKworLyogRm9yIEdOVSBDLCBpZiBub3QgLXRyYWRpdGlvbmFsLAorICAgd2UgY2FuIGRlZmluZSB0aGVzZSBtYWNyb3MgdG8gY29tcHV0ZSBhbGwgYXJncyBvbmx5IG9uY2UKKyAgIHdpdGhvdXQgdXNpbmcgYSBnbG9iYWwgdmFyaWFibGUuCisgICBBbHNvLCB3ZSBjYW4gYXZvaWQgdXNpbmcgdGhlIGB0ZW1wJyBzbG90LCB0byBtYWtlIGZhc3RlciBjb2RlLiAgKi8KKworI2RlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKE9CU1RBQ0spCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgICAgKHVuc2lnbmVkKSAoX19vLT5uZXh0X2ZyZWUgLSBfX28tPm9iamVjdF9iYXNlKTsgfSkKKworI2RlZmluZSBvYnN0YWNrX3Jvb20oT0JTVEFDSykJCQkJCQlcCisgIF9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyAgKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgICAgKHVuc2lnbmVkKSAoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlKTsgfSkKKworLyogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIF9vYnN0YWNrX25ld2NodW5rIGlzIGVuY2xvc2VkIGluICguLi4sIDApCisgICBzbyB0aGF0IHdlIGNhbiBhdm9pZCBoYXZpbmcgdm9pZCBleHByZXNzaW9ucworICAgaW4gdGhlIGFybXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCisgICBDYXN0aW5nIHRoZSB0aGlyZCBvcGVyYW5kIHRvIHZvaWQgd2FzIHRyaWVkIGJlZm9yZSwKKyAgIGJ1dCBzb21lIGNvbXBpbGVycyB3b24ndCBhY2NlcHQgaXQuICAqLworI2RlZmluZSBvYnN0YWNrX2dyb3coT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICAoKF9fby0+bmV4dF9mcmVlICsgX19sZW4gPiBfX28tPmNodW5rX2xpbWl0KQkJCQlcCisgICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pLCAwKSA6IDApOwkJCQlcCisgICBiY29weSAod2hlcmUsIF9fby0+bmV4dF9mcmVlLCBfX2xlbik7CQkJCVwKKyAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjZGVmaW5lIG9ic3RhY2tfZ3JvdzAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICBpbnQgX19sZW4gPSAobGVuZ3RoKTsJCQkJCQlcCisgICAoKF9fby0+bmV4dF9mcmVlICsgX19sZW4gKyAxID4gX19vLT5jaHVua19saW1pdCkJCQlcCisgICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4gKyAxKSwgMCkgOiAwKSwJCQlcCisgICBiY29weSAod2hlcmUsIF9fby0+bmV4dF9mcmVlLCBfX2xlbiksCQkJCVwKKyAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuLAkJCQkJCVwKKyAgICooX19vLT5uZXh0X2ZyZWUpKysgPSAwOwkJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjZGVmaW5lIG9ic3RhY2tfMWdyb3coT0JTVEFDSyxkYXR1bSkJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICAoKF9fby0+bmV4dF9mcmVlICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJCVwKKyAgICA/IChfb2JzdGFja19uZXdjaHVuayAoX19vLCAxKSwgMCkgOiAwKSwJCQkJXAorICAgKihfX28tPm5leHRfZnJlZSkrKyA9IChkYXR1bSk7CQkJCQlcCisgICAodm9pZCkgMDsgfSkKKworLyogVGhlc2UgYXNzdW1lIHRoYXQgdGhlIG9ic3RhY2sgYWxpZ25tZW50IGlzIGdvb2QgZW5vdWdoIGZvciBwb2ludGVycyBvciBpbnRzLAorICAgYW5kIHRoYXQgdGhlIGRhdGEgYWRkZWQgc28gZmFyIHRvIHRoZSBjdXJyZW50IG9iamVjdAorICAgc2hhcmVzIHRoYXQgbXVjaCBhbGlnbm1lbnQuICAqLworICAgCisjZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCisgICAoKF9fby0+bmV4dF9mcmVlICsgc2l6ZW9mICh2b2lkICopID4gX19vLT5jaHVua19saW1pdCkJCVwKKyAgICA/IChfb2JzdGFja19uZXdjaHVuayAoX19vLCBzaXplb2YgKHZvaWQgKikpLCAwKSA6IDApLAkJXAorICAgKigqKHZvaWQgKioqKSZfX28tPm5leHRfZnJlZSkrKyA9ICgodm9pZCAqKWRhdHVtKTsJCQlcCisgICAodm9pZCkgMDsgfSkKKworI2RlZmluZSBvYnN0YWNrX2ludF9ncm93KE9CU1RBQ0ssZGF0dW0pCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAorICAgKChfX28tPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJXAorICAgID8gKF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAoaW50KSksIDApIDogMCksCQkJXAorICAgKigqKGludCAqKikmX19vLT5uZXh0X2ZyZWUpKysgPSAoKGludClkYXR1bSk7CQkJXAorICAgKHZvaWQpIDA7IH0pCisKKyNkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KGgsYXB0cikgKCooKih2b2lkICoqKikmKGgpLT5uZXh0X2ZyZWUpKysgPSAodm9pZCAqKWFwdHIpCisjZGVmaW5lIG9ic3RhY2tfaW50X2dyb3dfZmFzdChoLGFpbnQpICgqKCooaW50ICoqKSYoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpYWludCkKKworI2RlZmluZSBvYnN0YWNrX2JsYW5rKE9CU1RBQ0ssbGVuZ3RoKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKKyAgICgoX19vLT5jaHVua19saW1pdCAtIF9fby0+bmV4dF9mcmVlIDwgX19sZW4pCQkJCVwKKyAgICA/IChfb2JzdGFja19uZXdjaHVuayAoX19vLCBfX2xlbiksIDApIDogMCk7CQkJCVwKKyAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKKyAgICh2b2lkKSAwOyB9KQorCisjZGVmaW5lIG9ic3RhY2tfYWxsb2MoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAorICAgb2JzdGFja19ibGFuayAoX19oLCAobGVuZ3RoKSk7CQkJCQlcCisgICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKKworI2RlZmluZSBvYnN0YWNrX2NvcHkoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKK19fZXh0ZW5zaW9uX18JCQkJCQkJCVwKKyh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCisgICBvYnN0YWNrX2dyb3cgKF9faCwgKHdoZXJlKSwgKGxlbmd0aCkpOwkJCQlcCisgICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKKworI2RlZmluZSBvYnN0YWNrX2NvcHkwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAorICAgb2JzdGFja19ncm93MCAoX19oLCAod2hlcmUpLCAobGVuZ3RoKSk7CQkJCVwKKyAgIG9ic3RhY2tfZmluaXNoIChfX2gpOyB9KQorCisvKiBUaGUgbG9jYWwgdmFyaWFibGUgaXMgbmFtZWQgX19vMSB0byBhdm9pZCBhIG5hbWUgY29uZmxpY3QKKyAgIHdoZW4gb2JzdGFja19ibGFuayBpcyBjYWxsZWQuICAqLworI2RlZmluZSBvYnN0YWNrX2ZpbmlzaChPQlNUQUNLKSAgCQkJCQlcCitfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCisoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIHZvaWQgKnZhbHVlID0gKHZvaWQgKikgX19vMS0+b2JqZWN0X2Jhc2U7CQkJCVwKKyAgIGlmIChfX28xLT5uZXh0X2ZyZWUgPT0gdmFsdWUpCQkJCQlcCisgICAgIF9fbzEtPmZsYWdzIHw9IE9CU1RBQ0tfTUFZQkVfRU1QVFlfT0JKRUNUOwkJCQlcCisgICBfX28xLT5uZXh0X2ZyZWUJCQkJCQkJXAorICAgICA9IF9fSU5UX1RPX1BUUiAoKF9fUFRSX1RPX0lOVCAoX19vMS0+bmV4dF9mcmVlKStfX28xLT5hbGlnbm1lbnRfbWFzaylcCisJCSAgICAgJiB+IChfX28xLT5hbGlnbm1lbnRfbWFzaykpOwkJCVwKKyAgICgoX19vMS0+bmV4dF9mcmVlIC0gKGNoYXIgKilfX28xLT5jaHVuawkJCQlcCisgICAgID4gX19vMS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKV9fbzEtPmNodW5rKQkJCQlcCisgICAgPyAoX19vMS0+bmV4dF9mcmVlID0gX19vMS0+Y2h1bmtfbGltaXQpIDogMCk7CQkJXAorICAgX19vMS0+b2JqZWN0X2Jhc2UgPSBfX28xLT5uZXh0X2ZyZWU7CQkJCQlcCisgICB2YWx1ZTsgfSkKKworI2RlZmluZSBvYnN0YWNrX2ZyZWUoT0JTVEFDSywgT0JKKQkJCQkJXAorX19leHRlbnNpb25fXwkJCQkJCQkJXAorKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKKyAgIHZvaWQgKl9fb2JqID0gKE9CSik7CQkJCQkJCVwKKyAgIGlmIChfX29iaiA+ICh2b2lkICopX19vLT5jaHVuayAmJiBfX29iaiA8ICh2b2lkICopX19vLT5jaHVua19saW1pdCkgIFwKKyAgICAgX19vLT5uZXh0X2ZyZWUgPSBfX28tPm9iamVjdF9iYXNlID0gX19vYmo7CQkJCVwKKyAgIGVsc2UgKG9ic3RhY2tfZnJlZSkgKF9fbywgX19vYmopOyB9KQorDAorI2Vsc2UgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLworCisjZGVmaW5lIG9ic3RhY2tfb2JqZWN0X3NpemUoaCkgXAorICh1bnNpZ25lZCkgKChoKS0+bmV4dF9mcmVlIC0gKGgpLT5vYmplY3RfYmFzZSkKKworI2RlZmluZSBvYnN0YWNrX3Jvb20oaCkJCVwKKyAodW5zaWduZWQpICgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUpCisKKyNkZWZpbmUgb2JzdGFja19ncm93KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAorICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wID4gKGgpLT5jaHVua19saW1pdCkJCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXApLCAwKSA6IDApLAkJCVwKKyAgYmNvcHkgKHdoZXJlLCAoaCktPm5leHRfZnJlZSwgKGgpLT50ZW1wKSwJCQkJXAorICAoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXApCisKKyNkZWZpbmUgb2JzdGFja19ncm93MChoLHdoZXJlLGxlbmd0aCkJCQkJCVwKKyggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKKyAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCArIDEgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIChoKS0+dGVtcCArIDEpLCAwKSA6IDApLAkJCVwKKyAgYmNvcHkgKHdoZXJlLCAoaCktPm5leHRfZnJlZSwgKGgpLT50ZW1wKSwJCQkJXAorICAoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXAsCQkJCQkJXAorICAqKChoKS0+bmV4dF9mcmVlKSsrID0gMCkKKworI2RlZmluZSBvYnN0YWNrXzFncm93KGgsZGF0dW0pCQkJCQkJXAorKCAoKChoKS0+bmV4dF9mcmVlICsgMSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJCVwKKyAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIDEpLCAwKSA6IDApLAkJCQlcCisgICooKGgpLT5uZXh0X2ZyZWUpKysgPSAoZGF0dW0pKQorCisjZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coaCxkYXR1bSkJCQkJCVwKKyggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoY2hhciAqKSA+IChoKS0+Y2h1bmtfbGltaXQpCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCBzaXplb2YgKGNoYXIgKikpLCAwKSA6IDApLAkJXAorICAqKCooY2hhciAqKiopJihoKS0+bmV4dF9mcmVlKSsrID0gKChjaGFyICopZGF0dW0pKQorCisjZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coaCxkYXR1bSkJCQkJCVwKKyggKCgoaCktPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAorICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgc2l6ZW9mIChpbnQpKSwgMCkgOiAwKSwJCQlcCisgICooKihpbnQgKiopJihoKS0+bmV4dF9mcmVlKSsrID0gKChpbnQpZGF0dW0pKQorCisjZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChoLGFwdHIpICgqKCooY2hhciAqKiopJihoKS0+bmV4dF9mcmVlKSsrID0gKGNoYXIgKilhcHRyKQorI2RlZmluZSBvYnN0YWNrX2ludF9ncm93X2Zhc3QoaCxhaW50KSAoKigqKGludCAqKikmKGgpLT5uZXh0X2ZyZWUpKysgPSAoaW50KWFpbnQpCisjZGVmaW5lIG9ic3RhY2tfYmxhbmsoaCxsZW5ndGgpCQkJCQkJXAorKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAorICAoKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSA8IChoKS0+dGVtcCkJCQlcCisgICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXApLCAwKSA6IDApLAkJCVwKKyAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wKQorCisjZGVmaW5lIG9ic3RhY2tfYWxsb2MoaCxsZW5ndGgpCQkJCQkJXAorIChvYnN0YWNrX2JsYW5rICgoaCksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCisKKyNkZWZpbmUgb2JzdGFja19jb3B5KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorIChvYnN0YWNrX2dyb3cgKChoKSwgKHdoZXJlKSwgKGxlbmd0aCkpLCBvYnN0YWNrX2ZpbmlzaCAoKGgpKSkKKworI2RlZmluZSBvYnN0YWNrX2NvcHkwKGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAorIChvYnN0YWNrX2dyb3cwICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCisKKyNkZWZpbmUgb2JzdGFja19maW5pc2goaCkgIAkJCQkJCVwKKyggKChoKS0+bmV4dF9mcmVlID09IChoKS0+b2JqZWN0X2Jhc2UJCQkJCVwKKyAgID8gKCgoaCktPmZsYWdzIHw9IE9CU1RBQ0tfTUFZQkVfRU1QVFlfT0JKRUNUKSwgMCkJCQlcCisgICA6IDApLAkJCQkJCQkJXAorICAoaCktPnRlbXAgPSBfX1BUUl9UT19JTlQgKChoKS0+b2JqZWN0X2Jhc2UpLAkJCQlcCisgIChoKS0+bmV4dF9mcmVlCQkJCQkJCVwKKyAgICA9IF9fSU5UX1RPX1BUUiAoKF9fUFRSX1RPX0lOVCAoKGgpLT5uZXh0X2ZyZWUpKyhoKS0+YWxpZ25tZW50X21hc2spCVwKKwkJICAgICYgfiAoKGgpLT5hbGlnbm1lbnRfbWFzaykpLAkJCQlcCisgICgoKGgpLT5uZXh0X2ZyZWUgLSAoY2hhciAqKShoKS0+Y2h1bmsJCQkJCVwKKyAgICA+IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKShoKS0+Y2h1bmspCQkJCVwKKyAgID8gKChoKS0+bmV4dF9mcmVlID0gKGgpLT5jaHVua19saW1pdCkgOiAwKSwJCQkJXAorICAoaCktPm9iamVjdF9iYXNlID0gKGgpLT5uZXh0X2ZyZWUsCQkJCQlcCisgIF9fSU5UX1RPX1BUUiAoKGgpLT50ZW1wKSkKKworI2lmZGVmIF9fU1REQ19fCisjZGVmaW5lIG9ic3RhY2tfZnJlZShoLG9iaikJCQkJCQlcCisoIChoKS0+dGVtcCA9IChjaGFyICopKG9iaikgLSAoY2hhciAqKSAoaCktPmNodW5rLAkJCVwKKyAgKCgoaCktPnRlbXAgPiAwICYmIChoKS0+dGVtcCA8IChoKS0+Y2h1bmtfbGltaXQgLSAoY2hhciAqKSAoaCktPmNodW5rKVwKKyAgID8gKGludCkgKChoKS0+bmV4dF9mcmVlID0gKGgpLT5vYmplY3RfYmFzZQkJCQlcCisJICAgID0gKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAorICAgOiAoKChvYnN0YWNrX2ZyZWUpICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSwgMCkpKQorI2Vsc2UKKyNkZWZpbmUgb2JzdGFja19mcmVlKGgsb2JqKQkJCQkJCVwKKyggKGgpLT50ZW1wID0gKGNoYXIgKikob2JqKSAtIChjaGFyICopIChoKS0+Y2h1bmssCQkJXAorICAoKChoKS0+dGVtcCA+IDAgJiYgKGgpLT50ZW1wIDwgKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspXAorICAgPyAoaW50KSAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPm9iamVjdF9iYXNlCQkJCVwKKwkgICAgPSAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKQkJCQlcCisgICA6IChfb2JzdGFja19mcmVlICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSkpCisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBfX0dOVUNfXyBvciBub3QgX19TVERDX18gKi8KKworI2VuZGlmIC8qIG5vdCBfX09CU1RBQ0tTX18gKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL01ha2VmaWxlIGIvZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUKaW5kZXggNzdjNmJmYy4uMGVjMzg4OSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUKKysrIGIvZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlzaGFyICQoU0hBUkZJTEVTKSA+c2hhcgogCiBjbGVhbjoKLQlybSAtZiAqLltvYV0gdGVzdGl0IGZvbyBjb3JlIHRhZ3MgbGludCBsaW50LmFsbCBhLm91dCBzaGFyCisJcm0gLWYgKi5bb2FdIHRlc3RpdCBmb28gY29yZSB0YWdzIGxpbnQgbGludC5hbGwgYS5vdXQgc2hhciAqIyAqfgogCiBsaW50OgkJdGVzdGl0CiAJbGludCAtYSAtYiAtdSAteCAkKERFRlMpICQoU09VUkNFUykgdGVzdGl0LmMgPmxpbnQuYWxsCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWdwb3MuaCBiL2RlYnVnZ2VyL3JlZ3Bvcy5oCmluZGV4IGMzZDMwODYuLmQzYzNhNGYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3JlZ3Bvcy5oCisrKyBiL2RlYnVnZ2VyL3JlZ3Bvcy5oCkBAIC0yNSw5ICsyNSwzMiBAQAogI2RlZmluZSAgUk5fQ1IyCQkJMjEKICNlbmRpZgogCisjaWZkZWYgX19OZXRCU0RfXworLyogUmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSAgUk5fRVNQCQkJMgorI2RlZmluZSAgUk5fRUJQCQkJMworI2RlZmluZSAgUk5fRVNQX0FUX1NJR05BTAk0CisjZGVmaW5lICBSTl9FSVAJCQk1CisjZGVmaW5lICBSTl9FRkxBR1MJCTYKKyNkZWZpbmUgIFJOX0VTCQkJNworI2RlZmluZSAgUk5fRFMJCQk4CisjZGVmaW5lICBSTl9DUwkJCTkKKyNkZWZpbmUgIFJOX1NTCQkJMTAKKyNkZWZpbmUgIFJOX0VESSAgCQkxMQorI2RlZmluZSAgUk5fRVNJCQkJMTIKKyNkZWZpbmUgIFJOX0VCWAkJCTEzCisjZGVmaW5lICBSTl9FRFgJCQkxNAorI2RlZmluZSAgUk5fRUNYCQkJMTUKKyNkZWZpbmUgIFJOX0VBWAkJCTE2CisvKiBOZXRCU0QgZG9lc24ndCBjb250ZXh0IHN3aXRjaCBncyBvciBmcyAqLworI2RlZmluZSAgU0NfR1MJCQkweDI3CisjZGVmaW5lICBTQ19GUwkJCTB4MjcKKyNlbmRpZgogCisjaWZkZWYgbGludXgKICNkZWZpbmUgIFNDX0dTCQkJcmVndmFsW1JOX0dTXQogI2RlZmluZSAgU0NfRlMJCQlyZWd2YWxbUk5fRlNdCisjZW5kaWYKICNkZWZpbmUgIFNDX0VTCQkJcmVndmFsW1JOX0VTXQogI2RlZmluZSAgU0NfRFMJCQlyZWd2YWxbUk5fRFNdCiAjZGVmaW5lICBTQ19FREkoZGJnX21hc2spICAJKHJlZ3ZhbFtSTl9FREldICYgZGJnX21hc2spCmRpZmYgLS1naXQgYS9pZjE2MzIvTWFrZWZpbGUgYi9pZjE2MzIvTWFrZWZpbGUKaW5kZXggZWFjOTIxOC4uMDc0NjA2MyAxMDA2NDQKLS0tIGEvaWYxNjMyL01ha2VmaWxlCisrKyBiL2lmMTYzMi9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNyBAQAogCSQoTEQpIC1yIC1vIGlmMTYzMi5vICQoT0JKUykKIAogY2xlYW46Ci0Jcm0gLWYgKi5vICp+ICoucyBkbGxfKiAqLmEKKwlybSAtZiAqLm8gKn4gKi5zIGRsbF8qICouYSAqIwogCiBkbGxfa2VybmVsLlMgZGxsX2tlcm5lbF90YWIuYzogLi4vdG9vbHMvYnVpbGQga2VybmVsLnNwZWMKIAkuLi90b29scy9idWlsZCBrZXJuZWwuc3BlYwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NhbGwuUyBiL2lmMTYzMi9jYWxsLlMKaW5kZXggZTA5YzFmNS4uOWRhODdmMCAxMDA2NDQKLS0tIGEvaWYxNjMyL2NhbGwuUworKysgYi9pZjE2MzIvY2FsbC5TCkBAIC0xMDIsNyArMTAyLDcgQEAKIAltb3ZsCSVlc3AsJWVheAogCW1vdmwJJWVheCwlZWJwCiAjaWYgMQotCW1vdncJJCBVREFUQVNFTCwlYXgKKwltb3Z3CSRVREFUQVNFTCwlYXgKIAltb3Z3CSVheCwlZnMKIAltb3Z3CSVheCwlZ3MKICNlbmRpZgkKQEAgLTEyNCw3ICsxMjQsNyBAQAogCSAqIEdEVCB1c2FnZS4KIAkgKi8KIAlwdXNobAklZWF4Ci0JbW92dwkkIFVEQVRBU0VMLCVheAorCW1vdncJJFVEQVRBU0VMLCVheAogCW1vdncJJWF4LCVkcwogCW1vdncJJWF4LCVlcwogCW1vdncJJWF4LCVmcwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJICogR0RUIHVzYWdlLgogCSAqLwogCXB1c2hsCSVlYXgKLQltb3Z3CSQgVURBVEFTRUwsJWF4CisJbW92dwkkVURBVEFTRUwsJWF4CiAJbW92dwklYXgsJWRzCiAJbW92dwklYXgsJWVzCiAJbW92dwklYXgsJWZzCkBAIC0yNTksNyArMjU5LDcgQEAKIAkgKiBSZXN0b3JlIHNlZ21lbnQgcmVnaXN0ZXJzLgogCSAqLwogCXB1c2hsCSVlYXgKLQltb3Z3CSQgVURBVEFTRUwsJWF4CisJbW92dwkkVURBVEFTRUwsJWF4CiAJbW92dwklYXgsJWRzCiAJbW92dwklYXgsJWVzCiAJcG9wbAklZWF4CkBAIC0zNTksMjEgKzM1OSwyMyBAQAogCSAqIHRoZSByZXR1cm4gYWRkcmVzcywgdGhlIHNhdmVkIHJlZ2lzdGVycywgYW5kIHRoZSByZXR1cm4gCiAJICogYWRkcmVzcyBhZ2Fpbi4KIAkgKi8KLQlwb3B3CSVheAkvKiBUaHJvdyBhd2F5IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzICovCi0JcG9wbAklZWF4CS8qIFRocm93IGF3YXkgZmlyc3QgY29weSBvZiByZXR1cm4gYWRkcmVzcyAqLworCWFkZAkkNiwlZXNwCQkvKiBhcmd1bWVudCBjb3VudCwgcmV0dXJuIGFkZHJlc3MgKi8KKwlwb3B3CSVncworCWFkZAkkMiwlZXNwCisJcG9wdwklZnMKKwlhZGQJJDIsJWVzcAogCXBvcHcJJWVzCisJYWRkCSQyLCVlc3AKIAlwb3B3CSVkcwotCXBvcHcJJWRpCi0JcG9wdwklc2kKLQlwb3B3CSVicAotCXBvcHcJJWF4CS8qIFRocm93IGF3YXkgcHVzaGVkIHN0YWNrIHBvaW50ZXIgKi8KLQlwb3B3CSVieAotCXBvcHcJJWR4Ci0JcG9wdwklY3gKLQlwb3B3CSVheAorCWFkZAkkMiwlZXNwCisJcG9wYWwKKwlhZGQJJDE2LCVlc3AJLyogdHJhcG5vLCBlcnIsIGVpcCwgY3MgKi8KKwlwb3BmbAorCWFkZAkkMjAsJWVzcAkvKiBlc3AsIHNzLCBpMzg3LCBvbGRtYXNrLCBjcjIgKi8KIAogCS8qCiAJICogUmV0dXJuIHRvIG9yaWdpbmFsIGNhbGxlci4KIAkgKi8KIAkuYnl0ZQkweDY2CiAJbHJldAorCmRpZmYgLS1naXQgYS9pZjE2MzIvY2FsbGJhY2suYyBiL2lmMTYzMi9jYWxsYmFjay5jCmluZGV4IDNjMzVlODguLjYwYTllODggMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jYWxsYmFjay5jCisrKyBiL2lmMTYzMi9jYWxsYmFjay5jCkBAIC0xMDQsNiArMTA0LDcgQEAKICAgICB0cC0+dGh1bmtbNF0gPSAweGQ4OwogICAgIHRwLT50aHVua1s1XSA9IDB4ZWE7CiAgICAgbWVtY3B5KCZ0cC0+dGh1bmtbNl0sICZmdW5jLCA0KTsKKyAgICB0cC0+dXNlZCA9IDE7CiAKICAgICByZXR1cm4gdHAtPnRodW5rOwogfQpAQCAtMTQxLDkgKzE0Miw2IEBACiAJUHVzaE9uMTYoIENBTExCQUNLX1NJWkVfV09SRCwgbWVzc2FnZSApOwogCVB1c2hPbjE2KCBDQUxMQkFDS19TSVpFX1dPUkQsIHdQYXJhbSApOwogCVB1c2hPbjE2KCBDQUxMQkFDS19TSVpFX0xPTkcsIGxQYXJhbSApOwotCi0JcHJpbnRmKCIlOC44eCglNC40eCwgJTQuNHgsICU0LjR4LCAlOC44eClcbiIsIGZ1bmMsIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLQogCXJldHVybiBDYWxsVG8xNigodW5zaWduZWQgaW50KSBmdW5jLCAKIAkJCUZpbmREYXRhU2VnbWVudEZvckNvZGUoKHVuc2lnbmVkIGxvbmcpIGZ1bmMpKTsgICAKICAgICB9CmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggNmFmNzVjMS4uYTFmYzVjNSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMTMxLDYgKzEzMSw3IEBACiAzNDYgcGFzY2FsIFNldFRleHRBbGlnbih3b3JkIHdvcmQpIFNldFRleHRBbGlnbigxIDIpCiAzNDggcGFzY2FsIENob3JkKHdvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkKIAkgICBDaG9yZCgxIDIgMyA0IDUgNiA3IDggOSkKKzM1MCBwYXNjYWwgR2V0Q2hhcldpZHRoKHdvcmQgd29yZCB3b3JkIHB0cikgR2V0Q2hhcldpZHRoKDEgMiAzIDQpCiAzNjAgcGFzY2FsIENyZWF0ZVBhbGV0dGUocHRyKSBDcmVhdGVQYWxldHRlKDEpCiAzNjMgcGFzY2FsIEdldFBhbGV0dGVFbnRyaWVzKHdvcmQgd29yZCB3b3JkIHB0cikgR2V0UGFsZXR0ZUVudHJpZXMoMSAyIDMgNCkKIDM2NCBwYXNjYWwgU2V0UGFsZXR0ZUVudHJpZXMod29yZCB3b3JkIHdvcmQgcHRyKSBTZXRQYWxldHRlRW50cmllcygxIDIgMyA0KQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IDYzZWIwMDguLjc1NWY4NDMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwuc3BlYworKysgYi9pZjE2MzIva2VybmVsLnNwZWMKQEAgLTQ0LDcgKzQ0LDcgQEAKIDg2ICBwYXNjYWwgX2x3cml0ZSh3b3JkIHB0ciB3b3JkKSBLRVJORUxfX2x3cml0ZSgxIDIgMykKIDg4ICBwYXNjYWwgbHN0cmNweShwdHIgcHRyKSBsc3RyY3B5KDEgMikKIDg5ICBwYXNjYWwgbHN0cmNhdChwdHIgcHRyKSBsc3RyY2F0KDEgMikKLTkwICBwYXNjYWwgbHN0cmxlbihwdHIpIGxzdHJjcHkoMSkKKzkwICBwYXNjYWwgbHN0cmxlbihwdHIpIGxzdHJsZW4oMSkKIDkxICByZWdpc3RlciBJbml0VGFzayh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQKIAkJICAgICAgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSAKIAkgICAgIEtFUk5FTF9Jbml0VGFzaygpCkBAIC02Niw2ICs2Niw3IEBACiAxNTQgcmV0dXJuIEdsb2JhbE5vdGlmeSA0IDAKIDE2MyBwYXNjYWwgR2xvYmFsTFJVT2xkZXN0KHdvcmQpIFJldHVybkFyZygxKQogMTY0IHBhc2NhbCBHbG9iYWxMUlVOZXdlc3Qod29yZCkgUmV0dXJuQXJnKDEpCisxNjYgcGFzY2FsIFdpbkV4ZWMocHRyIHdvcmQpIFdpbkV4ZWMoMSAyKQogMTc4IGVxdWF0ZSBfX1dJTkZMQUdTIDB4NDEzCiAxODQgcmV0dXJuIEdsb2JhbERPU0FsbG9jIDQgMAogMTg1IHJldHVybiBHbG9iYWxET1NGcmVlIDIgMApkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggNGEzMmE2YS4uOWY5MmJkOCAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0xNSw5ICsxNSwxMyBAQAogMTUgIHBhc2NhbCBHZXRDdXJyZW50VGltZSgpIEdldFRpY2tDb3VudCgpCiAxOCAgcGFzY2FsIFNldENhcHR1cmUod29yZCkgU2V0Q2FwdHVyZSgxKQogMTkgIHBhc2NhbCBSZWxlYXNlQ2FwdHVyZSgpIFJlbGVhc2VDYXB0dXJlKCkKKzIyICBwYXNjYWwgU2V0Rm9jdXMod29yZCkgU2V0Rm9jdXMoMSkKKzIzICBwYXNjYWwgR2V0Rm9jdXMoKSBHZXRGb2N1cygpCiAzMSAgcGFzY2FsIElzSWNvbmljKHdvcmQpIElzSWNvbmljKDEpCiszMiAgcGFzY2FsIEdldFdpbmRvd1JlY3Qod29yZCBwdHIpIEdldFdpbmRvd1JlY3QoMSAyKQogMzMgIHBhc2NhbCBHZXRDbGllbnRSZWN0KHdvcmQgcHRyKSBHZXRDbGllbnRSZWN0KDEgMikKIDM2ICBwYXNjYWwgR2V0V2luZG93VGV4dCh3b3JkIHB0ciB3b3JkKSBHZXRXaW5kb3dUZXh0KDEgMiAzKQorMzcgIHBhc2NhbCBTZXRXaW5kb3dUZXh0KHdvcmQgcHRyKSBTZXRXaW5kb3dUZXh0KDEgMikKIDM4ICBwYXNjYWwgR2V0V2luZG93VGV4dExlbmd0aCh3b3JkKSBHZXRXaW5kb3dUZXh0TGVuZ3RoKDEpCiAzOSAgcGFzY2FsIEJlZ2luUGFpbnQod29yZCBwdHIpIEJlZ2luUGFpbnQoMSAyKQogNDAgIHBhc2NhbCBFbmRQYWludCh3b3JkIHB0cikgRW5kUGFpbnQoMSAyKQpAQCAtMjUsOCArMjksMTMgQEAKIAkgICBDcmVhdGVXaW5kb3coMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEpCiA0MiAgcGFzY2FsIFNob3dXaW5kb3cod29yZCB3b3JkKSBTaG93V2luZG93KDEgMikKIDQ2ICBwYXNjYWwgR2V0UGFyZW50KHdvcmQpIEdldFBhcmVudCgxKQorNDggIHBhc2NhbCBJc0NoaWxkKHdvcmQgd29yZCkgSXNDaGlsZCgxIDIpCiA1MyAgcGFzY2FsIERlc3Ryb3lXaW5kb3cod29yZCkgRGVzdHJveVdpbmRvdygxKQorNTYgIHBhc2NhbCBNb3ZlV2luZG93KHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSAKKyAgICAgICAgICAgTW92ZVdpbmRvdygxIDIgMyA0IDUgNikKIDU3ICBwYXNjYWwgUmVnaXN0ZXJDbGFzcyhwdHIpIFJlZ2lzdGVyQ2xhc3MoMSkKKzYyICBwYXNjYWwgU2V0U2Nyb2xsUG9zKHdvcmQgd29yZCB3b3JkIHdvcmQpIFNldFNjcm9sbFBvcygxIDIgMyA0KQorNjQgIHBhc2NhbCBTZXRTY3JvbGxSYW5nZSh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIFNldFNjcm9sbFJhbmdlKDEgMiAzIDQgNSkKIDY2ICBwYXNjYWwgR2V0REMod29yZCkgR2V0REMoMSkKIDY4ICBwYXNjYWwgUmVsZWFzZURDKHdvcmQgd29yZCkgUmVsZWFzZURDKDEgMikKIDcyICBwYXNjYWwgU2V0UmVjdChwdHIgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkKSBTZXRSZWN0KDEgMiAzIDQgNSkKQEAgLTQyLDcgKzUxLDIyIEBACiA4MiAgcGFzY2FsIEludmVydFJlY3Qod29yZCBwdHIpIEludmVydFJlY3QoMSAyKQogODMgIHBhc2NhbCBGcmFtZVJlY3Qod29yZCBwdHIgd29yZCkgRnJhbWVSZWN0KDEgMiAzKQogODUgIHBhc2NhbCBEcmF3VGV4dCh3b3JkIHB0ciBzX3dvcmQgcHRyIHdvcmQpIERyYXdUZXh0KDEgMiAzIDQgNSkKKzg3ICBwYXNjYWwgRGlhbG9nQm94KHdvcmQgcHRyIHdvcmQgcHRyKSBEaWFsb2dCb3goMSAyIDMgNCkKKzg4ICBwYXNjYWwgRW5kRGlhbG9nKHdvcmQgc193b3JkKSBFbmREaWFsb2coMSAyKQorODkgIHBhc2NhbCBDcmVhdGVEaWFsb2cod29yZCBwdHIgd29yZCBwdHIpIENyZWF0ZURpYWxvZygxIDIgMyA0KQorOTAgIHBhc2NhbCBJc0RpYWxvZ01lc3NhZ2Uod29yZCBwdHIpIElzRGlhbG9nTWVzc2FnZSgxIDIpCis5MSAgcGFzY2FsIEdldERsZ0l0ZW0od29yZCB3b3JkKSBHZXREbGdJdGVtKDEgMikKKzkyICBwYXNjYWwgU2V0RGxnSXRlbVRleHQod29yZCBwdHIpIFNldERsZ0l0ZW1UZXh0KDEgMikKKzkzICBwYXNjYWwgR2V0RGxnSXRlbVRleHQod29yZCB3b3JkIHB0ciB3b3JkKSBHZXREbGdJdGVtVGV4dCgxIDIgMyA0KQorOTQgIHBhc2NhbCBTZXREbGdJdGVtSW50KHdvcmQgd29yZCB3b3JkIHdvcmQpIFNldERsZ0l0ZW1JbnQoMSAyIDMgNCkKKzk1ICBwYXNjYWwgR2V0RGxnSXRlbUludCh3b3JkIHdvcmQgcHRyIHdvcmQpIEdldERsZ0l0ZW1JbnQoMSAyIDMgNCkKKzk2ICBwYXNjYWwgQ2hlY2tSYWRpb0J1dHRvbih3b3JkIHdvcmQgd29yZCB3b3JkKSBDaGVja1JhZGlvQnV0dG9uKDEgMiAzIDQpCis5NyAgcGFzY2FsIENoZWNrRGxnQnV0dG9uKHdvcmQgd29yZCB3b3JkKSBDaGVja0RsZ0J1dHRvbigxIDIgMykKKzk4ICBwYXNjYWwgSXNEbGdCdXR0b25DaGVja2VkKHdvcmQgd29yZCkgSXNEbGdCdXR0b25DaGVja2VkKDEgMikKKzEwMSBwYXNjYWwgU2VuZERsZ0l0ZW1NZXNzYWdlKHdvcmQgd29yZCB3b3JkIHdvcmQgbG9uZykKKwkgICBTZW5kRGxnSXRlbU1lc3NhZ2UoMSAyIDMgNCA1KQogMTAyIHBhc2NhbCBBZGp1c3RXaW5kb3dSZWN0KHB0ciBsb25nIHdvcmQpIEFkanVzdFdpbmRvd1JlY3QoMSAyIDMpCisxMDMgcGFzY2FsIE1hcERpYWxvZ1JlY3Qod29yZCBwdHIpIE1hcERpYWxvZ1JlY3QoMSAyKQogMTA0IHBhc2NhbCBNZXNzYWdlQmVlcCh3b3JkKSBNZXNzYWdlQmVlcCgxKQogMTA2IHBhc2NhbCBHZXRLZXlTdGF0ZSh3b3JkKSBHZXRLZXlTdGF0ZSgxKQogMTA3IHBhc2NhbCBEZWZXaW5kb3dQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIERlZldpbmRvd1Byb2MoMSAyIDMgNCkKQEAgLTU1LDYgKzc5LDcgQEAKIDExOCBwYXNjYWwgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlKHB0cikgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlKDEpCiAxMTkgcGFzY2FsIEdldE1lc3NhZ2VQb3MoKSBHZXRNZXNzYWdlUG9zKCkKIDEyMCBwYXNjYWwgR2V0TWVzc2FnZVRpbWUoKSBHZXRNZXNzYWdlVGltZSgpCisxMjIgcGFzY2FsIENhbGxXaW5kb3dQcm9jKHB0ciB3b3JkIHdvcmQgd29yZCBsb25nKSBDYWxsV2luZG93UHJvYygxIDIgMyA0IDUpCiAxMjQgcGFzY2FsIFVwZGF0ZVdpbmRvdyh3b3JkKSBVcGRhdGVXaW5kb3coMSkKIDEyNSBwYXNjYWwgSW52YWxpZGF0ZVJlY3Qod29yZCBwdHIgd29yZCkgSW52YWxpZGF0ZVJlY3QoMSAyIDMpCiAxMjYgcGFzY2FsIEludmFsaWRhdGVSZ24od29yZCB3b3JkIHdvcmQpIEludmFsaWRhdGVSZ24oMSAyIDMpCkBAIC03Myw2ICs5OCw3IEBACiAxNTQgcGFzY2FsIENoZWNrTWVudSh3b3JkIHdvcmQgd29yZCkgQ2hlY2tNZW51KDEgMiAzKQogMTU3IHBhc2NhbCBHZXRNZW51KHdvcmQpIEdldE1lbnUoMSkKIDE1OCBwYXNjYWwgU2V0TWVudSh3b3JkIHdvcmQpIFNldE1lbnUoMSAyKQorMTcxIHBhc2NhbCBXaW5IZWxwKHdvcmQgd29yZCBsb25nKSBXaW5IZWxwKDEgMiAzKQogMTczIHBhc2NhbCBMb2FkQ3Vyc29yKHdvcmQgcHRyKSBMb2FkQ3Vyc29yKDEgMikKIDE3NCBwYXNjYWwgTG9hZEljb24od29yZCBwdHIpIExvYWRJY29uKDEgMikKIDE3NSBwYXNjYWwgTG9hZEJpdG1hcCh3b3JkIHB0cikgTG9hZEJpdG1hcCgxIDIpCkBAIC04MSwyNyArMTA3LDI1IEBACiAxNzkgcGFzY2FsIEdldFN5c3RlbU1ldHJpY3Mod29yZCkgR2V0U3lzdGVtTWV0cmljcygxKQogMTgwIHBhc2NhbCBHZXRTeXNDb2xvcih3b3JkKSBHZXRTeXNDb2xvcigxKQogMTgxIHBhc2NhbCBTZXRTeXNDb2xvcnMod29yZCBwdHIgcHRyKSBTZXRTeXNDb2xvcnMoMSAyIDMpCi00MzAgcGFzY2FsIGxzdHJjbXAocHRyIHB0cikgbHN0cmNtcCgxIDIpCi00MzEgcGFzY2FsIEFuc2lVcHBlcihwdHIpIEFuc2lVcHBlcigxKQotNDMyIHBhc2NhbCBBbnNpTG93ZXIocHRyKSBBbnNpTG93ZXIoMSkKLTQzMyBwYXNjYWwgSXNDaGFyQWxwaGEoYnl0ZSkgSXNDaGFyQWxwaGEoMSkKLTQzNCBwYXNjYWwgSXNDaGFyQWxwaGFudW1lcmljKGJ5dGUpIElzQ2hhckFscGhhbnVtZXJpYygxKQotNDM1IHBhc2NhbCBJc0NoYXJVcHBlcihieXRlKSBJc0NoYXJVcHBlcigxKQotNDM2IHBhc2NhbCBJc0NoYXJMb3dlcihieXRlKSBJc0NoYXJMb3dlcigxKQotNDM3IHBhc2NhbCBBbnNpVXBwZXJCdWZmKHB0ciB3b3JkKSBBbnNpVXBwZXJCdWZmKDEgMikKLTQzOCBwYXNjYWwgQW5zaUxvd2VyQnVmZihwdHIgd29yZCkgQW5zaUxvd2VyQnVmZigxIDIpCi00NzEgcGFzY2FsIGxzdHJjbXBpKHB0ciBwdHIpIGxzdHJjbXBpKDEgMikKLTQ3MiBwYXNjYWwgQW5zaU5leHQocHRyKSBBbnNpTmV4dCgxICkKLTQ3MyBwYXNjYWwgQW5zaVByZXYocHRyIHB0cikgQW5zaVByZXYoMSAyKQotCi0KLQotCiAxODIgcGFzY2FsIEtpbGxTeXN0ZW1UaW1lcih3b3JkIHdvcmQpIEtpbGxTeXN0ZW1UaW1lcigxIDIpCiAxOTAgcGFzY2FsIEdldFVwZGF0ZVJlY3Qod29yZCBwdHIgd29yZCkgR2V0VXBkYXRlUmVjdCgxIDIgMykKKzIxOSBwYXNjYWwgQ3JlYXRlRGlhbG9nSW5kaXJlY3Qod29yZCBwdHIgd29yZCBwdHIpCisJICAgQ3JlYXRlRGlhbG9nSW5kaXJlY3QoMSAyIDMgNCkKKzIyNyBwYXNjYWwgR2V0TmV4dERsZ0dyb3VwSXRlbSh3b3JkIHdvcmQgd29yZCkgR2V0TmV4dERsZ0dyb3VwSXRlbSgxIDIgMykKKzIyOCBwYXNjYWwgR2V0TmV4dERsZ1RhYkl0ZW0od29yZCB3b3JkIHdvcmQpIEdldE5leHREbGdUYWJJdGVtKDEgMiAzKQorMjI5IHBhc2NhbCBHZXRUb3BXaW5kb3cod29yZCkgR2V0VG9wV2luZG93KDEpCisyMzAgcGFzY2FsIEdldE5leHRXaW5kb3cod29yZCB3b3JkKSBHZXROZXh0V2luZG93KDEgMikKKzIzMiBwYXNjYWwgU2V0V2luZG93UG9zKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIAorICAgICAgICAgICBTZXRXaW5kb3dQb3MoMSAyIDMgNCA1IDYgNykKIDIzNyBwYXNjYWwgR2V0VXBkYXRlUmduKHdvcmQgd29yZCB3b3JkKSBHZXRVcGRhdGVSZ24oMSAyIDMpCisyNDEgcGFzY2FsIENyZWF0ZURpYWxvZ1BhcmFtKHdvcmQgcHRyIHdvcmQgcHRyIGxvbmcpCisJICAgQ3JlYXRlRGlhbG9nUGFyYW0oMSAyIDMgNCA1KQorMjQyIHBhc2NhbCBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtKHdvcmQgcHRyIHdvcmQgcHRyIGxvbmcpCisJICAgQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbSgxIDIgMyA0IDUpCiAyNDQgcGFzY2FsIEVxdWFsUmVjdChwdHIgcHRyKSBFcXVhbFJlY3QoMSAyKQorMjYyIHBhc2NhbCBHZXRXaW5kb3cod29yZCB3b3JkKSBHZXRXaW5kb3coMSAyKQogMjY2IHBhc2NhbCBTZXRNZXNzYWdlUXVldWUod29yZCkgU2V0TWVzc2FnZVF1ZXVlKDEpCisyNzcgcGFzY2FsIEdldERsZ0N0cmxJRCh3b3JkKSBHZXREbGdDdHJsSUQoMSkKIDI4NiBwYXNjYWwgR2V0RGVza3RvcFdpbmRvdygpIEdldERlc2t0b3BXaW5kb3coKQogMjg4IHBhc2NhbCBHZXRNZXNzYWdlRXh0cmFJbmZvKCkgR2V0TWVzc2FnZUV4dHJhSW5mbygpCiAzMjQgcGFzY2FsIEZpbGxXaW5kb3cod29yZCB3b3JkIHdvcmQgd29yZCkgRmlsbFdpbmRvdygxIDIgMyA0KQpAQCAtMTExLDQgKzEzNSwyMCBAQAogMzczIHBhc2NhbCBTdWJ0cmFjdFJlY3QocHRyIHB0ciBwdHIpIFN1YnRyYWN0UmVjdCgxIDIgMykKIDQwMyBwYXNjYWwgVW5yZWdpc3RlckNsYXNzKHB0ciB3b3JkKSBVbnJlZ2lzdGVyQ2xhc3MoMSAyKQogNDExIHBhc2NhbCBBcHBlbmRNZW51KHdvcmQgd29yZCB3b3JkIHB0cikgQXBwZW5kTWVudSgxIDIgMyA0KQorNDIwIHBhc2NhbCB3c3ByaW50ZihwdHIgcHRyKSB3c3ByaW50ZigxIDIpCiA0MjEgcGFzY2FsIHd2c3ByaW50ZihwdHIgcHRyIHB0cikgd3ZzcHJpbnRmKDEgMiAzKQorNDMwIHBhc2NhbCBsc3RyY21wKHB0ciBwdHIpIGxzdHJjbXAoMSAyKQorNDMxIHBhc2NhbCBBbnNpVXBwZXIocHRyKSBBbnNpVXBwZXIoMSkKKzQzMiBwYXNjYWwgQW5zaUxvd2VyKHB0cikgQW5zaUxvd2VyKDEpCis0MzMgcGFzY2FsIElzQ2hhckFscGhhKGJ5dGUpIElzQ2hhckFscGhhKDEpCis0MzQgcGFzY2FsIElzQ2hhckFscGhhbnVtZXJpYyhieXRlKSBJc0NoYXJBbHBoYW51bWVyaWMoMSkKKzQzNSBwYXNjYWwgSXNDaGFyVXBwZXIoYnl0ZSkgSXNDaGFyVXBwZXIoMSkKKzQzNiBwYXNjYWwgSXNDaGFyTG93ZXIoYnl0ZSkgSXNDaGFyTG93ZXIoMSkKKzQzNyBwYXNjYWwgQW5zaVVwcGVyQnVmZihwdHIgd29yZCkgQW5zaVVwcGVyQnVmZigxIDIpCis0MzggcGFzY2FsIEFuc2lMb3dlckJ1ZmYocHRyIHdvcmQpIEFuc2lMb3dlckJ1ZmYoMSAyKQorNDUyIHBhc2NhbCBDcmVhdGVXaW5kb3dFeChsb25nIHB0ciBwdHIgbG9uZyBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgCisJICAgICAgICAgICAgICAgICAgd29yZCB3b3JkIHdvcmQgcHRyKSAKKwkgICBDcmVhdGVXaW5kb3dFeCgxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMikKKzQ3MSBwYXNjYWwgbHN0cmNtcGkocHRyIHB0cikgbHN0cmNtcGkoMSAyKQorNDcyIHBhc2NhbCBBbnNpTmV4dChwdHIpIEFuc2lOZXh0KDEgKQorNDczIHBhc2NhbCBBbnNpUHJldihwdHIgcHRyKSBBbnNpUHJldigxIDIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbWJvLmggYi9pbmNsdWRlL2NvbWJvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYTFkOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvY29tYm8uaApAQCAtMCwwICsxLDE1IEBACisvKgorICogQ29tYm8gYm94IGRlZmluaXRpb25zCisgKi8KKworCit0eXBlZGVmIHN0cnVjdCB0YWdIRUFEQ09NQk8geworICAgIERXT1JECWR3U3R5bGU7CisgICAgRFdPUkQJZHdTdGF0ZTsKKyAgICBIV05ECWhXbmREcm9wOworICAgIEhXTkQJaFduZEVkaXQ7CisgICAgSFdORAloV25kTEJveDsKK30gSEVBRENPTUJPOwordHlwZWRlZiBIRUFEQ09NQk8gRkFSKiBMUEhFQURDT01CTzsKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RpYWxvZy5oIGIvaW5jbHVkZS9kaWFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTBjOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kaWFsb2cuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogRGlhbG9nIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBESUFMT0dfSAorI2RlZmluZSBESUFMT0dfSAorCisjaW5jbHVkZSAid2luZG93cy5oIgorCisjZGVmaW5lIERJQUxPR19DTEFTU19OQU1FICAgICIjMzI3NzAiICAvKiBJbnRlZ2VyIGF0b20gKi8KKworCisgIC8qIERpYWxvZyBpbmZvIHN0cnVjdHVyZS4KKyAgICogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIGludG8gdGhlIHdpbmRvdyBleHRyYSBieXRlcyAoY2JXbmRFeHRyYSkuCisgICAqIHNpemVvZihESUFMT0dJTkZPKSBtdXN0IGJlIDw9IERMR1dJTkRPV0VYVFJBICg9MzApLgorICAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTE9ORyAgICAgIG1zZ1Jlc3VsdDsKKyAgICBGQVJQUk9DICAgZGxnUHJvYzsKKyAgICBMT05HICAgICAgdXNlckluZm87CisgICAgSFdORCAgICAgIGh3bmRGb2N1czsKKyAgICBIRk9OVCAgICAgaFVzZXJGb250OworICAgIEhNRU5VICAgICBoTWVudTsKKyAgICBXT1JEICAgICAgeEJhc2VVbml0OworICAgIFdPUkQgICAgICB5QmFzZVVuaXQ7CisgICAgV09SRCAgICAgIGZFbmQ7Cit9IERJQUxPR0lORk87CisKKworICAvKiBEaWFsb2cgdGVtcGxhdGUgaGVhZGVyICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIERXT1JEICAgICBzdHlsZTsgICAgCisgICAgQllURSAgICAgIG5iSXRlbXMgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworICAgIFdPUkQgICAgICB4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICBXT1JEICAgICAgeSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisgICAgV09SRCAgICAgIGN4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyAgICBXT1JEICAgICAgY3kgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBETEdURU1QTEFURUhFQURFUjsKKworCisgIC8qIERpYWxvZyBjb250cm9sIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBXT1JEICAgICAgIHg7CisgICAgV09SRCAgICAgICB5OworICAgIFdPUkQgICAgICAgY3g7CisgICAgV09SRCAgICAgICBjeTsKKyAgICBXT1JEICAgICAgIGlkOworICAgIERXT1JEICAgICAgc3R5bGUgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBETEdDT05UUk9MSEVBREVSOworCisKKyAgLyogRGlhbG9nIGNvbnRyb2wgZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBETEdDT05UUk9MSEVBREVSICogaGVhZGVyOworICAgIExQU1RSICAgICAgICAgICAgICBjbGFzczsKKyAgICBMUFNUUiAgICAgICAgICAgICAgdGV4dDsKK30gRExHQ09OVFJPTDsKKworCisgIC8qIERpYWxvZyB0ZW1wbGF0ZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBETEdURU1QTEFURUhFQURFUiAqIGhlYWRlcjsKKyAgICB1bnNpZ25lZCBjaGFyICogICAgIG1lbnVOYW1lOworICAgIExQU1RSICAgICAgICAgICAgICAgY2xhc3NOYW1lOworICAgIExQU1RSICAgICAgICAgICAgICAgY2FwdGlvbjsKKyAgICBXT1JEICAgICAgICAgICAgICAgIHBvaW50U2l6ZTsKKyAgICBMUFNUUiAgICAgICAgICAgICAgIGZhY2VOYW1lOworICAgIERMR0NPTlRST0wgKiAgICAgICAgY29udHJvbHM7Cit9IERMR1RFTVBMQVRFOworCisKKyNlbmRpZiAgLyogRElBTE9HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmlsZXMuaCBiL2luY2x1ZGUvZmlsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjYyOGEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9maWxlcy5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX0ZJTEVTX0gKKyNkZWZpbmUgX0ZJTEVTX0gKKworI2RlZmluZSBPUEVOX01BWCAyNTYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFRoaXMgc3RydWN0dXJlIHN0b3JlcyB0aGUgaW5mb21hdGlvbiBuZWVkZWQgZm9yIGEgc2luZ2xlIERPUyBkcml2ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBEb3NEcml2ZVN0cnVjdAoreworICBjaGFyIFJvb3REaXJlY3RvcnkgWzI1Nl07ICAgIC8qIFVuaXggYmFzZSBmb3IgdGhpcyBkcml2ZSBsZXR0ZXIgKi8KKyAgY2hhciBDdXJyZW50RGlyZWN0b3J5IFsyNTZdOyAvKiBDdXJyZW50IGRpcmVjdG9yeSBmb3IgdGhpcyBkcml2ZSAqLworICBjaGFyIFZvbHVtZUxhYmVsIFsxMV07CisgIHVuc2lnbmVkIGxvbmcJc2VyaWFsbnVtYmVyOworfTsKKworI2VuZGlmIC8qX0ZJTEVTX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbnQyMS5oIGIvaW5jbHVkZS9pbnQyMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2FiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ludDIxLmgKQEAgLTAsMCArMSw5MyBAQAorI2lmbmRlZiBJTlQyMV9ICisjZGVmaW5lIElOVDIxX0gKKworI2RlZmluZSBEb3NWZXJzaW9uIAkgIDB4MDMwMzsKKworI2RlZmluZSBTZWN0b3JTaXplIAkgIDB4MjAwOworI2RlZmluZSBTZWN0b3JzUGVyQ2x1c3RlciAweDA0OworCisjZGVmaW5lIEFYIGNvbnRleHQtPnNjX2VheAorI2RlZmluZSBCWCBjb250ZXh0LT5zY19lYngKKyNkZWZpbmUgQ1ggY29udGV4dC0+c2NfZWN4CisjZGVmaW5lIERYIGNvbnRleHQtPnNjX2VkeAorI2RlZmluZSBFUyBjb250ZXh0LT5zY19lcworI2RlZmluZSBEUyBjb250ZXh0LT5zY19kcworI2RlZmluZSBESSBjb250ZXh0LT5zY19lZGkKKyNkZWZpbmUgU0kgY29udGV4dC0+c2NfZXNpCisKKyNkZWZpbmUgcG9pbnRlcihhLGIpIAkoKCh1bnNpZ25lZCBpbnQpIGEgPDwgMTYpIHwgYikKKyNkZWZpbmUgc2VnbWVudChhKSAJKGEgPj4gMTYpCisjZGVmaW5lIG9mZnNldChhKQkoYSAmIDB4ZmZmZikKKworI2RlZmluZSBTZXRDZmxhZwkoY29udGV4dC0+c2NfZWZsIHw9IDB4MDAwMDAwMDFMKQorI2RlZmluZSBSZXNldENmbGFnCShjb250ZXh0LT5zY19lZmwgJj0gMHhmZmZmZmZmZUwpCisKK3N0cnVjdCBkaXNraW5mbyB7CisJV09SRAlpbmZvbGV2ZWw7CisJRFdPUkQJc2VyaWFsbnVtYmVyOworCWNoYXIJbGFiZWxbMTFdOworCWNoYXIJZnN0eXBlWzhdOworfTsKKworLyogZXh0ZW5kZWQgZXJyb3IgY29kZXMgKi8KKworI2RlZmluZSBOb0Vycm9yCQkweDAwCisjZGVmaW5lIEludmFsaWRGdW5jdGlvbiAweDAxCisjZGVmaW5lIEZpbGVOb3RGb3VuZAkweDAyCisjZGVmaW5lIFBhdGhOb3RGb3VuZAkweDAzCisjZGVmaW5lIEFjY2Vzc0RlbmllZAkweDA1CisjZGVmaW5lIEludmFsaWRIYW5kbGUJMHgwNgorI2RlZmluZSBNQ0JEZXN0cm95ZWQJMHgwNworI2RlZmluZQlPdXRPZk1lbW9yeQkweDA4CisjZGVmaW5lIE1DQkludmFsaWQJMHgwOQorI2RlZmluZSBEYXRhSW52YWxpZAkweDBkCisjZGVmaW5lIEludmFsaWREcml2ZQkweDBmCisjZGVmaW5lIENhbk5vdFJlbW92ZUN3ZAkweDEwCisjZGVmaW5lCU5vdFNhbWVEZXZpY2UJMHgxMQorI2RlZmluZSBOb01vcmVGaWxlcwkweDEyCisjZGVmaW5lIFdyaXRlUHJvdGVjdGVkICAweDEzCisjZGVmaW5lCVVua25vd25Vbml0CTB4MTQKKyNkZWZpbmUgRHJpdmVOb3RSZWFkeQkweDE1CisjZGVmaW5lIFVua25vd25Db21tYW5kCTB4MTYKKyNkZWZpbmUgQ1JDRXJyb3IJMHgxNworI2RlZmluZQlCYWRScUxlbmd0aAkweDE4CisjZGVmaW5lIFNlZWtFcnJvcgkweDE5CisjZGVmaW5lCVVua25vd25NZWRpYQkweDFhCisjZGVmaW5lCVNlY3Rvck5vdEZvdW5kCTB4MWIKKyNkZWZpbmUgT3V0T2ZQYXBlcgkweDFjCisjZGVmaW5lIFdyaXRlRmF1bHQJMHgxZAorI2RlZmluZSBSZWFkRmF1bHQJMHgxZQorI2RlZmluZQlHZW5lcmFsRmFpbHVyZQkweDFmCisjZGVmaW5lIFNoYXJlVmlvbGF0aW9uCTB4MjAKKyNkZWZpbmUgTG9ja1Zpb2xhdGlvbgkweDIxCisjZGVmaW5lIERpc2tGdWxsCTB4MjcKKyNkZWZpbmUgTm9OZXR3b3JrCTB4NDkKKyNkZWZpbmUgRmlsZUV4aXN0cwkweDUwCisjZGVmaW5lIENhbk5vdE1ha2VEaXIJMHg1MgorCisvKiBFcnJvciBjbGFzc2VzICovCisKKyNkZWZpbmUgRUNfVGVtcG9yYXJ5CTB4MDIKKyNkZWZpbmUgRUNfQWNjZXNzRGVuaWVkCTB4MDMKKyNkZWZpbmUgRUNfQXBwRXJyb3IJMHgwNAorI2RlZmluZSBFQ19TeXN0ZW1GYWlsdXJlIDB4MDYKKyNkZWZpbmUgRUNfTm90Rm91bmQJMHgwOAorI2RlZmluZQlFQ19NZWRpYUVycm9yCTB4MGIKKyNkZWZpbmUgRUNfRXhpc3RzCTB4MGMKKyNkZWZpbmUJRUNfVW5rbm93bgkweDBkCisKKy8qIFN1Z2dlc3RlZCBhY3Rpb25zICovCisKKyNkZWZpbmUJU0FfUmV0cnkJMHgwMQorI2RlZmluZSBTQV9BYm9ydAkweDA0CisjZGVmaW5lIFNBX0lnbm9yZQkweDA2CisjZGVmaW5lIFNBX0FzazRSZXRyeQkweDA3CisKKy8qIEVycm9yIGxvY3VzICovCisKKyNkZWZpbmUgRUxfVW5rbm93bgkweDAxCisjZGVmaW5lIEVMX0Rpc2sJCTB4MDIKKyNkZWZpbmUgRUxfTmV0d29yawkweDAzCisjZGVmaW5lIEVMX01lbW9yeQkweDA1CisKKyNlbmRpZiAvKiBJTlQyMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpc3Rib3guaCBiL2luY2x1ZGUvbGlzdGJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NGNmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpc3Rib3guaApAQCAtMCwwICsxLDMxIEBACisvKgorICogICBMaXN0IEJveCBkZWZpbml0aW9ucworICovCisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTElTVFNUUlVDVCB7CisgICAgRFJBV0lURU1TVFJVQ1QgCWRpczsKKyAgICBIQU5ETEUJCWhNZW07CisgICAgSEFORExFCQloRGF0YTsKKyAgICB2b2lkCQkqbHBOZXh0OworfSBMSVNUU1RSVUNUOwordHlwZWRlZiBMSVNUU1RSVUNUIEZBUiogTFBMSVNUU1RSVUNUOworCisKK3R5cGVkZWYgc3RydWN0IHRhZ0hFQURMSVNUIHsKKyAgICBzaG9ydAlGaXJzdFZpc2libGU7CisgICAgc2hvcnQJSXRlbVNlbGVjdDsKKyAgICBzaG9ydAlJdGVtc0NvdW50OworICAgIHNob3J0CUl0ZW1zVmlzaWJsZTsKKyAgICBzaG9ydAlJdGVtU2VsZWN0ZWQ7CisgICAgc2hvcnQJUHJldlNlbGVjdGVkOworICAgIHNob3J0IAlTdGRJdGVtSGVpZ2h0OworICAgIHNob3J0CURyYXdDdGxUeXBlOworICAgIHZvaWQJKmxwRmlyc3Q7IAorICAgIERXT1JECWR3U3R5bGU7CisgICAgSFdORAloV25kU2Nyb2xsOworICAgIEhXTkQJaFduZExvZ2ljUGFyZW50OworfSBIRUFETElTVDsKK3R5cGVkZWYgSEVBRExJU1QgRkFSKiBMUEhFQURMSVNUOworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvdG90eXBlcy5oIGIvaW5jbHVkZS9wcm90b3R5cGVzLmgKaW5kZXggMzk1NjBkZC4uYzFjN2JmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm90b3R5cGVzLmgKKysrIGIvaW5jbHVkZS9wcm90b3R5cGVzLmgKQEAgLTMwLDUgKzMwLDggQEAKIGV4dGVybiBzdHJ1Y3QgbXpfaGVhZGVyX3MgKkN1cnJlbnRNWkhlYWRlcjsKIGV4dGVybiBzdHJ1Y3QgbmVfaGVhZGVyX3MgKkN1cnJlbnRORUhlYWRlcjsKIGV4dGVybiBpbnQgQ3VycmVudE5FRmlsZTsKK2V4dGVybiBkb19pbnQxQShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKiBjb250ZXh0KTsKK2V4dGVybiBkb19pbnQyMShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKiBjb250ZXh0KTsKIAogI2VuZGlmIC8qIFBST1RPVFlQRVNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlZ2Z1bmMuaCBiL2luY2x1ZGUvcmVnZnVuYy5oCmluZGV4IDI2MzY3NWYuLmUzMWU5YWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmVnZnVuYy5oCisrKyBiL2luY2x1ZGUvcmVnZnVuYy5oCkBAIC02LDE2ICs2LDE2IEBACiAKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCAqU3RhY2sxNkZyYW1lOwogCi0jZGVmaW5lIF9BWAlTdGFjazE2RnJhbWVbMjFdCi0jZGVmaW5lIF9CWAlTdGFjazE2RnJhbWVbMThdCi0jZGVmaW5lIF9DWAlTdGFjazE2RnJhbWVbMjBdCi0jZGVmaW5lIF9EWAlTdGFjazE2RnJhbWVbMTldCi0jZGVmaW5lIF9TUAlTdGFjazE2RnJhbWVbMTddCi0jZGVmaW5lIF9CUAlTdGFjazE2RnJhbWVbMTZdCi0jZGVmaW5lIF9TSQlTdGFjazE2RnJhbWVbMTVdCi0jZGVmaW5lIF9ESQlTdGFjazE2RnJhbWVbMTRdCi0jZGVmaW5lIF9EUwlTdGFjazE2RnJhbWVbMTNdCi0jZGVmaW5lIF9FUwlTdGFjazE2RnJhbWVbMTJdCisjZGVmaW5lIF9BWAlTdGFjazE2RnJhbWVbMzRdCisjZGVmaW5lIF9CWAlTdGFjazE2RnJhbWVbMjhdCisjZGVmaW5lIF9DWAlTdGFjazE2RnJhbWVbMzJdCisjZGVmaW5lIF9EWAlTdGFjazE2RnJhbWVbMzBdCisjZGVmaW5lIF9TUAlTdGFjazE2RnJhbWVbMjZdCisjZGVmaW5lIF9CUAlTdGFjazE2RnJhbWVbMjRdCisjZGVmaW5lIF9TSQlTdGFjazE2RnJhbWVbMjJdCisjZGVmaW5lIF9ESQlTdGFjazE2RnJhbWVbMjBdCisjZGVmaW5lIF9EUwlTdGFjazE2RnJhbWVbMThdCisjZGVmaW5lIF9FUwlTdGFjazE2RnJhbWVbMTZdCiAKIGV4dGVybiB2b2lkIFJldHVybkZyb21SZWdpc3RlckZ1bmModm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2Nyb2xsLmggYi9pbmNsdWRlL3Njcm9sbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZDRlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Njcm9sbC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiAgIFNjcm9sbCBCYXIgZGVmaW5pdGlvbnMKKyAqLworCisKK3R5cGVkZWYgc3RydWN0IHRhZ0hFQURTU0NST0xMIHsKKyAgICBzaG9ydAlDdXJWYWw7CisgICAgc2hvcnQJTWluVmFsOworICAgIHNob3J0CU1heFZhbDsKKyAgICBzaG9ydAlNYXhQaXg7CisgICAgc2hvcnQJQ3VyUGl4OworICAgIEJPT0wJVGh1bWJBY3RpdmU7CisgICAgV09SRAlEaXJlY3Rpb247CisgICAgRFdPUkQJZHdTdHlsZTsKKyAgICBIV05ECWhXbmRVcDsKKyAgICBIV05ECWhXbmREb3duOworfSBIRUFEU0NST0xMOwordHlwZWRlZiBIRUFEU0NST0xMIEZBUiogTFBIRUFEU0NST0xMOworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggOWM4ZTBkMi4uZGQ5MzdjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTUsNiArNSw3IEBACiAKICNpZm5kZWYgX1dJTkFSR1MKIAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVSU5UOwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBXT1JEOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIERXT1JEOwogI2lmbmRlZiBfV0lOTUFJTgpAQCAtMTIsNiArMTMsNjEgQEAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBCWVRFOwogI2VuZGlmCiB0eXBlZGVmIGxvbmcgTE9ORzsKK3R5cGVkZWYgVUlOVCBXUEFSQU07Cit0eXBlZGVmIExPTkcgTFBBUkFNOwordHlwZWRlZiBMT05HIExSRVNVTFQ7Cit0eXBlZGVmIFdPUkQgSEFORExFOworI2RlZmluZSBERUNMQVJFX0hBTkRMRShhKSB0eXBlZGVmIEhBTkRMRSBhOworCitERUNMQVJFX0hBTkRMRShIVEFTSyk7CitERUNMQVJFX0hBTkRMRShIRFJWUik7CitERUNMQVJFX0hBTkRMRShIV05EKTsKK0RFQ0xBUkVfSEFORExFKEhEQyk7CitERUNMQVJFX0hBTkRMRShIQ0xBU1MpOworREVDTEFSRV9IQU5ETEUoSENVUlNPUik7CitERUNMQVJFX0hBTkRMRShIRk9OVCk7CitERUNMQVJFX0hBTkRMRShIUEVOKTsKK0RFQ0xBUkVfSEFORExFKEhSR04pOworREVDTEFSRV9IQU5ETEUoSFBBTEVUVEUpOworREVDTEFSRV9IQU5ETEUoSElDT04pOworREVDTEFSRV9IQU5ETEUoSElOU1RBTkNFKTsKK0RFQ0xBUkVfSEFORExFKEhNRU5VKTsKK0RFQ0xBUkVfSEFORExFKEhCSVRNQVApOworREVDTEFSRV9IQU5ETEUoSEJSVVNIKTsKK0RFQ0xBUkVfSEFORExFKExPQ0FMSEFORExFKTsKKwordHlwZWRlZiBjaGFyICpMUFNUUjsKK3R5cGVkZWYgY29uc3QgY2hhciAqTFBDU1RSOwordHlwZWRlZiBjaGFyICpOUFNUUjsKK3R5cGVkZWYgc2hvcnQgKkxQSU5UOwordHlwZWRlZiB2b2lkICpMUFZPSUQ7Cit0eXBlZGVmIGxvbmcgKCpGQVJQUk9DKSgpOwordHlwZWRlZiBpbnQgQ0FUQ0hCVUZbOV07Cit0eXBlZGVmIGludCAqTFBDQVRDSEJVRjsKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBDV19VU0VERUZBVUxUICgoc2hvcnQpMHg4MDAwKQorI2RlZmluZSBGQVIKKyNkZWZpbmUgTkVBUgorI2RlZmluZSBQQVNDQUwKKyNkZWZpbmUgVk9JRCAgICAgICAgICAgICAgICB2b2lkCisjZGVmaW5lIFdJTkFQSSAgICAgICAgICAgICAgUEFTQ0FMCisjZGVmaW5lIENBTExCQUNLICAgICAgICAgICAgUEFTQ0FMCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAodm9pZCAqKTAKKyNlbmRpZgorCisjZGVmaW5lIExPQllURSh3KSAgICAgICAgICAgKChCWVRFKSh3KSkKKyNkZWZpbmUgSElCWVRFKHcpICAgICAgICAgICAoKEJZVEUpKChVSU5UKSh3KSA+PiA4KSkKKworI2RlZmluZSBMT1dPUkQobCkgICAgICAgICAgICgoV09SRCkobCkpCisjZGVmaW5lIEhJV09SRChsKSAgICAgICAgICAgKChXT1JEKSgoRFdPUkQpKGwpID4+IDE2KSkKKworI2RlZmluZSBNQUtFTE9ORyhsb3csIGhpZ2gpICgoTE9ORykoKChXT1JEKShsb3cpKSB8ICgoKERXT1JEKSgoV09SRCkoaGlnaCkpKSA8PCAxNikpKQorCisvKgordHlwZWRlZiBsb25nIExPTkc7CiB0eXBlZGVmIFdPUkQgSEFORExFOwogdHlwZWRlZiBIQU5ETEUgSFdORDsKIHR5cGVkZWYgSEFORExFIEhEQzsKQEAgLTQ0LDYgKzEwMCw3IEBACiAjaWZuZGVmIE5VTEwKICNkZWZpbmUgTlVMTCAodm9pZCAqKTAKICNlbmRpZgorKi8KIAogI2RlZmluZSBNQUtFTFBBUkFNKGxvdywgaGlnaCkgKChMT05HKSgoKFdPUkQpKGxvdykpIHwgXAogCQkJICAgICAgKCgoRFdPUkQpKChXT1JEKShoaWdoKSkpIDw8IDE2KSkpCkBAIC0xMzMsNiArMTkwLDQ2IEBACiAjZGVmaW5lIERXTF9ETEdQUk9DCSAgICA0CiAjZGVmaW5lIERXTF9VU0VSCSAgICA4CiAKKyAgLyogR2V0V2luZG93KCkgY29uc3RhbnRzICovCisjZGVmaW5lIEdXX0hXTkRGSVJTVAkwCisjZGVmaW5lIEdXX0hXTkRMQVNUCTEKKyNkZWZpbmUgR1dfSFdORE5FWFQJMgorI2RlZmluZSBHV19IV05EUFJFVgkzCisjZGVmaW5lIEdXX09XTkVSCTQKKyNkZWZpbmUgR1dfQ0hJTEQJNQorCisgIC8qIERpYWxvZ3MgKi8KKworICAvKiBjYlduZEV4dHJhIGJ5dGVzIGZvciBkaWFsb2cgY2xhc3MgKi8KKyNkZWZpbmUgRExHV0lORE9XRVhUUkEgICAgICAzMAorCisgIC8qIERpYWxvZyBzdHlsZXMgKi8KKyNkZWZpbmUgRFNfQUJTQUxJR04gICAgICAgICAweDAwMQorI2RlZmluZSBEU19TWVNNT0RBTCAgICAgICAgIDB4MDAyCisjZGVmaW5lIERTX0xPQ0FMRURJVCAgICAgICAgMHgwMjAKKyNkZWZpbmUgRFNfU0VURk9OVCAgICAgICAgICAweDA0MAorI2RlZmluZSBEU19NT0RBTEZSQU1FICAgICAgIDB4MDgwCisjZGVmaW5lIERTX05PSURMRU1TRyAgICAgICAgMHgxMDAKKworICAvKiBEaWFsb2cgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRE1fR0VUREVGSUQgICAgICAgICAoV01fVVNFUiswKQorI2RlZmluZSBETV9TRVRERUZJRCAgICAgICAgIChXTV9VU0VSKzEpCisKKyNkZWZpbmUgRENfSEFTREVGSUQgICAgICAgICAweDUzNGIKKworICAvKiBXTV9HRVRETEdDT0RFIHZhbHVlcyAqLworI2RlZmluZSBETEdDX1dBTlRBUlJPV1MgICAgICAweDAwMDEKKyNkZWZpbmUgRExHQ19XQU5UVEFCICAgICAgICAgMHgwMDAyCisjZGVmaW5lIERMR0NfV0FOVEFMTEtFWVMgICAgIDB4MDAwNAorI2RlZmluZSBETEdDX1dBTlRNRVNTQUdFICAgICAweDAwMDQKKyNkZWZpbmUgRExHQ19IQVNTRVRTRUwgICAgICAgMHgwMDA4CisjZGVmaW5lIERMR0NfREVGUFVTSEJVVFRPTiAgIDB4MDAxMAorI2RlZmluZSBETEdDX1VOREVGUFVTSEJVVFRPTiAweDAwMjAKKyNkZWZpbmUgRExHQ19SQURJT0JVVFRPTiAgICAgMHgwMDQwCisjZGVmaW5lIERMR0NfV0FOVENIQVJTICAgICAgIDB4MDA4MAorI2RlZmluZSBETEdDX1NUQVRJQyAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgRExHQ19CVVRUT04gICAgICAgICAgMHgyMDAwCisKIAogdHlwZWRlZiBzdHJ1Y3QgeyBzaG9ydCB4LCB5OyB9IFBPSU5UOwogdHlwZWRlZiBQT0lOVCAqUFBPSU5UOwpAQCAtNzg3LDYgKzg4NCwxMSBAQAogCVdNX0RFTEVURUlURU0sIFdNX1ZLRVlUT0lURU0sCiAJV01fQ0hBUlRPSVRFTSwgV01fU0VURk9OVCwgV01fR0VURk9OVCB9OwogCisjZGVmaW5lIFdNX05DQ1JFQVRFICAgICAgICAgMHgwMDgxCisjZGVmaW5lIFdNX05DREVTVFJPWSAgICAgICAgMHgwMDgyCisKKyNkZWZpbmUgV01fR0VURExHQ09ERQkgICAgMHgwMDg3CisKICAgLyogS2V5Ym9hcmQgbWVzc2FnZXMgKi8KICNkZWZpbmUgV01fS0VZRE9XTiAgICAgICAgICAweDAxMDAKICNkZWZpbmUgV01fS0VZVVAgICAgICAgICAgICAweDAxMDEKQEAgLTc5OCwxMSArOTAwLDE2IEBACiAjZGVmaW5lIFdNX1NZU0RFQURDSEFSICAgICAgMHgwMTA3CiAjZGVmaW5lIFdNX0tFWUZJUlNUICAgICAgICAgV01fS0VZRE9XTgogI2RlZmluZSBXTV9LRVlMQVNUICAgICAgICAgIDB4MDEwOAotIAorCisjZGVmaW5lIFdNX0lOSVRESUFMT0cgICAgICAgMHgwMTEwIAogI2RlZmluZSBXTV9DT01NQU5EICAgICAgICAgIDB4MDExMQogI2RlZmluZSBXTV9USU1FUgkgICAgMHgwMTEzCiAjZGVmaW5lIFdNX1NZU1RJTUVSCSAgICAweDAxMTgKIAorICAvKiBzY3JvbGwgbWVzc2FnZXMgKi8KKyNkZWZpbmUgV01fSFNDUk9MTCAgICAgICAgICAweDAxMTQKKyNkZWZpbmUgV01fVlNDUk9MTCAgICAgICAgICAweDAxMTUKKwogICAvKiBNb3VzZSBtZXNzYWdlcyAqLwogI2RlZmluZSBXTV9NT1VTRU1PVkUJICAgIDB4MDIwMAogI2RlZmluZSBXTV9MQlVUVE9ORE9XTgkgICAgMHgwMjAxCkBAIC04MTcsNiArOTI0LDEzIEBACiAjZGVmaW5lIFdNX01PVVNFRklSU1QJICAgIFdNX01PVVNFTU9WRQogI2RlZmluZSBXTV9NT1VTRUxBU1QJICAgIFdNX01CVVRUT05EQkxDTEsKIAorI2RlZmluZSBXTV9QQVJFTlROT1RJRlkgICAgIDB4MDIxMAorCisgIC8qIG1pc2MgbWVzc2FnZXMgKi8KKyNkZWZpbmUgV01fTlVMTCAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgV01fVVNFUiAgICAgICAgICAgICAweDA0MDAKKworCiAgIC8qIEtleSBzdGF0dXMgZmxhZ3MgZm9yIG1vdXNlIGV2ZW50cyAqLwogI2RlZmluZSBNS19MQlVUVE9OCSAgICAweDAwMDEKICNkZWZpbmUgTUtfUkJVVFRPTgkgICAgMHgwMDAyCkBAIC04NTEsNiArOTY1LDMwIEBACiAjZGVmaW5lIFNJWkVfTUFYU0hPVyAgICAgICAgIDMKICNkZWZpbmUgU0laRV9NQVhISURFICAgICAgICAgNAogCisvKiBTZXRXaW5kb3dQb3MoKSBhbmQgV0lORE9XUE9TIGZsYWdzICovCisjZGVmaW5lIFNXUF9OT1NJWkUgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFNXUF9OT01PVkUgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNXUF9OT1pPUkRFUiAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNXUF9OT1JFRFJBVyAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNXUF9OT0FDVElWQVRFICAgICAgMHgwMDEwCisjZGVmaW5lIFNXUF9GUkFNRUNIQU5HRUQgICAgMHgwMDIwICAvKiBUaGUgZnJhbWUgY2hhbmdlZDogc2VuZCBXTV9OQ0NBTENTSVpFICovCisjZGVmaW5lIFNXUF9TSE9XV0lORE9XICAgICAgMHgwMDQwCisjZGVmaW5lIFNXUF9ISURFV0lORE9XICAgICAgMHgwMDgwCisjZGVmaW5lIFNXUF9OT0NPUFlCSVRTICAgICAgMHgwMTAwCisjZGVmaW5lIFNXUF9OT09XTkVSWk9SREVSICAgMHgwMjAwICAvKiBEb24ndCBkbyBvd25lciBaIG9yZGVyaW5nICovCisKKyNkZWZpbmUgU1dQX0RSQVdGUkFNRSAgICAgICBTV1BfRlJBTUVDSEFOR0VECisjZGVmaW5lIFNXUF9OT1JFUE9TSVRJT04gICAgU1dQX05PT1dORVJaT1JERVIKKworI2RlZmluZSBTV1BfTk9TRU5EQ0hBTkdJTkcgIDB4MDQwMAorI2RlZmluZSBTV1BfREVGRVJFUkFTRSAgICAgIDB4MjAwMAorCisvKiBTZXRXaW5kb3dQb3MoKSBod25kSW5zZXJ0QWZ0ZXIgZmllbGQgdmFsdWVzICovCisjZGVmaW5lIEhXTkRfVE9QICAgICAgICAgICAgKChIV05EKTApCisjZGVmaW5lIEhXTkRfQk9UVE9NICAgICAgICAgKChIV05EKTEpCisjZGVmaW5lIEhXTkRfVE9QTU9TVCAgICAgICAgKChIV05EKS0xKQorI2RlZmluZSBIV05EX05PVE9QTU9TVCAgICAgICgoSFdORCktMikKKwogCiAjZGVmaW5lIE1GX0lOU0VSVCAwCiAjZGVmaW5lIE1GX0NIQU5HRSAweDAwODAKQEAgLTkzNCw2ICsxMDcyLDEzIEBACiAjZGVmaW5lIFdTX0NISUxEV0lORE9XIChXU19DSElMRCkKICNkZWZpbmUgV1NfVElMRURXSU5ET1cgKFdTX09WRVJMQVBQRURXSU5ET1cpCiAKKy8qIFdpbmRvdyBleHRlbmRlZCBzdHlsZXMgKi8KKyNkZWZpbmUgV1NfRVhfRExHTU9EQUxGUkFNRSAgICAweDAwMDAwMDAxTAorI2RlZmluZSBXU19FWF9OT1BBUkVOVE5PVElGWSAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIFdTX0VYX1RPUE1PU1QgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgV1NfRVhfQUNDRVBURklMRVMgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBXU19FWF9UUkFOU1BBUkVOVCAgICAgIDB4MDAwMDAwMjBMCisKIC8qIEJ1dHRvbiBjb250cm9sIHN0eWxlcyAqLwogI2RlZmluZSBCU19QVVNIQlVUVE9OICAgICAgICAgIDB4MDAwMDAwMDBMCiAjZGVmaW5lIEJTX0RFRlBVU0hCVVRUT04gICAgICAgMHgwMDAwMDAwMUwKQEAgLTk0OCwxNiArMTA5MywzMTAgQEAKICNkZWZpbmUgQlNfT1dORVJEUkFXICAgICAgICAgICAweDAwMDAwMDBCTAogI2RlZmluZSBCU19MRUZUVEVYVCAgICAgICAgICAgIDB4MDAwMDAwMjBMCiAKKy8qIEJ1dHRvbiBjb250cm9sIG1lc3NhZ2VzICovCisjZGVmaW5lIEJNX0dFVENIRUNLICAgICAgICAgICAgKFdNX1VTRVIrMCkKKyNkZWZpbmUgQk1fU0VUQ0hFQ0sgICAgICAgICAgICAoV01fVVNFUisxKQorI2RlZmluZSBCTV9HRVRTVEFURSAgICAgICAgICAgIChXTV9VU0VSKzIpCisjZGVmaW5lIEJNX1NFVFNUQVRFICAgICAgICAgICAgKFdNX1VTRVIrMykKKyNkZWZpbmUgQk1fU0VUU1RZTEUgICAgICAgICAgICAoV01fVVNFUis0KQorCiAvKiBCdXR0b24gbm90aWZpY2F0aW9uIGNvZGVzICovCiAjZGVmaW5lIEJOX0NMSUNLRUQgICAgICAgICAgICAgMAogI2RlZmluZSBCTl9QQUlOVCAgICAgICAgICAgICAgIDEKICNkZWZpbmUgQk5fSElMSVRFICAgICAgICAgICAgICAyCi0jZGVmaW5lIEJOX1VOTElURSAgICAgICAgICAgICAgMworI2RlZmluZSBCTl9VTkhJTElURSAgICAgICAgICAgIDMKICNkZWZpbmUgQk5fRElTQUJMRSAgICAgICAgICAgICA0CiAjZGVmaW5lIEJOX0RPVUJMRUNMSUNLRUQgICAgICAgNQogCisvKiBTdGF0aWMgQ29udHJvbCBTdHlsZXMgKi8KKyNkZWZpbmUgU1NfTEVGVCAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBTU19DRU5URVIgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNTX1JJR0hUICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgU1NfSUNPTiAgICAgICAgICAgICAweDAwMDAwMDAzTAorI2RlZmluZSBTU19CTEFDS1JFQ1QgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIFNTX0dSQVlSRUNUICAgICAgICAgMHgwMDAwMDAwNUwKKyNkZWZpbmUgU1NfV0hJVEVSRUNUICAgICAgICAweDAwMDAwMDA2TAorI2RlZmluZSBTU19CTEFDS0ZSQU1FICAgICAgIDB4MDAwMDAwMDdMCisjZGVmaW5lIFNTX0dSQVlGUkFNRSAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgU1NfV0hJVEVGUkFNRSAgICAgICAweDAwMDAwMDA5TAorI2RlZmluZSBTU19TSU1QTEUgICAgICAgICAgIDB4MDAwMDAwMEJMCisjZGVmaW5lIFNTX0xFRlROT1dPUkRXUkFQICAgMHgwMDAwMDAwQ0wKKyNkZWZpbmUgU1NfTk9QUkVGSVggICAgICAgICAweDAwMDAwMDgwTAogCi0jZGVmaW5lIEdNRU1fTU9WRUFCTEUJMHgwMDAyCisvKiBTdGF0aWMgQ29udHJvbCBNZXNhZ2VzICovCisjZGVmaW5lIFNUTV9TRVRJQ09OICAgICAgICAgKFdNX1VTRVIrMCkKKyNkZWZpbmUgU1RNX0dFVElDT04gICAgICAgICAoV01fVVNFUisxKQorCisvKiBXTV9IL1ZTQ1JPTEwgY29tbWFuZHMgKi8KKyNkZWZpbmUgU0JfTElORVVQICAgICAgICAgICAwCisjZGVmaW5lIFNCX0xJTkVMRUZUICAgICAgICAgMAorI2RlZmluZSBTQl9MSU5FRE9XTiAgICAgICAgIDEKKyNkZWZpbmUgU0JfTElORVJJR0hUICAgICAgICAxCisjZGVmaW5lIFNCX1BBR0VVUCAgICAgICAgICAgMgorI2RlZmluZSBTQl9QQUdFTEVGVCAgICAgICAgIDIKKyNkZWZpbmUgU0JfUEFHRURPV04gICAgICAgICAzCisjZGVmaW5lIFNCX1BBR0VSSUdIVCAgICAgICAgMworI2RlZmluZSBTQl9USFVNQlBPU0lUSU9OICAgIDQKKyNkZWZpbmUgU0JfVEhVTUJUUkFDSyAgICAgICA1CisjZGVmaW5lIFNCX1RPUCAgICAgICAgICAgICAgNgorI2RlZmluZSBTQl9MRUZUICAgICAgICAgICAgIDYKKyNkZWZpbmUgU0JfQk9UVE9NICAgICAgICAgICA3CisjZGVmaW5lIFNCX1JJR0hUICAgICAgICAgICAgNworI2RlZmluZSBTQl9FTkRTQ1JPTEwgICAgICAgIDgKKworLyogU2Nyb2xsIGJhciBzZWxlY3Rpb24gY29uc3RhbnRzICovCisjZGVmaW5lIFNCX0hPUlogICAgICAgICAgICAgMAorI2RlZmluZSBTQl9WRVJUICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0JfQ1RMICAgICAgICAgICAgICAyCisjZGVmaW5lIFNCX0JPVEggICAgICAgICAgICAgMworCisvKiBTY3JvbGxiYXIgc3R5bGVzICovCisjZGVmaW5lIFNCU19IT1JaICAgICAgICAgICAgICAgICAgICAweDAwMDBMCisjZGVmaW5lIFNCU19WRVJUICAgICAgICAgICAgICAgICAgICAweDAwMDFMCisjZGVmaW5lIFNCU19UT1BBTElHTiAgICAgICAgICAgICAgICAweDAwMDJMCisjZGVmaW5lIFNCU19MRUZUQUxJR04gICAgICAgICAgICAgICAweDAwMDJMCisjZGVmaW5lIFNCU19CT1RUT01BTElHTiAgICAgICAgICAgICAweDAwMDRMCisjZGVmaW5lIFNCU19SSUdIVEFMSUdOICAgICAgICAgICAgICAweDAwMDRMCisjZGVmaW5lIFNCU19TSVpFQk9YVE9QTEVGVEFMSUdOICAgICAweDAwMDJMCisjZGVmaW5lIFNCU19TSVpFQk9YQk9UVE9NUklHSFRBTElHTiAweDAwMDRMCisjZGVmaW5lIFNCU19TSVpFQk9YICAgICAgICAgICAgICAgICAweDAwMDhMCisKKy8qIEVuYWJsZVNjcm9sbEJhcigpIGZsYWdzICovCisjZGVmaW5lIEVTQl9FTkFCTEVfQk9USCAgICAgMHgwMDAwCisjZGVmaW5lIEVTQl9ESVNBQkxFX0JPVEggICAgMHgwMDAzCisKKyNkZWZpbmUgRVNCX0RJU0FCTEVfTEVGVCAgICAweDAwMDEKKyNkZWZpbmUgRVNCX0RJU0FCTEVfUklHSFQgICAweDAwMDIKKworI2RlZmluZSBFU0JfRElTQUJMRV9VUCAgICAgIDB4MDAwMQorI2RlZmluZSBFU0JfRElTQUJMRV9ET1dOICAgIDB4MDAwMgorCisjZGVmaW5lIEVTQl9ESVNBQkxFX0xUVVAgICAgRVNCX0RJU0FCTEVfTEVGVAorI2RlZmluZSBFU0JfRElTQUJMRV9SVEROICAgIEVTQl9ESVNBQkxFX1JJR0hUCisKKy8qIExpc3Rib3ggc3R5bGVzICovCisjZGVmaW5lIExCU19OT1RJRlkgICAgICAgICAgICAweDAwMDFMCisjZGVmaW5lIExCU19TT1JUICAgICAgICAgICAgICAweDAwMDJMCisjZGVmaW5lIExCU19OT1JFRFJBVyAgICAgICAgICAweDAwMDRMCisjZGVmaW5lIExCU19NVUxUSVBMRVNFTCAgICAgICAweDAwMDhMCisjZGVmaW5lIExCU19PV05FUkRSQVdGSVhFRCAgICAweDAwMTBMCisjZGVmaW5lIExCU19PV05FUkRSQVdWQVJJQUJMRSAweDAwMjBMCisjZGVmaW5lIExCU19IQVNTVFJJTkdTICAgICAgICAweDAwNDBMCisjZGVmaW5lIExCU19VU0VUQUJTVE9QUyAgICAgICAweDAwODBMCisjZGVmaW5lIExCU19OT0lOVEVHUkFMSEVJR0hUICAweDAxMDBMCisjZGVmaW5lIExCU19NVUxUSUNPTFVNTiAgICAgICAweDAyMDBMCisjZGVmaW5lIExCU19XQU5US0VZQk9BUkRJTlBVVCAweDA0MDBMCisjZGVmaW5lIExCU19FWFRFTkRFRFNFTCAgICAgICAweDA4MDBMCisjZGVmaW5lIExCU19ESVNBQkxFTk9TQ1JPTEwgICAweDEwMDBMCisjZGVmaW5lIExCU19TVEFOREFSRCAgICAgICAgICAoTEJTX05PVElGWSB8IExCU19TT1JUIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUikKKworLyogTGlzdGJveCBtZXNzYWdlcyAqLworI2RlZmluZSBMQl9BRERTVFJJTkcgICAgICAgICAgIChXTV9VU0VSKzEpCisjZGVmaW5lIExCX0lOU0VSVFNUUklORyAgICAgICAgKFdNX1VTRVIrMikKKyNkZWZpbmUgTEJfREVMRVRFU1RSSU5HICAgICAgICAoV01fVVNFUiszKQorI2RlZmluZSBMQl9SRVNFVENPTlRFTlQgICAgICAgIChXTV9VU0VSKzUpCisjZGVmaW5lIExCX1NFVFNFTCAgICAgICAgICAgICAgKFdNX1VTRVIrNikKKyNkZWZpbmUgTEJfU0VUQ1VSU0VMICAgICAgICAgICAoV01fVVNFUis3KQorI2RlZmluZSBMQl9HRVRTRUwgICAgICAgICAgICAgIChXTV9VU0VSKzgpCisjZGVmaW5lIExCX0dFVENVUlNFTCAgICAgICAgICAgKFdNX1VTRVIrOSkKKyNkZWZpbmUgTEJfR0VUVEVYVCAgICAgICAgICAgICAoV01fVVNFUisxMCkKKyNkZWZpbmUgTEJfR0VUVEVYVExFTiAgICAgICAgICAoV01fVVNFUisxMSkKKyNkZWZpbmUgTEJfR0VUQ09VTlQgICAgICAgICAgICAoV01fVVNFUisxMikKKyNkZWZpbmUgTEJfU0VMRUNUU1RSSU5HICAgICAgICAoV01fVVNFUisxMykKKyNkZWZpbmUgTEJfRElSICAgICAgICAgICAgICAgICAoV01fVVNFUisxNCkKKyNkZWZpbmUgTEJfR0VUVE9QSU5ERVggICAgICAgICAoV01fVVNFUisxNSkKKyNkZWZpbmUgTEJfRklORFNUUklORyAgICAgICAgICAoV01fVVNFUisxNikKKyNkZWZpbmUgTEJfR0VUU0VMQ09VTlQgICAgICAgICAoV01fVVNFUisxNykKKyNkZWZpbmUgTEJfR0VUU0VMSVRFTVMgICAgICAgICAoV01fVVNFUisxOCkKKyNkZWZpbmUgTEJfU0VUVEFCU1RPUFMgICAgICAgICAoV01fVVNFUisxOSkKKyNkZWZpbmUgTEJfR0VUSE9SSVpPTlRBTEVYVEVOVCAoV01fVVNFUisyMCkKKyNkZWZpbmUgTEJfU0VUSE9SSVpPTlRBTEVYVEVOVCAoV01fVVNFUisyMSkKKyNkZWZpbmUgTEJfU0VUQ09MVU1OV0lEVEggICAgICAoV01fVVNFUisyMikKKyNkZWZpbmUgTEJfU0VUVE9QSU5ERVggICAgICAgICAoV01fVVNFUisyNCkKKyNkZWZpbmUgTEJfR0VUSVRFTVJFQ1QgICAgICAgICAoV01fVVNFUisyNSkKKyNkZWZpbmUgTEJfR0VUSVRFTURBVEEgICAgICAgICAoV01fVVNFUisyNikKKyNkZWZpbmUgTEJfU0VUSVRFTURBVEEgICAgICAgICAoV01fVVNFUisyNykKKyNkZWZpbmUgTEJfU0VMSVRFTVJBTkdFICAgICAgICAoV01fVVNFUisyOCkKKyNkZWZpbmUgTEJfU0VUQ0FSRVRJTkRFWCAgICAgICAoV01fVVNFUiszMSkKKyNkZWZpbmUgTEJfR0VUQ0FSRVRJTkRFWCAgICAgICAoV01fVVNFUiszMikKKyNkZWZpbmUgTEJfU0VUSVRFTUhFSUdIVCAgICAgICAoV01fVVNFUiszMykKKyNkZWZpbmUgTEJfR0VUSVRFTUhFSUdIVCAgICAgICAoV01fVVNFUiszNCkKKyNkZWZpbmUgTEJfRklORFNUUklOR0VYQUNUICAgICAoV01fVVNFUiszNSkKKworLyogTGlzdGJveCBub3RpZmljYXRpb24gY29kZXMgKi8KKyNkZWZpbmUgTEJOX0VSUlNQQUNFICAgICAgICAoLTIpCisjZGVmaW5lIExCTl9TRUxDSEFOR0UgICAgICAgMQorI2RlZmluZSBMQk5fREJMQ0xLICAgICAgICAgIDIKKyNkZWZpbmUgTEJOX1NFTENBTkNFTCAgICAgICAzCisjZGVmaW5lIExCTl9TRVRGT0NVUyAgICAgICAgNAorI2RlZmluZSBMQk5fS0lMTEZPQ1VTICAgICAgIDUKKworLyogTGlzdGJveCBub3RpZmljYXRpb24gbWVzc2FnZXMgKi8KKyNkZWZpbmUgV01fVktFWVRPSVRFTSAgICAgICAweDAwMkUKKyNkZWZpbmUgV01fQ0hBUlRPSVRFTSAgICAgICAweDAwMkYKKworLyogTGlzdGJveCBtZXNzYWdlIHJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgTEJfT0tBWSAgICAgICAgICAgICAwCisjZGVmaW5lIExCX0VSUiAgICAgICAgICAgICAgKC0xKQorI2RlZmluZSBMQl9FUlJTUEFDRSAgICAgICAgICgtMikKKworI2RlZmluZSBMQl9DVExDT0RFICAgICAgICAgIDBMCisKKy8qIENvbWJvIGJveCBzdHlsZXMgKi8KKyNkZWZpbmUgQ0JTX1NJTVBMRSAgICAgICAgICAgIDB4MDAwMUwKKyNkZWZpbmUgQ0JTX0RST1BET1dOICAgICAgICAgIDB4MDAwMkwKKyNkZWZpbmUgQ0JTX0RST1BET1dOTElTVCAgICAgIDB4MDAwM0wKKyNkZWZpbmUgQ0JTX09XTkVSRFJBV0ZJWEVEICAgIDB4MDAxMEwKKyNkZWZpbmUgQ0JTX09XTkVSRFJBV1ZBUklBQkxFIDB4MDAyMEwKKyNkZWZpbmUgQ0JTX0FVVE9IU0NST0xMICAgICAgIDB4MDA0MEwKKyNkZWZpbmUgQ0JTX09FTUNPTlZFUlQgICAgICAgIDB4MDA4MEwKKyNkZWZpbmUgQ0JTX1NPUlQgICAgICAgICAgICAgIDB4MDEwMEwKKyNkZWZpbmUgQ0JTX0hBU1NUUklOR1MgICAgICAgIDB4MDIwMEwKKyNkZWZpbmUgQ0JTX05PSU5URUdSQUxIRUlHSFQgIDB4MDQwMEwKKyNkZWZpbmUgQ0JTX0RJU0FCTEVOT1NDUk9MTCAgIDB4MDgwMEwKKworLyogQ29tYm8gYm94IG1lc3NhZ2VzICovCisjZGVmaW5lIENCX0dFVEVESVRTRUwgICAgICAgICAgICAoV01fVVNFUiswKQorI2RlZmluZSBDQl9MSU1JVFRFWFQgICAgICAgICAgICAgKFdNX1VTRVIrMSkKKyNkZWZpbmUgQ0JfU0VURURJVFNFTCAgICAgICAgICAgIChXTV9VU0VSKzIpCisjZGVmaW5lIENCX0FERFNUUklORyAgICAgICAgICAgICAoV01fVVNFUiszKQorI2RlZmluZSBDQl9ERUxFVEVTVFJJTkcgICAgICAgICAgKFdNX1VTRVIrNCkKKyNkZWZpbmUgQ0JfRElSICAgICAgICAgICAgICAgICAgIChXTV9VU0VSKzUpCisjZGVmaW5lIENCX0dFVENPVU5UICAgICAgICAgICAgICAoV01fVVNFUis2KQorI2RlZmluZSBDQl9HRVRDVVJTRUwgICAgICAgICAgICAgKFdNX1VTRVIrNykKKyNkZWZpbmUgQ0JfR0VUTEJURVhUICAgICAgICAgICAgIChXTV9VU0VSKzgpCisjZGVmaW5lIENCX0dFVExCVEVYVExFTiAgICAgICAgICAoV01fVVNFUis5KQorI2RlZmluZSBDQl9JTlNFUlRTVFJJTkcgICAgICAgICAgKFdNX1VTRVIrMTApCisjZGVmaW5lIENCX1JFU0VUQ09OVEVOVCAgICAgICAgICAoV01fVVNFUisxMSkKKyNkZWZpbmUgQ0JfRklORFNUUklORyAgICAgICAgICAgIChXTV9VU0VSKzEyKQorI2RlZmluZSBDQl9TRUxFQ1RTVFJJTkcgICAgICAgICAgKFdNX1VTRVIrMTMpCisjZGVmaW5lIENCX1NFVENVUlNFTCAgICAgICAgICAgICAoV01fVVNFUisxNCkKKyNkZWZpbmUgQ0JfU0hPV0RST1BET1dOICAgICAgICAgIChXTV9VU0VSKzE1KQorI2RlZmluZSBDQl9HRVRJVEVNREFUQSAgICAgICAgICAgKFdNX1VTRVIrMTYpCisjZGVmaW5lIENCX1NFVElURU1EQVRBICAgICAgICAgICAoV01fVVNFUisxNykKKyNkZWZpbmUgQ0JfR0VURFJPUFBFRENPTlRST0xSRUNUIChXTV9VU0VSKzE4KQorI2RlZmluZSBDQl9TRVRJVEVNSEVJR0hUICAgICAgICAgKFdNX1VTRVIrMTkpCisjZGVmaW5lIENCX0dFVElURU1IRUlHSFQgICAgICAgICAoV01fVVNFUisyMCkKKyNkZWZpbmUgQ0JfU0VURVhURU5ERURVSSAgICAgICAgIChXTV9VU0VSKzIxKQorI2RlZmluZSBDQl9HRVRFWFRFTkRFRFVJICAgICAgICAgKFdNX1VTRVIrMjIpCisjZGVmaW5lIENCX0dFVERST1BQRURTVEFURSAgICAgICAoV01fVVNFUisyMykKKyNkZWZpbmUgQ0JfRklORFNUUklOR0VYQUNUICAgICAgIChXTV9VU0VSKzI0KQorCisvKiBDb21ibyBib3ggbm90aWZpY2F0aW9uIGNvZGVzICovCisjZGVmaW5lIENCTl9FUlJTUEFDRSAgICAgICAgKC0xKQorI2RlZmluZSBDQk5fU0VMQ0hBTkdFICAgICAgIDEKKyNkZWZpbmUgQ0JOX0RCTENMSyAgICAgICAgICAyCisjZGVmaW5lIENCTl9TRVRGT0NVUyAgICAgICAgMworI2RlZmluZSBDQk5fS0lMTEZPQ1VTICAgICAgIDQKKyNkZWZpbmUgQ0JOX0VESVRDSEFOR0UgICAgICA1CisjZGVmaW5lIENCTl9FRElUVVBEQVRFICAgICAgNgorI2RlZmluZSBDQk5fRFJPUERPV04gICAgICAgIDcKKyNkZWZpbmUgQ0JOX0NMT1NFVVAgICAgICAgICA4CisjZGVmaW5lIENCTl9TRUxFTkRPSyAgICAgICAgOQorI2RlZmluZSBDQk5fU0VMRU5EQ0FOQ0VMICAgIDEwCisKKy8qIENvbWJvIGJveCBtZXNzYWdlIHJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgQ0JfT0tBWSAgICAgICAgICAgICAwCisjZGVmaW5lIENCX0VSUiAgICAgICAgICAgICAgKC0xKQorI2RlZmluZSBDQl9FUlJTUEFDRSAgICAgICAgICgtMikKKworCisvKiBPd25lciBkcmF3IGNvbnRyb2wgdHlwZXMgKi8KKyNkZWZpbmUgT0RUX01FTlUgICAgICAgIDEKKyNkZWZpbmUgT0RUX0xJU1RCT1ggICAgIDIKKyNkZWZpbmUgT0RUX0NPTUJPQk9YICAgIDMKKyNkZWZpbmUgT0RUX0JVVFRPTiAgICAgIDQKKworLyogT3duZXIgZHJhdyBhY3Rpb25zICovCisjZGVmaW5lIE9EQV9EUkFXRU5USVJFICAweDAwMDEKKyNkZWZpbmUgT0RBX1NFTEVDVCAgICAgIDB4MDAwMgorI2RlZmluZSBPREFfRk9DVVMgICAgICAgMHgwMDA0CisKKy8qIE93bmVyIGRyYXcgc3RhdGUgKi8KKyNkZWZpbmUgT0RTX1NFTEVDVEVEICAgIDB4MDAwMQorI2RlZmluZSBPRFNfR1JBWUVEICAgICAgMHgwMDAyCisjZGVmaW5lIE9EU19ESVNBQkxFRCAgICAweDAwMDQKKyNkZWZpbmUgT0RTX0NIRUNLRUQgICAgIDB4MDAwOAorI2RlZmluZSBPRFNfRk9DVVMgICAgICAgMHgwMDEwCisKKyNkZWZpbmUgV01fRFJBV0lURU0gICAgICAgICAweDAwMkIKKwordHlwZWRlZiBzdHJ1Y3QgdGFnRFJBV0lURU1TVFJVQ1QKK3sKKyAgICBVSU5UICAgICAgICBDdGxUeXBlOworICAgIFVJTlQgICAgICAgIEN0bElEOworICAgIFVJTlQgICAgICAgIGl0ZW1JRDsKKyAgICBVSU5UICAgICAgICBpdGVtQWN0aW9uOworICAgIFVJTlQgICAgICAgIGl0ZW1TdGF0ZTsKKyAgICBIV05EICAgICAgICBod25kSXRlbTsKKyAgICBIREMgICAgICAgICBoREM7CisgICAgUkVDVCAgICAgICAgcmNJdGVtOworICAgIERXT1JEICAgICAgIGl0ZW1EYXRhOworfSBEUkFXSVRFTVNUUlVDVDsKK3R5cGVkZWYgRFJBV0lURU1TVFJVQ1QgTkVBUiogUERSQVdJVEVNU1RSVUNUOwordHlwZWRlZiBEUkFXSVRFTVNUUlVDVCBGQVIqIExQRFJBV0lURU1TVFJVQ1Q7CisKKyNkZWZpbmUgV01fTUVBU1VSRUlURU0gICAgICAweDAwMkMKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTUVBU1VSRUlURU1TVFJVQ1QKK3sKKyAgICBVSU5UICAgICAgICBDdGxUeXBlOworICAgIFVJTlQgICAgICAgIEN0bElEOworICAgIFVJTlQgICAgICAgIGl0ZW1JRDsKKyAgICBVSU5UICAgICAgICBpdGVtV2lkdGg7CisgICAgVUlOVCAgICAgICAgaXRlbUhlaWdodDsKKyAgICBEV09SRCAgICAgICBpdGVtRGF0YTsKK30gTUVBU1VSRUlURU1TVFJVQ1Q7Cit0eXBlZGVmIE1FQVNVUkVJVEVNU1RSVUNUIE5FQVIqIFBNRUFTVVJFSVRFTVNUUlVDVDsKK3R5cGVkZWYgTUVBU1VSRUlURU1TVFJVQ1QgRkFSKiBMUE1FQVNVUkVJVEVNU1RSVUNUOworCisjZGVmaW5lIFdNX0RFTEVURUlURU0gICAgICAgMHgwMDJECisKK3R5cGVkZWYgc3RydWN0IHRhZ0RFTEVURUlURU1TVFJVQ1QKK3sKKyAgICBVSU5UICAgICAgIEN0bFR5cGU7CisgICAgVUlOVCAgICAgICBDdGxJRDsKKyAgICBVSU5UICAgICAgIGl0ZW1JRDsKKyAgICBIV05EICAgICAgIGh3bmRJdGVtOworICAgIERXT1JEICAgICAgaXRlbURhdGE7Cit9IERFTEVURUlURU1TVFJVQ1Q7Cit0eXBlZGVmIERFTEVURUlURU1TVFJVQ1QgTkVBUiogUERFTEVURUlURU1TVFJVQ1Q7Cit0eXBlZGVmIERFTEVURUlURU1TVFJVQ1QgRkFSKiBMUERFTEVURUlURU1TVFJVQ1Q7CisKKyNkZWZpbmUgV01fQ09NUEFSRUlURU0gICAgICAweDAwMzkKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQ09NUEFSRUlURU1TVFJVQ1QKK3sKKyAgICBVSU5UICAgICAgICBDdGxUeXBlOworICAgIFVJTlQgICAgICAgIEN0bElEOworICAgIEhXTkQgICAgICAgIGh3bmRJdGVtOworICAgIFVJTlQgICAgICAgIGl0ZW1JRDE7CisgICAgRFdPUkQgICAgICAgaXRlbURhdGExOworICAgIFVJTlQgICAgICAgIGl0ZW1JRDI7CisgICAgRFdPUkQgICAgICAgaXRlbURhdGEyOworfSBDT01QQVJFSVRFTVNUUlVDVDsKK3R5cGVkZWYgQ09NUEFSRUlURU1TVFJVQ1QgTkVBUiogUENPTVBBUkVJVEVNU1RSVUNUOwordHlwZWRlZiBDT01QQVJFSVRFTVNUUlVDVCBGQVIqIExQQ09NUEFSRUlURU1TVFJVQ1Q7CisKKyAgCisjZGVmaW5lIExNRU1fTU9WRUFCTEUgICAweDAwMDIKKworI2RlZmluZSBHTUVNX0ZJWEVEICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTUVNX01PVkVBQkxFICAgICAgIDB4MDAwMgorI2RlZmluZSBHTUVNX05PQ09NUEFDVCAgICAgIDB4MDAxMAorI2RlZmluZSBHTUVNX05PRElTQ0FSRCAgICAgIDB4MDAyMAorI2RlZmluZSBHTUVNX1pFUk9JTklUICAgICAgIDB4MDA0MAorI2RlZmluZSBHTUVNX01PRElGWSAgICAgICAgIDB4MDA4MAorI2RlZmluZSBHTUVNX0RJU0NBUkRBQkxFICAgIDB4MDEwMAorI2RlZmluZSBHTUVNX05PVF9CQU5LRUQgICAgIDB4MTAwMAorI2RlZmluZSBHTUVNX1NIQVJFICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBHTUVNX0RERVNIQVJFICAgICAgIDB4MjAwMAorI2RlZmluZSBHTUVNX05PVElGWSAgICAgICAgIDB4NDAwMAorI2RlZmluZSBHTUVNX0xPV0VSICAgICAgICAgIEdNRU1fTk9UX0JBTktFRAorCisjZGVmaW5lIEdITkQgICAgICAgICAgICAgICAgKEdNRU1fTU9WRUFCTEUgfCBHTUVNX1pFUk9JTklUKQorI2RlZmluZSBHUFRSICAgICAgICAgICAgICAgIChHTUVNX0ZJWEVEIHwgR01FTV9aRVJPSU5JVCkKKwogCiAjZGVmaW5lIEYocmV0LG5hbWUpIHJldCBuYW1lKHZvaWQpOwogI2RlZmluZSBGYShyZXQsbmFtZSx0MSxhMSkgcmV0IG5hbWUodDEgYTEpOwpAQCAtOTkxLDYgKzE0MzAsNyBAQAogRihCT09MLEVtcHR5Q2xpcGJvYXJkKQogRihCT09MLEluU2VuZE1lc3NhZ2UpCiBGKERXT1JELEdldEN1cnJlbnRUaW1lKQorRihEV09SRCxHZXREaWFsb2dCYXNlVW5pdHMpCiBGKERXT1JELEdldFRpY2tDb3VudCkKIEYoSEFORExFLEdldEN1cnJlbnRUYXNrKQogRihITUVOVSxDcmVhdGVQb3B1cE1lbnUpCkBAIC0xMDIwLDcgKzE0NjAsNiBAQAogRihpbnQsU3RhcnRTb3VuZCkKIEYoaW50LFN0b3BTb3VuZCkKIEYoaW50LFN5bmNBbGxWb2ljZXMpCi1GKGxvbmcsR2V0RGlhbG9nQmFzZVVuaXRzKQogRih2b2lkLENsb3NlU291bmQpCiBGKHZvaWQsRGVidWdCcmVhaykKIEYodm9pZCxEZXN0cm95Q2FyZXQpCkBAIC0xMDQzLDcgKzE0ODIsNyBAQAogRmEoQk9PTCxTZXRNZXNzYWdlUXVldWUsaW50LGEpCiBGYShpbnQsX2xjbG9zZSxpbnQsYSkKIEZiKGludCxfbG9wZW4sTFBTVFIsYSxpbnQsYikKLUZhKGludCxsc3RybGVuLExQU1RSLGEpCitGYShpbnQsbHN0cmxlbixMUENTVFIsYSkKIEZhKExPTkcsRGlzcGF0Y2hNZXNzYWdlLExQTVNHLG1zZykKIEZhKHZvaWQsVXBkYXRlV2luZG93LEhXTkQsYSkKIEZhKEFUT00sQWRkQXRvbSxMUFNUUixhKQpAQCAtMTIzMCwxMSArMTY2OSwxMSBAQAogRmIoQk9PTCxHZXRCaXRtYXBEaW1lbnNpb25FeCxIQklUTUFQLGEsTFBTSVpFLGIpCiBGYihCT09MLFNob3dXaW5kb3csSFdORCxhLGludCxiKSAKIEZiKEhEQyxCZWdpblBhaW50LEhXTkQsYSxMUFBBSU5UU1RSVUNULGIpIAotRmIoTFBTVFIsbHN0cmNhdCxMUFNUUixhLExQU1RSLGIgKQotRmIoTFBTVFIsbHN0cmNweSxMUFNUUixhLExQU1RSLGIgKQorRmIoTFBTVFIsbHN0cmNhdCxMUFNUUixhLExQQ1NUUixiICkKK0ZiKExQU1RSLGxzdHJjcHksTFBTVFIsYSxMUENTVFIsYiApCiBGYihpbnQsX2xjcmVhdCxMUFNUUixhLGludCxiKQotRmIoaW50LGxzdHJjbXAsTFBTVFIsYSxMUFNUUixiICkKLUZiKGludCxsc3RyY21waSxMUFNUUixhLExQU1RSLGIgKQorRmIoaW50LGxzdHJjbXAsTFBDU1RSLGEsTFBDU1RSLGIgKQorRmIoaW50LGxzdHJjbXBpLExQQ1NUUixhLExQQ1NUUixiICkKIEZiKHZvaWQsRW5kUGFpbnQsSFdORCxhLExQUEFJTlRTVFJVQ1QsYikKIEZiKHZvaWQsR2V0Q2xpZW50UmVjdCxIV05ELGEsTFBSRUNULGIpCiBGYih2b2lkLFNldERDU3RhdGUsSERDLGEsSERDLGIpCkBAIC0xMjkxLDcgKzE3MzAsNyBAQAogRmIoSE1FTlUsTG9hZE1lbnUsSEFORExFLGEsTFBTVFIsYikKIEZiKEhXTkQsQ2hpbGRXaW5kb3dGcm9tUG9pbnQsSFdORCxhLFBPSU5ULGIpCiBGYihIV05ELEZpbmRXaW5kb3csTFBTVFIsYSxMUFNUUixiKQotRmIoSFdORCxHZXREbGdJdGVtLEhXTkQsYSxpbnQsYikKK0ZiKEhXTkQsR2V0RGxnSXRlbSxIV05ELGEsV09SRCxiKQogRmIoSFdORCxHZXROZXh0V2luZG93LEhXTkQsYSxXT1JELGIpCiBGYihIV05ELEdldFdpbmRvdyxIV05ELGEsV09SRCxiKQogRmIoQk9PTCxHZXRDdXJyZW50UG9zaXRpb25FeCxIREMsYSxMUFBPSU5ULGIpCkBAIC0xMzE1LDcgKzE3NTQsNyBAQAogRmIoV09SRCxHZXRTeXN0ZW1QYWxldHRlVXNlLEhEQyxhLFdPUkQsYikKIEZiKFdPUkQsR2V0V2luZG93V29yZCxIV05ELGEsc2hvcnQsYikKIEZiKFdPUkQsR2V0V2luZG93c0RpcmVjdG9yeSxMUFNUUixhLFdPUkQsYikKLUZiKFdPUkQsSXNEbGdCdXR0b25DaGVja2VkLEhXTkQsYSxpbnQsYikKK0ZiKFdPUkQsSXNEbGdCdXR0b25DaGVja2VkLEhXTkQsYSxXT1JELGIpCiBGYihXT1JELExvY2FsU2hyaW5rLEhBTkRMRSxhLFdPUkQsYikKIEZiKFdPUkQsTWFwVmlydHVhbEtleSxXT1JELGEsV09SRCxiKQogRmIoV09SRCxTZXRTeXN0ZW1QYWxldHRlVXNlLEhEQyxhLFdPUkQsYikKQEAgLTEzNDksNyArMTc4OCw3IEBACiBGYihzaG9ydCxTZXRUZXh0Q2hhcmFjdGVyRXh0cmEsSERDLGEsc2hvcnQsYikKIEZiKHZvaWQsQ2xpZW50VG9TY3JlZW4sSFdORCxhLExQUE9JTlQsYikKIEZiKHZvaWQsRHJhd0ZvY3VzUmVjdCxIREMsYSxMUFJFQ1QsYikKLUZiKHZvaWQsRW5kRGlhbG9nLEhXTkQsYSxpbnQsYikKK0ZiKHZvaWQsRW5kRGlhbG9nLEhXTkQsYSxzaG9ydCxiKQogRmIodm9pZCxHZXRDb2RlSW5mbyxGQVJQUk9DLGxwUHJvYyxMUFZPSUQsbHBTZWdJbmZvKQogRmIodm9pZCxHZXRXaW5kb3dSZWN0LEhXTkQsYSxMUFJFQ1QsYikKIEZiKHZvaWQsSW52ZXJ0UmVjdCxIREMsYSxMUFJFQ1QsYikKQEAgLTE0NTcsMTMgKzE4OTYsMTMgQEAKIEZjKHNob3J0LFNldFRleHRKdXN0aWZpY2F0aW9uLEhEQyxhLHNob3J0LGIsc2hvcnQsYykKIEZjKHZvaWQsQWRqdXN0V2luZG93UmVjdCxMUFJFQ1QsYSxEV09SRCxiLEJPT0wsYykKIEZjKHZvaWQsQW5zaVRvT2VtQnVmZixMUFNUUixhLExQU1RSLGIsaW50LGMpCi1GYyh2b2lkLENoZWNrRGxnQnV0dG9uLEhXTkQsYSxpbnQsYixXT1JELGMpCitGYyh2b2lkLENoZWNrRGxnQnV0dG9uLEhXTkQsYSxXT1JELGIsV09SRCxjKQogRmModm9pZCxJbmZsYXRlUmVjdCxMUFJFQ1QsYSxzaG9ydCxiLHNob3J0LGMpCiBGYyh2b2lkLEludmFsaWRhdGVSZWN0LEhXTkQsYSxMUFJFQ1QsYixCT09MLGMpCiBGYyh2b2lkLEludmFsaWRhdGVSZ24sSFdORCxhLEhSR04sYixCT09MLGMpCiBGYyh2b2lkLE9lbVRvQW5zaUJ1ZmYsTFBTVFIsYSxMUFNUUixiLGludCxjKQogRmModm9pZCxPZmZzZXRSZWN0LExQUkVDVCxhLHNob3J0LGIsc2hvcnQsYykKLUZjKHZvaWQsU2V0RGxnSXRlbVRleHQsSFdORCxhLGludCxiLExQU1RSLGMpCitGYyh2b2lkLFNldERsZ0l0ZW1UZXh0LEhXTkQsYSxXT1JELGIsTFBTVFIsYykKIEZjKHZvaWQsU2V0U3lzQ29sb3JzLGludCxhLExQSU5ULGIsQ09MT1JSRUYqLGMpCiBGYyh2b2lkLFNob3dTY3JvbGxCYXIsSFdORCxhLFdPUkQsYixCT09MLGMpCiBGYyh2b2lkLFN3aXRjaFN0YWNrVG8sV09SRCxhLFdPUkQsYixXT1JELGMpCkBAIC0xNDkwLDEyICsxOTI5LDEyIEBACiBGZChIUkdOLENyZWF0ZUVsbGlwdGljUmduLHNob3J0LGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQpCiBGZChIUkdOLENyZWF0ZVBvbHlQb2x5Z29uUmduLExQUE9JTlQsYSxMUElOVCxiLHNob3J0LGMsc2hvcnQsZCkKIEZkKEhSR04sQ3JlYXRlUmVjdFJnbixzaG9ydCxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkKQotRmQoSFdORCxDcmVhdGVEaWFsb2csSEFORExFLGEsTFBTVFIsYixIV05ELGMsRkFSUFJPQyxkKQotRmQoSFdORCxDcmVhdGVEaWFsb2dJbmRpcmVjdCxIQU5ETEUsYSxMUFNUUixiLEhXTkQsYyxGQVJQUk9DLGQpCitGZChIV05ELENyZWF0ZURpYWxvZyxIQU5ETEUsYSxMUENTVFIsYixIV05ELGMsRkFSUFJPQyxkKQorRmQoSFdORCxDcmVhdGVEaWFsb2dJbmRpcmVjdCxIQU5ETEUsYSxMUENTVFIsYixIV05ELGMsRkFSUFJPQyxkKQogRmQoTE9ORyxEZWZEbGdQcm9jLEhXTkQsYSxXT1JELGIsV09SRCxjLExPTkcsZCkKIEZkKExPTkcsRGVmTURJQ2hpbGRQcm9jLEhXTkQsYSxXT1JELGIsV09SRCxjLExPTkcsZCkKIEZkKExPTkcsRGVmV2luZG93UHJvYyxIV05ELGEsV09SRCxiLFdPUkQsYyxMT05HLGQpCi1GZChXT1JELEdldERsZ0l0ZW1JbnQsSFdORCxhLGludCxiLEJPT0wgRkFSKixjLEJPT0wsZCkKK0ZkKFdPUkQsR2V0RGxnSXRlbUludCxIV05ELGEsV09SRCxiLEJPT0wgRkFSKixjLEJPT0wsZCkKIEZkKFdPUkQsR2V0UGFsZXR0ZUVudHJpZXMsSFBBTEVUVEUsYSxXT1JELGIsV09SRCxjLExQUEFMRVRURUVOVFJZLGQpCiBGZChXT1JELEdldFByaXZhdGVQcm9maWxlSW50LExQU1RSLGEsTFBTVFIsYixzaG9ydCxjLExQU1RSLGQpCiBGZChXT1JELEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzLEhEQyxhLFdPUkQsYixXT1JELGMsTFBQQUxFVFRFRU5UUlksZCkKQEAgLTE1MDgsMTEgKzE5NDcsMTEgQEAKIEZkKEJPT0wsT2Zmc2V0Vmlld3BvcnRPcmdFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBQT0lOVCxkKQogRmQoQk9PTCxPZmZzZXRXaW5kb3dPcmdFeCxIREMsYSxzaG9ydCxiLHNob3J0LGMsTFBQT0lOVCxkKQogRmQoaW50LENvbWJpbmVSZ24sSFJHTixhLEhSR04sYixIUkdOLGMsc2hvcnQsZCkKLUZkKGludCxEaWFsb2dCb3gsSEFORExFLGEsTFBTVFIsYixIV05ELGMsRkFSUFJPQyxkKQorRmQoaW50LERpYWxvZ0JveCxISU5TVEFOQ0UsYSxMUENTVFIsYixIV05ELGMsRkFSUFJPQyxkKQogRmQoaW50LERpYWxvZ0JveEluZGlyZWN0LEhBTkRMRSxhLEhBTkRMRSxiLEhXTkQsYyxGQVJQUk9DLGQpCiBGZChpbnQsRW51bUZvbnRzLEhEQyxhLExQU1RSLGIsRkFSUFJPQyxjLExQU1RSLGQpCiBGZChpbnQsRW51bU9iamVjdHMsSERDLGEsaW50LGIsRkFSUFJPQyxjLExQU1RSLGQpCi1GZChpbnQsR2V0RGxnSXRlbVRleHQsSFdORCxhLGludCxiLExQU1RSLGMsaW50LGQpCitGZChpbnQsR2V0RGxnSXRlbVRleHQsSFdORCxhLFdPUkQsYixMUFNUUixjLFdPUkQsZCkKIEZkKGludCxHZXRUZW1wRmlsZU5hbWUsQllURSxhLExQU1RSLGIsV09SRCxjLExQU1RSLGQpCiBGZChpbnQsTG9hZFN0cmluZyxIQU5ETEUsYSxXT1JELGIsTFBTVFIsYyxpbnQsZCkKIEZkKGludCxNZXNzYWdlQm94LEhXTkQsYSxMUFNUUixiLExQU1RSLGMsV09SRCxkKQpAQCAtMTUyMCwxMiArMTk1OSwxMiBAQAogRmQoaW50LFNldFZvaWNlTm90ZSxpbnQsYSxpbnQsYixpbnQsYyxpbnQsZCkKIEZkKHZvaWQsQWRqdXN0V2luZG93UmVjdEV4LExQUkVDVCxhLExPTkcsYixCT09MLGMsRFdPUkQsZCkKIEZkKHZvaWQsQW5pbWF0ZVBhbGV0dGUsSFBBTEVUVEUsYSxXT1JELGIsV09SRCxjLExQUEFMRVRURUVOVFJZLGQpCi1GZCh2b2lkLENoZWNrUmFkaW9CdXR0b24sSFdORCxhLGludCxiLGludCxjLGludCxkKQorRmQodm9pZCxDaGVja1JhZGlvQnV0dG9uLEhXTkQsYSxXT1JELGIsV09SRCxjLFdPUkQsZCkKIEZkKHZvaWQsQ3JlYXRlQ2FyZXQsSFdORCxhLEhCSVRNQVAsYixpbnQsYyxpbnQsZCkKIEZkKHZvaWQsRmlsbFdpbmRvdyxIV05ELGEsSFdORCxiLEhEQyxjLEhCUlVTSCxkKQogRmQodm9pZCxHZXRTY3JvbGxSYW5nZSxIV05ELGEsaW50LGIsTFBJTlQsYyxMUElOVCxkKQogRmQodm9pZCxQbGF5TWV0YUZpbGVSZWNvcmQsSERDLGEsTFBIQU5ETEVUQUJMRSxiLExQTUVUQVJFQ09SRCxjLFdPUkQsZCkKLUZkKHZvaWQsU2V0RGxnSXRlbUludCxIV05ELGEsaW50LGIsV09SRCxjLEJPT0wsZCkKK0ZkKHZvaWQsU2V0RGxnSXRlbUludCxIV05ELGEsV09SRCxiLFdPUkQsYyxCT09MLGQpCiBGZShCT09MLFJlY3RhbmdsZSxIREMsYSxpbnQseExlZnQsaW50LHlUb3AsaW50LHhSaWdodCxpbnQseUJvdHRvbSkKIEZlKGludCxEcmF3VGV4dCxIREMsYSxMUFNUUixzdHIsaW50LGMsTFBSRUNULGQsV09SRCxmbGFnKQogRmUoQk9PTCxQZWVrTWVzc2FnZSxMUE1TRyxhLEhXTkQsYixXT1JELGMsV09SRCxkLFdPUkQsZSkKQEAgLTE1NDIsMTAgKzE5ODEsMTAgQEAKIEZlKERXT1JELFNjYWxlVmlld3BvcnRFeHQsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSkKIEZlKERXT1JELFNjYWxlV2luZG93RXh0LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUpCiBGZShIQklUTUFQLENyZWF0ZUJpdG1hcCxzaG9ydCxhLHNob3J0LGIsQllURSxjLEJZVEUsZCxMUFNUUixlKQotRmUoSFdORCxDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtLEhBTkRMRSxhLExQU1RSLGIsSFdORCxjLEZBUlBST0MsZCxMT05HLGUpCi1GZShIV05ELENyZWF0ZURpYWxvZ1BhcmFtLEhBTkRMRSxhLExQU1RSLGIsSFdORCxjLEZBUlBST0MsZCxMT05HLGUpCitGZShIV05ELENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0sSEFORExFLGEsTFBDU1RSLGIsSFdORCxjLEZBUlBST0MsZCxMUEFSQU0sZSkKK0ZlKEhXTkQsQ3JlYXRlRGlhbG9nUGFyYW0sSEFORExFLGEsTFBDU1RSLGIsSFdORCxjLEZBUlBST0MsZCxMUEFSQU0sZSkKIEZlKExPTkcsRGVmRnJhbWVQcm9jLEhXTkQsYSxIV05ELGIsV09SRCxjLFdPUkQsZCxMT05HLGUpCi1GZShMT05HLFNlbmREbGdJdGVtTWVzc2FnZSxIV05ELGEsaW50LGIsV09SRCxjLFdPUkQsZCxMT05HLGUpCitGZShMT05HLFNlbmREbGdJdGVtTWVzc2FnZSxIV05ELGEsV09SRCxiLFdPUkQsYyxXT1JELGQsTE9ORyxlKQogRmUoaW50LERpYWxvZ0JveEluZGlyZWN0UGFyYW0sSEFORExFLGEsSEFORExFLGIsSFdORCxjLEZBUlBST0MsZCxMT05HLGUpCiBGZShpbnQsRGlhbG9nQm94UGFyYW0sSEFORExFLGEsTFBTVFIsYixIV05ELGMsRkFSUFJPQyxkLExPTkcsZSkKIEZlKGludCxEbGdEaXJMaXN0LEhXTkQsYSxMUFNUUixiLGludCxjLGludCxkLFdPUkQsZSkKQEAgLTE1NzksNyArMjAxOCw3IEBACiBGZyhISUNPTixDcmVhdGVJY29uLEhBTkRMRSxhLGludCxiLGludCxjLEJZVEUsZCxCWVRFLGUsTFBTVFIsZixMUFNUUixnKQogRmcoaW50LEdldERJQml0cyxIREMsYSxIQU5ETEUsYTIsV09SRCxiLFdPUkQsYyxMUFNUUixkLExQQklUTUFQSU5GTyxlLFdPUkQsZikKIEZnKGludCxTZXRESUJpdHMsSERDLGEsSEFORExFLGEyLFdPUkQsYixXT1JELGMsTFBTVFIsZCxMUEJJVE1BUElORk8sZSxXT1JELGYpCi1GZyh2b2lkLFNldFdpbmRvd1BvcyxIV05ELGEsSFdORCxiLGludCxjLGludCxkLGludCxlLGludCxmLFdPUkQsZykKK0ZnKHZvaWQsU2V0V2luZG93UG9zLEhXTkQsYSxIV05ELGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsc2hvcnQsZixXT1JELGcpCiBGaChCT09MLEV4dFRleHRPdXQsSERDLGEsaW50LGIsaW50LGMsV09SRCxkLExQUkVDVCxlLExQU1RSLGYsV09SRCxnLExQSU5ULGgpCiBGaChIQU5ETEUsRGVmZXJXaW5kb3dQb3MsSEFORExFLGhXaW5Qb3NJbmZvLEhXTkQsaFduZCxIV05ELGhXbmRJbnNlcnRBZnRlcixpbnQseCxpbnQseSxpbnQsY3gsaW50LGN5LFdPUkQsd0ZsYWdzKQogRmgoTE9ORyxUYWJiZWRUZXh0T3V0LEhEQyxhLGludCxiLGludCxjLExQU1RSLGQsaW50LGUsaW50LGYsTFBJTlQsZyxpbnQsaCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZS5oIGIvaW5jbHVkZS93aW5lLmgKaW5kZXggYWZlMTFkNi4uNmE2MDJlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5lLmgKKysrIGIvaW5jbHVkZS93aW5lLmgKQEAgLTIyLDUgKzIyLDQwIEBACiAKIGV4dGVybiBjaGFyICpHZXRGaWxlbmFtZUZyb21JbnN0YW5jZSh1bnNpZ25lZCBzaG9ydCBpbnN0YW5jZSk7CiBleHRlcm4gc3RydWN0IHdfZmlsZXMgKkdldEZpbGVJbmZvKHVuc2lnbmVkIHNob3J0IGluc3RhbmNlKTsKLQorZXh0ZXJuIGNoYXIgKkZpbmRGaWxlSW5QYXRoKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgY2hhciAqcm9vdG5hbWUsIAorCQkJICAgIGNoYXIgKipleHRlbnNpb25zLCBjaGFyICpwYXRoKTsKK2V4dGVybiBjaGFyICpHZXRTeXN0ZW1JbmlGaWxlbmFtZSh2b2lkKTsKKyNpZmRlZiBsaW51eAorc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBzY19ncywgX19nc2g7CisJdW5zaWduZWQgc2hvcnQgc2NfZnMsIF9fZnNoOworCXVuc2lnbmVkIHNob3J0IHNjX2VzLCBfX2VzaDsKKwl1bnNpZ25lZCBzaG9ydCBzY19kcywgX19kc2g7CisJdW5zaWduZWQgbG9uZyBzY19lZGk7CisJdW5zaWduZWQgbG9uZyBzY19lc2k7CisJdW5zaWduZWQgbG9uZyBzY19lYnA7CisJdW5zaWduZWQgbG9uZyBzY19lc3A7CisJdW5zaWduZWQgbG9uZyBzY19lYng7CisJdW5zaWduZWQgbG9uZyBzY19lZHg7CisJdW5zaWduZWQgbG9uZyBzY19lY3g7CisJdW5zaWduZWQgbG9uZyBzY19lYXg7CisJdW5zaWduZWQgbG9uZyBzY190cmFwbm87CisJdW5zaWduZWQgbG9uZyBzY19lcnI7CisJdW5zaWduZWQgbG9uZyBzY19laXA7CisJdW5zaWduZWQgc2hvcnQgc2NfY3MsIF9fY3NoOworCXVuc2lnbmVkIGxvbmcgc2NfZWZsOworCXVuc2lnbmVkIGxvbmcgZXNwX2F0X3NpZ25hbDsKKwl1bnNpZ25lZCBzaG9ydCBzY19zcywgX19zc2g7CisJdW5zaWduZWQgbG9uZyBpMzg3OworCXVuc2lnbmVkIGxvbmcgb2xkbWFzazsKKwl1bnNpZ25lZCBsb25nIGNyMjsKK307CiAjZW5kaWYKKworI2lmZGVmIF9fTmV0QlNEX18KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNkZWZpbmUgc2lnY29udGV4dF9zdHJ1Y3Qgc2lnY29udGV4dAorI2RlZmluZSBIWiAxMDAKKyNlbmRpZgorCisjZW5kaWYgLyogV0lORV9IICovCmRpZmYgLS1naXQgYS9sb2FkZXIvTWFrZWZpbGUgYi9sb2FkZXIvTWFrZWZpbGUKaW5kZXggYTQ4YTc0OS4uNjYyYjU5NyAxMDA2NDQKLS0tIGEvbG9hZGVyL01ha2VmaWxlCisrKyBiL2xvYWRlci9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKLUNGTEFHUz0kKENPUFRTKSAkKERFQlVHT1BUUykgLUkkKElOQ0xVREVfRElSKQorQ0ZMQUdTPSQoQ09QVFMpICQoREVCVUdPUFRTKSAtSS4uL2luY2x1ZGUKIAotT0JKUz1kdW1wLm8gbGR0Lm8gbGR0bGliLm8gcmVzb3VyY2UubyBzZWxlY3Rvci5vIHNpZ25hbC5vIHdpbmUubworT0JKUz1kdW1wLm8gZmlsZXMubyBsZHQubyBsZHRsaWIubyByZXNvdXJjZS5vIHNlbGVjdG9yLm8gc2lnbmFsLm8gaW50MWEubyBcCisgICAgIGludDIxLm8gd2luZS5vCiAKIGRlZmF1bHQ6IGxvYWRlci5vCiAKQEAgLTgsNyArOSw3IEBACiAJJChMRCkgLXIgLW8gbG9hZGVyLm8gJChPQkpTKQogCiBjbGVhbjoKLQlybSAtZiAqLm8gKn4gKi5zIGRsbF8qICouYQorCXJtIC1mICoubyAqfiAqLnMgZGxsXyogKi5hICojCiAKIGRlcGVuZDoKIAkkKENDKSAkKENGTEFHUykgLU0gKi5jID4gLmRlcGVuZApkaWZmIC0tZ2l0IGEvbG9hZGVyL2ZpbGVzLmMgYi9sb2FkZXIvZmlsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmYzZmJiCi0tLSAvZGV2L251bGwKKysrIGIvbG9hZGVyL2ZpbGVzLmMKQEAgLTAsMCArMSwxMDggQEAKK3N0YXRpYyBjaGFyIFJDU0lkW10gPSAiJElkOiB3aW5lLmMsdiAxLjIgMTk5My8wNy8wNCAwNDowNDoyMSByb290IEV4cCByb290ICQiOworc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBSb2JlcnQgSi4gQW1zdGFkdCwgMTk5MyI7CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQlGaW5kRmlsZUluUGF0aAorICovCitjaGFyICoKK0ZpbmRGaWxlSW5QYXRoKGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgY2hhciAqcm9vdG5hbWUsIAorCSAgICAgICBjaGFyICoqZXh0ZW5zaW9ucywgY2hhciAqcGF0aCkKK3sKKyAgICBjaGFyICp3b3JraW5ncGF0aDsKKyAgICBjaGFyICpkaXJuYW1lOworICAgIERJUiAqZDsKKyAgICBzdHJ1Y3QgZGlyZW50ICpmOworICAgIGNoYXIgKiplOworICAgIGludCByb290bmFtZWxlbjsKKyAgICBpbnQgZm91bmQgPSAwOworCisgICAgaWYgKHN0cmNocihyb290bmFtZSwgJy8nKSAhPSBOVUxMKQorICAgIHsKKwlzdHJuY3B5KGJ1ZmZlciwgcm9vdG5hbWUsIGJ1Zmxlbik7CisJcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKKyAgICByb290bmFtZWxlbiA9IHN0cmxlbihyb290bmFtZSk7CisgICAgd29ya2luZ3BhdGggPSBtYWxsb2Moc3RybGVuKHBhdGgpICsgMSk7CisgICAgaWYgKHdvcmtpbmdwYXRoID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisgICAgc3RyY3B5KHdvcmtpbmdwYXRoLCBwYXRoKTsKKyAgICAKKyAgICBmb3IoZGlybmFtZSA9IHN0cnRvayh3b3JraW5ncGF0aCwgIjo7Iik7IAorCWRpcm5hbWUgIT0gTlVMTDsKKwlkaXJuYW1lID0gc3RydG9rKE5VTEwsICI6OyIpKQorICAgIHsKKwlkID0gb3BlbmRpcihkaXJuYW1lKTsKKwlpZiAoZCAhPSBOVUxMKQorCXsKKwkgICAgd2hpbGUgKChmID0gcmVhZGRpcihkKSkgIT0gTlVMTCkKKwkgICAgeworCQlpZiAoc3RybmNhc2VjbXAocm9vdG5hbWUsIGYtPmRfbmFtZSwgcm9vdG5hbWVsZW4pID09IDApCisJCXsKKwkJICAgIGlmIChleHRlbnNpb25zID09IE5VTEwgfHwgCisJCQlzdHJjYXNlY21wKHJvb3RuYW1lLCBmLT5kX25hbWUpID09IDApCisJCSAgICB7CisJCQlmb3VuZCA9IDE7CisJCSAgICB9CisJCSAgICBlbHNlIGlmIChmLT5kX25hbWVbcm9vdG5hbWVsZW5dID09ICcuJykKKwkJICAgIHsKKwkJCWZvciAoZSA9IGV4dGVuc2lvbnM7ICplICE9IE5VTEw7IGUrKykKKwkJCXsKKwkJCSAgICBpZiAoc3RyY2FzZWNtcCgqZSwgZi0+ZF9uYW1lICsgcm9vdG5hbWVsZW4gKyAxKSAKKwkJCQk9PSAwKQorCQkJICAgIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJfQorCQkgICAgfQorCQkgICAgCisJCSAgICBpZiAoZm91bmQpCisJCSAgICB7CisJCQlzdHJuY3B5KGJ1ZmZlciwgZGlybmFtZSwgYnVmbGVuKTsKKwkJCXN0cm5jYXQoYnVmZmVyLCAiLyIsIGJ1ZmxlbiAtIHN0cmxlbihidWZmZXIpKTsKKwkJCXN0cm5jYXQoYnVmZmVyLCBmLT5kX25hbWUsIGJ1ZmxlbiAtIHN0cmxlbihidWZmZXIpKTsKKwkJCXJldHVybiBidWZmZXI7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICBjbG9zZWRpcihkKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCUdldFN5c3RlbUluaUZpbGVuYW1lCisgKi8KK2NoYXIgKgorR2V0U3lzdGVtSW5pRmlsZW5hbWUoKQoreworICAgIHN0YXRpYyBjaGFyICpJbmlOYW1lID0gTlVMTDsKKyAgICBjaGFyIGluaXBhdGhbMjU2XTsKKyAgICAKKyAgICBpZiAoSW5pTmFtZSkKKwlyZXR1cm4gSW5pTmFtZTsKKworICAgIGdldGN3ZChpbmlwYXRoLCAyNTYpOworICAgIHN0cmNhdChpbmlwYXRoLCAiOiIpOworICAgIHN0cmNhdChpbmlwYXRoLCBnZXRlbnYoIkhPTUUiKSk7CisgICAgc3RyY2F0KGluaXBhdGgsICI6Iik7CisgICAgc3RyY2F0KGluaXBhdGgsIGdldGVudigiV0lORVBBVEgiKSk7CisgICAgCisgICAgSW5pTmFtZSA9IG1hbGxvYygxMDI0KTsKKyAgICBpZiAoRmluZEZpbGVJblBhdGgoSW5pTmFtZSwgMTAyNCwgIndpbmUuaW5pIiwgTlVMTCwgaW5pcGF0aCkgPT0gTlVMTCkKKyAgICB7CisJZnJlZShJbmlOYW1lKTsKKwlJbmlOYW1lID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgSW5pTmFtZSA9IHJlYWxsb2MoSW5pTmFtZSwgc3RybGVuKEluaU5hbWUpICsgMSk7CisgICAgcmV0dXJuIEluaU5hbWU7Cit9CmRpZmYgLS1naXQgYS9sb2FkZXIvaW50MWEuYyBiL2xvYWRlci9pbnQxYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDFkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9sb2FkZXIvaW50MWEuYwpAQCAtMCwwICsxLDU4IEBACisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAid2luZS5oIgorCisjaWZkZWYgbGludXgKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBuZWVkZWQgZm9yIEhaICovCisjZW5kaWYKKworI2RlZmluZQlCQ0RfVE9fQklOKHgpICgoeCYxNSkgKyAoeD4+NCkqMTApCisjZGVmaW5lIEJJTl9UT19CQ0QoeCkgKCh4JTEwKSArICgoeC8xMCk8PDQpKQorCitpbnQgZG9faW50MUEoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICogY29udGV4dCl7CisJdGltZV90IGx0aW1lOworCXN0cnVjdCB0bSAqYmR0aW1lOworCWludCB0aWNrczsKKworCXN3aXRjaCgoY29udGV4dC0+c2NfZWF4ID4+IDgpICYgMHhmZil7CisJY2FzZSAwOgorCQlsdGltZSA9IHRpbWUoTlVMTCk7CisJCXRpY2tzID0gKGludCkgKGx0aW1lICogSFopOworCQljb250ZXh0LT5zY19lY3ggPSB0aWNrcyA+PiAxNjsKKwkJY29udGV4dC0+c2NfZWR4ID0gdGlja3MgJiAweDAwMDBGRkZGOworCQljb250ZXh0LT5zY19lYXggPSAwOyAgLyogTm8gbWlkbmlnaHQgcm9sbG92ZXIgKi8KKwkJYnJlYWs7CisJCQorCWNhc2UgMjogCisJCWx0aW1lID0gdGltZShOVUxMKTsKKwkJYmR0aW1lID0gbG9jYWx0aW1lKCZsdGltZSk7CisJCQorCQljb250ZXh0LT5zY19lY3ggPSAoQklOX1RPX0JDRChiZHRpbWUtPnRtX2hvdXIpPDw4KSB8IEJJTl9UT19CQ0QoYmR0aW1lLT50bV9taW4pOworCQljb250ZXh0LT5zY19lZHggPSAoQklOX1RPX0JDRChiZHRpbWUtPnRtX3NlYyk8PDgpOworCisJY2FzZSA0OgorCQlsdGltZSA9IHRpbWUoTlVMTCk7CisJCWJkdGltZSA9IGxvY2FsdGltZSgmbHRpbWUpOworCQljb250ZXh0LT5zY19lY3ggPSAoQklOX1RPX0JDRChiZHRpbWUtPnRtX3llYXIvMTAwKTw8OCkgfCBCSU5fVE9fQkNEKChiZHRpbWUtPnRtX3llYXItMTkwMCklMTAwKTsKKwkJY29udGV4dC0+c2NfZWR4ID0gKEJJTl9UT19CQ0QoYmR0aW1lLT50bV9tb24pPDw4KSB8IEJJTl9UT19CQ0QoYmR0aW1lLT50bV9tZGF5KTsKKwkJYnJlYWs7CisKKwkJLyogc2V0dGluZyB0aGUgdGltZSxkYXRlIG9yIFJUQyBpcyBub3QgYWxsb3cgLUVCICovCisJY2FzZSAxOgorCQkvKiBzZXQgc3lzdGVtIHRpbWUgKi8KKwljYXNlIDM6IAorCQkvKiBzZXQgUlRDIHRpbWUgKi8KKwljYXNlIDU6CisJCS8qIHNldCBSVEMgZGF0ZSAqLworCWNhc2UgNjoKKwkJLyogc2V0IEFMQVJNICovCisJY2FzZSA3OgorCQkvKiBjYW5jZWwgQUxBUk0gKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGhhbmRsZSBpbnQgMHgxQSBBWCAleFxuIiwgY29udGV4dC0+c2NfZWF4KTsKKwkJcmV0dXJuIDE7CisJfTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xvYWRlci9pbnQyMS5jIGIvbG9hZGVyL2ludDIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4ODAxYgotLS0gL2Rldi9udWxsCisrKyBiL2xvYWRlci9pbnQyMS5jCkBAIC0wLDAgKzEsMTIwNSBAQAorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorI2VuZGlmCisjaWZkZWYgX19OZXRCU0RfXworI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2VuZGlmCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aW1lLmg+CisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZS5oIgorI2luY2x1ZGUgImludDIxLmgiCisjaW5jbHVkZSAiZmlsZXMuaCIKKworI2RlZmluZSBNQVhfRFJJVkVTIDI2CisKK3N0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gImludDIxLmMsIGNvcHlyaWdodCBFcmlrIEJvcywgMTk5MyI7CisKK2V4dGVybiBzdHJ1Y3QgRG9zRHJpdmVTdHJ1Y3QgRG9zRHJpdmVzW107CitleHRlcm4gaW50IEN1cnJlbnREcml2ZTsKK2V4dGVybiB2b2lkIFBhcnNlRE9TRmlsZU5hbWUoKTsKKworaW50IFZhbGlkRHJpdmUoaW50KTsKKworV09SRCBFeHRlbmRlZEVycm9yLCBDb2RlUGFnZSA9IDQzNzsKK0JZVEUgRXJyb3JDbGFzcywgQWN0aW9uLCBFcnJvckxvY3VzOworCit2b2lkIEVycm9yKGludCBlLCBpbnQgY2xhc3MsIGludCBlbCkKK3sKKwlFeHRlbmRlZEVycm9yID0gZTsKKwlFcnJvckNsYXNzID0gY2xhc3M7CisJQWN0aW9uID0gU0FfQXNrNFJldHJ5OworCUVycm9yTG9jdXMgPSBlbDsKK30KKwordm9pZCBHZXRGcmVlRGlza1NwYWNlKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlpbnQgZHJpdmU7CisJc3RydWN0IHN0YXRmcyBpbmZvOworCWxvbmcgc2l6ZSxhdmFpbDsKKworCWlmICghKERYICYgMHhmZikpCisJCWRyaXZlID0gQ3VycmVudERyaXZlOworCWVsc2UKKwkJZHJpdmUgPSAoRFggJiAweGZmKSAtIDE7CisJCisJaWYgKCFWYWxpZERyaXZlKGRyaXZlKSkgeworCQlFcnJvcihJbnZhbGlkRHJpdmUsIEVDX01lZGlhRXJyb3IgLCBFTF9EaXNrKTsKKwkJQVggPSAweGZmZmY7CQorCQlyZXR1cm47CisJfQorCQorCXsKKwkJaWYgKHN0YXRmcyhEb3NEcml2ZXNbZHJpdmVdLlJvb3REaXJlY3RvcnksICZpbmZvKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCJjYW5ub3QgZG8gc3RhdGZzKCVzKVxuIixEb3NEcml2ZXNbZHJpdmVdLlJvb3REaXJlY3RvcnkpOworCQkJRXJyb3IoR2VuZXJhbEZhaWx1cmUsIEVDX01lZGlhRXJyb3IgLCBFTF9EaXNrKTsKKwkJCUFYID0gMHhmZmZmOworCQkJcmV0dXJuOworCQl9CisKKwkJc2l6ZSA9IGluZm8uZl9ic2l6ZSAqIGluZm8uZl9ibG9ja3MgLyAxMDI0OworCQlhdmFpbCA9IGluZm8uZl9iYXZhaWwgKiBpbmZvLmZfYnNpemUgLyAxMDI0OworCQorCQkjaWZkZWYgRE9TREVCVUcKKwkJZnByaW50ZihzdGRlcnIsInN0YXRmczogc2l6ZTogJThkIGF2YWlsOiAlOGRcbiIsc2l6ZSxhdmFpbCk7CisJCSNlbmRpZgorCisJCUFYID0gU2VjdG9yc1BlckNsdXN0ZXI7CQorCQlDWCA9IFNlY3RvclNpemU7CisJCQorCQlCWCA9IChhdmFpbCAvIChDWCAqIEFYKSk7CisJCURYID0gKHNpemUgLyAoQ1ggKiBBWCkpOworCQlFcnJvciAoMCwwLDApOworCX0KK30KKwordm9pZCBTZXREZWZhdWx0RHJpdmUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWlmICgoRFggJiAweGZmKSA8IE1BWF9EUklWRVMpIHsKKwkJQ3VycmVudERyaXZlID0gRFggJiAweGZmOworCQlBWCAmPSAweGZmMDA7CisJCUFYIHw9IE1BWF9EUklWRVM7IC8qICMgb2YgdmFsaWQgZHJpdmUgbGV0dGVycyAqLworCQlFcnJvciAoMCwwLDApOworCX0gZWxzZQorCQlFcnJvciAoSW52YWxpZERyaXZlLCBFQ19NZWRpYUVycm9yLCBFTF9EaXNrKTsKK30KKwordm9pZCBHZXREZWZhdWx0RHJpdmUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCUFYICY9IDB4ZmYwMDsKKwlBWCB8PSBDdXJyZW50RHJpdmU7CisJRXJyb3IgKDAsMCwwKTsKK30KKwordm9pZCBHZXREcml2ZUFsbG9jSW5mbyhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJaW50IGRyaXZlOworCWxvbmcgc2l6ZTsKKwlCWVRFIG1lZGlhSUQ7CisJc3RydWN0IHN0YXRmcyBpbmZvOworCQorCWRyaXZlID0gRFggJiAweGZmOworCQorCWlmICghVmFsaWREcml2ZShkcml2ZSkpIHsKKwkJQVggPSBTZWN0b3JzUGVyQ2x1c3RlcjsKKwkJQ1ggPSBTZWN0b3JTaXplOworCQlEWCA9IDA7CisJCUVycm9yIChJbnZhbGlkRHJpdmUsIEVDX01lZGlhRXJyb3IsIEVMX0Rpc2spOworCQlyZXR1cm47CisJfQorCisJeworCQlpZiAoc3RhdGZzKERvc0RyaXZlc1tkcml2ZV0uUm9vdERpcmVjdG9yeSwgJmluZm8pIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsImNhbm5vdCBkbyBzdGF0ZnMoJXMpXG4iLERvc0RyaXZlc1tkcml2ZV0uUm9vdERpcmVjdG9yeSk7CisJCQlFcnJvcihHZW5lcmFsRmFpbHVyZSwgRUNfTWVkaWFFcnJvciAsIEVMX0Rpc2spOworCQkJQVggPSAweGZmZmY7CisJCQlyZXR1cm47CisJCX0KKworCQlzaXplID0gaW5mby5mX2JzaXplICogaW5mby5mX2Jsb2NrcyAvIDEwMjQ7CisJCisJCSNpZmRlZiBET1NERUJVRworCQlmcHJpbnRmKHN0ZGVyciwic3RhdGZzOiBzaXplOiAlOGRcbiIsc2l6ZSk7CisJCSNlbmRpZgorCisJCUFYID0gU2VjdG9yc1BlckNsdXN0ZXI7CQorCQlDWCA9IFNlY3RvclNpemU7CisJCURYID0gKHNpemUgLyAoQ1ggKiBBWCkpOworCisJCW1lZGlhSUQgPSAweGYwOworCisJCURTID0gc2VnbWVudChtZWRpYUlEKTsKKwkJQlggPSBvZmZzZXQobWVkaWFJRCk7CQorCQlFcnJvciAoMCwwLDApOworCX0KK30KKwordm9pZCBHZXREZWZEcml2ZUFsbG9jSW5mbyhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJRFggPSBDdXJyZW50RHJpdmU7CisJR2V0RHJpdmVBbGxvY0luZm8oY29udGV4dCk7Cit9CisKK3ZvaWQgR2V0RHJpdmVQQihzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJRXJyb3IgKEludmFsaWREcml2ZSwgRUNfTWVkaWFFcnJvciwgRUxfRGlzayk7CisJQVggPSAweGZmOyAvKiBJJ20gc29ycnkgYnV0IEkgb25seSBnb3QgbmV0d29ya2VkIGRyaXZlcyA6LSkgKi8KK30KKwordm9pZCBSZWFkRmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciAqcHRyOworCWludCBzaXplOworCisJLyogY2FuJ3QgcmVhZCBmcm9tIHN0ZG91dCAvIHN0ZGVyciAqLworCisJaWYgKCgoQlggJiAweGZmZmYpID09IDEpIHx8KChCWCAmIDB4ZmZmZikgPT0gMikpIHsKKwkJRXJyb3IgKEludmFsaWRIYW5kbGUsIEVMX1Vua25vd24sIEVDX1Vua25vd24pOworCQlBWCA9IEludmFsaWRIYW5kbGU7CisJCVNldENmbGFnOworCQlyZXR1cm47CisJfQorCisJcHRyID0gKGNoYXIgKikgcG9pbnRlciAoRFMsRFgpOworCisJaWYgKChCWCAmIDB4ZmZmZikgPT0gMCkgeworCQkqcHRyID0gRU9GOworCQlFcnJvciAoMCwwLDApOworCQlBWCA9IDE7CisJCVJlc2V0Q2ZsYWc7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlzaXplID0gcmVhZChCWCwgcHRyLCBDWCk7CisJCWlmIChzaXplID09IDApIHsKKwkJCUVycm9yIChSZWFkRmF1bHQsIEVDX1Vua25vd24sIEVMX1Vua25vd24pOworCQkJQVggPSBFeHRlbmRlZEVycm9yOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHNpemUgPT0gLTEpIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQljYXNlIEVBR0FJTjoKKwkJCQkJRXJyb3IgKFNoYXJlVmlvbGF0aW9uLCBFQ19UZW1wb3JhcnksIEVMX1Vua25vd24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVCQURGOgorCQkJCQlFcnJvciAoSW52YWxpZEhhbmRsZSwgRUNfQXBwRXJyb3IsIEVMX1Vua25vd24pOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlFcnJvciAoR2VuZXJhbEZhaWx1cmUsIEVDX1N5c3RlbUZhaWx1cmUsIEVMX1Vua25vd24pOworCQkJCQlicmVhazsKKwkJCX0KKwkJCUFYID0gRXh0ZW5kZWRFcnJvcjsKKwkJCVNldENmbGFnOworCQkJcmV0dXJuOworCQl9CQkKKwkJRXJyb3IgKDAsMCwwKTsKKwkJQVggPSBzaXplOworCQlSZXNldENmbGFnOworCX0KK30KKwordm9pZCBXcml0ZUZpbGUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWNoYXIgKnB0cjsKKwlpbnQgeCxzaXplOworCQorCXB0ciA9IChjaGFyICopIHBvaW50ZXIgKERTLERYKTsKKwkKKwlpZiAoKEJYICYgMHhmZmZmKSA9PSAwKSB7CisJCUVycm9yIChJbnZhbGlkSGFuZGxlLCBFQ19Vbmtub3duLCBFTF9Vbmtub3duKTsKKwkJQVggPSBJbnZhbGlkSGFuZGxlOworCQlTZXRDZmxhZzsKKwkJcmV0dXJuOworCX0KKworCWlmICgoQlggJiAweGZmZmYpIDwgMykgeworCQlmb3IgKHggPSAwO3ggIT0gQ1g7eCsrKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVjIiwgKnB0cisrKTsKKwkJfQorCQlmZmx1c2goc3RkZXJyKTsKKworCQlFcnJvciAoMCwwLDApOworCQlBWCA9IENYOworCQlSZXNldENmbGFnOworCX0gZWxzZSB7CisJCXNpemUgPSB3cml0ZShCWCwgcHRyICwgQ1gpOworCQlpZiAoc2l6ZSA9PSAwKSB7CisJCQlFcnJvciAoV3JpdGVGYXVsdCwgRUNfVW5rbm93biwgRUxfVW5rbm93bik7CisJCQlBWCA9IEV4dGVuZGVkRXJyb3I7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoc2l6ZSA9PSAtMSkgeworCQkJc3dpdGNoIChlcnJubykgeworCQkJCWNhc2UgRUFHQUlOOgorCQkJCQlFcnJvciAoU2hhcmVWaW9sYXRpb24sIEVDX1RlbXBvcmFyeSwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRUJBREY6CisJCQkJCUVycm9yIChJbnZhbGlkSGFuZGxlLCBFQ19BcHBFcnJvciwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRU5PU1BDOgorCQkJCQlFcnJvciAoRGlza0Z1bGwsIEVDX01lZGlhRXJyb3IsIEVMX0Rpc2spOworCQkJCQlicmVhazsJCQkJCisJCQkJZGVmYXVsdDoKKwkJCQkJRXJyb3IgKEdlbmVyYWxGYWlsdXJlLCBFQ19TeXN0ZW1GYWlsdXJlLCBFTF9Vbmtub3duKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlBWCA9IEV4dGVuZGVkRXJyb3I7CisJCQlTZXRDZmxhZzsKKwkJCXJldHVybjsKKwkJfQkJCisJCUVycm9yICgwLDAsMCk7CisJCUFYID0gc2l6ZTsKKwkJUmVzZXRDZmxhZzsKKwl9Cit9CisKK3ZvaWQgVW5saW5rRmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciBVbml4RmlsZU5hbWVbMjU2XTsKKwlpbnQgZHJpdmUsIHN0YXR1czsKKwkKKwlQYXJzZURPU0ZpbGVOYW1lKFVuaXhGaWxlTmFtZSwgKGNoYXIgKikgcG9pbnRlcihEUyxEWCksICZkcml2ZSk7CisKKwl7CisJCXN0YXR1cyA9IHVubGluaygoY2hhciAqKSBwb2ludGVyKERTLERYKSk7CisJCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQljYXNlIEVBQ0NFUzoKKwkJCQljYXNlIEVQRVJNOgorCQkJCWNhc2UgRVJPRlM6CisJCQkJCUVycm9yIChXcml0ZVByb3RlY3RlZCwgRUNfQWNjZXNzRGVuaWVkLCBFTF9Vbmtub3duKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFQlVTWToKKwkJCQkJRXJyb3IgKExvY2tWaW9sYXRpb24sIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOwkJCisJCQkJY2FzZSBFQUdBSU46CisJCQkJCUVycm9yIChTaGFyZVZpb2xhdGlvbiwgRUNfVGVtcG9yYXJ5LCBFTF9Vbmtub3duKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFTk9FTlQ6CisJCQkJCUVycm9yIChGaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBFTF9Vbmtub3duKTsKKwkJCQkJYnJlYWs7CQkJCQorCQkJCWRlZmF1bHQ6CisJCQkJCUVycm9yIChHZW5lcmFsRmFpbHVyZSwgRUNfU3lzdGVtRmFpbHVyZSwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJQVggPSBFeHRlbmRlZEVycm9yOworCQkJU2V0Q2ZsYWc7CisJCQlyZXR1cm47CisJCX0JCQorCQlFcnJvciAoMCwwLDApOworCQlSZXNldENmbGFnOworCX0KK30KKwordm9pZCBTZWVrRmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciBVbml4RmlsZU5hbWVbMjU2XTsKKwlpbnQgZHJpdmUsIGhhbmRsZSwgc3RhdHVzLCBmaWxlb2Zmc2V0OworCQorCQorCVBhcnNlRE9TRmlsZU5hbWUoVW5peEZpbGVOYW1lLCAoY2hhciAqKSBwb2ludGVyKERTLERYKSwgJmRyaXZlKTsKKwkKKwl7CisJCXN3aXRjaCAoQVggJiAweGZmKSB7CisJCQljYXNlIDE6IGZpbGVvZmZzZXQgPSBTRUVLX0NVUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjogZmlsZW9mZnNldCA9IFNFRUtfRU5EOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCWNhc2UgMDogZmlsZW9mZnNldCA9IFNFRUtfU0VUOworCQkJCWJyZWFrOworCQl9CisJCXN0YXR1cyA9IGxzZWVrKEJYLCAoQ1ggKiAweDEwMCkgKyBEWCwgZmlsZW9mZnNldCk7CisJCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQljYXNlIEVCQURGOgorCQkJCQlFcnJvciAoSW52YWxpZEhhbmRsZSwgRUNfQXBwRXJyb3IsIEVMX1Vua25vd24pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVJTlZBTDoKKwkJCQkJRXJyb3IgKERhdGFJbnZhbGlkLCBFQ19BcHBFcnJvciwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUVycm9yIChHZW5lcmFsRmFpbHVyZSwgRUNfU3lzdGVtRmFpbHVyZSwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJQVggPSBFeHRlbmRlZEVycm9yOworCQkJU2V0Q2ZsYWc7CisJCQlyZXR1cm47CisJCX0JCQorCQlFcnJvciAoMCwwLDApOworCQlSZXNldENmbGFnOworCX0KK30KKwordm9pZCBHZXRGaWxlQXR0cmlidXRlcyhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciBVbml4RmlsZU5hbWVbMjU2XTsKKwlpbnQgZHJpdmUsaGFuZGxlOworCQorCVBhcnNlRE9TRmlsZU5hbWUoVW5peEZpbGVOYW1lLCAoY2hhciAqKSBwb2ludGVyKERTLERYKSwgJmRyaXZlKTsKKworCXsKKwkJQ1ggPSAweDA7CisJCVJlc2V0Q2ZsYWc7CisJfQorfQorCit2b2lkIFNldEZpbGVBdHRyaWJ1dGVzKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlSZXNldENmbGFnOworfQorCit2b2lkIERvc0lPQ1RMKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlBWCA9IFVua25vd25Vbml0OworCVNldENmbGFnOworfQorCit2b2lkIER1cGVGaWxlSGFuZGxlKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlBWCA9IGR1cChCWCk7CisJUmVzZXRDZmxhZzsKK30KKwordm9pZCBHZXRTeXN0ZW1EYXRlKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgdG0gKm5vdzsKKwl0aW1lX3QgbHRpbWU7CisKKwlsdGltZSA9IHRpbWUoTlVMTCk7CisJbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7CisKKwlDWCA9IG5vdy0+dG1feWVhciArIDE5MDA7CisJRFggPSAoKG5vdy0+dG1fbW9uICsgMSkgPDwgOCkgfCBub3ctPnRtX21kYXk7CisJQVggJj0gMHhmZjAwOworCUFYIHw9IG5vdy0+dG1fd2RheTsKK30KKwordm9pZCBHZXRTeXN0ZW1UaW1lKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgdG0gKm5vdzsKKwl0aW1lX3QgbHRpbWU7CisKKwlsdGltZSA9IHRpbWUoTlVMTCk7CisJbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7CisJIAorCUNYID0gKG5vdy0+dG1faG91ciA8PCA4KSB8IG5vdy0+dG1fbWluOworCURYID0gbm93LT50bV9zZWMgPDwgODsKK30KKwordm9pZCBHZXRFeHRlbmRlZEVycm9ySW5mbyhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJQVggPSBFeHRlbmRlZEVycm9yOworCUJYID0gKDB4MTAwICogRXJyb3JDbGFzcykgfCBBY3Rpb247CisJQ1ggJj0gMHgwMGZmOworCUNYIHw9ICgweDEwMCAqIEVycm9yTG9jdXMpOworfQorCit2b2lkIEdldEluRG9zRmxhZyhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY29uc3QgQllURSBJbkRvc0ZsYWcgPSAwOworCQorCUVTID0gc2VnbWVudChJbkRvc0ZsYWcpOworCUJYID0gb2Zmc2V0KEluRG9zRmxhZyk7Cit9CisKK3ZvaWQgQ3JlYXRlRmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciBVbml4RmlsZU5hbWVbMjU2XTsKKwlpbnQgZHJpdmUsaGFuZGxlOworCQorCVBhcnNlRE9TRmlsZU5hbWUoVW5peEZpbGVOYW1lLCAoY2hhciAqKSBwb2ludGVyKERTLERYKSwgJmRyaXZlKTsKKworCXsKKwkJaGFuZGxlID0gb3BlbihVbml4RmlsZU5hbWUsIE9fQ1JFQVQgfCBPX1RSVU5DKTsKKworCQlpZiAoaGFuZGxlID09IC0xKSB7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQUNDRVM6CisJCQkJY2FzZSBFUEVSTToKKwkJCQljYXNlIEVST0ZTOgorCQkJCQlFcnJvciAoV3JpdGVQcm90ZWN0ZWQsIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRUlTRElSOgorCQkJCQlFcnJvciAoQ2FuTm90TWFrZURpciwgRUNfQWNjZXNzRGVuaWVkLCBFTF9Vbmtub3duKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFTkZJTEU6CisJCQkJY2FzZSBFTUZJTEU6CisJCQkJCUVycm9yIChOb01vcmVGaWxlcywgRUNfTWVkaWFFcnJvciwgRUxfVW5rbm93bik7CisJCQkJY2FzZSBFRVhJU1Q6CisJCQkJCUVycm9yIChGaWxlRXhpc3RzLCBFQ19FeGlzdHMsIEVMX0Rpc2spOworCQkJCQlicmVhazsJCQkJCisJCQkJY2FzZSBFTk9TUEM6CisJCQkJCUVycm9yIChEaXNrRnVsbCwgRUNfTWVkaWFFcnJvciwgRUxfRGlzayk7CisJCQkJCWJyZWFrOwkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlFcnJvciAoR2VuZXJhbEZhaWx1cmUsIEVDX1N5c3RlbUZhaWx1cmUsIEVMX1Vua25vd24pOworCQkJCQlicmVhazsKKwkJCX0KKwkJCUFYID0gRXh0ZW5kZWRFcnJvcjsKKwkJCVNldENmbGFnOworCQkJcmV0dXJuOworCQl9CQkKKwkJRXJyb3IgKDAsMCwwKTsKKwkJQlggPSBoYW5kbGU7CisJCUFYID0gTm9FcnJvcjsKKwkJUmVzZXRDZmxhZzsKKwl9Cit9CisKK3ZvaWQgT3BlbkV4aXN0aW5nRmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciBVbml4RmlsZU5hbWVbMjU2XTsKKwlpbnQgZHJpdmUsIGhhbmRsZTsKKwkKKwlQYXJzZURPU0ZpbGVOYW1lKFVuaXhGaWxlTmFtZSwgKGNoYXIgKikgcG9pbnRlcihEUyxEWCksICZkcml2ZSk7CisJCisJeworCQloYW5kbGUgPSBvcGVuKFVuaXhGaWxlTmFtZSwgT19SRFdSKTsKKworCQlpZiAoaGFuZGxlID09IC0xKSB7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQUNDRVM6CisJCQkJY2FzZSBFUEVSTToKKwkJCQljYXNlIEVST0ZTOgorCQkJCQlFcnJvciAoV3JpdGVQcm90ZWN0ZWQsIEVDX0FjY2Vzc0RlbmllZCwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRUlTRElSOgorCQkJCQlFcnJvciAoQ2FuTm90TWFrZURpciwgRUNfQWNjZXNzRGVuaWVkLCBFTF9Vbmtub3duKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBFTkZJTEU6CisJCQkJY2FzZSBFTUZJTEU6CisJCQkJCUVycm9yIChOb01vcmVGaWxlcywgRUNfTWVkaWFFcnJvciwgRUxfVW5rbm93bik7CisJCQkJY2FzZSBFRVhJU1Q6CisJCQkJCUVycm9yIChGaWxlRXhpc3RzLCBFQ19FeGlzdHMsIEVMX0Rpc2spOworCQkJCQlicmVhazsJCQkJCisJCQkJY2FzZSBFTk9TUEM6CisJCQkJCUVycm9yIChEaXNrRnVsbCwgRUNfTWVkaWFFcnJvciwgRUxfRGlzayk7CisJCQkJCWJyZWFrOwkJCQkKKwkJCQljYXNlIEVOT0VOVDoKKwkJCQkJRXJyb3IgKEZpbGVOb3RGb3VuZCwgRUNfTWVkaWFFcnJvciwgRUxfRGlzayk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUVycm9yIChHZW5lcmFsRmFpbHVyZSwgRUNfU3lzdGVtRmFpbHVyZSwgRUxfVW5rbm93bik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJQVggPSBFeHRlbmRlZEVycm9yOworCQkJU2V0Q2ZsYWc7CisJCQlyZXR1cm47CisJCX0JCQorCQlFcnJvciAoMCwwLDApOworCQlCWCA9IGhhbmRsZTsKKwkJQVggPSBOb0Vycm9yOworCQlSZXNldENmbGFnOworCX0KK30KKwordm9pZCBDbG9zZUZpbGUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWlmIChjbG9zZShCWCkgPT0gLTEpIHsKKwkJc3dpdGNoIChlcnJubykgeworCQkJY2FzZSBFQkFERjoKKwkJCQlFcnJvciAoSW52YWxpZEhhbmRsZSwgRUNfQXBwRXJyb3IsIEVMX1Vua25vd24pOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlFcnJvciAoR2VuZXJhbEZhaWx1cmUsIEVDX1N5c3RlbUZhaWx1cmUsIEVMX1Vua25vd24pOworCQkJCWJyZWFrOworCQl9CisJCUFYID0gRXh0ZW5kZWRFcnJvcjsKKwkJU2V0Q2ZsYWc7CisJCXJldHVybjsKKwl9CQkKKwlFcnJvciAoMCwwLDApOworCUFYID0gTm9FcnJvcjsKKwlSZXNldENmbGFnOworfQorCit2b2lkIFJlbmFtZUZpbGUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCXJlbmFtZSgoY2hhciAqKSBwb2ludGVyKERTLERYKSwgKGNoYXIgKikgcG9pbnRlcihFUyxESSkpOworCVJlc2V0Q2ZsYWc7Cit9CisKK3ZvaWQgR2V0VHJ1ZUZpbGVOYW1lKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sgCisJc3RybmNweSgoY2hhciAqKSBwb2ludGVyKEVTLERJKSwgKGNoYXIgKikgcG9pbnRlcihEUyxTSSksIHN0cmxlbigoY2hhciAqKSBwb2ludGVyKERTLFNJKSkgJiAweDdmKTsKKwlSZXNldENmbGFnOworfQorCit2b2lkIE1ha2VEaXIoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWludCBkcml2ZTsKKwljaGFyICpkaXJuYW1lOworCWNoYXIgdW5peG5hbWVbMjU2XTsKKwkKKwlkaXJuYW1lID0gKGNoYXIgKikgcG9pbnRlcihEUyxEWCk7CisKKwlQYXJzZURPU0ZpbGVOYW1lKHVuaXhuYW1lLGRpcm5hbWUsJmRyaXZlKTsKKworCXsKKwkJaWYgKG1rZGlyKHVuaXhuYW1lLDApID09IC0xKSB7CisJCQlBWCA9IENhbk5vdE1ha2VEaXI7CisJCQlTZXRDZmxhZzsKKwkJfQorCQlSZXNldENmbGFnOworCX0KK30KKwordm9pZCBDaGFuZ2VEaXIoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWludCBkcml2ZTsKKwljaGFyICpkaXJuYW1lOworCWNoYXIgdW5peG5hbWVbMjU2XTsKKwkKKwlkaXJuYW1lID0gKGNoYXIgKikgcG9pbnRlcihEUyxEWCk7CisKKwlQYXJzZURPU0ZpbGVOYW1lKHVuaXhuYW1lLGRpcm5hbWUsJmRyaXZlKTsKKworCXsKKwkJc3RyY3B5KHVuaXhuYW1lLERvc0RyaXZlc1tkcml2ZV0uQ3VycmVudERpcmVjdG9yeSk7CisJCVJlc2V0Q2ZsYWc7CisJfQorfQorCit2b2lkIFJlbW92ZURpcihzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJaW50IGRyaXZlOworCWNoYXIgKmRpcm5hbWU7CisJY2hhciB1bml4bmFtZVsyNTZdOworCQorCWRpcm5hbWUgPSAoY2hhciAqKSBwb2ludGVyKERTLERYKTsKKworCVBhcnNlRE9TRmlsZU5hbWUodW5peG5hbWUsZGlybmFtZSwmZHJpdmUpOworCisJeworCQlpZiAoc3RyY21wKHVuaXhuYW1lLERvc0RyaXZlc1tkcml2ZV0uQ3VycmVudERpcmVjdG9yeSkpIHsKKwkJCUFYID0gQ2FuTm90UmVtb3ZlQ3dkOworCQkJU2V0Q2ZsYWc7CisJCX0KKwkKKwkJI2lmZGVmIERPU0RFQlVHCisJCWZwcmludGYoc3RkZXJyLCJybWRpciAlc1xuIix1bml4bmFtZSk7CisJCSNlbmRpZgorCQkKKwkJaWYgKHJtZGlyKHVuaXhuYW1lKSA9PSAtMSkgeworCQkJQVggPSBDYW5Ob3RNYWtlRGlyOyAvKiBIVUggPyovCisJCQlTZXRDZmxhZzsKKwkJfSAKKwkJUmVzZXRDZmxhZzsKKwl9Cit9CisKK3ZvaWQgQWxsb2NhdGVNZW1vcnkoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWNoYXIgKnB0cjsKKwkKKwlpZiAoKHB0ciA9ICh2b2lkICopIG1lbWFsaWduKChzaXplX3QpIChCWCAqIDB4MTApLCAweDEwKSkgPT0gTlVMTCkgeworCQlBWCA9IE91dE9mTWVtb3J5OworCQlCWCA9IDB4MDsgLyogb3V0IG9mIG1lbW9yeSAqLworCQlTZXRDZmxhZzsKKwl9CisJQVggPSBzZWdtZW50KCh1bnNpZ25lZCBsb25nKSBwdHIpOworCVJlc2V0Q2ZsYWc7Cit9CisKK3ZvaWQgRnJlZU1lbW9yeShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJZnJlZSgodm9pZCAqKShFUyAqIDB4MTApKTsKKwlSZXNldENmbGFnOworfQorCit2b2lkIFJlc2l6ZU1lbW9yeUJsb2NrKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwljaGFyICpwdHI7CisJCisJaWYgKChwdHIgPSAodm9pZCAqKSByZWFsbG9jKCh2b2lkICopKEVTICogMHgxMCksIChzaXplX3QpIEJYICogMHgxMCkpID09IE5VTEwpIHsKKwkJQVggPSBPdXRPZk1lbW9yeTsKKwkJQlggPSAweDA7IC8qIG91dCBvZiBtZW1vcnkgKi8KKwkJU2V0Q2ZsYWc7CisJfQorCUJYID0gc2VnbWVudCgodW5zaWduZWQgbG9uZykgcHRyKTsKKwlSZXNldENmbGFnOworfQorCit2b2lkIEV4ZWNQcm9ncmFtKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlleGVjbCgid2luZSIsKGNoYXIgKikgcG9pbnRlcihEUyxEWCkpOworfQorCit2b2lkIEdldFJldHVybkNvZGUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCUFYID0gTm9FcnJvcjsgLyogbm9ybWFsIGV4aXQgKi8KK30KKwordm9pZCBGaW5kRmlyc3Qoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCit9CisKK3ZvaWQgRmluZE5leHQoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCit9CisKK3ZvaWQgR2V0U3lzVmFycyhzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJRVMgPSAweDA7CisJQlggPSAweDA7Cit9CisKK3ZvaWQgR2V0RmlsZURhdGVUaW1lKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlpbnQgZHJpdmU7CisJY2hhciAqZGlybmFtZTsKKwljaGFyIHVuaXhuYW1lWzI1Nl07CisJc3RydWN0IHN0YXQgZmlsZXN0YXQ7CisJc3RydWN0IHRtICpub3c7CisKKwlQYXJzZURPU0ZpbGVOYW1lKHVuaXhuYW1lLCBkaXJuYW1lLCAmZHJpdmUpOworCisJeworCQlzdGF0KHVuaXhuYW1lLCAmZmlsZXN0YXQpOworCSAJCisJCW5vdyA9IGxvY2FsdGltZSAoJmZpbGVzdGF0LnN0X210aW1lKTsKKwkKKwkJQ1ggPSAobm93LT50bV9ob3VyICogMHgyMDAwKSArIChub3ctPnRtX21pbiAqIDB4MjApICsgbm93LT50bV9zZWMvMjsKKwkJRFggPSAobm93LT50bV95ZWFyICogMHgyMDApICsgKG5vdy0+dG1fbW9uICogMHgyMCkgKyBub3ctPnRtX21kYXk7CisKKwkJUmVzZXRDZmxhZzsKKwl9Cit9CisKK3ZvaWQgU2V0RmlsZURhdGVUaW1lKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlpbnQgZHJpdmU7CisJY2hhciAqZGlybmFtZTsKKwljaGFyIHVuaXhuYW1lWzI1Nl07CisJc3RydWN0IHV0aW1idWYgZmlsZXRpbWU7CisJCisJZGlybmFtZSA9IChjaGFyICopIHBvaW50ZXIoRFMsRFgpOworCisJUGFyc2VET1NGaWxlTmFtZSh1bml4bmFtZSwgZGlybmFtZSwgJmRyaXZlKTsKKworCXsKKwkJZmlsZXRpbWUuYWN0aW1lID0gMEw7CisJCWZpbGV0aW1lLm1vZHRpbWUgPSBmaWxldGltZS5hY3RpbWU7CisKKwkJdXRpbWUodW5peG5hbWUsJmZpbGV0aW1lKTsKKwkJUmVzZXRDZmxhZzsKKwl9Cit9CisKK3ZvaWQgQ3JlYXRlVGVtcEZpbGUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWNoYXIgVW5peEZpbGVOYW1lWzI1Nl0sVGVtcFN0cmluZ1syNTZdOworCWludCBkcml2ZSxoYW5kbGU7CisJCisJUGFyc2VET1NGaWxlTmFtZShVbml4RmlsZU5hbWUsIChjaGFyICopIHBvaW50ZXIoRFMsRFgpLCAmZHJpdmUpOworCQorCXNwcmludGYoVGVtcFN0cmluZywiJXMlcyVkIixVbml4RmlsZU5hbWUsImViIiwoaW50KSBnZXRwaWQoKSk7CisKKwl7CisJCWhhbmRsZSA9IG9wZW4oVGVtcFN0cmluZywgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1JEV1IpOworCisJCWlmIChoYW5kbGUgPT0gLTEpIHsKKwkJCUFYID0gV3JpdGVQcm90ZWN0ZWQ7CisJCQlTZXRDZmxhZzsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJc3RyY3B5KChjaGFyICopIHBvaW50ZXIoRFMsRFgpLCBVbml4RmlsZU5hbWUpOworCQorCQlBWCA9IGhhbmRsZTsKKwkJUmVzZXRDZmxhZzsKKwl9Cit9CisKK3ZvaWQgQ3JlYXRlTmV3RmlsZShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpCit7CisJY2hhciBVbml4RmlsZU5hbWVbMjU2XTsKKwlpbnQgZHJpdmUsaGFuZGxlOworCQorCVBhcnNlRE9TRmlsZU5hbWUoVW5peEZpbGVOYW1lLCAoY2hhciAqKSBwb2ludGVyKERTLERYKSwgJmRyaXZlKTsKKwkKKwl7CisJCWhhbmRsZSA9IG9wZW4oVW5peEZpbGVOYW1lLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fUkRXUik7CisKKwkJaWYgKGhhbmRsZSA9PSAtMSkgeworCQkJQVggPSBXcml0ZVByb3RlY3RlZDsKKwkJCVNldENmbGFnOworCQkJcmV0dXJuOworCQl9CisKKwkJQVggPSBoYW5kbGU7CisJCVJlc2V0Q2ZsYWc7CisJfQorfQorCit2b2lkIEZpbGVMb2NrKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKworfQorCit2b2lkIEdldEV4dGVuZGVkQ291bnRyeUluZm8oc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCVJlc2V0Q2ZsYWc7Cit9CisKK2ludCBWYWxpZERyaXZlKGludCBkKQoreworCXJldHVybiAxOworfQorCit2b2lkIEdldEN1cnJlbnREaXJlY3Rvcnkoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWludCBkcml2ZTsKKwljaGFyICpwdHI7CisKKwlpZiAoKERYICYgMHhmZikgPT0gMCkKKwkJZHJpdmUgPSBDdXJyZW50RHJpdmU7CisJZWxzZQorCQlkcml2ZSA9IChEWCAmIDB4ZmYpLTE7CisKKwlpZiAoIVZhbGlkRHJpdmUoZHJpdmUpKSB7CisJCUFYID0gSW52YWxpZERyaXZlOworCQlTZXRDZmxhZzsKKwkJcmV0dXJuOworCX0KKwkKKwlzdHJjcHkoKGNoYXIgKikgcG9pbnRlcihEUyxTSSksIERvc0RyaXZlc1tkcml2ZV0uQ3VycmVudERpcmVjdG9yeSk7CisJUmVzZXRDZmxhZzsKKwlBWCA9IDB4MDEwMDsKK30KKwordm9pZCBHZXRDdXJyZW50UFNQKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKworfQorCit2b2lkIEdldERpc2tTZXJpYWxOdW1iZXIoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCWludCBkcml2ZTsKKwlzdHJ1Y3QgZGlza2luZm8gKnB0cjsKKwkKKwlpZiAoKEJYICYgMHhmZik9PSAwKQorCQlkcml2ZSA9IEN1cnJlbnREcml2ZTsKKwllbHNlCisJCWRyaXZlID0gKEJYICYgMHhmZiktMTsKKworCWlmICghVmFsaWREcml2ZShkcml2ZSkpIHsKKwkJQVggPSBJbnZhbGlkRHJpdmU7CisJCVNldENmbGFnOworCQlyZXR1cm47CisJfQorCisJeworCQlwdHIgPShzdHJ1Y3QgZGlza2luZm8gKikgcG9pbnRlcihEUyxTSSk7CisKKwkJcHRyLT5pbmZvbGV2ZWwgPSAwOworCQlwdHItPnNlcmlhbG51bWJlciA9IDB4RUJFQkVCMDAgfCBkcml2ZTsKKwkJc3RyY3B5KHB0ci0+bGFiZWwsIk5PIE5BTUUgICAgIik7CisJCXN0cmNweShwdHItPmZzdHlwZSwiRkFUMTYgICAiKTsKKwkKKwkJQVggPSBOb0Vycm9yOworCQlSZXNldENmbGFnOworCX0KK30KKwordm9pZCBTZXREaXNrU2VyaWFsTnVtYmVyKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKK3sKKwlBWCAmPSAweGZmMDA7CisJQVggfD0gMTsKKwlSZXNldENmbGFnOworfQorCit2b2lkIENvbW1pdEZpbGUoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQoreworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBkb19pbnQyMShzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKiBjb250ZXh0KXsKKwlpbnQgYWg7CisKKwlmcHJpbnRmKHN0ZGVyciwiaW50MjE6IGRvaW5nIEFYPSU0eCBCWD0lNHggQ1g9JTR4IERYPSU0eFxuIiwKKwkJQVggJiAweGZmZmYsQlggJiAweGZmZmYsQ1ggJiAweGZmZmYsRFggJiAweGZmZmYpOworCisJYWggPSAoQVggPj4gOCkgJiAweGZmOworCisJaWYgKGFoID09IDB4NTkpIHsKKwkJR2V0RXh0ZW5kZWRFcnJvckluZm8oY29udGV4dCk7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCisJRXJyb3IgKDAsMCwwKTsKKwkKKwlzd2l0Y2goYWgpIHsKKworCWNhc2UgMHgwMDogLyogVEVSTUlOQVRFIFBST0dSQU0gKi8KKwkJZXhpdCgwKTsKKworCWNhc2UgMHgwMTogLyogUkVBRCBDSEFSQUNURVIgRlJPTSBTVEFOREFSRCBJTlBVVCwgV0lUSCBFQ0hPICovCisJY2FzZSAweDAyOiAvKiBXUklURSBDSEFSQUNURVIgVE8gU1RBTkRBUkQgT1VUUFVUICovCisJY2FzZSAweDAzOiAvKiBSRUFEIENIQVJBQ1RFUiBGUk9NIFNUREFVWCAgKi8KKwljYXNlIDB4MDQ6IC8qIFdSSVRFIENIQVJBQ1RFUiBUTyBTVERBVVggKi8KKwljYXNlIDB4MDU6IC8qIFdSSVRFIENIQVJBQ1RFUiBUTyBQUklOVEVSICovCisJY2FzZSAweDA2OiAvKiBESVJFQ1QgQ09OU09MRSBJTi9PVVRQVVQgKi8KKwljYXNlIDB4MDc6IC8qIERJUkVDVCBDSEFSQUNURVIgSU5QVVQsIFdJVEhPVVQgRUNITyAqLworCWNhc2UgMHgwODogLyogQ0hBUkFDVEVSIElOUFVUIFdJVEhPVVQgRUNITyAqLworCWNhc2UgMHgwOTogLyogV1JJVEUgU1RSSU5HIFRPIFNUQU5EQVJEIE9VVFBVVCAqLworCWNhc2UgMHgwYTogLyogQlVGRkVSRUQgSU5QVVQgKi8KKwljYXNlIDB4MGI6IC8qIEdFVCBTVERJTiBTVEFUVVMgKi8KKwljYXNlIDB4MGM6IC8qIEZMVVNIIEJVRkZFUiBBTkQgUkVBRCBTVEFOREFSRCBJTlBVVCAqLworCWNhc2UgMHgwZDogLyogRElTSyBCVUZGRVIgRkxVU0ggKi8KKwkJYnJlYWs7CisKKwkvKiBubyBGQ0Igc3VwcG9ydCBmb3IgQ1AvTSBoYWNrZXJzICovCisJCisJY2FzZSAweDBmOiAvKiBPUEVOIEZJTEUgVVNJTkcgRkNCICovCisJY2FzZSAweDEwOiAvKiBDTE9TRSBGSUxFIFVTSU5HIEZDQiAqLworCWNhc2UgMHgxMTogLyogRklORCBGSVJTVCBNQVRDSElORyBGSUxFIFVTSU5HIEZDQiAqLworCWNhc2UgMHgxMjogLyogRklORCBORVhUIE1BVENISU5HIEZJTEUgVVNJTkcgRkNCICovCisJY2FzZSAweDEzOiAvKiBERUxFVEUgRklMRSBVU0lORyBGQ0IgKi8KKwljYXNlIDB4MTQ6IC8qIFNFUVVFTlRJQUwgUkVBRCBGUk9NIEZDQiBGSUxFICovCQkKKwljYXNlIDB4MTU6IC8qIFNFUVVFTlRJQUwgV1JJVEUgVE8gRkNCIEZJTEUKKwljYXNlIDB4MTY6IC8qIENSRUFURSBPUiBUUlVOQ0FURSBGSUxFIFVTSU5HIEZDQiAqLworCWNhc2UgMHgxNzogLyogUkVOQU1FIEZJTEUgVVNJTkcgRkNCICovCisJY2FzZSAweDFhOiAvKiBTRVQgRElTSyBUUkFOU0ZFUiBBUkVBIEFERFJFU1MgKi8KKwljYXNlIDB4MjE6IC8qIFJFQUQgUkFORE9NIFJFQ09SRCBGUk9NIEZDQiBGSUxFICovCisJY2FzZSAweDIyOiAvKiBXUklURSBSQU5ET00gUkVDT1JEIFRPIEZDQiBGSUxFICovCisJY2FzZSAweDIzOiAvKiBHRVQgRklMRSBTSVpFIEZPUiBGQ0IgKi8KKwljYXNlIDB4MjQ6IC8qIFNFVCBSQU5ET00gUkVDT1JEIE5VTUJFUiBGT1IgRkNCICovCisJY2FzZSAweDI3OiAvKiBSQU5ET00gQkxPQ0sgUkVBRCBGUk9NIEZDQiBGSUxFICovCisJY2FzZSAweDI4OiAvKiBSQU5ET00gQkxPQ0sgV1JJVEUgVE8gRkNCIEZJTEUgKi8KKwljYXNlIDB4Mjk6IC8qIFBBUlNFIEZJTEVOQU1FIElOVE8gRkNCICovCisJY2FzZSAweDJmOiAvKiBHRVQgRElTSyBUUkFOU0ZFUiBBUkVBIEFERFJFU1MgKi8KKworCWNhc2UgMHgyZTogLyogU0VUIFZFUklGWSBGTEFHICovCisJCWJyZWFrOworCisJY2FzZSAweDE4OiAvKiBOVUxMIEZVTkNUSU9OUyBGT1IgQ1AvTSBDT01QQVRJQklMSVRZICoKKwljYXNlIDB4MWQ6CisJY2FzZSAweDFlOgorCWNhc2UgMHgyMDoKKwljYXNlIDB4MmI6IC8qIFNFVCBTWVNURU0gREFURSAqLworCWNhc2UgMHgyZDogLyogU0VUIFNZU1RFTSBUSU1FICovCisJY2FzZSAweDM3OiAvKiAiU1dJVENIQVIiIC0gR0VUIFNXSVRDSCBDSEFSQUNURVIKKwkJICAgICAgIlNXSVRDSEFSIiAtIFNFVCBTV0lUQ0ggQ0hBUkFDVEVSCisJCSAgICAgICJBVkFJTERFViIgLSBTUEVDSUZZIFxERVZcIFBSRUZJWCBVU0UgKi8KKwljYXNlIDB4NTQ6IC8qIEdFVCBWRVJJRlkgRkxBRyAqLworCWNhc2UgMHg2MTogLyogVU5VU0VEICovCisJY2FzZSAweDZiOiAvKiBOVUxMIEZVTkNUSU9OICovCisJICAgICAgICBBWCAmPSAweGZmMDA7CisJCWJyZWFrOworCQorCWNhc2UgMHg2NzogLyogU0VUIEhBTkRMRSBDT1VOVCAqLwkJCQorCQlSZXNldENmbGFnOworCQlicmVhazsKKwkKKwljYXNlIDB4MGU6IC8qIFNFTEVDVCBERUZBVUxUIERSSVZFICovCisJCVNldERlZmF1bHREcml2ZShjb250ZXh0KTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTk6IC8qIEdFVCBDVVJSRU5UIERFRkFVTFQgRFJJVkUgKi8KKwkJR2V0RGVmYXVsdERyaXZlKGNvbnRleHQpOworCQlicmVhazsKKwkJCisJY2FzZSAweDFiOiAvKiBHRVQgQUxMT0NBVElPTiBJTkZPUk1BVElPTiBGT1IgREVGQVVMVCBEUklWRSAqLworCQlHZXREZWZEcml2ZUFsbG9jSW5mbyhjb250ZXh0KTsKKwkJYnJlYWs7CisJCisJY2FzZSAweDFjOiAvKiBHRVQgQUxMT0NBVElPTiBJTkZPUk1BVElPTiBGT1IgU1BFQ0lGSUMgRFJJVkUgKi8KKwkJR2V0RHJpdmVBbGxvY0luZm8oY29udGV4dCk7CisJCWJyZWFrOworCisJY2FzZSAweDFmOiAvKiBHRVQgRFJJVkUgUEFSQU1FVEVSIEJMT0NLIEZPUiBERUZBVUxUIERSSVZFICovCisJY2FzZSAweDMyOiAvKiBHRVQgRE9TIERSSVZFIFBBUkFNRVRFUiBCTE9DSyBGT1IgU1BFQ0lGSUMgRFJJVkUgKi8KKwkJR2V0RHJpdmVQQihjb250ZXh0KTsKKwkJYnJlYWs7CisJCQorCWNhc2UgMHgyNTogLyogU0VUIElOVEVSUlVQVCBWRUNUT1IgKi8KKwkJLyogSWdub3JlIGFueSBhdHRlbXB0IHRvIHNldCBhIHNlZ21lbnQgdmVjdG9yICovCisJCXJldHVybiAxOworCisJY2FzZSAweDI2OiAvKiBDUkVBVEUgTkVXIFBST0dSQU0gU0VHTUVOVCBQUkVGSVggKi8KKwkJYnJlYWs7CisKKwljYXNlIDB4MmE6IC8qIEdFVCBTWVNURU0gREFURSAqLworCQlHZXRTeXN0ZW1EYXRlKGNvbnRleHQpOworCQlicmVhazsKKworCWNhc2UgMHgyYzogLyogR0VUIFNZU1RFTSBUSU1FICovCisJCUdldFN5c3RlbVRpbWUoY29udGV4dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwljYXNlIDB4MzA6IC8qIEdFVCBET1MgVkVSU0lPTiAqLworCSAgICAgICAgQVggPSBEb3NWZXJzaW9uOyAvKiBIZXkgZm9sa3MsIHRoaXMgaXMgRE9TIFYzLjMhICovCisJCUJYID0gMHgwMDEyOyAgICAgLyogMHgxMjM0NTYgaXMgV2luZSdzIHNlcmlhbCAjICovCisJCUNYID0gMHgzNDU2OworCQlicmVhazsKKworCWNhc2UgMHgzMTogLyogVEVSTUlOQVRFIEFORCBTVEFZIFJFU0lERU5UICovCisJCWJyZWFrOworCisJY2FzZSAweDMzOiAvKiBNVUxUSVBMRVhFRCAqLworCQlzd2l0Y2ggKEFYICYgMHhmZikgeworCQkJY2FzZSAweDAwOiAvKiBHRVQgQ1VSUkVOVCBFWFRFTkRFRCBCUkVBSyBTVEFURSAqLworCQkJCWlmICghKEFYICYgMHhmZikpIAorCQkJCQlEWCAmPSAweGZmMDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHgwMTogLyogU0VUIEVYVEVOREVEIEJSRUFLIFNUQVRFICovCisJCQkJYnJlYWs7CQkKKwkJCisJCQljYXNlIDB4MDI6IC8qIEdFVCBBTkQgU0VUIEVYVEVOREVEIENPTlRST0wtQlJFQUsgQ0hFQ0tJTkcgU1RBVEUgKi8KKwkJCQlEWCAmPSAweGZmMDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHgwNTogLyogR0VUIEJPT1QgRFJJVkUgKi8KKwkJCQlEWCAmPSAweGZmMDA7CisJCQkJRFggfD0gMjsgLyogYzogaXMgV2luZSdzIGJvb3Rkcml2ZSAqLworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSAweDA2OiAvKiBHRVQgVFJVRSBWRVJTSU9OIE5VTUJFUiAqLworCQkJCUJYID0gRG9zVmVyc2lvbjsKKwkJCQlEWCA9IDB4MDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOwkJCQorCQl9CisJCWJyZWFrOwkKKworCWNhc2UgMHgzNDogLyogR0VUIEFERFJFU1MgT0YgSU5ET1MgRkxBRyAqLworCQlHZXRJbkRvc0ZsYWcoY29udGV4dCk7CisJCWJyZWFrOworCisJY2FzZSAweDM1OiAvKiBHRVQgSU5URVJSVVBUIFZFQ1RPUiAqLworIAkJICAgLyogUmV0dXJuIGEgTlVMTCBzZWdtZW50IHNlbGVjdG9yIC0gdGhpcyB3aWxsIGJvbWIsIAorIAkJICAgICAgICAgICAgICBpZiBhbnlvbmUgZXZlciB0cmllcyB0byB1c2UgaXQgKi8KKwkJRVMgPSAwOworCQlCWCA9IDA7CisJCWJyZWFrOworCisJY2FzZSAweDM2OiAvKiBHRVQgRlJFRSBESVNLIFNQQUNFICovCisJCUdldEZyZWVEaXNrU3BhY2UoY29udGV4dCk7CisJCWJyZWFrOworCisJY2FzZSAweDM4OiAvKiBHRVQgQ09VTlRSWS1TUEVDSUZJQyBJTkZPUk1BVElPTiAqLworCQlBWCAmPSAweGZmMDA7CisJCUFYIHw9IDB4MDI7IC8qIG5vIGNvdW50cnkgc3VwcG9ydCBhdmFpbGFibGUgKi8KKwkJU2V0Q2ZsYWc7CisJCWJyZWFrOworCQkKKwljYXNlIDB4Mzk6IC8qICJNS0RJUiIgLSBDUkVBVEUgU1VCRElSRUNUT1JZICovCisJCU1ha2VEaXIoY29udGV4dCk7CisJCWJyZWFrOworCQorCWNhc2UgMHgzYTogLyogIlJNRElSIiAtIFJFTU9WRSBTVUJESVJFQ1RPUlkgKi8KKwkJUmVtb3ZlRGlyKGNvbnRleHQpOworCQlicmVhazsKKwkKKwljYXNlIDB4M2I6IC8qICJDSERJUiIgLSBTRVQgQ1VSUkVOVCBESVJFQ1RPUlkgKi8KKwkJQ2hhbmdlRGlyKGNvbnRleHQpOworCQlicmVhazsKKwkKKwljYXNlIDB4M2M6IC8qICJDUkVBVCIgLSBDUkVBVEUgT1IgVFJVTkNBVEUgRklMRSAqLworCQlDcmVhdGVGaWxlKGNvbnRleHQpOworCQlicmVhazsKKworCWNhc2UgMHgzZDogLyogIk9QRU4iIC0gT1BFTiBFWElTVElORyBGSUxFICovCisJCU9wZW5FeGlzdGluZ0ZpbGUoY29udGV4dCk7CisJCWJyZWFrOworCQorCWNhc2UgMHgzZTogLyogIkNMT1NFIiAtIENMT1NFIEZJTEUgKi8KKwljYXNlIDB4Njg6IC8qICJGRkxVU0giIC0gQ09NTUlUIEZJTEUgKi8KKwljYXNlIDB4NmE6IC8qIENPTU1JVCBGSUxFICovCisKKwkJQ2xvc2VGaWxlKGNvbnRleHQpOworCQlicmVhazsKKwkKKwljYXNlIDB4M2Y6IC8qICJSRUFEIiAtIFJFQUQgRlJPTSBGSUxFIE9SIERFVklDRSAqLworCQlSZWFkRmlsZShjb250ZXh0KTsKKwkJYnJlYWs7CisJCisJY2FzZSAweDQwOiAvKiAiV1JJVEUiIC0gV1JJVEUgVE8gRklMRSBPUiBERVZJQ0UgKi8KKwkJV3JpdGVGaWxlKGNvbnRleHQpOworCQlicmVhazsKKwkKKwljYXNlIDB4NDE6IC8qICJVTkxJTksiIC0gREVMRVRFIEZJTEUgKi8KKwkJVW5saW5rRmlsZShjb250ZXh0KTsKKwkJYnJlYWs7CisJCisJY2FzZSAweDQyOiAvKiAiTFNFRUsiIC0gU0VUIENVUlJFTlQgRklMRSBQT1NJVElPTiAqLworCQlTZWVrRmlsZShjb250ZXh0KTsKKwkJYnJlYWs7CisJCQkKKwljYXNlIDB4NDM6IC8qIEZJTEUgQVRUUklCVVRFUyAqLworCQlzd2l0Y2ggKEFYICYgMHhmZikgeworCQkJY2FzZSAweDAwOgorCQkJCUdldEZpbGVBdHRyaWJ1dGVzKGNvbnRleHQpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAxOgorCQkJCVNldEZpbGVBdHRyaWJ1dGVzKGNvbnRleHQpOworCQkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIDB4NDQ6IC8qIElPQ1RMICovCisJCURvc0lPQ1RMKGNvbnRleHQpOworCQlicmVhazsKKworCWNhc2UgMHg0NTogLyogIkRVUCIgLSBEVVBMSUNBVEUgRklMRSBIQU5ETEUgKi8KKwljYXNlIDB4NDY6IC8qICJEVVAyIiwgIkZPUkNFRFVQIiAtIEZPUkNFIERVUExJQ0FURSBGSUxFIEhBTkRMRSAqLworCQlEdXBlRmlsZUhhbmRsZShjb250ZXh0KTsKKwkJYnJlYWs7CisJCisJY2FzZSAweDQ3OiAvKiAiQ1dEIiAtIEdFVCBDVVJSRU5UIERJUkVDVE9SWSAqLwkKKwkJR2V0Q3VycmVudERpcmVjdG9yeShjb250ZXh0KTsKKwkJQVggPSAweDAxMDA7IC8qIG1hbnkgTWljcm9zb2Z0IHByb2R1Y3RzIGZvciBXaW5kb3dzIHJlbHkKKwkJCQlvbiB0aGlzICovCisJCWJyZWFrOworCQorCWNhc2UgMHg0ODogLyogQUxMT0NBVEUgTUVNT1JZICovCisJCUFsbG9jYXRlTWVtb3J5KGNvbnRleHQpOworCQlicmVhazsKKwkKKwljYXNlIDB4NDk6IC8qIEZSRUUgTUVNT1JZICovCisJCUZyZWVNZW1vcnkoY29udGV4dCk7CisJCWJyZWFrOworCQorCWNhc2UgMHg0YTogLyogUkVTSVpFIE1FTU9SWSBCTE9DSyAqLworCQlSZXNpemVNZW1vcnlCbG9jayhjb250ZXh0KTsKKwkJYnJlYWs7CisJCisJY2FzZSAweDRiOiAvKiAiRVhFQyIgLSBMT0FEIEFORC9PUiBFWEVDVVRFIFBST0dSQU0gKi8KKwkJRXhlY1Byb2dyYW0oY29udGV4dCk7CisJCWJyZWFrOwkJCisJCisJY2FzZSAweDRjOiAvKiAiRVhJVCIgLSBURVJNSU5BVEUgV0lUSCBSRVRVUk4gQ09ERSAqLworCQlleGl0KEFYICYgMHhmZik7CisKKwljYXNlIDB4NGQ6IC8qIEdFVCBSRVRVUk4gQ09ERSAqLworCQlHZXRSZXR1cm5Db2RlKGNvbnRleHQpOworCQlicmVhazsKKworCWNhc2UgMHg0ZTogLyogIkZJTkRGSVJTVCIgLSBGSU5EIEZJUlNUIE1BVENISU5HIEZJTEUgKi8KKwkJRmluZEZpcnN0KGNvbnRleHQpOworCQlicmVhazsKKworCWNhc2UgMHg0ZjogLyogIkZJTkRORVhUIiAtIEZJTkQgTkVYVCBNQVRDSElORyBGSUxFICovCisJCUZpbmROZXh0KGNvbnRleHQpOworCQlicmVhazsKKwkJCQorCWNhc2UgMHg1MjogLyogIlNZU1ZBUlMiIC0gR0VUIExJU1QgT0YgTElTVFMgKi8KKwkJR2V0U3lzVmFycyhjb250ZXh0KTsKKwkJYnJlYWs7CisJCQorCWNhc2UgMHg1NjogLyogIlJFTkFNRSIgLSBSRU5BTUUgRklMRSAqLworCQlSZW5hbWVGaWxlKGNvbnRleHQpOworCQlicmVhazsKKwkKKwljYXNlIDB4NTc6IC8qIEZJTEUgREFURSBBTkQgVElNRSAqLworCQlzd2l0Y2ggKEFYICYgMHhmZikgeworCQkJY2FzZSAweDAwOgorCQkJCUdldEZpbGVEYXRlVGltZShjb250ZXh0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMToKKwkJCQlTZXRGaWxlRGF0ZVRpbWUoY29udGV4dCk7CisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4NTg6IC8qIEdFVCBPUiBTRVQgTUVNT1JZL1VNQiBBTExPQ0FUSU9OIFNUUkFURUdZICovCisJCXN3aXRjaCAoQVggJiAweGZmKSB7CisJCQljYXNlIDB4MDA6CisJCQkJQVggPSAweDAxOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyOgorCQkJCUFYICY9IDB4ZmYwMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMToKKwkJCWNhc2UgMHgwMzoKKwkJCQlicmVhazsKKwkJfQorCQlSZXNldENmbGFnOworCQlicmVhazsKKwkKKwljYXNlIDB4NTk6IC8qIEdFVCBFWFRFTkRFRCBFUlJPUiBJTkZPICovCisJCUdldEV4dGVuZGVkRXJyb3JJbmZvKGNvbnRleHQpOworCQlicmVhazsKKwkJCisJY2FzZSAweDVhOiAvKiBDUkVBVEUgVEVNUE9SQVJZIEZJTEUgKi8KKwkJQ3JlYXRlVGVtcEZpbGUoY29udGV4dCk7CisJCWJyZWFrOworCQorCWNhc2UgMHg1YjogLyogQ1JFQVRFIE5FVyBGSUxFICovCisJCUNyZWF0ZU5ld0ZpbGUoY29udGV4dCk7CisJCWJyZWFrOworCQorCWNhc2UgMHg1YzogLyogIkZMT0NLIiAtIFJFQ09SRCBMT0NLSU5HICovCisJCUZpbGVMb2NrKGNvbnRleHQpOworCQlicmVhazsJCisKKwljYXNlIDB4NWQ6IC8qIE5FVFdPUksgKi8KKwljYXNlIDB4NWU6CisJY2FzZSAweDVmOgorCQlBWCAmPSAweGZmMDA7CisJCUFYIHw9IE5vTmV0d29yazsgLyogbmV0d29yayBzb2Z0d2FyZSBub3QgaW5zdGFsbGVkICovCisJCVNldENmbGFnOworCQlicmVhazsKKworCWNhc2UgMHg2MDogLyogIlRSVUVOQU1FIiAtIENBTk9OSUNBTElaRSBGSUxFTkFNRSBPUiBQQVRIICovCisJCUdldFRydWVGaWxlTmFtZShjb250ZXh0KTsKKwkJYnJlYWs7CisKKwljYXNlIDB4NjI6IC8qIEdFVCBDVVJSRU5UIFBTUCBBRERSRVNTICovCisJCUdldEN1cnJlbnRQU1AoY29udGV4dCk7CisJCWJyZWFrOworCQorCWNhc2UgMHg2NTogLyogR0VUIEVYVEVOREVEIENPVU5UUlkgSU5GT1JNQVRJT04gKi8KKwkJR2V0RXh0ZW5kZWRDb3VudHJ5SW5mbyhjb250ZXh0KTsKKwkJYnJlYWs7CisJCisJY2FzZSAweDY2OiAvKiBHTE9CQUwgQ09ERSBQQUdFIFRBQkxFICovCisJCXN3aXRjaCAoQVggJiAweGZmKSB7CisJCQljYXNlIDB4MDE6CisJCQkJQlggPSBDb2RlUGFnZTsKKwkJCQlEWCA9IEJYOworCQkJCVJlc2V0Q2ZsYWc7CisJCQkJYnJlYWs7CQkJCisJCQljYXNlIDB4MDI6IAorCQkJCUNvZGVQYWdlID0gQlg7CisJCQkJUmVzZXRDZmxhZzsKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkKKwljYXNlIDB4Njk6IC8qIERJU0sgU0VSSUFMIE5VTUJFUiAqLworCQlzd2l0Y2ggKEFYICYgMHhmZikgeworCQkJY2FzZSAweDAwOgorCQkJCUdldERpc2tTZXJpYWxOdW1iZXIoY29udGV4dCk7CisJCQkJYnJlYWs7CQkJCisJCQljYXNlIDB4MDE6IAorCQkJCVNldERpc2tTZXJpYWxOdW1iZXIoY29udGV4dCk7CisJCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGhhbmRsZSBpbnQgMHgyMSAleFxuIiwgY29udGV4dC0+c2NfZWF4KTsKKwkJcmV0dXJuIDE7CisJfTsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9sb2FkZXIvbGR0bGliLmMgYi9sb2FkZXIvbGR0bGliLmMKaW5kZXggNjViZjkyYy4uMzk0NTUzNyAxMDA2NDQKLS0tIGEvbG9hZGVyL2xkdGxpYi5jCisrKyBiL2xvYWRlci9sZHRsaWIuYwpAQCAtMjAsNyArMjAsNiBAQAogc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvciAqCiBtYWtlX3NkKHVuc2lnbmVkIGJhc2UsIHVuc2lnbmVkIGxpbWl0LCBpbnQgY29udGVudHMsIGludCByZWFkX2V4ZWNfb25seSwgaW50IHNlZzMyLCBpbnQgaW5wZ3MpCiB7Ci0jaWYgMQogICAgICAgICBzdGF0aWMgbG9uZyBkWzJdOwogCiAgICAgICAgIGRbMF0gPSAoKGJhc2UgJiAweDAwMDBmZmZmKSA8PCAxNikgfApAQCAtMzQsMjQgKzMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucGdzIDw8IDIzKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMDAwOwogICAgICAgICAKLSAgICAgICAgcHJpbnRmKCIleCAleFxuIiwgZFsxXSwgZFswXSk7Ci0gICAgICAgIAogICAgICAgICByZXR1cm4gKChzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yICopZCk7Ci0jZWxzZSAgICAgICAgCi0gICAgICAgIHN0YXRpYyBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yIGQ7Ci0KLSAgICAgICAgZC5zZF9sb2xpbWl0ID0gbGltaXQgJiAweDAwMDBmZmZmOwotICAgICAgICBkLnNkX2xvYmFzZSAgPSBiYXNlICYgMHgwMGZmZmZmZjsKLSAgICAgICAgZC5zZF90eXBlICAgID0gY29udGVudHMgJiAweDAxZjsKLSAgICAgICAgZC5zZF9kcGwgICAgID0gU0VMX1VQTCAmIDB4MzsKLSAgICAgICAgZC5zZF9wICAgICAgID0gMTsKLSAgICAgICAgZC5zZF9oaWxpbWl0ID0gKGxpbWl0ICYgMHgwMGZmMDAwMCkgPj4gMTY7Ci0gICAgICAgIGQuc2RfeHggICAgICA9IDA7Ci0gICAgICAgIGQuc2RfZGVmMzIgICA9IHNlZzMyPzE6MDsKLSAgICAgICAgZC5zZF9ncmFuICAgID0gaW5wZ3M/MTowOwotICAgICAgICBkLnNkX2hpYmFzZSAgPSAoYmFzZSAmIDB4ZmYwMDAwMDApID4+IDI0OwotICAgICAgICByZXR1cm4gKChzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yICopJmQpOwotI2VuZGlmCiB9CiAjZW5kaWYKICAgICAgICAgCkBAIC04OCw3ICs3MCw3IEBACiAgICAgc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvciAqc2Q7CiAgICAgaW50IHJldDsKICAgICAKLSNpZmRlZiBERUJVRworI2lmZGVmIERFQlVHX0xEVAogICAgIHByaW50Zigic2V0X2xkdF9lbnRyeTogZW50cnk9JXggYmFzZT0leCBsaW1pdD0leCVzICVzLWJpdCBjb250ZW50cz0lZCAlc1xuIiwKICAgICAgICAgICAgZW50cnksIGJhc2UsIGxpbWl0LCBsaW1pdF9pbl9wYWdlc19mbGFnPyItcGFnZXMiOiIiLAogICAgICAgICAgICBzZWdfMzJiaXRfZmxhZz8iMzIiOiIxNiIsCmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGZjYzFhZjMuLmVlYWZjOWUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0yMTEsNiArMjExLDcgQEAKICAgICBpZiAocmVhZChSZXNvdXJjZUZkLCAmc2l6ZV9zaGlmdCwgc2l6ZW9mKHNpemVfc2hpZnQpKSAhPSAKIAlzaXplb2Yoc2l6ZV9zaGlmdCkpCiAgICAgeworICAgIAlwcmludGYoIkZpbmRSZXNvdXJjZUJ5TmFtZSAoJXMpIGJhZCBibG9jayBzaXplICFcbiIsIHJlc291cmNlX25hbWUpOwogCXJldHVybiAtMTsKICAgICB9CiAgICAgCkBAIC0yMjMsNiArMjI0LDcgQEAKIAlpZiAocmVhZChSZXNvdXJjZUZkLCAmdHlwZWluZm8sIHNpemVvZih0eXBlaW5mbykpICE9CiAJICAgIHNpemVvZih0eXBlaW5mbykpCiAJeworCSAgICBwcmludGYoIkZpbmRSZXNvdXJjZUJ5TmFtZSAoJXMpIGJhZCB0eXBlaW5mbyBzaXplICFcbiIsIHJlc291cmNlX25hbWUpOwogCSAgICByZXR1cm4gLTE7CiAJfQogCWlmICh0eXBlaW5mby50eXBlX2lkID09IHR5cGVfaWQgfHwgdHlwZV9pZCA9PSAtMSkKQEAgLTIzMiw2ICsyMzQsNyBAQAogCQlpZiAocmVhZChSZXNvdXJjZUZkLCAmbmFtZWluZm8sIHNpemVvZihuYW1laW5mbykpICE9IAogCQkgICAgc2l6ZW9mKG5hbWVpbmZvKSkKIAkJeworCQkgICAgcHJpbnRmKCJGaW5kUmVzb3VyY2VCeU5hbWUgKCVzKSBiYWQgbmFtZWluZm8gc2l6ZSAhXG4iLCByZXNvdXJjZV9uYW1lKTsKIAkJICAgIHJldHVybiAtMTsKIAkJfQogCkBAIC0yNDUsNyArMjQ4LDYgQEAKIAkJcmVhZChSZXNvdXJjZUZkLCBuYW1lLCBuYnl0ZXMpOwogCQlsc2VlayhSZXNvdXJjZUZkLCBvbGRfcG9zLCBTRUVLX1NFVCk7CiAJCW5hbWVbbmJ5dGVzXSA9ICdcMCc7Ci0KIAkJaWYgKHN0cmNhc2VjbXAobmFtZSwgcmVzb3VyY2VfbmFtZSkgPT0gMCkKIAkJewogCQkgICAgbWVtY3B5KHJlc3VsdF9wLCAmbmFtZWluZm8sIHNpemVvZihuYW1laW5mbykpOwpAQCAtMjU0LDYgKzI1Niw3IEBACiAJICAgIH0KIAl9CiAgICAgfQorICAgIHByaW50ZigiRmluZFJlc291cmNlQnlOYW1lICglcykgdHlwZWluZm8udHlwZV9pZCA9IDAgIVxuIiwgcmVzb3VyY2VfbmFtZSk7CiAgICAgCiAgICAgcmV0dXJuIC0xOwogfQpAQCAtMzczLDcgKzM3Niw2IEBACiAgICAgaW1hZ2Vfc2l6ZSA9IG5hbWVpbmZvLmxlbmd0aCA8PCBzaXplX3NoaWZ0OwogICAgIGlmIChpbWFnZV9zaXplX3JldCAhPSBOVUxMKQogCSppbWFnZV9zaXplX3JldCA9IGltYWdlX3NpemU7Ci0gICAgCiAgICAgaG1lbSA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIGltYWdlX3NpemUpOwogICAgIGltYWdlID0gR2xvYmFsTG9jayhobWVtKTsKICAgICBpZiAoaW1hZ2UgPT0gTlVMTCB8fCByZWFkKFJlc291cmNlRmQsIGltYWdlLCBpbWFnZV9zaXplKSAhPSBpbWFnZV9zaXplKQpAQCAtNDQzLDYgKzQ0NSw3IEBACiB7CiAgICAgSEJJVE1BUCBoYml0bWFwOwogICAgIEhBTkRMRSByc2NfbWVtOworICAgIEdESU9CSkhEUiAqIHB0cjsKICAgICBIREMgaGRjOwogICAgIGxvbmcgKmxwOwogICAgIGludCBpbWFnZV9zaXplOwpAQCAtNDYyLDcgKzQ2NSw2IEBACiAJR2xvYmFsRnJlZShyc2NfbWVtKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0KICAgICBpZiAoKmxwID09IHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSkKIAloYml0bWFwID0gQ29udmVydENvcmVCaXRtYXAoIGhkYywgKEJJVE1BUENPUkVIRUFERVIgKikgbHAgKTsKICAgICBlbHNlIGlmICgqbHAgPT0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IGEyNDAxMDQuLmNjODVmYzcgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNlbmRpZgorI2luY2x1ZGUgPHdpbmUuaD4KICAKIGNoYXIgKiBjc3RhY2tbNDA5Nl07CiBzdHJ1Y3Qgc2lnYWN0aW9uIHNlZ3ZfYWN0OwpAQCAtMTcsNiArMTgsNyBAQAogI2lmZGVmIGxpbnV4CiBleHRlcm4gdm9pZCBfX19zaWdfcmVzdG9yZSgpOwogZXh0ZXJuIHZvaWQgX19fbWFza3NpZ19yZXN0b3JlKCk7CisjZW5kaWYKIAogLyogU2ltaWxhciB0byB0aGUgc2lnYWN0aW9uIGZ1bmN0aW9uIGluIGxpYmMsIGV4Y2VwdCBpdCBsZWF2ZXMgYWxvbmUgdGhlCiAgICByZXN0b3JlciBmaWVsZCAqLwpAQCAtMzIsMTIzICszNCw2IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IHNjX2dzLCBfX2dzaDsKLQl1bnNpZ25lZCBzaG9ydCBzY19mcywgX19mc2g7Ci0JdW5zaWduZWQgc2hvcnQgc2NfZXMsIF9fZXNoOwotCXVuc2lnbmVkIHNob3J0IHNjX2RzLCBfX2RzaDsKLQl1bnNpZ25lZCBsb25nIHNjX2VkaTsKLQl1bnNpZ25lZCBsb25nIHNjX2VzaTsKLQl1bnNpZ25lZCBsb25nIHNjX2VicDsKLQl1bnNpZ25lZCBsb25nIHNjX2VzcDsKLQl1bnNpZ25lZCBsb25nIHNjX2VieDsKLQl1bnNpZ25lZCBsb25nIHNjX2VkeDsKLQl1bnNpZ25lZCBsb25nIHNjX2VjeDsKLQl1bnNpZ25lZCBsb25nIHNjX2VheDsKLQl1bnNpZ25lZCBsb25nIHNjX3RyYXBubzsKLQl1bnNpZ25lZCBsb25nIHNjX2VycjsKLQl1bnNpZ25lZCBsb25nIHNjX2VpcDsKLQl1bnNpZ25lZCBzaG9ydCBzY19jcywgX19jc2g7Ci0JdW5zaWduZWQgbG9uZyBzY19lZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBlc3BfYXRfc2lnbmFsOwotCXVuc2lnbmVkIHNob3J0IHNjX3NzLCBfX3NzaDsKLQl1bnNpZ25lZCBsb25nIGkzODc7Ci0JdW5zaWduZWQgbG9uZyBvbGRtYXNrOwotCXVuc2lnbmVkIGxvbmcgY3IyOwotfTsKLSNlbmRpZgotCi0jaWZkZWYgX19OZXRCU0RfXwotI2RlZmluZSBzaWdjb250ZXh0X3N0cnVjdCBzaWdjb250ZXh0Ci0jZGVmaW5lIEhaIDEwMAotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1HZXRUaW1lRGF0ZShpbnQgdGltZV9mbGFnLCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKiBjb250ZXh0KQotewotICAgIHN0cnVjdCB0bSAqbm93OwotICAgIHRpbWVfdCBsdGltZTsKLSAgICAKLSAgICBsdGltZSA9IHRpbWUoTlVMTCk7Ci0gICAgbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7Ci0gICAgaWYgKHRpbWVfZmxhZykKLSAgICB7Ci0JIGNvbnRleHQtPnNjX2VjeCA9IChub3ctPnRtX2hvdXIgPDwgOCkgfCBub3ctPnRtX21pbjsKLQkgY29udGV4dC0+c2NfZWR4ID0gbm93LT50bV9zZWMgPDwgODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQljb250ZXh0LT5zY19lY3ggPSBub3ctPnRtX3llYXIgKyAxOTAwOwotCWNvbnRleHQtPnNjX2VkeCA9ICgobm93LT50bV9tb24gKyAxKSA8PCA4KSB8IG5vdy0+dG1fbWRheTsKLQljb250ZXh0LT5zY19lYXggJj0gMHhmZjAwOwotCWNvbnRleHQtPnNjX2VheCB8PSBub3ctPnRtX3dkYXk7Ci0gICAgfQotfQotCi0vKiBXZSBoYW5kbGUgYWxsIGludDIxIGNhbGxzIGhlcmUuICBUaGVyZSBpcyBzb21lIGR1cGxpY2F0ZSBjb2RlIGZyb20KLSAgIG1pc2MvZG9zLmMgdGhhdCBJIGFtIHVuc3VyZSBob3cgdG8gZGVhbCB3aXRoLCBzaW5jZSB0aGUgbG9jYXRpb25zCi0gICB0aGF0IHdlIHN0b3JlIHRoZSByZWdpc3RlcnMgYXJlIGFsbCBkaWZmZXJlbnQgKi8KLQotc3RhdGljIGludAotZG9faW50MjEoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICogY29udGV4dCl7Ci0JZnByaW50ZihzdGRlcnIsIkRvaW5nIGludDIxICV4ICAgIiwgKGNvbnRleHQtPnNjX2VheCA+PiA4KSAmIDB4ZmYpOwotCXN3aXRjaCgoY29udGV4dC0+c2NfZWF4ID4+IDgpICYgMHhmZil7Ci0JY2FzZSAweDMwOgotCQljb250ZXh0LT5zY19lYXggPSAweDAzMDM7ICAvKiBIZXkgZm9sa3MsIHRoaXMgaXMgRE9TIFYzLjMhICovCi0JCWNvbnRleHQtPnNjX2VieCA9IDA7Ci0JCWNvbnRleHQtPnNjX2VjeCA9IDA7Ci0JCWJyZWFrOwotCQotCQkvKiBJZ25vcmUgYW55IGF0dGVtcHQgdG8gc2V0IGEgc2VnbWVudCB2ZWN0b3IgKi8KLQljYXNlIDB4MjU6Ci0JCXJldHVybiAxOwotCi0JY2FzZSAweDM1OiAgLyogUmV0dXJuIGEgTlVMTCBzZWdtZW50IHNlbGVjdG9yIC0gdGhpcyB3aWxsIGJvbWIKLQkJICAgICAgIGlmIGFueW9uZSBldmVyIHRyaWVzIHRvIHVzZSBpdCAqLwotCQljb250ZXh0LT5zY19lcyA9IDA7Ci0JCWNvbnRleHQtPnNjX2VieCA9IDA7Ci0JCWJyZWFrOwotCQkKLQljYXNlIDB4MmE6Ci0JCUdldFRpbWVEYXRlKDAsIGNvbnRleHQpOwotCS8qIEZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiAqLwotCQkKLQljYXNlIDB4MmM6Ci0JCUdldFRpbWVEYXRlKDEsIGNvbnRleHQpOwotCQkvKiBGdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gKi8KLQotCWNhc2UgMHg0YzoKLQkJZXhpdChjb250ZXh0LT5zY19lYXggJiAweGZmKTsKLQkJCi0KLQlkZWZhdWx0OgotCQlmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGhhbmRsZSBpbnQgMHgyMSAleFxuIiwgY29udGV4dC0+c2NfZWF4KTsKLQkJcmV0dXJuIDE7Ci0JfTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZG9faW50MUEoc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICogY29udGV4dCl7Ci0JdGltZV90IGx0aW1lOwotCWludCB0aWNrczsKLQotCXN3aXRjaCgoY29udGV4dC0+c2NfZWF4ID4+IDgpICYgMHhmZil7Ci0JY2FzZSAwOgotCQlsdGltZSA9IHRpbWUoTlVMTCk7Ci0JCXRpY2tzID0gKGludCkgKGx0aW1lICogSFopOwotCQljb250ZXh0LT5zY19lY3ggPSB0aWNrcyA+PiAxNjsKLQkJY29udGV4dC0+c2NfZWR4ID0gdGlja3MgJiAweDAwMDBGRkZGOwotCQljb250ZXh0LT5zY19lYXggPSAwOyAgLyogTm8gbWlkbmlnaHQgcm9sbG92ZXIgKi8KLQkJYnJlYWs7Ci0JCi0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBoYW5kbGUgaW50IDB4MUEgJXhcbiIsIGNvbnRleHQtPnNjX2VheCk7Ci0JCXJldHVybiAxOwotCX07Ci0JcmV0dXJuIDE7Ci19Ci0KICNpZmRlZiBsaW51eAogc3RhdGljIHZvaWQgd2luX2ZhdWx0KGludCBzaWduYWwsIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0KXsKICAgICAgICAgc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpzY3AgPSAmY29udGV4dDsKQEAgLTE5OCw2ICs4MywxMiBAQAogCWNhc2UgMHgyMToKIAkJaWYoIWRvX2ludDIxKHNjcCkpIGdvdG8gb29wczsKIAkJYnJlYWs7CisgICAgICAgIGNhc2UgMHgxMTogIAorICAJCXNjcC0+c2NfZWF4ID0gMHgwMDAwMDAwMDsgIC8qIGdldCBlcXVpcG1lbnQgbGlzdDogd2UgaGF2ZW4ndCAqLworICAgICAgICAgCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdvdCBhbnl0aGluZyAqLworICAgICAgICBjYXNlIDB4MTI6ICAgICAgICAgICAgICAgCisgICAgICAgICAgCXNjcC0+c2NfZWF4ID0gNjQwTDsgLyogZ2V0IGJhc2UgbWVtIHNpemUgKi8gICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CiAJY2FzZSAweDFBOgogCQlpZighZG9faW50MUEoc2NwKSkgZ290byBvb3BzOwogCQlicmVhazsKQEAgLTIxMCw3ICsxMDEsNiBAQAogCiAJc2NwLT5zY19laXAgKz0gMjsgIC8qIEJ5cGFzcyB0aGUgaW50IGluc3RydWN0aW9uICovCiAJcmV0dXJuOwotCiAgb29wczoKIAlmcHJpbnRmKHN0ZGVyciwiSW4gd2luX2ZhdWx0ICV4OiV4XG4iLCBzY3AtPnNjX2NzLCBzY3AtPnNjX2VpcCk7CiAjaWZkZWYgbGludXgKQEAgLTIzNiwxNCArMTI2LDE0IEBACiAJLyogUG9pbnQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG1pbnVzIDQganVzdCBpbiBjYXNlLCBhbmQgbWFrZQogCSAgIGl0IGFsaWduZWQgICovCiAJc2Vndl9hY3Quc2FfcmVzdG9yZXIgPSAKLQkJKHZvaWQgKCopKCkpICgoKHVuc2lnbmVkIGludCkoY3N0YWNrICsgc2l6ZW9mKGNzdGFjaykgLSA0KSkgJiB+Myk7CisJCSh2b2lkICgqKSgpKSAoKCh1bnNpZ25lZCBpbnQpKGNzdGFjaykgKyBzaXplb2YoY3N0YWNrKSAtIDQpICYgfjMpOwogCXdpbmVfc2lnYWN0aW9uKFNJR1NFR1YsICZzZWd2X2FjdCwgTlVMTCk7CiAjZW5kaWYKICNpZmRlZiBfX05ldEJTRF9fCiAgICAgICAgIHN0cnVjdCBzaWdzdGFjayBzczsKICAgICAgICAgc2lnc2V0X3Qgc2lnX21hc2s7CiAgICAgICAgIAotICAgICAgICBzcy5zc19zcCA9IChjaGFyICopICgoKHVuc2lnbmVkIGludCkoY3N0YWNrICsgc2l6ZW9mKGNzdGFjaykgLSA0KSkgJiB+Myk7CisgICAgICAgIHNzLnNzX3NwID0gKGNoYXIgKikgKCgodW5zaWduZWQgaW50KShjc3RhY2spICsgc2l6ZW9mKGNzdGFjaykgLSA0KSAmIH4zKTsKICAgICAgICAgc3Muc3Nfb25zdGFjayA9IDA7CiAgICAgICAgIGlmIChzaWdzdGFjaygmc3MsIE5VTEwpIDwgMCkgewogICAgICAgICAgICAgICAgIHBlcnJvcigic2lnc3RhY2siKTsKZGlmZiAtLWdpdCBhL2xvYWRlci93aW5lLmMgYi9sb2FkZXIvd2luZS5jCmluZGV4IDFjZDc3YTAuLjgyOTI4Y2EgMTAwNjQ0Ci0tLSBhL2xvYWRlci93aW5lLmMKKysrIGIvbG9hZGVyL3dpbmUuYwpAQCAtMzksNiArMzksMTAgQEAKIHN0cnVjdCBuZV9oZWFkZXJfcyAqQ3VycmVudE5FSGVhZGVyOwogaW50IEN1cnJlbnRORUZpbGU7CiAKK3N0YXRpYyBjaGFyICpkbGxFeHRlbnNpb25zW10gPSB7ICJkbGwiLCAiZXhlIiwgTlVMTCB9Oworc3RhdGljIGNoYXIgKmV4ZUV4dGVuc2lvbnNbXSA9IHsgImV4ZSIsIE5VTEwgfTsKK3N0YXRpYyBjaGFyICpXaW5lUGF0aCA9IE5VTEw7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJRGVidWdQcmludFN0cmluZwogICovCkBAIC0yMTUsMzkgKzIxOSwyMyBAQAogICAgICAqLwogICAgIGZvcihpPTA7IGk8d3BudC0+bmVfaGVhZGVyLT5uX21vZF9yZWZfdGFiOyBpKyspewogICAgICAgY2hhciBidWZmWzE0XTsKLSAgICAgIGNoYXIgYnVmZjJbMTRdOworICAgICAgY2hhciBidWZmMlsyNTZdOwogICAgICAgaW50ICBmZCwgajsKICAgICAgIEdldE1vZHVsZU5hbWUod3BudCwgaSArIDEsIGJ1ZmYpOwogICAgICAgCiAgICAgICBpZihGaW5kRExMVGFibGUoYnVmZikpIGNvbnRpbnVlOyAgLyogVGhpcyBtb2R1bGUgYWxyZWFkeSBsb2FkZWQgKi8KIAotICAgICAgLyogVGhlIG5leHQgdHJpY2sgaXMgdG8gY29udmVydCB0aGUgY2FzZSwgYW5kIGFkZCB0aGUgLmRsbAotICAgICAgICogZXh0ZW5zaW9uIGlmIHJlcXVpcmVkIHRvIGZpbmQgdGhlIGFjdHVhbCBsaWJyYXJ5LiAgV2UgbWF5IHdhbnQKLSAgICAgICAqIHRvIHVzZSBhIHNlYXJjaCBwYXRoIGF0IHNvbWUgcG9pbnQgYXMgd2VsbC4gKi8KLQotICAgICAgLyogIEZpcnN0IHRyeSAgdGhlIHN0cmFpZ2h0IG5hbWUgKi8KLSAgICAgICBzdHJjcHkoYnVmZjIsIGJ1ZmYpOwotICAgICAgaWYoZmQgPSBvcGVuKGJ1ZmYyLCBPX1JET05MWSkgID49IDApIHsKLQljbG9zZShmZCk7Ci0JTG9hZEltYWdlKGJ1ZmYyLCBidWZmKTsKLQljb250aW51ZTsKLSAgICAgIH07Ci0KLSAgICAgIC8qIE9LLCB0aGF0IGRpZCBub3Qgd29yaywgIHRyeSBtYWtpbmcgaXQgbG93ZXItY2FzZSwgYW5kIGFkZCB0aGUgLmRsbAotCSBleHRlbnNpb24gKi8KLQotICAgICAgZm9yKGo9MDsgIGo8c3RybGVuKGJ1ZmYyKTsgIGorKykgIAotCWlmKGJ1ZmYyW2pdID49ICdBJyAmJiBidWZmMltqXSA8PSAnWicpICBidWZmMltqXSB8PSAweDIwOwotICAgICAgc3RyY2F0KGJ1ZmYyLCAiLmRsbCIpOwotICAgICAgCi0gICAgICBpZihmZCA9IG9wZW4oYnVmZjIsIE9fUkRPTkxZKSAgPj0gMCkgewotCWNsb3NlKGZkKTsKLQlMb2FkSW1hZ2UoYnVmZjIsIGJ1ZmYpOwotCWNvbnRpbnVlOwotICAgICAgfTsKKyAgICAgIGlmIChGaW5kRmlsZUluUGF0aChidWZmMiwgc2l6ZW9mKGJ1ZmYyKSwgCisJCQkgYnVmZiwgZGxsRXh0ZW5zaW9ucywgV2luZVBhdGgpICE9IE5VTEwgJiYKKwkgIChmZCA9IG9wZW4oYnVmZjIsIE9fUkRPTkxZKSkgPj0gMCkKKyAgICAgIHsKKwkgIGNsb3NlKGZkKTsKKwkgIExvYWRJbWFnZShidWZmMiwgYnVmZik7CisJICBjb250aW51ZTsKKyAgICAgIH0KIAogICAgICAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBsb2FkOiVzXG4iLCAgYnVmZik7Ci0gICAgfTsKKyAgICB9CiB9CiAMCiAKQEAgLTI1Nyw2ICsyNDUsOCBAQAogX1dpbk1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWludCBzZWdtZW50OworCWNoYXIgKnA7CisJY2hhciBleGVfcGF0aFsyNTZdOwogI2lmZGVmIFdJTkVTVEFUCiAJY2hhciAqIGNwOwogI2VuZGlmCkBAIC0yNzMsOCArMjYzLDIxIEBACiAJCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIEZJTEVOQU1FXG4iLCBhcmd2WzBdKTsKIAkJZXhpdCgxKTsKIAl9CisKKwlwID0gZ2V0ZW52KCJXSU5FUEFUSCIpOworCVdpbmVQYXRoID0gbWFsbG9jKDI1NiArIHN0cmxlbihwKSk7CisJZ2V0Y3dkKFdpbmVQYXRoLCAyNTYpOworCXN0cmNhdChXaW5lUGF0aCwgIjsiKTsKKwlzdHJjYXQoV2luZVBhdGgsIHApOworCisJaWYgKEZpbmRGaWxlSW5QYXRoKGV4ZV9wYXRoLCAyNTYsIGFyZ3ZbMV0sIGV4ZUV4dGVuc2lvbnMsIFdpbmVQYXRoKQorCSAgICA9PSBOVUxMKQorCXsKKwkgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBmaWxlICclcydcbiIsIGFyZ3ZbMV0pOworCSAgICBleGl0KDEpOworCX0KIAkKLQlMb2FkSW1hZ2UoYXJndlsxXSwgTlVMTCk7CisJTG9hZEltYWdlKGV4ZV9wYXRoLCBOVUxMKTsKIAkKIAlpZihyYW5fb3V0KSBleGl0KDEpOwogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9tZW1vcnkvTWFrZWZpbGUgYi9tZW1vcnkvTWFrZWZpbGUKaW5kZXggMWI4YzlkOC4uYjYyNGUwOSAxMDA2NDQKLS0tIGEvbWVtb3J5L01ha2VmaWxlCisrKyBiL21lbW9yeS9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIAkkKExEKSAtciAtbyBtZW1vcnkubyAkKE9CSlMpCiAKIGNsZWFuOgotCXJtIC1mICoubyAqfiAqLnMgZGxsXyogKi5hCisJcm0gLWYgKi5vICp+ICoucyBkbGxfKiAqLmEgKiMKIAogZGVwZW5kOgogCSQoQ0MpICQoQ0ZMQUdTKSAtTSAqLmMgPiAuZGVwZW5kCmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlIGIvbWlzYy9NYWtlZmlsZQppbmRleCAwZDVmYTgxLi5lNWQ1NTQyIDEwMDY0NAotLS0gYS9taXNjL01ha2VmaWxlCisrKyBiL21pc2MvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBDRkxBR1M9JChDT1BUUykgJChERUJVR09QVFMpIC1JJChJTkNMVURFX0RJUikKIAogT0JKUz1kb3MubyBrZXJuZWwubyB1c2VyLm8geHQubyByZWN0Lm8gZmlsZS5vIHNvdW5kLm8gZW11bGF0ZS5vIFwKLSAgICAga2V5Ym9hcmQubyBwcm9maWxlLm8gbHN0ci5vCisgICAgIGtleWJvYXJkLm8gcHJvZmlsZS5vIGxzdHIubyBleGVjLm8KIAogZGVmYXVsdDogbWlzYy5vCiAKQEAgLTksNyArOSw3IEBACiAJJChMRCkgLXIgLW8gbWlzYy5vICQoT0JKUykKIAogY2xlYW46Ci0Jcm0gLWYgKi5vICp+ICoucyBkbGxfKiAqLmEKKwlybSAtZiAqLm8gKn4gKi5zIGRsbF8qICouYSAqIwogCiBkZXBlbmQ6CiAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKZGlmZiAtLWdpdCBhL21pc2MvZXhlYy5jIGIvbWlzYy9leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlNzg2NgotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvZXhlYy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorKiAgICAgV2luZG93cyBFeGVjICYgSGVscAorKgorKi8KKworI2luY2x1ZGUgIndpbi5oIgorCisjZGVmaW5lIEhFTFBfQ09OVEVYVCAgICAgIDB4MDAwMQorI2RlZmluZSBIRUxQX1FVSVQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSEVMUF9JTkRFWCAgICAgICAgMHgwMDAzCisjZGVmaW5lIEhFTFBfQ09OVEVOVFMgICAgIDB4MDAwMworI2RlZmluZSBIRUxQX0hFTFBPTkhFTFAgICAweDAwMDQKKyNkZWZpbmUgSEVMUF9TRVRJTkRFWCAgICAgMHgwMDA1CisjZGVmaW5lIEhFTFBfU0VUQ09OVEVOVFMgIDB4MDAwNQorI2RlZmluZSBIRUxQX0NPTlRFWFRQT1BVUCAweDAwMDgKKyNkZWZpbmUgSEVMUF9GT1JDRUZJTEUgICAgMHgwMDA5CisjZGVmaW5lIEhFTFBfS0VZICAgICAgICAgIDB4MDEwMQorI2RlZmluZSBIRUxQX0NPTU1BTkQgICAgICAweDAxMDIKKyNkZWZpbmUgSEVMUF9QQVJUSUFMS0VZICAgMHgwMTA1CisjZGVmaW5lIEhFTFBfTVVMVElLRVkgICAgIDB4MDIwMQorI2RlZmluZSBIRUxQX1NFVFdJTlBPUyAgICAweDAyMDMKKworCitXT1JEIFdpbkV4ZWMoTFBTVFIgbHBDbWRMaW5lLCBXT1JEIG5DbWRTaG93KQoreworICAgaW50IFgsIFgyLCBDOworICAgY2hhciAqQXJnVlsyMF07CisgICBwcmludGYoIldpbkV4ZWMoJXMsICV1KVxuIiwgbHBDbWRMaW5lLCBuQ21kU2hvdyk7CisgICBmb3IgKFggPSBYMiA9IEMgPSAwOyBYIDwgc3RybGVuKGxwQ21kTGluZSkgKyAxOyBYKyspIHsKKyAgICAgIGlmICgobHBDbWRMaW5lW1hdID09ICcgJykgfHwgKGxwQ21kTGluZVtYXSA9PSAnXDAnKSkgeworICAgICAgICAgIEFyZ1ZbQ10gPSAoY2hhciAqKW1hbGxvYyhYIC0gWDIgKyAxKTsKKyAgICAgICAgICBzdHJuY3B5KEFyZ1ZbQ10sICZscENtZExpbmVbWDJdLCBYIC0gWDIpOworICAgICAgICAgIEFyZ1ZbQ11bWCAtIFgyXSA9ICdcMCc7CisgICAgICAgICAgQysrOyAgIFgyID0gWCArIDE7CisgICAgICB9CisgICB9ICAKKyAgIEFyZ1ZbQ10gPSBOVUxMOworICAgZm9yIChDID0gMDsgOyBDKyspIHsKKyAgICAgIGlmIChBcmdWW0NdID09IE5VTEwpICBicmVhazsKKyAgICAgIHByaW50ZigiLS0+ICclcycgXG4iLCBBcmdWW0NdKTsKKyAgIH0gIAorICAgc3dpdGNoKGZvcmsoKSkgeworICAgICAgY2FzZSAtMToKKyAgICAgICAgIHByaW50ZigiQ2FuJ2sgJ2ZvcmsnIHByb2Nlc3MgIVxuIik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHByaW50ZigiTmV3IHByb2Nlc3Mgc3RhcnRlZCAhXG4iKTsKKyAgICAgICAgIGV4ZWN2cChBcmdWWzBdLCBBcmdWKTsKKyAgICAgICAgIHByaW50ZigiQ2hpbGQgcHJvY2VzcyBkaWVkICFcbiIpOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHByaW50ZigiTWFpbiBwcm9jZXNzIHN0YXkgYWxpdmUgIVxuIik7CisgICAgICAgICBicmVhazsgICAgICAgICAKKyAgICAgIH0KKyAgIGZvciAoQyA9IDA7IDsgQysrKSB7CisgICAgICBpZiAoQXJnVltDXSA9PSBOVUxMKSAgYnJlYWs7CisgICAgICBmcmVlKEFyZ1ZbQ10pOworICAgfSAgCisgICByZXR1cm4oVFJVRSk7Cit9CisKKworQk9PTCBXaW5IZWxwKEhXTkQgaFduZCwgTFBTVFIgbHBIZWxwRmlsZSwgV09SRCB3Q29tbWFuZCwgRFdPUkQgZHdEYXRhKQoreworICAgY2hhciAqQXJnVls2XTsKKyAgIGNoYXIJc3RyWzMyXTsKKyAgIHByaW50ZigiV2luSGVscCglcywgJXUsICVsdSlcbiIsIGxwSGVscEZpbGUsIHdDb21tYW5kLCBkd0RhdGEpOworICAgc3dpdGNoKGZvcmsoKSkgeworICAgICAgY2FzZSAtMToKKyAgICAgICAgIHByaW50ZigiQ2FuJ2sgJ2ZvcmsnIHByb2Nlc3MgIVxuIik7CisgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgIHByaW50ZigiTmV3IHByb2Nlc3Mgc3RhcnRlZCAhXG4iKTsKKyAgICAgICAgIEFyZ1ZbMF0gPSAid2luZSI7CisgICAgICAgICBBcmdWWzFdID0gIi9DOi93aW5kb3dzL3dpbmhlbHAuZXhlIjsKKyAgICAgICAgIEFyZ1ZbMl0gPSBscEhlbHBGaWxlOworICAgICAgICAgc3dpdGNoICh3Q29tbWFuZCkgeworCSAgICAgY2FzZSBIRUxQX0NPTlRFWFQ6CisJICAgICBjYXNlIEhFTFBfS0VZOgorCSAgICAgY2FzZSBIRUxQX1NFVElOREVYOgorCQkgc3ByaW50ZihzdHIsICIlbHUiLCBkd0RhdGEpOworCQkgQXJnVlszXSA9IHN0cjsKKwkgICAgIGRlZmF1bHQ6CisJCSBBcmdWWzNdID0gTlVMTDsKKwkgICAgIH0KKyAgICAgICAgIEFyZ1ZbNF0gPSBOVUxMOworICAgICAgICAgaWYgKHdDb21tYW5kID09IEhFTFBfSEVMUE9OSEVMUCkgIEFyZ1ZbMl0gPSBOVUxMOworLyoKKyAgICAgICAgIF9XaW5NYWluKEFyZ1YsIDIpOworKi8KKyAgICAgICAgIGV4ZWN2cChBcmdWWzBdLCBBcmdWKTsKKyAgICAgICAgIHByaW50ZigiQ2hpbGQgcHJvY2VzcyBkaWVkICFcbiIpOworICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHByaW50ZigiTWFpbiBwcm9jZXNzIHN0YXkgYWxpdmUgIVxuIik7CisgICAgICAgICBicmVhazsgICAgICAgICAKKyAgICAgIH0KK3JldHVybihUUlVFKTsKK30KKworCmRpZmYgLS1naXQgYS9taXNjL2tlcm5lbC5jIGIvbWlzYy9rZXJuZWwuYwppbmRleCBjYjZhYTE3Li5lYTNjM2MwIDEwMDY0NAotLS0gYS9taXNjL2tlcm5lbC5jCisrKyBiL21pc2Mva2VybmVsLmMKQEAgLTcxLDcgKzcxLDcgQEAKIGludAogS0VSTkVMX0dldE1vZHVsZUZpbGVOYW1lKGludCBtb2R1bGUsIGNoYXIgKmZpbGVuYW1lLCBpbnQgYnl0ZXMpCiB7Ci0jaWZkZWYgUkVMQVlfREVCVUcKKyNpZmRlZiBERUJVR19SRUxBWQogICAgIHByaW50ZigiR2V0TW9kdWxlRmlsZU5hbWU6IG1vZHVsZSAlZCwgZmlsZW5hbWUgJXgsIGJ5dGVzICVkXG4iLCAKIAkgICAgbW9kdWxlLCBmaWxlbmFtZSwgYnl0ZXMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9taXNjL2xzdHIuYyBiL21pc2MvbHN0ci5jCmluZGV4IDdiZjIyNTAuLjc3ZTE3OGMgMTAwNjQ0Ci0tLSBhL21pc2MvbHN0ci5jCisrKyBiL21pc2MvbHN0ci5jCkBAIC0xMiw5ICsxMiw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogCiAKLSNkZWZpbmUgTFBDU1RSIExQU1RSICAvKiBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNvbnN0IGNoYXIgKiovCi10eXBlZGVmICB1bnNpZ25lZCBzaG9ydCBVSU5UOwotCiAgIC8qIEZ1bm55IHRvIGRpdmlkZSB0aGVtIGJldHdlZW4gdXNlciBhbmQga2VybmVsLiAqLwogCiAvKiBLRVJORUwuODkgKi8KQEAgLTExMyw3ICsxMTAsNyBAQAogfQogCiAvKiBBbnNpTmV4dCBVU0VSLjQ3MiAqLwotTFBTVFIgQW5zaU5leHQoTFBDU1RSIGN1cnJlbnQpCitMUFNUUiBBbnNpTmV4dChMUFNUUiBjdXJyZW50KQogewogICByZXR1cm4gKCpjdXJyZW50KT9jdXJyZW50KzE6Y3VycmVudDsKIH0KZGlmZiAtLWdpdCBhL21pc2MvcHJvZmlsZS5jIGIvbWlzYy9wcm9maWxlLmMKaW5kZXggYjM4YzZmOC4uYWM1MGQ4NiAxMDA2NDQKLS0tIGEvbWlzYy9wcm9maWxlLmMKKysrIGIvbWlzYy9wcm9maWxlLmMKQEAgLTEwLDggKzEwLDkgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lLmgiCiAKLSNkZWZpbmUgSU5JRklMRSAid2luLmluaSIKKyNkZWZpbmUgSU5JRklMRQlHZXRTeXN0ZW1JbmlGaWxlbmFtZSgpCiAjZGVmaW5lIFNUUlNJWkUgMjU1CiAjZGVmaW5lIHhtYWxsb2MoeCkgbWFsbG9jKHgpCiAjZGVmaW5lIG92ZXJmbG93IChuZXh0ID09ICZDaGFyQnVmZmVyIFtTVFJTSVpFLTFdKQpAQCAtMjk4LDI1ICsyOTksMyBAQAogewogICAgIGR1bXBfcHJvZmlsZSAoQmFzZSk7CiB9Ci0KLSNpZmRlZiBEVU1CVEVTVAotbWFpbiAoKQotewotICAgIGNoYXIgciBbMTAwXSwgYXBwIFsxMDBdLCBrZXkgWzEwMF0sIHZhbG9yIFsxMDBdOwotICAgIAotICAgIHdoaWxlICgxKXsKLQlwcmludGYgKCJEYW1lLCBBcGxpY2FjaW9uLCBsbGF2ZVxuIik7Ci0JZ2V0cyAoYXBwKTsKLQlpZiAoIWFwcCBbMF0pewotCSAgICBzeW5jX3Byb2ZpbGVzICgpOwotCSAgICByZXR1cm47Ci0JfQotCWdldHMgKGtleSk7Ci0JZ2V0cyAodmFsb3IpOwotCUdldFByb2ZpbGVTdHJpbmcgKGFwcCwga2V5LCAiMU5vX0VuY29udHJhZG8iLCByLCBzaXplb2YgKHIpKTsKLQlwcmludGYgKCIoJWQpXG4iLCBHZXRQcm9maWxlSW50IChhcHAsIGtleSwgNSkpOwotCXByaW50ZiAoIiVzXG4iLCByKTsKLQlXcml0ZVByb2ZpbGVTdHJpbmcgKGFwcCwga2V5LCB2YWxvcik7Ci0gICAgfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9taXNjL3VzZXIuYyBiL21pc2MvdXNlci5jCmluZGV4IDQ3NmQ4NjEuLjU4MDg3ZWUgMTAwNjQ0Ci0tLSBhL21pc2MvdXNlci5jCisrKyBiL21pc2MvdXNlci5jCkBAIC01MCw3ICs1MCwxMCBAQAogICAgIERDRV9Jbml0KCk7CiAgICAgCiAgICAgICAvKiBJbml0aWFsaXplIGJ1aWx0LWluIHdpbmRvdyBjbGFzc2VzICovCi0gICAgV0lER0VUU19Jbml0KCk7CisgICAgaWYgKCFXSURHRVRTX0luaXQoKSkgcmV0dXJuIDA7CisKKyAgICAgIC8qIEluaXRpYWxpemUgZGlhbG9nIG1hbmFnZXIgKi8KKyAgICBpZiAoIURJQUxPR19Jbml0KCkpIHJldHVybiAwOwogICAgIAogICAgICAgLyogQ3JlYXRlIHRhc2sgbWVzc2FnZSBxdWV1ZSAqLwogICAgIGlmICghU2V0TWVzc2FnZVF1ZXVlKCBERUZBVUxUX01TR19RVUVVRV9TSVpFICkpIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbWlzYy94dC5jIGIvbWlzYy94dC5jCmluZGV4IDU3NTZkMzkuLjkyOGQ2ZGQgMTAwNjQ0Ci0tLSBhL21pc2MveHQuYworKysgYi9taXNjL3h0LmMKQEAgLTE0LDEyICsxNCw3IEBACiAjaW5jbHVkZSA8WDExL0NvcmUuaD4KICNpbmNsdWRlIDxYMTEvU2hlbGwuaD4KIAotI2luY2x1ZGUgIm1lc3NhZ2UuaCIKLSNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImNsYXNzLmgiCi0jaW5jbHVkZSAiZ2RpLmgiCi0jaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogI2lmZGVmIF9fTmV0QlNEX18KICNkZWZpbmUgSFogMTAwCkBAIC01MCw4NyArNDUsNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERlZldpbmRvd1Byb2MgICAoVVNFUi4xMDcpCi0gKi8KLUxPTkcgRGVmV2luZG93UHJvYyggSFdORCBod25kLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLXsKLSAgICBXTkQgKiB3bmRQdHI7Ci0gICAgQ0xBU1MgKiBjbGFzc1B0cjsKLSAgICBMUFNUUiB0ZXh0UHRyOwotICAgIGludCBsZW47Ci0gICAgCi0jaWZkZWYgREVCVUdfTUVTU0FHRQotICAgIHByaW50ZiggIkRlZldpbmRvd1Byb2M6ICVkICVkICVkICUwOHhcbiIsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKLSNlbmRpZgotCi0gICAgc3dpdGNoKG1zZykKLSAgICB7Ci0gICAgY2FzZSBXTV9QQUlOVDoKLQl7Ci0JICAgIFBBSU5UU1RSVUNUIHBhaW50c3RydWN0OwotCSAgICBCZWdpblBhaW50KCBod25kLCAmcGFpbnRzdHJ1Y3QgKTsKLQkgICAgRW5kUGFpbnQoIGh3bmQsICZwYWludHN0cnVjdCApOwotCSAgICByZXR1cm4gMDsKLQl9Ci0KLSAgICBjYXNlIFdNX0NSRUFURToKLQlyZXR1cm4gMDsKLQotICAgIGNhc2UgV01fQ0xPU0U6Ci0JRGVzdHJveVdpbmRvdyggaHduZCApOwotCXJldHVybiAwOwotCi0gICAgY2FzZSBXTV9FUkFTRUJLR05EOgotICAgIGNhc2UgV01fSUNPTkVSQVNFQktHTkQ6Ci0JewotCSAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDE7Ci0JICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDE7Ci0JICAgIGlmICghY2xhc3NQdHItPndjLmhickJhY2tncm91bmQpIHJldHVybiAxOwotCSAgICBGaWxsV2luZG93KCB3bmRQdHItPmh3bmRQYXJlbnQsIGh3bmQsIChIREMpd1BhcmFtLAotCQkgICAgICAgIGNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kICk7Ci0JICAgIEdsb2JhbFVubG9jayggaHduZCApOwotCSAgICByZXR1cm4gMDsKLQl9Ci0KLSAgICBjYXNlIFdNX0dFVFRFWFQ6Ci0JewotCSAgICBpZiAod1BhcmFtKQotCSAgICB7Ci0JCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCQlpZiAod25kUHRyLT5oVGV4dCkKLQkJewotCQkgICAgdGV4dFB0ciA9IChMUFNUUilVU0VSX0hFQVBfQUREUih3bmRQdHItPmhUZXh0KTsKLQkJICAgIGlmICgoaW50KXdQYXJhbSA+IChsZW4gPSBzdHJsZW4odGV4dFB0cikpKQotCQkgICAgewotCQkJc3RyY3B5KChMUFNUUilsUGFyYW0sIHRleHRQdHIpOwotCQkJR2xvYmFsVW5sb2NrKGh3bmQpOwotCQkJcmV0dXJuIChEV09SRClsZW47Ci0JCSAgICB9Ci0JCX0KLQkJKChMUFNUUilsUGFyYW0pWzBdID0gTlVMTDsKLQkgICAgfQotCSAgICBHbG9iYWxVbmxvY2soaHduZCk7Ci0JICAgIHJldHVybiAoMEwpOwotCX0KLQotICAgIGNhc2UgV01fR0VUVEVYVExFTkdUSDoKLQl7Ci0JICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCSAgICBpZiAod25kUHRyLT5oVGV4dCkKLQkgICAgewotCQl0ZXh0UHRyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKHduZFB0ci0+aFRleHQpOwotCQlsZW4gPSBzdHJsZW4odGV4dFB0cik7Ci0JCUdsb2JhbFVubG9jayhod25kKTsKLQkJcmV0dXJuIChEV09SRClsZW47Ci0JICAgIH0KLQkgICAgR2xvYmFsVW5sb2NrKGh3bmQpOwotCSAgICByZXR1cm4gKDBMKTsKLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAMCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xOTQsNyArMTA4LDggQEAKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKLUhNRU5VIENyZWF0ZU1lbnUoKSB7IH0KK0hNRU5VIENyZWF0ZU1lbnUoKSB7IHJldHVybiAwOyB9CiAKLUJPT0wgQXBwZW5kTWVudSggSE1FTlUgaG1lbnUsIFdPUkQgZmxhZ3MsIFdPUkQgaWQsIExQU1RSIHRleHQgKSB7IH0KK0JPT0wgQXBwZW5kTWVudSggSE1FTlUgaG1lbnUsIFdPUkQgZmxhZ3MsIFdPUkQgaWQsIExQU1RSIHRleHQgKSB7IHJldHVybiBUUlVFO30KIAorQk9PTCBEZXN0cm95TWVudSggSE1FTlUgaG1lbnUgKSB7IHJldHVybiBUUlVFOyB9CmRpZmYgLS1naXQgYS9vYmplY3RzL01ha2VmaWxlIGIvb2JqZWN0cy9NYWtlZmlsZQppbmRleCBmMWRjZDA2Li5jYjcwZDg5IDEwMDY0NAotLS0gYS9vYmplY3RzL01ha2VmaWxlCisrKyBiL29iamVjdHMvTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiAJJChMRCkgLXIgLW8gb2JqZWN0cy5vICQoT0JKUykKIAogY2xlYW46Ci0Jcm0gLWYgKi5vICp+ICoucyBkbGxfKiAqLmEKKwlybSAtZiAqLm8gKn4gKi5zIGRsbF8qICouYSAqIwogCiBkZXBlbmQ6CiAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKZGlmZiAtLWdpdCBhL29iamVjdHMvY29sb3IuYyBiL29iamVjdHMvY29sb3IuYwppbmRleCBhNTdiNDZlLi4wMjE1ZDQ3IDEwMDY0NAotLS0gYS9vYmplY3RzL2NvbG9yLmMKKysrIGIvb2JqZWN0cy9jb2xvci5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiBXZSB0cnkgdG8gdXNlIGEgcHJpdmF0ZSBjb2xvciBtYXAgaWYgcG9zc2libGUsIGJlY2F1c2UgV2luZG93cyBwcm9ncmFtcwogICogYXNzdW1lIHRoYXQgcGFsZXR0ZSgwKSA9PSBCbGFjayBhbmQgcGFsZXR0ZShtYXgtMSkgPT0gV2hpdGUuCiAgKi8KKyNkZWZpbmUgVVNFX1BSSVZBVEVfTUFQCiAKIENvbG9ybWFwIENPTE9SX1dpbkNvbG9ybWFwID0gMDsKIApAQCAtNzEsMTEgKzcyLDM5IEBACiAgKgogICogRmlsbCB0aGUgcHJpdmF0ZSBjb2xvcm1hcC4KICAqLworI2lmZGVmIFVTRV9QUklWQVRFX01BUAorCiBzdGF0aWMgQk9PTCBDT0xPUl9CdWlsZE1hcCggQ29sb3JtYXAgbWFwLCBpbnQgZGVwdGgsIGludCBzaXplICkKIHsKICAgICBYQ29sb3IgY29sb3I7CiAgICAgaW50IGk7CiAKKyAgICAgIC8qIEZpbGwgdGhlIHdob2xlIG1hcCB3aXRoIGEgcmFuZ2Ugb2YgY29sb3JzICovCisKKyAgICBpZiAoKDEgPDwgZGVwdGgpID4gTkJfU1lTX0NPTE9SUykKKyAgICB7CisJaW50IHJlZF9pbmNyLCBncmVlbl9pbmNyLCBibHVlX2luY3I7CisJaW50IHIsIGcsIGI7CisJCisJYmx1ZV9pbmNyICA9IDB4MTAwMDAgPj4gKGRlcHRoIC8gMyk7CisJcmVkX2luY3IgICA9IDB4MTAwMDAgPj4gKChkZXB0aCArIDEpIC8gMyk7CisJZ3JlZW5faW5jciA9IDB4MTAwMDAgPj4gKChkZXB0aCArIDIpIC8gMyk7CisKKwlmb3IgKGkgPSAwLCByID0gcmVkX2luY3IgLSAxOyByIDwgMHgxMDAwMDsgciArPSByZWRfaW5jcikKKwkgICAgZm9yIChnID0gZ3JlZW5faW5jciAtIDE7IGcgPCAweDEwMDAwOyBnICs9IGdyZWVuX2luY3IpCisJCWZvciAoYiA9IGJsdWVfaW5jciAtIDE7IGIgPCAweDEwMDAwOyBiICs9IGJsdWVfaW5jcikKKwkJeworCQkgICAgaWYgKGkgPj0gc2l6ZSkgYnJlYWs7CisJCSAgICBjb2xvci5waXhlbCA9IGkrKzsKKwkJICAgIGNvbG9yLnJlZCAgID0gcjsKKwkJICAgIGNvbG9yLmdyZWVuID0gZzsKKwkJICAgIGNvbG9yLmJsdWUgID0gYjsKKwkJICAgIFhTdG9yZUNvbG9yKCBYVF9kaXNwbGF5LCBtYXAsICZjb2xvciApOworCQl9CisgICAgfQorICAgIAorICAgICAgLyogU3RvcmUgdGhlIHN5c3RlbSBwYWxldHRlIGNvbG9ycyAqLworCiAgICAgZm9yIChpID0gMDsgaSA8IE5CX1NZU19DT0xPUlM7IGkrKykKICAgICB7CiAJaWYgKCFYUGFyc2VDb2xvciggWFRfZGlzcGxheSwgbWFwLCBTeXNDb2xvcnNbaV0sICZjb2xvciApKQpAQCAtODYsNyArMTE1LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9Ci0KKyNlbmRpZiAgLyogVVNFX1BSSVZBVEVfTUFQICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENPTE9SX0luaXQKQEAgLTExNyw3ICsxNDYsNyBAQAogICAgICAgY2FzZSBTdGF0aWNDb2xvcjoKICAgICAgIGNhc2UgVHJ1ZUNvbG9yOgogCUNPTE9SX0ZpbGxEZWZhdWx0TWFwKCk7Ci0JQ09MT1JfV2luQ29sb3JtYXAgPSBDb3B5RnJvbVBhcmVudDsKKwlDT0xPUl9XaW5Db2xvcm1hcCA9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKCBYVF9zY3JlZW4gKTsJCiAJYnJlYWs7CQogICAgIH0KICAgICByZXR1cm4gVFJVRTsKZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggYzMwZmNlYy4uMTI5OWEyNiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTMzMCwzICszMzAsMzggQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDaGFyV2lkdGggICAgKEdESS4zNTApCisgKi8KK0JPT0wgR2V0Q2hhcldpZHRoKEhEQyBoZGMsIFdPUkQgd0ZpcnN0Q2hhciwgV09SRCB3TGFzdENoYXIsIExQSU5UIGxwQnVmZmVyKQoreworICAgIGludCBpLCBqOworICAgIFhGb250U3RydWN0ICp4Zm9udDsKKyAgICBYQ2hhclN0cnVjdCAqY2hhclB0cjsKKyAgICBpbnQgZGVmYXVsdF93aWR0aDsKKworICAgIERDICpkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7CisgICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOworICAgIHhmb250ID0gZGMtPnUueC5mb250LmZzdHJ1Y3Q7CisgICAgCisgICAgLyogZml4ZWQgZm9udD8gKi8KKyAgICBpZiAoeGZvbnQtPnBlcl9jaGFyID09IE5VTEwpCisgICAgeworCWZvciAoaSA9IHdGaXJzdENoYXIsIGogPSAwOyBpIDw9IHdMYXN0Q2hhcjsgaSsrLCBqKyspCisJICAgICoobHBCdWZmZXIgKyBqKSA9IHhmb250LT5tYXhfYm91bmRzLndpZHRoOworCXJldHVybiBUUlVFOworICAgIH0KKworICAgIGNoYXJQdHIgPSB4Zm9udC0+cGVyX2NoYXI7CisgICAgZGVmYXVsdF93aWR0aCA9IChjaGFyUHRyICsgeGZvbnQtPmRlZmF1bHRfY2hhciktPndpZHRoOworCQorICAgIGZvciAoaSA9IHdGaXJzdENoYXIsIGogPSAwOyBpIDw9IHdMYXN0Q2hhcjsgaSsrLCBqKyspCisgICAgeworCWlmIChpIDwgeGZvbnQtPm1pbl9jaGFyX29yX2J5dGUyIHx8IGkgPiB4Zm9udC0+bWF4X2NoYXJfb3JfYnl0ZTIpCisJICAgICoobHBCdWZmZXIgKyBqKSA9IGRlZmF1bHRfd2lkdGg7CisJZWxzZQorCSAgICAqKGxwQnVmZmVyICsgaikgPSBjaGFyUHRyLT53aWR0aDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IGVjNjk3MDAuLjNiMTAxYjIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC0zMyw3ICszMyw2IEBACiB7CiAgICAgaW50IGksIHNpemU7CiAgICAgWENvbG9yIGNvbG9yOwotICAgIENvbG9ybWFwIG1hcDsKICAgICBIUEFMRVRURSBocGFsZXR0ZTsKICAgICBMT0dQQUxFVFRFICogcGFsUHRyOwogCkBAIC00NCwxMyArNDMsMTAgQEAKICAgICBwYWxQdHItPnBhbE51bUVudHJpZXMgPSBzaXplOwogICAgIG1lbXNldCggcGFsUHRyLT5wYWxQYWxFbnRyeSwgMHhmZiwgc2l6ZSpzaXplb2YoUEFMRVRURUVOVFJZKSApOwogCi0gICAgaWYgKChtYXAgPSBDT0xPUl9XaW5Db2xvcm1hcCkgPT0gQ29weUZyb21QYXJlbnQpCi0JbWFwID0gRGVmYXVsdENvbG9ybWFwT2ZTY3JlZW4oIFhUX3NjcmVlbiApOwotCiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICB7CiAJY29sb3IucGl4ZWwgPSBpOwotCVhRdWVyeUNvbG9yKCBYVF9kaXNwbGF5LCBtYXAsICZjb2xvciApOworCVhRdWVyeUNvbG9yKCBYVF9kaXNwbGF5LCBDT0xPUl9XaW5Db2xvcm1hcCwgJmNvbG9yICk7CiAJcGFsUHRyLT5wYWxQYWxFbnRyeVtpXS5wZVJlZCAgID0gY29sb3IucmVkID4+IDg7CiAJcGFsUHRyLT5wYWxQYWxFbnRyeVtpXS5wZUdyZWVuID0gY29sb3IuZ3JlZW4gPj4gODsKIAlwYWxQdHItPnBhbFBhbEVudHJ5W2ldLnBlQmx1ZSAgPSBjb2xvci5ibHVlID4+IDg7CkBAIC0xMzYsNyArMTMyLDggQEAKICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwogICAgIGlmICghcGFsUHRyKSByZXR1cm4gMDsKIAotICAgIGlmIChDT0xPUl9XaW5Db2xvcm1hcCAmJiAoaHBhbGV0dGUgPT0gU1RPQ0tfREVGQVVMVF9QQUxFVFRFKSkKKyAgICBpZiAoKENPTE9SX1dpbkNvbG9ybWFwICE9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKFhUX3NjcmVlbikpICYmCisJKGhwYWxldHRlID09IFNUT0NLX0RFRkFVTFRfUEFMRVRURSkpCiAgICAgewogCWlmICgoY29sb3IgJiAweGZmZmZmZikgPT0gMCkgcmV0dXJuIDA7ICAvKiBFbnRyeSAwIGlzIGJsYWNrICovCiAJaWYgKChjb2xvciAmIDB4ZmZmZmZmKSA9PSAweGZmZmZmZikgICAgIC8qIE1heCBlbnRyeSBpcyB3aGl0ZSAqLwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy90ZXh0LmMgYi9vYmplY3RzL3RleHQuYwppbmRleCA5N2ZmMzViLi5iYmIyNzQwIDEwMDY0NAotLS0gYS9vYmplY3RzL3RleHQuYworKysgYi9vYmplY3RzL3RleHQuYwpAQCAtMTcsNiArMTcsMTU5IEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAKKyNkZWZpbmUgVEFCICAgICA5CisjZGVmaW5lIExGICAgICAxMAorI2RlZmluZSBDUiAgICAgMTMKKyNkZWZpbmUgU1BBQ0UgIDMyCisjZGVmaW5lIFBSRUZJWCAzOAorCitzdGF0aWMgaW50IHRhYnN0b3AgPSA4Oworc3RhdGljIGludCB0YWJ3aWR0aDsKK3N0YXRpYyBpbnQgc3BhY2V3aWR0aDsKK3N0YXRpYyBpbnQgcHJlZml4X29mZnNldDsKKworCitzdGF0aWMgY2hhciAqVEVYVF9OZXh0TGluZShIREMgaGRjLCBjaGFyICpzdHIsIGludCAqY291bnQsIGNoYXIgKmRlc3QsIAorCQkJICAgaW50ICpsZW4sIGludCB3aWR0aCwgV09SRCBmb3JtYXQpCit7CisgICAgLyogUmV0dXJuIG5leHQgbGluZSBvZiB0ZXh0IGZyb20gYSBzdHJpbmcuCisgICAgICogCisgICAgICogaGRjIC0gaGFuZGxlIHRvIERDLgorICAgICAqIHN0ciAtIHN0cmluZyB0byBwYXJzZSBpbnRvIGxpbmVzLgorICAgICAqIGNvdW50IC0gbGVuZ3RoIG9mIHN0ci4KKyAgICAgKiBkZXN0IC0gZGVzdGluYXRpb24gaW4gd2hpY2ggdG8gcmV0dXJuIGxpbmUuCisgICAgICogbGVuIC0gbGVuZ3RoIG9mIHJlc3VsdGFudCBsaW5lIGluIGRlc3QgaW4gY2hhcnMuCisgICAgICogd2lkdGggLSBtYXhpbXVtIHdpZHRoIG9mIGxpbmUgaW4gcGl4ZWxzLgorICAgICAqIGZvcm1hdCAtIGZvcm1hdCB0eXBlIHBhc3NlZCB0byBEcmF3VGV4dC4KKyAgICAgKgorICAgICAqIFJldHVybnMgcG9pbnRlciB0byBuZXh0IGNoYXIgaW4gc3RyIGFmdGVyIGVuZCBvZiB0aGUgbGluZQorICAgICAqIG9yIE5VTEwgaWYgZW5kIG9mIHN0ciByZWFjaGVkLgorICAgICAqLworCisgICAgaW50IGkgPSAwLCBqID0gMCwgazsKKyAgICBpbnQgcGxlbiA9IDA7CisgICAgaW50IG51bXNwYWNlczsKKyAgICBTSVpFIHNpemU7CisgICAgaW50IGxhc3R0YWIgPSAwOworICAgIGludCB3Yl9pID0gMCwgd2JfaiA9IDAsIHdiX2NvdW50OworCisgICAgd2hpbGUgKCpjb3VudCkKKyAgICB7CisJc3dpdGNoIChzdHJbaV0pCisJeworCWNhc2UgQ1I6CisJY2FzZSBMRjoKKwkgICAgaWYgKCEoZm9ybWF0ICYgRFRfU0lOR0xFTElORSkpCisJICAgIHsKKwkJaSsrOworCQlpZiAoc3RyW2ldID09IENSIHx8IHN0cltpXSA9PSBMRikKKwkJICAgIGkrKzsKKwkJKmxlbiA9IGo7CisJCXJldHVybiAoJnN0cltpXSk7CisJICAgIH0KKwkgICAgZGVzdFtqKytdID0gc3RyW2krK107CisJICAgIGlmICghKGZvcm1hdCAmIERUX05PQ0xJUCkgfHwgIShmb3JtYXQgJiBEVF9OT1BSRUZJWCkpCisJICAgIHsKKwkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCAmZGVzdFtqLTFdLCAxLCAmc2l6ZSkpCisJCSAgICByZXR1cm4gTlVMTDsKKwkJcGxlbiArPSBzaXplLmN4OworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBQUkVGSVg6CisJICAgIGlmICghKGZvcm1hdCAmIERUX05PUFJFRklYKSkKKwkgICAgeworCQlwcmVmaXhfb2Zmc2V0ID0gaiArIDE7CisJCWkrKzsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJZGVzdFtqKytdID0gc3RyW2krK107CisJCWlmICghKGZvcm1hdCAmIERUX05PQ0xJUCkpCisJCXsKKwkJICAgIGlmICghR2V0VGV4dEV4dGVudFBvaW50KGhkYywgJmRlc3Rbai0xXSwgMSwgJnNpemUpKQorCQkJcmV0dXJuIE5VTEw7CisJCSAgICBwbGVuICs9IHNpemUuY3g7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgVEFCOgorCSAgICBpZiAoZm9ybWF0ICYgRFRfRVhQQU5EVEFCUykKKwkgICAgeworCQl3Yl9pID0gKytpOworCQl3Yl9qID0gajsKKwkJd2JfY291bnQgPSAqY291bnQ7CisKKwkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCAmZGVzdFtsYXN0dGFiXSwgaiAtIGxhc3R0YWIsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisJCSAgICByZXR1cm4gTlVMTDsKKworCQludW1zcGFjZXMgPSAodGFid2lkdGggLSBzaXplLmN4KSAvIHNwYWNld2lkdGg7CisJCWZvciAoayA9IDA7IGsgPCBudW1zcGFjZXM7IGsrKykKKwkJICAgIGRlc3RbaisrXSA9IFNQQUNFOworCQlwbGVuICs9IHRhYndpZHRoIC0gc2l6ZS5jeDsKKwkJbGFzdHRhYiA9IHdiX2ogKyBudW1zcGFjZXM7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCWRlc3RbaisrXSA9IHN0cltpKytdOworCQlpZiAoIShmb3JtYXQgJiBEVF9OT0NMSVApIHx8ICEoZm9ybWF0ICYgRFRfTk9QUkVGSVgpKQorCQl7CisJCSAgICBpZiAoIUdldFRleHRFeHRlbnRQb2ludChoZGMsICZkZXN0W2otMV0sIDEsICZzaXplKSkKKwkJCXJldHVybiBOVUxMOworCQkgICAgcGxlbiArPSBzaXplLmN4OworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIFNQQUNFOgorCSAgICBkZXN0W2orK10gPSBzdHJbaSsrXTsKKwkgICAgaWYgKCEoZm9ybWF0ICYgRFRfTk9DTElQKSB8fCAhKGZvcm1hdCAmIERUX05PUFJFRklYKSkKKwkgICAgeworCQl3Yl9pID0gaTsKKwkJd2JfaiA9IGogLSAxOworCQl3Yl9jb3VudCA9ICpjb3VudDsKKwkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCAmZGVzdFtqLTFdLCAxLCAmc2l6ZSkpCisJCSAgICByZXR1cm4gTlVMTDsKKwkJcGxlbiArPSBzaXplLmN4OworCSAgICB9CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgZGVzdFtqKytdID0gc3RyW2krK107CisJICAgIGlmICghKGZvcm1hdCAmIERUX05PQ0xJUCkgfHwgIShmb3JtYXQgJiBEVF9OT1BSRUZJWCkpCisJICAgIHsKKwkJaWYgKCFHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCAmZGVzdFtqLTFdLCAxLCAmc2l6ZSkpCisJCSAgICByZXR1cm4gTlVMTDsKKwkJcGxlbiArPSBzaXplLmN4OworCSAgICB9CisJfQorCisJKCpjb3VudCktLTsKKwlpZiAoIShmb3JtYXQgJiBEVF9OT0NMSVApIHx8IChmb3JtYXQgJiBEVF9XT1JEQlJFQUspKQorCXsKKwkgICAgaWYgKHBsZW4gPiB3aWR0aCkKKwkgICAgeworCQlpZiAoZm9ybWF0ICYgRFRfV09SREJSRUFLKQorCQl7CisJCSAgICAqbGVuID0gd2JfajsKKwkJICAgICpjb3VudCA9IHdiX2NvdW50OworCQkgICAgcmV0dXJuICgmc3RyW3diX2ldKTsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgICpsZW4gPSBqOworCQkgICAgcmV0dXJuICgmc3RyW2ldKTsKKwkJfQorCSAgICB9CisJfQorICAgIH0KKyAgICAKKyAgICAqbGVuID0gajsKKyAgICByZXR1cm4gTlVMTDsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEcmF3VGV4dCAgICAoVVNFUi44NSkKQEAgLTI0LDE3ICsxNzcsNzcgQEAKIGludCBEcmF3VGV4dCggSERDIGhkYywgTFBTVFIgc3RyLCBpbnQgY291bnQsIExQUkVDVCByZWN0LCBXT1JEIGZsYWdzICkKIHsKICAgICBTSVpFIHNpemU7CisgICAgY2hhciAqc3RyUHRyOworICAgIHN0YXRpYyBjaGFyIGxpbmVbMTAyNF07CisgICAgaW50IGxlbiwgbGgsIHByZWZpeF94LCBwcmVmaXhfbGVuOworICAgIFRFWFRNRVRSSUMgdG07CiAgICAgaW50IHggPSByZWN0LT5sZWZ0LCB5ID0gcmVjdC0+dG9wOworICAgIGludCB3aWR0aCA9IHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdDsKKwogICAgIGlmIChjb3VudCA9PSAtMSkgY291bnQgPSBzdHJsZW4oc3RyKTsKKyAgICBzdHJQdHIgPSBzdHI7CiAKLSAgICBpZiAoIUdldFRleHRFeHRlbnRQb2ludCggaGRjLCBzdHIsIGNvdW50LCAmc2l6ZSApKSByZXR1cm4gMDsKLSAgICAKLSAgICBpZiAoZmxhZ3MgJiBEVF9DRU5URVIpIHggPSAocmVjdC0+bGVmdCArIHJlY3QtPnJpZ2h0IC0gc2l6ZS5jeCkgLyAyOwotICAgIGVsc2UgaWYgKGZsYWdzICYgRFRfUklHSFQpIHggPSByZWN0LT5yaWdodCAtIHNpemUuY3g7Ci0gICAgaWYgKGZsYWdzICYgRFRfVkNFTlRFUikgeSA9IChyZWN0LT50b3AgKyByZWN0LT5ib3R0b20gLSBzaXplLmN5KSAvIDI7Ci0gICAgZWxzZSBpZiAoZmxhZ3MgJiBEVF9CT1RUT00pIHkgPSByZWN0LT5ib3R0b20gLSBzaXplLmN5OworICAgIEdldFRleHRNZXRyaWNzKGhkYywgJnRtKTsKKyAgICBpZiAoZmxhZ3MgJiBEVF9FWFRFUk5BTExFQURJTkcpCisJbGggPSB0bS50bUhlaWdodCArIHRtLnRtRXh0ZXJuYWxMZWFkaW5nOworICAgIGVsc2UKKwlsaCA9IHRtLnRtSGVpZ2h0OwogCi0gICAgaWYgKCFUZXh0T3V0KCBoZGMsIHgsIHksIHN0ciwgY291bnQgKSkgcmV0dXJuIDA7CisgICAgaWYgKGZsYWdzICYgRFRfVEFCU1RPUCkKKwl0YWJzdG9wID0gZmxhZ3MgPj4gODsKKworICAgIGlmIChmbGFncyAmIERUX0VYUEFORFRBQlMpCisgICAgeworCUdldFRleHRFeHRlbnRQb2ludChoZGMsICIgIiwgMSwgJnNpemUpOworCXNwYWNld2lkdGggPSBzaXplLmN4OworCUdldFRleHRFeHRlbnRQb2ludChoZGMsICJvIiwgMSwgJnNpemUpOworCXRhYndpZHRoID0gc2l6ZS5jeCAqIHRhYnN0b3A7CisgICAgfQorCisgICAgZG8KKyAgICB7CisJcHJlZml4X29mZnNldCA9IC0xOworCXN0clB0ciA9IFRFWFRfTmV4dExpbmUoaGRjLCBzdHJQdHIsICZjb3VudCwgbGluZSwgJmxlbiwgd2lkdGgsIGZsYWdzKTsKKworCWlmIChwcmVmaXhfb2Zmc2V0ICE9IC0xKQorCXsKKwkgICAgR2V0VGV4dEV4dGVudFBvaW50KGhkYywgbGluZSwgcHJlZml4X29mZnNldCAtIDEsICZzaXplKTsKKwkgICAgcHJlZml4X3ggPSBzaXplLmN4OworCSAgICBHZXRUZXh0RXh0ZW50UG9pbnQoaGRjLCBsaW5lICsgcHJlZml4X29mZnNldCwgMSwgJnNpemUpOworCSAgICBwcmVmaXhfbGVuID0gc2l6ZS5jeDsKKwl9CisKKwlpZiAoIUdldFRleHRFeHRlbnRQb2ludChoZGMsIGxpbmUsIGxlbiwgJnNpemUpKSByZXR1cm4gMDsKKwlpZiAoZmxhZ3MgJiBEVF9DRU5URVIpIHggPSAocmVjdC0+bGVmdCArIHJlY3QtPnJpZ2h0IC0KKwkJCQkgICAgc2l6ZS5jeCkgLyAyOworCWVsc2UgaWYgKGZsYWdzICYgRFRfUklHSFQpIHggPSByZWN0LT5yaWdodCAtIHNpemUuY3g7CisKKwlpZiAoZmxhZ3MgJiBEVF9TSU5HTEVMSU5FKQorCXsKKwkgICAgaWYgKGZsYWdzICYgRFRfVkNFTlRFUikgeSA9IChyZWN0LT50b3AgKyByZWN0LT5ib3R0b20gLSAKKwkJCQkJIHNpemUuY3kpIC8gMjsKKwkgICAgZWxzZSBpZiAoZmxhZ3MgJiBEVF9CT1RUT00pIHkgPSByZWN0LT5ib3R0b20gLSBzaXplLmN5OworCX0KKworCWlmICghVGV4dE91dChoZGMsIHgsIHksIGxpbmUsIGxlbikpIHJldHVybiAwOworCWlmIChwcmVmaXhfb2Zmc2V0ICE9IC0xKQorCXsKKwkgICAgTW92ZVRvKGhkYywgeCArIHByZWZpeF94LCB5ICsgc2l6ZS5jeSk7CisJICAgIExpbmVUbyhoZGMsIHggKyBwcmVmaXhfeCArIHByZWZpeF9sZW4sIHkgKyBzaXplLmN5KTsKKwl9CisKKwlpZiAoc3RyUHRyKQorCXsKKwkgICAgeSArPSBsaDsKKwkgICAgaWYgKCEoZmxhZ3MgJiBEVF9OT0NMSVApKQorCSAgICB7CisJCWlmICh5ID4gcmVjdC0+Ym90dG9tIC0gbGgpCisJCSAgICBicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgd2hpbGUgKHN0clB0cik7CisKICAgICByZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9idG5sb29rLmMgYi90ZXN0L2J0bmxvb2suYwppbmRleCBkNWI4ZGNkLi4yOGY1NjA4IDEwMDc1NQotLS0gYS90ZXN0L2J0bmxvb2suYworKysgYi90ZXN0L2J0bmxvb2suYwpAQCAtNywyMyArNywyMiBAQAogDQogc3RydWN0DQogew0KLSAgICAgICAgbG9uZyAgICBzdHlsZTsNCi0gICAgICAgIGNoYXIgICAgKnRleHQ7DQorCWxvbmcgICAgc3R5bGU7DQorCWNoYXIgICAgKnRleHQ7DQogfQ0KIGJ1dHRvbltdID0NCiB7DQotICAgICAgICBCU19QVVNIQlVUVE9OLCAgICAgICAgICAiUFVTSEJVVFRPTiIsDQotICAgICAgICBCU19ERUZQVVNIQlVUVE9OLCAgICAgICAiREVGUFVTSEJVVFRPTiIsDQotLyogICAgICAgIEJTX0NIRUNLQk9YLCAgICAgICAgICAgICJDSEVDS0JPWCIsDQotICAgICAgICBCU19BVVRPQ0hFQ0tCT1gsICAgICAgICAiQVVUT0NIRUNLQk9YIiwNCi0gICAgICAgIEJTX1JBRElPQlVUVE9OLCAgICAgICAgICJSQURJT0JVVFRPTiIsDQotICAgICAgICBCU18zU1RBVEUsICAgICAgICAgICAgICAiM1NUQVRFIiwNCi0gICAgICAgIEJTX0FVVE8zU1RBVEUsICAgICAgICAgICJBVVRPM1NUQVRFIiwNCi0gICAgICAgIEJTX0dST1VQQk9YLCAgICAgICAgICAgICJHUk9VUEJPWCIsDQotICAgICAgICBCU19VU0VSQlVUVE9OLCAgICAgICAgICAiVVNFUkJVVFRPTiIsDQotICAgICAgICBCU19BVVRPUkFESU9CVVRUT04sICAgICAiQVVUT1JBRElPQlVUVE9OIiwNCi0gICAgICAgIEJTX1BVU0hCT1gsICAgICAgICAgICAgICJQVVNIQk9YIg0KLSovfTsNCisJQlNfUFVTSEJVVFRPTiwgICAgICAgICAgIlBVU0hCVVRUT04iLA0KKwlCU19ERUZQVVNIQlVUVE9OLCAgICAgICAiREVGUFVTSEJVVFRPTiIsDQorCUJTX0NIRUNLQk9YLCAgICAgICAgICAgICJDSEVDS0JPWCIsDQorCUJTX0FVVE9DSEVDS0JPWCwgICAgICAgICJBVVRPQ0hFQ0tCT1giLA0KKwlCU19SQURJT0JVVFRPTiwgICAgICAgICAiUkFESU9CVVRUT04iLA0KKwlCU18zU1RBVEUsICAgICAgICAgICAgICAiM1NUQVRFIiwNCisJQlNfQVVUTzNTVEFURSwgICAgICAgICAgIkFVVE8zU1RBVEUiLA0KKwlCU19HUk9VUEJPWCwgICAgICAgICAgICAiR1JPVVBCT1giLA0KKwlCU19VU0VSQlVUVE9OLCAgICAgICAgICAiVVNFUkJVVFRPTiIsDQorCUJTX0FVVE9SQURJT0JVVFRPTiwgICAgICJBVVRPUkFESU9CVVRUT04iDQorfTsNCiANCiAjZGVmaW5lIE5VTSAoc2l6ZW9mIGJ1dHRvbiAvIHNpemVvZiBidXR0b25bMF0pDQogDQpAQCAtNzIsMTggKzcxLDE4IEBACiANCiBsb25nIEZBUiBQQVNDQUwgX2V4cG9ydCBXbmRQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pDQogew0KLSAgICAgICAgc3RhdGljIGNoYXIgc3pQcm1bXSAgICA9ICJ3UGFyYW0gICAgICBMT1dPUkQobFBhcmFtKSAgSElXT1JEKGxQYXJhbSkiLA0KLSAgICAgICAgICAgICAgICAgICAgc3pUb3BbXSAgICA9ICJDb250cm9sIElEICBXaW5kb3cgSGFuZGxlICAgTm90aWZpY2F0aW9uIiwNCi0gICAgICAgICAgICAgICAgICAgIHN6VW5kW10gICAgPSAiX19fX19fX19fXyAgX19fX19fX19fX19fXyAgIF9fX19fX19fX19fXyIsDQotICAgICAgICAgICAgICAgICAgICBzekZvcm1hdFtdID0gIiAlNXUgICAgICAgICAgJTRYICAgICAgICAgICU1dSIsDQotICAgICAgICAgICAgICAgICAgICBzekJ1ZmZlcls1MF07DQotICAgICAgICBzdGF0aWMgSFdORCBod25kQnV0dG9uW05VTV07DQotICAgICAgICBzdGF0aWMgUkVDVCByZWN0Ow0KLSAgICAgICAgc3RhdGljIGludCAgY3hDaGFyLCBjeUNoYXI7DQorCXN0YXRpYyBjaGFyIHN6UHJtW10gICAgPSAid1BhcmFtICAgICAgTE9XT1JEKGxQYXJhbSkgIEhJV09SRChsUGFyYW0pIiwNCisJCSAgICBzelRvcFtdICAgID0gIkNvbnRyb2wgSUQgIFdpbmRvdyBIYW5kbGUgICBOb3RpZmljYXRpb24iLA0KKwkJICAgIHN6VW5kW10gICAgPSAiX19fX19fX19fXyAgX19fX19fX19fX19fXyAgIF9fX19fX19fX19fXyIsDQorCQkgICAgc3pGb3JtYXRbXSA9ICIgJTV1ICAgICAgICAgICU0WCAgICAgICAgICAlNXUiLA0KKwkJICAgIHN6QnVmZmVyWzUwXTsNCisJc3RhdGljIEhXTkQgaHduZEJ1dHRvbltOVU1dOw0KKwlzdGF0aWMgUkVDVCByZWN0Ow0KKwlzdGF0aWMgaW50ICBjeENoYXIsIGN5Q2hhcjsNCiAJSERDICAgICAgICAgaGRjOw0KIAlQQUlOVFNUUlVDVCBwczsNCi0gICAgICAgIGludCAgICAgICAgIGk7DQotICAgICAgICBURVhUTUVUUklDICB0bTsNCisJaW50ICAgICAgICAgaTsNCisJVEVYVE1FVFJJQyAgdG07DQogDQogCXN3aXRjaCAobWVzc2FnZSkNCiAJew0KZGlmZiAtLWdpdCBhL3Rlc3QvYnRubG9vay5leGUgYi90ZXN0L2J0bmxvb2suZXhlCmluZGV4IGI2NWE1ZWQuLjEzNGM4YTEgMTAwNzU1Ci0tLSBhL3Rlc3QvYnRubG9vay5leGUKKysrIGIvdGVzdC9idG5sb29rLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2JsYW5rLmJtcCBiL3Rlc3QvaHlwZXJvaWQvYmxhbmsuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg0MGFmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvYmxhbmsuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9ib21iLmJtcCBiL3Rlc3QvaHlwZXJvaWQvYm9tYi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2RlNGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9ib21iLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvY29weWluZy50eHQgYi90ZXN0L2h5cGVyb2lkL2NvcHlpbmcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDY0ZWM1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvY29weWluZy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotIA0KLSAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UNCi0gICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEsIEZlYnJ1YXJ5IDE5ODkNCi0NCi0gQ29weXJpZ2h0IChDKSAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KLSAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0ENCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzDQotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVhbWJsZQ0KLQ0KLSAgVGhlIGxpY2Vuc2UgYWdyZWVtZW50cyBvZiBtb3N0IHNvZnR3YXJlIGNvbXBhbmllcyB0cnkgdG8ga2VlcCB1c2Vycw0KLWF0IHRoZSBtZXJjeSBvZiB0aG9zZSBjb21wYW5pZXMuICBCeSBjb250cmFzdCwgb3VyIEdlbmVyYWwgUHVibGljDQotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQ0KLXNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGUNCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzDQotc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0Lg0KLVlvdSBjYW4gdXNlIGl0IGZvciB5b3VyIHByb2dyYW1zLCB0b28uDQotDQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90DQotcHJpY2UuICBTcGVjaWZpY2FsbHksIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGRlc2lnbmVkIHRvIG1ha2UNCi1zdXJlIHRoYXQgeW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZ2l2ZSBhd2F5IG9yIHNlbGwgY29waWVzIG9mIGZyZWUNCi1zb2Z0d2FyZSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LA0KLXRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUNCi1wcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuDQotDQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkDQotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLg0KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91DQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0Lg0KLQ0KLSAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBhIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyDQotZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0DQoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUNCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCB0ZWxsIHRoZW0gdGhlaXIgcmlnaHRzLg0KLQ0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZA0KLSgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksDQotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4NCi0NCi0gIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluDQotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUNCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UNCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbw0KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsDQotYXV0aG9ycycgcmVwdXRhdGlvbnMuDQotDQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZA0KLW1vZGlmaWNhdGlvbiBmb2xsb3cuDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotDQotICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTg0KLQ0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2gNCi1jb250YWlucyBhIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZQ0KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUNCi0iUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZA0KLW9uIHRoZSBQcm9ncmFtIiBtZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IHdvcmsgY29udGFpbmluZyB0aGUNCi1Qcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucy4gIEVhY2gNCi1saWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuDQotDQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlDQotY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQNCi1hcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kDQotZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcw0KLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55DQotb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mDQotdHJhbnNmZXJyaW5nIGEgY29weS4NCi0NCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YNCi1pdCwgYW5kIGNvcHkgYW5kIGRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBvZiBQYXJhZ3JhcGgNCi0xIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIHRoZSBmb2xsb3dpbmc6DQotDQotICAgIGEpIGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQNCi0gICAgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlOyBhbmQNCi0NCi0gICAgYikgY2F1c2UgdGhlIHdob2xlIG9mIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdA0KLSAgICBpbiB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0IHRoZXJlb2YsIGVpdGhlcg0KLSAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgdG8gYmUgbGljZW5zZWQgYXQgbm8gY2hhcmdlIHRvIGFsbA0KLSAgICB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGV4Y2VwdA0KLSAgICB0aGF0IHlvdSBtYXkgY2hvb3NlIHRvIGdyYW50IHdhcnJhbnR5IHByb3RlY3Rpb24gdG8gc29tZSBvciBhbGwNCi0gICAgdGhpcmQgcGFydGllcywgYXQgeW91ciBvcHRpb24pLg0KLQ0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5IHdoZW4NCi0gICAgcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgdXNlDQotICAgIGluIHRoZSBzaW1wbGVzdCBhbmQgbW9zdCB1c3VhbCB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4NCi0gICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZQ0KLSAgICB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhDQotICAgIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyIHRoZXNlDQotICAgIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIEdlbmVyYWwNCi0gICAgUHVibGljIExpY2Vuc2UuDQotDQotICAgIGQpIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhDQotICAgIGNvcHksIGFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4NCi0gICAgZXhjaGFuZ2UgZm9yIGEgZmVlLg0KLQ0KLU1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciBpbmRlcGVuZGVudCB3b3JrIHdpdGggdGhlIFByb2dyYW0gKG9yIGl0cw0KLWRlcml2YXRpdmUpIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nDQotdGhlIG90aGVyIHdvcmsgdW5kZXIgdGhlIHNjb3BlIG9mIHRoZXNlIHRlcm1zLg0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHBvcnRpb24gb3IgZGVyaXZhdGl2ZSBvZg0KLWl0LCB1bmRlciBQYXJhZ3JhcGggMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZg0KLVBhcmFncmFwaHMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOg0KLQ0KLSAgICBhKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlDQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZg0KLSAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLA0KLQ0KLSAgICBiKSBhY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQ0KLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHkgZnJlZSAoZXhjZXB0IGZvciBhIG5vbWluYWwgY2hhcmdlDQotICAgIGZvciB0aGUgY29zdCBvZiBkaXN0cmlidXRpb24pIGEgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZQ0KLSAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YNCi0gICAgUGFyYWdyYXBocyAxIGFuZCAyIGFib3ZlOyBvciwNCi0NCi0gICAgYykgYWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB3aGVyZSB0aGUNCi0gICAgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcw0KLSAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQ0KLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gYWxvbmUuKQ0KLQ0KLVNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciBtYWtpbmcNCi1tb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgZmlsZSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMNCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWluczsgYnV0LCBhcyBhIHNwZWNpYWwNCi1leGNlcHRpb24sIGl0IG5lZWQgbm90IGluY2x1ZGUgc291cmNlIGNvZGUgZm9yIG1vZHVsZXMgd2hpY2ggYXJlIHN0YW5kYXJkDQotbGlicmFyaWVzIHRoYXQgYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlDQotZmlsZSBydW5zLCBvciBmb3Igc3RhbmRhcmQgaGVhZGVyIGZpbGVzIG9yIGRlZmluaXRpb25zIGZpbGVzIHRoYXQNCi1hY2NvbXBhbnkgdGhhdCBvcGVyYXRpbmcgc3lzdGVtLg0KLQ0KLSAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBkaXN0cmlidXRlIG9yIHRyYW5zZmVyIHRoZQ0KLVByb2dyYW0gZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuDQotQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2Zlcg0KLXRoZSBQcm9ncmFtIGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHRvIHVzZQ0KLXRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQNCi1jb3BpZXMsIG9yIHJpZ2h0cyB0byB1c2UgY29waWVzLCBmcm9tIHlvdSB1bmRlciB0aGlzIEdlbmVyYWwgUHVibGljDQotTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMNCi1yZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLg0KLQ0KLSAgNS4gQnkgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQNCi1vbiB0aGUgUHJvZ3JhbSkgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIGxpY2Vuc2UgdG8gZG8gc28sDQotYW5kIGFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuDQotDQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlDQotUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwNCi1saWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvIHRoZXNlDQotdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZQ0KLXJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uDQotDQotDQotDQotICA3LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucw0KLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbA0KLWJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bw0KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLg0KLQ0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0NCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55DQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlDQotU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZg0KLXRoZSBsaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQ0KLUZvdW5kYXRpb24uDQotDQotICA4LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUNCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yDQotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlDQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzDQotbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMNCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kDQotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PIFdBUlJBTlRZDQotDQotICA5LiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQ0KLUZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTg0KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMNCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRA0KLU9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GDQotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUw0KLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUNCi1QUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywNCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4NCi0NCi0gIDEwLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcNCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SDQotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywNCi1JTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcNCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEDQotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZDQotWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVINCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUNCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuDQotDQotICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotDQotDQotDQotICAgICAgICBBcHBlbmRpeDogSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zDQotDQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0DQotcG9zc2libGUgdXNlIHRvIGh1bWFuaXR5LCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQNCi1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZQ0KLXRlcm1zLg0KLQ0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QgdG8NCi1hdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleQ0KLXRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlDQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4NCi0NCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4NCi0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+DQotDQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5DQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikNCi0gICAgYW55IGxhdGVyIHZlcnNpb24uDQotDQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQotDQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlDQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KLQ0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLg0KLQ0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMNCi13aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOg0KLQ0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eHggbmFtZSBvZiBhdXRob3INCi0gICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLg0KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0DQotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4NCi0NCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUNCi1hcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlDQotY29tbWFuZHMgeW91IHVzZSBtYXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdw0KLWMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXINCi1wcm9ncmFtLg0KLQ0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyDQotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYNCi1uZWNlc3NhcnkuICBIZXJlIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6DQotDQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQ0KLSAgcHJvZ3JhbSBgR25vbW92aXNpb24nIChhIHByb2dyYW0gdG8gZGlyZWN0IGNvbXBpbGVycyB0byBtYWtlIHBhc3Nlcw0KLSAgYXQgYXNzZW1ibGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuDQotDQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkNCi0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlDQotDQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCENCi0gDQpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5jIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzk2ZDU1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NTEgKzAsMCBAQAotLy8NCi0vLyBIWVBFUk9JRCAtIGEgbmVhdG8gZ2FtZQ0KLS8vDQotLy8gVmVyc2lvbjogMS4xICBDb3B5cmlnaHQgKEMpIDE5OTAsOTEgSHV0Y2hpbnMgU29mdHdhcmUNCi0vLyAgICAgIFRoaXMgc29mdHdhcmUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlDQotLy8gICAgICBQbGVhc2UgcmVhZCB0aGUgYXNzb2NpYXRlZCBsZWdhbCBkb2N1bWVudGF0aW9uDQotLy8gQXV0aG9yOiBFZHdhcmQgSHV0Y2hpbnMNCi0vLyBJbnRlcm5ldDogZWFoMUBjZWMxLnd1c3RsLmVkdQ0KLS8vIFVTTmFpbDogYy9vIEVkd2FyZCBIdXRjaGlucywgNjMgUmlkZ2Vtb29yIERyLiwgQ2xheXRvbiwgTU8sIDYzMTA1DQotLy8gUmV2aXNpb25zOg0KLS8vIDEwLzMxLzkxIG1hZGUgZ2FtZSBiZXR0ZXIvaGFyZGVyIC0gRWQuDQotLy8NCi0vLyBNdXNpYzogUi5FLk0uL1RoZSBDdXJlL01pbmlzdHJ5L0Zyb250IDI0Mi9UaGUgU21pdGhzL05ldyBPcmRlci9IZW5kcml4Li4uDQotLy8gQmVlcnM6IEJhc3MgQWxlLCBBdWdzYmVyZ2VyIERhcmsNCi0vLw0KLQ0KLSNpbmNsdWRlICJoeXBlcm9pZC5oIg0KLQ0KLS8vDQotLy8gaW1wb3J0cw0KLS8vDQotDQotSU1QT1JUIFBPSU5UICAgICAgICBMZXR0ZXJQYXJ0W10gRlJPTSggcm9pZHN1cHAuYyApOw0KLUlNUE9SVCBOUFNUUiAgICAgICAgc3pOdW1iZXJEZXNjW10gRlJPTSggcm9pZHN1cHAuYyApOw0KLUlNUE9SVCBOUFNUUiAgICAgICAgc3pMZXR0ZXJEZXNjW10gRlJPTSggcm9pZHN1cHAuYyApOw0KLQ0KLS8vDQotLy8gZ2xvYmFscw0KLS8vDQotDQotR0xPQkFMIENIQVIgICAgICAgICBzekFwcE5hbWVbMzJdOw0KLUdMT0JBTCBIQU5ETEUgICAgICAgaEFwcEluc3Q7DQotR0xPQkFMIEhXTkQgICAgICAgICBoQXBwV25kOw0KLUdMT0JBTCBIUEFMRVRURSAgICAgaEFwcFBhbGV0dGU7DQotR0xPQkFMIElOVCAgICAgICAgICBuRHJhd0RlbGF5Ow0KLUdMT0JBTCBJTlQgICAgICAgICAgbkxldmVsOw0KLUdMT0JBTCBJTlQgICAgICAgICAgblNhZmU7DQotR0xPQkFMIElOVCAgICAgICAgICBuU2hpZWxkOw0KLUdMT0JBTCBJTlQgICAgICAgICAgbkJvbWI7DQotR0xPQkFMIElOVCAgICAgICAgICBuQmFkR3V5czsNCi1HTE9CQUwgTE9ORyAgICAgICAgIGxTY29yZTsNCi1HTE9CQUwgTE9ORyAgICAgICAgIGxMYXN0TGlmZTsNCi1HTE9CQUwgTE9ORyAgICAgICAgIGxIaWdoU2NvcmU7DQotR0xPQkFMIEJPT0wgICAgICAgICBiUmVzdGFydDsNCi1HTE9CQUwgQk9PTCAgICAgICAgIGJQYXVzZWQ7DQotR0xPQkFMIEJPT0wgICAgICAgICBiQlc7DQotR0xPQkFMIElOVCAgICAgICAgICB2a1NobGQ7DQotR0xPQkFMIElOVCAgICAgICAgICB2a0Nsa3c7DQotR0xPQkFMIElOVCAgICAgICAgICB2a0N0ckNsa3c7DQotR0xPQkFMIElOVCAgICAgICAgICB2a1RocnN0Ow0KLUdMT0JBTCBJTlQgICAgICAgICAgdmtSdlRocnN0Ow0KLUdMT0JBTCBJTlQgICAgICAgICAgdmtGaXJlOw0KLUdMT0JBTCBJTlQgICAgICAgICAgdmtCb21iOw0KLUdMT0JBTCBOUE9CSiAgICAgICAgbnBQbGF5ZXI7DQotR0xPQkFMIExJU1QgICAgICAgICBGcmVlTGlzdDsNCi1HTE9CQUwgTElTVCAgICAgICAgIFJvaWRMaXN0Ow0KLUdMT0JBTCBMSVNUICAgICAgICAgU2hvdExpc3Q7DQotR0xPQkFMIExJU1QgICAgICAgICBGbGFtZUxpc3Q7DQotR0xPQkFMIExJU1QgICAgICAgICBTcGlubmVyTGlzdDsNCi1HTE9CQUwgTElTVCAgICAgICAgIEh1bnRlckxpc3Q7DQotR0xPQkFMIExJU1QgICAgICAgICBIdW50ZXJTaG90TGlzdDsNCi1HTE9CQUwgTElTVCAgICAgICAgIFN3YXJtZXJMaXN0Ow0KLUdMT0JBTCBMSVNUICAgICAgICAgTGV0dGVyTGlzdDsNCi1HTE9CQUwgTElTVCAgICAgICAgIEJvbnVzTGlzdDsNCi1HTE9CQUwgSU5UICAgICAgICAgIG5Db3NbREVHUkVFX1NJWkVdOw0KLUdMT0JBTCBJTlQgICAgICAgICAgblNpbltERUdSRUVfU0laRV07DQotR0xPQkFMIEhQRU4gICAgICAgICBoUGVuW1BBTEVUVEVfU0laRV07DQotR0xPQkFMIE9CSiAgICAgICAgICBPYmpbTUFYX09CSlNdOw0KLUdMT0JBTCBIQklUTUFQICAgICAgaEJpdG1hcFtJREJfTUFYXTsNCi0NCi0vLw0KLS8vIGxvY2Fscw0KLS8vDQotDQotTE9DQUwgRFdPUkQgICAgICAgICBkd1NlZWQ7DQotTE9DQUwgSU5UICAgICAgICAgICBuU2NvcmVMZW47DQotTE9DQUwgQ0hBUiAgICAgICAgICBzelNjb3JlWzQwXTsNCi1MT0NBTCBSRUNUICAgICAgICAgIHJlY3RTY29yZUNsaXA7DQotTE9DQUwgUkVDVCAgICAgICAgICByZWN0U2hvdENsaXA7DQotTE9DQUwgUE9JTlQgICAgICAgICBQbGF5ZXJbXSA9DQoteyB7MCwgMH0sIHsxNjAsIDE1MH0sIHswLCAyNTB9LCB7OTYsIDE1MH0sIHswLCAwfSB9Ow0KLUxPQ0FMIFBPSU5UICAgICAgICAgU3Bpbm5lcltdID0NCi17IHsxNjAsIDE1MH0sIHsyMjQsIDEwMH0sIHs5NiwgMTAwfSwgezMyLCAxNTB9LCB7MTYwLCAxNTB9IH07DQotTE9DQUwgUE9JTlQgICAgICAgICBTd2FybWVyW10gPQ0KLXsgezAsIDEwMH0sIHs2NCwgMTAwfSwgezEyOCwgMTAwfSwgezE5MiwgMTAwfSwgezAsIDEwMH0gfTsNCi1MT0NBTCBQT0lOVCAgICAgICAgIEh1bnRlcltdID0NCi17DQotCXsxNjAsIDE1MH0sIHswLCAyNTB9LCB7MTkyLCAzMH0sIHs2NCwgMzB9LA0KLQl7MCwgMjUwfSwgezk2LCAxNTB9LCB7MTI4LCAxNTB9LCB7MTYwLCAxNTB9DQotfTsNCi1MT0NBTCBQT0lOVCAgICAgICAgIEJvbnVzW10gPQ0KLXsgezAsIDE1MH0sIHsxMDIsIDE1MH0sIHsyMDUsIDE1MH0sIHs1MSwgMTUwfSwgezE1NCwgMTUwfSwgezAsIDE1MH0gfTsNCi0NCi0vLw0KLS8vIEtpbGxCYWRHdXkgLSBraWxsIG9mZiBhIGJhZGd1eSAobWFkZSBpbnRvIGEgbWFjcm8pDQotLy8NCi0NCi0jZGVmaW5lIEtpbGxCYWRHdXkoKSBcDQotKCgtLW5CYWRHdXlzIDw9IDApPyhTZXRSZXN0YXJ0KCBSRVNUQVJUX05FWFRMRVZFTCApLFRSVUUpOkZBTFNFKQ0KLQ0KLS8vDQotLy8gYXJhbmQgLSBwc2V1ZG9yYW5kb20gbnVtYmVyIGZyb20gMCB0byB4LTEgKHRoYW5rcyBhbnRtYW4hKQ0KLS8vDQotDQotSU5UIE5FQVIgUEFTQ0FMIGFyYW5kKCBJTlQgeCApDQotew0KLQlkd1NlZWQgPSBkd1NlZWQgKiAweDM0M2ZkICsgMHgyNjllYzM7DQotCXJldHVybiggKElOVCkoKChkd1NlZWQgPj4gMTYpICYgMHg3ZmZmKSAqIHggPj4gMTUpICk7DQotfQ0KLQ0KLS8vDQotLy8gQWRkSGVhZCAtIGFkZCBhbiBvYmplY3QgdG8gdGhlIGhlYWQgb2YgYSBsaXN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIEFkZEhlYWQoIE5QTElTVCBucExpc3QsIE5QTk9ERSBucE5vZGUgKQ0KLXsNCi0JaWYgKG5wTGlzdC0+bnBIZWFkKQ0KLQl7DQotCQlucE5vZGUtPm5wTmV4dCA9IG5wTGlzdC0+bnBIZWFkOw0KLQkJbnBOb2RlLT5ucFByZXYgPSBOVUxMOw0KLQkJbnBMaXN0LT5ucEhlYWQgPSAobnBMaXN0LT5ucEhlYWQtPm5wUHJldiA9IG5wTm9kZSk7DQotCX0NCi0JZWxzZSAvLyBhZGQgdG8gYW4gZW1wdHkgbGlzdA0KLQl7DQotCQlucExpc3QtPm5wSGVhZCA9IG5wTGlzdC0+bnBUYWlsID0gbnBOb2RlOw0KLQkJbnBOb2RlLT5ucE5leHQgPSBucE5vZGUtPm5wUHJldiA9IE5VTEw7DQotCX0NCi19DQotDQotLy8NCi0vLyBSZW1IZWFkIC0gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgbGlzdA0KLS8vDQotDQotTlBOT0RFIE5FQVIgUEFTQ0FMIFJlbUhlYWQoIE5QTElTVCBucExpc3QgKQ0KLXsNCi0JaWYgKG5wTGlzdC0+bnBIZWFkKQ0KLQl7DQotCQlOUE5PREUgbnBOb2RlID0gbnBMaXN0LT5ucEhlYWQ7DQotCQlpZiAobnBMaXN0LT5ucFRhaWwgIT0gbnBOb2RlKQ0KLQkJew0KLQkJCW5wTGlzdC0+bnBIZWFkID0gbnBOb2RlLT5ucE5leHQ7DQotCQkJbnBOb2RlLT5ucE5leHQtPm5wUHJldiA9IE5VTEw7DQotCQl9DQotCQllbHNlIG5wTGlzdC0+bnBIZWFkID0gbnBMaXN0LT5ucFRhaWwgPSBOVUxMOw0KLQkJcmV0dXJuKCBucE5vZGUgKTsNCi0JfQ0KLQllbHNlIHJldHVybiggTlVMTCApOw0KLX0NCi0NCi0vLw0KLS8vIFJlbW92ZSAtIHJlbW92ZSBhbiBhcmJpdHJhcnkgZWxlbWVudCBmcm9tIGEgbGlzdA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBSZW1vdmUoIE5QTElTVCBucExpc3QsIE5QTk9ERSBucE5vZGUgKQ0KLXsNCi0JaWYgKG5wTm9kZS0+bnBQcmV2KSBucE5vZGUtPm5wUHJldi0+bnBOZXh0ID0gbnBOb2RlLT5ucE5leHQ7DQotCWVsc2UgbnBMaXN0LT5ucEhlYWQgPSBucE5vZGUtPm5wTmV4dDsNCi0JaWYgKG5wTm9kZS0+bnBOZXh0KSBucE5vZGUtPm5wTmV4dC0+bnBQcmV2ID0gbnBOb2RlLT5ucFByZXY7DQotCWVsc2UgbnBMaXN0LT5ucFRhaWwgPSBucE5vZGUtPm5wUHJldjsNCi19DQotDQotLy8NCi0vLyBEcmF3T2JqZWN0IC0gZHJhdyBhIHNpbmdsZSBvYmplY3QNCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgRHJhd09iamVjdCggSERDIGhEQywgTlBPQkogbnBPYmogKQ0KLXsNCi0JSU5UICAgICAgICAgICAgIG5DbnQ7DQotCUlOVCAgICAgICAgICAgICBuRGlyID0gKG5wT2JqLT5uRGlyICs9IG5wT2JqLT5uU3Bpbik7DQotCUlOVCAgICAgICAgICAgICB4ID0gKG5wT2JqLT5Qb3MueCArPSBucE9iai0+VmVsLngpOw0KLQlJTlQgICAgICAgICAgICAgeSA9IChucE9iai0+UG9zLnkgKz0gbnBPYmotPlZlbC55KTsNCi0JUE9JTlQgICAgICAgICAgIFB0c1tNQVhfUFRTXTsNCi0NCi0JaWYgKHggPCAtQ0xJUF9DT09SRCkgbnBPYmotPlBvcy54ID0geCA9IENMSVBfQ09PUkQ7DQotCWVsc2UgaWYgKHggPiBDTElQX0NPT1JEKSBucE9iai0+UG9zLnggPSB4ID0gLUNMSVBfQ09PUkQ7DQotCWlmICh5IDwgLUNMSVBfQ09PUkQpIG5wT2JqLT5Qb3MueSA9IHkgPSBDTElQX0NPT1JEOw0KLQllbHNlIGlmICh5ID4gQ0xJUF9DT09SRCkgbnBPYmotPlBvcy55ID0geSA9IC1DTElQX0NPT1JEOw0KLQ0KLQlmb3IgKG5DbnQgPSBucE9iai0+YnlQdHMgLSAxOyBuQ250ID49IDA7IC0tbkNudCkNCi0Jew0KLQkJV09SRCB3RGVnID0gREVHKCBucE9iai0+UHRzW25DbnRdLnggKyBuRGlyICk7DQotCQlJTlQgbkxlbiA9IG5wT2JqLT5QdHNbbkNudF0ueTsNCi0JCVB0c1tuQ250XS54ID0geCArIE1VTERFRyggbkxlbiwgbkNvc1t3RGVnXSApOw0KLQkJUHRzW25DbnRdLnkgPSB5ICsgTVVMREVHKCBuTGVuLCBuU2luW3dEZWddICk7DQotCX0NCi0NCi0JaWYgKG5wT2JqLT5ieVB0cyA+IDEpDQotCXsNCi0JCVNlbGVjdE9iamVjdCggaERDLCBoUGVuW0JMQUNLXSApOw0KLQkJUG9seWxpbmUoIGhEQywgbnBPYmotPk9sZCwgbnBPYmotPmJ5UHRzICk7DQotCQlpZiAobnBPYmotPm5Db3VudCA+IDApDQotCQl7DQotCQkJU2VsZWN0T2JqZWN0KCBoREMsIGhQZW5bbnBPYmotPmJ5Q29sb3JdICk7DQotCQkJUG9seWxpbmUoIGhEQywgUHRzLCBucE9iai0+YnlQdHMgKTsNCi0JCQlmb3IgKG5DbnQgPSBucE9iai0+YnlQdHMgLSAxOyBuQ250ID49IDA7IC0tbkNudCkNCi0JCQkJbnBPYmotPk9sZFtuQ250XSA9IFB0c1tuQ250XTsNCi0JCX0NCi0JfQ0KLQllbHNlIC8vIGp1c3QgYSBwb2ludA0KLQl7DQotCQlTZXRQaXhlbCggaERDLCBucE9iai0+T2xkWzBdLngsIG5wT2JqLT5PbGRbMF0ueSwgUEFMRVRURUlOREVYKCBCTEFDSyApICk7DQotCQlpZiAobnBPYmotPm5Db3VudCA+IDApDQotCQl7DQotCQkJU2V0UGl4ZWwoIGhEQywgUHRzWzBdLngsIFB0c1swXS55LCBQQUxFVFRFSU5ERVgoIG5wT2JqLT5ieUNvbG9yICkgKTsNCi0JCQlucE9iai0+T2xkWzBdID0gUHRzWzBdOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gU2V0UmVzdGFydCAtIHNldCB0aGUgcmVzdGFydCB0aW1lcg0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBTZXRSZXN0YXJ0KCBSRVNUQVJUX01PREUgUmVzdGFydCApDQotew0KLQlQT0lOVCAgICAgICAgICAgUHQ7DQotCUNIQVIgICAgICAgICAgICBzekJ1ZmZbMzJdOw0KLQ0KLQlpZiAoYlJlc3RhcnQpIHJldHVybjsNCi0JU2V0VGltZXIoIGhBcHBXbmQsIFJFU1RBUlRfVElNRVIsIFJFU1RBUlRfREVMQVksIE5VTEwgKTsNCi0JYlJlc3RhcnQgPSBUUlVFOw0KLQ0KLQlQdC54ID0gUHQueSA9IDA7DQotCXN3aXRjaCAoUmVzdGFydCkNCi0Jew0KLQljYXNlIFJFU1RBUlRfR0FNRToNCi0JCVNwaW5MZXR0ZXJzKCAiR0FNRSBPVkVSIiwgUHQsIFB0LCBSRUQsIDQwMCApOw0KLQkJYnJlYWs7DQotCWNhc2UgUkVTVEFSVF9MRVZFTDoNCi0JCVByaW50TGV0dGVycyggIkdFVCBSRUFEWSIsIFB0LCBQdCwgQkxVRSwgMzAwICk7DQotCQlicmVhazsNCi0JY2FzZSBSRVNUQVJUX05FWFRMRVZFTDoNCi0JCXdzcHJpbnRmKCBzekJ1ZmYsICJMRVZFTCAldSIsIG5MZXZlbCArIDEgKTsNCi0JCVByaW50TGV0dGVycyggc3pCdWZmLCBQdCwgUHQsIEJMVUUsIDMwMCApOw0KLQkJYnJlYWs7DQotCX0NCi19DQotDQotLy8NCi0vLyBQcmludFBsYXllck1lc3NhZ2UgLSBzaG93IHRoZSBwbGF5ZXIgYSBzdGF0dXMgbWVzc2FnZQ0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBQcmludFBsYXllck1lc3NhZ2UoIE5QU1RSIG5wc3pUZXh0ICkNCi17DQotCVBPSU5UIFBvcywgVmVsOw0KLQ0KLQlQb3MgPSBucFBsYXllci0+UG9zOw0KLQlQb3MueSAtPSA0MDA7DQotCVZlbC54ID0gMDsNCi0JVmVsLnkgPSAtNTA7DQotCVByaW50TGV0dGVycyggbnBzelRleHQsIFBvcywgVmVsLCBHUkVFTiwgMTUwICk7DQotfQ0KLQ0KLS8vDQotLy8gQWRkRXh0cmFMaWZlIC0gZ2l2ZSB0aGUgcGxheWVyIGFub3RoZXIgbGlmZQ0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBBZGRFeHRyYUxpZmUoIFZPSUQgKQ0KLXsNCi0JUHJpbnRQbGF5ZXJNZXNzYWdlKCAiRVhUUkEgTElGRSIgKTsNCi0JKytucFBsYXllci0+bkNvdW50Ow0KLQlucFBsYXllci0+YnlDb2xvciA9IChCWVRFKShCTEFDSyArIG5wUGxheWVyLT5uQ291bnQpOw0KLQlpZiAobnBQbGF5ZXItPmJ5Q29sb3IgPiBXSElURSkgbnBQbGF5ZXItPmJ5Q29sb3IgPSBXSElURTsNCi19DQotDQotLy8NCi0vLyBIaXQgLSBzb21ldGhpbmcgaGl0IGFuIG9iamVjdCwgZG8gZmlyZXdvcmtzDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIEhpdCggSERDIGhEQywgTlBPQkogbnBPYmogKQ0KLXsNCi0JSU5UICAgICAgICAgICAgIG5DbnQ7DQotDQotCWZvciAobkNudCA9IDA7IG5DbnQgPCA2OyArK25DbnQpDQotCXsNCi0JCU5QT0JKIG5wRmxhbWUgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKTsNCi0JCWlmICghbnBGbGFtZSkgcmV0dXJuOw0KLQkJbnBGbGFtZS0+UG9zLnggPSBucE9iai0+UG9zLng7DQotCQlucEZsYW1lLT5Qb3MueSA9IG5wT2JqLT5Qb3MueTsNCi0JCW5wRmxhbWUtPlZlbC54ID0gbnBPYmotPlZlbC54Ow0KLQkJbnBGbGFtZS0+VmVsLnkgPSBucE9iai0+VmVsLnk7DQotCQlucEZsYW1lLT5uRGlyID0gbnBPYmotPm5EaXIgKyAobkNudCAqIERFR1JFRV9TSVpFKSAvIDY7DQotCQlucEZsYW1lLT5uU3BpbiA9IDA7DQotCQlucEZsYW1lLT5uQ291bnQgPSAxMCArIGFyYW5kKCA4ICk7DQotCQlucEZsYW1lLT5ieUNvbG9yID0gWUVMTE9XOw0KLQkJbnBGbGFtZS0+YnlQdHMgPSAxOw0KLQkJbnBGbGFtZS0+UHRzWzBdLnggPSBucEZsYW1lLT5QdHNbMF0ueSA9IDA7DQotCQlBQ0NFTCggbnBGbGFtZSwgbnBGbGFtZS0+bkRpciwgNTAgLSBucEZsYW1lLT5uQ291bnQgKTsNCi0JCUFkZEhlYWRPYmooICZGbGFtZUxpc3QsIG5wRmxhbWUgKTsNCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIEV4cGxvZGUgLSBleHBsb2RlIGFuIG9iamVjdA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBFeHBsb2RlKCBIREMgaERDLCBOUE9CSiBucE9iaiApDQotew0KLQlJTlQgICAgICAgICAgICAgbkNudCwgblNpemUgPSBucE9iai0+YnlQdHM7DQotDQotCURyYXdPYmplY3QoIGhEQywgbnBPYmogKTsNCi0JZm9yIChuQ250ID0gMDsgbkNudCA8IG5TaXplOyArK25DbnQpDQotCXsNCi0JCU5QT0JKIG5wRmxhbWU7DQotCQlpZiAoYXJhbmQoIDIgKSkgY29udGludWU7DQotCQlpZiAoIShucEZsYW1lID0gUmVtSGVhZE9iaiggJkZyZWVMaXN0ICkpKSByZXR1cm47DQotCQlucEZsYW1lLT5Qb3MueCA9IG5wT2JqLT5Qb3MueDsNCi0JCW5wRmxhbWUtPlBvcy55ID0gbnBPYmotPlBvcy55Ow0KLQkJbnBGbGFtZS0+VmVsLnggPSBucE9iai0+VmVsLng7DQotCQlucEZsYW1lLT5WZWwueSA9IG5wT2JqLT5WZWwueTsNCi0JCW5wRmxhbWUtPm5EaXIgPSBucE9iai0+bkRpciArIG5DbnQgKiBERUdSRUVfU0laRSAvIG5TaXplICsgYXJhbmQoIDMyICk7DQotCQlucEZsYW1lLT5uU3BpbiA9IGFyYW5kKCAzMSApIC0gMTU7DQotCQlucEZsYW1lLT5uQ291bnQgPSAyNSArIGFyYW5kKCAxNiApOw0KLQkJbnBGbGFtZS0+YnlDb2xvciA9IG5wT2JqLT5ieUNvbG9yOw0KLQkJbnBGbGFtZS0+YnlQdHMgPSAyOw0KLQkJbnBGbGFtZS0+UHRzWzBdID0gbnBPYmotPlB0c1tuQ250XTsNCi0JCWlmIChuQ250ID09IG5TaXplIC0gMSkgbnBGbGFtZS0+UHRzWzFdID0gbnBPYmotPlB0c1swXTsNCi0JCWVsc2UgbnBGbGFtZS0+UHRzWzFdID0gbnBPYmotPlB0c1tuQ250ICsgMV07DQotCQlBQ0NFTCggbnBGbGFtZSwgbnBGbGFtZS0+bkRpciwgNjAgLSBucEZsYW1lLT5uQ291bnQgKTsNCi0JCUFkZEhlYWRPYmooICZGbGFtZUxpc3QsIG5wRmxhbWUgKTsNCi0JfQ0KLQlIaXQoIGhEQywgbnBPYmogKTsNCi19DQotDQotLy8NCi0vLyBIaXRQbGF5ZXIgLSBibG93IHVwIHRoZSBwbGF5ZXINCi0vLw0KLQ0KLUJPT0wgTkVBUiBQQVNDQUwgSGl0UGxheWVyKCBIREMgaERDLCBOUE9CSiBucE9iaiApDQotew0KLQlQT0lOVCAgICAgICAgICAgVmVsOw0KLQlJTlQgICAgICAgICAgICAgbk1hc3MsIG5TcGluOw0KLQ0KLQlpZiAoblNhZmUgfHwgKG5wUGxheWVyLT5uQ291bnQgPD0gMCkpIHJldHVybiggRkFMU0UgKTsNCi0NCi0JLy8gcnVtYmxlIGFuZCBzaGFrZSBib3RoIG9iamVjdHMNCi0Jbk1hc3MgPSBucFBsYXllci0+bk1hc3MgKyBucE9iai0+bk1hc3M7DQotDQotCW5TcGluID0gbnBQbGF5ZXItPm5TcGluICsgbnBPYmotPm5TcGluOw0KLQlucE9iai0+blNwaW4gLT0gTXVsRGl2KCBuU3BpbiwgbnBQbGF5ZXItPm5NYXNzLCBuTWFzcyApOw0KLQlucFBsYXllci0+blNwaW4gLT0gTXVsRGl2KCBuU3BpbiwgbnBPYmotPm5NYXNzLCBuTWFzcyApOw0KLQ0KLQlWZWwueCA9IG5wUGxheWVyLT5WZWwueCAtIG5wT2JqLT5WZWwueDsNCi0JVmVsLnkgPSBucFBsYXllci0+VmVsLnkgLSBucE9iai0+VmVsLnk7DQotCW5wT2JqLT5WZWwueCArPSBNdWxEaXYoIFZlbC54LCBucFBsYXllci0+bk1hc3MsIG5NYXNzICk7DQotCW5wT2JqLT5WZWwueSArPSBNdWxEaXYoIFZlbC55LCBucFBsYXllci0+bk1hc3MsIG5NYXNzICk7DQotCW5wUGxheWVyLT5WZWwueCAtPSBNdWxEaXYoIFZlbC54LCBucE9iai0+bk1hc3MsIG5NYXNzICk7DQotCW5wUGxheWVyLT5WZWwueSAtPSBNdWxEaXYoIFZlbC55LCBucE9iai0+bk1hc3MsIG5NYXNzICk7DQotDQotCWlmICgtLW5wUGxheWVyLT5uQ291bnQpDQotCXsNCi0JCW5wUGxheWVyLT5ieUNvbG9yID0gKEJZVEUpKEJMQUNLICsgbnBQbGF5ZXItPm5Db3VudCk7DQotCQlpZiAobnBQbGF5ZXItPmJ5Q29sb3IgPiBXSElURSkgbnBQbGF5ZXItPmJ5Q29sb3IgPSBXSElURTsNCi0JCUhpdCggaERDLCBucFBsYXllciApOw0KLQkJcmV0dXJuKCBUUlVFICk7DQotCX0NCi0NCi0JLy8gZmluYWwgZGVhdGgNCi0JbnBQbGF5ZXItPmJ5Q29sb3IgPSBXSElURTsNCi0JRXhwbG9kZSggaERDLCBucFBsYXllciApOw0KLQlTZXRSZXN0YXJ0KCBSRVNUQVJUX0dBTUUgKTsNCi0JcmV0dXJuKCBGQUxTRSApOw0KLX0NCi0NCi0vLw0KLS8vIENyZWF0ZUxldHRlciAtIG1ha2UgYSBuZXcgbGV0dGVyIG9iamVjdA0KLS8vDQotDQotTlBPQkogRkFSIFBBU0NBTCBDcmVhdGVMZXR0ZXIoIENIQVIgY0xldHRlciwgSU5UIG5TaXplICkNCi17DQotCU5QT0JKICAgICAgICAgICBucEx0cjsNCi0JSU5UICAgICAgICAgICAgIG5DbnQ7DQotCU5QU1RSICAgICAgICAgICBucERlc2M7DQotDQotCWlmIChjTGV0dGVyID49ICcwJyAmJiBjTGV0dGVyIDw9ICc5JykgbnBEZXNjID0gc3pOdW1iZXJEZXNjW2NMZXR0ZXIgLSAnMCddOw0KLQllbHNlIGlmIChjTGV0dGVyID49ICdBJyAmJiBjTGV0dGVyIDw9ICdaJykgbnBEZXNjID0gc3pMZXR0ZXJEZXNjW2NMZXR0ZXIgLSAnQSddOw0KLQllbHNlIGlmIChjTGV0dGVyID49ICdhJyAmJiBjTGV0dGVyIDw9ICd6JykgbnBEZXNjID0gc3pMZXR0ZXJEZXNjW2NMZXR0ZXIgLSAnYSddOw0KLQllbHNlIGlmIChjTGV0dGVyID09ICcuJykgbnBEZXNjID0gImwiOw0KLQllbHNlIHJldHVybiggTlVMTCApOw0KLQ0KLQlpZiAobnBMdHIgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCi0Jew0KLQkJbnBMdHItPm5NYXNzID0gMTsNCi0JCW5wTHRyLT5uRGlyID0gMDsNCi0JCW5wTHRyLT5uU3BpbiA9IDA7DQotCQlucEx0ci0+bkNvdW50ID0gNDA7DQotCQlucEx0ci0+YnlDb2xvciA9IFdISVRFOw0KLQkJbnBMdHItPmJ5UHRzID0gKEJZVEUpKG5DbnQgPSBzdHJsZW4oIG5wRGVzYyApKTsNCi0JCXdoaWxlIChuQ250LS0pDQotCQl7DQotCQkJbnBMdHItPlB0c1tuQ250XSA9IExldHRlclBhcnRbbnBEZXNjW25DbnRdIC0gJ2EnXTsNCi0JCQlucEx0ci0+UHRzW25DbnRdLnkgPSBNdWxEaXYoIG5wTHRyLT5QdHNbbkNudF0ueSwgblNpemUsIExFVFRFUl9NQVggKTsNCi0JCX0NCi0JCUFkZEhlYWRPYmooICZMZXR0ZXJMaXN0LCBucEx0ciApOw0KLQl9DQotCXJldHVybiggbnBMdHIgKTsNCi19DQotDQotLy8NCi0vLyBEcmF3TGV0dGVycyAtIGRyYXcgbGV0dGVycyBhbmQgc3VjaA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBEcmF3TGV0dGVycyggSERDIGhEQyApDQotew0KLQlOUE9CSiAgICAgICAgICAgbnBMdHIsIG5wTmV4dDsNCi0NCi0JZm9yIChucEx0ciA9IEhlYWRPYmooICZMZXR0ZXJMaXN0ICk7IG5wTHRyOyBucEx0ciA9IG5wTmV4dCkNCi0Jew0KLQkJbnBOZXh0ID0gTmV4dE9iaiggbnBMdHIgKTsNCi0JCXN3aXRjaCAoLS1ucEx0ci0+bkNvdW50KQ0KLQkJew0KLQkJY2FzZSAzOg0KLQkJCS0tbnBMdHItPmJ5Q29sb3I7DQotCQkJYnJlYWs7DQotCQljYXNlIDA6DQotCQkJUmVtb3ZlT2JqKCAmTGV0dGVyTGlzdCwgbnBMdHIgKTsNCi0JCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wTHRyICk7DQotCQkJYnJlYWs7DQotCQl9DQotCQlEcmF3T2JqZWN0KCBoREMsIG5wTHRyICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBDcmVhdGVCb251cyAtIG1ha2UgYSBuZXcgYm9udXMgb2JqZWN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIENyZWF0ZUJvbnVzKCBWT0lEICkNCi17DQotCU5QT0JKICAgICAgICAgICBucEJvbnVzOw0KLQlJTlQgICAgICAgICAgICAgbkNudDsNCi0NCi0JaWYgKG5wQm9udXMgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCi0Jew0KLQkJbnBCb251cy0+UG9zLnggPSBhcmFuZCggQ0xJUF9DT09SRCAqIDIgKSAtIENMSVBfQ09PUkQ7DQotCQlucEJvbnVzLT5Qb3MueSA9IC1DTElQX0NPT1JEOw0KLQkJbnBCb251cy0+VmVsLnggPSBucEJvbnVzLT5WZWwueSA9IDA7DQotCQlucEJvbnVzLT5uRGlyID0gYXJhbmQoIERFR1JFRV9TSVpFICk7DQotCQlucEJvbnVzLT5uU3BpbiA9IChhcmFuZCggMiApID8gMTIgOiAtMTIpOw0KLQkJbnBCb251cy0+bkNvdW50ID0gYXJhbmQoIDQgKSArIDE7DQotCQlucEJvbnVzLT5uRGVsYXkgPSA2NCArIGFyYW5kKCAxMjggKTsNCi0JCW5wQm9udXMtPm5NYXNzID0gMTsNCi0JCW5wQm9udXMtPmJ5Q29sb3IgPSAoQllURSkoV0hJVEUgKyAobnBCb251cy0+bkNvdW50ICogMikpOw0KLQkJbnBCb251cy0+YnlQdHMgPSBESU0oQm9udXMpOw0KLQkJZm9yIChuQ250ID0gMDsgbkNudCA8IERJTShCb251cyk7ICsrbkNudCkNCi0JCQlucEJvbnVzLT5QdHNbbkNudF0gPSBCb251c1tuQ250XTsNCi0JCUFDQ0VMKCBucEJvbnVzLCBucEJvbnVzLT5uRGlyLCAzMCArIG5MZXZlbCAqIDIgKTsNCi0JCUFkZEhlYWRPYmooICZCb251c0xpc3QsIG5wQm9udXMgKTsNCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIERyYXdCb251c2VzIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgYm9udXMgbGlzdA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBEcmF3Qm9udXNlcyggSERDIGhEQyApDQotew0KLQlOUE9CSiAgICAgICAgICAgbnBCb251cywgbnBOZXh0Ow0KLQlMT0NBTCBJTlQgICAgICAgbk5leHRCb251cyA9IDEwMDA7DQotDQotCWlmIChuQmFkR3V5cyAmJiAoLS1uTmV4dEJvbnVzIDwgMCkpDQotCXsNCi0JCUNyZWF0ZUJvbnVzKCk7DQotCQluTmV4dEJvbnVzID0gMTAwMDsNCi0JfQ0KLQ0KLQlmb3IgKG5wQm9udXMgPSBIZWFkT2JqKCAmQm9udXNMaXN0ICk7IG5wQm9udXM7IG5wQm9udXMgPSBucE5leHQpDQotCXsNCi0JCU5QT0JKICAgICAgICAgICBucFNob3Q7DQotCQlJTlQgICAgICAgICAgICAgbkRlbHRhOw0KLQkJUkVDVCAgICAgICAgICAgIHJlY3Q7DQotDQotCQlucE5leHQgPSBOZXh0T2JqKCBucEJvbnVzICk7DQotDQotCQlNS1JFQ1QoICZyZWN0LCBucEJvbnVzLT5Qb3MsIDE1MCApOw0KLQ0KLQkJaWYgKFBUSU5SRUNUKCAmcmVjdCwgbnBQbGF5ZXItPlBvcyApKQ0KLQkJew0KLQkJCWlmIChucFBsYXllci0+bkNvdW50ID4gMCkgc3dpdGNoIChucEJvbnVzLT5uQ291bnQpDQotCQkJew0KLQkJCWNhc2UgMToNCi0JCQkJew0KLQkJCQkJQ0hBUiBzekJ1ZmZbMzJdOw0KLQkJCQkJTE9ORyBsQm9udXMgPSAxMDAwTCAqIG5MZXZlbDsNCi0JCQkJCWlmIChsQm9udXMgPT0gMCkgbEJvbnVzID0gNTAwOw0KLQkJCQkJbFNjb3JlICs9IGxCb251czsNCi0JCQkJCXdzcHJpbnRmKCBzekJ1ZmYsICIlbGQiLCBsQm9udXMgKTsNCi0JCQkJCVByaW50UGxheWVyTWVzc2FnZSggc3pCdWZmICk7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotCQkJY2FzZSAyOg0KLQkJCQluU2FmZSA9IDE1Ow0KLQkJCQkrK25TaGllbGQ7DQotCQkJCW5wUGxheWVyLT5ieUNvbG9yID0gR1JFRU47DQotCQkJCVByaW50UGxheWVyTWVzc2FnZSggIkVYVFJBIFNISUVMRCIgKTsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSAzOg0KLQkJCQkrK25Cb21iOw0KLQkJCQlQcmludFBsYXllck1lc3NhZ2UoICJFWFRSQSBCT01CIiApOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIDQ6DQotCQkJCUFkZEV4dHJhTGlmZSgpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJbnBCb251cy0+bkNvdW50ID0gMDsNCi0JCQlFeHBsb2RlKCBoREMsIG5wQm9udXMgKTsNCi0JCQlSZW1vdmVPYmooICZCb251c0xpc3QsIG5wQm9udXMgKTsNCi0JCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wQm9udXMgKTsNCi0JCX0NCi0JCWVsc2UgaWYgKElOVFJFQ1QoJnJlY3QsICZyZWN0U2hvdENsaXApKQ0KLQkJew0KLQkJCWZvciAobnBTaG90ID0gSGVhZE9iaiggJlNob3RMaXN0ICk7IG5wU2hvdDsgbnBTaG90ID0gTmV4dE9iaiggbnBTaG90ICkpDQotCQkJew0KLQkJCQlpZiAoIVBUSU5SRUNUKCAmcmVjdCwgbnBTaG90LT5Qb3MgKSkgY29udGludWU7DQotCQkJCW5wU2hvdC0+bkNvdW50ID0gMTsNCi0JCQkJbnBCb251cy0+bkNvdW50ID0gMDsNCi0JCQkJRXhwbG9kZSggaERDLCBucEJvbnVzICk7DQotCQkJCVJlbW92ZU9iaiggJkJvbnVzTGlzdCwgbnBCb251cyApOw0KLQkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wQm9udXMgKTsNCi0JCQl9DQotCQl9DQotCQlpZiAobnBCb251cy0+bkNvdW50ICYmIC0tbnBCb251cy0+bkRlbGF5IDw9IDApDQotCQl7DQotCQkJLS1ucEJvbnVzLT5uQ291bnQ7DQotCQkJbnBCb251cy0+bkRlbGF5ID0gNjQgKyBhcmFuZCggMTI4ICk7DQotCQkJbnBCb251cy0+YnlDb2xvciA9IChCWVRFKShXSElURSArIChucEJvbnVzLT5uQ291bnQgKiAyKSk7DQotCQkJaWYgKG5wQm9udXMtPm5Db3VudCA9PSAwKQ0KLQkJCXsNCi0JCQkJRXhwbG9kZSggaERDLCBucEJvbnVzICk7DQotCQkJCVJlbW92ZU9iaiggJkJvbnVzTGlzdCwgbnBCb251cyApOw0KLQkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wQm9udXMgKTsNCi0JCQl9DQotCQl9DQotCQluRGVsdGEgPSBucFBsYXllci0+UG9zLnggLSBucEJvbnVzLT5Qb3MueDsNCi0JCXdoaWxlIChuRGVsdGEgPCAtMTYgfHwgbkRlbHRhID4gMTYpIG5EZWx0YSAvPSAyOw0KLQkJbnBCb251cy0+VmVsLnggKz0gbkRlbHRhIC0gbnBCb251cy0+VmVsLnggLyAxNjsNCi0JCW5EZWx0YSA9IG5wUGxheWVyLT5Qb3MueSAtIG5wQm9udXMtPlBvcy55Ow0KLQkJd2hpbGUgKG5EZWx0YSA8IC0xNiB8fCBuRGVsdGEgPiAxNikgbkRlbHRhIC89IDI7DQotCQlucEJvbnVzLT5WZWwueSArPSBuRGVsdGEgLSBucEJvbnVzLT5WZWwueSAvIDE2Ow0KLQkJRHJhd09iamVjdCggaERDLCBucEJvbnVzICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBEcmF3SHVudGVyU2hvdHMgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBodW50ZXIgc2hvdCBsaXN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdIdW50ZXJTaG90cyggSERDIGhEQyApDQotew0KLQlOUE9CSiAgICAgICAgICAgbnBTaG90LCBucE5leHQ7DQotDQotCWZvciAobnBTaG90ID0gSGVhZE9iaiggJkh1bnRlclNob3RMaXN0ICk7IG5wU2hvdDsgbnBTaG90ID0gbnBOZXh0KQ0KLQl7DQotCQlSRUNUICAgICAgICAgICAgcmVjdDsNCi0NCi0JCW5wTmV4dCA9IE5leHRPYmooIG5wU2hvdCApOw0KLQ0KLQkJTUtSRUNUKCAmcmVjdCwgbnBTaG90LT5Qb3MsIDIwMCApOw0KLQ0KLQkJaWYgKFBUSU5SRUNUKCAmcmVjdCwgbnBQbGF5ZXItPlBvcyApKQ0KLQkJew0KLQkJCUhpdFBsYXllciggaERDLCBucFNob3QgKTsNCi0JCQlucFNob3QtPm5Db3VudCA9IDE7DQotCQl9DQotCQlzd2l0Y2ggKC0tbnBTaG90LT5uQ291bnQpDQotCQl7DQotCQljYXNlIDc6DQotCQkJbnBTaG90LT5ieUNvbG9yID0gREtHUkVFTjsNCi0JCQlicmVhazsNCi0JCWNhc2UgMDoNCi0JCQlSZW1vdmVPYmooICZIdW50ZXJTaG90TGlzdCwgbnBTaG90ICk7DQotCQkJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCBucFNob3QgKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCURyYXdPYmplY3QoIGhEQywgbnBTaG90ICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBGaXJlSHVudGVyU2hvdCAtIGZpcmUgYSBodW50ZXIgYnVsbGV0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIEZpcmVIdW50ZXJTaG90KCBOUE9CSiBucEh1bnQgKQ0KLXsNCi0JTlBPQkogICAgICAgICAgIG5wU2hvdDsNCi0NCi0JaWYgKG5wU2hvdCA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApKQ0KLQl7DQotCQlucFNob3QtPlBvcy54ID0gbnBIdW50LT5Qb3MueDsNCi0JCW5wU2hvdC0+UG9zLnkgPSBucEh1bnQtPlBvcy55Ow0KLQkJbnBTaG90LT5WZWwueCA9IG5wSHVudC0+VmVsLng7DQotCQlucFNob3QtPlZlbC55ID0gbnBIdW50LT5WZWwueTsNCi0JCW5wU2hvdC0+bk1hc3MgPSA4Ow0KLQkJbnBTaG90LT5uRGlyID0gbnBIdW50LT5uRGlyICsgYXJhbmQoIDUgKSAtIDI7DQotCQlucFNob3QtPm5TcGluID0gKGFyYW5kKCAyICkgPyAxMCA6IC0xMCk7DQotCQlucFNob3QtPm5Db3VudCA9IDE2ICsgYXJhbmQoIDggKTsNCi0JCW5wU2hvdC0+YnlDb2xvciA9IEdSRUVOOw0KLQkJbnBTaG90LT5ieVB0cyA9IDI7DQotCQlucFNob3QtPlB0c1swXS54ID0gMTI4Ow0KLQkJbnBTaG90LT5QdHNbMF0ueSA9IDUwOw0KLQkJbnBTaG90LT5QdHNbMV0ueCA9IDA7DQotCQlucFNob3QtPlB0c1sxXS55ID0gNTA7DQotCQlBQ0NFTCggbnBTaG90LCBucFNob3QtPm5EaXIsIDIwMCArIG5wU2hvdC0+bkNvdW50ICk7DQotCQlBZGRIZWFkT2JqKCAmSHVudGVyU2hvdExpc3QsIG5wU2hvdCApOw0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gQ3JlYXRlSHVudGVyIC0gbWFrZSBhIG5ldyBodW50ZXINCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgQ3JlYXRlSHVudGVyKCBWT0lEICkNCi17DQotCU5QT0JKICAgICAgICAgICBucEh1bnQ7DQotCUlOVCAgICAgICAgICAgICBuQ250Ow0KLQ0KLQlpZiAobnBIdW50ID0gUmVtSGVhZE9iaiggJkZyZWVMaXN0ICkpDQotCXsNCi0JCW5wSHVudC0+UG9zLnggPSBhcmFuZCggQ0xJUF9DT09SRCAqIDIgKSAtIENMSVBfQ09PUkQ7DQotCQlucEh1bnQtPlBvcy55ID0gLUNMSVBfQ09PUkQ7DQotCQlucEh1bnQtPlZlbC54ID0gbnBIdW50LT5WZWwueSA9IDA7DQotCQlucEh1bnQtPm5NYXNzID0gMjU2Ow0KLQkJbnBIdW50LT5uRGlyID0gYXJhbmQoIERFR1JFRV9TSVpFICk7DQotCQlucEh1bnQtPm5TcGluID0gMDsNCi0JCW5wSHVudC0+bkNvdW50ID0gMSArIGFyYW5kKCBuTGV2ZWwgKTsNCi0JCW5wSHVudC0+bkRlbGF5ID0gMiArIGFyYW5kKCAxMCApOw0KLQkJbnBIdW50LT5ieUNvbG9yID0gQ1lBTjsNCi0JCW5wSHVudC0+YnlQdHMgPSBESU0oSHVudGVyKTsNCi0JCWZvciAobkNudCA9IDA7IG5DbnQgPCBESU0oSHVudGVyKTsgKytuQ250KQ0KLQkJCW5wSHVudC0+UHRzW25DbnRdID0gSHVudGVyW25DbnRdOw0KLQkJQUNDRUwoIG5wSHVudCwgbnBIdW50LT5uRGlyLCAzMCArIG5MZXZlbCAqIDIgKTsNCi0JCUFkZEhlYWRPYmooICZIdW50ZXJMaXN0LCBucEh1bnQgKTsNCi0JCSsrbkJhZEd1eXM7DQotCX0NCi19DQotDQotLy8NCi0vLyBEcmF3SHVudGVycyAtIHByb2Nlc3MgYW5kIGRyYXcgdGhlIGh1bnRlciBsaXN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdIdW50ZXJzKCBIREMgaERDICkNCi17DQotCU5QT0JKICAgICAgICAgICBucEh1bnQsIG5wTmV4dDsNCi0JTE9DQUwgSU5UICAgICAgIG5OZXh0SHVudGVyID0gMjAwOw0KLQ0KLQlpZiAobkJhZEd1eXMgJiYgKC0tbk5leHRIdW50ZXIgPCAwKSkNCi0Jew0KLQkJQ3JlYXRlSHVudGVyKCk7DQotCQluTmV4dEh1bnRlciA9IDEwMDAgKyBhcmFuZCggMTAwMCApIC0gbkxldmVsICogODsNCi0JfQ0KLQ0KLQlmb3IgKG5wSHVudCA9IEhlYWRPYmooICZIdW50ZXJMaXN0ICk7IG5wSHVudDsgbnBIdW50ID0gbnBOZXh0KQ0KLQl7DQotCQlOUE9CSiAgICAgICAgICAgbnBTaG90Ow0KLQkJUkVDVCAgICAgICAgICAgIHJlY3Q7DQotDQotCQlucE5leHQgPSBOZXh0T2JqKCBucEh1bnQgKTsNCi0NCi0JCU1LUkVDVCggJnJlY3QsIG5wSHVudC0+UG9zLCAyMDAgKTsNCi0NCi0JCWlmIChQVElOUkVDVCggJnJlY3QsIG5wUGxheWVyLT5Qb3MgKSkNCi0JCXsNCi0JCQlIaXRQbGF5ZXIoIGhEQywgbnBIdW50ICk7DQotCQkJLS1ucEh1bnQtPm5Db3VudDsNCi0JCQlpZiAobnBIdW50LT5uQ291bnQgPCAxKQ0KLQkJCXsNCi0JCQkJS2lsbEJhZEd1eSgpOw0KLQkJCQlucEh1bnQtPmJ5Q29sb3IgPSBDWUFOOw0KLQkJCQlFeHBsb2RlKCBoREMsIG5wSHVudCApOw0KLQkJCQlSZW1vdmVPYmooICZIdW50ZXJMaXN0LCBucEh1bnQgKTsNCi0JCQkJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCBucEh1bnQgKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAobnBIdW50LT5uQ291bnQgPT0gMSkgbnBIdW50LT5ieUNvbG9yID0gREtDWUFOOw0KLQkJfQ0KLQkJZWxzZSBpZiAoSU5UUkVDVCgmcmVjdCwgJnJlY3RTaG90Q2xpcCkpDQotCQl7DQotCQkJZm9yIChucFNob3QgPSBIZWFkT2JqKCAmU2hvdExpc3QgKTsgbnBTaG90OyBucFNob3QgPSBOZXh0T2JqKCBucFNob3QgKSkNCi0JCQl7DQotCQkJCWlmICghUFRJTlJFQ1QoICZyZWN0LCBucFNob3QtPlBvcyApKSBjb250aW51ZTsNCi0JCQkJbnBTaG90LT5uQ291bnQgPSAxOw0KLQkJCQlsU2NvcmUgKz0gbnBIdW50LT5uQ291bnQgKiAxMDAwOw0KLQkJCQlpZiAoLS1ucEh1bnQtPm5Db3VudCA8IDEpDQotCQkJCXsNCi0JCQkJCUtpbGxCYWRHdXkoKTsNCi0JCQkJCW5wSHVudC0+YnlDb2xvciA9IENZQU47DQotCQkJCQlFeHBsb2RlKCBoREMsIG5wSHVudCApOw0KLQkJCQkJUmVtb3ZlT2JqKCAmSHVudGVyTGlzdCwgbnBIdW50ICk7DQotCQkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wSHVudCApOw0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJaWYgKG5wSHVudC0+bkNvdW50ID09IDEpIG5wSHVudC0+YnlDb2xvciA9IERLQ1lBTjsNCi0JCQkJCUhpdCggaERDLCBucEh1bnQgKTsNCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQlBQ0NFTCggbnBIdW50LCBucEh1bnQtPm5EaXIsIDggKTsNCi0JCW5wSHVudC0+VmVsLnggLT0gbnBIdW50LT5WZWwueCAvIDE2Ow0KLQkJbnBIdW50LT5WZWwueSAtPSBucEh1bnQtPlZlbC55IC8gMTY7DQotCQlpZiAoLS1ucEh1bnQtPm5EZWxheSA8PSAwKQ0KLQkJew0KLQkJCW5wSHVudC0+bkRlbGF5ID0gYXJhbmQoIDEwICk7DQotCQkJbnBIdW50LT5uU3BpbiA9IGFyYW5kKCAxMSApIC0gNTsNCi0JCQlGaXJlSHVudGVyU2hvdCggbnBIdW50ICk7DQotCQl9DQotCQlEcmF3T2JqZWN0KCBoREMsIG5wSHVudCApOw0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gQ3JlYXRlU3dhcm1lciAtIG1ha2UgYSBuZXcgc3dhcm1lcg0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBDcmVhdGVTd2FybWVyKCBQT0lOVCBQb3MsIElOVCBuRGlyLCBJTlQgbkNvdW50ICkNCi17DQotCU5QT0JKICAgICAgICAgICBucFN3YXJtOw0KLQlJTlQgICAgICAgICAgICAgbkNudDsNCi0NCi0JaWYgKG5wU3dhcm0gPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCi0Jew0KLQkJbnBTd2FybS0+UG9zID0gUG9zOw0KLQkJbnBTd2FybS0+VmVsLnggPSBucFN3YXJtLT5WZWwueSA9IDA7DQotCQlucFN3YXJtLT5uRGlyID0gbkRpcjsNCi0JCW5wU3dhcm0tPm5TcGluID0gYXJhbmQoIDMxICkgLSAxNTsNCi0JCW5wU3dhcm0tPm5Db3VudCA9IG5Db3VudDsNCi0JCW5wU3dhcm0tPm5EZWxheSA9IDY0ICsgYXJhbmQoIDY0ICk7DQotCQlucFN3YXJtLT5uTWFzcyA9IDMyOw0KLQkJbnBTd2FybS0+YnlDb2xvciA9IERLR1JFRU47DQotCQlucFN3YXJtLT5ieVB0cyA9IERJTShTd2FybWVyKTsNCi0JCWZvciAobkNudCA9IDA7IG5DbnQgPCBESU0oU3dhcm1lcik7ICsrbkNudCkNCi0JCXsNCi0JCQlucFN3YXJtLT5QdHNbbkNudF0gPSBTd2FybWVyW25DbnRdOw0KLQkJCW5wU3dhcm0tPlB0c1tuQ250XS55ICs9IG5Db3VudCAqIDEwOw0KLQkJfQ0KLQkJQUNDRUwoIG5wU3dhcm0sIG5wU3dhcm0tPm5EaXIsIDMwICsgbkxldmVsICogMiApOw0KLQkJQWRkSGVhZE9iaiggJlN3YXJtZXJMaXN0LCBucFN3YXJtICk7DQotCQkrK25CYWRHdXlzOw0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gRHJhd1N3YXJtZXJzIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgc3dhcm1lciBsaXN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdTd2FybWVycyggSERDIGhEQyApDQotew0KLQlOUE9CSiAgICAgICAgICAgbnBTd2FybSwgbnBOZXh0Ow0KLQlMT0NBTCBJTlQgICAgICAgbk5leHRTd2FybWVyID0gMTAwMDsNCi0NCi0JaWYgKG5CYWRHdXlzICYmICgtLW5OZXh0U3dhcm1lciA8IDApKQ0KLQl7DQotCQlQT0lOVCBQb3M7DQotCQlQb3MueCA9IGFyYW5kKCBDTElQX0NPT1JEICogMiApIC0gQ0xJUF9DT09SRDsNCi0JCVBvcy55ID0gLUNMSVBfQ09PUkQ7DQotCQlDcmVhdGVTd2FybWVyKCBQb3MsIGFyYW5kKCBERUdSRUVfU0laRSApLCA4ICsgbkxldmVsICogMiApOw0KLQkJbk5leHRTd2FybWVyID0gMTAwMCArIGFyYW5kKCA1MDAgKSAtIG5MZXZlbCAqIDQ7DQotCX0NCi0NCi0JZm9yIChucFN3YXJtID0gSGVhZE9iaiggJlN3YXJtZXJMaXN0ICk7IG5wU3dhcm07IG5wU3dhcm0gPSBucE5leHQpDQotCXsNCi0JCU5QT0JKICAgICAgICAgICBucFNob3Q7DQotCQlSRUNUICAgICAgICAgICAgcmVjdDsNCi0NCi0JCW5wTmV4dCA9IE5leHRPYmooIG5wU3dhcm0gKTsNCi0NCi0JCU1LUkVDVCggJnJlY3QsIG5wU3dhcm0tPlBvcywgMTUwICsgbnBTd2FybS0+bkNvdW50ICogMTAgKTsNCi0NCi0JCWlmIChQVElOUkVDVCggJnJlY3QsIG5wUGxheWVyLT5Qb3MgKSkNCi0JCXsNCi0JCQlIaXRQbGF5ZXIoIGhEQywgbnBTd2FybSApOw0KLQkJCW5wU3dhcm0tPm5Db3VudCA9IDA7DQotCQl9DQotCQllbHNlIGlmIChJTlRSRUNUKCZyZWN0LCAmcmVjdFNob3RDbGlwKSkNCi0JCXsNCi0JCQlmb3IgKG5wU2hvdCA9IEhlYWRPYmooICZTaG90TGlzdCApOyBucFNob3Q7IG5wU2hvdCA9IE5leHRPYmooIG5wU2hvdCApKQ0KLQkJCXsNCi0JCQkJaWYgKCFQVElOUkVDVCggJnJlY3QsIG5wU2hvdC0+UG9zICkpIGNvbnRpbnVlOw0KLQkJCQlucFNob3QtPm5Db3VudCA9IDE7DQotCQkJCWxTY29yZSArPSBucFN3YXJtLT5uQ291bnQgKiAyNTsNCi0JCQkJbnBTd2FybS0+bkNvdW50ID0gMDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKG5wU3dhcm0tPm5Db3VudCA8PSAwKQ0KLQkJew0KLQkJCW5wU3dhcm0tPmJ5Q29sb3IgPSBHUkVFTjsNCi0JCQlLaWxsQmFkR3V5KCk7DQotCQkJRXhwbG9kZSggaERDLCBucFN3YXJtICk7DQotCQkJUmVtb3ZlT2JqKCAmU3dhcm1lckxpc3QsIG5wU3dhcm0gKTsNCi0JCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wU3dhcm0gKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlpZiAoKG5wU3dhcm0tPm5Db3VudCA+IDEpICYmICgtLW5wU3dhcm0tPm5EZWxheSA8PSAwKSkNCi0JCQl7DQotCQkJCUlOVCBuRGlyID0gYXJhbmQoIERFR1JFRV9TSVpFICk7DQotCQkJCUlOVCBuQ291bnQgPSBucFN3YXJtLT5uQ291bnQgLyAyOw0KLQkJCQlDcmVhdGVTd2FybWVyKCBucFN3YXJtLT5Qb3MsIG5EaXIsIG5Db3VudCApOw0KLQkJCQluQ291bnQgPSBucFN3YXJtLT5uQ291bnQgLSBuQ291bnQ7DQotCQkJCUNyZWF0ZVN3YXJtZXIoIG5wU3dhcm0tPlBvcywgbkRpciArIDEyOCwgbkNvdW50ICk7DQotCQkJCW5wU3dhcm0tPm5Db3VudCA9IDA7DQotCQkJfQ0KLQkJCURyYXdPYmplY3QoIGhEQywgbnBTd2FybSApOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gQ3JlYXRlU3Bpbm5lciAtIG1ha2UgYSBuZXcgc3Bpbm5lcg0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBDcmVhdGVTcGlubmVyKCBWT0lEICkNCi17DQotCU5QT0JKICAgICAgICAgICBucFNwaW47DQotCUlOVCAgICAgICAgICAgICBuQ250Ow0KLQ0KLQlpZiAobnBTcGluID0gUmVtSGVhZE9iaiggJkZyZWVMaXN0ICkpDQotCXsNCi0JCW5wU3Bpbi0+UG9zLnggPSBhcmFuZCggQ0xJUF9DT09SRCAqIDIgKSAtIENMSVBfQ09PUkQ7DQotCQlucFNwaW4tPlBvcy55ID0gLUNMSVBfQ09PUkQ7DQotCQlucFNwaW4tPlZlbC54ID0gbnBTcGluLT5WZWwueSA9IDA7DQotCQlucFNwaW4tPm5EaXIgPSBhcmFuZCggREVHUkVFX1NJWkUgKTsNCi0JCW5wU3Bpbi0+blNwaW4gPSAtMTI7DQotCQlucFNwaW4tPm5Db3VudCA9IDEgKyBhcmFuZCggbkxldmVsICk7DQotCQlucFNwaW4tPm5NYXNzID0gNjQgKyBucFNwaW4tPm5Db3VudCAqIDMyOw0KLQkJbnBTcGluLT5ieUNvbG9yID0gKEJZVEUpKE1BR0VOVEEgLSBucFNwaW4tPm5Db3VudCk7DQotCQlucFNwaW4tPmJ5UHRzID0gRElNKFNwaW5uZXIpOw0KLQkJZm9yIChuQ250ID0gMDsgbkNudCA8IERJTShTcGlubmVyKTsgKytuQ250KQ0KLQkJCW5wU3Bpbi0+UHRzW25DbnRdID0gU3Bpbm5lcltuQ250XTsNCi0JCUFDQ0VMKCBucFNwaW4sIG5wU3Bpbi0+bkRpciwgMzAgKyBuTGV2ZWwgKiAyICk7DQotCQlBZGRIZWFkT2JqKCAmU3Bpbm5lckxpc3QsIG5wU3BpbiApOw0KLQkJKytuQmFkR3V5czsNCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIERyYXdTcGlubmVycyAtIHByb2Nlc3MgYW5kIGRyYXcgdGhlIHNwaW5uZXIgbGlzdA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBEcmF3U3Bpbm5lcnMoIEhEQyBoREMgKQ0KLXsNCi0JTlBPQkogICAgICAgICAgIG5wU3BpbiwgbnBOZXh0Ow0KLQlMT0NBTCBJTlQgICAgICAgbk5leHRTcGlubmVyID0gMTAwMDsNCi0NCi0JaWYgKG5CYWRHdXlzICYmICgtLW5OZXh0U3Bpbm5lciA8IDApKQ0KLQl7DQotCQlDcmVhdGVTcGlubmVyKCk7DQotCQluTmV4dFNwaW5uZXIgPSAxMDAgKyBhcmFuZCggOTAwICkgLSBuTGV2ZWwgKiAyOw0KLQl9DQotDQotCWZvciAobnBTcGluID0gSGVhZE9iaiggJlNwaW5uZXJMaXN0ICk7IG5wU3BpbjsgbnBTcGluID0gbnBOZXh0KQ0KLQl7DQotCQlOUE9CSiAgICAgICAgICAgbnBTaG90Ow0KLQkJSU5UICAgICAgICAgICAgIG5EZWx0YTsNCi0JCVJFQ1QgICAgICAgICAgICByZWN0Ow0KLQ0KLQkJbnBOZXh0ID0gTmV4dE9iaiggbnBTcGluICk7DQotDQotCQlNS1JFQ1QoICZyZWN0LCBucFNwaW4tPlBvcywgMTUwICk7DQotDQotCQlpZiAoUFRJTlJFQ1QoICZyZWN0LCBucFBsYXllci0+UG9zICkpDQotCQl7DQotCQkJSGl0UGxheWVyKCBoREMsIG5wU3BpbiApOw0KLQkJCS0tbnBTcGluLT5uQ291bnQ7DQotCQkJbnBTcGluLT5ieUNvbG9yID0gKEJZVEUpKE1BR0VOVEEgLSBucFNwaW4tPm5Db3VudCk7DQotCQkJaWYgKG5wU3Bpbi0+bkNvdW50IDwgMSkNCi0JCQl7DQotCQkJCUtpbGxCYWRHdXkoKTsNCi0JCQkJRXhwbG9kZSggaERDLCBucFNwaW4gKTsNCi0JCQkJUmVtb3ZlT2JqKCAmU3Bpbm5lckxpc3QsIG5wU3BpbiApOw0KLQkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wU3BpbiApOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UgaWYgKElOVFJFQ1QoJnJlY3QsICZyZWN0U2hvdENsaXApKQ0KLQkJew0KLQkJCWZvciAobnBTaG90ID0gSGVhZE9iaiggJlNob3RMaXN0ICk7IG5wU2hvdDsgbnBTaG90ID0gTmV4dE9iaiggbnBTaG90ICkpDQotCQkJew0KLQkJCQlpZiAoIVBUSU5SRUNUKCAmcmVjdCwgbnBTaG90LT5Qb3MgKSkgY29udGludWU7DQotCQkJCW5wU2hvdC0+bkNvdW50ID0gMTsNCi0JCQkJbFNjb3JlICs9IG5wU3Bpbi0+bkNvdW50ICogNTAwOw0KLQkJCQlucFNwaW4tPmJ5Q29sb3IgPSAoQllURSkoTUFHRU5UQSAtICgtLW5wU3Bpbi0+bkNvdW50KSk7DQotCQkJCWlmIChucFNwaW4tPm5Db3VudCA8IDEpDQotCQkJCXsNCi0JCQkJCUtpbGxCYWRHdXkoKTsNCi0JCQkJCUV4cGxvZGUoIGhEQywgbnBTcGluICk7DQotCQkJCQlSZW1vdmVPYmooICZTcGlubmVyTGlzdCwgbnBTcGluICk7DQotCQkJCQlBZGRIZWFkT2JqKCAmRnJlZUxpc3QsIG5wU3BpbiApOw0KLQkJCQl9DQotCQkJCWVsc2UgSGl0KCBoREMsIG5wU3BpbiApOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQluRGVsdGEgPSBucFBsYXllci0+UG9zLnggLSBucFNwaW4tPlBvcy54Ow0KLQkJd2hpbGUgKG5EZWx0YSA8IC0xNiB8fCBuRGVsdGEgPiAxNikgbkRlbHRhIC89IDI7DQotCQlucFNwaW4tPlZlbC54ICs9IG5EZWx0YSAtIG5wU3Bpbi0+VmVsLnggLyAxNjsNCi0JCW5EZWx0YSA9IG5wUGxheWVyLT5Qb3MueSAtIG5wU3Bpbi0+UG9zLnk7DQotCQl3aGlsZSAobkRlbHRhIDwgLTE2IHx8IG5EZWx0YSA+IDE2KSBuRGVsdGEgLz0gMjsNCi0JCW5wU3Bpbi0+VmVsLnkgKz0gbkRlbHRhIC0gbnBTcGluLT5WZWwueSAvIDE2Ow0KLQkJRHJhd09iamVjdCggaERDLCBucFNwaW4gKTsNCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIENyZWF0ZVJvaWQgLSBtYWtlIGEgbmV3IGFzdGVyb2lkDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIENyZWF0ZVJvaWQoIFBPSU5UIFBvcywgUE9JTlQgVmVsLCBJTlQgblNpZGVzLCBCWVRFIGJ5Q29sb3IsDQotCQkJCQkJCSBJTlQgbkRpciwgSU5UIG5TcGVlZCwgSU5UIG5TcGluICkNCi17DQotCU5QT0JKICAgICAgICAgICBucFJvaWQ7DQotCUlOVCAgICAgICAgICAgICBuQ250Ow0KLQ0KLQlpZiAobnBSb2lkID0gUmVtSGVhZE9iaiggJkZyZWVMaXN0ICkpDQotCXsNCi0JCW5wUm9pZC0+UG9zID0gUG9zOw0KLQkJbnBSb2lkLT5WZWwgPSBWZWw7DQotCQlucFJvaWQtPm5NYXNzID0gblNpZGVzICogMTI4Ow0KLQkJbnBSb2lkLT5uRGlyID0gbkRpcjsNCi0JCW5wUm9pZC0+blNwaW4gPSBuU3BpbiArIGFyYW5kKCAxMSApIC0gNTsNCi0JCW5wUm9pZC0+bkNvdW50ID0gblNpZGVzICogMTAwOw0KLQkJbnBSb2lkLT5ieUNvbG9yID0gYnlDb2xvcjsNCi0JCW5wUm9pZC0+YnlQdHMgPSAoQllURSkoblNpZGVzICsgMSk7DQotCQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgblNpZGVzOyArK25DbnQpDQotCQl7DQotCQkJbnBSb2lkLT5QdHNbbkNudF0ueCA9IG5DbnQgKiBERUdSRUVfU0laRSAvIG5TaWRlcyArIGFyYW5kKCAzMCApOw0KLQkJCW5wUm9pZC0+UHRzW25DbnRdLnkgPSAoblNpZGVzIC0gMSkgKiAxMDAgKyAyMCArIGFyYW5kKCA4MCApOw0KLQkJfQ0KLQkJbnBSb2lkLT5QdHNbblNpZGVzXSA9IG5wUm9pZC0+UHRzWzBdOw0KLQkJQUNDRUwoIG5wUm9pZCwgbkRpciwgblNwZWVkICk7DQotCQlBZGRIZWFkT2JqKCAmUm9pZExpc3QsIG5wUm9pZCApOw0KLQkJKytuQmFkR3V5czsNCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIEJyZWFrUm9pZCAtIGJyZWFrIHVwIGFuIGFzdGVyb2lkDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIEJyZWFrUm9pZCggSERDIGhEQywgTlBPQkogbnBSb2lkLCBOUE9CSiBucFNob3QgKQ0KLXsNCi0JSU5UICAgICAgICAgICAgIG5DbnQsIG5OZXc7DQotDQotCWxTY29yZSArPSBucFJvaWQtPm5Db3VudDsNCi0JaWYgKG5wU2hvdCkgbnBTaG90LT5uQ291bnQgPSAxOw0KLQlzd2l0Y2ggKG5wUm9pZC0+YnlQdHMpDQotCXsNCi0JY2FzZSA4Og0KLQkJbk5ldyA9IDIgKyBhcmFuZCggMyApOw0KLQkJYnJlYWs7DQotCWNhc2UgNzoNCi0JCW5OZXcgPSAxICsgYXJhbmQoIDMgKTsNCi0JCWJyZWFrOw0KLQljYXNlIDY6DQotCQluTmV3ID0gMSArIGFyYW5kKCAyICk7DQotCQlicmVhazsNCi0JY2FzZSA1Og0KLQkJbk5ldyA9IGFyYW5kKCAyICk7DQotCQlicmVhazsNCi0JZGVmYXVsdDoNCi0JCW5OZXcgPSAwOw0KLQkJYnJlYWs7DQotCX0NCi0JaWYgKG5OZXcgPT0gMSkgLy8gZG9uJ3QgZXhwbG9kZSBvdXR3YXJkDQotCXsNCi0JCVBPSU5UIFB0ID0gbnBSb2lkLT5Qb3M7DQotCQlQdC54ICs9IGFyYW5kKCAzMDEgKSAtIDE1MDsgUHQueSArPSBhcmFuZCggMzAxICkgLSAxNTA7DQotCQlDcmVhdGVSb2lkKCBQdCwgbnBSb2lkLT5WZWwsIG5wUm9pZC0+YnlQdHMgLSAobk5ldyArIDEpLA0KLQkJCQkJbnBSb2lkLT5ieUNvbG9yLCBucFNob3QtPm5EaXIsIDgsIG5wUm9pZC0+blNwaW4gKTsNCi0JfQ0KLQllbHNlIGlmIChuTmV3ID4gMCkNCi0Jew0KLQkJSU5UIG5TcGVlZCA9IG5wUm9pZC0+blNwaW4gKiBucFJvaWQtPm5TcGluICogbk5ldyArIDE2Ow0KLQkJZm9yIChuQ250ID0gMDsgbkNudCA8IG5OZXc7ICsrbkNudCkNCi0JCXsNCi0JCQlQT0lOVCBQdCA9IG5wUm9pZC0+UG9zOw0KLQkJCVB0LnggKz0gYXJhbmQoIDYwMSApIC0gMzAwOyBQdC55ICs9IGFyYW5kKCA2MDEgKSAtIDMwMDsNCi0JCQlDcmVhdGVSb2lkKCBQdCwgbnBSb2lkLT5WZWwsIG5wUm9pZC0+YnlQdHMgLSAobk5ldyArIDEpLA0KLQkJCQkJCW5wUm9pZC0+YnlDb2xvciwNCi0JCQkJCQlucFJvaWQtPm5EaXIgKyBuQ250ICogREVHUkVFX1NJWkUgLyBuTmV3ICsgYXJhbmQoIDMyICksDQotCQkJCQkJblNwZWVkICsgYXJhbmQoIG5MZXZlbCAqIDQgKSwNCi0JCQkJCQlucFJvaWQtPm5TcGluIC8gMiApOw0KLQkJfQ0KLQl9DQotCUtpbGxCYWRHdXkoKTsNCi0JKytucFJvaWQtPmJ5Q29sb3I7DQotCW5wUm9pZC0+bkNvdW50ID0gMDsNCi0JaWYgKG5OZXcpDQotCXsNCi0JCUhpdCggaERDLCBucFJvaWQgKTsNCi0JCURyYXdPYmplY3QoIGhEQywgbnBSb2lkICk7DQotCX0NCi0JZWxzZSBFeHBsb2RlKCBoREMsIG5wUm9pZCApOw0KLQlSZW1vdmVPYmooICZSb2lkTGlzdCwgbnBSb2lkICk7DQotCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBSb2lkICk7DQotfQ0KLQ0KLS8vDQotLy8gRHJhd1JvaWRzIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgYXN0ZXJvaWQgbGlzdA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBEcmF3Um9pZHMoIEhEQyBoREMgKQ0KLXsNCi0JTlBPQkogICAgICAgICAgIG5wUm9pZCwgbnBOZXh0Ow0KLQ0KLQlmb3IgKG5wUm9pZCA9IEhlYWRPYmooICZSb2lkTGlzdCApOyBucFJvaWQ7IG5wUm9pZCA9IG5wTmV4dCkNCi0Jew0KLQkJSU5UICAgICAgICAgICAgIG5TaXplID0gbnBSb2lkLT5uQ291bnQ7DQotCQlOUE9CSiAgICAgICAgICAgbnBTaG90Ow0KLQkJUkVDVCAgICAgICAgICAgIHJlY3Q7DQotDQotCQlucE5leHQgPSBOZXh0T2JqKCBucFJvaWQgKTsNCi0NCi0JCURyYXdPYmplY3QoIGhEQywgbnBSb2lkICk7DQotDQotCQlNS1JFQ1QoICZyZWN0LCBucFJvaWQtPlBvcywgblNpemUgKTsNCi0NCi0JCWlmIChQVElOUkVDVCggJnJlY3QsIG5wUGxheWVyLT5Qb3MgKSAmJiBIaXRQbGF5ZXIoIGhEQywgbnBSb2lkICkpDQotCQl7DQotCQkJbnBQbGF5ZXItPm5Db3VudCA9IC1ucFBsYXllci0+bkNvdW50Ow0KLQkJCW5wUGxheWVyLT5ieUNvbG9yID0gV0hJVEU7DQotCQkJRXhwbG9kZSggaERDLCBucFBsYXllciApOw0KLQkJCUJyZWFrUm9pZCggaERDLCBucFJvaWQsIE5VTEwgKTsNCi0JCQlpZiAobkJhZEd1eXMpIFNldFJlc3RhcnQoIFJFU1RBUlRfTEVWRUwgKTsNCi0JCQllbHNlIFNldFJlc3RhcnQoIFJFU1RBUlRfTkVYVExFVkVMICk7DQotCQl9DQotCQllbHNlIGlmIChJTlRSRUNUKCZyZWN0LCAmcmVjdFNob3RDbGlwKSkNCi0JCXsNCi0JCQlmb3IgKG5wU2hvdCA9IEhlYWRPYmooICZTaG90TGlzdCApOyBucFNob3Q7IG5wU2hvdCA9IE5leHRPYmooIG5wU2hvdCApKQ0KLQkJCXsNCi0JCQkJaWYgKCFQVElOUkVDVCggJnJlY3QsIG5wU2hvdC0+UG9zICkpIGNvbnRpbnVlOw0KLQkJCQlCcmVha1JvaWQoIGhEQywgbnBSb2lkLCBucFNob3QgKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gRHJhd1Nob3RzIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgcGxheWVyIHNob3QgbGlzdA0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBEcmF3U2hvdHMoIEhEQyBoREMgKQ0KLXsNCi0JTlBPQkogICAgICAgICAgIG5wU2hvdCwgbnBOZXh0Ow0KLQ0KLQlpZiAobnBTaG90ID0gSGVhZE9iaiggJlNob3RMaXN0ICkpDQotCXsNCi0JCXJlY3RTaG90Q2xpcC5sZWZ0ID0gcmVjdFNob3RDbGlwLnJpZ2h0ID0gbnBTaG90LT5Qb3MueDsNCi0JCXJlY3RTaG90Q2xpcC50b3AgPSByZWN0U2hvdENsaXAuYm90dG9tID0gbnBTaG90LT5Qb3MueTsNCi0JCXdoaWxlIChucFNob3QpDQotCQl7DQotCQkJbnBOZXh0ID0gTmV4dE9iaiggbnBTaG90ICk7DQotCQkJc3dpdGNoICgtLW5wU2hvdC0+bkNvdW50KQ0KLQkJCXsNCi0JCQljYXNlIDEwOg0KLQkJCQlucFNob3QtPmJ5Q29sb3IgPSBES0NZQU47DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgNToNCi0JCQkJbnBTaG90LT5ieUNvbG9yID0gREtCTFVFOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIDA6DQotCQkJCVJlbW92ZU9iaiggJlNob3RMaXN0LCBucFNob3QgKTsNCi0JCQkJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCBucFNob3QgKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCURyYXdPYmplY3QoIGhEQywgbnBTaG90ICk7DQotCQkJaWYgKG5wU2hvdC0+UG9zLnggPCByZWN0U2hvdENsaXAubGVmdCkgcmVjdFNob3RDbGlwLmxlZnQgPSBucFNob3QtPlBvcy54Ow0KLQkJCWVsc2UgaWYgKG5wU2hvdC0+UG9zLnggPiByZWN0U2hvdENsaXAucmlnaHQpIHJlY3RTaG90Q2xpcC5yaWdodCA9IG5wU2hvdC0+UG9zLng7DQotCQkJaWYgKG5wU2hvdC0+UG9zLnkgPCByZWN0U2hvdENsaXAudG9wKSByZWN0U2hvdENsaXAudG9wID0gbnBTaG90LT5Qb3MueTsNCi0JCQllbHNlIGlmIChucFNob3QtPlBvcy55ID4gcmVjdFNob3RDbGlwLmJvdHRvbSkgcmVjdFNob3RDbGlwLmJvdHRvbSA9IG5wU2hvdC0+UG9zLnk7DQotCQkJbnBTaG90ID0gbnBOZXh0Ow0KLQkJfQ0KLQl9DQotCWVsc2UgcmVjdFNob3RDbGlwLmxlZnQgPSByZWN0U2hvdENsaXAucmlnaHQgPSByZWN0U2hvdENsaXAudG9wID0gcmVjdFNob3RDbGlwLmJvdHRvbSA9IDMyNzY3Ow0KLX0NCi0NCi0vLw0KLS8vIERyYXdGbGFtZXMgLSBwcm9jZXNzIGFuZCBkcmF3IHRoZSBmbGFtZSBsaXN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdGbGFtZXMoIEhEQyBoREMgKQ0KLXsNCi0JTlBPQkogICAgICAgICAgIG5wRmxhbWUsIG5wTmV4dDsNCi0NCi0JZm9yIChucEZsYW1lID0gSGVhZE9iaiggJkZsYW1lTGlzdCApOyBucEZsYW1lOyBucEZsYW1lID0gbnBOZXh0KQ0KLQl7DQotCQlucE5leHQgPSBOZXh0T2JqKCBucEZsYW1lICk7DQotCQlzd2l0Y2ggKC0tbnBGbGFtZS0+bkNvdW50KQ0KLQkJew0KLQkJY2FzZSA3Og0KLQkJCW5wRmxhbWUtPmJ5Q29sb3IgPSBSRUQ7DQotCQkJYnJlYWs7DQotCQljYXNlIDM6DQotCQkJbnBGbGFtZS0+YnlDb2xvciA9IERLUkVEOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSAwOg0KLQkJCVJlbW92ZU9iaiggJkZsYW1lTGlzdCwgbnBGbGFtZSApOw0KLQkJCUFkZEhlYWRPYmooICZGcmVlTGlzdCwgbnBGbGFtZSApOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJRHJhd09iamVjdCggaERDLCBucEZsYW1lICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBGaXJlU2hvdCAtIGZpcmUgYSBidWxsZXQNCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgRmlyZVNob3QoIFZPSUQgKQ0KLXsNCi0JTlBPQkogICAgICAgICAgIG5wU2hvdDsNCi0NCi0JaWYgKG5wU2hvdCA9IFJlbUhlYWRPYmooICZGcmVlTGlzdCApKQ0KLQl7DQotCQlucFNob3QtPlBvcy54ID0gbnBQbGF5ZXItPlBvcy54Ow0KLQkJbnBTaG90LT5Qb3MueSA9IG5wUGxheWVyLT5Qb3MueTsNCi0JCW5wU2hvdC0+VmVsLnggPSBucFBsYXllci0+VmVsLng7DQotCQlucFNob3QtPlZlbC55ID0gbnBQbGF5ZXItPlZlbC55Ow0KLQkJbnBTaG90LT5uTWFzcyA9IDg7DQotCQlucFNob3QtPm5EaXIgPSBucFBsYXllci0+bkRpciArIGFyYW5kKCA1ICkgLSAyOw0KLQkJbnBTaG90LT5uU3BpbiA9IDA7DQotCQlucFNob3QtPm5Db3VudCA9IDE2ICsgYXJhbmQoIDggKTsNCi0JCW5wU2hvdC0+YnlDb2xvciA9IENZQU47DQotCQlucFNob3QtPmJ5UHRzID0gMjsNCi0JCW5wU2hvdC0+UHRzWzBdLnggPSAxMjg7DQotCQlucFNob3QtPlB0c1swXS55ID0gNTA7DQotCQlucFNob3QtPlB0c1sxXS54ID0gMDsNCi0JCW5wU2hvdC0+UHRzWzFdLnkgPSA1MDsNCi0JCUFDQ0VMKCBucFNob3QsIG5wU2hvdC0+bkRpciwgMjAwICsgbnBTaG90LT5uQ291bnQgKTsNCi0JCUFkZEhlYWRPYmooICZTaG90TGlzdCwgbnBTaG90ICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBBY2NlbFBsYXllciAtIG1vdmUgdGhlIHBsYXllciBmb3J3YXJkDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIEFjY2VsUGxheWVyKCBJTlQgbkRpciwgSU5UIG5BY2NlbCApDQotew0KLQlOUE9CSiAgICAgICAgICAgbnBGbGFtZTsNCi0NCi0JbkRpciArPSBucFBsYXllci0+bkRpcjsNCi0JaWYgKG5BY2NlbCkgQUNDRUwoIG5wUGxheWVyLCBuRGlyLCBuQWNjZWwgKTsNCi0JaWYgKG5wRmxhbWUgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKSkNCi0Jew0KLQkJbnBGbGFtZS0+UG9zLnggPSBucFBsYXllci0+UG9zLng7DQotCQlucEZsYW1lLT5Qb3MueSA9IG5wUGxheWVyLT5Qb3MueTsNCi0JCW5wRmxhbWUtPlZlbC54ID0gbnBQbGF5ZXItPlZlbC54Ow0KLQkJbnBGbGFtZS0+VmVsLnkgPSBucFBsYXllci0+VmVsLnk7DQotCQlucEZsYW1lLT5uRGlyID0gbkRpciArIDEwMCArIGFyYW5kKCA1NyApOw0KLQkJbnBGbGFtZS0+blNwaW4gPSAwOw0KLQkJbnBGbGFtZS0+bkNvdW50ID0gbkFjY2VsICsgYXJhbmQoIDcgKTsNCi0JCW5wRmxhbWUtPmJ5Q29sb3IgPSBZRUxMT1c7DQotCQlucEZsYW1lLT5ieVB0cyA9IDE7DQotCQlucEZsYW1lLT5QdHNbMF0ueCA9IG5wRmxhbWUtPlB0c1swXS55ID0gMDsNCi0JCUFDQ0VMKCBucEZsYW1lLCBucEZsYW1lLT5uRGlyLCA1MCArIGFyYW5kKCAxMCApICk7DQotCQlBZGRIZWFkT2JqKCAmRmxhbWVMaXN0LCBucEZsYW1lICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBEcmF3UGxheWVyIC0gcHJvY2VzcyBhbmQgZHJhdyB0aGUgcGxheWVyDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdQbGF5ZXIoIEhEQyBoREMgKQ0KLXsNCi0JTE9DQUwgSU5UICAgICAgIG5Cb21iaW5nID0gMDsNCi0JTE9DQUwgSU5UICAgICAgIG5TaG90RGVsYXkgPSAwOw0KLQ0KLQlpZiAobnBQbGF5ZXItPm5Db3VudCA8PSAwKSByZXR1cm47DQotDQotCWlmIChuU2FmZSA+IDApDQotCXsNCi0JCWlmICgtLW5TYWZlID09IDApDQotCQl7DQotCQkJbnBQbGF5ZXItPmJ5Q29sb3IgPSAoQllURSkoQkxBQ0sgKyBucFBsYXllci0+bkNvdW50KTsNCi0JCQlpZiAobnBQbGF5ZXItPmJ5Q29sb3IgPiBXSElURSkgbnBQbGF5ZXItPmJ5Q29sb3IgPSBXSElURTsNCi0JCX0NCi0JfQ0KLQllbHNlIGlmIChJc0tleURvd24oIHZrU2hsZCApICYmIG5TaGllbGQgPiAwKQ0KLQl7DQotCQluU2FmZSA9IDE1Ow0KLQkJaWYgKC0tblNoaWVsZCA+IDApIG5wUGxheWVyLT5ieUNvbG9yID0gR1JFRU47DQotCQllbHNlIG5wUGxheWVyLT5ieUNvbG9yID0gREtHUkVFTjsNCi0JfQ0KLQ0KLQlpZiAobkJvbWJpbmcgPiAwKQ0KLQl7DQotCQlpZiAoLS1uQm9tYmluZyA9PSAwKQ0KLQkJew0KLQkJCUV4cGxvZGVCYWRndXlzKCBoREMsICZTcGlubmVyTGlzdCApOw0KLQkJCUV4cGxvZGVCYWRndXlzKCBoREMsICZTd2FybWVyTGlzdCApOw0KLQkJCUV4cGxvZGVCYWRndXlzKCBoREMsICZIdW50ZXJMaXN0ICk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJSGl0TGlzdCggaERDLCAmU3Bpbm5lckxpc3QgKTsNCi0JCQlIaXRMaXN0KCBoREMsICZTd2FybWVyTGlzdCApOw0KLQkJCUhpdExpc3QoIGhEQywgJkh1bnRlckxpc3QgKTsNCi0JCX0NCi0JfQ0KLQllbHNlIGlmIChuQm9tYiAmJiBJc0tleURvd24oIHZrQm9tYiApKSAtLW5Cb21iLCBuQm9tYmluZyA9IDU7DQotDQotCWlmIChJc0tleURvd24oIHZrQ2xrdyApKSBucFBsYXllci0+blNwaW4gKz0gODsNCi0JaWYgKElzS2V5RG93biggdmtDdHJDbGt3ICkpIG5wUGxheWVyLT5uU3BpbiAtPSA4Ow0KLQlpZiAoSXNLZXlEb3duKCB2a1RocnN0ICkpIEFjY2VsUGxheWVyKCAwLCAxMiApOw0KLQlpZiAoSXNLZXlEb3duKCB2a1J2VGhyc3QgKSkgQWNjZWxQbGF5ZXIoIDEyOCwgMTIgKTsNCi0JaWYgKG5TaG90RGVsYXkpIC0tblNob3REZWxheTsNCi0JZWxzZSBpZiAoSXNLZXlEb3duKCB2a0ZpcmUgKSkgRmlyZVNob3QoKSwgblNob3REZWxheSA9IDI7DQotCURyYXdPYmplY3QoIGhEQywgbnBQbGF5ZXIgKTsNCi0JbnBQbGF5ZXItPm5TcGluIC89IDI7DQotfQ0KLQ0KLS8vDQotLy8gR2V0SHlwZXJvaWREQyAtIGdldCB0aGUgY29ycmVjdCBEQyBmb3IgaHlwZXJvaWQgcmVuZGVyaW5nDQotLy8NCi0NCi1IREMgTkVBUiBQQVNDQUwgR2V0SHlwZXJvaWREQyggSFdORCBoV25kICkNCi17DQotCUhEQyAgICAgICAgICAgICBoREM7DQotCUlOVCAgICAgICAgICAgICBjeCwgY3k7DQotCVJFQ1QgICAgICAgICAgICByZWN0Ow0KLQ0KLQlHZXRDbGllbnRSZWN0KCBoV25kLCAmcmVjdCApOw0KLQljeCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7DQotCWN5ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsNCi0NCi0JaERDID0gR2V0REMoIGhXbmQgKTsNCi0NCi0JLy8gc2V0IHVwIHRoZSBtYXBwaW5nIG1vZGUNCi0JU2V0TWFwTW9kZSggaERDLCBNTV9JU09UUk9QSUMgKTsNCi0JU2V0V2luZG93RXh0KCBoREMsIE1BWF9DT09SRCwgTUFYX0NPT1JEICk7DQotCVNldFZpZXdwb3J0RXh0KCBoREMsIGN4IC8gMiwgLWN5IC8gMiApOw0KLQlTZXRWaWV3cG9ydE9yZyggaERDLCBjeCAvIDIsIGN5IC8gMiApOw0KLQ0KLQkvLyByZWFsaXplIHRoZSBwYWxldHRlDQotCVNlbGVjdFBhbGV0dGUoIGhEQywgaEFwcFBhbGV0dGUsIDAgKTsNCi0JUmVhbGl6ZVBhbGV0dGUoIGhEQyApOw0KLQ0KLQlyZXR1cm4oIGhEQyApOw0KLX0NCi0NCi0vLw0KLS8vIERyYXdPYmplY3RzIC0gdHJhbnNmb3JtIGFuZCByZWRyYXcgZXZlcnl0aGluZyBpbiB0aGUgc3lzdGVtDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdPYmplY3RzKCBIV05EIGhXbmQgKQ0KLXsNCi0JSERDICAgICAgICAgICAgIGhEQyA9IEdldEh5cGVyb2lkREMoIGhXbmQgKTsNCi0NCi0JLy8gbW92ZSBhbmQgZHJhdyB0aGluZ3MgKEkgZG9uJ3QgdGhpbmsgdGhlIG9yZGVyIGlzIGltcG9ydGFudC4uLikNCi0JRHJhd1BsYXllciggaERDICk7DQotCURyYXdGbGFtZXMoIGhEQyApOw0KLQlEcmF3U2hvdHMoIGhEQyApOw0KLQlEcmF3Um9pZHMoIGhEQyApOw0KLQlEcmF3U3Bpbm5lcnMoIGhEQyApOw0KLQlEcmF3U3dhcm1lcnMoIGhEQyApOw0KLQlEcmF3SHVudGVycyggaERDICk7DQotCURyYXdIdW50ZXJTaG90cyggaERDICk7DQotCURyYXdMZXR0ZXJzKCBoREMgKTsNCi0JRHJhd0JvbnVzZXMoIGhEQyApOw0KLQkvLyAoLi4uYnV0IEknbSBub3QgY2hhbmdpbmcgaXQhISEgOi0pDQotDQotCVJlbGVhc2VEQyggaFduZCwgaERDICk7DQotfQ0KLQ0KLS8vDQotLy8gU2V0SW5kaWNhdG9yIC0gc2V0IGEgcXVhbnRpdHkgaW5kaWNhdG9yDQotLy8NCi0NCi1JTlQgTkVBUiBQQVNDQUwgU2V0SW5kaWNhdG9yKCBOUFNUUiBucEJ1ZmYsIENIQVIgSURCaXRtYXAsIElOVCBuUXVhbnQgKQ0KLXsNCi0JaWYgKG5RdWFudCA+IDUpDQotCXsNCi0JCSpucEJ1ZmYrKyA9IElEQml0bWFwOyAqbnBCdWZmKysgPSBJREJpdG1hcDsNCi0JCSpucEJ1ZmYrKyA9IElEQml0bWFwOyAqbnBCdWZmKysgPSBJREJpdG1hcDsNCi0JCSpucEJ1ZmYrKyA9IElEQl9wbHVzOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJSU5UIG5CbGFuayA9IDUgLSBuUXVhbnQ7DQotCQl3aGlsZSAoblF1YW50LS0pICpucEJ1ZmYrKyA9IElEQml0bWFwOw0KLQkJd2hpbGUgKG5CbGFuay0tKSAqbnBCdWZmKysgPSBJREJfYmxhbms7DQotCX0NCi0JcmV0dXJuKCA1ICk7DQotfQ0KLQ0KLS8vDQotLy8gQ2hlY2tTY29yZSAtIHNob3cgdGhlIHNjb3JlIGFuZCBzdWNoIHN0dWZmDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIENoZWNrU2NvcmUoIEhXTkQgaFduZCApDQotew0KLQlDSEFSICAgICAgICAgICAgc3pCdWZmW3NpemVvZihzelNjb3JlKV07DQotCU5QU1RSICAgICAgICAgICBucEJ1ZmYgPSBzekJ1ZmY7DQotCUlOVCAgICAgICAgICAgICBuTGl2ZXMsIG5MZW4sIG5DbnQsIHgsIHk7DQotCUhCSVRNQVAgICAgICAgICBoYm1PbGQ7DQotCUhEQyAgICAgICAgICAgICBoREMsIGhEQ01lbTsNCi0NCi0JaWYgKElzSWNvbmljKCBoV25kICkpIHJldHVybjsNCi0JaWYgKGxTY29yZSAtIGxMYXN0TGlmZSA+IEVYVFJBX0xJRkUpDQotCXsNCi0JCUFkZEV4dHJhTGlmZSgpOw0KLQkJbExhc3RMaWZlID0gbFNjb3JlOw0KLQl9DQotCW5MaXZlcyA9ICgobnBQbGF5ZXItPm5Db3VudCA+IDApID8gbnBQbGF5ZXItPm5Db3VudCA6IC1ucFBsYXllci0+bkNvdW50KTsNCi0NCi0JKm5wQnVmZisrID0gSURCX2xldmVsOw0KLQl3c3ByaW50ZiggbnBCdWZmLCAiJTIuMnUiLCBuTGV2ZWwgKTsNCi0Jd2hpbGUgKGlzZGlnaXQoICpucEJ1ZmYgKSkNCi0JCSpucEJ1ZmYgPSAoQ0hBUikoKm5wQnVmZiArIElEQl9udW0wIC0gJzAnKSwgKytucEJ1ZmY7DQotCSpucEJ1ZmYrKyA9IElEQl9ibGFuazsgKm5wQnVmZisrID0gSURCX3Njb3JlOw0KLQl3c3ByaW50ZiggbnBCdWZmLCAiJTcuN2x1IiwgbFNjb3JlICk7DQotCXdoaWxlIChpc2RpZ2l0KCAqbnBCdWZmICkpDQotCQkqbnBCdWZmID0gKENIQVIpKCpucEJ1ZmYgKyBJREJfbnVtMCAtICcwJyksICsrbnBCdWZmOw0KLQkqbnBCdWZmKysgPSBJREJfYmxhbms7DQotCW5wQnVmZiArPSBTZXRJbmRpY2F0b3IoIG5wQnVmZiwgSURCX2xpZmUsIG5MaXZlcyApOw0KLQlucEJ1ZmYgKz0gU2V0SW5kaWNhdG9yKCBucEJ1ZmYsIElEQl9zaGllbGQsIG5TaGllbGQgKTsNCi0JbnBCdWZmICs9IFNldEluZGljYXRvciggbnBCdWZmLCBJREJfYm9tYiwgbkJvbWIgKTsNCi0JbkxlbiA9IG5wQnVmZiAtIHN6QnVmZjsNCi0NCi0JaERDID0gR2V0V2luZG93REMoIGhXbmQgKTsNCi0JSW50ZXJzZWN0Q2xpcFJlY3QoIGhEQywgcmVjdFNjb3JlQ2xpcC5sZWZ0LCByZWN0U2NvcmVDbGlwLnRvcCwNCi0JCQkJCQkJcmVjdFNjb3JlQ2xpcC5yaWdodCwgcmVjdFNjb3JlQ2xpcC5ib3R0b20gKTsNCi0JaERDTWVtID0gQ3JlYXRlQ29tcGF0aWJsZURDKCBoREMgKTsNCi0JaGJtT2xkID0gU2VsZWN0T2JqZWN0KCBoRENNZW0sIGhCaXRtYXBbMF0gKTsNCi0JeCA9IHJlY3RTY29yZUNsaXAubGVmdDsNCi0JeSA9IHJlY3RTY29yZUNsaXAudG9wOw0KLQ0KLQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgbkxlbjsgKytuQ250KQ0KLQl7DQotCQlpZiAoc3pCdWZmW25DbnRdICE9IHN6U2NvcmVbbkNudF0pDQotCQl7DQotCQkJU2VsZWN0T2JqZWN0KCBoRENNZW0sIGhCaXRtYXBbc3pCdWZmW25DbnRdIC0gSURCX2JsYW5rXSApOw0KLQkJCUJpdEJsdCggaERDLCB4LCB5LCBDWF9CSVRNQVAsIENZX0JJVE1BUCwgaERDTWVtLCAwLCAwLCBTUkNDT1BZICk7DQotCQkJc3pTY29yZVtuQ250XSA9IHN6QnVmZltuQ250XTsNCi0JCX0NCi0JCXggKz0gQ1hfQklUTUFQOw0KLQl9DQotCWlmIChuQ250IDwgblNjb3JlTGVuKQ0KLQl7DQotCQlTZWxlY3RPYmplY3QoIGhEQ01lbSwgaEJpdG1hcFswXSApOw0KLQkJZG8gew0KLQkJCWlmIChzelNjb3JlW25DbnRdICE9IElEQl9ibGFuaykNCi0JCQl7DQotCQkJCUJpdEJsdCggaERDLCB4LCB5LCBDWF9CSVRNQVAsIENZX0JJVE1BUCwgaERDTWVtLCAwLCAwLCBTUkNDT1BZICk7DQotCQkJCXN6U2NvcmVbbkNudF0gPSBJREJfYmxhbms7DQotCQkJfQ0KLQkJCXggKz0gQ1hfQklUTUFQOw0KLQkJfSB3aGlsZSAoKytuQ250IDwgblNjb3JlTGVuKTsNCi0JfQ0KLQluU2NvcmVMZW4gPSBuTGVuOw0KLQ0KLQlTZWxlY3RPYmplY3QoIGhEQ01lbSwgaGJtT2xkICk7DQotCURlbGV0ZURDKCBoRENNZW0gKTsNCi0JUmVsZWFzZURDKCBoV25kLCBoREMgKTsNCi19DQotDQotLy8NCi0vLyBIaXRMaXN0IC0gSGl0KCkgYSBsaXN0IG9mIHRoaW5ncw0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBIaXRMaXN0KCBIREMgaERDLCBOUExJU1QgbnBMaXN0ICkNCi17DQotCU5QT0JKICAgICAgICAgICBucE9iajsNCi0NCi0JZm9yIChucE9iaiA9IEhlYWRPYmooIG5wTGlzdCApOyBucE9iajsgbnBPYmogPSBOZXh0T2JqKCBucE9iaiApKQ0KLQkJaWYgKG5wT2JqLT5uQ291bnQpIEhpdCggaERDLCBucE9iaiApOw0KLX0NCi0NCi0vLw0KLS8vIEV4cGxvZGVCYWRndXlzIC0gZXhwbG9kZSBhIGxpc3Qgb2YgYmFkZ3V5cw0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBFeHBsb2RlQmFkZ3V5cyggSERDIGhEQywgTlBMSVNUIG5wTGlzdCApDQotew0KLQlOUE9CSiAgICAgICAgICAgbnBPYmo7DQotDQotCXdoaWxlIChucE9iaiA9IEhlYWRPYmooIG5wTGlzdCApKQ0KLQl7DQotCQlLaWxsQmFkR3V5KCk7DQotCQlucE9iai0+bkNvdW50ID0gMDsNCi0JCUV4cGxvZGUoIGhEQywgbnBPYmogKTsNCi0JCVJlbW92ZU9iaiggbnBMaXN0LCBucE9iaiApOw0KLQkJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCBucE9iaiApOw0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gTmV3R2FtZSAtIHN0YXJ0IGEgbmV3IGdhbWUNCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgTmV3R2FtZSggSFdORCBoV25kICkNCi17DQotCUhEQyAgICAgICAgICAgICBoREMgPSBHZXRIeXBlcm9pZERDKCBoV25kICk7DQotDQotCW5wUGxheWVyLT5uQ291bnQgPSAwOw0KLQlucFBsYXllci0+YnlDb2xvciA9IFdISVRFOw0KLQlFeHBsb2RlKCBoREMsIG5wUGxheWVyICk7DQotCVNldFJlc3RhcnQoIFJFU1RBUlRfR0FNRSApOw0KLQlFeHBsb2RlQmFkZ3V5cyggaERDLCAmUm9pZExpc3QgKTsNCi0JRXhwbG9kZUJhZGd1eXMoIGhEQywgJlNwaW5uZXJMaXN0ICk7DQotCUV4cGxvZGVCYWRndXlzKCBoREMsICZTd2FybWVyTGlzdCApOw0KLQlFeHBsb2RlQmFkZ3V5cyggaERDLCAmSHVudGVyTGlzdCApOw0KLQ0KLQlSZWxlYXNlREMoIGhXbmQsIGhEQyApOw0KLX0NCi0NCi0vLw0KLS8vIFJlc3RhcnRIeXBlcm9pZCAtIHNldCB1cCBhIGdhbWUhDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIFJlc3RhcnRIeXBlcm9pZCggVk9JRCApDQotew0KLQlpZiAobnBQbGF5ZXItPm5Db3VudCA9PSAwKQ0KLQl7DQotCQlQT0lOVCBQb3MsIFZlbDsNCi0JCVBvcy54ID0gMDsNCi0JCVBvcy55ID0gLUNMSVBfQ09PUkQgLyAyOw0KLQkJVmVsLnggPSAwOw0KLQkJVmVsLnkgPSAxNTA7DQotCQlQcmludExldHRlcnMoIHN6QXBwTmFtZSwgUG9zLCBWZWwsIFlFTExPVywgODAwICk7DQotCQlucFBsYXllci0+bkNvdW50ID0gMzsNCi0JCWlmIChsSGlnaFNjb3JlIDwgbFNjb3JlKSBsSGlnaFNjb3JlID0gbFNjb3JlOw0KLQkJbExhc3RMaWZlID0gbFNjb3JlID0gMDsNCi0JCW5MZXZlbCA9IDA7DQotCQluU2hpZWxkID0gbkJvbWIgPSAzOw0KLQl9DQotCWVsc2UgaWYgKG5wUGxheWVyLT5uQ291bnQgPCAwKQ0KLQl7DQotCQkvLyBjaGVlc3kgd2F5IG9mIHJlc3RhcnRpbmcgYWZ0ZXIgYSBtYWpvciBjb2xsaXNpb24NCi0JCW5wUGxheWVyLT5uQ291bnQgPSAtbnBQbGF5ZXItPm5Db3VudDsNCi0JCW5TaGllbGQgPSBuQm9tYiA9IDM7DQotCX0NCi0NCi0JbnBQbGF5ZXItPlBvcy54ID0gbnBQbGF5ZXItPlBvcy55ID0gMDsNCi0JbnBQbGF5ZXItPlZlbC54ID0gbnBQbGF5ZXItPlZlbC55ID0gMDsNCi0JbnBQbGF5ZXItPm5EaXIgPSA2NDsNCi0JbnBQbGF5ZXItPm5TcGluID0gMDsNCi0JbnBQbGF5ZXItPmJ5Q29sb3IgPSBHUkVFTjsNCi0JblNhZmUgPSAzMDsNCi0NCi0JaWYgKFNob3RMaXN0Lm5wSGVhZCkNCi0Jew0KLQkJTlBPQkogbnBTaG90Ow0KLQkJZm9yIChucFNob3QgPSBIZWFkT2JqKCAmU2hvdExpc3QgKTsgbnBTaG90OyBucFNob3QgPSBOZXh0T2JqKCBucFNob3QgKSkNCi0JCQlucFNob3QtPm5Db3VudCA9IDE7DQotCX0NCi0NCi0JLy8gcmVzZWVkIHRoZSBhc3Rlcm9pZCBmaWVsZA0KLQlpZiAobkJhZEd1eXMgPT0gMCkNCi0Jew0KLQkJSU5UIG5DbnQ7DQotCQkrK25MZXZlbDsNCi0JCWZvciAobkNudCA9IDUgKyBuTGV2ZWw7IG5DbnQ7IC0tbkNudCkNCi0JCXsNCi0JCQlQT0lOVCBQb3MsIFZlbDsNCi0JCQlQb3MueCA9IGFyYW5kKCBNQVhfQ09PUkQgKiAyICkgLSBNQVhfQ09PUkQ7DQotCQkJUG9zLnkgPSBhcmFuZCggTUFYX0NPT1JEICogMiApIC0gTUFYX0NPT1JEOw0KLQkJCVZlbC54ID0gVmVsLnkgPSAwOw0KLQkJCUNyZWF0ZVJvaWQoIFBvcywgVmVsLCA2ICsgYXJhbmQoIDIgKSwNCi0JCQkJCQkoQllURSkoYXJhbmQoIDIgKSA/IERLWUVMTE9XIDogREtHUkVZKSwNCi0JCQkJCQlhcmFuZCggREVHUkVFX01BWCApLCAzMCArIGFyYW5kKCBuTGV2ZWwgKiA4ICksIDAgKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIFBhbmljIC0gYm9zcyBrZXkgKG9yIGp1c3QgcGF1c2UpDQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIFBhbmljKCBCT09MIGJQYW5pYyApDQotew0KLQlpZiAoYlBhbmljICYmICFiUGF1c2VkKQ0KLQl7DQotCQliUGF1c2VkID0gVFJVRTsNCi0JCUtpbGxUaW1lciggaEFwcFduZCwgRFJBV19USU1FUiApOw0KLQkJU2V0V2luZG93VGV4dCggaEFwcFduZCwgIlByb2dyYW0gTWFuYWdlciBIZWxwIC0gUFJPR01BTi5ITFAiICk7DQotCQlTaG93V2luZG93KCBoQXBwV25kLCBTV19TSE9XTUlOTk9BQ1RJVkUgKTsNCi0JCUludmFsaWRhdGVSZWN0KCBoQXBwV25kLCBOVUxMLCBUUlVFICk7DQotCX0NCi0JZWxzZSBpZiAoYlBhdXNlZCkgLy8gZG91YmxlLXBhbmljID09IG5vcm1hbA0KLQl7DQotCQliUGF1c2VkID0gRkFMU0U7DQotCQlTZXRXaW5kb3dUZXh0KCBoQXBwV25kLCBzekFwcE5hbWUgKTsNCi0JCWlmIChiUGFuaWMpIFNob3dXaW5kb3coIGhBcHBXbmQsIFNXX1JFU1RPUkUgKTsNCi0JCVNldFRpbWVyKCBoQXBwV25kLCBEUkFXX1RJTUVSLCBuRHJhd0RlbGF5LCBOVUxMICk7DQotCX0NCi19DQotDQotLy8NCi0vLyBQYWludEh5cGVyb2lkIC0gcGFpbnQgdGhlIGh5cGVyb2lkIHdpbmRvdw0KLS8vDQotDQotVk9JRCBORUFSIFBBU0NBTCBQYWludEh5cGVyb2lkKCBIV05EIGhXbmQgKQ0KLXsNCi0JUEFJTlRTVFJVQ1QgICAgIHBzOw0KLQ0KLQlCZWdpblBhaW50KCBoV25kLCAmcHMgKTsNCi0JaWYgKGJQYXVzZWQpIERyYXdJY29uKCBwcy5oZGMsIDIsIDIsIExvYWRJY29uKCBoQXBwSW5zdCwgSU5UUkVTKElESV9QQU5JQykgKSApOw0KLQlFbmRQYWludCggaFduZCwgJnBzICk7DQotfQ0KLQ0KLS8vDQotLy8gRXJhc2VIeXBlcm9pZEJrZ25kIC0gZmlsbCBpbiB0aGUgYmFja2dyb3VuZA0KLS8vDQotDQotQk9PTCBORUFSIFBBU0NBTCBFcmFzZUh5cGVyb2lkQmtnbmQoIEhXTkQgaFduZCwgSERDIGhEQyApDQotew0KLQlIQlJVU0ggICAgICAgICAgaGJyOw0KLQlSRUNUICAgICAgICAgICAgcmVjdDsNCi0NCi0JR2V0Q2xpZW50UmVjdCggaFduZCwgJnJlY3QgKTsNCi0NCi0JaWYgKGJQYXVzZWQpDQotCXsNCi0JCVNldEJydXNoT3JnKCBoREMsIDAsIDAgKTsNCi0JCWhiciA9IENyZWF0ZVNvbGlkQnJ1c2goIEdldFN5c0NvbG9yKCBDT0xPUl9CQUNLR1JPVU5EICkgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCVNlbGVjdFBhbGV0dGUoIGhEQywgaEFwcFBhbGV0dGUsIDAgKTsNCi0JCVJlYWxpemVQYWxldHRlKCBoREMgKTsNCi0JCWhiciA9IENyZWF0ZVNvbGlkQnJ1c2goIFBBTEVUVEVJTkRFWCggQkxBQ0sgKSApOw0KLQl9DQotDQotCUZpbGxSZWN0KCBoREMsICZyZWN0LCBoYnIgKTsNCi0JRGVsZXRlT2JqZWN0KCBoYnIgKTsNCi0JcmV0dXJuKCBUUlVFICk7DQotfQ0KLQ0KLS8vDQotLy8gRHJhd1NoYWRvd1JlY3QgLSBkcmF3IGEgc2hhZGVkIHJlY3RhbmdsZSBhcm91bmQgYW4gb2JqZWN0DQotLy8NCi0NCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdTaGFkb3dSZWN0KCBIREMgaERDLCBOUFJFQ1QgbnBSZWN0LCBIUEVOIGhIaSwgSFBFTiBoTG8gKQ0KLXsNCi0JU2VsZWN0T2JqZWN0KCBoREMsIGhIaSApOw0KLQlNb3ZlVG8oIGhEQywgbnBSZWN0LT5yaWdodCwgbnBSZWN0LT50b3AgKTsNCi0JTGluZVRvKCBoREMsIG5wUmVjdC0+bGVmdCwgbnBSZWN0LT50b3AgKTsNCi0JTGluZVRvKCBoREMsIG5wUmVjdC0+bGVmdCwgbnBSZWN0LT5ib3R0b20gKTsNCi0JU2VsZWN0T2JqZWN0KCBoREMsIGhMbyApOw0KLQlMaW5lVG8oIGhEQywgbnBSZWN0LT5yaWdodCwgbnBSZWN0LT5ib3R0b20gKTsNCi0JTGluZVRvKCBoREMsIG5wUmVjdC0+cmlnaHQsIG5wUmVjdC0+dG9wICk7DQotfQ0KLQ0KLS8vDQotLy8gTkNQYWludEh5cGVyb2lkIC0gcGFpbnQgYSBjdXN0b20gZnJhbWUNCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgTkNQYWludEh5cGVyb2lkKCBIV05EIGhXbmQgKQ0KLXsNCi0JSERDICAgICAgICAgICAgIGhEQywgaERDTWVtOw0KLQlJTlQgICAgICAgICAgICAgY3gsIGN5LCBjeUNhcCwgaDsNCi0JSFBFTiAgICAgICAgICAgIGhwZW5IaSwgaHBlbkxvOw0KLQlIQlJVU0ggICAgICAgICAgaGJyOw0KLQlIQklUTUFQICAgICAgICAgaGJtLCBoYm1PbGQ7DQotCUJJVE1BUCAgICAgICAgICBibTsNCi0JUkVDVCAgICAgICAgICAgIHJlY3Q7DQotDQotCWlmIChJc0ljb25pYyggaFduZCApKSByZXR1cm47DQotCWhEQyA9IEdldFdpbmRvd0RDKCBoV25kICk7DQotCUdldFdpbmRvd1JlY3QoIGhXbmQsICZyZWN0ICk7DQotCXJlY3QucmlnaHQgLT0gcmVjdC5sZWZ0LCByZWN0LmxlZnQgPSAwOw0KLQlyZWN0LmJvdHRvbSAtPSByZWN0LnRvcCwgcmVjdC50b3AgPSAwOw0KLQljeCA9IEdldFN5c3RlbU1ldHJpY3MoIFNNX0NYRlJBTUUgKTsNCi0JY3kgPSBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWUZSQU1FICk7DQotCWN5Q2FwID0gY3kgKyBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWUNBUFRJT04gKSAtIDE7DQotCWggPSByZWN0LmJvdHRvbSAtIChjeUNhcCArIGN5KTsNCi0NCi0JU2VsZWN0UGFsZXR0ZSggaERDLCBoQXBwUGFsZXR0ZSwgMCApOw0KLQlSZWFsaXplUGFsZXR0ZSggaERDICk7DQotCWlmIChiQlcpDQotCXsNCi0JCWhiciA9IFNlbGVjdE9iamVjdCggaERDLCBDcmVhdGVTb2xpZEJydXNoKCBQQUxFVFRFSU5ERVgoIFdISVRFICkgKSApOw0KLQkJaHBlbkhpID0gaFBlbltCTEFDS107DQotCQlocGVuTG8gPSBoUGVuW0JMQUNLXTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWhiciA9IFNlbGVjdE9iamVjdCggaERDLCBDcmVhdGVTb2xpZEJydXNoKCBQQUxFVFRFSU5ERVgoIEdSRVkgKSApICk7DQotCQlocGVuSGkgPSBoUGVuW1dISVRFXTsNCi0JCWhwZW5MbyA9IGhQZW5bREtHUkVZXTsNCi0JfQ0KLQ0KLQlQYXRCbHQoIGhEQywgMCwgMCwgcmVjdC5yaWdodCwgY3lDYXAsIFBBVENPUFkgKTsNCi0JUGF0Qmx0KCBoREMsIDAsIHJlY3QuYm90dG9tIC0gY3ksIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCBQQVRDT1BZICk7DQotCVBhdEJsdCggaERDLCAwLCBjeUNhcCwgY3gsIGgsIFBBVENPUFkgKTsNCi0JUGF0Qmx0KCBoREMsIHJlY3QucmlnaHQgLSBjeCwgY3lDYXAsIGN4LCBoLCBQQVRDT1BZICk7DQotDQotCS0tcmVjdC5ib3R0b207IC0tcmVjdC5yaWdodDsNCi0JRHJhd1NoYWRvd1JlY3QoIGhEQywgJnJlY3QsIGhwZW5IaSwgaHBlbkxvICk7DQotCS0tY3g7IC0tY3k7DQotCXJlY3QubGVmdCArPSBjeDsgcmVjdC50b3AgKz0gY3k7DQotCXJlY3QucmlnaHQgLT0gY3g7IHJlY3QuYm90dG9tIC09IGN5Ow0KLQlpZiAoIWJCVykgRHJhd1NoYWRvd1JlY3QoIGhEQywgJnJlY3QsIGhwZW5MbywgaHBlbkhpICk7DQotDQotCS8vIGdldCB0aGUgdGl0bGUgYmFyIHJlY3QNCi0JKytyZWN0LmxlZnQ7ICsrcmVjdC50b3A7IC0tcmVjdC5yaWdodDsNCi0JcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGN5Q2FwIC0gKGN5ICsgMik7DQotCURyYXdTaGFkb3dSZWN0KCBoREMsICZyZWN0LCBocGVuSGksIGhwZW5MbyApOw0KLQkrK3JlY3QucmlnaHQ7IC8vIGZvciB6b29tL3Jlc3RvcmUgYml0bWFwDQotDQotCWhEQ01lbSA9IENyZWF0ZUNvbXBhdGlibGVEQyggaERDICk7DQotDQotCWhibSA9IExvYWRCaXRtYXAoIE5VTEwsIElOVFJFUyhPQk1fQ0xPU0UpICk7DQotCUdldE9iamVjdCggaGJtLCBzaXplb2YoYm0pLCAoTFBTVFIpJmJtICk7DQotCWJtLmJtV2lkdGggLz0gMjsgLy8gdGhleSBwYWNrZWQgdHdvIGltYWdlcyBpbiBoZXJlIQ0KLQloYm1PbGQgPSBTZWxlY3RPYmplY3QoIGhEQ01lbSwgaGJtICk7DQotCUJpdEJsdCggaERDLCByZWN0LmxlZnQsIHJlY3QudG9wLCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCwgaERDTWVtLCAwLCAwLCBTUkNDT1BZICk7DQotCXJlY3QubGVmdCArPSBibS5ibVdpZHRoOw0KLQ0KLQlpZiAoSXNab29tZWQoIGhXbmQgKSkgaGJtID0gTG9hZEJpdG1hcCggTlVMTCwgSU5UUkVTKE9CTV9SRVNUT1JFKSApOw0KLQllbHNlIGhibSA9IExvYWRCaXRtYXAoIE5VTEwsIElOVFJFUyhPQk1fWk9PTSkgKTsNCi0JR2V0T2JqZWN0KCBoYm0sIHNpemVvZihibSksIChMUFNUUikmYm0gKTsNCi0JU2VsZWN0T2JqZWN0KCBoRENNZW0sIGhibSApOw0KLQlyZWN0LnJpZ2h0IC09IGJtLmJtV2lkdGg7DQotCUJpdEJsdCggaERDLCByZWN0LnJpZ2h0LCByZWN0LnRvcCwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQsIGhEQ01lbSwgMCwgMCwgU1JDQ09QWSApOw0KLQ0KLQloYm0gPSBMb2FkQml0bWFwKCBOVUxMLCBJTlRSRVMoT0JNX1JFRFVDRSkgKTsNCi0JR2V0T2JqZWN0KCBoYm0sIHNpemVvZihibSksIChMUFNUUikmYm0gKTsNCi0JU2VsZWN0T2JqZWN0KCBoRENNZW0sIGhibSApOw0KLQlyZWN0LnJpZ2h0IC09IGJtLmJtV2lkdGg7DQotCUJpdEJsdCggaERDLCByZWN0LnJpZ2h0LCByZWN0LnRvcCwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQsIGhEQ01lbSwgMCwgMCwgU1JDQ09QWSApOw0KLQ0KLQktLXJlY3QucmlnaHQ7DQotCURyYXdTaGFkb3dSZWN0KCBoREMsICZyZWN0LCBocGVuSGksIGhwZW5MbyApOw0KLQ0KLQkvLyBjbGlwIHRoZSBzY29yZSB0byB0aGUgZnJlZSB0aXRsZWJhciBhcmVhDQotCSsrcmVjdC5sZWZ0OyArK3JlY3QudG9wOw0KLQlyZWN0U2NvcmVDbGlwID0gcmVjdDsNCi0NCi0JRGVsZXRlT2JqZWN0KCBTZWxlY3RPYmplY3QoIGhEQ01lbSwgaGJtT2xkICkgKTsNCi0JRGVsZXRlT2JqZWN0KCBTZWxlY3RPYmplY3QoIGhEQywgaGJyICkgKTsNCi0JRGVsZXRlREMoIGhEQ01lbSApOw0KLQlSZWxlYXNlREMoIGhXbmQsIGhEQyApOw0KLQ0KLQkvLyBtYWtlIHN1cmUgdGhlIHNjb3JlIGdldHMgcmVkcmF3bg0KLQlmb3IgKGN4ID0gMDsgY3ggPCBuU2NvcmVMZW47ICsrY3gpIHN6U2NvcmVbY3hdID0gJ1wwJzsNCi19DQotDQotLy8NCi0vLyBIeXBlcm9pZFduZFByb2MgLSB0aGUgbWFpbiB3aW5kb3cgcHJvYyBmb3IgSHlwZXJvaWQNCi0vLw0KLQ0KLUxPTkcgRkFSIFBBU0NBTCBFWFBPUlQgSHlwZXJvaWRXbmRQcm9jKCBIV05EIGhXbmQsIHVuc2lnbmVkIG1lc3NhZ2UsDQotCQkJCQkJCQkJCVdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApDQotew0KLQlzd2l0Y2ggKG1lc3NhZ2UpDQotCXsNCi0JY2FzZSBXTV9DUkVBVEU6DQotCQlSZXN0YXJ0SHlwZXJvaWQoKTsNCi0JCVNldFRpbWVyKCBoV25kLCBEUkFXX1RJTUVSLCBuRHJhd0RlbGF5LCBOVUxMICk7DQotCQlOQ1BhaW50SHlwZXJvaWQoIGhXbmQgKTsNCi0JCWJyZWFrOw0KLQ0KLQljYXNlIFdNX1RJTUVSOg0KLQkJc3dpdGNoICh3UGFyYW0pDQotCQl7DQotCQljYXNlIERSQVdfVElNRVI6DQotCQkJQ2hlY2tTY29yZSggaFduZCApOw0KLQkJCURyYXdPYmplY3RzKCBoV25kICk7DQotCQkJcmV0dXJuKCAwICk7DQotDQotCQljYXNlIFJFU1RBUlRfVElNRVI6DQotCQkJS2lsbFRpbWVyKCBoV25kLCBSRVNUQVJUX1RJTUVSICk7DQotCQkJYlJlc3RhcnQgPSBGQUxTRTsNCi0JCQlSZXN0YXJ0SHlwZXJvaWQoKTsNCi0JCQlyZXR1cm4oIDAgKTsNCi0JCX0NCi0JCWJyZWFrOw0KLQ0KLQljYXNlIFdNX1NZU0NPTU1BTkQ6DQotCQlzd2l0Y2ggKHdQYXJhbSkNCi0JCXsNCi0JCWNhc2UgSURNX05FVzoNCi0JCQlOZXdHYW1lKCBoV25kICk7DQotCQkJYnJlYWs7DQotDQotCQljYXNlIElETV9BQk9VVDoNCi0JCQlBYm91dEh5cGVyb2lkKCBoV25kICk7DQotCQkJYnJlYWs7DQotDQotCQlkZWZhdWx0Og0KLQkJCXJldHVybiggRGVmV2luZG93UHJvYyggaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKSApOw0KLQkJfQ0KLQkJYnJlYWs7DQotDQotCWNhc2UgV01fUVVFUllPUEVOOg0KLQkJUGFuaWMoIEZBTFNFICk7DQotCQlyZXR1cm4oIERlZldpbmRvd1Byb2MoIGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICkgKTsNCi0NCi0JY2FzZSBXTV9DSEFSOg0KLQkJaWYgKHdQYXJhbSA9PSBWS19FU0NBUEUpIFBhbmljKCBUUlVFICk7DQotCQlicmVhazsNCi0NCi0JY2FzZSBXTV9TWVNLRVlET1dOOg0KLQljYXNlIFdNX1NZU0tFWVVQOg0KLQljYXNlIFdNX1NZU0NIQVI6DQotCQlpZiAobFBhcmFtICYgKDFMPDwyOSkpIC8vIGFsdCBrZXkgaXMgZG93bg0KLQkJew0KLQkJCXJldHVybiggRGVmV2luZG93UHJvYyggaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKSApOw0KLQkJfQ0KLQkJc3dpdGNoICh3UGFyYW0pDQotCQl7DQotCQljYXNlIFZLX0VTQ0FQRToNCi0JCQlpZiAobWVzc2FnZSA9PSBXTV9TWVNLRVlET1dOKSBQYW5pYyggVFJVRSApOw0KLQkJCXJldHVybiggMCApOw0KLQkJY2FzZSBWS19TUEFDRToNCi0JCWNhc2UgVktfVEFCOg0KLQkJCXJldHVybiggMCApOw0KLQkJZGVmYXVsdDoNCi0JCQlyZXR1cm4oIERlZldpbmRvd1Byb2MoIGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICkgKTsNCi0JCX0NCi0JCWJyZWFrOw0KLQ0KLQljYXNlIFdNX0VSQVNFQktHTkQ6DQotCQlyZXR1cm4oIEVyYXNlSHlwZXJvaWRCa2duZCggaFduZCwgKEhEQyl3UGFyYW0gKSApOw0KLQ0KLQljYXNlIFdNX05DQUNUSVZBVEU6DQotCWNhc2UgV01fTkNQQUlOVDoNCi0JCU5DUGFpbnRIeXBlcm9pZCggaFduZCApOw0KLQkJcmV0dXJuKCBUUlVFICk7DQotDQotCWNhc2UgV01fUEFJTlQ6DQotCQlQYWludEh5cGVyb2lkKCBoV25kICk7DQotCQlicmVhazsNCi0NCi0JY2FzZSBXTV9RVUVSWU5FV1BBTEVUVEU6DQotCQl7DQotCQkJSERDIGhEQyA9IEdldERDKCBoV25kICk7DQotCQkJU2VsZWN0UGFsZXR0ZSggaERDLCBoQXBwUGFsZXR0ZSwgMCApOw0KLQkJCVJlYWxpemVQYWxldHRlKCBoREMgKTsNCi0JCQlSZWxlYXNlREMoIGhXbmQsIGhEQyApOw0KLQkJfQ0KLQkJcmV0dXJuKCBUUlVFICk7DQotDQotICAgIGNhc2UgV01fREVTVFJPWToNCi0JCUtpbGxUaW1lciggaFduZCwgRFJBV19USU1FUiApOw0KLQkJS2lsbFRpbWVyKCBoV25kLCBSRVNUQVJUX1RJTUVSICk7DQotCQlTYXZlSHlwZXJvaWRXaW5kb3dQb3MoIGhXbmQgKTsNCi0JCVBvc3RRdWl0TWVzc2FnZSggMCApOw0KLSAgICAgICAgYnJlYWs7DQotDQotCWRlZmF1bHQ6DQotCQlyZXR1cm4oIERlZldpbmRvd1Byb2MoIGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICkgKTsNCi0gICAgfQ0KLQlyZXR1cm4oIDAgKTsNCi19DQotDQotLy8NCi0vLyBJbml0SHlwZXJvaWQgLSBpbml0aWFsaXplIGV2ZXJ5dGhpbmcNCi0vLw0KLQ0KLUJPT0wgTkVBUiBQQVNDQUwgSW5pdEh5cGVyb2lkKCBWT0lEICkNCi17DQotCURPVUJMRSAgICAgICAgICBkUmFkOw0KLQlJTlQgICAgICAgICAgICAgbkNudDsNCi0NCi0JLy8gYWxsb2NhdGUgdGhlIGxvZ2ljYWwgcGFsZXR0ZQ0KLQloQXBwUGFsZXR0ZSA9IENyZWF0ZUh5cGVyb2lkUGFsZXR0ZSgpOw0KLQlpZiAoIWhBcHBQYWxldHRlKSByZXR1cm4oIEZBTFNFICk7DQotCWZvciAobkNudCA9IDA7IG5DbnQgPCBQQUxFVFRFX1NJWkU7ICsrbkNudCkNCi0Jew0KLQkJaFBlbltuQ250XSA9IENyZWF0ZVBlbiggUFNfU09MSUQsIDEsIFBBTEVUVEVJTkRFWCggbkNudCApICk7DQotCQlpZiAoIWhQZW5bbkNudF0pIHJldHVybiggRkFMU0UgKTsNCi0JfQ0KLQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgSURCX01BWDsgKytuQ250KQ0KLQl7DQotCQloQml0bWFwW25DbnRdID0gTG9hZEJpdG1hcCggaEFwcEluc3QsIElOVFJFUyhJREJfYmxhbmsgKyBuQ250KSApOw0KLQkJaWYgKCFoUGVuW25DbnRdKSByZXR1cm4oIEZBTFNFICk7DQotCX0NCi0NCi0JLy8gc2VlZCB0aGUgcmFuZG9taXplcg0KLQlkd1NlZWQgPSBHZXRDdXJyZW50VGltZSgpOw0KLQ0KLQkvLyBjcmVhdGUgdGhlIGxvb2t1cCB0YWJsZSAoc2hvdWxkIHVzZSByZXNvdXJjZXMpDQotCWZvciAobkNudCA9IDA7IG5DbnQgPCBERUdSRUVfU0laRTsgKytuQ250KQ0KLQl7DQotCQlkUmFkID0gbkNudCAqIDYuMjgzMTg1NSAvIERFR1JFRV9TSVpFOw0KLQkJbkNvc1tuQ250XSA9IChJTlQpKERFR1JFRV9NQVggKiBjb3MoIGRSYWQgKSk7DQotCQluU2luW25DbnRdID0gKElOVCkoREVHUkVFX01BWCAqIHNpbiggZFJhZCApKTsNCi0JfQ0KLQ0KLQkvLyBnZXQgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgaW5mbw0KLQlHZXRIeXBlcm9pZEluaSgpOw0KLQ0KLQkvLyBhbGxvY2F0ZSBhbGwgb2JqZWN0cyBhcyBmcmVlDQotCWZvciAobkNudCA9IDA7IG5DbnQgPCBNQVhfT0JKUzsgKytuQ250KQ0KLQkJQWRkSGVhZE9iaiggJkZyZWVMaXN0LCAmKE9ialtuQ250XSkgKTsNCi0NCi0JLy8gc2V0IHVwIHRoZSBwbGF5ZXINCi0JbnBQbGF5ZXIgPSBSZW1IZWFkT2JqKCAmRnJlZUxpc3QgKTsNCi0JbnBQbGF5ZXItPmJ5UHRzID0gRElNKFBsYXllcik7DQotCW5wUGxheWVyLT5uTWFzcyA9IDI1NjsNCi0JZm9yIChuQ250ID0gMDsgbkNudCA8IERJTShQbGF5ZXIpOyArK25DbnQpDQotCQlucFBsYXllci0+UHRzW25DbnRdID0gUGxheWVyW25DbnRdOw0KLQ0KLQlyZXR1cm4oIFRSVUUgKTsNCi19DQotDQotLy8NCi0vLyBFeGl0SHlwZXJvaWQgLSBxdWl0IHRoZSBkYW1uIGdhbWUgYWxyZWFkeSENCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgRXhpdEh5cGVyb2lkKCBWT0lEICkNCi17DQotCUlOVCAgICAgICAgICAgICBuQ250Ow0KLQ0KLQlpZiAoaEFwcFBhbGV0dGUpIERlbGV0ZU9iamVjdCggaEFwcFBhbGV0dGUgKTsNCi0JZm9yIChuQ250ID0gMDsgbkNudCA8IFBBTEVUVEVfU0laRTsgKytuQ250KQ0KLQkJaWYgKGhQZW5bbkNudF0pIERlbGV0ZU9iamVjdCggaFBlbltuQ250XSApOw0KLQlmb3IgKG5DbnQgPSAwOyBuQ250IDwgSURCX01BWDsgKytuQ250KQ0KLQkJaWYgKGhCaXRtYXBbbkNudF0pIERlbGV0ZU9iamVjdCggaEJpdG1hcFtuQ250XSApOw0KLX0NCi0NCi0vLw0KLS8vIFdpbk1haW4gLSBldmVyeWJvZHkgaGFzIHRvIGhhdmUgb25lDQotLy8NCi0NCi1JTlQgRkFSIFBBU0NBTCBXaW5NYWluKCBIQU5ETEUgaEluc3RhbmNlLCBIQU5ETEUgaFByZXZJbnN0YW5jZSwNCi0JCQkJCQlMUFNUUiBscHN6Q21kTGluZSwgSU5UIG5DbWRTaG93ICkNCi17DQotCU1TRyAgICAgICAgIG1zZzsNCi0NCi0JaEFwcEluc3QgPSBoSW5zdGFuY2U7DQotCWlmICghaFByZXZJbnN0YW5jZSkNCi0Jew0KLQkJLy8gY3JlYXRlIHRoZSBjbGFzcyBpZiB3ZSdyZSBmaXJzdA0KLQkJaWYgKCFDcmVhdGVIeXBlcm9pZENsYXNzKCkpIHJldHVybiggRkFMU0UgKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCS8vIENvcHkgZGF0YSBmcm9tIHByZXZpb3VzIGluc3RhbmNlDQotCQlHZXRJbnN0YW5jZURhdGEoIGhQcmV2SW5zdGFuY2UsIChQU1RSKXN6QXBwTmFtZSwgc2l6ZW9mKHN6QXBwTmFtZSkgKTsNCi0JfQ0KLQlpZiAoIUluaXRIeXBlcm9pZCgpKSBnb3RvIEFib3J0OyAvLyBJIExPVkUgR09UT1MhIFJFQUxMWSBJIERPIQ0KLQloQXBwV25kID0gQ3JlYXRlSHlwZXJvaWRXaW5kb3coIGxwc3pDbWRMaW5lLCBuQ21kU2hvdyApOw0KLQlpZiAoIWhBcHBXbmQpIHJldHVybiggRkFMU0UgKTsNCi0NCi0Jd2hpbGUgKEdldE1lc3NhZ2UoICZtc2csIE5VTEwsIDAsIDAgKSkNCi0Jew0KLQkJVHJhbnNsYXRlTWVzc2FnZSggJm1zZyApOw0KLQkJRGlzcGF0Y2hNZXNzYWdlKCAmbXNnICk7DQotCX0NCi0NCi1BYm9ydDoNCi0JRXhpdEh5cGVyb2lkKCk7DQotCXJldHVybiggbXNnLndQYXJhbSApOw0KLX0NCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLmRlZiBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuZGVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzA5MDA3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTkFNRSAgICAgICAgICAgICAgICAgICAgSHlwZXJvaWQNCi1ERVNDUklQVElPTiAgICAgICAgICAgICAnSHlwZXJvaWQgQ29weXJpZ2h0IChDKSAxOTkwLDkxIEh1dGNoaW5zIFNvZnR3YXJlJw0KLUVYRVRZUEUgICAgICAgICAgICAgICAgIFdJTkRPV1MNCi1TVFVCICAgICAgICAgICAgICAgICAgICAnV0lOU1RVQi5FWEUnDQotU1RBQ0tTSVpFICAgICAgICAgICAgICAgNDA5Ng0KLUhFQVBTSVpFICAgICAgICAgICAgICAgIDMyNzY4DQotREFUQSAgICAgICAgICAgICAgICAgICAgTU9WRUFCTEUgTVVMVElQTEUNCi1DT0RFICAgICAgICAgICAgICAgICAgICBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFDQotU0VHTUVOVFMNCi0JSFlQRVJPSUQgICAgICAgICAgICBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFDQotCVJPSURTVVBQICAgICAgICAgICAgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQ0KLQ0KLUVYUE9SVFMNCi0JSHlwZXJvaWRXbmRQcm9jICAgICBAMQ0KLQlIeXBlcm9pZEFib3V0RGxnICAgIEAyDQpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5leGUgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLmV4ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzNGY2Mi4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLmV4ZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaCBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2YjA1Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8NCi0vLyBIWVBFUk9JRC5IIC0gaHlwZXJvaWQgaW50ZXJuYWwgaGVhZGVyIGluZm9ybWF0aW9uDQotLy8NCi0vLyBWZXJzaW9uOiAxLjEgIENvcHlyaWdodCAoQykgMTk5MCw5MSBIdXRjaGlucyBTb2Z0d2FyZQ0KLS8vICAgICAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UNCi0vLyAgICAgIFBsZWFzZSByZWFkIHRoZSBhc3NvY2lhdGVkIGxlZ2FsIGRvY3VtZW50YXRpb24NCi0vLyBBdXRob3I6IEVkd2FyZCBIdXRjaGlucw0KLS8vIFJldmlzaW9uczoNCi0vLw0KLQ0KLSNpZm5kZWYgUkNfSU5WT0tFRA0KLQ0KLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8c3RyaW5nLmg+DQotI2luY2x1ZGUgPGN0eXBlLmg+DQotI2luY2x1ZGUgPG1hdGguaD4NCi0jaW5jbHVkZSA8bGltaXRzLmg+DQotI2RlZmluZSBPRU1SRVNPVVJDRQ0KLSNpbmNsdWRlIDx3aW5leHQuaD4NCi0NCi0vLw0KLS8vIHR5cGVkZWZzIGFuZCBkZWZpbmVzDQotLy8NCi0NCi0vLyBjb2xvciBzdHVmZg0KLSNkZWZpbmUgUEFMRVRURV9TSVpFIDE2DQotdHlwZWRlZiBlbnVtDQotew0KLQlCTEFDSywgREtHUkVZLCBHUkVZLCBXSElURSwNCi0JREtSRUQsIFJFRCwgREtHUkVFTiwgR1JFRU4sIERLQkxVRSwgQkxVRSwNCi0JREtZRUxMT1csIFlFTExPVywgREtDWUFOLCBDWUFOLCBES01BR0VOVEEsIE1BR0VOVEENCi19IENPTE9SUzsNCi0NCi0vLyBkZWdyZWVzIHNjYWxlZCB0byBpbnRlZ2VyIG1hdGgNCi0jZGVmaW5lIERFR1JFRV9TSVpFIDI1Ng0KLSNkZWZpbmUgREVHUkVFX01BU0sgMjU1DQotI2RlZmluZSBERUdSRUVfTUFYIDB4NDAwMA0KLQ0KLS8vIG9iamVjdCBsaW1pdHMNCi0jZGVmaW5lIE1BWF9QVFMgOA0KLSNkZWZpbmUgTUFYX09CSlMgMTAwDQotI2RlZmluZSBNQVhfQ09PUkQgMHgyMDAwDQotI2RlZmluZSBDTElQX0NPT1JEIChNQVhfQ09PUkQrMzAwKQ0KLQ0KLS8vIHRpbWVyIHN0dWZmDQotI2RlZmluZSBEUkFXX1RJTUVSIDENCi0jZGVmaW5lIERSQVdfREVMQVkgNTANCi0jZGVmaW5lIFJFU1RBUlRfVElNRVIgMg0KLSNkZWZpbmUgUkVTVEFSVF9ERUxBWSA1MDAwDQotDQotLy8gcmVzdGFydCBtb2Rlcw0KLXR5cGVkZWYgZW51bSB7IFJFU1RBUlRfR0FNRSwgUkVTVEFSVF9MRVZFTCwgUkVTVEFSVF9ORVhUTEVWRUwgfSBSRVNUQVJUX01PREU7DQotDQotLy8gbGV0dGVyIHNjYWxpbmcNCi0jZGVmaW5lIExFVFRFUl9NQVggMjU2DQotDQotLy8gZXh0cmEgbGlmZSBldmVyeQ0KLSNkZWZpbmUgRVhUUkFfTElGRSAxMDAwMDANCi0NCi0vLyBsaXN0IG5vZGUNCi10eXBlZGVmIHN0cnVjdCB0YWdOT0RFDQotew0KLQlzdHJ1Y3QgdGFnTk9ERSAgKm5wTmV4dCwgKm5wUHJldjsNCi19IE5PREU7DQotcG9pbnRlcmRlZiggTk9ERSApOw0KLQ0KLS8vIGxpc3QgaGVhZGVyDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotCU5QTk9ERSAgICAgICAgICBucEhlYWQsIG5wVGFpbDsNCi19IExJU1Q7DQotcG9pbnRlcmRlZiggTElTVCApOw0KLQ0KLS8vIG9iamVjdCBkZXNjcmlwdG9yDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotCU5PREUgICAgICAgICAgICBMaW5rOyAgICAgICAgICAgICAgIC8vIGZvciBvYmplY3QgbGlzdA0KLQlQT0lOVCAgICAgICAgICAgUG9zOyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBvZiBjZW50ZXIgb2Ygb2JqZWN0DQotCVBPSU5UICAgICAgICAgICBWZWw7ICAgICAgICAgICAgICAgIC8vIHZlbG9jaXR5IGluIGxvZ2ljYWwgdW5pdHMvdXBkYXRlDQotCUlOVCAgICAgICAgICAgICBuTWFzczsgICAgICAgICAgICAgIC8vIG1hc3Mgb2Ygb2JqZWN0DQotCUlOVCAgICAgICAgICAgICBuRGlyOyAgICAgICAgICAgICAgIC8vIGRpcmVjdGlvbiBpbiBkZWdyZWVzDQotCUlOVCAgICAgICAgICAgICBuU3BpbjsgICAgICAgICAgICAgIC8vIGFuZ3VsYXIgbW9tZW50dW0gZGVncmVlcy91cGRhdGUNCi0JSU5UICAgICAgICAgICAgIG5Db3VudDsgICAgICAgICAgICAgLy8gdXNlZCBieSBkaWZmZXJlbnQgb2JqZWN0cw0KLQlJTlQgICAgICAgICAgICAgbkRlbGF5OyAgICAgICAgICAgICAvLyB1c2VkIGJ5IGRpZmZlcmVudCBvYmplY3RzDQotCUJZVEUgICAgICAgICAgICBieUNvbG9yOyAgICAgICAgICAgIC8vIHBhbGV0dGUgY29sb3INCi0JQllURSAgICAgICAgICAgIGJ5UHRzOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBvaW50cyBpbiBvYmplY3QNCi0JUE9JTlQgICAgICAgICAgIFB0c1tNQVhfUFRTXTsgICAgICAgLy8gcG9pbnRzIG1ha2luZyB1cCBhbiBvYmplY3QNCi0JUE9JTlQgICAgICAgICAgIE9sZFtNQVhfUFRTXTsgICAgICAgLy8gbGFzdCBwbG90dGVkIGxvY2F0aW9uDQotfSBPQko7DQotcG9pbnRlcmRlZiggT0JKICk7DQotDQotLy8NCi0vLyBpbmxpbmUgbWFjcm8gZnVuY3Rpb25zDQotLy8NCi0NCi0vLyBmdW5jdGlvbiBhbGlhc2VzDQotI2RlZmluZSBBZGRIZWFkT2JqKGwsbykgQWRkSGVhZCgobCksKChOUE5PREUpbykpDQotI2RlZmluZSBSZW1IZWFkT2JqKGwpICgoTlBPQkopUmVtSGVhZChsKSkNCi0jZGVmaW5lIFJlbW92ZU9iaihsLG8pIFJlbW92ZSgobCksKChOUE5PREUpbykpDQotI2RlZmluZSBIZWFkT2JqKGwpICgoTlBPQkopKChsKS0+bnBIZWFkKSkNCi0jZGVmaW5lIE5leHRPYmoobykgKChOUE9CSikoKG8pLT5MaW5rLm5wTmV4dCkpDQotDQotLy8gcmVhbC10aW1lIGNoZWNrIG9mIHRoZSBrZXlib2FyZA0KLSNkZWZpbmUgSXNLZXlEb3duKHgpIChHZXRBc3luY0tleVN0YXRlKHgpPDApDQotDQotLy8gSSBIQVRFIHR5cGluZyB0aGlzIGFsbGF0aW1lIQ0KLSNkZWZpbmUgSU5UUkVTKHgpIE1BS0VJTlRSRVNPVVJDRSh4KQ0KLQ0KLS8vIHNpemUgb2YgYW4gYXJyYXkNCi0jZGVmaW5lIERJTSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQ0KLQ0KLS8vIGZhc3RlciB0aGFuIE11bERpdiENCi0jZGVmaW5lIE1VTERFRyh4LHkpICgoSU5UKSgoKExPTkcpKHgpKih5KSkvREVHUkVFX01BWCkpDQotDQotLy8gREVHIC0gY29udmVydCBhbiBpbnRlZ2VyIGludG8gYSBkZWdyZWUgbG9va3VwIGluZGV4DQotI2RlZmluZSBERUcoeCkgKChXT1JEKSh4KSZERUdSRUVfTUFTSykNCi0NCi0vLyBBQ0NFTCAtIGFjY2VsZXJhdGUgYW4gb2JqZWN0IGluIGEgZ2l2ZW4gZGlyZWN0aW9uDQotI2RlZmluZSBBQ0NFTChvLGQscykgXA0KLSgoKG8pLT5WZWwueCArPSBNVUxERUcoKHMpLG5Db3NbREVHKGQpXSkpLCBcDQotKChvKS0+VmVsLnkgKz0gTVVMREVHKChzKSxuU2luW0RFRyhkKV0pKSkNCi0NCi0vLyBQVElOUkVDVCAtIGEgZmFzdGVyIFB0SW5SZWN0DQotI2RlZmluZSBQVElOUkVDVChyLHApIFwNCi0oKChyKS0+bGVmdCA8PSAocCkueCkgJiYgKChyKS0+cmlnaHQgPiAocCkueCkgJiYgXA0KLSgociktPnRvcCA8PSAocCkueSkgJiYgKChyKS0+Ym90dG9tID4gKHApLnkpKQ0KLQ0KLS8vIElOVFJFQ1QgLSBhIGZhc3RlciBJbnRlcnNlY3RSZWN0IHRoYXQganVzdCByZXR1cm5zIHRoZSBjb25kaXRpb24NCi0jZGVmaW5lIElOVFJFQ1QocjEscjIpIFwNCi0oKChyMSktPnJpZ2h0ID49IChyMiktPmxlZnQpICYmIFwNCi0oKHIxKS0+bGVmdCA8IChyMiktPnJpZ2h0KSAmJiBcDQotKChyMSktPmJvdHRvbSA+PSAocjIpLT50b3ApICYmIFwNCi0oKHIxKS0+dG9wIDwgKHIyKS0+Ym90dG9tKSkNCi0NCi0vLyBNS1JFQ1QgLSBtYWtlIGEgcmVjdCBhcm91bmQgYSBwb2ludA0KLSNkZWZpbmUgTUtSRUNUKHIscCxzKSBcDQotKCgociktPmxlZnQgPSAoKHApLngtKHMpKSksICgociktPnJpZ2h0ID0gKChwKS54KyhzKSkpLCBcDQotKChyKS0+dG9wID0gKChwKS55LShzKSkpLCAoKHIpLT5ib3R0b20gPSAoKHApLnkrKHMpKSkpDQotDQotLy8NCi0vLyBwcm90b3R5cGVzDQotLy8NCi0NCi0vLyBoeXBlcm9pZC5jDQotSU5UIE5FQVIgUEFTQ0FMIGFyYW5kKCBJTlQgeCApOw0KLVZPSUQgTkVBUiBQQVNDQUwgQWRkSGVhZCggTlBMSVNUIG5wTGlzdCwgTlBOT0RFIG5wTm9kZSApOw0KLU5QTk9ERSBORUFSIFBBU0NBTCBSZW1IZWFkKCBOUExJU1QgbnBMaXN0ICk7DQotVk9JRCBORUFSIFBBU0NBTCBSZW1vdmUoIE5QTElTVCBucExpc3QsIE5QTk9ERSBucE5vZGUgKTsNCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdPYmplY3QoIEhEQyBoREMsIE5QT0JKIG5wT2JqICk7DQotVk9JRCBORUFSIFBBU0NBTCBTZXRSZXN0YXJ0KCBCT09MIGJHYW1lT3ZlciApOw0KLVZPSUQgTkVBUiBQQVNDQUwgQWRkRXh0cmFMaWZlKCBWT0lEICk7DQotVk9JRCBORUFSIFBBU0NBTCBIaXQoIEhEQyBoREMsIE5QT0JKIG5wT2JqICk7DQotVk9JRCBORUFSIFBBU0NBTCBFeHBsb2RlKCBIREMgaERDLCBOUE9CSiBucE9iaiApOw0KLUJPT0wgTkVBUiBQQVNDQUwgSGl0UGxheWVyKCBIREMgaERDLCBOUE9CSiBucE9iaiApOw0KLU5QT0JKIEZBUiBQQVNDQUwgQ3JlYXRlTGV0dGVyKCBDSEFSIGNMZXR0ZXIsIElOVCBuU2l6ZSApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRHJhd0xldHRlcnMoIEhEQyBoREMgKTsNCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdIdW50ZXJTaG90cyggSERDIGhEQyApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRmlyZUh1bnRlclNob3QoIE5QT0JKIG5wSHVudCApOw0KLVZPSUQgTkVBUiBQQVNDQUwgQ3JlYXRlSHVudGVyKCBWT0lEICk7DQotVk9JRCBORUFSIFBBU0NBTCBEcmF3SHVudGVycyggSERDIGhEQyApOw0KLVZPSUQgTkVBUiBQQVNDQUwgQ3JlYXRlU3Bpbm5lciggVk9JRCApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRHJhd1NwaW5uZXJzKCBIREMgaERDICk7DQotVk9JRCBORUFSIFBBU0NBTCBDcmVhdGVSb2lkKCBQT0lOVCBQb3MsIFBPSU5UIFZlbCwgSU5UIG5TaWRlcywgQllURSBieUNvbG9yLCBJTlQgbkRpciwgSU5UIG5TcGVlZCwgSU5UIG5TcGluICk7DQotVk9JRCBORUFSIFBBU0NBTCBCcmVha1JvaWQoIEhEQyBoREMsIE5QT0JKIG5wUm9pZCwgTlBPQkogbnBTaG90ICk7DQotVk9JRCBORUFSIFBBU0NBTCBEcmF3Um9pZHMoIEhEQyBoREMgKTsNCi1WT0lEIE5FQVIgUEFTQ0FMIERyYXdTaG90cyggSERDIGhEQyApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRHJhd0ZsYW1lcyggSERDIGhEQyApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRmlyZVNob3QoIFZPSUQgKTsNCi1WT0lEIE5FQVIgUEFTQ0FMIEFjY2VsUGxheWVyKCBJTlQgbkRpciwgSU5UIG5BY2NlbCApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRHJhd1BsYXllciggSERDIGhEQyApOw0KLVZPSUQgTkVBUiBQQVNDQUwgRHJhd09iamVjdHMoIEhXTkQgaFduZCApOw0KLVZPSUQgTkVBUiBQQVNDQUwgQ2hlY2tTY29yZSggSFdORCBoV25kICk7DQotVk9JRCBORUFSIFBBU0NBTCBIaXRMaXN0KCBIREMgaERDLCBOUExJU1QgbnBMaXN0ICk7DQotVk9JRCBORUFSIFBBU0NBTCBFeHBsb2RlQmFkZ3V5cyggSERDIGhEQywgTlBMSVNUIG5wTGlzdCApOw0KLVZPSUQgTkVBUiBQQVNDQUwgTmV3R2FtZSggSFdORCBoV25kICk7DQotVk9JRCBORUFSIFBBU0NBTCBSZXN0YXJ0SHlwZXJvaWQoIFZPSUQgKTsNCi1WT0lEIE5FQVIgUEFTQ0FMIFBhbmljKCBCT09MIGJQYW5pYyApOw0KLVZPSUQgTkVBUiBQQVNDQUwgUGFpbnRIeXBlcm9pZCggSFdORCBoV25kICk7DQotVk9JRCBORUFSIFBBU0NBTCBEaXNhYmxlSHlwZXJvaWRJbnB1dCggSFdORCBoV25kLCBCT09MIGJDYXB0dXJlICk7DQotTE9ORyBGQVIgUEFTQ0FMIEVYUE9SVCBIeXBlcm9pZFduZFByb2MoIEhXTkQgaFduZCwgdW5zaWduZWQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7DQotQk9PTCBORUFSIFBBU0NBTCBJbml0SHlwZXJvaWQoIFZPSUQgKTsNCi1WT0lEIE5FQVIgUEFTQ0FMIEV4aXRIeXBlcm9pZCggVk9JRCApOw0KLUlOVCBGQVIgUEFTQ0FMIFdpbk1haW4oIEhBTkRMRSBoSW5zdGFuY2UsIEhBTkRMRSBoUHJldkluc3RhbmNlLCBMUFNUUiBscHN6Q21kTGluZSwgSU5UIG5DbWRTaG93ICk7DQotDQotLy8gcm9pZHN1cHAuYw0KLVZPSUQgRkFSIFBBU0NBTCBQcmludExldHRlcnMoIE5QU1RSIG5wc3pUZXh0LCBQT0lOVCBQb3MsIFBPSU5UIFZlbCwgQllURSBieUNvbG9yLCBJTlQgblNpemUgKTsNCi1WT0lEIEZBUiBQQVNDQUwgU3BpbkxldHRlcnMoIE5QU1RSIG5wc3pUZXh0LCBQT0lOVCBQb3MsIFBPSU5UIFZlbCwgQllURSBieUNvbG9yLCBJTlQgblNpemUgKTsNCi1IUEFMRVRURSBGQVIgUEFTQ0FMIENyZWF0ZUh5cGVyb2lkUGFsZXR0ZSggVk9JRCApOw0KLUJPT0wgRkFSIFBBU0NBTCBDcmVhdGVIeXBlcm9pZENsYXNzKCBWT0lEICk7DQotVk9JRCBORUFSIFBBU0NBTCBTZXRIeXBlcm9pZE1lbnUoIEhXTkQgaFduZCwgSU5UIG5GaXJzdElELCBJTlQgbkxhc3RJRCApOw0KLUhXTkQgRkFSIFBBU0NBTCBDcmVhdGVIeXBlcm9pZFdpbmRvdyggTFBTVFIgbHBzekNtZCwgSU5UIG5DbWRTaG93ICk7DQotVk9JRCBGQVIgUEFTQ0FMIFNhdmVIeXBlcm9pZFdpbmRvd1BvcyggSFdORCBoV25kICk7DQotVk9JRCBGQVIgUEFTQ0FMIEdldEh5cGVyb2lkSW5pKCBWT0lEICk7DQotVk9JRCBGQVIgUEFTQ0FMIEh5cGVyb2lkSGVscCggSFdORCBoV25kICk7DQotQk9PTCBGQVIgUEFTQ0FMIEVYUE9SVCBIeXBlcm9pZEFib3V0RGxnKCBIV05EIGhEbGcsIFdPUkQgbWVzcywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7DQotVk9JRCBGQVIgUEFTQ0FMIEFib3V0SHlwZXJvaWQoIEhXTkQgaFduZCApOw0KLQ0KLSNlbmRpZiAvLyBSQ19JTlZPS0VEIC8vDQotDQotLy8NCi0vLyByZXNvdXJjZSBJRHMNCi0vLw0KLQ0KLS8vIGljb25zIGFuZCBiaXRtYXBzDQotI2RlZmluZSBJRElfSFlQRVJPSUQgICAgMTANCi0jZGVmaW5lIElESV9QQU5JQyAgICAgICAyMA0KLQ0KLS8vIGJpdG1hcHMNCi0jZGVmaW5lIElEQl9ibGFuayAgICAgICA1MA0KLSNkZWZpbmUgSURCX2JvbWIgICAgICAgIDUxDQotI2RlZmluZSBJREJfbGV2ZWwgICAgICAgNTINCi0jZGVmaW5lIElEQl9saWZlICAgICAgICA1Mw0KLSNkZWZpbmUgSURCX251bTAgICAgICAgIDU0DQotI2RlZmluZSBJREJfbnVtMSAgICAgICAgNTUNCi0jZGVmaW5lIElEQl9udW0yICAgICAgICA1Ng0KLSNkZWZpbmUgSURCX251bTMgICAgICAgIDU3DQotI2RlZmluZSBJREJfbnVtNCAgICAgICAgNTgNCi0jZGVmaW5lIElEQl9udW01ICAgICAgICA1OQ0KLSNkZWZpbmUgSURCX251bTYgICAgICAgIDYwDQotI2RlZmluZSBJREJfbnVtNyAgICAgICAgNjENCi0jZGVmaW5lIElEQl9udW04ICAgICAgICA2Mg0KLSNkZWZpbmUgSURCX251bTkgICAgICAgIDYzDQotI2RlZmluZSBJREJfcGx1cyAgICAgICAgNjQNCi0jZGVmaW5lIElEQl9zY29yZSAgICAgICA2NQ0KLSNkZWZpbmUgSURCX3NoaWVsZCAgICAgIDY2DQotLy8gYWRkaXRpb25hbCBiaXRtYXAgc3R1ZmYNCi0jZGVmaW5lIElEQl9NQVggICAgICAgICAxNw0KLSNkZWZpbmUgQ1hfQklUTUFQICAgICAgIDE2DQotI2RlZmluZSBDWV9CSVRNQVAgICAgICAgMTYNCi0NCi0vLyBzdHJpbmdzDQotI2RlZmluZSBJRFNfTkFNRSAgICAgICAgMTAwDQotDQotLy8gbWVudXMNCi0jZGVmaW5lIElETV9ORVcgICAgICAgICAyMDANCi0jZGVmaW5lIElETV9BQk9VVCAgICAgICAyMDENCi0NCi0vLyBhYm91dCBib3gNCi0jZGVmaW5lIElERF9BQk9VVCAgICAgICA1MDANCi0jZGVmaW5lIElERF9BX0hFTFAgICAgICA1MDENCi0jZGVmaW5lIElERF9BX0hJU0NPUkUgICA1MDINCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLmljbyBiL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQxYTgzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvaHlwZXJvaWQuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5tYWsgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NWExYi4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLm1haworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLVBST0oJPUhZUEVST0lEDQotREVCVUcJPTENCi1DQwk9cWNsDQotQ0ZMQUdTX0cJPSAvQU0gL1czIC9aZSANCi1DRkxBR1NfRAk9IC9aaSAvT2QgDQotQ0ZMQUdTX1IJPSAvTyAvT2wgL0dzIC9ETkRFQlVHIA0KLUNGTEFHUwk9JChDRkxBR1NfRykgJChDRkxBR1NfRCkNCi1MRkxBR1NfRwk9IC9DUDoweGZmZmYgL05PSSAvU0U6MHg4MCAvU1Q6MHgyMDAwIA0KLUxGTEFHU19ECT0gL0NPIC9NIA0KLUxGTEFHU19SCT0gDQotTEZMQUdTCT0kKExGTEFHU19HKSAkKExGTEFHU19EKQ0KLVJVTkZMQUdTCT0NCi1PQkpTX0VYVCA9IAkNCi1MSUJTX0VYVCA9IAkNCi0NCi1hbGw6CSQoUFJPSikuZXhlDQotDQotaHlwZXJvaWQub2JqOgloeXBlcm9pZC5jDQotDQotcm9pZHN1cHAub2JqOglyb2lkc3VwcC5jDQotDQotJChQUk9KKS5leGU6CWh5cGVyb2lkLm9iaiByb2lkc3VwcC5vYmogJChPQkpTX0VYVCkNCi0JZWNobyA+TlVMIEA8PCQoUFJPSikuY3JmDQotaHlwZXJvaWQub2JqICsNCi1yb2lkc3VwcC5vYmogKw0KLSQoT0JKU19FWFQpDQotJChQUk9KKS5leGUNCi0NCi0kKExJQlNfRVhUKTsNCi08PA0KLQlpbGluayAtYSAtZSAibGluayAkKExGTEFHUykgQCQoUFJPSikuY3JmIiAkKFBST0opDQotDQotcnVuOiAkKFBST0opLmV4ZQ0KLQkkKFBST0opICQoUlVORkxBR1MpDQotDQpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5tYXAgYi90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlZGYxOS4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDY3MSArMCwwIEBACi1TdGFjayBBbGxvY2F0aW9uID0gODE5MiBieXRlcw0KLQ0KLSBoeXBlcm9pZA0KLQ0KLSBTdGFydCAgICAgTGVuZ3RoICAgICBOYW1lICAgICAgICAgICAgICAgICAgIENsYXNzDQotIDAwMDE6MDAwMCAwMjJEOEggICAgIEhZUEVST0lEICAgICAgICAgICAgICAgQ09ERQ0KLSAwMDAxOjIyRDggMDA2RThIICAgICBST0lEU1VQUCAgICAgICAgICAgICAgIENPREUNCi0gMDAwMToyOUMwIDAyODM0SCAgICAgX1RFWFQgICAgICAgICAgICAgICAgICBDT0RFDQotIDAwMDE6NTIwMCAwMjZGMEggICAgIEVNVUxBVE9SX1RFWFQgICAgICAgICAgQ09ERQ0KLSAwMDAxOjc4RjAgMDAwMDBIICAgICBDX0VURVhUICAgICAgICAgICAgICAgIEVORENPREUNCi0gMDAwMjowMDAwIDAwMTcwSCAgICAgRU1VTEFUT1JfREFUQSAgICAgICAgICBGQVJfREFUQQ0KLSAwMDAzOjAwMDAgMDAwNDJIICAgICBOVUxMICAgICAgICAgICAgICAgICAgIEJFR0RBVEENCi0gMDAwMzowMDQyIDAwQTAwSCAgICAgX0RBVEEgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE0MiAwMDAwMkggICAgIFhJUUMgICAgICAgICAgICAgICAgICAgREFUQQ0KLSAwMDAzOjBBNDQgMDAwMEVIICAgICBEQkRBVEEgICAgICAgICAgICAgICAgIERBVEENCi0gMDAwMzowQTUyIDAwMDBFSCAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE2MCAwMDAwMEggICAgIFhJRkIgICAgICAgICAgICAgICAgICAgREFUQQ0KLSAwMDAzOjBBNjAgMDAwMDBIICAgICBYSUYgICAgICAgICAgICAgICAgICAgIERBVEENCi0gMDAwMzowQTYwIDAwMDAwSCAgICAgWElGRSAgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE2MCAwMDAwMEggICAgIFhJQiAgICAgICAgICAgICAgICAgICAgREFUQQ0KLSAwMDAzOjBBNjAgMDAwMENIICAgICBYSSAgICAgICAgICAgICAgICAgICAgIERBVEENCi0gMDAwMzowQTZDIDAwMDAwSCAgICAgWElFICAgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE2QyAwMDAwMEggICAgIFhQQiAgICAgICAgICAgICAgICAgICAgREFUQQ0KLSAwMDAzOjBBNkMgMDAwMDBIICAgICBYUCAgICAgICAgICAgICAgICAgICAgIERBVEENCi0gMDAwMzowQTZDIDAwMDAwSCAgICAgWFBFICAgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE2QyAwMDAwMEggICAgIFhDQiAgICAgICAgICAgICAgICAgICAgREFUQQ0KLSAwMDAzOjBBNkMgMDAwMDBIICAgICBYQyAgICAgICAgICAgICAgICAgICAgIERBVEENCi0gMDAwMzowQTZDIDAwMDAwSCAgICAgWENFICAgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE2QyAwMDAwMEggICAgIFhDRkIgICAgICAgICAgICAgICAgICAgREFUQQ0KLSAwMDAzOjBBNkMgMDAwMDBIICAgICBYQ0YgICAgICAgICAgICAgICAgICAgIERBVEENCi0gMDAwMzowQTZDIDAwMDAwSCAgICAgWENGRSAgICAgICAgICAgICAgICAgICBEQVRBDQotIDAwMDM6MEE2QyAwMDAxOEggICAgIENPTlNUICAgICAgICAgICAgICAgICAgQ09OU1QNCi0gMDAwMzowQTg0IDAwMDA4SCAgICAgSERSICAgICAgICAgICAgICAgICAgICBNU0cNCi0gMDAwMzowQThDIDAwMURESCAgICAgTVNHICAgICAgICAgICAgICAgICAgICBNU0cNCi0gMDAwMzowQzY5IDAwMDAySCAgICAgUEFEICAgICAgICAgICAgICAgICAgICBNU0cNCi0gMDAwMzowQzZCIDAwMDAxSCAgICAgRVBBRCAgICAgICAgICAgICAgICAgICBNU0cNCi0gMDAwMzowQzZDIDAwMDZFSCAgICAgX0JTUyAgICAgICAgICAgICAgICAgICBCU1MNCi0gMDAwMzowQ0RBIDAwMDAwSCAgICAgWE9CICAgICAgICAgICAgICAgICAgICBCU1MNCi0gMDAwMzowQ0RBIDAwMDAwSCAgICAgWE8gICAgICAgICAgICAgICAgICAgICBCU1MNCi0gMDAwMzowQ0RBIDAwMDAwSCAgICAgWE9FICAgICAgICAgICAgICAgICAgICBCU1MNCi0gMDAwMzowQ0UwIDAyNjE2SCAgICAgY19jb21tb24gICAgICAgICAgICAgICBCU1MNCi0gMDAwMzozMzAwIDAyMDAwSCAgICAgU1RBQ0sgICAgICAgICAgICAgICAgICBTVEFDSw0KLQ0KLSBPcmlnaW4gICBHcm91cA0KLSAwMDAzOjAgICBER1JPVVANCi0NCi0gQWRkcmVzcyAgIEV4cG9ydCAgICAgICAgICAgICAgICAgIEFsaWFzDQotDQotIDAwMDE6MjhEOSBIWVBFUk9JREFCT1VURExHICAgICAgICBIWVBFUk9JREFCT1VURExHDQotIDAwMDE6MUVDQSBIWVBFUk9JRFdORFBST0MgICAgICAgICBIWVBFUk9JRFdORFBST0MNCi0NCi0gIEFkZHJlc3MgICAgICAgICBQdWJsaWNzIGJ5IE5hbWUNCi0NCi0gMDAwMTozQjQ0ICAgICAgICRJMTBfT1VUUFVUDQotIDAwMDE6MzgyRSAgICAgICAkaThfb3V0cHV0DQotIDAwMDE6M0FFRiAgICAgICAkaThfdHB3cjEwDQotIDAwMDE6Mjk2QyAgICAgICBBQk9VVEhZUEVST0lEDQotIDAwMDE6MDI5RCAgICAgICBBQ0NFTEVSQVRFDQotIDAwMDE6MThCNiAgICAgICBBQ0NFTFBMQVlFUg0KLSAwMDAxOjAwNkIgICAgICAgQURESEVBRA0KLSAwMDAxOjAwMDAgICAgICAgQVJBTkQNCi0gMDAwMToxM0Q5ICAgICAgIEJSRUFLUk9JRA0KLSAwMDAxOjFCOTQgICAgICAgQ0hFQ0tTQ09SRQ0KLSAwMDAxOjBDOEEgICAgICAgQ1JFQVRFSFVOVEVSDQotIDAwMDE6MjU5NSAgICAgICBDUkVBVEVIWVBFUk9JRENMQVNTDQotIDAwMDE6MjNBQyAgICAgICBDUkVBVEVIWVBFUk9JRFBBTEVUVEUNCi0gMDAwMToyNjhGICAgICAgIENSRUFURUhZUEVST0lEV0lORE9XDQotIDAwMDE6MDhFOCAgICAgICBDUkVBVEVMRVRURVINCi0gMDAwMToxMkQzICAgICAgIENSRUFURVJPSUQNCi0gMDAwMTowRjk4ICAgICAgIENSRUFURVNQSU5ORVINCi0gMDAwMToxNzU0ICAgICAgIERSQVdGTEFNRVMNCi0gMDAwMTowRDVFICAgICAgIERSQVdIVU5URVJTDQotIDAwMDE6MEFEMiAgICAgICBEUkFXSFVOVEVSU0hPVFMNCi0gMDAwMTowQTQ0ICAgICAgIERSQVdMRVRURVJTDQotIDAwMDE6MDJGMiAgICAgICBEUkFXT0JKRUNUDQotIDAwMDE6MUFCNiAgICAgICBEUkFXT0JKRUNUUw0KLSAwMDAxOjE5OEUgICAgICAgRFJBV1BMQVlFUg0KLSAwMDAxOjE1QUMgICAgICAgRFJBV1JPSURTDQotIDAwMDE6MTZDNSAgICAgICBEUkFXU0hPVFMNCi0gMDAwMToxMDdEICAgICAgIERSQVdTUElOTkVSUw0KLSAwMDAxOjFFNDEgICAgICAgRVJBU0VIWVBFUk9JREJLR05EDQotIDAwMDE6MjFDQyAgICAgICBFWElUSFlQRVJPSUQNCi0gMDAwMTowNjMwICAgICAgIEVYUExPREUNCi0gMDAwMTozNTUyICAgICAgIGZGWVRPWA0KLSAwMDAwOkZFMzIgIEFicyAgRklBUlFRDQotIDAwMDA6MEUzMiAgQWJzICBGSUNSUVENCi0gMDAwMDo1QzMyICBBYnMgIEZJRFJRUQ0KLSAwMDAwOjE2MzIgIEFicyAgRklFUlFRDQotIDAwMDE6MEJBQyAgICAgICBGSVJFSFVOVEVSU0hPVA0KLSAwMDAxOjE3RTMgICAgICAgRklSRVNIT1QNCi0gMDAwMDowNjMyICBBYnMgIEZJU1JRUQ0KLSAwMDAwOkEyM0QgIEFicyAgRklXUlFRDQotIDAwMDA6NDAwMCAgQWJzICBGSkFSUVENCi0gMDAwMDpDMDAwICBBYnMgIEZKQ1JRUQ0KLSAwMDAwOjgwMDAgIEFicyAgRkpTUlFRDQotIDAwMDE6MDU0NyAgICAgICBISVQNCi0gMDAwMTowNzg3ICAgICAgIEhJVFBMQVlFUg0KLSAwMDAxOjI4RDkgICAgICAgSFlQRVJPSURBQk9VVERMRw0KLSAwMDAxOjI4QUEgICAgICAgSFlQRVJPSURIRUxQDQotIDAwMDE6MUVDQSAgICAgICBIWVBFUk9JRFdORFBST0MNCi0gMDAwMToyMTRDICAgICAgIElOSVRIWVBFUk9JRA0KLSAwMDAxOjAxOTUgICAgICAgSU5JVE9CSkVDVFMNCi0gMDAwMToxREYyICAgICAgIFBBSU5USFlQRVJPSUQNCi0gMDAwMToxRDUxICAgICAgIFBBTklDDQotIDAwMDM6MENFNCAgICAgICBQTE9DQUxIRUFQDQotIDAwMDE6MjJEOCAgICAgICBQUklOVExFVFRFUlMNCi0gMDAwMTowMEQwICAgICAgIFJFTUhFQUQNCi0gMDAwMTowMTM2ICAgICAgIFJFTU9WRQ0KLSAwMDAxOjFDMTMgICAgICAgUkVTVEFSVEhZUEVST0lEDQotIDAwMDE6Mjc5MCAgICAgICBTQVZFSFlQRVJPSURXSU5ET1dQT1MNCi0gMDAwMToyNjE2ICAgICAgIFNFVEhZUEVST0lETUVOVQ0KLSAwMDAxOjA1MTMgICAgICAgU0VUUkVTVEFSVA0KLSAwMDAxOjIyMjIgICAgICAgV0lOTUFJTg0KLSAwMDAxOjMxN0MgICAgICAgX2F0b2YNCi0gMDAwMTozMTc4ICAgICAgIF9hdG9pDQotIDAwMDM6MzJDNiAgICAgICBfYlBhdXNlZA0KLSAwMDAzOjMyQkUgICAgICAgX2JSZXN0YXJ0DQotIDAwMDE6NEFFNCAgICAgICBfY29zDQotIDAwMDM6MEM2QyAgICAgICBfZWRhdGENCi0gMDAwMzozMzAwICAgICAgIF9lbmQNCi0gMDAwMzowNkFGICAgICAgIF9lbnZpcm9uDQotIDAwMDM6MDY4OCAgICAgICBfZXJybm8NCi0gMDAwMToyQjhEICAgICAgIF9leGl0DQotIDAwMDM6MzA4NiAgICAgICBfRmxhbWVMaXN0DQotIDAwMDM6MzJDMiAgICAgICBfRnJlZUxpc3QNCi0gMDAwMzozMEFFICAgICAgIF9oQXBwSW5zdA0KLSAwMDAzOjMyRDIgICAgICAgX2hBcHBQYWxldHRlDQotIDAwMDM6MzJDMCAgICAgICBfaEFwcFduZA0KLSAwMDAzOjMwOEUgICAgICAgX2hQZW4NCi0gMDAwMzowQTM4ICAgICAgIF9IVUdFDQotIDAwMDM6MzBCMCAgICAgICBfSHVudGVyTGlzdA0KLSAwMDAzOjBDRTggICAgICAgX0h1bnRlclNob3RMaXN0DQotIDAwMDM6MENFMCAgICAgICBfTGV0dGVyTGlzdA0KLSAwMDAzOjAyNTAgICAgICAgX0xldHRlclBhcnQNCi0gMDAwMzozMEI4ICAgICAgIF9sU2NvcmUNCi0gMDAwMToyRjM0ICAgICAgIF9tYWxsb2MNCi0gMDAwMTo0RTMwICAgICAgIF9tYXRoZXJyDQotIDAwMDE6MzJGNCAgICAgICBfbWVtbW92ZQ0KLSAwMDAxOjMzM0MgICAgICAgX21lbXNldA0KLSAwMDAzOjMyQkMgICAgICAgX25CYWRHdXlzDQotIDAwMDM6MENFRSAgICAgICBfbkNvcw0KLSAwMDAzOjMyQzggICAgICAgX25HcmF2aXR5DQotIDAwMDM6MzA4QyAgICAgICBfbkxldmVsDQotIDAwMDM6MENFQyAgICAgICBfbnBQbGF5ZXINCi0gMDAwMzowQ0U2ICAgICAgIF9uU2FmZQ0KLSAwMDAzOjMyRjQgICAgICAgX25TaGllbGQNCi0gMDAwMzozMEJDICAgICAgIF9uU2luDQotIDAwMDM6MEVFRSAgICAgICBfT2JqDQotIDAwMDM6MzJDRSAgICAgICBfUm9pZExpc3QNCi0gMDAwMzozMkNBICAgICAgIF9TaG90TGlzdA0KLSAwMDAxOjRBREUgICAgICAgX3Npbg0KLSAwMDAzOjMwQjQgICAgICAgX1NwaW5uZXJMaXN0DQotIDAwMDE6MzEzMCAgICAgICBfc3RyY21wDQotIDAwMDE6MzBGRSAgICAgICBfc3RyY3B5DQotIDAwMDE6MzE1QyAgICAgICBfc3RybGVuDQotIDAwMDM6MzJENCAgICAgICBfc3pBcHBOYW1lDQotIDAwMDM6MDI5OCAgICAgICBfc3pMZXR0ZXJEZXNjDQotIDAwMDM6MDI4NCAgICAgICBfc3pOdW1iZXJEZXNjDQotIDAwMDE6NEFFOSAgICAgICBfdGFuDQotIDAwMDM6MzA4QSAgICAgICBfd1RpY2sNCi0gMDAwMzowOUE0ICAgICAgIF9fODB4ODcNCi0gMDAwMzowNjZDICAgICAgIF9fYWNmaW5mbw0KLSAwMDAwOjk4NzYgIEFicyAgX19hY3J0bXNnDQotIDAwMDA6OTg3NiAgQWJzICBfX2FjcnR1c2VkDQotIDAwMDA6RDZENiAgQWJzICBfX2FEQmRvc3dwDQotIDAwMDM6MDZCRSAgICAgICBfX2FkYmdtc2cNCi0gMDAwMzowNjUwICAgICAgIF9fYWV4aXRfcnRuDQotIDAwMDE6NEFGNCAgICAgICBfX2FGQ0ljb3MNCi0gMDAwMTo0QUVFICAgICAgIF9fYUZDSXNpbg0KLSAwMDAxOjRBRjkgICAgICAgX19hRkNJdGFuDQotIDAwMDE6NEQwOCAgICAgICBfX2FGZnRvbA0KLSAwMDAxOjMzODYgICAgICAgX19hRmxkaXYNCi0gMDAwMTozNDIwICAgICAgIF9fYUZsbXVsDQotIDAwMDE6MzQyMCAgICAgICBfX2FGdWxtdWwNCi0gMDAwMzowNjdBICAgICAgIF9fYWludGRpdg0KLSAwMDAzOjA2QzYgICAgICAgX19hbWJsa3Npeg0KLSAwMDAxOjJBQTMgICAgICAgX19hbXNnX2V4aXQNCi0gMDAwMzowMDQyICAgICAgIF9fYW51bGxzaXplDQotIDAwMDM6MDY2OCAgICAgICBfX2FzZWdoaQ0KLSAwMDAzOjA2NkEgICAgICAgX19hc2VnbG8NCi0gMDAwMzowNjUyICAgICAgIF9fYXNpemRzDQotIDAwMDM6MDZFNCAgICAgICBfX2FzaXplQw0KLSAwMDAzOjA2RTUgICAgICAgX19hc2l6ZUQNCi0gMDAwMToyOUQwICAgICAgIF9fYXN0YXJ0DQotIDAwMDE6NTFEMCAgICAgICBfX2F0b2xkDQotIDAwMDM6MDY0RSAgICAgICBfX2F0b3BzcA0KLSAwMDAxOjMxQzIgICAgICAgX19jYXRveA0KLSAwMDAxOjJCOUMgICAgICAgX19jZXhpdA0KLSAwMDAxOjRBNjQgICAgICAgX19jZmx0Y3Z0DQotIDAwMDM6MDZDOCAgICAgICBfX2NmbHRjdnRfdGFiDQotIDAwMDE6NDc0RSAgICAgICBfX2NmdG9lDQotIDAwMDE6NDg5QyAgICAgICBfX2NmdG9mDQotIDAwMDE6NDlCMiAgICAgICBfX2NmdG9nDQotIDAwMDM6MDZCNiAgICAgICBfX2NoaWxkDQotIDAwMDE6MkFDOCAgICAgICBfX2Npbml0DQotIDAwMDE6MkE5MyAgICAgICBfX2NpbnRESVYNCi0gMDAwMTo0QkEyICAgICAgIF9fY2ludHJpbmRpc3AxDQotIDAwMDE6NEI3OSAgICAgICBfX2NpbnRyaW5kaXNwMg0KLSAwMDAxOjUxN0EgICAgICAgX19jbGRjdnQNCi0gMDAwMTo0RTQwICAgICAgIF9fY2xkdG9lDQotIDAwMDE6NEZDRSAgICAgICBfX2NsZHRvZg0KLSAwMDAxOjUxMEMgICAgICAgX19jbGR0b2cNCi0gMDAwMzowOEUyICAgICAgIF9fY29zam1wdGFiDQotIDAwMDM6MDkxMiAgICAgICBfX2NvdGFuam1wdGFiDQotIDAwMDM6MDdGQyAgICAgICBfX2Nwb3dlcg0KLSAwMDAxOjQ2NTYgICAgICAgX19jcm9wemVyb3MNCi0gMDAwMToyQzEwICAgICAgIF9fY3Rlcm1zdWINCi0gMDAwMTo0QkQ3ICAgICAgIF9fY3RyYW5kaXNwMQ0KLSAwMDAxOjRCQzQgICAgICAgX19jdHJhbmRpc3AyDQotIDAwMDM6MDZFNiAgICAgICBfX2N0eXBlDQotIDAwMDM6MDZFNiAgICAgICBfX2N0eXBlXw0KLSAwMDAxOjJCQTYgICAgICAgX19jX2V4aXQNCi0gMDAwMToyQUM1ICAgICAgIF9fZGF0YXNlZw0KLSAwMDAxOjMyQkIgICAgICAgX19ET1NDUkVBVEVDU0FMSUFTDQotIDAwMDE6MzI4NiAgICAgICBfX0RPU0RFVkNPTkZJRw0KLSAwMDAzOjA2OTMgICAgICAgX19kb3NlcnJubw0KLSAwMDAxOjMyRDEgICAgICAgX19ET1NGUkVFU0VHDQotIDAwMDE6MzI5RCAgICAgICBfX0RPU0dFVE1BQ0hJTkVNT0RFDQotIDAwMDE6MzJCMiAgICAgICBfX0RPU1NFVFZFQw0KLSAwMDAzOjA2OTAgICAgICAgX19kb3N2ZXJtYWpvcg0KLSAwMDAzOjA2OTEgICAgICAgX19kb3N2ZXJtaW5vcg0KLSAwMDAxOjMyREEgICAgICAgX19ET1NXUklURQ0KLSAwMDAxOjUyMDAgICAgICAgX19FbURhdGFTZWcNCi0gMDAwMToyQjk0ICAgICAgIF9fZXhpdA0KLSAwMDAzOjA4QTAgICAgICAgX19leHBqbXB0YWINCi0gMDAwMzowNjdFICAgICAgIF9fZmFjDQotIDAwMDE6NDZGMiAgICAgICBfX2Zhc3NpZ24NCi0gMDAwMTozNkQ3ICAgICAgIF9fZkZDT1MNCi0gMDAwMTozNTVFICAgICAgIF9fZkZFWFANCi0gMDAwMTozNjg2ICAgICAgIF9fZmZleHBtMQ0KLSAwMDAxOjM2MEIgICAgICAgX19mRkxODQotIDAwMDE6MzZGMCAgICAgICBfX2ZGU0lODQotIDAwMDE6MkM1MCAgICAgICBfX0ZGX01TR0JBTk5FUg0KLSAwMDAxOjMwREQgICAgICAgX19maW5kbGFzdA0KLSAwMDAxOjREM0MgICAgICAgX19mbHRpbg0KLSAwMDAxOjREOTIgICAgICAgX19mbHRvdXQNCi0gMDAwMDo5ODc2ICBBYnMgIF9fZmx0dXNlZA0KLSAwMDAxOjQ1RUUgICAgICAgX19mb3JjZGVjcHQNCi0gMDAwMTo1QTdGICAgICAgIF9fZnBlbXVsYXRvcg0KLSAwMDAxOjUyMTAgICAgICAgX19mcGVtdWxhdG9yYmVnaW4NCi0gMDAwMTo3ODZGICAgICAgIF9fZnBlbXVsYXRvcmVuZA0KLSAwMDAxOjU0REUgICAgICAgX19GUEVYQ0VQVElPTjg3DQotIDAwMDM6MEE1NCAgICAgICBfX2ZwaW5pdA0KLSAwMDAxOjc4N0EgICAgICAgX19GUElOU1RBTEw4Nw0KLSAwMDAxOjUyM0EgICAgICAgX19mcG1hdGgNCi0gMDAwMTo0REQ4ICAgICAgIF9fZnBzaWduYWwNCi0gMDAwMjowMTY5ICAgICAgIF9fZnB0YXNrZGF0YQ0KLSAwMDAxOjc4QTkgICAgICAgX19GUFRFUk1JTkFURTg3DQotIDAwMDE6MzIxNiAgICAgICBfX2ZwdG9zdHINCi0gMDAwMToyQzcyICAgICAgIF9fZnB0cmFwDQotIDAwMDE6NEQwOCAgICAgICBfX2Z0b2wNCi0gMDAwMTozMDAwICAgICAgIF9fZ3Jvd3NlZw0KLSAwMDAxOjMwOEMgICAgICAgX19pbmNzZWcNCi0gMDAwMzowN0U4ICAgICAgIF9faW5kZWZpbml0ZQ0KLSAwMDAzOjA4MEUgICAgICAgX19pbmZpbml0eQ0KLSAwMDAxOjRBRkUgICAgICAgX19Jbml0ODB4ODcNCi0gMDAwMzowNkI5ICAgICAgIF9faW50bm8NCi0gMDAwMTo0MERGICAgICAgIF9fTEQxMk1VTFQNCi0gMDAwMTo0MDBBICAgICAgIF9fTEQxMk1VTFRURU5QT1dFUg0KLSAwMDAzOjA4ODggICAgICAgX19sbmptcHRhYg0KLSAwMDAzOjA4MTggICAgICAgX19sb2dlbWF4DQotIDAwMDM6MDg3MCAgICAgICBfX2xvZ2ptcHRhYg0KLSAwMDAxOjQyNjQgICAgICAgX19NQU5UT0xEMTINCi0gMDAwMzowQTQwICAgICAgIF9fbWF0aGVycl9mbGFnDQotIDAwMDE6MkYwRSAgICAgICBfX215YWxsb2MNCi0gMDAwMzowNjk1ICAgICAgIF9fbmZpbGUNCi0gMDAwMToyRjNBICAgICAgIF9fbmZyZWUNCi0gMDAwMzowNjU0ICAgICAgIF9fbmhlYXBfZGVzYw0KLSAwMDAxOjJGNUIgICAgICAgX19ubWFsbG9jDQotIDAwMDE6MkVBQyAgICAgICBfX05NU0dfVEVYVA0KLSAwMDAxOjJFRDcgICAgICAgX19OTVNHX1dSSVRFDQotIDAwMDE6MkM3OCAgICAgICBfX251bGxjaGVjaw0KLSAwMDAzOjA2OTMgICAgICAgX19vc2Vycg0KLSAwMDAzOjA2OTcgICAgICAgX19vc2ZpbGUNCi0gMDAwMzowNjkwICAgICAgIF9fb3NtYWpvcg0KLSAwMDAzOjA2OTEgICAgICAgX19vc21pbm9yDQotIDAwMDM6MDY5MiAgICAgICBfX29zbW9kZQ0KLSAwMDAzOjA2OTAgICAgICAgX19vc3ZlcnNpb24NCi0gMDAwMzowNkI4ICAgICAgIF9fb3ZsZmxhZw0KLSAwMDAzOjA2QkEgICAgICAgX19vdmx2ZWMNCi0gMDAwMzowNkIxICAgICAgIF9fcGdtcHRyDQotIDAwMDM6MDdGMiAgICAgICBfX3BpYnkyDQotIDAwMDE6NDZDNCAgICAgICBfX3Bvc2l0aXZlDQotIDAwMDM6MDY4RSAgICAgICBfX3BzcA0KLSAwMDAzOjA2OEMgICAgICAgX19wc3BhZHINCi0gMDAwMTozNTFBICAgICAgIF9fcnRiaWduYW4NCi0gMDAwMTozNTQ5ICAgICAgIF9fcnRjaHNpZm5lZw0KLSAwMDAxOjM1NDAgICAgICAgX19ydGlmcHJvam5wb3ANCi0gMDAwMTozNTIxICAgICAgIF9fcnRpZnByb2pwb3ANCi0gMDAwMTozNTJCICAgICAgIF9fcnRpbmRmbnBvcA0KLSAwMDAxOjM1MjggICAgICAgX19ydGluZGZwb3ANCi0gMDAwMTozNjZCICAgICAgIF9fcnRpbmZucG9wDQotIDAwMDE6MzVGRSAgICAgICBfX3J0aW5mbnBvcHNlDQotIDAwMDE6MzY2OCAgICAgICBfX3J0aW5mcG9wDQotIDAwMDE6MzVGQiAgICAgICBfX3J0aW5mcG9wc2UNCi0gMDAwMTozNEZEICAgICAgIF9fcnRub3Nwb3ANCi0gMDAwMTozNTAxICAgICAgIF9fcnRub3Nwb3BkZQ0KLSAwMDAxOjM1MTMgICAgICAgX19ydG9uZW5wb3ANCi0gMDAwMTozNTEwICAgICAgIF9fcnRvbmVwb3ANCi0gMDAwMTozNTAwICAgICAgIF9fcnR0b3NucG9wDQotIDAwMDE6MzUzOSAgICAgICBfX3J0dG9zbnBvcGRlDQotIDAwMDE6MzRGQSAgICAgICBfX3J0dG9zcG9wDQotIDAwMDE6MzRGNyAgICAgICBfX3J0dG9zcG9wZGUNCi0gMDAwMTozNTA5ICAgICAgIF9fcnR6ZXJvbnBvcA0KLSAwMDAxOjM1MDYgICAgICAgX19ydHplcm9wb3ANCi0gMDAwMToyRjg0ICAgICAgIF9fc2VhcmNoc2VnDQotIDAwMDE6MkM5QyAgICAgICBfX3NldGFyZ3YNCi0gMDAwMToyRTJFICAgICAgIF9fc2V0ZW52cA0KLSAwMDAzOjA2RTIgICAgICAgX19zaWdpbnRvZmYNCi0gMDAwMzowNkUwICAgICAgIF9fc2lnaW50c2VnDQotIDAwMDM6MDhDQSAgICAgICBfX3NpbmptcHRhYg0KLSAwMDAxOjQzMUUgICAgICAgX19TVFJJTkdUT0QNCi0gMDAwMTo0Mzg2ICAgICAgIF9fU1RSSU5HVE9MRA0KLSAwMDAzOjA4RkEgICAgICAgX190YW5qbXB0YWINCi0gMDAwMTozNDUyICAgICAgIF9fdHJhbmRpc3AxDQotIDAwMDE6MzQ5NCAgICAgICBfX3RyYW5kaXNwMg0KLSAwMDAzOjA2OEEgICAgICAgX191bWFza3ZhbA0KLSAwMDAxOjMzNkEgICAgICAgX193cnQyZXJyDQotIDAwMDM6MDg0MCAgICAgICBfX3l0b3hqbXB0YWINCi0gMDAwMzowQTRBICAgICAgIF9fX2FEQmV4aXQNCi0gMDAwMzowQTUwICAgICAgIF9fX2FEQnB0cmNoaw0KLSAwMDAzOjBBNDggICAgICAgX19fYURCcnRlcnINCi0gMDAwMzowQTQ2ICAgICAgIF9fX2FEQnN3cGNoaw0KLSAwMDAzOjBBNDQgICAgICAgX19fYURCc3dwZmxnDQotIDAwMDM6MDZBQiAgICAgICBfX19hcmdjDQotIDAwMDM6MDZBRCAgICAgICBfX19hcmd2DQotIDAwMDM6MEE0MiAgICAgICBfX19xY3pyaW5pdA0KLQ0KLSAgQWRkcmVzcyAgICAgICAgIFB1YmxpY3MgYnkgVmFsdWUNCi0NCi0gMDAwMDowNjMyICBBYnMgIEZJU1JRUQ0KLSAwMDAwOjBFMzIgIEFicyAgRklDUlFRDQotIDAwMDA6MTYzMiAgQWJzICBGSUVSUVENCi0gMDAwMDo0MDAwICBBYnMgIEZKQVJRUQ0KLSAwMDAwOjVDMzIgIEFicyAgRklEUlFRDQotIDAwMDA6ODAwMCAgQWJzICBGSlNSUVENCi0gMDAwMDo5ODc2ICBBYnMgIF9fYWNydG1zZw0KLSAwMDAwOjk4NzYgIEFicyAgX19hY3J0dXNlZA0KLSAwMDAwOjk4NzYgIEFicyAgX19mbHR1c2VkDQotIDAwMDA6QTIzRCAgQWJzICBGSVdSUVENCi0gMDAwMDpDMDAwICBBYnMgIEZKQ1JRUQ0KLSAwMDAwOkQ2RDYgIEFicyAgX19hREJkb3N3cA0KLSAwMDAwOkZFMzIgIEFicyAgRklBUlFRDQotIDAwMDE6MDAwMCAgICAgICBBUkFORA0KLSAwMDAxOjAwNkIgICAgICAgQURESEVBRA0KLSAwMDAxOjAwRDAgICAgICAgUkVNSEVBRA0KLSAwMDAxOjAxMzYgICAgICAgUkVNT1ZFDQotIDAwMDE6MDE5NSAgICAgICBJTklUT0JKRUNUUw0KLSAwMDAxOjAyOUQgICAgICAgQUNDRUxFUkFURQ0KLSAwMDAxOjAyRjIgICAgICAgRFJBV09CSkVDVA0KLSAwMDAxOjA1MTMgICAgICAgU0VUUkVTVEFSVA0KLSAwMDAxOjA1NDcgICAgICAgSElUDQotIDAwMDE6MDYzMCAgICAgICBFWFBMT0RFDQotIDAwMDE6MDc4NyAgICAgICBISVRQTEFZRVINCi0gMDAwMTowOEU4ICAgICAgIENSRUFURUxFVFRFUg0KLSAwMDAxOjBBNDQgICAgICAgRFJBV0xFVFRFUlMNCi0gMDAwMTowQUQyICAgICAgIERSQVdIVU5URVJTSE9UUw0KLSAwMDAxOjBCQUMgICAgICAgRklSRUhVTlRFUlNIT1QNCi0gMDAwMTowQzhBICAgICAgIENSRUFURUhVTlRFUg0KLSAwMDAxOjBENUUgICAgICAgRFJBV0hVTlRFUlMNCi0gMDAwMTowRjk4ICAgICAgIENSRUFURVNQSU5ORVINCi0gMDAwMToxMDdEICAgICAgIERSQVdTUElOTkVSUw0KLSAwMDAxOjEyRDMgICAgICAgQ1JFQVRFUk9JRA0KLSAwMDAxOjEzRDkgICAgICAgQlJFQUtST0lEDQotIDAwMDE6MTVBQyAgICAgICBEUkFXUk9JRFMNCi0gMDAwMToxNkM1ICAgICAgIERSQVdTSE9UUw0KLSAwMDAxOjE3NTQgICAgICAgRFJBV0ZMQU1FUw0KLSAwMDAxOjE3RTMgICAgICAgRklSRVNIT1QNCi0gMDAwMToxOEI2ICAgICAgIEFDQ0VMUExBWUVSDQotIDAwMDE6MTk4RSAgICAgICBEUkFXUExBWUVSDQotIDAwMDE6MUFCNiAgICAgICBEUkFXT0JKRUNUUw0KLSAwMDAxOjFCOTQgICAgICAgQ0hFQ0tTQ09SRQ0KLSAwMDAxOjFDMTMgICAgICAgUkVTVEFSVEhZUEVST0lEDQotIDAwMDE6MUQ1MSAgICAgICBQQU5JQw0KLSAwMDAxOjFERjIgICAgICAgUEFJTlRIWVBFUk9JRA0KLSAwMDAxOjFFNDEgICAgICAgRVJBU0VIWVBFUk9JREJLR05EDQotIDAwMDE6MUVDQSAgICAgICBIWVBFUk9JRFdORFBST0MNCi0gMDAwMToyMTRDICAgICAgIElOSVRIWVBFUk9JRA0KLSAwMDAxOjIxQ0MgICAgICAgRVhJVEhZUEVST0lEDQotIDAwMDE6MjIyMiAgICAgICBXSU5NQUlODQotIDAwMDE6MjJEOCAgICAgICBQUklOVExFVFRFUlMNCi0gMDAwMToyM0FDICAgICAgIENSRUFURUhZUEVST0lEUEFMRVRURQ0KLSAwMDAxOjI1OTUgICAgICAgQ1JFQVRFSFlQRVJPSURDTEFTUw0KLSAwMDAxOjI2MTYgICAgICAgU0VUSFlQRVJPSURNRU5VDQotIDAwMDE6MjY4RiAgICAgICBDUkVBVEVIWVBFUk9JRFdJTkRPVw0KLSAwMDAxOjI3OTAgICAgICAgU0FWRUhZUEVST0lEV0lORE9XUE9TDQotIDAwMDE6MjhBQSAgICAgICBIWVBFUk9JREhFTFANCi0gMDAwMToyOEQ5ICAgICAgIEhZUEVST0lEQUJPVVRETEcNCi0gMDAwMToyOTZDICAgICAgIEFCT1VUSFlQRVJPSUQNCi0gMDAwMToyOUQwICAgICAgIF9fYXN0YXJ0DQotIDAwMDE6MkE5MyAgICAgICBfX2NpbnRESVYNCi0gMDAwMToyQUEzICAgICAgIF9fYW1zZ19leGl0DQotIDAwMDE6MkFDNSAgICAgICBfX2RhdGFzZWcNCi0gMDAwMToyQUM4ICAgICAgIF9fY2luaXQNCi0gMDAwMToyQjhEICAgICAgIF9leGl0DQotIDAwMDE6MkI5NCAgICAgICBfX2V4aXQNCi0gMDAwMToyQjlDICAgICAgIF9fY2V4aXQNCi0gMDAwMToyQkE2ICAgICAgIF9fY19leGl0DQotIDAwMDE6MkMxMCAgICAgICBfX2N0ZXJtc3ViDQotIDAwMDE6MkM1MCAgICAgICBfX0ZGX01TR0JBTk5FUg0KLSAwMDAxOjJDNzIgICAgICAgX19mcHRyYXANCi0gMDAwMToyQzc4ICAgICAgIF9fbnVsbGNoZWNrDQotIDAwMDE6MkM5QyAgICAgICBfX3NldGFyZ3YNCi0gMDAwMToyRTJFICAgICAgIF9fc2V0ZW52cA0KLSAwMDAxOjJFQUMgICAgICAgX19OTVNHX1RFWFQNCi0gMDAwMToyRUQ3ICAgICAgIF9fTk1TR19XUklURQ0KLSAwMDAxOjJGMEUgICAgICAgX19teWFsbG9jDQotIDAwMDE6MkYzNCAgICAgICBfbWFsbG9jDQotIDAwMDE6MkYzQSAgICAgICBfX25mcmVlDQotIDAwMDE6MkY1QiAgICAgICBfX25tYWxsb2MNCi0gMDAwMToyRjg0ICAgICAgIF9fc2VhcmNoc2VnDQotIDAwMDE6MzAwMCAgICAgICBfX2dyb3dzZWcNCi0gMDAwMTozMDhDICAgICAgIF9faW5jc2VnDQotIDAwMDE6MzBERCAgICAgICBfX2ZpbmRsYXN0DQotIDAwMDE6MzBGRSAgICAgICBfc3RyY3B5DQotIDAwMDE6MzEzMCAgICAgICBfc3RyY21wDQotIDAwMDE6MzE1QyAgICAgICBfc3RybGVuDQotIDAwMDE6MzE3OCAgICAgICBfYXRvaQ0KLSAwMDAxOjMxN0MgICAgICAgX2F0b2YNCi0gMDAwMTozMUMyICAgICAgIF9fY2F0b3gNCi0gMDAwMTozMjE2ICAgICAgIF9fZnB0b3N0cg0KLSAwMDAxOjMyODYgICAgICAgX19ET1NERVZDT05GSUcNCi0gMDAwMTozMjlEICAgICAgIF9fRE9TR0VUTUFDSElORU1PREUNCi0gMDAwMTozMkIyICAgICAgIF9fRE9TU0VUVkVDDQotIDAwMDE6MzJCQiAgICAgICBfX0RPU0NSRUFURUNTQUxJQVMNCi0gMDAwMTozMkQxICAgICAgIF9fRE9TRlJFRVNFRw0KLSAwMDAxOjMyREEgICAgICAgX19ET1NXUklURQ0KLSAwMDAxOjMyRjQgICAgICAgX21lbW1vdmUNCi0gMDAwMTozMzNDICAgICAgIF9tZW1zZXQNCi0gMDAwMTozMzZBICAgICAgIF9fd3J0MmVycg0KLSAwMDAxOjMzODYgICAgICAgX19hRmxkaXYNCi0gMDAwMTozNDIwICAgICAgIF9fYUZ1bG11bA0KLSAwMDAxOjM0MjAgICAgICAgX19hRmxtdWwNCi0gMDAwMTozNDUyICAgICAgIF9fdHJhbmRpc3AxDQotIDAwMDE6MzQ5NCAgICAgICBfX3RyYW5kaXNwMg0KLSAwMDAxOjM0RjcgICAgICAgX19ydHRvc3BvcGRlDQotIDAwMDE6MzRGQSAgICAgICBfX3J0dG9zcG9wDQotIDAwMDE6MzRGRCAgICAgICBfX3J0bm9zcG9wDQotIDAwMDE6MzUwMCAgICAgICBfX3J0dG9zbnBvcA0KLSAwMDAxOjM1MDEgICAgICAgX19ydG5vc3BvcGRlDQotIDAwMDE6MzUwNiAgICAgICBfX3J0emVyb3BvcA0KLSAwMDAxOjM1MDkgICAgICAgX19ydHplcm9ucG9wDQotIDAwMDE6MzUxMCAgICAgICBfX3J0b25lcG9wDQotIDAwMDE6MzUxMyAgICAgICBfX3J0b25lbnBvcA0KLSAwMDAxOjM1MUEgICAgICAgX19ydGJpZ25hbg0KLSAwMDAxOjM1MjEgICAgICAgX19ydGlmcHJvanBvcA0KLSAwMDAxOjM1MjggICAgICAgX19ydGluZGZwb3ANCi0gMDAwMTozNTJCICAgICAgIF9fcnRpbmRmbnBvcA0KLSAwMDAxOjM1MzkgICAgICAgX19ydHRvc25wb3BkZQ0KLSAwMDAxOjM1NDAgICAgICAgX19ydGlmcHJvam5wb3ANCi0gMDAwMTozNTQ5ICAgICAgIF9fcnRjaHNpZm5lZw0KLSAwMDAxOjM1NTIgICAgICAgZkZZVE9YDQotIDAwMDE6MzU1RSAgICAgICBfX2ZGRVhQDQotIDAwMDE6MzVGQiAgICAgICBfX3J0aW5mcG9wc2UNCi0gMDAwMTozNUZFICAgICAgIF9fcnRpbmZucG9wc2UNCi0gMDAwMTozNjBCICAgICAgIF9fZkZMTg0KLSAwMDAxOjM2NjggICAgICAgX19ydGluZnBvcA0KLSAwMDAxOjM2NkIgICAgICAgX19ydGluZm5wb3ANCi0gMDAwMTozNjg2ICAgICAgIF9fZmZleHBtMQ0KLSAwMDAxOjM2RDcgICAgICAgX19mRkNPUw0KLSAwMDAxOjM2RjAgICAgICAgX19mRlNJTg0KLSAwMDAxOjM4MkUgICAgICAgJGk4X291dHB1dA0KLSAwMDAxOjNBRUYgICAgICAgJGk4X3Rwd3IxMA0KLSAwMDAxOjNCNDQgICAgICAgJEkxMF9PVVRQVVQNCi0gMDAwMTo0MDBBICAgICAgIF9fTEQxMk1VTFRURU5QT1dFUg0KLSAwMDAxOjQwREYgICAgICAgX19MRDEyTVVMVA0KLSAwMDAxOjQyNjQgICAgICAgX19NQU5UT0xEMTINCi0gMDAwMTo0MzFFICAgICAgIF9fU1RSSU5HVE9EDQotIDAwMDE6NDM4NiAgICAgICBfX1NUUklOR1RPTEQNCi0gMDAwMTo0NUVFICAgICAgIF9fZm9yY2RlY3B0DQotIDAwMDE6NDY1NiAgICAgICBfX2Nyb3B6ZXJvcw0KLSAwMDAxOjQ2QzQgICAgICAgX19wb3NpdGl2ZQ0KLSAwMDAxOjQ2RjIgICAgICAgX19mYXNzaWduDQotIDAwMDE6NDc0RSAgICAgICBfX2NmdG9lDQotIDAwMDE6NDg5QyAgICAgICBfX2NmdG9mDQotIDAwMDE6NDlCMiAgICAgICBfX2NmdG9nDQotIDAwMDE6NEE2NCAgICAgICBfX2NmbHRjdnQNCi0gMDAwMTo0QURFICAgICAgIF9zaW4NCi0gMDAwMTo0QUU0ICAgICAgIF9jb3MNCi0gMDAwMTo0QUU5ICAgICAgIF90YW4NCi0gMDAwMTo0QUVFICAgICAgIF9fYUZDSXNpbg0KLSAwMDAxOjRBRjQgICAgICAgX19hRkNJY29zDQotIDAwMDE6NEFGOSAgICAgICBfX2FGQ0l0YW4NCi0gMDAwMTo0QUZFICAgICAgIF9fSW5pdDgweDg3DQotIDAwMDE6NEI3OSAgICAgICBfX2NpbnRyaW5kaXNwMg0KLSAwMDAxOjRCQTIgICAgICAgX19jaW50cmluZGlzcDENCi0gMDAwMTo0QkM0ICAgICAgIF9fY3RyYW5kaXNwMg0KLSAwMDAxOjRCRDcgICAgICAgX19jdHJhbmRpc3AxDQotIDAwMDE6NEQwOCAgICAgICBfX2FGZnRvbA0KLSAwMDAxOjREMDggICAgICAgX19mdG9sDQotIDAwMDE6NEQzQyAgICAgICBfX2ZsdGluDQotIDAwMDE6NEQ5MiAgICAgICBfX2ZsdG91dA0KLSAwMDAxOjRERDggICAgICAgX19mcHNpZ25hbA0KLSAwMDAxOjRFMzAgICAgICAgX21hdGhlcnINCi0gMDAwMTo0RTQwICAgICAgIF9fY2xkdG9lDQotIDAwMDE6NEZDRSAgICAgICBfX2NsZHRvZg0KLSAwMDAxOjUxMEMgICAgICAgX19jbGR0b2cNCi0gMDAwMTo1MTdBICAgICAgIF9fY2xkY3Z0DQotIDAwMDE6NTFEMCAgICAgICBfX2F0b2xkDQotIDAwMDE6NTIwMCAgICAgICBfX0VtRGF0YVNlZw0KLSAwMDAxOjUyMTAgICAgICAgX19mcGVtdWxhdG9yYmVnaW4NCi0gMDAwMTo1MjNBICAgICAgIF9fZnBtYXRoDQotIDAwMDE6NTRERSAgICAgICBfX0ZQRVhDRVBUSU9OODcNCi0gMDAwMTo1QTdGICAgICAgIF9fZnBlbXVsYXRvcg0KLSAwMDAxOjc4NkYgICAgICAgX19mcGVtdWxhdG9yZW5kDQotIDAwMDE6Nzg3QSAgICAgICBfX0ZQSU5TVEFMTDg3DQotIDAwMDE6NzhBOSAgICAgICBfX0ZQVEVSTUlOQVRFODcNCi0gMDAwMjowMTY5ICAgICAgIF9fZnB0YXNrZGF0YQ0KLSAwMDAzOjAwNDIgICAgICAgX19hbnVsbHNpemUNCi0gMDAwMzowMjUwICAgICAgIF9MZXR0ZXJQYXJ0DQotIDAwMDM6MDI4NCAgICAgICBfc3pOdW1iZXJEZXNjDQotIDAwMDM6MDI5OCAgICAgICBfc3pMZXR0ZXJEZXNjDQotIDAwMDM6MDY0RSAgICAgICBfX2F0b3BzcA0KLSAwMDAzOjA2NTAgICAgICAgX19hZXhpdF9ydG4NCi0gMDAwMzowNjUyICAgICAgIF9fYXNpemRzDQotIDAwMDM6MDY1NCAgICAgICBfX25oZWFwX2Rlc2MNCi0gMDAwMzowNjY4ICAgICAgIF9fYXNlZ2hpDQotIDAwMDM6MDY2QSAgICAgICBfX2FzZWdsbw0KLSAwMDAzOjA2NkMgICAgICAgX19hY2ZpbmZvDQotIDAwMDM6MDY3QSAgICAgICBfX2FpbnRkaXYNCi0gMDAwMzowNjdFICAgICAgIF9fZmFjDQotIDAwMDM6MDY4OCAgICAgICBfZXJybm8NCi0gMDAwMzowNjhBICAgICAgIF9fdW1hc2t2YWwNCi0gMDAwMzowNjhDICAgICAgIF9fcHNwYWRyDQotIDAwMDM6MDY4RSAgICAgICBfX3BzcA0KLSAwMDAzOjA2OTAgICAgICAgX19vc3ZlcnNpb24NCi0gMDAwMzowNjkwICAgICAgIF9fZG9zdmVybWFqb3INCi0gMDAwMzowNjkwICAgICAgIF9fb3NtYWpvcg0KLSAwMDAzOjA2OTEgICAgICAgX19vc21pbm9yDQotIDAwMDM6MDY5MSAgICAgICBfX2Rvc3Zlcm1pbm9yDQotIDAwMDM6MDY5MiAgICAgICBfX29zbW9kZQ0KLSAwMDAzOjA2OTMgICAgICAgX19vc2Vycg0KLSAwMDAzOjA2OTMgICAgICAgX19kb3NlcnJubw0KLSAwMDAzOjA2OTUgICAgICAgX19uZmlsZQ0KLSAwMDAzOjA2OTcgICAgICAgX19vc2ZpbGUNCi0gMDAwMzowNkFCICAgICAgIF9fX2FyZ2MNCi0gMDAwMzowNkFEICAgICAgIF9fX2FyZ3YNCi0gMDAwMzowNkFGICAgICAgIF9lbnZpcm9uDQotIDAwMDM6MDZCMSAgICAgICBfX3BnbXB0cg0KLSAwMDAzOjA2QjYgICAgICAgX19jaGlsZA0KLSAwMDAzOjA2QjggICAgICAgX19vdmxmbGFnDQotIDAwMDM6MDZCOSAgICAgICBfX2ludG5vDQotIDAwMDM6MDZCQSAgICAgICBfX292bHZlYw0KLSAwMDAzOjA2QkUgICAgICAgX19hZGJnbXNnDQotIDAwMDM6MDZDNiAgICAgICBfX2FtYmxrc2l6DQotIDAwMDM6MDZDOCAgICAgICBfX2NmbHRjdnRfdGFiDQotIDAwMDM6MDZFMCAgICAgICBfX3NpZ2ludHNlZw0KLSAwMDAzOjA2RTIgICAgICAgX19zaWdpbnRvZmYNCi0gMDAwMzowNkU0ICAgICAgIF9fYXNpemVDDQotIDAwMDM6MDZFNSAgICAgICBfX2FzaXplRA0KLSAwMDAzOjA2RTYgICAgICAgX19jdHlwZV8NCi0gMDAwMzowNkU2ICAgICAgIF9fY3R5cGUNCi0gMDAwMzowN0U4ICAgICAgIF9faW5kZWZpbml0ZQ0KLSAwMDAzOjA3RjIgICAgICAgX19waWJ5Mg0KLSAwMDAzOjA3RkMgICAgICAgX19jcG93ZXINCi0gMDAwMzowODBFICAgICAgIF9faW5maW5pdHkNCi0gMDAwMzowODE4ICAgICAgIF9fbG9nZW1heA0KLSAwMDAzOjA4NDAgICAgICAgX195dG94am1wdGFiDQotIDAwMDM6MDg3MCAgICAgICBfX2xvZ2ptcHRhYg0KLSAwMDAzOjA4ODggICAgICAgX19sbmptcHRhYg0KLSAwMDAzOjA4QTAgICAgICAgX19leHBqbXB0YWINCi0gMDAwMzowOENBICAgICAgIF9fc2luam1wdGFiDQotIDAwMDM6MDhFMiAgICAgICBfX2Nvc2ptcHRhYg0KLSAwMDAzOjA4RkEgICAgICAgX190YW5qbXB0YWINCi0gMDAwMzowOTEyICAgICAgIF9fY290YW5qbXB0YWINCi0gMDAwMzowOUE0ICAgICAgIF9fODB4ODcNCi0gMDAwMzowQTM4ICAgICAgIF9IVUdFDQotIDAwMDM6MEE0MCAgICAgICBfX21hdGhlcnJfZmxhZw0KLSAwMDAzOjBBNDIgICAgICAgX19fcWN6cmluaXQNCi0gMDAwMzowQTQ0ICAgICAgIF9fX2FEQnN3cGZsZw0KLSAwMDAzOjBBNDYgICAgICAgX19fYURCc3dwY2hrDQotIDAwMDM6MEE0OCAgICAgICBfX19hREJydGVycg0KLSAwMDAzOjBBNEEgICAgICAgX19fYURCZXhpdA0KLSAwMDAzOjBBNTAgICAgICAgX19fYURCcHRyY2hrDQotIDAwMDM6MEE1NCAgICAgICBfX2ZwaW5pdA0KLSAwMDAzOjBDNkMgICAgICAgX2VkYXRhDQotIDAwMDM6MENFMCAgICAgICBfTGV0dGVyTGlzdA0KLSAwMDAzOjBDRTQgICAgICAgUExPQ0FMSEVBUA0KLSAwMDAzOjBDRTYgICAgICAgX25TYWZlDQotIDAwMDM6MENFOCAgICAgICBfSHVudGVyU2hvdExpc3QNCi0gMDAwMzowQ0VDICAgICAgIF9ucFBsYXllcg0KLSAwMDAzOjBDRUUgICAgICAgX25Db3MNCi0gMDAwMzowRUVFICAgICAgIF9PYmoNCi0gMDAwMzozMDg2ICAgICAgIF9GbGFtZUxpc3QNCi0gMDAwMzozMDhBICAgICAgIF93VGljaw0KLSAwMDAzOjMwOEMgICAgICAgX25MZXZlbA0KLSAwMDAzOjMwOEUgICAgICAgX2hQZW4NCi0gMDAwMzozMEFFICAgICAgIF9oQXBwSW5zdA0KLSAwMDAzOjMwQjAgICAgICAgX0h1bnRlckxpc3QNCi0gMDAwMzozMEI0ICAgICAgIF9TcGlubmVyTGlzdA0KLSAwMDAzOjMwQjggICAgICAgX2xTY29yZQ0KLSAwMDAzOjMwQkMgICAgICAgX25TaW4NCi0gMDAwMzozMkJDICAgICAgIF9uQmFkR3V5cw0KLSAwMDAzOjMyQkUgICAgICAgX2JSZXN0YXJ0DQotIDAwMDM6MzJDMCAgICAgICBfaEFwcFduZA0KLSAwMDAzOjMyQzIgICAgICAgX0ZyZWVMaXN0DQotIDAwMDM6MzJDNiAgICAgICBfYlBhdXNlZA0KLSAwMDAzOjMyQzggICAgICAgX25HcmF2aXR5DQotIDAwMDM6MzJDQSAgICAgICBfU2hvdExpc3QNCi0gMDAwMzozMkNFICAgICAgIF9Sb2lkTGlzdA0KLSAwMDAzOjMyRDIgICAgICAgX2hBcHBQYWxldHRlDQotIDAwMDM6MzJENCAgICAgICBfc3pBcHBOYW1lDQotIDAwMDM6MzJGNCAgICAgICBfblNoaWVsZA0KLSAwMDAzOjMzMDAgICAgICAgX2VuZA0KLQ0KLVByb2dyYW0gZW50cnkgcG9pbnQgYXQgMDAwMToyOUQwDQotDQotIDogZXJyb3IgTDIwMjk6ICdFTkRESUFMT0cnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnSVNaT09NRUQnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnX21haW4nIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnR0VUUFJJVkFURVBST0ZJTEVJTlQnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnU0VMRUNUUEFMRVRURScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdDUkVBVEVXSU5ET1cnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnU0VUQlJVU0hPUkcnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnTVVMRElWJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ01VTERJVicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdfd3NwcmludGYnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnX3dzcHJpbnRmJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0dFVFBSSVZBVEVQUk9GSUxFU1RSSU5HJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0dFVEFTWU5DS0VZU1RBVEUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnUkVMRUFTRURDJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0RFTEVURURDJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1BPU1RRVUlUTUVTU0FHRScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdNRVNTQUdFQk9YJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1VQREFURVdJTkRPVycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdMT0FEU1RSSU5HJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0dFVERDJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ01BS0VQUk9DSU5TVEFOQ0UnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnR0VUQ1VSUkVOVFRJTUUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnRlJFRVBST0NJTlNUQU5DRScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdDUkVBVEVJQycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdTRVRNQVBNT0RFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0ZJTExSRUNUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0xPQURJQ09OJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1JFR0lTVEVSQ0xBU1MnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnTE9BRENVUlNPUicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdHRVRTWVNURU1NRU5VJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1dSSVRFUFJJVkFURVBST0ZJTEVTVFJJTkcnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnRFJBV0lDT04nIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnQ1JFQVRFUEVOJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0NSRUFURVNPTElEQlJVU0gnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnU0VUVklFV1BPUlRPUkcnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnRU5EUEFJTlQnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnVFJBTlNMQVRFTUVTU0FHRScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdHRVRNRVNTQUdFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1NFVFdJTkRPV0VYVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdQVElOUkVDVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdHRVRERVZJQ0VDQVBTJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0RFTEVURU9CSkVDVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdLSUxMVElNRVInIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnRElTUEFUQ0hNRVNTQUdFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1NFVFZJRVdQT1JURVhUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0RFRldJTkRPV1BST0MnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnU0hPV1dJTkRPVycgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdTSE9XV0lORE9XJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0dFVENMSUVOVFJFQ1QnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnSU5WQUxJREFURVJFQ1QnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnU0VMRUNUT0JKRUNUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0dFVElOU1RBTkNFREFUQScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdTRVRUSU1FUicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdCRUdJTlBBSU5UJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0NIQU5HRU1FTlUnIDogdW5yZXNvbHZlZCBleHRlcm5hbA0KLSA6IGVycm9yIEwyMDI5OiAnR0VUV0lORE9XUkVDVCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdDUkVBVEVQQUxFVFRFJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ1BPTFlMSU5FJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0gOiBlcnJvciBMMjAyOTogJ0RJQUxPR0JPWCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdSRUFMSVpFUEFMRVRURScgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdTRVRQSVhFTCcgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdHRVRTWVNDT0xPUicgOiB1bnJlc29sdmVkIGV4dGVybmFsDQotIDogZXJyb3IgTDIwMjk6ICdTRVRXSU5ET1dURVhUJyA6IHVucmVzb2x2ZWQgZXh0ZXJuYWwNCi0NCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLnJjIGIvdGVzdC9oeXBlcm9pZC9oeXBlcm9pZC5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4YWZiNy4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2h5cGVyb2lkLnJjCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8NCi0vLyBIWVBFUk9JRC5SQyAtIG9yYml0ZXIgcmVzb3VyY2VzDQotLy8NCi0NCi0jaW5jbHVkZSA8d2luZG93cy5oPg0KLSNpbmNsdWRlICJoeXBlcm9pZC5oIg0KLQ0KLUlESV9IWVBFUk9JRCBJQ09OICJoeXBlcm9pZC5pY28iDQotSURJX1BBTklDIElDT04gInBhbmljLmljbyINCi0NCi1TVFJJTkdUQUJMRQ0KLXsNCi0JSURTX05BTUUsICJIeXBlcm9pZCINCi0JSURNX05FVywgIk5ldyBHYW1lJiEiDQotCUlETV9BQk9VVCwgIiZBYm91dC4uLiINCi19DQotDQotLy8NCi0vLyBBYm91dCBib3gNCi0vLw0KLQ0KLUlERF9BQk9VVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzMCwgMzAsIDE1MCwgMTIwDQotQ0FQVElPTiAiQWJvdXQiDQotU1RZTEUgV1NfQk9SREVSIHwgV1NfQ0FQVElPTiB8IFdTX0RMR0ZSQU1FIHwgV1NfU1lTTUVOVSB8IFdTX1ZJU0lCTEUgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVANCi17DQotCUNURVhUICAgICAgICAgICAiSHlwZXJvaWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMTAsIDE1MCwgOA0KLQlDVEVYVCAgICAgICAgICAgIlRoZSBjbGFzc2ljIGdhbWUiLCAgICAgICAgICAgICAgICAgLTEsIDAsIDIwLCAxNTAsIDgNCi0JQ1RFWFQgICAgICAgICAgICJWZXJzaW9uIDEuMSIsICAgICAgICAgICAgICAgICAgICAgIC0xLCAwLCAzMCwgMTUwLCA4DQotCUNURVhUICAgICAgICAgICAiQ29weXJpZ2h0IKkgMTk5MSBIdXRjaGlucyBTb2Z0d2FyZSIsIC0xLCAwLCA0NSwgMTUwLCA4DQotCUNURVhUICAgICAgICAgICAiVGhpcyBwcm9ncmFtIGlzIGZyZWV3YXJlIiwgICAgICAgICAtMSwgMCwgNTUsIDE1MCwgOA0KLQlDVEVYVCAgICAgICAgICAgIkF1dGhvcjogRWR3YXJkIEh1dGNoaW5zIiwgICAgICAgICAgLTEsIDAsIDY1LCAxNTAsIDgNCi0JQ1RFWFQgICAgICAgICAgICJlYWgxQGNlYzEud3VzdGwuZWR1IiwgICAgICAgICAgICAgIC0xLCAwLCA3NSwgMTUwLCA4DQotCUNURVhUICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRERfQV9ISVNDT1JFLCAwLCA4NSwgMTUwLCA4DQotCUlDT04gICAgICAgICAgICBJRElfSFlQRVJPSUQsICAgICAgICAgICAgICAgICAgICAgICAtMSwgMTAsIDE2LCAwLCAwDQotCURFRlBVU0hCVVRUT04gICAiT2shIiwgSURPSywgICAgICAgICAgICAgICAgICAgICAgICAyMCwgMTAwLCA0MCwgMTINCi0JQ09OVFJPTCAgICAgICAgICImSGVscCIsIElERF9BX0hFTFAsICAgICAgICAgICAgICAgICJidXR0b24iLCBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0NISUxELCA5MCwgMTAwLCA0MCwgMTINCi19DQotDQotLy8NCi0vLyBiaXRtYXBzDQotLy8NCi0NCi1JREJfYmxhbmsgICBCSVRNQVAgRElTQ0FSREFCTEUgICJibGFuay5ibXAiDQotSURCX2JvbWIgICAgQklUTUFQIERJU0NBUkRBQkxFICAiYm9tYi5ibXAiDQotSURCX2xldmVsICAgQklUTUFQIERJU0NBUkRBQkxFICAibGV2ZWwuYm1wIg0KLUlEQl9saWZlICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgImxpZmUuYm1wIg0KLUlEQl9udW0wICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTAuYm1wIg0KLUlEQl9udW0xICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTEuYm1wIg0KLUlEQl9udW0yICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTIuYm1wIg0KLUlEQl9udW0zICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTMuYm1wIg0KLUlEQl9udW00ICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTQuYm1wIg0KLUlEQl9udW01ICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTUuYm1wIg0KLUlEQl9udW02ICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTYuYm1wIg0KLUlEQl9udW03ICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTcuYm1wIg0KLUlEQl9udW04ICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTguYm1wIg0KLUlEQl9udW05ICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgIm51bTkuYm1wIg0KLUlEQl9wbHVzICAgIEJJVE1BUCBESVNDQVJEQUJMRSAgInBsdXMuYm1wIg0KLUlEQl9zY29yZSAgIEJJVE1BUCBESVNDQVJEQUJMRSAgInNjb3JlLmJtcCINCi1JREJfc2hpZWxkICBCSVRNQVAgRElTQ0FSREFCTEUgICJzaGllbGQuYm1wIg0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbGV2ZWwuYm1wIGIvdGVzdC9oeXBlcm9pZC9sZXZlbC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWYwM2UuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9sZXZlbC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL2xpZmUuYm1wIGIvdGVzdC9oeXBlcm9pZC9saWZlLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZDYyMy4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2xpZmUuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9saXN0LmMgYi90ZXN0L2h5cGVyb2lkL2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNzA2NC4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vDQotLy8gTElTVCAtIGxpc3QgcHJvY2Vzc2luZyBmdW5jdGlvbnMgZm9yIG9yYml0ZXINCi0vLw0KLS8vIFZlcnNpb246IDEuMCAgQ29weXJpZ2h0IChDKSAxOTkwLCBIdXRjaGlucyBTb2Z0d2FyZQ0KLS8vIEF1dGhvcjogRWR3YXJkIEh1dGNoaW5zDQotLy8gUmV2aXNpb25zOg0KLS8vDQotDQotI2luY2x1ZGUgIm9yYml0ZXIuaCINCi0NCi0vLw0KLS8vIEFkZEhlYWQgLSBhZGQgYW4gb2JqZWN0IHRvIHRoZSBoZWFkIG9mIGEgbGlzdA0KLS8vDQotDQotVk9JRCBGQVIgUEFTQ0FMIEFkZEhlYWQoIE5QTElTVCBucExpc3QsIE5QTk9ERSBucE5vZGUgKQ0KLXsNCi0JaWYgKG5wTGlzdC0+bnBIZWFkKQ0KLQl7DQotCQlucE5vZGUtPm5wTmV4dCA9IG5wTGlzdC0+bnBIZWFkOw0KLQkJbnBOb2RlLT5ucFByZXYgPSBOVUxMOw0KLQkJbnBMaXN0LT5ucEhlYWQgPSAobnBMaXN0LT5ucEhlYWQtPm5wUHJldiA9IG5wTm9kZSk7DQotCX0NCi0JZWxzZSAvLyBhZGQgdG8gYW4gZW1wdHkgbGlzdA0KLQl7DQotCQlucExpc3QtPm5wSGVhZCA9IG5wTGlzdC0+bnBUYWlsID0gbnBOb2RlOw0KLQkJbnBOb2RlLT5ucE5leHQgPSBucE5vZGUtPm5wUHJldiA9IE5VTEw7DQotCX0NCi19DQotDQotLy8NCi0vLyBSZW1IZWFkIC0gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgbGlzdA0KLS8vDQotDQotTlBOT0RFIEZBUiBQQVNDQUwgUmVtSGVhZCggTlBMSVNUIG5wTGlzdCApDQotew0KLQlpZiAobnBMaXN0LT5ucEhlYWQpDQotCXsNCi0JCU5QTk9ERSBucE5vZGUgPSBucExpc3QtPm5wSGVhZDsNCi0JCWlmIChucExpc3QtPm5wVGFpbCAhPSBucE5vZGUpDQotCQl7DQotCQkJbnBMaXN0LT5ucEhlYWQgPSBucE5vZGUtPm5wTmV4dDsNCi0JCQlucE5vZGUtPm5wTmV4dC0+bnBQcmV2ID0gTlVMTDsNCi0JCX0NCi0JCWVsc2UgbnBMaXN0LT5ucEhlYWQgPSBucExpc3QtPm5wVGFpbCA9IE5VTEw7DQotCQlyZXR1cm4oIG5wTm9kZSApOw0KLQl9DQotCWVsc2UgcmV0dXJuKCBOVUxMICk7DQotfQ0KLQ0KLS8vDQotLy8gUmVtb3ZlIC0gcmVtb3ZlIGFuIGFyYml0cmFyeSBlbGVtZW50IGZyb20gYSBsaXN0DQotLy8NCi0NCi1WT0lEIEZBUiBQQVNDQUwgUmVtb3ZlKCBOUExJU1QgbnBMaXN0LCBOUE5PREUgbnBOb2RlICkNCi17DQotCWlmIChucE5vZGUtPm5wUHJldikgbnBOb2RlLT5ucFByZXYtPm5wTmV4dCA9IG5wTm9kZS0+bnBOZXh0Ow0KLQllbHNlIG5wTGlzdC0+bnBIZWFkID0gbnBOb2RlLT5ucE5leHQ7DQotCWlmIChucE5vZGUtPm5wTmV4dCkgbnBOb2RlLT5ucE5leHQtPm5wUHJldiA9IG5wTm9kZS0+bnBQcmV2Ow0KLQllbHNlIG5wTGlzdC0+bnBUYWlsID0gbnBOb2RlLT5ucFByZXY7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbWFrZWZpbGUubWsgYi90ZXN0L2h5cGVyb2lkL21ha2VmaWxlLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWMzOTM4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvbWFrZWZpbGUubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMNCi0jICAgaHlwZXJvaWQgbWFrZWZpbGUNCi0jDQotIyAgIENvcHlyaWdodCAoQykgMTk4OC0xOTkwIExhbnRlcm4gQ29ycC4NCi0jDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jIFRoaXMgaXMganVzdCBhIHRlYXNlciB0byBzaG93IGhvdyBsaXR0bGUgeW91IGhhdmUgdG8gZG8gdG8gbWFrZSBwcm9qZWN0cw0KLSMgdW5kZXIgTGFudGVybiBDb3JwLidzIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHN5c3RlbS4gVG8gbWFrZSBIeXBlcm9pZCBvbg0KLSMgeW91ciBzeXN0ZW0sIG1ha2Ugc3VyZSA8d2luZXh0Lmg+IGlzIGluIHlvdXIgaW5jbHVkZSBwYXRoIGFuZCBzZXQgdXAgeW91cg0KLSMgbWFrZWZpbGUgbGlrZSB5b3Ugbm9ybWFsbHkgZG8gZm9yIHlvdXIgb3duIHN0dWZmLg0KLSMgSSdsbCAoaG9wZWZ1bGx5KSBwb3N0IHRoZSAxMDBrIG9mIHN0dWZmIHlvdSBuZWVkIGZvciB0aGlzIG1ha2VmaWxlIHRvDQotIyBiZSB1c2VmdWxsLiBJJ2xsIGhhdmUgdG8gdGFsayB0byBteSBib3NzIGZpcnN0Li4uDQotIyBQLlMuIFRoZSBzeXN0ZW0gb25seSB3b3JrcyBmb3IgdGhlIE1pcmNvc29mdCBDNi4wIGNvbXBpbGVyLCBidXQgaXRzIGVhc3kNCi0jIGVub3VnaCB0byBjaGFuZ2UuDQotIyBQLlAuUy4gSSBoYXRlIGV2ZXJ5IGludGVncmF0ZWQgZW52aXJvbm1lbnQgSSd2ZSBydW4gYWNyb3NzIHNvIGZhciwgdGh1cw0KLSMgdGhlIHN5c3RlbSBpcyBydW4gZnJvbSBhIGNvbW1hbmQgcHJvbXB0Lg0KLQ0KLVBST0ogPSBoeXBlcm9pZA0KLU9CSlMgPSBoeXBlcm9pZC5vYmogcm9pZHN1cHAub2JqDQotUkVTUyA9IGh5cGVyb2lkLnJlcw0KLUxJQlMgPQ0KLQ0KLSFpbmNsdWRlIDx3aW5kb3dzLm1rPg0KLQ0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtMC5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTAuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZhODQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvbnVtMC5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL251bTEuYm1wIGIvdGVzdC9oeXBlcm9pZC9udW0xLmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyZDBmOS4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL251bTEuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9udW0yLmJtcCBiL3Rlc3QvaHlwZXJvaWQvbnVtMi5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjcwZmEuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9udW0yLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtMy5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTMuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI5OTcxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvbnVtMy5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL251bTQuYm1wIGIvdGVzdC9oeXBlcm9pZC9udW00LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNGE2Yy4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL251bTQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9udW01LmJtcCBiL3Rlc3QvaHlwZXJvaWQvbnVtNS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmNhNDYuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9udW01LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtNi5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTYuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjIwMGJkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvbnVtNi5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL251bTcuYm1wIGIvdGVzdC9oeXBlcm9pZC9udW03LmJtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlYWY2Yy4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL251bTcuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9udW04LmJtcCBiL3Rlc3QvaHlwZXJvaWQvbnVtOC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOWVlYjAuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9udW04LmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvbnVtOS5ibXAgYi90ZXN0L2h5cGVyb2lkL251bTkuYm1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIxOGQyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvbnVtOS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL3BhbmljLmljbyBiL3Rlc3QvaHlwZXJvaWQvcGFuaWMuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmU0NDkyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvaHlwZXJvaWQvcGFuaWMuaWNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC9wbHVzLmJtcCBiL3Rlc3QvaHlwZXJvaWQvcGx1cy5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZWRhOTQuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9wbHVzLmJtcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvcmVhZC5tZSBiL3Rlc3QvaHlwZXJvaWQvcmVhZC5tZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmNzBkYi4uMDAwMDAwMAotLS0gYS90ZXN0L2h5cGVyb2lkL3JlYWQubWUKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLUxFR0FMIEpVTks6DQotDQotCUh5cGVyb2lkIC0gYSBnYW1lIGZvciBNaXJjb3NvZnQgV2luZG93cyAodG0pDQotCUNvcHlyaWdodCAoQykgMTk5MSBFZHdhcmQgSHV0Y2hpbnMNCi0JaW50ZXJuZXQ6IGVhaDFAY2VjMS53dXN0bC5lZHUNCi0JdXNuYWlsOiBjL28gRWR3YXJkIEh1dGNoaW5zLCA2MyBSaWRnZW1vb3IgRHIuLCBDbGF5dG9uLCBNTyA2MzEwNQ0KLQ0KLQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KLQlpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KLQl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pDQotCWFueSBsYXRlciB2ZXJzaW9uLg0KLQ0KLQlUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCi0JYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCi0JTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KLQlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KLQ0KLQlZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KLQlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KLQlGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4NCi0NCi1Ob3RlOiBXaW5kb3dzIGlzIGEgdHJhZGVtYXJrIG9mIE1pY3Jvc29mdCBDb3JwLiAoRHVoKQ0KLQ0KLVdpdGggdGhpcyBhc2lkZSwNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotDQotSGVsbG8sIGFuZCBXZWxjb21lIHRvIEh5cGVyb2lkIHZlcnNpb24gMS4xIQ0KLQ0KLVRoZSBvYmplY3Qgb2YgdGhlIGdhbWUgaXMgaW50dWl0aXZlLS0tc2hvb3QgZXZlcnl0aGluZyEgKFdlbGwsIGFsbW9zdA0KLWV2ZXJ5dGhpbmcsIGhlaCBoZWghKS4gSWYgdGhlIGtleWJvYXJkIGJ1ZmZlciBvdmVyZmxvd3MgaW4gYWxsIHRoZQ0KLWV4Y2l0ZW1lbnQsIGlnbm9yZSB0aGUgYmVlcHMgeW91IGhlYXIgYW5kIHRoZXknbGwgZ28gYXdheS4NCi0NCi1IeXBlcm9pZHMgdXNlcyB0aGUgcGFsZXR0ZSBtYW5hZ2VyLCBzbyBpZiB5b3UgaGF2ZSBhIHBhbGV0dGUtY2FwYWJsZSBkaXNwbGF5DQotKGFuZCB5b3UgcmVhZCB0aGUgb24tbGluZSBoZWxwIHBhZ2VzKSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHVwIGJldHRlcg0KLWNvbG9ycyB0aGFuIHRoZSBXaW5kb3dzIGRlZmF1bHRzLiBJIGhhdmUgdGVzdGVkIGh5cGVyb2lkcyBvbiBhIG1vbm9jaHJvbWUNCi0nMjg2LCBhbmQgaXQgc2VlbXMgdG8gd29yayBmaW5lLiBJZiB5b3Ugd2FudCB0byByZS1tYXAgdGhlIGtleXMsIGxvb2sgYXQNCi1BcHBlbmRpeCBBIChvciB0aGUgV2luZG93cyBTREspIGZvciBzb21lIG5vbi1BU0NJSSB2aXJ0dWFsIGtleSBjb2Rlcy4NCi0NCi1UaGUgc291cmNlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBzYW1lIGNoYW5uZWwgdGhhdCB5b3UgZ290IHRoZSBleGVjdXRhYmxlDQotdGhyb3VnaCwgYXMgcGVyIHRoZSBHTlUgZ2VuZXJhbCBwdWJsaWMgbGljZW5jZS4gUGxlYXNlIHJlYWQgdGhlIGxpY2VuY2UgaWYNCi15b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBvciBjb250YWN0IG1lIGF0IHRoZSBhYm92ZSBhZGRyZXNzZXMgKGVtYWlsDQotcHJlZmVycmVkKS4NCi0NCi1JZiB5b3UgbWFrZSBtb2RpZmljYXRpb25zL2J1ZyBmaXhlcyB0byBIeXBlcm9pZCwgcGxlYXNlIHVzZSBtZSBhcyBhIGNsZWFyaW5nDQotaG91c2UgdG8gcHJldmVudCB2ZXJzaW9ucyBmbG9vZGluZyBvdXQgaW50byB0aGUgdW5pdmVyc2UuIChZb3UgZG9uJ3QgaGF2ZSB0bywNCi1idXQgSSdkIGFwcHJlY2lhdGUgaXQgOi0pLiBJZiB5b3Ugd3JpdGUgdGhlIHdvcmxkJ3MgZ3JlYXRlc3QgZ2FtZSB1c2luZyBzb21lDQotb2YgbXkgc291cmNlLCBwbGVhc2Ugc2VuZCBtZSBub3RlIHRlbGxpbmcgd2hhdCBpdCBpcyBhbmQgd2hlcmUgaXQncyBhdmFpbGFibGUuDQotDQotQ2hhbmdlcyBzaW5jZSAxLjA6DQotCUV4cGxvc2lvbiBwcm9jZXNzaW5nIGEgbGl0dGxlIGZhc3Rlcg0KLQlTd2FybWVycyAobGl0dGxlIGdyZWVuIGd1eXMpIG5vIGxvbmdlciBmbG9vZCB0aGUgc3lzdGVtDQotCVNjb3JpbmcgaXMgYmV0dGVyDQotCUV4dHJhIGxpdmVzIGV2ZXJ5IDEwMCwwMDAgcG9pbnRzIChub3QgNTAsMDAwKQ0KLQlGaXJlcG93ZXIgcmVkdWNlZCBhIGxpdHRsZSAoaGV5LCB0aGUgZ2FtZSB3YXMgdG9vIGRhcm4gZWFzeSkNCi0JU3Bpbm5pbmcgR2FtZSBPdmVyIChPb29vb2guLi4pDQotDQotTG9vayBmb3I6DQotICBscyAtICpuaXggbHMgY29tbWFuZCB3aXRoIE1VQ0hPIGJlbGxzJndoaXN0bGVzIChjb3VsZG4ndCBsaXZlIHcvb3V0IGl0ISkNCi0gIGJsaXRmaXggLSB1dGlsIHRoYXQgc2V0cyB0aGUgQ1NfQllURUFMSUdOQ0xJRU5UIGJpdCBvbiBhbGwgdG9wIHdpbmRvd3MNCi0JCQkoc3BlZWRzIHVwIG15IDEwMjR4NzY4IGRpc3BsYXkgYnkgYSBmYWN0b3Igb2YgMykNCi0gIGV5ZWNvbiAtIHhleWVzIGNsb25lIChtYXkgaGF2ZSB0byBiZSByZW5hbWVkKQ0KLSAgaWxibSAtIEFtaWdhIElGRiBiaXRtYXAgdmlld2VyIChzdXBwb3J0cyBIQU0gbW9kZSBhbmQgcGFsZXR0ZXMhKQ0KLSAgbGlmZSAtIDcgYmxpdCBsaWZlIHdpdGggYSBmZXcgYmVsbHMmd2hpc3RsZXMNCi0gIGxvYWRtb24gLSBuaWZ0eSBzeXN0ZW0gcGVyZm9ybWFuY2UgbW9uaXRvcg0KLSAgbWJyb3QgLSBtYW5kZWxicm90IGhhY2sgdGhhdCBydW5zIGluIHRoZSBiYWNrZ3JvdW5kDQotICB5b3cgLSBaaXBweSB0aGUgUGluaGVhZCBpbiBoaXMgdmVyeSBvd24gaWNvbiwgdGVsbGluZyBpdCBsaWtlIGl0IGlzDQotICAobW9yZSBnYW1lcy4uLiBzdHVmZi4uLiBqdW5rLi4uKQ0KLUNvbWluZyByZWFsIHNvb24gbm93IHRvIGEgKG5ldCxCQlMsV2hlcmV2ZXIgdGhpcyBzdHVmZiBlbmRzIHVwKSBuZWFyIFlPVSENCi0NCi1BcHBlbmRpeCBBOiBWaXJ0dWFsIEtleSBDb2Rlcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotCVZLX1RBQiAgICAgICAgICAgICAgOSA9IGRlZmF1bHQgc2hpZWxkcw0KLQlWS19SRVRVUk4gICAgICAgICAgIDEzDQotCVZLX1NISUZUICAgICAgICAgICAgMTYNCi0JVktfQ09OVFJPTCAgICAgICAgICAxNw0KLQlWS19DQVBJVEFMICAgICAgICAgIDIwIC0gdXNlZnVsIGZvciBhdXRvZmlyZSENCi0JVktfRVNDQVBFICAgICAgICAgICAyNyA9IGRlZmF1bHQgYm9zcyBrZXkNCi0JVktfU1BBQ0UgICAgICAgICAgICAzMiA9IGRlZmF1bHQgZmlyZSBrZXkNCi0JVktfUFJJT1IgICAgICAgICAgICAzMw0KLQlWS19ORVhUICAgICAgICAgICAgIDM0DQotCVZLX0VORCAgICAgICAgICAgICAgMzUNCi0JVktfSE9NRSAgICAgICAgICAgICAzNg0KLQlWS19MRUZUICAgICAgICAgICAgIDM3ID0gZGVmYXVsdCBjb3VudGVyLWNsb2Nrd2lzZSBrZXkNCi0JVktfVVAgICAgICAgICAgICAgICAzOCA9IGRlZmF1bHQgcmV2ZXJzZSB0aHJ1c3Qga2V5DQotCVZLX1JJR0hUICAgICAgICAgICAgMzkgPSBkZWZhdWx0IGNsb2Nrd2lzZSBrZXkNCi0JVktfRE9XTiAgICAgICAgICAgICA0MCA9IGRlZmF1bHQgdGhydXN0IGtleQ0KLQlWS19JTlNFUlQgICAgICAgICAgIDQ1DQotCVZLX0RFTEVURSAgICAgICAgICAgNDYNCi0JVktfQS1WS19aICAgICAgICAgICA2NC05MCwgODMgPSBkZWZhdWx0IHNtYXJ0Ym9tYiBrZXkgKEFTQ0lJICdTJykNCi0JVktfTlVNUEFEMCAgICAgICAgICA5Ng0KLQlWS19OVU1QQUQxICAgICAgICAgIDk3DQotCVZLX05VTVBBRDIgICAgICAgICAgOTgNCi0JVktfTlVNUEFEMyAgICAgICAgICA5OQ0KLQlWS19OVU1QQUQ0ICAgICAgICAgIDEwMA0KLQlWS19OVU1QQUQ1ICAgICAgICAgIDEwMQ0KLQlWS19OVU1QQUQ2ICAgICAgICAgIDEwMg0KLQlWS19OVU1QQUQ3ICAgICAgICAgIDEwMw0KLQlWS19OVU1QQUQ4ICAgICAgICAgIDEwNA0KLQlWS19OVU1QQUQ5ICAgICAgICAgIDEwNQ0KLQlWS19NVUxUSVBMWSAgICAgICAgIDEwNg0KLQlWS19BREQgICAgICAgICAgICAgIDEwNw0KLQlWS19TRVBBUkFUT1IgICAgICAgIDEwOA0KLQlWS19TVUJUUkFDVCAgICAgICAgIDEwOQ0KLQlWS19ERUNJTUFMICAgICAgICAgIDExMA0KLQlWS19ESVZJREUgICAgICAgICAgIDExMQ0KLQlWS19GMS1WS19GMTYgICAgICAgIDExMi0xMjcNCi0NCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL3JvaWRzdXBwLmMgYi90ZXN0L2h5cGVyb2lkL3JvaWRzdXBwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTMwZjEuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9yb2lkc3VwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLS8vDQotLy8gUk9JRFNVUFAgLSBoeXBlcm9pZCBzdXBwb3J0IGZ1bmN0aW9ucw0KLS8vDQotLy8gVmVyc2lvbjogMS4xICBDb3B5cmlnaHQgKEMpIDE5OTEsIEh1dGNoaW5zIFNvZnR3YXJlDQotLy8gICAgICBUaGlzIHNvZnR3YXJlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQ0KLS8vICAgICAgUGxlYXNlIHJlYWQgdGhlIGFzc29jaWF0ZWQgbGVnYWwgZG9jdW1lbnRhdGlvbg0KLS8vIEF1dGhvcjogRWR3YXJkIEh1dGNoaW5zDQotLy8gUmV2aXNpb25zOg0KLS8vIDExLzAxLzkxIGFkZGVkIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIC0gRWQuDQotLy8NCi0NCi0jaW5jbHVkZSAiaHlwZXJvaWQuaCINCi0NCi0vLw0KLS8vIGRlZmluZXMNCi0vLw0KLQ0KLS8vIHlvdSBtYXkgYXNrLCAid2h5IGRpZCBoZSBlbWJlZCBhbGwgdGhlc2Ugc3RyaW5nIGNvbnN0YW50cyBpbnN0ZWFkIG9mDQotLy8gdXNpbmcgdGhlIHJlc291cmNlIGZpbGU/Ii4gR29vZCBxdWVzdGlvbi4gVGhlIGFuc3dlciBpczogSSBmZWVsIGJldHRlcg0KLS8vIGtub3dpbmcgdGhpcyBzdHVmZiBpcyBwYXJ0IG9mIHRoZSBleGVjdXRhYmxlLCBhbmQgbm90IHBhcnQgb2YgdGhlIHJlc291cmNlDQotLy8gZmlsZSAod2hpY2ggY2FuIGJlIGNoYW5nZWQgYnkgc25lYWt5IHBlb3BsZSkuIE9yIG1heWJlIEkgd3V6IGxhenkuDQotLy8gSWYgeW91IGRvbid0IGxpa2UgaXQsIHRoZW4gWU9VIGNhbiBjaGFuZ2UgaXQhDQotDQotI2RlZmluZSBOTCAiXHgwZFx4MGEiDQotDQotI2RlZmluZSBIWVBFUk9JRF9IRUxQIFwNCi0iVGhlIGZvbGxvd2luZyBrZXlzIGNvbnRyb2wgeW91ciBzaGlwOiIgTkwgTkwgXA0KLSIgIExlZnQsIFJpZ2h0IEFycm93IC4uLi4gc3BpbiBsZWZ0IG9yIHJpZ2h0IiBOTCBcDQotIiAgRG93biwgVXAgQXJyb3cgLi4uLi4gZm9yd2FyZCBvciByZXZlcnNlIHRocnVzdCIgTkwgXA0KLSIgIFNwYWNlIEJhciAuLi4uLi4uLi4uLi4uLiBmaXJlISIgTkwgXA0KLSIgIFRhYiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHNoaWVsZHMiIE5MIFwNCi0iICBTIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHNtYXJ0Ym9tYiIgTkwgXA0KLSIgIEVzYyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHBhdXNlL2Jvc3Mga2V5IiBOTCBOTCBcDQotIk5vdGU6IFlvdSBoYXZlIDMgbGl2ZXMsIHVubGltaXRlZCBmdWVsIGFuZCBmaXJlcG93ZXIsIDMgc2hpZWxkcyBhbmQgMyAiIFwNCi0ic21hcnRib21icy4gWW91ciBzaGlwIGdldHMgZGFya2VyIHdoZW4geW91IGxvc2UgYSBsaWZlLCBidXQgeW91IGtlZXAgb24gIiBcDQotInBsYXlpbmcgKHVubGVzcyB5b3UgaGl0IGFuIGFzdGVyb2lkKS4gWW91IGdldCBhbiBleHRyYSBsaWZlIGV2ZXJ5IDEwMCwwMDAgIiBcDQotInBvaW50cy4gV2hlbiB5b3UgbG9zZSB0aGUgZ2FtZSwgeW91IHN0YXJ0IG92ZXIgaW1tZWRpYXRlbHkgYW5kIGNhbiBmaW5pc2ggIiBcDQotIm9mZiB0aGUgY3VycmVudCBsZXZlbCAod2hpY2ggc2hvdWxkIG5vdyBiZSAwKSBiZWZvcmUgc3RhcnRpbmcgb3ZlciBhdCAiIFwNCi0ibGV2ZWwgMSAoVGhlcmUgaXMgbm8gd2FpdGluZyBhcm91bmQgYmV0d2VlbiBnYW1lcykuIg0KLQ0KLSNkZWZpbmUgSFlQRVJPSURfSEVMUDIgXA0KLSJUaGUgSFlQRVJPSUQuSU5JIGZpbGUgY2FuIGJlIGNyZWF0ZWQvbW9kaWZpZWQgdG8gY2hhbmdlIGRlZmF1bHQgc2V0dGluZ3MgIiBcDQotImluIEh5cGVyb2lkLiBIZXJlIGFyZSBzb21lIG9mIHRoZSBpdGVtcyB5b3UgY2FuIHNldDoiIE5MIFwNCi1OTCAiW0h5cGVyb2lkXSIgTkwgIk1heD08MC8xPiIgTkwgIntYLFksVyxIfT08bj4iIE5MICJNb25vPTwwLzE+IiBOTCBcDQotIkRyYXdEZWxheT08bXM+IDttaWNyb3NlY29uZHMvZnJhbWUiIE5MIFwNCi1OTCAiW1BhbGV0dGVdIiBOTCBcDQotIntCbGFjayxEa0dyZXksR3JleSxXaGl0ZSwiIE5MIFwNCi0iIERrUmVkLFJlZCxEa0dyZWVuLEdyZWVuLERrQmx1ZSxCbHVlLCIgTkwgXA0KLSIgRGtZZWxsb3csWWVsbG93LERrQ3lhbixDeWFuLCIgTkwgXA0KLSIgRGtNYWdlbnRhLE1hZ2VudGF9PTxyPiw8Zz4sPGI+IiBOTCBcDQotTkwgIltLZXlzXSIgTkwgXA0KLSJ7U2hpZWxkLENsb2Nrd2lzZSxDdHJDbG9ja3dpc2UsIiBOTCBcDQotIiBUaHJ1c3QsUmV2VGhydXN0LEZpcmUsQm9tYn09PHZpcnR1YWwga2V5Y29kZT4iIE5MIE5MIFwNCi0iTm90ZTogVmlydHVhbCBrZXljb2RlcyB1c3VhbGx5IG1hdGNoIHRoZSBrZXkncyBBU0NJSSB2YWx1ZS4iDQotDQotI2RlZmluZSBIWVBFUk9JRF9IRUxQU1RZTEUgKE1CX09LIHwgTUJfSUNPTkFTVEVSSVNLKQ0KLQ0KLS8vIHRoaXMgaXMgdGhlIHBhcnQgSSBlc3BlY2lhbGx5IHdhbnQgaW4gdGhlIGV4ZWN1dGFibGUgaW1hZ2UNCi0NCi0jZGVmaW5lIEhZUEVST0lEX0xJQ0VOU0UgXA0KLSJUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAiIFwNCi0iaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgIiBcDQotInRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikgIiBcDQotImFueSBsYXRlciB2ZXJzaW9uLiAiIFwNCi1OTCBOTCBcDQotIlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAiIFwNCi0iYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgIiBcDQotIk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgIiBcDQotIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICIgXA0KLU5MIE5MIFwNCi0iWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgIiBcDQotImFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICIgXA0KLSJGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gIg0KLQ0KLS8vDQotLy8gaW1wb3J0cw0KLS8vDQotDQotSU1QT1JUIENIQVIgICAgICAgICBzekFwcE5hbWVbMzJdIEZST00oIGh5cGVyb2lkLmMgKTsNCi1JTVBPUlQgSEFORExFICAgICAgIGhBcHBJbnN0IEZST00oIGh5cGVyb2lkLmMgKTsNCi1JTVBPUlQgQk9PTCAgICAgICAgIGJCVyBGUk9NKCBoeXBlcm9pZC5jICk7DQotSU1QT1JUIElOVCAgICAgICAgICBuRHJhd0RlbGF5IEZST00oIGh5cGVyb2lkLmMgKTsNCi1JTVBPUlQgSU5UICAgICAgICAgIHZrU2hsZCBGUk9NKCBoeXBlcm9pZC5jICk7DQotSU1QT1JUIElOVCAgICAgICAgICB2a0Nsa3cgRlJPTSggaHlwZXJvaWQuYyApOw0KLUlNUE9SVCBJTlQgICAgICAgICAgdmtDdHJDbGt3IEZST00oIGh5cGVyb2lkLmMgKTsNCi1JTVBPUlQgSU5UICAgICAgICAgIHZrVGhyc3QgRlJPTSggaHlwZXJvaWQuYyApOw0KLUlNUE9SVCBJTlQgICAgICAgICAgdmtSdlRocnN0IEZST00oIGh5cGVyb2lkLmMgKTsNCi1JTVBPUlQgSU5UICAgICAgICAgIHZrRmlyZSBGUk9NKCBoeXBlcm9pZC5jICk7DQotSU1QT1JUIElOVCAgICAgICAgICB2a0JvbWIgRlJPTSggaHlwZXJvaWQuYyApOw0KLUlNUE9SVCBMT05HICAgICAgICAgbEhpZ2hTY29yZSBGUk9NKCBoeXBlcm9pZC5jICk7DQotDQotLy8NCi0vLyBnbG9iYWxzDQotLy8NCi0NCi0vLyB0aGVzZSBwYXJ0cyBtYXAgdG8gImFiY2RlZmdoaWprbG0iDQotR0xPQkFMIFBPSU5UICAgICAgICBMZXR0ZXJQYXJ0W10gPQ0KLXsNCi0JezgzLCA1NzJ9LCB7NjQsIDUxMn0sIHs0NSwgNTcyfSwgezk2LCAzNjJ9LCB7MzIsIDM2Mn0sDQotCXsxMjgsIDI1Nn0sIHswLCAwfSwgezAsIDI1Nn0sDQotCXsxNjAsIDM2Mn0sIHsyMjQsIDM2Mn0sIHsxNzMsIDU3Mn0sIHsxOTIsIDUxMn0sIHsyMTEsIDU3Mn0NCi19Ow0KLS8vIGhlcmUncyB0aGUgdmVjdG9yIGZvbnQNCi1HTE9CQUwgTlBTVFIgICAgICAgIHN6TnVtYmVyRGVzY1tdID0NCi17DQotCSJjYWttY2siLCAgICAgICAvLyAwDQotCSJkYmwiLCAgICAgICAgICAvLyAxDQotCSJhYmVrbSIsICAgICAgICAvLyAyDQotCSJhYmVnamxrIiwgICAgICAvLyAzDQotCSJtY2ZoIiwgICAgICAgICAvLyA0DQotCSJjYmZnamxrIiwgICAgICAvLyA1DQotCSJiZGlsamdpIiwgICAgICAvLyA2DQotCSJhY2dsIiwgICAgICAgICAvLyA3DQotCSJiZGpsaWViIiwgICAgICAvLyA4DQotCSJsamViZGdlIiAgICAgICAvLyA5DQotfTsNCi1HTE9CQUwgTlBTVFIgICAgICAgIHN6TGV0dGVyRGVzY1tdID0NCi17DQotCSJrZGJlbWhmIiwgICAgICAvLyBBDQotCSJrYWJlZ2psayIsICAgICAvLyBCDQotCSJjYmZsbSIsICAgICAgICAvLyBDDQotCSJrYWJlamxrIiwgICAgICAvLyBEDQotCSJjYWZnZmttIiwgICAgICAvLyBFDQotCSJjYWZnZmsiLCAgICAgICAvLyBGDQotCSJiZGlsamhnIiwgICAgICAvLyBHDQotCSJrYWZoY20iLCAgICAgICAvLyBIDQotCSJibCIsICAgICAgICAgICAvLyBJDQotCSJjamxpIiwgICAgICAgICAvLyBKDQotCSJha2NnbSIsICAgICAgICAvLyBLDQotCSJha20iLCAgICAgICAgICAvLyBMDQotCSJrYWdjbSIsICAgICAgICAvLyBNDQotCSJrYW1jIiwgICAgICAgICAvLyBODQotCSJiZGlsamViIiwgICAgICAvLyBPDQotCSJrYWJlZ2YiLCAgICAgICAvLyBQDQotCSJtbGlkYmVqbCIsICAgICAvLyBRDQotCSJrYWJlZ2ZnbSIsICAgICAvLyBSDQotCSJlYmRqbGkiLCAgICAgICAvLyBTDQotCSJsYmFjIiwgICAgICAgICAvLyBUDQotCSJhaWxqYyIsICAgICAgICAvLyBVDQotCSJhbGMiLCAgICAgICAgICAvLyBWDQotCSJha2dtYyIsICAgICAgICAvLyBXDQotCSJhbWdrYyIsICAgICAgICAvLyBYDQotCSJhZ2xnYyIsICAgICAgICAvLyBZDQotCSJhY2ttIiAgICAgICAgICAvLyBaDQotfTsNCi0NCi0vLw0KLS8vIGxvY2Fscw0KLS8vDQotDQotTE9DQUwgQ0hBUiAgICAgICAgICBzekluaVtdID0gIkhZUEVST0lELklOSSI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzekxpY2Vuc2VbXSA9ICJMaWNlbnNlUmVhZCI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzekRyYXdEZWxheVtdID0gIkRyYXdEZWxheSI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzek1heFtdID0gIk1heCI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzelhbXSA9ICJYIjsNCi1MT0NBTCBDSEFSICAgICAgICAgIHN6WVtdID0gIlkiOw0KLUxPQ0FMIENIQVIgICAgICAgICAgc3pXW10gPSAiVyI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzekhbXSA9ICJIIjsNCi1MT0NBTCBDSEFSICAgICAgICAgIHN6QldbXSA9ICJNb25vIjsNCi1MT0NBTCBDSEFSICAgICAgICAgIHN6UGFsZXR0ZVtdID0gIlBhbGV0dGUiOw0KLUxPQ0FMIENIQVIgICAgICAgICAgc3pLZXlzW10gPSAiS2V5cyI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzelNoaWVsZFtdID0gIlNoaWVsZCI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzekNsb2Nrd2lzZVtdID0gIkNsb2Nrd2lzZSI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzekN0ckNsb2Nrd2lzZVtdID0gIkN0ckNsb2Nrd2lzZSI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzelRocnVzdFtdID0gIlRocnVzdCI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzelJldlRocnVzdFtdID0gIlJldlRocnVzdCI7DQotTE9DQUwgQ0hBUiAgICAgICAgICBzekZpcmVbXSA9ICJGaXJlIjsNCi1MT0NBTCBDSEFSICAgICAgICAgIHN6Qm9tYltdID0gIkJvbWIiOw0KLUxPQ0FMIENIQVIgICAgICAgICAgc3pIaVtdID0gIkhpIjsNCi1MT0NBTCBDSEFSICAgICAgICAgICpzekNvbG9yTmFtZVtdID0NCi17DQotCSJCbGFjayIsICJEa0dyZXkiLCAiR3JleSIsICJXaGl0ZSIsDQotCSJEa1JlZCIsICJSZWQiLCAgIkRrR3JlZW4iLCAiR3JlZW4iLCAiRGtCbHVlIiwgIkJsdWUiLA0KLQkiRGtZZWxsb3ciLCAiWWVsbG93IiwgIkRrQ3lhbiIsICJDeWFuIiwgIkRrTWFnZW50YSIsICJNYWdlbnRhIg0KLX07DQotTE9DQUwgRFdPUkQgICAgICAgICBkd0NvbG9yc1tdID0NCi17DQotCVJHQigwLDAsMCksIFJHQigxMjgsMTI4LDEyOCksDQotCVJHQigxOTIsMTkyLDE5MiksIFJHQigyNTUsMjU1LDI1NSksDQotCVJHQigxMjgsMCwwKSwgUkdCKDI1NSwwLDApLA0KLQlSR0IoMCwxMjgsMCksIFJHQigwLDI1NSwwKSwNCi0JUkdCKDAsMCwxMjgpLCBSR0IoMCwwLDI1NSksDQotCVJHQigxMjgsMTI4LDApLCBSR0IoMjU1LDI1NSwwKSwNCi0JUkdCKDAsMTI4LDEyOCksIFJHQigwLDI1NSwyNTUpLA0KLQlSR0IoMTI4LDAsMTI4KSwgUkdCKDI1NSwwLDI1NSksDQotfTsNCi0NCi0vLw0KLS8vIFByaW50TGV0dGVycyAtIGNyZWF0ZSBsZXR0ZXIgb2JqZWN0cyBmcm9tIGEgc3RyaW5nDQotLy8NCi0NCi1WT0lEIEZBUiBQQVNDQUwgUHJpbnRMZXR0ZXJzKCBOUFNUUiBucHN6VGV4dCwgUE9JTlQgUG9zLCBQT0lOVCBWZWwsDQotCQkJCQkJCSAgQllURSBieUNvbG9yLCBJTlQgblNpemUgKQ0KLXsNCi0JSU5UICAgICAgICAgICAgIG5MZW4gPSBzdHJsZW4oIG5wc3pUZXh0ICk7DQotCUlOVCAgICAgICAgICAgICBuQ250ID0gbkxlbjsNCi0JSU5UICAgICAgICAgICAgIG5TcGFjZSA9IG5TaXplICsgblNpemUgLyAyOw0KLQlJTlQgICAgICAgICAgICAgbkJhc2UgPSAobkxlbiAtIDEpICogblNwYWNlOw0KLQlJTlQgICAgICAgICAgICAgbkJhc2VTdGFydCA9IFBvcy54ICsgbkJhc2UgLyAyOw0KLQ0KLQl3aGlsZSAobkNudC0tKQ0KLQl7DQotCQlOUE9CSiBucEx0ciA9IENyZWF0ZUxldHRlciggbnBzelRleHRbbkNudF0sIG5TaXplIC8gMiApOw0KLQkJaWYgKG5wTHRyKQ0KLQkJew0KLQkJCW5wTHRyLT5Qb3MueCA9IG5CYXNlU3RhcnQ7DQotCQkJbnBMdHItPlBvcy55ID0gUG9zLnk7DQotCQkJbnBMdHItPlZlbCA9IFZlbDsNCi0JCQlucEx0ci0+YnlDb2xvciA9IGJ5Q29sb3I7DQotCQl9DQotCQluQmFzZVN0YXJ0IC09IG5TcGFjZTsNCi0JfQ0KLX0NCi0NCi0vLw0KLS8vIFNwaW5MZXR0ZXJzIC0gc3BpbiBsZXR0ZXIgb2JqZWN0cyBhd2F5IGZyb20gY2VudGVyIGZvciBlZmZlY3QNCi0vLw0KLQ0KLVZPSUQgRkFSIFBBU0NBTCBTcGluTGV0dGVycyggTlBTVFIgbnBzelRleHQsIFBPSU5UIFBvcywgUE9JTlQgVmVsLA0KLQkJCQkJCQkgQllURSBieUNvbG9yLCBJTlQgblNpemUgKQ0KLXsNCi0JSU5UICAgICAgICAgICAgIG5MZW4gPSBzdHJsZW4oIG5wc3pUZXh0ICk7DQotCUlOVCAgICAgICAgICAgICBuQ250ID0gbkxlbjsNCi0JSU5UICAgICAgICAgICAgIG5TcGFjZSA9IG5TaXplICsgblNpemUgLyAyOw0KLQlJTlQgICAgICAgICAgICAgbkJhc2UgPSAobkxlbiAtIDEpICogblNwYWNlOw0KLQlJTlQgICAgICAgICAgICAgbkJhc2VTdGFydCA9IFBvcy54ICsgbkJhc2UgLyAyOw0KLQ0KLQl3aGlsZSAobkNudC0tKQ0KLQl7DQotCQlOUE9CSiBucEx0ciA9IENyZWF0ZUxldHRlciggbnBzelRleHRbbkNudF0sIG5TaXplIC8gMiApOw0KLQkJaWYgKG5wTHRyKQ0KLQkJew0KLQkJCUlOVCBuU3BpbiA9IChuQ250IC0gbkxlbiAvIDIpICogMjsNCi0JCQlucEx0ci0+UG9zLnggPSBuQmFzZVN0YXJ0Ow0KLQkJCW5wTHRyLT5Qb3MueSA9IFBvcy55Ow0KLQkJCW5wTHRyLT5WZWwgPSBWZWw7DQotCQkJbnBMdHItPlZlbC54ICs9IG5TcGluICogMTY7DQotCQkJbnBMdHItPm5TcGluID0gLW5TcGluOw0KLQkJCW5wTHRyLT5ieUNvbG9yID0gYnlDb2xvcjsNCi0JCX0NCi0JCW5CYXNlU3RhcnQgLT0gblNwYWNlOw0KLQl9DQotfQ0KLQ0KLS8vDQotLy8gQ3JlYXRlSHlwZXJvaWRQYWxldHRlIC0gY3JlYXRlIGEgbG9naWNhbCBwYWxldHRlDQotLy8NCi0NCi1IUEFMRVRURSBGQVIgUEFTQ0FMIENyZWF0ZUh5cGVyb2lkUGFsZXR0ZSggVk9JRCApDQotew0KLQlIUEFMRVRURSAgICAgICAgaFBhbGV0dGU7DQotCUhEQyAgICAgICAgICAgICBoSUMgPSBDcmVhdGVJQyggIkRJU1BMQVkiLCBOVUxMLCBOVUxMLCBOVUxMICk7DQotCUlOVCAgICAgICAgICAgICB0Ow0KLQlQQUxFVFRFRU5UUlkgICAgUGFsW1BBTEVUVEVfU0laRSArIDJdOw0KLQlOUExPR1BBTEVUVEUgICAgbnBMb2dQYWxldHRlID0gKE5QTE9HUEFMRVRURSlQYWw7DQotDQotCS8vIGFyZSB3ZSBmb3JjZWQgaW50byB1c2luZyBiJnc/DQotCWJCVyA9IEZBTFNFOw0KLQlpZiAoR2V0RGV2aWNlQ2FwcyggaElDLCBOVU1DT0xPUlMgKSA8IDgpIGJCVyA9IFRSVUU7DQotCURlbGV0ZURDKCBoSUMgKTsNCi0JaWYgKEdldFByaXZhdGVQcm9maWxlSW50KCBzekFwcE5hbWUsIHN6QlcsIEZBTFNFLCBzekluaSApKSBiQlcgPSBUUlVFOw0KLQ0KLQlucExvZ1BhbGV0dGUtPnBhbFZlcnNpb24gPSAweDAzMDA7DQotCW5wTG9nUGFsZXR0ZS0+cGFsTnVtRW50cmllcyA9IFBBTEVUVEVfU0laRTsNCi0NCi0JZm9yICh0ID0gMDsgdCA8IFBBTEVUVEVfU0laRTsgKyt0KQ0KLQl7DQotCQlEV09SRCAgICAgICAgICAgZHdDb2xvciA9IGR3Q29sb3JzW3RdOw0KLQkJQ0hBUiAgICAgICAgICAgIHN6QnVmZlszMl07DQotDQotCQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZyggc3pQYWxldHRlLCBzekNvbG9yTmFtZVt0XSwgIiIsDQotCQkJCQkJCQkgc3pCdWZmLCBzaXplb2Yoc3pCdWZmKSwgc3pJbmkgKTsNCi0JCWlmIChzekJ1ZmZbMF0pDQotCQl7DQotCQkJSU5UIHIsIGcsIGI7DQotCQkJTlBTVFIgbnBCdWZmID0gc3pCdWZmOw0KLQkJCXIgPSBnID0gYiA9IDI1NTsNCi0JCQl3aGlsZSAoKm5wQnVmZiA9PSAnICcpICsrbnBCdWZmOw0KLQkJCXIgPSBhdG9pKCBucEJ1ZmYgKTsNCi0JCQl3aGlsZSAoKm5wQnVmZiAmJiAqbnBCdWZmICE9ICcsJykgKytucEJ1ZmY7DQotCQkJaWYgKCpucEJ1ZmYgPT0gJywnKSBnID0gYXRvaSggKytucEJ1ZmYgKTsNCi0JCQl3aGlsZSAoKm5wQnVmZiAmJiAqbnBCdWZmICE9ICcsJykgKytucEJ1ZmY7DQotCQkJaWYgKCpucEJ1ZmYgPT0gJywnKSBiID0gYXRvaSggKytucEJ1ZmYgKTsNCi0JCQlkd0NvbG9yID0gUkdCKCByLCBnLCBiICk7DQotCQl9DQotCQlpZiAoYkJXKSBkd0NvbG9yID0gKChkd0NvbG9yID09IFJHQigwLDAsMCkpID8gUkdCKDAsMCwwKSA6IFJHQigyNTUsMjU1LDI1NSkpOw0KLQkJbnBMb2dQYWxldHRlLT5wYWxQYWxFbnRyeVt0XS5wZVJlZCA9IEdldFJWYWx1ZSggZHdDb2xvciApOw0KLQkJbnBMb2dQYWxldHRlLT5wYWxQYWxFbnRyeVt0XS5wZUdyZWVuID0gR2V0R1ZhbHVlKCBkd0NvbG9yICk7DQotCQlucExvZ1BhbGV0dGUtPnBhbFBhbEVudHJ5W3RdLnBlQmx1ZSA9IEdldEJWYWx1ZSggZHdDb2xvciApOw0KLQkJbnBMb2dQYWxldHRlLT5wYWxQYWxFbnRyeVt0XS5wZUZsYWdzID0gMDsNCi0JfQ0KLQ0KLQloUGFsZXR0ZSA9IENyZWF0ZVBhbGV0dGUoIG5wTG9nUGFsZXR0ZSApOw0KLQlyZXR1cm4oIGhQYWxldHRlICk7DQotfQ0KLQ0KLS8vDQotLy8gQ3JlYXRlSHlwZXJvaWRDbGFzcyAtIGNyZWF0ZSB0aGUgY2xhc3Mgb2YgSHlwZXJvaWQncyB3aW5kb3cNCi0vLw0KLQ0KLUJPT0wgRkFSIFBBU0NBTCBDcmVhdGVIeXBlcm9pZENsYXNzKCBWT0lEICkNCi17DQotCVdORENMQVNTICAgICAgICBDbGFzczsNCi0NCi0JLy8gbG9hZCB0aGUgbmFtZSBmcm9tIHRoZSByZXNvdXJjZSBmaWxlDQotCUxvYWRTdHJpbmcoIGhBcHBJbnN0LCBJRFNfTkFNRSwgc3pBcHBOYW1lLCBzaXplb2Yoc3pBcHBOYW1lKSApOw0KLQ0KLQlDbGFzcy5zdHlsZSA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOw0KLQlDbGFzcy5scGZuV25kUHJvYyA9IEh5cGVyb2lkV25kUHJvYzsNCi0JQ2xhc3MuY2JDbHNFeHRyYSA9IDA7DQotCUNsYXNzLmNiV25kRXh0cmEgPSAwOw0KLQlDbGFzcy5oSW5zdGFuY2UgPSBoQXBwSW5zdDsNCi0JQ2xhc3MuaEljb24gPSBOVUxMOw0KLQlDbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvciggTlVMTCwgSURDX0NST1NTICk7DQotCUNsYXNzLmhickJhY2tncm91bmQgPSBITlVMTDsNCi0JQ2xhc3MubHBzek1lbnVOYW1lID0gc3pBcHBOYW1lOw0KLQlDbGFzcy5scHN6Q2xhc3NOYW1lID0gc3pBcHBOYW1lOw0KLQ0KLQlyZXR1cm4oIFJlZ2lzdGVyQ2xhc3MoICZDbGFzcyApICk7DQotfQ0KLQ0KLS8vDQotLy8gU2V0SHlwZXJvaWRNZW51IC0gYWRkIEh5cGVyb2lkJ3MgbWVudSBpdGVtcyB0byB0aGUgc3lzdGVtIG1lbnUNCi0vLw0KLQ0KLVZPSUQgTkVBUiBQQVNDQUwgU2V0SHlwZXJvaWRNZW51KCBIV05EIGhXbmQsIElOVCBuRmlyc3RJRCwgSU5UIG5MYXN0SUQgKQ0KLXsNCi0JQ0hBUiAgICAgICAgICAgIHN6TWVudU5hbWVbNDBdOw0KLQlITUVOVSAgICAgICAgICAgaE1lbnU7DQotDQotCWhNZW51ID0gR2V0U3lzdGVtTWVudSggaFduZCwgVFJVRSApOw0KLQlpZiAoaE1lbnUgPT0gSE5VTEwpIGhNZW51ID0gR2V0U3lzdGVtTWVudSggaFduZCwgRkFMU0UgKTsNCi0JaWYgKGhNZW51ID09IEhOVUxMKSByZXR1cm47DQotDQotCXdoaWxlIChuRmlyc3RJRCA8PSBuTGFzdElEKQ0KLQl7DQotCQlMb2FkU3RyaW5nKCBoQXBwSW5zdCwgbkZpcnN0SUQsIHN6TWVudU5hbWUsIHNpemVvZihzek1lbnVOYW1lKSApOw0KLQkJQ2hhbmdlTWVudSggaE1lbnUsIDAsIHN6TWVudU5hbWUsIG5GaXJzdElELCBNRl9BUFBFTkQgKTsNCi0JCSsrbkZpcnN0SUQ7DQotCX0NCi19DQotDQotLy8NCi0vLyBDcmVhdGVIeXBlcm9pZFdpbmRvdyAtIG9wZW4gdGhlIEh5cGVyb2lkIHdpbmRvdw0KLS8vDQotDQotSFdORCBGQVIgUEFTQ0FMIENyZWF0ZUh5cGVyb2lkV2luZG93KCBMUFNUUiBscHN6Q21kLCBJTlQgbkNtZFNob3cgKQ0KLXsNCi0JSFdORCAgICAgICAgICAgIGhXbmQ7DQotCUlOVCAgICAgICAgICAgICB4LCB5LCB3LCBoOw0KLQlDSEFSICAgICAgICAgICAgc3pCdWZmWzMyXTsNCi0NCi0JLy8gZ2V0IHRoZSBoaWdoc2NvcmUgcHJvZmlsZSBoZXJlIGZvciBsYWNrIG9mIGEgYmV0dGVyIHBsYWNlLi4uDQotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCBzekFwcE5hbWUsIHN6SGksICIwIiwgc3pCdWZmLCBzaXplb2Yoc3pCdWZmKSwgc3pJbmkgKTsNCi0JbEhpZ2hTY29yZSA9IGF0b2woIHN6QnVmZiApOw0KLQ0KLQl4ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pYLCBDV19VU0VERUZBVUxULCBzekluaSApOw0KLQl5ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pZLCBDV19VU0VERUZBVUxULCBzekluaSApOw0KLQl3ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pXLCBDV19VU0VERUZBVUxULCBzekluaSApOw0KLQloID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pILCBDV19VU0VERUZBVUxULCBzekluaSApOw0KLQlpZiAoR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pNYXgsIEZBTFNFLCBzekluaSApICYmDQotCQluQ21kU2hvdyA9PSBTV19OT1JNQUwpIG5DbWRTaG93ID0gU1dfU0hPV01BWElNSVpFRDsNCi0NCi0JaFduZCA9IENyZWF0ZVdpbmRvdyggc3pBcHBOYW1lLCBzekFwcE5hbWUsIFdTX09WRVJMQVBQRURXSU5ET1csDQotCQkJCQkJIHgsIHksIHcsIGgsIEhOVUxMLCBITlVMTCwgaEFwcEluc3QsIE5VTEwgKTsNCi0JaWYgKGhXbmQgPT0gSE5VTEwpIHJldHVybiggSE5VTEwgKTsNCi0NCi0JU2hvd1dpbmRvdyggaFduZCwgbkNtZFNob3cgKTsNCi0JVXBkYXRlV2luZG93KCBoV25kICk7DQotCVNldEh5cGVyb2lkTWVudSggaFduZCwgSURNX05FVywgSURNX0FCT1VUICk7DQotDQotCS8vIHNob3cgdGhlIGxpY2Vuc2UuLi4NCi0JaWYgKCFHZXRQcml2YXRlUHJvZmlsZUludCggc3pBcHBOYW1lLCBzekxpY2Vuc2UsIEZBTFNFLCBzekluaSApKQ0KLQl7DQotCQlNZXNzYWdlQmVlcCggSFlQRVJPSURfSEVMUFNUWUxFICk7DQotCQlNZXNzYWdlQm94KCBoV25kLCBIWVBFUk9JRF9MSUNFTlNFLCAiSHlwZXJvaWQgTGljZW5zZSIsIEhZUEVST0lEX0hFTFBTVFlMRSApOw0KLQkJLy8gLi4uYW5kIG5ldmVyIHNob3cgaXQgYWdhaW4gKHVubGVzcyB0aGV5IHdhbnQgdG8gc2VlIGl0KQ0KLQkJV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzekxpY2Vuc2UsICIxIiwgc3pJbmkgKTsNCi0JfQ0KLQ0KLQlyZXR1cm4oIGhXbmQgKTsNCi19DQotDQotLy8NCi0vLyBTYXZlSHlwZXJvaWRXaW5kb3dQb3MgLSB3cml0ZSBvdXQgdGhlIC5pbmkgaW5mb3JtYXRpb24NCi0vLw0KLQ0KLVZPSUQgRkFSIFBBU0NBTCBTYXZlSHlwZXJvaWRXaW5kb3dQb3MoIEhXTkQgaFduZCApDQotew0KLQlSRUNUICAgICAgICAgICAgcmVjdDsNCi0JQ0hBUiAgICAgICAgICAgIHN6QnVmZlszMl07DQotDQotCS8vIHNhdmUgdGhlIGhpZ2hzY29yZSBwcm9maWxlIGhlcmUgZm9yIGxhY2sgb2YgYSBiZXR0ZXIgcGxhY2UuLi4NCi0JaWYgKGxIaWdoU2NvcmUpDQotCXsNCi0JCXdzcHJpbnRmKCBzekJ1ZmYsICIlbHUiLCBsSGlnaFNjb3JlICk7DQotCQlXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKCBzekFwcE5hbWUsIHN6SGksIHN6QnVmZiwgc3pJbmkgKTsNCi0JfQ0KLQ0KLQlpZiAoSXNJY29uaWMoIGhXbmQgKSkgcmV0dXJuOw0KLQlpZiAoSXNab29tZWQoIGhXbmQgKSkNCi0Jew0KLQkJV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzek1heCwgIjEiLCBzekluaSApOw0KLQkJcmV0dXJuOw0KLQl9DQotCWVsc2UgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzek1heCwgTlVMTCwgc3pJbmkgKTsNCi0NCi0JR2V0V2luZG93UmVjdCggaFduZCwgJnJlY3QgKTsNCi0Jd3NwcmludGYoIHN6QnVmZiwgIiVkIiwgcmVjdC5sZWZ0ICk7DQotCVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6QXBwTmFtZSwgc3pYLCBzekJ1ZmYsIHN6SW5pICk7DQotCXdzcHJpbnRmKCBzekJ1ZmYsICIlZCIsIHJlY3QudG9wICk7DQotCVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHN6QXBwTmFtZSwgc3pZLCBzekJ1ZmYsIHN6SW5pICk7DQotCXdzcHJpbnRmKCBzekJ1ZmYsICIlZCIsIHJlY3QucmlnaHQgLSByZWN0LmxlZnQgKTsNCi0JV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc3pBcHBOYW1lLCBzelcsIHN6QnVmZiwgc3pJbmkgKTsNCi0Jd3NwcmludGYoIHN6QnVmZiwgIiVkIiwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCApOw0KLQlXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKCBzekFwcE5hbWUsIHN6SCwgc3pCdWZmLCBzekluaSApOw0KLX0NCi0NCi0vLw0KLS8vIEdldEh5cGVyb2lkSW5pIC0gbG9hZCB0aGUgaW5pIGZpbGUgaW5mb3JtYXRpb24NCi0vLw0KLQ0KLVZPSUQgRkFSIFBBU0NBTCBHZXRIeXBlcm9pZEluaSggVk9JRCApDQotew0KLQluRHJhd0RlbGF5ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6QXBwTmFtZSwgc3pEcmF3RGVsYXksIERSQVdfREVMQVksIHN6SW5pICk7DQotCXZrU2hsZCA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzektleXMsIHN6U2hpZWxkLCBWS19UQUIsIHN6SW5pICk7DQotCXZrQ2xrdyA9IEdldFByaXZhdGVQcm9maWxlSW50KCBzektleXMsIHN6Q2xvY2t3aXNlLCBWS19MRUZULCBzekluaSApOw0KLQl2a0N0ckNsa3cgPSBHZXRQcml2YXRlUHJvZmlsZUludCggc3pLZXlzLCBzekN0ckNsb2Nrd2lzZSwgVktfUklHSFQsIHN6SW5pICk7DQotCXZrVGhyc3QgPSBHZXRQcml2YXRlUHJvZmlsZUludCggc3pLZXlzLCBzelRocnVzdCwgVktfRE9XTiwgc3pJbmkgKTsNCi0JdmtSdlRocnN0ID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHN6S2V5cywgc3pSZXZUaHJ1c3QsIFZLX1VQLCBzekluaSApOw0KLQl2a0ZpcmUgPSBHZXRQcml2YXRlUHJvZmlsZUludCggc3pLZXlzLCBzekZpcmUsIFZLX1NQQUNFLCBzekluaSApOw0KLQl2a0JvbWIgPSBHZXRQcml2YXRlUHJvZmlsZUludCggc3pLZXlzLCBzekJvbWIsICdTJywgc3pJbmkgKTsNCi19DQotDQotLy8NCi0vLyBIeXBlcm9pZEhlbHAgLSBzaG93IGhlbHANCi0vLw0KLQ0KLVZPSUQgRkFSIFBBU0NBTCBIeXBlcm9pZEhlbHAoIEhXTkQgaFduZCApDQotew0KLQlNZXNzYWdlQm94KCBoV25kLCBIWVBFUk9JRF9IRUxQLCAiSHlwZXJvaWQgaGVscCIsIEhZUEVST0lEX0hFTFBTVFlMRSApOw0KLQlNZXNzYWdlQm94KCBoV25kLCBIWVBFUk9JRF9IRUxQMiwgIkh5cGVyb2lkLmluaSBoZWxwIiwgSFlQRVJPSURfSEVMUFNUWUxFICk7DQotfQ0KLQ0KLS8vDQotLy8gSHlwZXJvaWRBYm91dERsZyAtIHRoZSBhYm91dCBib3ggcHJvYw0KLS8vDQotDQotQk9PTCBGQVIgUEFTQ0FMIEVYUE9SVCBIeXBlcm9pZEFib3V0RGxnKCBIV05EIGhEbGcsIFdPUkQgbWVzcywNCi0JCQkJCQkJCQkJIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApDQotew0KLQlzd2l0Y2ggKG1lc3MpDQotCXsNCi0JY2FzZSBXTV9JTklURElBTE9HOg0KLQkJaWYgKGxIaWdoU2NvcmUpDQotCQl7DQotCQkJQ0hBUiBzekJ1ZmZbNDBdOw0KLQkJCXdzcHJpbnRmKCBzekJ1ZmYsICJIaWdoIFNjb3JlOiAlNy43bHUiLCBsSGlnaFNjb3JlICk7DQotCQkJU2V0RGxnSXRlbVRleHQoIGhEbGcsIElERF9BX0hJU0NPUkUsIHN6QnVmZiApOw0KLQkJfQ0KLQkJYnJlYWs7DQotDQotCWNhc2UgV01fQ09NTUFORDoNCi0JCXN3aXRjaCAod1BhcmFtKQ0KLQkJew0KLQkJY2FzZSBJRERfQV9IRUxQOg0KLQkJCUh5cGVyb2lkSGVscCggaERsZyApOw0KLQkJCS8vIGZhbGwgdGhyb3VnaC4uLg0KLQkJY2FzZSBJRE9LOg0KLQkJCUVuZERpYWxvZyggaERsZywgMCApOw0KLQkJCWJyZWFrOw0KLQ0KLQkJZGVmYXVsdDoNCi0JCQlyZXR1cm4oIEZBTFNFICk7DQotCQl9DQotCQlicmVhazsNCi0NCi0JY2FzZSBXTV9DTE9TRToNCi0JCUVuZERpYWxvZyggaERsZywgRkFMU0UgKTsNCi0JCWJyZWFrOw0KLQ0KLQlkZWZhdWx0Og0KLQkJcmV0dXJuKCBGQUxTRSApOw0KLQl9DQotCXJldHVybiggVFJVRSApOw0KLX0NCi0NCi0vLw0KLS8vIEFib3V0SHlwZXJvaWQgLSBzaG93IHRoZSBhYm91dCBib3gNCi0vLw0KLQ0KLVZPSUQgRkFSIFBBU0NBTCBBYm91dEh5cGVyb2lkKCBIV05EIGhXbmQgKQ0KLXsNCi0JRkFSUFJPQyBscHByb2NBYm91dCA9IE1ha2VQcm9jSW5zdGFuY2UoIEh5cGVyb2lkQWJvdXREbGcsIGhBcHBJbnN0ICk7DQotCURpYWxvZ0JveCggaEFwcEluc3QsIElOVFJFUyggSUREX0FCT1VUICksIGhXbmQsIGxwcHJvY0Fib3V0ICk7DQotCUZyZWVQcm9jSW5zdGFuY2UoIGxwcHJvY0Fib3V0ICk7DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3QvaHlwZXJvaWQvc2NvcmUuYm1wIGIvdGVzdC9oeXBlcm9pZC9zY29yZS5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTM1ZjEuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9zY29yZS5ibXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2h5cGVyb2lkL3NoaWVsZC5ibXAgYi90ZXN0L2h5cGVyb2lkL3NoaWVsZC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTYwNmIuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC9zaGllbGQuYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9oeXBlcm9pZC93aW5leHQuaCBiL3Rlc3QvaHlwZXJvaWQvd2luZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTQ5MjAuLjAwMDAwMDAKLS0tIGEvdGVzdC9oeXBlcm9pZC93aW5leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jaWYgIWRlZmluZWQoV0lORVhUX0gpDQotI2RlZmluZSBXSU5FWFRfSA0KLQ0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQ0KLWV4dGVybiAiQyIgew0KLSNlbmRpZiAvLyBfX2NwbHVzcGx1cw0KLQ0KLS8vDQotLy8gV0lORVhULkggLSBhZGRpdGlvbmFsIHdpbmRvd3MgZGVmaW5pdGlvbnMNCi0vLw0KLS8vIFZlcnNpb24gMS4wICAwMy8yMS84OSAgQ29weXJpZ2h0IChDKSAxOTg5LDkwLDkxIExhbnRlcm4gQ29yb3BvcmF0aW9uLg0KLS8vIEF1dGhvcjogRWR3YXJkIEh1dGNoaW5zDQotLy8gU3RhdHVzOiBGcmVld2FyZQ0KLS8vIFJldmlzaW9uczoNCi0vLyAwNi8wNi85MCBtb2RpZmllZCBIVUdFIHRvIExBUkdFIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCBtYXRoLmgNCi0vLyAgICAgICAgICBhbHNvIG5lc3RlZCB3aW5kb3dzLmggaW5jbHVkZSB0byBwcmV2ZW50IG1vZGlmaWNhdGlvbnMgb24gdGhlDQotLy8gICAgICAgICAgYWN0dWFsIHNvdXJjZSBmaWxlIC0gRWQuDQotLy8gMTAvMDEvOTAgYWRkZWQgQ09OU1QgYW5kIENPTlNUUCxOUCxMUCxIUCBhbmQgYSBmZXcgY29tbWVudHMgLSBFZC4NCi0vLyAwOC8yOC85MSBhZGRlZCBFWFBPUlQgYW5kIFNFR01FTlQgLSBFZC4NCi0vLyAxMC8yOC85MSBhZGRlZCBETExFWFAgLSBFZC4NCi0vLyAxMS8wMi85MSBwb3N0ZWQgb24gQ29tcHVzZXJ2ZSAtIEVkLg0KLS8vDQotDQotLy8NCi0vLyBpbmNsdWRlIFdJTkRPV1MuSCwgaWYgbmVlZGVkDQotLy8NCi0NCi0jaWYgIWRlZmluZWQoV0lORE9XU19IKQ0KLQkjaWYgZGVmaW5lZChOVUxMKQ0KLQkJI3VuZGVmIE5VTEwNCi0JI2VuZGlmDQotCSNpbmNsdWRlIDx3aW5kb3dzLmg+DQotCSNpZiAhZGVmaW5lZChOVUxMKQ0KLQkJI2RlZmluZSBOVUxMIDANCi0JI2VuZGlmDQotCSNkZWZpbmUgV0lORE9XU19IDQotI2VuZGlmIC8vIFdJTkRPV1NfSA0KLQ0KLS8vDQotLy8gZXh0cmEgZGF0YSB0eXBlcyBhbmQgZGVmaW5lcw0KLS8vDQotDQotI2RlZmluZSBMQVJHRSBodWdlDQotI2RlZmluZSBDREVDTCBjZGVjbA0KLSNkZWZpbmUgQ09OU1QgY29uc3QNCi0jZGVmaW5lIEhOVUxMICgwKQ0KLSNkZWZpbmUgTFBOVUxMICgwTCkNCi0NCi10eXBlZGVmIGNoYXIgICAgICAgIENIQVI7DQotdHlwZWRlZiBpbnQgICAgICAgICBJTlQ7DQotdHlwZWRlZiBmbG9hdCAgICAgICBGTE9BVDsNCi10eXBlZGVmIGRvdWJsZSAgICAgIERPVUJMRTsNCi10eXBlZGVmIGxvbmcgZG91YmxlIExET1VCTEU7DQotDQotLy8gZXh0ZW5kIHRoZSBzdHJpbmcgdHlwZQ0KLXR5cGVkZWYgQ0hBUiBMQVJHRSAgKkhQU1RSOw0KLQ0KLS8vIHVzZWZ1bCBtYWNyb3MgZm9yIHR5cGVkZWZpbmcgcG9pbnRlcnMgdG8gb2JqZWN0cyAvLw0KLSNkZWZpbmUgbnBvaW50ZXJkZWYobykgdHlwZWRlZiBvIE5FQVIgKiBOUCAjIyBvDQotI2RlZmluZSBscG9pbnRlcmRlZihvKSB0eXBlZGVmIG8gRkFSICogTFAgIyMgbw0KLSNkZWZpbmUgaHBvaW50ZXJkZWYobykgdHlwZWRlZiBvIExBUkdFICogSFAgIyMgbw0KLSNkZWZpbmUgcG9pbnRlcmRlZihvKSBucG9pbnRlcmRlZihvKTsgbHBvaW50ZXJkZWYobyk7IGhwb2ludGVyZGVmKG8pDQotDQotLy8gZGVmaW5lIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgcG9pbnRlcnMgdG8gdGhpbmdzIC8vDQotcG9pbnRlcmRlZiggQk9PTCApOw0KLW5wb2ludGVyZGVmKCBCWVRFICk7IGhwdHJkZWYoIEJZVEUgKTsNCi1wb2ludGVyZGVmKCBDSEFSICk7DQotbnBvaW50ZXJkZWYoIElOVCApOyBocG9pbnRlcmRlZiggSU5UICk7DQotbnBvaW50ZXJkZWYoIFdPUkQgKTsgaHBvaW50ZXJkZWYoIFdPUkQgKTsNCi1ucG9pbnRlcmRlZiggTE9ORyApOyBocG9pbnRlcmRlZiggTE9ORyApOw0KLW5wb2ludGVyZGVmKCBEV09SRCApOyBocG9pbnRlcmRlZiggRFdPUkQgKTsNCi1wb2ludGVyZGVmKCBGTE9BVCApOw0KLXBvaW50ZXJkZWYoIERPVUJMRSApOw0KLXBvaW50ZXJkZWYoIExET1VCTEUgKTsNCi1ucG9pbnRlcmRlZiggSEFORExFICk7IGhwb2ludGVyZGVmKCBIQU5ETEUgKTsNCi1ucG9pbnRlcmRlZiggVk9JRCApOyBocG9pbnRlcmRlZiggVk9JRCApOw0KLQ0KLS8vIHRoZXNlIGFyZSBoZXJlIGZvciBjb21wYXRpYmlsaXR5IC0gdXNlIE5QVk9JRCBldGMuLi4NCi10eXBlZGVmIFZPSUQgTkVBUiAqTlBNRU07DQotdHlwZWRlZiBWT0lEIEZBUiAqTFBNRU07DQotDQotLy8gd2luZG93IHByb2MgZnVuY3Rpb24gcG9pbnRlcg0KLXR5cGVkZWYgTE9ORyAoRkFSIFBBU0NBTCAqV05EUFJPQykoIEhXTkQsIHVuc2lnbmVkLCBXT1JELCBMT05HICk7DQotDQotLy8NCi0vLyBzY29wZSBwcm90b2NvbCBkZWZpbml0aW9ucw0KLS8vDQotDQotI2RlZmluZSBHTE9CQUwgICAgICAvLyBHTE9CQUwNCi0jZGVmaW5lIExPQ0FMICAgICAgIHN0YXRpYw0KLSNkZWZpbmUgSU1QT1JUICAgICAgZXh0ZXJuDQotI2RlZmluZSBGUk9NKHdoZXJlKSAvLyBGUk9NIHdoZXJlDQotI2RlZmluZSBQUk9UTyAgICAgICAvLyBQUk9UT1RZUEUNCi0NCi0jZGVmaW5lIEVYUE9SVCBfZXhwb3J0DQotI2RlZmluZSBTRUdNRU5UIF9zZWdtZW50DQotDQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpDQotfQ0KLSNlbmRpZiAvLyBfX2NwbHVzcGx1cw0KLQ0KLS8vIGMrKyBjbGFzcyBleHBvcnQgdHlwZQ0KLSNpZiBkZWZpbmVkKF9fRExMX18pDQotI2RlZmluZSBETExFWFAgRVhQT1JUDQotI2Vsc2UNCi0jZGVmaW5lIERMTEVYUCBMQVJHRQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZiAvLyBXSU5FWFRfSA0KZGlmZiAtLWdpdCBhL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5jIGIvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGU3ZTI5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5jCkBAIC0wLDAgKzEsNDQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTkxIGJ5IFRSRyBFTEVDVFJPTklLICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQuQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgIHdpZGdldCBJbnZlbnRvcnkgQ29udHJvbGVyICAgUEFSVCAjIDEgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgPFdJTkRPV1MuSD4NCisjaW5jbHVkZSAiU1RESU8uaCINCisjaW5jbHVkZSAiU1RETElCLmgiDQorI2luY2x1ZGUgIlNUREFSRy5oIg0KKyNpbmNsdWRlICJTVFJJTkcuSCINCisNCisjaW5jbHVkZSAid2lkZ2V0LkgiDQorI2luY2x1ZGUgIndpZGdldC5WQVIiDQorI2luY2x1ZGUgIndpZGdldC5QIg0KKw0KKyNkZWZpbmUgTm9SRUYoYSkgYT1hDQorDQorV09SRCAgICAgICAgICB3UGxheURpc2tJRDsNCisNCitIV05ECQloV25kQnV0Ow0KK0hXTkQJCWhXbmRDaGs7DQorSFdORAkJaFduZFJhZGlvOw0KK0hXTkQJCWhXbmRMQm94Ow0KK0hXTkQJCWhXbmRTY3JvbDsNCitIV05ECQloV25kU2NybzI7DQorSFdORAkJaFduZFN0YXQ7DQorSFdORAkJaFduZEVkaXQ7DQorSFdORAkJaFduZENCb3g7DQoraW50CQl4LCB5Ow0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK2ludCBQQVNDQUwgV2luTWFpbihIQU5ETEUgaEluc3RhbmNlLEhBTkRMRSBoUHJldkluc3RhbmNlLA0KKyAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6Q21kTGluZSxpbnQgbkNtZFNob3cpDQorew0KK1dORENMQVNTICB3bmRDbGFzczsNCitNU0cgICAgICAgbXNnOw0KK0hXTkQgICAgICBoV25kOw0KK0hEQyAgICAgICBoREM7DQorY2hhciAgICAgIENbNDBdOw0KK2ludCAgICAgICBYOw0KK05vUkVGKGxwc3pDbWRMaW5lKTsNCitpZiAoICFoUHJldkluc3RhbmNlICkNCisgICAgew0KKyAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVyA7DQorICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgICA9IChXTkRQUk9DKVduZFByb2M7DQorICAgIHduZENsYXNzLmNiQ2xzRXh0cmEgICAgICA9IDA7DQorICAgIHduZENsYXNzLmNiV25kRXh0cmEgICAgICA9IDA7DQorICAgIHduZENsYXNzLmhJbnN0YW5jZSAgICAgICA9IGhJbnN0YW5jZTsNCisgICAgd25kQ2xhc3MuaEljb24gICAgICAgICAgID0gTG9hZEljb24oaEluc3RhbmNlLChMUFNUUikiSUNPTl8xIik7DQorICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgICA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XICk7DQorICAgIHduZENsYXNzLmhickJhY2tncm91bmQgICA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIICk7DQorICAgIHduZENsYXNzLmxwc3pNZW51TmFtZSAgICA9IHN6QXBwTmFtZTsNCisgICAgd25kQ2xhc3MubHBzekNsYXNzTmFtZSAgID0gc3pBcHBOYW1lOw0KKyAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJnduZENsYXNzKSkNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KK2hXbmQgPSBDcmVhdGVXaW5kb3coc3pBcHBOYW1lLCAid2lkZ2V0IHRlc3QgcHJvZ3JhbSIsDQorICAgICAgICAgICAgICAgICAgICBXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUsIDUwLCA1MCwNCisgICAgICAgICAgICAgICAgICAgIDQwMCwgNDAwLCBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOw0KK2hXbmRNYWluID0gaFduZDsNCitoSW5zdCA9IGhJbnN0YW5jZTsNCitoRENNYWluID0gR2V0REMoaFduZE1haW4pOw0KKw0KK0luaXRXaWRnZXRzKCk7DQorDQord2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpDQorICAgIHsNCisgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnICk7DQorICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnICk7DQorICAgIH0NCitSZWxlYXNlREMoaFduZE1haW4sIGhEQyk7DQorcmV0dXJuKDApOw0KK30NCisNCisNCit2b2lkIEluaXRXaWRnZXRzKCkNCit7DQoraFduZEJ1dCA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgIkJ1dHRvbiAjMSIsDQorICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwgDQorICAgICAgICAgICAgMjMwLCA0MCwgODAsIDMwLCBoV25kTWFpbiwgMTAwMSwgaEluc3QsIE5VTEwpOw0KK2hXbmRTY3JvbCA9IENyZWF0ZVdpbmRvdygiU0NST0xMQkFSIiwgIlNjcm9sbCAjMSIsDQorICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU0JTX1ZFUlQsDQorCQkJCTIwMCwgMTQwLCAxNSwgMTAwLCBoV25kTWFpbiwgMTAwNCwgaEluc3QsIE5VTEwpOw0KK2hXbmRTY3JvMiA9IENyZWF0ZVdpbmRvdygiU0NST0xMQkFSIiwgIlNjcm9sbCAjMiIsDQorICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU0JTX0hPUlosDQorCQkJCTUwLCAxNDAsIDEwMCwgMTUsIGhXbmRNYWluLCAxMDA1LCBoSW5zdCwgTlVMTCk7DQoreCA9IHkgPSAyNTsNCitTZXRWZXJ0U2Nyb2xsKE5VTEwsIGhXbmRTY3JvbCwgMjUsIDAsIDUwKTsNCitTZXRTY3JvbGxSYW5nZShoV25kU2NybzIsIFNCX0NUTCwgMCwgNTAsIFRSVUUpOw0KK1NldFNjcm9sbFBvcyhoV25kU2NybzIsIFNCX0NUTCwgMjUsIFRSVUUpOw0KK2hXbmRMQm94ID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwgIiIsDQorICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19OT1RJRlksDQorCQkJCTIzMCwgMTYwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwMDQsIGhJbnN0LCBOVUxMKTsNCitTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzEiKTsNCit9DQorDQorDQorDQorbG9uZyBGQVIgUEFTQ0FMIFduZFByb2MoSFdORCBoV25kLCB1bnNpZ25lZCBNZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pDQorew0KK2ludAlTaGlmdFN0YXRlOw0KK2NoYXIJQ1s4MF07DQorU2hpZnRTdGF0ZSA9IEdldEtleVN0YXRlKFZLX1NISUZUKTsNCitzd2l0Y2goTWVzc2FnZSkNCisgICAgew0KKyAgICBjYXNlIFdNX0NPTU1BTkQ6DQorCQkgIGlmIChMT1dPUkQobFBhcmFtKSAhPSAwKQ0KKwkJCSAgIHsNCisJCSAgCQlzcHJpbnRmKEMsICJNQUlOIFdNX0NPTU1BTkQgd1BhcmFtPSVYIGxQYXJhbT0lbFggISEhIiwgd1BhcmFtLCBsUGFyYW0pOw0KKwkJICAJCVRleHRPdXQoaERDTWFpbiwgMjUsIDI4MCwgQywgc3RybGVuKEMpKTsNCisJCQkgICB9DQorICAgICAgICBicmVhazsNCisNCisgICAgY2FzZSBXTV9LRVlET1dOOg0KKwkJICBzcHJpbnRmKEMsICJXTV9LRVlET1dOICEhISIpOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCA0MCwgQywgc3RybGVuKEMpKTsNCisJCSAgS2V5RG93bihoV25kLCBNZXNzYWdlLCB3UGFyYW0pOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fQ0hBUjoNCisJCSAgc3ByaW50ZihDLCAiV01fQ0hBUiAhISEiKTsNCisJCSAgVGV4dE91dChoRENNYWluLCAyNSwgNTAsIEMsIHN0cmxlbihDKSk7DQorICAgICAgICBicmVhazsNCisNCisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIFdNX0xCVVRUT05VUDoNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIFdNX1JCVVRUT05ET1dOOg0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fUkJVVFRPTlVQOg0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fTU9VU0VNT1ZFOg0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fVlNDUk9MTDoNCisJCSAgc3ByaW50ZihDLCAiV01fVlNDUk9MTCAlWCAlWCAlbFggISEhIiwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzNzAsIEMsIHN0cmxlbihDKSk7DQorCQkgIERvX0RsZ19WZXJ0U2Nyb2xsKGhXbmQsIHdQYXJhbSwgbFBhcmFtLCAmeSwgMCwgNTApOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fSFNDUk9MTDoNCisJCSAgc3ByaW50ZihDLCAiV01fSFNDUk9MTCAlWCAlWCAlbFggISEhIiwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzNzAsIEMsIHN0cmxlbihDKSk7DQorCQkgIERvX0RsZ19Ib3J6U2Nyb2xsKGhXbmQsIHdQYXJhbSwgbFBhcmFtLCAmeCwgMCwgNTApOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fUEFJTlQ6DQorICAgICAgICBEb1BhaW50KGhXbmQpOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fREVTVFJPWToNCisgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KKyAgICB9DQorcmV0dXJuKDApOw0KK30NCisNCisNCisNCitCT09MIEtleURvd24oSFdORCBoV25kLCB1bnNpZ25lZCBNZXNzYWdlLCBXT1JEIHdQYXJhbSkNCit7DQorV09SRAkJCXdSZXQ7DQorVUlOVAkJCXVSZXQ7DQorRFdPUkQJCQlkd1JldDsNCitjaGFyCQkJQ1sxMjhdOw0KK2NoYXIJCQlDMls2NF07DQorTm9SRUYoaFduZCk7DQorTm9SRUYoTWVzc2FnZSk7DQorc3ByaW50ZihDLCAiS2V5RG93biAleCAhISEiLCB3UGFyYW0pOw0KK1RleHRPdXQoaERDTWFpbiwgMjUsIDEwMCwgQywgc3RybGVuKEMpKTsNCitzd2l0Y2ggKHdQYXJhbSkNCisgICAgew0KKyAgICBjYXNlIFZLX0hPTUU6ICAgICAgICAgICAgLyogJ0hPTUUnIEtFWSAgICAgICAgICovDQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBWS19MRUZUOiAgICAgICAgICAgIC8qICdMRUZUJyBDVVJTT1IgS0VZICAqLw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgVktfUklHSFQ6ICAgICAgICAgICAvKiAnUklHSFQnIENVUlNPUiBLRVkgKi8NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFZLX1VQOiAgICAgICAgICAgICAgLyogJ1VQJyBDVVJTT1IgS0VZICAgICovDQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBWS19ET1dOOiAgICAgICAgICAgIC8qICdET1dOJyBDVVJTT1IgS0VZICAqLw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgVktfUFJJT1I6ICAgICAgICAgICAvKiAnUEdVUCcgQ1VSU09SIEtFWSAgKi8NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFZLX05FWFQ6ICAgICAgICAgICAgLyogJ1BHRE4nIENVUlNPUiBLRVkgICovDQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnMSc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnMic6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnMyc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnNCc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnNSc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnQSc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnQic6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnQyc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnRCc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnRSc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnRic6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnRyc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnSCc6DQorCQkgIFdpbkhlbHAoaFduZE1haW4sICJ0b3RvLmhscCIsIEhFTFBfSU5ERVgsIDBMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdKJzoNCisJCSAgV2luRXhlYygiL0Q6L3dpbmUvd2lkZ2V0LmV4ZSBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUgYXJnNiIsIFNXX05PUk1BTCk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnSyc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnUSc6DQorCQkgIGhXbmRTdGF0ID0gQ3JlYXRlV2luZG93KCJTVEFUSUMiLCAiU3RhdGljICMxIiwNCisgICAgICAgICAgICAJCQlXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTU19TSU1QTEUsIA0KKyAgICAgICAgICAgIAkJCTIzMCwgMjAsIDgwLCAyMCwgaFduZE1haW4sIDEwMDAsIGhJbnN0LCBOVUxMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdXJzoNCisJCSAgaFduZENoayA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgIkNoZWNrQm94ICMxIiwNCisgICAgICAgICAgICAgICAgICAgIFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IEJTX0NIRUNLQk9YLA0KKwkJCQkJCSAgMjMwLCA5MCwgMTIwLCAyMCwgaFduZE1haW4sIDEwMDIsIGhJbnN0LCBOVUxMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdSJzoNCisJCSAgaFduZFJhZGlvID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiUmFkaW9CdXQgIzEiLA0KKyAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgQlNfUkFESU9CVVRUT04sDQorCQkJCQkJICAyMzAsIDEyMCwgMTIwLCAyMCwgaFduZE1haW4sIDEwMDMsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZFJhZGlvLCBCTV9TRVRDSEVDSywgMCwgMEwpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1QnOg0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IFNpbmdsZSBpdGVtIik7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnWSc6DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjMiIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzMiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICM0Iik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjNSIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzYiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX1NFVENVUlNFTCwgMywgMEwpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfSU5TRVJUU1RSSU5HLCA1LCAoTFBBUkFNKSJJdGVtIGJldHdlZW4gNSAmIDYiKTsNCisJCSAgd1JldCA9IFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9GSU5EU1RSSU5HLCAtMSwgKExQQVJBTSkiSXRlbSBiZXR3ZWVuIDUgJiA2Iik7DQorCQkgIHNwcmludGYoQywgIkxCX0ZJTkRTVFJJTkcgcmV0dXJuZWQgIyV1ICAgIiwgd1JldCk7DQorCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMwMCwgQywgc3RybGVuKEMpKTsNCisJCSAgd1JldCA9IFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9HRVRDVVJTRUwsIDAsIDBMKTsNCisJCSAgc3ByaW50ZihDLCAiTEJfR0VUQ1VSU0VMIHJldHVybmVkICMldSAgICIsIHdSZXQpOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzMjAsIEMsIHN0cmxlbihDKSk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnVSc6DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9ERUxFVEVTVFJJTkcsIDMsIDBMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdJJzoNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX1JFU0VUQ09OVEVOVCwgMCwgMEwpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ08nOg0KKwkJICBDMlswXSA9ICdcMCc7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9HRVRURVhULCAyLCAoRFdPUkQpQzIpOw0KKwkJICBzcHJpbnRmKEMsICJMQl9HRVRURVhUIHJldHVybmVkICclcycgICAiLCBDMik7DQorCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMyMCwgQywgc3RybGVuKEMpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdQJzoNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0RJUiwgMCwgKERXT1JEKSIqLioiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdaJzoNCisJCSAgU2hvd1dpbmRvdyhoV25kU2Nyb2wsIFNXX0hJREUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1gnOg0KKwkJICBTaG93V2luZG93KGhXbmRTY3JvbCwgU1dfU0hPVyk7DQorICAgICAgICBicmVhazsNCisgICAgIGNhc2UgJ1YnOg0KKwkJICBoV25kQ0JveCA9IENyZWF0ZVdpbmRvdygiQ09NQk9CT1giLCAiQ29tYm8gIzEiLA0KKyAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgQ0JTX0RST1BET1dOTElTVCwNCisJCQkJCQkgIDIzMCwgMjcwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwMDYsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMSIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICMyIik7DQorICAgICAgICBicmVhazsNCisgICAgIGNhc2UgJ04nOg0KKwkJICBoV25kQ0JveCA9IENyZWF0ZVdpbmRvdygiQ09NQk9CT1giLCAiQ29tYm8gIzIiLA0KKyAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgQ0JTX0RST1BET1dOLA0KKwkJCQkJCSAgMzAsIDI3MCwgMTUwLCAxMDAsIGhXbmRNYWluLCAxMDA3LCBoSW5zdCwgTlVMTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzEiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMiIpOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgVktfRjEwOiAgICAgICAgICAgICAvKiAnRjEwJyBGVU5DVElPTiBLRVkgKi8NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFZLX0YxMTogICAgICAgICAgICAgLyogJ0YxMScgRlVOQ1RJT04gS0VZICovDQorICAgICAgICBicmVhazsNCisgICAgfQ0KK3JldHVybihUUlVFKTsNCit9DQorDQorDQorDQordm9pZCBEb1BhaW50KEhXTkQgaFduZCkNCit7DQorSERDICAgICAgICAgaERDOw0KK1JFQ1QgICAgICAgIHJlY3Q7DQorUEFJTlRTVFJVQ1QgcHM7DQorY2hhciAgIENbODBdOw0KK0dldENsaWVudFJlY3QoaFduZCwgJnJlY3QpOw0KK2hEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsNCitGaWxsUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChHUkFZX0JSVVNIKSk7DQorSW5mbGF0ZVJlY3QoJnJlY3QsIC0zLCAtMyk7DQorRnJhbWVSZWN0KGhEQywgJnJlY3QsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7DQorSW5mbGF0ZVJlY3QoJnJlY3QsIC0xMCwgLTEwKTsNCitGaWxsUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCkpOw0KK3NwcmludGYoQywgIldpbmUgVGVzdGluZyAhISEiKTsNCitUZXh0T3V0KGhEQywgMjUsIDI1LCBDLCBzdHJsZW4oQykpOw0KK1JlbGVhc2VEQyhoV25kLGhEQyk7DQorRW5kUGFpbnQoaFduZCwmcHMpOw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCit2b2lkIFNldFZlcnRTY3JvbGwoaW50IGhEbGcsIGludCBoV25kU0NST0xMLCBpbnQgVkFMLCBpbnQgTUlOLCBpbnQgTUFYKQ0KK3sNCitjaGFyICBDWzEyXTsNCitTZXRTY3JvbGxSYW5nZShoV25kU0NST0xMLCBTQl9DVEwsIC1NQVgsIC1NSU4sIEZBTFNFKTsNCitTZXRTY3JvbGxQb3MoaFduZFNDUk9MTCwgU0JfQ1RMLCAtVkFMLCBUUlVFKTsNCitpdG9hKFZBTCwgQywgMTApOw0KKy8vU2V0RGxnSXRlbVRleHQoaERsZywgKElERFRYVDEgKyBHZXREbGdDdHJsSUQoaFduZFNDUk9MTCkgLSBJRERTQ1JPTEwxKSwgQyk7DQorfQ0KKw0KKw0KKw0KK3ZvaWQgU2V0SG9yelNjcm9sbChpbnQgaERsZywgaW50IGhXbmRTQ1JPTEwsIGludCBWQUwsIGludCBNSU4sIGludCBNQVgpDQorew0KK2NoYXIgIENbMTJdOw0KK1NldFNjcm9sbFJhbmdlKGhXbmRTQ1JPTEwsIFNCX0NUTCwgTUFYLCBNSU4sIEZBTFNFKTsNCitTZXRTY3JvbGxQb3MoaFduZFNDUk9MTCwgU0JfQ1RMLCBWQUwsIFRSVUUpOw0KK2l0b2EoVkFMLCBDLCAxMCk7DQorLy9TZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChoV25kU0NST0xMKSAtIElERFNDUk9MTDEpLCBDKTsNCit9DQorDQorDQorDQordm9pZCBEb19EbGdfVmVydFNjcm9sbChIV05EIGhEbGcsIFdPUkQgd1BhcmFtLCBEV09SRCBsUGFyYW0sIGludCAqViwgaW50IE1JTiwgaW50IE1BWCkNCit7DQorY2hhciAgQ1sxMl07DQoraW50ICAgVkFMOw0KK2ludCAgIFZBTDI7DQoraW50CVN0ZXAgPSAxMDA7DQoraWYgKE1BWCA8IDEwMDApCVN0ZXAgPSAxMDsNCitpZiAoTUFYIDwgMTAwKQkJU3RlcCA9IE1BWCAvIDEwOw0KK1ZBTCA9ICooVik7DQorVkFMMiA9IFZBTDsNCitzd2l0Y2ggKHdQYXJhbSkNCisgICAgew0KKyAgICBjYXNlIFNCX0xJTkVVUDoNCisJCQlWQUwrKzsNCisJCQlicmVhazsNCisgICAgY2FzZSBTQl9MSU5FRE9XTjoNCisJCQlWQUwtLTsNCisJCQlicmVhazsNCisgICAgY2FzZSBTQl9QQUdFVVA6DQorCQkJVkFMICs9IFN0ZXA7DQorCQkJYnJlYWs7DQorICAgIGNhc2UgU0JfUEFHRURPV046DQorCQkJVkFMIC09IFN0ZXA7DQorCQkJYnJlYWs7DQorICAgIGNhc2UgU0JfVEhVTUJUUkFDSzoNCisgICAgY2FzZSBTQl9USFVNQlBPU0lUSU9OOg0KKwkJICAgVkFMID0gLShMT1dPUkQobFBhcmFtKSk7DQorCQkJYnJlYWs7DQorCX0NCitpZiAoVkFMID4gTUFYKQkJVkFMID0gTUFYOw0KK2lmIChWQUwgPCBNSU4pCQlWQUwgPSBNSU47DQoraWYgKFZBTCAhPSBWQUwyKQ0KKyAgICB7DQorICAgIFNldFNjcm9sbFBvcyhISVdPUkQobFBhcmFtKSwgU0JfQ1RMLCAtVkFMLCBUUlVFKTsNCisgICAgbHRvYShWQUwsIEMsIDEwKTsNCisvLyAgICBTZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChISVdPUkQobFBhcmFtKSkgLSBJRERTQ1JPTEwxKSwgQyk7DQorICAgIH0NCisqKFYpID0gVkFMOw0KK30NCisNCisNCit2b2lkIERvX0RsZ19Ib3J6U2Nyb2xsKEhXTkQgaERsZywgV09SRCB3UGFyYW0sIERXT1JEIGxQYXJhbSwgaW50ICpWLCBpbnQgTUlOLCBpbnQgTUFYKQ0KK3sNCitjaGFyICBDWzEyXTsNCitpbnQgICBWQUw7DQoraW50ICAgVkFMMjsNCitpbnQJU3RlcCA9IDEwMDsNCitpZiAoTUFYIDwgMTAwMCkJU3RlcCA9IDEwOw0KK2lmIChNQVggPCAxMDApCQlTdGVwID0gTUFYIC8gMTA7DQorVkFMID0gKihWKTsNCitWQUwyID0gVkFMOw0KK3N3aXRjaCAod1BhcmFtKQ0KKyAgICB7DQorICAgIGNhc2UgU0JfTElORVVQOg0KKwkJCVZBTC0tOw0KKwkJCWJyZWFrOw0KKyAgICBjYXNlIFNCX0xJTkVET1dOOg0KKwkJCVZBTCsrOw0KKwkJCWJyZWFrOw0KKyAgICBjYXNlIFNCX1BBR0VVUDoNCisJCQlWQUwgLT0gU3RlcDsNCisJCQlicmVhazsNCisgICAgY2FzZSBTQl9QQUdFRE9XTjoNCisJCQlWQUwgKz0gU3RlcDsNCisJCQlicmVhazsNCisgICAgY2FzZSBTQl9USFVNQlRSQUNLOg0KKyAgICBjYXNlIFNCX1RIVU1CUE9TSVRJT046DQorCQkgICBWQUwgPSAoTE9XT1JEKGxQYXJhbSkpOw0KKwkJCWJyZWFrOw0KKwl9DQoraWYgKFZBTCA+IE1BWCkJCVZBTCA9IE1BWDsNCitpZiAoVkFMIDwgTUlOKQkJVkFMID0gTUlOOw0KK2lmIChWQUwgIT0gVkFMMikNCisgICAgew0KKyAgICBTZXRTY3JvbGxQb3MoSElXT1JEKGxQYXJhbSksIFNCX0NUTCwgVkFMLCBUUlVFKTsNCisgICAgbHRvYShWQUwsIEMsIDEwKTsNCisvLyAgICBTZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChISVdPUkQobFBhcmFtKSkgLSBJRERTQ1JPTEwxKSwgQyk7DQorICAgIH0NCisqKFYpID0gVkFMOw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmRlZiBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE1Mjk2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5kZWYKQEAgLTAsMCArMSwyMyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCis7KiAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSBieSBUUkcgRUxFQ1RST05JSyAgICAgICAgICAgICAgICAgKg0KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorDQorDQorTkFNRSAgICAgICAgIFdpbmVUZXN0DQorREVTQ1JJUFRJT04gICdEcmluayBJbnZlbnRyeSBDb250cm9sZXInDQorU1RVQiAgICAgICAgICdXSU5TVFVCLkVYRScNCitDT0RFICAgICAgICAgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQ0KK0RBVEEgICAgICAgICBQUkVMT0FEIE1PVkVBQkxFIE1VTFRJUExFDQorRVhFVFlQRSAgICAgIFdJTkRPV1MNCitTRUdNRU5UUw0KKyAgICAgICBEUklOS19URVhUICBQUkVMT0FEIE1PVkVBQkxFIERJU0NBUkRBQkxFDQorDQorSEVBUFNJWkUgICAgIDIwMDAwDQorU1RBQ0tTSVpFICAgIDgxOTINCisNCitFWFBPUlRTICAgICAgV25kUHJvYyAgICAgICAgICAgICBAMQ0KKyAgICAgICAgICAgICBBYm91dF9Qcm9jICAgICAgICAgIEAzDQorDQorDQorDQorGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5oIGIvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTBkOWYwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5oCkBAIC0wLDAgKzEsMjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTEgYnkgVFJHIEVMRUNUUk9OSUsgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgc3pBcHBOYW1lICJ3aWRnZXRDbGFzcyINCisNCisjZGVmaW5lIElETlVMTCAgICAgICAgIC0xDQorDQorI2RlZmluZSBJRFNDTE9TRSAgICAgICAyMA0KKyNkZWZpbmUgSURTT0tDTE9TRSAgICAgMjENCisjZGVmaW5lIElEU1NBVkUgICAgICAgIDIyDQorI2RlZmluZSBJRFNPS1NBVkUgICAgICAyMw0KKyNkZWZpbmUgSURJTkZPICAgICAgICAgMjQNCisjZGVmaW5lIElEU0FWRSAgICAgICAgIDI1DQorI2RlZmluZSBJRERFTEVURSAgICAgICAyNg0KKyNkZWZpbmUgSURORVcgICAgICAgICAgMjcNCisNCisNCisjZGVmaW5lIElEQlVTRVIgICAgICAgIDMwDQorI2RlZmluZSBJREJVU0VSMSAgICAgICAzMQ0KKyNkZWZpbmUgSURCVVNFUjIgICAgICAgMzINCisjZGVmaW5lIElEQlVTRVIzICAgICAgIDMzDQorI2RlZmluZSBJREJVU0VSNCAgICAgICAzNA0KKyNkZWZpbmUgSURCVVNFUjUgICAgICAgMzUNCisjZGVmaW5lIElEQlVTRVI2ICAgICAgIDM2DQorI2RlZmluZSBJREJVU0VSNyAgICAgICAzNw0KKyNkZWZpbmUgSURCVVNFUjggICAgICAgMzgNCisjZGVmaW5lIElEQlVTRVI5ICAgICAgIDM5DQorDQorI2RlZmluZSBJRERKT0JOQU1FICAgICA1MA0KKyNkZWZpbmUgSUREUFJJTlRFUiAgICAgNTENCisNCisjZGVmaW5lIElEU0VUVVAgICAgICAgIDYwDQorDQorDQorI2RlZmluZSBJRElfTUtTSUNPTiAgICA5OQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBNSURfTkVXICAgICAgICAxMDANCisjZGVmaW5lIE1JRF9PUEVOICAgICAgIDEwMQ0KKyNkZWZpbmUgTUlEX1NBVkUgICAgICAgMTAyDQorI2RlZmluZSBNSURfU0FWRUFTICAgICAxMDMNCisjZGVmaW5lIE1JRF9QUklOVCAgICAgIDEwNA0KKyNkZWZpbmUgTUlEX1BSU0VUVVAgICAgMTA1DQorI2RlZmluZSBNSURfU1RBVFVTICAgICAxMDYNCisjZGVmaW5lIE1JRF9RVUlUICAgICAgIDEwNw0KKw0KKyNkZWZpbmUgTUlEX0NVVCAgICAgICAgMTIxDQorI2RlZmluZSBNSURfQ09QWSAgICAgICAxMjINCisjZGVmaW5lIE1JRF9QQVNURSAgICAgIDEyMw0KKyNkZWZpbmUgTUlEX0NMRUFSICAgICAgMTI0DQorI2RlZmluZSBNSURfQ09QWVRPICAgICAxMjUNCisjZGVmaW5lIE1JRF9QQVNURUZST00gIDEyNg0KKw0KKyNkZWZpbmUgTUlEX05FV1BST0QgICAgMTQwDQorI2RlZmluZSBNSURfTkVXQkVFUiAgICAxNDENCisjZGVmaW5lIE1JRF9VU0VSQ0ZHICAgIDE0Mg0KKw0KKyNkZWZpbmUgTUlEX1BPUkVHSUUgICAgMTUxDQorI2RlZmluZSBNSURfUE9CSUVSRSAgICAxNTINCisjZGVmaW5lIE1JRF9EQVlTVE9DSyAgIDE1Mw0KKyNkZWZpbmUgTUlEX1JFU0VSVkUgICAgMTU0DQorI2RlZmluZSBNSURfQ09DS1NBTEUgICAxNTUNCisjZGVmaW5lIE1JRF9EUllTQUxFICAgIDE1Ng0KKyNkZWZpbmUgTUlEX0NPTVBJTEUgICAgMTU3DQorI2RlZmluZSBNSURfUkVDRVRURVMgICAxNTgNCisjZGVmaW5lIE1JRF9IRCAgICAgICAgIDE1OQ0KKyNkZWZpbmUgTUlEX1RFU1RQUk4gICAgMTYwDQorI2RlZmluZSBNSURfSU5GT0RTSyAgICAxNjENCisjZGVmaW5lIE1JRF9TSEFSUCAgICAgIDE2Mg0KKyNkZWZpbmUgTUlEX1BBU1NXT1JEICAgMTYzDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjZGVmaW5lIElERFRFWFQgICAgICAgIDIwMA0KKyNkZWZpbmUgSUREVFhUMSAgICAgICAgMjAxDQorI2RlZmluZSBJRERUWFQyICAgICAgICAyMDINCisjZGVmaW5lIElERFRYVDMgICAgICAgIDIwMw0KKyNkZWZpbmUgSUREVFhUNCAgICAgICAgMjA0DQorI2RlZmluZSBJRERUWFQ1ICAgICAgICAyMDUNCisjZGVmaW5lIElERFRYVDYgICAgICAgIDIwNg0KKyNkZWZpbmUgSUREVFhUNyAgICAgICAgMjA3DQorI2RlZmluZSBJRERUWFQ4ICAgICAgICAyMDgNCisjZGVmaW5lIElERFRYVDkgICAgICAgIDIwOQ0KKyNkZWZpbmUgSUREVFhUMTAgICAgICAgMjEwDQorI2RlZmluZSBJRERUWFQxMSAgICAgICAyMTENCisjZGVmaW5lIElERFRYVDEyICAgICAgIDIxMg0KKyNkZWZpbmUgSUREVFhUMTMgICAgICAgMjEzDQorI2RlZmluZSBJRERUWFQxNCAgICAgICAyMTQNCisjZGVmaW5lIElERFRYVDE1ICAgICAgIDIxNQ0KKyNkZWZpbmUgSUREVFhUMTYgICAgICAgMjE2DQorI2RlZmluZSBJRERUWFQxNyAgICAgICAyMTcNCisjZGVmaW5lIElERFRYVDE4ICAgICAgIDIxOA0KKyNkZWZpbmUgSUREVFhUMTkgICAgICAgMjE5DQorDQorI2RlZmluZSBJRERCVVRUT04xICAgICAyMjANCisjZGVmaW5lIElEREJVVFRPTjIgICAgIDIyMQ0KKyNkZWZpbmUgSUREQlVUVE9OMyAgICAgMjIyDQorI2RlZmluZSBJRERCVVRUT040ICAgICAyMjMNCisjZGVmaW5lIElEREJVVFRPTjUgICAgIDIyNA0KKyNkZWZpbmUgSUREQlVUVE9ONiAgICAgMjI1DQorI2RlZmluZSBJRERCVVRUT043ICAgICAyMjYNCisjZGVmaW5lIElEREJVVFRPTjggICAgIDIyNw0KKyNkZWZpbmUgSUREQlVUVE9OOSAgICAgMjI4DQorI2RlZmluZSBJRERCVVRUT04xMCAgICAyMjkNCisNCisjZGVmaW5lIElERENIS0JPWDEgICAgIDI0MA0KKyNkZWZpbmUgSUREQ0hLQk9YMiAgICAgMjQxDQorI2RlZmluZSBJRERDSEtCT1gzICAgICAyNDINCisjZGVmaW5lIElERENIS0JPWDQgICAgIDI0Mw0KKyNkZWZpbmUgSUREQ0hLQk9YNSAgICAgMjQ0DQorI2RlZmluZSBJRERDSEtCT1g2ICAgICAyNDUNCisjZGVmaW5lIElERENIS0JPWDcgICAgIDI0Ng0KKyNkZWZpbmUgSUREQ0hLQk9YOCAgICAgMjQ3DQorI2RlZmluZSBJRERDSEtCT1g5ICAgICAyNDgNCisjZGVmaW5lIElERENIS0JPWDEwICAgIDI0OQ0KKw0KKyNkZWZpbmUgSUREU0NST0xMMSAgICAgMjUwDQorI2RlZmluZSBJRERTQ1JPTEwyICAgICAyNTENCisjZGVmaW5lIElERFNDUk9MTDMgICAgIDI1Mg0KKyNkZWZpbmUgSUREU0NST0xMNCAgICAgMjUzDQorI2RlZmluZSBJRERTQ1JPTEw1ICAgICAyNTQNCisjZGVmaW5lIElERFNDUk9MTDYgICAgIDI1NQ0KKyNkZWZpbmUgSUREU0NST0xMNyAgICAgMjU2DQorI2RlZmluZSBJRERTQ1JPTEw4ICAgICAyNTcNCisNCisjZGVmaW5lIElERFNUUjEgICAgICAgIDIwMDANCisjZGVmaW5lIElERFNUUjIgICAgICAgIDIwMDENCisjZGVmaW5lIElERFNUUjMgICAgICAgIDIwMDINCisjZGVmaW5lIElERFNUUjQgICAgICAgIDIwMDMNCisjZGVmaW5lIElERFNUUjUgICAgICAgIDIwMDQNCisjZGVmaW5lIElERFNUUjYgICAgICAgIDIwMDUNCisjZGVmaW5lIElERFNUUjcgICAgICAgIDIwMDYNCisjZGVmaW5lIElERFNUUjggICAgICAgIDIwMDcNCisjZGVmaW5lIElERFNUUjkgICAgICAgIDIwMDgNCisjZGVmaW5lIElERFNUUjEwICAgICAgIDIwMDkNCisjZGVmaW5lIElERFNUUjExICAgICAgIDIwMTANCisjZGVmaW5lIElERFNUUjEyICAgICAgIDIwMTENCisjZGVmaW5lIElERFNUUjEzICAgICAgIDIwMTINCisjZGVmaW5lIElERFNUUjE0ICAgICAgIDIwMTMNCisjZGVmaW5lIElERFNUUjE1ICAgICAgIDIwMTQNCisjZGVmaW5lIElERFNUUjE2ICAgICAgIDIwMTUNCisjZGVmaW5lIElERFNUUjE3ICAgICAgIDIwMTYNCisjZGVmaW5lIElERFNUUjE4ICAgICAgIDIwMTcNCisjZGVmaW5lIElERFNUUjE5ICAgICAgIDIwMTgNCisjZGVmaW5lIElERFNUUjIwICAgICAgIDIwMTkNCisjZGVmaW5lIElERFNUUjIxICAgICAgIDIwMjANCisjZGVmaW5lIElERFNUUjIyICAgICAgIDIwMjENCisjZGVmaW5lIElERFNUUjIzICAgICAgIDIwMjINCisjZGVmaW5lIElERFNUUjI0ICAgICAgIDIwMjMNCisjZGVmaW5lIElERFNUUjI1ICAgICAgIDIwMjQNCisjZGVmaW5lIElERFNUUjI2ICAgICAgIDIwMjUNCisjZGVmaW5lIElERFNUUjI3ICAgICAgIDIwMjYNCisjZGVmaW5lIElERFNUUjI4ICAgICAgIDIwMjcNCisjZGVmaW5lIElERFNUUjI5ICAgICAgIDIwMjgNCisjZGVmaW5lIElERFNUUjMwICAgICAgIDIwMjkNCisjZGVmaW5lIElERFNUUjMxICAgICAgIDIwMzANCisjZGVmaW5lIElERFNUUjMyICAgICAgIDIwMzENCisjZGVmaW5lIElERFNUUjMzICAgICAgIDIwMzINCisjZGVmaW5lIElERFNUUjM0ICAgICAgIDIwMzMNCisjZGVmaW5lIElERFNUUjM1ICAgICAgIDIwMzQNCisjZGVmaW5lIElERFNUUjM2ICAgICAgIDIwMzUNCisjZGVmaW5lIElERFNUUjM3ICAgICAgIDIwMzYNCisjZGVmaW5lIElERFNUUjM4ICAgICAgIDIwMzcNCisjZGVmaW5lIElERFNUUjM5ICAgICAgIDIwMzgNCisjZGVmaW5lIElERFNUUjQwICAgICAgIDIwMzkNCisjZGVmaW5lIElERFNUUjQxICAgICAgIDIwNDANCisjZGVmaW5lIElERFNUUjQyICAgICAgIDIwNDENCisjZGVmaW5lIElERFNUUjQzICAgICAgIDIwNDINCisjZGVmaW5lIElERFNUUjQ0ICAgICAgIDIwNDMNCisjZGVmaW5lIElERFNUUjQ1ICAgICAgIDIwNDQNCisjZGVmaW5lIElERFNUUjQ2ICAgICAgIDIwNDUNCisjZGVmaW5lIElERFNUUjQ3ICAgICAgIDIwNDYNCisjZGVmaW5lIElERFNUUjQ4ICAgICAgIDIwNDcNCisjZGVmaW5lIElERFNUUjQ5ICAgICAgIDIwNDgNCisjZGVmaW5lIElERFNUUjUwICAgICAgIDIwNDkNCisjZGVmaW5lIElERFNUUjUxICAgICAgIDIwNTANCisjZGVmaW5lIElERFNUUjUyICAgICAgIDIwNTENCisjZGVmaW5lIElERFNUUjUzICAgICAgIDIwNTINCisjZGVmaW5lIElERFNUUjU0ICAgICAgIDIwNTMNCisjZGVmaW5lIElERFNUUjU1ICAgICAgIDIwNTQNCisjZGVmaW5lIElERFNUUjU2ICAgICAgIDIwNTUNCisjZGVmaW5lIElERFNUUjU3ICAgICAgIDIwNTYNCisjZGVmaW5lIElERFNUUjU4ICAgICAgIDIwNTcNCisjZGVmaW5lIElERFNUUjU5ICAgICAgIDIwNTgNCisjZGVmaW5lIElERFNUUjYwICAgICAgIDIwNTkNCisjZGVmaW5lIElERFNUUjYxICAgICAgIDIwNjANCisjZGVmaW5lIElERFNUUjYyICAgICAgIDIwNjENCisjZGVmaW5lIElERFNUUjYzICAgICAgIDIwNjINCisjZGVmaW5lIElERFNUUjY0ICAgICAgIDIwNjMNCisjZGVmaW5lIElERFNUUjY1ICAgICAgIDIwNjQNCisjZGVmaW5lIElERFNUUjY2ICAgICAgIDIwNjUNCisjZGVmaW5lIElERFNUUjY3ICAgICAgIDIwNjYNCisjZGVmaW5lIElERFNUUjY4ICAgICAgIDIwNjcNCisjZGVmaW5lIElERFNUUjY5ICAgICAgIDIwNjgNCisjZGVmaW5lIElERFNUUjcwICAgICAgIDIwNjkNCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgSUREREVGQVVMVFMgICAgMTAwMQ0KKyNkZWZpbmUgSUREQ0hFQ0tCT1ggICAgMTAwMg0KKyNkZWZpbmUgSURETlVMTCAgICAgICAgMTAwMw0KKyNkZWZpbmUgSUREUkJMRUZUICAgICAgMTAwNA0KKyNkZWZpbmUgSUREUkJSSUdIVCAgICAgMTAwNQ0KKyNkZWZpbmUgSUREUkJDRU5URVIgICAgMTAwNg0KKyNkZWZpbmUgSURETElTVEJPWCAgICAgMTAwNw0KKyNkZWZpbmUgSUREU0JIICAgICAgICAgMTAwOA0KKyNkZWZpbmUgSUREU0JWICAgICAgICAgMTAwOQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBBQk9VVF9EbGcgICAgICAyMDAxDQorI2RlZmluZSBORVdfRGxnICAgICAgICAyMDAyDQorI2RlZmluZSBPUEVOX0RsZyAgICAgICAyMDAzDQorI2RlZmluZSBTQVZFX0RsZyAgICAgICAyMDA0DQorI2RlZmluZSBTQVZFQVNfRGxnICAgICAyMDA1DQorI2RlZmluZSBQUklOVF9EbGcgICAgICAyMDA2DQorI2RlZmluZSBBQk9SVF9EbGcgICAgICAyMDA3DQorI2RlZmluZSBQUlNFVFVQX0RsZyAgICAyMDA4DQorI2RlZmluZSBRVUlUX0RsZyAgICAgICAyMDA5DQorDQorI2RlZmluZSBHRVRPQkpfRGxnICAgICAyMDIwDQorI2RlZmluZSBORVdQUk9EX0RsZyAgICAyMDIxDQorI2RlZmluZSBORVdCRUVSX0RsZyAgICAyMDIyDQorI2RlZmluZSBVU0VSQ0ZHX0RsZyAgICAyMDIzDQorI2RlZmluZSBQT1JFR0lFX0RsZyAgICAyMDI0DQorI2RlZmluZSBQT0JJRVJFX0RsZyAgICAyMDI1DQorI2RlZmluZSBQQVNTV09SRF9EbGcgICAyMDI2DQorI2RlZmluZSBUVlFfRGxnICAgICAgICAyMDI3DQorDQorI2RlZmluZSBMVEVYVE9LX0RsZyAgICAyMDcwDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjZGVmaW5lIFJFRCAgICAgICAgICAgIDB4MDAwMDAwRkYNCisjZGVmaW5lIEdSRUVOICAgICAgICAgIDB4MDAwMEZGMDANCisjZGVmaW5lIEJMVUUgICAgICAgICAgIDB4MDBGRjAwMDANCisjZGVmaW5lIENZQU4gICAgICAgICAgIDB4MDBGRkZGMDANCisjZGVmaW5lIE1BR0VOVEEgICAgICAgIDB4MDBGRjAwRkYNCisjZGVmaW5lIEJMQUNLICAgICAgICAgIDB4MDAwMDAwMDANCisjZGVmaW5lIFdISVRFICAgICAgICAgIDB4MDBGRkZGRkYNCisjZGVmaW5lIEdSQVkgICAgICAgICAgIDB4MDA4MDgwODANCisjZGVmaW5lIExUR1JBWSAgICAgICAgIDB4MDBDMEMwQzANCisjZGVmaW5lIERLR1JBWSAgICAgICAgIDB4MDA0MDQwNDANCisNCisNCisaClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmljMiBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pYzIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2UwZTBkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pYzIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmljMyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pYzMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI2NDJkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pYzMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmljbyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pY28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODI0ZDUyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LnJjIGIvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LnJjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhODZjMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQucmMKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSBieSBUUkcgRUxFQ1RST05JSyAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LlJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAJCSAgICAgICAgICB3aWRnZXQgUkVTU09VUkNFUyAgICAgICAgICAgICAgIAkgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8XEJDXElOQ0xVREVcV0lORE9XUy5IPg0KKyNpbmNsdWRlICJ3aWRnZXQuSCINCisNCisjZGVmaW5lIFRBQkdSUCAgICAgIFdTX1RBQlNUT1AgfCBXU19HUk9VUA0KKyNkZWZpbmUgTEJTVFlMRVMgICAgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUgfCBMQlNfU09SVCB8IFRBQkdSUA0KKyNkZWZpbmUgSFNDUk9MTCAgICAgV1NfVklTSUJMRSB8IFNCU19IT1JaIHwgU0JTX1RPUEFMSUdOICAgIHwgVEFCR1JQDQorI2RlZmluZSBWU0NST0xMICAgICBXU19WSVNJQkxFIHwgU0JTX1ZFUlQgfCBTQlNfTEVGVEFMSUdOICAgfCBUQUJHUlANCisjZGVmaW5lIEJMQUNLUkVDVCAgIFNTX0JMQUNLUkVDVCAgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVANCisjZGVmaW5lIFdISVRFRlJBTUUgIFNTX1dISVRFRlJBTUUgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVANCisNCisNCitJQ09OXzEgIElDT04gd2lkZ2V0LklDTw0KK0lDT05fMiAgSUNPTiB3aWRnZXQuSUMyDQorSUNPTl8zICBJQ09OIHdpZGdldC5JQzMNCisNCitNRU5VXzEgTUVOVQ0KK0JFR0lODQorICBQT1BVUCAiJkZpbGUiDQorICBCRUdJTg0KKyAgICBNRU5VSVRFTSAiJk5ldyIsICAgICAgICAgICBNSURfTkVXDQorICAgIE1FTlVJVEVNICImT3BlbiIsICAgICAgICAgIE1JRF9PUEVODQorICAgIE1FTlVJVEVNICImU2F2ZSIsICAgICAgICAgIE1JRF9TQVZFDQorICAgIE1FTlVJVEVNICJTYXZlICZBcyIsICAgICAgIE1JRF9TQVZFQVMNCisgICAgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgIE1FTlVJVEVNICImUXVpdCEiLCAgICAgICAgIE1JRF9RVUlUDQorICBFTkQNCitFTkQNCisNCisNCisNCisNCitBQk9VVF9EbGcgRElBTE9HIDEwMCwgMTAwLCAxNTQsICA3NQ0KK1NUWUxFIFdTX1BPUFVQIHwgV1NfRExHRlJBTUUNCitCRUdJTg0KKyAgSUNPTiAgIndpZGdldCIgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCAgMjMsICAgMCwgICAwDQorICBJQ09OICAiREtJQ09OMiIgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgMjMsICAgMCwgICAwDQorICBJQ09OICAiREtJQ09OMyIgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwLCAgMjMsICAgMCwgICAwDQorICBDVEVYVCAiQWJvdXQgd2lkZ2V0IEludmVudG9yeSBDb250cm9sZXIiICAgICAtMSwgIDAsIDE0LDE1NCwgOA0KKyAgQ1RFWFQgIlZlcnNpb24gMC41MCIgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMzAsIDM0LCA5NCwgOA0KKyAgQ1RFWFQgIkNvcHlyaWdodCCpIDE5OTEsIFRSRyBFbGVjdHJvbmlrIiAgLTEsICAwLCA0NywxNTQsIDkNCisgIERFRlBVU0hCVVRUT04gIk9rIiAgICAgICAgICAgICAgICAgICAgICAgIElET0ssIDYxLCA1OSwgMzIsIDE0LCBXU19HUk9VUA0KK0VORA0KKw0KKw0KK0xURVhUT0tfRGxnIERJQUxPRyAxMDAsIDEwMCwgMzAwLCAxMjANCitTVFlMRSAgV1NfUE9QVVAgfCBXU19ETEdGUkFNRQ0KK0JFR0lODQorICBMVEVYVCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUREVFhUMSwgICAyMCwgMTUsMTE4LCAxMg0KKyAgTFRFWFQgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERFRYVDIsICAgMjAsIDMwLDExOCwgMjUNCisgIExURVhUICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRERUWFQzLCAgIDIwLCA0NSwxMTgsIDM1DQorICBMVEVYVCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUREVFhUMywgICAyMCwgNjAsMTE4LCAzNQ0KKyAgREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgICAgICAgICAgIElET0ssICAgICAxNTAsIDg1LCA0MCwgMTQsIFRBQkdSUA0KK0VORA0KKw0KKw0KK1NUUklOR1RBQkxFDQorQkVHSU4NCitJRERTVFIxLCAgICAiV2luZSBUZXN0IFByb2dyYW0iDQorSUREU1RSMiwgICAgIiINCitJRERTVFIzLCAgICAiIg0KK0lERFNUUjQsICAgICIiDQorSUREU1RSNSwgICAgIiINCitJRERTVFI2LCAgICAiIg0KK0lERFNUUjcsICAgICIiDQorSUREU1RSOCwgICAgIiINCitJRERTVFI5LCAgICAiIg0KK0lERFNUUjEwLCAgICIiDQorRU5EDQorDQorGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbWFydGluX3NoaXA0L3dpZGdldC5jIGIvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQyZGZjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWFydGluX3NoaXA0L3dpZGdldC5jCkBAIC0wLDAgKzEsNjQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTkxIGJ5IFRSRyBFTEVDVFJPTklLICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICB3aWRnZXQgSW52ZW50b3J5IENvbnRyb2xlciAgIFBBUlQgIyAxICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8V0lORE9XUy5IPg0KKyNpbmNsdWRlICJTVERJTy5oIg0KKyNpbmNsdWRlICJTVERMSUIuaCINCisjaW5jbHVkZSAiU1REQVJHLmgiDQorI2luY2x1ZGUgIlNUUklORy5IIg0KKw0KKyNpbmNsdWRlICJ3aWRnZXQuSCINCisjaW5jbHVkZSAid2lkZ2V0LlZBUiINCisjaW5jbHVkZSAid2lkZ2V0LlAiDQorDQorI2RlZmluZSBOb1JFRihhKSBhPWENCisNCitIV05ECQloV25kQnV0Ow0KK0hXTkQJCWhXbmRDaGs7DQorSFdORAkJaFduZFJhZGlvOw0KK0hXTkQJCWhXbmRMQm94Ow0KK0hXTkQJCWhXbmRMQm94MjsNCitIV05ECQloV25kTEJveDM7DQorSFdORAkJaFduZExCb3g0Ow0KK0hXTkQJCWhXbmRTY3JvbDsNCitIV05ECQloV25kU2NybzI7DQorSFdORAkJaFduZFNjcm8zOw0KK0hXTkQJCWhXbmRTdGF0Ow0KK0hXTkQJCWhXbmRFZGl0Ow0KK0hXTkQJCWhXbmRDQm94Ow0KK2ludAkJeCwgeTsNCisNCitIQlJVU0gJaFJFREJydXNoOw0KK0hCUlVTSAloR1JFRU5CcnVzaDsNCitIQlJVU0gJaEJMVUVCcnVzaDsNCitIQlJVU0gJaEdSQVlCcnVzaDsNCitIQklUTUFQICBoQml0TWFwOw0KK0hCSVRNQVAgIGhCaXRNYXAyOw0KK0hCSVRNQVAgIGhCaXRNYXAzOw0KK0JJVE1BUCAgIEJpdE1hcDsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisNCitpbnQgUEFTQ0FMIFdpbk1haW4oSEFORExFIGhJbnN0YW5jZSxIQU5ETEUgaFByZXZJbnN0YW5jZSwNCisgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBzekNtZExpbmUsaW50IG5DbWRTaG93KQ0KK3sNCitXTkRDTEFTUyAgd25kQ2xhc3M7DQorTVNHICAgICAgIG1zZzsNCitIV05EICAgICAgaFduZDsNCitIREMgICAgICAgaERDOw0KK2NoYXIgICAgICBDWzQwXTsNCitpbnQgICAgICAgWDsNCitOb1JFRihscHN6Q21kTGluZSk7DQoraWYgKCAhaFByZXZJbnN0YW5jZSApDQorICAgIHsNCisgICAgd25kQ2xhc3Muc3R5bGUgICAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVcgOw0KKyAgICB3bmRDbGFzcy5scGZuV25kUHJvYyAgICAgPSAoV05EUFJPQylXbmRQcm9jOw0KKyAgICB3bmRDbGFzcy5jYkNsc0V4dHJhICAgICAgPSAwOw0KKyAgICB3bmRDbGFzcy5jYlduZEV4dHJhICAgICAgPSAwOw0KKyAgICB3bmRDbGFzcy5oSW5zdGFuY2UgICAgICAgPSBoSW5zdGFuY2U7DQorICAgIHduZENsYXNzLmhJY29uICAgICAgICAgICA9IExvYWRJY29uKGhJbnN0YW5jZSwoTFBTVFIpIklDT05fMSIpOw0KKyAgICB3bmRDbGFzcy5oQ3Vyc29yICAgICAgICAgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyApOw0KKyAgICB3bmRDbGFzcy5oYnJCYWNrZ3JvdW5kICAgPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCApOw0KKyAgICB3bmRDbGFzcy5scHN6TWVudU5hbWUgICAgPSBzekFwcE5hbWU7DQorICAgIHduZENsYXNzLmxwc3pDbGFzc05hbWUgICA9IHN6QXBwTmFtZTsNCisgICAgaWYgKCFSZWdpc3RlckNsYXNzKCZ3bmRDbGFzcykpDQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCitoV25kID0gQ3JlYXRlV2luZG93KHN6QXBwTmFtZSwgIndpZGdldCB0ZXN0IHByb2dyYW0iLA0KKyAgICAgICAgIFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUsIDUwLCA1MCwNCisgICAgICAgICA0MDAsIDUwMCwgTlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMKTsNCitoV25kTWFpbiA9IGhXbmQ7DQoraEluc3QgPSBoSW5zdGFuY2U7DQoraERDTWFpbiA9IEdldERDKGhXbmRNYWluKTsNCitoUkVEQnJ1c2ggICAgPSBDcmVhdGVTT0xJREJydXNoKDB4MDAwMDAwRkYpOw0KK2hHUkVFTkJydXNoICA9IENyZWF0ZVNPTElEQnJ1c2goMHgwMDAwN0YwMCk7DQoraEJMVUVCcnVzaCAgID0gQ3JlYXRlU09MSURCcnVzaCgweDAwRkYwMDAwKTsNCitoR1JBWUJydXNoICAgPSBDcmVhdGVTT0xJREJydXNoKDB4MDBDMEMwQzApOw0KKw0KK0luaXRXaWRnZXRzKCk7DQorDQord2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpDQorICAgIHsNCisgICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnICk7DQorICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnICk7DQorICAgIH0NCitEZWxldGVPYmplY3QoaFJFREJydXNoKTsNCitEZWxldGVPYmplY3QoaEdSRUVOQnJ1c2gpOw0KK0RlbGV0ZU9iamVjdChoQkxVRUJydXNoKTsNCitEZWxldGVPYmplY3QoaEdSQVlCcnVzaCk7DQoraWYgKGhCaXRNYXAgIT0gTlVMTCkgRGVsZXRlT2JqZWN0KGhCaXRNYXApOw0KK2lmIChoQml0TWFwMiAhPSBOVUxMKSBEZWxldGVPYmplY3QoaEJpdE1hcDIpOw0KK2lmIChoQml0TWFwMyAhPSBOVUxMKSBEZWxldGVPYmplY3QoaEJpdE1hcDMpOw0KK1JlbGVhc2VEQyhoV25kTWFpbiwgaERDKTsNCityZXR1cm4oMCk7DQorfQ0KKw0KKw0KK3ZvaWQgSW5pdFdpZGdldHMoKQ0KK3sNCitoV25kQnV0ID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiQnV0dG9uICMxIiwNCisgICAgICAgICAgICBXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLCANCisgICAgICAgICAgICAyMzAsIDQwLCA4MCwgMzAsIGhXbmRNYWluLCAxMDAxLCBoSW5zdCwgTlVMTCk7DQoraFduZFNjcm9sID0gQ3JlYXRlV2luZG93KCJTQ1JPTExCQVIiLCAiU2Nyb2xsICMxIiwNCisgICAgICAgICAgICBXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTQlNfVkVSVCwNCisJCQkJMjAwLCAxNTAsIDE1LCAxMDAsIGhXbmRNYWluLCAxMDA0LCBoSW5zdCwgTlVMTCk7DQoraFduZFNjcm8yID0gQ3JlYXRlV2luZG93KCJTQ1JPTExCQVIiLCAiU2Nyb2xsICMyIiwNCisgICAgICAgICAgICBXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTQlNfSE9SWiwNCisJCQkJNTAsIDE1MCwgMTAwLCAxNSwgaFduZE1haW4sIDEwMDUsIGhJbnN0LCBOVUxMKTsNCitoV25kU2NybzMgPSBDcmVhdGVXaW5kb3coIlNDUk9MTEJBUiIsICJTY3JvbGwgIzMiLA0KKyAgICAgICAgICAgIFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IFNCU19TSVpFQk9YLA0KKwkJCQk1MCwgMTgwLCAyNSwgMjUsIGhXbmRNYWluLCAxMDA2LCBoSW5zdCwgTlVMTCk7DQoreCA9IHkgPSAyNTsNCitTZXRWZXJ0U2Nyb2xsKE5VTEwsIGhXbmRTY3JvbCwgMjUsIDAsIDUwKTsNCitTZXRTY3JvbGxSYW5nZShoV25kU2NybzIsIFNCX0NUTCwgMCwgNTAsIFRSVUUpOw0KK1NldFNjcm9sbFBvcyhoV25kU2NybzIsIFNCX0NUTCwgMjUsIFRSVUUpOw0KK2hXbmRMQm94ID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwgIiIsDQorICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19OT1RJRlksDQorCQkJCTIzMCwgMTYwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwMDQsIGhJbnN0LCBOVUxMKTsNCitTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzEiKTsNCitoV25kU3RhdCA9IENyZWF0ZVdpbmRvdygiU1RBVElDIiwgIlN0YXRpYyAjMSIsDQorICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU1NfTEVGVCwgDQorICAgICAgICAgICAgMzAsIDEyMCwgMTUwLCAyMCwgaFduZE1haW4sIDEwMTEsIGhJbnN0LCBOVUxMKTsNCitTZW5kTWVzc2FnZShoV25kU3RhdCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSkiU3RhdGljIExlZnQgVGV4dCIpOw0KK2hXbmRDQm94ID0gQ3JlYXRlV2luZG93KCJDT01CT0JPWCIsICJDb21ibyAjMSIsDQorCQlXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgQ0JTX0RST1BET1dOTElTVCwNCisJCTIzMCwgMjcwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwNjAsIGhJbnN0LCBOVUxMKTsNCitTZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICMxIik7DQorU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMiIpOw0KK1NlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzMiKTsNCitTZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICM0Iik7DQorU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjNSIpOw0KK1NlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzYiKTsNCit9DQorDQorDQorDQorbG9uZyBGQVIgUEFTQ0FMIFduZFByb2MoSFdORCBoV25kLCB1bnNpZ25lZCBNZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pDQorew0KK2ludAlTaGlmdFN0YXRlOw0KK0xQRFJBV0lURU1TVFJVQ1QgZGlzOw0KK0hEQyAgICAgIGhNZW1EQzsNCitIQlJVU0gJaEJydXNoOw0KK2NoYXIJQ1sxMjhdOw0KK1NoaWZ0U3RhdGUgPSBHZXRLZXlTdGF0ZShWS19TSElGVCk7DQorc3dpdGNoKE1lc3NhZ2UpDQorICAgIHsNCisgICAgY2FzZSBXTV9DT01NQU5EOg0KKwkJICBpZiAoTE9XT1JEKGxQYXJhbSkgIT0gMCkNCisJCQkgICB7DQorCQkgIAkJc3ByaW50ZihDLCAiTUFJTiBXTV9DT01NQU5EIHdQYXJhbT0lWCBsUGFyYW09JWxYICEhISIsIHdQYXJhbSwgbFBhcmFtKTsNCisJCSAgCQlUZXh0T3V0KGhEQ01haW4sIDI1LCAyODAsIEMsIHN0cmxlbihDKSk7DQorCQkJICAgfQ0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fS0VZRE9XTjoNCisJCSAgc3ByaW50ZihDLCAiV01fS0VZRE9XTiAhISEiKTsNCisJCSAgVGV4dE91dChoRENNYWluLCAyNSwgNDAsIEMsIHN0cmxlbihDKSk7DQorCQkgIEtleURvd24oaFduZCwgTWVzc2FnZSwgd1BhcmFtKTsNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIFdNX0NIQVI6DQorCQkgIHNwcmludGYoQywgIldNX0NIQVIgISEhIik7DQorCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDUwLCBDLCBzdHJsZW4oQykpOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fQ1RMQ09MT1I6DQorCQkgIHN3aXRjaChISVdPUkQobFBhcmFtKSkNCisJCQkgICB7DQorCQkJCWNhc2UgQ1RMQ09MT1JfU0NST0xMQkFSOg0KKyAgICAgICAgICAgICAgICByZXR1cm4oaEJMVUVCcnVzaCk7DQorCQkJCWNhc2UgQ1RMQ09MT1JfTElTVEJPWDoNCisJCSAgICAgICAgICBTZXRCa0NvbG9yKChIREMpd1BhcmFtLCAweDAwQzBDMDAwKTsNCisgICAgICAgICAgICAgICAgU2V0VGV4dENvbG9yKChIREMpd1BhcmFtLCAweDAwRkYwMDAwKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuKGhHUkVFTkJydXNoKTsNCisJCQkJY2FzZSBDVExDT0xPUl9TVEFUSUM6DQorCQkgICAgICAgICAgU2V0QmtDb2xvcigoSERDKXdQYXJhbSwgMHgwMEMwQzBDMCk7DQorICAgICAgICAgICAgICAgIFNldFRleHRDb2xvcigoSERDKXdQYXJhbSwgMHgwMDAwRkZGRik7DQorICAgICAgICAgICAgICAgIHJldHVybihoUkVEQnJ1c2gpOw0KKwkJCQl9DQorICAgICAgICByZXR1cm4oKEhCUlVTSClOVUxMKTsNCisNCisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIFdNX0xCVVRUT05VUDoNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIFdNX1JCVVRUT05ET1dOOg0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fUkJVVFRPTlVQOg0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fTU9VU0VNT1ZFOg0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fVlNDUk9MTDoNCisJCSAgc3ByaW50ZihDLCAiV01fVlNDUk9MTCAlWCAlbFggISEhIiwgd1BhcmFtLCBsUGFyYW0pOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzODAsIEMsIHN0cmxlbihDKSk7DQorCQkgIERvX0RsZ19WZXJ0U2Nyb2xsKGhXbmQsIHdQYXJhbSwgbFBhcmFtLCAmeSwgMCwgNTApOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fSFNDUk9MTDoNCisJCSAgc3ByaW50ZihDLCAiV01fSFNDUk9MTCAlWCAlbFggISEhIiwgd1BhcmFtLCBsUGFyYW0pOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzODAsIEMsIHN0cmxlbihDKSk7DQorCQkgIERvX0RsZ19Ib3J6U2Nyb2xsKGhXbmQsIHdQYXJhbSwgbFBhcmFtLCAmeCwgMCwgNTApOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fRFJBV0lURU06DQorCQkgIHNwcmludGYoQywgIldNX0RSQVdJVEVNICVYICVsWCAhISEiLCB3UGFyYW0sIGxQYXJhbSk7DQorCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDM4MCwgQywgc3RybGVuKEMpKTsNCisJCSAgaWYgKGxQYXJhbSA9PSAwTCkgYnJlYWs7DQorCQkgIGlmICh3UGFyYW0gPT0gMCkgYnJlYWs7DQorCQkgIGRpcyA9IChMUERSQVdJVEVNU1RSVUNUKWxQYXJhbTsNCisJCSAgaWYgKChkaXMtPkN0bFR5cGUgPT0gT0RUX0xJU1RCT1gpICYmIChkaXMtPkN0bElEID09IDEwNjIpKSB7DQorCQkJCWhCcnVzaCA9IFNlbGVjdE9iamVjdChkaXMtPmhEQywgR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7DQorCQkJCVNlbGVjdE9iamVjdChkaXMtPmhEQywgaEJydXNoKTsNCisJCQkJRmlsbFJlY3QoZGlzLT5oREMsICZkaXMtPnJjSXRlbSwgaEJydXNoKTsNCisJCQkJc3ByaW50ZihDLCAiSXRlbSAjJVgiLCBkaXMtPml0ZW1JRCk7DQorCQkJICAgaWYgKGRpcy0+aXRlbURhdGEgPT0gTlVMTCkgYnJlYWs7DQorCQkJCVRleHRPdXQoZGlzLT5oREMsIGRpcy0+cmNJdGVtLmxlZnQsDQorCQkJCQlkaXMtPnJjSXRlbS50b3AsIEMsIHN0cmxlbihDKSk7DQorCQkJCX0NCisJCSAgaWYgKChkaXMtPkN0bFR5cGUgPT0gT0RUX0xJU1RCT1gpICYmIChkaXMtPkN0bElEID09IDEwNjMpKSB7DQorCQkJCWhCcnVzaCA9IFNlbGVjdE9iamVjdChkaXMtPmhEQywgR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7DQorCQkJCVNlbGVjdE9iamVjdChkaXMtPmhEQywgaEJydXNoKTsNCisJCQkJRmlsbFJlY3QoZGlzLT5oREMsICZkaXMtPnJjSXRlbSwgaEJydXNoKTsNCisJCQkgICBpZiAoZGlzLT5pdGVtRGF0YSA9PSBOVUxMKSBicmVhazsNCisJCQkJVGV4dE91dChkaXMtPmhEQywgZGlzLT5yY0l0ZW0ubGVmdCwJZGlzLT5yY0l0ZW0udG9wLA0KKwkJCQkJKExQU1RSKWRpcy0+aXRlbURhdGEsIGxzdHJsZW4oKExQU1RSKWRpcy0+aXRlbURhdGEpKTsNCisJCQkJfQ0KKwkJICBpZiAoKGRpcy0+Q3RsVHlwZSA9PSBPRFRfTElTVEJPWCkgJiYgKGRpcy0+Q3RsSUQgPT0gMTA2NCkpIHsNCisJCQkJaEJydXNoID0gU2VsZWN0T2JqZWN0KGRpcy0+aERDLCBHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpKTsNCisJCQkJU2VsZWN0T2JqZWN0KGRpcy0+aERDLCBoQnJ1c2gpOw0KKwkJCQlGaWxsUmVjdChkaXMtPmhEQywgJmRpcy0+cmNJdGVtLCBoQnJ1c2gpOw0KKwkJCQloTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGlzLT5oREMpOw0KKwkJCQlTZWxlY3RPYmplY3QoaE1lbURDLGhCaXRNYXApOw0KKwkJCQlCaXRCbHQoZGlzLT5oREMsIGRpcy0+cmNJdGVtLmxlZnQsCWRpcy0+cmNJdGVtLnRvcCwNCisJCQkJCQlCaXRNYXAuYm1XaWR0aCwgQml0TWFwLmJtSGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0NPUFkpOw0KKwkJCQlEZWxldGVEQyhoTWVtREMpOw0KKwkJCQlzcHJpbnRmKEMsICJJdGVtICMlWCIsIGRpcy0+aXRlbUlEKTsNCisJCQkJVGV4dE91dChkaXMtPmhEQywgZGlzLT5yY0l0ZW0ubGVmdCArIEJpdE1hcC5ibVdpZHRoLA0KKwkJCQkJZGlzLT5yY0l0ZW0udG9wLCBDLCBzdHJsZW4oQykpOw0KKy8vCQkJICAgaWYgKGRpcy0+aXRlbURhdGEgPT0gTlVMTCkgYnJlYWs7DQorLy8JCQkJVGV4dE91dChkaXMtPmhEQywgZGlzLT5yY0l0ZW0ubGVmdCArIEJpdE1hcC5ibVdpZHRoLA0KKy8vCQkJCQkJZGlzLT5yY0l0ZW0udG9wLCAoTFBTVFIpZGlzLT5pdGVtRGF0YSwNCisvLwkJCQkJCWxzdHJsZW4oKExQU1RSKWRpcy0+aXRlbURhdGEpKTsNCisJCQkJfQ0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fUEFJTlQ6DQorICAgICAgICBEb1BhaW50KGhXbmQpOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgV01fREVTVFJPWToNCisgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsNCisgICAgICAgIGJyZWFrOw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KKyAgICB9DQorcmV0dXJuKDApOw0KK30NCisNCisNCisNCitCT09MIEtleURvd24oSFdORCBoV25kLCB1bnNpZ25lZCBNZXNzYWdlLCBXT1JEIHdQYXJhbSkNCit7DQorV09SRAkJCXdSZXQ7DQorVUlOVAkJCXVSZXQ7DQorRFdPUkQJCQlkd1JldDsNCitIREMgICAgICBoTWVtREM7DQorY2hhcgkJCUNbMTI4XTsNCitjaGFyCQkJQzJbNjRdOw0KK05vUkVGKGhXbmQpOw0KK05vUkVGKE1lc3NhZ2UpOw0KK3NwcmludGYoQywgIktleURvd24gJXggISEhIiwgd1BhcmFtKTsNCitUZXh0T3V0KGhEQ01haW4sIDI1LCAxMDAsIEMsIHN0cmxlbihDKSk7DQorc3dpdGNoICh3UGFyYW0pDQorICAgIHsNCisgICAgY2FzZSBWS19IT01FOiAgICAgICAgICAgIC8qICdIT01FJyBLRVkgICAgICAgICAqLw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgVktfTEVGVDogICAgICAgICAgICAvKiAnTEVGVCcgQ1VSU09SIEtFWSAgKi8NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFZLX1JJR0hUOiAgICAgICAgICAgLyogJ1JJR0hUJyBDVVJTT1IgS0VZICovDQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBWS19VUDogICAgICAgICAgICAgIC8qICdVUCcgQ1VSU09SIEtFWSAgICAqLw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgVktfRE9XTjogICAgICAgICAgICAvKiAnRE9XTicgQ1VSU09SIEtFWSAgKi8NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFZLX1BSSU9SOiAgICAgICAgICAgLyogJ1BHVVAnIENVUlNPUiBLRVkgICovDQorICAgICAgICBicmVhazsNCisgICAgY2FzZSBWS19ORVhUOiAgICAgICAgICAgIC8qICdQR0ROJyBDVVJTT1IgS0VZICAqLw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJzEnOg0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJzInOg0KKwkJICBoV25kU3RhdCA9IENyZWF0ZVdpbmRvdygiU1RBVElDIiwgIlN0YXRpYyAjMiIsDQorICAgICAgICAgICAgCQkJV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU1NfQ0VOVEVSLCANCisgICAgICAgICAgICAJCQkzMCwgMTUwLCAxNTAsIDIwLCBoV25kTWFpbiwgMTAxMiwgaEluc3QsIE5VTEwpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kU3RhdCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSkiU3RhdGljIENlbnRlciBUZXh0Iik7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnMyc6DQorCQkgIGhXbmRTdGF0ID0gQ3JlYXRlV2luZG93KCJTVEFUSUMiLCAiU3RhdGljICMzIiwNCisgICAgICAgICAgICAJCQlXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTU19SSUdIVCwgDQorICAgICAgICAgICAgCQkJMzAsIDE4MCwgMTUwLCAyMCwgaFduZE1haW4sIDEwMTMsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZFN0YXQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pIlN0YXRpYyBSaWdodCBUZXh0Iik7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnNCc6DQorCQkgIGhXbmRTdGF0ID0gQ3JlYXRlV2luZG93KCJTVEFUSUMiLCAiU3RhdGljICM0IiwNCisgICAgICAgICAgICAJCQlXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTU19TSU1QTEUsIA0KKyAgICAgICAgICAgIAkJCTMwLCAyMTAsIDE1MCwgMjAsIGhXbmRNYWluLCAxMDE0LCBoSW5zdCwgTlVMTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRTdGF0LCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKSJTU19TSU1QTEUiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICc1JzoNCisJCSAgaFduZFN0YXQgPSBDcmVhdGVXaW5kb3coIlNUQVRJQyIsICJTdGF0aWMgIzUiLA0KKyAgICAgICAgICAgIAkJCVdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IFNTX0dSQVlSRUNULCANCisgICAgICAgICAgICAJCQkzMCwgMjQwLCAxNTAsIDIwLCBoV25kTWFpbiwgMTAxNSwgaEluc3QsIE5VTEwpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kU3RhdCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSkiU1NfR1JBWVJFQ1QiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdBJzoNCisJCSAgaFduZFN0YXQgPSBDcmVhdGVXaW5kb3coIlNUQVRJQyIsICJTdGF0aWMgIzYiLA0KKyAgICAgICAgICAgIAkJCVdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IFNTX0JMQUNLUkVDVCwgDQorICAgICAgICAgICAgCQkJMzAsIDI0MCwgMTUwLCAyMCwgaFduZE1haW4sIDEwMTYsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZFN0YXQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pIlNTX0JMQUNLUkVDVCIpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ0MnOg0KKwkJICBpZiAoaEJpdE1hcDIgPT0gTlVMTCkgew0KKwkJICAJCWhCaXRNYXAyID0gTG9hZEJpdG1hcChoSW5zdCwgIkxCSUNPTiIpOw0KKwkJICAJCUdldE9iamVjdChoQml0TWFwMiwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmQml0TWFwKTsNCisJCQkJfQ0KKwkJICBoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMoaERDTWFpbik7DQorCQkgIFNlbGVjdE9iamVjdChoTWVtREMsIGhCaXRNYXAyKTsNCisJCSAgQml0Qmx0KGhEQ01haW4sIDEwLCAxMCwgQml0TWFwLmJtV2lkdGgsDQorCQkJCQkJQml0TWFwLmJtSGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0NPUFkpOw0KKwkJICBEZWxldGVEQyhoTWVtREMpOw0KKwkJICBzcHJpbnRmKEMsICJEcmF3Qml0bWFwIik7DQorCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMyMCwgQywgc3RybGVuKEMpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdEJzoNCisJCSAgaWYgKGhCaXRNYXAzID09IE5VTEwpIHsNCisJCSAgCQloQml0TWFwMyA9IExvYWRCaXRtYXAoaEluc3QsIE1BS0VJTlRSRVNPVVJDRSgzMzMzKSk7DQorCQkgIAkJR2V0T2JqZWN0KGhCaXRNYXAzLCBzaXplb2YoQklUTUFQKSwgKExQU1RSKSZCaXRNYXApOw0KKwkJCQl9DQorCQkgIGhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoRENNYWluKTsNCisJCSAgU2VsZWN0T2JqZWN0KGhNZW1EQywgaEJpdE1hcDMpOw0KKwkJICBCaXRCbHQoaERDTWFpbiwgODAsIDEwLCBCaXRNYXAuYm1XaWR0aCwNCisJCQkJCQlCaXRNYXAuYm1IZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDQ09QWSk7DQorCQkgIERlbGV0ZURDKGhNZW1EQyk7DQorCQkgIHNwcmludGYoQywgIkRyYXdCaXRtYXAiKTsNCisJCSAgVGV4dE91dChoRENNYWluLCAyNSwgMzIwLCBDLCBzdHJsZW4oQykpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ0YnOg0KKwkJICBNb3ZlV2luZG93KGhXbmQsIDEwLCAxMCwgNTAwLCA2MDAsIFRSVUUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ0cnOg0KKwkJICBNb3ZlV2luZG93KGhXbmRCdXQsIDIwLCAyMCwgMTAwLCAyMCwgVFJVRSk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnSCc6DQorCQkgIFdpbkhlbHAoaFduZE1haW4sICJ0b3RvLmhscCIsIEhFTFBfSU5ERVgsIDBMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdKJzoNCisJCSAgV2luRXhlYygiL0Q6L3dpbmUvd2lkZ2V0LmV4ZSBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUgYXJnNiIsIFNXX05PUk1BTCk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnSyc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnUSc6DQorCQkgIGhXbmRDaGsgPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsICJDaGVja0JveCAjMSIsDQorICAgICAgICAgICAgICAgICAgICBXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBCU19DSEVDS0JPWCwNCisJCQkJCQkgIDMwLCAzMDAsIDEyMCwgMjAsIGhXbmRNYWluLCAxMDIwLCBoSW5zdCwgTlVMTCk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnVyc6DQorCQkgIHdSZXQgPSBTZW5kTWVzc2FnZShoV25kQ2hrICwgQk1fR0VUQ0hFQ0ssIDAsIDBMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZENoayAsIEJNX1NFVENIRUNLLCB3UmV0LCAwTCk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnRSc6DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnUic6DQorCQkgIGhXbmRSYWRpbyA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgIlJhZGlvQnV0ICMxIiwNCisgICAgICAgICAgICAgICAgICAgIFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IEJTX1JBRElPQlVUVE9OLA0KKwkJCQkJCSAgMjMwLCAxMjAsIDEyMCwgMjAsIGhXbmRNYWluLCAxMDAzLCBoSW5zdCwgTlVMTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRSYWRpbywgQk1fU0VUQ0hFQ0ssIFRSVUUsIDBMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdUJzoNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBTaW5nbGUgaXRlbSIpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1knOg0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzIiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICMzIik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjNCIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzUiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICM2Iik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9TRVRDVVJTRUwsIDMsIDBMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0lOU0VSVFNUUklORywgNSwgKExQQVJBTSkiSXRlbSBiZXR3ZWVuIDUgJiA2Iik7DQorCQkgIHdSZXQgPSBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfRklORFNUUklORywgLTEsIChMUEFSQU0pIkl0ZW0gYmV0d2VlbiA1ICYgNiIpOw0KKwkJICBzcHJpbnRmKEMsICJMQl9GSU5EU1RSSU5HIHJldHVybmVkICMldSAgICIsIHdSZXQpOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzMDAsIEMsIHN0cmxlbihDKSk7DQorCQkgIHdSZXQgPSBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCk7DQorCQkgIHNwcmludGYoQywgIkxCX0dFVENVUlNFTCByZXR1cm5lZCAjJXUgICAiLCB3UmV0KTsNCisJCSAgVGV4dE91dChoRENNYWluLCAyNSwgMzIwLCBDLCBzdHJsZW4oQykpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ1UnOg0KKwkJICB3UmV0ID0gU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfREVMRVRFU1RSSU5HLCB3UmV0LCAwTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9TRVRDVVJTRUwsIHdSZXQsIDBMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdJJzoNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX1JFU0VUQ09OVEVOVCwgMCwgMEwpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIGNhc2UgJ08nOg0KKwkJICBDMlswXSA9ICdcMCc7DQorCQkgIHdSZXQgPSBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9HRVRURVhULCB3UmV0LCAoRFdPUkQpQzIpOw0KKwkJICBzcHJpbnRmKEMsICJMQl9HRVRURVhUICMlZCByZXR1cm5lZCAnJXMnICAgIiwgd1JldCwgQzIpOw0KKwkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzMjAsIEMsIHN0cmxlbihDKSk7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnUCc6DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9ESVIsIDAsIChEV09SRCkiKi4qIik7DQorICAgICAgICBicmVhazsNCisgICAgY2FzZSAnWic6DQorCQkgIFNob3dXaW5kb3coaFduZFNjcm9sLCBTV19ISURFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlICdYJzoNCisJCSAgU2hvd1dpbmRvdyhoV25kU2Nyb2wsIFNXX1NIT1cpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICBjYXNlICdWJzoNCisJCSAgTW92ZVdpbmRvdyhoV25kU2Nyb2wsIDEyMCwgMTUwLCAxNSwgNjAsIFRSVUUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICBjYXNlICdCJzoNCisJCSAgaFduZENCb3ggPSBDcmVhdGVXaW5kb3coIkNPTUJPQk9YIiwgIkNvbWJvICMyIiwNCisJCQkJCVdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBDQlNfRFJPUERPV04sDQorCQkJCQkzMCwgMjcwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwNjEsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMSIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICMyIik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9ESVIsIDAsIChEV09SRCkiKi4qIik7DQorICAgICAgICBicmVhazsNCisgICAgIGNhc2UgJ04nOg0KKwkJICBoV25kTEJveDIgPSBDcmVhdGVXaW5kb3coIkxJU1RCT1giLCAiIiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwNCisJCQkJCVdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBMQlNfT1dORVJEUkFXVkFSSUFCTEUgfCBMQlNfTk9USUZZLA0KKy8vCQkJCQlXU19CT1JERVIgfCBXU19WU0NST0xMIHwgTEJTX09XTkVSRFJBV1ZBUklBQkxFIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9USUZZLA0KKwkJCQkJMzAsIDMwMCwgMTUwLCA2MCwgaFduZE1haW4sIDEwNjIsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gyLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdGSVhFRCAjMSIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDIsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV0ZJWEVEICMyIik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MiwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXRklYRUQgIzMiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gyLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdGSVhFRCAjNCIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDIsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV0ZJWEVEICM1Iik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MiwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXRklYRUQgIzYiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgY2FzZSAnTSc6DQorCQkgIGhXbmRMQm94MyA9IENyZWF0ZVdpbmRvdygiTElTVEJPWCIsICIiLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfA0KKwkJCQkJV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19PV05FUkRSQVdWQVJJQUJMRSB8IExCU19OT1RJRlksDQorLy8JCQkJCVdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBMQlNfT1dORVJEUkFXVkFSSUFCTEUgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT1RJRlksDQorCQkJCQkyMzAsIDMwMCwgMTUwLCA2MCwgaFduZE1haW4sIDEwNjMsIGhJbnN0LCBOVUxMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjMSIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICMyIik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzMiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjNCIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICM1Iik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzYiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjNyIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX1NFVElURU1IRUlHSFQsIDEsIDEwTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfU0VUSVRFTUhFSUdIVCwgMiwgMjBMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9TRVRJVEVNSEVJR0hULCAzLCAzMEwpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX1NFVElURU1IRUlHSFQsIDQsIDQwTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfU0VUSVRFTUhFSUdIVCwgNSwgNTBMKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgY2FzZSAnTCc6DQorCQkgIGhCaXRNYXAgPSBMb2FkQml0bWFwKGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoMzMzMykpOw0KKwkJICBHZXRPYmplY3QoaEJpdE1hcCwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmQml0TWFwKTsNCisJCSAgaFduZExCb3g0ID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwgIiIsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8DQorCQkJCQlXU19CT1JERVIgfCBXU19WU0NST0xMIHwgTEJTX09XTkVSRFJBV1ZBUklBQkxFIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9USUZZLA0KKwkJCQkJMjMwLCAzODAsIDE1MCwgNjAsIGhXbmRNYWluLCAxMDY0LCBoSW5zdCwgTlVMTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzEiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjMiIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICMzIik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzQiKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjNSIpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICM2Iik7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfU0VUSVRFTUhFSUdIVCwgMSwgMTBMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9TRVRJVEVNSEVJR0hULCAyLCAyMEwpOw0KKwkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX1NFVElURU1IRUlHSFQsIDMsIDMwTCk7DQorCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfU0VUSVRFTUhFSUdIVCwgNCwgNDBMKTsNCisJCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9TRVRJVEVNSEVJR0hULCA1LCA1MEwpOw0KKyAgICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgVktfRjEwOiAgICAgICAgICAgICAvKiAnRjEwJyBGVU5DVElPTiBLRVkgKi8NCisgICAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFZLX0YxMTogICAgICAgICAgICAgLyogJ0YxMScgRlVOQ1RJT04gS0VZICovDQorICAgICAgICBicmVhazsNCisgICAgfQ0KK3JldHVybihUUlVFKTsNCit9DQorDQorDQorDQordm9pZCBEb1BhaW50KEhXTkQgaFduZCkNCit7DQorSERDICAgICAgICAgaERDOw0KK1JFQ1QgICAgICAgIHJlY3Q7DQorUEFJTlRTVFJVQ1QgcHM7DQorY2hhciAgIENbODBdOw0KK0dldENsaWVudFJlY3QoaFduZCwgJnJlY3QpOw0KK2hEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsNCitGaWxsUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChHUkFZX0JSVVNIKSk7DQorSW5mbGF0ZVJlY3QoJnJlY3QsIC0zLCAtMyk7DQorRnJhbWVSZWN0KGhEQywgJnJlY3QsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7DQorSW5mbGF0ZVJlY3QoJnJlY3QsIC0xMCwgLTEwKTsNCitGaWxsUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCkpOw0KK3NwcmludGYoQywgIldpbmUgVGVzdGluZyAhISEiKTsNCitUZXh0T3V0KGhEQywgMjUsIDI1LCBDLCBzdHJsZW4oQykpOw0KK1JlbGVhc2VEQyhoV25kLGhEQyk7DQorRW5kUGFpbnQoaFduZCwmcHMpOw0KK30NCisNCisNCitIQlJVU0ggQ3JlYXRlTFRHUkFZQnJ1c2goKQ0KK3sNCityZXR1cm4oQ3JlYXRlU09MSURCcnVzaCgweDAwQzBDMEMwKSk7DQorfQ0KKw0KKw0KKw0KK0hCUlVTSCBDcmVhdGVTT0xJREJydXNoKENPTE9SUkVGIENvbG9yKQ0KK3sNCitMT0dCUlVTSCBsb2dHUkFZQnJ1c2g7DQorbG9nR1JBWUJydXNoLmxiU3R5bGUgPSBCU19TT0xJRDsNCitsb2dHUkFZQnJ1c2gubGJDb2xvciA9IENvbG9yOw0KK2xvZ0dSQVlCcnVzaC5sYkhhdGNoID0gTlVMTDsNCityZXR1cm4oQ3JlYXRlQnJ1c2hJbmRpcmVjdCgmbG9nR1JBWUJydXNoKSk7DQorfQ0KKw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK3ZvaWQgU2V0VmVydFNjcm9sbChpbnQgaERsZywgaW50IGhXbmRTQ1JPTEwsIGludCBWQUwsIGludCBNSU4sIGludCBNQVgpDQorew0KK2NoYXIgIENbMTJdOw0KK1NldFNjcm9sbFJhbmdlKGhXbmRTQ1JPTEwsIFNCX0NUTCwgLU1BWCwgLU1JTiwgRkFMU0UpOw0KK1NldFNjcm9sbFBvcyhoV25kU0NST0xMLCBTQl9DVEwsIC1WQUwsIFRSVUUpOw0KK2l0b2EoVkFMLCBDLCAxMCk7DQorLy9TZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChoV25kU0NST0xMKSAtIElERFNDUk9MTDEpLCBDKTsNCit9DQorDQorDQorDQordm9pZCBTZXRIb3J6U2Nyb2xsKGludCBoRGxnLCBpbnQgaFduZFNDUk9MTCwgaW50IFZBTCwgaW50IE1JTiwgaW50IE1BWCkNCit7DQorY2hhciAgQ1sxMl07DQorU2V0U2Nyb2xsUmFuZ2UoaFduZFNDUk9MTCwgU0JfQ1RMLCBNQVgsIE1JTiwgRkFMU0UpOw0KK1NldFNjcm9sbFBvcyhoV25kU0NST0xMLCBTQl9DVEwsIFZBTCwgVFJVRSk7DQoraXRvYShWQUwsIEMsIDEwKTsNCisvL1NldERsZ0l0ZW1UZXh0KGhEbGcsIChJRERUWFQxICsgR2V0RGxnQ3RybElEKGhXbmRTQ1JPTEwpIC0gSUREU0NST0xMMSksIEMpOw0KK30NCisNCisNCisNCit2b2lkIERvX0RsZ19WZXJ0U2Nyb2xsKEhXTkQgaERsZywgV09SRCB3UGFyYW0sIERXT1JEIGxQYXJhbSwgaW50ICpWLCBpbnQgTUlOLCBpbnQgTUFYKQ0KK3sNCitjaGFyICBDWzEyXTsNCitpbnQgICBWQUw7DQoraW50ICAgVkFMMjsNCitpbnQJU3RlcCA9IDEwMDsNCitpZiAoTUFYIDwgMTAwMCkJU3RlcCA9IDEwOw0KK2lmIChNQVggPCAxMDApCQlTdGVwID0gTUFYIC8gMTA7DQorVkFMID0gKihWKTsNCitWQUwyID0gVkFMOw0KK3N3aXRjaCAod1BhcmFtKQ0KKyAgICB7DQorICAgIGNhc2UgU0JfTElORVVQOg0KKwkJCVZBTCsrOw0KKwkJCWJyZWFrOw0KKyAgICBjYXNlIFNCX0xJTkVET1dOOg0KKwkJCVZBTC0tOw0KKwkJCWJyZWFrOw0KKyAgICBjYXNlIFNCX1BBR0VVUDoNCisJCQlWQUwgKz0gU3RlcDsNCisJCQlicmVhazsNCisgICAgY2FzZSBTQl9QQUdFRE9XTjoNCisJCQlWQUwgLT0gU3RlcDsNCisJCQlicmVhazsNCisgICAgY2FzZSBTQl9USFVNQlRSQUNLOg0KKyAgICBjYXNlIFNCX1RIVU1CUE9TSVRJT046DQorCQkgICBWQUwgPSAtKExPV09SRChsUGFyYW0pKTsNCisJCQlicmVhazsNCisJfQ0KK2lmIChWQUwgPiBNQVgpCQlWQUwgPSBNQVg7DQoraWYgKFZBTCA8IE1JTikJCVZBTCA9IE1JTjsNCitpZiAoVkFMICE9IFZBTDIpDQorICAgIHsNCisgICAgU2V0U2Nyb2xsUG9zKEhJV09SRChsUGFyYW0pLCBTQl9DVEwsIC1WQUwsIFRSVUUpOw0KKyAgICBsdG9hKFZBTCwgQywgMTApOw0KKy8vICAgIFNldERsZ0l0ZW1UZXh0KGhEbGcsIChJRERUWFQxICsgR2V0RGxnQ3RybElEKEhJV09SRChsUGFyYW0pKSAtIElERFNDUk9MTDEpLCBDKTsNCisgICAgfQ0KKyooVikgPSBWQUw7DQorfQ0KKw0KKw0KK3ZvaWQgRG9fRGxnX0hvcnpTY3JvbGwoSFdORCBoRGxnLCBXT1JEIHdQYXJhbSwgRFdPUkQgbFBhcmFtLCBpbnQgKlYsIGludCBNSU4sIGludCBNQVgpDQorew0KK2NoYXIgIENbMTJdOw0KK2ludCAgIFZBTDsNCitpbnQgICBWQUwyOw0KK2ludAlTdGVwID0gMTAwOw0KK2lmIChNQVggPCAxMDAwKQlTdGVwID0gMTA7DQoraWYgKE1BWCA8IDEwMCkJCVN0ZXAgPSBNQVggLyAxMDsNCitWQUwgPSAqKFYpOw0KK1ZBTDIgPSBWQUw7DQorc3dpdGNoICh3UGFyYW0pDQorICAgIHsNCisgICAgY2FzZSBTQl9MSU5FVVA6DQorCQkJVkFMLS07DQorCQkJYnJlYWs7DQorICAgIGNhc2UgU0JfTElORURPV046DQorCQkJVkFMKys7DQorCQkJYnJlYWs7DQorICAgIGNhc2UgU0JfUEFHRVVQOg0KKwkJCVZBTCAtPSBTdGVwOw0KKwkJCWJyZWFrOw0KKyAgICBjYXNlIFNCX1BBR0VET1dOOg0KKwkJCVZBTCArPSBTdGVwOw0KKwkJCWJyZWFrOw0KKyAgICBjYXNlIFNCX1RIVU1CVFJBQ0s6DQorICAgIGNhc2UgU0JfVEhVTUJQT1NJVElPTjoNCisJCSAgIFZBTCA9IChMT1dPUkQobFBhcmFtKSk7DQorCQkJYnJlYWs7DQorCX0NCitpZiAoVkFMID4gTUFYKQkJVkFMID0gTUFYOw0KK2lmIChWQUwgPCBNSU4pCQlWQUwgPSBNSU47DQoraWYgKFZBTCAhPSBWQUwyKQ0KKyAgICB7DQorICAgIFNldFNjcm9sbFBvcyhISVdPUkQobFBhcmFtKSwgU0JfQ1RMLCBWQUwsIFRSVUUpOw0KKyAgICBsdG9hKFZBTCwgQywgMTApOw0KKy8vICAgIFNldERsZ0l0ZW1UZXh0KGhEbGcsIChJRERUWFQxICsgR2V0RGxnQ3RybElEKEhJV09SRChsUGFyYW0pKSAtIElERFNDUk9MTDEpLCBDKTsNCisgICAgfQ0KKyooVikgPSBWQUw7DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KKxoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21hcnRpbl9zaGlwNC93aWRnZXQuZXhlIGIvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWVjZDAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L3dpZGdldC5leGUgYi90ZXN0L3dpZGdldC5leGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODk4MzdkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvd2lkZ2V0LmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZSBiL3Rvb2xzL01ha2VmaWxlCmluZGV4IDhlNTc2NmYuLmY3NDYyOGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlCisrKyBiL3Rvb2xzL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCWNjICQoQ0ZMQUdTKSAtbyBidWlsZCBidWlsZC5jCiAKIGNsZWFuOgotCXJtIC1mICoubyAqfiBidWlsZAorCXJtIC1mICoubyAqfiBidWlsZCAqIwogCiBkZXBlbmQ6CiAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IGQxM2M3MTcuLmQ1OTY0OTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtNjY3LDYgKzY2NywzNSBAQAogCQlmcHJpbnRmKGZwLCAiXyVzX09yZGluYWxfJWQ6XG4iLCBVcHBlckRMTE5hbWUsIGkpOwogCQlmcHJpbnRmKGZwLCAiXHRhbmRsXHQkMHgwMDAwZmZmZiwlJWVzcFxuIik7CiAJCWZwcmludGYoZnAsICJcdGFuZGxcdCQweDAwMDBmZmZmLCUlZWJwXG4iKTsKKwkJZnByaW50ZihmcCwgIlx0cHVzaGxcdCQwXG4iKTsJCQkvKiBjcjIgICAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2hsXHQkMFxuIik7CQkJLyogb2xkbWFzayAqLworCQlmcHJpbnRmKGZwLCAiXHRwdXNobFx0JDBcbiIpOwkJCS8qIGkzODcgICAgKi8KKwkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCQwXG4iKTsJCQkvKiBfX3NzaCAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2h3XHQlJXNzXG4iKTsJCQkvKiBzcyAgICAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2hsXHQlJWVzcFxuIik7CQkvKiBlc3AgICAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2hmbFxuIik7CQkJLyogZWZsYWdzICAqLworCQlmcHJpbnRmKGZwLCAiXHRwdXNod1x0JDBcbiIpOwkJCS8qIF9fY3NoICAgKi8KKwkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCUlY3NcbiIpOwkJCS8qIGNzICAgICAgKi8KKwkJZnByaW50ZihmcCwgIlx0cHVzaGxcdCQwXG4iKTsJCQkvKiBlaXAgICAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2hsXHQkMFxuIik7CQkJLyogZXJyICAgICAqLworCQlmcHJpbnRmKGZwLCAiXHRwdXNobFx0JDBcbiIpOwkJCS8qIHRyYXBubyAgKi8KKwkJZnByaW50ZihmcCwgIlx0cHVzaGFsXG4iKTsJCQkvKiBBWCwgLi4uICovCisJCWZwcmludGYoZnAsICJcdHB1c2h3XHQkMFxuIik7CQkJLyogX19kc2ggICAqLworCQlmcHJpbnRmKGZwLCAiXHRwdXNod1x0JSVkc1xuIik7CQkJLyogZHMgICAgICAqLworCQlmcHJpbnRmKGZwLCAiXHRwdXNod1x0JDBcbiIpOwkJCS8qIF9fZXNoICAgKi8KKwkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCUlZXNcbiIpOwkJCS8qIGVzICAgICAgKi8KKwkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCQwXG4iKTsJCQkvKiBfX2ZzaCAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2h3XHQlJWZzXG4iKTsJCQkvKiBmcyAgICAgICovCisJCWZwcmludGYoZnAsICJcdHB1c2h3XHQkMFxuIik7CQkJLyogX19nc2ggICAqLworCQlmcHJpbnRmKGZwLCAiXHRwdXNod1x0JSVnc1xuIik7CQkJLyogZ3MgICAgICAqLworCQlmcHJpbnRmKGZwLCAiXHRtb3ZsXHQlJWVicCwlJWVheFxuIik7CisJCWZwcmludGYoZnAsICJcdG1vdndcdCUlZXNwLCUlZWJwXG4iKTsKKwkJZnByaW50ZihmcCwgIlx0cHVzaGxcdDg4KCUlZWJwKVxuIik7CisJCWZwcmludGYoZnAsICJcdG1vdmxcdCUlZWF4LCUlZWJwXG4iKTsKKwkJZnByaW50ZihmcCwgIlx0bW92bFx0JCVkLCUlZWF4XG4iLCBpKTsKKwkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCQ5MlxuIik7CisJCWZwcmludGYoZnAsICJcdGptcFx0XyVzX0Rpc3BhdGNoXG5cbiIsIFVwcGVyRExMTmFtZSk7CisjaWYgMAogCQlmcHJpbnRmKGZwLCAiXHRwdXNod1x0JSVheFxuIik7CiAJCWZwcmludGYoZnAsICJcdHB1c2h3XHQlJWN4XG4iKTsKIAkJZnByaW50ZihmcCwgIlx0cHVzaHdcdCUlZHhcbiIpOwpAQCAtNjg0LDYgKzcxMyw3IEBACiAJCWZwcmludGYoZnAsICJcdG1vdmxcdCQlZCwlJWVheFxuIiwgaSk7CiAJCWZwcmludGYoZnAsICJcdHB1c2h3XHQkMjRcbiIpOwogCQlmcHJpbnRmKGZwLCAiXHRqbXBcdF8lc19EaXNwYXRjaFxuXG4iLCBVcHBlckRMTE5hbWUpOworI2VuZGlmCiAJCWJyZWFrOwogCiAJICAgICAgY2FzZSBGVU5DVFlQRV9QQVNDQUw6CmRpZmYgLS1naXQgYS93aW5kb3dzL01ha2VmaWxlIGIvd2luZG93cy9NYWtlZmlsZQppbmRleCBmN2RlMTcyLi44MTJiZDM0IDEwMDY0NAotLS0gYS93aW5kb3dzL01ha2VmaWxlCisrKyBiL3dpbmRvd3MvTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiBDRkxBR1M9JChDT1BUUykgJChERUJVR09QVFMpIC1JJChJTkNMVURFX0RJUikKIAogT0JKUz1jbGFzcy5vIGRjLm8gZGNlLm8gZXZlbnQubyBtZXNzYWdlLm8gd2luLm8gdGltZXIubyBncmFwaGljcy5vIFwKLSAgICAJY2xpcHBpbmcubyBtYXBwaW5nLm8gcGFpbnRpbmcubyBrZXlib2FyZC5vIHV0aWxpdHkubyBzeXNjb2xvci5vCisgICAgCWNsaXBwaW5nLm8gbWFwcGluZy5vIHBhaW50aW5nLm8ga2V5Ym9hcmQubyB1dGlsaXR5Lm8gc3lzY29sb3IubyBcCisJZGVmd25kLm8gZGVmZGxnLm8gZGlhbG9nLm8gZm9jdXMubwogCiBkZWZhdWx0OiB3aW5kb3dzLm8KIApAQCAtOSw3ICsxMCw3IEBACiAJJChMRCkgLXIgLW8gd2luZG93cy5vICQoT0JKUykKIAogY2xlYW46Ci0Jcm0gLWYgKi5vICp+ICoucyBkbGxfKiAqLmEKKwlybSAtZiAqLm8gKn4gKi5zIGRsbF8qICouYSAqIwogCiBkZXBlbmQ6CiAJJChDQykgJChDRkxBR1MpIC1NICouYyA+IC5kZXBlbmQKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmZGxnLmMgYi93aW5kb3dzL2RlZmRsZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDVkYzMKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL2RlZmRsZy5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBEZWZhdWx0IGRpYWxvZyBwcm9jZWR1cmUKKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCitzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIEFsZXhhbmRyZSBKdWxsaWFyZCwgMTk5MyI7CisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGlhbG9nLmgiCisjaW5jbHVkZSAid2luLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRGVmRGxnUHJvYyAgIChVU0VSLjMwOCkKKyAqLworTE9ORyBEZWZEbGdQcm9jKCBIV05EIGh3bmQsIFdPUkQgbXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQoreworICAgIERJQUxPR0lORk8gKiBkbGdJbmZvOworICAgIEJPT0wgcmVzdWx0ID0gRkFMU0U7CisgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICAKKyAgICBpZiAoIXduZFB0cikgcmV0dXJuIDA7CisgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopJnduZFB0ci0+d0V4dHJhOworCisjaWZkZWYgREVCVUdfRElBTE9HCisgICAgcHJpbnRmKCAiRGVmRGxnUHJvYzogJWQgJTA0eCAlZCAlMDh4XG4iLCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisjZW5kaWYKKworICAgIGRsZ0luZm8tPm1zZ1Jlc3VsdCA9IDA7CisgICAgaWYgKGRsZ0luZm8tPmRsZ1Byb2MpCisgICAgeworCSAgLyogQ2FsbCBkaWFsb2cgcHJvY2VkdXJlICovCisJcmVzdWx0ID0gKEJPT0wpQ2FsbFdpbmRvd1Byb2MoIGRsZ0luZm8tPmRsZ1Byb2MsIGh3bmQsIAorCQkJCSAgICAgICBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisKKwkgIC8qIENoZWNrIGlmIHdpbmRvdyBkZXN0cm95ZWQgYnkgZGlhbG9nIHByb2NlZHVyZSAqLworCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisJaWYgKCF3bmRQdHIpIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGlmICghcmVzdWx0KSBzd2l0Y2gobXNnKQorICAgIHsKKwljYXNlIFdNX0lOSVRESUFMT0c6CisJICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgV01fRVJBU0VCS0dORDoKKwkgICAgRmlsbFdpbmRvdyggaHduZCwgaHduZCwgKEhEQyl3UGFyYW0sIChIQlJVU0gpQ1RMQ09MT1JfRExHICk7CisJICAgIHJldHVybiBUUlVFOworCisJY2FzZSBXTV9OQ0RFU1RST1k6CisKKwkgICAgICAvKiBEZWxldGUgZm9udCAqLworCSAgICBpZiAoZGxnSW5mby0+aFVzZXJGb250KQorCSAgICB7CisJCURlbGV0ZU9iamVjdCggZGxnSW5mby0+aFVzZXJGb250ICk7CisJCWRsZ0luZm8tPmhVc2VyRm9udCA9IDA7CisJICAgIH0KKworCSAgICAgIC8qIERlbGV0ZSBtZW51ICovCisJICAgIGlmIChkbGdJbmZvLT5oTWVudSkKKwkgICAgewkJCisJCURlc3Ryb3lNZW51KCBkbGdJbmZvLT5oTWVudSApOworCQlkbGdJbmZvLT5oTWVudSA9IDA7CisJICAgIH0KKworCSAgICAgIC8qIFdpbmRvdyBjbGVhbi11cCAqLworCSAgICBEZWZXaW5kb3dQcm9jKCBod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CisJICAgIGJyZWFrOworCSAgICAKKwlkZWZhdWx0OgorCSAgICByZXR1cm4gRGVmV2luZG93UHJvYyggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworICAgIH0KKyAgICAgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2EyODAKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL2RlZnduZC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogRGVmYXVsdCB3aW5kb3cgcHJvY2VkdXJlCisgKgorICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBBbGV4YW5kcmUgSnVsbGlhcmQsIDE5OTMiOworCisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2luY2x1ZGUgPFgxMS9TaGVsbC5oPgorCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImNsYXNzLmgiCisjaW5jbHVkZSAidXNlci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERlZldpbmRvd1Byb2MgICAoVVNFUi4xMDcpCisgKi8KK0xPTkcgRGVmV2luZG93UHJvYyggSFdORCBod25kLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3sKKyAgICBXTkQgKiB3bmRQdHI7CisgICAgQ0xBU1MgKiBjbGFzc1B0cjsKKyAgICBMUFNUUiB0ZXh0UHRyOworICAgIGludCBsZW47CisgICAgCisjaWZkZWYgREVCVUdfTUVTU0FHRQorICAgIHByaW50ZiggIkRlZldpbmRvd1Byb2M6ICVkICVkICVkICUwOHhcbiIsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyNlbmRpZgorCisgICAgc3dpdGNoKG1zZykKKyAgICB7CisgICAgY2FzZSBXTV9OQ0NSRUFURToKKwl7CisJICAgIENSRUFURVNUUlVDVCAqIGNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QgKilsUGFyYW07CisJICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCSAgICBpZiAoY3JlYXRlU3RydWN0LT5scHN6TmFtZSkKKwkgICAgeworCQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB3aW5kb3cgdGV4dCAqLworCQl3bmRQdHItPmhUZXh0ID0gVVNFUl9IRUFQX0FMTE9DKEdNRU1fTU9WRUFCTEUsIAorCQkJCQlzdHJsZW4oY3JlYXRlU3RydWN0LT5scHN6TmFtZSkgKyAxKTsKKwkJdGV4dFB0ciA9IChMUFNUUilVU0VSX0hFQVBfQUREUih3bmRQdHItPmhUZXh0KTsKKwkJc3RyY3B5KHRleHRQdHIsIGNyZWF0ZVN0cnVjdC0+bHBzek5hbWUpOworCSAgICB9CisJICAgIHJldHVybiAxOworCX0KKwkKKyAgICBjYXNlIFdNX0NSRUFURToKKwlyZXR1cm4gMDsKKworICAgIGNhc2UgV01fTkNERVNUUk9ZOgorCXsKKwkgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisJICAgIGlmICh3bmRQdHItPmhUZXh0KSBVU0VSX0hFQVBfRlJFRSh3bmRQdHItPmhUZXh0KTsKKwkgICAgd25kUHRyLT5oVGV4dCA9IDA7CisJICAgIHJldHVybiAwOworCX0KKwkKKyAgICBjYXNlIFdNX1BBSU5UOgorCXsKKwkgICAgUEFJTlRTVFJVQ1QgcGFpbnRzdHJ1Y3Q7CisJICAgIEJlZ2luUGFpbnQoIGh3bmQsICZwYWludHN0cnVjdCApOworCSAgICBFbmRQYWludCggaHduZCwgJnBhaW50c3RydWN0ICk7CisJICAgIHJldHVybiAwOworCX0KKworICAgIGNhc2UgV01fQ0xPU0U6CisJRGVzdHJveVdpbmRvdyggaHduZCApOworCXJldHVybiAwOworCisgICAgY2FzZSBXTV9FUkFTRUJLR05EOgorICAgIGNhc2UgV01fSUNPTkVSQVNFQktHTkQ6CisJeworCSAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDE7CisJICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDE7CisJICAgIGlmICghY2xhc3NQdHItPndjLmhickJhY2tncm91bmQpIHJldHVybiAxOworCSAgICBGaWxsV2luZG93KCBHZXRQYXJlbnQoaHduZCksIGh3bmQsIChIREMpd1BhcmFtLAorCQkgICAgICAgIGNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kICk7CisJICAgIHJldHVybiAwOworCX0KKworICAgIGNhc2UgV01fR0VURExHQ09ERToKKwlyZXR1cm4gMDsKKworICAgIGNhc2UgV01fQ1RMQ09MT1I6CisJeworCSAgICBpZiAoSElXT1JEKGxQYXJhbSkgPT0gQ1RMQ09MT1JfU0NST0xMQkFSKQorCSAgICB7CisJCVNldEJrQ29sb3IoIChIREMpd1BhcmFtLCBSR0IoMjU1LCAyNTUsIDI1NSkgKTsKKwkJU2V0VGV4dENvbG9yKCAoSERDKXdQYXJhbSwgUkdCKDAsIDAsIDApICk7CisvKgkgICAgICAgIGhiciA9IHN5c0Nsck9iamVjdHMuaGJyU2Nyb2xsYmFyOworCQlVbnJlYWxpemVPYmplY3QoaGJyKTsgKi8KKwkJcmV0dXJuIEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCk7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCVNldEJrQ29sb3IoIChIREMpd1BhcmFtLCBHZXRTeXNDb2xvcihDT0xPUl9XSU5ET1cpICk7CisJCVNldFRleHRDb2xvciggKEhEQyl3UGFyYW0sIEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV1RFWFQpICk7CisvKgkgICAgICAgIGhiciA9IHN5c0Nsck9iamVjdHMuaGJyV2luZG93OyAqLworCQlyZXR1cm4gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOworCSAgICB9CisJfQorCQorICAgIGNhc2UgV01fR0VUVEVYVDoKKwl7CisJICAgIGlmICh3UGFyYW0pCisJICAgIHsKKwkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisJCWlmICh3bmRQdHItPmhUZXh0KQorCQl7CisJCSAgICB0ZXh0UHRyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKHduZFB0ci0+aFRleHQpOworCQkgICAgaWYgKChpbnQpd1BhcmFtID4gKGxlbiA9IHN0cmxlbih0ZXh0UHRyKSkpCisJCSAgICB7CisJCQlzdHJjcHkoKGNoYXIgKilsUGFyYW0sIHRleHRQdHIpOworCQkJcmV0dXJuIChEV09SRClsZW47CisJCSAgICB9CisJCX0KKwkgICAgICAgIGxQYXJhbSA9IChEV09SRClOVUxMOworCSAgICB9CisJICAgIHJldHVybiAoMEwpOworCX0KKworICAgIGNhc2UgV01fR0VUVEVYVExFTkdUSDoKKwl7CisJICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworCSAgICBpZiAod25kUHRyLT5oVGV4dCkKKwkgICAgeworCQl0ZXh0UHRyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKHduZFB0ci0+aFRleHQpOworCQlyZXR1cm4gKERXT1JEKXN0cmxlbih0ZXh0UHRyKTsKKwkgICAgfQorCSAgICByZXR1cm4gKDBMKTsKKwl9CisKKyAgICBjYXNlIFdNX1NFVFRFWFQ6CisJeworCSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKwkgICAgaWYgKHduZFB0ci0+aFRleHQpCisJCVVTRVJfSEVBUF9GUkVFKHduZFB0ci0+aFRleHQpOworCisJICAgIHduZFB0ci0+aFRleHQgPSBVU0VSX0hFQVBfQUxMT0MoR01FTV9NT1ZFQUJMRSwgCisJCQkJCSAgICBzdHJsZW4oKExQU1RSKWxQYXJhbSkgKyAxKTsKKwkgICAgdGV4dFB0ciA9IChMUFNUUilVU0VSX0hFQVBfQUREUih3bmRQdHItPmhUZXh0KTsKKwkgICAgc3RyY3B5KHRleHRQdHIsIChMUFNUUilsUGFyYW0pOworCSAgICBpZiAod25kUHRyLT5zaGVsbFdpZGdldCkKKwkJWHRWYVNldFZhbHVlcyggd25kUHRyLT5zaGVsbFdpZGdldCwgWHROdGl0bGUsIHRleHRQdHIsIE5VTEwgKTsKKwkgICAgcmV0dXJuICgwTCk7CisJfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGI2MmQKLS0tIC9kZXYvbnVsbAorKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC0wLDAgKzEsNjM5IEBACisvKgorICogRGlhbG9nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKK3N0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAgQWxleGFuZHJlIEp1bGxpYXJkLCAxOTkzIjsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImRpYWxvZy5oIgorI2luY2x1ZGUgIndpbi5oIgorCisKKyAgLyogRGlhbG9nIGJhc2UgdW5pdHMgKi8KK3N0YXRpYyBXT1JEIHhCYXNlVW5pdCA9IDAsIHlCYXNlVW5pdCA9IDA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRElBTE9HX0luaXQKKyAqCisgKiBJbml0aWFsaXNhdGlvbiBvZiB0aGUgZGlhbG9nIG1hbmFnZXIuCisgKi8KK0JPT0wgRElBTE9HX0luaXQoKQoreworICAgIFRFWFRNRVRSSUMgdG07CisgICAgSERDIGhkYzsKKyAgICAKKyAgICAgIC8qIENhbGN1bGF0ZSB0aGUgZGlhbG9nIGJhc2UgdW5pdHMgKi8KKworICAgIGlmICghKGhkYyA9IEdldERDKCAwICkpKSByZXR1cm4gRkFMU0U7CisgICAgR2V0VGV4dE1ldHJpY3MoIGhkYywgJnRtICk7CisgICAgUmVsZWFzZURDKCAwLCBoZGMgKTsKKyAgICB4QmFzZVVuaXQgPSB0bS50bUF2ZUNoYXJXaWR0aDsKKyAgICB5QmFzZVVuaXQgPSB0bS50bUhlaWdodDsKKyNpZmRlZiBERUJVR19ESUFMT0cKKyAgICBwcmludGYoICJESUFMT0dfSW5pdDogYmFzZSB1bml0cyA9ICVkLCVkXG4iLCB4QmFzZVVuaXQsIHlCYXNlVW5pdCApOworI2VuZGlmICAgIAorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERJQUxPR19HZXRDb250cm9sCisgKgorICogUmV0dXJuIHRoZSBjbGFzcyBhbmQgdGV4dCBvZiB0aGUgY29udHJvbCBwb2ludGVkIHRvIGJ5IHB0ciwKKyAqIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNvbnRyb2wuCisgKi8KK3N0YXRpYyBETEdDT05UUk9MSEVBREVSICogRElBTE9HX0dldENvbnRyb2woIERMR0NPTlRST0xIRUFERVIgKiBwdHIsCisJCQkJCSAgICAgY2hhciAqKiBjbGFzcywgY2hhciAqKiB0ZXh0ICkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICogcCA9ICh1bnNpZ25lZCBjaGFyICopcHRyOworICAgIHAgKz0gMTQ7ICAvKiBzaXplIG9mIGNvbnRyb2wgaGVhZGVyICovCisgICAgaWYgKCpwICYgMHg4MCkKKyAgICB7CisJc3dpdGNoKCpwKyspCisJeworCWNhc2UgMHg4MDogKmNsYXNzID0gIkJVVFRPTiI7IGJyZWFrOworCWNhc2UgMHg4MTogKmNsYXNzID0gIkVESVQiOyBicmVhazsKKwljYXNlIDB4ODI6ICpjbGFzcyA9ICJTVEFUSUMiOyBicmVhazsKKwljYXNlIDB4ODM6ICpjbGFzcyA9ICJMSVNUQk9YIjsgYnJlYWs7CisJY2FzZSAweDg0OiAqY2xhc3MgPSAiU0NST0xMQkFSIjsgYnJlYWs7CisJY2FzZSAweDg1OiAqY2xhc3MgPSAiQ09NQk9CT1giOyBicmVhazsKKwlkZWZhdWx0OiAgICpjbGFzcyA9ICIiOyBicmVhazsKKwl9CisgICAgfQorICAgIGVsc2UgCisgICAgeworCSpjbGFzcyA9IHA7CisJcCArPSBzdHJsZW4ocCkgKyAxOworICAgIH0KKyAgICAqdGV4dCA9IHA7CisgICAgcCArPSBzdHJsZW4ocCkgKyAyOworICAgIHJldHVybiAoRExHQ09OVFJPTEhFQURFUiAqKXA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRElBTE9HX1BhcnNlVGVtcGxhdGUKKyAqCisgKiBGaWxsIGEgRExHVEVNUExBVEUgc3RydWN0dXJlIGZyb20gdGhlIGRpYWxvZyB0ZW1wbGF0ZS4KKyAqLworc3RhdGljIHZvaWQgRElBTE9HX1BhcnNlVGVtcGxhdGUoIExQQ1NUUiB0ZW1wbGF0ZSwgRExHVEVNUExBVEUgKiByZXN1bHQgKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKiBwID0gKHVuc2lnbmVkIGNoYXIgKil0ZW1wbGF0ZTsKKyAKKyAgICByZXN1bHQtPmhlYWRlciA9IChETEdURU1QTEFURUhFQURFUiAqKXA7CisgICAgcCArPSAxMzsKKyAgICByZXN1bHQtPm1lbnVOYW1lID0gcDsKKyAgICBpZiAoKnAgPT0gMHhmZikgcCArPSAzOworICAgIGVsc2UgcCArPSBzdHJsZW4ocCkgKyAxOworCisgICAgaWYgKCpwKSByZXN1bHQtPmNsYXNzTmFtZSA9IHA7CisgICAgZWxzZSByZXN1bHQtPmNsYXNzTmFtZSA9IERJQUxPR19DTEFTU19OQU1FOworICAgIHAgKz0gc3RybGVuKHApICsgMTsKKworICAgIHJlc3VsdC0+Y2FwdGlvbiA9IHA7CisgICAgcCArPSBzdHJsZW4ocCkgKyAxOworCisgICAgaWYgKHJlc3VsdC0+aGVhZGVyLT5zdHlsZSAmIERTX1NFVEZPTlQpCisgICAgeworCXJlc3VsdC0+cG9pbnRTaXplID0gKihXT1JEICopcDsJcCArPSBzaXplb2YoV09SRCk7CisJcmVzdWx0LT5mYWNlTmFtZSA9IHA7ICAgICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7CisgICAgfQorICAgIHJlc3VsdC0+Y29udHJvbHMgPSBOVUxMOworICAgIGlmICghcmVzdWx0LT5oZWFkZXItPm5iSXRlbXMpIHJldHVybjsKKyAgICByZXN1bHQtPmNvbnRyb2xzID0gKERMR0NPTlRST0wgKikgbWFsbG9jKCByZXN1bHQtPmhlYWRlci0+bmJJdGVtcyAqIHNpemVvZihETEdDT05UUk9MKSApOworICAgIGlmICghcmVzdWx0LT5jb250cm9scykgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+aGVhZGVyLT5uYkl0ZW1zOyBpKyspCisgICAgeworCXJlc3VsdC0+Y29udHJvbHNbaV0uaGVhZGVyID0gKERMR0NPTlRST0xIRUFERVIgKilwOworCXAgPSAoY2hhciAqKURJQUxPR19HZXRDb250cm9sKCByZXN1bHQtPmNvbnRyb2xzW2ldLmhlYWRlciwKKwkJCQkgICAgICAmcmVzdWx0LT5jb250cm9sc1tpXS5jbGFzcywKKwkJCQkgICAgICAmcmVzdWx0LT5jb250cm9sc1tpXS50ZXh0ICk7CQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBESUFMT0dfRGlzcGxheVRlbXBsYXRlCisgKi8KKyNpZmRlZiBERUJVR19ESUFMT0cKK3N0YXRpYyB2b2lkIERJQUxPR19EaXNwbGF5VGVtcGxhdGUoIERMR1RFTVBMQVRFICogcmVzdWx0ICkKK3sKKyAgICBpbnQgaTsKKyAgICBETEdDT05UUk9MICogY3RybCA9IHJlc3VsdC0+Y29udHJvbHM7CisgICAgCisgICAgcHJpbnRmKCAiRElBTE9HICVkLCAlZCwgJWQsICVkXG4iLCByZXN1bHQtPmhlYWRlci0+eCwgcmVzdWx0LT5oZWFkZXItPnksCisJICAgIHJlc3VsdC0+aGVhZGVyLT5jeCwgcmVzdWx0LT5oZWFkZXItPmN5ICk7CisgICAgcHJpbnRmKCAiIFNUWUxFICUwOHhcbiIsIHJlc3VsdC0+aGVhZGVyLT5zdHlsZSApOworICAgIHByaW50ZiggIiBDQVBUSU9OICclcydcbiIsIHJlc3VsdC0+Y2FwdGlvbiApOworICAgIHByaW50ZiggIiBDTEFTUyAnJXMnXG4iLCByZXN1bHQtPmNsYXNzTmFtZSApOworICAgIGlmIChyZXN1bHQtPm1lbnVOYW1lWzBdID09IDB4ZmYpCisJcHJpbnRmKCAiIE1FTlUgJWRcbiIsIHJlc3VsdC0+bWVudU5hbWVbMV0gKyAyNTYqcmVzdWx0LT5tZW51TmFtZVsyXSApOworICAgIGVsc2UgcHJpbnRmKCAiIE1FTlUgJyVzJ1xuIiwgcmVzdWx0LT5tZW51TmFtZSApOworICAgIGlmIChyZXN1bHQtPmhlYWRlci0+c3R5bGUgJiBEU19TRVRGT05UKQorCXByaW50ZiggIiBGT05UICVkLCclcydcbiIsIHJlc3VsdC0+cG9pbnRTaXplLCByZXN1bHQtPmZhY2VOYW1lICk7CisKKyAgICBwcmludGYoICIgQkVHSU5cbiIgKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHQtPmhlYWRlci0+bmJJdGVtczsgaSsrLCBjdHJsKyspCisgICAgeworCXByaW50ZiggIiAgICVzICclcycgJWQsICVkLCAlZCwgJWQsICVkLCAlMDh4XG4iLAorCSAgICAgICAgY3RybC0+Y2xhc3MsIGN0cmwtPnRleHQsIGN0cmwtPmhlYWRlci0+aWQsCisJICAgICAgICBjdHJsLT5oZWFkZXItPngsIGN0cmwtPmhlYWRlci0+eSwgY3RybC0+aGVhZGVyLT5jeCwKKwkgICAgICAgIGN0cmwtPmhlYWRlci0+Y3ksIGN0cmwtPmhlYWRlci0+c3R5bGUgKTsKKyAgICB9CisgICAgCisgICAgcHJpbnRmKCAiIEVORFxuIiApOworfQorI2VuZGlmICAvKiBERUJVR19ESUFMT0cgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVEaWFsb2cgICAoVVNFUi44OSkKKyAqLworSFdORCBDcmVhdGVEaWFsb2coIEhJTlNUQU5DRSBoSW5zdCwgTFBDU1RSIGRsZ1RlbXBsYXRlLAorCQkgICBIV05EIG93bmVyLCBGQVJQUk9DIGRsZ1Byb2MgKQoreworICAgIHJldHVybiBDcmVhdGVEaWFsb2dQYXJhbSggaEluc3QsIGRsZ1RlbXBsYXRlLCBvd25lciwgZGxnUHJvYywgMCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZURpYWxvZ1BhcmFtICAgKFVTRVIuMjQxKQorICovCitIV05EIENyZWF0ZURpYWxvZ1BhcmFtKCBISU5TVEFOQ0UgaEluc3QsIExQQ1NUUiBkbGdUZW1wbGF0ZSwKKwkJICAgICAgICBIV05EIG93bmVyLCBGQVJQUk9DIGRsZ1Byb2MsIExQQVJBTSBwYXJhbSApCit7CisgICAgSFdORCBod25kID0gMDsKKyAgICBIQU5ETEUgaHJlcywgaG1lbTsKKyAgICBMUENTVFIgZGF0YTsKKyAgICBpbnQgc2l6ZTsKKworI2lmZGVmIERFQlVHX0RJQUxPRworICAgIHByaW50ZiggIkNyZWF0ZURpYWxvZ1BhcmFtOiAlZCwnJXMnLCVkLCVwLCVkXG4iLAorCSAgICBoSW5zdCwgZGxnVGVtcGxhdGUsIG93bmVyLCBkbGdQcm9jLCBwYXJhbSApOworI2VuZGlmCisgICAgCisjaWYgMAorICAgIGlmICghKGhyZXMgPSBGaW5kUmVzb3VyY2UoIGhJbnN0LCBkbGdUZW1wbGF0ZSwgUlRfRElBTE9HICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShobWVtID0gTG9hZFJlc291cmNlKCBoSW5zdCwgaHJlcyApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoZGF0YSA9IExvY2tSZXNvdXJjZSggaG1lbSApKSkgaHduZCA9IDA7CisgICAgZWxzZSBod25kID0gQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbShoSW5zdCwgZGF0YSwgb3duZXIsIGRsZ1Byb2MsIHBhcmFtKTsKKyAgICBGcmVlUmVzb3VyY2UoIGhtZW0gKTsKKyNlbHNlCisgICAgaG1lbSA9IFJTQ19Mb2FkUmVzb3VyY2UoIGhJbnN0LCBkbGdUZW1wbGF0ZSwgMHg4MDA1LCAmc2l6ZSApOworICAgIGRhdGEgPSAoTFBDU1RSKSBHbG9iYWxMb2NrKCBobWVtICk7CisgICAgaHduZCA9IENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0oIGhJbnN0LCBkYXRhLCBvd25lciwgZGxnUHJvYywgcGFyYW0gKTsKKyAgICBHbG9iYWxGcmVlKCBobWVtICk7CisjZW5kaWYKKyAgICByZXR1cm4gaHduZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVEaWFsb2dJbmRpcmVjdCAgIChVU0VSLjIxOSkKKyAqLworSFdORCBDcmVhdGVEaWFsb2dJbmRpcmVjdCggSElOU1RBTkNFIGhJbnN0LCBMUENTVFIgZGxnVGVtcGxhdGUsCisJCQkgICBIV05EIG93bmVyLCBGQVJQUk9DIGRsZ1Byb2MgKQoreworICAgIHJldHVybiBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtKCBoSW5zdCwgZGxnVGVtcGxhdGUsIG93bmVyLCBkbGdQcm9jLCAwICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbSAgIChVU0VSLjI0MikKKyAqLworSFdORCBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtKCBISU5TVEFOQ0UgaEluc3QsIExQQ1NUUiBkbGdUZW1wbGF0ZSwKKwkJCSAgICAgICAgSFdORCBvd25lciwgRkFSUFJPQyBkbGdQcm9jLCBMUEFSQU0gcGFyYW0gKQoreworICAgIEhNRU5VIGhNZW51ID0gMDsKKyAgICBIRk9OVCBoRm9udCA9IDA7CisgICAgSFdORCBod25kOworICAgIFdORCAqIHduZFB0cjsKKyAgICBETEdURU1QTEFURSB0ZW1wbGF0ZTsKKyAgICBESUFMT0dJTkZPICogZGxnSW5mbzsKKyAgICBXT1JEIHhVbml0ID0geEJhc2VVbml0OworICAgIFdPUkQgeVVuaXQgPSB5QmFzZVVuaXQ7CisgICAgCisgICAgaWYgKCFkbGdUZW1wbGF0ZSkgcmV0dXJuIDA7CisgICAgRElBTE9HX1BhcnNlVGVtcGxhdGUoIGRsZ1RlbXBsYXRlLCAmdGVtcGxhdGUgKTsKKworI2lmZGVmIERFQlVHX0RJQUxPRworICAgIERJQUxPR19EaXNwbGF5VGVtcGxhdGUoICZ0ZW1wbGF0ZSApOworI2VuZGlmICAgIAorCisgICAgICAvKiBMb2FkIG1lbnUgKi8KKworICAgIGlmICh0ZW1wbGF0ZS5tZW51TmFtZVswXSkKKyAgICB7CisJaWYgKHRlbXBsYXRlLm1lbnVOYW1lWzBdICE9IDB4ZmYpIAorCSAgICBoTWVudSA9IExvYWRNZW51KCBoSW5zdCwgdGVtcGxhdGUubWVudU5hbWUgKTsKKwllbHNlCisJICAgIGhNZW51ID0gTG9hZE1lbnUoIGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoIHRlbXBsYXRlLm1lbnVOYW1lWzFdICsKKwkJCQkJCSAgIDI1Nip0ZW1wbGF0ZS5tZW51TmFtZVsyXSApKTsKKyAgICB9CisKKyAgICAgIC8qIENyZWF0ZSBjdXN0b20gZm9udCBpZiBuZWVkZWQgKi8KKworICAgIGlmICh0ZW1wbGF0ZS5oZWFkZXItPnN0eWxlICYgRFNfU0VURk9OVCkKKyAgICB7CisJaEZvbnQgPSBDcmVhdGVGb250KCB0ZW1wbGF0ZS5wb2ludFNpemUsIDAsIDAsIDAsIEZXX0RPTlRDQVJFLAorCQkJICAgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIERFRkFVTFRfQ0hBUlNFVCwgMCwgMCwKKwkJCSAgICBERUZBVUxUX1FVQUxJVFksIEZGX0RPTlRDQVJFLCB0ZW1wbGF0ZS5mYWNlTmFtZSApOworCWlmIChoRm9udCkKKwl7CisJICAgIFRFWFRNRVRSSUMgdG07CisJICAgIEhGT05UIG9sZEZvbnQ7CisJICAgIEhEQyBoZGM7CisKKwkgICAgaGRjID0gR2V0REMoIDAgKTsKKwkgICAgb2xkRm9udCA9IFNlbGVjdE9iamVjdCggaGRjLCBoRm9udCApOworCSAgICBHZXRUZXh0TWV0cmljcyggaGRjLCAmdG0gKTsKKwkgICAgU2VsZWN0T2JqZWN0KCBoZGMsIG9sZEZvbnQgKTsKKwkgICAgUmVsZWFzZURDKCAwLCBoZGMgKTsKKwkgICAgeFVuaXQgPSB0bS50bUF2ZUNoYXJXaWR0aDsKKwkgICAgeVVuaXQgPSB0bS50bUhlaWdodDsKKwl9CisgICAgfQorCisgICAgICAvKiBDcmVhdGUgZGlhbG9nIG1haW4gd2luZG93ICovCisKKyAgICBod25kID0gQ3JlYXRlV2luZG93KCB0ZW1wbGF0ZS5jbGFzc05hbWUsIHRlbXBsYXRlLmNhcHRpb24sCisJCQkgdGVtcGxhdGUuaGVhZGVyLT5zdHlsZSAmIH5XU19WSVNJQkxFLAorCQkJIHRlbXBsYXRlLmhlYWRlci0+eCAqIHhVbml0IC8gNCwKKwkJCSB0ZW1wbGF0ZS5oZWFkZXItPnkgKiB5VW5pdCAvIDgsCisJCQkgdGVtcGxhdGUuaGVhZGVyLT5jeCAqIHhVbml0IC8gNCwKKwkJCSB0ZW1wbGF0ZS5oZWFkZXItPmN5ICogeVVuaXQgLyA4LAorCQkJIG93bmVyLCBoTWVudSwgaEluc3QsCisJCQkgTlVMTCApOworICAgIGlmICghaHduZCkKKyAgICB7CisJaWYgKGhGb250KSBEZWxldGVPYmplY3QoIGhGb250ICk7CisJaWYgKGhNZW51KSBEZXN0cm95TWVudSggaE1lbnUgKTsKKwlpZiAodGVtcGxhdGUuY29udHJvbHMpIGZyZWUoIHRlbXBsYXRlLmNvbnRyb2xzICk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgICAvKiBDcmVhdGUgY29udHJvbCB3aW5kb3dzICovCisKKyAgICBpZiAoaHduZCAmJiB0ZW1wbGF0ZS5oZWFkZXItPm5iSXRlbXMpCisgICAgeworCWludCBpOworCURMR0NPTlRST0wgKiBjdHJsID0gdGVtcGxhdGUuY29udHJvbHM7CisJZm9yIChpID0gMDsgaSA8IHRlbXBsYXRlLmhlYWRlci0+bmJJdGVtczsgaSsrLCBjdHJsKyspCisJeworCSAgICBDcmVhdGVXaW5kb3dFeCggV1NfRVhfTk9QQVJFTlROT1RJRlksIAorCQkJICAgIGN0cmwtPmNsYXNzLCBjdHJsLT50ZXh0LCBjdHJsLT5oZWFkZXItPnN0eWxlLAorCQkJICAgIGN0cmwtPmhlYWRlci0+eCAqIHhVbml0IC8gNCwKKwkJCSAgICBjdHJsLT5oZWFkZXItPnkgKiB5VW5pdCAvIDgsCisJCQkgICAgY3RybC0+aGVhZGVyLT5jeCAqIHhVbml0IC8gNCwKKwkJCSAgICBjdHJsLT5oZWFkZXItPmN5ICogeVVuaXQgLyA4LAorCQkJICAgIGh3bmQsIGN0cmwtPmhlYWRlci0+aWQsIGhJbnN0LCBOVUxMICk7CisJfQorICAgIH0KKyAgICAKKyAgICAgIC8qIEluaXRpYWxpc2UgZGlhbG9nIGV4dHJhIGRhdGEgKi8KKworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7CisgICAgZGxnSW5mby0+ZGxnUHJvYyAgID0gZGxnUHJvYzsKKyAgICBkbGdJbmZvLT5oVXNlckZvbnQgPSBoRm9udDsKKyAgICBkbGdJbmZvLT5oTWVudSAgICAgPSBoTWVudTsKKyAgICBkbGdJbmZvLT54QmFzZVVuaXQgPSB4VW5pdDsKKyAgICBkbGdJbmZvLT55QmFzZVVuaXQgPSB5VW5pdDsKKyAgICBkbGdJbmZvLT5od25kRm9jdXMgPSBHZXROZXh0RGxnVGFiSXRlbSggaHduZCwKKwkJCSAgICBHZXRXaW5kb3cod25kUHRyLT5od25kQ2hpbGQsIEdXX0hXTkRMQVNUKSwgRkFMU0UgKTsKKworICAgICAgLyogU2VuZCBpbml0aWFsaXNhdGlvbiBtZXNzYWdlcyBhbmQgc2V0IGZvY3VzICovCisKKyAgICBpZiAoZGxnSW5mby0+aFVzZXJGb250KSAKKwlTZW5kTWVzc2FnZSggaHduZCwgV01fU0VURk9OVCwgZGxnSW5mby0+aFVzZXJGb250LCAwKTsKKyAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVERJQUxPRywgZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApOworICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVERJQUxPRywgZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQorCVNldEZvY3VzKCBkbGdJbmZvLT5od25kRm9jdXMgKTsKKworICAgICAgLyogRGlzcGxheSBkaWFsb2cgKi8KKworICAgIGlmICh0ZW1wbGF0ZS5oZWFkZXItPnN0eWxlICYgV1NfVklTSUJMRSkgU2hvd1dpbmRvdyggaHduZCwgU1dfU0hPVyApOworICAgIAorICAgIGlmICh0ZW1wbGF0ZS5jb250cm9scykgZnJlZSggdGVtcGxhdGUuY29udHJvbHMgKTsKKyAgICByZXR1cm4gaHduZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEaWFsb2dCb3ggICAoVVNFUi44NykKKyAqLworaW50IERpYWxvZ0JveCggSElOU1RBTkNFIGhJbnN0LCBMUENTVFIgZGxnVGVtcGxhdGUsCisJICAgICAgIEhXTkQgb3duZXIsIEZBUlBST0MgZGxnUHJvYyApCit7CisgICAgSFdORCBod25kOworICAgIFdORCAqIHduZFB0cjsKKyAgICBESUFMT0dJTkZPICogZGxnSW5mbzsKKyAgICBNU0cgbXNnOworICAgIGludCByZXR2YWw7CisKKyNpZmRlZiBERUJVR19ESUFMT0cKKyAgICBwcmludGYoICJEaWFsb2dCb3g6ICVkLCclcycsJWQsJXBcbiIsIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIGRsZ1Byb2MgKTsKKyNlbmRpZgorCisgICAgaHduZCA9IENyZWF0ZURpYWxvZyggaEluc3QsIGRsZ1RlbXBsYXRlLCBvd25lciwgZGxnUHJvYyApOworICAgIGlmICghaHduZCkgcmV0dXJuIC0xOworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7CisgICAgd2hpbGUgKEdldE1lc3NhZ2UgKCZtc2csIDAsIDAsIDApKQorICAgIHsKKwlpZiAoIUlzRGlhbG9nTWVzc2FnZSggaHduZCwgJm1zZykpCisJeworCSAgICBUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOworCSAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisJfQorCWlmIChkbGdJbmZvLT5mRW5kKSBicmVhazsKKyAgICB9CisgICAgcmV0dmFsID0gZGxnSW5mby0+bXNnUmVzdWx0OworICAgIERlc3Ryb3lXaW5kb3coIGh3bmQgKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVuZERpYWxvZyAgIChVU0VSLjg4KQorICovCit2b2lkIEVuZERpYWxvZyggSFdORCBod25kLCBzaG9ydCByZXR2YWwgKQoreworICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgRElBTE9HSU5GTyAqIGRsZ0luZm8gPSAoRElBTE9HSU5GTyAqKXduZFB0ci0+d0V4dHJhOworICAgIGRsZ0luZm8tPm1zZ1Jlc3VsdCA9IHJldHZhbDsKKyAgICBkbGdJbmZvLT5mRW5kID0gVFJVRTsKKyNpZmRlZiBERUJVR19ESUFMT0cKKyAgICBwcmludGYoICJFbmREaWFsb2c6ICVkICVkXG4iLCBod25kLCByZXR2YWwgKTsKKyNlbmRpZiAgICAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc0RpYWxvZ01lc3NhZ2UgICAoVVNFUi45MCkKKyAqLworQk9PTCBJc0RpYWxvZ01lc3NhZ2UoIEhXTkQgaHduZERsZywgTFBNU0cgbXNnICkKK3sKKyAgICBXTkQgKiB3bmRQdHI7CisgICAgCisgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmREbGcgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoKGh3bmREbGcgIT0gbXNnLT5od25kKSAmJiAhSXNDaGlsZCggaHduZERsZywgbXNnLT5od25kICkpIHJldHVybiBGQUxTRTsKKworICAgIGlmIChtc2ctPm1lc3NhZ2UgIT0gV01fS0VZRE9XTikKKyAgICB7CisJU2VuZE1lc3NhZ2UoIG1zZy0+aHduZCwgbXNnLT5tZXNzYWdlLCBtc2ctPndQYXJhbSwgbXNnLT5sUGFyYW0gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpbnQgZGxnQ29kZSA9IFNlbmRNZXNzYWdlKCBtc2ctPmh3bmQsIFdNX0dFVERMR0NPREUsIDAsIDAgKTsKKwkvKiBQcm9jZXNzIGtleSBtZXNzYWdlICovCisJLyogLi4uLiAqLworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXREbGdDdHJsSUQgICAgICAgICAgIChVU0VSLjI3NykKKyAqLworaW50IEdldERsZ0N0cmxJRCggSFdORCBod25kICkKK3sKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIGlmICh3bmRQdHIpIHJldHVybiB3bmRQdHItPndJRG1lbnU7CisgICAgZWxzZSByZXR1cm4gMDsKK30KKyAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RGxnSXRlbSAgIChVU0VSLjkxKQorICovCitIV05EIEdldERsZ0l0ZW0oIEhXTkQgaHduZERsZywgV09SRCBpZCApCit7CisgICAgSFdORCBjdXJDaGlsZDsKKyAgICBXTkQgKiBjaGlsZFB0cjsKKyAgICBXTkQgKiB3bmRQdHI7CisKKyAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZERsZyApKSkgcmV0dXJuIDA7CisgICAgY3VyQ2hpbGQgPSB3bmRQdHItPmh3bmRDaGlsZDsKKyAgICB3aGlsZShjdXJDaGlsZCkKKyAgICB7CisJY2hpbGRQdHIgPSBXSU5fRmluZFduZFB0ciggY3VyQ2hpbGQgKTsKKwlpZiAoY2hpbGRQdHItPndJRG1lbnUgPT0gaWQpIHJldHVybiBjdXJDaGlsZDsKKwljdXJDaGlsZCA9IGNoaWxkUHRyLT5od25kTmV4dDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UgICAoVVNFUi4xMDEpCisgKi8KK0xPTkcgU2VuZERsZ0l0ZW1NZXNzYWdlKEhXTkQgaHduZCwgV09SRCBpZCwgVUlOVCBtc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgICBIV05EIGh3bmRDdHJsID0gR2V0RGxnSXRlbSggaHduZCwgaWQgKTsKKyAgICBpZiAoaHduZEN0cmwpIHJldHVybiBTZW5kTWVzc2FnZSggaHduZEN0cmwsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICBlbHNlIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0RGxnSXRlbVRleHQgICAoVVNFUi45MikKKyAqLwordm9pZCBTZXREbGdJdGVtVGV4dCggSFdORCBod25kLCBXT1JEIGlkLCBMUFNUUiBscFN0cmluZyApCit7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKCBod25kLCBpZCwgV01fU0VUVEVYVCwgMCwgKERXT1JEKWxwU3RyaW5nICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RGxnSXRlbVRleHQgICAoVVNFUi45MykKKyAqLworaW50IEdldERsZ0l0ZW1UZXh0KCBIV05EIGh3bmQsIFdPUkQgaWQsIExQU1RSIHN0ciwgV09SRCBtYXggKQoreworICAgIHJldHVybiAoaW50KVNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX0dFVFRFWFQsIG1heCwgKERXT1JEKXN0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0RGxnSXRlbUludCAgIChVU0VSLjk0KQorICovCit2b2lkIFNldERsZ0l0ZW1JbnQoIEhXTkQgaHduZCwgV09SRCBpZCwgV09SRCB2YWx1ZSwgQk9PTCBmU2lnbmVkICkKK3sKKyAgICBIQU5ETEUgaFRleHQgPSBMb2NhbEFsbG9jKCBMTUVNX01PVkVBQkxFLCAxMCApOworICAgIGNoYXIgKiBzdHIgPSAoY2hhciAqKSBMb2NhbExvY2soIGhUZXh0ICk7CisKKyAgICBpZiAoZlNpZ25lZCkgc3ByaW50Ziggc3RyLCAiJWQiLCB2YWx1ZSApOworICAgIGVsc2Ugc3ByaW50Ziggc3RyLCAiJXUiLCB2YWx1ZSApOworICAgIFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX1NFVFRFWFQsIDAsIChEV09SRClzdHIgKTsKKyAgICBMb2NhbFVubG9jayggaFRleHQgKTsKKyAgICBMb2NhbEZyZWUoIGhUZXh0ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RGxnSXRlbUludCAgIChVU0VSLjk1KQorICovCitXT1JEIEdldERsZ0l0ZW1JbnQoIEhXTkQgaHduZCwgV09SRCBpZCwgQk9PTCAqIHRyYW5zbGF0ZWQsIEJPT0wgZlNpZ25lZCApCit7CisgICAgaW50IGxlbjsKKyAgICBIQU5ETEUgaFRleHQ7CisgICAgbG9uZyByZXN1bHQ7CisgICAgY2hhciAqIHN0cjsKKyAgICAKKyAgICBpZiAodHJhbnNsYXRlZCkgKnRyYW5zbGF0ZWQgPSBGQUxTRTsKKyAgICBpZiAoIShsZW4gPSBTZW5kRGxnSXRlbU1lc3NhZ2UoIGh3bmQsIGlkLCBXTV9HRVRURVhUTEVOR1RILCAwLCAwICkpKQorCXJldHVybiAwOworICAgIGlmICghKGhUZXh0ID0gTG9jYWxBbGxvYyhMTUVNX01PVkVBQkxFLCBsZW4rMSApKSkKKwlyZXR1cm4gMDsKKyAgICBzdHIgPSAoY2hhciAqKSBMb2NhbExvY2soIGhUZXh0ICk7CisgICAgaWYgKFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX0dFVFRFWFQsIGxlbisxLCAoRFdPUkQpc3RyICkpCisgICAgeworCWNoYXIgKiBlbmRwdHI7CisJcmVzdWx0ID0gc3RydG9sKCBzdHIsICZlbmRwdHIsIDEwICk7CisJaWYgKGVuZHB0ciAmJiAoZW5kcHRyICE9IHN0cikpICAvKiBDb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsICovCisJeworCSAgICBpZiAoZlNpZ25lZCkKKwkgICAgeworCQlpZiAoKHJlc3VsdCA8IC0zMjc2NykgfHwgKHJlc3VsdCA+IDMyNzY3KSkgcmVzdWx0ID0gMDsKKwkJZWxzZSBpZiAodHJhbnNsYXRlZCkgKnRyYW5zbGF0ZWQgPSBUUlVFOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlpZiAoKHJlc3VsdCA8IDApIHx8IChyZXN1bHQgPiA2NTUzNSkpIHJlc3VsdCA9IDA7CisJCWVsc2UgaWYgKHRyYW5zbGF0ZWQpICp0cmFuc2xhdGVkID0gVFJVRTsKKwkgICAgfQorCX0KKyAgICB9CisgICAgTG9jYWxVbmxvY2soIGhUZXh0ICk7CisgICAgTG9jYWxGcmVlKCBoVGV4dCApOworICAgIHJldHVybiAoV09SRClyZXN1bHQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ2hlY2tEbGdCdXR0b24gICAoVVNFUi45NykKKyAqLwordm9pZCBDaGVja0RsZ0J1dHRvbiggSFdORCBod25kLCBXT1JEIGlkLCBXT1JEIGNoZWNrICkKK3sKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoIGh3bmQsIGlkLCBCTV9TRVRDSEVDSywgY2hlY2ssIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc0RsZ0J1dHRvbkNoZWNrZWQgICAoVVNFUi45OCkKKyAqLworV09SRCBJc0RsZ0J1dHRvbkNoZWNrZWQoIEhXTkQgaHduZCwgV09SRCBpZCApCit7CisgICAgcmV0dXJuIChXT1JEKVNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIEJNX0dFVENIRUNLLCAwLCAwICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ2hlY2tSYWRpb0J1dHRvbiAgIChVU0VSLjk2KQorICovCit2b2lkIENoZWNrUmFkaW9CdXR0b24oIEhXTkQgaHduZERsZywgV09SRCBmaXJzdElELCBXT1JEIGxhc3RJRCwgV09SRCBjaGVja0lEICkKK3sKKyAgICBIV05EIGJ1dHRvbiA9IEdldERsZ0l0ZW0oIGh3bmREbGcsIGZpcnN0SUQgKTsKKyAgICB3aGlsZSAoYnV0dG9uICE9IDApCisgICAgeworCVdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBidXR0b24gKTsKKwlpZiAoIXduZFB0cikgYnJlYWs7CisJU2VuZE1lc3NhZ2UoIGJ1dHRvbiwgQk1fU0VUQ0hFQ0ssICh3bmRQdHItPndJRG1lbnUgPT0gY2hlY2tJRCksIDAgKTsKKyAgICAgICAgaWYgKHduZFB0ci0+d0lEbWVudSA9PSBsYXN0SUQpIGJyZWFrOworCWJ1dHRvbiA9IHduZFB0ci0+aHduZE5leHQ7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldERpYWxvZ0Jhc2VVbml0cyAgIChVU0VSLjI0MykKKyAqLworRFdPUkQgR2V0RGlhbG9nQmFzZVVuaXRzKCkKK3sKKyAgICByZXR1cm4gTUFLRUxPTkcoIHhCYXNlVW5pdCwgeUJhc2VVbml0ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTWFwRGlhbG9nUmVjdCAgIChVU0VSLjEwMykKKyAqLwordm9pZCBNYXBEaWFsb2dSZWN0KCBIV05EIGh3bmQsIExQUkVDVCByZWN0ICkKK3sKKyAgICBESUFMT0dJTkZPICogZGxnSW5mbzsKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGlmICghd25kUHRyKSByZXR1cm47CisgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7CisgICAgcmVjdC0+bGVmdCAgID0gKHJlY3QtPmxlZnQgKiBkbGdJbmZvLT54QmFzZVVuaXQpIC8gNDsKKyAgICByZWN0LT5yaWdodCAgPSAocmVjdC0+cmlnaHQgKiBkbGdJbmZvLT54QmFzZVVuaXQpIC8gNDsKKyAgICByZWN0LT50b3AgICAgPSAocmVjdC0+dG9wICogZGxnSW5mby0+eUJhc2VVbml0KSAvIDg7CisgICAgcmVjdC0+Ym90dG9tID0gKHJlY3QtPmJvdHRvbSAqIGRsZ0luZm8tPnlCYXNlVW5pdCkgLyA4OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldE5leHREbGdHcm91cEl0ZW0gICAoVVNFUi4yMjcpCisgKi8KK0hXTkQgR2V0TmV4dERsZ0dyb3VwSXRlbSggSFdORCBod25kRGxnLCBIV05EIGh3bmRDdHJsLCBCT09MIGZQcmV2aW91cyApCit7CisgICAgSFdORCBod25kLCBod25kTGFzdDsKKyAgICBXTkQgKiBkbGdQdHIsICogY3RybFB0ciwgKiB3bmRQdHI7CisKKyAgICBpZiAoIShkbGdQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZERsZyApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoY3RybFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kQ3RybCApKSkgcmV0dXJuIDA7CisgICAgaWYgKGN0cmxQdHItPmh3bmRQYXJlbnQgIT0gaHduZERsZykgcmV0dXJuIDA7CisKKyAgICBod25kTGFzdCA9IGh3bmRDdHJsOworICAgIGh3bmQgPSBjdHJsUHRyLT5od25kTmV4dDsKKyAgICB3aGlsZSAoMSkKKyAgICB7CisJaWYgKCFod25kKSBod25kID0gZGxnUHRyLT5od25kQ2hpbGQ7CisJaWYgKGh3bmQgPT0gaHduZEN0cmwpIGJyZWFrOworCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1RBQlNUT1ApCisJeworCSAgICBod25kTGFzdCA9IGh3bmQ7CisJICAgIGlmICghZlByZXZpb3VzKSBicmVhazsKKwl9CisJaHduZCA9IHduZFB0ci0+aHduZE5leHQ7CisgICAgfQorICAgIHJldHVybiBod25kTGFzdDsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXROZXh0RGxnVGFiSXRlbSAgIChVU0VSLjIyOCkKKyAqLworSFdORCBHZXROZXh0RGxnVGFiSXRlbSggSFdORCBod25kRGxnLCBIV05EIGh3bmRDdHJsLCBCT09MIGZQcmV2aW91cyApCit7CisgICAgSFdORCBod25kLCBod25kTGFzdDsKKyAgICBXTkQgKiBkbGdQdHIsICogY3RybFB0ciwgKiB3bmRQdHI7CisKKyAgICBpZiAoIShkbGdQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZERsZyApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoY3RybFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kQ3RybCApKSkgcmV0dXJuIDA7CisgICAgaWYgKGN0cmxQdHItPmh3bmRQYXJlbnQgIT0gaHduZERsZykgcmV0dXJuIDA7CisKKyAgICBod25kTGFzdCA9IGh3bmRDdHJsOworICAgIGh3bmQgPSBjdHJsUHRyLT5od25kTmV4dDsKKyAgICB3aGlsZSAoMSkKKyAgICB7CisJaWYgKCFod25kKSBod25kID0gZGxnUHRyLT5od25kQ2hpbGQ7CisJaWYgKGh3bmQgPT0gaHduZEN0cmwpIGJyZWFrOworCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1RBQlNUT1ApCisJeworCSAgICBod25kTGFzdCA9IGh3bmQ7CisJICAgIGlmICghZlByZXZpb3VzKSBicmVhazsKKwl9CisJaHduZCA9IHduZFB0ci0+aHduZE5leHQ7CisgICAgfQorICAgIHJldHVybiBod25kTGFzdDsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCAxMzhmMDU3Li5mOWM1ZTIxIDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC0yNSwxMCArMjUsMTMgQEAKIHN0YXRpYyB2b2lkIEVWRU5UX21vdXNlX21vdGlvbigpOwogc3RhdGljIHZvaWQgRVZFTlRfbW91c2VfYnV0dG9uKCk7CiBzdGF0aWMgdm9pZCBFVkVOVF9zdHJ1Y3R1cmUoKTsKK3N0YXRpYyB2b2lkIEVWRU5UX2ZvY3VzX2NoYW5nZSgpOwogCiAgIC8qIFN0YXRlIHZhcmlhYmxlcyAqLwogc3RhdGljIEhXTkQgY2FwdHVyZVduZCA9IDA7CiAKK2V4dGVybiBIV05EIGhXbmRGb2N1czsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRVZFTlRfQWRkSGFuZGxlcnMKICAqCkBAIC00Niw2ICs0OSw4IEBACiAJCSAgICAgIEVWRU5UX21vdXNlX2J1dHRvbiwgKFh0UG9pbnRlcilod25kICk7CiAgICAgWHRBZGRFdmVudEhhbmRsZXIodywgU3RydWN0dXJlTm90aWZ5TWFzaywgRkFMU0UsCiAJCSAgICAgIEVWRU5UX3N0cnVjdHVyZSwgKFh0UG9pbnRlcilod25kICk7CisgICAgWHRBZGRFdmVudEhhbmRsZXIodywgRm9jdXNDaGFuZ2VNYXNrLCBGQUxTRSwKKwkJICAgICAgRVZFTlRfZm9jdXNfY2hhbmdlLCAoWHRQb2ludGVyKWh3bmQgKTsKIH0KIAogCkBAIC02Niw2ICs3MSw4IEBACiAJCQkgRVZFTlRfbW91c2VfYnV0dG9uLCAoWHRQb2ludGVyKWh3bmQgKTsKICAgICBYdFJlbW92ZUV2ZW50SGFuZGxlcih3LCBTdHJ1Y3R1cmVOb3RpZnlNYXNrLCBGQUxTRSwKIAkJCSBFVkVOVF9zdHJ1Y3R1cmUsIChYdFBvaW50ZXIpaHduZCApOworICAgIFh0UmVtb3ZlRXZlbnRIYW5kbGVyKHcsIEZvY3VzQ2hhbmdlTWFzaywgRkFMU0UsCisJCQkgRVZFTlRfZm9jdXNfY2hhbmdlLCAoWHRQb2ludGVyKWh3bmQgKTsKIH0KIAogCkBAIC0xMTUsMTAgKzEyMiwxOCBAQAogCQkgICAgICAgQm9vbGVhbiAqY29udF9kaXNwYXRjaCApCiB7CiAgICAgTVNHIG1zZzsKLSAgICAKKworICAgIGNoYXIgU3RyWzI0XTsgCisgICAgWENvbXBvc2VTdGF0dXMgY3M7IAorICAgIEtleVN5bSBrZXk7CisgICAgaW50IGNvdW50ID0gWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCAxLCAma2V5LCAmY3MpOworICAgIFN0cltjb3VudF0gPSAnXDAnOworI2lmZGVmIERFQlVHX0tFWQorICAgIHByaW50ZigiV01fS0VZPz8/IDogY291bnQ9JXUgLyAlWCAvICclcydcbiIsY291bnQsIFN0clswXSwgU3RyKTsKKyNlbmRpZiAgICAKICAgICBtc2cuaHduZCAgICA9IGh3bmQ7CiAgICAgbXNnLm1lc3NhZ2UgPSAoZXZlbnQtPnR5cGUgPT0gS2V5UmVsZWFzZSkgPyBXTV9LRVlVUCA6IFdNX0tFWURPV047Ci0gICAgbXNnLndQYXJhbSAgPSAwOworICAgIG1zZy53UGFyYW0gID0gU3RyWzBdOwogICAgIG1zZy5sUGFyYW0gID0gKGV2ZW50LT54ICYgMHhmZmZmKSB8IChldmVudC0+eSA8PCAxNik7CiAgICAgbXNnLnRpbWUgPSBldmVudC0+dGltZTsKICAgICBtc2cucHQueCA9IGV2ZW50LT54ICYgMHhmZmZmOwpAQCAtMjMxLDYgKzI0Niw0NyBAQAogICAgIH0gICAgCiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBFVkVOVF9mb2N1c19jaGFuZ2UKKyAqCisgKiBIYW5kbGUgYW4gWCBGb2N1c0NoYW5nZSBldmVudAorICovCitzdGF0aWMgdm9pZCBFVkVOVF9mb2N1c19jaGFuZ2UoIFdpZGdldCB3LCBpbnQgaHduZCwgWEV2ZW50ICpldmVudCwgCisJCQkgICAgICAgQm9vbGVhbiAqY29udF9kaXNwYXRjaCApCit7CisgICAgTVNHIG1zZzsKKyAgICAKKyAgICBtc2cuaHduZCA9IGh3bmQ7CisgICAgbXNnLnRpbWUgPSBHZXRUaWNrQ291bnQoKTsKKyAgICBtc2cucHQueCA9IDA7CisgICAgbXNnLnB0LnkgPSAwOworCisgICAgc3dpdGNoKGV2ZW50LT50eXBlKQorICAgIHsKKyAgICAgIGNhc2UgRm9jdXNJbjoKKwl7CisJICAgIG1zZy5tZXNzYWdlID0gV01fU0VURk9DVVM7CisJICAgIG1zZy53UGFyYW0gPSBod25kOworCSAgICBoV25kRm9jdXMgPSBod25kOworCisJfQorCWJyZWFrOworCQorICAgICAgY2FzZSBGb2N1c091dDoKKwl7CisJICAgIGlmIChoV25kRm9jdXMpCisJICAgIHsKKwkJbXNnLm1lc3NhZ2UgPSBXTV9LSUxMRk9DVVM7CisJCW1zZy53UGFyYW0gPSBod25kOworCQloV25kRm9jdXMgPSAwOworCSAgICB9CisJfQorICAgIH0gICAgCisgICAgTVNHX0FkZE1zZyggJm1zZyApOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJU2V0Q2FwdHVyZSAJKFVTRVIuMTgpCiAgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZm9jdXMuYyBiL3dpbmRvd3MvZm9jdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTFhOTFhMgotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3MvZm9jdXMuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogRm9jdXMgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMgRGF2aWQgTWV0Y2FsZmUKKyAqLworCitzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIERhdmlkIE1ldGNhbGZlLCAxOTkzIjsKKworI2luY2x1ZGUgPFgxMS9JbnRyaW5zaWMuaD4KKyNpbmNsdWRlIDxYMTEvU3RyaW5nRGVmcy5oPgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImdkaS5oIgorCitIV05EIGhXbmRGb2N1cyA9IDA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIFNldEZvY3VzICAgICAgICAgICAgKFVTRVIuMjIpCisgKi8KKworSFdORCBTZXRGb2N1cyhIV05EIGh3bmQpCit7CisgICAgSFdORCBoV25kUHJldkZvY3VzOworICAgIFdORCAqd25kUHRyOworCisgICAgaFduZFByZXZGb2N1cyA9IGhXbmRGb2N1czsKKworICAgIGlmIChod25kID09IDApCisgICAgeworCVhTZXRJbnB1dEZvY3VzKFhUX2Rpc3BsYXksIE5vbmUsIFJldmVydFRvUG9pbnRlclJvb3QsIEN1cnJlbnRUaW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKwlYU2V0SW5wdXRGb2N1cyhYVF9kaXNwbGF5LCBYdFdpbmRvdyh3bmRQdHItPndpbldpZGdldCksCisJCSAgICAgICBSZXZlcnRUb1BhcmVudCwgQ3VycmVudFRpbWUpOworICAgIH0KKworICAgIHJldHVybiBoV25kUHJldkZvY3VzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBHZXRGb2N1cyAgICAgICAgICAgIChVU0VSLjIzKQorICovCisKK0hXTkQgR2V0Rm9jdXModm9pZCkKK3sKKyAgICByZXR1cm4gaFduZEZvY3VzOworfQorCisKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZ3JhcGhpY3MuYyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwppbmRleCAzMzg3MzNhLi5hMmExZTMyIDEwMDY0NAotLS0gYS93aW5kb3dzL2dyYXBoaWNzLmMKKysrIGIvd2luZG93cy9ncmFwaGljcy5jCkBAIC0zNjUsMyArMzY1LDc5IEBACiAgICAgU2VsZWN0T2JqZWN0KCBoZGMsIHByZXZCcnVzaCApOwogICAgIHJldHVybiByZXR2YWw7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRHJhd0ZvY3VzUmVjdCAgICAoR0RJLjQ2NikKKyAqLwordm9pZCBEcmF3Rm9jdXNSZWN0KCBIREMgaGRjLCBMUFJFQ1QgcmMgKQoreworICAgIEhQRU4gaFBlbiwgaE9sZFBlbjsKKyAgICBpbnQgb2xkRHJhd01vZGUsIG9sZEJrTW9kZTsKKyAgICBpbnQgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOworICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIGlmICghZGMpIHJldHVybjsKKworICAgIGxlZnQgICA9IFhMUFRPRFAoIGRjLCByYy0+bGVmdCApOworICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCByYy0+dG9wICk7CisgICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJjLT5yaWdodCApOworICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCByYy0+Ym90dG9tICk7CisgICAgCisgICAgaFBlbiA9IENyZWF0ZVBlbihQU19ET1QsIDEsIEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV1RFWFQpKTsgCisgICAgaE9sZFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIChIQU5ETEUpaFBlbik7CisvKiAgICBvbGREcmF3TW9kZSA9IFNldFJPUDIoaGRjLCBSMl9YT1JQRU4pOyAgKi8KKyAgICBvbGRCa01vZGUgPSBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7CisKKyAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiggZGMgKSkKKwlYRHJhd1JlY3RhbmdsZSggWFRfZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKwkJICAgICAgICBsZWZ0LCB0b3AsIHJpZ2h0LWxlZnQtMSwgYm90dG9tLXRvcC0xICk7CisKKyAgICBTZXRCa01vZGUoaGRjLCBvbGRCa01vZGUpOworLyogICAgU2V0Uk9QMihoZGMsIG9sZERyYXdNb2RlKTsgICovCisgICAgU2VsZWN0T2JqZWN0KGhkYywgKEhBTkRMRSloT2xkUGVuKTsKKyAgICBEZWxldGVPYmplY3QoKEhBTkRMRSloUGVuKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgTGluZSAgKE5vdCBhIE1TV2luIENhbGwpCisgKi8KK3ZvaWQgTGluZShIREMgaERDLCBpbnQgWDEsIGludCBZMSwgaW50IFgyLCBpbnQgWTIpCit7CitNb3ZlVG8oaERDLCBYMSwgWTEpOworTGluZVRvKGhEQywgWDIsIFkyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgRHJhd1JlbGllZlJlY3QgIChOb3QgYSBNU1dpbiBDYWxsKQorICovCisgdm9pZCBEcmF3UmVsaWVmUmVjdChIREMgaERDLCBSRUNUIHJlY3QsIGludCBUaGlja05lc3MsIGludCBNb2RlKQoreworSFBFTiAgIGhXSElURVBlbjsKK0hQRU4gICBoREtHUkFZUGVuOworSFBFTiAgIGhPbGRQZW47CitpbnQgICAgT2xkQ29sb3I7CityZWN0LnJpZ2h0LS07ICByZWN0LmJvdHRvbS0tOworaERLR1JBWVBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgMHgwMDgwODA4MEwpOworaFdISVRFUGVuID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfUEVOKTsKK2hPbGRQZW4gPSBTZWxlY3RPYmplY3QoaERDLCBoV0hJVEVQZW4pOword2hpbGUoVGhpY2tOZXNzID4gMCkgeworICAgIGlmIChNb2RlID09IDApCisJU2VsZWN0T2JqZWN0KGhEQywgaFdISVRFUGVuKTsKKyAgICBlbHNlCisJU2VsZWN0T2JqZWN0KGhEQywgaERLR1JBWVBlbik7CisgICAgTGluZShoREMsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QudG9wKTsKKyAgICBMaW5lKGhEQywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSArIDEpOworICAgIGlmIChNb2RlID09IDApCisJU2VsZWN0T2JqZWN0KGhEQywgaERLR1JBWVBlbik7CisgICAgZWxzZQorCVNlbGVjdE9iamVjdChoREMsIGhXSElURVBlbik7CisgICAgTGluZShoREMsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tKTsKKyAgICBMaW5lKGhEQywgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sIHJlY3QucmlnaHQsIHJlY3QudG9wIC0gMSk7CisgICAgSW5mbGF0ZVJlY3QoJnJlY3QsIC0xLCAtMSk7CisgICAgVGhpY2tOZXNzLS07CisgICAgfQorU2VsZWN0T2JqZWN0KGhEQywgaE9sZFBlbik7CitEZWxldGVPYmplY3QoaERLR1JBWVBlbik7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL3N5c2NvbG9yLmMgYi93aW5kb3dzL3N5c2NvbG9yLmMKaW5kZXggNzU5NGZkMS4uYTNjYTlhYyAxMDA2NDQKLS0tIGEvd2luZG93cy9zeXNjb2xvci5jCisrKyBiL3dpbmRvd3Mvc3lzY29sb3IuYwpAQCAtNDgsMjIgKzQ4LDE1IEBACiAKIHZvaWQgU1lTQ09MT1JfSW5pdCgpCiB7Ci0gICAgQ29sb3JtYXAgbWFwOwogICAgIFhDb2xvciBjb2xvcjsKICAgICBpbnQgaTsKIAotICAgIGlmICgobWFwID09IENPTE9SX1dpbkNvbG9ybWFwKSA9PSBDb3B5RnJvbVBhcmVudCkKLQltYXAgPSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbihYVF9zY3JlZW4pOwotCiAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9TWVNfQ09MT1JTOyBpKyspCiAgICAgewotCWlmIChYUGFyc2VDb2xvcihYVF9kaXNwbGF5LCBtYXAsIERlZlN5c0NvbG9yc1tpXSwgJmNvbG9yKSkKKwlpZiAoWFBhcnNlQ29sb3IoWFRfZGlzcGxheSwgQ09MT1JfV2luQ29sb3JtYXAsIERlZlN5c0NvbG9yc1tpXSwgJmNvbG9yKSkKIAl7Ci0JICAgIGlmIChYQWxsb2NDb2xvcihYVF9kaXNwbGF5LCBtYXAsICZjb2xvcikpCi0JICAgIHsKLQkJU3lzQ29sb3JzW2ldID0gUkdCKGNvbG9yLnJlZCA+PiA4LCBjb2xvci5ncmVlbiA+PiA4LAotCQkJCSAgICAgICAgICAgICAgICAgICAgY29sb3IuYmx1ZSA+PiA4KTsKLQkgICAgfQorCSAgICBTeXNDb2xvcnNbaV0gPSBSR0IoY29sb3IucmVkID4+IDgsIGNvbG9yLmdyZWVuID4+IDgsCisJCQkgICAgICAgY29sb3IuYmx1ZSA+PiA4KTsKIAl9CiAgICAgfQogfQpAQCAtODgsMjggKzgxLDExIEBACiAKIHZvaWQgU2V0U3lzQ29sb3JzKGludCBuQ2hhbmdlcywgTFBJTlQgbHBTeXNDb2xvciwgQ09MT1JSRUYgKmxwQ29sb3JWYWx1ZXMpCiB7Ci0gICAgQ29sb3JtYXAgbWFwOwotICAgIFhDb2xvciBjb2xvcjsKLSAgICBjaGFyIGNvbG9yU3RyWzhdOwogICAgIGludCBpOwogCi0gICAgaWYgKChtYXAgPT0gQ09MT1JfV2luQ29sb3JtYXApID09IENvcHlGcm9tUGFyZW50KQotCW1hcCA9IERlZmF1bHRDb2xvcm1hcE9mU2NyZWVuKFhUX3NjcmVlbik7Ci0KICAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW5nZXM7IGkrKykKICAgICB7Ci0Jc3ByaW50Zihjb2xvclN0ciwgIiMlMi4yeCUyLjJ4JTIuMngiLCBHZXRSVmFsdWUobHBDb2xvclZhbHVlc1tpXSksCi0JCUdldEdWYWx1ZShscENvbG9yVmFsdWVzW2ldKSwgR2V0QlZhbHVlKGxwQ29sb3JWYWx1ZXNbaV0pKTsKLQotCWlmIChYUGFyc2VDb2xvcihYVF9kaXNwbGF5LCBtYXAsIGNvbG9yU3RyLCAmY29sb3IpKQotCXsKLQkgICAgaWYgKFhBbGxvY0NvbG9yKFhUX2Rpc3BsYXksIG1hcCwgJmNvbG9yKSkKLQkgICAgewotCQlTeXNDb2xvcnNbbHBTeXNDb2xvcltpXV0gPSBSR0IoY29sb3IucmVkID4+IDgsIAotCQkJCQkJY29sb3IuZ3JlZW4gPj4gOCwKLQkJCQkJCWNvbG9yLmJsdWUgPj4gOCk7Ci0JICAgIH0KLQl9CisJU3lzQ29sb3JzW2xwU3lzQ29sb3JbaV1dID0gbHBDb2xvclZhbHVlc1tpXTsKICAgICB9CiAKICAgICAvKiBTZW5kIFdNX1NZU0NPTE9SQ0hBTkdFIG1lc3NhZ2UgdG8gYWxsIHdpbmRvd3MgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3MvdXRpbGl0eS5jIGIvd2luZG93cy91dGlsaXR5LmMKaW5kZXggM2MyMGQ4Ny4uYWIxODlhMCAxMDA2NDQKLS0tIGEvd2luZG93cy91dGlsaXR5LmMKKysrIGIvd2luZG93cy91dGlsaXR5LmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKQEAgLTI3MCw2ICsyNzEsMjEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfTsKIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIHdzcHJpbnRmICAgICAgICBbVVNFUi40MjBdCisgKi8KK2ludCB3c3ByaW50ZihMUFNUUiBscE91dHB1dCwgTFBTVFIgbHBGb3JtYXQsIC4uLikKK3sKK3ZhX2xpc3QgIHZhbGlzdDsKK2ludCAgICAgIEFyZ0NudDsKK3ZhX3N0YXJ0KHZhbGlzdCwgbHBGb3JtYXQpOworQXJnQ250ID0gdnNwcmludGYobHBPdXRwdXQsIGxwRm9ybWF0LCB2YWxpc3QpOwordmFfZW5kKHZhbGlzdCk7CityZXR1cm4gKEFyZ0NudCk7Cit9CisKKwogLyoJd3ZzcHJpbnRmKCkgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdnNwcmludGYoKS4gVGhpcwogICoJaW1wbGVtZW50YXRpb24gY29udmVydHMgdGhlIGFyZ3VtZW50cyB0byAzMi1iaXQgaW50ZWdlcnMgYW5kCiAgKgljYWxscyB0aGUgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiB2c3ByaW50ZigpLgpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggNGQ1MTdkMy4uM2U1MGEzNyAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0xNywxMiArMTcsMTQgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAKIGV4dGVybiBEaXNwbGF5ICogWFRfZGlzcGxheTsKK2V4dGVybiBTY3JlZW4gKiBYVF9zY3JlZW47CiBleHRlcm4gQ29sb3JtYXAgQ09MT1JfV2luQ29sb3JtYXA7CiAKIHN0YXRpYyBIV05EIGZpcnN0V2luZG93ID0gMDsKIAotdm9pZCBCVVRUT05fQ3JlYXRlQnV0dG9uKExQU1RSIGNsYXNzTmFtZSwgTFBTVFIgYnV0dG9uTGFiZWwsIEhXTkQgaHduZCk7Ci0KK3ZvaWQgU0NST0xMQkFSX0NyZWF0ZVNjcm9sbEJhcihMUFNUUiBjbGFzc05hbWUsIExQU1RSIExhYmVsLCBIV05EIGh3bmQpOwordm9pZCBMSVNUQk9YX0NyZWF0ZUxpc3RCb3goTFBTVFIgY2xhc3NOYW1lLCBMUFNUUiBMYWJlbCwgSFdORCBod25kKTsKK3ZvaWQgQ09NQk9CT1hfQ3JlYXRlQ29tYm9Cb3goTFBTVFIgY2xhc3NOYW1lLCBMUFNUUiBMYWJlbCwgSFdORCBod25kKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgV0lOX0ZpbmRXbmRQdHIKQEAgLTY3LDI4ICs2OSw2MSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5CisgKgorICogU2VuZCBhIFdNX1BBUkVOVE5PVElGWSB0byBhbGwgYW5jZXN0b3JzIG9mIHRoZSBnaXZlbiB3aW5kb3csIHVubGVzcworICogdGhlIHdpbmRvdyBoYXMgdGhlIFdTX0VYX05PUEFSRU5UTk9USUZZIHN0eWxlLgorICovCitzdGF0aWMgdm9pZCBXSU5fU2VuZFBhcmVudE5vdGlmeSggSFdORCBod25kLCBXTkQgKiB3bmRQdHIsIFdPUkQgZXZlbnQgKQoreworICAgIEhXTkQgY3VycmVudCA9IHduZFB0ci0+aHduZFBhcmVudDsKKworICAgIGlmICh3bmRQdHItPmR3RXhTdHlsZSAmIFdTX0VYX05PUEFSRU5UTk9USUZZKSByZXR1cm47CisgICAgd2hpbGUgKGN1cnJlbnQpCisgICAgeworCVNlbmRNZXNzYWdlKCBjdXJyZW50LCBXTV9QQVJFTlROT1RJRlksIAorCQkgICAgIGV2ZW50LCBNQUtFTE9ORyggaHduZCwgd25kUHRyLT53SURtZW51ICkgKTsKKwljdXJyZW50ID0gR2V0UGFyZW50KCBjdXJyZW50ICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZVdpbmRvdyAgIChVU0VSLjQxKQogICovCiBIV05EIENyZWF0ZVdpbmRvdyggTFBTVFIgY2xhc3NOYW1lLCBMUFNUUiB3aW5kb3dOYW1lLAogCQkgICBEV09SRCBzdHlsZSwgc2hvcnQgeCwgc2hvcnQgeSwgc2hvcnQgd2lkdGgsIHNob3J0IGhlaWdodCwKIAkJICAgSFdORCBwYXJlbnQsIEhNRU5VIG1lbnUsIEhBTkRMRSBpbnN0YW5jZSwgTFBTVFIgZGF0YSApIAogeworICAgIHJldHVybiBDcmVhdGVXaW5kb3dFeCggMCwgY2xhc3NOYW1lLCB3aW5kb3dOYW1lLCBzdHlsZSwKKwkJCSAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBhcmVudCwgbWVudSwgaW5zdGFuY2UsIGRhdGEgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVXaW5kb3dFeCAgIChVU0VSLjQ1MikKKyAqLworSFdORCBDcmVhdGVXaW5kb3dFeCggRFdPUkQgZXhTdHlsZSwgTFBTVFIgY2xhc3NOYW1lLCBMUFNUUiB3aW5kb3dOYW1lLAorCQkgICAgIERXT1JEIHN0eWxlLCBzaG9ydCB4LCBzaG9ydCB5LCBzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0LAorCQkgICAgIEhXTkQgcGFyZW50LCBITUVOVSBtZW51LCBIQU5ETEUgaW5zdGFuY2UsIExQU1RSIGRhdGEgKSAKK3sKICAgICBIQU5ETEUgY2xhc3MsIGh3bmQ7CiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogICAgIFdORCAqd25kUHRyLCAqcGFyZW50UHRyID0gTlVMTDsKICAgICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdDsKICAgICBIQU5ETEUgaGNyZWF0ZVN0cnVjdDsKICAgICBpbnQgd21jcmVhdGU7Ci0gICAgTFBTVFIgdGV4dFB0cjsKIAogI2lmZGVmIERFQlVHX1dJTgotICAgIHByaW50ZiggIkNyZWF0ZVdpbmRvdzogJXMgJXMgJWQsJWQgJWR4JWRcbiIsIGNsYXNzTmFtZSwgd2luZG93TmFtZSwgeCwgeSwgd2lkdGgsIGhlaWdodCApOworICAgIHByaW50ZiggIkNyZWF0ZVdpbmRvd0V4OiAlcyAlcyAlZCwlZCAlZHglZFxuIiwgY2xhc3NOYW1lLCB3aW5kb3dOYW1lLCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7CiAjZW5kaWYKIAogICAgIGlmICh4ID09IENXX1VTRURFRkFVTFQpIHggPSAwOwogICAgIGlmICh5ID09IENXX1VTRURFRkFVTFQpIHkgPSAwOwogICAgIGlmICh3aWR0aCA9PSBDV19VU0VERUZBVUxUKSB3aWR0aCA9IDYwMDsKICAgICBpZiAoaGVpZ2h0ID09IENXX1VTRURFRkFVTFQpIGhlaWdodCA9IDQwMDsKKyAgICBpZiAoIXdpZHRoKSB3aWR0aCA9IDE7CisgICAgaWYgKCFoZWlnaHQpIGhlaWdodCA9IDE7CiAKICAgICAgIC8qIEZpbmQgdGhlIHBhcmVudCBhbmQgY2xhc3MgKi8KIApAQCAtMTI3LDkgKzE2MiwxMCBAQAogICAgIHduZFB0ci0+aHduZExhc3RBY3RpdmUgICAgPSAwOwogICAgIHduZFB0ci0+bHBmblduZFByb2MgICAgICAgPSBjbGFzc1B0ci0+d2MubHBmblduZFByb2M7CiAgICAgd25kUHRyLT5kd1N0eWxlICAgICAgICAgICA9IHN0eWxlOwotICAgIHduZFB0ci0+ZHdFeFN0eWxlICAgICAgICAgPSAwOworICAgIHduZFB0ci0+ZHdFeFN0eWxlICAgICAgICAgPSBleFN0eWxlOwogICAgIHduZFB0ci0+aG1lbnVTeXN0ZW0gICAgICAgPSAwOwogICAgIHduZFB0ci0+d0lEbWVudSAgICAgICAgICAgPSBtZW51OworICAgIHduZFB0ci0+aFRleHQgICAgICAgICAgICAgPSAwOwogICAgIHduZFB0ci0+ZmxhZ3MgICAgICAgICAgICAgPSAwOwogCiAgICAgaWYgKGNsYXNzUHRyLT53Yy5jYlduZEV4dHJhKQpAQCAtMTM5LDExICsxNzUsNiBAQAogICAgIGVsc2Ugd25kUHRyLT5oZGMgPSAwOwogICAgIGNsYXNzUHRyLT5jV2luZG93cysrOwogCi0gICAgICAvKiBDcmVhdGUgYnVmZmVyIGZvciB3aW5kb3cgdGV4dCAqLwotICAgIHduZFB0ci0+aFRleHQgPSBVU0VSX0hFQVBfQUxMT0MoR01FTV9NT1ZFQUJMRSwgc3RybGVuKHdpbmRvd05hbWUpICsgMSk7Ci0gICAgdGV4dFB0ciA9IChMUFNUUilVU0VSX0hFQVBfQUREUih3bmRQdHItPmhUZXh0KTsKLSAgICBzdHJjcHkodGV4dFB0ciwgd2luZG93TmFtZSk7Ci0KICAgICAgIC8qIEluc2VydCB0aGUgd2luZG93IGluIHRoZSBsaW5rZWQgbGlzdCAqLwogCiAgICAgaWYgKHBhcmVudCkKQEAgLTE1Nyw2ICsxODgsMjEgQEAKIAlmaXJzdFdpbmRvdyA9IGh3bmQ7CiAgICAgfQogICAgIAorICAgIGlmICghc3RyY2FzZWNtcChjbGFzc05hbWUsICJTQ1JPTExCQVIiKSkKKyAgICB7CisJU0NST0xMQkFSX0NyZWF0ZVNjcm9sbEJhcihjbGFzc05hbWUsIHdpbmRvd05hbWUsIGh3bmQpOworCWdvdG8gV2luQ3JlYXRlZDsKKyAgICB9CisgICAgaWYgKCFzdHJjYXNlY21wKGNsYXNzTmFtZSwgIkxJU1RCT1giKSkKKyAgICB7CisJTElTVEJPWF9DcmVhdGVMaXN0Qm94KGNsYXNzTmFtZSwgd2luZG93TmFtZSwgaHduZCk7CisJZ290byBXaW5DcmVhdGVkOworICAgIH0KKyAgICBpZiAoIXN0cmNhc2VjbXAoY2xhc3NOYW1lLCAiQ09NQk9CT1giKSkKKyAgICB7CisJQ09NQk9CT1hfQ3JlYXRlQ29tYm9Cb3goY2xhc3NOYW1lLCB3aW5kb3dOYW1lLCBod25kKTsKKwlnb3RvIFdpbkNyZWF0ZWQ7CisgICAgfQogICAgICAgLyogQ3JlYXRlIHRoZSB3aWRnZXRzICovCiAKICAgICBpZiAoc3R5bGUgJiBXU19DSElMRCkKQEAgLTE2NCwxOSArMjEwLDIzIEBACiAJd25kUHRyLT5zaGVsbFdpZGdldCA9IDA7CiAJaWYgKHN0eWxlICYgKFdTX0JPUkRFUiB8IFdTX0RMR0ZSQU1FIHwgV1NfVEhJQ0tGUkFNRSkpCiAJeyAKKwkgICAgaW50IGJvcmRlckNvbCA9IDA7CisJICAgIGlmIChDT0xPUl9XaW5Db2xvcm1hcCA9PSBEZWZhdWx0Q29sb3JtYXBPZlNjcmVlbihYVF9zY3JlZW4pKQorCQlib3JkZXJDb2wgPSBCbGFja1BpeGVsT2ZTY3JlZW4oWFRfc2NyZWVuKTsKIAkgICAgd25kUHRyLT53aW5XaWRnZXQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChjbGFzc05hbWUsCi0JCQkJCQkgICAgY29yZVdpZGdldENsYXNzLAorCQkJCQkJICAgIGNvbXBvc2l0ZVdpZGdldENsYXNzLAogCQkJCQkJICAgIHBhcmVudFB0ci0+d2luV2lkZ2V0LAogCQkJCQkJICAgIFh0TngsIHgsCiAJCQkJCQkgICAgWHROeSwgeSwKIAkJCQkJCSAgICBYdE53aWR0aCwgd2lkdGgsCiAJCQkJCQkgICAgWHROaGVpZ2h0LCBoZWlnaHQsCisJCQkJCQkgICAgWHROYm9yZGVyQ29sb3IsIGJvcmRlckNvbCwKIAkJCQkJCSAgICBOVUxMICk7CiAJfQogCWVsc2UKIAl7CiAJICAgIHduZFB0ci0+d2luV2lkZ2V0ID0gWHRWYUNyZWF0ZU1hbmFnZWRXaWRnZXQoY2xhc3NOYW1lLAotCQkJCQkJICAgIGNvcmVXaWRnZXRDbGFzcywKKwkJCQkJCSAgICBjb21wb3NpdGVXaWRnZXRDbGFzcywKIAkJCQkJCSAgICBwYXJlbnRQdHItPndpbldpZGdldCwKIAkJCQkJCSAgICBYdE54LCB4LAogCQkJCQkJICAgIFh0TnksIHksCkBAIC0xODgsMTUgKzIzOCwxMyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotCXduZFB0ci0+c2hlbGxXaWRnZXQgPSBYdFZhQXBwQ3JlYXRlU2hlbGwoY2xhc3NOYW1lLCAKLQkJCQkJCSB3aW5kb3dOYW1lLAorCXduZFB0ci0+c2hlbGxXaWRnZXQgPSBYdFZhQXBwQ3JlYXRlU2hlbGwod2luZG93TmFtZSwgCisJCQkJCQkgY2xhc3NOYW1lLAogCQkJCQkJIHRvcExldmVsU2hlbGxXaWRnZXRDbGFzcywKIAkJCQkJCSBYVF9kaXNwbGF5LAogCQkJCQkJIFh0TngsIHgsCiAJCQkJCQkgWHROeSwgeSwKLSNpZmRlZiBVU0VfUFJJVkFURV9NQVAKIAkJCQkJCSBYdE5jb2xvcm1hcCwgQ09MT1JfV2luQ29sb3JtYXAsCi0jZW5kaWYKIAkJCQkJCSBOVUxMICk7CiAJd25kUHRyLT5jb21wb3NpdGVXaWRnZXQgPSBYdFZhQ3JlYXRlTWFuYWdlZFdpZGdldChjbGFzc05hbWUsCiAJCQkJCQkgICAgZm9ybVdpZGdldENsYXNzLApAQCAtMjQ1LDYgKzI5Myw4IEBACiAJfQogICAgIH0KIAorV2luQ3JlYXRlZDoKKwogICAgICAgLyogU2VuZCB0aGUgV01fQ1JFQVRFIG1lc3NhZ2UgKi8KIAkKICAgICBoY3JlYXRlU3RydWN0ID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUsIHNpemVvZihDUkVBVEVTVFJVQ1QpICk7CkBAIC0yNjIsOCArMzEyLDEwIEBACiAgICAgY3JlYXRlU3RydWN0LT5scHN6Q2xhc3MgICAgICA9IGNsYXNzTmFtZTsKICAgICBjcmVhdGVTdHJ1Y3QtPmR3RXhTdHlsZSAgICAgID0gMDsKIAotICAgIHdtY3JlYXRlID0gQ2FsbFdpbmRvd1Byb2MoIHduZFB0ci0+bHBmblduZFByb2MsIGh3bmQsIAotCQkJICAgICAgIFdNX0NSRUFURSwgMCwgKExPTkcpIGNyZWF0ZVN0cnVjdCApOworICAgIHdtY3JlYXRlID0gU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX05DQ1JFQVRFLCAwLCAoTE9ORyljcmVhdGVTdHJ1Y3QgKTsKKyAgICBpZiAoIXdtY3JlYXRlKSB3bWNyZWF0ZSA9IC0xOworICAgIGVsc2Ugd21jcmVhdGUgPSBTZW5kTWVzc2FnZSggaHduZCwgV01fQ1JFQVRFLCAwLCAoTE9ORyljcmVhdGVTdHJ1Y3QgKTsKKwogICAgIEdsb2JhbFVubG9jayggaGNyZWF0ZVN0cnVjdCApOwogICAgIEdsb2JhbEZyZWUoIGhjcmVhdGVTdHJ1Y3QgKTsKICAgICAKQEAgLTI3OSw2ICszMzEsNyBAQAogICAgIEVWRU5UX0FkZEhhbmRsZXJzKCB3bmRQdHItPndpbldpZGdldCwgaHduZCApOwogCiAgICAgaWYgKHN0eWxlICYgV1NfVklTSUJMRSkgU2hvd1dpbmRvdyggaHduZCwgU1dfU0hPVyApOworICAgIFdJTl9TZW5kUGFyZW50Tm90aWZ5KCBod25kLCB3bmRQdHIsIFdNX0NSRUFURSApOwogICAgIHJldHVybiBod25kOwogfQogCkBAIC0yODcsMzUgKzM0MCw0MSBAQAogICovCiBCT09MIERlc3Ryb3lXaW5kb3coIEhXTkQgaHduZCApCiB7Ci0gICAgV05EICp3bmRQdHIsICpwYXJlbnRQdHI7CisgICAgV05EICogd25kUHRyOworICAgIEhXTkQgKiBjdXJXbmRQdHI7CiAgICAgQ0xBU1MgKiBjbGFzc1B0cjsKICAgICAKLSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwotICAgIGlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7CisgICAgICAvKiBJbml0aWFsaXNhdGlvbiAqLwogCi0gICAgaWYgKHduZFB0ci0+aHduZFBhcmVudCkKLSAgICB7Ci0JcGFyZW50UHRyID0gV0lOX0ZpbmRXbmRQdHIoIHduZFB0ci0+aHduZFBhcmVudCApOwotCXByaW50ZiggIklOVEVSTkFMIEVSUk9SOiBEZXN0cm95V2luZG93OiBJbnZhbGlkIHdpbmRvdyBwYXJlbnRcbiIgKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIAotICAgIGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApOwotICAgIGlmICghY2xhc3NQdHIpCi0gICAgewotCXByaW50ZiggIklOVEVSTkFMIEVSUk9SOiBEZXN0cm95V2luZG93OiBJbnZhbGlkIHdpbmRvdyBjbGFzc1xuIiApOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgCisgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKSkpIHJldHVybiBGQUxTRTsKKyAgICBXSU5fU2VuZFBhcmVudE5vdGlmeSggaHduZCwgd25kUHRyLCBXTV9ERVNUUk9ZICk7CisKKyAgICAgIC8qIFNlbmQgZGVzdHJveSBtZXNzYWdlcyAqLworCiAgICAgU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0RFU1RST1ksIDAsIDAgKTsKKyAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fTkNERVNUUk9ZLCAwLCAwICk7CiAgICAgCiAgICAgICAvKiBEZXN0cm95IGFsbCBjaGlsZHJlbiAqLwogCi0gICAgLyogLi4uLi4uLi4uLi4gKi8KKyAgICB3aGlsZSAod25kUHRyLT5od25kQ2hpbGQpICAvKiBUaGUgY2hpbGQgcmVtb3ZlcyBpdHNlbGYgZnJvbSB0aGUgbGlzdCAqLworCURlc3Ryb3lXaW5kb3coIHduZFB0ci0+aHduZENoaWxkICk7CiAKICAgICAgIC8qIFJlbW92ZSB0aGUgd2luZG93IGZyb20gdGhlIGxpbmtlZCBsaXN0ICovCi0gICAgCi0gICAgLyogLi4uLi4uLi4uLi4gKi8KKworICAgIGlmICh3bmRQdHItPmh3bmRQYXJlbnQpCisgICAgeworCVdORCAqIHBhcmVudFB0ciA9IFdJTl9GaW5kV25kUHRyKCB3bmRQdHItPmh3bmRQYXJlbnQgKTsKKwljdXJXbmRQdHIgPSAmcGFyZW50UHRyLT5od25kQ2hpbGQ7CisgICAgfSAgICAKKyAgICBlbHNlIGN1clduZFB0ciA9ICZmaXJzdFdpbmRvdzsKKworICAgIHdoaWxlICgqY3VyV25kUHRyICE9IGh3bmQpCisgICAgeworCVdORCAqIGN1clB0ciA9IFdJTl9GaW5kV25kUHRyKCAqY3VyV25kUHRyICk7CisJY3VyV25kUHRyID0gJmN1clB0ci0+aHduZE5leHQ7CisgICAgfQorICAgICpjdXJXbmRQdHIgPSB3bmRQdHItPmh3bmROZXh0OwogCiAgICAgICAvKiBEZXN0cm95IHRoZSB3aW5kb3cgKi8KIApAQCAtMzIzLDEzICszODIsMzUgQEAKICAgICBlbHNlIFh0RGVzdHJveVdpZGdldCggd25kUHRyLT53aW5XaWRnZXQgKTsKICAgICBpZiAod25kUHRyLT5oZGMpIERlbGV0ZURDKCB3bmRQdHItPmhkYyApOwogICAgIGNsYXNzUHRyLT5jV2luZG93cy0tOwotICAgIFVTRVJfSEVBUF9GUkVFKHduZFB0ci0+aFRleHQpOwogICAgIFVTRVJfSEVBUF9GUkVFKCBod25kICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0V2luZG93UmVjdCAgIChVU0VSLjMyKQorICovCit2b2lkIEdldFdpbmRvd1JlY3QoIEhXTkQgaHduZCwgTFBSRUNUIHJlY3QgKSAKK3sKKyAgICBpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsgIAorICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7IAorCisgICAgaWYgKHduZFB0cikgCisgICAgeworCVh0VmFHZXRWYWx1ZXMod25kUHRyLT53aW5XaWRnZXQsCisJCSAgICAgIFh0TngsICZ4LCBYdE55LCAmeSwKKwkJICAgICAgWHROd2lkdGgsICZ3aWR0aCwKKwkJICAgICAgWHROaGVpZ2h0LCAmaGVpZ2h0LAorCQkgICAgICBOVUxMICk7CisJcmVjdC0+bGVmdCAgPSB4ICYgMHhmZmZmOworCXJlY3QtPnRvcCA9IHkgJiAweGZmZmY7CisJcmVjdC0+cmlnaHQgID0gd2lkdGggJiAweGZmZmY7CisJcmVjdC0+Ym90dG9tID0gaGVpZ2h0ICYgMHhmZmZmOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRDbGllbnRSZWN0ICAgKFVTRVIuMzMpCiAgKi8KIHZvaWQgR2V0Q2xpZW50UmVjdCggSFdORCBod25kLCBMUFJFQ1QgcmVjdCApIApAQCAtMzY4LDEyICs0NDksNjAgQEAKIAlTZW5kTWVzc2FnZSggaHduZCwgV01fU0laRSwgU0laRV9SRVNUT1JFRCwgCiAJCSAgICAgKHdpZHRoICYgMHhmZmZmKSB8IChoZWlnaHQgPDwgMTYpICk7CiAJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1NIT1dXSU5ET1csIFRSVUUsIDAgKTsKKy8qCisJcHJpbnRmKCJTaG93V2luZG93KCVYLCAlWCk7ICFcbiIsIGh3bmQsIGNtZCk7CisqLworCXN3aXRjaChjbWQpCisJICAgIHsKKwkgICAgY2FzZSBTV19ISURFOgorCQlYdFNldE1hcHBlZFdoZW5NYW5hZ2VkKHduZFB0ci0+d2luV2lkZ2V0LCBGQUxTRSk7CisJCWJyZWFrOworCSAgICBjYXNlIFNXX1NIT1dOQToKKwkgICAgY2FzZSBTV19TSE9XTUlOTk9BQ1RJVkU6CisJICAgIGNhc2UgU1dfU0hPV05PQUNUSVZBVEU6CisJICAgIGNhc2UgU1dfTUlOSU1JWkU6CisJICAgIGNhc2UgU1dfTUFYSU1JWkU6CisJICAgIGNhc2UgU1dfU0hPV01BWElNSVpFRDoKKwkgICAgY2FzZSBTV19TSE9XTUlOSU1JWkVEOgorCSAgICBjYXNlIFNXX1NIT1c6CisJICAgIGNhc2UgU1dfTk9STUFMOgorCSAgICBjYXNlIFNXX1NIT1dOT1JNQUw6CisJCVh0U2V0TWFwcGVkV2hlbk1hbmFnZWQod25kUHRyLT53aW5XaWRnZXQsIFRSVUUpOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTW92ZVdpbmRvdyAgIChVU0VSLjU2KQorICovCit2b2lkIE1vdmVXaW5kb3coSFdORCBoV25kLCBzaG9ydCB4LCBzaG9ydCB5LCBzaG9ydCB3LCBzaG9ydCBoLCBCT09MIGJSZXBhaW50KQoreyAgICAKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaFduZCApOworICAgIGlmICh3bmRQdHIpIAorICAgIHsKKwl3bmRQdHItPnJlY3RDbGllbnQubGVmdCAgID0geDsKKwl3bmRQdHItPnJlY3RDbGllbnQudG9wICAgID0geTsKKwl3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgID0geCArIHc7CisJd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSA9IHkgKyBoOworCVh0VmFTZXRWYWx1ZXMod25kUHRyLT53aW5XaWRnZXQsIFh0TngsIHgsIFh0TnksIHksCisJCSAgICAgIFh0TndpZHRoLCB3LCBYdE5oZWlnaHQsIGgsIE5VTEwgKTsKKwlTZW5kTWVzc2FnZShoV25kLCBXTV9NT1ZFLCAwLCBNQUtFTE9ORyh4LCB5KSk7IAorCXByaW50ZigiTW92ZVdpbmRvdyglWCwgJWQsICVkLCAlZCwgJWQsICVkKTsgIVxuIiwgCisJCQloV25kLCB4LCB5LCB3LCBoLCBiUmVwYWludCk7CisJaWYgKGJSZXBhaW50KSB7CisJICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIFRSVUUpOworCSAgICBVcGRhdGVXaW5kb3coaFduZCk7CisJICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVXBkYXRlV2luZG93ICAgKFVTRVIuMTI0KQogICovCiB2b2lkIFVwZGF0ZVdpbmRvdyggSFdORCBod25kICkKQEAgLTQ0MSw2ICs1NzAsNDIgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRXaW5kb3dQb3MgICAoVVNFUi4yMzIpCisgKi8KK3ZvaWQgU2V0V2luZG93UG9zKEhXTkQgaFduZCwgSFdORCBoV25kSW5zZXJ0QWZ0ZXIsIHNob3J0IHgsIHNob3J0IHksIHNob3J0IHcsIHNob3J0IGgsIFdPUkQgd0ZsYWcpCit7ICAgIAorICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBoV25kICk7CisgICAgaWYgKHduZFB0cikgCisgICAgeworCWlmICgod0ZsYWcgJiBTV1BfTk9NT1ZFKSA9PSAwKSB7CisJICAgIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0ICAgPSB4OworCSAgICB3bmRQdHItPnJlY3RDbGllbnQudG9wICAgID0geTsKKwkgICAgWHRWYVNldFZhbHVlcyh3bmRQdHItPndpbldpZGdldCwgWHROeCwgeCwgWHROeSwgeSwgTlVMTCApOworCSAgICB9CisJaWYgKCh3RmxhZyAmIFNXUF9OT1NJWkUpID09IDApIHsKKwkgICAgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0ICA9IHggKyB3OworCSAgICB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tID0geSArIGg7CisJICAgIFh0VmFTZXRWYWx1ZXMod25kUHRyLT53aW5XaWRnZXQsIFh0TndpZHRoLCB3LCBYdE5oZWlnaHQsIGgsIE5VTEwgKTsKKwkgICAgfQorCWlmICgod0ZsYWcgJiBTV1BfTk9SRURSQVcpID09IDApIHsKKwkgICAgSW52YWxpZGF0ZVJlY3QoaFduZCwgTlVMTCwgVFJVRSk7CisJICAgIFVwZGF0ZVdpbmRvdyhoV25kKTsKKwkgICAgfQorCWlmICgod0ZsYWcgJiBTV1BfSElERVdJTkRPVykgPT0gU1dQX0hJREVXSU5ET1cpIAorCSAgICBTaG93V2luZG93KGhXbmQsIFNXX0hJREUpOworCWlmICgod0ZsYWcgJiBTV1BfU0hPV1dJTkRPVykgPT0gU1dQX1NIT1dXSU5ET1cpIAorCSAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1cpOworLyoKKwlpZiAoKHdGbGFnICYgU1dQX05PQUNUSVZBVEUpID09IDApIAorCSAgICBTZXRBY3RpdmVXaW5kb3coaFduZCk7CisqLworCXByaW50ZigiU2V0V2luZG93UG9zKCVYLCAlWCwgJWQsICVkLCAlZCwgJWQsICVYKTsgIVxuIiwgCisJCWhXbmQsIGhXbmRJbnNlcnRBZnRlciwgeCwgeSwgdywgaCwgd0ZsYWcpOworICAgIH0KK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldERlc2t0b3BXaW5kb3cgICAgICAgIChVU0VSLjI4NikKICAqLwpAQCAtNTAyLDcgKzY2Nyw3IEBACiAgICAgewogCWNhc2UgR1dMX1NUWUxFOiAgIHJldHVybiB3bmRQdHItPmR3U3R5bGU7CiAgICAgICAgIGNhc2UgR1dMX0VYU1RZTEU6IHJldHVybiB3bmRQdHItPmR3RXhTdHlsZTsKLQljYXNlIEdXTF9XTkRQUk9DOiByZXR1cm4gd25kUHRyLT5scGZuV25kUHJvYzsKKwljYXNlIEdXTF9XTkRQUk9DOiByZXR1cm4gKExPTkcpd25kUHRyLT5scGZuV25kUHJvYzsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01MjEsNyArNjg2LDcgQEAKICAgICB7CiAJY2FzZSBHV0xfU1RZTEU6ICAgcHRyID0gJnduZFB0ci0+ZHdTdHlsZTsKICAgICAgICAgY2FzZSBHV0xfRVhTVFlMRTogcHRyID0gJnduZFB0ci0+ZHdFeFN0eWxlOwotCWNhc2UgR1dMX1dORFBST0M6IHB0ciA9ICZ3bmRQdHItPmxwZm5XbmRQcm9jOworCWNhc2UgR1dMX1dORFBST0M6IHB0ciA9IChMT05HICopKCZ3bmRQdHItPmxwZm5XbmRQcm9jKTsKIAlkZWZhdWx0OiByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dmFsID0gKnB0cjsKQEAgLTUzMywzMiArNjk4LDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgR2V0UGFyZW50ICAgICAgICAgICAgICAoVVNFUi40NikKICAqLwotCiBIV05EIEdldFBhcmVudChIV05EIGh3bmQpCiB7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICBIV05EIGh3bmRQYXJlbnQgPSB3bmRQdHItPmh3bmRQYXJlbnQ7Ci0gICAgR2xvYmFsVW5sb2NrKGh3bmQpOwotICAgIHJldHVybiBod25kUGFyZW50OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXREbGdDdHJsSUQgICAgICAgICAgIChVU0VSLjI3NykKLSAqLwotCi1pbnQgR2V0RGxnQ3RybElEKEhXTkQgaHduZCkKLXsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotICAgIGludCBjdHJsSUQgPSB3bmRQdHItPndJRG1lbnU7Ci0gICAgR2xvYmFsVW5sb2NrKGh3bmQpOwotICAgIHJldHVybiBjdHJsSUQ7CisgICAgcmV0dXJuIHduZFB0ci0+aHduZFBhcmVudDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBHZXRXaW5kb3dUZXh0ICAgICAgICAgIChVU0VSLjM2KQogICovCi0KIGludCBHZXRXaW5kb3dUZXh0KEhXTkQgaHduZCwgTFBTVFIgbHBTdHJpbmcsIGludCBuTWF4Q291bnQpCiB7CiAgICAgcmV0dXJuIChpbnQpU2VuZE1lc3NhZ2UoaHduZCwgV01fR0VUVEVYVCwgKFdPUkQpbk1heENvdW50LCAKQEAgLTU2Niw5ICs3MTUsMTYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgU2V0V2luZG93VGV4dCAgICAgICAgICAoVVNFUi4zNykKKyAqLwordm9pZCBTZXRXaW5kb3dUZXh0KEhXTkQgaHduZCwgTFBTVFIgbHBTdHJpbmcpCit7CisgICAgU2VuZE1lc3NhZ2UoaHduZCwgV01fU0VUVEVYVCwgKFdPUkQpTlVMTCwgKERXT1JEKWxwU3RyaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgR2V0V2luZG93VGV4dExlbmd0aCAgICAoVVNFUi4zOCkKICAqLwotCiBpbnQgR2V0V2luZG93VGV4dExlbmd0aChIV05EIGh3bmQpCiB7CiAgICAgcmV0dXJuIChpbnQpU2VuZE1lc3NhZ2UoaHduZCwgV01fR0VUVEVYVExFTkdUSCwgKFdPUkQpTlVMTCwgCkBAIC01NzYsMyArNzMyLDEwMyBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIElzQ2hpbGQgICAgKFVTRVIuNDgpCisgKi8KK0JPT0wgSXNDaGlsZCggSFdORCBwYXJlbnQsIEhXTkQgY2hpbGQgKQoreworICAgIEhXTkQgY3VyQ2hpbGQ7CisgICAgV05EICogcGFyZW50UHRyOworICAgIFdORCAqIGNoaWxkUHRyOworCisgICAgaWYgKCEocGFyZW50UHRyID0gV0lOX0ZpbmRXbmRQdHIoIHBhcmVudCApKSkgcmV0dXJuIEZBTFNFOworICAgIGN1ckNoaWxkID0gcGFyZW50UHRyLT5od25kQ2hpbGQ7CisKKyAgICB3aGlsZSAoY3VyQ2hpbGQpCisgICAgeworCWlmIChjdXJDaGlsZCA9PSBjaGlsZCkgcmV0dXJuIFRSVUU7CisJaWYgKElzQ2hpbGQoIGN1ckNoaWxkLCBjaGlsZCApKSByZXR1cm4gVFJVRTsKKwlpZiAoIShjaGlsZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBjdXJDaGlsZCApKSkgcmV0dXJuIEZBTFNFOworCWN1ckNoaWxkID0gY2hpbGRQdHItPmh3bmROZXh0OworICAgIH0gICAgCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldFRvcFdpbmRvdyAgICAoVVNFUi4yMjkpCisgKi8KK0hXTkQgR2V0VG9wV2luZG93KCBIV05EIGh3bmQgKQoreworICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYgKHduZFB0cikgcmV0dXJuIHduZFB0ci0+aHduZENoaWxkOworICAgIGVsc2UgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgR2V0V2luZG93ICAgIChVU0VSLjI2MikKKyAqLworSFdORCBHZXRXaW5kb3coIEhXTkQgaHduZCwgV09SRCByZWwgKQoreworICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgaWYgKCF3bmRQdHIpIHJldHVybiAwOworICAgIHN3aXRjaChyZWwpCisgICAgeworICAgIGNhc2UgR1dfSFdOREZJUlNUOgorCWlmICh3bmRQdHItPmh3bmRQYXJlbnQpCisJeworCSAgICBXTkQgKiBwYXJlbnRQdHIgPSBXSU5fRmluZFduZFB0ciggd25kUHRyLT5od25kUGFyZW50ICk7CisJICAgIHJldHVybiBwYXJlbnRQdHItPmh3bmRDaGlsZDsKKwl9CisJZWxzZSByZXR1cm4gZmlyc3RXaW5kb3c7CisJCisgICAgY2FzZSBHV19IV05ETEFTVDoKKwl3aGlsZSAod25kUHRyLT5od25kTmV4dCkKKwl7CisJICAgIGh3bmQgPSB3bmRQdHItPmh3bmROZXh0OworCSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworCX0KKwlyZXR1cm4gaHduZDsKKwkKKyAgICBjYXNlIEdXX0hXTkRORVhUOgorCXJldHVybiB3bmRQdHItPmh3bmROZXh0OworCQorICAgIGNhc2UgR1dfSFdORFBSRVY6CQorCXsKKwkgICAgSFdORCBod25kUHJldjsKKwkgICAgCisJICAgIGlmICh3bmRQdHItPmh3bmRQYXJlbnQpCisJICAgIHsKKwkJV05EICogcGFyZW50UHRyID0gV0lOX0ZpbmRXbmRQdHIoIHduZFB0ci0+aHduZFBhcmVudCApOworCQlod25kUHJldiA9IHBhcmVudFB0ci0+aHduZENoaWxkOworCSAgICB9CisJICAgIGVsc2UgaHduZFByZXYgPSBmaXJzdFdpbmRvdzsKKwkgICAgaWYgKGh3bmRQcmV2ID09IGh3bmQpIHJldHVybiAwOworCSAgICB3aGlsZSAoaHduZFByZXYpCisJICAgIHsKKwkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmRQcmV2ICk7CisJCWlmICh3bmRQdHItPmh3bmROZXh0ID09IGh3bmQpIGJyZWFrOworCQlod25kUHJldiA9IHduZFB0ci0+aHduZE5leHQ7CisJICAgIH0KKwkgICAgcmV0dXJuIGh3bmRQcmV2OworCX0KKwkKKyAgICBjYXNlIEdXX09XTkVSOgorCXJldHVybiB3bmRQdHItPmh3bmRPd25lcjsKKworICAgIGNhc2UgR1dfQ0hJTEQ6CisJcmV0dXJuIHduZFB0ci0+aHduZENoaWxkOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXROZXh0V2luZG93ICAgIChVU0VSLjIzMCkKKyAqLworSFdORCBHZXROZXh0V2luZG93KCBIV05EIGh3bmQsIFdPUkQgZmxhZyApCit7CisgICAgaWYgKChmbGFnICE9IEdXX0hXTkRORVhUKSAmJiAoZmxhZyAhPSBHV19IV05EUFJFVikpIHJldHVybiAwOworICAgIHJldHVybiBHZXRXaW5kb3coIGh3bmQsIGZsYWcgKTsKK30K