IyBUaGlzIGlzIGEgZnJvemVuIHN0YXRlIGZpbGUgZ2VuZXJhdGVkIGJ5IEdOVSBNNCAxLjQuMTYKVjEKUTEsMQpbXQpUMjgsMTAwCm00X2xvY2F0aW9uKEFDX1BST0dfQ1hYX0NfTykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6Nzc5ClQyNywxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19BU1NFUlQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjE1NwpUMjIsMTMzCl9BU19MSVRFUkFMX0hFUkVET0NfSUZtNF9pZihtNF9pbmRleChbJDFdLCBbQFN8QF0pLCBbLTFdLAogIFttNF9pZihtNF9pbmRleChtNF90cmFuc2xpdChbWyQxXV0sIFtcYF0sIFskXSksIFskXSksIFstMV0sCiAgICBbJDBfWUVTXSwgWyQwX05PXSldLAogIFskMF9OT10pClQxNiw2NQpBQ19UWVBFX1VJTlQxNl9UX200X2RlZnVuX3BybyhbJDBdKV9BQ19UWVBFX1VOU0lHTkVEX0lOVCgxNilbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDU0CkFDX1BBVEhfUFJPR1NfRkVBVFVSRV9DSEVDS18kMChbJDFdLCBbJDJdLCBbJDNdLCBtNF9kZWZhdWx0KFskNF0sIFs6XSksIFskNV0pZG5sCgpUMzcsMTA1Cm00X2xvY2F0aW9uKEFDX0VSTEFOR19TVUJTVF9ST09UX0RJUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2VybGFuZy5tNDoyMTcKVDE2LDQwMApfQVNfRVhJVF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkVfU0hFTExfRk4oW2FzX2ZuX3NldF9zdGF0dXNdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYXNfZm5fc2V0X3N0YXR1c10sIFtTVEFUVVNdLAogICAgW1NldCAkPyB0byBTVEFUVVMsIHdpdGhvdXQgZm9ya2luZy5dKV0sIFsgIHJldHVybiAkW10xXSlBU19SRVFVSVJFX1NIRUxMX0ZOKFthc19mbl9leGl0XSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX2V4aXRdLCBbU1RBVFVTXSwKICAgIFtFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuXSldLApbICBzZXQgK2UKICBhc19mbl9zZXRfc3RhdHVzICRbMV0KICBleGl0ICRbMV1dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMzYyCkFDX1NZU19QT1NJWF9URVJNSU9TX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtQT1NJWCB0ZXJtaW9zXSwgYWNfY3Zfc3lzX3Bvc2l4X3Rlcm1pb3MsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDx0ZXJtaW9zLmg+Cl1dLAoJICAgICBbLyogU3VuT1MgNC4wLjMgaGFzIHRlcm1pb3MuaCBidXQgbm90IHRoZSBsaWJyYXJ5IGNhbGxzLiAgKi8KICAgdGNnZXRhdHRyKDAsIDApO10pXSwKCSAgICAgYWNfY3Zfc3lzX3Bvc2l4X3Rlcm1pb3M9eWVzLAoJICAgICBhY19jdl9zeXNfcG9zaXhfdGVybWlvcz1ubyldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDE0MApBQ19QUk9HX0Y3N19DX09fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbiA3NylkbmwKX0FDX1BST0dfRkNfQ19PCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNjkKX200X2xpc3RfY21wbTRfaWYoWyQxXSwgW10sIFswbTRfaWdub3JlXSwgWyQyXSwgWzBdLCBbbTRfdW5xdW90ZV0sIFskMm00X2lnbm9yZV0pClQyNCwxMDIwCkFDX0xBTkdfRlVOQ19MSU5LX1RSWShDKUFDX0xBTkdfUFJPR1JBTSgKWy8qIERlZmluZSAkMSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQxLgogICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KI2RlZmluZSAkMSBpbm5vY3VvdXNfJDEKCi8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDEgKCk7IGJlbG93LgogICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KCiNpZmRlZiBfX1NURENfXwojIGluY2x1ZGUgPGxpbWl0cy5oPgojZWxzZQojIGluY2x1ZGUgPGFzc2VydC5oPgojZW5kaWYKCiN1bmRlZiAkMQoKLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMSAoKTsKLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwojaWYgZGVmaW5lZCBfX3N0dWJfJDEgfHwgZGVmaW5lZCBfX3N0dWJfX18kMQpjaG9rZSBtZQojZW5kaWYKXSwgW3JldHVybiAkMSAoKTtdKQpGMTIsOQptNF9kZWJ1Z2ZpbGVkZWJ1Z2ZpbGUKVDExLDEKX0FIX0NPVU5URVIwClQyMSw4NjQKX0FDX1RZUEVfVU5TSUdORURfSU5UX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX2NfZmluZF91aW50WF90XSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX2NfZmluZF91aW50WF90XSwgW0xJTkVOTyBCSVRTIFZBUl0sCiAgICBbRmluZHMgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIHdpdGggd2lkdGggQklUUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKICAgICBhY2NvcmRpbmdseS5dKV0sCiAgWyQwX0JPRFldKWFjX2ZuX2NfZmluZF91aW50WF90ICIkTElORU5PIiAiJDEiICJhY19jdl9jX3VpbnQkMV90IgpjYXNlICRhY19jdl9jX3VpbnQkMV90IGluICMoCiAgbm98eWVzKSA7OyAjKAogICopCiAgICBtNF9ibWF0Y2goWyQxXSwgW15cKDhcfDMyXHw2NFwpJF0sCiAgICAgIFtBQ19ERUZJTkUoW19VSU5UJDFfVF0sIDEsCgkgW0RlZmluZSBmb3IgU29sYXJpcyAyLjUuMSBzbyB0aGUgdWludCQxX3QgdHlwZWRlZiBmcm9tCgkgIDxzeXMvc3luY2guaD4sIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLgoJICBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZSAjZGVmaW5lIGJlbG93IHdvdWxkIGNhdXNlIGEKCSAgc3ludGF4IGVycm9yLl0pXSkKICAgIEFDX0RFRklORV9VTlFVT1RFRChbdWludCQxX3RdLCBbJGFjX2N2X2NfdWludCQxX3RdLAogICAgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5ICQxIGJpdHMKICAgICAgIGlmIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuXSk7OwogIGVzYWMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxODMKX0FDX0ZPUlRSQU5fQVNTRVJUX200X2RlZnVuX3BybyhbJDBdKW00X2lmKF9BQ19MQU5HLCBbRm9ydHJhbl0sIFtdLAogICAgICAgW200X2lmKF9BQ19MQU5HLCBbRm9ydHJhbiA3N10sIFtdLAoJICAgICAgW200X2ZhdGFsKFskMDogY3VycmVudCBsYW5ndWFnZSBpcyBub3QgRm9ydHJhbjogXSBfQUNfTEFORyldKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwxNTcKX0FDX0RFRklORV9VTlFVT1RFRG00X2lmKG00X2JyZWdleHAoWyQxXSwgW1xcXHxgXHxcJChcfFwke1x8QF0pLCBbLTFdLAogICAgICAgW0FTX0VDSE8oWyJBU19FU0NBUEUoWyQxXSwgWyIiXSkiXSkgPj5jb25mZGVmcy5oXSwKICAgICAgIFtjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GClskMV0KX0FDRU9GXSkKVDIxLDYwOQpBQ19MQU5HX0lOVF9TQVZFKEMrKylBQ19MQU5HX1BST0dSQU0oWyQxCnN0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CnN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQpAJTpAaW5jbHVkZSA8c3RkaW8uaD4KQCU6QGluY2x1ZGUgPHN0ZGxpYi5oPl0sClsKICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwogIGlmICghIGYpCiAgICByZXR1cm4gMTsKICBpZiAoKCQyKSA8IDApCiAgICB7CiAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOwogICAgICBpZiAoaSAhPSAoJDIpKQoJcmV0dXJuIDE7CiAgICAgIGZwcmludGYgKGYsICIlbGQiLCBpKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKICAgICAgaWYgKGkgIT0gKCQyKSkKCXJldHVybiAxOwogICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CiAgICB9CiAgLyogRG8gbm90IG91dHB1dCBhIHRyYWlsaW5nIG5ld2xpbmUsIGFzIHRoaXMgY2F1c2VzIFxyXG4gY29uZnVzaW9uCiAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLwogIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKXSkKVDE2LDc5NQpBQ19IRUFERVJfQVNTRVJUX200X2RlZnVuX29uY2UoW0FDX0hFQURFUl9BU1NFUlRdLCBbCiAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBhc3NlcnRpb25zXSkKICBBQ19BUkdfRU5BQkxFKFthc3NlcnRdLAogICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtYXNzZXJ0XSwgW3R1cm4gb2ZmIGFzc2VydGlvbnNdKV0sCiAgICBbYWNfZW5hYmxlX2Fzc2VydD0kZW5hYmxldmFsCiAgICAgQVNfSUYoZG5sCiAgICAgIFt0ZXN0ICJ4JGVuYWJsZXZhbCIgPSB4bm9dLAoJW0FDX0RFRklORShbTkRFQlVHXSwgWzFdLAoJICBbRGVmaW5lIHRvIDEgaWYgYXNzZXJ0aW9ucyBzaG91bGQgYmUgZGlzYWJsZWQuXSldLAogICAgICBbdGVzdCAieCRlbmFibGV2YWwiICE9IHh5ZXNdLAoJW0FDX01TR19XQVJOKFtpbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIC0tZW5hYmxlLWFzc2VydF0pCglhY19lbmFibGVfYXNzZXJ0PXllc10pXSwKICAgIFthY19lbmFibGVfYXNzZXJ0PXllc10pCiAgQUNfTVNHX1JFU1VMVChbJGFjX2VuYWJsZV9hc3NlcnRdKQpdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfSEVBREVSX0FTU0VSVF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0hFQURFUl9BU1NFUlRdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfSEVBREVSX0FTU0VSVF0pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX0hFQURFUl9BU1NFUlRdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQ2LDE1MwpBQ19BSVhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQUlYJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlNbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDEwNAptNF9sb2NhdGlvbihBQ19FUkxBTkdfUEFUSF9FUkwpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6NzMKVDE3LDAKQVNfTUVTU0FHRV9MT0dfRkQKVDI4LDY4CkFDX0xBTkdfUFJFUFJPQyhPYmplY3RpdmUgQylfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19PQkpDUFBdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsMTA2Cm00X2xvY2F0aW9uKF9BQ19QUk9HX0ZDKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDozMjMKVDIzLDEwNwptNF9sb2NhdGlvbihBQ19UUllfQ1BQKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNTMwClQzNCwxMDYKbTRfbG9jYXRpb24oQUNfRkNfTElCUkFSWV9MREZMQUdTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo3MTAKVDIyLDE0MDYKQUNfU1lTX0xPTkdfRklMRV9OQU1FU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhmb3IgbG9uZyBmaWxlIG5hbWVzLCBhY19jdl9zeXNfbG9uZ19maWxlX25hbWVzLApbYWNfY3Zfc3lzX2xvbmdfZmlsZV9uYW1lcz15ZXMKIyBUZXN0IGZvciBsb25nIGZpbGUgbmFtZXMgaW4gYWxsIHRoZSBwbGFjZXMgd2Uga25vdyBtaWdodCBtYXR0ZXI6CiMgICAgICAuCQl0aGUgY3VycmVudCBkaXJlY3RvcnksIHdoZXJlIGJ1aWxkaW5nIHdpbGwgaGFwcGVuCiMgICAgICAkcHJlZml4L2xpYgl3aGVyZSB3ZSB3aWxsIGJlIGluc3RhbGxpbmcgdGhpbmdzCiMgICAgICAkZXhlY19wcmVmaXgvbGliCWxpa2V3aXNlCiMgICAgICAkVE1QRElSCQlpZiBzZXQsIHdoZXJlIGl0IG1pZ2h0IHdhbnQgdG8gd3JpdGUgdGVtcG9yYXJ5IGZpbGVzCiMgICAgICAvdG1wCQl3aGVyZSBpdCBtaWdodCB3YW50IHRvIHdyaXRlIHRlbXBvcmFyeSBmaWxlcwojICAgICAgL3Zhci90bXAJCWxpa2V3aXNlCiMgICAgICAvdXNyL3RtcAkJbGlrZXdpc2UKZm9yIGFjX2RpciBpbiAuICIkVE1QRElSIiAvdG1wIC92YXIvdG1wIC91c3IvdG1wICIkcHJlZml4L2xpYiIgIiRleGVjX3ByZWZpeC9saWIiOyBkbwogICMgU2tpcCAkVE1QRElSIGlmIGl0IGlzIGVtcHR5IG9yIGJvZ3VzLCBhbmQgc2tpcCAkZXhlY19wcmVmaXgvbGliCiAgIyBpbiB0aGUgdXN1YWwgY2FzZSB3aGVyZSBleGVjX3ByZWZpeCBpcyAnJHtwcmVmaXh9Jy4KICBjYXNlICRhY19kaXIgaW4gIygKICAgIC4gfCAvKiB8ID86W1tcXC9dXSopIDs7ICMoCiAgICAqKSBjb250aW51ZTs7CiAgZXNhYwogIHRlc3QgLXcgIiRhY19kaXIvLiIgfHwgY29udGludWUgIyBJdCBpcyBsZXNzIGNvbmZ1c2luZyB0byBub3QgZWNobyBhbnl0aGluZyBoZXJlLgogIGFjX3hkaXI9JGFjX2Rpci9jZiQkCiAgKHVtYXNrIDA3NyAmJiBta2RpciAiJGFjX3hkaXIiIDI+L2Rldi9udWxsKSB8fCBjb250aW51ZQogIGFjX3RmMT0kYWNfeGRpci9jb25mdGVzdDkwMTIzNDUKICBhY190ZjI9JGFjX3hkaXIvY29uZnRlc3Q5MDEyMzQ2CiAgdG91Y2ggIiRhY190ZjEiIDI+L2Rldi9udWxsICYmIHRlc3QgLWYgIiRhY190ZjEiICYmIHRlc3QgISAtZiAiJGFjX3RmMiIgfHwKICAgIGFjX2N2X3N5c19sb25nX2ZpbGVfbmFtZXM9bm8KICBybSAtZiAtciAiJGFjX3hkaXIiIDI+L2Rldi9udWxsCiAgdGVzdCAkYWNfY3Zfc3lzX2xvbmdfZmlsZV9uYW1lcyA9IG5vICYmIGJyZWFrCmRvbmVdKQppZiB0ZXN0ICRhY19jdl9zeXNfbG9uZ19maWxlX25hbWVzID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfTE9OR19GSUxFX05BTUVTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3Ugc3VwcG9ydCBmaWxlIG5hbWVzIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywxMDkKbTRfbG9jYXRpb24oX0FDX0ZVTkNfVkZPUkspL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTg0OQpUMzQsMTAzCm00X2xvY2F0aW9uKEFDX0xBTkdfRlVOQ19MSU5LX1RSWSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6MjgxClQyOSwyMTIKX0FDX0NIRUNLX0hFQURFUl9QUkVQUk9DX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTJdLCBbJFtdM10sCiAgW0FDX1BSRVBST0NfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbQCU6QGluY2x1ZGUgPCRbXTI+XSldLAoJCSAgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbeWVzXSldLAoJCSAgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbbm9dKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUMTgsNjUKQUNfTEFOR19QUkVQUk9DKEMpX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ1BQXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDEwNwptNF9sb2NhdGlvbihfQUNfRE9fVE9LRU5TKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDA0ClQxNCwxNTkKYWNfY3ZfcHJvZ19neHhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgYWNfY3ZfcHJvZ19neHgnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCmFjX2N2X2N4eF9jb21waWxlcl9nbnVbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsMApfbTRfd2FybgpUOSwyMjI2CkFDX09VVFBVVGRubCBEaXNwYXRjaCB0aGUgZXh0cmEgYXJndW1lbnRzIHRvIHRoZWlyIG5hdGl2ZSBtYWNyb3MuCm00X2lmdmFsbihbJDFdLAoJICBbQUNfQ09ORklHX0ZJTEVTKFskMV0pXSlkbmwKbTRfaWZ2YWxuKFskMiQzXSwKCSAgW0FDX0NPTkZJR19DT01NQU5EUyhkZWZhdWx0LCBbJDJdLCBbJDNdKV0pZG5sCm00X2lmdmFsKFskMSQyJDNdLAoJIFtBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAoJCSAgICAgIFskMCBzaG91bGQgYmUgdXNlZCB3aXRob3V0IGFyZ3VtZW50cy4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKV0pZG5sCkFDX0NBQ0hFX1NBVkUKCnRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCnRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLCBbREVGUz0tREhBVkVfQ09ORklHX0hdLCBbQUNfT1VUUFVUX01BS0VfREVGUygpXSkKCmRubCBDb21tYW5kcyB0byBydW4gYmVmb3JlIGNyZWF0aW5nIGNvbmZpZy5zdGF0dXMuCkFDX09VVFBVVF9DT01NQU5EU19QUkUoKWRubAoKOiAiJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30iCmFjX3dyaXRlX2ZhaWw9MAphY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcwphY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzICRDT05GSUdfU1RBVFVTIgpfQUNfT1VUUFVUX0NPTkZJR19TVEFUVVMoKWRubAphY19jbGVhbl9maWxlcz0kYWNfY2xlYW5fZmlsZXNfc2F2ZQoKdGVzdCAkYWNfd3JpdGVfZmFpbCA9IDAgfHwKICBBQ19NU0dfRVJST1IoW3dyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVNdKQoKZG5sIENvbW1hbmRzIHRvIHJ1biBhZnRlciBjb25maWcuc3RhdHVzIHdhcyBjcmVhdGVkCkFDX09VVFBVVF9DT01NQU5EU19QT1NUKClkbmwKCiMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCiMgVW5mb3J0dW5hdGVseSwgb24gRE9TIHRoaXMgZmFpbHMsIGFzIGNvbmZpZy5sb2cgaXMgc3RpbGwga2VwdCBvcGVuCiMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cwojIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAojIGVmZmVjdGl2ZWx5IGNsb3NpbmcgY29uZmlnLmxvZywgc28gaXQgY2FuIGJlIHByb3Blcmx5IChyZSlvcGVuZWQgYW5kCiMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQojIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgppZiB0ZXN0ICIkbm9fY3JlYXRlIiAhPSB5ZXM7IHRoZW4KICBhY19jc19zdWNjZXNzPToKICBhY19jb25maWdfc3RhdHVzX2FyZ3M9CiAgdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYKICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgogIGV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+L2Rldi9udWxsCiAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQogIGV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAogICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgogICRhY19jc19zdWNjZXNzIHx8IEFTX0VYSVQoWzFdKQpmaQpkbmwgY29uZmlnLnN0YXR1cyBzaG91bGQgbm90IGRvIHJlY3Vyc2lvbi4KQUNfUFJPVklERV9JRkVMU0UoW0FDX0NPTkZJR19TVUJESVJTXSwgW19BQ19PVVRQVVRfU1VCRElSUygpXSlkbmwKaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIiAmJiB0ZXN0ICIkZW5hYmxlX29wdGlvbl9jaGVja2luZyIgIT0gbm87IHRoZW4KICBBQ19NU0dfV0FSTihbdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0c10pCmZpCgpUMjYsMTA2Cm00X2xvY2F0aW9uKF9BQ19QUk9HX0ZDX1YpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjU1OQpUMzEsMTA0Cm00X2xvY2F0aW9uKEFDX0VSTEFOR19ORUVEX0VSTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2VybGFuZy5tNDo4NgpUMTcsMTEwNQpBQ19GVU5DX0dFVEdST1VQU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19UWVBFX0dFVEdST1VQU10pZG5sCkFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKQUNfQ0hFQ0tfRlVOQyhnZXRncm91cHMpCgojIElmIHdlIGRvbid0IHlldCBoYXZlIGdldGdyb3Vwcywgc2VlIGlmIGl0J3MgaW4gLWxic2QuCiMgVGhpcyBpcyByZXBvcnRlZCB0byBiZSBuZWNlc3Nhcnkgb24gYW4gSVRPUyAzMDAwV1MgcnVubmluZyBTRUlVWCAzLjEuCmFjX3NhdmVfTElCUz0kTElCUwppZiB0ZXN0ICRhY19jdl9mdW5jX2dldGdyb3VwcyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfTElCKGJzZCwgZ2V0Z3JvdXBzLCBbR0VUR1JPVVBTX0xJQj0tbGJzZF0pCmZpCgojIFJ1biB0aGUgcHJvZ3JhbSB0byB0ZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBzeXN0ZW0tc3VwcGxpZWQKIyBnZXRncm91cHMgZnVuY3Rpb24gb25seSBpZiB0aGVyZSBpcyBzdWNoIGEgZnVuY3Rpb24uCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzID0geWVzOyB0aGVuCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIGdldGdyb3Vwc10sIGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzLAogICBbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwKICAgICAgW1svKiBPbiBVbHRyaXggNC4zLCBnZXRncm91cHMgKDAsIDApIGFsd2F5cyBmYWlscy4gICovCiAgICAgICByZXR1cm4gZ2V0Z3JvdXBzICgwLCAwKSA9PSAtMTtdXSldLAoJCSAgW2FjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPXllc10sCgkJICBbYWNfY3ZfZnVuY19nZXRncm91cHNfd29ya3M9bm9dLAoJCSAgW2FjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPW5vXSkKICAgXSkKZWxzZQogIGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzPW5vCmZpCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0Z3JvdXBzX3dvcmtzID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfR0VUR1JPVVBTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSB3b3JraW5nIGBnZXRncm91cHMnIGZ1bmN0aW9uLl0pCmZpCkxJQlM9JGFjX3NhdmVfTElCUwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDIzCkFDX0RFRklORV9VTlFVT1RFRF9BQ19ERUZJTkVfUShbXyQwXSwgJEApClQyNywxMDMKbTRfbG9jYXRpb24oX0FTX01FX1BSRVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTA4NwpUMjAsMTAyCm00X2xvY2F0aW9uKEFTX0VYSVQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6NTUyClQyNCwxMDYKbTRfbG9jYXRpb24oQUNfVElNRVpPTkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo4MApUMjUsMTAzCm00X2xvY2F0aW9uKEFDX1BBVEhfWFRSQSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xpYnMubTQ6MzY2ClQyOCwxMDUKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfSEVBREVSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo2NwpUMjEsNDc5Cl9BU19WQVJfQVJJVEhfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19GVU5DVElPTl9ERVNDUklCRShbYXNfZm5fYXJpdGhdLCBbQVJHLi4uXSwKW1BlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbgp0aGUgZ2xvYmFsICRhc192YWwuICBUYWtlIGFkdmFudGFnZSBvZiBzaGVsbHMgdGhhdCBjYW4gYXZvaWQgZm9ya3MuClRoZSBhcmd1bWVudHMgbXVzdCBiZSBwb3J0YWJsZSBhY3Jvc3MgJCgoKSkgYW5kIGV4cHIuXSkKQVNfSUYoW19BU19SVU4oWyJBU19FU0NBUEUobTRfcXVvdGUoX0FTX1ZBUl9BUklUSF9XT1JLUykpIl0pXSwKW2V2YWwgJ2FzX2ZuX2FyaXRoICgpCiAgewogICAgYXNfdmFsPSQoKCAkW10qICkpCiAgfSddLApbYXNfZm5fYXJpdGggKCkKICB7CiAgICBhc192YWw9YGV4cHIgIiRbXUAiIHx8IHRlc3QgJD8gLWVxIDFgCiAgfV0pICMgYXNfZm5fYXJpdGgKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw3MgpBQ19QUk9HX1JBTkxJQl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsNDM0Cl9BQ19QUkVQUk9DX0lGRUxTRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW190cnlfY3BwXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9jcHBdLCBbTElORU5PXSwKICAgIFtUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuXSldLAogIFskMF9CT0RZXSltNF9pZnZhbG4oWyQxXSwgW0FDX0xBTkdfQ09ORlRFU1QoWyQxXSldKUFTX0lGKFthY19mbl9bXV9BQ19MQU5HX0FCQlJFVltdX3RyeV9jcHAgIiRMSU5FTk8iXSwgWyQyXSwgWyQzXSkKcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmlbXW00X2lmdmFsKFskMV0sIFsgY29uZnRlc3QuJGFjX2V4dF0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw0MzcKQUNfQVJHX0VOQUJMRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJFU0VSVkVfSEVMUF9PUkRFUl0sCltdLApbbTRfZGl2ZXJ0X29uY2UoW0hFTFBfRU5BQkxFXSwgW1sKT3B0aW9uYWwgRmVhdHVyZXM6CiAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwogIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdXV0pXSlkbmwKbTRfZGl2ZXJ0X29uY2UoW0hFTFBfRU5BQkxFXSwgWyQyXSlkbmwKX0FDX0VOQUJMRV9JRihbZW5hYmxlXSwgWyQxXSwgWyQzXSwgWyQ0XSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwyMTgKbTRfbWFwX2FyZ3Nfc2VwbTRfaWYoWyQjXSwgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCiAgICAgICBbJCNdLCBbMV0sIFtdLAogICAgICAgWyQjXSwgWzJdLCBbXSwKICAgICAgIFskI10sIFszXSwgW10sCiAgICAgICBbJCNdLCBbNF0sIFskMVskNF0kMltdXSwKICAgICAgIFskMVskNF0kMltdX200X2ZvcmVhY2goWyQzW10kMV0sIFskMl0sIG00X3NoaWZ0MygkQCkpXSkKVDI3LDEwNgptNF9sb2NhdGlvbihBQ19IRUxQX1NUUklORykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjA5ClQyMCwzMzQKQUNfSEVBREVSX1RJT0NHV0lOU1pfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0hFQURFUl9USU9DR1dJTlNaX0lOX1RFUk1JT1NfSAppZiB0ZXN0ICRhY19jdl9zeXNfdGlvY2d3aW5zel9pbl90ZXJtaW9zX2ggIT0geWVzOyB0aGVuCiAgX0FDX0hFQURFUl9USU9DR1dJTlNaX0lOX1NZU19JT0NUTAogIGlmIHRlc3QgJGFjX2N2X3N5c190aW9jZ3dpbnN6X2luX3N5c19pb2N0bF9oID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoR1dJTlNaX0lOX1NZU19JT0NUTCwxLAoJICAgICAgW0RlZmluZSB0byAxIGlmIGBUSU9DR1dJTlNaJyByZXF1aXJlcyA8c3lzL2lvY3RsLmg+Ll0pCiAgZmkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSw3NgpBQ19MQU5HX0NPTkZURVNUKEMrKyljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci8qIGVuZCBjb25mZGVmcy5oLiAgKi8KJDEKX0FDRU9GClQyMiwxMDMKbTRfbG9jYXRpb24oQVNfVEVTVF9YKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjEwNTUKVDIzLDEwNwptNF9sb2NhdGlvbihBQ19GQ19GVU5DKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMDk0CkY1LDUKaWZkZWZpZmRlZgpUMjAsMTEzCl9BQ19FTkFCTEVfSUZfQUNUSU9ObTRfYXBwZW5kX3VuaXEoW19BQ19VU0VSX09QVFNdLCBbJDFfJDJdLCBbCl0pZG5sCkFTX0lGKFt0ZXN0ICIkeyQxXyQyK3NldH0iID0gc2V0XSwgWyQxdmFsPSQkMV8kMjsgJDNdLCBbJDRdKWRubAoKVDI4LDEwNgptNF9sb2NhdGlvbihfQUNfSU5JVF9TUkNESVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjUxMgpUMjgsMTAzCm00X2xvY2F0aW9uKF9BQ19MQU5HX0FCQlJFVikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6MTQyClQyOCwxMDQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfU0laRU9GKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NzY1ClQ4LDE1MAptNF9kZWZ1bm00X2RlZmluZShbbTRfbG9jYXRpb24oJDEpXSwgbTRfbG9jYXRpb24pbTRfZGVmYXVsdChbJDNdLCBbbTRfZGVmaW5lXSkoWyQxXSwKICBbX200X2RlZnVuX3BybyhdbTRfZHF1b3RlKCRbMF0pWykkMltdX200X2RlZnVuX2VwaShdbTRfZHF1b3RlKCRbMF0pWyldKQpUMzAsMjMKX0FDX0xBTkdfTlVMTF9QUk9HUkFNKEZvcnRyYW4pQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDMwLDQ2OApBQ19UWVBFX1VOU0lHTkVEX0xPTkdfTE9OR19JTlRfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciB1bnNpZ25lZCBsb25nIGxvbmcgaW50XSwKICAgIFthY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZ19pbnRdLAogICAgW0FDX0xJTktfSUZFTFNFKAogICAgICAgW19BQ19UWVBFX0xPTkdfTE9OR19TTklQUEVUXSwKICAgICAgIFthY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZ19pbnQ9eWVzXSwKICAgICAgIFthY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZ19pbnQ9bm9dKV0pCiAgaWYgdGVzdCAkYWNfY3ZfdHlwZV91bnNpZ25lZF9sb25nX2xvbmdfaW50ID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW0hBVkVfVU5TSUdORURfTE9OR19MT05HX0lOVF0sIDEsCiAgICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgdW5zaWduZWQgbG9uZyBsb25nIGludCcuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDIyMQpBQ19NSU5HVzMyX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX01JTkdXMzInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NBTk9OSUNBTF9IT1NUCmNhc2UgJGhvc3Rfb3MgaW4KICAqbWluZ3czMiogKSBNSU5HVzMyPXllczs7CgkgICogKSBNSU5HVzMyPW5vOzsKZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjYsNgpzeXNjbWRzeXNjbWQKVDMwLDEwNgptNF9sb2NhdGlvbihfQUNfTElOS0VSX09QVElPTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTI0ClQyOCwxMDYKbTRfbG9jYXRpb24oQUNfSEFWRV9IRUFERVJTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6MzUKVDE4LDUwCl9tNF9zZXRfY29udGVudHNfMV9tNF9zdGFja19yZXZlcnNlKFtfbTRfc2V0KFskMV0pXSwgW19tNF9zZXRfKCQxKV0pCkY4LDgKcGF0c3Vic3RwYXRzdWJzdApUMTEsMTEwCm00X3BhdHN1YnN0bTRfZXhwYW5kX29uY2UoW200X3dhcm4oW3N5bnRheF0sCgkJIFtkbyBub3QgdXNlIG00X3BhdHN1YnN0OiB1c2UgcGF0c3Vic3Qgb3IgbTRfYnBhdHN1YnN0XSldKWRubApwYXRzdWJzdCgkQCkKVDM0LDEwNwptNF9sb2NhdGlvbihfQUNfTElCT0JKU19OT1JNQUxJWkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI5NTAKVDE4LDk0Cl9tNF9zZXRfY29udGVudHNfMl9tNF9zdGFja19yZXZlcnNlKFtfbTRfc2V0XygkMSldLCBbX200X3NldChbJDFdKV0sCiAgWyQyW11fbTRfZGVmbihbX200X3NldF8oJDEpXSkkM10sIFskNFtdXSkKVDE1LDMyMwpBQ19MQU5HKEVybGFuZylhY19leHQ9ZXJsCmFjX2NvbXBpbGU9JyRFUkxDICRFUkxDRkxBR1MgLWIgYmVhbSBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2xpbms9JyRFUkxDICRFUkxDRkxBR1MgLWIgYmVhbSBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQgJiYgZWNobyAiWyNdIS9iaW4vc2giID4gY29uZnRlc3QkYWNfZXhlZXh0ICYmIEFTX0VDSE8oWyJcIiRFUkxcIiAtcnVuIGNvbmZ0ZXN0IHN0YXJ0IC1ydW4gaW5pdCBzdG9wIC1ub3NoZWxsIl0pID4+IGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiBjaG1vZCAreCBjb25mdGVzdCRhY19leGVleHQnCgpUMjcsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfU0laRV9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NTk0ClQyNywxMDYKbTRfbG9jYXRpb24oQUNfSEVBREVSX1NUQVQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjU2NApUOCw4MQptNF9jaG9tcG00X2Zvcm1hdChbWyUuKnNdXSwgbTRfaW5kZXgobTRfdHJhbnNsaXQoW1skMV1dLCBbCi8uXSwgWy8gIF0pWy4vLl0sIFsvLl0pLCBbJDFdKQpUMjQsMwpfbTRfZGl2ZXJ0KElOSVRfUFJFUEFSRSkzMDAKVDEwLDY4Cl9BU19UUl9DUFBfQVNfTElURVJBTF9JRihbJDFdLCBbKl1bCSBdWwpdKShbXSwgWyQwX0lORElSXSwgWyQwX0xJVEVSQUxdKShbJDFdKQpUMTYsNTkwCl9BU19URVNUX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0paWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGFzX3Rlc3RfeD0ndGVzdCAteCcKZWxzZQogIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgYXNfbHNfTF9vcHRpb249TAogIGVsc2UKICAgIGFzX2xzX0xfb3B0aW9uPQogIGZpCiAgYXNfdGVzdF94PScKICAgIGV2YWwgc2ggLWMgJ1wnJwogICAgICBpZiB0ZXN0IC1kICIkW10xIjsgdGhlbgoJdGVzdCAtZCAiJFtdMS8uIjsKICAgICAgZWxzZQoJY2FzZSAkW10xIGluIEAlOkAoCgktKilzZXQgIi4vJFtdMSI7OwoJZXNhYzsKCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkW10xIiAyPi9kZXYvbnVsbGAgaW4gQCU6QCgoCgk/Pz9bW3N4XV0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKICAgICdcJycgc2gKICAnCmZpCmRubCBhc19leGVjdXRhYmxlX3AgaXMgcHJlc2VudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIExpYnRvb2wKZG5sIDEuNS4yMiwgYnV0IGl0IHNob3VsZCBnbyBhd2F5IGF0IHNvbWUgcG9pbnQuCmFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMzAzCl9BU19FQ0hPX05fUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQpjYXNlIGBlY2hvIC1uIHhgIGluIEAlOkAoKCgoKAotbiopCiAgY2FzZSBgZWNobyAneHlcYydgIGluCiAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCiAgeHkpICBFQ0hPX0M9J1xjJzs7CiAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAogICAgICAgRUNIT19UPScJJzs7CiAgZXNhYzs7CiopCiAgRUNIT19OPSctbic7Owplc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMzY1Cl9BQ19JTklUX05PVElDRW00X2NsZWFyZGl2ZXJ0KFtIRUFERVItQ09NTUVOVF0pbTRfZGl2ZXJ0X3RleHQoW0hFQURFUi1DT01NRU5UXSwKW0AlOkAgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KQCU6QCBHZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkdbXWRubAptNF9pZnNldChbQUNfUEFDS0FHRV9TVFJJTkddLCBbIGZvciBBQ19QQUNLQUdFX1NUUklOR10pLl0pCgptNF9pZnNldChbQUNfUEFDS0FHRV9CVUdSRVBPUlRdLAoJIFttNF9kaXZlcnRfdGV4dChbSEVBREVSLUNPTU1FTlRdLAoJCQkgW0AlOkAKQCU6QCBSZXBvcnQgYnVncyB0byA8QUNfUEFDS0FHRV9CVUdSRVBPUlQ+Ll0pXSkKClQ5LDAKQU5fT1VUUFVUClQyNywxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19BTExPQ0EpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MzY2ClQzMCwxMDcKbTRfbG9jYXRpb24oQUNfRkNfTElORV9MRU5HVEgpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjEyOTcKVDI5LDEwNgptNF9sb2NhdGlvbihBQ19DSEVDS19IRUFERVJTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDoyNDkKVDIzLDEwMwpBQ19MQU5HX1BSRVBST0MoRXJsYW5nKV9tNF9kZWZ1bl9wcm8oWyQwXSltNF93YXJuKFtzeW50YXhdLAoJIFskMDogTm8gcHJlcHJvY2Vzc29yIGRlZmluZWQgZm9yIF1fQUNfTEFORylbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX1VJTlQxNl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjIxClQxMyw4MgptNF9kcXVvdGVfZWx0bTRfaWYoWyQjXSwgWzBdLCBbXSwKICAgICAgIFskI10sIFsxXSwgW1tbJDFdXV0sCiAgICAgICBbW1skMV1dLCQwKG00X3NoaWZ0KCRAKSldKQpUMjQsMzIKbTRfZGVmYXVsdF9uYmxhbmtfcXVvdGVkbTRfaWZibGFuayhbJDFdLCBbWyQyXV0sIFtbJDFdXSkKVDExLDgxCkFDX1BST0dfQVdLX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1BST0dTKEFXSywgZ2F3ayBtYXdrIG5hd2sgYXdrLCApW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxMjcyCkFDX0ZVTkNfU1RSRVJST1JfUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19ERUNMUyhbc3RyZXJyb3Jfcl0pCkFDX0NIRUNLX0ZVTkNTKFtzdHJlcnJvcl9yXSkKQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKl0sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcCwKICAgWwogICAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD1ubwogICAgaWYgdGVzdCAkYWNfY3ZfaGF2ZV9kZWNsX3N0cmVycm9yX3IgPSB5ZXM7IHRoZW4KICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCglbWwoJICBjaGFyIGJ1ZlsxMDBdOwoJICBjaGFyIHggPSAqc3RyZXJyb3JfciAoMCwgYnVmLCBzaXplb2YgYnVmKTsKCSAgY2hhciAqcCA9IHN0cmVycm9yX3IgKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CgkgIHJldHVybiAhcCB8fCB4OwoJXV0pXSwKCQkJYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD15ZXMpCiAgICBlbHNlCiAgICAgICMgc3RyZXJyb3JfciBpcyBub3QgZGVjbGFyZWQuICBDaG9vc2UgYmV0d2VlbgogICAgICAjIHN5c3RlbXMgdGhhdCBoYXZlIHJlbGF0aXZlbHkgaW5hY2Nlc3NpYmxlIGRlY2xhcmF0aW9ucyBmb3IgdGhlCiAgICAgICMgZnVuY3Rpb24uICBCZU9TIGFuZCBERUMgVU5JWCA0LjAgZmFsbCBpbiB0aGlzIGNhdGVnb3J5LCBidXQgdGhlCiAgICAgICMgZm9ybWVyIGhhcyBhIHN0cmVycm9yX3IgdGhhdCByZXR1cm5zIGNoYXIqLCB3aGlsZSB0aGUgbGF0dGVyCiAgICAgICMgaGFzIGEgc3RyZXJyb3JfciB0aGF0IHJldHVybnMgYGludCcuCiAgICAgICMgVGhpcyB0ZXN0IHNob3VsZCBzZWdmYXVsdCBvbiB0aGUgREVDIHN5c3RlbS4KICAgICAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUCglleHRlcm4gY2hhciAqc3RyZXJyb3JfciAoKTtdLAoJW1tjaGFyIGJ1ZlsxMDBdOwoJICBjaGFyIHggPSAqc3RyZXJyb3JfciAoMCwgYnVmLCBzaXplb2YgYnVmKTsKCSAgcmV0dXJuICEgaXNhbHBoYSAoeCk7XV0pXSwKCQkgICAgYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcD15ZXMsICwgOikKICAgIGZpCiAgXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19zdHJlcnJvcl9yX2NoYXJfcCA9IHllczsgdGhlbgogIEFDX0RFRklORShbU1RSRVJST1JfUl9DSEFSX1BdLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMTA5Cm00X2xvY2F0aW9uKEFDX1VUSU1FX05VTEwpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTc4MwpUMjgsMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9DSEVDSykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjM2ClQ5LDU3Cm00X2FwcGVuZG00X2RlZmluZShbJDFdLCBtNF9pZmRlZihbJDFdLCBbX200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKQpUMjIsMTIyCl9BQ19MQU5HX0lPX1BST0dSQU0oQylBQ19MQU5HX1BST0dSQU0oW0AlOkBpbmNsdWRlIDxzdGRpby5oPl0sCltGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOwogcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpUMTEsMzcKbTRfbGlzdF9jbXBfJDBfcmF3KG00X2RxdW90ZSgkMSksIG00X2RxdW90ZSgkMikpClQ3LDg0Cl9tNF9mb3IkNFskMV0kNVtdbTRfaWYoWyQxXSwgWyQyXSwgW10sCgkJIFskMChtNF9ldmFsKFskMSArICQzXSksIFskMl0sIFskM10sIFskNF0sIFskNV0pXSkKVDgsMTI0Cl9BQ19FVkFMX200X2RlZnVuX3BybyhbJDBdKV9BQ19SVU5fTE9HKFtldmFsICQxXSwKCSAgICAgW2V2YWwgZWNobyAiXCJcJGFzX21lXCI6JHthc19saW5lbm8tJExJTkVOT306IFwiJDFcIiJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsNTMKX0FDX0RPX1ZBUl9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRE8oWyQkMV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiw5MApfQUNfQ09NUElMRVJfT0JKRVhUX1JFSkVDVCouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTQpUMTIsNzgKbTRfZm9yZWFjaF93bTRfcHVzaGRlZihbJDFdKW00X21hcF9hcmdzX3coWyQyXSwKICBbbTRfZGVmaW5lKFskMV0sXSwgWykkM10pbTRfcG9wZGVmKFskMV0pClQ1LDExMwpBU19JRl9tNF9kZWZ1bl9wcm8oWyQwXSlpZiAkMTsgdGhlbiA6CiAgJDIKbTRfbWFwX2FyZ3NfcGFpcihbXyQwXSwgW18kMF9FTFNFXSwgbTRfc2hpZnQyKCRAKSlmaVtdW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSw1NgpBQ19UWVBFX0lOVDMyX1RfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1RZUEVfSU5UKDMyKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzMsMTA2Cm00X2xvY2F0aW9uKF9BQ19PVVRQVVRfTUFJTl9MT09QKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjE2MDEKVDI0LDEwMwptNF9sb2NhdGlvbihBQ19MQU5HX1BPUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6MTA4ClQxMSwxNjUKX200X2R1bXBkZWZtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbJCNdLCBbMV0sIFttNF9idWlsdGluKFtkdW1wZGVmXSwgWyQxXSldLAogICAgICAgW200X21hcF9hcmdzX3NlcChbbTRfYnVpbHRpbihbZHVtcGRlZl0sXSwgWyldLCBbXSwgJEApXSkKVDIwLDMKX200X2RpdmVydChTSEVMTF9GTikyNTAKVDI3LDE5MTIKX0FDX0NPTVBJTEVSX0VYRUVYVF9ERUZBVUxUIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgojIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCiMgb2YgZXhlZXh0LgpBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIF9BQ19MQU5HIGNvbXBpbGVyIHdvcmtzXSkKYWNfbGlua19kZWZhdWx0PWBBU19FQ0hPKFsiJGFjX2xpbmsiXSkgfCBzZWQgWydzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ11gCgojIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CmFjX2ZpbGVzPSJhLm91dCBjb25mdGVzdC5leGUgY29uZnRlc3QgYS5leGUgYV9vdXQuZXhlIGIub3V0IGNvbmZ0ZXN0LioiCgphY19ybWZpbGVzPQpmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKZG8KICBjYXNlICRhY19maWxlIGluCiAgICBfQUNfQ09NUElMRVJfRVhFRVhUX1JFSkVDVCApIDs7CiAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKICBlc2FjCmRvbmUKcm0gLWYgJGFjX3JtZmlsZXMKCkFTX0lGKFtfQUNfRE9fVkFSKGFjX2xpbmtfZGVmYXVsdCldLApbIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCiMgU28gaWdub3JlIGEgdmFsdWUgb2YgYG5vJywgb3RoZXJ3aXNlIHRoaXMgd291bGQgbGVhZCB0byBgRVhFRVhUID0gbm8nCiMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCiMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCiMgQXV0b2NvbmYuCmZvciBhY19maWxlIGluICRhY19maWxlcyAnJwpkbwogIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQogIGNhc2UgJGFjX2ZpbGUgaW4KICAgIF9BQ19DT01QSUxFUl9FWEVFWFRfUkVKRUNUICkKCTs7CiAgICBbW2FiXV0ub3V0ICkKCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CgkjIGNlcnRhaW5seSByaWdodC4KCWJyZWFrOzsKICAgICouKiApCglpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKCXRoZW4gOjsgZWxzZQoJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiBbJ1teLl0qXChcLi4qXCknXWAKCWZpCgkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKCSMgc2FmZTogY3Jvc3MgY29tcGlsZXJzIG1heSBub3QgYWRkIHRoZSBzdWZmaXggaWYgZ2l2ZW4gYW4gYC1vJwoJIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCgkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKCSMgYWN0dWFsbHkgd29ya2luZy4KCWJyZWFrOzsKICAgICogKQoJYnJlYWs7OwogIGVzYWMKZG9uZQp0ZXN0ICIkYWNfY3ZfZXhlZXh0IiA9IG5vICYmIGFjX2N2X2V4ZWV4dD0KXSwKICAgICAgW2FjX2ZpbGU9JyddKQpBU19JRihbdGVzdCAteiAiJGFjX2ZpbGUiXSwKW0FDX01TR19SRVNVTFQoW25vXSkKX0FDX01TR19MT0dfQ09ORlRFU1QKQUNfTVNHX0ZBSUxVUkUoW19BQ19MQU5HIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXNdLCA3NyldLApbQUNfTVNHX1JFU1VMVChbeWVzXSldKQpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfQUNfTEFORyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWVdKQpBQ19NU0dfUkVTVUxUKFskYWNfZmlsZV0pCmFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CgpUMjQsNjcKQUNfTEFOR19DT05GVEVTVChFcmxhbmcpY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpBQ19MQU5HX0RFRklORVNfUFJPVklERURbXSQxCl9BQ0VPRgpUMTUsODkxCkFDX0ZVTkNfU1RSTkxFTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlNdKWRubApBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pIGRubCBmb3IgY3Jvc3MtY29tcGlsZXMKQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIHN0cm5sZW5dLCBhY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZywKW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sIFtbCiNkZWZpbmUgUyAiZm9vYmFyIgojZGVmaW5lIFNfTEVOIChzaXplb2YgUyAtIDEpCgogIC8qIEF0IGxlYXN0IG9uZSBpbXBsZW1lbnRhdGlvbiBpcyBidWdneTogdGhhdCBvZiBBSVggNC4zIHdvdWxkCiAgICAgZ2l2ZSBzdHJubGVuIChTLCAxKSA9PSAzLiAgKi8KCiAgaW50IGk7CiAgZm9yIChpID0gMDsgaSA8IFNfTEVOICsgMTsgKytpKQogICAgewogICAgICBpbnQgZXhwZWN0ZWQgPSBpIDw9IFNfTEVOID8gaSA6IFNfTEVOOwogICAgICBpZiAoc3RybmxlbiAoUywgaSkgIT0gZXhwZWN0ZWQpCglyZXR1cm4gMTsKICAgIH0KICByZXR1cm4gMDsKXV0pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmc9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmc9bm9dLAoJICAgICAgIFsjIEd1ZXNzIG5vIG9uIEFJWCBzeXN0ZW1zLCB5ZXMgb3RoZXJ3aXNlLgoJCWNhc2UgIiRob3N0X29zIiBpbgoJCSAgYWl4KikgYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmc9bm87OwoJCSAgKikgICAgYWNfY3ZfZnVuY19zdHJubGVuX3dvcmtpbmc9eWVzOzsKCQllc2FjXSldKQp0ZXN0ICRhY19jdl9mdW5jX3N0cm5sZW5fd29ya2luZyA9IG5vICYmIEFDX0xJQk9CSihbc3Rybmxlbl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksNTQ4Cl9BQ19GVU5DX1JFQUxMT0NfSUZfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubApBQ19DSEVDS19IRUFERVJTKHN0ZGxpYi5oKQpBQ19DQUNIRV9DSEVDSyhbZm9yIEdOVSBsaWJjIGNvbXBhdGlibGUgcmVhbGxvY10sIGFjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGwsCltBQ19SVU5fSUZFTFNFKApbQUNfTEFOR19QUk9HUkFNKApbWyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKIyBpbmNsdWRlIDxzdGRsaWIuaD4KI2Vsc2UKY2hhciAqcmVhbGxvYyAoKTsKI2VuZGlmCl1dLAoJCSBbcmV0dXJuICEgcmVhbGxvYyAoMCwgMCk7XSldLAoJICAgICAgIFthY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPXllc10sCgkgICAgICAgW2FjX2N2X2Z1bmNfcmVhbGxvY18wX25vbm51bGw9bm9dLAoJICAgICAgIFthY19jdl9mdW5jX3JlYWxsb2NfMF9ub25udWxsPW5vXSldKQpBU19JRihbdGVzdCAkYWNfY3ZfZnVuY19yZWFsbG9jXzBfbm9ubnVsbCA9IHllc10sIFskMV0sIFskMl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTA2Cm00X2xvY2F0aW9uKEFDX1BST0dfRkNfQ19PKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo0NzAKVDI5LDEwNgptNF9sb2NhdGlvbihBQ19QUk9HUkFNX0NIRUNLKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NDEKVDE2LDIKQUNfTEFOR19TT1VSQ0UoKSQxClQxOSwyMDQKQUNfQ0FOT05JQ0FMX1NZU1RFTV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DQU5PTklDQUxfU1lTVEVNJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NBTk9OSUNBTF9UQVJHRVRdLCBbQUNfQ0FOT05JQ0FMX1RBUkdFVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMAptNF9pbmNsdWRlKGF1dG9jb25mL2dlbmVyYWwubTQpClQ0LDE1NgpkZWZubTRfaWYoWyQjXSwgWzBdLCBbWyQwXV0sCiAgICAgICBbJCNdLCBbMV0sIFttNF9pZmRlZihbJDFdLCBbX200X2RlZm4oWyQxXSldLAoJCQkgICAgW200X2ZhdGFsKFskMDogdW5kZWZpbmVkIG1hY3JvOiAkMV0pXSldLAogICAgICAgW200X21hcF9hcmdzKFskMF0sICRAKV0pClQyMCwzCl9tNF9kaXZlcnQoSEVMUF9FTkQpMTA2ClQxNSwyNjcKX0FDX0NPTkZJR19GT09TbTRfbWFwX2FyZ3NfdyhbJDJdLCBbX0FDX0NPTkZJR19SRUdJU1RFUihbJDFdLF0sIFssIFskM10pXSltNF9kZWZpbmUoW19BQ19TRUVOX0NPTkZJRyhBTlkpXSltNF9kZWZpbmUoW19BQ19TRUVOX0NPTkZJRygkMSldKV9BQ19DT05GSUdfQ09NTUFORFNfSU5JVChbJDRdKWFjX2NvbmZpZ19bXW00X3RvbG93ZXIoWyQxXSk9IiRhY19jb25maWdfW11tNF90b2xvd2VyKFskMV0pIG00X2lmKFskMV0sIFtDT01NQU5EU10sIFskMl0sIFttNF9ub3JtYWxpemUoWyQyXSldKSIKClQyNSwxMDMKbTRfbG9jYXRpb24oQVNfVkFSX0FSSVRIKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE5NjMKVDE0LDQ0MQpBQ19DX1ZBUkFSUkFZU19tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yIHZhcmlhYmxlLWxlbmd0aCBhcnJheXNdLAogICAgYWNfY3ZfY192YXJhcnJheXMsCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKFtdLAoJICBbW3N0YXRpYyBpbnQgeDsgY2hhciBhWysreF07IGFbc2l6ZW9mIGEgLSAxXSA9IDA7IHJldHVybiBhWzBdO11dKV0sCiAgICAgICBbYWNfY3ZfY192YXJhcnJheXM9eWVzXSwKICAgICAgIFthY19jdl9jX3ZhcmFycmF5cz1ub10pXSkKICBpZiB0ZXN0ICRhY19jdl9jX3ZhcmFycmF5cyA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKFtIQVZFX0NfVkFSQVJSQVlTXSwgMSwKICAgICAgW0RlZmluZSB0byAxIGlmIEMgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cy5dKQogIGZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxODQKQUNfQUxMT0NBX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0FMTE9DQScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX0FMTE9DQV0sIFtBQ19GVU5DX0FMTE9DQSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTMxCm00X3NldF9hZGRfYWxsbTRfZGVmaW5lKFtfbTRfc2V0X3NpemUoJDEpXSwgbTRfZXZhbChtNF9zZXRfc2l6ZShbJDFdKQogICsgbTRfbGVuKG00X2lmZGVmKFtfbTRfc2V0X2NsZWFudXAoJDEpXSwgW18kMF9jaGVja10sIFtfJDBdKShbJDFdLCAkQCkpKSkKVDMxLDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX1NUUkVSUk9SX1IpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTYyOQpGNyw0Cm00X2luY3JpbmNyCkY4LDQKX200X2RlZm5kZWZuClQzMywzNgpBQ19MQU5HX0ZVTkNfTElOS19UUlkoRm9ydHJhbiA3NylBQ19MQU5HX1BST0dSQU0oW10sClsgICAgICBjYWxsICQxXSkKVDI4LDEwNwptNF9sb2NhdGlvbihfQUNfQ09NUFVURV9JTlQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjMwNzUKVDEzLDEyNApfbTRfZGVmdW5fcHJvbTRfaWZkZWYoW19tNF9leHBhbnNpb25fc3RhY2tdLCBbXSwgW19tNF9kZWZ1bl9wcm9fb3V0ZXIoWyQxXSldKW00X2V4cGFuc2lvbl9zdGFja19wdXNoKFskMV0pbTRfcHVzaGRlZihbX200X2V4cGFuZGluZygkMSldKQpUMTUsMTE0CkFTX1ZBUl9URVNUX1NFVEFTX0xJVEVSQUxfV09SRF9JRihbJDFdLAogIFskeyQxKzp9IGZhbHNlXSwKICBbeyBhc192YXI9JDE7IGV2YWwgXCR7JGFzX3Zhcis6fSBmYWxzZTsgfV0sCiAgW2V2YWwgXCR7JDErOn0gZmFsc2VdKQpUNywxMTEKQVNfRVhJVF9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfRVhJVF9QUkVQQVJFXSlbXWFzX2ZuX2V4aXQgbTRfaWZ2YWwoWyQxXSwgWyQxXSwgWyRdWz9dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTAzCkFDX0xBTkdfUFJFUFJPQyhGb3J0cmFuIDc3KV9tNF9kZWZ1bl9wcm8oWyQwXSltNF93YXJuKFtzeW50YXhdLAoJIFskMDogTm8gcHJlcHJvY2Vzc29yIGRlZmluZWQgZm9yIF1fQUNfTEFORylbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDEwMwptNF9sb2NhdGlvbihfQVNfQ1JfUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxNzc1ClQxMywxNzUKbTRfZGVmdW5faW5pdG00X2RlZmluZShbJDFdLCBbJDNbXV0pbTRfZGVmdW4oWyQxXSwKICAgWyQyW11fbTRfcG9wZGVmKF1tNF9kcXVvdGUoJFswXSlbKW00X2luZGlyKF1tNF9kcXVvdGUoJFswXSlkbmwKW200X2lmKF1tNF9kcXVvdGUoJFsjXSlbLCBbMF0sIFtdLCBdbTRfZHF1b3RlKFssJF1AKVspKV0sIFttNF9wdXNoZGVmXSkKVDEyLDY0Cl9BU19FQ0hPX0xPR19BU19FQ0hPKFskYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICQxXSwgQVNfTUVTU0FHRV9MT0dfRkQpW10KVDEyLDEzMQpfQVNfRUNIT19MT0dfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX0xJTkVOT19QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTEwCkFDX0RJVkVSVF9QVVNIbTRfZGl2ZXJ0X3N0YWNrX3B1c2goWyQwXSwgWyQxXSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0sIFskMV0pX200X2RpdmVydF9yYXcoX200X2RpdmVydChbJDFdLCBbJDJdKSkKVDI5LDEwNgptNF9sb2NhdGlvbihBQ19IRUFERVJfRElSRU5UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo0ODUKVDE3LDYwNApfQVNfU0hFTExfRk5fV09SS2FzX2ZuX3JldHVybiAoKSB7IChleGl0IFskXTEpOyB9CmFzX2ZuX3N1Y2Nlc3MgKCkgeyBhc19mbl9yZXR1cm4gMDsgfQphc19mbl9mYWlsdXJlICgpIHsgYXNfZm5fcmV0dXJuIDE7IH0KYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQphc19mbl9yZXRfZmFpbHVyZSAoKSB7IHJldHVybiAxOyB9CgpleGl0Y29kZT0wCmFzX2ZuX3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3N1Y2Nlc3MgZmFpbGVkLjsgfQphc19mbl9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KYXNfZm5fcmV0X2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC47IH0KQVNfSUYoWyggc2V0IHg7IGFzX2ZuX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIlskXTEiICldLCBbXSwKICAgICAgW2V4aXRjb2RlPTE7IGVjaG8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHdlcmUgbm90IHNhdmVkLl0pCnRlc3QgeCRleGl0Y29kZSA9IHgwW10KVDI2LDExODAKQUNfQ19GTEVYSUJMRV9BUlJBWV9NRU1CRVJfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBmbGV4aWJsZSBhcnJheSBtZW1iZXJzXSwKICAgIGFjX2N2X2NfZmxleG1lbWJlciwKICAgIFtBQ19DT01QSUxFX0lGRUxTRSgKICAgICAgIFtBQ19MQU5HX1BST0dSQU0oCgkgIFtbI2luY2x1ZGUgPHN0ZGxpYi5oPgoJICAgICNpbmNsdWRlIDxzdGRpby5oPgoJICAgICNpbmNsdWRlIDxzdGRkZWYuaD4KCSAgICBzdHJ1Y3QgcyB7IGludCBuOyBkb3VibGUgZFtdOyB9O11dLAoJICBbW2ludCBtID0gZ2V0Y2hhciAoKTsKCSAgICBzdHJ1Y3QgcyAqcCA9IG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBzLCBkKQoJCQkJICArIG0gKiBzaXplb2YgKGRvdWJsZSkpOwoJICAgIHAtPmRbMF0gPSAwLjA7CgkgICAgcmV0dXJuIHAtPmQgIT0gKGRvdWJsZSAqKSBOVUxMO11dKV0sCiAgICAgICBbYWNfY3ZfY19mbGV4bWVtYmVyPXllc10sCiAgICAgICBbYWNfY3ZfY19mbGV4bWVtYmVyPW5vXSldKQogIGlmIHRlc3QgJGFjX2N2X2NfZmxleG1lbWJlciA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKFtGTEVYSUJMRV9BUlJBWV9NRU1CRVJdLCBbXSwKICAgICAgW0RlZmluZSB0byBub3RoaW5nIGlmIEMgc3VwcG9ydHMgZmxleGlibGUgYXJyYXkgbWVtYmVycywgYW5kIHRvCiAgICAgICAxIGlmIGl0IGRvZXMgbm90LiAgVGhhdCB3YXksIHdpdGggYSBkZWNsYXJhdGlvbiBsaWtlIGBzdHJ1Y3QgcwogICAgICAgeyBpbnQgbjsgZG91YmxlIGRAPDpARkxFWElCTEVfQVJSQVlfTUVNQkVSQDo+QDsgfTsnLCB0aGUgc3RydWN0IGhhY2sKICAgICAgIGNhbiBiZSB1c2VkIHdpdGggcHJlLUM5OSBjb21waWxlcnMuCiAgICAgICBXaGVuIGNvbXB1dGluZyB0aGUgc2l6ZSBvZiBzdWNoIGFuIG9iamVjdCwgZG9uJ3QgdXNlICdzaXplb2YgKHN0cnVjdCBzKScKICAgICAgIGFzIGl0IG92ZXJlc3RpbWF0ZXMgdGhlIHNpemUuICBVc2UgJ29mZnNldG9mIChzdHJ1Y3QgcywgZCknIGluc3RlYWQuCiAgICAgICBEb24ndCB1c2UgJ29mZnNldG9mIChzdHJ1Y3QgcywgZEA8OkAwQDo+QCknLCBhcyB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoCiAgICAgICBNU1ZDIGFuZCB3aXRoIEMrKyBjb21waWxlcnMuXSkKICBlbHNlCiAgICBBQ19ERUZJTkUoW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl0sIDEpCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCwxMDYKbTRfbG9jYXRpb24oX19BQ19GQ19OQU1FX01BTkdMSU5HKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo4OTcKVDI3LDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX01PREVfVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjYwNgpUMjAsMTA3Cm00X2xvY2F0aW9uKEFDX0lOSVQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjEzNjIKVDI3LDEwMQptNF9sb2NhdGlvbihBQ19DX1ZBUkFSUkFZUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MTg3MwpUMjEsOTcKbTRfY29weXJpZ2h0X2NvbmRlbnNlbTRfdGV4dF93cmFwKG00X2JwYXRzdWJzdChtNF9mbGF0dGVuKFtbJDFdXSksClsoQylbLQkgLDAtOV0qXChbMS05XVswLTldWzAtOV1bMC05XVwpXSwgWyhDKSBcMV0pKQpUMTcsOTUwCl9BQ19UWVBFX0lOVF9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpbnQkW10yX3RdLCBbJFtdM10sCiAgICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pCiAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCiAgICAgIyB0aGFuIGhhbGYgb2YgdGhlIGV4cGVjdGVkIHRhcmdldCB3aWR0aC4KICAgICBmb3IgYWNfdHlwZSBpbiBpbnQkW10yX3QgJ2ludCcgJ2xvbmcgaW50JyBcCgkgJ2xvbmcgbG9uZyBpbnQnICdzaG9ydCBpbnQnICdzaWduZWQgY2hhcic7IGRvCiAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKCSBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgIFtBQ19JTkNMVURFU19ERUZBVUxUCgkgICAgIGVudW0geyBOID0gJFtdMiAvIDIgLSAxIH07XSwKCSAgICBbMCA8ICgkYWNfdHlwZSkgKCgoKCgkYWNfdHlwZSkgMSA8PCBOKSA8PCBOKSAtIDEpICogMiArIDEpXSldLAoJIFtBQ19DT01QSUxFX0lGRUxTRSgKCSAgICBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgICAgIFtBQ19JTkNMVURFU19ERUZBVUxUCgkgICAgICAgIGVudW0geyBOID0gJFtdMiAvIDIgLSAxIH07XSwKCSAgICAgICBbKCRhY190eXBlKSAoKCgoKCRhY190eXBlKSAxIDw8IE4pIDw8IE4pIC0gMSkgKiAyICsgMSkKCQkgPCAoJGFjX3R5cGUpICgoKCgoJGFjX3R5cGUpIDEgPDwgTikgPDwgTikgLSAxKSAqIDIgKyAyKV0pXSwKCSAgICBbXSwKCSAgICBbQVNfQ0FTRShbJGFjX3R5cGVdLCBbaW50JFtdMl90XSwKCSAgICAgICBbQVNfVkFSX1NFVChbJFtdM10sIFt5ZXNdKV0sCgkgICAgICAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbJGFjX3R5cGVdKV0pXSldKQogICAgICAgQVNfVkFSX0lGKFskW10zXSwgW25vXSwgW10sIFticmVha10pCiAgICAgZG9uZV0pCiAgQVNfTElORU5PX1BPUAoKVDE3LDE5NgpfQUNfTElCT0JKX1NUUlRPREFDX0xJQk9CSihzdHJ0b2QpCkFDX0NIRUNLX0ZVTkMocG93KQppZiB0ZXN0ICRhY19jdl9mdW5jX3BvdyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfTElCKG0sIHBvdywKCSAgICAgICBbUE9XX0xJQj0tbG1dLAoJICAgICAgIFtBQ19NU0dfV0FSTihbY2Fubm90IGZpbmQgbGlicmFyeSBjb250YWluaW5nIGRlZmluaXRpb24gb2YgcG93XSldKQpmaQoKVDI0LDEyMgpfQUNfTEFOR19JT19QUk9HUkFNKEMrKylBQ19MQU5HX1BST0dSQU0oW0AlOkBpbmNsdWRlIDxzdGRpby5oPl0sCltGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOwogcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpUMzEsMTA1Cm00X2xvY2F0aW9uKF9BQ19MSVNUX01FTUJFUl9JRikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6ODAKVDE3LDIwMwptNF9jcl9ub3RfTGV0dGVycwECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjKiUmJygpJCssLi8wMTIzNDU2Nzg5Ojs8PT4/QFtcXV5fYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tClQxNSw4MDgKQUNfUFJPR19DWFhfQ19PX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSlkbmwKQUNfTEFOR19QVVNIKFtDKytdKWRubApBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkQ1hYIHVuZGVyc3RhbmRzIC1jIGFuZCAtbyB0b2dldGhlcl0sCgkgICAgICAgW2FjX2N2X3Byb2dfY3h4X2Nfb10sCltBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW10pXSkKIyBXZSB0ZXN0IHR3aWNlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZwojIGAubycgZmlsZSB3aXRoIGAtbycsIGFsdGhvdWdoIHRoZXkgd2lsbCBjcmVhdGUgb25lLgphY190cnk9JyRDWFggJENYWEZMQUdTIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiZBU19NRVNTQUdFX0xPR19GRCcKcm0gLWYgY29uZnRlc3QyLioKaWYgX0FDX0RPX1ZBUihhY190cnkpICYmCiAgICAgdGVzdCAtZiBjb25mdGVzdDIuJGFjX29iamV4dCAmJgogICAgIF9BQ19ET19WQVIoYWNfdHJ5KTsgdGhlbgogIGFjX2N2X3Byb2dfY3h4X2Nfbz15ZXMKZWxzZQogIGFjX2N2X3Byb2dfY3h4X2Nfbz1ubwpmaQpybSAtZiBjb25mdGVzdCpdKQppZiB0ZXN0ICRhY19jdl9wcm9nX2N4eF9jX28gPSBubzsgdGhlbgogIEFDX0RFRklORShDWFhfTk9fTUlOVVNfQ19NSU5VU19PLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIEMrKyBjb21waWxlciBkb2Vzbid0IGFjY2VwdAoJICAgICAtYyBhbmQgLW8gdG9nZXRoZXIuXSkKZmkKQUNfTEFOR19QT1AoW0MrK10pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsNzMKQUNfTEFOR19DT01QSUxFUihFcmxhbmcpX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0VSTEFOR19QQVRIX0VSTENdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMTAwMQpBQ19DT05GSUdfVEVTVERJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DT05GSUdfQ09NTUFORFMoWyQxL2F0Y29uZmlnXSwKW2NhdCA+JDEvYXRjb25maWcgPDxBVEVPRgpAJTpAIENvbmZpZ3VyYWJsZSB2YXJpYWJsZSB2YWx1ZXMgZm9yIGJ1aWxkaW5nIHRlc3Qgc3VpdGVzLgpAJTpAIEdlbmVyYXRlZCBieSAkWzBdLgpAJTpAIENvcHlyaWdodCAoQykgbTRfUEFDS0FHRV9ZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKIyBUaGUgdGVzdCBzdWl0ZSB3aWxsIGRlZmluZSB0b3Bfc3JjZGlyPSRhdF90b3Bfc3JjZGlyLy4uLy4uIGV0Yy4KYXRfdGVzdGRpcj0nJDEnCmFic19idWlsZGRpcj0nJGFjX2Fic19idWlsZGRpcicKYXRfc3JjZGlyPSckYWNfc3JjZGlyJwphYnNfc3JjZGlyPSckYWNfYWJzX3NyY2RpcicKYXRfdG9wX3NyY2Rpcj0nJGFjX3RvcF9zcmNkaXInCmFic190b3Bfc3JjZGlyPSckYWNfYWJzX3RvcF9zcmNkaXInCmF0X3RvcF9idWlsZF9wcmVmaXg9JyRhY190b3BfYnVpbGRfcHJlZml4JwphYnNfdG9wX2J1aWxkZGlyPSckYWNfYWJzX3RvcF9idWlsZGRpcicKCiMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEF1dG90ZXN0IDw9IDIuNTliOgphdF90b3BfYnVpbGRkaXI9XCRhdF90b3BfYnVpbGRfcHJlZml4CgpBVVRPVEVTVF9QQVRIPSdtNF9kZWZhdWx0KFskMl0sIFskMV0pJwoKU0hFTEw9XCR7Q09ORklHX1NIRUxMLSckU0hFTEwnfQptNF9wcm92aWRlX2lmKFtBQ19FUkxBTkdfUEFUSF9FUkxdLCBbCkVSTD0nJEVSTCcKXSlkbmwKbTRfcHJvdmlkZV9pZihbQUNfRVJMQU5HX1BBVEhfRVJMQ10sIFsKRVJMQz0nJEVSTEMnCkVSTENGTEFHUz0nJEVSTENGTEFHUycKXSlkbmwKQVRFT0YKXSwKW200X3Byb3ZpZGVfaWYoW0FDX0VSTEFOR19QQVRIX0VSTF0sIFtFUkw9IiRFUkwiCl0pbTRfcHJvdmlkZV9pZihbQUNfRVJMQU5HX1BBVEhfRVJMQ10sIFtFUkxDPSIkRVJMQyIKRVJMQ0ZMQUdTPSIkRVJMQ0ZMQUdTIgpdKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwxMDcKbTRfbG9jYXRpb24oQUNfUFJFUFJPQ19JRkVMU0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI1MTkKVDE4LDMyMTkKQUNfRlVOQ19HRVRMT0FEQVZHX200X2RlZnVuX3BybyhbJDBdKWFjX2hhdmVfZnVuYz1ubyAjIHllcyBtZWFucyB3ZSd2ZSBmb3VuZCBhIHdheSB0byBnZXQgdGhlIGxvYWQgYXZlcmFnZS4KCiMgTWFrZSBzdXJlIGdldGxvYWRhdmcuYyBpcyB3aGVyZSBpdCBiZWxvbmdzLCBhdCBjb25maWd1cmUtdGltZS4KdGVzdCAtZiAiJHNyY2Rpci8kYWNfY29uZmlnX2xpYm9ial9kaXIvZ2V0bG9hZGF2Zy5jIiB8fAogIEFDX01TR19FUlJPUihbJHNyY2Rpci8kYWNfY29uZmlnX2xpYm9ial9kaXIvZ2V0bG9hZGF2Zy5jIGlzIG1pc3NpbmddKQoKYWNfc2F2ZV9MSUJTPSRMSUJTCgojIENoZWNrIGZvciBnZXRsb2FkYXZnLCBidXQgYmUgc3VyZSBub3QgdG8gdG91Y2ggdGhlIGNhY2hlIHZhcmlhYmxlLgooQUNfQ0hFQ0tfRlVOQyhnZXRsb2FkYXZnLCBleGl0IDAsIGV4aXQgMSkpICYmIGFjX2hhdmVfZnVuYz15ZXMKCiMgT24gSFBVWDksIGFuIHVucHJpdmlsZWdlZCB1c2VyIGNhbiBnZXQgbG9hZCBhdmVyYWdlcyB0aHJvdWdoIHRoaXMgZnVuY3Rpb24uCkFDX0NIRUNLX0ZVTkNTKHBzdGF0X2dldGR5bmFtaWMpCgojIFNvbGFyaXMgaGFzIGxpYmtzdGF0IHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgcm9vdC4KQUNfQ0hFQ0tfTElCKGtzdGF0LCBrc3RhdF9vcGVuKQp0ZXN0ICRhY19jdl9saWJfa3N0YXRfa3N0YXRfb3BlbiA9IHllcyAmJiBhY19oYXZlX2Z1bmM9eWVzCgojIFNvbWUgc3lzdGVtcyB3aXRoIC1sdXRpbCBoYXZlIChhbmQgbmVlZCkgLWxrdm0gYXMgd2VsbCwgc29tZSBkbyBub3QuCiMgT24gU29sYXJpcywgLWxrdm0gcmVxdWlyZXMgbmxpc3QgZnJvbSAtbGVsZiwgc28gY2hlY2sgdGhhdCBmaXJzdAojIHRvIGdldCB0aGUgcmlnaHQgYW5zd2VyIGludG8gdGhlIGNhY2hlLgojIEZvciBrc3RhdCBvbiBzb2xhcmlzLCB3ZSBuZWVkIGxpYmVsZiB0byBmb3JjZSB0aGUgZGVmaW5pdGlvbiBvZiBTVlI0IGJlbG93LgppZiB0ZXN0ICRhY19oYXZlX2Z1bmMgPSBubzsgdGhlbgogIEFDX0NIRUNLX0xJQihlbGYsIGVsZl9iZWdpbiwgTElCUz0iLWxlbGYgJExJQlMiKQpmaQppZiB0ZXN0ICRhY19oYXZlX2Z1bmMgPSBubzsgdGhlbgogIEFDX0NIRUNLX0xJQihrdm0sIGt2bV9vcGVuLCBMSUJTPSItbGt2bSAkTElCUyIpCiAgIyBDaGVjayBmb3IgdGhlIDQuNEJTRCBkZWZpbml0aW9uIG9mIGdldGxvYWRhdmcuCiAgQUNfQ0hFQ0tfTElCKHV0aWwsIGdldGxvYWRhdmcsCiAgICBbTElCUz0iLWx1dGlsICRMSUJTIiBhY19oYXZlX2Z1bmM9eWVzIGFjX2N2X2Z1bmNfZ2V0bG9hZGF2Z19zZXRnaWQ9eWVzXSkKZmkKCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vOyB0aGVuCiAgIyBUaGVyZSBpcyBhIGNvbW1vbmx5IGF2YWlsYWJsZSBsaWJyYXJ5IGZvciBSUy82MDAwIEFJWC4KICAjIFNpbmNlIGl0IGlzIG5vdCBhIHN0YW5kYXJkIHBhcnQgb2YgQUlYLCBpdCBtaWdodCBiZSBpbnN0YWxsZWQgbG9jYWxseS4KICBhY19nZXRsb2FkYXZnX0xJQlM9JExJQlMKICBMSUJTPSItTC91c3IvbG9jYWwvbGliICRMSUJTIgogIEFDX0NIRUNLX0xJQihnZXRsb2FkYXZnLCBnZXRsb2FkYXZnLAoJICAgICAgIFtMSUJTPSItbGdldGxvYWRhdmcgJExJQlMiXSwgW0xJQlM9JGFjX2dldGxvYWRhdmdfTElCU10pCmZpCgojIE1ha2Ugc3VyZSBpdCBpcyByZWFsbHkgaW4gdGhlIGxpYnJhcnksIGlmIHdlIHRoaW5rIHdlIGZvdW5kIGl0LAojIG90aGVyd2lzZSBzZXQgdXAgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uLgpBQ19DSEVDS19GVU5DUyhnZXRsb2FkYXZnLCBbXSwKCSAgICAgICBbX0FDX0xJQk9CSl9HRVRMT0FEQVZHXSkKCiMgU29tZSBkZWZpbml0aW9ucyBvZiBnZXRsb2FkYXZnIHJlcXVpcmUgdGhhdCB0aGUgcHJvZ3JhbSBiZSBpbnN0YWxsZWQgc2V0Z2lkLgpBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIGdldGxvYWRhdmcgcmVxdWlyZXMgc2V0Z2lkLAoJICAgICAgIGFjX2N2X2Z1bmNfZ2V0bG9hZGF2Z19zZXRnaWQsCltBQ19FR1JFUF9DUFAoW1lvd3phIEFtIEkgU0VUR0lEIHlldF0sClsjaW5jbHVkZSAiJHNyY2Rpci8kYWNfY29uZmlnX2xpYm9ial9kaXIvZ2V0bG9hZGF2Zy5jIgojaWZkZWYgTERBVl9QUklWSUxFR0VECllvd3phIEFtIEkgU0VUR0lEIHlldApAJTpAZW5kaWZdLAoJICAgICAgYWNfY3ZfZnVuY19nZXRsb2FkYXZnX3NldGdpZD15ZXMsCgkgICAgICBhY19jdl9mdW5jX2dldGxvYWRhdmdfc2V0Z2lkPW5vKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0bG9hZGF2Z19zZXRnaWQgPSB5ZXM7IHRoZW4KICBORUVEX1NFVEdJRD10cnVlCiAgQUNfREVGSU5FKEdFVExPQURBVkdfUFJJVklMRUdFRCwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIGBnZXRsb2FkYXZnJyBmdW5jdGlvbiBuZWVkcyB0byBiZSBydW4gc2V0dWlkCgkgICAgIG9yIHNldGdpZC5dKQplbHNlCiAgTkVFRF9TRVRHSUQ9ZmFsc2UKZmkKQUNfU1VCU1QoTkVFRF9TRVRHSUQpZG5sCgppZiB0ZXN0ICRhY19jdl9mdW5jX2dldGxvYWRhdmdfc2V0Z2lkID0geWVzOyB0aGVuCiAgQUNfQ0FDSEVfQ0hFQ0soZ3JvdXAgb2YgL2Rldi9rbWVtLCBhY19jdl9ncm91cF9rbWVtLApbICMgT24gU29sYXJpcywgL2Rldi9rbWVtIGlzIGEgc3ltbGluay4gIEdldCBpbmZvIG9uIHRoZSByZWFsIGZpbGUuCiAgYWNfbHNfb3V0cHV0PWBscyAtbGdMIC9kZXYva21lbSAyPi9kZXYvbnVsbGAKICAjIElmIHdlIGdvdCBhbiBlcnJvciAoc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgc3ltbGlua3MpLCB0cnkgd2l0aG91dCAtTC4KICB0ZXN0IC16ICIkYWNfbHNfb3V0cHV0IiAmJiBhY19sc19vdXRwdXQ9YGxzIC1sZyAvZGV2L2ttZW1gCiAgYWNfY3ZfZ3JvdXBfa21lbT1gQVNfRUNITyhbIiRhY19sc19vdXRwdXQiXSkgXAogICAgfCBzZWQgLW5lIFsncy9bCSBdWwkgXSovIC9nOwoJICAgICAgIHMvXi5bc1Nyd3gtXSogKlswLTldKiAqXChbXjAtOV0qXCkgICouKi9cMS87CgkgICAgICAgLyAvcy8uKiAvLztwOyddYApdKQogIEFDX1NVQlNUKEtNRU1fR1JPVVAsICRhY19jdl9ncm91cF9rbWVtKWRubApmaQppZiB0ZXN0ICJ4JGFjX3NhdmVfTElCUyIgPSB4OyB0aGVuCiAgR0VUTE9BREFWR19MSUJTPSRMSUJTCmVsc2UKICBHRVRMT0FEQVZHX0xJQlM9YEFTX0VDSE8oWyIkTElCUyJdKSB8IHNlZCAic3wkYWNfc2F2ZV9MSUJTfHwiYApmaQpMSUJTPSRhY19zYXZlX0xJQlMKCkFDX1NVQlNUKEdFVExPQURBVkdfTElCUylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw0NzEKQUNfQVJHX1ZBUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfb25jZShbSEVMUF9WQVJdLCBbWwpTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczpdXSlkbmwKbTRfZGl2ZXJ0X29uY2UoW0hFTFBfVkFSX0VORF0sIFtbClVzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCml0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy5dXSlkbmwKbTRfZXhwYW5kX29uY2UoW200X2RpdmVydF90ZXh0KFtIRUxQX1ZBUl0sCgkJCSAgICAgICBbQVNfSEVMUF9TVFJJTkcoWyQxXSwgWyQyXSwgWyAgICAgICAgICAgICAgXSldKV0sCgkgICAgICAgWyQwKCQxKV0pZG5sCkFDX1NVQlNUKFskMV0pZG5sCl9BQ19BUkdfVkFSX1BSRUNJT1VTKFskMV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMTA0Cm00X2xvY2F0aW9uKEFNX1RZUEVfUFRSRElGRl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzAzClQyNywxMDYKbTRfbG9jYXRpb24oQUNfSEVBREVSX1RJTUUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00Ojc1MgpUMjEsMQpfbTRfZGl2ZXJ0KE00U0gtSU5JVCk2ClQxOCwxCl9BQ19MQU5HX0FCQlJFVihDKWMKVDE3LDE2MDIKX0FDX0lOSVRfREVGQVVMVFNtNF9kaXZlcnRfcHVzaChbREVGQVVMVFNdKWRubAoKdGVzdCAtbiAiJERKRElSIiB8fCBleGVjIEFTX09SSUdJTkFMX1NURElOX0ZEPCYwIDwvZGV2L251bGwKZXhlYyBBU19NRVNTQUdFX0ZEPiYxCgojIE5hbWUgb2YgdGhlIGhvc3QuCiMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKIyBzbyB1bmFtZSBnZXRzIHJ1biB0b28uCmFjX2hvc3RuYW1lPWAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAoKIwojIEluaXRpYWxpemF0aW9ucy4KIwphY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCmFjX2NsZWFuX2ZpbGVzPQphY19jb25maWdfbGlib2JqX2Rpcj0uCkxJQkAmdEBPQkpTPQpjcm9zc19jb21waWxpbmc9bm8Kc3ViZGlycz0KTUZMQUdTPQpNQUtFRkxBR1M9CkFDX1NVQlNUKFtTSEVMTF0pZG5sCkFDX1NVQlNUKFtQQVRIX1NFUEFSQVRPUl0pZG5sCgojIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KQUNfU1VCU1QoW1BBQ0tBR0VfTkFNRV0sCgkgW200X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAgICAgIFsnQUNfUEFDS0FHRV9OQU1FJ10pXSlkbmwKQUNfU1VCU1QoW1BBQ0tBR0VfVEFSTkFNRV0sCgkgW200X2lmZGVmKFtBQ19QQUNLQUdFX1RBUk5BTUVdLCAgIFsnQUNfUEFDS0FHRV9UQVJOQU1FJ10pXSlkbmwKQUNfU1VCU1QoW1BBQ0tBR0VfVkVSU0lPTl0sCgkgW200X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAgIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKQUNfU1VCU1QoW1BBQ0tBR0VfU1RSSU5HXSwKCSBbbTRfaWZkZWYoW0FDX1BBQ0tBR0VfU1RSSU5HXSwgICAgWydBQ19QQUNLQUdFX1NUUklORyddKV0pZG5sCkFDX1NVQlNUKFtQQUNLQUdFX0JVR1JFUE9SVF0sCgkgW200X2lmZGVmKFtBQ19QQUNLQUdFX0JVR1JFUE9SVF0sIFsnQUNfUEFDS0FHRV9CVUdSRVBPUlQnXSldKWRubApBQ19TVUJTVChbUEFDS0FHRV9VUkxdLAoJIFttNF9pZmRlZihbQUNfUEFDS0FHRV9VUkxdLCAgICAgICBbJ0FDX1BBQ0tBR0VfVVJMJ10pXSlkbmwKCm00X2RpdmVydF9wb3AoW0RFRkFVTFRTXSlkbmwKbTRfd3JhcF9saWZvKFttNF9kaXZlcnRfdGV4dChbREVGQVVMVFNdLApbYWNfc3Vic3RfdmFycz0nbTRfc2V0X2R1bXAoW19BQ19TVUJTVF9WQVJTXSwgbTRfbmV3bGluZSknCmFjX3N1YnN0X2ZpbGVzPSdtNF9pZmRlZihbX0FDX1NVQlNUX0ZJTEVTXSwgW200X2RlZm4oW19BQ19TVUJTVF9GSUxFU10pXSknCmFjX3VzZXJfb3B0cz0nCmVuYWJsZV9vcHRpb25fY2hlY2tpbmcKbTRfaWZkZWYoW19BQ19VU0VSX09QVFNdLCBbbTRfZGVmbihbX0FDX1VTRVJfT1BUU10pCl0pJwptNF9pZmRlZihbX0FDX1BSRUNJT1VTX1ZBUlNdLAogIFtfQUNfQVJHX1ZBUl9TVE9SRVtdZG5sCiAgIF9BQ19BUkdfVkFSX1ZBTElEQVRFW11kbmwKICAgYWNfcHJlY2lvdXNfdmFycz0nbTRfZGVmbihbX0FDX1BSRUNJT1VTX1ZBUlNdKSddKQptNF9pZmRlZihbX0FDX0xJU1RfU1VCRElSU10sCiAgW2FjX3N1YmRpcnNfYWxsPSdtNF9kZWZuKFtfQUNfTElTVF9TVUJESVJTXSknXSlkbmwKXSldKWRubAoKVDEzLDMzNQpBQ19SVU5fSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfQ09NUElMRVJfUkVRVUlSRSgpZG5sCm00X2lmdmFsKFskNF0sIFtdLAoJIFtBQ19ESUFHTk9TRShbY3Jvc3NdLAoJCSAgICAgWyQwIGNhbGxlZCB3aXRob3V0IGRlZmF1bHQgdG8gYWxsb3cgY3Jvc3MgY29tcGlsaW5nXSldKWRubApBU19JRihbdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXNdLAogIFttNF9kZWZhdWx0KFskNF0sCgkgICBbQUNfTVNHX0ZBSUxVUkUoW2Nhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZ10pXSldLAogIFtfQUNfUlVOX0lGRUxTRSgkQCldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDY2Cm00X3JlX3N0cmluZ1thYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXzAxMjM0NTY3ODldKgpUMzEsMTA3Cm00X2xvY2F0aW9uKF9BQ19SVU5fTE9HX1NUREVSUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjMxNgpUMjQsMTA2Cm00X2xvY2F0aW9uKEFDX1VOSVNURF9IKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo4MjQKVDMxLDg2Cl9BQ19MQU5HX0lPX1BST0dSQU0oRm9ydHJhbiA3NylBQ19MQU5HX1BST0dSQU0oW10sCltkbmwKICAgICAgb3Blbih1bml0PTksZmlsZT0nY29uZnRlc3Qub3V0JykKICAgICAgY2xvc2UodW5pdD05KQpdKQpUNiwxMjMKX0FDX0ZDX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0xBTkdfQ0FTRShbRm9ydHJhbiA3N10sIFtGNzddLAoJICAgICBbRm9ydHJhbl0sICAgIFtGQ10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw1NQpBQ19UWVBFX0lOVDhfVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfVFlQRV9JTlQoOClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDY2CkFDX1NUUlVDVF9ESVJFTlRfRF9JTk9fbTRfZGVmdW5fcHJvKFskMF0pX0FDX1NUUlVDVF9ESVJFTlQoW2RfaW5vXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDE2MgpBQ19DSEVDS0lOR19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DSEVDS0lORycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQVNfTUVTU0FHRShbY2hlY2tpbmcgJDEuLi5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTA2Cm00X2xvY2F0aW9uKEFDX0NST1NTX0NIRUNLKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NTYKVDE2LDUKX200X2RpdmVydChHUk9XKTEwMDAwClQxNSw5NQpfQUNfTEFOR19PUEVOTVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19TT1VSQ0UoW19BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsOTk5CkFDX1RZUEVfTE9OR19ET1VCTEVfV0lERVJfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0FDSEVfQ0hFQ0soCiAgICBbZm9yIGxvbmcgZG91YmxlIHdpdGggbW9yZSByYW5nZSBvciBwcmVjaXNpb24gdGhhbiBkb3VibGVdLAogICAgW2FjX2N2X3R5cGVfbG9uZ19kb3VibGVfd2lkZXJdLAogICAgW0FDX0NPTVBJTEVfSUZFTFNFKAogICAgICAgW0FDX0xBTkdfQk9PTF9DT01QSUxFX1RSWSgKCSAgW1sjaW5jbHVkZSA8ZmxvYXQuaD4KCSAgICBsb25nIGRvdWJsZSBjb25zdCBhW10gPQoJICAgICAgewoJCSAwLjBMLCBEQkxfTUlOLCBEQkxfTUFYLCBEQkxfRVBTSUxPTiwKCQkgTERCTF9NSU4sIExEQkxfTUFYLCBMREJMX0VQU0lMT04KCSAgICAgIH07CgkgICAgbG9uZyBkb3VibGUKCSAgICBmIChsb25nIGRvdWJsZSB4KQoJICAgIHsKCSAgICAgICByZXR1cm4gKCh4ICsgKHVuc2lnbmVkIGxvbmcgaW50KSAxMCkgKiAoLTEgLyB4KSArIGFbMF0KCQkJKyAoeCA/IGYgKHgpIDogJ2MnKSk7CgkgICAgfQoJICBdXSwKCSAgW1soMCA8ICgoREJMX01BWF9FWFAgPCBMREJMX01BWF9FWFApCgkJICAgKyAoREJMX01BTlRfRElHIDwgTERCTF9NQU5UX0RJRykKCQkgICAtIChMREJMX01BWF9FWFAgPCBEQkxfTUFYX0VYUCkKCQkgICAtIChMREJMX01BTlRfRElHIDwgREJMX01BTlRfRElHKSkpCgkgICAgJiYgKGludCkgTERCTF9FUFNJTE9OID09IDAKCSAgXV0pXSwKICAgICAgIGFjX2N2X3R5cGVfbG9uZ19kb3VibGVfd2lkZXI9eWVzLAogICAgICAgYWNfY3ZfdHlwZV9sb25nX2RvdWJsZV93aWRlcj1ubyldKQogIGlmIHRlc3QgJGFjX2N2X3R5cGVfbG9uZ19kb3VibGVfd2lkZXIgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShbSEFWRV9MT05HX0RPVUJMRV9XSURFUl0sIDEsCiAgICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgdHlwZSBgbG9uZyBkb3VibGUnIHdvcmtzIGFuZCBoYXMgbW9yZSByYW5nZSBvcgogICAgICAgcHJlY2lzaW9uIHRoYW4gYGRvdWJsZScuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDEwOQptNF9sb2NhdGlvbihBQ19TRVRWQlVGX1JFVkVSU0VEKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE3MjMKVDI1LDEwNwptNF9sb2NhdGlvbihBQ19QQVRIX1RPT0wpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoyMDAKVDIzLDQ3Cl9BQ19DT05GSUdfQ09NUFVURV9ERVNUbTRfZm9ybWF0KFtbJS4qc11dLCBtNF9pbmRleChbJDE6XSwgWzpdKSwgWyQxXSkKVDE4LDY3NgpBQ19IRUFERVJfU1lTX1dBSVRfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlXSwKICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaCwKW0FDX0NPTVBJTEVfSUZFTFNFKApbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaWZuZGVmIFdFWElUU1RBVFVTCiMgZGVmaW5lIFdFWElUU1RBVFVTKHN0YXRfdmFsKSAoKHVuc2lnbmVkIGludCkgKHN0YXRfdmFsKSA+PiA4KQojZW5kaWYKI2lmbmRlZiBXSUZFWElURUQKIyBkZWZpbmUgV0lGRVhJVEVEKHN0YXRfdmFsKSAoKChzdGF0X3ZhbCkgJiAyNTUpID09IDApCiNlbmRpZgpdLApbICBpbnQgczsKICB3YWl0ICgmcyk7CiAgcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxO10pXSwKCQkgW2FjX2N2X2hlYWRlcl9zeXNfd2FpdF9oPXllc10sCgkJIFthY19jdl9oZWFkZXJfc3lzX3dhaXRfaD1ub10pXSkKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2ggPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9TWVNfV0FJVF9ILCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCw3MgptNF92ZXJzaW9uX2NvbXBhcmVfbTRfbGlzdF9jbXBfcmF3KF9tNF92ZXJzaW9uX3VubGV0dGVyKFskMV0pLCBfbTRfdmVyc2lvbl91bmxldHRlcihbJDJdKSkKVDIxLDM4NgpfQUNfQ0hFQ0tfTUVNQkVSX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTIuJFtdM10sIFskW100XSwKICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbJFtdNV0sCltzdGF0aWMgJFtdMiBhY19hZ2dyOwppZiAoYWNfYWdnci4kW10zKQpyZXR1cm4gMDtdKV0sCgkJW0FTX1ZBUl9TRVQoWyRbXTRdLCBbeWVzXSldLAogIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFskW101XSwKW3N0YXRpYyAkW10yIGFjX2FnZ3I7CmlmIChzaXplb2YgYWNfYWdnci4kW10zKQpyZXR1cm4gMDtdKV0sCgkJW0FTX1ZBUl9TRVQoWyRbXTRdLCBbeWVzXSldLAoJCVtBU19WQVJfU0VUKFskW100XSwgW25vXSldKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUOSwxNDIKQUNfTEFOR19DX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfQycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTEFORyhDKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMTAzCm00X2xvY2F0aW9uKF9BU19MSU5FTk9fUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMTMyClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfUlVOX0lGRUxTRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6Mjc0OQpUMjUsMQpfbTRfZGl2ZXJ0KE00U0gtU0FOSVRJWkUpNApUMTAsMTIwCl9BU19FU0NBUEVtNF9pZihtNF9pbmRleChtNF90cmFuc2xpdChbWyQxXV0sIFskM10sIFskMiQyJDIkMl0pLCBbJDJdKSwgWy0xXSwKICAgICAgIFskMF9dLCBbbTRfYnBhdHN1YnN0XSkoWyQxXSwgW1skMiQzXV0sIFtcXFwmXSkKVDIxLDE5MgpfQUNfRjc3X05BTUVfTUFOR0xJTkdfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfRjc3X0xJQlJBUllfTERGTEFHU10pZG5sCkFDX1JFUVVJUkUoW0FDX0Y3N19EVU1NWV9NQUlOXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpZG5sCl9fQUNfRkNfTkFNRV9NQU5HTElORwpBQ19MQU5HX1BPUChGb3J0cmFuIDc3KWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDEwMgptNF9sb2NhdGlvbihfQVNfRVhJVF9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjUzNQpUMzQsMTA4Cm00X2xvY2F0aW9uKEFNX0ZVTkNfRVJST1JfQVRfTElORSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1MDUKVDE1LDE2NQpfbTRfc2V0X2FkZF9hbGxtNF9pZihbJCNdLCBbMl0sIFtdLAogICAgICAgW200X2lmZGVmKFtfbTRfc2V0KFskMV0sJDMpXSwgW10sCgkJIFttNF9kZWZpbmUoW19tNF9zZXQoWyQxXSwkMyldLCBbMV0pbTRfcHVzaGRlZihbX200X3NldChbJDFdKV0sCgkgICBbJDNdKS1dKSQwKFskMV0sIG00X3NoaWZ0MigkQCkpXSkKVDIzLDMyMgpfQUNfQ09NUElMRV9JRkVMU0VfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKICBBU19JRihbX0FDX0RPX1NUREVSUigkYWNfY29tcGlsZSkgJiYgewoJIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnIiB8fAoJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0XSwKICAgICAgW2FjX3JldHZhbD0wXSwKICAgICAgW19BQ19NU0dfTE9HX0NPTkZURVNUCglhY19yZXR2YWw9MV0pCiAgQVNfTElORU5PX1BPUAogIEFTX1NFVF9TVEFUVVMoWyRhY19yZXR2YWxdKQoKVDE3LDc4MApfQVNfRVJST1JfUFJFUEFSRUFTX1JFUVVJUkVfU0hFTExfRk4oW2FzX2ZuX2Vycm9yXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FzX2ZuX2Vycm9yXSwgW1NUQVRVUyBFUlJPUl1tNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKICAgICAgW1sgW1tMSU5FTk8gTE9HX0ZEXV1dXSksCiAgICBbT3V0cHV0ICJgYmFzZW5hbWUgQFN8QDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci5dCm00X2lmdmFsKEFTX01FU1NBR0VfTE9HX0ZELAogICAgW1tJZiBMSU5FTk8gYW5kIExPR19GRCBhcmUgcHJvdmlkZWQsIGFsc28gb3V0cHV0IHRoZSBlcnJvciB0byBMT0dfRkQsCiAgICAgIHJlZmVyZW5jaW5nIExJTkVOTy5dXSkKICAgIFtUaGVuIGV4aXQgdGhlIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLl0pXSwKWyAgYXNfc3RhdHVzPSRbMV07IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQptNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKW200X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSwgWyRbNF1dKWRubAogIGlmIHRlc3QgIiRbNF0iOyB0aGVuCiAgICBBU19MSU5FTk9fUFVTSChbJFszXV0pCiAgICBfQVNfRUNIT19MT0coW2Vycm9yOiAkWzJdXSkKICBmaQptNF9kZWZpbmUoW0FTX01FU1NBR0VfTE9HX0ZEXSldLCBbbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKV0pZG5sCiAgQVNfTUVTU0FHRShbZXJyb3I6ICRbMl1dLCBbMl0pCl9tNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlkbmwKICBBU19FWElUKFskYXNfc3RhdHVzXSldKQpUMTIsMApBQ19MSUJTT1VSQ0UKVDksNDAKQUNfRVhFRVhUX200X2RlZnVuX3BybyhbJDBdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTI0Cl9BQ19DT01QVVRFX0lOVF9SVU5fQUNfUlVOX0lGRUxTRShbQUNfTEFOR19JTlRfU0FWRShbJDNdLCBbJDFdKV0sCgkJW2VjaG8gPj5jb25mdGVzdC52YWw7IHJlYWQgJDIgPGNvbmZ0ZXN0LnZhbDsgJDRdLCBbJDVdKQpybSAtZiBjb25mdGVzdC52YWwKClQxMCwxODcKQUNfVlBSSU5URl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19WUFJJTlRGJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfVlBSSU5URl0sIFtBQ19GVU5DX1ZQUklOVEYoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDEwOQptNF9sb2NhdGlvbihBTV9GVU5DX01LVElNRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxMTk5ClQyMCwxODYxCl9BQ19BUkdfVkFSX1ZBTElEQVRFbTRfZGl2ZXJ0X3RleHQoW0lOSVRfUFJFUEFSRV0sClsjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCiMgdmFsdWUuCmFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQpmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwogIGV2YWwgYWNfb2xkX3NldD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0CiAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCiAgZXZhbCBhY19uZXdfdmFsPVwkYWNfZW52XyR7YWNfdmFyfV92YWx1ZQogIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KICAgIHNldCwpCiAgICAgIEFTX01FU1NBR0UoW2Vycm9yOiBgJGFjX3Zhcicgd2FzIHNldCB0byBgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW5dLCAyKQogICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwogICAgLHNldCkKICAgICAgQVNfTUVTU0FHRShbZXJyb3I6IGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuXSwgMikKICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKICAgICwpOzsKICAgICopCiAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KCSMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBkbyBub3QgbGVhZCB0byBmYWlsdXJlLgoJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCglhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKCWlmIHRlc3QgIiRhY19vbGRfdmFsX3ciICE9ICIkYWNfbmV3X3ZhbF93IjsgdGhlbgoJICBBU19NRVNTQUdFKFtlcnJvcjogYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46XSwgMikKCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKCWVsc2UKCSAgQVNfTUVTU0FHRShbd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOl0sIDIpCgkgIGV2YWwgJGFjX3Zhcj1cJGFjX29sZF92YWwKCWZpCglBU19NRVNTQUdFKFsgIGZvcm1lciB2YWx1ZTogIGAkYWNfb2xkX3ZhbCddLCAyKQoJQVNfTUVTU0FHRShbICBjdXJyZW50IHZhbHVlOiBgJGFjX25ld192YWwnXSwgMikKICAgICAgZmk7OwogIGVzYWMKICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCiAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCiAgICBjYXNlICRhY19uZXdfdmFsIGluCiAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gQVNfRUNITyhbIiRhY19uZXdfdmFsIl0pIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OwogICAgZXNhYwogICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCiAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgogICAgICAqKSBBU19WQVJfQVBQRU5EKFthY19jb25maWd1cmVfYXJnc10sIFsiICckYWNfYXJnJyJdKSA7OwogICAgZXNhYwogIGZpCmRvbmUKaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgogIEFTX01FU1NBR0UoW2Vycm9yOiBpbiBgJGFjX3B3ZCc6XSwgMikKICBBU19NRVNTQUdFKFtlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkXSwgMikKICBBU19FUlJPUihbcnVuIGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXJdKQpmaV0pZG5sCgpUMTQsNTIzCkFDX1RZUEVfU0lHTkFMX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RZUEVfU0lHTkFMJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DQUNIRV9DSEVDSyhbcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzXSwgYWNfY3ZfdHlwZV9zaWduYWwsCltBQ19DT01QSUxFX0lGRUxTRSgKW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c2lnbmFsLmg+Cl0sCgkJIFtyZXR1cm4gKihzaWduYWwgKDAsIDApKSAoMCkgPT0gMTtdKV0sCgkJICAgW2FjX2N2X3R5cGVfc2lnbmFsPWludF0sCgkJICAgW2FjX2N2X3R5cGVfc2lnbmFsPXZvaWRdKV0pCkFDX0RFRklORV9VTlFVT1RFRChSRVRTSUdUWVBFLCAkYWNfY3ZfdHlwZV9zaWduYWwsCgkJICAgW0RlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzCgkJICAgIChgaW50JyBvciBgdm9pZCcpLl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMjkwCkFDX0lOVF8xNl9CSVRTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0lOVF8xNl9CSVRTJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DSEVDS19TSVpFT0YoW2ludF0pCnRlc3QgJGFjX2N2X3NpemVvZl9pbnQgPSAyICYmCiAgQUNfREVGSU5FKElOVF8xNl9CSVRTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiBgc2l6ZW9mIChpbnQpJyA9IDIuICBPYnNvbGV0ZSwgdXNlIGBTSVpFT0ZfSU5UJy5dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsNAptNF9xdW90ZVskKl0KVDE1LDQKbTRfUEFDS0FHRV9ZRUFSMjAxMApUNDQsMTA3Cm00X2xvY2F0aW9uKEFDX1ZBTElEQVRFX0NBQ0hFRF9TWVNURU1fVFVQTEUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE4NjYKVDMwLDEwNgptNF9sb2NhdGlvbihBQ19QUkVGSVhfUFJPR1JBTSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6NDY1ClQxMCwyMTEKbTRfZHVtcGRlZm00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFskMDogbWlzc2luZyBhcmd1bWVudF0pXSwKICAgICAgIFskI10sIFsxXSwgW200X2lmZGVmKFskMV0sIFttNF9lcnJwcmludG4oCiAgWyQxOgldbTRfZHF1b3RlKF9tNF9kZWZuKFskMV0pKSldLCBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDE1LDE5MwptNF9jcl9ub3RfYWxudW0BAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyolJicoKSQrLC4vOjs8PT4/QFtcXV5fYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tClQ2LDIxCl9BU19JRmVsaWYgJDE7IHRoZW4gOgogICQyCgpUMTQsMzY2CkFDX0ZVTkNfTUFMTE9DX200X2RlZnVuX3BybyhbJDBdKV9BQ19GVU5DX01BTExPQ19JRigKICBbQUNfREVGSU5FKFtIQVZFX01BTExPQ10sIDEsCgkgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSBHTlUgbGliYyBjb21wYXRpYmxlIGBtYWxsb2MnCgkgICAgICBmdW5jdGlvbiwgYW5kIHRvIDAgb3RoZXJ3aXNlLl0pXSwKICBbQUNfREVGSU5FKFtIQVZFX01BTExPQ10sIDApCiAgIEFDX0xJQk9CSihtYWxsb2MpCiAgIEFDX0RFRklORShbbWFsbG9jXSwgW3JwbF9tYWxsb2NdLAogICAgICBbRGVmaW5lIHRvIHJwbF9tYWxsb2MgaWYgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywxNQpBU19WQVJfUE9QREVGbTRfcG9wZGVmKFskMV0pClQxMSwyODQKQUNfTUVNT1JZX0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTUVNT1JZX0gnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX0hFQURFUihtZW1vcnkuaCwKCQlbQUNfREVGSU5FKFtORUVEX01FTU9SWV9IXSwgMSwKCQkJICAgW1NhbWUgYXMgYEhBVkVfTUVNT1JZX0gnLCBkb24ndCBkZXBlbmQgb24gbWUuXSldKQpBQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIG1lbW9yeS5oKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjMsMTAyCm00X2xvY2F0aW9uKEFTX1JFUVVJUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MzUzCkY2LDMKbTRfbGVubGVuClQxNCw0MgptNF9kaXZlcnRfdGV4dG00X2RpdmVydF9wdXNoKFskMV0pJDIKbTRfZGl2ZXJ0X3BvcChbJDFdKQpUMjIsMwpfbTRfZGl2ZXJ0KEhFTFBfQ0FOT04pMTAxClQyMSw2NjkKX0FDX0xJQk9CSlNfTk9STUFMSVpFX200X2RlZnVuX3BybyhbJDBdKWFjX2xpYm9ianM9CmFjX2x0bGlib2Jqcz0KbTRfaWZuZGVmKFtBTV9DX1BST1RPVFlQRVNdLCBbVT0KXSlkbmwKZm9yIGFjX2kgaW4gOiAkTElCQCZ0QE9CSlM7IGRvIHRlc3QgIngkYWNfaSIgPSB4OiAmJiBjb250aW51ZQogICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKICBhY19pPWBBU19FQ0hPKFsiJGFjX2kiXSkgfCBzZWQgIiRhY19zY3JpcHQiYAogICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KICBBU19WQVJfQVBQRU5EKFthY19saWJvYmpzXSwgWyIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiXSkKICBBU19WQVJfQVBQRU5EKFthY19sdGxpYm9ianNdLCBbIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJ10pCmRvbmUKQUNfU1VCU1QoW0xJQkAmdEBPQkpTXSwgWyRhY19saWJvYmpzXSkKQUNfU1VCU1QoW0xUTElCT0JKU10sIFskYWNfbHRsaWJvYmpzXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDk0CkFTX1VOU0VUX200X2RlZnVuX3BybyhbJDBdKXsgQVNfTElURVJBTF9XT1JEX0lGKFskMV0sIFtdLCBbZXZhbCBdKSQxPTsgdW5zZXQgJDE7fVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTE1CkFTX1ZBUl9HRVRBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwKCSAgICAgICBbJCQxXSwKICBbYGV2YWwgJ2FzX3ZhbD0keydfQVNfRVNDQVBFKFtbJDFdXSwgW2BdLCBbXF0pJ307QVNfRUNITyhbIiRhc192YWwiXSknYF0pClQxNywxODEyCkFDX0hFQURFUl9TVERCT09MX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtmb3Igc3RkYm9vbC5oIHRoYXQgY29uZm9ybXMgdG8gQzk5XSwKICAgW2FjX2N2X2hlYWRlcl9zdGRib29sX2hdLAogICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgKICAgICAgW1sKI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2lmbmRlZiBib29sCiAiZXJyb3I6IGJvb2wgaXMgbm90IGRlZmluZWQiCiNlbmRpZgojaWZuZGVmIGZhbHNlCiAiZXJyb3I6IGZhbHNlIGlzIG5vdCBkZWZpbmVkIgojZW5kaWYKI2lmIGZhbHNlCiAiZXJyb3I6IGZhbHNlIGlzIG5vdCAwIgojZW5kaWYKI2lmbmRlZiB0cnVlCiAiZXJyb3I6IHRydWUgaXMgbm90IGRlZmluZWQiCiNlbmRpZgojaWYgdHJ1ZSAhPSAxCiAiZXJyb3I6IHRydWUgaXMgbm90IDEiCiNlbmRpZgojaWZuZGVmIF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkCiAiZXJyb3I6IF9fYm9vbF90cnVlX2ZhbHNlX2FyZV9kZWZpbmVkIGlzIG5vdCBkZWZpbmVkIgojZW5kaWYKCglzdHJ1Y3QgcyB7IF9Cb29sIHM6IDE7IF9Cb29sIHQ7IH0gczsKCgljaGFyIGFbdHJ1ZSA9PSAxID8gMSA6IC0xXTsKCWNoYXIgYltmYWxzZSA9PSAwID8gMSA6IC0xXTsKCWNoYXIgY1tfX2Jvb2xfdHJ1ZV9mYWxzZV9hcmVfZGVmaW5lZCA9PSAxID8gMSA6IC0xXTsKCWNoYXIgZFsoYm9vbCkgMC41ID09IHRydWUgPyAxIDogLTFdOwoJLyogU2VlIGJvZHkgb2YgbWFpbiBwcm9ncmFtIGZvciAnZScuICAqLwoJY2hhciBmWyhfQm9vbCkgMC4wID09IGZhbHNlID8gMSA6IC0xXTsKCWNoYXIgZ1t0cnVlXTsKCWNoYXIgaFtzaXplb2YgKF9Cb29sKV07CgljaGFyIGlbc2l6ZW9mIHMudF07CgllbnVtIHsgaiA9IGZhbHNlLCBrID0gdHJ1ZSwgbCA9IGZhbHNlICogdHJ1ZSwgbSA9IHRydWUgKiAyNTYgfTsKCS8qIFRoZSBmb2xsb3dpbmcgZmFpbHMgZm9yCgkgICBIUCBhQysrL0FOU0kgQyBCMzkxMEIgQS4wNS41NSBbRGVjIDA0IDIwMDNdLiAqLwoJX0Jvb2wgblttXTsKCWNoYXIgb1tzaXplb2YgbiA9PSBtICogc2l6ZW9mIG5bMF0gPyAxIDogLTFdOwoJY2hhciBwWy0xIC0gKF9Cb29sKSAwIDwgMCAmJiAtMSAtIChib29sKSAwIDwgMCA/IDEgOiAtMV07CgkvKiBDYXRjaCBhIGJ1ZyBpbiBhbiBIUC1VWCBDIGNvbXBpbGVyLiAgU2VlCgkgICBodHRwOi8vZ2NjLmdudS5vcmcvbWwvZ2NjLXBhdGNoZXMvMjAwMy0xMi9tc2cwMjMwMy5odG1sCgkgICBodHRwOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvYnVnLWNvcmV1dGlscy8yMDA1LTExL21zZzAwMTYxLmh0bWwKCSAqLwoJX0Jvb2wgcSA9IHRydWU7CglfQm9vbCAqcHEgPSAmcTsKICAgICAgXV0sCiAgICAgIFtbCglib29sIGUgPSAmczsKCSpwcSB8PSBxOwoJKnBxIHw9ICEgcTsKCS8qIFJlZmVyIHRvIGV2ZXJ5IGRlY2xhcmVkIHZhbHVlLCB0byBhdm9pZCBjb21waWxlciBvcHRpbWl6YXRpb25zLiAgKi8KCXJldHVybiAoIWEgKyAhYiArICFjICsgIWQgKyAhZSArICFmICsgIWcgKyAhaCArICFpICsgISFqICsgIWsgKyAhIWwKCQkrICFtICsgIW4gKyAhbyArICFwICsgIXEgKyAhcHEpOwogICAgICBdXSldLAogICAgICBbYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaD15ZXNdLAogICAgICBbYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaD1ub10pXSkKQUNfQ0hFQ0tfVFlQRVMoW19Cb29sXSkKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGJvb2xfaCA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NUREJPT0xfSCwgMSwgW0RlZmluZSB0byAxIGlmIHN0ZGJvb2wuaCBjb25mb3JtcyB0byBDOTkuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMiwxNDcKQUNfRjc3X0xJQlJBUllfTERGTEFHU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0Y3N10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuIDc3KWRubApfQUNfRkNfTElCUkFSWV9MREZMQUdTCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMTAzCm00X2xvY2F0aW9uKF9BU19MTl9TX1BSRVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTE4NApUMTIsNDY5NwpBQ19QQVRIX1hUUkFfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUEFUSF9YXSlkbmwKaWYgdGVzdCAiJG5vX3giID0geWVzOyB0aGVuCiAgIyBOb3QgYWxsIHByb2dyYW1zIG1heSB1c2UgdGhpcyBzeW1ib2wsIGJ1dCBpdCBkb2VzIG5vdCBodXJ0IHRvIGRlZmluZSBpdC4KICBBQ19ERUZJTkUoW1hfRElTUExBWV9NSVNTSU5HXSwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIFggV2luZG93IFN5c3RlbSBpcyBtaXNzaW5nIG9yIG5vdCBiZWluZyB1c2VkLl0pCiAgWF9DRkxBR1M9IFhfUFJFX0xJQlM9IFhfTElCUz0gWF9FWFRSQV9MSUJTPQplbHNlCiAgaWYgdGVzdCAtbiAiJHhfaW5jbHVkZXMiOyB0aGVuCiAgICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1JJHhfaW5jbHVkZXMiCiAgZmkKCiAgIyBJdCB3b3VsZCBhbHNvIGJlIG5pY2UgdG8gZG8gdGhpcyBmb3IgYWxsIC1MIG9wdGlvbnMsIG5vdCBqdXN0IHRoaXMgb25lLgogIGlmIHRlc3QgLW4gIiR4X2xpYnJhcmllcyI7IHRoZW4KICAgIFhfTElCUz0iJFhfTElCUyAtTCR4X2xpYnJhcmllcyIKICAgICMgRm9yIFNvbGFyaXM7IHNvbWUgdmVyc2lvbnMgb2YgU3VuIENDIHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtUiBhbmQKICAgICMgb3RoZXJzIHJlcXVpcmUgbm8gc3BhY2UuICBXb3JkcyBhcmUgbm90IHN1ZmZpY2llbnQgLiAuIC4gLgogICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZV0pCiAgICBhY194c2F2ZV9MSUJTPSRMSUJTOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKICAgIGFjX3hzYXZlX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9JGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWcKICAgIGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9eWVzCiAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAogICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKQogICAgICAgWF9MSUJTPSIkWF9MSUJTIC1SJHhfbGlicmFyaWVzIl0sCiAgICAgIFtMSUJTPSIkYWNfeHNhdmVfTElCUyAtUiAkeF9saWJyYXJpZXMiCiAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKQoJICBYX0xJQlM9IiRYX0xJQlMgLVIgJHhfbGlicmFyaWVzIl0sCgkgW0FDX01TR19SRVNVTFQoW25laXRoZXIgd29ya3NdKV0pXSkKICAgIGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWc9JGFjX3hzYXZlX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWcKICAgIExJQlM9JGFjX3hzYXZlX0xJQlMKICBmaQoKICAjIENoZWNrIGZvciBzeXN0ZW0tZGVwZW5kZW50IGxpYnJhcmllcyBYIHByb2dyYW1zIG11c3QgbGluayB3aXRoLgogICMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgUjYgbGlicmFyaWVzCiAgIyAoLWxJQ0UpLCBzaW5jZSB3ZSBtYXkgbmVlZCAtbHNvY2tldCBvciB3aGF0ZXZlciBmb3IgWCBsaW5raW5nLgoKICBpZiB0ZXN0ICIkSVNDIiA9IHllczsgdGhlbgogICAgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sbnNsX3MgLWxpbmV0IgogIGVsc2UKICAgICMgTWFydHluIEpvaG5zb24gc2F5cyB0aGlzIGlzIG5lZWRlZCBmb3IgVWx0cml4LCBpZiB0aGUgWAogICAgIyBsaWJyYXJpZXMgd2VyZSBidWlsdCB3aXRoIERFQ25ldCBzdXBwb3J0LiAgQW5kIEthcmwgQmVycnkgc2F5cwogICAgIyB0aGUgQWxwaGEgbmVlZHMgZG5ldF9zdHViIChkbmV0IGRvZXMgbm90IGV4aXN0KS4KICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgJFhfTElCUyAtbFgxMSIKICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX0NBTEwoW10sIFtYT3BlbkRpc3BsYXldKV0sCgkJICAgW10sCiAgICBbQUNfQ0hFQ0tfTElCKGRuZXQsIGRuZXRfbnRvYSwgW1hfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGRuZXQiXSkKICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSA9IG5vOyB0aGVuCiAgICAgIEFDX0NIRUNLX0xJQihkbmV0X3N0dWIsIGRuZXRfbnRvYSwKCVtYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxkbmV0X3N0dWIiXSkKICAgIGZpXSkKICAgIExJQlM9IiRhY194c2F2ZV9MSUJTIgoKICAgICMgbXNoQGNpcy51ZmwuZWR1IHNheXMgLWxuc2wgKGFuZCAtbHNvY2tldCkgYXJlIG5lZWRlZCBmb3IgaGlzIDM4Ni9BVCwKICAgICMgdG8gZ2V0IHRoZSBTeXNWIHRyYW5zcG9ydCBmdW5jdGlvbnMuCiAgICAjIENoYWQgUi4gTGFyc29uIHNheXMgdGhlIFB5cmFtaXMgTUlTLUVTIHJ1bm5pbmcgREMvT1N4IChTVlI0KQogICAgIyBuZWVkcyAtbG5zbC4KICAgICMgVGhlIG5zbCBsaWJyYXJ5IHByZXZlbnRzIHByb2dyYW1zIGZyb20gb3BlbmluZyB0aGUgWCBkaXNwbGF5CiAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gVC5FLiBEaWNrZXkuCiAgICAjIFRoZSBmdW5jdGlvbnMgZ2V0aG9zdGJ5bmFtZSwgZ2V0c2VydmJ5bmFtZSwgYW5kIGluZXRfYWRkciBhcmUKICAgICMgaW4gLWxic2Qgb24gTHlueE9TIDMuMC4xL2kzODYsIGFjY29yZGluZyB0byBMYXJzIEhlY2tpbmcuCiAgICBBQ19DSEVDS19GVU5DKGdldGhvc3RieW5hbWUpCiAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgogICAgICBBQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lLCBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2wiKQogICAgICBpZiB0ZXN0ICRhY19jdl9saWJfbnNsX2dldGhvc3RieW5hbWUgPSBubzsgdGhlbgoJQUNfQ0hFQ0tfTElCKGJzZCwgZ2V0aG9zdGJ5bmFtZSwgWF9FWFRSQV9MSUJTPSIkWF9FWFRSQV9MSUJTIC1sYnNkIikKICAgICAgZmkKICAgIGZpCgogICAgIyBsaWVkZXJAc2t5bGVyLm1hdmQuaG9uZXl3ZWxsLmNvbSBzYXlzIHdpdGhvdXQgLWxzb2NrZXQsCiAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQKICAgICMgMi4wLiAgQnV0IC1sc29ja2V0IGlzIGJyb2tlbiBvbiBJUklYIDUuMiAoYW5kIGlzIG5vdCBuZWNlc3NhcnkKICAgICMgb24gbGF0ZXIgdmVyc2lvbnMpLCBzYXlzIFNpbW9uIExlaW5lbjogaXQgY29udGFpbnMgZ2V0aG9zdGJ5KgogICAgIyB2YXJpYW50cyB0aGF0IGRvbid0IHVzZSB0aGUgbmFtZSBzZXJ2ZXIgKG9yIHNvbWV0aGluZykuICAtbHNvY2tldAogICAgIyBtdXN0IGJlIGdpdmVuIGJlZm9yZSAtbG5zbCBpZiBib3RoIGFyZSBuZWVkZWQuICBXZSBhc3N1bWUgdGhhdAogICAgIyBpZiBjb25uZWN0IG5lZWRzIC1sbnNsLCBzbyBkb2VzIGdldGhvc3RieW5hbWUuCiAgICBBQ19DSEVDS19GVU5DKGNvbm5lY3QpCiAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX2Nvbm5lY3QgPSBubzsgdGhlbgogICAgICBBQ19DSEVDS19MSUIoc29ja2V0LCBjb25uZWN0LCBYX0VYVFJBX0xJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMiLCAsCgkkWF9FWFRSQV9MSUJTKQogICAgZmkKCiAgICAjIEd1aWxsZXJtbyBHb21leiBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCiAgICBBQ19DSEVDS19GVU5DKHJlbW92ZSkKICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcmVtb3ZlID0gbm87IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKHBvc2l4LCByZW1vdmUsIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbHBvc2l4IikKICAgIGZpCgogICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KICAgIEFDX0NIRUNLX0ZVTkMoc2htYXQpCiAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KICAgICAgQUNfQ0hFQ0tfTElCKGlwYywgc2htYXQsIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbGlwYyIpCiAgICBmaQogIGZpCgogICMgQ2hlY2sgZm9yIGxpYnJhcmllcyB0aGF0IFgxMVI2IFh0L1hhdyBwcm9ncmFtcyBuZWVkLgogIGFjX3NhdmVfTERGTEFHUz0kTERGTEFHUwogIHRlc3QgLW4gIiR4X2xpYnJhcmllcyIgJiYgTERGTEFHUz0iJExERkxBR1MgLUwkeF9saWJyYXJpZXMiCiAgIyBTTSBuZWVkcyBJQ0UgdG8gKGR5bmFtaWNhbGx5KSBsaW5rIHVuZGVyIFN1bk9TIDQueCAoc28gd2UgaGF2ZSB0bwogICMgY2hlY2sgZm9yIElDRSBmaXJzdCksIGJ1dCB3ZSBtdXN0IGxpbmsgaW4gdGhlIG9yZGVyIC1sU00gLWxJQ0Ugb3IKICAjIHdlIGdldCB1bmRlZmluZWQgc3ltYm9scy4gIFNvIGFzc3VtZSB3ZSBoYXZlIFNNIGlmIHdlIGhhdmUgSUNFLgogICMgVGhlc2UgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBiZWZvcmUgLWxYMTEsIHVubGlrZSB0aGUgb3RoZXIKICAjIGxpYnJhcmllcyB3ZSBjaGVjayBmb3IgYmVsb3csIHNvIHVzZSBhIGRpZmZlcmVudCB2YXJpYWJsZS4KICAjIEpvaG4gSW50ZXJyYW50ZSwgS2FybCBCZXJyeQogIEFDX0NIRUNLX0xJQihJQ0UsIEljZUNvbm5lY3Rpb25OdW1iZXIsCiAgICBbWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxTTSAtbElDRSJdLCAsICRYX0VYVFJBX0xJQlMpCiAgTERGTEFHUz0kYWNfc2F2ZV9MREZMQUdTCgpmaQpBQ19TVUJTVChYX0NGTEFHUylkbmwKQUNfU1VCU1QoWF9QUkVfTElCUylkbmwKQUNfU1VCU1QoWF9MSUJTKWRubApBQ19TVUJTVChYX0VYVFJBX0xJQlMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsMTA3Cm00X2xvY2F0aW9uKF9BQ19GQ19GVU5DKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMDY3ClQzMCwxMDcKbTRfbG9jYXRpb24oQUNfQ09ORklHX0FVWF9ESVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE2NzEKRjEyLDkKbTRfZGVidWdtb2RlZGVidWdtb2RlClQxMCwyODAKbTRfc2V0X2FkZG00X2lmZGVmKFtfbTRfc2V0KFskMV0sJDIpXSwKCSAgW200X2lmKG00X2luZGlyKFtfbTRfc2V0KFskMV0sJDIpXSksIFswXSwKCQkgW200X2RlZmluZShbX200X3NldChbJDFdLCQyKV0sCgkJCSAgICBbMV0pX200X3NldF9zaXplKFskMV0sIFttNF9pbmNyXSkkM10sIFskNF0pXSwKCSAgW200X2RlZmluZShbX200X3NldChbJDFdLCQyKV0sCgkJICAgICBbMV0pbTRfcHVzaGRlZihbX200X3NldChbJDFdKV0sCgkJCQkgICAgWyQyXSlfbTRfc2V0X3NpemUoWyQxXSwgW200X2luY3JdKSQzXSkKVDI4LDEwNAptNF9sb2NhdGlvbihBQ19MT05HXzY0X0JJVFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo4MzMKVDE0LDU0OQpfQUNfUlVOX0lGRUxTRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW190cnlfcnVuXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9ydW5dLCBbTElORU5PXSwKICAgIFtUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCiAgICAgQXNzdW1lcyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi5dKV0sCiAgWyQwX0JPRFldKW00X2lmdmFsbihbJDFdLCBbQUNfTEFOR19DT05GVEVTVChbJDFdKV0pQVNfSUYoW2FjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fdHJ5X3J1biAiJExJTkVOTyJdLCBbJDJdLCBbJDNdKQpybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCiAgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC5iZWFtW11tNF9pZnZhbChbJDFdLCBbIGNvbmZ0ZXN0LiRhY19leHRdKVtdZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsOTUKQUNfTEFOR19QUk9HUkFNX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfU09VUkNFKFtfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDI2NQpBQ19MQU5HKEMrKylhY19leHQ9Y3BwCmFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCmFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKClQyNCwxMDcKbTRfbG9jYXRpb24oQUNfVFJZX0VWQUwpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI0NTMKVDE0LDEyMgptNF9hcHBlbmRfdW5pcW00X2lmdmFsKFskM10sIFttNF9pZihtNF9pbmRleChbJDJdLCBbJDNdKSwgWy0xXSwgW10sCgkJICAgICAgIFttNF93YXJuKFtzeW50YXhdLAoJCQkJWyQwOiBgJDInIGNvbnRhaW5zIGAkMyddKV0pXSlfJDAoJEApClQxNSwwCl9tNF9kaXZlcnRfZHVtcApUMjMsMwpfQUNfTEFOR19BQkJSRVYoRXJsYW5nKWVybApUMTksMTk0Cl9BQ19DSEVDS19GVU5DX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTJdLCBbJFtdM10sCiAgW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX0ZVTkNfTElOS19UUlkoJFtdMildLAoJCSAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbeWVzXSldLAoJCSAgW0FTX1ZBUl9TRVQoWyRbXTNdLCBbbm9dKV0pXSkKICBBU19MSU5FTk9fUE9QCgpUMjIsMjgyCkFDX0xBTkcoT2JqZWN0aXZlIEMrKylhY19leHQ9bW0KYWNfY3BwPSckT0JKQ1hYQ1BQICRDUFBGTEFHUycKYWNfY29tcGlsZT0nJE9CSkNYWCAtYyAkT0JKQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiZBU19NRVNTQUdFX0xPR19GRCcKYWNfbGluaz0nJE9CSkNYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJE9CSkNYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2NvbXBpbGVyX2dudT0kYWNfY3Zfb2JqY3h4X2NvbXBpbGVyX2dudQoKVDEyLDExNzQKQUNfRlVOQ19GT1JLX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1RZUEVfUElEX1RdKWRubApBQ19DSEVDS19IRUFERVJTKHZmb3JrLmgpCkFDX0NIRUNLX0ZVTkNTKGZvcmsgdmZvcmspCmlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrIiA9IHh5ZXM7IHRoZW4KICBfQUNfRlVOQ19GT1JLCmVsc2UKICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9JGFjX2N2X2Z1bmNfZm9yawpmaQppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4Y3Jvc3M7IHRoZW4KICBjYXNlICRob3N0IGluCiAgICAqLSotYW1pZ2FvcyogfCAqLSotbXNkb3NkamdwcCopCiAgICAgICMgT3ZlcnJpZGUsIGFzIHRoZXNlIHN5c3RlbXMgaGF2ZSBvbmx5IGEgZHVtbXkgZm9yaygpIHN0dWIKICAgICAgYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vCiAgICAgIDs7CiAgICAqKQogICAgICBhY19jdl9mdW5jX2Zvcmtfd29ya3M9eWVzCiAgICAgIDs7CiAgZXNhYwogIEFDX01TR19XQVJOKFtyZXN1bHQgJGFjX2N2X2Z1bmNfZm9ya193b3JrcyBndWVzc2VkIGJlY2F1c2Ugb2YgY3Jvc3MgY29tcGlsYXRpb25dKQpmaQphY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCmlmIHRlc3QgIngkYWNfY3ZfZnVuY192Zm9yayIgPSB4eWVzOyB0aGVuCiAgX0FDX0ZVTkNfVkZPUksKZmk7CmlmIHRlc3QgIngkYWNfY3ZfZnVuY19mb3JrX3dvcmtzIiA9IHhjcm9zczsgdGhlbgogIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9JGFjX2N2X2Z1bmNfdmZvcmsKICBBQ19NU0dfV0FSTihbcmVzdWx0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIGd1ZXNzZWQgYmVjYXVzZSBvZiBjcm9zcyBjb21waWxhdGlvbl0pCmZpCgppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MiID0geHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1dPUktJTkdfVkZPUkssIDEsIFtEZWZpbmUgdG8gMSBpZiBgdmZvcmsnIHdvcmtzLl0pCmVsc2UKICBBQ19ERUZJTkUodmZvcmssIGZvcmssIFtEZWZpbmUgYXMgYGZvcmsnIGlmIGB2Zm9yaycgZG9lcyBub3Qgd29yay5dKQpmaQppZiB0ZXN0ICJ4JGFjX2N2X2Z1bmNfZm9ya193b3JrcyIgPSB4eWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfV09SS0lOR19GT1JLLCAxLCBbRGVmaW5lIHRvIDEgaWYgYGZvcmsnIHdvcmtzLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksOTIKQUNfQ0hFQ0tfREVDTFNfT05DRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc19zZXAoW19BQ19DSEVDS19ERUNMX09OQ0UoXSwgWyldLCBbXSwgJDEpW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywxMDMKbTRfbG9jYXRpb24oQVNfVkFSX1BVU0hERUYpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MjA0OApUMjUsMTA3Cm00X2xvY2F0aW9uKEFDX1BST0dfWUFDQykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00Ojg5NQpUMjcsMQpfQUNfTEFOR19QUkVGSVgoRm9ydHJhbiA3NylGClQzMiwwCm00X2luY2x1ZGUoYXV0b2NvbmYvcHJvZ3JhbXMubTQpClQxMCw0MTIKQUNfUkVRVUlSRW00X2lmZGVmKFtfbTRfZXhwYW5kaW5nKCQxKV0sCiAgW200X2ZhdGFsKFskMDogY2lyY3VsYXIgZGVwZW5kZW5jeSBvZiAkMV0pXSltNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFttNF9mYXRhbChbJDAoJDEpOiBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGFuIF1kbmwKbTRfaWYoWyQwXSwgW200X3JlcXVpcmVdLCBbW200X2RlZnVuXV0sIFtbQUNfREVGVU5dXSlbJ2QgbWFjcm9dKV0pbTRfcHJvdmlkZV9pZihbJDFdLCBbbTRfc2V0X2NvbnRhaW5zKFtfbTRfcHJvdmlkZV0sIFskMV0sCiAgICBbX200X3JlcXVpcmVfY2hlY2soWyQxXSwgX200X2RlZm4oW200X3Byb3ZpZGUoJDEpXSksIFskMF0pXSwgW200X2lnbm9yZV0pXSwKICBbX200X3JlcXVpcmVfY2FsbF0pKFskMV0sIFskMl0sIF9tNF9kaXZlcnRfZHVtcCkKVDI5LDk1CkFDX0xBTkdfQk9PTF9DT01QSUxFX1RSWShDKyspQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDAKXSkKVDM3LDEwNgptNF9sb2NhdGlvbihfQUNfQ0hFQ0tfSEVBREVSX0NPTVBJTEUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjE2MgpUMzMsMTA3Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1RPT0xfUFJFRklYKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MTg1ClQxNyw5MgpBQ19DT01QSUxFX0lGRUxTRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX0NPTVBJTEVSX1JFUVVJUkUoKWRubApfQUNfQ09NUElMRV9JRkVMU0UoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMCwyMAptNF9QQUNLQUdFX0JVR1JFUE9SVGJ1Zy1hdXRvY29uZkBnbnUub3JnClQyNywxMDcKbTRfbG9jYXRpb24oQUNfQVJHX1BST0dSQU0pL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE2MzcKVDE4LDI2OApfQUNfSU5JVF9DT1BZUklHSFRBQ19DT1BZUklHSFQobTRfZGVmbihbX0FDX0NPUFlSSUdIVF9ZRUFSU10pLCBbVkVSU0lPTl9GU0ZdLCBbCm00X2NvcHlyaWdodF9jb25kZW5zZV0pZG5sCkFDX0NPUFlSSUdIVCgKW1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCmdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC5dLAoJICAgICBbVkVSU0lPTl9GU0ZdLCBbbTRfZWNob10pClQyNCwxMDExCl9BQ19GRUFUVVJFX0NIRUNLX0xFTkdUSCMgQ2hlY2sgZm9yIEdOVSAkMSBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgogIF9BQ19QQVRIX1BST0dfRkxBVk9SX0dOVShbJCQxXSwKICAgIFskMj0iJCQxIiAkMV9mb3VuZD06XSwKICBbYWNfY291bnQ9MAogIEFTX0VDSE9fTihbMDEyMzQ1Njc4OV0pID4iY29uZnRlc3QuaW4iCiAgd2hpbGUgOgogIGRvCiAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgogICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgogICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCiAgICBBU19FQ0hPKFsnJDQnXSkgPj4gImNvbmZ0ZXN0Lm5sIgogICAgJDMgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawogICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawogICAgQVNfVkFSX0FSSVRIKFthY19jb3VudF0sIFskYWNfY291bnQgKyAxXSkKICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAkeyQxX21heC0wfTsgdGhlbgogICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKICAgICAgJDI9IiQkMSIKZG5sICAgIyBVc2luZyAkMV9tYXggc28gdGhhdCBlYWNoIHRvb2wgZmVhdHVyZSBjaGVja2VkIGdldHMgaXRzCmRubCAgICMgb3duIHZhcmlhYmxlLiAgRG9uJ3QgcmVzZXQgaXQgb3RoZXJ3aXNlIHRoZSBpbXBsaWVkIHNlYXJjaApkbmwgICAjIGZvciBiZXN0IHBlcmZvcm1pbmcgdG9vbCBpbiBhIGxpc3QgYnJlYWtzIGRvd24uCiAgICAgICQxX21heD0kYWNfY291bnQKICAgIGZpCiAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCiAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKICBkb25lCiAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dF0pZG5sCgpUMjQsMTA3Cm00X2xvY2F0aW9uKEFDX1BST0dfQVdLKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MzUxClQxOSw3MDAKQUNfVFlQRV9MT05HX0RPVUJMRV9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yIGxvbmcgZG91YmxlXSwgW2FjX2N2X3R5cGVfbG9uZ19kb3VibGVdLAogICAgW2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAgICAgICBhY19jdl90eXBlX2xvbmdfZG91YmxlPXllcwogICAgIGVsc2UKICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAoJIFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoCgkgICAgW1svKiBUaGUgU3RhcmRlbnQgVmlzdHJhIGtub3dzIHNpemVvZiAobG9uZyBkb3VibGUpLCBidXQgZG9lcwoJCSBub3Qgc3VwcG9ydCBpdC4gICovCgkgICAgICBsb25nIGRvdWJsZSBmb28gPSAwLjBMO11dLAoJICAgIFtbLyogT24gVWx0cml4IDQuMyBjYywgbG9uZyBkb3VibGUgaXMgNCBhbmQgZG91YmxlIGlzIDguICAqLwoJICAgICAgc2l6ZW9mIChkb3VibGUpIDw9IHNpemVvZiAobG9uZyBkb3VibGUpXV0pXSwKCSBbYWNfY3ZfdHlwZV9sb25nX2RvdWJsZT15ZXNdLAoJIFthY19jdl90eXBlX2xvbmdfZG91YmxlPW5vXSkKICAgICBmaV0pCiAgaWYgdGVzdCAkYWNfY3ZfdHlwZV9sb25nX2RvdWJsZSA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKFtIQVZFX0xPTkdfRE9VQkxFXSwgMSwKICAgICAgW0RlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBsb25nIGRvdWJsZScuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDEwNgptNF9sb2NhdGlvbihBQ19QUkVGSVgpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDozOApUMjIsMjU0CkFDX01TR19SRVNVTFRfVU5RVU9URURfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTVNHX1JFU1VMVF9VTlFVT1RFRCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKX0FTX0VDSE9fVU5RVU9URUQoWyRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkMV0sIEFTX01FU1NBR0VfTE9HX0ZEKQpfQVNfRUNIT19VTlFVT1RFRChbJDFdKVtdZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsNzc2CkFDX1NFQVJDSF9MSUJTX200X2RlZnVuX3BybyhbJDBdKUFTX1ZBUl9QVVNIREVGKFthY19TZWFyY2hdLCBbYWNfY3Zfc2VhcmNoXyQxXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgJDFdLCBbYWNfU2VhcmNoXSwKW2FjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwpBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX0NBTEwoW10sIFskMV0pXSkKZm9yIGFjX2xpYiBpbiAnJyAkMjsgZG8KICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgogICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgogIGVsc2UKICAgIGFjX3Jlcz0tbCRhY19saWIKICAgIExJQlM9Ii1sJGFjX2xpYiAkNSAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgogIGZpCiAgQUNfTElOS19JRkVMU0UoW10sIFtBU19WQVJfU0VUKFthY19TZWFyY2hdLCBbJGFjX3Jlc10pXSkKICBBU19WQVJfU0VUX0lGKFthY19TZWFyY2hdLCBbYnJlYWtdKQpkb25lCkFTX1ZBUl9TRVRfSUYoW2FjX1NlYXJjaF0sICwgW0FTX1ZBUl9TRVQoW2FjX1NlYXJjaF0sIFtub10pXSkKcm0gY29uZnRlc3QuJGFjX2V4dApMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlNdKQpBU19WQVJfQ09QWShbYWNfcmVzXSwgW2FjX1NlYXJjaF0pCkFTX0lGKFt0ZXN0ICIkYWNfcmVzIiAhPSBub10sCiAgW3Rlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCiAgJDNdLAogICAgICBbJDRdKQpBU19WQVJfUE9QREVGKFthY19TZWFyY2hdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDM2MjEKQUNfUFJPR19JTlNUQUxMX200X2RlZnVuX29uY2UoW0FDX1BST0dfSU5TVEFMTF0sIFtBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKQUNfUkVRVUlSRV9BVVhfRklMRShbaW5zdGFsbC1zaF0pZG5sCiMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAojIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6CiMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCiMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAojIElSSVggL3NiaW4vaW5zdGFsbAojIEFJWCAvYmluL2luc3RhbGwKIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCiMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCiMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwojIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiMgT1MvMidzIHN5c3RlbSBpbnN0YWxsLCB3aGljaCBoYXMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpYwojIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KIyBSZWplY3QgaW5zdGFsbCBwcm9ncmFtcyB0aGF0IGNhbm5vdCBpbnN0YWxsIG11bHRpcGxlIGZpbGVzLgpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGxdKQppZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfaW5zdGFsbCwKW19BU19QQVRIX1dBTEsoWyRQQVRIXSwKW1sjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KY2FzZSAkYXNfZGlyLyBpbiBAJTpAKCgKICAuLyB8IC4vLyB8IC9bY0NdLyogfCBcCiAgL2V0Yy8qIHwgL3Vzci9zYmluLyogfCAvdXNyL2V0Yy8qIHwgL3NiaW4vKiB8IC91c3IvYWZzd3MvYmluLyogfCBcCiAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCiAgL3Vzci91Y2IvKiApIDs7CiAgKildCiAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgogICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CiAgICAjIGJ5IGRlZmF1bHQuCiAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCiAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwoJaWYgQVNfRVhFQ1VUQUJMRV9QKFsiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCJdKTsgdGhlbgoJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgoJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCgkgICAgOgoJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCgkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgoJICAgICMgcHJvZ3JhbS1zcGVjaWZpYyBpbnN0YWxsIHNjcmlwdCB1c2VkIGJ5IEhQIHB3cGx1cy0tZG9uJ3QgdXNlLgoJICAgIDoKCSAgZWxzZQoJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgoJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCgkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KCSAgICBta2RpciBjb25mdGVzdC5kaXIKCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgoJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgoJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCgkgICAgdGhlbgoJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgoJICAgICAgYnJlYWsgMwoJICAgIGZpCgkgIGZpCglmaQogICAgICBkb25lCiAgICBkb25lCiAgICA7Owplc2FjCl0pCnJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgpdKWRubAogIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCiAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKICBlbHNlCiAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCiAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCiAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwogICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgogICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAogIGZpCmZpCmRubCBEbyBzcGVjaWFsIG1hZ2ljIGZvciBJTlNUQUxMIGluc3RlYWQgb2YgQUNfU1VCU1QsIHRvIGdldApkbmwgcmVsYXRpdmUgbmFtZXMgcmlnaHQuCkFDX01TR19SRVNVTFQoWyRJTlNUQUxMXSkKCiMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwpBQ19TVUJTVChJTlNUQUxMX1BST0dSQU0pZG5sCgp0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwpBQ19TVUJTVChJTlNUQUxMX1NDUklQVClkbmwKCnRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCkFDX1NVQlNUKElOU1RBTExfREFUQSlkbmwKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX1BST0dfSU5TVEFMTF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX1BST0dfSU5TVEFMTF0pXV0sCm00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFtBQ19QUk9HX0lOU1RBTExdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19QUk9HX0lOU1RBTExdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQxNyw3MApBQ19DT05GSUdfSEVBREVSU19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfQ09ORklHX0ZPT1MoW0hFQURFUlNdLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDEwOAptNF9sb2NhdGlvbihBQ19DSEVDS19GVU5DU19PTkNFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjEwOApUOCw2NgptNF9pZnNldG00X2lmZGVmKFskMV0sCgkgIFttNF9pZnZhbChfbTRfZGVmbihbJDFdKSwgWyQyXSwgWyQzXSldLAoJICBbJDNdKQpUNywxODIKbTRfY29uZG00X2lmKFskI10sIFswXSwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKICAgICAgIFskI10sIFsxXSwgWyQxXSwKICAgICAgIG00X2V2YWwoWyQjICUgM10pLCBbMl0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYW4gYXJndW1lbnRdKV0sCiAgICAgICBbXyQwKCRAKV0pClQyMiwyCl9tNF9kaXZlcnQoUEFSU0VfQVJHUykyMApUMzMsMTUxCl9BQ19DSEVDS19UWVBFX1JFUExBQ0VNRU5UX1RZUEVfUG00X2JtYXRjaChbJDFdLAoJICBbXlwoX0Jvb2xcfGJvb2xcfGNoYXJcfGRvdWJsZVx8ZmxvYXRcfGludFx8bG9uZ1x8c2hvcnRcfFwodW5cKT9zaWduZWRcfFtfYS16QS1aXVtfYS16QS1aMC05XSpfdFwpW11bX2EtekEtWjAtOSgpICpdKiRdLAoJICAxLCAwKWRubAoKVDksMTUKQVNfRUNIT19OJGFzX2VjaG9fbiAkMVtdClQ5LDEyOQpBU19FQ0hPX05fbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX0VDSE9fUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDQxCkFDX1BST1ZJREVfSUZFTFNFbTRfaWZkZWYoW200X3Byb3ZpZGUoJDEpXSwKCSAgWyQyXSwgWyQzXSkKVDI3LDEwMQptNF9sb2NhdGlvbihBQ19DX0JJR0VORElBTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MTQzNgpUMTIsMzAKbTRfZXN5c2NtZF9zbTRfY2hvbXBfYWxsKG00X2VzeXNjbWQoWyQxXSkpClQ2LDI2NApBU19GT1JfbTRfZGVmdW5fcHJvKFskMF0pbTRfcHVzaGRlZihbJDFdLCBtNF9pZihbJDNdLCBbXSwgW1skJDJdXSwgbTRfdHJhbnNsaXQoWyQzXSwgW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfMDEyMzQ1Njc4OV1bJSs9OiwuLy1dKSwgW10sIFtbJDNdXSwgW1skJDJdXSkpZm9yICQyW11tNF9pZnZhbChbJDNdLCBbIGluICQzXSkKZG8gOgogICQ0CmRvbmVbXV9tNF9wb3BkZWYoWyQxXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDI3NgpfQVNfQ1JfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSkjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCmFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Jwphc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCmFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksODgKQUNfQ0hFQ0tfRlVOQ1NfT05DRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUNfQ0hFQ0tfRlVOQ19PTkNFKF0sIFspXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDAKbTRfaW5jbHVkZShhdXRvY29uZi90eXBlcy5tNCkKVDEwLDI4Cl9BQ19GOTBfRkN4bGY5MCBmOTAgcGdmOTAgcGdocGYgZXBjZjkwClQxNSwxNDgKX200X2FwcGVuZF91bmlxbTRfaWZkZWYoWyQxXSwKCSAgW200X2lmKG00X2luZGV4KFskM11fbTRfZGVmbihbJDFdKVskM10sIFskMyQyJDNdKSwgWy0xXSwKCQkgW200X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSwgWyQ1XSldLAoJICBbbTRfZGVmaW5lKFskMV0sIFskMl0pJDRdKQpUMzIsMTAzCm00X2xvY2F0aW9uKF9BU19NS0RJUl9QX1BSRVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTI1NwpUMzIsMAptNF9pbmNsdWRlKGF1dG9jb25mL2F1dG9zY2FuLm00KQpUMjAsMjAxCl9BU19CQVNFTkFNRV9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19FWFBSX1BSRVBBUkVdKWlmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KICBhc19iYXNlbmFtZT1iYXNlbmFtZQplbHNlCiAgYXNfYmFzZW5hbWU9ZmFsc2UKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywyCl9BQ19TRURfQ01EX0xJTUlUOTkKVDE3LDE2NQpBTV9UWVBFX1BUUkRJRkZfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9UWVBFX1BUUkRJRkZfVCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0hFQ0tfVFlQRVMocHRyZGlmZl90KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTgyCkFDX1RFU1RfUFJPR1JBTV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19URVNUX1BST0dSQU0nIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFJZX1JVTl0sIFtBQ19UUllfUlVOKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMywxMDcKbTRfbG9jYXRpb24oQUNfQ09ORklHX0xJQk9CSl9ESVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI5MDgKVDE3LDI3MgpfQVNfSURFTlRJRklFUl9JRm00X2NvbmQoW1skMV1dLCBbXSwgW10sCgkgW200X2V2YWwobTRfbGVuKG00X3RyYW5zbGl0KFtbJDFdXSwgXVtbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8wMTIzNDU2Nzg5XV1bKSkgPiAwKV0sIFsxXSwgW10sCgkgW200X2xlbihtNF90cmFuc2xpdChtNF9mb3JtYXQoW1slLjFzXV0sIFskMV0pLCBdW1thYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX11dWykpXSwgWzBdLCBbLV0pClQyNCw2MDQKX0FDX0NIRUNLX0hFQURFUl9DT01QSUxFX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2hlYWRlcl9jb21waWxlXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2hlYWRlcl9jb21waWxlXSwKICAgIFtMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFU10sCiAgICBbVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzIGFuZCBjYW4gYmUgY29tcGlsZWQgdXNpbmcgdGhlIGluY2x1ZGUgZmlsZXMKICAgICBpbiBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5Ll0pXSwKICBbJDBfQk9EWV0pQVNfVkFSX1BVU0hERUYoW2FjX0hlYWRlcl0sIFthY19jdl9oZWFkZXJfJDFdKWFjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkMSIgImFjX0hlYWRlciIgIkFTX0VTQ0FQRShbQUNfSU5DTFVERVNfREVGQVVMVChbJDRdKV0sIFsiIl0pIgpBU19WQVJfSUYoW2FjX0hlYWRlcl0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY19IZWFkZXJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsODUKQVNfQkFTRU5BTUUkYXNfYmFzZW5hbWUgLS0gJDEgfHwKX0FTX0JBU0VOQU1FX0VYUFIoWyQxXSkgMj4vZGV2L251bGwgfHwKX0FTX0JBU0VOQU1FX1NFRChbJDFdKVtdClQxMSwxMjQKQVNfQkFTRU5BTUVfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbXyQwX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDMxCl9tNF9hcHBseW00X2lmKFskMl0sIFtdLCBbXSwgWyQxKCQyKVtdXSkKVDMzLDEwMzkKX0FDX0lOQ0xVREVTX0RFRkFVTFRfUkVRVUlSRU1FTlRTX200X2RlZnVuX3BybyhbJDBdKW00X2RpdmVydF90ZXh0KFtERUZBVUxUU10sClsjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCmRubCBJZiBldmVyIHlvdSBjaGFuZ2UgdGhpcyB2YXJpYWJsZSwgcGxlYXNlIGtlZXAgYXV0b2NvbmYudGV4aSBpbiBzeW5jLgphY19pbmNsdWRlc19kZWZhdWx0PSJcCiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAojIGluY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWZkZWYgU1REQ19IRUFERVJTCiMgaW5jbHVkZSA8c3RkbGliLmg+CiMgaW5jbHVkZSA8c3RkZGVmLmg+CiNlbHNlCiMgaWZkZWYgSEFWRV9TVERMSUJfSAojICBpbmNsdWRlIDxzdGRsaWIuaD4KIyBlbmRpZgojZW5kaWYKI2lmZGVmIEhBVkVfU1RSSU5HX0gKIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICiMgIGluY2x1ZGUgPG1lbW9yeS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8c3RyaW5nLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TVFJJTkdTX0gKIyBpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9JTlRUWVBFU19ICiMgaW5jbHVkZSA8aW50dHlwZXMuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NURElOVF9ICiMgaW5jbHVkZSA8c3RkaW50Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9VTklTVERfSAojIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYiCl0pZG5sCkFDX1JFUVVJUkUoW0FDX0hFQURFUl9TVERDXSlkbmwKIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAoJCSAgaW50dHlwZXMuaCBzdGRpbnQuaCB1bmlzdGQuaF0sCgkJIFtdLCBbXSwgJGFjX2luY2x1ZGVzX2RlZmF1bHQpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTkwCkFDX1NURENfSEVBREVSU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TVERDX0hFQURFUlMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfSEVBREVSX1NURENdLCBbQUNfSEVBREVSX1NUREMoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDEwMjAKQUNfTEFOR19GVU5DX0xJTktfVFJZKEMrKylBQ19MQU5HX1BST0dSQU0oClsvKiBEZWZpbmUgJDEgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMS4KICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCiNkZWZpbmUgJDEgaW5ub2N1b3VzXyQxCgovKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICQxICgpOyBiZWxvdy4KICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCgojaWZkZWYgX19TVERDX18KIyBpbmNsdWRlIDxsaW1pdHMuaD4KI2Vsc2UKIyBpbmNsdWRlIDxhc3NlcnQuaD4KI2VuZGlmCgojdW5kZWYgJDEKCi8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgogICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKI2VuZGlmCmNoYXIgJDEgKCk7Ci8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCiAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KI2lmIGRlZmluZWQgX19zdHViXyQxIHx8IGRlZmluZWQgX19zdHViX19fJDEKY2hva2UgbWUKI2VuZGlmCl0sIFtyZXR1cm4gJDEgKCk7XSkKVDI5LDE1NgpfQUNfQ09ORklHX0RFUEVOREVOQ1lfREVGQVVMVG00X2lmKG00X2luZGV4KFskMl0sIFs6XSksIFstMV0sCgkgICBbbTRfaWYoWyQxXSwgW0xJTktTXSwKCQkgIFtBU19MSVRFUkFMX0lGKFskMl0sCgkJICAgIFttNF9mYXRhbChbSW52YWxpZCBBQ19DT05GSUdfTElOS1MgdGFnOiBgJDInXSldKV0sCgkJICBbOiQyLmluXSldKQpUOCwxODEKQUNfVUlEX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVUlEX1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9VSURfVF0sIFtBQ19UWVBFX1VJRF9UKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxODkKQUNfUFJPR1JBTVNfUEFUSF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19QUk9HUkFNU19QQVRIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1BBVEhfUFJPR1NdLCBbQUNfUEFUSF9QUk9HUygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMTAyCm00X2xvY2F0aW9uKF9BQ19MQU5HX1NFVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6ODIKVDI3LDEwNwptNF9sb2NhdGlvbihBQ19QUk9HX1JBTkxJQikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00Ojg1MgpUMTMsODQKX0FTX1FVT1RFX09MRG00X3dhcm4oW29ic29sZXRlXSwKICAgW2JhY2sgcXVvdGVzIGFuZCBkb3VibGUgcXVvdGVzIG11c3Qgbm90IGJlIGVzY2FwZWQgaW46ICQxXSkkMQpUMTAsMgptNF91bnF1b3RlJCoKVDEzLDE3NApfQUNfUFJPR19HUkVQX0FDX1BBVEhfUFJPR1NfRkVBVFVSRV9DSEVDSyhbJDFdLCBbJDJdLAoJW19BQ19GRUFUVVJFX0NIRUNLX0xFTkdUSChbYWNfcGF0aF8kMV0sIFthY19jdl9wYXRoXyQxXSwKCQlbIiRhY19wYXRoXyQxIiAkM10sIFskMV0pXSwgW10sCglbJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluXSlkbmwKClQxOSw0NDMKX0FDX0NBTk9OSUNBTF9TUExJVGNhc2UgJGFjX2N2XyQxIGluCiotKi0qKSA7OwoqKSBBQ19NU0dfRVJST1IoW2ludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsICQxXSk7Owplc2FjCkFDX1NVQlNUKFskMV0sIFskYWNfY3ZfJDFdKWRubAphY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCnNldCB4ICRhY19jdl8kMQpzaGlmdApBQ19TVUJTVChbJDFfY3B1XSwgWyRbMV1dKWRubApBQ19TVUJTVChbJDFfdmVuZG9yXSwgWyRbMl1dKWRubApzaGlmdDsgc2hpZnQKWyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICRdKiwKIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgokMV9vcz0kWypdCklGUz0kYWNfc2F2ZV9JRlMKY2FzZSAkJDFfb3MgaW4gKlwgKikgJDFfb3M9YGVjaG8gIiQkMV9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKQUNfU1VCU1QoWyQxX29zXSlkbmwKClQxNywyNTgKX0FDX0FSR19WQVJfU1RPUkVtNF9kaXZlcnRfdGV4dChbUEFSU0VfQVJHU10sCltmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwogIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CiAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CmRvbmVdKWRubAoKVDksNzIKbTRfbWFwYWxsbTRfaWYoWyQyXSwgW10sIFtdLAogICAgICAgW19tNF9mb3JlYWNoKFttNF9hcHBseShbJDFdLF0sIFspXSwgW10sICQyKV0pClQzNywxMDYKbTRfbG9jYXRpb24oQUNfTEFOR19QUkVQUk9DKEZvcnRyYW4pKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoyNDYKRjE0LDYKX200X2RpdmVydF9yYXdkaXZlcnQKVDEzLDcxCkFDX0xJQlNPVVJDRVNfbTRfZGVmdW5fcHJvKFskMF0pbTRfbWFwX2FyZ3MoW0FDX0xJQlNPVVJDRV0sICQxKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzcsMTA1Cm00X2xvY2F0aW9uKEFDX0VSTEFOR19TVUJTVF9FUlRTX1ZFUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2VybGFuZy5tNDozMDEKVDEyLDk0CkFIX0NIRUNLX0xJQkFIX1RFTVBMQVRFKEFTX1RSX0NQUChbSEFWRV9MSUIkMV0pLAoJICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGAkMScgbGlicmFyeSAoLWwkMSkuXSkKVDQwLDEwNgptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0MoRm9ydHJhbiA3NykpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjIzOQpUNiwxMjIKbTRfY2RybTRfaWYoWyQjXSwgMCwgW200X2ZhdGFsKFskMDogY2Fubm90IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50c10pXSwKICAgICAgIFskI10sIDEsIFtdLAogICAgICAgW200X2RxdW90ZShtNF9zaGlmdCgkQCkpXSkKRjYsNgpkaXZudW1kaXZudW0KVDE2LDI3Cl9BU19RVU9URV9NT0RFUk5fQVNfRVNDQVBFKFskMV0sIFtgXSwgWyIiXSkKVDE1LDM1MTgKX0FDX09VVFBVVF9GSUxFCiAgIwogICMgQ09ORklHX0ZJTEUKICAjCgpBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19JTlNUQUxMXSwKWyAgY2FzZSAkSU5TVEFMTCBpbgogIFtbXFwvJF1dKiB8ID86W1tcXC9dXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CiAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CiAgZXNhYwpdKWRubApBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19NS0RJUl9QXSwKWyAgYWNfTUtESVJfUD0kTUtESVJfUAogIGNhc2UgJE1LRElSX1AgaW4KICBbW1xcLyRdXSogfCA/OltbXFwvXV0qICkgOzsKICAqLyopIGFjX01LRElSX1A9JGFjX3RvcF9idWlsZF9wcmVmaXgkTUtESVJfUCA7OwogIGVzYWMKXSlkbmwKX0FDRU9GCgptNF9pZm5kZWYoW0FDX0RBVEFST09URElSX0NIRUNLRURdLApbY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQojIElmIHRoZSB0ZW1wbGF0ZSBkb2VzIG5vdCBrbm93IGFib3V0IGRhdGFyb290ZGlyLCBleHBhbmQgaXQuCiMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgphY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KbTRfZGVmaW5lKFtfQUNfZGF0YXJvb3RkaXJfdmFyc10sCgkgIFtkYXRhZGlyLCBkb2NkaXIsIGluZm9kaXIsIGxvY2FsZWRpciwgbWFuZGlyXSldZG5sClttNF9kZWZpbmUoW19BQ19kYXRhcm9vdGRpcl9zdWJzdF0sIFsgIHMmQCRdWzFAJiQkXVsxJmddKV1kbmwKW2FjX3NlZF9kYXRhcm9vdD0nCi9kYXRhcm9vdGRpci8gewogIHAKICBxCn0KbTRfbWFwX2FyZ3Nfc2VwKFsvQF0sIFtAL3BdLCBbCl0sIF9BQ19kYXRhcm9vdGRpcl92YXJzKScKY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgoqZGF0YXJvb3RkaXIqKSBhY19kYXRhcm9vdGRpcl9zZWVuPXllczs7CipAW11tNF9qb2luKFtAKnwqQF0sIF9BQ19kYXRhcm9vdGRpcl92YXJzKUAqKQogIEFDX01TR19XQVJOKFskYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmddKQpfQUNFT0YKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCm00X21hcF9hcmdzX3NlcChbX0FDX2RhdGFyb290ZGlyX3N1YnN0KF0sIFspXSwgWwpdLCBfQUNfZGF0YXJvb3RkaXJfdmFycykKICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7Owplc2FjCl9BQ0VPRgpdKWRubAoKIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgojIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPwpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKJGV4dHJhc3ViCl9BQ0VPRgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCjp0ClsvQFthLXpBLVpfXVthLXpBLVpfMC05XSpALyFiXQpkbmwgY29uZmlndXJlX2lucHV0IGlzIGEgc29tZXdoYXQgc3BlY2lhbCwgc28gd2UgZG9uJ3QgY2FsbCBBQ19TVUJTVF9UUkFDRS4KZG5sIE5vdGUgaWYgeW91IGNoYW5nZSB0aGUgc3x8fCBkZWxpbWl0ZXIgaGVyZSwgZG9uJ3QgZm9yZ2V0IHRvIGFkanVzdApkbmwgYWNfc2VkX2NvbmZfaW5wdXQgYWNjb3JkaW5nbHkuICBVc2luZyAmIGlzIGEgYmFkIGlkZWEgaWYgJiBhcHBlYXJzIGluCmRubCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nLgpzfEBjb25maWd1cmVfaW5wdXRAfCRhY19zZWRfY29uZl9pbnB1dHw7dCB0CmRubCBEdXJpbmcgdGhlIHRyYW5zaXRpb24gcGVyaW9kLCB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlOgpzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHRbXUFDX1NVQlNUX1RSQUNFKFt0b3BfYnVpbGRkaXJdKQpkbmwgRm9yIHRoaXMgc3Vic3RpdHV0aW9uIHNlZSB0aGUgd2l0bmVzcyBtYWNybyBfQUNfSEFWRV9UT1BfQlVJTERfUFJFRklYIGFib3ZlLgpzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0W11BQ19TVUJTVF9UUkFDRShbdG9wX2J1aWxkX3ByZWZpeF0pCm00X21hcF9hcmdzX3NlcChbJDBfQURKVVNUX0RJUihdLCBbKV0sIFsKXSwgW3NyY2Rpcl0sIFthYnNfc3JjZGlyXSwgW3RvcF9zcmNkaXJdLCBbYWJzX3RvcF9zcmNkaXJdLAogICBbYnVpbGRkaXJdLCBbYWJzX2J1aWxkZGlyXSwKICAgW2Fic190b3BfYnVpbGRkaXJdQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfSU5TVEFMTF0sCiAgICAgWywgW0lOU1RBTExdXSlBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19NS0RJUl9QXSwgWywgW01LRElSX1BdXSkpCm00X2lmbmRlZihbQUNfREFUQVJPT1RESVJfQ0hFQ0tFRF0sIFskYWNfZGF0YXJvb3RkaXJfaGFjawpdKWRubAoiCmV2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiBtNF9kZWZuKFtfQUNfU1VCU1RfQ01EU10pIFwKICA+JGFjX3RtcC9vdXQgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkKCm00X2lmbmRlZihbQUNfREFUQVJPT1RESVJfQ0hFQ0tFRF0sClt0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgogIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiRhY190bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCiAgeyBhY19vdXQ9YHNlZCAtbiAnL15bWwkgXV0qZGF0YXJvb3RkaXJbWwkgXV0qOio9L3AnIFwKICAgICAgIiRhY190bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCiAgQUNfTVNHX1dBUk4oWyRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBgZGF0YXJvb3RkaXInCndoaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZF0pCl0pZG5sCgogIHJtIC1mICIkYWNfdG1wL3N0ZGluIgogIGNhc2UgJGFjX2ZpbGUgaW4KICAtKSBjYXQgIiRhY190bXAvb3V0IiAmJiBybSAtZiAiJGFjX3RtcC9vdXQiOzsKICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkYWNfdG1wL291dCIgIiRhY19maWxlIjs7CiAgZXNhYyBcCiAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgY3JlYXRlICRhY19maWxlXSkKZG5sIFRoaXMgd291bGQgYnJlYWsgTWFrZWZpbGUgZGVwZW5kZW5jaWVzOgpkbmwgIGlmIGRpZmYgIiRhY19maWxlIiAiJGFjX3RtcC9vdXQiID4vZGV2L251bGwgMj4mMTsgdGhlbgpkbmwgICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgpkbmwgIGVsc2UKZG5sICAgICBybSAtZiAiJGFjX2ZpbGUiOyBtdiAiJGFjX3RtcC9vdXQiICIkYWNfZmlsZSIKZG5sICBmaQoKVDE5LDk1Cl9BQ19MQU5HX0lPX1BST0dSQU1fbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19TT1VSQ0UoW19BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsMTA2Cm00X2xvY2F0aW9uKEFDX1NFVF9NQUtFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NzIKVDExLDg3MwpfQUNfUFJPR19GQ19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApBQ19DSEVDS19UT09MUyhbXV9BQ19GQ1tdLAogICAgICBtNF9kZWZhdWx0KFskMl0sCgltNF9jYXNlKF9BQ19GQ19ESUFMRUNUX1lFQVIoWyQxXSksCgkJWzE5OTVdLCBbX0FDX0Y5NV9GQ10sCgkJWzE5OTBdLCBbX0FDX0Y5MF9GQyBfQUNfRjk1X0ZDXSwKCQlbMTk3N10sIFtfQUNfRjc3X0ZDIF9BQ19GOTBfRkMgX0FDX0Y5NV9GQ10sCgkJW19BQ19GOTVfRkMgX0FDX0Y5MF9GQyBfQUNfRjc3X0ZDXSkpKQoKIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgpfQVNfRUNIT19MT0coW2NoZWNraW5nIGZvciBfQUNfTEFORyBjb21waWxlciB2ZXJzaW9uXSkKc2V0IFggJGFjX2NvbXBpbGUKYWNfY29tcGlsZXI9JFsyXQpmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCiAgX0FDX0RPX0xJTUlUKFskYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JkFTX01FU1NBR0VfTE9HX0ZEXSkKZG9uZQpybSAtZiBhLm91dAoKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9FWEVFWFRdKVtdZG5sCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfT0JKRVhUXSlbXWRubAojIElmIHdlIGRvbid0IHVzZSBgLkYnIGFzIGV4dGVuc2lvbiwgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgcnVuIG9uIHRoZQojIGlucHV0IGZpbGUuICAoTm90ZSB0aGF0IHRoaXMgb25seSBuZWVkcyB0byB3b3JrIGZvciBHTlUgY29tcGlsZXJzLikKYWNfc2F2ZV9leHQ9JGFjX2V4dAphY19leHQ9RgpfQUNfTEFOR19DT01QSUxFUl9HTlUKYWNfZXh0PSRhY19zYXZlX2V4dApfQUNfUFJPR19GQ19HCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9BU1NFUlQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjQzNwpUMzAsMTA2Cm00X2xvY2F0aW9uKEFDX0hBVkVfUE9VTkRCQU5HKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6NzgKVDIzLDYwCkFDX0xBTkdfUFJPR1JBTShFcmxhbmcpWy1tb2R1bGUoY29uZnRlc3QpLgotZXhwb3J0KFtzdGFydC8wXSkuXQokMQpzdGFydCgpIC0+CiQyCi4KClQxNCw0MQpfbTRfbGlzdF9jbXBfMV9tNF9saXN0X2NtcF8yKFskMl0sIFttNF9zaGlmdDIoJEApXSwgJDEpClQyMCwyCl9tNF9kaXZlcnQoREVGQVVMVFMpMTAKVDI4LDY1CkFDX0xBTkdfQ09NUElMRVIoRm9ydHJhbiA3NylfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19GNzddKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsOTUKX200X2xpc3RfY21wXzJfbTRfbGlzdF9jbXAoWyQxJDNdLCBtNF9jbXAoWyQzKzBdLCBbJDErMF0pKSgKICBbX200X2xpc3RfY21wXzEobTRfZHF1b3RlKG00X3NoaWZ0MygkQCkpLCAkMildKQpUOSwyMTcKQUNfRU1YT1MyX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0VNWE9TMicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0FOT05JQ0FMX0hPU1QKY2FzZSAkaG9zdF9vcyBpbgogICplbXgqICkgRU1YT1MyPXllczs7CiAgICAgICogKSBFTVhPUzI9bm87Owplc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTQ4CkFDX0RFQ0xfWVlURVhUX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0RFQ0xfWVlURVhUJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19QUk9HX0xFWFtdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsNTMKX200X2pvaW5hbGxtNF9pZihbJCNdLCBbMl0sIFtdLCBbWyQxJDNdJDAoWyQxXSwgbTRfc2hpZnQyKCRAKSldKQpUMTgsMwpfQUNfQ0MoRm9ydHJhbiA3NylGNzcKVDE1LDE5MgpBQ19NQUpPUl9IRUFERVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTUFKT1JfSEVBREVSJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0hFQURFUl9NQUpPUl0sIFtBQ19IRUFERVJfTUFKT1IoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDEzNwpfQVNfRElSTkFNRV9FWFBSJGFzX2V4cHIgWFtdJDEgOiAnWFwoLipbW14vXV1cKS8vKltbXi9dW14vXV0qLyokJyBcfCBcCgkgWFtdJDEgOiAnWFwoLy9cKVtbXi9dXScgXHwgXAoJIFhbXSQxIDogJ1hcKC8vXCkkJyBcfCBcCgkgWFtdJDEgOiAnWFwoL1wpJyBcfCAuW10KVDE2LDEyOQpfQVNfRElSTkFNRV9FWFBSX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19FWFBSX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDQxCkFVX0FMSUFTQVVfREVGVU4oWyQxXSwgX0FVX0FMSUFTX0JPRFkoWyRdLCBbJDJdKSkKVDE1LDY1MApBQ19GVU5DX1NFVFBHUlBfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciBzZXRwZ3JwIHRha2VzIG5vIGFyZ3VtZW50LCBhY19jdl9mdW5jX3NldHBncnBfdm9pZCwKW0FDX1JVTl9JRkVMU0UoCltBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLApbLyogSWYgdGhpcyBzeXN0ZW0gaGFzIGEgQlNELXN0eWxlIHNldHBncnAgd2hpY2ggdGFrZXMgYXJndW1lbnRzLAogIHNldHBncnAoMSwgMSkgd2lsbCBmYWlsIHdpdGggRVNSQ0ggYW5kIHJldHVybiAtMSwgaW4gdGhhdCBjYXNlCiAgZXhpdCBzdWNjZXNzZnVsbHkuICovCiAgcmV0dXJuIHNldHBncnAgKDEsMSkgIT0gLTE7XSldLAoJICAgICAgIFthY19jdl9mdW5jX3NldHBncnBfdm9pZD1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfc2V0cGdycF92b2lkPXllc10sCgkgICAgICAgW0FDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIHNldHBncnAgd2hlbiBjcm9zcyBjb21waWxpbmddKV0pXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19zZXRwZ3JwX3ZvaWQgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoU0VUUEdSUF9WT0lELCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgYHNldHBncnAnIGZ1bmN0aW9uIHRha2VzIG5vIGFyZ3VtZW50Ll0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxNTgKbTRfcG9wZGVmbTRfaWYoWyQjXSwgWzBdLCBbWyQwXV0sCiAgICAgICBbJCNdLCBbMV0sIFttNF9pZmRlZihbJDFdLCBbX200X3BvcGRlZihbJDFdKV0sCgkJCSAgICBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDIxLDEwMgptNF9sb2NhdGlvbihBU19VTlNFVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDo2MzgKVDIyLDI3MzcKX0FDX0ZDX0xJQlJBUllfTERGTEFHU19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApfQUNfUFJPR19GQ19WCkFDX0NBQ0hFX0NIRUNLKFtmb3IgX0FDX0xBTkcgbGlicmFyaWVzIG9mICRbXV9BQ19GQ1tdXSwgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzLApbaWYgdGVzdCAieCRbXV9BQ19MQU5HX1BSRUZJWFtdTElCUyIgIT0gIngiOyB0aGVuCiAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzPSIkW11fQUNfTEFOR19QUkVGSVhbXUxJQlMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgplbHNlCgpfQUNfUFJPR19GQ19WX09VVFBVVAoKYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzPQoKIyBTYXZlIHBvc2l0aW9uYWwgYXJndW1lbnRzIChpZiBhbnkpCmFjX3NhdmVfcG9zaXRpb25hbD0iJFtAXSIKCnNldCBYICRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0CndoaWxlIHRlc3QgJFtAJTpAXSAhPSAxOyBkbwogIHNoaWZ0CiAgYWNfYXJnPSRbMV0KICBjYXNlICRhY19hcmcgaW4KCVtbXFwvXV0qLmEgfCA/OltbXFwvXV0qLmEpCgkgIF9BQ19MSVNUX01FTUJFUl9JRigkYWNfYXJnLCAkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzLCAsCgkgICAgICBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnM9IiRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnMgJGFjX2FyZyIpCgkgIDs7CgktYkk6KikKCSAgX0FDX0xJU1RfTUVNQkVSX0lGKCRhY19hcmcsICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnMsICwKCSAgICAgW19BQ19MSU5LRVJfT1BUSU9OKFskYWNfYXJnXSwgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzKV0pCgkgIDs7CgkgICMgSWdub3JlIHRoZXNlIGZsYWdzLgoJLWxhbmcqIHwgLWxjcnQqLm8gfCAtbGMgfCAtbGdjYyogfCAtbFN5c3RlbSB8IC1saWJtaWwgfCAtbGl0dGxlIFwKCSAgfC1MQU5HOj0qIHwgLUxJU1Q6KiB8IC1MTk86KiB8IC1saW5rKQoJICA7OwoJLWxrZXJuZWwzMikKCSAgdGVzdCB4IiRDWUdXSU4iICE9IHh5ZXMgJiYgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzICRhY19hcmciCgkgIDs7CgktW1tMUnVZel1dKQoJICAjIFRoZXNlIGZsYWdzLCB3aGVuIHNlZW4gYnkgdGhlbXNlbHZlcywgdGFrZSBhbiBhcmd1bWVudC4KCSAgIyBXZSByZW1vdmUgdGhlIHNwYWNlIGJldHdlZW4gb3B0aW9uIGFuZCBhcmd1bWVudCBhbmQgcmUtaXRlcmF0ZQoJICAjIHVubGVzcyB3ZSBmaW5kIGFuIGVtcHR5IGFyZyBvciBhIG5ldyBvcHRpb24gKHN0YXJ0aW5nIHdpdGggLSkKCSAgY2FzZSAkWzJdIGluCgkgICAgICIiIHwgLSopOzsKCSAgICAgKikKCQlhY19hcmc9IiRhY19hcmckWzJdIgoJCXNoaWZ0OyBzaGlmdAoJCXNldCBYICRhY19hcmcgIiRbQF0iCgkJOzsKCSAgZXNhYwoJICA7OwoJLVlQLCopCgkgIGZvciBhY19qIGluIGBBU19FQ0hPKFsiJGFjX2FyZyJdKSB8IHNlZCAtZSAncy8tWVAsLy1MLztzLzovIC1ML2cnYDsgZG8KCSAgICBfQUNfTElTVF9NRU1CRVJfSUYoJGFjX2osICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnMsICwKCQkJICAgICAgIFthY19hcmc9IiRhY19hcmcgJGFjX2oiCgkJCSAgICAgICBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnM9IiRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnMgJGFjX2oiXSkKCSAgZG9uZQoJICA7OwoJLVtbbExSXV0qKQoJICBfQUNfTElTVF9NRU1CRVJfSUYoJGFjX2FyZywgJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicywgLAoJCQkgICAgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicyAkYWNfYXJnIikKCSAgOzsKCS16YWxsZXh0cmFjdCp8IC16ZGVmYXVsdGV4dHJhY3QpCgkgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbGlicyAkYWNfYXJnIgoJICA7OwoJICAjIElnbm9yZSBldmVyeXRoaW5nIGVsc2UuCiAgZXNhYwpkb25lCiMgcmVzdG9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cwpzZXQgWCAkYWNfc2F2ZV9wb3NpdGlvbmFsOyBzaGlmdAoKIyBXZSBvbmx5IGNvbnNpZGVyICJMRF9SVU5fUEFUSCIgb24gU29sYXJpcyBzeXN0ZW1zLiAgSWYgdGhpcyBpcyBzZWVuLAojIHRoZW4gd2UgaW5zaXN0IHRoYXQgdGhlICJydW4gcGF0aCIgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoIChpLmUuIGl0CiMgbXVzdCBiZWdpbiB3aXRoIGEgIi8iKS4KY2FzZSBgKHVuYW1lIC1zcikgMj4vZGV2L251bGxgIGluCiAgICJTdW5PUyA1IiopCiAgICAgIGFjX2xkX3J1bl9wYXRoPWBBU19FQ0hPKFsiJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fdl9vdXRwdXQiXSkgfAoJCQlzZWQgLW4gJ3MsXi4qTERfUlVOX1BBVEggKj0gKlwoL1tbXiBdXSpcKS4qJCwtUlwxLHAnYAogICAgICB0ZXN0ICJ4JGFjX2xkX3J1bl9wYXRoIiAhPSB4ICYmCglfQUNfTElOS0VSX09QVElPTihbJGFjX2xkX3J1bl9wYXRoXSwgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9saWJzKQogICAgICA7Owplc2FjCmZpICMgdGVzdCAieCRbXV9BQ19MQU5HX1BSRUZJWFtdTElCUyIgPSAieCIKXSkKW11fQUNfTEFOR19QUkVGSVhbXUxJQlM9IiRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2xpYnMiCkFDX1NVQlNUKFtdX0FDX0xBTkdfUFJFRklYW11MSUJTKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDEwNwptNF9sb2NhdGlvbihfQUNfUFJFUFJPQ19JRkVMU0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI1MDQKRjUsNQppbmRpcmluZGlyClQxOSw1NzIKX0FDX0NPTVBJTEVSX0VYRUVYVEFDX0xBTkdfQ09ORlRFU1QoW19BQ19MQU5HX05VTExfUFJPR1JBTV0pCmFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCmFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBiLm91dCIKX0FDX0NPTVBJTEVSX0VYRUVYVF9ERUZBVUxUCnJtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CmFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCl9BQ19DT01QSUxFUl9FWEVFWFRfTwpybSAtZiBjb25mdGVzdC4kYWNfZXh0CkFDX1NVQlNUKFtFWEVFWFRdLCBbJGFjX2N2X2V4ZWV4dF0pZG5sCmFjX2V4ZWV4dD0kRVhFRVhUCkFDX0xBTkdfQ09ORlRFU1QoW19BQ19MQU5HX0lPX1BST0dSQU1dKQphY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGNvbmZ0ZXN0Lm91dCIKX0FDX0NPTVBJTEVSX0VYRUVYVF9DUk9TUwpybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKClQxNywxNTEKX0FDX0NIRUNLX01FTUJFUlNbJDFdLCBbQUNfREVGSU5FX1VOUVVPVEVEKEFTX1RSX0NQUChbSEFWRV8kMV0pLCBbMV0sCiAgW0RlZmluZSB0byAxIGlmIGBdbTRfYnBhdHN1YnN0KFskMV0sCiAgICBbXlwoW14uXSpcKVwuXCguKlwpXSwgW1tcMicgaXMgYSBtZW1iZXIgb2YgYFwxXV0pWycuXSldClQxMiwxNTIKX200X3NldF9kdW1wbTRfaWZkZWYoW19tNF9zZXQoWyQxXSldLAoJICBbWyQyXV9tNF9kZWZuKFtfbTRfc2V0KFskMV0pXSlfbTRfcG9wZGVmKFtfbTRfc2V0KFskMV0sXV9tNF9kZWZuKAoJCVtfbTRfc2V0KFskMV0pXSlbKV0sIFtfbTRfc2V0KFskMV0pXSkkMChbJDFdLCBbJDIkM10pXSkKVDE3LDE1NgpBU19TSEVMTF9TQU5JVElaRV9BU19TSEVMTF9TQU5JVElaRQptNF9wcm92aWRlX2lmKFtBU19JTklUXSwgW10sClttNF9wcm92aWRlKFtBU19JTklUXSkKX0FTX0RFVEVDVF9SRVFVSVJFRChbX0FTX1NIRUxMX0ZOX1dPUktdKQpfQVNfREVURUNUX0JFVFRFUl9TSEVMTApfQVNfVU5TRVRfUFJFUEFSRQpdKQpUMTQsODkKQUNfTElOS19JRkVMU0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19DT01QSUxFUl9SRVFVSVJFKClkbmwKX0FDX0xJTktfSUZFTFNFKCRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMzIKbTRfbWFrZV9saXN0bTRfam9pbihbLApdLCBtNF9kcXVvdGVfZWx0KCRAKSkKVDE3LDgwNgpBQ19QUk9HX09CSkNYWENQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX09CSkNYWF0pZG5sCkFDX0FSR19WQVIoW09CSkNYWENQUF0sICAgW09iamVjdGl2ZSBDKysgcHJlcHJvY2Vzc29yXSlkbmwKX0FDX0FSR19WQVJfQ1BQRkxBR1MoKWRubApBQ19MQU5HX1BVU0goT2JqZWN0aXZlIEMrKylkbmwKQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gcnVuIHRoZSBPYmplY3RpdmUgQysrIHByZXByb2Nlc3Nvcl0pCmlmIHRlc3QgLXogIiRPQkpDWFhDUFAiOyB0aGVuCiAgQUNfQ0FDSEVfVkFMKGFjX2N2X3Byb2dfT0JKQ1hYQ1BQLAogIFtkbmwKICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIE9CSkNYWENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAogICAgZm9yIE9CSkNYWENQUCBpbiAiJE9CSkNYWCAtRSIgIi9saWIvY3BwIgogICAgZG8KICAgICAgX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0UoW2JyZWFrXSkKICAgIGRvbmUKICAgIGFjX2N2X3Byb2dfT0JKQ1hYQ1BQPSRPQkpDWFhDUFAKICBdKWRubAogIE9CSkNYWENQUD0kYWNfY3ZfcHJvZ19PQkpDWFhDUFAKZWxzZQogIGFjX2N2X3Byb2dfT0JKQ1hYQ1BQPSRPQkpDWFhDUFAKZmkKQUNfTVNHX1JFU1VMVChbJE9CSkNYWENQUF0pCl9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFKFtdLAoJICBbQUNfTVNHX0ZBSUxVUkUoW09iamVjdGl2ZSBDKysgcHJlcHJvY2Vzc29yICIkT0JKQ1hYQ1BQIiBmYWlscyBzYW5pdHkgY2hlY2tdKV0pCkFDX1NVQlNUKE9CSkNYWENQUClkbmwKQUNfTEFOR19QT1AoT2JqZWN0aXZlIEMrKylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxODUKQUNfQ0hFQ0tfSEVBREVSX200X2RlZnVuX3BybyhbJDBdKW00X2luZGlyKG00X2Nhc2UoWyQ0XSwKCQkgIFtdLCAgW1tfQUNfQ0hFQ0tfSEVBREVSX01PTkdSRUxdXSwKCQkgIFstXSwgW1tfQUNfQ0hFQ0tfSEVBREVSX1BSRVBST0NdXSwKCQkgICAgICAgW1tfQUNfQ0hFQ0tfSEVBREVSX0NPTVBJTEVdXSksICRAKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjUsNQppbmRleGluZGV4ClQxMywxODgKQUNfSEFWRV9GVU5DU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IQVZFX0ZVTkNTJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NIRUNLX0ZVTkNTXSwgW0FDX0NIRUNLX0ZVTkNTKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwxMDIKbTRfbG9jYXRpb24oX0FTX0VDSE9fTl9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00Ojc3NApUMjgsMTA2Cm00X2xvY2F0aW9uKEFNX1BST0dfSU5TVEFMTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjkyClQzMCwxMDMKbTRfbG9jYXRpb24oQUNfTk9fRVhFQ1VUQUJMRVMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjQwNwpUMjQsMjMKX0FDX0xBTkdfTlVMTF9QUk9HUkFNKEMpQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDE5LDI5NQpBQ19ERUNMX1NZU19TSUdMSVNUX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0RFQ0xfU1lTX1NJR0xJU1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX0RFQ0xTKFtzeXNfc2lnbGlzdF0sLCwKWyNpbmNsdWRlIDxzaWduYWwuaD4KLyogTmV0QlNEIGRlY2xhcmVzIHN5c19zaWdsaXN0IGluIHVuaXN0ZC5oLiAgKi8KI2lmZGVmIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTAyCm00X2xvY2F0aW9uKEFTX0xJTkVOT19QVVNIKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00Ojg2MQpUMzEsMTA4Cm00X2xvY2F0aW9uKEFDX1JFUExBQ0VfRk5NQVRDSCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1NzcKVDI5LDEwMwptNF9sb2NhdGlvbihBQ19MQU5HX0lOVF9TQVZFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDoyOTgKVDI4LDEwMQptNF9sb2NhdGlvbihBQ19QUk9HX0NDX1NUREMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjEzNzAKVDI2LDEwMQptNF9sb2NhdGlvbihBQ19DX1JFU1RSSUNUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxNzMwClQxMSw0OTgKX0FTX01LRElSX1BjYXNlICRhc19kaXIgaW4gIygKICAtKikgYXNfZGlyPS4vJGFzX2Rpcjs7CiAgZXNhYwogIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgewogICAgYXNfZGlycz0KICAgIHdoaWxlIDo7IGRvCiAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAogICAgICAqXCcqKSBhc19xZGlyPWBBU19FQ0hPKFsiJGFzX2RpciJdKSB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAogICAgICAqKSBhc19xZGlyPSRhc19kaXI7OwogICAgICBlc2FjCiAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCiAgICAgIGFzX2Rpcj1gQVNfRElSTkFNRSgiJGFzX2RpciIpYAogICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawogICAgZG9uZQogICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgogIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgQVNfRVJST1IoW2Nhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXJdKQoKVDI1LDQwCl9BQ19IQVZFX1RPUF9CVUlMRF9QUkVGSVhfbTRfZGVmdW5fcHJvKFskMF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxOTIKQUNfUFJPR1JBTVNfQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUFJPR1JBTVNfQ0hFQ0snIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ0hFQ0tfUFJPR1NdLCBbQUNfQ0hFQ0tfUFJPR1MoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM5LDEwMwptNF9sb2NhdGlvbihfQVNfUEFUSF9TRVBBUkFUT1JfUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMjc2ClQ1LDczCm00X2RvbTRfaWYoWyQjXSwgMCwgW10sCiAgICAgICBbJCNdLCAxLCBbJDFbXV0sCiAgICAgICBbJDFbXSQwKG00X3NoaWZ0KCRAKSldKQpUMTAsMTg3CkFDX1NUUkNPTExfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RSQ09MTCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX1NUUkNPTExdLCBbQUNfRlVOQ19TVFJDT0xMKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pCkY5LDYKbTRfc3Vic3Ryc3Vic3RyClQzMywxMDIKbTRfbG9jYXRpb24oX0FTX0RFVEVDVF9TVUdHRVNURUQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTY4ClQzNCwxMDYKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfSEVBREVSU19PTkNFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDoyNzMKVDE4LDgKbTRfUEFDS0FHRV9UQVJOQU1FYXV0b2NvbmYKVDE0LDg3CkFDX1BST0dfQ0NfQzk5X200X2RlZnVuX3BybyhbJDBdKSBBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKICBfQUNfUFJPR19DQ19DOTkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywyNTIKbTRfc2V0X3JlbW92ZW00X3NldF9jb250YWlucyhbJDFdLCBbJDJdLCBbX200X3NldF9zaXplKFskMV0sCiAgICBbbTRfZGVjcl0pbTRfaWYoX200X2RlZm4oW19tNF9zZXQoWyQxXSldKSwgWyQyXSwKCQkgICAgW19tNF9wb3BkZWYoW19tNF9zZXQoWyQxXSwkMildLCBbX200X3NldChbJDFdKV0pXSwKCQkgICAgW200X2RlZmluZShbX200X3NldF9jbGVhbnVwKCQxKV0pbTRfZGVmaW5lKAoJCSAgICAgIFtfbTRfc2V0KFskMV0sJDIpXSwgWzBdKV0pJDNdLCBbJDRdKQpUMTksMTA5Cl9tNF9kZWZ1bl9lcGlfb3V0ZXJfbTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X2R1bXBdLCBbX200X2RpdmVydGluZyhbJDFdKV0sIFtfbTRfZGl2ZXJ0aW5nXSltNF9kaXZlcnRfcG9wKFtHUk9XXSltNF91bmRpdmVydChbR1JPV10pClQyMCwzCl9BQ19MQU5HX1BSRUZJWChDKyspQ1hYClQxMCwyNApBTl9NQUtFVkFSQU5fT1VUUFVUKFttYWtldmFyXSwgJEApClQyMSwxMTM2CkFDX1RZUEVfTE9OR19MT05HX0lOVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yIGxvbmcgbG9uZyBpbnRdLCBbYWNfY3ZfdHlwZV9sb25nX2xvbmdfaW50XSwKICAgIFtBQ19MSU5LX0lGRUxTRSgKICAgICAgIFtfQUNfVFlQRV9MT05HX0xPTkdfU05JUFBFVF0sCiAgICAgICBbZG5sIFRoaXMgY2F0Y2hlcyBhIGJ1ZyBpbiBUYW5kZW0gTm9uU3RvcCBLZXJuZWwgKE9TUykgY2MgLU8gY2lyY2EgMjAwNC4KCWRubCBJZiBjcm9zcyBjb21waWxpbmcsIGFzc3VtZSB0aGUgYnVnIGlzbid0IGltcG9ydGFudCwgc2luY2UKCWRubCBub2JvZHkgY3Jvc3MgY29tcGlsZXMgZm9yIHRoaXMgcGxhdGZvcm0gYXMgZmFyIGFzIHdlIGtub3cuCglBQ19SVU5fSUZFTFNFKAoJICBbQUNfTEFOR19QUk9HUkFNKAoJICAgICBbW0AlOkBpbmNsdWRlIDxsaW1pdHMuaD4KCSAgICAgICBAJTpAaWZuZGVmIExMT05HX01BWAoJICAgICAgIEAlOkAgZGVmaW5lIEhBTEYgXAoJCQkoMUxMIDw8IChzaXplb2YgKGxvbmcgbG9uZyBpbnQpICogQ0hBUl9CSVQgLSAyKSkKCSAgICAgICBAJTpAIGRlZmluZSBMTE9OR19NQVggKEhBTEYgLSAxICsgSEFMRikKCSAgICAgICBAJTpAZW5kaWZdXSwKCSAgICAgW1tsb25nIGxvbmcgaW50IG4gPSAxOwoJICAgICAgIGludCBpOwoJICAgICAgIGZvciAoaSA9IDA7IDsgaSsrKQoJCSB7CgkJICAgbG9uZyBsb25nIGludCBtID0gbiA8PCBpOwoJCSAgIGlmIChtID4+IGkgIT0gbikKCQkgICAgIHJldHVybiAxOwoJCSAgIGlmIChMTE9OR19NQVggLyAyIDwgbSkKCQkgICAgIGJyZWFrOwoJCSB9CgkgICAgICAgcmV0dXJuIDA7XV0pXSwKCSAgW2FjX2N2X3R5cGVfbG9uZ19sb25nX2ludD15ZXNdLAoJICBbYWNfY3ZfdHlwZV9sb25nX2xvbmdfaW50PW5vXSwKCSAgW2FjX2N2X3R5cGVfbG9uZ19sb25nX2ludD15ZXNdKV0sCiAgICAgICBbYWNfY3ZfdHlwZV9sb25nX2xvbmdfaW50PW5vXSldKQogIGlmIHRlc3QgJGFjX2N2X3R5cGVfbG9uZ19sb25nX2ludCA9IHllczsgdGhlbgogICAgQUNfREVGSU5FKFtIQVZFX0xPTkdfTE9OR19JTlRdLCAxLAogICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGxvbmcgbG9uZyBpbnQnLl0pCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxOTQKQUNfSEFWRV9IRUFERVJTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hBVkVfSEVBREVSUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DSEVDS19IRUFERVJTXSwgW0FDX0NIRUNLX0hFQURFUlMoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDg3MwpBQ19GVU5DX1NUUlRPTERfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3RydG9sZCBjb25mb3JtcyB0byBDOTldLAogICAgW2FjX2N2X2Z1bmNfc3RydG9sZF0sCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKAoJICBbWy8qIE9uIEhQLVVYIGJlZm9yZSAxMS4yMywgc3RydG9sZCByZXR1cm5zIGEgc3RydWN0IGluc3RlYWQgb2YKCQlsb25nIGRvdWJsZS4gIFJlamVjdCBpbXBsZW1lbnRhdGlvbnMgbGlrZSB0aGF0LCBieSByZXF1aXJpbmcKCQljb21wYXRpYmlsaXR5IHdpdGggdGhlIEM5OSBwcm90b3R5cGUuICAqLwojCSAgICAgaW5jbHVkZSA8c3RkbGliLmg+CgkgICAgIHN0YXRpYyBsb25nIGRvdWJsZSAoKnApIChjaGFyIGNvbnN0ICosIGNoYXIgKiopID0gc3RydG9sZDsKCSAgICAgc3RhdGljIGxvbmcgZG91YmxlCgkgICAgIHRlc3QgKGNoYXIgY29uc3QgKm5wdHIsIGNoYXIgKiplbmRwdHIpCgkgICAgIHsKCSAgICAgICBsb25nIGRvdWJsZSByOwoJICAgICAgIHIgPSBzdHJ0b2xkIChucHRyLCBlbmRwdHIpOwoJICAgICAgIHJldHVybiByOwoJICAgICB9XV0sCgkgICBbW3JldHVybiB0ZXN0ICgiMS4wIiwgTlVMTCkgIT0gMSB8fCBwICgiMS4wIiwgTlVMTCkgIT0gMTtdXSldLAogICAgICAgW2FjX2N2X2Z1bmNfc3RydG9sZD15ZXNdLAogICAgICAgW2FjX2N2X2Z1bmNfc3RydG9sZD1ub10pXSkKICBpZiB0ZXN0ICRhY19jdl9mdW5jX3N0cnRvbGQgPSB5ZXM7IHRoZW4KICAgIEFDX0RFRklORShbSEFWRV9TVFJUT0xEXSwgMSwKICAgICAgW0RlZmluZSB0byAxIGlmIHN0cnRvbGQgZXhpc3RzIGFuZCBjb25mb3JtcyB0byBDOTkuXSkKICBmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDkwCkFDX0NIRUNLX0hFQURFUlNfT05DRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUNfQ0hFQ0tfSEVBREVSX09OQ0UoXSwgWyldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTAzCm00X2xvY2F0aW9uKF9BU19UUl9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE4NjAKVDI2LDEwNwptNF9sb2NhdGlvbihBQ19QUk9HX0VHUkVQKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MzU3ClQxOCwzNTQwCl9BQ19PVVRQVVRfU1VCRElSUwojCiMgQ09ORklHX1NVQkRJUlMgc2VjdGlvbi4KIwppZiB0ZXN0ICIkbm9fcmVjdXJzaW9uIiAhPSB5ZXM7IHRoZW4KCiAgIyBSZW1vdmUgLS1jYWNoZS1maWxlLCAtLXNyY2RpciwgYW5kIC0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcgYXJndW1lbnRzCiAgIyBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgogIGFjX3N1Yl9jb25maWd1cmVfYXJncz0KICBhY19wcmV2PQogIGV2YWwgInNldCB4ICRhY19jb25maWd1cmVfYXJncyIKICBzaGlmdAogIGZvciBhY19hcmcKICBkbwogICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCiAgICAgIGFjX3ByZXY9CiAgICAgIGNvbnRpbnVlCiAgICBmaQogICAgY2FzZSAkYWNfYXJnIGluCiAgICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCiAgICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKICAgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CiAgICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKICAgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIFwKICAgIHwgLS1jPSopCiAgICAgIDs7CiAgICAtLWNvbmZpZy1jYWNoZSB8IC1DKQogICAgICA7OwogICAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKICAgICAgYWNfcHJldj1zcmNkaXIgOzsKICAgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCiAgICAgIDs7CiAgICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQogICAgICBhY19wcmV2PXByZWZpeCA7OwogICAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQogICAgICA7OwogICAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZykKICAgICAgOzsKICAgICopCiAgICAgIGNhc2UgJGFjX2FyZyBpbgogICAgICAqXCcqKSBhY19hcmc9YEFTX0VDSE8oWyIkYWNfYXJnIl0pIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgICAgIGVzYWMKICAgICAgQVNfVkFSX0FQUEVORChbYWNfc3ViX2NvbmZpZ3VyZV9hcmdzXSwgWyIgJyRhY19hcmcnIl0pIDs7CiAgICBlc2FjCiAgZG9uZQoKICAjIEFsd2F5cyBwcmVwZW5kIC0tcHJlZml4IHRvIGVuc3VyZSB1c2luZyB0aGUgc2FtZSBwcmVmaXgKICAjIGluIHN1YmRpciBjb25maWd1cmF0aW9ucy4KICBhY19hcmc9Ii0tcHJlZml4PSRwcmVmaXgiCiAgY2FzZSAkYWNfYXJnIGluCiAgKlwnKikgYWNfYXJnPWBBU19FQ0hPKFsiJGFjX2FyZyJdKSB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwogIGVzYWMKICBhY19zdWJfY29uZmlndXJlX2FyZ3M9IickYWNfYXJnJyAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIgoKICAjIFBhc3MgLS1zaWxlbnQKICBpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgogICAgYWNfc3ViX2NvbmZpZ3VyZV9hcmdzPSItLXNpbGVudCAkYWNfc3ViX2NvbmZpZ3VyZV9hcmdzIgogIGZpCgogICMgQWx3YXlzIHByZXBlbmQgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyB0byBzaWxlbmNlIHdhcm5pbmdzLCBzaW5jZQogICMgZGlmZmVyZW50IHN1YmRpcnMgY2FuIGhhdmUgZGlmZmVyZW50IC0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucy4KICBhY19zdWJfY29uZmlndXJlX2FyZ3M9Ii0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcgJGFjX3N1Yl9jb25maWd1cmVfYXJncyIKCiAgYWNfcG9wZGlyPWBwd2RgCiAgZm9yIGFjX2RpciBpbiA6ICRzdWJkaXJzOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQoKICAgICMgRG8gbm90IGNvbXBsYWluLCBzbyBhIGNvbmZpZ3VyZSBzY3JpcHQgY2FuIGNvbmZpZ3VyZSB3aGljaGV2ZXIKICAgICMgcGFydHMgb2YgYSBsYXJnZSBzb3VyY2UgdHJlZSBhcmUgcHJlc2VudC4KICAgIHRlc3QgLWQgIiRzcmNkaXIvJGFjX2RpciIgfHwgY29udGludWUKCiAgICBhY19tc2c9Ij09PSBjb25maWd1cmluZyBpbiAkYWNfZGlyIChgcHdkYC8kYWNfZGlyKSIKICAgIF9BU19FQ0hPX0xPRyhbJGFjX21zZ10pCiAgICBfQVNfRUNITyhbJGFjX21zZ10pCiAgICBBU19NS0RJUl9QKFsiJGFjX2RpciJdKQogICAgX0FDX1NSQ0RJUlMoWyIkYWNfZGlyIl0pCgogICAgY2QgIiRhY19kaXIiCgogICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmU7IG90aGVyd2lzZSBnZXQgQ3lnbnVzIHN0eWxlIGNvbmZpZ3VyZS4KICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0kYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUKICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCiAgICAgIGFjX3N1Yl9jb25maWd1cmU9JGFjX3NyY2Rpci9jb25maWd1cmUKICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuaW4iOyB0aGVuCiAgICAgICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KICAgICAgYWNfc3ViX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUKICAgIGVsc2UKICAgICAgQUNfTVNHX1dBUk4oW25vIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgaW4gJGFjX2Rpcl0pCiAgICAgIGFjX3N1Yl9jb25maWd1cmU9CiAgICBmaQoKICAgICMgVGhlIHJlY3Vyc2lvbiBpcyBoZXJlLgogICAgaWYgdGVzdCAtbiAiJGFjX3N1Yl9jb25maWd1cmUiOyB0aGVuCiAgICAgICMgTWFrZSB0aGUgY2FjaGUgZmlsZSBuYW1lIGNvcnJlY3QgcmVsYXRpdmUgdG8gdGhlIHN1YmRpcmVjdG9yeS4KICAgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgogICAgICBbW1xcL11dKiB8ID86W1tcXC9dXSogKSBhY19zdWJfY2FjaGVfZmlsZT0kY2FjaGVfZmlsZSA7OwogICAgICAqKSAjIFJlbGF0aXZlIG5hbWUuCglhY19zdWJfY2FjaGVfZmlsZT0kYWNfdG9wX2J1aWxkX3ByZWZpeCRjYWNoZV9maWxlIDs7CiAgICAgIGVzYWMKCiAgICAgIEFDX01TR19OT1RJQ0UoW3J1bm5pbmcgJFNIRUxMICRhY19zdWJfY29uZmlndXJlICRhY19zdWJfY29uZmlndXJlX2FyZ3MgLS1jYWNoZS1maWxlPSRhY19zdWJfY2FjaGVfZmlsZSAtLXNyY2Rpcj0kYWNfc3JjZGlyXSkKICAgICAgIyBUaGUgZXZhbCBtYWtlcyBxdW90aW5nIGFyZ3VtZW50cyB3b3JrLgogICAgICBldmFsICJcJFNIRUxMIFwiXCRhY19zdWJfY29uZmlndXJlXCIgJGFjX3N1Yl9jb25maWd1cmVfYXJncyBcCgkgICAtLWNhY2hlLWZpbGU9XCJcJGFjX3N1Yl9jYWNoZV9maWxlXCIgLS1zcmNkaXI9XCJcJGFjX3NyY2RpclwiIiB8fAoJQUNfTVNHX0VSUk9SKFskYWNfc3ViX2NvbmZpZ3VyZSBmYWlsZWQgZm9yICRhY19kaXJdKQogICAgZmkKCiAgICBjZCAiJGFjX3BvcGRpciIKICBkb25lCmZpCgpUOSwwCkFIX09VVFBVVApUMTUsNzc3CkFDX0NIRUNLX1NJWkVPRl9tNF9kZWZ1bl9wcm8oWyQwXSlBU19MSVRFUkFMX0lGKG00X3RyYW5zbGl0KFtbJDFdXSwgWypdLCBbcF0pLCBbXSwKCSAgICAgICBbbTRfZmF0YWwoWyQwOiByZXF1aXJlcyBsaXRlcmFsIGFyZ3VtZW50c10pXSkjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgojIHZlcnNpb24gSFA5MjQ1My0wMSBCLjExLjExLjIzNzA5LkdQLCB3aGljaCBpbmNvcnJlY3RseSByZWplY3RzCiMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgojIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgpfQUNfQ0FDSEVfQ0hFQ0tfSU5UKFtzaXplIG9mICQxXSwgW0FTX1RSX1NIKFthY19jdl9zaXplb2ZfJDFdKV0sCiAgWyhsb25nIGludCkgKHNpemVvZiAoJDEpKV0sCiAgW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQzXSldLAogIFtpZiB0ZXN0ICIkQVNfVFJfU0goW2FjX2N2X3R5cGVfJDFdKSIgPSB5ZXM7IHRoZW4KICAgICBBQ19NU0dfRkFJTFVSRShbY2Fubm90IGNvbXB1dGUgc2l6ZW9mICgkMSldLCA3NykKICAgZWxzZQogICAgIEFTX1RSX1NIKFthY19jdl9zaXplb2ZfJDFdKT0wCiAgIGZpXSkKCkFDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoc2l6ZW9mXyQxKSwgJEFTX1RSX1NIKFthY19jdl9zaXplb2ZfJDFdKSwKCQkgICBbVGhlIHNpemUgb2YgYCQxJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNTgKbTRfZGl2ZXJ0X3N0YWNrbTRfc3RhY2tfZm9yZWFjaF9zZXBfbGlmbyhbX200X2RpdmVydF9zdGFja10sIFtdLCBbXSwgWwpdKQpUMTksODMKQUNfUkVRVUlSRV9BVVhfRklMRUFTX0xJVEVSQUxfV09SRF9JRihbJDFdLCBbXSwKCSAgICAgICBbbTRfZmF0YWwoWyQwOiByZXF1aXJlcyBhIGxpdGVyYWwgYXJndW1lbnRdKV0pClQxNywzMQptNF9kZWZhdWx0X3F1b3RlZG00X2lmKFskMV0sIFtdLCBbWyQyXV0sIFtbJDFdXSkKVDI3LDEwNwptNF9sb2NhdGlvbihfQUNfUlVOX0lGRUxTRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjczMApUMjksMTAwCm00X2xvY2F0aW9uKF9BQ19BUkdfVkFSX0xJQlMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjMyOApUMTEsODgKQUhfVkVSQkFUSU1BU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwKCSAgICAgICBbQUhfT1VUUFVUKF9tNF9leHBhbmQoWyQxXSksIEFTX0VTQ0FQRShbWyQyXV0sIFtcJ10pKV0pClQzNywxMjY2CkFDX0ZVTkNfTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTktfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soCiAgICAgICBbd2hldGhlciBsc3RhdCBjb3JyZWN0bHkgaGFuZGxlcyB0cmFpbGluZyBzbGFzaF0sCiAgICAgICBbYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rXSwKW3JtIC1mIGNvbmZ0ZXN0LnN5bSBjb25mdGVzdC5maWxlCmVjaG8gPmNvbmZ0ZXN0LmZpbGUKaWYgdGVzdCAiJGFzX2xuX3MiID0gImxuIC1zIiAmJiBsbiAtcyBjb25mdGVzdC5maWxlIGNvbmZ0ZXN0LnN5bTsgdGhlbgogIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVF0sCiAgICBbc3RydWN0IHN0YXQgc2J1ZjsKICAgICAvKiBMaW51eCB3aWxsIGRlcmVmZXJlbmNlIHRoZSBzeW1saW5rIGFuZCBmYWlsLCBhcyByZXF1aXJlZCBieSBQT1NJWC4KCVRoYXQgaXMgYmV0dGVyIGluIHRoZSBzZW5zZSB0aGF0IGl0IG1lYW5zIHdlIHdpbGwgbm90CgloYXZlIHRvIGNvbXBpbGUgYW5kIHVzZSB0aGUgbHN0YXQgd3JhcHBlci4gICovCiAgICAgcmV0dXJuIGxzdGF0ICgiY29uZnRlc3Quc3ltLyIsICZzYnVmKSA9PSAwO10pXSwKCQlbYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPXllc10sCgkJW2FjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ub10sCgkJW2FjX2N2X2Z1bmNfbHN0YXRfZGVyZWZlcmVuY2VzX3NsYXNoZWRfc3ltbGluaz1ub10pCmVsc2UKICAjIElmIHRoZSBgbG4gLXMnIGNvbW1hbmQgZmFpbGVkLCB0aGVuIHdlIHByb2JhYmx5IGRvbid0IGV2ZW4KICAjIGhhdmUgYW4gbHN0YXQgZnVuY3Rpb24uCiAgYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rPW5vCmZpCnJtIC1mIGNvbmZ0ZXN0LnN5bSBjb25mdGVzdC5maWxlCl0pCgp0ZXN0ICRhY19jdl9mdW5jX2xzdGF0X2RlcmVmZXJlbmNlc19zbGFzaGVkX3N5bWxpbmsgPSB5ZXMgJiYKICBBQ19ERUZJTkVfVU5RVU9URUQoW0xTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LXSwgWzFdLAoJCSAgICAgW0RlZmluZSB0byAxIGlmIGBsc3RhdCcgZGVyZWZlcmVuY2VzIGEgc3ltbGluayBzcGVjaWZpZWQKCQkgICAgICB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXSkKCmlmIHRlc3QgIngkYWNfY3ZfZnVuY19sc3RhdF9kZXJlZmVyZW5jZXNfc2xhc2hlZF9zeW1saW5rIiA9IHhubzsgdGhlbgogIEFDX0xJQk9CSihbbHN0YXRdKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDMyNgpfQUNfUlVOX0xPR19TVERFUlJfbTRfZGVmdW5fcHJvKFskMF0peyB7ICQyOyB9ID4mQVNfTUVTU0FHRV9MT0dfRkQKICAoJDEpIDI+Y29uZnRlc3QuZXJyCiAgYWNfc3RhdHVzPSQ/CiAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCiAgICBjYXQgY29uZnRlc3QuZXIxID4mQVNfTUVTU0FHRV9MT0dfRkQKICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKICBmaQogIF9BU19FQ0hPX0xPRyhbXCQ/ID0gJGFjX3N0YXR1c10pCiAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMTA4Cm00X2xvY2F0aW9uKEFNX0ZVTkNfRk5NQVRDSCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1OTcKVDIzLDMKX200X2RpdmVydChWRVJTSU9OX0ZTRikyMDEKVDE0LDI4CkFTX1ZBUl9QVVNIREVGXyQwKFskMV0sIG00X2V4cGFuZChbJDJdKSlbXQpUMTQsMTMwCkFTX1ZBUl9QVVNIREVGX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19UUl9TSF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMjEKQUNfTEFOR19DQVNFbTRfY2FzZShfQUNfTEFORywgJEApClQxOCwxMDIKbTRfbG9jYXRpb24oQVNfSUYpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6NjA2ClQyNiwxMDYKbTRfbG9jYXRpb24oQUNfU1RfQkxLU0laRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc2ClQxNSw0NzAKX0FDX0xJTktfSUZFTFNFX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9saW5rXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX3RyeV9saW5rXSwgW0xJTkVOT10sCiAgICBbVHJ5IHRvIGxpbmsgY29uZnRlc3QuJGFjX2V4dCwgYW5kIHJldHVybiB3aGV0aGVyIHRoaXMgc3VjY2VlZGVkLl0pXSwKICBbJDBfQk9EWV0pbTRfaWZ2YWxuKFskMV0sIFtBQ19MQU5HX0NPTkZURVNUKFskMV0pXSlBU19JRihbYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV90cnlfbGluayAiJExJTkVOTyJdLCBbJDJdLCBbJDNdKQpybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dFtdbTRfaWZ2YWwoWyQxXSwgWyBjb25mdGVzdC4kYWNfZXh0XSlbXWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDY3CkFDX0xBTkdfQ09ORlRFU1QoRm9ydHJhbiA3NyljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkFDX0xBTkdfREVGSU5FU19QUk9WSURFRFtdJDEKX0FDRU9GClQzMiwxMDgKbTRfbG9jYXRpb24oX0FDX0ZVTkNfRk5NQVRDSF9JRikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo1MTIKVDIxLDEwNgptNF9sb2NhdGlvbihBQ19VSURfVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjgyClQzMSwxMDYKbTRfbG9jYXRpb24oQUNfR0NDX1RSQURJVElPTkFMKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NTkKVDExLDE5NApBQ19USU1FWk9ORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19USU1FWk9ORScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19TVFJVQ1RfVElNRVpPTkVdLCBbQUNfU1RSVUNUX1RJTUVaT05FKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSw2NgpBQ19NU0dfQ0hFQ0tJTkd7IF9BU19FQ0hPX0xPRyhbY2hlY2tpbmcgJDFdKQpfQVNfRUNIT19OKFtjaGVja2luZyAkMS4uLiBdKTsgfWRubAoKVDMxLDEwMwptNF9sb2NhdGlvbihBU19WRVJTSU9OX0NPTVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTc0OQpUMzEsMTA5Cm00X2xvY2F0aW9uKEFDX0ZVTkNfVVRJTUVfTlVMTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNzUzClQyNywxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19NQUxMT0MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6OTE2ClQxNCw5NwpBQ19DSEVDS19GSUxFU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtBQ19DSEVDS19GSUxFKF8kMChdLCBbKVskMl0sIFskM10pXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDczMwpBQ19DQU5PTklDQUxfSE9TVF9tNF9kZWZ1bl9vbmNlKFtBQ19DQU5PTklDQUxfSE9TVF0sIFtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAptNF9kaXZlcnRfb25jZShbSEVMUF9DQU5PTl0sCltbICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF1dXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2hvc3Qgc3lzdGVtIHR5cGVdLCBbYWNfY3ZfaG9zdF0sCltpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgogIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCmVsc2UKICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAogICAgQUNfTVNHX0VSUk9SKFskU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWRdKQpmaQpdKQpfQUNfQ0FOT05JQ0FMX1NQTElUKFtob3N0XSkKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0NBTk9OSUNBTF9IT1NUXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfQ0FOT05JQ0FMX0hPU1RdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfQ0FOT05JQ0FMX0hPU1RdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19DQU5PTklDQUxfSE9TVF0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDI0LDEwNwptNF9sb2NhdGlvbihBQ19UUllfTElOSykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjY4OApUMTcsMTA5Cl9BQ19MQU5HX0RJU1BBVENIbTRfaWZkZWYoWyQxKCQyKV0sCiAgICAgICBbbTRfaW5kaXIoWyQxKCQyKV0sIG00X3NoaWZ0MigkQCkpXSwKICAgICAgIFttNF9mYXRhbChbJDE6IHVua25vd24gbGFuZ3VhZ2U6ICQyXSldKQpGOSw2Cm00X3N5c2NtZHN5c2NtZApUMjAsMTAyCm00X2xvY2F0aW9uKEFDX0xBTkcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00Ojg5ClQxNiwxMTYKX0FDX0FSR19WQVJfTElCU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19BUkdfVkFSKFtMSUJTXSwKCSAgICBbbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5Pl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwyNjIKQUNfUFJPR19GQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKQUNfQVJHX1ZBUihbRkNdLCAgICBbRm9ydHJhbiBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbRkNGTEFHU10sIFtGb3J0cmFuIGNvbXBpbGVyIGZsYWdzXSlkbmwKX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCl9BQ19BUkdfVkFSX0xJQlMoKWRubApfQUNfUFJPR19GQyhbJDJdLCBbJDFdKQpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDEwNgptNF9sb2NhdGlvbihBQ19DT05GSUdfVEVTVERJUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2F1dG90ZXN0Lm00OjQyClQzMiwwCm00X2luY2x1ZGUoYXV0b2NvbmYvYXV0b3Rlc3QubTQpClQxNiw4NApfQUhfQ0hFQ0tfSEVBREVSQUhfVEVNUExBVEUoQVNfVFJfQ1BQKFtIQVZFXyQxXSksCiAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8JDE+IGhlYWRlciBmaWxlLl0pClQxNyw2OTYKX0FDX0NIRUNLX0FMSUdOT0YjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlciwKIyBzZWUgQUNfQ0hFQ0tfU0laRU9GIGZvciBtb3JlIGluZm9ybWF0aW9uLgpfQUNfQ0FDSEVfQ0hFQ0tfSU5UKFthbGlnbm1lbnQgb2YgJDFdLCBbQVNfVFJfU0goW2FjX2N2X2FsaWdub2ZfJDNdKV0sCiAgWyhsb25nIGludCkgb2Zmc2V0b2YgKGFjX190eXBlX2FsaWdub2ZfLCB5KV0sCiAgW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQyXSkKI2lmbmRlZiBvZmZzZXRvZgojIGRlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICgoY2hhciAqKSAmKCh0eXBlICopIDApLT5tZW1iZXIgLSAoY2hhciAqKSAwKQojZW5kaWYKdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIHg7ICQxIHk7IH0gYWNfX3R5cGVfYWxpZ25vZl87XSwKICBbaWYgdGVzdCAiJEFTX1RSX1NIKFthY19jdl90eXBlXyQzXSkiID0geWVzOyB0aGVuCiAgICAgQUNfTVNHX0ZBSUxVUkUoW2Nhbm5vdCBjb21wdXRlIGFsaWdubWVudCBvZiAkMV0sIDc3KQogICBlbHNlCiAgICAgQVNfVFJfU0goW2FjX2N2X2FsaWdub2ZfJDNdKT0wCiAgIGZpXSkKCkFDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoYWxpZ25vZl8kMyksICRBU19UUl9TSChbYWNfY3ZfYWxpZ25vZl8kM10pLAoJCSAgIFtUaGUgbm9ybWFsIGFsaWdubWVudCBvZiBgJDEnLCBpbiBieXRlcy5dKQoKVDIzLDY3CkFDX1NUUlVDVF9ESVJFTlRfRF9UWVBFX200X2RlZnVuX3BybyhbJDBdKV9BQ19TVFJVQ1RfRElSRU5UKFtkX3R5cGVdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksNjQKQUNfTEFOR19DT01QSUxFUihDKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDEzNgptNF9zZXRfZHVtcG00X2lmZGVmKFtfbTRfc2V0X3NpemUoJDEpXSwKCSAgW19tNF9wb3BkZWYoW19tNF9zZXRfc2l6ZSgkMSldKV0pbTRfaWZkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldLAogICAgW18kMF9jaGVja10sIFtfJDBdKShbJDFdLCBbXSwgWyQyXSkKVDI2LDEwNgptNF9sb2NhdGlvbihBQ19SRVRTSUdUWVBFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NzEKVDksNTgKbTRfaWZ2YWxubTRfaWYoWyQxXSwKICAgICAgIFtdLCAgIFttNF9uKFskM10pXSwKCSAgICAgW200X24oWyQyXSldKQpUMjcsMTA3Cm00X2xvY2F0aW9uKEFDX0RFQ0xfWVlURVhUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6NzkzClQ3LDAKX19nbnVfXwpUMTUsMzM5MQpfQUNfUFJPR19DQ19DOTlfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0NfU1REX1RSWShbYzk5XSwKW1sjaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHdjaGFyLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKLy8gQ2hlY2sgdmFyYXJncyBtYWNyb3MuICBUaGVzZSBleGFtcGxlcyBhcmUgdGFrZW4gZnJvbSBDOTkgNi4xMC4zLjUuCiNkZWZpbmUgZGVidWcoLi4uKSBmcHJpbnRmIChzdGRlcnIsIF9fVkFfQVJHU19fKQojZGVmaW5lIHNob3dsaXN0KC4uLikgcHV0cyAoI19fVkFfQVJHU19fKQojZGVmaW5lIHJlcG9ydCh0ZXN0LC4uLikgKCh0ZXN0KSA/IHB1dHMgKCN0ZXN0KSA6IHByaW50ZiAoX19WQV9BUkdTX18pKQpzdGF0aWMgdm9pZAp0ZXN0X3ZhcmFyZ3NfbWFjcm9zICh2b2lkKQp7CiAgaW50IHggPSAxMjM0OwogIGludCB5ID0gNTY3ODsKICBkZWJ1ZyAoIkZsYWciKTsKICBkZWJ1ZyAoIlggPSAlZFxuIiwgeCk7CiAgc2hvd2xpc3QgKFRoZSBmaXJzdCwgc2Vjb25kLCBhbmQgdGhpcmQgaXRlbXMuKTsKICByZXBvcnQgKHg+eSwgInggaXMgJWQgYnV0IHkgaXMgJWQiLCB4LCB5KTsKfQoKLy8gQ2hlY2sgbG9uZyBsb25nIHR5cGVzLgojZGVmaW5lIEJJRzY0IDE4NDQ2NzQ0MDczNzA5NTUxNjE1dWxsCiNkZWZpbmUgQklHMzIgNDI5NDk2NzI5NXVsCiNkZWZpbmUgQklHX09LIChCSUc2NCAvIEJJRzMyID09IDQyOTQ5NjcyOTd1bGwgJiYgQklHNjQgJSBCSUczMiA9PSAwKQojaWYgIUJJR19PSwogIHlvdXIgcHJlcHJvY2Vzc29yIGlzIGJyb2tlbjsKI2VuZGlmCiNpZiBCSUdfT0sKI2Vsc2UKICB5b3VyIHByZXByb2Nlc3NvciBpcyBicm9rZW47CiNlbmRpZgpzdGF0aWMgbG9uZyBsb25nIGludCBiaWdudW0gPSAtOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwpzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGludCB1YmlnbnVtID0gQklHNjQ7CgpzdHJ1Y3QgaW5jb21wbGV0ZV9hcnJheQp7CiAgaW50IGRhdGFzaXplOwogIGRvdWJsZSBkYXRhW107Cn07CgpzdHJ1Y3QgbmFtZWRfaW5pdCB7CiAgaW50IG51bWJlcjsKICBjb25zdCB3Y2hhcl90ICpuYW1lOwogIGRvdWJsZSBhdmVyYWdlOwp9OwoKdHlwZWRlZiBjb25zdCBjaGFyICpjY3A7CgpzdGF0aWMgaW5saW5lIGludAp0ZXN0X3Jlc3RyaWN0IChjY3AgcmVzdHJpY3QgdGV4dCkKewogIC8vIFNlZSBpZiBDKystc3R5bGUgY29tbWVudHMgd29yay4KICAvLyBJdGVyYXRlIHRocm91Z2ggaXRlbXMgdmlhIHRoZSByZXN0cmljdGVkIHBvaW50ZXIuCiAgLy8gQWxzbyBjaGVjayBmb3IgZGVjbGFyYXRpb25zIGluIGZvciBsb29wcy4KICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgKih0ZXh0K2kpICE9ICdcMCc7ICsraSkKICAgIGNvbnRpbnVlOwogIHJldHVybiAwOwp9CgovLyBDaGVjayB2YXJhcmdzIGFuZCB2YV9jb3B5LgpzdGF0aWMgdm9pZAp0ZXN0X3ZhcmFyZ3MgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgdmFfbGlzdCBhcmdzOwogIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwogIHZhX2xpc3QgYXJnc19jb3B5OwogIHZhX2NvcHkgKGFyZ3NfY29weSwgYXJncyk7CgogIGNvbnN0IGNoYXIgKnN0cjsKICBpbnQgbnVtYmVyOwogIGZsb2F0IGZudW1iZXI7CgogIHdoaWxlICgqZm9ybWF0KQogICAgewogICAgICBzd2l0Y2ggKCpmb3JtYXQrKykKCXsKCWNhc2UgJ3MnOiAvLyBzdHJpbmcKCSAgc3RyID0gdmFfYXJnIChhcmdzX2NvcHksIGNvbnN0IGNoYXIgKik7CgkgIGJyZWFrOwoJY2FzZSAnZCc6IC8vIGludAoJICBudW1iZXIgPSB2YV9hcmcgKGFyZ3NfY29weSwgaW50KTsKCSAgYnJlYWs7CgljYXNlICdmJzogLy8gZmxvYXQKCSAgZm51bWJlciA9IHZhX2FyZyAoYXJnc19jb3B5LCBkb3VibGUpOwoJICBicmVhazsKCWRlZmF1bHQ6CgkgIGJyZWFrOwoJfQogICAgfQogIHZhX2VuZCAoYXJnc19jb3B5KTsKICB2YV9lbmQgKGFyZ3MpOwp9Cl1dLApbWwogIC8vIENoZWNrIGJvb2wuCiAgX0Jvb2wgc3VjY2VzcyA9IGZhbHNlOwoKICAvLyBDaGVjayByZXN0cmljdC4KICBpZiAodGVzdF9yZXN0cmljdCAoIlN0cmluZyBsaXRlcmFsIikgPT0gMCkKICAgIHN1Y2Nlc3MgPSB0cnVlOwogIGNoYXIgKnJlc3RyaWN0IG5ld3ZhciA9ICJBbm90aGVyIHN0cmluZyI7CgogIC8vIENoZWNrIHZhcmFyZ3MuCiAgdGVzdF92YXJhcmdzICgicywgZCcgZiAuIiwgInN0cmluZyIsIDY1LCAzNC4yMzQpOwogIHRlc3RfdmFyYXJnc19tYWNyb3MgKCk7CgogIC8vIENoZWNrIGZsZXhpYmxlIGFycmF5IG1lbWJlcnMuCiAgc3RydWN0IGluY29tcGxldGVfYXJyYXkgKmlhID0KICAgIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaW5jb21wbGV0ZV9hcnJheSkgKyAoc2l6ZW9mIChkb3VibGUpICogMTApKTsKICBpYS0+ZGF0YXNpemUgPSAxMDsKICBmb3IgKGludCBpID0gMDsgaSA8IGlhLT5kYXRhc2l6ZTsgKytpKQogICAgaWEtPmRhdGFbaV0gPSBpICogMS4yMzQ7CgogIC8vIENoZWNrIG5hbWVkIGluaXRpYWxpemVycy4KICBzdHJ1Y3QgbmFtZWRfaW5pdCBuaSA9IHsKICAgIC5udW1iZXIgPSAzNCwKICAgIC5uYW1lID0gTCJUZXN0IHdpZGUgc3RyaW5nIiwKICAgIC5hdmVyYWdlID0gNTQzLjM0MzQzLAogIH07CgogIG5pLm51bWJlciA9IDU4OwoKICBpbnQgZHluYW1pY19hcnJheVtuaS5udW1iZXJdOwogIGR5bmFtaWNfYXJyYXlbbmkubnVtYmVyIC0gMV0gPSA1NDM7CgogIC8vIHdvcmsgYXJvdW5kIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncwogIHJldHVybiAoIXN1Y2Nlc3MgfHwgYmlnbnVtID09IDBMTCB8fCB1YmlnbnVtID09IDB1TEwgfHwgbmV3dmFyWzBdID09ICd4JwoJICB8fCBkeW5hbWljX2FycmF5W25pLm51bWJlciAtIDFdICE9IDU0Myk7Cl1dLApkbmwgVHJ5CmRubCBHQ0MJCS1zdGQ9Z251OTkgKHVudXNlZCByZXN0cmljdGl2ZSBtb2RlczogLXN0ZD1jOTkgLXN0ZD1pc285ODk5OjE5OTkpCmRubCBBSVgJCS1xbGFuZ2x2bD1leHRjOTkgKHVudXNlZCByZXN0cmljdGl2ZSBtb2RlOiAtcWxhbmdsdmw9c3RkYzk5KQpkbmwgSFAgY2MJLUFDOTkKZG5sIEludGVsIElDQwktc3RkPWM5OSwgLWM5OSAoZGVwcmVjYXRlZCkKZG5sIElSSVgJLWM5OQpkbmwgU29sYXJpcwkteGM5OT1hbGwgKEZvcnRlIERldmVsb3BlciA3IEMgbWlzaGFuZGxlcyAteGM5OSBvbiBTb2xhcmlzIDksCmRubAkJYXMgaXQgaW5jb3JyZWN0bHkgYXNzdW1lcyBDOTkgc2VtYW50aWNzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucykKZG5sIFRydTY0CS1jOTkKZG5sIHdpdGggZXh0ZW5kZWQgbW9kZXMgYmVpbmcgdHJpZWQgZmlyc3QuCltbLXN0ZD1nbnU5OSAtc3RkPWM5OSAtYzk5IC1BQzk5IC14Yzk5PWFsbCAtcWxhbmdsdmw9ZXh0Yzk5XV0sIFskMV0sIFskMl0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiw0MApfQUNfT1VUUFVUX0ZJTEVfQURKVVNUX0RJUnMmQCQxQCYkYWNfJDEmO3QgdFtdQUNfU1VCU1RfVFJBQ0UoWyQxXSkKVDEwLDI3Cm00X2pvaW5hbGxbJDJdXyQwKFskMV0sIG00X3NoaWZ0KCRAKSkKVDExLDIKX0FTX0VTQ0FQRV8kMQpUMTMsNzEKQUNfVFlQRV9PRkZfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19UWVBFKG9mZl90LCAgbG9uZyBpbnQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiwxNjcKQUNfTEFOR19TQVZFX200X2RlZnVuX3BybyhbJDBdKW00X3B1c2hkZWYoW19BQ19MQU5HXSwgX0FDX0xBTkcpZG5sCkFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xBTkdfU0FWRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDUwNjgKQUNfRlVOQ19NS1RJTUVfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfSEVBREVSX1RJTUVdKWRubApBQ19DSEVDS19IRUFERVJTX09OQ0Uoc3lzL3RpbWUuaCB1bmlzdGQuaCkKQUNfQ0hFQ0tfRlVOQ1NfT05DRShhbGFybSkKQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIG1rdGltZV0sIGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUsCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRSgKW1svKiBUZXN0IHByb2dyYW0gZnJvbSBQYXVsIEVnZ2VydCBhbmQgVG9ueSBMZW5laXMuICAqLwojaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWZkZWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpZmRlZiBIQVZFX1VOSVNURF9ICiMgaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2lmbmRlZiBIQVZFX0FMQVJNCiMgZGVmaW5lIGFsYXJtKFgpIC8qIGVtcHR5ICovCiNlbmRpZgoKLyogV29yayBhcm91bmQgcmVkZWZpbml0aW9uIHRvIHJwbF9wdXRlbnYgYnkgb3RoZXIgY29uZmlnIHRlc3RzLiAgKi8KI3VuZGVmIHB1dGVudgoKc3RhdGljIHRpbWVfdCB0aW1lX3RfbWF4OwpzdGF0aWMgdGltZV90IHRpbWVfdF9taW47CgovKiBWYWx1ZXMgd2UnbGwgdXNlIHRvIHNldCB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUuICAqLwpzdGF0aWMgY29uc3QgY2hhciAqdHpfc3RyaW5nc1tdID0gewogIChjb25zdCBjaGFyICopIDAsICJUWj1HTVQwIiwgIlRaPUpTVC05IiwKICAiVFo9RVNUKzNFRFQrMixNMTAuMS4wLzAwOjAwOjAwLE0yLjMuMC8wMDowMDowMCIKfTsKI2RlZmluZSBOX1NUUklOR1MgKHNpemVvZiAodHpfc3RyaW5ncykgLyBzaXplb2YgKHR6X3N0cmluZ3NbMF0pKQoKLyogUmV0dXJuIDAgaWYgbWt0aW1lIGZhaWxzIHRvIGNvbnZlcnQgYSBkYXRlIGluIHRoZSBzcHJpbmctZm9yd2FyZCBnYXAuCiAgIEJhc2VkIG9uIGEgcHJvYmxlbSByZXBvcnQgZnJvbSBBbmRyZWFzIEphZWdlci4gICovCnN0YXRpYyBpbnQKc3ByaW5nX2ZvcndhcmRfZ2FwICgpCnsKICAvKiBnbGliYyAodXAgdG8gYWJvdXQgMTk5OC0xMC0wNykgZmFpbGVkIHRoaXMgdGVzdC4gKi8KICBzdHJ1Y3QgdG0gdG07CgogIC8qIFVzZSB0aGUgcG9ydGFibGUgUE9TSVguMSBzcGVjaWZpY2F0aW9uICJUWj1QU1Q4UERULE00LjEuMCxNMTAuNS4wIgogICAgIGluc3RlYWQgb2YgIlRaPUFtZXJpY2EvVmFuY291dmVyIiBpbiBvcmRlciB0byBkZXRlY3QgdGhlIGJ1ZyBldmVuCiAgICAgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIE9sc29uIGV4dGVuc2lvbiwgb3IgZG9uJ3QgaGF2ZSB0aGUKICAgICBmdWxsIHpvbmVpbmZvIHRhYmxlcyBpbnN0YWxsZWQuICAqLwogIHB1dGVudiAoKGNoYXIqKSAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIpOwoKICB0bS50bV95ZWFyID0gOTg7CiAgdG0udG1fbW9uID0gMzsKICB0bS50bV9tZGF5ID0gNTsKICB0bS50bV9ob3VyID0gMjsKICB0bS50bV9taW4gPSAwOwogIHRtLnRtX3NlYyA9IDA7CiAgdG0udG1faXNkc3QgPSAtMTsKICByZXR1cm4gbWt0aW1lICgmdG0pICE9ICh0aW1lX3QpIC0xOwp9CgpzdGF0aWMgaW50Cm1rdGltZV90ZXN0MSAodGltZV90IG5vdykKewogIHN0cnVjdCB0bSAqbHQ7CiAgcmV0dXJuICEgKGx0ID0gbG9jYWx0aW1lICgmbm93KSkgfHwgbWt0aW1lIChsdCkgPT0gbm93Owp9CgpzdGF0aWMgaW50Cm1rdGltZV90ZXN0ICh0aW1lX3Qgbm93KQp7CiAgcmV0dXJuIChta3RpbWVfdGVzdDEgKG5vdykKCSAgJiYgbWt0aW1lX3Rlc3QxICgodGltZV90KSAodGltZV90X21heCAtIG5vdykpCgkgICYmIG1rdGltZV90ZXN0MSAoKHRpbWVfdCkgKHRpbWVfdF9taW4gKyBub3cpKSk7Cn0KCnN0YXRpYyBpbnQKaXJpeF82XzRfYnVnICgpCnsKICAvKiBCYXNlZCBvbiBjb2RlIGZyb20gQXJpZWwgRmFpZ29uLiAgKi8KICBzdHJ1Y3QgdG0gdG07CiAgdG0udG1feWVhciA9IDk2OwogIHRtLnRtX21vbiA9IDM7CiAgdG0udG1fbWRheSA9IDA7CiAgdG0udG1faG91ciA9IDA7CiAgdG0udG1fbWluID0gMDsKICB0bS50bV9zZWMgPSAwOwogIHRtLnRtX2lzZHN0ID0gLTE7CiAgbWt0aW1lICgmdG0pOwogIHJldHVybiB0bS50bV9tb24gPT0gMiAmJiB0bS50bV9tZGF5ID09IDMxOwp9CgpzdGF0aWMgaW50CmJpZ3RpbWVfdGVzdCAoaW50IGopCnsKICBzdHJ1Y3QgdG0gdG07CiAgdGltZV90IG5vdzsKICB0bS50bV95ZWFyID0gdG0udG1fbW9uID0gdG0udG1fbWRheSA9IHRtLnRtX2hvdXIgPSB0bS50bV9taW4gPSB0bS50bV9zZWMgPSBqOwogIG5vdyA9IG1rdGltZSAoJnRtKTsKICBpZiAobm93ICE9ICh0aW1lX3QpIC0xKQogICAgewogICAgICBzdHJ1Y3QgdG0gKmx0ID0gbG9jYWx0aW1lICgmbm93KTsKICAgICAgaWYgKCEgKGx0CgkgICAgICYmIGx0LT50bV95ZWFyID09IHRtLnRtX3llYXIKCSAgICAgJiYgbHQtPnRtX21vbiA9PSB0bS50bV9tb24KCSAgICAgJiYgbHQtPnRtX21kYXkgPT0gdG0udG1fbWRheQoJICAgICAmJiBsdC0+dG1faG91ciA9PSB0bS50bV9ob3VyCgkgICAgICYmIGx0LT50bV9taW4gPT0gdG0udG1fbWluCgkgICAgICYmIGx0LT50bV9zZWMgPT0gdG0udG1fc2VjCgkgICAgICYmIGx0LT50bV95ZGF5ID09IHRtLnRtX3lkYXkKCSAgICAgJiYgbHQtPnRtX3dkYXkgPT0gdG0udG1fd2RheQoJICAgICAmJiAoKGx0LT50bV9pc2RzdCA8IDAgPyAtMSA6IDAgPCBsdC0+dG1faXNkc3QpCgkJICA9PSAodG0udG1faXNkc3QgPCAwID8gLTEgOiAwIDwgdG0udG1faXNkc3QpKSkpCglyZXR1cm4gMDsKICAgIH0KICByZXR1cm4gMTsKfQoKc3RhdGljIGludAp5ZWFyXzIwNTBfdGVzdCAoKQp7CiAgLyogVGhlIGNvcnJlY3QgYW5zd2VyIGZvciAyMDUwLTAyLTAxIDAwOjAwOjAwIGluIFBhY2lmaWMgdGltZSwKICAgICBpZ25vcmluZyBsZWFwIHNlY29uZHMuICAqLwogIHVuc2lnbmVkIGxvbmcgaW50IGFuc3dlciA9IDI1MjczMTUyMDBVTDsKCiAgc3RydWN0IHRtIHRtOwogIHRpbWVfdCB0OwogIHRtLnRtX3llYXIgPSAyMDUwIC0gMTkwMDsKICB0bS50bV9tb24gPSAyIC0gMTsKICB0bS50bV9tZGF5ID0gMTsKICB0bS50bV9ob3VyID0gdG0udG1fbWluID0gdG0udG1fc2VjID0gMDsKICB0bS50bV9pc2RzdCA9IC0xOwoKICAvKiBVc2UgdGhlIHBvcnRhYmxlIFBPU0lYLjEgc3BlY2lmaWNhdGlvbiAiVFo9UFNUOFBEVCxNNC4xLjAsTTEwLjUuMCIKICAgICBpbnN0ZWFkIG9mICJUWj1BbWVyaWNhL1ZhbmNvdXZlciIgaW4gb3JkZXIgdG8gZGV0ZWN0IHRoZSBidWcgZXZlbgogICAgIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBPbHNvbiBleHRlbnNpb24sIG9yIGRvbid0IGhhdmUgdGhlCiAgICAgZnVsbCB6b25laW5mbyB0YWJsZXMgaW5zdGFsbGVkLiAgKi8KICBwdXRlbnYgKChjaGFyKikgIlRaPVBTVDhQRFQsTTQuMS4wLE0xMC41LjAiKTsKCiAgdCA9IG1rdGltZSAoJnRtKTsKCiAgLyogQ2hlY2sgdGhhdCB0aGUgcmVzdWx0IGlzIGVpdGhlciBhIGZhaWx1cmUsIG9yIGNsb3NlIGVub3VnaAogICAgIHRvIHRoZSBjb3JyZWN0IGFuc3dlciB0aGF0IHdlIGNhbiBhc3N1bWUgdGhlIGRpc2NyZXBhbmN5IGlzCiAgICAgZHVlIHRvIGxlYXAgc2Vjb25kcy4gICovCiAgcmV0dXJuICh0ID09ICh0aW1lX3QpIC0xCgkgIHx8ICgwIDwgdCAmJiBhbnN3ZXIgLSAxMjAgPD0gdCAmJiB0IDw9IGFuc3dlciArIDEyMCkpOwp9CgppbnQKbWFpbiAoKQp7CiAgdGltZV90IHQsIGRlbHRhOwogIGludCBpLCBqOwoKICAvKiBUaGlzIHRlc3QgbWFrZXMgc29tZSBidWdneSBta3RpbWUgaW1wbGVtZW50YXRpb25zIGxvb3AuCiAgICAgR2l2ZSB1cCBhZnRlciA2MCBzZWNvbmRzOyBhIG1rdGltZSBzbG93ZXIgdGhhbiB0aGF0CiAgICAgaXNuJ3Qgd29ydGggdXNpbmcgYW55d2F5LiAgKi8KICBhbGFybSAoNjApOwoKICBmb3IgKDs7KQogICAgewogICAgICB0ID0gKHRpbWVfdF9tYXggPDwgMSkgKyAxOwogICAgICBpZiAodCA8PSB0aW1lX3RfbWF4KQoJYnJlYWs7CiAgICAgIHRpbWVfdF9tYXggPSB0OwogICAgfQogIHRpbWVfdF9taW4gPSAtICgodGltZV90KSB+ICh0aW1lX3QpIDAgPT0gKHRpbWVfdCkgLTEpIC0gdGltZV90X21heDsKCiAgZGVsdGEgPSB0aW1lX3RfbWF4IC8gOTk3OyAvKiBhIHN1aXRhYmxlIHByaW1lIG51bWJlciAqLwogIGZvciAoaSA9IDA7IGkgPCBOX1NUUklOR1M7IGkrKykKICAgIHsKICAgICAgaWYgKHR6X3N0cmluZ3NbaV0pCglwdXRlbnYgKChjaGFyKikgdHpfc3RyaW5nc1tpXSk7CgogICAgICBmb3IgKHQgPSAwOyB0IDw9IHRpbWVfdF9tYXggLSBkZWx0YTsgdCArPSBkZWx0YSkKCWlmICghIG1rdGltZV90ZXN0ICh0KSkKCSAgcmV0dXJuIDE7CiAgICAgIGlmICghIChta3RpbWVfdGVzdCAoKHRpbWVfdCkgMSkKCSAgICAgJiYgbWt0aW1lX3Rlc3QgKCh0aW1lX3QpICg2MCAqIDYwKSkKCSAgICAgJiYgbWt0aW1lX3Rlc3QgKCh0aW1lX3QpICg2MCAqIDYwICogMjQpKSkpCglyZXR1cm4gMTsKCiAgICAgIGZvciAoaiA9IDE7IDsgaiA8PD0gMSkKCWlmICghIGJpZ3RpbWVfdGVzdCAoaikpCgkgIHJldHVybiAxOwoJZWxzZSBpZiAoSU5UX01BWCAvIDIgPCBqKQoJICBicmVhazsKICAgICAgaWYgKCEgYmlndGltZV90ZXN0IChJTlRfTUFYKSkKCXJldHVybiAxOwogICAgfQogIHJldHVybiAhIChpcml4XzZfNF9idWcgKCkgJiYgc3ByaW5nX2ZvcndhcmRfZ2FwICgpICYmIHllYXJfMjA1MF90ZXN0ICgpKTsKfV1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWU9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY193b3JraW5nX21rdGltZT1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWU9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfd29ya2luZ19ta3RpbWUgPSBubzsgdGhlbgogIEFDX0xJQk9CSihbbWt0aW1lXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDIyCm00X3NoaWZ0Mm00X3NoaWZ0KG00X3NoaWZ0KCRAKSkKVDIzLDEwMQptNF9sb2NhdGlvbihBQ19DX0NPTlNUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxNjUzClQxOCw4MAptNF9leHBhbnNpb25fc3RhY2ttNF9zdGFja19mb3JlYWNoX3NlcF9saWZvKFtfJDBdLCBbXyQwX2VudHJ5KF0sIFspCl0pbTRfbG9jYXRpb25bOiB0aGUgdG9wIGxldmVsXQpUMTIsMTAyCl9BQ19ET19MSU1JVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfUlVOX0xPR19MSU1JVChbZXZhbCAiJDEiXSwKCQkgICBbX0FDX0RPX0VDSE8oWyQxXSldLCBbJDJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOSwyCl9BQ19DQyhDKUNDClQxOSwyMTIKQUNfTEFORyhGb3J0cmFuIDc3KWFjX2V4dD1mCmFjX2NvbXBpbGU9JyRGNzcgLWMgJEZGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2xpbms9JyRGNzcgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19jb21waWxlcl9nbnU9JGFjX2N2X2Y3N19jb21waWxlcl9nbnUKClQ5LDMyCm00X3NoaWZ0M200X3NoaWZ0KG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfTVNHX05PVElDRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjI0OQpUMjYsMTA5Cm00X2xvY2F0aW9uKEFDX0ZVTkNfTFNUQVQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTUzMApUMTcsNDExCl9BQ19SVU5fTE9HX0xJTUlUX200X2RlZnVuX3BybyhbJDBdKXsgeyAkMjsgfSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgKCQxKSAyPmNvbmZ0ZXN0LmVycgogIGFjX3N0YXR1cz0kPwogIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCiAgICBzZWQgJ200X2RlZmF1bHQoWyQzXSwgWzEwXSlhXAouLi4gcmVzdCBvZiBzdGRlcnIgb3V0cHV0IGRlbGV0ZWQgLi4uCiAgICAgICAgIG00X2RlZmF1bHQoWyQzXSwgWzEwXSlxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQogICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgZmkKICBybSAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCiAgX0FTX0VDSE9fTE9HKFtcJD8gPSAkYWNfc3RhdHVzXSkKICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9W11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxNTIKbTRfdmVyc2lvbl9wcmVyZXFtNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUoWzIuNjhdLCBbJDFdKSwKCVstMV0sCglbbTRfZGVmYXVsdChbJDNdLAoJCSAgICBbbTRfZmF0YWwoW0F1dG9jb25mIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKCQkJICAgICAgWzYzXSldKV0sCglbJDJdKQpUMjUsMTAyCm00X2xvY2F0aW9uKEFDX0xBTkdfUFVTSCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6OTgKVDI1LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX01NQVApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTIwNQpUMTAsNDMKX0FDX0RFRklORUFTX0VDSE8oWyJBU19FU0NBUEUoW1skMV1dKSJdKSA+PmNvbmZkZWZzLmgKVDI0LDEwNgptNF9sb2NhdGlvbihBQ19URVNUX0NQUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQ1ClQxNiw1MApfbTRfbGlzdF9jbXBfcmF3bTRfaWYoWyQxXSwgWyQyXSwgWzBdLCBbX200X2xpc3RfY21wXzEoWyQxXSwgJDIpXSkKVDgsMApfX3VuaXhfXwpUMjAsMTAzCm00X2xvY2F0aW9uKEFTX0xOX1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTIxOApUMzAsMTA3Cm00X2xvY2F0aW9uKEFDX0NPTVBJTEVfSUZFTFNFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjA3ClQxNCwxMDkKbTRfZmlsZV9hcHBlbmRtNF9zeXNjbWQoW2NhdCA+PiQxIDw8X200ZW9mCiQyCl9tNGVvZgpdKQptNF9pZihtNF9zeXN2YWwsIFswXSwgW10sCiAgICAgIFttNF9mYXRhbChbJDA6IGNhbm5vdCB3cml0ZTogJDFdKV0pClQxNCwxNTIKQUNfTEFOR19FUkxBTkdfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19FUkxBTkcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkcoRXJsYW5nKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTQwCl9BU19WQVJfUFVTSERFRl9BU19MSVRFUkFMX0lGKFskMl0sIFsJIF1bCl0pKFtdLCBbYXNfJDE9X0FTX1RSX1NIX0lORElSKFskMl0pCm00X3B1c2hkZWYoWyQxXSwgWyRhc19bJDFdXSldLApbbTRfcHVzaGRlZihbJDFdLCBbX0FTX1RSX1NIX0xJVEVSQUwoWyQyXSldKV0pClQxMSw4OQpBSF9URU1QTEFURUFIX1ZFUkJBVElNKFskMV0sCgkgICAgIG00X3RleHRfd3JhcChbJDIgKi9dLCBbICAgXSwgWy8qIF0pWwpAJTpAdW5kZWYgXV9tNF9leHBhbmQoWyQxXSkpClQxMSwxNDcKQUNfRjc3X01BSU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfRjc3X0xJQlJBUllfTERGTEFHU10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuIDc3KWRubApfQUNfRkNfTUFJTgpBQ19MQU5HX1BPUChGb3J0cmFuIDc3KWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDQ5Cm00X3JlbmFtZV9mb3JjZW00X2lmZGVmKFskMl0sIFtfbTRfdW5kZWZpbmUoWyQyXSldKW00X3JlbmFtZSgkQCkKVDI4LDEwMwptNF9sb2NhdGlvbihBU19FWEVDVVRBQkxFX1ApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTA2MwpUMTMsMTEwCl9BQ19FTkFCTEVfSUZAJTpAIENoZWNrIHdoZXRoZXIgLS0kMS0kMiB3YXMgZ2l2ZW4uCl9BQ19FTkFCTEVfSUZfQUNUSU9OKFskMV0sIG00X3RyYW5zbGl0KFskMl0sIFstKy5dLCBbX19fXSksIFskM10sIFskNF0pCgpUOCwxOTEKQUNfU1VCU1RBU19JREVOVElGSUVSX0lGKFskMV0sIFtdLAogIFttNF9mYXRhbChbJDA6IGAkMScgaXMgbm90IGEgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZV0pXSlBQ19TVUJTVF9UUkFDRShbJDFdKW00X3BhdHRlcm5fYWxsb3coW14kMSRdKW00X2lmdmFsbihbJDJdLCBbJDE9JDJdKVtdbTRfc2V0X2FkZChbX0FDX1NVQlNUX1ZBUlNdLCBbJDFdKQpUMjMsMTA3Cm00X2xvY2F0aW9uKEFDX1ZFUkJPU0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIyODIKVDE4LDQ1NwpfQUNfQ09NUElMRV9JRkVMU0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRV9TSEVMTF9GTihbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfdHJ5X2NvbXBpbGVdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfdHJ5X2NvbXBpbGVdLCBbTElORU5PXSwKICAgIFtUcnkgdG8gY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuXSldLAogIFskMF9CT0RZXSltNF9pZnZhbG4oWyQxXSwgW0FDX0xBTkdfQ09ORlRFU1QoWyQxXSldKUFTX0lGKFthY19mbl9bXV9BQ19MQU5HX0FCQlJFVltdX3RyeV9jb21waWxlICIkTElORU5PIl0sIFskMl0sIFskM10pCnJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHRbXW00X2lmdmFsKFskMV0sIFsgY29uZnRlc3QuJGFjX2V4dF0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSw2MTIKQUNfRlVOQ19PQlNUQUNLX200X2RlZnVuX3BybyhbJDBdKUFDX0xJQlNPVVJDRVMoW29ic3RhY2suaCwgb2JzdGFjay5jXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBvYnN0YWNrc10sIGFjX2N2X2Z1bmNfb2JzdGFjaywKW0FDX0xJTktfSUZFTFNFKAogICAgW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVAoJCSAgICAgIFtAJTpAaW5jbHVkZSAib2JzdGFjay5oIl1dLAoJCSAgICAgW1tzdHJ1Y3Qgb2JzdGFjayBtZW07CgkJICAgICAgIEAlOkBkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyBtYWxsb2MKCQkgICAgICAgQCU6QGRlZmluZSBvYnN0YWNrX2NodW5rX2ZyZWUgZnJlZQoJCSAgICAgICBvYnN0YWNrX2luaXQgKCZtZW0pOwoJCSAgICAgICBvYnN0YWNrX2ZyZWUgKCZtZW0sIDApO11dKV0sCgkJW2FjX2N2X2Z1bmNfb2JzdGFjaz15ZXNdLAoJCVthY19jdl9mdW5jX29ic3RhY2s9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfb2JzdGFjayA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX09CU1RBQ0ssIDEsIFtEZWZpbmUgdG8gMSBpZiBsaWJjIGluY2x1ZGVzIG9ic3RhY2tzLl0pCmVsc2UKICBBQ19MSUJPQkoob2JzdGFjaykKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwxMDUKbTRfbG9jYXRpb24oQUNfQ09ORklHX0hFQURFUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3N0YXR1cy5tNDo3MjEKVDE1LDk3Cl9BQ19DSEVDS19GSUxFU1skMV0sIFtBQ19ERUZJTkVfVU5RVU9URUQoQVNfVFJfQ1BQKFtIQVZFXyQxXSksIFsxXSwKICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGZpbGUgYCQxJy5dKV0KVDcsMTc0CkFDX1dJVEhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfV0lUSCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQVJHX1dJVEgoWyQxXSwgWyAgLS13aXRoLSQxXSwgWyQyXSwgWyQzXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDcsMTc2CkFDX1dBUk5fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfV0FSTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19NU0dfV0FSTl0sIFtBQ19NU0dfV0FSTigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsNjM3CkFDX0VSTEFOR19TVUJTVF9ST09UX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19FUkxBTkdfTkVFRF9FUkxDXSlbXWRubApBQ19SRVFVSVJFKFtBQ19FUkxBTkdfTkVFRF9FUkxdKVtdZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgRXJsYW5nL09UUCByb290IGRpcmVjdG9yeV0sCiAgICBbYWNfY3ZfZXJsYW5nX3Jvb3RfZGlyXSwKICAgIFtBQ19MQU5HX1BVU0goRXJsYW5nKVtdZG5sCiAgICAgQUNfUlVOX0lGRUxTRSgKCVtBQ19MQU5HX1BST0dSQU0oW10sIFtkbmwKCSAgICBSb290RGlyID0gY29kZTpyb290X2RpcigpLAoJICAgIGZpbGU6d3JpdGVfZmlsZSgiY29uZnRlc3Qub3V0IiwgUm9vdERpciksCgkgICAgUmV0dXJuVmFsdWUgPSAwLAoJICAgIGhhbHQoUmV0dXJuVmFsdWUpXSldLAoJW2FjX2N2X2VybGFuZ19yb290X2Rpcj1gY2F0IGNvbmZ0ZXN0Lm91dGAKCSBybSAtZiBjb25mdGVzdC5vdXRdLAoJW3JtIC1mIGNvbmZ0ZXN0Lm91dAoJIEFDX01TR19GQUlMVVJFKFt0ZXN0IEVybGFuZyBwcm9ncmFtIGV4ZWN1dGlvbiBmYWlsZWRdKV0pCiAgICAgQUNfTEFOR19QT1AoRXJsYW5nKVtdZG5sCiAgICBdKQpBQ19TVUJTVChbRVJMQU5HX1JPT1RfRElSXSwgWyRhY19jdl9lcmxhbmdfcm9vdF9kaXJdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX0xPTkdfRE9VQkxFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6Mzg4ClQyOCwxMDEKbTRfbG9jYXRpb24oQUNfQ19QUk9UT1RZUEVTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxODE5ClQ5LDIyMgptNF9ibWF0Y2htNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCiAgICAgICBbJCNdLCAxLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCM6ICQxXSldLAogICAgICAgWyQjXSwgMiwgWyQyXSwKICAgICAgIFttNF9pZihtNF9icmVnZXhwKFskMV0sIFskMl0pLCAtMSwgWyQwKFskMV0sIG00X3NoaWZ0MygkQCkpXSwKCSAgICAgIFskM10pXSkKVDEwLDI2CkFTX01LRElSX1Bhc19kaXI9JDE7IGFzX2ZuX21rZGlyX3BbXQpUMTAsMTI0CkFTX01LRElSX1BfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbXyQwX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCw5MzUKQUNfRlVOQ19VVElNRV9OVUxMX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX0hFQURFUlNfT05DRSh1dGltZS5oKQpBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIHV0aW1lIGFjY2VwdHMgYSBudWxsIGFyZ3VtZW50LCBhY19jdl9mdW5jX3V0aW1lX251bGwsCltybSAtZiBjb25mdGVzdC5kYXRhOyA+Y29uZnRlc3QuZGF0YQojIFNlcXVlbnQgaW50ZXJwcmV0cyB1dGltZShmaWxlLCAwKSB0byBtZWFuIHVzZSBzdGFydCBvZiBlcG9jaC4gIFdyb25nLgpBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFQKCSAgICAgICAjaWZkZWYgSEFWRV9VVElNRV9ICgkgICAgICAgIyBpbmNsdWRlIDx1dGltZS5oPgoJICAgICAgICNlbmRpZl0sCltbc3RydWN0IHN0YXQgcywgdDsKICByZXR1cm4gISAoc3RhdCAoImNvbmZ0ZXN0LmRhdGEiLCAmcykgPT0gMAoJICAgICYmIHV0aW1lICgiY29uZnRlc3QuZGF0YSIsIDApID09IDAKCSAgICAmJiBzdGF0ICgiY29uZnRlc3QuZGF0YSIsICZ0KSA9PSAwCgkgICAgJiYgdC5zdF9tdGltZSA+PSBzLnN0X210aW1lCgkgICAgJiYgdC5zdF9tdGltZSAtIHMuc3RfbXRpbWUgPCAxMjApO11dKV0sCgkgICAgICBhY19jdl9mdW5jX3V0aW1lX251bGw9eWVzLAoJICAgICAgYWNfY3ZfZnVuY191dGltZV9udWxsPW5vLAoJICAgICAgYWNfY3ZfZnVuY191dGltZV9udWxsPSdndWVzc2luZyB5ZXMnKV0pCmlmIHRlc3QgIngkYWNfY3ZfZnVuY191dGltZV9udWxsIiAhPSB4bm87IHRoZW4KICBhY19jdl9mdW5jX3V0aW1lX251bGw9eWVzCiAgQUNfREVGSU5FKEhBVkVfVVRJTUVfTlVMTCwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgYHV0aW1lKGZpbGUsIE5VTEwpJyBzZXRzIGZpbGUncyB0aW1lc3RhbXAgdG8gdGhlCgkgICAgIHByZXNlbnQuXSkKZmkKcm0gLWYgY29uZnRlc3QuZGF0YQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDEwNwptNF9sb2NhdGlvbihfQUNfRkNfV1JBUFBFUlMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjEwMDMKVDE5LDEwNwptNF9sb2NhdGlvbihBQ19SU0gpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo4NTkKVDI5LDEwNAptNF9sb2NhdGlvbihBQ19DSEVDS19BTElHTk9GKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NzkyClQxMywzMzMKbTRfZGl2ZXJ0X3BvcG00X2lmKFskMV0sIFtdLCBbXSwKICAgICAgIFskMV0sIF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pLCBbXSwKICAgICAgIFttNF9mYXRhbChbJDAoJDEpOiBkaXZlcnNpb24gbWlzbWF0Y2g6Cl1tNF9kaXZlcnRfc3RhY2spXSlfbTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X3N0YWNrXSwgW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSltNF9pZmRlZihbX200X2RpdmVydF9kaXZlcnNpb25dLCBbXSwKCSAgIFttNF9mYXRhbChbdG9vIG1hbnkgbTRfZGl2ZXJ0X3BvcF0pXSlfbTRfZGl2ZXJ0X3JhdyhfbTRfZGl2ZXJ0KF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pLCBbLV0pKQpUMTYsMTY5Cl9BU19FWFBSX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0paWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KICBhc19leHByPWV4cHIKZWxzZQogIGFzX2V4cHI9ZmFsc2UKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSwxNzIKX0FDX1JVTl9MT0dfbTRfZGVmdW5fcHJvKFskMF0peyB7ICQyOyB9ID4mQVNfTUVTU0FHRV9MT0dfRkQKICAoJDEpIDI+JkFTX01FU1NBR0VfTE9HX0ZECiAgYWNfc3RhdHVzPSQ/CiAgX0FTX0VDSE9fTE9HKFtcJD8gPSAkYWNfc3RhdHVzXSkKICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9W11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiw0NDcKQUNfUFJPR19ZQUNDX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1BST0dTKFlBQ0MsICdiaXNvbiAteScgYnlhY2MsIHlhY2MpZG5sCkFDX0FSR19WQVIoWUFDQywKW1RoZSBgWWV0IEFub3RoZXIgQ29tcGlsZXIgQ29tcGlsZXInIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIERlZmF1bHRzIHRvCnRoZSBmaXJzdCBwcm9ncmFtIGZvdW5kIG91dCBvZjogYGJpc29uIC15JywgYGJ5YWNjJywgYHlhY2MnLl0pZG5sCkFDX0FSR19WQVIoWUZMQUdTLApbVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBwYXNzZWQgYnkgZGVmYXVsdCB0byAkWUFDQy4gIFRoaXMgc2NyaXB0CndpbGwgZGVmYXVsdCBZRkxBR1MgdG8gdGhlIGVtcHR5IHN0cmluZyB0byBhdm9pZCBhIGRlZmF1bHQgdmFsdWUgb2YgYC1kJyBnaXZlbgpieSBzb21lIG1ha2UgYXBwbGljYXRpb25zLl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwxMDYKbTRfbG9jYXRpb24oQUNfUkVRVUlSRV9TSEVMTF9GTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTgzClQ5LDE5MApBQ19QUkVGSVhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUFJFRklYJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1BSRUZJWF9QUk9HUkFNXSwgW0FDX1BSRUZJWF9QUk9HUkFNKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywzNTYKQUNfRlVOQ19HRVRNTlRFTlRfbTRfZGVmdW5fcHJvKFskMF0pIyBnZXRtbnRlbnQgaXMgaW4gdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBvbiBVTklDT1MsIGluIC1sc3VuIG9uIElyaXggNCwKIyAtbHNlcSBvbiBEeW5peC9QVFgsIC1sZ2VuIG9uIFVuaXh3YXJlLgpBQ19TRUFSQ0hfTElCUyhnZXRtbnRlbnQsIFtzdW4gc2VxIGdlbl0sCgkgICAgICAgW2FjX2N2X2Z1bmNfZ2V0bW50ZW50PXllcwoJCUFDX0RFRklORShbSEFWRV9HRVRNTlRFTlRdLCAxLAoJCQkgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG1udGVudCcgZnVuY3Rpb24uXSldLAoJICAgICAgIFthY19jdl9mdW5jX2dldG1udGVudD1ub10pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjEsMTA2Cm00X2xvY2F0aW9uKEFDX0ZEX0NDKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDozODUKVDE5LDk1Cl9BU19ERVRFQ1RfUkVRVUlSRURfbTRfZGVmdW5fcHJvKFskMF0pbTRfc2V0X2FkZChbX0FTX0RFVEVDVF9SRVFVSVJFRF9CT0RZXSwgWyQxIHx8IEFTX0VYSVRdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUNiw1MjkKQUNfVVNHX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1VTRycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTVNHX0NIRUNLSU5HKFtmb3IgQlNEIHN0cmluZyBhbmQgbWVtb3J5IGZ1bmN0aW9uc10pCkFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tAJTpAaW5jbHVkZSA8c3RyaW5ncy5oPl1dLAoJCQkJW1tyaW5kZXgoMCwgMCk7IGJ6ZXJvKDAsIDApO11dKV0sCgkgICAgICAgW0FDX01TR19SRVNVTFQoeWVzKV0sCgkgICAgICAgW0FDX01TR19SRVNVTFQobm8pCgkJQUNfREVGSU5FKFVTRywgMSwKCQkJICBbRGVmaW5lIHRvIDEgaWYgeW91IGRvIG5vdCBoYXZlIDxzdHJpbmdzLmg+LCBpbmRleCwKCQkJICAgYnplcm8sIGV0Yy4uLiBUaGlzIHN5bWJvbCBpcyBvYnNvbGV0ZSwgeW91IHNob3VsZAoJCQkgICBub3QgZGVwZW5kIHVwb24gaXQuXSldKQpBQ19DSEVDS19IRUFERVJTKHN0cmluZy5oKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTIxCm00X3JlX3dvcmRbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9dW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfMDEyMzQ1Njc4OV0qClQ0MiwxMDAKbTRfbG9jYXRpb24oX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjM0NQpUMTIsMTE1CkFDX0NPUFlSSUdIVEFTX0NPUFlSSUdIVChbJDFdKVtdbTRfZGl2ZXJ0X3RleHQobTRfZGVmYXVsdF9xdW90ZWQoWyQyXSwgW1ZFUlNJT05fVVNFUl0pLApbbTRfZGVmYXVsdChbJDNdLCBbbTRfbmV3bGluZV0pKFskMV0pXSkKVDIyLDEwMwptNF9sb2NhdGlvbihBQ19FWEVFWFQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjQ5MQpUOSw0MApBQ19PQkpFWFRfbTRfZGVmdW5fcHJvKFskMF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSwxNTcKQUNfRjc3X0ZVTkNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbX0FDX0Y3N19OQU1FX01BTkdMSU5HXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpZG5sCl9BQ19GQ19GVU5DKFskMV0sWyQyXSkKQUNfTEFOR19QT1AoRm9ydHJhbiA3NylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwxMDcKbTRfbG9jYXRpb24oQUNfUFJPR19HUkVQKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MzkwClQyNywxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19NRU1DTVApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6OTU0ClQzMSwwCm00X2luY2x1ZGUoYXV0b2NvbmYvaGVhZGVycy5tNCkKVDI3LDEwNwptNF9sb2NhdGlvbihBQ19DT01QVVRFX0lOVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MzA1NwpUOSw4NgpBSF9CT1RUT01tNF9kZWZpbmUoW19BSF9DT1VOVEVSXSwgbTRfaW5jcihfQUhfQ09VTlRFUikpZG5sCkFIX1ZFUkJBVElNKFt6enp6XV9BSF9DT1VOVEVSLCBbJDFdKQpUMjgsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfSU5UMTZfVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjYxNwpUMjUsMTA2Cm00X2xvY2F0aW9uKEFDX0ZJTkRfWFRSQSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjU4ClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfRklMRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6Mjc3OApUMzQsMjkyCl9BQ19IRUFERVJfVElPQ0dXSU5TWl9JTl9TWVNfSU9DVExBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBzeXMvaW9jdGwuaCBkZWZpbmVzIFRJT0NHV0lOU1pdLAoJCWFjX2N2X3N5c190aW9jZ3dpbnN6X2luX3N5c19pb2N0bF9oLApbQUNfRUdSRVBfQ1BQKFt5ZXNdLAoJICAgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaWZkZWYgVElPQ0dXSU5TWgogIHllcwojZW5kaWYKXSwKCQlhY19jdl9zeXNfdGlvY2d3aW5zel9pbl9zeXNfaW9jdGxfaD15ZXMsCgkJYWNfY3Zfc3lzX3Rpb2Nnd2luc3pfaW5fc3lzX2lvY3RsX2g9bm8pXSkKClQxNCw3MDgKQUNfUFJPR19DWFhDUFBfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKWRubApBQ19BUkdfVkFSKFtDWFhDUFBdLCAgIFtDKysgcHJlcHJvY2Vzc29yXSlkbmwKX0FDX0FSR19WQVJfQ1BQRkxBR1MoKWRubApBQ19MQU5HX1BVU0goQysrKWRubApBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3JdKQppZiB0ZXN0IC16ICIkQ1hYQ1BQIjsgdGhlbgogIEFDX0NBQ0hFX1ZBTChhY19jdl9wcm9nX0NYWENQUCwKICBbZG5sCiAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKICAgIGZvciBDWFhDUFAgaW4gIiRDWFggLUUiICIvbGliL2NwcCIKICAgIGRvCiAgICAgIF9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFKFticmVha10pCiAgICBkb25lCiAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCiAgXSlkbmwKICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCmVsc2UKICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCmZpCkFDX01TR19SRVNVTFQoWyRDWFhDUFBdKQpfQUNfUFJPR19QUkVQUk9DX1dPUktTX0lGRUxTRShbXSwKCSAgW0FDX01TR19GQUlMVVJFKFtDKysgcHJlcHJvY2Vzc29yICIkQ1hYQ1BQIiBmYWlscyBzYW5pdHkgY2hlY2tdKV0pCkFDX1NVQlNUKENYWENQUClkbmwKQUNfTEFOR19QT1AoQysrKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDIKQUNfTEFOR19TT1VSQ0UoQykkMQpUMzMsMTA2Cm00X2xvY2F0aW9uKF9BQ19DSEVDS19IRUFERVJfTkVXKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDoyMjAKVDI2LDEwMgptNF9sb2NhdGlvbihBU19TRVRfU1RBVFVTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjYxNgpUMjcsMTA3Cm00X2xvY2F0aW9uKEFDX0NIRUNLX0ZJTEVTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyODA5ClQxNCwzNwptNF9QQUNLQUdFX1VSTGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi8KVDExLDYyCm00X2NyX2FsbnVtYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkKVDE2LDQ3NzUKX0FDX0lOSVRfUFJFUEFSRW00X2RpdmVydF9wdXNoKFtJTklUX1BSRVBBUkVdKWRubAoKIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCiMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgojIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCiMgTWFrZSB0d28gcGFzc2VzIHRvIGFsbG93IGZvciBwcm9wZXIgZHVwbGljYXRlLWFyZ3VtZW50IHN1cHByZXNzaW9uLgphY19jb25maWd1cmVfYXJncz0KYWNfY29uZmlndXJlX2FyZ3MwPQphY19jb25maWd1cmVfYXJnczE9CmFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCmZvciBhY19wYXNzIGluIDEgMgpkbwogIGZvciBhY19hcmcKICBkbwogICAgY2FzZSAkYWNfYXJnIGluCiAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CiAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAogICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCiAgICAgIGNvbnRpbnVlIDs7CiAgICAqXCcqKQogICAgICBhY19hcmc9YEFTX0VDSE8oWyIkYWNfYXJnIl0pIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgICBlc2FjCiAgICBjYXNlICRhY19wYXNzIGluCiAgICAxKSBBU19WQVJfQVBQRU5EKFthY19jb25maWd1cmVfYXJnczBdLCBbIiAnJGFjX2FyZyciXSkgOzsKICAgIDIpCiAgICAgIEFTX1ZBUl9BUFBFTkQoW2FjX2NvbmZpZ3VyZV9hcmdzMV0sIFsiICckYWNfYXJnJyJdKQpkbmwgSWYgdHJ5aW5nIHRvIHJlbW92ZSBkdXBsaWNhdGVzLCBiZSBzdXJlIHRvIChpKSBrZWVwIHRoZSAqbGFzdCoKZG5sIHZhbHVlIChlLmcuIC0tcHJlZml4PTEgLS1wcmVmaXg9MiAtLXByZWZpeD0xIG1pZ2h0IGtlZXAgMiBvbmx5KSwKZG5sIGFuZCAoaWkpIG5vdCB0byBzdHJpcCBsb25nIG9wdGlvbnMgKC0tcHJlZml4IGZvbyAtLXByZWZpeCBiYXIgbWlnaHQKZG5sIGdpdmUgLS1wcmVmaXggZm9vIGJhcikuCiAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgoJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgogICAgICBlbHNlCgljYXNlICRhY19hcmcgaW4KZG5sIFVzZSBicm9hZCBwYXR0ZXJucywgYXMgYXJndW1lbnRzIHRoYXQgd291bGQgaGF2ZSBhbHJlYWR5IG1hZGUgY29uZmlndXJlCmRubCBleGl0IGRvbid0IG1hdHRlci4KCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCgkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAoJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7CgkgICAgZXNhYwoJICAgIDs7CgkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwoJZXNhYwogICAgICBmaQogICAgICBBU19WQVJfQVBQRU5EKFthY19jb25maWd1cmVfYXJnc10sIFsiICckYWNfYXJnJyJdKQogICAgICA7OwogICAgZXNhYwogIGRvbmUKZG9uZQpBU19VTlNFVChhY19jb25maWd1cmVfYXJnczApCkFTX1VOU0VUKGFjX2NvbmZpZ3VyZV9hcmdzMSkKCiMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCiMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgojIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCnRyYXAgJ2V4aXRfc3RhdHVzPSQ/CiAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCiAgewogICAgZWNobwoKICAgIEFTX0JPWChbQ2FjaGUgdmFyaWFibGVzLl0pCiAgICBlY2hvCiAgICBtNF9icGF0c3Vic3RzKG00X2RlZm4oW19BQ19DQUNIRV9EVU1QXSksCgkJICBbXiAqXCgjLipcKT8KXSwgICAgICAgICAgICAgICAgW10sCgkJICBbJ10sIFsnXFwnJ10pCiAgICBlY2hvCgogICAgQVNfQk9YKFtPdXRwdXQgdmFyaWFibGVzLl0pCiAgICBlY2hvCiAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCiAgICBkbwogICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKICAgICAgY2FzZSAkYWNfdmFsIGluCiAgICAgICpcJ1wnJyopIGFjX3ZhbD1gQVNfRUNITyhbIiRhY192YWwiXSkgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwogICAgICBlc2FjCiAgICAgIEFTX0VDSE8oWyIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyJdKQogICAgZG9uZSB8IHNvcnQKICAgIGVjaG8KCiAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCiAgICAgIEFTX0JPWChbRmlsZSBzdWJzdGl0dXRpb25zLl0pCiAgICAgIGVjaG8KICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKICAgICAgZG8KCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgoJY2FzZSAkYWNfdmFsIGluCgkqXCdcJycqKSBhY192YWw9YEFTX0VDSE8oWyIkYWNfdmFsIl0pIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKCWVzYWMKCUFTX0VDSE8oWyIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyJdKQogICAgICBkb25lIHwgc29ydAogICAgICBlY2hvCiAgICBmaQoKICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgogICAgICBBU19CT1goW2NvbmZkZWZzLmguXSkKICAgICAgZWNobwogICAgICBjYXQgY29uZmRlZnMuaAogICAgICBlY2hvCiAgICBmaQogICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgogICAgICBBU19FQ0hPKFsiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiXSkKICAgIEFTX0VDSE8oWyIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIl0pCiAgfSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCiAgICBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkWyRdKiAkYWNfY2xlYW5fZmlsZXMgJiYKICAgIGV4aXQgJGV4aXRfc3RhdHVzCicgMApmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyBBU19FWElUKFsxXSknICRhY19zaWduYWwKZG9uZQphY19zaWduYWw9MAoKIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4Kcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKCmRubCBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIE5leHRTdGVwIDMuMyAocGF0Y2ggMykgbG9zZXMgb24gYSBmaWxlCmRubCBjb250YWluaW5nIGxlc3MgdGhhbiAxNCBieXRlcyAoaW5jbHVkaW5nIHRoZSBuZXdsaW5lKS4KQVNfRUNITyhbIi8qIGNvbmZkZWZzLmggKi8iXSkgPiBjb25mZGVmcy5oCgojIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KQUNfREVGSU5FX1VOUVVPVEVEKFtQQUNLQUdFX05BTUVdLCBbIiRQQUNLQUdFX05BTUUiXSwKCQkgICBbRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLl0pZG5sCkFDX0RFRklORV9VTlFVT1RFRChbUEFDS0FHRV9UQVJOQU1FXSwgWyIkUEFDS0FHRV9UQVJOQU1FIl0sCgkJICAgW0RlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS5dKWRubApBQ19ERUZJTkVfVU5RVU9URUQoW1BBQ0tBR0VfVkVSU0lPTl0sIFsiJFBBQ0tBR0VfVkVSU0lPTiJdLAoJCSAgIFtEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLl0pZG5sCkFDX0RFRklORV9VTlFVT1RFRChbUEFDS0FHRV9TVFJJTkddLCBbIiRQQUNLQUdFX1NUUklORyJdLAoJCSAgIFtEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuXSlkbmwKQUNfREVGSU5FX1VOUVVPVEVEKFtQQUNLQUdFX0JVR1JFUE9SVF0sIFsiJFBBQ0tBR0VfQlVHUkVQT1JUIl0sCgkJICAgW0RlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlCgkJICAgIHNob3VsZCBiZSBzZW50Ll0pZG5sCkFDX0RFRklORV9VTlFVT1RFRChbUEFDS0FHRV9VUkxdLCBbIiRQQUNLQUdFX1VSTCJdLAoJCSAgIFtEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLl0pCgojIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KQUNfU0lURV9MT0FECkFDX0NBQ0hFX0xPQUQKbTRfZGl2ZXJ0X3BvcChbSU5JVF9QUkVQQVJFXSlkbmwKClQxMiw3MQpBU19DT1BZUklHSFRtNF9kaXZlcnRfdGV4dChbSEVBREVSLUNPUFlSSUdIVF0sClttNF9icGF0c3Vic3QoWwokMV0sIFteXSwgW0AlOkAgXSldKQpUMTAsMTQ5CkFDX0ZPUkVBQ0hfbTRfZGVmdW5fcHJvKFskMF0pbTRfZm9yZWFjaF93KCRAKWRubApBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GT1JFQUNIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTMzMQpBQ19GQ19GUkVFRk9STV9tNF9kZWZ1bl9vbmNlKFtBQ19GQ19GUkVFRk9STV0sIFtBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIEZvcnRyYW4gZmxhZyBuZWVkZWQgdG8gYWNjZXB0IGZyZWUtZm9ybSBzb3VyY2VdLAoJICAgICAgIFthY19jdl9mY19mcmVlZm9ybV0sClthY19jdl9mY19mcmVlZm9ybT11bmtub3duCmFjX2ZjX2ZyZWVmb3JtX0ZDRkxBR1Nfc2F2ZT0kRkNGTEFHUwpmb3IgYWNfZmxhZyBpbiBub25lIC1mZnJlZS1mb3JtIC1GUiAtZnJlZSAtcWZyZWUgLU1mcmVlIC1NZnJlZWZvcm0gXAoJICAgICAgIC1mcmVlZm9ybSAiLWYgZnJlZSIgK3NvdXJjZT1mcmVlIC1uZml4CmRvCiAgdGVzdCAieCRhY19mbGFnIiAhPSB4bm9uZSAmJiBGQ0ZMQUdTPSIkYWNfZmNfZnJlZWZvcm1fRkNGTEFHU19zYXZlICRhY19mbGFnIgpkbmwgVXNlIEAmdEAgYmVsb3cgdG8gZW5zdXJlIHRoYXQgZWRpdG9ycyBkb24ndCB0dXJuIDgrIHNwYWNlcyBpbnRvIHRhYi4KICBBQ19DT01QSUxFX0lGRUxTRShbWwogIHByb2dyYW0gZnJlZWZvcm0KICAgICAgICEgRklYTUU6IGhvdyB0byBiZXN0IGNvbmZ1c2Ugbm9uLWZyZWVmb3JtIGNvbXBpbGVycz8KICAgICAgIHByaW50ICosICdIZWxsbyAnLCAmCiAgICAgQCZ0QCAgICAgJ3dvcmxkLicKICAgICAgIGVuZF1dLAoJCSAgICBbYWNfY3ZfZmNfZnJlZWZvcm09JGFjX2ZsYWc7IGJyZWFrXSkKZG9uZQpybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CkZDRkxBR1M9JGFjX2ZjX2ZyZWVmb3JtX0ZDRkxBR1Nfc2F2ZQpdKQppZiB0ZXN0ICJ4JGFjX2N2X2ZjX2ZyZWVmb3JtIiA9IHh1bmtub3duOyB0aGVuCiAgbTRfZGVmYXVsdChbJDJdLAoJICAgICBbQUNfTVNHX0VSUk9SKFtGb3J0cmFuIGRvZXMgbm90IGFjY2VwdCBmcmVlLWZvcm0gc291cmNlXSwgNzcpXSkKZWxzZQogIGlmIHRlc3QgIngkYWNfY3ZfZmNfZnJlZWZvcm0iICE9IHhub25lOyB0aGVuCiAgICBGQ0ZMQUdTPSIkRkNGTEFHUyAkYWNfY3ZfZmNfZnJlZWZvcm0iCiAgZmkKICAkMQpmaQpBQ19MQU5HX1BPUChbRm9ydHJhbl0pZG5sCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19GQ19GUkVFRk9STV0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX0ZDX0ZSRUVGT1JNXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0ZDX0ZSRUVGT1JNXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfRkNfRlJFRUZPUk1dLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpCkY4LDgKdHJhbnNsaXR0cmFuc2xpdApGMTEsOAptNF90cmFuc2xpdHRyYW5zbGl0ClQyOCwxMDgKbTRfbG9jYXRpb24oZnBfRlVOQ19GTk1BVENIKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU5OApUMjcsMTA3Cm00X2xvY2F0aW9uKEFDX0ZDX0ZSRUVGT1JNKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMTc5ClQyOSwyMjAKX0FDX0NIRUNLX0hFQURFUl9DT01QSUxFX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXTJdLCBbJFtdM10sCgkJIFtBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoWyRbXTQKQCU6QGluY2x1ZGUgPCRbXTI+XSldLAoJCQkJICAgIFtBU19WQVJfU0VUKFskW10zXSwgW3llc10pXSwKCQkJCSAgICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pXSldKQogIEFTX0xJTkVOT19QT1AKClQxMyw2MApBQ19GVU5DX0xTVEFUX200X2RlZnVuX3BybyhbJDBdKV9BQ19GVU5DX1NUQVQobHN0YXQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwxMDUKbTRfbG9jYXRpb24oQUNfQ09ORklHX0xJTktTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjkyMwpUMTcsMTU4CkFDX0hBVkVfUE9VTkRCQU5HX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0hBVkVfUE9VTkRCQU5HJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19TWVNfSU5URVJQUkVURVJbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDExMAptNF9kaXZlcnRfcHVzaG00X2RpdmVydF9zdGFja19wdXNoKFskMF0sIFskMV0pbTRfcHVzaGRlZihbX200X2RpdmVydF9kaXZlcnNpb25dLCBbJDFdKV9tNF9kaXZlcnRfcmF3KF9tNF9kaXZlcnQoWyQxXSwgWyQyXSkpClQyMSw5NQpfQUNfTEFOR19OVUxMX1BST0dSQU1fbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19TT1VSQ0UoW19BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfR0VUR1JPVVBTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MjU4ClQ4LDg3Cm00X2ZhdGFsbTRfZXJycHJpbnRuKG00X2xvY2F0aW9uWzogZXJyb3I6ICQxXQptNF9leHBhbnNpb25fc3RhY2spbTRfZXhpdChtNF9pZihbJDJdLCwgMSwgWyQyXSkpClQyMywzCl9BQ19MQU5HX1BSRUZJWChFcmxhbmcpRVJMClQzNiwxMDIwCkFDX0xBTkdfRlVOQ19MSU5LX1RSWShPYmplY3RpdmUgQysrKUFDX0xBTkdfUFJPR1JBTSgKWy8qIERlZmluZSAkMSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQxLgogICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KI2RlZmluZSAkMSBpbm5vY3VvdXNfJDEKCi8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDEgKCk7IGJlbG93LgogICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KCiNpZmRlZiBfX1NURENfXwojIGluY2x1ZGUgPGxpbWl0cy5oPgojZWxzZQojIGluY2x1ZGUgPGFzc2VydC5oPgojZW5kaWYKCiN1bmRlZiAkMQoKLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMSAoKTsKLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwojaWYgZGVmaW5lZCBfX3N0dWJfJDEgfHwgZGVmaW5lZCBfX3N0dWJfX18kMQpjaG9rZSBtZQojZW5kaWYKXSwgW3JldHVybiAkMSAoKTtdKQpGOCw1Cm00X2lmZGVmaWZkZWYKVDE5LDcxNApBQ19PVVRQVVRfTUFLRV9ERUZTWyMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgojIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgojIFByb3RlY3QgYWdhaW5zdCBNYWtlZmlsZSBtYWNybyBleHBhbnNpb24uCiMKIyBJZiB0aGUgZmlyc3Qgc2VkIHN1YnN0aXR1dGlvbiBpcyBleGVjdXRlZCAod2hpY2ggbG9va3MgZm9yIG1hY3JvcyB0aGF0CiMgdGFrZSBhcmd1bWVudHMpLCB0aGVuIGJyYW5jaCB0byB0aGUgcXVvdGUgc2VjdGlvbi4gIE90aGVyd2lzZSwKIyBsb29rIGZvciBhIG1hY3JvIHRoYXQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cy4KYWNfc2NyaXB0PScKOm1saW5lCi9cXCQvewogTgogcyxcXFxuLCwKIGIgbWxpbmUKfQp0IGNsZWFyCjpjbGVhcgpzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKlwoW14JIChdW14JIChdKihbXildKilcKVsJIF0qXCguKlwpLy1EXDE9XDIvZwp0IHF1b3RlCnMvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qXChbXgkgXVteCSBdKlwpWwkgXSpcKC4qXCkvLURcMT1cMi9nCnQgcXVvdGUKYiBhbnkKOnF1b3RlCnMvWwkgYH4jJF4mKigpe31cXHw7J1wnJyI8Pj9dL1xcJi9nCnMvXFsvXFwmL2cKcy9cXS9cXCYvZwpzL1wkLyQkL2cKSAo6YW55CiR7CglnCglzL15cbi8vCglzL1xuLyAvZwoJcAp9CicKREVGUz1gc2VkIC1uICIkYWNfc2NyaXB0IiBjb25mZGVmcy5oYApdClQyNiwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9VSURfVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjU4MgpUMjQsMTA2Cm00X2xvY2F0aW9uKEFDX0Y3N19NQUlOKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo4NjQKVDIwLDk4Cl9BQ19MQU5HX09QRU5NUChDKyspCiNpZm5kZWYgX09QRU5NUAogY2hva2UgbWUKI2VuZGlmCiNpbmNsdWRlIDxvbXAuaD4KaW50IG1haW4gKCkgeyByZXR1cm4gb21wX2dldF9udW1fdGhyZWFkcyAoKTsgfQoKVDI3LDIKQUNfTEFOR19TT1VSQ0UoT2JqZWN0aXZlIEMpJDEKVDI0LDEwNwptNF9sb2NhdGlvbihfQUNfRE9fRUNITykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjM1MQpUMjksMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfVUlOVDY0X1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MjMKVDIwLDEwNgptNF9sb2NhdGlvbihBQ19MTl9TKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjIKVDI3LDEwNAptNF9sb2NhdGlvbihBQ19JTlRfMTZfQklUUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjgyMQpUMTYsMjI1Cl9BU19MSU5FTk9fV09SS1MgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KICBhc19saW5lbm9fMj0kTElORU5PIGFzX2xpbmVub18yYT0kTElORU5PCiAgZXZhbCAndGVzdCAieCRhc19saW5lbm9fMSckYXNfcnVuJyIgIT0gIngkYXNfbGluZW5vXzInJGFzX3J1biciICYmCiAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicKVDEzLDc4NgpfQUNfUFJPR19DQ19HYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQphY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENDIGFjY2VwdHMgLWcsIGFjX2N2X3Byb2dfY2NfZywKICBbYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCiAgIGFjX2Nfd2Vycm9yX2ZsYWc9eWVzCiAgIGFjX2N2X3Byb2dfY2NfZz1ubwogICBDRkxBR1M9Ii1nIgogICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKICAgICBbYWNfY3ZfcHJvZ19jY19nPXllc10sCiAgICAgW0NGTEFHUz0iIgogICAgICBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKCVtdLAoJW2FjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwoJIENGTEFHUz0iLWciCgkgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCgkgICBbYWNfY3ZfcHJvZ19jY19nPXllc10pXSldKQogICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWddKQppZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCiAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwplbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgogIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCiAgICBDRkxBR1M9Ii1nIC1PMiIKICBlbHNlCiAgICBDRkxBR1M9Ii1nIgogIGZpCmVsc2UKICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgogICAgQ0ZMQUdTPSItTzIiCiAgZWxzZQogICAgQ0ZMQUdTPQogIGZpCmZpW11kbmwKClQ3LDIwCm00X3dyYXBfbTRfd3JhcChbXSwgWyQxW11dKQpUMjgsMTA4Cm00X2xvY2F0aW9uKEFDX0ZVTkNfTUJSVE9XQykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo5MzEKVDI1LDEwNwptNF9sb2NhdGlvbihBQ19FR1JFUF9DUFApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI1MzkKVDI5LDEwNwptNF9sb2NhdGlvbihBQ19DT01QSUxFX0NIRUNLKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjk1ClQyNiwxMDkKbTRfbG9jYXRpb24oX0FDX0ZVTkNfRk9SSykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxODMzClQyNSwxMDcKbTRfbG9jYXRpb24oQUNfWEVOSVhfRElSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6NDQ3ClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfTElCU09VUkNFUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjkyMQpUMjIsMTA3Cm00X2xvY2F0aW9uKEFDX0xJQk9CSikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjkzOQpUMTIsMTEwCl9tNF9zZXRfc2l6ZW00X2RlZmluZShbX200X3NldF9zaXplKCQxKV0sCgkgICBtNF9pZmRlZihbX200X3NldF9zaXplKCQxKV0sIFskMihtNF9pbmRpcihbX200X3NldF9zaXplKCQxKV0pKV0sCgkJICAgIFsxXSkpClQxMSwxMDA5Cl9BQ19GQ19NQUlOX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgYWx0ZXJuYXRlIG1haW4gdG8gbGluayB3aXRoIF9BQ19MQU5HIGxpYnJhcmllc10sCgkgICAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYWluLApbYWNfW11fQUNfTEFOR19BQkJSRVZbXV9tX3NhdmVfTElCUz0kTElCUwogTElCUz0iJExJQlMgJFtdX0FDX0xBTkdfUFJFRklYW11MSUJTIgogYWNfZm9ydHJhbl9kbV92YXI9W11fQUNfRkNbXV9EVU1NWV9NQUlOCiBBQ19MQU5HX1BVU0goQylkbmwKIGFjX2N2X2ZvcnRyYW5fbWFpbj0ibWFpbiIgIyBkZWZhdWx0IGVudHJ5IHBvaW50IG5hbWUKIGZvciBhY19mdW5jIGluIE1BSU5fXyBNQUlOXyBfX21haW4gTUFJTiBfTUFJTiBfX01BSU4gbWFpbl8gbWFpbl9fIF9tYWluOyBkbwogICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtAJTpAaWZkZWYgRkNfRFVNTVlfTUFJTl9FUV9GNzcKQCU6QCAgdW5kZWYgRjc3X0RVTU1ZX01BSU4KQCU6QCAgdW5kZWYgRkNfRFVNTVlfTUFJTgpAJTpAZWxzZQpAJTpAICB1bmRlZiAkYWNfZm9ydHJhbl9kbV92YXIKQCU6QGVuZGlmCkAlOkBkZWZpbmUgbWFpbiAkYWNfZnVuY10pXSwKCQkgIFthY19jdl9mb3J0cmFuX21haW49JGFjX2Z1bmM7IGJyZWFrXSkKIGRvbmUKIEFDX0xBTkdfUE9QKEMpZG5sCiBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21haW49JGFjX2N2X2ZvcnRyYW5fbWFpbgogcm0gLXJmIGNvbmZ0ZXN0KgogTElCUz0kYWNfW11fQUNfTEFOR19BQkJSRVZbXV9tX3NhdmVfTElCUwpdKQpBQ19ERUZJTkVfVU5RVU9URUQoW11fQUNfRkNbXV9NQUlOLCAkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYWluLAoJCSAgIFtEZWZpbmUgdG8gYWx0ZXJuYXRlIG5hbWUgZm9yIGBtYWluJyByb3V0aW5lIHRoYXQgaXMKCQkgICAgY2FsbGVkIGZyb20gYSBgbWFpbicgaW4gdGhlIEZvcnRyYW4gbGlicmFyaWVzLl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMjg0CkFDX1NUUlVDVF9TVF9CTE9DS1NfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfYmxvY2tzXSwKCQkgIFtBQ19ERUZJTkUoSEFWRV9TVF9CTE9DS1MsIDEsCgkJCSAgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgYHN0cnVjdCBzdGF0JyBoYXMKCQkJICAgICAgYHN0X2Jsb2NrcycuICBEZXByZWNhdGVkLCB1c2UKCQkJICAgICAgYEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxPQ0tTJyBpbnN0ZWFkLl0pXSwKCQkgIFtBQ19MSUJPQkooW2ZpbGVibG9ja3NdKV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUNiw0MwptNF9tYXBfbTRfZm9yZWFjaChbX200X2FwcGx5KFskMV0sXSwgWyldLCBbXSwgJDIpClQyOCwxMDcKbTRfbG9jYXRpb24oQUNfUFJPR19JTlNUQUxMKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6NTI2ClQxMCw1NAptNF9pbmNsdWRlbTRfaW5jbHVkZV91bmlxdWUoWyQxXSlkbmwKbTRfYnVpbHRpbihbaW5jbHVkZV0sIFskMV0pClQyNCwyCl9BQ19MQU5HX0FCQlJFVihGb3J0cmFuKWZjClQxNywxMzYKX0FTX0JBU0VOQU1FX0VYUFJfbTRfZGVmdW5fcHJvKFskMF0pJGFzX2V4cHIgWC9bXSQxIDogJy4qL1woW1teL11bXi9dKl1cKS8qJCcgXHwgXAoJIFhbXSQxIDogJ1hcKC8vXCkkJyBcfCBcCgkgWFtdJDEgOiAnWFwoL1wpJyBcfCAuW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxNTAKX0FDX0lOSVRfTElURVJBTG00X2lmKG00X2luZGV4KG00X3RyYW5zbGl0KFtbJDFdXSwgWwoiIl0sIFsnJ10pLCBbJ10pQVNfTElURVJBTF9IRVJFRE9DX0lGKFskMV0sIFstXSksIFstMS1dLCBbXSwKICBbbTRfd2Fybihbc3ludGF4XSwgW0FDX0lOSVQ6IG5vdCBhIGxpdGVyYWw6ICQxXSldKQpUMTksNApfQUNfQ0MoT2JqZWN0aXZlIEMpT0JKQwpUMTksMTE5NgpfQUNfRlVOQ19GTk1BVENIX0lGX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKAogICBbZm9yIHdvcmtpbmcgJDEgZm5tYXRjaF0sCiAgIFskMl0sCiAgWyMgU29tZSB2ZXJzaW9ucyBvZiBTb2xhcmlzLCBTQ08sIGFuZCB0aGUgR05VIEMgTGlicmFyeQogICAjIGhhdmUgYSBicm9rZW4gb3IgaW5jb21wYXRpYmxlIGZubWF0Y2guCiAgICMgU28gd2UgcnVuIGEgdGVzdCBwcm9ncmFtLiAgSWYgd2UgYXJlIGNyb3NzLWNvbXBpbGluZywgdGFrZSBubyBjaGFuY2UuCiAgICMgVGhhbmtzIHRvIEpvaG4gT2xleW5pY2ssIEZyYW5jLG9pcyBQaW5hcmQsIGFuZCBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LgogICBBQ19SVU5fSUZFTFNFKAogICAgICBbQUNfTEFOR19QUk9HUkFNKAoJIFsjaW5jbHVkZSA8Zm5tYXRjaC5oPgojCSAgIGRlZmluZSB5KGEsIGIsIGMpIChmbm1hdGNoIChhLCBiLCBjKSA9PSAwKQojCSAgIGRlZmluZSBuKGEsIGIsIGMpIChmbm1hdGNoIChhLCBiLCBjKSA9PSBGTk1fTk9NQVRDSCkKCSBdLAoJIFtyZXR1cm4KCSAgICghKHkgKCJhKiIsICJhYmMiLCAwKQoJICAgICAgJiYgbiAoImQqLyoxIiwgImQvcy8xIiwgRk5NX1BBVEhOQU1FKQoJICAgICAgJiYgeSAoImFcXFxcYmMiLCAiYWJjIiwgMCkKCSAgICAgICYmIG4gKCJhXFxcXGJjIiwgImFiYyIsIEZOTV9OT0VTQ0FQRSkKCSAgICAgICYmIHkgKCIqeCIsICIueCIsIDApCgkgICAgICAmJiBuICgiKngiLCAiLngiLCBGTk1fUEVSSU9EKQoJICAgICAgJiYgbTRfaWYoWyQxXSwgW0dOVV0sCgkJICAgW3kgKCJ4eFhYIiwgInhYeFgiLCBGTk1fQ0FTRUZPTEQpCgkJICAgICYmIHkgKCJhKysoeHx5eSliIiwgImEreHl5eXl4YiIsIEZOTV9FWFRNQVRDSCkKCQkgICAgJiYgbiAoImQqLyoxIiwgImQvcy8xIiwgRk5NX0ZJTEVfTkFNRSkKCQkgICAgJiYgeSAoIioiLCAieCIsIEZOTV9GSUxFX05BTUUgfCBGTk1fTEVBRElOR19ESVIpCgkJICAgICYmIHkgKCJ4KiIsICJ4L3kveiIsIEZOTV9GSUxFX05BTUUgfCBGTk1fTEVBRElOR19ESVIpCgkJICAgICYmIHkgKCIqYyoiLCAiYy94IiwgRk5NX0ZJTEVfTkFNRSB8IEZOTV9MRUFESU5HX0RJUildLAoJCSAgIDEpKSk7XSldLAogICAgICBbJDI9eWVzXSwKICAgICAgWyQyPW5vXSwKICAgICAgWyQyPWNyb3NzXSldKQpBU19JRihbdGVzdCAkJDIgPSB5ZXNdLCBbJDNdLCBbJDRdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsMTE1CkFTX0VSUk9SYXNfZm5fZXJyb3IgbTRfZGVmYXVsdChbJDJdLCBbJD9dKSAiX0FTX1FVT1RFKFskMV0pIm00X2lmdmFsKEFTX01FU1NBR0VfTE9HX0ZELAogIFsgIiRMSU5FTk8iIEFTX01FU1NBR0VfTE9HX0ZEXSlbXQpUOCwxODcKQVNfRVJST1JfbTRfZGVmdW5fcHJvKFskMF0pbTRfYXBwZW5kX3VuaXEoW19BU19DTEVBTlVQXSwKICBbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVC1GTl0sIFtfQVNfRVJST1JfUFJFUEFSRVtdXSldKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE4OQptNF9zcGxpdG00X2lmKFskMV0sIFtdLCBbXSwKICAgICAgIFskMl0sIFsgXSwgW200X2lmKG00X2luZGV4KFskMV0sIFsgXSksIFstMV0sIFtbWyQxXV1dLAoJCQkgW18kMChbJDFdLCBbJDJdLCBbLCBdKV0pXSwKICAgICAgIFskMl0sIFtdLCBbXyQwKFskMV0sIFtbCSBdK10sIFssIF0pXSwKICAgICAgIFtfJDAoWyQxXSwgWyQyXSwgWywgXSldKQpUMjAsMjcwOApfQUNfUFJPR19GQ19WX09VVFBVVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW10pXSkKCiMgQ29tcGlsZSBhbmQgbGluayBvdXIgc2ltcGxlIHRlc3QgcHJvZ3JhbSBieSBwYXNzaW5nIGEgZmxhZyAoYXJndW1lbnQKIyAxIHRvIHRoaXMgbWFjcm8pIHRvIHRoZSBGb3J0cmFuIGNvbXBpbGVyIGluIG9yZGVyIHRvIGdldAojICJ2ZXJib3NlIiBvdXRwdXQgdGhhdCB3ZSBjYW4gdGhlbiBwYXJzZSBmb3IgdGhlIEZvcnRyYW4gbGlua2VyCiMgZmxhZ3MuCmFjX3NhdmVfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRbXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKX0FDX0xBTkdfUFJFRklYW11GTEFHUz0iJFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUyBtNF9kZWZhdWx0KFskMV0sIFskYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX3ZdKSIKZXZhbCAic2V0IHggJGFjX2xpbmsiCnNoaWZ0Cl9BU19FQ0hPX0xPRyhbJFsqXV0pCiMgZ2ZvcnRyYW4gNC4zIG91dHB1dHMgbGluZXMgc2V0dGluZyBDT0xMRUNUX0dDQ19PUFRJT05TLCBDT01QSUxFUl9QQVRILAojIExJQlJBUllfUEFUSDsgc2tpcCBhbGwgc3VjaCBzZXR0aW5ncy4KYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZXZhbCAkYWNfbGluayBBU19NRVNTQUdFX0xPR19GRD4mMSAyPiYxIHwKICBzZWQgJy9eRHJpdmluZzovZDsgL15Db25maWd1cmVkIHdpdGg6L2Q7CiAgICAgICciL15bW18kYXNfY3JfTGV0dGVyc11dW1tfJGFzX2NyX2FsbnVtXV0qPS9kImAKQVNfRUNITyhbIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0Il0pID4mQVNfTUVTU0FHRV9MT0dfRkQKX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kYWNfc2F2ZV9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKCnJtIC1yZiBjb25mdGVzdCoKCiMgT24gSFAvVVggdGhlcmUgaXMgYSBsaW5lIGxpa2U6ICJMUEFUSCBpczogL2ZvbzovYmFyOi9iYXoiIHdoZXJlCiMgL2ZvbywgL2JhciwgYW5kIC9iYXogYXJlIHNlYXJjaCBkaXJlY3RvcmllcyBmb3IgdGhlIEZvcnRyYW4gbGlua2VyLgojIEhlcmUsIHdlIGNoYW5nZSB0aGVzZSBpbnRvIC1ML2ZvbyAtTC9iYXIgLUwvYmF6IChhbmQgcHV0IGl0IGZpcnN0KToKYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD0iYGVjaG8gJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fdl9vdXRwdXQgfAoJZ3JlcCAnTFBBVEggaXM6JyB8CglzZWQgJ3N8LipMUEFUSCBpc1woOiAqW1teIF1dKlwpLip8XDF8O3N8OiAqL3wgLUwvfGcnYCAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCIKCiMgRklYTUU6IHdlIGtlZXAgZ2V0dGluZyBiaXR0ZW4gYnkgcXVvdGVkIGFyZ3VtZW50czsgYSBtb3JlIGdlbmVyYWwgZml4CiMgICAgICAgIHRoYXQgZGV0ZWN0cyB1bmJhbGFuY2VkIHF1b3RlcyBpbiBGTElCUyBzaG91bGQgYmUgaW1wbGVtZW50ZWQKIyAgICAgICAgYW5kICh1Z2gpIHRlc3RlZCBhdCBzb21lIHBvaW50LgpjYXNlICRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0IGluCiAgIyBJZiB3ZSBhcmUgdXNpbmcgeGxmIHRoZW4gcmVwbGFjZSBhbGwgdGhlIGNvbW1hcyB3aXRoIHNwYWNlcy4KICAqeGxmZW50cnkqKQogICAgYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZWNobyAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCB8IHNlZCAncy8sLyAvZydgIDs7CgogICMgV2l0aCBJbnRlbCBpZmMsIGlnbm9yZSB0aGUgcXVvdGVkIC1tR0xPQl9vcHRpb25zX3N0cmluZyBzdHVmZiAocXVvdGVkCiAgIyAkTElCUyBjb25mdXNlIHVzLCBhbmQgdGhlIGxpYnJhcmllcyBhcHBlYXIgbGF0ZXIgaW4gdGhlIG91dHB1dCBhbnl3YXkpLgogICptR0xPQl9vcHRpb25zX3N0cmluZyopCiAgICBhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0PWBlY2hvICRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3Zfb3V0cHV0IHwgc2VkICdzLyItbUdMT0JbW14iXV0qIi8gL2cnYCA7OwoKICAjIFBvcnRsYW5kIEdyb3VwIGNvbXBpbGVyIGhhcyBzaW5nbHktIG9yIGRvdWJseS1xdW90ZWQgLWNtZGxpbmUgYXJndW1lbnQKICAjIFNpbmdseS1xdW90ZWQgYXJndW1lbnRzIHdlcmUgcmVwb3J0ZWQgZm9yIHZlcnNpb25zIDUuMi00IGFuZCA2LjAtNC4KICAjIERvdWJseS1xdW90ZWQgYXJndW1lbnRzIHdlcmUgcmVwb3J0ZWQgZm9yICJQR0Y5MC94ODYgTGludXgveDg2IDUuMC0yIi4KICAqLWNtZGxpbmVcICogfCAqLWlnbm9yZVwgKiB8ICotZGVmXCAqKQogICAgYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZWNobyAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCB8IHNlZCAiXAoJcy8tY21kbGluZSAgKidbW14nXV0qJy8gL2c7IHMvLWNtZGxpbmUgICpcIltbXlwiXV0qXCIvIC9nCglzLy1pZ25vcmUgIConW1teJ11dKicvIC9nOyBzLy1pZ25vcmUgICpcIltbXlwiXV0qXCIvIC9nCglzLy1kZWYgIConW1teJ11dKicvIC9nOyBzLy1kZWYgICpcIltbXlwiXV0qXCIvIC9nImAgOzsKCiAgIyBJZiB3ZSBhcmUgdXNpbmcgQ3JheSBGb3J0cmFuIHRoZW4gZGVsZXRlIHF1b3Rlcy4KICAqY2Z0OTAqKQogICAgYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dD1gZWNobyAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dCB8IHNlZCAncy8iLy9nJ2AgOzsKZXNhYwoKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ2LDE5MAptNF9taW5tNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbdG9vIGZldyBhcmd1bWVudHMgdG8gJDBdKV0sCiAgICAgICBbJCNdLCBbMV0sIFttNF9ldmFsKFskMV0pXSwKICAgICAgIFskIyQxXSwgWzIkMl0sIFttNF9ldmFsKFskMV0pXSwKICAgICAgIFskI10sIFsyXSwgW18kMCgkQCldLAogICAgICAgW19tNF9taW5tYXgoW18kMF0sICRAKV0pClQyNSwwCm00X2luY2x1ZGUoYXV0b2NvbmYvYy5tNCkKRjE0LDExCm00X2NoYW5nZXF1b3RlY2hhbmdlcXVvdGUKVDE3LDIKX0FTX0xJVEVSQUxfSUZfTk8kMgpUMjEsMzExCl9BQ19MQU5HX0NPTVBJTEVSX0dOVUFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIF9BQ19MQU5HIGNvbXBpbGVyXSwKCQlbYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9jb21waWxlcl9nbnVdLApbX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sIFtbI2lmbmRlZiBfX0dOVUNfXwogICAgICAgY2hva2UgbWUKI2VuZGlmCl1dKV0sCgkJICAgW2FjX2NvbXBpbGVyX2dudT15ZXNdLAoJCSAgIFthY19jb21waWxlcl9nbnU9bm9dKQphY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Cl0pClQ5LDIzCkFOX0hFQURFUkFOX09VVFBVVChbaGVhZGVyXSwgJEApClQyNCwxMDMKQUNfTEFOR19QUkVQUk9DKEZvcnRyYW4pX200X2RlZnVuX3BybyhbJDBdKW00X3dhcm4oW3N5bnRheF0sCgkgWyQwOiBObyBwcmVwcm9jZXNzb3IgZGVmaW5lZCBmb3IgXV9BQ19MQU5HKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsOTUKQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKEMpQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDAKXSkKVDE3LDM4MgpBQ19DT05GSUdfU1VCRElSU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlBQ19SRVFVSVJFKFtBQ19ESVNBQkxFX09QVElPTl9DSEVDS0lOR10pbTRfbWFwX2FyZ3NfdyhbJDFdLCBbX0FDX0NPTkZJR19VTklRVUUoW1NVQkRJUlNdLAogIF9BQ19DT05GSUdfQ09NUFVURV9ERVNUKF0sIFspKV0pbTRfYXBwZW5kKFtfQUNfTElTVF9TVUJESVJTXSwgWyQxXSwgWwpdKUFTX0xJVEVSQUxfSUYoWyQxXSwgW10sCgkgICAgICAgW0FDX0RJQUdOT1NFKFtzeW50YXhdLCBbJDA6IHlvdSBzaG91bGQgdXNlIGxpdGVyYWxzXSldKUFDX1NVQlNUKFtzdWJkaXJzXSwgWyIkc3ViZGlycyBtNF9ub3JtYWxpemUoWyQxXSkiXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDEwOQptNF9sb2NhdGlvbihBTV9GVU5DX09CU1RBQ0spL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTM4OQpUMjIsMTAzCm00X2xvY2F0aW9uKEFDX1BBVEhfWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xpYnMubTQ6MzI0ClQzNiwxMDYKbTRfbG9jYXRpb24oQUNfQ09ORklHX0NPTU1BTkRTX1BPU1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTA3MwpUMjYsMQpfbTRfZGl2ZXJ0KEhFQURFUi1DT01NRU5UKTIKVDI2LDY4OApfQUNfVFlQRV9VTlNJR05FRF9JTlRfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgdWludCRbXTJfdF0sICRbXTMsCiAgICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pCiAgICAgIyBPcmRlciBpcyBpbXBvcnRhbnQgLSBuZXZlciBjaGVjayBhIHR5cGUgdGhhdCBpcyBwb3RlbnRpYWxseSBzbWFsbGVyCiAgICAgIyB0aGFuIGhhbGYgb2YgdGhlIGV4cGVjdGVkIHRhcmdldCB3aWR0aC4KICAgICBmb3IgYWNfdHlwZSBpbiB1aW50JFtdMl90ICd1bnNpZ25lZCBpbnQnICd1bnNpZ25lZCBsb25nIGludCcgXAoJICd1bnNpZ25lZCBsb25nIGxvbmcgaW50JyAndW5zaWduZWQgc2hvcnQgaW50JyAndW5zaWduZWQgY2hhcic7IGRvCiAgICAgICBBQ19DT01QSUxFX0lGRUxTRSgKCSBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKAoJICAgIFtBQ19JTkNMVURFU19ERUZBVUxUXSwKCSAgICBbKCgkYWNfdHlwZSkgLTEgPj4gKCRbXTIgLyAyIC0gMSkpID4+ICgkW10yIC8gMiAtIDEpID09IDNdKV0sCgkgW0FTX0NBU0UoWyRhY190eXBlXSwgW3VpbnQkW10yX3RdLAoJICAgIFtBU19WQVJfU0VUKFskW10zXSwgW3llc10pXSwKCSAgICBbQVNfVkFSX1NFVChbJFtdM10sIFskYWNfdHlwZV0pXSldKQogICAgICAgQVNfVkFSX0lGKFskW10zXSwgW25vXSwgW10sIFticmVha10pCiAgICAgZG9uZV0pCiAgQVNfTElORU5PX1BPUAoKVDEyLDQ1NwpfQUNfREVGSU5FX1FtNF9wdXNoZGVmKFtBQ19uYW1lXSwgbTRfZm9ybWF0KFtbWyUuKnNdXV0sIG00X2luZGV4KFskMihdLCBbKF0pLCBbJDJdKSlBQ19ERUZJTkVfVFJBQ0UoQUNfbmFtZSltNF9jb25kKFttNF9pbmRleChbJDNdLCBbCl0pXSwgWy0xXSwgW10sCglbbTRfYnJlZ2V4cChbWyQzXV0sIFtbXlxcXQpdLCBbLV0pXSwgW10sIFtdLAoJW200X3dhcm4oW3N5bnRheF0sIFtBQ19ERUZJTkVdbTRfaWYoWyQxXSwgW19BQ19ERUZJTkVdLCBbXSwKICBbW19VTlFVT1RFRF1dKVs6IGAkMycgaXMgbm90IGEgdmFsaWQgcHJlcHJvY2Vzc29yIGRlZmluZSB2YWx1ZV0pXSltNF9pZnZhbChbJDRdLCBbQUhfVEVNUExBVEUoQUNfbmFtZSwgWyQ0XSkKXSlfbTRfcG9wZGVmKFtBQ19uYW1lXSkkMShtNF9leHBhbmQoW1tAJTpAZGVmaW5lXSAkMiBdbTRfaWYoWyQjXSwgMiwgMSwKICBbJDNdLCBbXSwgWy8qKi9dLCBbWyQzXV0pKSkKClQxMSwxNjAKQUNfVU5JU1REX0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVU5JU1REX0gnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX0hFQURFUlModW5pc3RkLmgpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw1MzkKQUNfQ0hFQ0tfREVDTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19kZWNsXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2RlY2xdLAogICAgW0xJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTXSwKICAgIFtUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZQogICAgIFZBUiBhY2NvcmRpbmdseS5dKV0sCiAgW18kMF9CT0RZXSlBU19WQVJfUFVTSERFRihbYWNfU3ltYm9sXSwgW2FjX2N2X2hhdmVfZGVjbF8kMV0pYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV9jaGVja19kZWNsICIkTElORU5PIiAiJDEiICJhY19TeW1ib2wiICJBU19FU0NBUEUoW0FDX0lOQ0xVREVTX0RFRkFVTFQoWyQ0XSldLCBbIiJdKSIKQVNfVkFSX0lGKFthY19TeW1ib2xdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfU3ltYm9sXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw1NAptNF9pZmJsYW5rbTRfaWYobTRfdHJhbnNsaXQoW1skMV1dLCAgWyBdWwldWwpdKSwgW10sIFskMl0sIFskM10pClQxNCwxNjYKbTRfY2xlYXJkaXZlcnRtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbX200X2RpdmVydF9yYXcoWy0xXSltNF91bmRpdmVydCgkQClfbTRfZGl2ZXJ0X3JhdygKCSBfbTRfZGl2ZXJ0KF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pLCBbLV0pKV0pClQxOCwyMDYKX200X3RleHRfd3JhcF93b3JkbTRfZGVmaW5lKFttNF9DdXJzb3JdLCBtNF9ldmFsKG00X0N1cnNvciArIG00X3FsZW4oWyQxXSkgKyAxKSltNF9pZihtNF9ldmFsKG00X0N1cnNvciA+IChbJDNdKSksCiAgICAgIFsxXSwgW200X2RlZmluZShbbTRfQ3Vyc29yXSwgbTRfZXZhbChtNF9JbmRlbnQgKyBtNF9xbGVuKFskMV0pICsgMSkpClskMl1dLAogICAgICBbbTRfU2VwYXJhdG9yW11dKVskMV0KVDEzLDE3OQpBQ19QQVRIX1BST0dTX200X2RlZnVuX3BybyhbJDBdKWZvciBhY19wcm9nIGluICQyCmRvCiAgQUNfUEFUSF9QUk9HKFskMV0sIFskYWNfcHJvZ10sICwgWyQ0XSkKICB0ZXN0IC1uICIkJDEiICYmIGJyZWFrCmRvbmUKbTRfaWZ2YWxuKFskM10sIFt0ZXN0IC1uICIkJDEiIHx8ICQxPSIkMyJdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDE2MDEKX0FTX1NIRUxMX1NBTklUSVpFX200X2RlZnVuX3BybyhbJDBdKW00X3B1c2hkZWYoW0FTX0VYSVRdLCBbZXhpdCBtNF9kZWZhdWx0KF1tNF9kcXVvdGUoWyRdWzFdKVssIDEpXSltNF90ZXh0X2JveChbTTRzaCBJbml0aWFsaXphdGlvbi5dKQoKQVNfQk9VUk5FX0NPTVBBVElCTEUKX0FTX0VDSE9fUFJFUEFSRQpfQVNfUEFUSF9TRVBBUkFUT1JfUFJFUEFSRQoKIyBJRlMKIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCiMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAojIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCklGUz0iICIiCSRhc19ubCIKCiMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCmFzX215c2VsZj0KY2FzZSAkWzBdIGluIEAlOkAoKAogICpbW1xcL11dKiApIGFzX215c2VsZj0kWzBdIDs7CiAgKikgX0FTX1BBVEhfV0FMSyhbXSwKCQkgICBbdGVzdCAtciAiJGFzX2Rpci8kWzBdIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kWzBdICYmIGJyZWFrXSkKICAgICA7Owplc2FjCiMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCmlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KICBhc19teXNlbGY9JFswXQpmaQppZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCiAgQVNfRUNITyhbIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIl0pID4mMgogIEFTX0VYSVQKZmkKCiMgVW5zZXQgdmFyaWFibGVzIHRoYXQgd2UgZG8gbm90IG5lZWQgYW5kIHdoaWNoIGNhdXNlIGJ1Z3MgKGUuZy4gaW4KIyBwcmUtMy4wIFVXSU4ga3NoKS4gIEJ1dCBkbyBub3QgY2F1c2UgYnVncyBpbiBiYXNoIDIuMDE7IHRoZSAifHwgZXhpdCAxIgojIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCiMgdHJpZ2dlciBhIGJ1ZyBpbiBwZGtzaCA1LjIuMTQuCmZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WIE1BSUwgTUFJTFBBVEgKZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKICAmJiAoICh1bnNldCAkYXNfdmFyKSB8fCBleGl0IDEpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCAkYXNfdmFyIHx8IDoKZG9uZQpQUzE9JyQgJwpQUzI9Jz4gJwpQUzQ9JysgJwoKIyBOTFMgbnVpc2FuY2VzLgpMQ19BTEw9QwpleHBvcnQgTENfQUxMCkxBTkdVQUdFPUMKZXhwb3J0IExBTkdVQUdFCgojIENEUEFUSC4KKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSApfbTRfcG9wZGVmKFtBU19FWElUXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDEyNApBQ19SVU5fTE9HX200X2RlZnVuX3BybyhbJDBdKV9BQ19SVU5fTE9HKFskMV0sCgkgICAgIFtBU19FQ0hPKFsiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBBU19FU0NBUEUoWyQxXSkiXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMjE0MwpBQ19GQ19MSU5FX0xFTkdUSF9tNF9kZWZ1bl9vbmNlKFtBQ19GQ19MSU5FX0xFTkdUSF0sIFtBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKWRubAptNF9jYXNlKG00X2RlZmF1bHQoWyQxXSwgWzEzMl0pLAogIFt1bmxpbWl0ZWRdLCBbYWNfZmNfbGluZV9sZW5fc3RyaW5nPXVubGltaXRlZAoJICAgICAgICAgICAgICAgYWNfZmNfbGluZV9sZW49MAogICAgICAgICAgICAgICAgICAgICAgIGFjX2ZjX2xpbmVfbGVuZ3RoX3Rlc3Q9JwogICAgICBzdWJyb3V0aW5lIGxvbmdlcl90aGFuXzEzMihhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgsJ1wKJ2FyZzksYXJnMTAsYXJnMTEsYXJnMTIsYXJnMTMsYXJnMTQsYXJnMTUsYXJnMTYsYXJnMTcsYXJnMTgsYXJnMTkpJ10sCiAgWzEzMl0sICAgICAgICAgICAgW2FjX2ZjX2xpbmVfbGVuPTEzMgoJCSAgICAgICBhY19mY19saW5lX2xlbmd0aF90ZXN0PScKICAgICAgc3Vicm91dGluZSBsb25nZXJfdGhhbl84MChhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgsYXJnOSwnXAonYXJnMTApJ10sCiAgWzgwXSwgICAgICAgICAgICAgW2FjX2ZjX2xpbmVfbGVuPTgwCgkJICAgICAgIGFjX2ZjX2xpbmVfbGVuZ3RoX3Rlc3Q9JwogICAgICBzdWJyb3V0aW5lIGxvbmdlcl90aGFuXzcyKGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCxhcmc5KSddLAogIFttNF93YXJuaW5nKFtJbnZhbGlkIGxlbmd0aCBhcmd1bWVudCBgJDEnXSldKQo6ICR7YWNfZmNfbGluZV9sZW5fc3RyaW5nPSRhY19mY19saW5lX2xlbn0KQUNfQ0FDSEVfQ0hFQ0soCltmb3IgRm9ydHJhbiBmbGFnIG5lZWRlZCB0byBhY2NlcHQgJGFjX2ZjX2xpbmVfbGVuX3N0cmluZyBjb2x1bW4gc291cmNlIGxpbmVzXSwKCSAgICAgICBbYWNfY3ZfZmNfbGluZV9sZW5ndGhdLApbYWNfY3ZfZmNfbGluZV9sZW5ndGg9dW5rbm93bgphY19mY19saW5lX2xlbmd0aF9GQ0ZMQUdTX3NhdmU9JEZDRkxBR1MKZm9yIGFjX2ZsYWcgaW4gbm9uZSBcCgkgICAgICAgLWZmcmVlLWxpbmUtbGVuZ3RoLW5vbmUgLWZmaXhlZC1saW5lLWxlbmd0aC1ub25lIFwKCSAgICAgICAtZmZyZWUtbGluZS1sZW5ndGgtJGFjX2ZjX2xpbmVfbGVuIFwKCSAgICAgICAtZmZpeGVkLWxpbmUtbGVuZ3RoLSRhY19mY19saW5lX2xlbiBcCgkgICAgICAgLXFmaXhlZD0kYWNfZmNfbGluZV9sZW4gLU1leHRlbmQgXAoJICAgICAgIC0kYWNfZmNfbGluZV9sZW4gLWV4dGVuZF9zb3VyY2UgXAoJICAgICAgICItVyAkYWNfZmNfbGluZV9sZW4iICtleHRlbmRfc291cmNlIC13aWRlIC1lCmRvCiAgdGVzdCAieCRhY19mbGFnIiAhPSB4bm9uZSAmJiBGQ0ZMQUdTPSIkYWNfZmNfbGluZV9sZW5ndGhfRkNGTEFHU19zYXZlICRhY19mbGFnIgogIEFDX0NPTVBJTEVfSUZFTFNFKFtbJGFjX2ZjX2xpbmVfbGVuZ3RoX3Rlc3QKICAgICAgZW5kIHN1YnJvdXRpbmVdXSwKCQkgICAgW2FjX2N2X2ZjX2xpbmVfbGVuZ3RoPSRhY19mbGFnOyBicmVha10pCmRvbmUKcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dApGQ0ZMQUdTPSRhY19mY19saW5lX2xlbmd0aF9GQ0ZMQUdTX3NhdmUKXSkKaWYgdGVzdCAieCRhY19jdl9mY19saW5lX2xlbmd0aCIgPSB4dW5rbm93bjsgdGhlbgogIG00X2RlZmF1bHQoWyQzXSwKCSAgICAgW0FDX01TR19FUlJPUihbRm9ydHJhbiBkb2VzIG5vdCBhY2NlcHQgbG9uZyBzb3VyY2UgbGluZXNdLCA3NyldKQplbHNlCiAgaWYgdGVzdCAieCRhY19jdl9mY19saW5lX2xlbmd0aCIgIT0geG5vbmU7IHRoZW4KICAgIEZDRkxBR1M9IiRGQ0ZMQUdTICRhY19jdl9mY19saW5lX2xlbmd0aCIKICBmaQogICQyCmZpCkFDX0xBTkdfUE9QKFtGb3J0cmFuXSlkbmwKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0ZDX0xJTkVfTEVOR1RIXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfRkNfTElORV9MRU5HVEhdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfRkNfTElORV9MRU5HVEhdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19GQ19MSU5FX0xFTkdUSF0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDcsNDgKbTRfcWxlbm00X2lmZGVmKFskMC0kMV0sIFtfbTRfZGVmbihbJDAtXV0sIFtfJDAoXSlbJDFdKQpUNiwxOTAKbTRfbWF4bTRfaWYoWyQjXSwgWzBdLCBbbTRfZmF0YWwoW3RvbyBmZXcgYXJndW1lbnRzIHRvICQwXSldLAogICAgICAgWyQjXSwgWzFdLCBbbTRfZXZhbChbJDFdKV0sCiAgICAgICBbJCMkMV0sIFsyJDJdLCBbbTRfZXZhbChbJDFdKV0sCiAgICAgICBbJCNdLCBbMl0sIFtfJDAoJEApXSwKICAgICAgIFtfbTRfbWlubWF4KFtfJDBdLCAkQCldKQpUMzQsMTA2Cm00X2xvY2F0aW9uKEFDX1RJTUVfV0lUSF9TWVNfVElNRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjgxCkYxMSw4Cm00X2VycnByaW50ZXJycHJpbnQKRjgsOAplcnJwcmludGVycnByaW50CkY0LDQKZGVjcmRlY3IKVDExLDQ3MQpfQUNfRkNfRlVOQ19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApjYXNlICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nIGluCiAgdXBwZXIqKSBhY192YWw9Im00X3RvdXBwZXIoWyQxXSkiIDs7CiAgbG93ZXIqKSBhY192YWw9Im00X3RvbG93ZXIoWyQxXSkiIDs7CiAgKikgICAgICBhY192YWw9InVua25vd24iIDs7CmVzYWMKY2FzZSAkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZyBpbiAqLCIgdW5kZXJzY29yZSIqKSBhY192YWw9IiRhY192YWwiXyA7OyBlc2FjCm00X2lmKG00X2luZGV4KFskMV0sW19dKSwtMSxbXSwKW2Nhc2UgJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcgaW4gKiwiIGV4dHJhIHVuZGVyc2NvcmUiKikgYWNfdmFsPSIkYWNfdmFsIl8gOzsgZXNhYwpdKQptNF9kZWZhdWx0KFskMl0sWyQxXSk9IiRhY192YWwiCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsNDIyCkFDX0VSTEFOR19TVUJTVF9JTlNUQUxMX0xJQl9ESVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfTVNHX0NIRUNLSU5HKFtmb3IgRXJsYW5nL09UUCBsaWJyYXJ5IGluc3RhbGxhdGlvbiBiYXNlIGRpcmVjdG9yeV0pCkFDX0FSR19WQVIoW0VSTEFOR19JTlNUQUxMX0xJQl9ESVJdLAogICAgW0VybGFuZy9PVFAgbGlicmFyeSBpbnN0YWxsYXRpb24gYmFzZSBkaXJlY3RvcnkgW0xJQkRJUi9lcmxhbmcvbGliXV0pCmlmIHRlc3QgLW4gIiRFUkxBTkdfSU5TVEFMTF9MSUJfRElSIjsgdGhlbgogICAgQUNfTVNHX1JFU1VMVChbJEVSTEFOR19JTlNUQUxMX0xJQl9ESVJdKQplbHNlCiAgICBBQ19TVUJTVChbRVJMQU5HX0lOU1RBTExfTElCX0RJUl0sIFsnJHtsaWJkaXJ9L2VybGFuZy9saWInXSkKICAgIEFDX01TR19SRVNVTFQoWyRsaWJkaXIvZXJsYW5nL2xpYl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTM3Cl9tNF9kaXZlcnRtNF9pZmRlZihbX200X2RpdmVydCgkMSldLAoJICBbbTRfaW5kaXIoW19tNF9kaXZlcnQoJDEpXSldLAoJICBbbTRfaWYoWyQyXSwgW10sIFttNF93YXJuKFtzeW50YXhdLAoJICAgICBbcHJlZmVyIG5hbWVkIGRpdmVyc2lvbnNdKV0pJDFdKQpUMTQsMTkzCkFDX0xPTkdfRE9VQkxFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xPTkdfRE9VQkxFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NfTE9OR19ET1VCTEVdLCBbQUNfQ19MT05HX0RPVUJMRSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksNzYKQUNfTEFOR19DT05GVEVTVChDKWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLyogZW5kIGNvbmZkZWZzLmguICAqLwokMQpfQUNFT0YKVDEwLDE3ODMKQUNfQ19DT05TVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIGFuIEFOU0kgQy1jb25mb3JtaW5nIGNvbnN0XSwgYWNfY3ZfY19jb25zdCwKW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sCltbLyogRklYTUU6IEluY2x1ZGUgdGhlIGNvbW1lbnRzIHN1Z2dlc3RlZCBieSBQYXVsLiAqLwojaWZuZGVmIF9fY3BsdXNwbHVzCiAgLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KICB0eXBlZGVmIGludCBjaGFyc2V0WzJdOwogIGNvbnN0IGNoYXJzZXQgY3M7CiAgLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KICBjaGFyIGNvbnN0ICpjb25zdCAqcGNwY2M7CiAgY2hhciAqKnBwYzsKICAvKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwogIHN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKICBzdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKICAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCiAgICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4KICAgICBhbiBhcm0gb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50CiAgICAgZXhwcmVzc2lvbiAqLwogIGNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKICBwY3BjYyA9ICZnICsgKGcgPyBnLWcgOiAwKTsKICAvKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwogICsrcGNwY2M7CiAgcHBjID0gKGNoYXIqKikgcGNwY2M7CiAgcGNwY2MgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcHBjOwogIHsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCiAgICBjaGFyICp0OwogICAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKCiAgICAqdCsrID0gMDsKICAgIGlmIChzKSByZXR1cm4gMDsKICB9CiAgeyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KICAgIGludCB4W10gPSB7MjUsIDE3fTsKICAgIGNvbnN0IGludCAqZm9vID0gJnhbMF07CiAgICArK2ZvbzsKICB9CiAgeyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCiAgICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKICAgIGlwdHIgcCA9IDA7CiAgICArK3A7CiAgfQogIHsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwogICAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwogICAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKICAgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKICB9CiAgeyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KICAgIGNvbnN0IGludCBmb28gPSAxMDsKICAgIGlmICghZm9vKSByZXR1cm4gMDsKICB9CiAgcmV0dXJuICFjc1swXSAmJiAhemVyby54OwojZW5kaWYKXV0pXSwKCQkgICBbYWNfY3ZfY19jb25zdD15ZXNdLAoJCSAgIFthY19jdl9jX2NvbnN0PW5vXSldKQppZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KICBBQ19ERUZJTkUoY29uc3QsLAoJICAgIFtEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDI2Cm00X2NyX0xFVFRFUlNBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWgpUMjIsMTA2Cm00X2xvY2F0aW9uKEFDX1BSRVJFUSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MzA3ClQyOCwxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19GTk1BVENIKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU1MApUMTAsMTc3CkFNX01JTkdXMzJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fTUlOR1czMicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19NSU5HVzMyXSwgW0FDX01JTkdXMzIoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDEwOAptNF9sb2NhdGlvbihBQ19GVU5DX0dFVExPQURBVkcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6NzE5ClQxMSwxNTAKQUNfU0NPX0lOVExfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU0NPX0lOVEwnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0ZVTkNfU1RSRlRJTUVbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDEwNgptNF9sb2NhdGlvbihhY19jdl9wcm9nX2c3NykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MjY5ClQyMywxMDkKbTRfbG9jYXRpb24oQUNfVlBSSU5URikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxOTcwClQyMSwxMDkKbTRfbG9jYXRpb24oQUNfVkZPUkspL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTk1MgpUMjEsMTA2Cm00X2xvY2F0aW9uKEFDX1BJRF9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjkKVDE1LDI3MgpfQVNfRElSTkFNRV9TRURfbTRfZGVmdW5fcHJvKFskMF0pQVNfRUNITyhbWFtdJDFdKSB8CiAgICBzZWQgWycvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKCSAgICBzLy9cMS8KCSAgICBxCgkgIH0KCSAgL15YXChcL1wvXClbXi9dLiovewoJICAgIHMvL1wxLwoJICAgIHEKCSAgfQoJICAvXlhcKFwvXC9cKSQvewoJICAgIHMvL1wxLwoJICAgIHEKCSAgfQoJICAvXlhcKFwvXCkuKi97CgkgICAgcy8vXDEvCgkgICAgcQoJICB9CgkgIHMvLiovLi87IHEnXVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMTA2Cm00X2xvY2F0aW9uKEFDX1NUX0JMT0NLUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc3ClQzMywxMDYKbTRfbG9jYXRpb24oQUNfSEVBREVSX1RJT0NHV0lOU1opL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjgxMApUMTcsOTQKX200X3N0YWNrX3JldmVyc2VtNF9pZmRlZihbJDFdLCBbbTRfcHVzaGRlZihbJDJdLAogIF9tNF9kZWZuKFskMV0pKSQzW11fbTRfcG9wZGVmKFskMV0pJDAoWyQxXSwgWyQyXSwgWyQ0JDNdKV0pClQxNiwxMDMKQVNfSURFTlRJRklFUl9JRm00X2lmKF8kMChtNF9pZihtNF9pbmRleChbJDFdLCBbQF0pLCBbLTFdLAogIFtbJDFdXSwgW200X2JwYXRzdWJzdChbWyQxXV0sIFtAJnRAXSldKSksIFstXSwgWyQyXSwgWyQzXSkKRjExLDcKbTRfbWFrZXRlbXBta3N0ZW1wClQzMCwxMDcKbTRfbG9jYXRpb24oX0FDX1JVTl9MT0dfTElNSVQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIzMzMKVDMwLDEwNgptNF9sb2NhdGlvbihBQ19GNzdfRFVNTVlfTUFJTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6ODA2ClQxNywxMjkKX0FTX0RFVEVDVF9FWFBBTkQkMT0ibTRfYnBhdHN1YnN0KG00X2RxdW90ZShBU19FU0NBUEUoX200X2V4cGFuZChtNF9zZXRfY29udGVudHMoWyQyXSwgWwpdKSkpKSwgW1xcXCRMSU5FTk9cKC4qXCkkXSwgWyI7JDE9JCQxJExJTkVOTzskMT0kJDEiXDFdKSIKVDE1LDE5MgpBTV9GVU5DX0ZOTUFUQ0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fRlVOQ19GTk1BVENIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfRk5NQVRDSF0sIFtBQ19GVU5DX0ZOTUFUQ0goJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM3LDEwMwptNF9sb2NhdGlvbihBQ19MQU5HX0NPTVBJTEVSX1JFUVVJUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjMzMApUMjcsMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9TVERDKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo2NjgKVDYsMzcKX0FDX0NDX0FDX0xBTkdfRElTUEFUQ0goWyQwXSwgX0FDX0xBTkcsICRAKQpUMTYsNjUKQUNfVFlQRV9VSU5UNjRfVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfVFlQRV9VTlNJR05FRF9JTlQoNjQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwzOApBQ19MQU5HX0NBTEwoRm9ydHJhbilBQ19MQU5HX1BST0dSQU0oWyQxXSwKWyAgICAgIGNhbGwgJDJdKQpUMTIsMTM1CkFDX0FSR19BUlJBWV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19BUkdfQVJSQVknIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUNCwzNwptNF9ubTRfaWYoWyQxXSwKICAgICAgIFtdLCBbXSwKCSAgIFskMQpdKQpUMjYsMTAyCm00X2xvY2F0aW9uKEFTX0xJTkVOT19QT1ApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6ODcxClQyNywxMDAKbTRfbG9jYXRpb24oQUNfUFJPR19PQkpDUFApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjgyMgpUOCwyMgpBU19UUl9TSF8kMChtNF9leHBhbmQoWyQxXSkpW10KVDgsMTI0CkFTX1RSX1NIX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTU0Cm00X3Byb3ZpZGVtNF9pZmRlZihbbTRfcHJvdmlkZSgkMSldLCBbXSwKW200X3NldF9hZGQoW19tNF9wcm92aWRlXSwgWyQxXSwgW200X2RlZmluZShbbTRfcHJvdmlkZSgkMSldLAogIG00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nXSwgW19tNF9kZWZuKFtfbTRfZGl2ZXJ0aW5nXSldKSldKV0pClQyNiwxMDEKbTRfbG9jYXRpb24oQUNfQ19WT0xBVElMRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MTc3OApUMTgsMjA5CkFDX0xPTkdfRklMRV9OQU1FU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MT05HX0ZJTEVfTkFNRVMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfU1lTX0xPTkdfRklMRV9OQU1FU10sIFtBQ19TWVNfTE9OR19GSUxFX05BTUVTKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSw2OQpBQ19ERUZJTkVfVFJBQ0VBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwgW0FDX0RFRklORV9UUkFDRV9MSVRFUkFMKF9tNF9leHBhbmQoWyQxXSkpXSkKVDExLDE3NgpBQ19DWUdXSU4zMl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DWUdXSU4zMicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DWUdXSU5dLCBbQUNfQ1lHV0lOKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwxMDMKbTRfbG9jYXRpb24oQUNfSEFWRV9MSUJSQVJZKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGlicy5tNDoxMzgKVDEzLDEwMApBU19MSU5FTk9fUE9QX200X2RlZnVuX3BybyhbJDBdKWV2YWwgJGFzX2xpbmVub19zdGFjazsgJHthc19saW5lbm9fc3RhY2s6Kzp9IHVuc2V0IGFzX2xpbmVub1tdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsNjUKbTRfc2V0X3NpemVtNF9pZmRlZihbX200X3NldF9zaXplKCQxKV0sIFttNF9pbmRpcihbX200X3NldF9zaXplKCQxKV0pXSwgWzBdKQpUOSwwCm00X2lnbm9yZQpUMjgsMTA2Cm00X2xvY2F0aW9uKEFDX1NURENfSEVBREVSUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc1ClQyOSwxMDgKbTRfbG9jYXRpb24oQUNfVFJZX0xJTktfRlVOQykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNTAKVDIwLDE4NApfQUNfRkNfTkFNRV9NQU5HTElOR19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19GQ19MSUJSQVJZX0xERkxBR1NdKWRubApBQ19SRVFVSVJFKFtBQ19GQ19EVU1NWV9NQUlOXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4pZG5sCl9fQUNfRkNfTkFNRV9NQU5HTElORwpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIwLDUwCl9BQ19BUkdfVkFSX1BSRUNJT1VTbTRfYXBwZW5kX3VuaXEoW19BQ19QUkVDSU9VU19WQVJTXSwgWyQxXSwgWwpdKWRubAoKVDEzLDcyCkFDX1NVQlNUX0ZJTEVtNF9wYXR0ZXJuX2FsbG93KFteJDEkXSlkbmwKbTRfYXBwZW5kX3VuaXEoW19BQ19TVUJTVF9GSUxFU10sIFskMV0sIFsKXSkKVDE1LDY4CkFDX0NPTkZJR19GSUxFU19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfQ09ORklHX0ZPT1MoW0ZJTEVTXSwgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSwxODAKQU1fQ1lHV0lOMzJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fQ1lHV0lOMzInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ1lHV0lOMzJdLCBbQUNfQ1lHV0lOMzIoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDU4MwpBQ19QUk9HX0NDX1NURENfbTRfZGVmdW5fcHJvKFskMF0pIEFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAogIEFTX0NBU0UoWyRhY19jdl9wcm9nX2NjX3N0ZGNdLAogICAgW25vXSwgW2FjX2N2X3Byb2dfY2NfYzk5PW5vOyBhY19jdl9wcm9nX2NjX2M4OT1ub10sCgkgIFtfQUNfUFJPR19DQ19DOTkoW2FjX2N2X3Byb2dfY2Nfc3RkYz0kYWNfY3ZfcHJvZ19jY19jOTldLAoJICAgICBbX0FDX1BST0dfQ0NfQzg5KFthY19jdl9wcm9nX2NjX3N0ZGM9JGFjX2N2X3Byb2dfY2NfYzg5XSwKCQkJICAgICAgW2FjX2N2X3Byb2dfY2Nfc3RkYz1ub10pXSldKQogIEFDX01TR19DSEVDS0lORyhbZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBTdGFuZGFyZCBDXSkKICBBQ19DQUNIRV9WQUwoW2FjX2N2X3Byb2dfY2Nfc3RkY10sIFtdKQogIEFTX0NBU0UoWyRhY19jdl9wcm9nX2NjX3N0ZGNdLAogICAgW25vXSwgW0FDX01TR19SRVNVTFQoW3Vuc3VwcG9ydGVkXSldLAogICAgWycnXSwgW0FDX01TR19SRVNVTFQoW25vbmUgbmVlZGVkXSldLAoJICBbQUNfTVNHX1JFU1VMVChbJGFjX2N2X3Byb2dfY2Nfc3RkY10pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw4NDIKQUNfRlVOQ19DSE9XTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19UWVBFX1VJRF9UXSlkbmwKQUNfQ0hFQ0tfSEVBREVSUyh1bmlzdGQuaCkKQUNfQ0FDSEVfQ0hFQ0soW2ZvciB3b3JraW5nIGNob3duXSwgYWNfY3ZfZnVuY19jaG93bl93b3JrcywKW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbQUNfSU5DTFVERVNfREVGQVVMVAojaW5jbHVkZSA8ZmNudGwuaD4KXSwKW1sgIGNoYXIgKmYgPSAiY29uZnRlc3QuY2hvd24iOwogIHN0cnVjdCBzdGF0IGJlZm9yZSwgYWZ0ZXI7CgogIGlmIChjcmVhdCAoZiwgMDYwMCkgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKHN0YXQgKGYsICZiZWZvcmUpIDwgMCkKICAgIHJldHVybiAxOwogIGlmIChjaG93biAoZiwgKHVpZF90KSAtMSwgKGdpZF90KSAtMSkgPT0gLTEpCiAgICByZXR1cm4gMTsKICBpZiAoc3RhdCAoZiwgJmFmdGVyKSA8IDApCiAgICByZXR1cm4gMTsKICByZXR1cm4gISAoYmVmb3JlLnN0X3VpZCA9PSBhZnRlci5zdF91aWQgJiYgYmVmb3JlLnN0X2dpZCA9PSBhZnRlci5zdF9naWQpOwpdXSldLAoJICAgICAgIFthY19jdl9mdW5jX2Nob3duX3dvcmtzPXllc10sCgkgICAgICAgW2FjX2N2X2Z1bmNfY2hvd25fd29ya3M9bm9dLAoJICAgICAgIFthY19jdl9mdW5jX2Nob3duX3dvcmtzPW5vXSkKcm0gLWYgY29uZnRlc3QuY2hvd24KXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19jaG93bl93b3JrcyA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX0NIT1dOLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIHN5c3RlbSBoYXMgYSB3b3JraW5nIGBjaG93bicgZnVuY3Rpb24uXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwxMDcKbTRfbG9jYXRpb24oQUNfQ0FOT05JQ0FMX0hPU1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE4MTYKVDksMjgKX200X3F1b3RlbTRfaWYoWyQjXSwgWzBdLCBbXSwgW1skKl1dKQpUOSwwCkFVX0RFRklORQpUMjgsMTA3Cm00X2xvY2F0aW9uKEFDX0VHUkVQX0hFQURFUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjU1NwpUOCwxNzkKQUNfRVJST1JfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRVJST1InIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfTVNHX0VSUk9SXSwgW0FDX01TR19FUlJPUigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTA3Cm00X2xvY2F0aW9uKEFDX1RSWV9DT01NQU5EKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDYyClQ5LDE4NApBQ19TSVpFX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU0laRV9UJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1RZUEVfU0laRV9UXSwgW0FDX1RZUEVfU0laRV9UKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwyMTQKQUNfU0VUVkJVRl9SRVZFUlNFRF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TRVRWQlVGX1JFVkVSU0VEJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfU0VUVkJVRl9SRVZFUlNFRF0sIFtBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUQoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDYwOQpBQ19MQU5HX0lOVF9TQVZFKE9iamVjdGl2ZSBDKUFDX0xBTkdfUFJPR1JBTShbJDEKc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0Kc3RhdGljIHVuc2lnbmVkIGxvbmcgaW50IHVsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CkAlOkBpbmNsdWRlIDxzdGRpby5oPgpAJTpAaW5jbHVkZSA8c3RkbGliLmg+XSwKWwogIEZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0LnZhbCIsICJ3Iik7CiAgaWYgKCEgZikKICAgIHJldHVybiAxOwogIGlmICgoJDIpIDwgMCkKICAgIHsKICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CiAgICAgIGlmIChpICE9ICgkMikpCglyZXR1cm4gMTsKICAgICAgZnByaW50ZiAoZiwgIiVsZCIsIGkpOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwogICAgICBpZiAoaSAhPSAoJDIpKQoJcmV0dXJuIDE7CiAgICAgIGZwcmludGYgKGYsICIlbHUiLCBpKTsKICAgIH0KICAvKiBEbyBub3Qgb3V0cHV0IGEgdHJhaWxpbmcgbmV3bGluZSwgYXMgdGhpcyBjYXVzZXMgXHJcbiBjb25mdXNpb24KICAgICBvbiBzb21lIHBsYXRmb3Jtcy4gICovCiAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpUMjEsMTAzCm00X2xvY2F0aW9uKEFTX1RSX1NIKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE4MDgKVDI3LDEwMAptNF9sb2NhdGlvbihBQ19QUk9HX0NYWENQUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6NjM2ClQzMiwxMDUKbTRfbG9jYXRpb24oQUNfRVJMQU5HX0NIRUNLX0xJQikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2VybGFuZy5tNDoxNzUKVDE5LDE1MwpfQUNfQ09ORklHX1JFR0lTVEVSbTRfaWYoWyQxXSwgW0NPTU1BTkRTXSwKICAgICAgIFtdLAogICAgICAgW19BQ19DT05GSUdfREVQRU5ERU5DWShbJDFdLCBbJDJdKV0pX0FDX0NPTkZJR19SRUdJU1RFUl9ERVNUKFskMV0sIFskMl0sCiAgX0FDX0NPTkZJR19DT01QVVRFX0RFU1QoWyQyXSksIFskM10pClQyMSwyNDYKX0FDX0NIRUNLX0hFQURFUl9PTkNFX0FIX0NIRUNLX0hFQURFUihbJDFdKUFDX0RFRlVOKFtfQUNfSGVhZGVyX11tNF90cmFuc2xpdChbWyQxXV0sCiAgICBbLi8tXSwgW19fX10pLAogIFttNF9kaXZlcnRfdGV4dChbSU5JVF9QUkVQQVJFXSwgW0FTX1ZBUl9BUFBFTkQoW2FjX2hlYWRlcl9saXN0XSwgWyIgJDEiXSldKQpfQUNfSEVBREVSU19FWFBBTlNJT05dKUFDX1JFUVVJUkUoW19BQ19IZWFkZXJfXW00X3RyYW5zbGl0KFtbJDFdXSwKICAgIFsuLy1dLCBbX19fXSkpClQ4LDE4MQpBQ19XQUlUM19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19XQUlUMycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX1dBSVQzXSwgW0FDX0ZVTkNfV0FJVDMoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDI1MgpBQ19MQU5HKEMpYWNfZXh0PWMKYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiZBU19NRVNTQUdFX0xPR19GRCcKYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKClQxMCwxNDAKQUNfRkNfTUFJTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19GQ19MSUJSQVJZX0xERkxBR1NdKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX0FDX0ZDX01BSU4KQUNfTEFOR19QT1AoRm9ydHJhbilkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCwxMDMKbTRfbG9jYXRpb24oX0FDX0xBTkdfTlVMTF9QUk9HUkFNKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDoyNTcKVDI0LDEwNgptNF9sb2NhdGlvbihBQ19DWUdXSU4zMikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojg2ClQ5LDM1Cm00X3NoaWZ0bm00X2Fzc2VydCgwIDwgJDEgJiYgJDEgPCAkIylfJDAoJEApClQyNCwxMDAKbTRfbG9jYXRpb24oQUNfUFJPR19DUFApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjM4OApUMjMsMTAwCm00X2xvY2F0aW9uKEFDX1BST0dfQ0MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjQ0OApUNyw3NQptNF93YXJuX200X3dhcm4oWyQxXSwgWyQyXSwKbTRfaWZkZWYoW19tNF9leHBhbnNpb25fc3RhY2tdLCBbbTRfZXhwYW5zaW9uX3N0YWNrXSkpClQxNywxOTAKX0FDX1JFUExBQ0VfRlVOQ1NBU19MSVRFUkFMX0lGKFskMV0sClttNF9tYXBfYXJnc193KFskMV0sIFtfQUNfUkVQTEFDRV9GVU5DKF0sIFspCl0pXSwKW0FDX0NIRUNLX0ZVTkNTKFskMV0sCiAgW19BSF9DSEVDS19GVU5DKFskYWNfZnVuY10pQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kYWNfZnVuY10pKV0sCiAgW19BQ19MSUJPQkooWyRhY19mdW5jXSldKV0pClQxOSw1OTcKX0FDX0NPTVBJTEVSX09CSkVYVEFDX0NBQ0hFX0NIRUNLKFtmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlc10sIGFjX2N2X29iamV4dCwKW0FDX0xBTkdfQ09ORlRFU1QoW19BQ19MQU5HX05VTExfUFJPR1JBTV0pCnJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCkFTX0lGKFtfQUNfRE9fVkFSKGFjX2NvbXBpbGUpXSwKW2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCiAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOwogIGNhc2UgJGFjX2ZpbGUgaW4KICAgIF9BQ19DT01QSUxFUl9PQkpFWFRfUkVKRUNUICkgOzsKICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAogICAgICAgYnJlYWs7OwogIGVzYWMKZG9uZV0sCiAgICAgIFtfQUNfTVNHX0xPR19DT05GVEVTVApBQ19NU0dfRkFJTFVSRShbY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIG9iamVjdCBmaWxlczogY2Fubm90IGNvbXBpbGVdKV0pCnJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dF0pCkFDX1NVQlNUKFtPQkpFWFRdLCBbJGFjX2N2X29iamV4dF0pZG5sCmFjX29iamV4dD0kT0JKRVhUCgpUMTQsNApfQUNfQ0MoRXJsYW5nKUVSTEMKVDEzLDQzOQpBQ19DSEVDS19GVU5DX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkVfU0hFTExfRk4oW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX2Z1bmNdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfY2hlY2tfZnVuY10sCiAgICBbTElORU5PIEZVTkMgVkFSXSwKICAgIFtUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHldKV0sCiAgW18kMF9CT0RZXSlBU19WQVJfUFVTSERFRihbYWNfdmFyXSwgW2FjX2N2X2Z1bmNfJDFdKWFjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY2hlY2tfZnVuYyAiJExJTkVOTyIgIiQxIiAiYWNfdmFyIgpBU19WQVJfSUYoW2FjX3Zhcl0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY192YXJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMTgwCl9BQ19MSU5LRVJfT1BUSU9OX200X2RlZnVuX3BybyhbJDBdKWlmIHRlc3QgIiRhY19jb21waWxlcl9nbnUiID0geWVzOyB0aGVuCiAgZm9yIGFjX2xpbmtfb3B0IGluICQxOyBkbwogICAgJDI9IlskXSQyIC1YbGlua2VyICRhY19saW5rX29wdCIKICBkb25lCmVsc2UKICAkMj0iWyRdJDIgJDEiCmZpW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxMTAKQUNfQ0hFQ0tfTUVNQkVSU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc19zZXAoW0FDX0NIRUNLX01FTUJFUihfJDAoXSwgWylbCiQyXSwgWyQzXSwgWyQ0XSldLCBbXSwgJDEpW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9NQlNUQVRFX1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo1NTkKVDMxLDEwNgptNF9sb2NhdGlvbihBQ19PVVRQVVRfQ09NTUFORFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTAyOApUMTYsMjQ1Cm00X2NyX25vdF9kaWdpdHMBAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyolJicoKSQrLC4vOjs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMjUsNjQKQUNfTEFOR19DT01QSUxFUihGb3J0cmFuKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0ZDXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDIyNwpBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRURfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwKW1RoZSBtYWNybyBgJDAnIGlzIG9ic29sZXRlLiAgUmVtb3ZlIGl0IGFuZCBhbGwgcmVmZXJlbmNlcyB0byBTRVRWQlVGX1JFVkVSU0VELl0pZG5sCkFDX0NBQ0hFX1ZBTChbYWNfY3ZfZnVuY19zZXR2YnVmX3JldmVyc2VkXSwgW2FjX2N2X2Z1bmNfc2V0dmJ1Zl9yZXZlcnNlZD1ub10pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMjUKbTRfc2V0X2xpc3RjbTRfc2V0X21hcF9zZXAoWyQxXSwgWyxdKQpUMjcsMTA5Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RSVE9EKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE1NDkKVDIxLDEwNgptNF9sb2NhdGlvbihBQ19FUlJPUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjM0ClQxOSw1ODQKX0FDX0lOSVRfQ09ORklHX0xPR200X2RpdmVydF90ZXh0KFtJTklUX1BSRVBBUkVdLApbbTRfZGVmaW5lKFtBU19NRVNTQUdFX0xPR19GRF0sIDUpZG5sCmNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgpUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQpydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgoKSXQgd2FzIGNyZWF0ZWQgYnkgbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSlkbmwKJGFzX21lW11tNF9pZnNldChbQUNfUEFDS0FHRV9WRVJTSU9OXSwgWyBBQ19QQUNLQUdFX1ZFUlNJT05dKSwgd2hpY2ggd2FzCmdlbmVyYXRlZCBieSBtNF9QQUNLQUdFX1NUUklORy4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwoKICAkICRbMF0gJFtAXQoKX0FDRU9GCmV4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKQVNfVU5BTUUgPiZBU19NRVNTQUdFX0xPR19GRAoKY2F0ID4mQVNfTUVTU0FHRV9MT0dfRkQgPDxfQUNFT0YKCgptNF90ZXh0X2JveChbQ29yZSB0ZXN0cy5dKQoKX0FDRU9GCl0pCkY5LDYKbTRfZGl2bnVtZGl2bnVtClQxMyw2NDAKX0FDX0ZVTkNfU1RBVEFDX1JFUVVJUkUoW0FDX0ZVTkNfTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTktdKWRubApBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkMSBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZ10sCgkgICAgICAgW2FjX2N2X2Z1bmNfJDFfZW1wdHlfc3RyaW5nX2J1Z10sCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLApbW3N0cnVjdCBzdGF0IHNidWY7CiAgcmV0dXJuICQxICgiIiwgJnNidWYpID09IDA7XV0pXSwKCSAgICBbYWNfY3ZfZnVuY18kMV9lbXB0eV9zdHJpbmdfYnVnPW5vXSwKCSAgICBbYWNfY3ZfZnVuY18kMV9lbXB0eV9zdHJpbmdfYnVnPXllc10sCgkgICAgW2FjX2N2X2Z1bmNfJDFfZW1wdHlfc3RyaW5nX2J1Zz15ZXNdKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfJDFfZW1wdHlfc3RyaW5nX2J1ZyA9IHllczsgdGhlbgogIEFDX0xJQk9CSihbJDFdKQogIEFDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoW0hBVkVfJDFfRU1QVFlfU1RSSU5HX0JVR10pLCAxLAoJCSAgICAgW0RlZmluZSB0byAxIGlmIGAkMScgaGFzIHRoZSBidWcgdGhhdCBpdCBzdWNjZWVkcyB3aGVuCgkJICAgICAgZ2l2ZW4gdGhlIHplcm8tbGVuZ3RoIGZpbGUgbmFtZSBhcmd1bWVudC5dKQpmaQoKVDMwLDEwMwptNF9sb2NhdGlvbihBU19JTklUX0dFTkVSQVRFRCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoyMTAzClQyMSwyMTAKQU1fRlVOQ19FUlJPUl9BVF9MSU5FX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFNX0ZVTkNfRVJST1JfQVRfTElORScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX0VSUk9SX0FUX0xJTkVdLCBbQUNfRlVOQ19FUlJPUl9BVF9MSU5FKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCwxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19DTE9TRURJUl9WT0lEKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjQ2NApUMjEsNzYKX200X3NldF9hZGRfYWxsX2NoZWNrbTRfaWYoWyQjXSwgWzJdLCBbXSwKICAgICAgIFttNF9zZXRfYWRkKFskMV0sIFskM10pJDAoWyQxXSwgbTRfc2hpZnQyKCRAKSldKQpUMjQsNzY3OQpfQUNfT1VUUFVUX0NPTkZJR19TVEFUVVNBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkQ09ORklHX1NUQVRVU10pCmRubCBBU19NRVNTQUdFX0xPR19GRCBpcyBub3QgYXZhaWxhYmxlIHlldDoKbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKUFTX0lOSVRfR0VORVJBVEVEKFskQ09ORklHX1NUQVRVU10sClsjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwojIGNvbmZpZ3VyZSwgaXMgaW4gY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCgpkZWJ1Zz1mYWxzZQphY19jc19yZWNoZWNrPWZhbHNlCmFjX2NzX3NpbGVudD1mYWxzZQpdKSB8fCBhY193cml0ZV9mYWlsPTEKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKWyNdIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bwojIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KYWNfbG9nPSIKVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBtNF9pZnNldChbQUNfUEFDS0FHRV9OQU1FXSwgW0FDX1BBQ0tBR0VfTkFNRSBdKWRubAokYXNfbWVbXW00X2lmc2V0KFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbIEFDX1BBQ0tBR0VfVkVSU0lPTl0pLCB3aGljaCB3YXMKZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCgogIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCiAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUwogICQgJFswXSAkW0BdCgpvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKIgoKX0FDRU9GCgpkbmwgcmVtb3ZlIGFueSBuZXdsaW5lcyBmcm9tIHRoZXNlIHZhcmlhYmxlcy4KbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhGSUxFUyldLApbY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCiIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSRbKl07Owplc2FjCl0pCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLApbY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSRbKl07Owplc2FjCl0pCgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKIyBGaWxlcyB0aGF0IGNvbmZpZy5zdGF0dXMgd2FzIG1hZGUgZm9yLgptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEZJTEVTKV0sCltjb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCl0pZG5sCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLApbY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKXSlkbmwKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhMSU5LUyldLApbY29uZmlnX2xpbmtzPSIkYWNfY29uZmlnX2xpbmtzIgpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKENPTU1BTkRTKV0sCltjb25maWdfY29tbWFuZHM9IiRhY19jb25maWdfY29tbWFuZHMiCl0pZG5sCgpfQUNFT0YKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKYWNfY3NfdXNhZ2U9IlwKXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBhY3Rpb25zCmZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiAgVW5sZXNzIHRoZSBmaWxlcwphbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCgpVc2FnZTogJFswXSBbW09QVElPTl1dLi4uIFtbVEFHXV0uLi4KCiAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAogIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAogICAgICAtLWNvbmZpZyAgICAgcHJpbnQgY29uZmlndXJhdGlvbiwgdGhlbiBleGl0CiAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CltdICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcwogIC1kLCAtLWRlYnVnICAgICAgZG9uJ3QgcmVtb3ZlIHRlbXBvcmFyeSBmaWxlcwogICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhGSUxFUyldLAogIFtBU19IRUxQX1NUUklORyhbWyAgICAtLWZpbGU9RklMRVs6VEVNUExBVEVdXV0sCiAgICBbaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBGSUxFXSwgWyAgICAgICAgICAgICAgICAgICBdKQpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwKICBbQVNfSEVMUF9TVFJJTkcoW1sgICAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdXV0sCiAgICBbaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEVdLCBbICAgICAgICAgICAgICAgICAgIF0pCl0pZG5sCgptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEZJTEVTKV0sCltDb25maWd1cmF0aW9uIGZpbGVzOgokY29uZmlnX2ZpbGVzCgpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwKW0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKJGNvbmZpZ19oZWFkZXJzCgpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKExJTktTKV0sCltDb25maWd1cmF0aW9uIGxpbmtzOgokY29uZmlnX2xpbmtzCgpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKENPTU1BTkRTKV0sCltDb25maWd1cmF0aW9uIGNvbW1hbmRzOgokY29uZmlnX2NvbW1hbmRzCgpdKWRubApSZXBvcnQgYnVncyB0byBtNF9pZnNldChbQUNfUEFDS0FHRV9CVUdSRVBPUlRdLCBbPEFDX1BBQ0tBR0VfQlVHUkVQT1JUPl0sCiAgW3RoZSBwYWNrYWdlIHByb3ZpZGVyXSkuZG5sCm00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCBbbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVVJMXSwgWwpBQ19QQUNLQUdFX05BTUUgaG9tZSBwYWdlOiA8QUNfUEFDS0FHRV9VUkw+Ll0pZG5sCm00X2lmKG00X2luZGV4KG00X2RlZm4oW0FDX1BBQ0tBR0VfTkFNRV0pLCBbR05VIF0pLCBbMF0sIFsKR2VuZXJhbCBoZWxwIHVzaW5nIEdOVSBzb2Z0d2FyZTogPGh0dHA6Ly93d3cuZ251Lm9yZy9nZXRoZWxwLz4uXSldKSIKCl9BQ0VPRgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKYWNfY3NfY29uZmlnPSJgQVNfRUNITyhbIiRhY19jb25maWd1cmVfYXJncyJdKSB8IHNlZCAncy9eIC8vOyBzL1tbXFwiIlxgXCRdXS9cXFxcJi9nJ2AiCmFjX2NzX3ZlcnNpb249IlxcCm00X2lmc2V0KFtBQ19QQUNLQUdFX05BTUVdLCBbQUNfUEFDS0FHRV9OQU1FIF0pY29uZmlnLnN0YXR1c1tdZG5sCm00X2lmc2V0KFtBQ19QQUNLQUdFX1ZFUlNJT05dLCBbIEFDX1BBQ0tBR0VfVkVSU0lPTl0pCmNvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLAogIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgoKQ29weXJpZ2h0IChDKSBtNF9QQUNLQUdFX1lFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgpnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgoKYWNfcHdkPSckYWNfcHdkJwpzcmNkaXI9JyRzcmNkaXInCkFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0lOU1RBTExdLApbSU5TVEFMTD0nJElOU1RBTEwnCl0pZG5sCkFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX01LRElSX1BdLApbTUtESVJfUD0nJE1LRElSX1AnCl0pZG5sCkFDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0FXS10sCltBV0s9JyRBV0snCl0pZG5sCnRlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCl9BQ0VPRgoKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQojIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCmFjX25lZWRfZGVmYXVsdHM9Ogp3aGlsZSB0ZXN0ICRbI10gIT0gMApkbwogIGNhc2UgJFsxXSBpbgogIC0tKj0/KikKICAgIGFjX29wdGlvbj1gZXhwciAiWCRbMV0iIDogJ1hcKFtbXj1dXSpcKT0nYAogICAgYWNfb3B0YXJnPWBleHByICJYJFsxXSIgOiAnWFtbXj1dXSo9XCguKlwpJ2AKICAgIGFjX3NoaWZ0PToKICAgIDs7CiAgLS0qPSkKICAgIGFjX29wdGlvbj1gZXhwciAiWCRbMV0iIDogJ1hcKFtbXj1dXSpcKT0nYAogICAgYWNfb3B0YXJnPQogICAgYWNfc2hpZnQ9OgogICAgOzsKICAqKQogICAgYWNfb3B0aW9uPSRbMV0KICAgIGFjX29wdGFyZz0kWzJdCiAgICBhY19zaGlmdD1zaGlmdAogICAgOzsKICBlc2FjCgogIGNhc2UgJGFjX29wdGlvbiBpbgogICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCiAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCiAgICBhY19jc19yZWNoZWNrPTogOzsKICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCiAgICBBU19FQ0hPKFsiJGFjX2NzX3ZlcnNpb24iXSk7IGV4aXQgOzsKICAtLWNvbmZpZyB8IC0tY29uZmkgfCAtLWNvbmYgfCAtLWNvbiB8IC0tY28gfCAtLWMgKQogICAgQVNfRUNITyhbIiRhY19jc19jb25maWciXSk7IGV4aXQgOzsKICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQogICAgZGVidWc9OiA7OwptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEZJTEVTKV0sIFtkbmwKICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQogICAgJGFjX3NoaWZ0CiAgICBjYXNlICRhY19vcHRhcmcgaW4KICAgICpcJyopIGFjX29wdGFyZz1gQVNfRUNITyhbIiRhY19vcHRhcmciXSkgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKICAgICcnKSBBQ19NU0dfRVJST1IoW21pc3NpbmcgZmlsZSBhcmd1bWVudF0pIDs7CiAgICBlc2FjCiAgICBBU19WQVJfQVBQRU5EKFtDT05GSUdfRklMRVNdLCBbIiAnJGFjX29wdGFyZyciXSkKICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwgW2RubAogIC0taGVhZGVyIHwgLS1oZWFkZSB8IC0taGVhZCB8IC0taGVhICkKICAgICRhY19zaGlmdAogICAgY2FzZSAkYWNfb3B0YXJnIGluCiAgICAqXCcqKSBhY19vcHRhcmc9YEFTX0VDSE8oWyIkYWNfb3B0YXJnIl0pIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CiAgICBlc2FjCiAgICBBU19WQVJfQVBQRU5EKFtDT05GSUdfSEVBREVSU10sIFsiICckYWNfb3B0YXJnJyJdKQogICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CiAgLS1oZSB8IC0taCkKICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCiAgICBBQ19NU0dfRVJST1IoW2FtYmlndW91cyBvcHRpb246IGAkWzFdJwpUcnkgYCRbMF0gLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5dKTs7Cl0sIFsgIC0taGUgfCAtLWggfF0pZG5sCiAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCiAgICBBU19FQ0hPKFsiJGFjX2NzX3VzYWdlIl0pOyBleGl0IDs7CiAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCiAgICBhY19jc19zaWxlbnQ9OiA7OwoKICAjIFRoaXMgaXMgYW4gZXJyb3IuCiAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogYCRbMV0nClRyeSBgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CgogICopIEFTX1ZBUl9BUFBFTkQoW2FjX2NvbmZpZ190YXJnZXRzXSwgWyIgJFsxXSJdKQogICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKCiAgZXNhYwogIHNoaWZ0CmRvbmUKCmFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPQoKaWYgJGFjX2NzX3NpbGVudDsgdGhlbgogIGV4ZWMgQVNfTUVTU0FHRV9GRD4vZGV2L251bGwKICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgpmaQoKX0FDRU9GCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQpkbmwgQ2hlY2sgdGhpcyBiZWZvcmUgb3BlbmluZyB0aGUgbG9nLCB0byBhdm9pZCBhIGJ1ZyBvbiBNaW5HVywKZG5sIHdoaWNoIHByb2hpYml0cyB0aGUgcmVjdXJzaXZlIGluc3RhbmNlIGZyb20gdHJ1bmNhdGluZyBhbiBvcGVuIGxvZy4KaWYgXCRhY19jc19yZWNoZWNrOyB0aGVuCiAgc2V0IFggJyRTSEVMTCcgJyRbMF0nICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCiAgc2hpZnQKICBcQVNfRUNITyhbInJ1bm5pbmcgQ09ORklHX1NIRUxMPSRTSEVMTCBcJFsqXSJdKSA+JkFTX01FU1NBR0VfRkQKICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKICBleHBvcnQgQ09ORklHX1NIRUxMCiAgZXhlYyAiXCRbQF0iCmZpCgpfQUNFT0YKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQpkbmwgT3BlbiB0aGUgbG9nOgptNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlkbmwKZXhlYyBBU19NRVNTQUdFX0xPR19GRD4+Y29uZmlnLmxvZwp7CiAgZWNobwogIEFTX0JPWChbUnVubmluZyAkYXNfbWUuXSkKICBBU19FQ0hPKFsiJGFjX2xvZyJdKQp9ID4mQVNfTUVTU0FHRV9MT0dfRkQKCl9BQ0VPRgpjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKbTRfaWZkZWYoW19BQ19PVVRQVVRfQ09NTUFORFNfSU5JVF0sClsjCiMgSU5JVC1DT01NQU5EUwojCl9BQ19PVVRQVVRfQ09NTUFORFNfSU5JVApdKWRubApfQUNFT0YKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKCiMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgpmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKZG8KICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCm00X2lmZGVmKFtfQUNfTElTVF9UQUdTXSwgW19BQ19MSVNUX1RBR1NdKQogICopIEFDX01TR19FUlJPUihbaW52YWxpZCBhcmd1bWVudDogYCRhY19jb25maWdfdGFyZ2V0J10pOzsKICBlc2FjCmRvbmUKCm00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoQU5ZKV0sIFtfQUNfT1VUUFVUX01BSU5fTE9PUF0pW11kbmwKCkFTX0VYSVQoMCkKX0FDRU9GCgpUMTAsMTUwCkFDX0ZDX0ZVTkNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbX0FDX0ZDX05BTUVfTUFOR0xJTkddKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX0FDX0ZDX0ZVTkMoWyQxXSxbJDJdKQpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDY1NgpBQ19UWVBFX1VJTlRQVFJfVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DSEVDS19UWVBFKFt1aW50cHRyX3RdLAogICAgW0FDX0RFRklORShbSEFWRV9VSU5UUFRSX1RdLCAxLAogICAgICAgW0RlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1aW50cHRyX3QnLl0pXSwKICAgIFtmb3IgYWNfdHlwZSBpbiAndW5zaWduZWQgaW50JyAndW5zaWduZWQgbG9uZyBpbnQnIFwKCSd1bnNpZ25lZCBsb25nIGxvbmcgaW50JzsgZG8KICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAoJIFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoCgkgICAgW0FDX0lOQ0xVREVTX0RFRkFVTFRdLAoJICAgIFtbc2l6ZW9mICh2b2lkICopIDw9IHNpemVvZiAoJGFjX3R5cGUpXV0pXSwKCSBbQUNfREVGSU5FX1VOUVVPVEVEKFt1aW50cHRyX3RdLCBbJGFjX3R5cGVdLAoJICAgIFtEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIHdpZGUgZW5vdWdoIHRvCgkgICAgIGhvbGQgYSBwb2ludGVyLCBpZiBzdWNoIGEgdHlwZSBleGlzdHMsIGFuZCBpZiB0aGUgc3lzdGVtCgkgICAgIGRvZXMgbm90IGRlZmluZSBpdC5dKQoJICBhY190eXBlPV0pCiAgICAgICB0ZXN0IC16ICIkYWNfdHlwZSIgJiYgYnJlYWsKICAgICBkb25lXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwxMDcKbTRfbG9jYXRpb24oQUNfQ0FDSEVfVkFMKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDMyClQzMSw0NDMKX0FDX1NZU19MQVJHRUZJTEVfVEVTVF9JTkNMVURFU0AlOkBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgogICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAogICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycwogICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLwpAJTpAZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKICBpbnQgb2ZmX3RfaXNfbGFyZ2VbWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCgkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQoJCSAgICAgID8gMSA6IC0xXV07W11kbmwKClQyNCw5NgpfQUNfUEFUSF9QUk9HX0ZMQVZPUl9HTlUjIENoZWNrIGZvciBHTlUgJDEKY2FzZSBgIiQxIiAtLXZlcnNpb24gMj4mMWAgaW4KKkdOVSopCiAgJDI7OwptNF9pZnZhbChbJDNdLApbKikKICAkMzs7Cl0pZXNhYwoKVDIyLDIKQUNfTEFOR19TT1VSQ0UoRXJsYW5nKSQxClQyNiw5NgpBQ19ESVNBQkxFX09QVElPTl9DSEVDS0lOR19tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfb25jZShbREVGQVVMVFNdLCBbZW5hYmxlX29wdGlvbl9jaGVja2luZz1ub10pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjMsMTA3Cm00X2xvY2F0aW9uKF9BQ19ET19WQVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIzOTYKVDM0LDAKbTRfaW5jbHVkZShhdXRvY29uZi9hdXRvaGVhZGVyLm00KQpUMjQsMQpfbTRfZGl2ZXJ0KE00U0gtSU5JVC1GTik1ClQxMCw5MQpBU19WQVJfU0VUQVNfTElURVJBTF9XT1JEX0lGKFskMV0sCgkgICAgICAgWyQxPSQyXSwKCSAgICAgICBbZXZhbCAiJDE9X0FTX0VTQ0FQRShbJDJdLCBbYF0sIFtcIiRdKSJdKQpUMTAsMwptNF9uZXdsaW5lCiQxClQyOCwxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19QUk9HUkFNKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDoyNDIKVDE1LDc3Cl9BQ19MQU5HX1BSRUZJWF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNyw5NQpBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoT2JqZWN0aXZlIEMpQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDAKXSkKVDIxLDM4MwpBQ19DSEVDS19UQVJHRVRfVE9PTFNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX1RBUkdFVF0pZG5sCmZvciBhY19wcm9nIGluICQyCmRvCiAgQUNfQ0hFQ0tfUFJPRyhbJDFdLAoJCVskdGFyZ2V0X2FsaWFzLSRhY19wcm9nXSwgWyR0YXJnZXRfYWxpYXMtJGFjX3Byb2ddLCwKCQlbJDRdKQogIHRlc3QgLW4gIiQkMSIgJiYgYnJlYWsKZG9uZQppZiB0ZXN0IC16ICIkJDEiOyB0aGVuCiAgaWYgdGVzdCAiJGJ1aWxkIiA9ICIkdGFyZ2V0IjsgdGhlbgogICAgYWNfY3RfJDE9JCQxCiAgICBBQ19DSEVDS19QUk9HUyhbYWNfY3RfJDFdLCBbJDJdLCBbJDNdLCBbJDRdKQogICAgJDE9JGFjX2N0XyQxCiAgZWxzZQogICAgJDE9IiQzIgogIGZpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMjkzCm00X2RlZnVuX29uY2VtNF9kZWZpbmUoW200X2xvY2F0aW9uKCQxKV0sIG00X2xvY2F0aW9uKW00X2RlZmluZShbJDFdLCBbX200X2RlZnVuX29uY2UoWyQxXSwgWyQyXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oWyQxXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbJDFdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbJDFdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFskMV0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSldKQpUMTMsNDc0Cl9tNF90ZXh0X3dyYXBtNF9wdXNoZGVmKFttNF9JbmRlbnRdLCBtNF9xbGVuKFskMl0pKW00X3B1c2hkZWYoW200X0N1cnNvcl0sIG00X3FsZW4oWyQzXSkpbTRfcHVzaGRlZihbbTRfU2VwYXJhdG9yXSwgW200X2RlZmluZShbbTRfU2VwYXJhdG9yXSwgWyBdKV0pWyQzXW00X2NvbmQoW200X0N1cnNvcl0sIG00X0luZGVudCwgW10sCgkgICAgICBbbTRfZXZhbChtNF9DdXJzb3IgPiBtNF9JbmRlbnQpXSwgWzFdLCBbClskMl1tNF9kZWZpbmUoW200X0N1cnNvcl0sIG00X0luZGVudCldLAoJICAgICAgW200X2Zvcm1hdChbJSpzXSwgbTRfbWF4KFswXSwKICBtNF9ldmFsKG00X0luZGVudCAtIG00X0N1cnNvcikpLCBbXSltNF9kZWZpbmUoW200X0N1cnNvcl0sIG00X0luZGVudCldKW00X21hcF9hcmdzX3coWyQxXSwgWyQwX3dvcmQoXSwgWywgWyQyXSwgWyQ0XSldKV9tNF9wb3BkZWYoW200X1NlcGFyYXRvcl0sIFttNF9DdXJzb3JdLCBbbTRfSW5kZW50XSkKVDIwLDQ1MzgKX0FDX09VVFBVVF9NQUlOX0xPT1BfbTRfZGVmdW5fcHJvKFskMF0pCiMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKIyB0aGVuIHRoZSBlbnZ2YXIgaW50ZXJmYWNlIGlzIHVzZWQuICBTZXQgb25seSB0aG9zZSB0aGF0IGFyZSBub3QuCiMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KaWYgJGFjX25lZWRfZGVmYXVsdHM7IHRoZW4KbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhGSUxFUyldLApbICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwKWyAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKXSlkbmwKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhMSU5LUyldLApbICB0ZXN0ICIke0NPTkZJR19MSU5LUytzZXR9IiA9IHNldCB8fCBDT05GSUdfTElOS1M9JGNvbmZpZ19saW5rcwpdKWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKENPTU1BTkRTKV0sClsgIHRlc3QgIiR7Q09ORklHX0NPTU1BTkRTK3NldH0iID0gc2V0IHx8IENPTkZJR19DT01NQU5EUz0kY29uZmlnX2NvbW1hbmRzCl0pZG5sCmZpCgojIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKIyBzaW1wbHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWFzb24gYWdhaW5zdCBoYXZpbmcgaXQgaGVyZSwgYW5kIGluIGFkZGl0aW9uLAojIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCiMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KIyBOb3RlIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgaW4gd2hpY2ggdGhlIGRpcmVjdG9yeSB3aWxsIG5vdCBiZSBjbGVhbmVkOgojIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KZG5sIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIEFTX1RNUERJUiBtdXN0IGNvbnRpbnVlIHRvIHBsYWNlIHRoZSByZXN1bHRzCmRubCBpbiAkdG1wOyBidXQgd2Ugc3dhcCB0byB0aGUgbmFtZXNwYWNlLWNsZWFuICRhY190bXAgdG8gYXZvaWQgaXNzdWVzCmRubCB3aXRoIGFueSBDT05GSUdfQ09NTUFORFMgcGxheWluZyB3aXRoIHRoZSBjb21tb24gdmFyaWFibGUgbmFtZSAkdG1wLgokZGVidWcgfHwKewogIHRtcD0gYWNfdG1wPQogIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CiAgOiAiJHthY190bXA6PSR0bXB9IgogIHsgdGVzdCAhIC1kICIkYWNfdG1wIiB8fCBybSAtZnIgIiRhY190bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCicgMAogIHRyYXAgJ0FTX0VYSVQoWzFdKScgMSAyIDEzIDE1Cn0KZG5sIFRoZSBjb21tZW50IGFib3ZlIEFTX1RNUERJUiBzYXlzIGF0IG1vc3QgNCBjaGFycyBhcmUgYWxsb3dlZC4KQVNfVE1QRElSKFtjb25mXSwgWy5dKQphY190bXA9JHRtcAoKbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhGSUxFUyldLCBbX0FDX09VVFBVVF9GSUxFU19QUkVQQVJFXSlbXWRubAptNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwgW19BQ19PVVRQVVRfSEVBREVSU19QUkVQQVJFXSlbXWRubAoKZXZhbCBzZXQgWCAiZG5sCiAgbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhGSUxFUyldLCAgICBbOkYgJENPTkZJR19GSUxFU10pW11kbmwKICBtNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEhFQURFUlMpXSwgIFs6SCAkQ09ORklHX0hFQURFUlNdKVtdZG5sCiAgbTRfaWZkZWYoW19BQ19TRUVOX0NPTkZJRyhMSU5LUyldLCAgICBbOkwgJENPTkZJR19MSU5LU10pW11kbmwKICBtNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKENPTU1BTkRTKV0sIFs6QyAkQ09ORklHX0NPTU1BTkRTXSlbXWRubAoiCnNoaWZ0CmZvciBhY190YWcKZG8KICBjYXNlICRhY190YWcgaW4KICA6W1tGSExDXV0pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwogIGVzYWMKICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgogIDpbW0ZITF1dKjoqKTs7CiAgOkwqIHwgOkMqOiopIEFDX01TR19FUlJPUihbaW52YWxpZCB0YWcgYCRhY190YWcnXSk7OwogIDpbW0ZIXV0tKSBhY190YWc9LTotOzsKICA6W1tGSF1dKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CiAgZXNhYwogIGFjX3NhdmVfSUZTPSRJRlMKICBJRlM9OgogIHNldCB4ICRhY190YWcKICBJRlM9JGFjX3NhdmVfSUZTCiAgc2hpZnQKICBhY19maWxlPSRbMV0KICBzaGlmdAoKICBjYXNlICRhY19tb2RlIGluCiAgOkwpIGFjX3NvdXJjZT0kWzFdOzsKICA6W1tGSF1dKQogICAgYWNfZmlsZV9pbnB1dHM9CiAgICBmb3IgYWNfZgogICAgZG8KICAgICAgY2FzZSAkYWNfZiBpbgogICAgICAtKSBhY19mPSIkYWNfdG1wL3N0ZGluIjs7CiAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCgkgIyAoaWYgdGhlIHBhdGggaXMgbm90IGFic29sdXRlKS4gIFRoZSBhYnNvbHV0ZSBwYXRoIGNhbm5vdCBiZSBET1Mtc3R5bGUsCgkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KCSB0ZXN0IC1mICIkYWNfZiIgfHwKCSAgIGNhc2UgJGFjX2YgaW4KCSAgIFtbXFwvJF1dKikgZmFsc2U7OwoJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OwoJICAgZXNhYyB8fAoJICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiBgJGFjX2YnXSwgWzFdKTs7CiAgICAgIGVzYWMKICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWBBU19FQ0hPKFsiJGFjX2YiXSkgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCiAgICAgIEFTX1ZBUl9BUFBFTkQoW2FjX2ZpbGVfaW5wdXRzXSwgWyIgJyRhY19mJyJdKQogICAgZG9uZQoKICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CiAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CiAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLwogICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAoJICBBU19FQ0hPKFsiJFsqXSJdKSB8IHNlZCBbJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJ10KCWAnIGJ5IGNvbmZpZ3VyZS4nCiAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCiAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgogICAgICBBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkYWNfZmlsZV0pCiAgICBmaQogICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KICAgIGNhc2UgJGNvbmZpZ3VyZV9pbnB1dCBpbiAjKAogICAgKlwmKiB8ICpcfCogfCAqXFwqICkKICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWBBU19FQ0hPKFsiJGNvbmZpZ3VyZV9pbnB1dCJdKSB8CiAgICAgICBzZWQgJ3MvW1tcXFxcJnxdXS9cXFxcJi9nJ2A7OyAjKAogICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CiAgICBlc2FjCgogICAgY2FzZSAkYWNfdGFnIGluCiAgICAqOi06KiB8ICo6LSkgY2F0ID4iJGFjX3RtcC9zdGRpbiIgXAogICAgICB8fCBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGVdKSA7OwogICAgZXNhYwogICAgOzsKICBlc2FjCgogIGFjX2Rpcj1gQVNfRElSTkFNRShbIiRhY19maWxlIl0pYAogIEFTX01LRElSX1AoWyIkYWNfZGlyIl0pCiAgX0FDX1NSQ0RJUlMoWyIkYWNfZGlyIl0pCgogIGNhc2UgJGFjX21vZGUgaW4KICBtNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKEZJTEVTKV0sICAgIFs6RilfQUNfT1VUUFVUX0ZJTEUgOztdKQogIG00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoSEVBREVSUyldLCAgWzpIKV9BQ19PVVRQVVRfSEVBREVSIDs7XSkKICBtNF9pZmRlZihbX0FDX1NFRU5fQ09ORklHKExJTktTKV0sICAgIFs6TClfQUNfT1VUUFVUX0xJTksgOztdKQogIG00X2lmZGVmKFtfQUNfU0VFTl9DT05GSUcoQ09NTUFORFMpXSwgWzpDKV9BQ19PVVRQVVRfQ09NTUFORCA7O10pCiAgZXNhYwoKZG5sIFNvbWUgc2hlbGxzIGRvbid0IGxpa2UgZW1wdHkgY2FzZS9lc2FjCm00X2lmZGVmKFtfQUNfTElTVF9UQUdfQ09NTUFORFNdLCBbCiAgY2FzZSAkYWNfZmlsZSRhY19tb2RlIGluCl9BQ19MSVNUX1RBR19DT01NQU5EUwogIGVzYWMKXSlkbmwKZG9uZSAjIGZvciBhY190YWcKCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjEsMzQyCl9BU19CT1VSTkVfQ09NUEFUSUJMRUFTX0lGKFt0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjFdLAogW2VtdWxhdGUgc2gKICBOVUxMQ01EPToKICBbI10gUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkW0BdIn0sIHdoaWNoCiAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KICBhbGlhcyAtZyAnJHsxKyIkW0BdIn0nPSciJFtAXSInCiAgc2V0b3B0IE5PX0dMT0JfU1VCU1RdLAogW0FTX0NBU0UoW2Aoc2V0IC1vKSAyPi9kZXYvbnVsbGBdLCBbKnBvc2l4Kl0sIFtzZXQgLW8gcG9zaXhdKV0pCgpUMTMsMTc3Cl9BQ19UT09MX1dBUk5fbTRfZGVmdW5fcHJvKFskMF0pY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgp5ZXM6KQpBQ19NU0dfV0FSTihbdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0XSkKYWNfdG9vbF93YXJuZWQ9eWVzIDs7CmVzYWNbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDUzMjQKX0FDX0lOSVRfSEVMUG00X2RpdmVydF9wdXNoKFtIRUxQX0JFR0lOXSlkbmwKCiMKIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgojCmlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCiAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCiAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgogIGNhdCA8PF9BQ0VPRgpcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBtNF9pZnNldChbQUNfUEFDS0FHRV9TVFJJTkddLAoJCQlbQUNfUEFDS0FHRV9TVFJJTkddLAoJCQlbdGhpcyBwYWNrYWdlXSkgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgoKVXNhZ2U6ICRbMF0gW1tPUFRJT05dXS4uLiBbW1ZBUj1WQUxVRV1dLi4uCgpbVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcwpWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgoKRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCgpDb25maWd1cmF0aW9uOgogIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CiAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQogICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcwogIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAogIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCiAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwogICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQoKSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgpdQVNfSEVMUF9TVFJJTkcoWy0tcHJlZml4PVBSRUZJWF0sCiAgW2luc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWCBbJGFjX2RlZmF1bHRfcHJlZml4XV0pCkFTX0hFTFBfU1RSSU5HKFstLWV4ZWMtcHJlZml4PUVQUkVGSVhdLAogIFtpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWCBbUFJFRklYXV0pWwoKQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluClxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CmFuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCmZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCgpGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KCkZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CiAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCiAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCiAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQogIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQogIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCiAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQogIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCiAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQogIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCiAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQogIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCiAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQogIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQogIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCl1BU19IRUxQX1NUUklORyhbLS1kb2NkaXI9RElSXSwKICBbZG9jdW1lbnRhdGlvbiByb290IF1APDpAREFUQVJPT1RESVIvZG9jL200X2lmc2V0KFtBQ19QQUNLQUdFX1RBUk5BTUVdLAogICAgW0FDX1BBQ0tBR0VfVEFSTkFNRV0sIFtQQUNLQUdFXSlAOj5AKVsKICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQogIC0tcGRmZGlyPURJUiAgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCiAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQpfQUNFT0YKCiAgY2F0IDw8XF9BQ0VPRl0KbTRfZGl2ZXJ0X3BvcChbSEVMUF9CRUdJTl0pZG5sCmRubCBUaGUgb3JkZXIgb2YgdGhlIGRpdmVyc2lvbnMgaGVyZSBpcwpkbmwgLSBIRUxQX0JFR0lOCmRubCAgIHdoaWNoIG1heSBiZSBleHRlbmRlZCBieSBleHRyYSBnZW5lcmljIG9wdGlvbnMgc3VjaCBhcyB3aXRoIFggb3IKZG5sICAgQUNfQVJHX1BST0dSQU0uICBEaXNwbGF5ZWQgb25seSBpbiBsb25nIC0taGVscC4KZG5sCmRubCAtIEhFTFBfQ0FOT04KZG5sICAgU3VwcG9ydCBmb3IgY3Jvc3MgY29tcGlsYXRpb24gKC0tYnVpbGQsIC0taG9zdCBhbmQgLS10YXJnZXQpLgpkbmwgICBEaXNwbGF5IG9ubHkgaW4gbG9uZyAtLWhlbHAuCmRubApkbmwgLSBIRUxQX0VOQUJMRQpkbmwgICB3aGljaCBzdGFydHMgd2l0aCB0aGUgdHJhaWxlciBvZiB0aGUgSEVMUF9CRUdJTiwgSEVMUF9DQU5PTiBzZWN0aW9uLApkbmwgICB0aGVuIGltcGxlbWVudHMgdGhlIGhlYWRlciBvZiB0aGUgbm9uIGdlbmVyaWMgb3B0aW9ucy4KZG5sCmRubCAtIEhFTFBfV0lUSApkbmwKZG5sIC0gSEVMUF9WQVIKZG5sCmRubCAtIEhFTFBfVkFSX0VORApkbmwKZG5sIC0gSEVMUF9FTkQKZG5sICAgaW5pdGlhbGl6ZWQgYmVsb3csIGluIHdoaWNoIHdlIGR1bXAgdGhlIHRyYWlsZXIgKGhhbmRsaW5nIG9mIHRoZQpkbmwgICByZWN1cnNpb24gZm9yIGluc3RhbmNlKS4KbTRfZGl2ZXJ0X3B1c2goW0hFTFBfRU5BQkxFXSlkbmwKX0FDRU9GCmZpCgppZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgptNF9pZnNldChbQUNfUEFDS0FHRV9TVFJJTkddLApbICBjYXNlICRhY19pbml0X2hlbHAgaW4KICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgQUNfUEFDS0FHRV9TVFJJTkc6Ijs7CiAgIGVzYWNdKQogIGNhdCA8PFxfQUNFT0YKbTRfZGl2ZXJ0X3BvcChbSEVMUF9FTkFCTEVdKWRubAptNF9kaXZlcnRfcHVzaChbSEVMUF9FTkRdKWRubAoKUmVwb3J0IGJ1Z3MgdG8gbTRfaWZzZXQoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgWzxBQ19QQUNLQUdFX0JVR1JFUE9SVD5dLAogIFt0aGUgcGFja2FnZSBwcm92aWRlcl0pLmRubAptNF9pZmRlZihbQUNfUEFDS0FHRV9OQU1FXSwgW200X2lmc2V0KFtBQ19QQUNLQUdFX1VSTF0sIFsKQUNfUEFDS0FHRV9OQU1FIGhvbWUgcGFnZTogPEFDX1BBQ0tBR0VfVVJMPi5dKWRubAptNF9pZihtNF9pbmRleChtNF9kZWZuKFtBQ19QQUNLQUdFX05BTUVdKSwgW0dOVSBdKSwgWzBdLCBbCkdlbmVyYWwgaGVscCB1c2luZyBHTlUgc29mdHdhcmU6IDxodHRwOi8vd3d3LmdudS5vcmcvZ2V0aGVscC8+Ll0pXSkKX0FDRU9GCmFjX3N0YXR1cz0kPwpmaQoKaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgogICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCiAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8CiAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAogICAgICBjb250aW51ZQogICAgX0FDX1NSQ0RJUlMoWyIkYWNfZGlyIl0pCiAgICBjZCAiJGFjX2RpciIgfHwgeyBhY19zdGF0dXM9JD87IGNvbnRpbnVlOyB9CiAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KICAgICAgZWNobyAmJgogICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQogICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KICAgICAgZWNobyAmJgogICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCiAgICBlbHNlCiAgICAgIEFDX01TR19XQVJOKFtubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXJdKQogICAgZmkgfHwgYWNfc3RhdHVzPSQ/CiAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9CiAgZG9uZQpmaQoKdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCm00X2RpdmVydF9wb3AoW0hFTFBfRU5EXSlkbmwKClQyOCwxMDUKbTRfbG9jYXRpb24oQUNfQ09ORklHX0ZJTEVTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3RhdHVzLm00OjI5MApUMTUsOTkKX0FTX0xJVEVSQUxfSUZfbTRfaWYobTRfdHJhbnNsaXQoWyQxXSwgWytdKSwgW10sIFskMFlFU10sCiAgICAgICBtNF90cmFuc2xpdChbJDFdLCBbJF0pLCBbXSwgW200X2RlZmF1bHRdLCBbJDBOT10pClQyMywyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oKUFDX0xBTkdfUFJPR1JBTShbXSwgW10pClQzNCwyODIKX0FDX0hFQURFUl9USU9DR1dJTlNaX0lOX1RFUk1JT1NfSEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRlcm1pb3MuaCBkZWZpbmVzIFRJT0NHV0lOU1pdLAoJCWFjX2N2X3N5c190aW9jZ3dpbnN6X2luX3Rlcm1pb3NfaCwKW0FDX0VHUkVQX0NQUChbeWVzXSwKCSAgICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDx0ZXJtaW9zLmg+CiNpZmRlZiBUSU9DR1dJTlNaCiAgeWVzCiNlbmRpZgpdLAoJCWFjX2N2X3N5c190aW9jZ3dpbnN6X2luX3Rlcm1pb3NfaD15ZXMsCgkJYWNfY3Zfc3lzX3Rpb2Nnd2luc3pfaW5fdGVybWlvc19oPW5vKV0pCgpUMTMsNjYKQUNfVFlQRV9QSURfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19UWVBFKHBpZF90LCAgaW50KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMApBQ19TVUJTVF9UUkFDRQpUMjYsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfUElEX1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MDAKRjksNgptNF9mb3JtYXRmb3JtYXQKVDE5LDMzMQpBQ19QQVRIX1RBUkdFVF9UT09MX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9UQVJHRVRdKWRubApBQ19QQVRIX1BST0coWyQxXSwgWyR0YXJnZXRfYWxpYXMtJDJdLCAsIFskNF0pCmlmIHRlc3QgLXogIiRhY19jdl9wYXRoXyQxIjsgdGhlbgogIGlmIHRlc3QgIiRidWlsZCIgPSAiJHRhcmdldCI7IHRoZW4KICAgIGFjX3B0XyQxPSQkMQogICAgX0FDX1BBVEhfUFJPRyhbYWNfcHRfJDFdLCBbJDJdLCBbJDNdLCBbJDRdKQogICAgJDE9JGFjX3B0XyQxCiAgZWxzZQogICAgJDE9IiQzIgogIGZpCmVsc2UKICAkMT0iJGFjX2N2X3BhdGhfJDEiCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTksNDAKQUNfQ09ORklHX01BQ1JPX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjEwLDcKbTRfbWtzdGVtcG1rc3RlbXAKVDMxLDEwOAptNF9sb2NhdGlvbihfQUNfTElCT0JKX0ZOTUFUQ0gpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6NTYxClQzMiwwCm00X2luY2x1ZGUoYXV0b2NvbmYvc3BlY2lmaWMubTQpClQxNiw3MwpBSF9DSEVDS19IRUFERVJTbTRfZm9yZWFjaF93KFtBQ19IZWFkZXJdLCBbJDFdLCBbX0FIX0NIRUNLX0hFQURFUihtNF9kZWZuKFtBQ19IZWFkZXJdKSldKQpUMjcsMTA2CkFDX0xBTkdfUFJPR1JBTShGb3J0cmFuIDc3KW00X2lmdmFsKFskMV0sCiAgICAgICBbbTRfd2Fybihbc3ludGF4XSwgWyQwOiBpZ25vcmluZyBQUk9MT0dVRTogJDFdKV0pZG5sCiAgICAgIHByb2dyYW0gbWFpbgokMgogICAgICBlbmQKVDE5LDYwOQpBQ19MQU5HX0lOVF9TQVZFKEMpQUNfTEFOR19QUk9HUkFNKFskMQpzdGF0aWMgbG9uZyBpbnQgbG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQpzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gJDI7IH0KQCU6QGluY2x1ZGUgPHN0ZGlvLmg+CkAlOkBpbmNsdWRlIDxzdGRsaWIuaD5dLApbCiAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKICBpZiAoISBmKQogICAgcmV0dXJuIDE7CiAgaWYgKCgkMikgPCAwKQogICAgewogICAgICBsb25nIGludCBpID0gbG9uZ3ZhbCAoKTsKICAgICAgaWYgKGkgIT0gKCQyKSkKCXJldHVybiAxOwogICAgICBmcHJpbnRmIChmLCAiJWxkIiwgaSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICB1bnNpZ25lZCBsb25nIGludCBpID0gdWxvbmd2YWwgKCk7CiAgICAgIGlmIChpICE9ICgkMikpCglyZXR1cm4gMTsKICAgICAgZnByaW50ZiAoZiwgIiVsdSIsIGkpOwogICAgfQogIC8qIERvIG5vdCBvdXRwdXQgYSB0cmFpbGluZyBuZXdsaW5lLCBhcyB0aGlzIGNhdXNlcyBcclxuIGNvbmZ1c2lvbgogICAgIG9uIHNvbWUgcGxhdGZvcm1zLiAgKi8KICByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Cl0pClQyNiwxMDcKbTRfbG9jYXRpb24oX0FDX1BBVEhfUFJPRykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjEyMgpUMjksMTAxCm00X2xvY2F0aW9uKEFDX0NfQkFDS1NMQVNIX0EpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjEzODgKVDksMTg0CkFDX01PREVfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19NT0RFX1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9NT0RFX1RdLCBbQUNfVFlQRV9NT0RFX1QoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDQxNgpBQ19DX1NUUklOR0laRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIHByZXByb2Nlc3NvciBzdHJpbmdpemluZyBvcGVyYXRvcl0sCgkJW2FjX2N2X2Nfc3RyaW5naXplXSwKW0FDX0VHUkVQX0NQUChbQCU6QHRlc3RzdHJpbmddLAoJICAgICAgW0AlOkBkZWZpbmUgeCh5KSAjeQoKY2hhciAqcyA9IHgodGVzdHN0cmluZyk7XSwKCSAgICAgIFthY19jdl9jX3N0cmluZ2l6ZT1ub10sCgkgICAgICBbYWNfY3ZfY19zdHJpbmdpemU9eWVzXSldKQppZiB0ZXN0ICRhY19jdl9jX3N0cmluZ2l6ZSA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NUUklOR0laRSwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgY3BwIHN1cHBvcnRzIHRoZSBBTlNJIEAlOkAgc3RyaW5naXppbmcgb3BlcmF0b3IuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwyMDYKQUNfQ0hFQ0tfQUxJR05PRl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZihtNF9pbmRleChtNF90cmFuc2xpdChbWyQxXV0sIFtgXCJdLCBbJF0pLCBbJF0pLCBbLTFdLCBbXSwKICAgICAgIFttNF9mYXRhbChbJDA6IHJlcXVpcmVzIGxpdGVyYWwgYXJndW1lbnRzXSldKV8kMChbJDFdLCBbJDJdLCBtNF90cmFuc2xpdChbWyQxXV0sIFt7O31dLCBbX19fXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pCkYxMSwxMQpfX3Byb2dyYW1fX19fcHJvZ3JhbV9fClQ2LDI2CkFTX0JPWF8kMChtNF9leHBhbmQoWyQxXSksIFskMl0pClQyOCwxMDkKbTRfbG9jYXRpb24oQUNfRlVOQ19SRUFMTE9DKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE0MjEKVDcsMTU2Cm00X2RlZm5tNF9pZihbJCNdLCBbMF0sIFtbJDBdXSwKICAgICAgIFskI10sIFsxXSwgW200X2lmZGVmKFskMV0sIFtfbTRfZGVmbihbJDFdKV0sCgkJCSAgICBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDE1LDE5MgpmcF9GVU5DX0ZOTUFUQ0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgZnBfRlVOQ19GTk1BVENIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfRk5NQVRDSF0sIFtBQ19GVU5DX0ZOTUFUQ0goJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDEwMQptNF9sb2NhdGlvbihfQUNfUFJPR19DQ19DODkpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjExMDEKVDI4LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX09CU1RBQ0spL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTM2NgpUMTEsNTQ0Cl9BU19QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKW00X3B1c2hkZWYoW0FTX1JFUVVJUkVdKW00X3B1c2hkZWYoW0FTX1JFUVVJUkVfU0hFTExfRk5dLCBfbTRfZGVmbihbX0FTX1JFUVVJUkVfU0hFTExfRk5dKQopbTRfcHVzaGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdLCBbLTFdKV9BU19FUlJPUl9QUkVQQVJFCl9tNF9wb3BkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlfQVNfRVhJVF9QUkVQQVJFCl9BU19VTlNFVF9QUkVQQVJFCl9BU19WQVJfQVBQRU5EX1BSRVBBUkUKX0FTX1ZBUl9BUklUSF9QUkVQQVJFCgpfQVNfRVhQUl9QUkVQQVJFCl9BU19CQVNFTkFNRV9QUkVQQVJFCl9BU19ESVJOQU1FX1BSRVBBUkUKX0FTX01FX1BSRVBBUkUKX0FTX0NSX1BSRVBBUkUKX0FTX0VDSE9fTl9QUkVQQVJFCl9BU19MTl9TX1BSRVBBUkUKX0FTX01LRElSX1BfUFJFUEFSRQpfQVNfVEVTVF9QUkVQQVJFCl9BU19UUl9DUFBfUFJFUEFSRQpfQVNfVFJfU0hfUFJFUEFSRQpfbTRfcG9wZGVmKFtBU19SRVFVSVJFXSwgW0FTX1JFUVVJUkVfU0hFTExfRk5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsNzgzCkFDX0NIRUNLX01FTUJFUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19tZW1iZXJdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYWNfZm5fXV9BQ19MQU5HX0FCQlJFVltfY2hlY2tfbWVtYmVyXSwKICAgIFtMSU5FTk8gQUdHUiBNRU1CRVIgVkFSIElOQ0xVREVTXSwKICAgIFtUcmllcyB0byBmaW5kIGlmIHRoZSBmaWVsZCBNRU1CRVIgZXhpc3RzIGluIHR5cGUgQUdHUiwgYWZ0ZXIgaW5jbHVkaW5nCiAgICAgSU5DTFVERVMsIHNldHRpbmcgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5Ll0pXSwKICAgIFtfJDBfQk9EWV0pQVNfTElURVJBTF9JRihbJDFdLCBbXSwgW200X2ZhdGFsKFskMDogcmVxdWlyZXMgbGl0ZXJhbCBhcmd1bWVudHNdKV0pbTRfaWYobTRfaW5kZXgoWyQxXSwgWy5dKSwgWy0xXSwKICBbbTRfZmF0YWwoWyQwOiBEaWQgbm90IHNlZSBhbnkgZG90IGluIGAkMSddKV0pQVNfVkFSX1BVU0hERUYoW2FjX01lbWJlcl0sIFthY19jdl9tZW1iZXJfJDFdKWFjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY2hlY2tfbWVtYmVyICIkTElORU5PIiBtNF9icGF0c3Vic3QoWyQxXSwgW15cKFteLl0qXClcLlwoLipcKV0sIFsiXDEiICJcMiJdKSAiYWNfTWVtYmVyIiAiQVNfRVNDQVBFKFtBQ19JTkNMVURFU19ERUZBVUxUKFskNF0pXSwgWyIiXSkiCkFTX1ZBUl9JRihbYWNfTWVtYmVyXSwgW3llc10sIFskMl0sIFskM10pCkFTX1ZBUl9QT1BERUYoW2FjX01lbWJlcl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsNTQKbTRfYXBwZW5kX3VuaXFfd200X21hcF9hcmdzX3coWyQyXSwgW19tNF9hcHBlbmRfdW5pcShbJDFdLF0sIFssIFsgXSldKQpUMTMsMjA3Cm00X21hcF9hcmdzX3dfJDAoX200X3NwbGl0KFsgXW00X2ZsYXR0ZW4oWyQxXSlbIF0sIFtbCSBdK10sCgkgICAgICAgbTRfaWYobTRfaW5kZXgoWyQyJDMkNF0sIFtcXSksIFstMV0sIFtbJDNbXSQ0W10kMl1dLAoJCSAgICAgW200X2JwYXRzdWJzdChbWyQzW10kNFtdJDJdXSwgW1xcXSwgW1xcXFxdKV0pKSwKICAgICBtNF9sZW4oW1tdJDNbXSQ0XSksIG00X2xlbihbJDRbXSQyW11dKSkKVDE5LDE2NQpfQUNfQVJHX1ZBUl9MREZMQUdTX200X2RlZnVuX3BybyhbJDBdKUFDX0FSR19WQVIoW0xERkxBR1NdLAoJICAgIFtsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKCSAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMywxMDYKbTRfbG9jYXRpb24oQUNfU1RfUkRFVikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc4ClQzMywxMDYKbTRfbG9jYXRpb24oQUNfRjc3X05BTUVfTUFOR0xJTkcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00Ojk3MgpUMjcsMTAxCm00X2xvY2F0aW9uKEFDX0NfU1RSSU5HSVpFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxNzk5ClQyNCwxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tJTkcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIyNjcKVDYsNAptNF9jYXJbJDFdClQyMSwxOTYKQUNfVElNRV9XSVRIX1NZU19USU1FX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RJTUVfV0lUSF9TWVNfVElNRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19IRUFERVJfVElNRV0sIFtBQ19IRUFERVJfVElNRSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsNzcKQUNfTEFOR19JTlRfU0FWRV9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDIKbTRfY291bnQkIwpUMTQsNDIKX200X2RlZnVuX29uY2VtNF9wdXNoZGVmKFskMV0pJDNbJDJbXW00X3Byb3ZpZGUoWyQxXSldJDQKVDE3LDkyMgpfQUNfUFJPR19PQkpDWFhfR2FjX3Rlc3RfT0JKQ1hYRkxBR1M9JHtPQkpDWFhGTEFHUytzZXR9CmFjX3NhdmVfT0JKQ1hYRkxBR1M9JE9CSkNYWEZMQUdTCkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJE9CSkNYWCBhY2NlcHRzIC1nLCBhY19jdl9wcm9nX29iamN4eF9nLAogIFthY19zYXZlX29iamN4eF93ZXJyb3JfZmxhZz0kYWNfb2JqY3h4X3dlcnJvcl9mbGFnCiAgIGFjX29iamN4eF93ZXJyb3JfZmxhZz15ZXMKICAgYWNfY3ZfcHJvZ19vYmpjeHhfZz1ubwogICBPQkpDWFhGTEFHUz0iLWciCiAgIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAogICAgIFthY19jdl9wcm9nX29iamN4eF9nPXllc10sCiAgICAgW09CSkNYWEZMQUdTPSIiCiAgICAgIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJW10sCglbYWNfb2JqY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX29iamN4eF93ZXJyb3JfZmxhZwoJIE9CSkNYWEZMQUdTPSItZyIKCSBfQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKCSAgIFthY19jdl9wcm9nX29iamN4eF9nPXllc10pXSldKQogICBhY19vYmpjeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfb2JqY3hfd2Vycm9yX2ZsYWddKQppZiB0ZXN0ICIkYWNfdGVzdF9PQkpDWFhGTEFHUyIgPSBzZXQ7IHRoZW4KICBPQkpDWFhGTEFHUz0kYWNfc2F2ZV9PQkpDWFhGTEFHUwplbGlmIHRlc3QgJGFjX2N2X3Byb2dfb2JqY3h4X2cgPSB5ZXM7IHRoZW4KICBpZiB0ZXN0ICIkR09CSkNYWCIgPSB5ZXM7IHRoZW4KICAgIE9CSkNYWEZMQUdTPSItZyAtTzIiCiAgZWxzZQogICAgT0JKQ1hYRkxBR1M9Ii1nIgogIGZpCmVsc2UKICBpZiB0ZXN0ICIkR09CSkNYWCIgPSB5ZXM7IHRoZW4KICAgIE9CSkNYWEZMQUdTPSItTzIiCiAgZWxzZQogICAgT0JKQ1hYRkxBR1M9CiAgZmkKZmlbXWRubAoKVDE2LDEzNDYKX0FTX0VDSE9fUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlbYXNfbmw9JwonCmV4cG9ydCBhc19ubAojIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgphc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJwphc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCiMgYnV0IHdpdGhvdXQgd2FzdGluZyBmb3JrcyBmb3IgYmFzaCBvciB6c2guCmlmIHRlc3QgLXogIiRCQVNIX1ZFUlNJT04kWlNIX1ZFUlNJT04iIFwKICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KICBhc19lY2hvPSdwcmludCAtciAtLScKICBhc19lY2hvX249J3ByaW50IC1ybiAtLScKZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgogIGFzX2VjaG89J3ByaW50ZiAlc1xuJwogIGFzX2VjaG9fbj0ncHJpbnRmICVzJwplbHNlCiAgaWYgdGVzdCAiWGAoL3Vzci91Y2IvZWNobyAtbiAtbiAkYXNfZWNobykgMj4vZGV2L251bGxgIiA9ICJYLW4gJGFzX2VjaG8iOyB0aGVuCiAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJF1bMSRhc19ubCInCiAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCiAgZWxzZQogICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkXVsxIiA6ICJYXFwoLipcXCkiJwogICAgYXNfZWNob19uX2JvZHk9J2V2YWwKICAgICAgYXJnPSRdWzE7CiAgICAgIGNhc2UgJGFyZyBpbiBAJTpAKAogICAgICAqIiRhc19ubCIqKQoJZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSRhc19ubCI7Cglhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OwogICAgICBlc2FjOwogICAgICBleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpIiB8IHRyIC1kICIkYXNfbmwiCiAgICAnCiAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKICAgIGFzX2VjaG9fbj0nc2ggLWMgJGFzX2VjaG9fbl9ib2R5IGFzX2VjaG8nCiAgZmkKICBleHBvcnQgYXNfZWNob19ib2R5CiAgYXNfZWNobz0nc2ggLWMgJGFzX2VjaG9fYm9keSBhc19lY2hvJwpmaQpdW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywxODYKQUNfRlVOQ19DSEVDS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GVU5DX0NIRUNLJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NIRUNLX0ZVTkNdLCBbQUNfQ0hFQ0tfRlVOQygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMTY0Cl9BU19VTlNFVF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX0ZVTkNUSU9OX0RFU0NSSUJFKFthc19mbl91bnNldF0sIFtWQVJdLCBbUG9ydGFibHkgdW5zZXQgVkFSLl0pCmFzX2ZuX3Vuc2V0ICgpCnsKICBBU19VTlNFVChbJFsxXV0pCn0KYXNfdW5zZXQ9YXNfZm5fdW5zZXRbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDI3NwpfQUNfSU5JVF9WRVJTSU9ObTRfZGl2ZXJ0X3RleHQoW1ZFUlNJT05fQkVHSU5dLApbaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogIGNhdCA8PFxfQUNFT0YKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWd1cmVbXWRubAptNF9pZnNldChbQUNfUEFDS0FHRV9WRVJTSU9OXSwgWyBBQ19QQUNLQUdFX1ZFUlNJT05dKQpnZW5lcmF0ZWQgYnkgbTRfUEFDS0FHRV9TVFJJTkddKQptNF9kaXZlcnRfdGV4dChbVkVSU0lPTl9FTkRdLApbX0FDRU9GCiAgZXhpdApmaV0pZG5sCgpUMTQsNjIKbTRfc2V0X2ZvcmVhY2htNF9wdXNoZGVmKFskMl0pbTRfc2V0X21hcF9zZXAoWyQxXSwgW200X2RlZmluZShbJDJdLF0sIFspJDNdKQpUMzAsMTA2Cm00X2xvY2F0aW9uKF9BQ19GQ19EVU1NWV9NQUlOKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo3NTIKVDExLDE5MApBQ19TRVRfTUFLRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TRVRfTUFLRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19QUk9HX01BS0VfU0VUXSwgW0FDX1BST0dfTUFLRV9TRVQoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDc2CkFDX0xBTkdfQ09ORlRFU1QoT2JqZWN0aXZlIEMpY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAovKiBlbmQgY29uZmRlZnMuaC4gICovCiQxCl9BQ0VPRgpUMTIsMTcxCkFDX0lTQ19QT1NJWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19JU0NfUE9TSVgnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX1NFQVJDSF9MSUJTKFtzdHJlcnJvcl0sIFtjcG9zaXhdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMTAxCm00X3N0YWNrX2ZvcmVhY2hfbTRfc3RhY2tfcmV2ZXJzZShbJDFdLCBbbTRfdG1wLSQxXSlfbTRfc3RhY2tfcmV2ZXJzZShbbTRfdG1wLSQxXSwgWyQxXSwgWyQyKF9tNF9kZWZuKFttNF90bXAtJDFdKSldKQpUMjYsMTA3Cm00X2xvY2F0aW9uKEFDX1BBVEhfUFJPR1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoxNjYKVDEyLDc3Cm00X2Nob21wX2FsbG00X2Zvcm1hdChbWyUuKnNdXSwgbTRfYnJlZ2V4cChtNF90cmFuc2xpdChbWyQxXV0sIFsKL10sIFsvIF0pLCBbLyokXSksIFskMV0pClQ3LDE3OApBQ19MTl9TX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xOX1MnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUFJPR19MTl9TXSwgW0FDX1BST0dfTE5fUygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTA2Cm00X2xvY2F0aW9uKEFDX1VTRykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6ODMxClQ2LDQ2Cm00X2NtcG00X2V2YWwoKChbJDFdKSA+IChbJDJdKSkgLSAoKFskMV0pIDwgKFskMl0pKSkKVDksMzczCkFTX1RNUERJUiMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgptNF9pZihbJDJdLCBbXSwgWzogIiR7VE1QRElSOj0vdG1wfSJdKQp7CiAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAibTRfZGVmYXVsdChbJDJdLAogICAgWyRUTVBESVJdKS8kMVhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgogIHRlc3QgLWQgIiR0bXAiCn0gIHx8CnsKICB0bXA9bTRfZGVmYXVsdChbJDJdLCBbJFRNUERJUl0pLyQxJCQtJFJBTkRPTQogICh1bWFzayAwNzcgJiYgbWtkaXIgIiR0bXAiKQp9IHx8IEFTX0VSUk9SKFtjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtNF9kZWZhdWx0KFskMl0sCgkgICAgICBbJFRNUERJUl0pXSkKVDE1LDU4OQpBQ19GVU5DX01CUlRPV0NfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgbWJydG93YyBhbmQgbWJzdGF0ZV90IGFyZSBwcm9wZXJseSBkZWNsYXJlZF0sCiAgICBhY19jdl9mdW5jX21icnRvd2MsCiAgICBbQUNfTElOS19JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKAoJICAgIFtbQCU6QGluY2x1ZGUgPHdjaGFyLmg+XV0sCgkgICAgW1t3Y2hhcl90IHdjOwoJICAgICAgY2hhciBjb25zdCBzW10gPSAiIjsKCSAgICAgIHNpemVfdCBuID0gMTsKCSAgICAgIG1ic3RhdGVfdCBzdGF0ZTsKCSAgICAgIHJldHVybiAhIChzaXplb2Ygc3RhdGUgJiYgKG1icnRvd2MpICgmd2MsIHMsIG4sICZzdGF0ZSkpO11dKV0sCiAgICAgICBhY19jdl9mdW5jX21icnRvd2M9eWVzLAogICAgICAgYWNfY3ZfZnVuY19tYnJ0b3djPW5vKV0pCiAgaWYgdGVzdCAkYWNfY3ZfZnVuY19tYnJ0b3djID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW0hBVkVfTUJSVE9XQ10sIDEsCiAgICAgIFtEZWZpbmUgdG8gMSBpZiBtYnJ0b3djIGFuZCBtYnN0YXRlX3QgYXJlIHByb3Blcmx5IGRlY2xhcmVkLl0pCiAgZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwxMDYKbTRfbG9jYXRpb24oQUNfV09SRFNfQklHRU5ESUFOKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6ODMKVDI4LDEwNwptNF9sb2NhdGlvbihBQ19QUk9HX01LRElSX1ApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo2NjQKVDI2LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX1dBSVQzKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE5NzkKVDE3LDUxCl9BU19FQ0hPX1VOUVVPVEVEQVNfRUNITyhbIiQxIl0pID4mbTRfZGVmYXVsdChbJDJdLCBbQVNfTUVTU0FHRV9GRF0pClQxOSwxMjAKX0FDX0ZVTkNTX0VYUEFOU0lPTgogIG00X2RpdmVydF90ZXh0KFtERUZBVUxUU10sIFthY19mdW5jX2xpc3Q9XSkKICBBQ19DSEVDS19GVU5DUyhbJGFjX2Z1bmNfbGlzdF0pCiAgbTRfZGVmaW5lKFtfQUNfRlVOQ1NfRVhQQU5TSU9OXSwgW10pCgpUMTksMTA3Cm00X2xvY2F0aW9uKF9BQ19ETykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjM3OApUMzAsMTA2Cm00X2xvY2F0aW9uKEFDX1lZVEVYVF9QT0lOVEVSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6ODQKVDM3LDEwMwptNF9sb2NhdGlvbihBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjI5MApUMjAsOTYKX0FTX0RFVEVDVF9TVUdHRVNURURfbTRfZGVmdW5fcHJvKFskMF0pbTRfc2V0X2FkZChbX0FTX0RFVEVDVF9TVUdHRVNURURfQk9EWV0sIFskMSB8fCBBU19FWElUXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDU3CkFTX0xJTkVOT19QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywxNDMyCkFDX1NZU19SRVNUQVJUQUJMRV9TWVNDQUxMU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLApbJDA6IEFDX1NZU19SRVNUQVJUQUJMRV9TWVNDQUxMUyBpcyB1c2VmdWwgb25seSB3aGVuIHN1cHBvcnRpbmcgdmVyeQpvbGQgc3lzdGVtcyB0aGF0IGxhY2sgYHNpZ2FjdGlvbicgYW5kIGBTQV9SRVNUQVJUJy4gIERvbid0IGJvdGhlciB3aXRoCnRoaXMgbWFjcm8gdW5sZXNzIHlvdSBuZWVkIHRvIHN1cHBvcnQgdmVyeSBvbGQgc3lzdGVtcyBsaWtlIDQuMkJTRCBhbmQKU1ZSMy5dKWRubApBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1lTX1dBSVRdKWRubApBQ19DQUNIRV9DSEVDSyhmb3IgcmVzdGFydGFibGUgc3lzdGVtIGNhbGxzLCBhY19jdl9zeXNfcmVzdGFydGFibGVfc3lzY2FsbHMsCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRSgKWy8qIEV4aXQgMCAodHJ1ZSkgaWYgd2FpdCByZXR1cm5zIHNvbWV0aGluZyBvdGhlciB0aGFuIC0xLAogICBpLmUuIHRoZSBwaWQgb2YgdGhlIGNoaWxkLCB3aGljaCBtZWFucyB0aGF0IHdhaXQgd2FzIHJlc3RhcnRlZAogICBhZnRlciBnZXR0aW5nIHRoZSBzaWduYWwuICAqLwoKQUNfSU5DTFVERVNfREVGQVVMVAojaW5jbHVkZSA8c2lnbmFsLmg+CiNpZmRlZiBIQVZFX1NZU19XQUlUX0gKIyBpbmNsdWRlIDxzeXMvd2FpdC5oPgojZW5kaWYKCi8qIFNvbWUgcGxhdGZvcm1zIGV4cGxpY2l0bHkgcmVxdWlyZSBhbiBleHRlcm4gIkMiIHNpZ25hbCBoYW5kbGVyCiAgIHdoZW4gdXNpbmcgQysrLiAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB2b2lkIHVjYXRjaCAoaW50IGR1bW15KSB7IH0KI2Vsc2UKdm9pZCB1Y2F0Y2ggKGR1bW15KSBpbnQgZHVtbXk7IHsgfQojZW5kaWYKCmludAptYWluICgpCnsKICBpbnQgaSA9IGZvcmsgKCksIHN0YXR1czsKCiAgaWYgKGkgPT0gMCkKICAgIHsKICAgICAgc2xlZXAgKDMpOwogICAgICBraWxsIChnZXRwcGlkICgpLCBTSUdJTlQpOwogICAgICBzbGVlcCAoMyk7CiAgICAgIHJldHVybiAwOwogICAgfQoKICBzaWduYWwgKFNJR0lOVCwgdWNhdGNoKTsKCiAgc3RhdHVzID0gd2FpdCAoJmkpOwogIGlmIChzdGF0dXMgPT0gLTEpCiAgICB3YWl0ICgmaSk7CgogIHJldHVybiBzdGF0dXMgPT0gLTE7Cn1dKV0sCgkgICAgICAgW2FjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscz15ZXNdLAoJICAgICAgIFthY19jdl9zeXNfcmVzdGFydGFibGVfc3lzY2FsbHM9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X3N5c19yZXN0YXJ0YWJsZV9zeXNjYWxscyA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1JFU1RBUlRBQkxFX1NZU0NBTExTLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiBzeXN0ZW0gY2FsbHMgYXV0b21hdGljYWxseSByZXN0YXJ0IGFmdGVyCgkgICAgIGludGVycnVwdGlvbiBieSBhIHNpZ25hbC5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjUsNgptNF9pZmlmZWxzZQpUMTUsMTE1OQpfQUNfSU5JVF9TUkNESVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbX0FDX0lOSVRfRElSQ0hFQ0tdKWRubAptNF9kaXZlcnRfcHVzaChbUEFSU0VfQVJHU10pZG5sCgojIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCmlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCiAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCiAgYWNfY29uZmRpcj1gQVNfRElSTkFNRShbIiRhc19teXNlbGYiXSlgCiAgc3JjZGlyPSRhY19jb25mZGlyCiAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KICAgIHNyY2Rpcj0uLgogIGZpCmVsc2UKICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCmZpCmlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCiAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCiAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXJdKQpmaQphY19tc2c9InNvdXJjZXMgYXJlIGluICRzcmNkaXIsIGJ1dCBcYGNkICRzcmNkaXInIGRvZXMgbm90IHdvcmsiCmFjX2Fic19jb25mZGlyPWAoCgljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IEFDX01TR19FUlJPUihbJGFjX21zZ10pCglwd2QpYAojIFdoZW4gYnVpbGRpbmcgaW4gcGxhY2UsIHNldCBzcmNkaXI9LgppZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCiAgc3JjZGlyPS4KZmkKIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCiMgbWVzcyB1cCBNLXggZ2RiIGluIEVtYWNzLgpjYXNlICRzcmNkaXIgaW4KKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW1teL11dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKZXNhYwptNF9kaXZlcnRfcG9wKFtQQVJTRV9BUkdTXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDM2Cm00X3JlbmFtZW00X2NvcHkoWyQxXSwgWyQyXSltNF91bmRlZmluZShbJDFdKQpUMjMsMTAxCm00X2xvY2F0aW9uKEFDX0NfQ1JPU1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjE0MTIKVDIwLDc3MQpfQUNfTElOS19JRkVMU0VfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CiAgQVNfSUYoW19BQ19ET19TVERFUlIoJGFjX2xpbmspICYmIHsKCSB0ZXN0IC16ICIkYWNfW11fQUNfTEFOR19BQkJSRVZbXV93ZXJyb3JfZmxhZyIgfHwKCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCiAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAoJIEFTX1RFU1RfWChbY29uZnRlc3QkYWNfZXhlZXh0XSkKICAgICAgIH1dLAogICAgICBbYWNfcmV0dmFsPTBdLAogICAgICBbX0FDX01TR19MT0dfQ09ORlRFU1QKCWFjX3JldHZhbD0xXSkKICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCiAgIyBjcmVhdGVkIGJ5IHRoZSBQR0kgY29tcGlsZXIgKGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28pLCBhcyBpdCB3b3VsZAogICMgaW50ZXJmZXJlIHdpdGggdGhlIG5leHQgbGluayBjb21tYW5kOyBhbHNvIGRlbGV0ZSBhIGRpcmVjdG9yeSB0aGF0IGlzCiAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgogIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KICBBU19MSU5FTk9fUE9QCiAgQVNfU0VUX1NUQVRVUyhbJGFjX3JldHZhbF0pCgpUMTIsMjI0CkFDX1BST0dfR1JFUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lXSwgYWNfY3ZfcGF0aF9HUkVQLAogICBbXyQwKEdSRVAsIFtncmVwIGdncmVwXSwgWy1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nXSldKQogR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKIEFDX1NVQlNUKFtHUkVQXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwyMjkKQUNfQ0hFQ0tfSEVBREVSU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUhfQ0hFQ0tfSEVBREVSKF0sIFspXSlBU19GT1IoW0FDX2hlYWRlcl0sIFthY19oZWFkZXJdLCBbJDFdLApbQUNfQ0hFQ0tfSEVBREVSKEFDX2hlYWRlciwKCQkgW0FDX0RFRklORV9VTlFVT1RFRChBU19UUl9DUFAoW0hBVkVfXUFDX2hlYWRlcikpICQyXSwKCQkgWyQzXSwgWyQ0XSlkbmxdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDEwNgptNF9sb2NhdGlvbihBQ19QUkVGSVhfREVGQVVMVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6NDUyCkY4LDUKbTRfaW5kaXJpbmRpcgpUMTIsMQpfbTRfZGl2ZXJ0KCkwClQxNywxMTA0CkFDX05PX0VYRUNVVEFCTEVTX200X2RlZnVuX29uY2UoW0FDX05PX0VYRUNVVEFCTEVTXSwgW200X2RpdmVydF9wdXNoKFtLSUxMXSkKbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwgW2FjX25vX2xpbms9bm9dKQoKQUNfQkVGT1JFKFskMF0sIFtfQUNfQ09NUElMRVJfRVhFRVhUXSkKQUNfQkVGT1JFKFskMF0sIFtBQ19MSU5LX0lGRUxTRV0pCgptNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLApbQUNfTEFOR19DT05GVEVTVChbX0FDX0xBTkdfTlVMTF9QUk9HUkFNXSkKaWYgX0FDX0RPX1ZBUihhY19saW5rKTsgdGhlbgogIGFjX25vX2xpbms9bm8KICBdbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pWwplbHNlCiAgcm0gLWYgLXIgYS5vdXQgYS5leGUgYi5vdXQgY29uZnRlc3QuJGFjX2V4dCBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC5kU1lNCiAgYWNfbm9fbGluaz15ZXMKICAjIFNldHRpbmcgY3Jvc3NfY29tcGlsZSB3aWxsIGRpc2FibGUgcnVuIHRlc3RzOyBpdCB3aWxsCiAgIyBhbHNvIGRpc2FibGUgQUNfQ0hFQ0tfRklMRSBidXQgdGhhdCdzIGdlbmVyYWxseQogICMgY29ycmVjdCBpZiB3ZSBjYW4ndCBsaW5rLgogIGNyb3NzX2NvbXBpbGluZz15ZXMKICBFWEVFWFQ9CiAgX0FDX0NPTVBJTEVSX0VYRUVYVF9DUk9TUwpmaQpdKQoKbTRfZGVmaW5lKFtBQ19MSU5LX0lGRUxTRV0sCltpZiB0ZXN0IHgkYWNfbm9fbGluayA9IHh5ZXM7IHRoZW4KICBBQ19NU0dfRVJST1IoW2xpbmsgdGVzdHMgYXJlIG5vdCBhbGxvd2VkIGFmdGVyIEFDQCZ0QF9OT19FWEVDVVRBQkxFU10pCmZpCl1tNF9kZWZuKFtBQ19MSU5LX0lGRUxTRV0pKQoKbTRfZGl2ZXJ0X3BvcCgpZG5sCl0sIG00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW1tfbTRfZGVmdW5fcHJvKFtBQ19OT19FWEVDVVRBQkxFU10pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX05PX0VYRUNVVEFCTEVTXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX05PX0VYRUNVVEFCTEVTXSldLCBbLV0pLCBbLV0sIFtbbTRfdW5xdW90ZShdLCBbKV1dLAogIFtbX200X3JlcXVpcmVfY2FsbChbQUNfTk9fRVhFQ1VUQUJMRVNdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQzMSwxMDMKbTRfbG9jYXRpb24oX0FTX1RSX0NQUF9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE4MjcKRjEyLDkKbTRfY2hhbmdlY29tY2hhbmdlY29tCkY2LDYKaWZlbHNlaWZlbHNlClQyMCw0MApfQVNfVkFSX0FQUEVORF9XT1JLU2FzX3Zhcj0xOyBhc192YXIrPTI7IHRlc3QgeCRhc192YXIgPSB4MTIKVDI0LDEwNgpBQ19MQU5HX1BST0dSQU0oRm9ydHJhbiltNF9pZnZhbChbJDFdLAogICAgICAgW200X3dhcm4oW3N5bnRheF0sIFskMDogaWdub3JpbmcgUFJPTE9HVUU6ICQxXSldKWRubAogICAgICBwcm9ncmFtIG1haW4KJDIKICAgICAgZW5kClQxMCw2MgptNF9ub3F1b3RlbTRfY2hhbmdlcXVvdGUoWy09PHsoXSxbKX0+PS1dKSQxLT08eygpfT49LW00X2NoYW5nZXF1b3RlKFssXSkKVDI3LDEwNwptNF9sb2NhdGlvbihBQ19DSEVDS19GVU5DUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4NwpUMTMsNDIKQVNfVkFSX1NFVF9JRkFTX0lGKFtBU19WQVJfVEVTVF9TRVQoWyQxXSldLCBbJDJdLCBbJDNdKQpGOCw1Cm00X2luZGV4aW5kZXgKVDE0LDU4Cl9tNF9tYXBfYXJnc193bTRfc3Vic3RyKFskMV0sIFskMl0sIG00X2V2YWwobTRfbGVuKFskMV0pIC0gWyQyXSAtIFskM10pKQpUNyw5OApfQVNfUlVObTRfaWZ2YWwoWyQyXSwgW3sgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIkMSB8IGFzX3J1bj1hICQyOyB9XSwKCQlbKGV2YWwgJDEpXSkgMj4vZGV2L251bGwKVDM2LDEwNgptNF9sb2NhdGlvbihBQ19TWVNfU0lHTElTVF9ERUNMQVJFRCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc5ClQyNywxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19TT1VSQ0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjIyNQpUMTksMjYwCl9BQ19GQ19ESUFMRUNUX1lFQVJfbTRfZGVmdW5fcHJvKFskMF0pbTRfY2FzZShtNF9icGF0c3Vic3RzKG00X3RvbG93ZXIoWyQxXSksIFtmb3J0cmFuXSxbXSwgWyAqXSxbXSksCgkgWzc3XSxbMTk3N10sIFsxOTc3XSxbMTk3N10sCgkgWzkwXSxbMTk5MF0sIFsxOTkwXSxbMTk5MF0sCgkgWzk1XSxbMTk5NV0sIFsxOTk1XSxbMTk5NV0sCgkgWzIwMDBdLFsyMDAwXSwKCSBbXSxbXSwKCSBbbTRfZmF0YWwoW3Vua25vd24gRm9ydHJhbiBkaWFsZWN0XSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsNzY5CkFDX1BST0dfTUFLRV9TRVRfbTRfZGVmdW5fcHJvKFskMF0pQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwkKE1BS0UpXSkKc2V0IHggJHtNQUtFLW1ha2V9CmFjX21ha2U9YEFTX0VDSE8oWyIkWzJdIl0pIHwgc2VkICdzLysvcC9nOyBzL1tbXmEtekEtWjAtOV9dXS9fL2cnYApBQ19DQUNIRV9WQUwoYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0LApbY2F0ID5jb25mdGVzdC5tYWtlIDw8XF9BQ0VPRgpTSEVMTCA9IC9iaW4vc2gKYWxsOgoJQGVjaG8gJ0BAQCUlJT0kKE1BS0UpPUBAQCUlJScKX0FDRU9GCiMgR05VIG1ha2Ugc29tZXRpbWVzIHByaW50cyAibWFrZVsxXTogRW50ZXJpbmcgLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KY2FzZSBgJHtNQUtFLW1ha2V9IC1mIGNvbmZ0ZXN0Lm1ha2UgMj4vZGV2L251bGxgIGluCiAgKkBAQCUlJT0/Kj1AQEAlJSUqKQogICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzOzsKICAqKQogICAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm87Owplc2FjCnJtIC1mIGNvbmZ0ZXN0Lm1ha2VdKWRubAppZiBldmFsIHRlc3QgXCRhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQgPSB5ZXM7IHRoZW4KICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQogIFNFVF9NQUtFPQplbHNlCiAgQUNfTVNHX1JFU1VMVChbbm9dKQogIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKZmkKQUNfU1VCU1QoW1NFVF9NQUtFXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxMDcKbTRfc2V0X21hcF9zZXBtNF9pZmRlZihbX200X3NldF9jbGVhbnVwKCQxKV0sIFtfbTRfc2V0X2NvbnRlbnRzXzFjXSwKCSAgW19tNF9zZXRfY29udGVudHNfMV0pKFskMV0pX200X3NldF9jb250ZW50c18yKCRAKQpUOSwxNzQKbTRfZXhwYW5kbTRfcHVzaGRlZihbbTRfZGl2ZXJ0XSwgX200X2RlZm4oW19tNF9kaXZlcnRfdW5zYWZlXSkpbTRfcHVzaGRlZihbbTRfZGl2ZXJ0X3B1c2hdLCBfbTRfZGVmbihbX200X2RpdmVydF91bnNhZmVdKSltNF9jaG9tcChfJDAoWyQxCl0pKV9tNF9wb3BkZWYoW200X2RpdmVydF0sIFttNF9kaXZlcnRfcHVzaF0pClQxMyw2ODgKX0FDX0NfU1REX1RSWV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gXW00X3RyYW5zbGl0KCQxLCBbY10sIFtDXSkpCkFDX0NBQ0hFX1ZBTChhY19jdl9wcm9nX2NjXyQxLApbYWNfY3ZfcHJvZ19jY18kMT1ubwphY19zYXZlX0NDPSRDQwpBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oWyQyXSwgWyQzXSldKQpmb3IgYWNfYXJnIGluICcnICQ0CmRvCiAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCiAgX0FDX0NPTVBJTEVfSUZFTFNFKFtdLCBbYWNfY3ZfcHJvZ19jY18kMT0kYWNfYXJnXSkKICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfJDEiICE9ICJ4bm8iICYmIGJyZWFrCmRvbmUKcm0gLWYgY29uZnRlc3QuJGFjX2V4dApDQz0kYWNfc2F2ZV9DQwpdKSMgQUNfQ0FDSEVfVkFMCmNhc2UgIngkYWNfY3ZfcHJvZ19jY18kMSIgaW4KICB4KQogICAgQUNfTVNHX1JFU1VMVChbbm9uZSBuZWVkZWRdKSA7OwogIHhubykKICAgIEFDX01TR19SRVNVTFQoW3Vuc3VwcG9ydGVkXSkgOzsKICAqKQogICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY18kMSIKICAgIEFDX01TR19SRVNVTFQoWyRhY19jdl9wcm9nX2NjXyQxXSkgOzsKZXNhYwpBU19JRihbdGVzdCAieCRhY19jdl9wcm9nX2NjXyQxIiAhPSB4bm9dLCBbJDVdLCBbJDZdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDY1NApBQ19MSU5LX0ZJTEVTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0xJTktfRklMRVMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAyLCAsCiAgICAgICBbbTRfZmF0YWwoWyQwOiBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50c10pXSlkbmwKbTRfZGVmaW5lX2RlZmF1bHQoW19BQ19MSU5LX0ZJTEVTX0NOVF0sIDApZG5sCm00X2RlZmluZShbX0FDX0xJTktfRklMRVNfQ05UXSwgbTRfaW5jcihfQUNfTElOS19GSUxFU19DTlQpKWRubAphY19zb3VyY2VzPSIkMSIKYWNfZGVzdHM9IiQyIgp3aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCiAgc2V0ICRhY19kZXN0czsgYWNfZGVzdD0kWzFdOyBzaGlmdDsgYWNfZGVzdHM9JFsqXQogIHNldCAkYWNfc291cmNlczsgYWNfc291cmNlPSRbMV07IHNoaWZ0OyBhY19zb3VyY2VzPSRbKl0KICBbYWNfY29uZmlnX2xpbmtzX11fQUNfTElOS19GSUxFU19DTlQ9IiRbYWNfY29uZmlnX2xpbmtzX11fQUNfTElOS19GSUxFU19DTlQgJGFjX2Rlc3Q6JGFjX3NvdXJjZSIKZG9uZQpBQ19DT05GSUdfTElOS1MoJFthY19jb25maWdfbGlua3NfXV9BQ19MSU5LX0ZJTEVTX0NOVClkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDE4MgpBQ19GRF9NU0dfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRkRfTVNHJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FTX01FU1NBR0VfRkRdLCBbQVNfTUVTU0FHRV9GRCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9TVERCT09MKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDo2MDAKVDI3LDEwNwptNF9sb2NhdGlvbihBQ19GQ19XUkFQUEVSUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTA1NApUMTgsOTgKX0FDX0xBTkdfT1BFTk1QKEMpCiNpZm5kZWYgX09QRU5NUAogY2hva2UgbWUKI2VuZGlmCiNpbmNsdWRlIDxvbXAuaD4KaW50IG1haW4gKCkgeyByZXR1cm4gb21wX2dldF9udW1fdGhyZWFkcyAoKTsgfQoKVDE5LDMzNgpfQVNfTUtESVJfUF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkVfU0hFTExfRk4oW2FzX2ZuX21rZGlyX3BdLAogIFtBU19GVU5DVElPTl9ERVNDUklCRShbYXNfZm5fbWtkaXJfcF0sIFtdLAogICAgW0NyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS5dKV0sClsKICBfQVNfTUtESVJfUApdKWlmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCmVsc2UKICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAogIGFzX21rZGlyX3A9ZmFsc2UKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNiwxMDYKbTRfbG9jYXRpb24oQUNfUkVTVEFSVEFCTEVfU1lTQ0FMTFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo3MApUMTcsMjI5Cm00X2NyX25vdF9MRVRURVJTAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzAxMjM0NTY3ODk6Ozw9Pj9AW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTgsNTM3Cl9BQ19GVU5DX01BTExPQ19JRl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19IRUFERVJfU1REQ10pZG5sCkFDX0NIRUNLX0hFQURFUlMoc3RkbGliLmgpCkFDX0NBQ0hFX0NIRUNLKFtmb3IgR05VIGxpYmMgY29tcGF0aWJsZSBtYWxsb2NdLCBhY19jdl9mdW5jX21hbGxvY18wX25vbm51bGwsCltBQ19SVU5fSUZFTFNFKApbQUNfTEFOR19QUk9HUkFNKApbWyNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKIyBpbmNsdWRlIDxzdGRsaWIuaD4KI2Vsc2UKY2hhciAqbWFsbG9jICgpOwojZW5kaWYKXV0sCgkJIFtyZXR1cm4gISBtYWxsb2MgKDApO10pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tYWxsb2NfMF9ub25udWxsPXllc10sCgkgICAgICAgW2FjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbD1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbD1ub10pXSkKQVNfSUYoW3Rlc3QgJGFjX2N2X2Z1bmNfbWFsbG9jXzBfbm9ubnVsbCA9IHllc10sIFskMV0sIFskMl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsOTAKQUNfUFJFRklYX0RFRkFVTFRfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwgW2FjX2RlZmF1bHRfcHJlZml4PSQxXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDI1NgpfbTRfc2V0X2R1bXBfY2hlY2ttNF9pZmRlZihbX200X3NldChbJDFdKV0sCgkgIFttNF9zZXRfY29udGFpbnMoWyQxXSwgX200X2RlZm4oW19tNF9zZXQoWyQxXSldKSwKCQkJICAgW1skMl1fbTRfZGVmbihbX200X3NldChbJDFdKV0pXSlfbTRfcG9wZGVmKAogICAgW19tNF9zZXQoWyQxXSxdX200X2RlZm4oW19tNF9zZXQoWyQxXSldKVspXSwKICAgIFtfbTRfc2V0KFskMV0pXSkkMChbJDFdLCBbJDIkM10pXSwKCSAgW19tNF9wb3BkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldKV0pClQxMCw3MjgKQVNfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfcHVzaChbS0lMTF0pCm00X2FwcGVuZF91bmlxKFtfQVNfQ0xFQU5VUF0sCiAgW200X2RpdmVydF90ZXh0KFtNNFNILUlOSVQtRk5dLCBbX0FTX0VSUk9SX1BSRVBBUkVbXV0pXSkKQVNfUkVRVUlSRShbX0FTX0VYUFJfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19CQVNFTkFNRV9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX0RJUk5BTUVfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19NRV9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX0NSX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfTElORU5PX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfRUNIT19OX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfRVhJVF9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX0xOX1NfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19NS0RJUl9QX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfVEVTVF9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX1RSX0NQUF9QUkVQQVJFXSkKQVNfUkVRVUlSRShbX0FTX1RSX1NIX1BSRVBBUkVdKQpBU19SRVFVSVJFKFtfQVNfVU5TRVRfUFJFUEFSRV0pCkFTX1JFUVVJUkUoW19BU19WQVJfQVBQRU5EX1BSRVBBUkVdLCBbXSwgW000U0gtSU5JVC1GTl0pCkFTX1JFUVVJUkUoW19BU19WQVJfQVJJVEhfUFJFUEFSRV0sIFtdLCBbTTRTSC1JTklULUZOXSkKbTRfZGl2ZXJ0X3BvcFtdW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw3NwpBQ19DSEVDS19QUk9HX200X2RlZnVuX3BybyhbJDBdKV9BQ19DSEVDS19QUk9HKCRAKQpBQ19TVUJTVChbJDFdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDE3Cm00X2xvY2F0aW9uX19maWxlX186X19saW5lX18KVDI5LDEzOTgKX0FDX0NIRUNLX0hFQURFUl9NT05HUkVMX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBBU19WQVJfU0VUX0lGKFskW10zXSwKCQlbQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkW10yXSwgWyRbXTNdLCBbXSldLAoJCVsjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KQUNfTVNHX0NIRUNLSU5HKFskW10yIHVzYWJpbGl0eV0pCkFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbJFtdNApAJTpAaW5jbHVkZSA8JFtdMj5dKV0sCgkJICBbYWNfaGVhZGVyX2NvbXBpbGVyPXllc10sCgkJICBbYWNfaGVhZGVyX2NvbXBpbGVyPW5vXSkKQUNfTVNHX1JFU1VMVChbJGFjX2hlYWRlcl9jb21waWxlcl0pCgojIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KQUNfTVNHX0NIRUNLSU5HKFskW10yIHByZXNlbmNlXSkKQUNfUFJFUFJPQ19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtAJTpAaW5jbHVkZSA8JFtdMj5dKV0sCgkJICBbYWNfaGVhZGVyX3ByZXByb2M9eWVzXSwKCQkgIFthY19oZWFkZXJfcHJlcHJvYz1ub10pCkFDX01TR19SRVNVTFQoWyRhY19oZWFkZXJfcHJlcHJvY10pCgojIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfW11fQUNfTEFOR19BQkJSRVZbXV9wcmVwcm9jX3dhcm5fZmxhZyBpbiAjKCgKICB5ZXM6bm86ICkKICAgIEFDX01TR19XQVJOKFskW10yOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhXSkKICAgIEFDX01TR19XQVJOKFskW10yOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0XSkKICAgIDs7CiAgbm86eWVzOiogKQogICAgQUNfTVNHX1dBUk4oWyRbXTI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZF0pCiAgICBBQ19NU0dfV0FSTihbJFtdMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzP10pCiAgICBBQ19NU0dfV0FSTihbJFtdMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uXSkKICAgIEFDX01TR19XQVJOKFskW10yOiAgICAgc2VjdGlvbiAiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkIl0pCiAgICBBQ19NU0dfV0FSTihbJFtdMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdF0pCm00X2lmc2V0KFtBQ19QQUNLQUdFX0JVR1JFUE9SVF0sClttNF9uKFsoIEFTX0JPWChbUmVwb3J0IHRoaXMgdG8gXUFDX1BBQ0tBR0VfQlVHUkVQT1JUKQogICAgICkgfCBzZWQgInMvXi8kYXNfbWU6IFdBUk5JTkc6ICAgICAvIiA+JjJdKV0pZG5sCiAgICA7Owplc2FjCiAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkW10yXSwgWyRbXTNdLAoJCSBbQVNfVkFSX1NFVChbJFtdM10sIFskYWNfaGVhZGVyX2NvbXBpbGVyXSldKV0pCiAgQVNfTElORU5PX1BPUAoKVDI0LDEwMgptNF9sb2NhdGlvbihBU19CQVNFTkFNRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDo5MDkKVDIzLDIKQUNfTEFOR19TT1VSQ0UoRm9ydHJhbikkMQpUMTIsNDcwMApBQ19GVU5DX01NQVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfSEVBREVSU19PTkNFKFtzdGRsaWIuaCB1bmlzdGQuaCBzeXMvcGFyYW0uaF0pCkFDX0NIRUNLX0ZVTkNTKFtnZXRwYWdlc2l6ZV0pCkFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBtbWFwXSwgW2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWRdLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW0FDX0lOQ0xVREVTX0RFRkFVTFRdCltbLyogbWFsbG9jIG1pZ2h0IGhhdmUgYmVlbiByZW5hbWVkIGFzIHJwbF9tYWxsb2MuICovCiN1bmRlZiBtYWxsb2MKCi8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgogICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCgltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCgltbWFwIHNoYXJlZCBub3QgZml4ZWQKCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAogICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQogICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50CiAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQogICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCiAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBidWZmZXIgY2FjaGUKICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKICAgcHJvcGFnYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCgogICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCiAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6CiAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQogICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CgojaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmICFkZWZpbmVkIEhBVkVfU1RETElCX0gKY2hhciAqbWFsbG9jICgpOwojZW5kaWYKCi8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCiMgaWZkZWYgX1NDX1BBR0VTSVpFCiMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQojIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCiMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgojICAgaWZkZWYgRVhFQ19QQUdFU0laRQojICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwojICAgIGlmZGVmIE5CUEcKIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQojICAgICBpZm5kZWYgQ0xTSVpFCiMgICAgICBkZWZpbmUgQ0xTSVpFIDEKIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCiMgICAgZWxzZSAvKiBubyBOQlBHICovCiMgICAgIGlmZGVmIE5CUEMKIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKIyAgICAgZWxzZSAvKiBubyBOQlBDICovCiMgICAgICBpZmRlZiBQQUdFU0laRQojICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCiMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwojICAgICBlbmRpZiAvKiBubyBOQlBDICovCiMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwojICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwojICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCiMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KCiNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCgppbnQKbWFpbiAoKQp7CiAgY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7CiAgY29uc3QgY2hhciAqY2RhdGEyOwogIGludCBpLCBwYWdlc2l6ZTsKICBpbnQgZmQsIGZkMjsKCiAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKCiAgLyogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LiAqLwogIGRhdGEgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKICBpZiAoIWRhdGEpCiAgICByZXR1cm4gMTsKICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgICooZGF0YSArIGkpID0gcmFuZCAoKTsKICB1bWFzayAoMCk7CiAgZmQgPSBjcmVhdCAoImNvbmZ0ZXN0Lm1tYXAiLCAwNjAwKTsKICBpZiAoZmQgPCAwKQogICAgcmV0dXJuIDI7CiAgaWYgKHdyaXRlIChmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQogICAgcmV0dXJuIDM7CiAgY2xvc2UgKGZkKTsKCiAgLyogTmV4dCwgY2hlY2sgdGhhdCB0aGUgdGFpbCBvZiBhIHBhZ2UgaXMgemVyby1maWxsZWQuICBGaWxlIG11c3QgaGF2ZQogICAgIG5vbi16ZXJvIGxlbmd0aCwgb3RoZXJ3aXNlIHdlIHJpc2sgU0lHQlVTIGZvciBlbnRpcmUgcGFnZS4gICovCiAgZmQyID0gb3BlbiAoImNvbmZ0ZXN0LnR4dCIsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCAwNjAwKTsKICBpZiAoZmQyIDwgMCkKICAgIHJldHVybiA0OwogIGNkYXRhMiA9ICIiOwogIGlmICh3cml0ZSAoZmQyLCBjZGF0YTIsIDEpICE9IDEpCiAgICByZXR1cm4gNTsKICBkYXRhMiA9IChjaGFyICopIG1tYXAgKDAsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZDIsIDBMKTsKICBpZiAoZGF0YTIgPT0gTUFQX0ZBSUxFRCkKICAgIHJldHVybiA2OwogIGZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQogICAgaWYgKCooZGF0YTIgKyBpKSkKICAgICAgcmV0dXJuIDc7CiAgY2xvc2UgKGZkMik7CiAgaWYgKG11bm1hcCAoZGF0YTIsIHBhZ2VzaXplKSkKICAgIHJldHVybiA4OwoKICAvKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2ggYWxyZWFkeSBoYXMKICAgICBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sIGFsc28gbWFrZSBzdXJlIHRoYXQKICAgICB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4gICovCiAgZmQgPSBvcGVuICgiY29uZnRlc3QubW1hcCIsIE9fUkRXUik7CiAgaWYgKGZkIDwgMCkKICAgIHJldHVybiA5OwogIGlmIChkYXRhMiAhPSBtbWFwIChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCgkJICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKICAgIHJldHVybiAxMDsKICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgIGlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCiAgICAgIHJldHVybiAxMTsKCiAgLyogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEgZG8gbm90CiAgICAgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuICAoVGhpcyBpcyBhIGJ1ZyBvbgogICAgIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKSAgKi8KICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgICooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7CiAgZGF0YTMgPSAoY2hhciAqKSBtYWxsb2MgKHBhZ2VzaXplKTsKICBpZiAoIWRhdGEzKQogICAgcmV0dXJuIDEyOwogIGlmIChyZWFkIChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKICAgIHJldHVybiAxMzsKICBmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKICAgIGlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCiAgICAgIHJldHVybiAxNDsKICBjbG9zZSAoZmQpOwogIHJldHVybiAwOwp9XV0pXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXNdLAoJICAgICAgIFthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ub10pXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgogIEFDX0RFRklORShbSEFWRV9NTUFQXSwgWzFdLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLl0pCmZpCnJtIC1mIGNvbmZ0ZXN0Lm1tYXAgY29uZnRlc3QudHh0CltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxNjYKQUNfTElCT0JKX200X2RlZnVuX3BybyhbJDBdKV9BQ19MSUJPQkooWyQxXSlBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwgW0FDX0xJQlNPVVJDRShbJDEuY10pXSwKICBbQUNfRElBR05PU0UoW3N5bnRheF0sIFskMCgkMSk6IHlvdSBzaG91bGQgdXNlIGxpdGVyYWxzXSldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMTQ1CkFDX0xBTkdfQ0FMTF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZnZhbChbJDJdLCBbXSwgW200X3dhcm4oW3N5bnRheF0sIFskMDogbm8gZnVuY3Rpb24gZ2l2ZW5dKV0pZG5sCl9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM2LDEwMgptNF9sb2NhdGlvbihfQVNfREVURUNUX0JFVFRFUl9TSEVMTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxOTUKVDMyLDEwNgptNF9sb2NhdGlvbihBQ19JTkNMVURFU19ERUZBVUxUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDozNTMKVDExLDU0Cm00X2lmbmJsYW5rbTRfaWYobTRfdHJhbnNsaXQoW1skMV1dLCAgWyBdWwldWwpdKSwgW10sIFskM10sIFskMl0pClQxNiwxMjg3CkFDX1NZU19MQVJHRUZJTEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfQVJHX0VOQUJMRShsYXJnZWZpbGUsCgkgICAgICAgWyAgLS1kaXNhYmxlLWxhcmdlZmlsZSAgICAgb21pdCBzdXBwb3J0IGZvciBsYXJnZSBmaWxlc10pCmlmIHRlc3QgIiRlbmFibGVfbGFyZ2VmaWxlIiAhPSBubzsgdGhlbgoKICBBQ19DQUNIRV9DSEVDSyhbZm9yIHNwZWNpYWwgQyBjb21waWxlciBvcHRpb25zIG5lZWRlZCBmb3IgbGFyZ2UgZmlsZXNdLAogICAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQywKICAgIFthY19jdl9zeXNfbGFyZ2VmaWxlX0NDPW5vCiAgICAgaWYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCiAgICAgICBhY19zYXZlX0NDPSRDQwogICAgICAgd2hpbGUgOjsgZG8KCSAjIElSSVggNi4yIGFuZCBsYXRlciBkbyBub3Qgc3VwcG9ydCBsYXJnZSBmaWxlcyBieSBkZWZhdWx0LAoJICMgc28gdXNlIHRoZSBDIGNvbXBpbGVyJ3MgLW4zMiBvcHRpb24gaWYgdGhhdCBoZWxwcy4KCSBBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW19BQ19TWVNfTEFSR0VGSUxFX1RFU1RfSU5DTFVERVNdKV0pCgkgQUNfQ09NUElMRV9JRkVMU0UoW10sIFticmVha10pCgkgQ0M9IiRDQyAtbjMyIgoJIEFDX0NPTVBJTEVfSUZFTFNFKFtdLCBbYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQz0nIC1uMzInOyBicmVha10pCgkgYnJlYWsKICAgICAgIGRvbmUKICAgICAgIENDPSRhY19zYXZlX0NDCiAgICAgICBybSAtZiBjb25mdGVzdC4kYWNfZXh0CiAgICBmaV0pCiAgaWYgdGVzdCAiJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiICE9IG5vOyB0aGVuCiAgICBDQz0kQ0MkYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQwogIGZpCgogIF9BQ19TWVNfTEFSR0VGSUxFX01BQ1JPX1ZBTFVFKF9GSUxFX09GRlNFVF9CSVRTLCA2NCwKICAgIGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzLAogICAgW051bWJlciBvZiBiaXRzIGluIGEgZmlsZSBvZmZzZXQsIG9uIGhvc3RzIHdoZXJlIHRoaXMgaXMgc2V0dGFibGUuXSwKICAgIFtfQUNfU1lTX0xBUkdFRklMRV9URVNUX0lOQ0xVREVTXSkKICBpZiB0ZXN0ICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyA9IHVua25vd247IHRoZW4KICAgIF9BQ19TWVNfTEFSR0VGSUxFX01BQ1JPX1ZBTFVFKF9MQVJHRV9GSUxFUywgMSwKICAgICAgYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzLAogICAgICBbRGVmaW5lIGZvciBsYXJnZSBmaWxlcywgb24gQUlYLXN0eWxlIGhvc3RzLl0sCiAgICAgIFtfQUNfU1lTX0xBUkdFRklMRV9URVNUX0lOQ0xVREVTXSkKICBmaQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDEyNzUKQUNfUFJPR19DQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goQylkbmwKQUNfQVJHX1ZBUihbQ0NdLCAgICAgW0MgY29tcGlsZXIgY29tbWFuZF0pZG5sCkFDX0FSR19WQVIoW0NGTEFHU10sIFtDIGNvbXBpbGVyIGZsYWdzXSlkbmwKX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCl9BQ19BUkdfVkFSX0xJQlMoKWRubApfQUNfQVJHX1ZBUl9DUFBGTEFHUygpZG5sCm00X2lmdmFsKFskMV0sCiAgICAgIFtBQ19DSEVDS19UT09MUyhDQywgWyQxXSldLApbQUNfQ0hFQ0tfVE9PTChDQywgZ2NjKQppZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCiAgZG5sIEhlcmUgd2Ugd2FudDoKICBkbmwJQUNfQ0hFQ0tfVE9PTChDQywgY2MpCiAgZG5sIGJ1dCB3aXRob3V0IHRoZSBjaGVjayBmb3IgYSB0b29sIHdpdGhvdXQgdGhlIHByZWZpeC4KICBkbmwgVW50aWwgdGhlIGNoZWNrIGlzIHJlbW92ZWQgZnJvbSB0aGVyZSwgY29weSB0aGUgY29kZToKICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCiAgICBBQ19DSEVDS19QUk9HKENDLCBbJHthY190b29sX3ByZWZpeH1jY10sIFske2FjX3Rvb2xfcHJlZml4fWNjXSkKICBmaQpmaQppZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCiAgQUNfQ0hFQ0tfUFJPRyhDQywgY2MsIGNjLCAsICwgL3Vzci91Y2IvY2MpCmZpCmlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICBBQ19DSEVDS19UT09MUyhDQywgY2wuZXhlKQpmaQpdKQoKdGVzdCAteiAiJENDIiAmJiBBQ19NU0dfRkFJTFVSRShbbm8gYWNjZXB0YWJsZSBDIGNvbXBpbGVyIGZvdW5kIGluIFwkUEFUSF0pCgojIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCl9BU19FQ0hPX0xPRyhbY2hlY2tpbmcgZm9yIF9BQ19MQU5HIGNvbXBpbGVyIHZlcnNpb25dKQpzZXQgWCAkYWNfY29tcGlsZQphY19jb21waWxlcj0kWzJdCmZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KICBfQUNfRE9fTElNSVQoWyRhY19jb21waWxlciAkYWNfb3B0aW9uID4mQVNfTUVTU0FHRV9MT0dfRkRdKQpkb25lCgptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW11kbmwKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9PQkpFWFRdKVtdZG5sCl9BQ19MQU5HX0NPTVBJTEVSX0dOVQppZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KICBHQ0M9eWVzCmVsc2UKICBHQ0M9CmZpCl9BQ19QUk9HX0NDX0cKX0FDX1BST0dfQ0NfQzg5CkFDX0xBTkdfUE9QKEMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUNywxMDQzCkFDX0lOSVQjIEZvcmJpZGRlbiB0b2tlbnMgYW5kIGV4Y2VwdGlvbnMuCm00X3BhdHRlcm5fZm9yYmlkKFteXz9BW0NIVU1dX10pCm00X3BhdHRlcm5fZm9yYmlkKFtfQUNfXSkKbTRfcGF0dGVybl9mb3JiaWQoW15MSUJPQkpTJF0sCgkJICBbZG8gbm90IHVzZSBMSUJPQkpTIGRpcmVjdGx5LCB1c2UgQUNfTElCT0JKIChzZWUgc2VjdGlvbiBgQUNfTElCT0JKIHZzIExJQk9CSlMnXSkKIyBBY3R1YWxseSByZXNlcnZlZCBieSBNNHNoLgptNF9wYXR0ZXJuX2FsbG93KFteQVNfRkxBR1MkXSkKQVNfSU5JVFtdZG5sCkFTX1BSRVBBUkVbXWRubAptNF9kaXZlcnRfcHVzaChbS0lMTF0pCm00X2lmdmFsKFskMl0sIFtfQUNfSU5JVF9QQUNLQUdFKCRAKV0pCl9BQ19JTklUX0RFRkFVTFRTCl9BQ19JTklUX1BBUlNFX0FSR1MKX0FDX0lOSVRfRElSQ0hFQ0sKX0FDX0lOSVRfU1JDRElSCl9BQ19JTklUX0hFTFAKX0FDX0lOSVRfVkVSU0lPTgpfQUNfSU5JVF9DT05GSUdfTE9HCl9BQ19JTklUX1BSRVBBUkUKX0FDX0lOSVRfTk9USUNFCl9BQ19JTklUX0NPUFlSSUdIVAptNF9kaXZlcnRfdGV4dChbU0hFTExfRk5dLCBbCm00X3RleHRfYm94KFtBdXRvY29uZiBpbml0aWFsaXphdGlvbi5dKV0pCm00X2RpdmVydF9wb3AKbTRfaWZ2YWwoWyQyXSwgLCBbbTRfaWZ2YWwoWyQxXSwgW0FDX0NPTkZJR19TUkNESVIoWyQxXSldKV0pZG5sCmRubApkbmwgU3Vic3RpdHV0ZSBmb3IgcHJlZGVmaW5lZCB2YXJpYWJsZXMuCkFDX1NVQlNUKFtERUZTXSlkbmwKQUNfU1VCU1QoW0VDSE9fQ10pZG5sCkFDX1NVQlNUKFtFQ0hPX05dKWRubApBQ19TVUJTVChbRUNIT19UXSlkbmwKQUNfU1VCU1QoW0xJQlNdKWRubApfQUNfQVJHX1ZBUl9QUkVDSU9VUyhbYnVpbGRfYWxpYXNdKUFDX1NVQlNUKFtidWlsZF9hbGlhc10pZG5sCl9BQ19BUkdfVkFSX1BSRUNJT1VTKFtob3N0X2FsaWFzXSlBQ19TVUJTVChbaG9zdF9hbGlhc10pZG5sCl9BQ19BUkdfVkFSX1BSRUNJT1VTKFt0YXJnZXRfYWxpYXNdKUFDX1NVQlNUKFt0YXJnZXRfYWxpYXNdKWRubApkbmwKQUNfTEFOR19QVVNIKEMpCgpUMjEsNzQKX0FDX0NPTkZJR19ERVBFTkRFTkNZX0FDX0ZJTEVfREVQRU5ERU5DWV9UUkFDRV9DT0xPTihbJDJdX0FDX0NPTkZJR19ERVBFTkRFTkNZX0RFRkFVTFQoJEApKWRubAoKVDgsMTgxCkFDX09GRl9UX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX09GRl9UJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1RZUEVfT0ZGX1RdLCBbQUNfVFlQRV9PRkZfVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMzc2CkFDX0NIRUNLX1RPT0xfbTRfZGVmdW5fcHJvKFskMF0paWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgogIEFDX0NIRUNLX1BST0coWyQxXSwgWyR7YWNfdG9vbF9wcmVmaXh9JDJdLCBbJHthY190b29sX3ByZWZpeH0kMl0sICwgWyQ0XSkKZmkKaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfJDEiOyB0aGVuCiAgYWNfY3RfJDE9JCQxCiAgX0FDX0NIRUNLX1BST0coW2FjX2N0XyQxXSwgWyQyXSwgWyQyXSwgW10sIFskNF0pCiAgaWYgdGVzdCAieCRhY19jdF8kMSIgPSB4OyB0aGVuCiAgICAkMT0iJDMiCiAgZWxzZQogICAgX0FDX1RPT0xfV0FSTgogICAgJDE9JGFjX2N0XyQxCiAgZmkKZWxzZQogICQxPSIkYWNfY3ZfcHJvZ18kMSIKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywxMzQKX200X2RlZnVuX2VwaV9tNF9wb3BkZWYoW19tNF9leHBhbmRpbmcoJDEpXSwgW19tNF9leHBhbnNpb25fc3RhY2tdKW00X2lmZGVmKFtfbTRfZXhwYW5zaW9uX3N0YWNrXSwgW10sIFtfbTRfZGVmdW5fZXBpX291dGVyKFskMV0pXSltNF9wcm92aWRlKFskMV0pClQxMCw0MAptNF93YXJuaW5nbTRfZXJycHJpbnRuKG00X2xvY2F0aW9uWzogd2FybmluZzogJDFdKQpUMTIsNTc2Cl9BQ19UWVBFX0lOVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9jX2ZpbmRfaW50WF90XSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX2NfZmluZF9pbnRYX3RdLCBbTElORU5PIEJJVFMgVkFSXSwKICAgIFtGaW5kcyBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgd2l0aCB3aWR0aCBCSVRTLCBzZXR0aW5nIGNhY2hlIHZhcmlhYmxlIFZBUgogICAgIGFjY29yZGluZ2x5Ll0pXSwKICAgIFskMF9CT0RZXSlhY19mbl9jX2ZpbmRfaW50WF90ICIkTElORU5PIiAiJDEiICJhY19jdl9jX2ludCQxX3QiCmNhc2UgJGFjX2N2X2NfaW50JDFfdCBpbiAjKAogIG5vfHllcykgOzsgIygKICAqKQogICAgQUNfREVGSU5FX1VOUVVPVEVEKFtpbnQkMV90XSwgWyRhY19jdl9jX2ludCQxX3RdLAogICAgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGEgc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5ICQxIGJpdHMKICAgICAgIGlmIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuXSk7Owplc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUNDQsMTA1Cm00X2xvY2F0aW9uKEFDX0VSTEFOR19TVUJTVF9JTlNUQUxMX0xJQl9ESVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6MjY4ClQxOSwxNjYKX0FDX0NIRUNLX0ZVTkNfT05DRV9BSF9DSEVDS19GVU5DKFskMV0pQUNfREVGVU4oW19BQ19GdW5jXyQxXSwKICBbbTRfZGl2ZXJ0X3RleHQoW0lOSVRfUFJFUEFSRV0sIFtBU19WQVJfQVBQRU5EKFthY19mdW5jX2xpc3RdLCBbIiAkMSJdKV0pCl9BQ19GVU5DU19FWFBBTlNJT05dKUFDX1JFUVVJUkUoW19BQ19GdW5jXyQxXSkKVDksMTc0CkFNX0VYRUVYVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9FWEVFWFQnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRVhFRVhUXSwgW0FDX0VYRUVYVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzQsMTA0Cm00X2xvY2F0aW9uKF9BQ19UWVBFX1VOU0lHTkVEX0lOVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjcxMApUMjgsMTAxCm00X2xvY2F0aW9uKF9BQ19MQU5HX09QRU5NUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MTkzMgpUMzUsMTA3Cm00X2xvY2F0aW9uKEFDX1NZU19MT05HX0ZJTEVfTkFNRVMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDoxODkKVDE3LDE0MzIKQUNfVFlQRV9HRVRHUk9VUFNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfVFlQRV9VSURfVF0pZG5sCkFDX0NBQ0hFX0NIRUNLKHR5cGUgb2YgYXJyYXkgYXJndW1lbnQgdG8gZ2V0Z3JvdXBzLCBhY19jdl90eXBlX2dldGdyb3VwcywKW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKApbWy8qIFRoYW5rcyB0byBNaWtlIFJlbmRlbGwgZm9yIHRoaXMgdGVzdC4gICovCl1BQ19JTkNMVURFU19ERUZBVUxUWwojZGVmaW5lIE5HSUQgMjU2CiN1bmRlZiBNQVgKI2RlZmluZSBNQVgoeCwgeSkgKCh4KSA+ICh5KSA/ICh4KSA6ICh5KSkKCmludAptYWluICgpCnsKICBnaWRfdCBnaWRzZXRbTkdJRF07CiAgaW50IGksIG47CiAgdW5pb24geyBnaWRfdCBndmFsOyBsb25nIGludCBsdmFsOyB9ICB2YWw7CgogIHZhbC5sdmFsID0gLTE7CiAgZm9yIChpID0gMDsgaSA8IE5HSUQ7IGkrKykKICAgIGdpZHNldFtpXSA9IHZhbC5ndmFsOwogIG4gPSBnZXRncm91cHMgKHNpemVvZiAoZ2lkc2V0KSAvIE1BWCAoc2l6ZW9mIChpbnQpLCBzaXplb2YgKGdpZF90KSkgLSAxLAoJCSBnaWRzZXQpOwogIC8qIEV4aXQgbm9uLXplcm8gaWYgZ2V0Z3JvdXBzIHNlZW1zIHRvIHJlcXVpcmUgYW4gYXJyYXkgb2YgaW50cy4gIFRoaXMKICAgICBoYXBwZW5zIHdoZW4gZ2lkX3QgaXMgc2hvcnQgaW50IGJ1dCBnZXRncm91cHMgbW9kaWZpZXMgYW4gYXJyYXkKICAgICBvZiBpbnRzLiAgKi8KICByZXR1cm4gbiA+IDAgJiYgZ2lkc2V0W25dICE9IHZhbC5ndmFsOwp9XV0pXSwKCSAgICAgICBbYWNfY3ZfdHlwZV9nZXRncm91cHM9Z2lkX3RdLAoJICAgICAgIFthY19jdl90eXBlX2dldGdyb3Vwcz1pbnRdLAoJICAgICAgIFthY19jdl90eXBlX2dldGdyb3Vwcz1jcm9zc10pCmlmIHRlc3QgJGFjX2N2X3R5cGVfZ2V0Z3JvdXBzID0gY3Jvc3M7IHRoZW4KICBkbmwgV2hlbiB3ZSBjYW4ndCBydW4gdGhlIHRlc3QgcHJvZ3JhbSAod2UgYXJlIGNyb3NzIGNvbXBpbGluZyksIHByZXN1bWUKICBkbmwgdGhhdCA8dW5pc3RkLmg+IGhhcyBlaXRoZXIgYW4gYWNjdXJhdGUgcHJvdG90eXBlIGZvciBnZXRncm91cHMgb3Igbm9uZS4KICBkbmwgT2xkIHN5c3RlbXMgd2l0aG91dCBwcm90b3R5cGVzIHByb2JhYmx5IHVzZSBpbnQuCiAgQUNfRUdSRVBfSEVBREVSKFtnZXRncm91cHMuKmludC4qZ2lkX3RdLCB1bmlzdGQuaCwKCQkgIGFjX2N2X3R5cGVfZ2V0Z3JvdXBzPWdpZF90LCBhY19jdl90eXBlX2dldGdyb3Vwcz1pbnQpCmZpXSkKQUNfREVGSU5FX1VOUVVPVEVEKEdFVEdST1VQU19ULCAkYWNfY3ZfdHlwZV9nZXRncm91cHMsCgkJICAgW0RlZmluZSB0byB0aGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgc2V0IGJ5CgkJICAgIGBnZXRncm91cHMnLiBVc3VhbGx5IHRoaXMgaXMgZWl0aGVyIGBpbnQnIG9yIGBnaWRfdCcuXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDEyMTAKQUNfUEFUSF9YX200X2RlZnVuX3BybyhbJDBdKWRubCBEb2N1bWVudCB0aGUgWCBhYm5vcm1hbCBvcHRpb25zIGluaGVyaXRlZCBmcm9tIGhpc3RvcnkuCm00X2RpdmVydF9vbmNlKFtIRUxQX0JFR0lOXSwgWwpYIGZlYXR1cmVzOgogIC0teC1pbmNsdWRlcz1ESVIgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKICAtLXgtbGlicmFyaWVzPURJUiAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSXSlkbmwKQUNfTVNHX0NIRUNLSU5HKFtmb3IgWF0pCgpBQ19BUkdfV0lUSCh4LCBbICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbV0pCiMgJGhhdmVfeCBpcyBgeWVzJywgYG5vJywgYGRpc2FibGVkJywgb3IgZW1wdHkgd2hlbiB3ZSBkbyBub3QgeWV0IGtub3cuCmlmIHRlc3QgIngkd2l0aF94IiA9IHhubzsgdGhlbgogICMgVGhlIHVzZXIgZXhwbGljaXRseSBkaXNhYmxlZCBYLgogIGhhdmVfeD1kaXNhYmxlZAplbHNlCiAgY2FzZSAkeF9pbmNsdWRlcywkeF9saWJyYXJpZXMgaW4gIygKICAgICpcJyopIEFDX01TR19FUlJPUihbY2Fubm90IHVzZSBYIGRpcmVjdG9yeSBuYW1lcyBjb250YWluaW5nICddKTs7ICMoCiAgICAqLE5PTkUgfCBOT05FLCopIF9BQ19QQVRIX1g7OyAjKAogICAgKikgaGF2ZV94PXllczs7CiAgZXNhYwogIGV2YWwgIiRhY19jdl9oYXZlX3giCmZpICMgJHdpdGhfeCAhPSBubwoKaWYgdGVzdCAiJGhhdmVfeCIgIT0geWVzOyB0aGVuCiAgQUNfTVNHX1JFU1VMVChbJGhhdmVfeF0pCiAgbm9feD15ZXMKZWxzZQogICMgSWYgZWFjaCBvZiB0aGUgdmFsdWVzIHdhcyBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCBvdmVycmlkZXMgZWFjaCBndWVzcy4KICB0ZXN0ICJ4JHhfaW5jbHVkZXMiID0geE5PTkUgJiYgeF9pbmNsdWRlcz0kYWNfeF9pbmNsdWRlcwogIHRlc3QgIngkeF9saWJyYXJpZXMiID0geE5PTkUgJiYgeF9saWJyYXJpZXM9JGFjX3hfbGlicmFyaWVzCiAgIyBVcGRhdGUgdGhlIGNhY2hlIHZhbHVlIHRvIHJlZmxlY3QgdGhlIGNvbW1hbmQgbGluZSB2YWx1ZXMuCiAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAoJYWNfeF9pbmNsdWRlcz0nJHhfaW5jbHVkZXMnXAoJYWNfeF9saWJyYXJpZXM9JyR4X2xpYnJhcmllcyciCiAgQUNfTVNHX1JFU1VMVChbbGlicmFyaWVzICR4X2xpYnJhcmllcywgaGVhZGVycyAkeF9pbmNsdWRlc10pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMTA3Cm00X2xvY2F0aW9uKF9BQ19ET19TVERFUlIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIzODYKVDI1LDEwMAptNF9sb2NhdGlvbihBQ19MQU5HX09CSkMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjI3NApUMzgsMTA3Cm00X2xvY2F0aW9uKEFDX0NPTkZJR19BVVhfRElSX0RFRkFVTFQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE2NzkKRjcsNAptNF9ldmFsZXZhbApUMjYsMgpBQ19MQU5HX1NPVVJDRShGb3J0cmFuIDc3KSQxClQxNCwxMDczCkFDX0FSR19QUk9HUkFNX200X2RlZnVuX29uY2UoW0FDX0FSR19QUk9HUkFNXSwgW2RubCBEb2N1bWVudCB0aGUgb3B0aW9ucy4KbTRfZGl2ZXJ0X3B1c2goW0hFTFBfQkVHSU5dKWRubAoKUHJvZ3JhbSBuYW1lczoKICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCAgICAgICAgICAgIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCiAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggICAgICAgICAgICBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCiAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0gICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKbTRfZGl2ZXJ0X3BvcChbSEVMUF9CRUdJTl0pZG5sCnRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgogIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMmXiYkcHJvZ3JhbV9wcmVmaXgmOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgojIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCiAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyZcJCYkcHJvZ3JhbV9zdWZmaXgmOyRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgojIERvdWJsZSBhbnkgXCBvciAkLgojIEJ5IGRlZmF1bHQgd2FzIGBzLHgseCcsIHJlbW92ZSBpdCBpZiB1c2VsZXNzLgpbYWNfc2NyaXB0PSdzL1tcXCRdLyYmL2c7cy87cyx4LHgsJC8vJ10KcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1gQVNfRUNITyhbIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIl0pIHwgc2VkICIkYWNfc2NyaXB0ImAKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0FSR19QUk9HUkFNXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfQVJHX1BST0dSQU1dKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfQVJHX1BST0dSQU1dKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19BUkdfUFJPR1JBTV0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDQ3LDEwNQptNF9sb2NhdGlvbihBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfU1VCRElSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjI4MwpUMjQsMwpfbTRfZGl2ZXJ0KFZFUlNJT05fVVNFUikyMDIKVDE1LDE4NgpBQ19QUk9HUkFNX1BBVEhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUFJPR1JBTV9QQVRIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1BBVEhfUFJPR10sIFtBQ19QQVRIX1BST0coJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDEwMQpBQ19NU0dfRkFJTFVSRXsgQVNfTUVTU0FHRShbZXJyb3I6IGluIGAkYWNfcHdkJzpdLCAyKQpBQ19NU0dfRVJST1IoWyQxClNlZSBgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlsc10sIFskMl0pOyB9ClQxNSw1Cl9tNF9kaXZlcnRfZ3JvdzEwMDAwClQxNyw1MDQKQUNfVFlQRV9VSU5UTUFYX1RfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfUkVRVUlSRShbQUNfVFlQRV9VTlNJR05FRF9MT05HX0xPTkdfSU5UXSkKICBBQ19DSEVDS19UWVBFKFt1aW50bWF4X3RdLAogICAgW0FDX0RFRklORShbSEFWRV9VSU5UTUFYX1RdLCAxLAogICAgICAgW0RlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGB1aW50bWF4X3QnLl0pXSwKICAgIFt0ZXN0ICRhY19jdl90eXBlX3Vuc2lnbmVkX2xvbmdfbG9uZ19pbnQgPSB5ZXMgXAogICAgICAgJiYgYWNfdHlwZT0ndW5zaWduZWQgbG9uZyBsb25nIGludCcgXAogICAgICAgfHwgYWNfdHlwZT0ndW5zaWduZWQgbG9uZyBpbnQnCiAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFt1aW50bWF4X3RdLCBbJGFjX3R5cGVdLAogICAgICAgW0RlZmluZSB0byB0aGUgd2lkZXN0IHVuc2lnbmVkIGludGVnZXIgdHlwZQoJaWYgPHN0ZGludC5oPiBhbmQgPGludHR5cGVzLmg+IGRvIG5vdCBkZWZpbmUuXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDE5NQpBQ19UUllfTElOS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfTElOSycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyQxXV0sIFtbJDJdXSldLCBbJDNdLCBbJDRdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjMsMTAzCm00X2xvY2F0aW9uKF9BQ19QQVRIX1gpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9saWJzLm00OjI5OApUMzUsMTA2Cm00X2xvY2F0aW9uKF9BQ19GQ19MSUJSQVJZX0xERkxBR1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjYxMgpUMTUsMzYKQVNfRVhFQ1VUQUJMRV9QeyB0ZXN0IC1mICQxICYmIEFTX1RFU1RfWChbJDFdKTsgfVtdClQxNSwxMjkKQVNfRVhFQ1VUQUJMRV9QX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19URVNUX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxODkKQUNfUFJPR1JBTV9DSEVDS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19QUk9HUkFNX0NIRUNLJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0NIRUNLX1BST0ddLCBbQUNfQ0hFQ0tfUFJPRygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsOTg1CkFDX0ZVTkNfTUVNQ01QX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBtZW1jbXBdLCBhY19jdl9mdW5jX21lbWNtcF93b3JraW5nLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwgW1sKICAvKiBTb21lIHZlcnNpb25zIG9mIG1lbWNtcCBhcmUgbm90IDgtYml0IGNsZWFuLiAgKi8KICBjaGFyIGMwID0gJ1wxMDAnLCBjMSA9ICdcMjAwJywgYzIgPSAnXDIwMSc7CiAgaWYgKG1lbWNtcCgmYzAsICZjMiwgMSkgPj0gMCB8fCBtZW1jbXAoJmMxLCAmYzIsIDEpID49IDApCiAgICByZXR1cm4gMTsKCiAgLyogVGhlIE5leHQgeDg2IE9wZW5TdGVwIGJ1ZyBzaG93cyB1cCBvbmx5IHdoZW4gY29tcGFyaW5nIDE2IGJ5dGVzCiAgICAgb3IgbW9yZSBhbmQgd2l0aCBhdCBsZWFzdCBvbmUgYnVmZmVyIG5vdCBzdGFydGluZyBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KICAgICBXaWxsaWFtIExld2lzIHByb3ZpZGVkIHRoaXMgdGVzdCBwcm9ncmFtLiAgICovCiAgewogICAgY2hhciBmb29bMjFdOwogICAgY2hhciBiYXJbMjFdOwogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICB7CgljaGFyICphID0gZm9vICsgaTsKCWNoYXIgKmIgPSBiYXIgKyBpOwoJc3RyY3B5IChhLCAiLS0tLS0tLS0wMTExMTExMSIpOwoJc3RyY3B5IChiLCAiLS0tLS0tLS0xMDAwMDAwMCIpOwoJaWYgKG1lbWNtcCAoYSwgYiwgMTYpID49IDApCgkgIHJldHVybiAxOwogICAgICB9CiAgICByZXR1cm4gMDsKICB9Cl1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY19tZW1jbXBfd29ya2luZz1ub10sCgkgICAgICAgW2FjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmc9bm9dKV0pCnRlc3QgJGFjX2N2X2Z1bmNfbWVtY21wX3dvcmtpbmcgPSBubyAmJiBBQ19MSUJPQkooW21lbWNtcF0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMTA0Cm00X2xvY2F0aW9uKF9BQ19DSEVDS19UWVBFX05FVykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjE0NwpUMjcsMTAwCm00X2xvY2F0aW9uKEFDX1BST0dfQ0NfQ19PKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDo1NjcKVDEzLDUwCkFDX01TR19SRVNVTFR7IF9BU19FQ0hPX0xPRyhbcmVzdWx0OiAkMV0pCl9BU19FQ0hPKFskMV0pOyB9ZG5sCgpUMjUsNjcKQUNfTEFOR19DT05GVEVTVChGb3J0cmFuKWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEW10kMQpfQUNFT0YKVDMyLDEwNwptNF9sb2NhdGlvbihfQUNfQ0FDSEVfQ0hFQ0tfSU5UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMDY1ClQ2LDU5OAptNF9mb3JtNF9wdXNoZGVmKFskMV0sIG00X2V2YWwoWyQyXSkpbTRfY29uZChbbTRfZXZhbCgoWyQzXSkgPiAoWyQyXSkpXSwgMSwKCSAgIFttNF9wdXNoZGVmKFtfbTRfc3RlcF0sIG00X2V2YWwobTRfZGVmYXVsdF9xdW90ZWQoWyQ0XSwKCSAgICAgIDEpKSltNF9hc3NlcnQoX200X3N0ZXAgPiAwKV8kMChfbTRfZGVmbihbJDFdKSwKICBtNF9ldmFsKCgoWyQzXSkgLSAoWyQyXSkpIC8gX200X3N0ZXAgKiBfbTRfc3RlcCArIChbJDJdKSksIF9tNF9zdGVwLF0sCgkgW200X2V2YWwoKFskM10pIDwgKFskMl0pKV0sIDEsCgkgICBbbTRfcHVzaGRlZihbX200X3N0ZXBdLCBtNF9ldmFsKG00X2RlZmF1bHRfcXVvdGVkKFskNF0sCgkgICAgICAtMSkpKW00X2Fzc2VydChfbTRfc3RlcCA8IDApXyQwKF9tNF9kZWZuKFskMV0pLAogIG00X2V2YWwoKChbJDJdKSAtIChbJDNdKSkgLyAtKF9tNF9zdGVwKSAqIF9tNF9zdGVwICsgKFskMl0pKSwgX200X3N0ZXAsXSwKCSBbbTRfcHVzaGRlZihbX200X3N0ZXBdKV8kMChfbTRfZGVmbihbJDFdKSwgX200X2RlZm4oWyQxXSksIDAsXSlbbTRfZGVmaW5lKFskMV0sXSwgWykkNV0pbTRfcG9wZGVmKFtfbTRfc3RlcF0sIFskMV0pClQ4LDQyCl9BU19FQ0hPX0FTX0VDSE9fVU5RVU9URUQoW19BU19RVU9URShbJDFdKV0sIFskMl0pClQxNiwxNDM4Cl9BQ19QQVRIX1hfWE1LTUZBQ19BUkdfVkFSKFhNS01GLCBbUGF0aCB0byB4bWttZiwgTWFrZWZpbGUgZ2VuZXJhdG9yIGZvciBYIFdpbmRvdyBTeXN0ZW1dKWRubApybSAtZiAtciBjb25mdGVzdC5kaXIKaWYgbWtkaXIgY29uZnRlc3QuZGlyOyB0aGVuCiAgY2QgY29uZnRlc3QuZGlyCiAgY2F0ID5JbWFrZWZpbGUgPDwnX0FDRU9GJwppbmNyb290OgoJQGVjaG8gaW5jcm9vdD0nJHtJTkNST09UfScKdXNybGliZGlyOgoJQGVjaG8gdXNybGliZGlyPScke1VTUkxJQkRJUn0nCmxpYmRpcjoKCUBlY2hvIGxpYmRpcj0nJHtMSUJESVJ9JwpfQUNFT0YKICBpZiAoZXhwb3J0IENDOyAke1hNS01GLXhta21mfSkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCAmJiB0ZXN0IC1mIE1ha2VmaWxlOyB0aGVuCiAgICAjIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nIC4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCiAgICBmb3IgYWNfdmFyIGluIGluY3Jvb3QgdXNybGliZGlyIGxpYmRpcjsgZG8KICAgICAgZXZhbCAiYWNfaW1fJGFjX3Zhcj1cYFwke01BS0UtbWFrZX0gJGFjX3ZhciAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy9eJGFjX3Zhcj0vL3AnXGAiCiAgICBkb25lCiAgICAjIE9wZW4gV2luZG93cyB4bWttZiByZXBvcnRlZGx5IHNldHMgTElCRElSIGluc3RlYWQgb2YgVVNSTElCRElSLgogICAgZm9yIGFjX2V4dGVuc2lvbiBpbiBhIHNvIHNsIGR5bGliIGxhIGRsbDsgZG8KICAgICAgaWYgdGVzdCAhIC1mICIkYWNfaW1fdXNybGliZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIiAmJgoJIHRlc3QgLWYgIiRhY19pbV9saWJkaXIvbGliWDExLiRhY19leHRlbnNpb24iOyB0aGVuCglhY19pbV91c3JsaWJkaXI9JGFjX2ltX2xpYmRpcjsgYnJlYWsKICAgICAgZmkKICAgIGRvbmUKICAgICMgU2NyZWVuIG91dCBib2d1cyB2YWx1ZXMgZnJvbSB0aGUgaW1ha2UgY29uZmlndXJhdGlvbi4gIFRoZXkgYXJlCiAgICAjIGJvZ3VzIGJvdGggYmVjYXVzZSB0aGV5IGFyZSB0aGUgZGVmYXVsdCBhbnl3YXksIGFuZCBiZWNhdXNlCiAgICAjIHVzaW5nIHRoZW0gd291bGQgYnJlYWsgZ2NjIG9uIHN5c3RlbXMgd2hlcmUgaXQgbmVlZHMgZml4ZWQgaW5jbHVkZXMuCiAgICBjYXNlICRhY19pbV9pbmNyb290IGluCgkvdXNyL2luY2x1ZGUpIGFjX3hfaW5jbHVkZXM9IDs7CgkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9JGFjX2ltX2luY3Jvb3Q7OwogICAgZXNhYwogICAgY2FzZSAkYWNfaW1fdXNybGliZGlyIGluCgkvdXNyL2xpYiB8IC91c3IvbGliNjQgfCAvbGliIHwgL2xpYjY0KSA7OwoJKikgdGVzdCAtZCAiJGFjX2ltX3VzcmxpYmRpciIgJiYgYWNfeF9saWJyYXJpZXM9JGFjX2ltX3VzcmxpYmRpciA7OwogICAgZXNhYwogIGZpCiAgY2QgLi4KICBybSAtZiAtciBjb25mdGVzdC5kaXIKZmkKClQ5LDE1MgpBQ19QUkVSRVFtNF9pZihtNF92ZXJzaW9uX2NvbXBhcmUoWzIuNjhdLCBbJDFdKSwKCVstMV0sCglbbTRfZGVmYXVsdChbJDNdLAoJCSAgICBbbTRfZmF0YWwoW0F1dG9jb25mIHZlcnNpb24gJDEgb3IgaGlnaGVyIGlzIHJlcXVpcmVkXSwKCQkJICAgICAgWzYzXSldKV0sCglbJDJdKQpUMjUsMTAyCm00X2xvY2F0aW9uKF9BU19FQ0hPX0xPRykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDo3NTcKVDE0LDE1NzQKX0FDX0NIRUNLX1BST0dfbTRfZGVmdW5fcHJvKFskMF0pIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCnNldCBkdW1teSAkMjsgYWNfd29yZD0kWzJdCkFDX01TR19DSEVDS0lORyhbZm9yICRhY193b3JkXSkKQUNfQ0FDSEVfVkFMKGFjX2N2X3Byb2dfJDEsCltpZiB0ZXN0IC1uICIkJDEiOyB0aGVuCiAgYWNfY3ZfcHJvZ18kMT0iJCQxIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KZWxzZQptNF9pZnZhbG4oWyQ2XSwKWyAgYWNfcHJvZ19yZWplY3RlZD1ub10pZG5sCl9BU19QQVRIX1dBTEsoWyQ1XSwKW2ZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogIGlmIEFTX0VYRUNVVEFCTEVfUChbIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiXSk7IHRoZW4KbTRfaWZ2YWxuKFskNl0sClsgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiJDYiOyB0aGVuCiAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwogICAgICAgY29udGludWUKICAgICBmaV0pZG5sCiAgICBhY19jdl9wcm9nXyQxPSIkMyIKICAgIF9BU19FQ0hPX0xPRyhbZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dF0pCiAgICBicmVhayAyCiAgZmkKZG9uZV0pCm00X2lmdmFsbihbJDZdLApbaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgogICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfJDEKICBzaGlmdAogIGlmIHRlc3QgJFtAJTpAXSAhPSAwOyB0aGVuCiAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KICAgICMgZmlyc3QgaWYgd2Ugc2V0ICQxIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgogICAgc2hpZnQKICAgIGFjX2N2X3Byb2dfJDE9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRbQF0iCm00X2lmKFskMl0sIFskNF0sClsgIGVsc2UKICAgICMgRGVmYXVsdCBpcyBhIGxvc2VyLgogICAgQUNfTVNHX0VSUk9SKFskMT0kNiB1bmFjY2VwdGFibGUsIGJ1dCBubyBvdGhlciAkNCBmb3VuZCBpbiBkbmwKbTRfZGVmYXVsdChbJDVdLCBbXCRQQVRIXSldKQpdKWRubAogIGZpCmZpXSlkbmwKZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKZG5sIHNvIEFDX0NIRUNLX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgptNF9pZnZhbG4oWyQ0XSwKWyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfJDEiICYmIGFjX2N2X3Byb2dfJDE9IiQ0Il0pZG5sCmZpXSlkbmwKJDE9JGFjX2N2X3Byb2dfJDEKaWYgdGVzdCAtbiAiJCQxIjsgdGhlbgogIEFDX01TR19SRVNVTFQoWyQkMV0pCmVsc2UKICBBQ19NU0dfUkVTVUxUKFtub10pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMTA5Cm00X2xvY2F0aW9uKEFDX0ZVTkNfVlBSSU5URikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxOTU5ClQzMywwCm00X2luY2x1ZGUoYXV0b2NvbmYvZnVuY3Rpb25zLm00KQpUMTcsMTg1Cl9BU19UUl9TSF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19DUl9QUkVQQVJFXSkjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVtbXl8kYXNfY3JfYWxudW1dXSVfJWcnIgpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDExMApfQVNfQ0xFQU5fRElSaWYgdGVzdCAtZCAkMTsgdGhlbgogIGZpbmQgJDEgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDsKICBybSAtZnIgJDEvKiAkMS8uW1shLl1dICQxLy4/PyoKZmkKVDIwLDE4MQpBU19GVU5DVElPTl9ERVNDUklCRUAlOkAgJDFbXW00X2lmdmFsKFskMl0sIFsgJDJdKQpAJTpAIG00X3RyYW5zbGl0KG00X2Zvcm1hdChbJSpzXSwKCSAgIG00X2RlY3IobTRfcWxlbihfbTRfZXhwYW5kKFskMVtdbTRfaWZ2YWwoWyQyXSwgWyAkMl0pCl0pKSksIFtdKSwgWyBdLCBbLV0pCm00X3RleHRfd3JhcChbJDNdLCBbQCU6QCBdLCBbXSwgWyQ0XSkKVDM0LDEwMjAKQUNfTEFOR19GVU5DX0xJTktfVFJZKE9iamVjdGl2ZSBDKUFDX0xBTkdfUFJPR1JBTSgKWy8qIERlZmluZSAkMSB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICQxLgogICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KI2RlZmluZSAkMSBpbm5vY3VvdXNfJDEKCi8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDEgKCk7IGJlbG93LgogICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQogICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KCiNpZmRlZiBfX1NURENfXwojIGluY2x1ZGUgPGxpbWl0cy5oPgojZWxzZQojIGluY2x1ZGUgPGFzc2VydC5oPgojZW5kaWYKCiN1bmRlZiAkMQoKLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMSAoKTsKLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwogICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwojaWYgZGVmaW5lZCBfX3N0dWJfJDEgfHwgZGVmaW5lZCBfX3N0dWJfX18kMQpjaG9rZSBtZQojZW5kaWYKXSwgW3JldHVybiAkMSAoKTtdKQpUMTMsMTU4NQpBQ19DQUNIRV9TQVZFY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCiMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQojIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAojIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KIwojIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAojIHRoZSAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KIwojIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KIyBsb2FkaW5nIHRoaXMgZmlsZSwgb3RoZXIgKnVuc2V0KiBgYWNfY3ZfZm9vJyB3aWxsIGJlIGFzc2lnbmVkIHRoZQojIGZvbGxvd2luZyB2YWx1ZXMuCgpfQUNFT0YKCl9BQ19DQUNIRV9EVU1QKCkgfAogIHNlZCBbJwogICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAogICAgIHQgY2xlYXIKICAgICA6Y2xlYXIKICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCiAgICAgdCBlbmQKICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KICAgICA6ZW5kJ10gPj5jb25mY2FjaGUKaWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQogIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgogICAgaWYgdGVzdCAieCRjYWNoZV9maWxlIiAhPSAieC9kZXYvbnVsbCI7IHRoZW4KICAgICAgQUNfTVNHX05PVElDRShbdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGVdKQogICAgICBpZiB0ZXN0ICEgLWYgIiRjYWNoZV9maWxlIiB8fCB0ZXN0IC1oICIkY2FjaGVfZmlsZSI7IHRoZW4KCWNhdCBjb25mY2FjaGUgPiIkY2FjaGVfZmlsZSIKICAgICAgZWxzZQpkbmwgVHJ5IHRvIHVwZGF0ZSB0aGUgY2FjaGUgZmlsZSBhdG9taWNhbGx5IGV2ZW4gb24gZGlmZmVyZW50IG1vdW50IHBvaW50czsKZG5sIGF0IHRoZSBzYW1lIHRpbWUsIGF2b2lkIGZpbGVuYW1lIGxpbWl0YXRpb24gaXNzdWVzIGluIHRoZSBjb21tb24gY2FzZS4KICAgICAgICBjYXNlICRjYWNoZV9maWxlIGluICMoCiAgICAgICAgKi8qIHwgPzoqKQoJICBtdiAtZiBjb25mY2FjaGUgIiRjYWNoZV9maWxlIiQkICYmCgkgIG12IC1mICIkY2FjaGVfZmlsZSIkJCAiJGNhY2hlX2ZpbGUiIDs7ICMoCiAgICAgICAgKikKCSAgbXYgLWYgY29uZmNhY2hlICIkY2FjaGVfZmlsZSIgOzsKCWVzYWMKICAgICAgZmkKICAgIGZpCiAgZWxzZQogICAgQUNfTVNHX05PVElDRShbbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGVdKQogIGZpCmZpCnJtIC1mIGNvbmZjYWNoZVtdZG5sCgpUMTYsMjk4Cm00X21hcF9hcmdzX3BhaXJtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkI10pXSwKICAgICAgIFskI10sIFsxXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjOiAkMV0pXSwKICAgICAgIFskI10sIFsyXSwgW10sCiAgICAgICBbJCNdLCBbM10sIFttNF9kZWZhdWx0KFskMl0sIFskMV0pKFskM10pW11dLAogICAgICAgWyQjXSwgWzRdLCBbJDEoWyQzXSwgWyQ0XSlbXV0sCiAgICAgICBbJDEoWyQzXSwgWyQ0XSlbXSQwKFskMV0sIFskMl0sIG00X3NoaWZ0KG00X3NoaWZ0MygkQCkpKV0pClQyNSwxMDcKbTRfbG9jYXRpb24oQUNfTVNHX0VSUk9SKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMjUwClQxOCwxCl9tNF9kaXZlcnQoTk9USUNFKTYKVDEyLDE4MwpBQ19GSU5EX1hUUkFfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRklORF9YVFJBJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1BBVEhfWFRSQV0sIFtBQ19QQVRIX1hUUkEoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDk0CkFDX0NIRUNLX0RFQ0xTX200X2RlZnVuX3BybyhbJDBdKW00X21hcF9hcmdzX3NlcChbXyQwKF0sIFssIFskMl0sIFskM10sIFskNF0pXSwgW10sICQxKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsOTkKbTRfbG9jYXRpb24oQUNfTEFOR19DKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDo3MwpUMjcsMQpfbTRfZGl2ZXJ0KEhFQURFUi1SRVZJU0lPTikxClQxNywzNDAKQUNfU1RSVUNUX1NUX1JERVZfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RSVUNUX1NUX1JERVYnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X3JkZXZdLAoJCSBbQUNfREVGSU5FKEhBVkVfU1RfUkRFViwgMSwKCQkJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIGBzdHJ1Y3Qgc3RhdCcgaGFzIGBzdF9yZGV2Jy4KCQkJICAgICBEZXByZWNhdGVkLCB1c2UgYEhBVkVfU1RSVUNUX1NUQVRfU1RfUkRFVicKCQkJICAgICBpbnN0ZWFkLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwxMDM3CkFDX0NBTk9OSUNBTF9UQVJHRVRfbTRfZGVmdW5fb25jZShbQUNfQ0FOT05JQ0FMX1RBUkdFVF0sIFtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCkFDX0JFRk9SRShbJDBdLCBbQUNfQVJHX1BST0dSQU1dKWRubAptNF9kaXZlcnRfb25jZShbSEVMUF9DQU5PTl0sCltbICAtLXRhcmdldD1UQVJHRVQgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIGNvbXBpbGVycyBmb3IgVEFSR0VUIFtIT1NUXV1dKWRubApBQ19DQUNIRV9DSEVDSyhbdGFyZ2V0IHN5c3RlbSB0eXBlXSwgW2FjX2N2X3RhcmdldF0sCltpZiB0ZXN0ICJ4JHRhcmdldF9hbGlhcyIgPSB4OyB0aGVuCiAgYWNfY3ZfdGFyZ2V0PSRhY19jdl9ob3N0CmVsc2UKICBhY19jdl90YXJnZXQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJHRhcmdldF9hbGlhc2AgfHwKICAgIEFDX01TR19FUlJPUihbJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJHRhcmdldF9hbGlhcyBmYWlsZWRdKQpmaQpdKQpfQUNfQ0FOT05JQ0FMX1NQTElUKFt0YXJnZXRdKQoKIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgojIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCnRlc3QgLW4gIiR0YXJnZXRfYWxpYXMiICYmCiAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAogICAgTk9ORU5PTkVzLHgseCwgJiYKICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tW11kbmwKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0NBTk9OSUNBTF9UQVJHRVRdKW00X3VucXVvdGUoXSwgWylfbTRfZGVmdW5fZXBpKFtBQ19DQU5PTklDQUxfVEFSR0VUXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0NBTk9OSUNBTF9UQVJHRVRdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19DQU5PTklDQUxfVEFSR0VUXSxdLCBbLCBfbTRfZGl2ZXJ0X2R1bXApXV0pKQpUMzEsMTA4Cm00X2xvY2F0aW9uKF9BQ19GVU5DX01BTExPQ19JRikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4OTEKVDEzLDE5NgpBQ19HRVRMT0FEQVZHX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0dFVExPQURBVkcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19HRVRMT0FEQVZHXSwgW0FDX0ZVTkNfR0VUTE9BREFWRygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMgpBQ19MQU5HX1NPVVJDRShDKyspJDEKVDI4LDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX0lOVDY0X1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo2MTkKVDE0LDE1MDcKQUNfSEVBREVSX1NURENfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMsIGFjX2N2X2hlYWRlcl9zdGRjLApbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmbG9hdC5oPgpdXSldLAoJCSAgICBbYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzXSwKCQkgICAgW2FjX2N2X2hlYWRlcl9zdGRjPW5vXSkKCmlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgogIEFDX0VHUkVQX0hFQURFUihtZW1jaHIsIHN0cmluZy5oLCAsIGFjX2N2X2hlYWRlcl9zdGRjPW5vKQpmaQoKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCiAgQUNfRUdSRVBfSEVBREVSKGZyZWUsIHN0ZGxpYi5oLCAsIGFjX2N2X2hlYWRlcl9zdGRjPW5vKQpmaQoKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCiAgQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoCltbI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQojIGRlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCiMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKI2Vsc2UKIyBkZWZpbmUgSVNMT1dFUihjKSBcCgkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKCQkgICAgIHx8ICgncycgPD0gKGMpICYmIChjKSA8PSAneicpKQojIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQojZW5kaWYKCiNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCmludAptYWluICgpCnsKICBpbnQgaTsKICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCiAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCgl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKICAgICAgcmV0dXJuIDI7CiAgcmV0dXJuIDA7Cn1dXSldLCAsIGFjX2N2X2hlYWRlcl9zdGRjPW5vLCA6KQpmaV0pCmlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKFNURENfSEVBREVSUywgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxNDMKQUNfRkNfV1JBUFBFUlNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbX0FDX0ZDX05BTUVfTUFOR0xJTkddKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX0FDX0ZDX1dSQVBQRVJTCkFDX0xBTkdfUE9QKEZvcnRyYW4pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTI0CkFTX01FU1NBR0VtNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKCSAgW3sgX0FTX0VDSE9fTE9HKFskMV0pCl9BU19FQ0hPKFskYXNfbWU6ICQxXSwgWyQyXSk7fV0sCgkgIFtfQVNfRUNITyhbJGFzX21lOiAkMV0sIFskMl0pXSlbXVtdClQxMCwxMjcKQVNfTUVTU0FHRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfTUVfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDU2CkFDX1RZUEVfSU5UMTZfVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfVFlQRV9JTlQoMTYpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSwxNzgKQUNfVEVTVF9DUFBfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVEVTVF9DUFAnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFJZX0NQUF0sIFtBQ19UUllfQ1BQKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCwxMDEKbTRfbG9jYXRpb24oQUNfQ19UWVBFT0YpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjE4OTQKVDE2LDI2NQpBQ19MQU5HKEZvcnRyYW4pYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9CmFjX2NvbXBpbGU9JyRGQyAtYyAkRkNGTEFHUyAkYWNfZmNmbGFnc19zcmNleHQgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19saW5rPSckRkMgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRGQ0ZMQUdTICRMREZMQUdTICRhY19mY2ZsYWdzX3NyY2V4dCBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mQVNfTUVTU0FHRV9MT0dfRkQnCmFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfZmNfY29tcGlsZXJfZ251CgpUMzIsMTAwCm00X2xvY2F0aW9uKF9BQ19BUkdfVkFSX0xERkxBR1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjMxOApUMzQsMTA2Cm00X2xvY2F0aW9uKEFDX1NUQVRfTUFDUk9TX0JST0tFTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojc0ClQyNCwxMDcKbTRfbG9jYXRpb24oQUNfUFJPR19TRUQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo4NjgKVDI1LDEwMAptNF9sb2NhdGlvbihBQ19QUk9HX09CSkMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00Ojg3MQpUMjUsMTA3Cm00X2xvY2F0aW9uKEFDX0lTQ19QT1NJWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQ0MgpUMTYsMjcKX0FTX0NBU0VfREVGQVVMVCBbQCU6QChdCiAgKlspXSA6CiAgICAkMSA7OwpUNywzMApBU19XQVJOQVNfTUVTU0FHRShbV0FSTklORzogJDFdLCBbMl0pClQyOCwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9VSU5UOF9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjIwClQzMCwxMDUKbTRfbG9jYXRpb24oQUNfQ09ORklHX0hFQURFUlMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6NzE1ClQxOCwxMjcKX0FDX0NIRUNLX1RZUEVfT0xEX0FDX0NIRUNLX1RZUEVfTkVXKFskMV0sLAogICBbQUNfREVGSU5FX1VOUVVPVEVEKFskMV0sIFskMl0sCgkJICAgICAgIFtEZWZpbmUgdG8gYCQyJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS5dKV0pZG5sCgpUMTYsNjUKQUNfVFlQRV9VSU5UMzJfVF9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfVFlQRV9VTlNJR05FRF9JTlQoMzIpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiw2MQpBQ19SRVBMQUNFX0ZVTkNTX200X2RlZnVuX3BybyhbJDBdKV8kMChtNF9mbGF0dGVuKFskMV0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTEyCl9BQ19DQUNIRV9DSEVDS19JTlRfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKICAgW0FDX0NPTVBVVEVfSU5UKFskMl0sIFskM10sIFskNF0sIFskNV0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSw2NApBQ19UWVBFX1VJTlQ4X1RfbTRfZGVmdW5fcHJvKFskMF0pX0FDX1RZUEVfVU5TSUdORURfSU5UKDgpW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwxMDIKbTRfbG9jYXRpb24oX0FTX0JBU0VOQU1FX0VYUFIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6ODg4ClQxNyw0OTAKX0FTX1RSX1NIX0xJVEVSQUxtNF90cmFuc2xpdChbWyQxXV0sCiAgWyorW11dWwECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjKiUmJygpJCssLi86Ozw9Pj9AW1xdXmB7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LV0sCiAgW3BwW11dW19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX10pClQxMCw2NgpfQVNfRUNIT19OQVNfRUNIT19OKFsiX0FTX1FVT1RFKFskMV0pIl0pID4mbTRfZGVmYXVsdChbJDJdLCBbQVNfTUVTU0FHRV9GRF0pClQ3LDM2Cm00X3NpZ25tNF9ldmFsKCgoWyQxXSkgPiAwKSAtICgoWyQxXSkgPCAwKSkKVDIwLDMKX200X2RpdmVydChIRUxQX1ZBUikxMDQKVDE1LDg2NApfQUNfT1VUUFVUX0xJTksKICAjCiAgIyBDT05GSUdfTElOSwogICMKCiAgaWYgdGVzdCAiJGFjX3NvdXJjZSIgPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRzcmNkaXIiID0gJy4nOyB0aGVuCiAgICA6CiAgZWxzZQogICAgIyBQcmVmZXIgdGhlIGZpbGUgZnJvbSB0aGUgc291cmNlIHRyZWUgaWYgbmFtZXMgYXJlIGlkZW50aWNhbC4KICAgIGlmIHRlc3QgIiRhY19zb3VyY2UiID0gIiRhY19maWxlIiB8fCB0ZXN0ICEgLXIgIiRhY19zb3VyY2UiOyB0aGVuCiAgICAgIGFjX3NvdXJjZT0kc3JjZGlyLyRhY19zb3VyY2UKICAgIGZpCgogICAgQUNfTVNHX05PVElDRShbbGlua2luZyAkYWNfc291cmNlIHRvICRhY19maWxlXSkKCiAgICBpZiB0ZXN0ICEgLXIgIiRhY19zb3VyY2UiOyB0aGVuCiAgICAgIEFDX01TR19FUlJPUihbJGFjX3NvdXJjZTogZmlsZSBub3QgZm91bmRdKQogICAgZmkKICAgIHJtIC1mICIkYWNfZmlsZSIKCiAgICAjIFRyeSBhIHJlbGF0aXZlIHN5bWxpbmssIHRoZW4gYSBoYXJkIGxpbmssIHRoZW4gYSBjb3B5LgogICAgY2FzZSAkYWNfc291cmNlIGluCiAgICBbW1xcLyRdXSogfCA/OltbXFwvXV0qICkgYWNfcmVsX3NvdXJjZT0kYWNfc291cmNlIDs7CgkqKSBhY19yZWxfc291cmNlPSRhY190b3BfYnVpbGRfcHJlZml4JGFjX3NvdXJjZSA7OwogICAgZXNhYwogICAgbG4gLXMgIiRhY19yZWxfc291cmNlIiAiJGFjX2ZpbGUiIDI+L2Rldi9udWxsIHx8CiAgICAgIGxuICIkYWNfc291cmNlIiAiJGFjX2ZpbGUiIDI+L2Rldi9udWxsIHx8CiAgICAgIGNwIC1wICIkYWNfc291cmNlIiAiJGFjX2ZpbGUiIHx8CiAgICAgIEFDX01TR19FUlJPUihbY2Fubm90IGxpbmsgb3IgY29weSAkYWNfc291cmNlIHRvICRhY19maWxlXSkKICBmaQoKVDE2LDE4NwpBQ19QUk9HUkFNX0VHUkVQX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1BST0dSQU1fRUdSRVAnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRUdSRVBfQ1BQXSwgW0FDX0VHUkVQX0NQUCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMTE3CkFDX0xBTkdfQ09NUElMRVJBQ19CRUZPUkUoW0FDX0xBTkdfQ09NUElMRVIoXV9BQ19MQU5HWyldLAoJICAgW0FDX0xBTkdfUFJFUFJPQyhdX0FDX0xBTkdbKV0pZG5sCl9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQCkKVDIyLDEwNgptNF9sb2NhdGlvbihBQ19GRF9NU0cpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjM4NgpUMjUsNTMKX200X2V4cGFuc2lvbl9zdGFja19lbnRyeV9tNF9kZWZuKFttNF9sb2NhdGlvbigkMSldKVs6ICQxIGlzIGV4cGFuZGVkIGZyb20uLi5dClQxOSwxOTEKX0FTX0RJUk5BTUVfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfRVhQUl9QUkVQQVJFXSlpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBhc19kaXJuYW1lPWRpcm5hbWUKZWxzZQogIGFzX2Rpcm5hbWU9ZmFsc2UKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywzNjkKX0FDX0lOSVRfRElSQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGl2ZXJ0X3B1c2goW1BBUlNFX0FSR1NdKWRubAoKYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCmFjX2xzX2RpPWBscyAtZGkgLmAgJiYKYWNfcHdkX2xzX2RpPWBjZCAiJGFjX3B3ZCIgJiYgbHMgLWRpIC5gIHx8CiAgQUNfTVNHX0VSUk9SKFt3b3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZF0pCnRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAogIEFDX01TR19FUlJPUihbcHdkIGRvZXMgbm90IHJlcG9ydCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5XSkKCm00X2RpdmVydF9wb3AoW1BBUlNFX0FSR1NdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDIyNApBQ19SRVNUQVJUQUJMRV9TWVNDQUxMU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19SRVNUQVJUQUJMRV9TWVNDQUxMUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19TWVNfUkVTVEFSVEFCTEVfU1lTQ0FMTFNdLCBbQUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywxNTgwCkFDX0ZVTkNfV0FJVDNfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwKWyQwOiBgd2FpdDMnIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBQT1NJWC4KUmVtb3ZlIHRoaXMgYEFDX0ZVTkNfV0FJVDMnIGFuZCBhZGp1c3QgeW91ciBjb2RlIHRvIHVzZSBgd2FpdHBpZCcgaW5zdGVhZC5dKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIHdhaXQzIHRoYXQgZmlsbHMgaW4gcnVzYWdlXSwKCSAgICAgICBbYWNfY3ZfZnVuY193YWl0M19ydXNhZ2VdLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoCltBQ19JTkNMVURFU19ERUZBVUxUWwojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KLyogSFAtVVggaGFzIHdhaXQzIGJ1dCBkb2VzIG5vdCBmaWxsIGluIHJ1c2FnZSBhdCBhbGwuICAqLwppbnQKbWFpbiAoKQp7CiAgc3RydWN0IHJ1c2FnZSByOwogIGludCBpOwogIC8qIFVzZSBhIGZpZWxkIHRoYXQgd2UgY2FuIGZvcmNlIG5vbnplcm8gLS0KICAgICB2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcy4KICAgICBGb3Igc3lzdGVtcyBsaWtlIE5lWFQgYW5kIE9TRi8xIHRoYXQgZG9uJ3Qgc2V0IGl0LAogICAgIGFsc28gdXNlIHRoZSBzeXN0ZW0gQ1BVIHRpbWUuICBBbmQgcGFnZSBmYXVsdHMgKEkvTykgZm9yIExpbnV4LiAgKi8KICByLnJ1X252Y3N3ID0gMDsKICByLnJ1X3N0aW1lLnR2X3NlYyA9IDA7CiAgci5ydV9zdGltZS50dl91c2VjID0gMDsKICByLnJ1X21hamZsdCA9IHIucnVfbWluZmx0ID0gMDsKICBzd2l0Y2ggKGZvcmsgKCkpCiAgICB7CiAgICBjYXNlIDA6IC8qIENoaWxkLiAgKi8KICAgICAgc2xlZXAoMSk7IC8qIEdpdmUgdXAgdGhlIENQVS4gICovCiAgICAgIF9leGl0KDApOwogICAgICBicmVhazsKICAgIGNhc2UgLTE6IC8qIFdoYXQgY2FuIHdlIGRvPyAgKi8KICAgICAgX2V4aXQoMCk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDogLyogUGFyZW50LiAgKi8KICAgICAgd2FpdDMoJmksIDAsICZyKTsKICAgICAgLyogQXZvaWQgInRleHQgZmlsZSBidXN5IiBmcm9tIHJtIG9uIGZhc3QgSFAtVVggbWFjaGluZXMuICAqLwogICAgICBzbGVlcCgyKTsKICAgICAgcmV0dXJuIChyLnJ1X252Y3N3ID09IDAgJiYgci5ydV9tYWpmbHQgPT0gMCAmJiByLnJ1X21pbmZsdCA9PSAwCgkgICAgICAmJiByLnJ1X3N0aW1lLnR2X3NlYyA9PSAwICYmIHIucnVfc3RpbWUudHZfdXNlYyA9PSAwKTsKICAgIH0KfV1dKV0sCgkgICAgICAgW2FjX2N2X2Z1bmNfd2FpdDNfcnVzYWdlPXllc10sCgkgICAgICAgW2FjX2N2X2Z1bmNfd2FpdDNfcnVzYWdlPW5vXSwKCSAgICAgICBbYWNfY3ZfZnVuY193YWl0M19ydXNhZ2U9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfd2FpdDNfcnVzYWdlID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfV0FJVDMsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdDMnIHN5c3RlbSBjYWxsLgoJICAgICBEZXByZWNhdGVkLCB5b3Ugc2hvdWxkIG5vIGxvbmdlciBkZXBlbmQgdXBvbiBgd2FpdDMnLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzIsMTA3Cm00X2xvY2F0aW9uKEFDX0NPTkZJR19NQUNST19ESVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE3MzIKVDE1LDI5MQpfQUNfQ0hFQ0tfREVDTFNBQ19DSEVDS19ERUNMKFskMV0sIFthY19oYXZlX2RlY2w9MV0sIFthY19oYXZlX2RlY2w9MF0sIFskNF0pQUNfREVGSU5FX1VOUVVPVEVEKEFTX1RSX0NQUChtNF9icGF0c3Vic3QoSEFWRV9ERUNMX1skMV0sWyAqKC4qXSkpLAogIFskYWNfaGF2ZV9kZWNsXSwKICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGAkMScsCiAgIGFuZCB0byAwIGlmIHlvdSBkb24ndC5dKW00X2lmdmFsbihbJDIkM10sIFtBU19JRihbdGVzdCAkYWNfaGF2ZV9kZWNsID0gMV0sIFskMl0sIFskM10pXSkKVDE2LDUxNApBQ19IRUFERVJfRElSRU5UX200X2RlZnVuX3BybyhbJDBdKW00X21hcF9hcmdzKFtfQUhfQ0hFQ0tfSEVBREVSX0RJUkVOVF0sIFtkaXJlbnQuaF0sIFtzeXMvbmRpci5oXSwKCSAgICAgW3N5cy9kaXIuaF0sIFtuZGlyLmhdKWFjX2hlYWRlcl9kaXJlbnQ9bm8KZm9yIGFjX2hkciBpbiBkaXJlbnQuaCBzeXMvbmRpci5oIHN5cy9kaXIuaCBuZGlyLmg7IGRvCiAgX0FDX0NIRUNLX0hFQURFUl9ESVJFTlQoJGFjX2hkciwKCQkJICBbQUNfREVGSU5FX1VOUVVPVEVEKEFTX1RSX0NQUChIQVZFXyRhY19oZHIpLCAxKQphY19oZWFkZXJfZGlyZW50PSRhY19oZHI7IGJyZWFrXSkKZG9uZQojIFR3byB2ZXJzaW9ucyBvZiBvcGVuZGlyIGV0IGFsLiBhcmUgaW4gLWxkaXIgYW5kIC1seCBvbiBTQ08gWGVuaXguCmlmIHRlc3QgJGFjX2hlYWRlcl9kaXJlbnQgPSBkaXJlbnQuaDsgdGhlbgogIEFDX1NFQVJDSF9MSUJTKG9wZW5kaXIsIGRpcikKZWxzZQogIEFDX1NFQVJDSF9MSUJTKG9wZW5kaXIsIHgpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMgpfQVNfTElURVJBTF9IRVJFRE9DX0lGX1lFUyQxClQzNiwyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oT2JqZWN0aXZlIEMrKylBQ19MQU5HX1BST0dSQU0oW10sIFtdKQpUMjksMzAKX0FDX0xBTkdfTlVMTF9QUk9HUkFNKEVybGFuZylBQ19MQU5HX1BST0dSQU0oW10sIFtoYWx0KDApXSkKVDEyLDQ0OApBQ19FR1JFUF9DUFBfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QUkVQUk9DX1JFUVVJUkUoKWRubApBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKQUNfTEFOR19DT05GVEVTVChbQUNfTEFOR19TT1VSQ0UoW1skMl1dKV0pCkFTX0lGKFtkbmwgZXZhbCBpcyBuZWNlc3NhcnkgdG8gZXhwYW5kIGFjX2NwcC4KZG5sIFVsdHJpeCBhbmQgUHlyYW1pZCBzaCByZWZ1c2UgdG8gcmVkaXJlY3Qgb3V0cHV0IG9mIGV2YWwsIHNvIHVzZSBzdWJzaGVsbC4KKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JkFTX01FU1NBR0VfTE9HX0ZEIHwKZG5sIFF1b3RlICQxIHRvIHByZXZlbnQgbTQgZnJvbSBlYXRpbmcgY2hhcmFjdGVyIGNsYXNzZXMKICAkRUdSRVAgIlskMV0iID4vZGV2L251bGwgMj4mMV0sCiAgWyQzXSwKICBbJDRdKQpybSAtZiBjb25mdGVzdCoKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiw2MjEKQUNfQ0hFQ0tfTElCX200X2RlZnVuX3BybyhbJDBdKW00X2lmdmFsKFskM10sICwgW0FIX0NIRUNLX0xJQihbJDFdKV0pZG5sCkFTX0xJVEVSQUxfV09SRF9JRihbJDFdLAoJICAgICAgW0FTX1ZBUl9QVVNIREVGKFthY19MaWJdLCBbYWNfY3ZfbGliXyQxXyQyXSldLAoJICAgICAgW0FTX1ZBUl9QVVNIREVGKFthY19MaWJdLCBbYWNfY3ZfbGliXyQxJydfJDJdKV0pZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgJDIgaW4gLWwkMV0sIFthY19MaWJdLApbYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwpMSUJTPSItbCQxICQ1ICRMSUJTIgpBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19DQUxMKFtdLCBbJDJdKV0sCgkgICAgICAgW0FTX1ZBUl9TRVQoW2FjX0xpYl0sIFt5ZXNdKV0sCgkgICAgICAgW0FTX1ZBUl9TRVQoW2FjX0xpYl0sIFtub10pXSkKTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCU10pCkFTX1ZBUl9JRihbYWNfTGliXSwgW3llc10sCiAgICAgIFttNF9kZWZhdWx0KFskM10sIFtBQ19ERUZJTkVfVU5RVU9URUQoQVNfVFJfQ1BQKEhBVkVfTElCJDEpKQogIExJQlM9Ii1sJDEgJExJQlMiCl0pXSwKICAgICAgWyQ0XSkKQVNfVkFSX1BPUERFRihbYWNfTGliXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19TQVZFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMjYKVDE0LDE1OQphY19jdl9wcm9nX2c3N19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBhY19jdl9wcm9nX2c3NycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKYWNfY3ZfZjc3X2NvbXBpbGVyX2dudVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsODM0Cl9BQ19QUk9HX0NYWF9HYWNfdGVzdF9DWFhGTEFHUz0ke0NYWEZMQUdTK3NldH0KYWNfc2F2ZV9DWFhGTEFHUz0kQ1hYRkxBR1MKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIGFjY2VwdHMgLWcsIGFjX2N2X3Byb2dfY3h4X2csCiAgW2FjX3NhdmVfY3h4X3dlcnJvcl9mbGFnPSRhY19jeHhfd2Vycm9yX2ZsYWcKICAgYWNfY3h4X3dlcnJvcl9mbGFnPXllcwogICBhY19jdl9wcm9nX2N4eF9nPW5vCiAgIENYWEZMQUdTPSItZyIKICAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCiAgICAgW2FjX2N2X3Byb2dfY3h4X2c9eWVzXSwKICAgICBbQ1hYRkxBR1M9IiIKICAgICAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCglbXSwKCVthY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCgkgQ1hYRkxBR1M9Ii1nIgoJIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJICAgW2FjX2N2X3Byb2dfY3h4X2c9eWVzXSldKV0pCiAgIGFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWddKQppZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUwplbGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X2cgPSB5ZXM7IHRoZW4KICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgogICAgQ1hYRkxBR1M9Ii1nIC1PMiIKICBlbHNlCiAgICBDWFhGTEFHUz0iLWciCiAgZmkKZWxzZQogIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCiAgICBDWFhGTEFHUz0iLU8yIgogIGVsc2UKICAgIENYWEZMQUdTPQogIGZpCmZpW11kbmwKClQyMSwxNTkKX0FDX0hFQURFUlNfRVhQQU5TSU9OCiAgbTRfZGl2ZXJ0X3RleHQoW0RFRkFVTFRTXSwgW2FjX2hlYWRlcl9saXN0PV0pCiAgQUNfQ0hFQ0tfSEVBREVSUyhbJGFjX2hlYWRlcl9saXN0XSwgW10sIFtdLCBbQUNfSU5DTFVERVNfREVGQVVMVF0pCiAgbTRfZGVmaW5lKFtfQUNfSEVBREVSU19FWFBBTlNJT05dLCBbXSkKClQyNCw3MgpfQUNfQ09ORklHX0NPTU1BTkRTX0lOSVRtNF9pZnZhbChbJDFdLAoJICBbbTRfYXBwZW5kKFtfQUNfT1VUUFVUX0NPTU1BTkRTX0lOSVRdLAoJCSAgICAgWyQxCl0pXSkKVDE0LDEzMwpBQ19QUk9HX0ZDX0NfT19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0ZDXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4pZG5sCl9BQ19QUk9HX0ZDX0NfTwpBQ19MQU5HX1BPUChGb3J0cmFuKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX0lOVFBUUl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzQzClQyNiwxMDYKbTRfbG9jYXRpb24oQUNfRElSX0hFQURFUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6ODc0ClQxNCw3OApBQ19UUllfQ09NTUFORF9tNF9kZWZ1bl9wcm8oWyQwXSl7IGFjX3RyeT0nJDEnCiAgX0FDX0VWQUwoWyRhY190cnldKTsgfVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMzIwCl9BQ19MSVNUX01FTUJFUl9JRl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZihbJDFdLCAsIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnQgMV0pXSwKICAgICAgWyQyXSwgLCBbbTRfZmF0YWwoWyQwOiBtaXNzaW5nIGFyZ3VtZW50IDJdKV0pICBhY19leGlzdHM9ZmFsc2UKICBmb3IgYWNfaSBpbiAkMjsgZG8KICAgIGlmIHRlc3QgeCIkMSIgPSB4IiRhY19pIjsgdGhlbgogICAgICBhY19leGlzdHM9dHJ1ZQogICAgICBicmVhawogICAgZmkKICBkb25lCgogIEFTX0lGKFt0ZXN0IHgiJGFjX2V4aXN0cyIgPSB4dHJ1ZV0sIFskM10sIFskNF0pW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiw2MTkKQUNfVFlQRV9JTlRQVFJfVF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DSEVDS19UWVBFKFtpbnRwdHJfdF0sCiAgICBbQUNfREVGSU5FKFtIQVZFX0lOVFBUUl9UXSwgMSwKICAgICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgaW50cHRyX3QnLl0pXSwKICAgIFtmb3IgYWNfdHlwZSBpbiAnaW50JyAnbG9uZyBpbnQnICdsb25nIGxvbmcgaW50JzsgZG8KICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAoJIFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoCgkgICAgW0FDX0lOQ0xVREVTX0RFRkFVTFRdLAoJICAgIFtbc2l6ZW9mICh2b2lkICopIDw9IHNpemVvZiAoJGFjX3R5cGUpXV0pXSwKCSBbQUNfREVGSU5FX1VOUVVPVEVEKFtpbnRwdHJfdF0sIFskYWNfdHlwZV0sCgkgICAgW0RlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgd2lkZSBlbm91Z2ggdG8KCSAgICAgaG9sZCBhIHBvaW50ZXIsIGlmIHN1Y2ggYSB0eXBlIGV4aXN0cywgYW5kIGlmIHRoZSBzeXN0ZW0KCSAgICAgZG9lcyBub3QgZGVmaW5lIGl0Ll0pCgkgIGFjX3R5cGU9XSkKICAgICAgIHRlc3QgLXogIiRhY190eXBlIiAmJiBicmVhawogICAgIGRvbmVdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDEwNwptNF9sb2NhdGlvbihBQ19GQ19TUkNFWFQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjExMjUKVDI4LDEwNwptNF9sb2NhdGlvbihBQ19GQ19GSVhFREZPUk0pL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjEyMzUKVDksMTI3Cl9tNF9zcGxpdG00X2NoYW5nZXF1b3RlKFstPTx7KF0sWyl9Pj0tXSlbbTRfYnBhdHN1YnN0KC09PHsoLT08eygkMSl9Pj0tKX0+PS0sIC09PHsoJDIpfT49LSwKCSAgICAgICAtPTx7KF0kM1spfT49LSldbTRfY2hhbmdlcXVvdGUoWywgXSkKVDE1LDE3MTgKX0FDX0ZDX1dSQVBQRVJTX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCkFIX1RFTVBMQVRFKF9BQ19GQ1tfRlVOQ10sCiAgICBbRGVmaW5lIHRvIGEgbWFjcm8gbWFuZ2xpbmcgdGhlIGdpdmVuIEMgaWRlbnRpZmllciAoaW4gbG93ZXIgYW5kIHVwcGVyCiAgICAgY2FzZSksIHdoaWNoIG11c3Qgbm90IGNvbnRhaW4gdW5kZXJzY29yZXMsIGZvciBsaW5raW5nIHdpdGggRm9ydHJhbi5dKWRubApBSF9URU1QTEFURShfQUNfRkNbX0ZVTkNfXSwKICAgIFtBcyBdX0FDX0ZDW19GVU5DLCBidXQgZm9yIEMgaWRlbnRpZmllcnMgY29udGFpbmluZyB1bmRlcnNjb3Jlcy5dKWRubApjYXNlICRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nIGluCiAgImxvd2VyIGNhc2UsIG5vIHVuZGVyc2NvcmUsIG5vIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW25hbWVdKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DXyhuYW1lLE5BTUUpXSwgW25hbWVdKSA7OwogICJsb3dlciBjYXNlLCBubyB1bmRlcnNjb3JlLCBleHRyYSB1bmRlcnNjb3JlIikKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQyhuYW1lLE5BTUUpXSwgIFtuYW1lXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtuYW1lIFsjI10gX10pIDs7CiAgImxvd2VyIGNhc2UsIHVuZGVyc2NvcmUsIG5vIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW25hbWUgWyMjXSBfXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtuYW1lIFsjI10gX10pIDs7CiAgImxvd2VyIGNhc2UsIHVuZGVyc2NvcmUsIGV4dHJhIHVuZGVyc2NvcmUiKQoJICBBQ19ERUZJTkUoX0FDX0ZDW19GVU5DKG5hbWUsTkFNRSldLCAgW25hbWUgWyMjXSBfXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtuYW1lIFsjI10gX19dKSA7OwogICJ1cHBlciBjYXNlLCBubyB1bmRlcnNjb3JlLCBubyBleHRyYSB1bmRlcnNjb3JlIikKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQyhuYW1lLE5BTUUpXSwgIFtOQU1FXSkKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQ18obmFtZSxOQU1FKV0sIFtOQU1FXSkgOzsKICAidXBwZXIgY2FzZSwgbm8gdW5kZXJzY29yZSwgZXh0cmEgdW5kZXJzY29yZSIpCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkMobmFtZSxOQU1FKV0sICBbTkFNRV0pCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkNfKG5hbWUsTkFNRSldLCBbTkFNRSBbIyNdIF9dKSA7OwogICJ1cHBlciBjYXNlLCB1bmRlcnNjb3JlLCBubyBleHRyYSB1bmRlcnNjb3JlIikKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQyhuYW1lLE5BTUUpXSwgIFtOQU1FIFsjI10gX10pCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkNfKG5hbWUsTkFNRSldLCBbTkFNRSBbIyNdIF9dKSA7OwogICJ1cHBlciBjYXNlLCB1bmRlcnNjb3JlLCBleHRyYSB1bmRlcnNjb3JlIikKCSAgQUNfREVGSU5FKF9BQ19GQ1tfRlVOQyhuYW1lLE5BTUUpXSwgIFtOQU1FIFsjI10gX10pCgkgIEFDX0RFRklORShfQUNfRkNbX0ZVTkNfKG5hbWUsTkFNRSldLCBbTkFNRSBbIyNdIF9fXSkgOzsKICAqKQoJICBBQ19NU0dfV0FSTihbdW5rbm93biBGb3J0cmFuIG5hbWUtbWFuZ2xpbmcgc2NoZW1lXSkKCSAgOzsKZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDYyMApBQ19GVU5DX0NMT1NFRElSX1ZPSURfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfSEVBREVSX0RJUkVOVF0pZG5sCkFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGNsb3NlZGlyIHJldHVybnMgdm9pZF0sCgkgICAgICAgW2FjX2N2X2Z1bmNfY2xvc2VkaXJfdm9pZF0sCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFQKI2luY2x1ZGUgPCRhY19oZWFkZXJfZGlyZW50PgojaWZuZGVmIF9fY3BsdXNwbHVzCmludCBjbG9zZWRpciAoKTsKI2VuZGlmCl0sCgkJCQlbW3JldHVybiBjbG9zZWRpciAob3BlbmRpciAoIi4iKSkgIT0gMDtdXSldLAoJICAgICAgIFthY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQ9bm9dLAoJICAgICAgIFthY19jdl9mdW5jX2Nsb3NlZGlyX3ZvaWQ9eWVzXSwKCSAgICAgICBbYWNfY3ZfZnVuY19jbG9zZWRpcl92b2lkPXllc10pXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19jbG9zZWRpcl92b2lkID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKENMT1NFRElSX1ZPSUQsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHRoZSBgY2xvc2VkaXInIGZ1bmN0aW9uIHJldHVybnMgdm9pZCBpbnN0ZWFkCgkgICAgIG9mIGBpbnQnLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzUsMTA3Cm00X2xvY2F0aW9uKEFDX1BSRVNFUlZFX0hFTFBfT1JERVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0MzQKVDI2LDEwOAptNF9sb2NhdGlvbihBQ19HRVRMT0FEQVZHKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjgxMgpUMjQsMTA3Cm00X2xvY2F0aW9uKEFDX0Y3N19GVU5DKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMDg0ClQzNiwxMDUKbTRfbG9jYXRpb24oQUNfTEFOR19QUkVQUk9DKEVybGFuZykpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6MTYwClQ4LDg1Cl9tNF9qb2lubTRfaWYoWyQjJDJdLCBbMl0sIFtdLAogICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMSQyXV0pJDAoWyQxXSwgbTRfc2hpZnQyKCRAKSldKQpUMjIsNjc3Cl9BQ19JTklUX1BBUlNFX0VOQUJMRTItJDEtKiB8IC0tJDEtKikKICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSokMS1cKG00X2lmKFskMV0sIFskMl0sIFtbW149XV1dLCBbLl0pKlwpJ2AKICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiWy4qW14tKy5fJGFzX2NyX2FsbnVtXV0iID4vZGV2L251bGwgJiYKICAgICAgQUNfTVNHX0VSUk9SKAoJW2ludmFsaWQgXW00X2lmKFskMl0sIFt3aXRoXSwgW3BhY2thZ2VdLCBbZmVhdHVyZV0pWyBuYW1lOiAkYWNfdXNlcm9wdF0pCiAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKICAgIGFjX3VzZXJvcHQ9YEFTX0VDSE8oWyIkYWNfdXNlcm9wdCJdKSB8IHNlZCAncy9bWy0rLl1dL18vZydgCiAgICBjYXNlICRhY191c2VyX29wdHMgaW4KICAgICAgKiIKIiQyXyRhY191c2Vyb3B0IgoiKikgOzsKICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS0kMS0kYWNfdXNlcm9wdF9vcmlnIgoJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CiAgICBlc2FjCiAgICBldmFsICQyXyRhY191c2Vyb3B0PW00X2lmKFskMV0sIFskMl0sIFtcJGFjX29wdGFyZ10sIFtub10pIDs7ZG5sCgpUOSwxNzgKQUNfSU5MSU5FX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0lOTElORScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DX0lOTElORV0sIFtBQ19DX0lOTElORSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMTA3Cm00X2xvY2F0aW9uKEFDX0NIRUNLX0RFQ0wpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI4NDUKVDEwLDI0CkFOX1BST0dSQU1BTl9PVVRQVVQoW3Byb2dyYW1dLCAkQCkKVDM2LDEwMwptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0NfUkVRVUlSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6MzczClQzNCwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9MT05HX0xPTkdfSU5UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NTAyClQxNiw0Cl9tNF9kaXZlcnQoQk9EWSkxMDAwClQxOCwxMDIwCl9BU19MSU5FTk9fUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfQ1JfUFJFUEFSRV0pQVNfUkVRVUlSRShbX0FTX01FX1BSRVBBUkVdKV9BU19ERVRFQ1RfU1VHR0VTVEVEKFtfQVNfTElORU5PX1dPUktTXSltNF9wdXNoZGVmKFtBU19NRVNTQUdFX0xPR19GRF0pbTRfcHVzaGRlZihbQVNfRVJST1JdLAogIFt7IEFTX01FU1NBR0UoXW00X2RxdW90ZShbZXJyb3I6ICRdWzFdKVssIFsyXSk7IEFTX0VYSVQoWzFdKTsgfV0pX0FTX0xJTkVOT19XT1JLUyB8fCB7ClsgICMgQmxhbWUgTGVlIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQogIHNlZCAtbiAnCiAgICBwCiAgICAvWyRdTElORU5PLz0KICAnIDwkYXNfbXlzZWxmIHwKICAgIHNlZCAnCiAgICAgIHMvWyRdTElORU5PLiovJi0vCiAgICAgIHQgbGluZW5vCiAgICAgIGIKICAgICAgOmxpbmVubwogICAgICBOCiAgICAgIDpsb29wCiAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLwogICAgICB0IGxvb3AKICAgICAgcy8tXG4uKi8vCiAgICAnID4kYXNfbWUubGluZW5vICYmCiAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iXSB8fAogICAgQVNfRVJST1IoW2Nhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsXSkKCiAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgogIC4gIi4vJGFzX21lLmxpbmVubyIKICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KICBleGl0Cn0KX200X3BvcGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdLCBbQVNfRVJST1JdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTkyCkFDX0hFQURFUl9DSEVDS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19IRUFERVJfQ0hFQ0snIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ0hFQ0tfSEVBREVSXSwgW0FDX0NIRUNLX0hFQURFUigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMjc2Cm00X3NldF9kZWxldGVtNF9pZmRlZihbX200X3NldChbJDFdKV0sCgkgIFtfbTRfcG9wZGVmKFtfbTRfc2V0KFskMV0sXV9tNF9kZWZuKFtfbTRfc2V0KFskMV0pXSlbKV0sCgkJICAgICAgW19tNF9zZXQoWyQxXSldKSQwKFskMV0pXSwKCSAgW200X2lmZGVmKFtfbTRfc2V0X2NsZWFudXAoJDEpXSwKCQkgICAgW19tNF9wb3BkZWYoW19tNF9zZXRfY2xlYW51cCgkMSldKV0pbTRfaWZkZWYoCgkJICAgIFtfbTRfc2V0X3NpemUoJDEpXSwKCQkgICAgW19tNF9wb3BkZWYoW19tNF9zZXRfc2l6ZSgkMSldKV0pXSkKVDI5LDEwNwptNF9sb2NhdGlvbihBQ19TWVNfTEFSR0VGSUxFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6MTM2ClQzNSwxMDQKbTRfbG9jYXRpb24oQUNfU1RSVUNUX0RJUkVOVF9EX0lOTykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00Ojk1NgpUMTEsOTY3CkFDX0NfVFlQRU9GX200X2RlZnVuX3BybyhbJDBdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgdHlwZW9mIHN5bnRheCBhbmQga2V5d29yZCBzcGVsbGluZ10sIGFjX2N2X2NfdHlwZW9mLAogICAgW2FjX2N2X2NfdHlwZW9mPW5vCiAgICAgZm9yIGFjX2t3IGluIHR5cGVvZiBfX3R5cGVvZl9fIG5vOyBkbwogICAgICAgdGVzdCAkYWNfa3cgPSBubyAmJiBicmVhawogICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbXSwKCSBbWwoJICAgaW50IHZhbHVlOwoJICAgdHlwZWRlZiBzdHJ1Y3QgewoJCSAgIGNoYXIgYSBbMQoJCQkgICArICEgKCgkYWNfa3cgKHZhbHVlKSkKCQkJCSgoJGFjX2t3ICh2YWx1ZSkpIDAgPCAoJGFjX2t3ICh2YWx1ZSkpIC0xCgkJCQkgPyAoJGFjX2t3ICh2YWx1ZSkpIC0gMQoJCQkJIDogfiAofiAoJGFjX2t3ICh2YWx1ZSkpIDAKCQkJCSAgICAgIDw8IHNpemVvZiAoJGFjX2t3ICh2YWx1ZSkpKSkpXTsgfQoJICAgICAgYWNfX3R5cGVvZl90eXBlXzsKCSAgIHJldHVybgoJICAgICAoISAoKHZvaWQpICgoYWNfX3R5cGVvZl90eXBlXyAqKSAwKSwgMCkpOwoJIF1dKV0sCgkgW2FjX2N2X2NfdHlwZW9mPSRhY19rd10pCiAgICAgICB0ZXN0ICRhY19jdl9jX3R5cGVvZiAhPSBubyAmJiBicmVhawogICAgIGRvbmVdKQogIGlmIHRlc3QgJGFjX2N2X2NfdHlwZW9mICE9IG5vOyB0aGVuCiAgICBBQ19ERUZJTkUoW0hBVkVfVFlQRU9GXSwgMSwKICAgICAgW0RlZmluZSB0byAxIGlmIHR5cGVvZiB3b3JrcyB3aXRoIHlvdXIgY29tcGlsZXIuXSkKICAgIGlmIHRlc3QgJGFjX2N2X2NfdHlwZW9mICE9IHR5cGVvZjsgdGhlbgogICAgICBBQ19ERUZJTkVfVU5RVU9URUQoW3R5cGVvZl0sIFskYWNfY3ZfY190eXBlb2ZdLAoJW0RlZmluZSB0byBfX3R5cGVvZl9fIGlmIHlvdXIgY29tcGlsZXIgc3BlbGxzIGl0IHRoYXQgd2F5Ll0pCiAgICBmaQogIGZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMTA2Cm00X2xvY2F0aW9uKEFDX1BST0dSQU1fUEFUSCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQzClQzMiwxMDQKbTRfbG9jYXRpb24oQUNfRVJMQU5HX05FRURfRVJMQykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2VybGFuZy5tNDo2MwpUMjAsMTc3Cl9BQ19DSEVDS19IRUFERVJfT0xEX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYCQwJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCB1c2UgQUNfQ0hFQ0tfSEVBREVSIHdpdGggYSBmb3VydGggYXJndW1lbnQuXSlfQUNfQ0hFQ0tfSEVBREVSX1BSRVBST0MoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwzOTcKQUNfQ19QUk9UT1RZUEVTX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBmdW5jdGlvbiBwcm90b3R5cGVzXSkKaWYgdGVzdCAiJGFjX2N2X3Byb2dfY2NfYzg5IiAhPSBubzsgdGhlbgogIEFDX01TR19SRVNVTFQoW3llc10pCiAgQUNfREVGSU5FKFBST1RPVFlQRVMsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHRoZSBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZXMuXSkKICBBQ19ERUZJTkUoX19QUk9UT1RZUEVTLCAxLAoJICAgIFtEZWZpbmUgbGlrZSBQUk9UT1RZUEVTOyB0aGlzIGNhbiBiZSB1c2VkIGJ5IHN5c3RlbSBoZWFkZXJzLl0pCmVsc2UKICBBQ19NU0dfUkVTVUxUKFtub10pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTAzCm00X2xvY2F0aW9uKEFDX1JFUVVJUkVfQ1BQKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDozODIKVDI0LDEwNwptNF9sb2NhdGlvbihBQ19QUk9HX0xFWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjcxMQpUMTIsMTAKbTRfY3JfZGlnaXRzMDEyMzQ1Njc4OQpUMzEsMTA2Cm00X2xvY2F0aW9uKF9BQ19GT1JUUkFOX0FTU0VSVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MTU5ClQzMywxMDAKbTRfbG9jYXRpb24oX0FDX0FSR19WQVJfQ1BQRkxBR1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjMwOApUMTcsMTcKbTRfUEFDS0FHRV9TVFJJTkdHTlUgQXV0b2NvbmYgMi42OApUMzAsNgpfQUNfTEFOR19QUkVGSVgoT2JqZWN0aXZlIEMrKylPQkpDWFgKVDI0LDM1OApfQUNfQ09ORklHX1JFR0lTVEVSX0RFU1RfQUNfQ09ORklHX1VOSVFVRShbJDFdLCBbJDNdKW00X2lmKFskMSAkM10sIFtMSU5LUyAuXSwKICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBkZXN0aW5hdGlvbiBvZiBhIGNvbmZpZyBsaW5rOiBgLiddKV0sCiAgICAgICBbJDFdLCBbSEVBREVSU10sCiAgICAgICBbbTRfZGVmaW5lX2RlZmF1bHQoW0FIX0hFQURFUl0sIFskM10pXSltNF9hcHBlbmQoW19BQ19MSVNUX1RBR1NdLApbICAgICIkMyIpIENPTkZJR18kMT0iJENPTkZJR18kMSAkMiIgOzsKXSltNF9pZnZhbChbJDRdLApbbTRfYXBwZW5kKFtfQUNfTElTVF9UQUdfQ09NTUFORFNdLApbICAgICIkMyI6XW00X2Zvcm1hdChbWyUuMXNdXSwgWyQxXSlbKSAkNCA7OwpdKV0pClQ5LDE3CkFTX1RFU1RfWCRhc190ZXN0X3ggJDFbXVtdClQ5LDEyOQpBU19URVNUX1hfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX1RFU1RfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIxLDE0NQpBQ19MQU5HX0ZVTkNfTElOS19UUllfbTRfZGVmdW5fcHJvKFskMF0pbTRfaWZ2YWwoWyQxXSwgW10sIFttNF93YXJuKFtzeW50YXhdLCBbJDA6IG5vIGZ1bmN0aW9uIGdpdmVuXSldKWRubApfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19NS1RJTUUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6OTkxClQyNSwxMDYKbTRfbG9jYXRpb24oQUNfQVJHX0FSUkFZKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6ODQKVDI4LDEwNgptNF9sb2NhdGlvbihBQ19IRUFERVJfRUdSRVApL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDozNwpUMTUsODYzCl9BQ19QUk9HX0ZDX0NfT19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfRk9SVFJBTl9BU1NFUlQoKWRubApBQ19DQUNIRV9DSEVDSyhbd2hldGhlciAkW11fQUNfRkNbXSB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXJdLAoJICAgICAgIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fY19vXSwKW0FDX0xBTkdfQ09ORlRFU1QoW0FDX0xBTkdfUFJPR1JBTShbXSldKQojIFdlIHRlc3QgdHdpY2UgYmVjYXVzZSBzb21lIGNvbXBpbGVycyByZWZ1c2UgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nCiMgYC5vJyBmaWxlIHdpdGggYC1vJywgYWx0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCmFjX3RyeT0nJFtdX0FDX0ZDW10gJFtdX0FDX0xBTkdfUFJFRklYW11GTEFHUyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCnJtIC1mIGNvbmZ0ZXN0Mi4qCmlmIF9BQ19ET19WQVIoYWNfdHJ5KSAmJgogICAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYKICAgICBfQUNfRE9fVkFSKGFjX3RyeSk7IHRoZW4KICBhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fY19vPXllcwplbHNlCiAgYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX2Nfbz1ubwpmaQpybSAtZiBjb25mdGVzdCpdKQppZiB0ZXN0ICRhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fY19vID0gbm87IHRoZW4KICBBQ19ERUZJTkUoW11fQUNfRkNbXV9OT19NSU5VU19DX01JTlVTX08sIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgRm9ydHJhbiBjb21waWxlciBkb2Vzbid0IGFjY2VwdAoJICAgICAtYyBhbmQgLW8gdG9nZXRoZXIuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMywxMDcKbTRfbG9jYXRpb24oQUNfVFJZX1JVTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6Mjc2NQpUMzEsMTA1Cm00X2xvY2F0aW9uKEFDX1NUUlVDVF9USU1FWk9ORSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjEwNDIKRjEwLDYKX200X3BvcGRlZnBvcGRlZgpUOSw2OApfQVNfVFJfU0hfQVNfTElURVJBTF9JRihbJDFdLCBbKl1bCSBdWwpdKShbXSwgWyQwX0lORElSXSwgWyQwX0xJVEVSQUxdKShbJDFdKQpUMjEsMTA2Cm00X2xvY2F0aW9uKEFDX0NPTlNUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NTUKVDcsMTY4OAptNF9pbml0IyBBbGwgdGhlIE00c3VnYXIgbWFjcm9zIHN0YXJ0IHdpdGggYG00XycsIGV4Y2VwdCBgZG5sJyBrZXB0IGFzIGlzCiMgZm9yIHNha2Ugb2Ygc2ltcGxpY2l0eS4KbTRfcGF0dGVybl9mb3JiaWQoW15fP200X10pCm00X3BhdHRlcm5fZm9yYmlkKFteZG5sJF0pCgojIElmIF9fbTRfdmVyc2lvbl9fIGlzIGRlZmluZWQsIHdlIGFzc3VtZSB0aGF0IHdlIGFyZSBiZWluZyBydW4gYnkgTTQKIyAxLjYgb3IgbmV3ZXIsIHRodXMgJEAgcmVjdXJzaW9uIGlzIGxpbmVhciwgYW5kIGRlYnVnbW9kZSgrZG8pCiMgaXMgYXZhaWxhYmxlIGZvciBmYXN0ZXIgY2hlY2tzIG9mIGRlcmVmZXJlbmNpbmcgdW5kZWZpbmVkIG1hY3JvcwojIGFuZCBmb3JjaW5nIGR1bXBkZWYgdG8gcHJpbnQgdG8gc3RkZXJyIHJlZ2FyZGxlc3Mgb2YgZGVidWdmaWxlLgojIEJ1dCBpZiBpdCBpcyBtaXNzaW5nLCB3ZSBhc3N1bWUgd2UgYXJlIGJlaW5nIHJ1biBieSBNNCAxLjQueCwgdGhhdAojICRAIHJlY3Vyc2lvbiBpcyBxdWFkcmF0aWMsIGFuZCB0aGF0IHdlIG5lZWQgZm9yZWFjaC1iYXNlZAojIHJlcGxhY2VtZW50IG1hY3Jvcy4gIEFsc28sIG00IHByaW9yIHRvIDEuNC44IGxvc2VzIHRyYWNrIG9mIGxvY2F0aW9uCiMgZHVyaW5nIG00d3JhcCB0ZXh0OyBfX2xpbmVfXyBzaG91bGQgbmV2ZXIgYmUgMC4KIwojIFVzZSB0aGUgcmF3IGJ1aWx0aW4gdG8gYXZvaWQgdHJpcHBpbmcgdXAgaW5jbHVkZSB0cmFjaW5nLgojIE1lYW53aGlsZSwgYXZvaWQgbTRfY29weSwgc2luY2UgaXQgdGVtcG9yYXJpbHkgdW5kZWZpbmVzIG00X2RlZm4uCm00X2lmZGVmKFtfX200X3ZlcnNpb25fX10sClttNF9kZWJ1Z21vZGUoWytkb10pCm00X2RlZmluZShbbTRfZGVmbl0sIF9tNF9kZWZuKFtfbTRfZGVmbl0pKQptNF9kZWZpbmUoW200X2R1bXBkZWZdLCBfbTRfZGVmbihbX200X2R1bXBkZWZdKSkKbTRfZGVmaW5lKFttNF9wb3BkZWZdLCBfbTRfZGVmbihbX200X3BvcGRlZl0pKQptNF9kZWZpbmUoW200X3VuZGVmaW5lXSwgX200X2RlZm4oW19tNF91bmRlZmluZV0pKV0sClttNF9idWlsdGluKFtpbmNsdWRlXSwgW200c3VnYXIvZm9yZWFjaC5tNF0pCm00X3dyYXBfbGlmbyhbbTRfaWYoX19saW5lX18sIFswXSwgW200X3B1c2hkZWYoW200X2xvY2F0aW9uXSwKXV1tNF9kcXVvdGUobTRfZHF1b3RlKG00X2RxdW90ZShfX2ZpbGVfXzpfX2xpbmVfXykpKVtbKV0pXSldKQoKIyBSZXdyaXRlIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgZGl2ZXJzaW9uIHN0YWNrLgptNF9kaXZlcnQoW0tJTExdKQoKIyBDaGVjayB0aGUgZGl2ZXJ0IHB1c2gvcG9wIHBlcmZlY3QgYmFsYW5jZS4KIyBTb21lIHVzZXJzIGFyZSBwcm9uZSB0byBhbHNvIHVzZSBtNF93cmFwIHRvIHJlZ2lzdGVyIGxhc3QtbWludXRlCiMgbTRfZGl2ZXJ0X3RleHQ7IHNvIGFmdGVyIG91ciBkaXZlcnNpb24gY2xlYW51cHMsIHdlIHJlc3RvcmUKIyBLSUxMIGFzIHRoZSBib3R0b20gb2YgdGhlIGRpdmVyc2lvbiBzdGFjay4KbTRfd3JhcChbbTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pbTRfaWZkZWYoCiAgW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSwgW200X2ZhdGFsKFskMDogdW5iYWxhbmNlZCBtNF9kaXZlcnRfcHVzaDoKXW00X2RpdmVydF9zdGFjayldKV9tNF9wb3BkZWYoW19tNF9kaXZlcnRfc3RhY2tdKW00X2RpdmVydF9wdXNoKFtLSUxMXSldKQoKVDIxLDEwMgptNF9sb2NhdGlvbihBU19FUlJPUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDo4NTAKVDI0LDIKX0FDX0xBTkdfUFJFRklYKEZvcnRyYW4pRkMKVDE1LDM3NgpBQ19GVU5DX1JFQUxMT0NfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZVTkNfUkVBTExPQ19JRigKICBbQUNfREVGSU5FKFtIQVZFX1JFQUxMT0NdLCAxLAoJICAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBzeXN0ZW0gaGFzIGEgR05VIGxpYmMgY29tcGF0aWJsZSBgcmVhbGxvYycKCSAgICAgIGZ1bmN0aW9uLCBhbmQgdG8gMCBvdGhlcndpc2UuXSldLAogIFtBQ19ERUZJTkUoW0hBVkVfUkVBTExPQ10sIDApCiAgIEFDX0xJQk9CSihbcmVhbGxvY10pCiAgIEFDX0RFRklORShbcmVhbGxvY10sIFtycGxfcmVhbGxvY10sCiAgICAgIFtEZWZpbmUgdG8gcnBsX3JlYWxsb2MgaWYgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwxMDYKbTRfbG9jYXRpb24oX0FDX0ZDX0RJQUxFQ1RfWUVBUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6Mjc5ClQyOCwxMDcKbTRfbG9jYXRpb24oX0FDX0xJTktfSUZFTFNFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjYyClQyOSwxMDYKbTRfbG9jYXRpb24oQUNfUFJPR1JBTV9FR1JFUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQyClQxMSwxNjIKbTRfZHVtcGRlZnNtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbJCNdLCBbMV0sIFttNF9zdGFja19mb3JlYWNoX2xpZm8oWyQxXSwgW200X2R1bXBkZWYoWyQxXSltNF9pZ25vcmVdKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDEzLDg2MgpfQUNfUEFUSF9QUk9HX200X2RlZnVuX3BybyhbJDBdKSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJDIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpzZXQgZHVtbXkgJDI7IGFjX3dvcmQ9JFsyXQpBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkYWNfd29yZF0pCkFDX0NBQ0hFX1ZBTChbYWNfY3ZfcGF0aF8kMV0sCltjYXNlICQkMSBpbgogIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKICBhY19jdl9wYXRoXyQxPSIkJDEiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgogIDs7CiAgKikKICBfQVNfUEFUSF9XQUxLKFskNF0sCltmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICBpZiBBU19FWEVDVVRBQkxFX1AoWyIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0Il0pOyB0aGVuCiAgICBhY19jdl9wYXRoXyQxPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgX0FTX0VDSE9fTE9HKFtmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0XSkKICAgIGJyZWFrIDIKICBmaQpkb25lXSkKZG5sIElmIG5vIDNyZCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKZG5sIHNvIEFDX1BBVEhfUFJPR1Mgd2lsbCBrZWVwIGxvb2tpbmcuCm00X2lmdmFsbihbJDNdLApbICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF8kMSIgJiYgYWNfY3ZfcGF0aF8kMT0iJDMiXSlkbmwKICA7Owplc2FjXSlkbmwKJDE9JGFjX2N2X3BhdGhfJDEKaWYgdGVzdCAtbiAiJCQxIjsgdGhlbgogIEFDX01TR19SRVNVTFQoWyQkMV0pCmVsc2UKICBBQ19NU0dfUkVTVUxUKFtub10pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsNTQzCl9BQ19DT01QSUxFUl9FWEVFWFRfQ1JPU1MjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgojIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCkFDX01TR19DSEVDS0lORyhbd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nXSkKaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCiAgX0FDX0RPX1ZBUihhY19saW5rKQogIGlmIF9BQ19ET19UT0tFTlMoWy4vY29uZnRlc3QkYWNfY3ZfZXhlZXh0XSk7IHRoZW4KICAgIGNyb3NzX2NvbXBpbGluZz1ubwogIGVsc2UKICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0gbWF5YmU7IHRoZW4KCWNyb3NzX2NvbXBpbGluZz15ZXMKICAgIGVsc2UKCUFDX01TR19GQUlMVVJFKFtjYW5ub3QgcnVuIF9BQ19MQU5HIGNvbXBpbGVkIHByb2dyYW1zLgpJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIGAtLWhvc3QnLl0pCiAgICBmaQogIGZpCmZpCkFDX01TR19SRVNVTFQoWyRjcm9zc19jb21waWxpbmddKQoKVDEyLDE2Cm00X3dyYXBfbGlmb19tNF93cmFwKFskMVtdXSkKVDIyLDEwNwptNF9sb2NhdGlvbihBQ19FTkFCTEUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0NzYKVDEwLDEwMwptNF9mbGF0dGVubTRfaWYobTRfaW5kZXgoWyQxXSwgWwpdKSwgWy0xXSwgW1skMV1dLAogICAgICAgW200X3RyYW5zbGl0KG00X2JwYXRzdWJzdChbW1skMV1dXSwgW1xcCl0pLCBbCl0sIFsgXSldKQpUMjAsMzYKX200X3NldF9pbnRlcnNlY3Rpb25tNF9zZXRfY29udGFpbnMoWyQxXSwgWyQyXSwgWyxbJDJdXSkKVDIzLDMKX200X2RpdmVydChIRUxQX0VOQUJMRSkxMDIKVDIwLDMzCl9BU19SRVFVSVJFX1NIRUxMX0ZOCm00X24oWyQyXSkkMSAoKQp7CiQzCn0gQCU6QCAkMVtdClQxOCw0MDQKQUNfT1VUUFVUX0NPTU1BTkRTX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX09VVFBVVF9DT01NQU5EUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfZGVmaW5lX2RlZmF1bHQoW19BQ19PVVRQVVRfQ09NTUFORFNfQ05UXSwgMClkbmwKbTRfZGVmaW5lKFtfQUNfT1VUUFVUX0NPTU1BTkRTX0NOVF0sIG00X2luY3IoX0FDX09VVFBVVF9DT01NQU5EU19DTlQpKWRubApkbmwgRG91YmxlIHF1b3RlZCBzaW5jZSB0aGF0IHdhcyB0aGUgY2FzZSBpbiB0aGUgb3JpZ2luYWwgbWFjcm8uCkFDX0NPTkZJR19DT01NQU5EUyhbZGVmYXVsdC1dX0FDX09VVFBVVF9DT01NQU5EU19DTlQsIFtbJDFdXSwgW1skMl1dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDEwMAptNF9sb2NhdGlvbihBQ19MQU5HX0NQTFVTUExVUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MjUyClQzMiwxMDcKbTRfbG9jYXRpb24oQUNfQ0FOT05JQ0FMX1NZU1RFTSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTg1OApUMjcsNDQKX0FDX0xBTkdfT1BFTk1QKEZvcnRyYW4gNzcpQUNfTEFOR19GVU5DX0xJTktfVFJZKFtvbXBfZ2V0X251bV90aHJlYWRzXSkKVDMxLDY4CkFDX0xBTkdfQ09NUElMRVIoT2JqZWN0aXZlIEMrKylfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19PQkpDWFhdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsMTAzCm00X2xvY2F0aW9uKEFTX1RSX0NQUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxODQxClQzNCwxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfVEFSR0VUX1RPT0xTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MzE2ClQ4LDI4Cl9BU19DQVNFIFtAJTpAKF0KICAkMVspXSA6CiAgICAkMiA7OwpUMjksNDQ4Cl9BQ19TWVNfTEFSR0VGSUxFX01BQ1JPX1ZBTFVFQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkMSB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzXSwgWyQzXSwKW3doaWxlIDo7IGRvCiAgbTRfaWZ2YWwoWyQ2XSwgW0FDX0xJTktfSUZFTFNFXSwgW0FDX0NPTVBJTEVfSUZFTFNFXSkoCiAgICBbQUNfTEFOR19QUk9HUkFNKFskNV0sIFskNl0pXSwKICAgIFskMz1ubzsgYnJlYWtdKQogIG00X2lmdmFsKFskNl0sIFtBQ19MSU5LX0lGRUxTRV0sIFtBQ19DT01QSUxFX0lGRUxTRV0pKAogICAgW0FDX0xBTkdfUFJPR1JBTShbQCU6QGRlZmluZSAkMSAkMgokNV0sIFskNl0pXSwKICAgIFskMz0kMjsgYnJlYWtdKQogICQzPXVua25vd24KICBicmVhawpkb25lXSkKY2FzZSAkJDMgaW4gIygKICBubyB8IHVua25vd24pIDs7CiAgKikgQUNfREVGSU5FX1VOUVVPVEVEKFskMV0sIFskJDNdLCBbJDRdKTs7CmVzYWMKcm0gLXJmIGNvbmZ0ZXN0KltdZG5sCgpUMTcsMTY5Cl9BQ19DT05GSUdfVU5JUVVFbTRfaWZkZWYoW19BQ19TRUVOX1RBRygkMildLAogICBbbTRfZmF0YWwoW2AkMicgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggQUNfQ09ORklHX11tNF9kZWZuKAogICAgIFtfQUNfU0VFTl9UQUcoJDIpXSkuKV0sCiAgIFttNF9kZWZpbmUoW19BQ19TRUVOX1RBRygkMildLCBbJDFdKV0pZG5sCgpUMjAsMTQzCkFDX0NIRUNLX1RPT0xfUFJFRklYX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NIRUNLX1RPT0xfUFJFRklYJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDEwOAptNF9sb2NhdGlvbihBQ19IQVZFX0ZVTkNTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE2MQpUMTMsMjAwCkFDX1NUX0JMS1NJWkVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RfQkxLU0laRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19TVFJVQ1RfU1RfQkxLU0laRV0sIFtBQ19TVFJVQ1RfU1RfQkxLU0laRSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTAyCm00X2xvY2F0aW9uKEFTX0ZPUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDo1NzQKVDI5LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX1NUUkZUSU1FKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE2NjkKVDksMTU2Cm00X2VzY2FwZW00X2lmKG00X2luZGV4KG00X3RyYW5zbGl0KFskMV0sCiAgIFtbXSMsKCldW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfMDEyMzQ1Njc4OV0sIFskJCRdKSwgWyRdKSwKICBbLTFdLCBbbTRfZWNob10sIFtfJDBdKShbJDFdKQpUMTcsNDc4CkFTX0lOSVRfR0VORVJBVEVEX200X2RlZnVuX3BybyhbJDBdKW00X3JlcXVpcmUoW0FTX1BSRVBBUkVdKW00X3B1c2hkZWYoW0FTX01FU1NBR0VfTE9HX0ZEXSlhc193cml0ZV9mYWlsPTAKY2F0ID4kMSA8PF9BU0VPRiB8fCBhc193cml0ZV9mYWlsPTEKIyEgJFNIRUxMCiMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KJDIKU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KZXhwb3J0IFNIRUxMCl9BU0VPRgpjYXQgPj4kMSA8PFxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCl9BU19TSEVMTF9TQU5JVElaRQpfQVNfUFJFUEFSRQptNF9pZihBU19NRVNTQUdFX0ZELCBbMV0sIFtdLCBbZXhlYyBBU19NRVNTQUdFX0ZEPiYxCl0pbTRfdGV4dF9ib3goW01haW4gYm9keSBvZiAkMSBzY3JpcHQuXSkKX0FTRU9GCnRlc3QgJGFzX3dyaXRlX2ZhaWwgPSAwICYmIGNobW9kICt4ICQxW11kbmwKX200X3BvcGRlZihbQVNfTUVTU0FHRV9MT0dfRkRdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjcsMTA2Cm00X2xvY2F0aW9uKEFDX0dFVEdST1VQU19UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjAKVDE1LDE5MgpBQ19IRUFERVJfRUdSRVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVBREVSX0VHUkVQJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0VHUkVQX0hFQURFUl0sIFtBQ19FR1JFUF9IRUFERVIoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDQ3NApBQ19DSEVDS19GSUxFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtjcm9zc10sCgkgICAgIFtjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nXSlkbmwKQVNfVkFSX1BVU0hERUYoW2FjX0ZpbGVdLCBbYWNfY3ZfZmlsZV8kMV0pZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgJDFdLCBbYWNfRmlsZV0sClt0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyAmJgogIEFDX01TR19FUlJPUihbY2Fubm90IGNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSB3aGVuIGNyb3NzIGNvbXBpbGluZ10pCmlmIHRlc3QgLXIgIiQxIjsgdGhlbgogIEFTX1ZBUl9TRVQoW2FjX0ZpbGVdLCBbeWVzXSkKZWxzZQogIEFTX1ZBUl9TRVQoW2FjX0ZpbGVdLCBbbm9dKQpmaV0pCkFTX1ZBUl9JRihbYWNfRmlsZV0sIFt5ZXNdLCBbJDJdLCBbJDNdKQpBU19WQVJfUE9QREVGKFthY19GaWxlXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCwxMDcKbTRfbG9jYXRpb24oQUNfQVJHX1dJVEgpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0ODIKVDExLDMyMgpBQ19MQU5HX1BPUF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZnZhbChbJDFdLAogW200X2lmKFskMV0sIG00X2RlZm4oW19BQ19MQU5HXSksIFtdLAogIFttNF9mYXRhbChbJDAoJDEpOiB1bmV4cGVjdGVkIGN1cnJlbnQgbGFuZ3VhZ2U6IF1tNF9kZWZuKFtfQUNfTEFOR10pKV0pXSlkbmwKbTRfcHVzaGRlZihbJDAgT0xEXSwgbTRfZGVmbihbX0FDX0xBTkddKSlkbmwKbTRfcG9wZGVmKFtfQUNfTEFOR10pZG5sCl9BQ19MQU5HX1NFVChtNF9kZWZuKFskMCBPTERdKSwgbTRfZGVmbihbX0FDX0xBTkddKSlkbmwKbTRfcG9wZGVmKFskMCBPTERdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE4LDUzNwpBQ19DX0NIQVJfVU5TSUdORURfbTRfZGVmdW5fcHJvKFskMF0pQUhfVkVSQkFUSU0oW19fQ0hBUl9VTlNJR05FRF9fXSwKWy8qIERlZmluZSB0byAxIGlmIHR5cGUgYGNoYXInIGlzIHVuc2lnbmVkIGFuZCB5b3UgYXJlIG5vdCB1c2luZyBnY2MuICAqLwojaWZuZGVmIF9fQ0hBUl9VTlNJR05FRF9fCiMgdW5kZWYgX19DSEFSX1VOU0lHTkVEX18KI2VuZGlmXSlkbmwKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciBjaGFyIGlzIHVuc2lnbmVkLCBhY19jdl9jX2NoYXJfdW5zaWduZWQsCltBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKFtBQ19JTkNMVURFU19ERUZBVUxUKFtdKV0sCgkJCQkJICAgICBbKChjaGFyKSAtMSkgPCAwXSldLAoJCSAgIGFjX2N2X2NfY2hhcl91bnNpZ25lZD1ubywgYWNfY3ZfY19jaGFyX3Vuc2lnbmVkPXllcyldKQppZiB0ZXN0ICRhY19jdl9jX2NoYXJfdW5zaWduZWQgPSB5ZXMgJiYgdGVzdCAiJEdDQyIgIT0geWVzOyB0aGVuCiAgQUNfREVGSU5FKF9fQ0hBUl9VTlNJR05FRF9fKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDEwMgptNF9sb2NhdGlvbihfQVNfRElSTkFNRV9FWFBSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00Ojk0MgpUMjgsMTAxCm00X2xvY2F0aW9uKF9BQ19QUk9HX0NDX0M5OSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MTIwNgpUMjAsMTEyCl9BQ19NU0dfTE9HX0NPTkZURVNUQVNfRUNITyhbIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiJdKSA+JkFTX01FU1NBR0VfTE9HX0ZECnNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZECgpUMjEsNjk1Cl9BQ19DT01QSUxFUl9FWEVFWFRfT0FDX01TR19DSEVDS0lORyhbZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlc10pCkFTX0lGKFtfQUNfRE9fVkFSKGFjX2xpbmspXSwKWyMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQojIGNhdGNoIGBjb25mdGVzdC5leGUnLiAgRm9yIGluc3RhbmNlIHdpdGggQ3lnd2luLCBgbHMgY29uZnRlc3QnIHdpbGwKIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKIyBgcm0nLgpmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5leGUgY29uZnRlc3QgY29uZnRlc3QuKjsgZG8KICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKICBjYXNlICRhY19maWxlIGluCiAgICBfQUNfQ09NUElMRVJfRVhFRVhUX1JFSkVDVCApIDs7CiAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6IFsnW14uXSpcKFwuLipcKSddYAoJICBicmVhazs7CiAgICAqICkgYnJlYWs7OwogIGVzYWMKZG9uZV0sCgkgICAgICBbQUNfTVNHX0ZBSUxVUkUoW2Nhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmtdKV0pCnJtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dApBQ19NU0dfUkVTVUxUKFskYWNfY3ZfZXhlZXh0XSkKClQxMywzNTMKQUNfQ0hFQ0tfVFlQRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9jb25kKFskI10sIFszXSwKICBbX0FDX0NIRUNLX1RZUEVfTkVXXSwKCSBbJCNdLCBbNF0sCiAgW19BQ19DSEVDS19UWVBFX05FV10sCgkgW19BQ19DSEVDS19UWVBFX1JFUExBQ0VNRU5UX1RZUEVfUChbJDJdKV0sIFsxXSwKICBbX0FDX0NIRUNLX1RZUEVfT0xEXSwKCSBbX0FDX0NIRUNLX1RZUEVfTUFZQkVfVFlQRV9QKFskMl0pXSwgWzFdLAogIFtBQ19ESUFHTk9TRShbc3ludGF4XSwKCSAgICAgICBbJDA6IGFzc3VtaW5nIGAkMicgaXMgbm90IGEgdHlwZV0pX0FDX0NIRUNLX1RZUEVfTkVXXSwKICBbX0FDX0NIRUNLX1RZUEVfTkVXXSkoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiwyNAptNF9yZW5hbWVfbTRtNF9yZW5hbWUoWyQxXSwgW200XyQxXSkKVDMwLDEwMgptNF9sb2NhdGlvbihfQVNfVU5TRVRfUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDo2MjQKVDIwLDExMQptNF9zdGFja19mb3JlYWNoX3NlcF9tNF9zdGFja19yZXZlcnNlKFskMV0sIFttNF90bXAtJDFdKV9tNF9zdGFja19yZXZlcnNlKFttNF90bXAtJDFdLCBbJDFdLCBbJDJbXV9tNF9kZWZuKFttNF90bXAtJDFdKSQzXSwgWyQ0W11dKQpUMjAsMTAyCm00X2xvY2F0aW9uKEFTX0VDSE8pL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6OTkzClQyMCwyOTQKX0FDX0NPTVBVVEVfSU5UX0JPRFkgIEFTX0xJTkVOT19QVVNIKFskW10xXSkKICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgogICAgX0FDX0NPTVBVVEVfSU5UX0NPTVBJTEUoWyRbXTJdLCBbJFtdM10sIFskW100XSwKCQkJICAgIFthY19yZXR2YWw9MF0sIFthY19yZXR2YWw9MV0pCiAgZWxzZQogICAgX0FDX0NPTVBVVEVfSU5UX1JVTihbJFtdMl0sIFskW10zXSwgWyRbXTRdLAoJCQlbYWNfcmV0dmFsPTBdLCBbYWNfcmV0dmFsPTFdKQogIGZpCiAgQVNfTElORU5PX1BPUAogIEFTX1NFVF9TVEFUVVMoWyRhY19yZXR2YWxdKQoKVDIxLDE5NgpBQ19TVEFUX01BQ1JPU19CUk9LRU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RBVF9NQUNST1NfQlJPS0VOJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0hFQURFUl9TVEFUXSwgW0FDX0hFQURFUl9TVEFUKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxNTkKQUNfTEFOR19GT1JUUkFONzdfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19GT1JUUkFONzcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkcoRm9ydHJhbiA3NylbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDEwNwptNF9sb2NhdGlvbihBQ19DSEVDS19ERUNMU19PTkNFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyODk1ClQ2LDkxCl9BQ19ET19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfUlVOX0xPRyhbZXZhbCAiJDEiXSwKCSAgICAgW19BQ19ET19FQ0hPKFskMV0pXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDc0OQpBQ19IRUFERVJfTUFKT1JfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciBzeXMvdHlwZXMuaCBkZWZpbmVzIG1ha2VkZXYsCgkJYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbQCU6QGluY2x1ZGUgPHN5cy90eXBlcy5oPl1dLAoJCQkJIFtbcmV0dXJuIG1ha2VkZXYoMCwgMCk7XV0pXSwKCQlbYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXY9eWVzXSwKCQlbYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXY9bm9dKQpdKQoKaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N5c190eXBlc19oX21ha2VkZXYgPSBubzsgdGhlbgpBQ19DSEVDS19IRUFERVIoc3lzL21rZGV2LmgsCgkJW0FDX0RFRklORShNQUpPUl9JTl9NS0RFViwgMSwKCQkJICAgW0RlZmluZSB0byAxIGlmIGBtYWpvcicsIGBtaW5vcicsIGFuZCBgbWFrZWRldicgYXJlCgkJCSAgICBkZWNsYXJlZCBpbiA8bWtkZXYuaD4uXSldKQoKICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3lzX21rZGV2X2ggPSBubzsgdGhlbgogICAgQUNfQ0hFQ0tfSEVBREVSKHN5cy9zeXNtYWNyb3MuaCwKCQkgICAgW0FDX0RFRklORShNQUpPUl9JTl9TWVNNQUNST1MsIDEsCgkJCSAgICAgICBbRGVmaW5lIHRvIDEgaWYgYG1ham9yJywgYG1pbm9yJywgYW5kIGBtYWtlZGV2JwoJCQkJYXJlIGRlY2xhcmVkIGluIDxzeXNtYWNyb3MuaD4uXSldKQogIGZpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsNzEKQUNfQ09ORklHX0NPTU1BTkRTX200X2RlZnVuX3BybyhbJDBdKV9BQ19DT05GSUdfRk9PUyhbQ09NTUFORFNdLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM1LDEwMwptNF9sb2NhdGlvbihfQVNfVkFSX0FQUEVORF9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE4ODgKVDE1LDM5MwpBQ19IQVZFX0xJQlJBUllfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEFWRV9MSUJSQVJZJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9wdXNoZGVmKFtBQ19MaWJfTmFtZV0sCgkgICAgbTRfYnBhdHN1YnN0KG00X2JwYXRzdWJzdChbWyQxXV0sCgkJCQkgICAgW2xpYlwoW15cLl0qXClcLmFdLCBbXDFdKSwKCQkJWy1sXSwgW10pKWRubApBQ19DSEVDS19MSUIoQUNfTGliX05hbWUsIG1haW4sIFskMl0sIFskM10sIFskNF0pZG5sCmFjX2N2X2xpYl9bXUFDX0xpYl9OYW1lKCk9YWNfY3ZfbGliX1tdQUNfTGliX05hbWUoKV9tYWluCm00X3BvcGRlZihbQUNfTGliX05hbWVdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDk4CkFDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ09ORklHX0FVWF9ESVJTKCIkc3JjZGlyIiAiJHNyY2Rpci8uLiIgIiRzcmNkaXIvLi4vLi4iKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMTA5Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU0VUUEdSUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNDgxClQxOSwxNTYKX200X2RlZnVuX3Byb19vdXRlcm00X3NldF9kZWxldGUoW19tNF9wcm92aWRlXSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0aW5nKFskMV0pXSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0aW5nXSwgWyQxXSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0X2R1bXBdLCBtNF9kaXZudW0pbTRfZGl2ZXJ0X3B1c2goW0dST1ddKQpUMTgsNDkKQVNfTElURVJBTF9XT1JEX0lGX0FTX0xJVEVSQUxfSUYobTRfZXhwYW5kKFskMV0pKShbJDRdLCBbJDNdLCBbJDJdKQpUMTcsNjMKbTRfc2V0X2RpZmZlcmVuY2VtNF9pZihbJDFdLCBbJDJdLCBbXSwgW200X3NldF9tYXBfc2VwKFskMV0sIFtfJDAoWyQyXSxdLCBbKV0pXSkKVDI0LDEwNgptNF9sb2NhdGlvbihBTV9DWUdXSU4zMikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojg1ClQxNywyMDkKX200X3JlcXVpcmVfY2hlY2ttNF9pZihfbTRfZGVmbihbX200X2RpdmVydGluZ10pLCBbJDJdLCBbbTRfaWdub3JlXSwKICAgICAgIG00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFskMl0pXSwgWy1dKSwgWy1dLCBbbTRfd2Fybihbc3ludGF4XSwKICAgWyQzOiBgJDEnIHdhcyBleHBhbmRlZCBiZWZvcmUgaXQgd2FzIHJlcXVpcmVkXSlfbTRfcmVxdWlyZV9jYWxsXSwKICAgICAgIFttNF9pZ25vcmVdKQpUMTksMTY2Cm00X3NldF9pbnRlcnNlY3Rpb25tNF9pZihbJDFdLCBbJDJdLCBbbTRfc2V0X2xpc3RjKFskMV0pXSwKICAgICAgIG00X2V2YWwobTRfc2V0X3NpemUoWyQyXSkgPCBtNF9zZXRfc2l6ZShbJDFdKSksIFsxXSwgWyQwKFskMl0sIFskMV0pXSwKICAgICAgIFttNF9zZXRfbWFwX3NlcChbJDFdLCBbXyQwKFskMl0sXSwgWyldKV0pClQyNywxMDEKbTRfbG9jYXRpb24oQUNfUFJPR19DQ19DODkpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjEzNTQKVDI3LDEwMwptNF9sb2NhdGlvbihBQ19MQU5HX1dFUlJPUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6NzIwClQyOSwxMDYKbTRfbG9jYXRpb24oQUNfRkNfRFVNTVlfTUFJTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6ODE2ClQxOSwxNDcKQVNfUkVRVUlSRV9TSEVMTF9GTm00X3Byb3ZpZGVfaWYoW0FTX1NIRUxMX0ZOXyQxXSwgW10sCltBU19SRVFVSVJFKFtBU19TSEVMTF9GTl8kMV0sClttNF9wcm92aWRlKFtBU19TSEVMTF9GTl8kMV0pXyQwKCRAKV0sCm00X2RlZmF1bHRfcXVvdGVkKFskNF0sIFtNNFNILUlOSVQtRk5dKSldKQpUMTMsNDcKQVNfTElURVJBTF9JRl8kMChtNF9leHBhbmQoWyQxXSksIFsJIF1bCl0pKFskNF0sIFskM10sIFskMl0pClQyMCwxNDMKQUNfRjc3X05BTUVfTUFOR0xJTkdfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRjc3X05BTUVfTUFOR0xJTkcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpGNiw2CnN5c3ZhbHN5c3ZhbApUMjcsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfSU5UOF9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjE2ClQxMiw3NApfQUNfTEFOR19TRVRfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0xBTkdfRElTUEFUQ0goW0FDX0xBTkddLCBbJDJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjEsMwpfQUNfQVdLX0xJVEVSQUxfTElNSVQxNDgKVDYsODYKQUhfVE9QbTRfZGVmaW5lKFtfQUhfQ09VTlRFUl0sIG00X2luY3IoX0FIX0NPVU5URVIpKWRubApBSF9WRVJCQVRJTShbMDAwMF1fQUhfQ09VTlRFUiwgWyQxXSkKVDIxLDEwMQptNF9zdGFja19mb3JlYWNoX2xpZm9fbTRfc3RhY2tfcmV2ZXJzZShbJDFdLCBbbTRfdG1wLSQxXSwgWyQyKF9tNF9kZWZuKFttNF90bXAtJDFdKSldKV9tNF9zdGFja19yZXZlcnNlKFttNF90bXAtJDFdLCBbJDFdKQpUMTEsMzMKbTRfc2V0X2xpc3RtNF9zZXRfbWFwX3NlcChbJDFdLCBbXSwgW10sIFssXSkKVDMwLDEwOAptNF9sb2NhdGlvbihBQ19GVU5DX0dFVE1OVEVOVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4MTgKVDI3LDE1NQpfQUNfTEFOR19JT19QUk9HUkFNKEVybGFuZylBQ19MQU5HX1BST0dSQU0oW10sIFtkbmwKICAgUmV0dXJuVmFsdWUgPSBjYXNlIGZpbGU6d3JpdGVfZmlsZSgiY29uZnRlc3Qub3V0IiwgIiIpIG9mCiAgICAgICB7ZXJyb3IsIF99IC0+IDE7CiAgICAgICBvayAtPiAwCiAgIGVuZCwKICAgaGFsdChSZXR1cm5WYWx1ZSldKQpUMTgsNTM3Cl9BQ19DSEVDS19UWVBFX05FV19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja190eXBlXSwKICBbQVNfRlVOQ1RJT05fREVTQ1JJQkUoW2FjX2ZuX11fQUNfTEFOR19BQkJSRVZbX2NoZWNrX3R5cGVdLAogICAgW0xJTkVOTyBUWVBFIFZBUiBJTkNMVURFU10sCiAgICBbVGVzdHMgd2hldGhlciBUWVBFIGV4aXN0cyBhZnRlciBoYXZpbmcgaW5jbHVkZWQgSU5DTFVERVMsIHNldHRpbmcKICAgICBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkuXSldLAogICAgWyQwX0JPRFldKUFTX1ZBUl9QVVNIREVGKFthY19UeXBlXSwgW2FjX2N2X3R5cGVfJDFdKWFjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY2hlY2tfdHlwZSAiJExJTkVOTyIgIiQxIiAiYWNfVHlwZSIgIkFTX0VTQ0FQRShbQUNfSU5DTFVERVNfREVGQVVMVChbJDRdKV0sIFsiIl0pIgpBU19WQVJfSUYoW2FjX1R5cGVdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfVHlwZV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTEsMzY4CkFDX1BST0dfTEVYX200X2RlZnVuX29uY2UoW0FDX1BST0dfTEVYXSwgW0FDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsIDopCmlmIHRlc3QgIngkTEVYIiAhPSAieDoiOyB0aGVuCiAgX0FDX1BST0dfTEVYX1lZVEVYVF9ERUNMCmZpXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX1BST0dfTEVYXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfUFJPR19MRVhdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfUFJPR19MRVhdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19QUk9HX0xFWF0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDIxLDY1CkFDX0xBTkdfQ09NUElMRVIoQysrKV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwxMDIKbTRfbG9jYXRpb24oX0FTX0RFVEVDVF9SRVFVSVJFRCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxNTcKVDIzLDEwMgptNF9sb2NhdGlvbihBU19QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjMyMQpUMzEsMTU0CkFDX1ZBTElEQVRFX0NBQ0hFRF9TWVNURU1fVFVQTEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVkFMSURBVEVfQ0FDSEVEX1NZU1RFTV9UVVBMRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw2MTUKQUNfRElSX0hFQURFUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19ESVJfSEVBREVSJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19IRUFERVJfRElSRU5UCkFDX0ZVTkNfQ0xPU0VESVJfVk9JRAp0ZXN0IGFjX2N2X2hlYWRlcl9kaXJlbnRfZGlyZW50X2ggJiYKICBBQ19ERUZJTkUoW0RJUkVOVF0sIDEsIFtTYW1lIGFzIGBIQVZFX0RJUkVOVF9IJywgZG9uJ3QgZGVwZW5kIG9uIG1lLl0pCnRlc3QgYWNfY3ZfaGVhZGVyX2RpcmVudF9zeXNfbmRpcl9oICYmCiAgQUNfREVGSU5FKFtTWVNORElSXSwgMSwgW1NhbWUgYXMgYEhBVkVfU1lTX05ESVJfSCcsIGRvbid0IGRlcGVuZCBvbiBtZS5dKQp0ZXN0IGFjX2N2X2hlYWRlcl9kaXJlbnRfc3lzX2Rpcl9oICYmCiAgQUNfREVGSU5FKFtTWVNESVJdLCAxLCBbU2FtZSBhcyBgSEFWRV9TWVNfRElSX0gnLCBkb24ndCBkZXBlbmQgb24gbWUuXSkKdGVzdCBhY19jdl9oZWFkZXJfZGlyZW50X25kaXJfaCAmJgogIEFDX0RFRklORShbTkRJUl0sIDEsIFtTYW1lIGFzIGBIQVZFX05ESVJfSCcsIGRvbid0IGRlcGVuZCBvbiBtZS5dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMTAzCm00X2xvY2F0aW9uKF9BU19URVNUX1BSRVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6MTM0OApGOCw4Cl9fbGluZV9fX19saW5lX18KVDIzLDM1MApfQUNfQ0hFQ0tfVFlQRV9ORVdfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJFtdMl0sIFskW10zXSwKICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pCiAgQUNfQ09NUElMRV9JRkVMU0UoCiAgICBbQUNfTEFOR19QUk9HUkFNKFskW100XSwKICAgICAgIFtpZiAoc2l6ZW9mICgkW10yKSkKCSByZXR1cm4gMDtdKV0sCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKFskW100XSwKCSAgW2lmIChzaXplb2YgKCgkW10yKSkpCgkgICAgcmV0dXJuIDA7XSldLAogICAgICAgW10sCiAgICAgICBbQVNfVkFSX1NFVChbJFtdM10sIFt5ZXNdKV0pXSldKQogIEFTX0xJTkVOT19QT1AKClQzNCwxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19FUlJPUl9BVF9MSU5FKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjQ5MApUMTMsNDEKX200X3NldF91bmlvbm00X2lmZGVmKFtfbTRfc2V0KFskMV0sJDIpXSwgW10sIFssWyQyXV0pClQxNSw4OApBQ19FR1JFUF9IRUFERVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfRUdSRVBfQ1BQKFskMV0sClsjaW5jbHVkZSA8JDI+Cl0sIFskM10sIFskNF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwxMDYKbTRfbG9jYXRpb24oQUNfTEFOR19GT1JUUkFONzcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjE1MwpUMTcsMQpfbTRfZGl2ZXJ0KEJJTlNIKTAKVDE5LDE1MwpfQUNfQ09QWVJJR0hUX1lFQVJTCkNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4KClQyNywxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9TSUdOQUwpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo3MzgKVDI4LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX1NUUlRPTEQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTU5MwpUMTAsNTUKX200X3NoaWZ0Mm00X2lmKFskI10sIFsyXSwgW10sCiAgICAgICBbLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpXSkKVDE0LDE0NApBQ19MQU5HX1dFUlJPUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfdGV4dChbREVGQVVMVFNdLCBbYWNfW11fQUNfTEFOR19BQkJSRVZbXV93ZXJyb3JfZmxhZz1dKQphY19bXV9BQ19MQU5HX0FCQlJFVltdX3dlcnJvcl9mbGFnPXllc1tdX200X2RlZnVuX2VwaShbJDBdKQpUMjMsMTE3CkFDX0RFRklORV9UUkFDRV9MSVRFUkFMbTRfcGF0dGVybl9hbGxvdyhbXiQxJF0pZG5sCkFTX0lERU5USUZJRVJfSUYoWyQxXSwgW10sCiAgW200X3dhcm4oW3N5bnRheF0sIFtBQ19ERUZJTkU6IG5vdCBhbiBpZGVudGlmaWVyOiAkMV0pXSlkbmwKClQxNCwxODgKQUNfQ0hFQ0tfUFJPR1NfbTRfZGVmdW5fcHJvKFskMF0pZm9yIGFjX3Byb2cgaW4gJDIKZG8KICBBQ19DSEVDS19QUk9HKFskMV0sIFskYWNfcHJvZ10sIFskYWNfcHJvZ10sICwgWyQ0XSkKICB0ZXN0IC1uICIkJDEiICYmIGJyZWFrCmRvbmUKbTRfaWZ2YWxuKFskM10sIFt0ZXN0IC1uICIkJDEiIHx8ICQxPSIkMyJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsNAptNF9QQUNLQUdFX1ZFUlNJT04yLjY4ClQxMCw2NQpfbTRfc2hpZnQzbTRfaWYoWyQjXSwgWzNdLCBbXSwKICAgICAgIFssIG00X3NoaWZ0KG00X3NoaWZ0KG00X3NoaWZ0KCRAKSkpXSkKVDE2LDIyMgpfQVNfQkFTRU5BTUVfU0VEX200X2RlZnVuX3BybyhbJDBdKUFTX0VDSE8oW1gvW10kMV0pIHwKICAgIHNlZCBbJy9eLipcL1woW14vXVteL10qXClcLyokL3sKCSAgICBzLy9cMS8KCSAgICBxCgkgIH0KCSAgL15YXC9cKFwvXC9cKSQvewoJICAgIHMvL1wxLwoJICAgIHEKCSAgfQoJICAvXlhcL1woXC9cKS4qL3sKCSAgICBzLy9cMS8KCSAgICBxCgkgIH0KCSAgcy8uKi8uLzsgcSddW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMCwxOTYKX0FDX0FSR19WQVJfQ1BQRkxBR1NfbTRfZGVmdW5fcHJvKFskMF0pQUNfQVJHX1ZBUihbQ1BQRkxBR1NdLAoJICAgIFsoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+CgkgICAgIGlmIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE3OQpBQ19WRk9SS19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19WRk9SSycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX0ZPUktdLCBbQUNfRlVOQ19GT1JLKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE4MQpBQ19QSURfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19QSURfVCcgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19UWVBFX1BJRF9UXSwgW0FDX1RZUEVfUElEX1QoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDMKX200X2RpdmVydChWRVJTSU9OX0VORCkyMDMKVDQzLDEwMAptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0MoT2JqZWN0aXZlIEMrKykpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00Ojk1NApUMTMsMzgzCl9BU19QQVRIX1dBTEthc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCm00X2lmdmFsbihbJDNdLCBbYXNfZm91bmQ9ZmFsc2VdKWRubAptNF9ibWF0Y2goWyQxXSwgW1s6O11dLApbYXNfZHVtbXk9IiQxIgpmb3IgYXNfZGlyIGluICRhc19kdW1teV0sCltmb3IgYXNfZGlyIGluIG00X2RlZmF1bHQoWyQxXSwgWyRQQVRIXSldKQpkbwogIElGUz0kYXNfc2F2ZV9JRlMKICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogIG00X2lmdmFsbihbJDNdLCBbYXNfZm91bmQ9Ol0pZG5sCiAgJDIKICBtNF9pZnZhbG4oWyQzXSwgW2FzX2ZvdW5kPWZhbHNlXSlkbmwKZG9uZQptNF9pZnZhbG4oWyQzXSwgWyRhc19mb3VuZCB8fCB7ICQzOyB9XSlkbmwKSUZTPSRhc19zYXZlX0lGUwpbXQpUMTMsMTM5Cl9BU19QQVRIX1dBTEtfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX1BBVEhfU0VQQVJBVE9SX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSw0NzYKX0FDX0NIRUNLX0RFQ0xfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIFthc19kZWNsX25hbWU9YGVjaG8gJF1bMnxzZWQgJ3MvICooLiovLydgXQogIFthc19kZWNsX3VzZT1gZWNobyAkXVsyfHNlZCAtZSAncy8oLygoLycgLWUgJ3MvKS8pIDAmLycgLWUgJ3MvLC8pIDAmICgvZydgXQogIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWRdLCBbJFtdM10sCiAgW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyRbXTRdLApbQCU6QGlmbmRlZiAkW11hc19kZWNsX25hbWUKQCU6QGlmZGVmIF9fY3BsdXNwbHVzCiAgKHZvaWQpICRbXWFzX2RlY2xfdXNlOwpAJTpAZWxzZQogICh2b2lkKSAkW11hc19kZWNsX25hbWU7CkAlOkBlbmRpZgpAJTpAZW5kaWYKXSldLAoJCSAgIFtBU19WQVJfU0VUKFskW10zXSwgW3llc10pXSwKCQkgICBbQVNfVkFSX1NFVChbJFtdM10sIFtub10pXSldKQogIEFTX0xJTkVOT19QT1AKClQzNiwxMDAKbTRfbG9jYXRpb24oQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjU0MwpUMjgsMQpfbTRfZGl2ZXJ0KEhFQURFUi1DT1BZUklHSFQpMwpUMjksMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfSU5UTUFYX1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDozMDkKVDExLDU4Cl9BU19DTEVBTlVQbTRfZGl2ZXJ0X3RleHQoW000U0gtU0FOSVRJWkVdLCBbX0FTX0RFVEVDVF9CRVRURVJfU0hFTExdKQpUMjEsMTUxMgpfQUNfTElCT0JKX0dFVExPQURBVkdBQ19MSUJPQkooZ2V0bG9hZGF2ZykKQUNfREVGSU5FKENfR0VUTE9BREFWRywgMSwgW0RlZmluZSB0byAxIGlmIHVzaW5nIGBnZXRsb2FkYXZnLmMnLl0pCiMgRmlndXJlIG91dCB3aGF0IG91ciBnZXRsb2FkYXZnLmMgbmVlZHMuCmFjX2hhdmVfZnVuYz1ubwpBQ19DSEVDS19IRUFERVIoc3lzL2RnX3N5c19pbmZvLmgsClthY19oYXZlX2Z1bmM9eWVzCiBBQ19ERUZJTkUoREdVWCwgMSwgW0RlZmluZSB0byAxIGZvciBER1VYIHdpdGggPHN5cy9kZ19zeXNfaW5mby5oPi5dKQogQUNfQ0hFQ0tfTElCKGRnYywgZGdfc3lzX2luZm8pXSkKCkFDX0NIRUNLX0hFQURFUihsb2NhbGUuaCkKQUNfQ0hFQ0tfRlVOQ1Moc2V0bG9jYWxlKQoKIyBXZSBjYW5ub3QgY2hlY2sgZm9yIDxkd2FyZi5oPiwgYmVjYXVzZSBTb2xhcmlzIDIgZG9lcyBub3QgdXNlIGR3YXJmIChpdAojIHVzZXMgc3RhYnMpLCBidXQgaXQgaXMgc3RpbGwgU1ZSNC4gIFdlIGNhbm5vdCBjaGVjayBmb3IgPGVsZi5oPiBiZWNhdXNlCiMgSXJpeCA0LjAuNUYgaGFzIHRoZSBoZWFkZXIgYnV0IG5vdCB0aGUgbGlicmFyeS4KaWYgdGVzdCAkYWNfaGF2ZV9mdW5jID0gbm8gJiYgdGVzdCAiJGFjX2N2X2xpYl9lbGZfZWxmX2JlZ2luIiA9IHllcyBcCiAgICAmJiB0ZXN0ICIkYWNfY3ZfbGliX2t2bV9rdm1fb3BlbiIgPSB5ZXM7IHRoZW4KICBhY19oYXZlX2Z1bmM9eWVzCiAgQUNfREVGSU5FKFNWUjQsIDEsIFtEZWZpbmUgdG8gMSBvbiBTeXN0ZW0gViBSZWxlYXNlIDQuXSkKZmkKCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfSEVBREVSKGlucV9zdGF0cy9jcHVzdGF0cy5oLAogIFthY19oYXZlX2Z1bmM9eWVzCiAgIEFDX0RFRklORShVTUFYLCAxLCBbRGVmaW5lIHRvIDEgZm9yIEVuY29yZSBVTUFYLl0pCiAgIEFDX0RFRklORShVTUFYNF8zLCAxLAoJICAgICBbRGVmaW5lIHRvIDEgZm9yIEVuY29yZSBVTUFYIDQuMyB0aGF0IGhhcyA8aW5xX3N0YXR1cy9jcHVzdGF0cy5oPgoJICAgICAgaW5zdGVhZCBvZiA8c3lzL2NwdXN0YXRzLmg+Ll0pXSkKZmkKCmlmIHRlc3QgJGFjX2hhdmVfZnVuYyA9IG5vOyB0aGVuCiAgQUNfQ0hFQ0tfSEVBREVSKHN5cy9jcHVzdGF0cy5oLAogIFthY19oYXZlX2Z1bmM9eWVzOyBBQ19ERUZJTkUoVU1BWCldKQpmaQoKaWYgdGVzdCAkYWNfaGF2ZV9mdW5jID0gbm87IHRoZW4KICBBQ19DSEVDS19IRUFERVJTKG1hY2gvbWFjaC5oKQpmaQoKQUNfQ0hFQ0tfSEVBREVSUyhubGlzdC5oLApbQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IG5saXN0Lm5fdW4ubl9uYW1lXSwKCQkgIFtBQ19ERUZJTkUoTkxJU1RfTkFNRV9VTklPTiwgMSwKCQkJICAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBgc3RydWN0IG5saXN0JyBoYXMgYW4KCQkJICAgICAgYG5fdW4nIG1lbWJlci4gIE9ic29sZXRlLCBkZXBlbmQgb24KCQkJICAgICAgYEhBVkVfU1RSVUNUX05MSVNUX05fVU5fTl9OQU1FXSldLCBbXSwKCQkgIFtAJTpAaW5jbHVkZSA8bmxpc3QuaD5dKQpdKWRubAoKVDIwLDMxNgpBQ19MQU5HX1BST0dSQU0oQysrKSQxCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRjc3X0hPT0tTXSwgW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdKVtdZG5sCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0ZDX0hPT0tTXSlbXWRubAppbnQKbWFpbiAoKQp7CmRubCBEbyAqbm90KiBpbmRlbnQgdGhlIGZvbGxvd2luZyBsaW5lOiB0aGVyZSBtYXkgYmUgQ1BQIGRpcmVjdGl2ZXMuCmRubCBEb24ndCBtb3ZlIHRoZSBgOycgcmlnaHQgYWZ0ZXIgZm9yIHRoZSBzYW1lIHJlYXNvbi4KJDIKICA7CiAgcmV0dXJuIDA7Cn0KVDIxLDMyCkFTX0xJVEVSQUxfSEVSRURPQ19JRl8kMChtNF9leHBhbmQoWyQxXSkpKFskMl0sIFskM10pClQ4LDE1MApBQ19ERUZVTm00X2RlZmluZShbbTRfbG9jYXRpb24oJDEpXSwgbTRfbG9jYXRpb24pbTRfZGVmYXVsdChbJDNdLCBbbTRfZGVmaW5lXSkoWyQxXSwKICBbX200X2RlZnVuX3BybyhdbTRfZHF1b3RlKCRbMF0pWykkMltdX200X2RlZnVuX2VwaShdbTRfZHF1b3RlKCRbMF0pWyldKQpUMTAsODQKX200X21pbm1heG00X2lmKFskI10sIFszXSwgWyQxKFskMl0sIFskM10pXSwKICAgICAgIFskMChbJDFdLCAkMShbJDJdLCBbJDNdKSwgbTRfc2hpZnQzKCRAKSldKQpUMTMsOTgKX0FDX0RPX1NUREVSUl9tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfUlVOX0xPR19TVERFUlIoW2V2YWwgIiQxIl0sCgkJICAgIFtfQUNfRE9fRUNITyhbJDFdKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw1NwpBU19NRV9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSwyMzgKbTRfdGV4dF9ib3htNF9wdXNoZGVmKFttNF9Cb3JkZXJdLAoJICAgIG00X3RyYW5zbGl0KG00X2Zvcm1hdChbW1slKnNdXV0sIG00X2RlY3IobTRfcWxlbihfbTRfZXhwYW5kKFskMQpdKSkpLCBbXSksIFsgXSwgbTRfZGVmYXVsdF9xdW90ZWQoWyQyXSwgWy1dKSkpWyMjXSBfbTRfZGVmbihbbTRfQm9yZGVyXSkgWyMjXQpbIyNdICQxIFsjI10KWyMjXSBfbTRfZGVmbihbbTRfQm9yZGVyXSkgWyMjXV9tNF9wb3BkZWYoW200X0JvcmRlcl0pClQzNiwxMDkKbTRfbG9jYXRpb24oQUNfRlVOQ19TRUxFQ1RfQVJHVFlQRVMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTQzOApUMjMsMzc4Cl9BQ19DSEVDS19IRUFERVJfRElSRU5UQVNfVkFSX1BVU0hERUYoW2FjX0hlYWRlcl0sIFthY19jdl9oZWFkZXJfZGlyZW50XyQxXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkMSB0aGF0IGRlZmluZXMgRElSXSwgW2FjX0hlYWRlcl0sCltBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDwkMT4KXSwKCQkJCSAgICBbaWYgKChESVIgKikgMCkKcmV0dXJuIDA7XSldLAoJCSAgIFtBU19WQVJfU0VUKFthY19IZWFkZXJdLCBbeWVzXSldLAoJCSAgIFtBU19WQVJfU0VUKFthY19IZWFkZXJdLCBbbm9dKV0pXSkKQVNfVkFSX0lGKFthY19IZWFkZXJdLCBbeWVzXSwgWyQyXSwgWyQzXSkKQVNfVkFSX1BPUERFRihbYWNfSGVhZGVyXSlkbmwKClQxNiw1MTYKQUNfQ19CQUNLU0xBU0hfQV9tNF9kZWZ1bl9wcm8oWyQwXSkKICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBiYWNrc2xhc2gtYSB3b3JrcyBpbiBzdHJpbmdzXSwgYWNfY3ZfY19iYWNrc2xhc2hfYSwKICAgW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sCiAgICAgW1sKI2lmICdcYScgPT0gJ2EnCiAgICAgIHN5bnRheCBlcnJvcjsKI2VuZGlmCiAgICAgIGNoYXIgYnVmWydcYScgPT0gJ2EnID8gLTEgOiAxXTsKICAgICAgYnVmWzBdID0gJ1xhJzsKICAgICAgcmV0dXJuIGJ1ZlswXSAhPSAiXGEiWzBdOwogICAgIF1dKV0sCiAgICAgW2FjX2N2X2NfYmFja3NsYXNoX2E9eWVzXSwKICAgICBbYWNfY3ZfY19iYWNrc2xhc2hfYT1ub10pXSkKICBpZiB0ZXN0ICRhY19jdl9jX2JhY2tzbGFzaF9hID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9DX0JBQ0tTTEFTSF9BLCAxLAogICAgICBbRGVmaW5lIGlmIGJhY2tzbGFzaC1hIHdvcmtzIGluIEMgc3RyaW5ncy5dKQogIGZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMTE1CkFDX01TR19FUlJPUmFzX2ZuX2Vycm9yIG00X2RlZmF1bHQoWyQyXSwgWyQ/XSkgIl9BU19RVU9URShbJDFdKSJtNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKICBbICIkTElORU5PIiBBU19NRVNTQUdFX0xPR19GRF0pW10KVDEyLDE4NwpBQ19NU0dfRVJST1JfbTRfZGVmdW5fcHJvKFskMF0pbTRfYXBwZW5kX3VuaXEoW19BU19DTEVBTlVQXSwKICBbbTRfZGl2ZXJ0X3RleHQoW000U0gtSU5JVC1GTl0sIFtfQVNfRVJST1JfUFJFUEFSRVtdXSldKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMiw1OQpBQ19GVU5DX1NUQVRfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZVTkNfU1RBVChzdGF0KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTgwCm00X3NldF9jb250YWluc200X2lmZGVmKFtfbTRfc2V0X2NsZWFudXAoJDEpXSwKCSAgW200X2lmKG00X2lmZGVmKFtfbTRfc2V0KFskMV0sJDIpXSwKCQkgICAgW200X2luZGlyKFtfbTRfc2V0KFskMV0sJDIpXSldLCBbMF0pLCBbMV0sIFskM10sIFskNF0pXSwKCSAgW200X2lmZGVmKFtfbTRfc2V0KFskMV0sJDIpXSwgWyQzXSwgWyQ0XSldKQpGMTAsNwptNF9lc3lzY21kZXN5c2NtZApUMzIsMTA5Cm00X2xvY2F0aW9uKF9BQ19GVU5DX1JFQUxMT0NfSUYpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTM5NgpUMjcsMTA0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1RZUEVTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MTc3ClQzMSwwCm00X2luY2x1ZGUoYXV0b2NvbmYvZm9ydHJhbi5tNCkKVDM0LDIzCl9BQ19MQU5HX05VTExfUFJPR1JBTShPYmplY3RpdmUgQylBQ19MQU5HX1BST0dSQU0oW10sIFtdKQpUOSwyMgpBU19UUl9DUFBfJDAobTRfZXhwYW5kKFskMV0pKVtdClQ5LDEyNApBU19UUl9DUFBfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbXyQwX1BSRVBBUkVdKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw3NQpBQ19UWVBFX1NJWkVfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19UWVBFKHNpemVfdCwgdW5zaWduZWQgaW50KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMzIKbTRfc2V0X21hcG00X3NldF9tYXBfc2VwKFskMV0sIFskMihdLCBbKV0pClQyMywxMDkKbTRfbG9jYXRpb24oQUNfU1RSQ09MTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNzQ4ClQzNCwxMDAKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihDKyspKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDo2NjcKVDMwLDEwNgptNF9sb2NhdGlvbihBQ19DT05GSUdfU1VCRElSUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3N0YXR1cy5tNDoxMDk5ClQxNCw1MwptNF9jcl9zeW1ib2xzMWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfClQxNCwxNzkKX0FTX0xJVEVSQUxfSUZtNF9pZihtNF9pbmRleChbJDFdLCBbQFN8QF0pLCBbLTFdLCBbJDBfKG00X3RyYW5zbGl0KFskMV0sCiAgWy06JS9Ae31bXSMoKSwuJDJdXVtbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl8wMTIzNDU2Nzg5XV1bLAogIFsrKysrKyQkYGBgYGBdKSldLCBbJDBfTk9dKQpUMjAsMTc3Cl9BQ19DSEVDS19IRUFERVJfTkVXX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYCQwJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCB1c2UgQUNfQ0hFQ0tfSEVBREVSIHdpdGggYSBmb3VydGggYXJndW1lbnQuXSlfQUNfQ0hFQ0tfSEVBREVSX0NPTVBJTEUoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMCwwCm00X2luY2x1ZGUoYXV0b2NvbmYvZXJsYW5nLm00KQpUMTQsNjMKbTRfY3Jfc3ltYm9sczJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXzAxMjM0NTY3ODkKVDEzLDExNgpfQVNfQk9YX0lORElSc2VkICdoO3MvLi9tNF9kZWZhdWx0KFskMl0sIFstXSkvZztzL14uLi4vQCU6QEAlOkAgLztzLy4uLiQvIEAlOkBAJTpALztwO3g7cDt4JyA8PF9BU0JPWApAJTpAQCU6QCAkMSBAJTpAQCU6QApfQVNCT1gKVDE4LDI0MwpBQ19FUkxBTkdfUEFUSF9FUkxfbTRfZGVmdW5fcHJvKFskMF0pQUNfQVJHX1ZBUihbRVJMXSwgW0VybGFuZy9PVFAgaW50ZXJwcmV0ZXIgY29tbWFuZCBbYXV0b2RldGVjdGVkXV0pZG5sCmlmIHRlc3QgLW4gIiRFUkwiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlcmxdKQogICAgQUNfTVNHX1JFU1VMVChbJEVSTF0pCmVsc2UKICAgIEFDX1BBVEhfVE9PTChFUkwsIGVybCwgWyQxXSwgWyQyXSlbXWRubApmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEyLDE4Cm00X2VycnByaW50bm00X2VycnByaW50KFskMQpdKQpUMTMsMzA2Cm00X2JwYXRzdWJzdHNtNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCiAgICAgICBbJCNdLCAxLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCM6ICQxXSldLAogICAgICAgWyQjXSwgMiwgW200X3VucXVvdGUobTRfYnVpbHRpbihbcGF0c3Vic3RdLCBbWyQxXV0sIFskMl0pKV0sCiAgICAgICBbJCNdLCAzLCBbbTRfdW5xdW90ZShtNF9idWlsdGluKFtwYXRzdWJzdF0sIFtbJDFdXSwgWyQyXSwgWyQzXSkpXSwKICAgICAgIFtfJDAoJEBtNF9pZihtNF9ldmFsKCQjICYgMSksIDAsIFssXSkpXSkKVDEzLDMwOApBQ19QUk9HX0VHUkVQX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgZWdyZXBdLCBhY19jdl9wYXRoX0VHUkVQLAogICBbaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKICAgZWxzZQogICAgIF9BQ19QUk9HX0dSRVAoRUdSRVAsIGVncmVwLCBbJ0VHUkVQJCddKQogICBmaV0pCiBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCiBBQ19TVUJTVChbRUdSRVBdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIzLDEwMgptNF9sb2NhdGlvbihBU19NRVNTQUdFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjgwMQpGNyw0Cm00X2RlY3JkZWNyClQxNCwzMgpfQVVfQUxJQVNfQk9EWVttNF9pZigkMSMsIDAsIFskMl0sIFskMigkMUApXSldClQzMywyMwpfQUNfTEFOR19OVUxMX1BST0dSQU0oRm9ydHJhbiA3NylBQ19MQU5HX1BST0dSQU0oW10sIFtdKQpUMTIsOTMKbTRfdGV4dF93cmFwXyQwKG00X2VzY2FwZShbJDFdKSwgWyQyXSwgbTRfZGVmYXVsdF9xdW90ZWQoWyQzXSwgWyQyXSksCiAgICAgbTRfZGVmYXVsdF9xdW90ZWQoWyQ0XSwgWzc5XSkpClQxMiw5MwptNF9zZXRfZW1wdHltNF9pZmRlZihbX200X3NldF9zaXplKCQxKV0sCgkgIFttNF9pZihtNF9pbmRpcihbX200X3NldF9zaXplKCQxKV0pLCBbMF0sIFskMl0sIFskM10pXSwgWyQyXSkKVDEyLDQ4OQpBQ19TVFJVQ1RfVE1fbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgc3RydWN0IHRtIGlzIGluIHN5cy90aW1lLmggb3IgdGltZS5oXSwKICBhY19jdl9zdHJ1Y3RfdG0sCltBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDx0aW1lLmg+Cl0sCgkJCQkgICAgW3N0cnVjdCB0bSB0bTsKCQkJCSAgICAgaW50ICpwID0gJnRtLnRtX3NlYzsKCQkJCSAgICAgcmV0dXJuICFwO10pXSwKCQkgICBbYWNfY3Zfc3RydWN0X3RtPXRpbWUuaF0sCgkJICAgW2FjX2N2X3N0cnVjdF90bT1zeXMvdGltZS5oXSldKQppZiB0ZXN0ICRhY19jdl9zdHJ1Y3RfdG0gPSBzeXMvdGltZS5oOyB0aGVuCiAgQUNfREVGSU5FKFRNX0lOX1NZU19USU1FLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIDxzeXMvdGltZS5oPiBkZWNsYXJlcyBgc3RydWN0IHRtJy5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDM2Cm00X3NldF9jb250ZW50c200X3NldF9tYXBfc2VwKFskMV0sIFtdLCBbXSwgW1skMl1dKQpUMzIsMTAyCm00X2xvY2F0aW9uKF9BU19ESVJOQU1FX1BSRVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6OTc4ClQxNSw1NQpfQVNfVFJfU0hfSU5ESVJgQVNfRUNITyhbIl9BU19FU0NBUEUoW1skMV1dLCBbYF0sIFtcXSkiXSkgfCAkYXNfdHJfc2hgClQxOCwzMTYKQUNfTEFOR19QUk9HUkFNKEMpJDEKbTRfaWZkZWYoW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0Y3N19IT09LU10pW11kbmwKbTRfaWZkZWYoW19BQ19MQU5HX1BST0dSQU1fQ19GQ19IT09LU10sIFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdKVtdZG5sCmludAptYWluICgpCnsKZG5sIERvICpub3QqIGluZGVudCB0aGUgZm9sbG93aW5nIGxpbmU6IHRoZXJlIG1heSBiZSBDUFAgZGlyZWN0aXZlcy4KZG5sIERvbid0IG1vdmUgdGhlIGA7JyByaWdodCBhZnRlciBmb3IgdGhlIHNhbWUgcmVhc29uLgokMgogIDsKICByZXR1cm4gMDsKfQpUMjAsMTAyCm00X2xvY2F0aW9uKEFTX0NBU0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6NTE3ClQyOCwxMDYKbTRfbG9jYXRpb24oQUNfVEVTVF9QUk9HUkFNKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NDYKVDI3LDEwNgptNF9sb2NhdGlvbihBQ19TSVpFT0ZfVFlQRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjQ0ClQyMiwxMDEKbTRfbG9jYXRpb24oQUNfT1BFTk1QKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxOTcwClQxMCwxNjgKbTRfY29tYmluZW00X2lmKFskMl0sIFtdLCBbXSwgbTRfZXZhbChbJCMgPiAzXSksIFsxXSwKW200X21hcF9hcmdzX3NlcChbbTRfbWFwX2FyZ3Nfc2VwKG00X2RxdW90ZShdLCBbKVtbJDNdXSwgW10sIFtbJDFdXSxdXW00X2RxdW90ZShtNF9kcXVvdGUobTRfc2hpZnQzKCRAKSkpW1spXSwgW1skMV1dLCAkMildKQpUOSwzMzkKQVNfVkFSX0lGQVNfTElURVJBTF9XT1JEX0lGKFskMV0sCiAgW0FTX0lGKG00X2lmdmFsKFskMl0sIFtbdGVzdCAieCQkMSIgPSB4W10kMl1dLCBbWyR7JDE6K2ZhbHNlfSA6XV0pXSwKICBbQVNfVkFSX0NPUFkoW2FzX3ZhbF0sIFskMV0pCiAgIEFTX0lGKG00X2lmdmFsKFskMl0sIFtbdGVzdCAieCRhc192YWwiID0geFtdJDJdXSwgW1ske2FzX3ZhbDorZmFsc2V9IDpdXSldLAogIFtBU19JRihtNF9pZnZhbChbJDJdLAogICAgW1tldmFsIHRlc3QgXCJ4XCQiJDEiXCIgPSB4Il9BU19FU0NBUEUoWyQyXSwgW2BdLCBbXCIkXSkiXV0sCiAgICBbW2V2YWwgXCR7JDE6K2ZhbHNlfSA6XV0pXSksClskM10sIFskNF0pClQxNCwxODkKQU1fRlVOQ19TVFJUT0RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fRlVOQ19TVFJUT0QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfRlVOQ19TVFJUT0RdLCBbQUNfRlVOQ19TVFJUT0QoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDE4MwpBQ19WRVJCT1NFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1ZFUkJPU0UnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfTVNHX1JFU1VMVF0sIFtBQ19NU0dfUkVTVUxUKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw3MzEKQUNfRlVOQ19GU0VFS09fbTRfZGVmdW5fcHJvKFskMF0pX0FDX1NZU19MQVJHRUZJTEVfTUFDUk9fVkFMVUUoX0xBUkdFRklMRV9TT1VSQ0UsIDEsCiAgIFthY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZV0sCiAgIFtEZWZpbmUgdG8gMSB0byBtYWtlIGZzZWVrbyB2aXNpYmxlIG9uIHNvbWUgaG9zdHMgKGUuZy4gZ2xpYmMgMi4yKS5dLAogICBbWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogZm9yIG9mZl90ICovCiAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+XV0sCiAgIFtbaW50ICgqZnApIChGSUxFICosIG9mZl90LCBpbnQpID0gZnNlZWtvOwogICAgIHJldHVybiBmc2Vla28gKHN0ZGluLCAwLCAwKSAmJiBmcCAoc3RkaW4sIDAsIDApO11dKQoKIyBXZSB1c2VkIHRvIHRyeSBkZWZpbmluZyBfWE9QRU5fU09VUkNFPTUwMCB0b28sIHRvIHdvcmsgYXJvdW5kIGEgYnVnCiMgaW4gZ2xpYmMgMi4xLjMsIGJ1dCB0aGF0IGJyZWFrcyB0b28gbWFueSBvdGhlciB0aGluZ3MuCiMgSWYgeW91IHdhbnQgZnNlZWtvIGFuZCBmdGVsbG8gd2l0aCBnbGliYywgdXBncmFkZSB0byBhIGZpeGVkIGdsaWJjLgppZiB0ZXN0ICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSAhPSB1bmtub3duOyB0aGVuCiAgQUNfREVGSU5FKEhBVkVfRlNFRUtPLCAxLAogICAgW0RlZmluZSB0byAxIGlmIGZzZWVrbyAoYW5kIHByZXN1bWFibHkgZnRlbGxvKSBleGlzdHMgYW5kIGlzIGRlY2xhcmVkLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMjAyCm00X2NyX25vdF9zeW1ib2xzMQECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjKiUmJygpJCssLi8wMTIzNDU2Nzg5Ojs8PT4/QFtcXV5ge3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/y0KVDExLDc4MQpBQ19QUk9HX0NQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKQUNfQVJHX1ZBUihbQ1BQXSwgICAgICBbQyBwcmVwcm9jZXNzb3JdKWRubApfQUNfQVJHX1ZBUl9DUFBGTEFHUygpZG5sCkFDX0xBTkdfUFVTSChDKWRubApBQ19NU0dfQ0hFQ0tJTkcoW2hvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yXSkKIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KICBDUFA9CmZpCmlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCiAgQUNfQ0FDSEVfVkFMKFthY19jdl9wcm9nX0NQUF0sCiAgW2RubAogICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCiAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgogICAgZG8KICAgICAgX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0UoW2JyZWFrXSkKICAgIGRvbmUKICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKICBdKWRubAogIENQUD0kYWNfY3ZfcHJvZ19DUFAKZWxzZQogIGFjX2N2X3Byb2dfQ1BQPSRDUFAKZmkKQUNfTVNHX1JFU1VMVChbJENQUF0pCl9BQ19QUk9HX1BSRVBST0NfV09SS1NfSUZFTFNFKFtdLAoJCVtBQ19NU0dfRkFJTFVSRShbQyBwcmVwcm9jZXNzb3IgIiRDUFAiIGZhaWxzIHNhbml0eSBjaGVja10pXSkKQUNfU1VCU1QoQ1BQKWRubApBQ19MQU5HX1BPUChDKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDEzOQpBQ19JTkNMVURFU19ERUZBVUxUX200X2RlZnVuX3BybyhbJDBdKW00X2lmdmFsKFskMV0sIFskMQpdLAoJICBbQUNfUkVRVUlSRShbX0FDX0lOQ0xVREVTX0RFRkFVTFRfUkVRVUlSRU1FTlRTXSlkbmwKJGFjX2luY2x1ZGVzX2RlZmF1bHRdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMTkyCm00X2NyX25vdF9zeW1ib2xzMgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjKiUmJygpJCssLi86Ozw9Pj9AW1xdXmB7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTgsNDcKX0FDX09VVFBVVF9DT01NQU5EICBBQ19NU0dfTk9USUNFKFtleGVjdXRpbmcgJGFjX2ZpbGUgY29tbWFuZHNdKQoKVDE1LDE5MgpBTV9QUk9HX0lOU1RBTExfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fUFJPR19JTlNUQUxMJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1BST0dfSU5TVEFMTF0sIFtBQ19QUk9HX0lOU1RBTEwoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDQ2MgpBQ19UWVBFX0lOVE1BWF9UX200X2RlZnVuX3BybyhbJDBdKQogIEFDX1JFUVVJUkUoW0FDX1RZUEVfTE9OR19MT05HX0lOVF0pCiAgQUNfQ0hFQ0tfVFlQRShbaW50bWF4X3RdLAogICAgW0FDX0RFRklORShbSEFWRV9JTlRNQVhfVF0sIDEsCiAgICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYGludG1heF90Jy5dKV0sCiAgICBbdGVzdCAkYWNfY3ZfdHlwZV9sb25nX2xvbmdfaW50ID0geWVzIFwKICAgICAgICYmIGFjX3R5cGU9J2xvbmcgbG9uZyBpbnQnIFwKICAgICAgIHx8IGFjX3R5cGU9J2xvbmcgaW50JwogICAgIEFDX0RFRklORV9VTlFVT1RFRChbaW50bWF4X3RdLCBbJGFjX3R5cGVdLAogICAgICAgW0RlZmluZSB0byB0aGUgd2lkZXN0IHNpZ25lZCBpbnRlZ2VyIHR5cGUKCWlmIDxzdGRpbnQuaD4gYW5kIDxpbnR0eXBlcy5oPiBkbyBub3QgZGVmaW5lLl0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywzNjIKQUNfUFJFRklYX1BST0dSQU1fbTRfZGVmdW5fcHJvKFskMF0paWYgdGVzdCAieCRwcmVmaXgiID0geE5PTkU7IHRoZW4KZG5sIFdlIHJlaW1wbGVtZW50IEFDX01TR19DSEVDS0lORyAobW9zdGx5KSB0byBhdm9pZCB0aGUgLi4uIGluIHRoZSBtaWRkbGUuCiAgX0FTX0VDSE9fTihbY2hlY2tpbmcgZm9yIHByZWZpeCBieSBdKQogIEFDX1BBVEhfUFJPRyhhY19wcmVmaXhfcHJvZ3JhbSwgWyQxXSkKICBpZiB0ZXN0IC1uICIkYWNfcHJlZml4X3Byb2dyYW0iOyB0aGVuCiAgICBwcmVmaXg9YEFTX0RJUk5BTUUoWyIkYWNfcHJlZml4X3Byb2dyYW0iXSlgCiAgICBwcmVmaXg9YEFTX0RJUk5BTUUoWyIkcHJlZml4Il0pYAogIGZpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOCwxNTUKQUNfTUlOSVhfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTUlOSVgnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX1VTRV9TWVNURU1fRVhURU5TSU9OU1tdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMjk3CkFDX0xBTkdfQ0FMTChPYmplY3RpdmUgQylBQ19MQU5HX1BST0dSQU0oWyQxCm00X2lmKFskMl0sIFttYWluXSwgLApbLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCiAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwogICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgojZW5kaWYKY2hhciAkMiAoKTtdKV0sIFtyZXR1cm4gJDIgKCk7XSkKVDIzLDEwMgptNF9sb2NhdGlvbihBU19ESVJOQU1FKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00Ojk2OQpUMjcsMTA3Cm00X2xvY2F0aW9uKEFDX1RSWV9DT01QSUxFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNjE1ClQzMywxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfVEFSR0VUX1RPT0wpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoyOTMKVDI2LDEwNwptNF9sb2NhdGlvbihBQ19DSEVDS19QUk9HKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MTAyCkYxMiw4Cm00X2JwYXRzdWJzdHBhdHN1YnN0ClQzMCwzNgpBQ19MQU5HX0ZVTkNfTElOS19UUlkoRm9ydHJhbilBQ19MQU5HX1BST0dSQU0oW10sClsgICAgICBjYWxsICQxXSkKVDMxLDEwMgptNF9sb2NhdGlvbihfQVNfU0hFTExfU0FOSVRJWkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6NDE5ClQyOCwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9TU0laRV9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NTk3ClQ3LDIKbTRfZWNobyRAClQyMCwxCkFTX09SSUdJTkFMX1NURElOX0ZENwpUMzEsMTA2Cm00X2xvY2F0aW9uKEFDX0xPTkdfRklMRV9OQU1FUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjY0ClQzMiwxMDcKbTRfbG9jYXRpb24oQUNfQ0FOT05JQ0FMX1RBUkdFVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTgzNApUMTMsNzYKX0FDX0RPX1RPS0VOU19tNF9kZWZ1bl9wcm8oWyQwXSl7IGFjX3RyeT0nJDEnCiAgX0FDX0RPKFskYWNfdHJ5XSk7IH1bXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDcsMTQxCkFDX0xBTkdfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0xBTkdfU0VUKG00X2lmZGVmKFtfQUNfTEFOR10sIFttNF9kZWZuKFtfQUNfTEFOR10pXSksCgkgICAgICBbJDFdKWRubAptNF9kZWZpbmUoW19BQ19MQU5HXSwgWyQxXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDM3LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTcxNApUMjgsODYKX0FDX0xBTkdfSU9fUFJPR1JBTShGb3J0cmFuKUFDX0xBTkdfUFJPR1JBTShbXSwKW2RubAogICAgICBvcGVuKHVuaXQ9OSxmaWxlPSdjb25mdGVzdC5vdXQnKQogICAgICBjbG9zZSh1bml0PTkpCl0pClQyNSwxMTEKbTRfc3RhY2tfZm9yZWFjaF9zZXBfbGlmb19tNF9zdGFja19yZXZlcnNlKFskMV0sIFttNF90bXAtJDFdLCBbJDJbXV9tNF9kZWZuKFttNF90bXAtJDFdKSQzXSwgWyQ0W11dKV9tNF9zdGFja19yZXZlcnNlKFttNF90bXAtJDFdLCBbJDFdKQpUMTQsMTAyCl9BU19NRV9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19CQVNFTkFNRV9QUkVQQVJFXSlhc19tZT1gQVNfQkFTRU5BTUUoIiRbMF0iKWAKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxODgKQUNfVFJZX0NQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19UUllfQ1BQJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19QUkVQUk9DX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1skMV1dKV0sIFskMl0sIFskM10pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwxMDMKbTRfbG9jYXRpb24oX0FTX1BBVEhfV0FMSykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMzAwClQzNywxMDYKbTRfbG9jYXRpb24oX0FDX0NIRUNLX0hFQURFUl9QUkVQUk9DKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvaGVhZGVycy5tNDoxOTMKVDI0LDEwNgptNF9sb2NhdGlvbihBQ19NRU1PUllfSCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6ODU5ClQzMCwxMDgKbTRfbG9jYXRpb24oQUNfRlVOQ19HRVRHUk9VUFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6NjI5ClQ3LDkxCm00X2FyZ25tNF9hc3NlcnQoWzAgPCAkMV0pbTRfcHVzaGRlZihbXyQwXSwgW19tNF9wb3BkZWYoW18kMF0pXW00X2RxdW90ZShbJF1tNF9pbmNyKFskMV0pKSlfJDAoJEApCkY3LDcKZXN5c2NtZGVzeXNjbWQKVDE1LDEyMDgKQUNfRkNfRklYRURGT1JNX200X2RlZnVuX29uY2UoW0FDX0ZDX0ZJWEVERk9STV0sIFtBQ19MQU5HX1BVU0goW0ZvcnRyYW5dKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIEZvcnRyYW4gZmxhZyBuZWVkZWQgdG8gYWNjZXB0IGZpeGVkLWZvcm0gc291cmNlXSwKCSAgICAgICBbYWNfY3ZfZmNfZml4ZWRmb3JtXSwKW2FjX2N2X2ZjX2ZpeGVkZm9ybT11bmtub3duCmFjX2ZjX2ZpeGVkZm9ybV9GQ0ZMQUdTX3NhdmU9JEZDRkxBR1MKZm9yIGFjX2ZsYWcgaW4gbm9uZSAtZmZpeGVkLWZvcm0gLWZpeGVkIC1xZml4ZWQgLU1maXhlZCAtZml4ZWRmb3JtICItZiBmaXhlZCIgXAoJICAgICAgICtzb3VyY2U9Zml4ZWQgLWZpeApkbwogIHRlc3QgIngkYWNfZmxhZyIgIT0geG5vbmUgJiYgRkNGTEFHUz0iJGFjX2ZjX2ZpeGVkZm9ybV9GQ0ZMQUdTX3NhdmUgJGFjX2ZsYWciCiAgQUNfQ09NUElMRV9JRkVMU0UoW1sKQyAgICAgVGhpcyBjb21tZW50IHNob3VsZCBjb25mdXNlIGZyZWUtZm9ybSBjb21waWxlcnMuCiAgICAgIHByb2dyYW0gbWFpbgogICAgICBlbmRdXSwKCQkgICAgW2FjX2N2X2ZjX2ZpeGVkZm9ybT0kYWNfZmxhZzsgYnJlYWtdKQpkb25lCnJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKRkNGTEFHUz0kYWNfZmNfZml4ZWRmb3JtX0ZDRkxBR1Nfc2F2ZQpdKQppZiB0ZXN0ICJ4JGFjX2N2X2ZjX2ZpeGVkZm9ybSIgPSB4dW5rbm93bjsgdGhlbgogIG00X2RlZmF1bHQoWyQyXSwKCSAgICAgW0FDX01TR19FUlJPUihbRm9ydHJhbiBkb2VzIG5vdCBhY2NlcHQgZml4ZWQtZm9ybSBzb3VyY2VdLCA3NyldKQplbHNlCiAgaWYgdGVzdCAieCRhY19jdl9mY19maXhlZGZvcm0iICE9IHhub25lOyB0aGVuCiAgICBGQ0ZMQUdTPSIkRkNGTEFHUyAkYWNfY3ZfZmNfZml4ZWRmb3JtIgogIGZpCiAgJDEKZmkKQUNfTEFOR19QT1AoW0ZvcnRyYW5dKWRubApdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfRkNfRklYRURGT1JNXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfRkNfRklYRURGT1JNXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0ZDX0ZJWEVERk9STV0pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX0ZDX0ZJWEVERk9STV0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDE1LDE1MApBQ19GNzdfV1JBUFBFUlNfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbX0FDX0Y3N19OQU1FX01BTkdMSU5HXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpZG5sCl9BQ19GQ19XUkFQUEVSUwpBQ19MQU5HX1BPUChGb3J0cmFuIDc3KWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI3LDEwMAptNF9sb2NhdGlvbihhY19jdl9wcm9nX2djYykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6NDM2ClQyOSwxMDMKbTRfbG9jYXRpb24oX0FTX0VDSE9fUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMDExClQ4LDI3Cm00X2lmdmFsbTRfaWYoWyQxXSwgW10sIFskM10sIFskMl0pClQ3LDE5NwptNF9jb3B5bTRfaWZkZWYoWyQyXSwgW200X2ZhdGFsKFskMDogd29uJ3Qgb3ZlcndyaXRlIGRlZmluZWQgbWFjcm86ICQyXSldLAoJICBbbTRfc3RhY2tfZm9yZWFjaF9zZXAoWyQxXSwgW200X3B1c2hkZWYoWyQyXSxdLCBbKV0pXSltNF9pZmRlZihbbTRfbG9jYXRpb24oJDEpXSwgW200X2RlZmluZShbbTRfbG9jYXRpb24oJDIpXSwgbTRfbG9jYXRpb24pXSkKVDI0LDY1MQpBQ19FUkxBTkdfU1VCU1RfRVJUU19WRVJfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfRVJMQU5HX05FRURfRVJMQ10pW11kbmwKQUNfUkVRVUlSRShbQUNfRVJMQU5HX05FRURfRVJMXSlbXWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIEVybGFuZy9PVFAgRVJUUyB2ZXJzaW9uXSwKICAgIFthY19jdl9lcmxhbmdfZXJ0c192ZXJdLAogICAgW0FDX0xBTkdfUFVTSChbRXJsYW5nXSlbXWRubAogICAgIEFDX1JVTl9JRkVMU0UoCglbQUNfTEFOR19QUk9HUkFNKFtdLCBbZG5sCgkgICAgVmVyc2lvbiA9IGVybGFuZzpzeXN0ZW1faW5mbyh2ZXJzaW9uKSwKCSAgICBmaWxlOndyaXRlX2ZpbGUoImNvbmZ0ZXN0Lm91dCIsIFZlcnNpb24pLAoJICAgIFJldHVyblZhbHVlID0gMCwKCSAgICBoYWx0KFJldHVyblZhbHVlKV0pXSwKCVthY19jdl9lcmxhbmdfZXJ0c192ZXI9YGNhdCBjb25mdGVzdC5vdXRgCgkgcm0gLWYgY29uZnRlc3Qub3V0XSwKCVtybSAtZiBjb25mdGVzdC5vdXQKCSBBQ19NU0dfRkFJTFVSRShbdGVzdCBFcmxhbmcgcHJvZ3JhbSBleGVjdXRpb24gZmFpbGVkXSldKQogICAgIEFDX0xBTkdfUE9QKFtFcmxhbmddKVtdZG5sCiAgICBdKQpBQ19TVUJTVChbRVJMQU5HX0VSVFNfVkVSXSwgWyRhY19jdl9lcmxhbmdfZXJ0c192ZXJdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI5LDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX1VJTlQzMl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjIyClQ0MCwxMDcKbTRfbG9jYXRpb24oQUNfU1lTX1JFU1RBUlRBQkxFX1NZU0NBTExTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6MjI4ClQxNiw2MwpBQ19DT05GSUdfSEVBREVSX200X2RlZnVuX3BybyhbJDBdKUFDX0NPTkZJR19IRUFERVJTKFskMV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfR05VX1NPVVJDRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjMxMApUMTEsMzEKX0FTX0lGX0VMU0VtNF9pZm5ibGFuayhbJDFdLApbZWxzZQogICQxCl0pClQxMywxOTYKQUNfVVRJTUVfTlVMTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19VVElNRV9OVUxMJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfVVRJTUVfTlVMTF0sIFtBQ19GVU5DX1VUSU1FX05VTEwoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDU1CkFDX1RSWV9FVkFMX200X2RlZnVuX3BybyhbJDBdKV9BQ19FVkFMKFskJDFdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzIsMTA0Cm00X2xvY2F0aW9uKEFDX1NUUlVDVF9TVF9CTE9DS1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo5OTEKVDMwLDEwNgptNF9sb2NhdGlvbihBQ19QUk9HUkFNU19DSEVDSykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjM5ClQxNCwxNTcKYWNfY3ZfcHJvZ19nY2NfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgYWNfY3ZfcHJvZ19nY2MnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCmFjX2N2X2NfY29tcGlsZXJfZ251W11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwyOTIKX0FTX1BBVEhfU0VQQVJBVE9SX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pIyBUaGUgdXNlciBpcyBhbHdheXMgcmlnaHQuCmlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCiAgUEFUSF9TRVBBUkFUT1I9OgogIChQQVRIPScvYmluOy9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxICYmIHsKICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CiAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JwogIH0KZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNywyOTcKQUNfTEFOR19DQUxMKE9iamVjdGl2ZSBDKyspQUNfTEFOR19QUk9HUkFNKFskMQptNF9pZihbJDJdLCBbbWFpbl0sICwKWy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgogICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKI2VuZGlmCmNoYXIgJDIgKCk7XSldLCBbcmV0dXJuICQyICgpO10pClQyOCwxMDYKbTRfbG9jYXRpb24oQUNfUFJPR19GNzdfQ19PKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo0NjAKVDE1LDg2NQpfQUNfUFJPR19PQkpDX0dhY190ZXN0X09CSkNGTEFHUz0ke09CSkNGTEFHUytzZXR9CmFjX3NhdmVfT0JKQ0ZMQUdTPSRPQkpDRkxBR1MKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkT0JKQyBhY2NlcHRzIC1nLCBhY19jdl9wcm9nX29iamNfZywKICBbYWNfc2F2ZV9vYmpjX3dlcnJvcl9mbGFnPSRhY19vYmpjX3dlcnJvcl9mbGFnCiAgIGFjX29iamNfd2Vycm9yX2ZsYWc9eWVzCiAgIGFjX2N2X3Byb2dfb2JqY19nPW5vCiAgIE9CSkNGTEFHUz0iLWciCiAgIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAogICAgIFthY19jdl9wcm9nX29iamNfZz15ZXNdLAogICAgIFtPQkpDRkxBR1M9IiIKICAgICAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oKV0sCglbXSwKCVthY19vYmpjX3dlcnJvcl9mbGFnPSRhY19zYXZlX29iamNfd2Vycm9yX2ZsYWcKCSBPQkpDRkxBR1M9Ii1nIgoJIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLAoJICAgW2FjX2N2X3Byb2dfb2JqY19nPXllc10pXSldKQogICBhY19vYmpjX3dlcnJvcl9mbGFnPSRhY19zYXZlX29iamNfd2Vycm9yX2ZsYWddKQppZiB0ZXN0ICIkYWNfdGVzdF9PQkpDRkxBR1MiID0gc2V0OyB0aGVuCiAgT0JKQ0ZMQUdTPSRhY19zYXZlX09CSkNGTEFHUwplbGlmIHRlc3QgJGFjX2N2X3Byb2dfb2JqY19nID0geWVzOyB0aGVuCiAgaWYgdGVzdCAiJEdPQkpDIiA9IHllczsgdGhlbgogICAgT0JKQ0ZMQUdTPSItZyAtTzIiCiAgZWxzZQogICAgT0JKQ0ZMQUdTPSItZyIKICBmaQplbHNlCiAgaWYgdGVzdCAiJEdPQkpDIiA9IHllczsgdGhlbgogICAgT0JKQ0ZMQUdTPSItTzIiCiAgZWxzZQogICAgT0JKQ0ZMQUdTPQogIGZpCmZpW11kbmwKClQxNCwxMTMKbTRfZXhwYW5kX29uY2VtNF9wcm92aWRlX2lmKG00X2RlZmF1bHRfcXVvdGVkKFskMl0sIFskMV0pLAoJICAgICAgIFtdLAoJICAgICAgIFttNF9wcm92aWRlKG00X2RlZmF1bHRfcXVvdGVkKFskMl0sIFskMV0pKVtdJDFdKQpUMTQsOTYKX200X2JwYXRzdWJzdHNtNF9pZihbJCNdLCAyLCBbJDFdLAogICAgICAgWyQwKG00X2J1aWx0aW4oW3BhdHN1YnN0XSwgW1skMV1dLCBbJDJdLCBbJDNdKSwKCSAgIG00X3NoaWZ0MygkQCkpXSkKVDE0LDY2CkFDX1RZUEVfTU9ERV9UX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1RZUEUobW9kZV90LCBpbnQpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ2LDEyOQpBQ19SU0hfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfUlNIJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDkyNwpBQ19QUk9HX0NYWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goQysrKWRubApBQ19BUkdfVkFSKFtDWFhdLCAgICAgIFtDKysgY29tcGlsZXIgY29tbWFuZF0pZG5sCkFDX0FSR19WQVIoW0NYWEZMQUdTXSwgW0MrKyBjb21waWxlciBmbGFnc10pZG5sCl9BQ19BUkdfVkFSX0xERkxBR1MoKWRubApfQUNfQVJHX1ZBUl9MSUJTKClkbmwKX0FDX0FSR19WQVJfQ1BQRkxBR1MoKWRubApfQUNfQVJHX1ZBUl9QUkVDSU9VUyhbQ0NDXSlkbmwKaWYgdGVzdCAteiAiJENYWCI7IHRoZW4KICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgogICAgQ1hYPSRDQ0MKICBlbHNlCiAgICBBQ19DSEVDS19UT09MUyhDWFgsCgkJICAgW200X2RlZmF1bHQoWyQxXSwKCQkJICAgICAgIFtnKysgYysrIGdwcCBhQ0MgQ0MgY3h4IGNjKysgY2wuZXhlIEZDQyBLQ0MgUkNDIHhsQ19yIHhsQ10pXSwKCQkgICBnKyspCiAgZmkKZmkKIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgpfQVNfRUNIT19MT0coW2NoZWNraW5nIGZvciBfQUNfTEFORyBjb21waWxlciB2ZXJzaW9uXSkKc2V0IFggJGFjX2NvbXBpbGUKYWNfY29tcGlsZXI9JFsyXQpmb3IgYWNfb3B0aW9uIGluIC0tdmVyc2lvbiAtdiAtViAtcXZlcnNpb247IGRvCiAgX0FDX0RPX0xJTUlUKFskYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JkFTX01FU1NBR0VfTE9HX0ZEXSkKZG9uZQoKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9FWEVFWFRdKVtdZG5sCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfT0JKRVhUXSlbXWRubApfQUNfTEFOR19DT01QSUxFUl9HTlUKaWYgdGVzdCAkYWNfY29tcGlsZXJfZ251ID0geWVzOyB0aGVuCiAgR1hYPXllcwplbHNlCiAgR1hYPQpmaQpfQUNfUFJPR19DWFhfRwpBQ19MQU5HX1BPUChDKyspZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsNDEKbTRfcHJvdmlkZV9pZm00X2lmZGVmKFttNF9wcm92aWRlKCQxKV0sCgkgIFskMl0sIFskM10pClQzMywxMDYKbTRfbG9jYXRpb24oX0FDX0ZDX05BTUVfTUFOR0xJTkcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00Ojk4OApUMTYsODM0Cl9BU19MTl9TX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCiAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQplbHNlCiAgcm0gLWYgY29uZiQkLmRpcgogIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKZmkKaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgogIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgogICAgYXNfbG5fcz0nbG4gLXMnCiAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgogICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgogICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKICAgICAgYXNfbG5fcz0nY3AgLXAnCiAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KICAgIGFzX2xuX3M9bG4KICBlbHNlCiAgICBhc19sbl9zPSdjcCAtcCcKICBmaQplbHNlCiAgYXNfbG5fcz0nY3AgLXAnCmZpCnJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDU4MQpfQUNfUEFUSF9QUk9HU19GRUFUVVJFX0NIRUNLaWYgdGVzdCAteiAiJCQxIjsgdGhlbgogIGFjX3BhdGhfJDFfZm91bmQ9ZmFsc2UKICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAogIF9BU19QQVRIX1dBTEsoWyQ1XSwKICBbZm9yIGFjX3Byb2cgaW4gJDI7IGRvCiAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgICAgYWNfcGF0aF8kMT0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKICAgICAgQVNfRVhFQ1VUQUJMRV9QKFsiJGFjX3BhdGhfJDEiXSkgfHwgY29udGludWUKJDMKICAgICAgJGFjX3BhdGhfJDFfZm91bmQgJiYgYnJlYWsgMwogICAgZG9uZQogIGRvbmVdKWRubAogIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoXyQxIjsgdGhlbgogICAgbTRfZGVmYXVsdChbJDRdLAogICAgICBbQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIG00X2JwYXRzdWJzdChbJDJdLCBbIC4qXSkgY291bGQgYmUgZG5sCmZvdW5kIGluIG00X2RlZmF1bHQoWyQ1XSwgW1wkUEFUSF0pXSldKQogIGZpCmVsc2UKICBhY19jdl9wYXRoXyQxPSQkMQpmaQoKVDgsMTA3NQpBU19VTkFNRXsKY2F0IDw8X0FTVU5BTUUKbTRfdGV4dF9ib3goW1BsYXRmb3JtLl0pCgpob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAp1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCnVuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAp1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKCi91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAovYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKCi9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAovdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAovdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKCl9BU1VOQU1FCgpfQVNfUEFUSF9XQUxLKFskUEFUSF0sIFtBU19FQ0hPKFsiUEFUSDogJGFzX2RpciJdKV0pCn0KVDQ2LDEwNgptNF9sb2NhdGlvbihfQUNfSU5DTFVERVNfREVGQVVMVF9SRVFVSVJFTUVOVFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjI5NwpUMzAsMTAwCm00X2xvY2F0aW9uKEFDX1BST0dfT0JKQ1hYQ1BQKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDo5NjEKVDI0LDEwNwptNF9sb2NhdGlvbihBQ19JUklYX1NVTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQ3MApUMjksMTA2Cm00X2xvY2F0aW9uKEFDX0NIQVJfVU5TSUdORUQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo1NApUNywxNgpBU19MTl9TJGFzX2xuX3MgJDEgJDJbXQpUNywxMjkKQVNfTE5fU19tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfTE5fU19QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTAsMTU0CkFDX1BST1ZJREVtNF9pZmRlZihbbTRfcHJvdmlkZSgkMSldLCBbXSwKW200X3NldF9hZGQoW19tNF9wcm92aWRlXSwgWyQxXSwgW200X2RlZmluZShbbTRfcHJvdmlkZSgkMSldLAogIG00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nXSwgW19tNF9kZWZuKFtfbTRfZGl2ZXJ0aW5nXSldKSldKV0pClQxOCwyMDcKX0FTX1RSX0NQUF9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19DUl9QUkVQQVJFXSkjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCmFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbW15fJGFzX2NyX2FsbnVtXV0lXyVnJyIKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDc1CkFTX0VTQ0FQRV8kMChbJDFdLCBtNF9pZihbJDJdLCBbXSwgW1tgXSwgW1wiJF1dLCBbbTRfc3Vic3RyKFskMl0sIFswXSwgWzFdKSwgWyQyXV0pKQpUMjIsMTA2Cm00X2xvY2F0aW9uKEFDX1NJWkVfVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjczClQyMCw0Cl9tNF9kaXZlcnRfZGl2ZXJzaW9uS0lMTApUMjQsMTAyCm00X2xvY2F0aW9uKF9BU19QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjI5MApUMjIsMTAzCm00X2xvY2F0aW9uKEFTX0VDSE9fTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMDAxClQyMSwxMDYKbTRfbG9jYXRpb24oQUNfT0ZGX1QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2OApUMzAsMTAzCm00X2xvY2F0aW9uKF9BU19UUl9TSF9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE3ODcKVDIzLDEwMwptNF9sb2NhdGlvbihBU19NS0RJUl9QKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjEyNTAKRjEyLDgKX200X3VuZGl2ZXJ0dW5kaXZlcnQKVDE5LDQKQUNfQVVUT0NPTkZfVkVSU0lPTjIuNjgKVDIzLDEwNQpBQ19MQU5HX1BSRVBST0NfUkVRVUlSRV9tNF9kZWZ1bl9wcm8oWyQwXSltNF9yZXF1aXJlKFtBQ19MQU5HX1BSRVBST0MoXV9BQ19MQU5HWyldLAoJICAgIFtBQ19MQU5HX1BSRVBST0NdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMjA2CkFDX0ZVTkNfVlBSSU5URl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19GVU5DUyh2cHJpbnRmLCBbXQpbQUNfQ0hFQ0tfRlVOQyhfZG9wcm50LAoJICAgICAgIFtBQ19ERUZJTkUoSEFWRV9ET1BSTlQsIDEsCgkJCSAgW0RlZmluZSB0byAxIGlmIHlvdSBkb24ndCBoYXZlIGB2cHJpbnRmJyBidXQgZG8gaGF2ZQoJCQkgIGBfZG9wcm50LiddKV0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ3LDU0Cl9tNF9jZHJtNF9pZihbJCNdLCAxLCBbXSwKICAgICAgIFssIG00X2RxdW90ZShtNF9zaGlmdCgkQCkpXSkKVDEzLDg3MQpfQUNfUFJPR19GQ19HX0FDX0ZPUlRSQU5fQVNTRVJUKClkbmwKYWNfdGVzdF9bXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9JHtbXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1Mrc2V0fQphY19zYXZlX1tdX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTCl9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9CkFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJFtdX0FDX0ZDW10gYWNjZXB0cyAtZywgYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX2csCltfQUNfTEFOR19QUkVGSVhbXUZMQUdTPS1nCl9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLApbYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX2c9eWVzXSwKW2FjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV9nPW5vXSkKXSkKaWYgdGVzdCAiJGFjX3Rlc3RfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTIiA9IHNldDsgdGhlbgogIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9JGFjX3NhdmVfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTCmVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX2cgPSB5ZXM7IHRoZW4KICBpZiB0ZXN0ICJ4JGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fY29tcGlsZXJfZ251IiA9IHh5ZXM7IHRoZW4KICAgIF9BQ19MQU5HX1BSRUZJWFtdRkxBR1M9Ii1nIC1PMiIKICBlbHNlCiAgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSItZyIKICBmaQplbHNlCiAgaWYgdGVzdCAieCRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2NvbXBpbGVyX2dudSIgPSB4eWVzOyB0aGVuCiAgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSItTzIiCiAgZWxzZQogICAgX0FDX0xBTkdfUFJFRklYW11GTEFHUz0KICBmaQpmaVtdZG5sCgpUMTAsODYKbTRfdG91cHBlcm00X3RyYW5zbGl0KFtbJDFdXSwgW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XSwKCQkgICAgIFtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl0pClQyNSwxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19DQUxMKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDoyNzMKVDgsMTkKbTRfY3VycnkkMShtNF9zaGlmdCgkQCwpXyQwCkY0LDQKaW5jcmluY3IKVDI3LDc3Cl9BQ19DSEVDS19UWVBFX01BWUJFX1RZUEVfUG00X2JtYXRjaChbJDFdLCBbXltfYS16QS1aMC05IF0rXChbX2EtekEtWjAtOSgpICpdXHxcW1x8XF1cKSokXSwKCSAgMSwgMClkbmwKClQxNCwxODkKQUNfSEVMUF9TVFJJTkdfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfSEVMUF9TVFJJTkcnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQVNfSEVMUF9TVFJJTkddLCBbQVNfSEVMUF9TVFJJTkcoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMzLDEwNAptNF9sb2NhdGlvbihBQ19TVFJVQ1RfU1RfQkxLU0laRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00Ojk2NQpUMTYsNTYKX0FTX1RSX0NQUF9JTkRJUmBBU19FQ0hPKFsiX0FTX0VTQ0FQRShbWyQxXV0sIFtgXSwgW1xdKSJdKSB8ICRhc190cl9jcHBgClQyMyw4MwpBQ19DT05GSUdfQ09NTUFORFNfUE9TVF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9hcHBlbmQoW0FDX09VVFBVVF9DT01NQU5EU19QT1NUXSwgWyQxCl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19SRVNUT1JFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGFuZy5tNDoxMzUKVDMxLDEwNgptNF9sb2NhdGlvbihBQ19DT05GSUdfQ09NTUFORFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTAxMQpUMjMsNjA0CkFDX1BST0dfR0NDX1RSQURJVElPTkFMX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAppZiB0ZXN0ICRhY19jdl9jX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgogICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ0MgbmVlZHMgLXRyYWRpdGlvbmFsLAogICAgICBhY19jdl9wcm9nX2djY190cmFkaXRpb25hbCwKWyAgYWNfcGF0dGVybj0iQXV0b2NvbmYuKid4JyIKICBBQ19FR1JFUF9DUFAoJGFjX3BhdHRlcm4sIFsjaW5jbHVkZSA8c2d0dHkuaD4KQXV0b2NvbmYgVElPQ0dFVFBdLAogIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPXllcywgYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWw9bm8pCgogIGlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsID0gbm87IHRoZW4KICAgIEFDX0VHUkVQX0NQUCgkYWNfcGF0dGVybiwgWyNpbmNsdWRlIDx0ZXJtaW8uaD4KQXV0b2NvbmYgVENHRVRBXSwKICAgIGFjX2N2X3Byb2dfZ2NjX3RyYWRpdGlvbmFsPXllcykKICBmaV0pCiAgaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2NfdHJhZGl0aW9uYWwgPSB5ZXM7IHRoZW4KICAgIENDPSIkQ0MgLXRyYWRpdGlvbmFsIgogIGZpCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMTA3MgpBQ19DT05GSUdfQVVYX0RJUlNfbTRfZGVmdW5fcHJvKFskMF0pYWNfYXV4X2Rpcj0KZm9yIGFjX2RpciBpbiAkMTsgZG8KICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCiAgICBhY19hdXhfZGlyPSRhY19kaXIKICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCiAgICBicmVhawogIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgogICAgYWNfYXV4X2Rpcj0kYWNfZGlyCiAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgogICAgYnJlYWsKICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgogICAgYWNfYXV4X2Rpcj0kYWNfZGlyCiAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKICAgIGJyZWFrCiAgZmkKZG9uZQppZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIGluc3RhbGwtc2gsIGluc3RhbGwuc2gsIG9yIHNodG9vbCBpbiAkMV0pCmZpCgojIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgojIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgphY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCmFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgphY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCgpBQ19QUk9WSURFKFtBQ19DT05GSUdfQVVYX0RJUl9ERUZBVUxUXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwxMDcKbTRfbG9jYXRpb24oQUNfQ0FOT05JQ0FMX0JVSUxEKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNzg5ClQzMCwxMDQKbTRfbG9jYXRpb24oX0FDX1NUUlVDVF9ESVJFTlQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo5MzEKVDE3LDI4Cm00X2RlZmF1bHRfbmJsYW5rbTRfaWZibGFuayhbJDFdLCBbJDJdLCBbJDFdKQpUMTEsMwpfQUNfQ0MoQysrKUNYWApUMTUsNjcKQUNfVFlQRV9TU0laRV9UX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX1RZUEUoc3NpemVfdCwgaW50KVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTEzCkFDX0NIRUNLX1RZUEVTX200X2RlZnVuX3BybyhbJDBdKW00X21hcF9hcmdzX3NlcChbX0FDX0NIRUNLX1RZUEVfTkVXKF8kMChdLCBbKVsKJDJdLCBbJDNdLCBbJDRdKV0sIFtdLCAkMSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDEwMgptNF9sb2NhdGlvbihfQVNfRElSTkFNRV9TRUQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6OTQ5ClQxOCw1NDAKX0FTX1RSX0NQUF9MSVRFUkFMbTRfdHJhbnNsaXQoW1skMV1dLAogIFsqW11dW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6AQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzo7PD0+P0BbXF1eYHt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tXSwKICBbUFtdXVtBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX10pClQxNywxNzk3Cl9BQ19GQ19EVU1NWV9NQUlOX200X2RlZnVuX3BybyhbJDBdKV9BQ19GT1JUUkFOX0FTU0VSVCgpZG5sCm00X2RlZmluZShfQUNfTEFOR19QUk9HUkFNX0NfW11fQUNfRkNbXV9IT09LUywKWyNpZmRlZiBdX0FDX0ZDW19EVU1NWV9NQUlOCl1BQ19MQU5HX0NBU0UoW0ZvcnRyYW5dLCBbI2lmbmRlZiBGQ19EVU1NWV9NQUlOX0VRX0Y3N10pClsjICBpZmRlZiBfX2NwbHVzcGx1cwogICAgIGV4dGVybiAiQyIKIyAgZW5kaWYKICAgaW50IF1fQUNfRkNbX0RVTU1ZX01BSU4oKSB7IHJldHVybiAxOyB9Cl1BQ19MQU5HX0NBU0UoW0ZvcnRyYW5dLCBbI2VuZGlmXSkKWyNlbmRpZgpdKQpBQ19DQUNIRV9DSEVDSyhbZm9yIGR1bW15IG1haW4gdG8gbGluayB3aXRoIF9BQ19MQU5HIGxpYnJhcmllc10sCgkgICAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9kdW1teV9tYWluLApbYWNfW11fQUNfTEFOR19BQkJSRVZbXV9kbV9zYXZlX0xJQlM9JExJQlMKIExJQlM9IiRMSUJTICRbXV9BQ19MQU5HX1BSRUZJWFtdTElCUyIKIGFjX2ZvcnRyYW5fZG1fdmFyPVtdX0FDX0ZDW11fRFVNTVlfTUFJTgogQUNfTEFOR19QVVNIKEMpZG5sCgogIyBGaXJzdCwgdHJ5IGxpbmtpbmcgd2l0aG91dCBhIGR1bW15IG1haW46CiBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbXSldLAoJCVthY19jdl9mb3J0cmFuX2R1bW15X21haW49bm9uZV0sCgkJW2FjX2N2X2ZvcnRyYW5fZHVtbXlfbWFpbj11bmtub3duXSkKCiBpZiB0ZXN0ICRhY19jdl9mb3J0cmFuX2R1bW15X21haW4gPSB1bmtub3duOyB0aGVuCiAgIGZvciBhY19mdW5jIGluIE1BSU5fXyBNQUlOXyBfX21haW4gTUFJTiBfTUFJTiBfX01BSU4gbWFpbl8gbWFpbl9fIF9tYWluOyBkbwogICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1tAJTpAZGVmaW5lICRhY19mb3J0cmFuX2RtX3ZhciAkYWNfZnVuY11dKV0sCgkJICAgIFthY19jdl9mb3J0cmFuX2R1bW15X21haW49JGFjX2Z1bmM7IGJyZWFrXSkKICAgZG9uZQogZmkKIEFDX0xBTkdfUE9QKEMpZG5sCiBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2R1bW15X21haW49JGFjX2N2X2ZvcnRyYW5fZHVtbXlfbWFpbgogcm0gLXJmIGNvbmZ0ZXN0KgogTElCUz0kYWNfW11fQUNfTEFOR19BQkJSRVZbXV9kbV9zYXZlX0xJQlMKXSkKW11fQUNfRkNbXV9EVU1NWV9NQUlOPSRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX2R1bW15X21haW4KQVNfSUYoW3Rlc3QgIiRbXV9BQ19GQ1tdX0RVTU1ZX01BSU4iICE9IHVua25vd25dLAogICAgICBbbTRfZGVmYXVsdChbJDFdLApbaWYgdGVzdCAkW11fQUNfRkNbXV9EVU1NWV9NQUlOICE9IG5vbmU7IHRoZW4KICBBQ19ERUZJTkVfVU5RVU9URUQoW11fQUNfRkNbXV9EVU1NWV9NQUlOLCAkW11fQUNfRkNbXV9EVU1NWV9NQUlOLAoJCSAgICAgW0RlZmluZSB0byBkdW1teSBgbWFpbicgZnVuY3Rpb24gKGlmIGFueSkgcmVxdWlyZWQgdG8KCQkgICAgICBsaW5rIHRvIHRoZSBGb3J0cmFuIGxpYnJhcmllcy5dKQogIGlmIHRlc3QgIngkYWNfY3ZfZmNfZHVtbXlfbWFpbiIgPSAieCRhY19jdl9mNzdfZHVtbXlfbWFpbiI7IHRoZW4KCUFDX0RFRklORShbRkNfRFVNTVlfTUFJTl9FUV9GNzddLCAxLAoJCSAgW0RlZmluZSBpZiBGNzcgYW5kIEZDIGR1bW15IGBtYWluJyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbC5dKQogIGZpCmZpXSldLAogICAgICBbbTRfZGVmYXVsdChbJDJdLAoJICAgIFtBQ19NU0dfRkFJTFVSRShbbGlua2luZyB0byBGb3J0cmFuIGxpYnJhcmllcyBmcm9tIEMgZmFpbHNdKV0pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCw1MzEKQUNfRVJMQU5HX1NVQlNUX0lOU1RBTExfTElCX1NVQkRJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19FUkxBTkdfU1VCU1RfSU5TVEFMTF9MSUJfRElSXSlbXWRubApBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBFcmxhbmcvT1RQICckMScgbGlicmFyeSBpbnN0YWxsYXRpb24gc3ViZGlyZWN0b3J5XSkKQUNfQVJHX1ZBUihbRVJMQU5HX0lOU1RBTExfTElCX0RJUl8kMV0sCiAgICBbRXJsYW5nL09UUCAnJDEnIGxpYnJhcnkgaW5zdGFsbGF0aW9uIHN1YmRpcmVjdG9yeQogICAgICAgW0VSTEFOR19JTlNUQUxMX0xJQl9ESVIvJDEtJDJdXSkKaWYgdGVzdCAtbiAiJEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfJDEiOyB0aGVuCiAgICBBQ19NU0dfUkVTVUxUKFskRVJMQU5HX0lOU1RBTExfTElCX0RJUl8kMV0pCmVsc2UKICAgIEFDX1NVQlNUKFtFUkxBTkdfSU5TVEFMTF9MSUJfRElSXyQxXSwgWycke0VSTEFOR19JTlNUQUxMX0xJQl9ESVJ9LyQxLSQyJ10pCiAgICBBQ19NU0dfUkVTVUxUKFskRVJMQU5HX0lOU1RBTExfTElCX0RJUi8kMS0kMl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNDgKbTRfcmVfZXNjYXBlbTRfYnBhdHN1YnN0KFskMV0sCgkgICAgICBbW11bKisuP1xeJF1dLCBbXFxcJl0pClQzMSwxMDAKbTRfbG9jYXRpb24oQUNfTEFOR19QUkVQUk9DKEMpKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDozMzYKVDI1LDEwOQptNF9sb2NhdGlvbihBQ19GVU5DX0ZPUkspL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTc5MApUMTIsMjYKbTRfbm9ybWFsaXplbTRfc3RyaXAobTRfZmxhdHRlbihbJDFdKSkKVDYsMTMyCmRpdmVydG00X3BvcGRlZihbX200X2RpdmVydF9zdGFja10pbTRfZGVmaW5lKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0sIFskMV0pbTRfZGl2ZXJ0X3N0YWNrX3B1c2goWyQwXSwgWyQxXSlfbTRfZGl2ZXJ0X3JhdyhfbTRfZGl2ZXJ0KFskMV0pKQpUMTgsNDAKX200X3NldF9kaWZmZXJlbmNlbTRfc2V0X2NvbnRhaW5zKFskMV0sIFskMl0sIFtdLCBbLFskMl1dKQpUMTYsODkKQUNfQ09ORklHX1NSQ0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSltNF9kaXZlcnRfdGV4dChbREVGQVVMVFNdLCBbYWNfdW5pcXVlX2ZpbGU9IiQxIl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMywxMDcKbTRfbG9jYXRpb24oQUNfUlVOX0xPRykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjQ2OQpGMywzCmRubGRubApUMjcsMTA3Cm00X2xvY2F0aW9uKEFDX0NIRUNLX0RFQ0xTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyODgxClQxNiw4MDcKX0FDX0lOSVRfUEFDS0FHRV9BQ19JTklUX0xJVEVSQUwoWyQxXSkKX0FDX0lOSVRfTElURVJBTChbJDJdKQpfQUNfSU5JVF9MSVRFUkFMKFskM10pCm00X2lmbmRlZihbQUNfUEFDS0FHRV9OQU1FXSwKCSAgW200X2RlZmluZShbQUNfUEFDS0FHRV9OQU1FXSwgICAgIFskMV0pXSkKbTRfaWZuZGVmKFtBQ19QQUNLQUdFX1RBUk5BTUVdLAoJICBbbTRfZGVmaW5lKFtBQ19QQUNLQUdFX1RBUk5BTUVdLAoJCSAgICAgbTRfZGVmYXVsdChbJDRdLAoJCQkJW200X2JwYXRzdWJzdChtNF90b2xvd2VyKG00X2JwYXRzdWJzdChbWyQxXV0sCgkJCQkJCQkJICAgICBbR05VIF0pKSwKCQkJCSBbW15fYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XV0sCgkJCQkgWy1dKV0pKV0pCm00X2lmbmRlZihbQUNfUEFDS0FHRV9WRVJTSU9OXSwKCSAgW200X2RlZmluZShbQUNfUEFDS0FHRV9WRVJTSU9OXSwgICBbJDJdKV0pCm00X2lmbmRlZihbQUNfUEFDS0FHRV9TVFJJTkddLAoJICBbbTRfZGVmaW5lKFtBQ19QQUNLQUdFX1NUUklOR10sICAgIFskMSAkMl0pXSkKbTRfaWZuZGVmKFtBQ19QQUNLQUdFX0JVR1JFUE9SVF0sCgkgIFttNF9kZWZpbmUoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgWyQzXSldKQptNF9pZm5kZWYoW0FDX1BBQ0tBR0VfVVJMXSwKCSAgW200X2RlZmluZShbQUNfUEFDS0FHRV9VUkxdLAogIG00X2lmKFskNV0sIFtdLCBbbTRfaWYobTRfaW5kZXgoWyQxXSwgW0dOVSBdKSwgWzBdLAoJICBbW2h0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9dbTRfZGVmbihbQUNfUEFDS0FHRV9UQVJOQU1FXSlbL11dKV0sCglbWyQ1XV0pKV0pCgpUMzEsMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9TWVNfV0FJVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6NzI1ClQyNSwzCl9tNF9kaXZlcnQoVkVSU0lPTl9CRUdJTikyMDAKVDI3LDIwNTIKX0FTX1ZFUlNJT05fQ09NUEFSRV9QUkVQQVJFX200X2RlZnVuX3BybyhbJDBdKVthc19hd2tfc3RydmVyc2NtcD0nCiAgIyBVc2Ugb25seSBhd2sgZmVhdHVyZXMgdGhhdCB3b3JrIHdpdGggN3RoIGVkaXRpb24gVW5peCBhd2sgKDE5NzgpLgogICMgTXksIHdoYXQgYW4gb2xkIGF3ayB5b3UgaGF2ZSwgTXIuIFNvbGFyaXMhCiAgRU5EIHsKICAgIHdoaWxlIChsZW5ndGgodjEpICYmIGxlbmd0aCh2MikpIHsKICAgICAgIyBTZXQgZDEgdG8gYmUgdGhlIG5leHQgdGhpbmcgdG8gY29tcGFyZSBmcm9tIHYxLCBhbmQgbGlrZXdpc2UgZm9yIGQyLgogICAgICAjIE5vcm1hbGx5IHRoaXMgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBidXQgaWYgdjEgYW5kIHYyIGNvbnRhaW4gZGlnaXRzLAogICAgICAjIGNvbXBhcmUgdGhlbSBhcyBpbnRlZ2VycyBhbmQgZnJhY3Rpb25zIGFzIHN0cnZlcnNjbXAgZG9lcy4KICAgICAgaWYgKHYxIH4gL15bMC05XS8gJiYgdjIgfiAvXlswLTldLykgewoJIyBTcGxpdCB2MSBhbmQgdjIgaW50byB0aGVpciBsZWFkaW5nIGRpZ2l0IHN0cmluZyBjb21wb25lbnRzIGQxIGFuZCBkMiwKCSMgYW5kIGFkdmFuY2UgdjEgYW5kIHYyIHBhc3QgdGhlIGxlYWRpbmcgZGlnaXQgc3RyaW5ncy4KCWZvciAobGVuMSA9IDE7IHN1YnN0cih2MSwgbGVuMSArIDEpIH4gL15bMC05XS87IGxlbjErKykgY29udGludWUKCWZvciAobGVuMiA9IDE7IHN1YnN0cih2MiwgbGVuMiArIDEpIH4gL15bMC05XS87IGxlbjIrKykgY29udGludWUKCWQxID0gc3Vic3RyKHYxLCAxLCBsZW4xKTsgdjEgPSBzdWJzdHIodjEsIGxlbjEgKyAxKQoJZDIgPSBzdWJzdHIodjIsIDEsIGxlbjIpOyB2MiA9IHN1YnN0cih2MiwgbGVuMiArIDEpCglpZiAoZDEgfiAvXjAvKSB7CgkgIGlmIChkMiB+IC9eMC8pIHsKCSAgICAjIENvbXBhcmUgdHdvIGZyYWN0aW9ucy4KCSAgICB3aGlsZSAoZDEgfiAvXjAvICYmIGQyIH4gL14wLykgewoJICAgICAgZDEgPSBzdWJzdHIoZDEsIDIpOyBsZW4xLS0KCSAgICAgIGQyID0gc3Vic3RyKGQyLCAyKTsgbGVuMi0tCgkgICAgfQoJICAgIGlmIChsZW4xICE9IGxlbjIgJiYgISAobGVuMSAmJiBsZW4yICYmIHN1YnN0cihkMSwgMSwgMSkgPT0gc3Vic3RyKGQyLCAxLCAxKSkpIHsKCSAgICAgICMgVGhlIHR3byBjb21wb25lbnRzIGRpZmZlciBpbiBsZW5ndGgsIGFuZCB0aGUgY29tbW9uIHByZWZpeAoJICAgICAgIyBjb250YWlucyBvbmx5IGxlYWRpbmcgemVyb3MuICBDb25zaWRlciB0aGUgbG9uZ2VyIHRvIGJlIGxlc3MuCgkgICAgICBkMSA9IC1sZW4xCgkgICAgICBkMiA9IC1sZW4yCgkgICAgfSBlbHNlIHsKCSAgICAgICMgT3RoZXJ3aXNlLCBjb21wYXJlIGFzIHN0cmluZ3MuCgkgICAgICBkMSA9ICJ4IiBkMQoJICAgICAgZDIgPSAieCIgZDIKCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgIyBBIGZyYWN0aW9uIGlzIGxlc3MgdGhhbiBhbiBpbnRlZ2VyLgoJICAgIGV4aXQgMQoJICB9Cgl9IGVsc2UgewoJICBpZiAoZDIgfiAvXjAvKSB7CgkgICAgIyBBbiBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBhIGZyYWN0aW9uLgoJICAgIGV4aXQgMgoJICB9IGVsc2UgewoJICAgICMgQ29tcGFyZSB0d28gaW50ZWdlcnMuCgkgICAgZDEgKz0gMAoJICAgIGQyICs9IDAKCSAgfQoJfQogICAgICB9IGVsc2UgewoJIyBUaGUgbm9ybWFsIGNhc2UsIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGlnaXRzLgoJZDEgPSBzdWJzdHIodjEsIDEsIDEpOyB2MSA9IHN1YnN0cih2MSwgMikKCWQyID0gc3Vic3RyKHYyLCAxLCAxKTsgdjIgPSBzdWJzdHIodjIsIDIpCiAgICAgIH0KICAgICAgaWYgKGQxIDwgZDIpIGV4aXQgMQogICAgICBpZiAoZDEgPiBkMikgZXhpdCAyCiAgICB9CiAgICAjIEJld2FyZSBTb2xhcmlzIC91c3IveGdwNC9iaW4vYXdrIChhdCBsZWFzdCB0aHJvdWdoIFNvbGFyaXMgMTApLAogICAgIyB3aGljaCBtaXNoYW5kbGVzIHNvbWUgY29tcGFyaXNvbnMgb2YgZW1wdHkgc3RyaW5ncyB0byBpbnRlZ2Vycy4KICAgIGlmIChsZW5ndGgodjIpKSBleGl0IDEKICAgIGlmIChsZW5ndGgodjEpKSBleGl0IDIKICB9CiddW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwzODYKQUNfRlVOQ19FUlJPUl9BVF9MSU5FX200X2RlZnVuX3BybyhbJDBdKUFDX0xJQlNPVVJDRVMoW2Vycm9yLmgsIGVycm9yLmNdKWRubApBQ19DQUNIRV9DSEVDSyhbZm9yIGVycm9yX2F0X2xpbmVdLCBhY19jdl9saWJfZXJyb3JfYXRfbGluZSwKW0FDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxlcnJvci5oPl0sCgkJCQkgW2Vycm9yX2F0X2xpbmUgKDAsIDAsICIiLCAwLCAiYW4gZXJyb3Igb2NjdXJyZWQiKTtdKV0sCgkJW2FjX2N2X2xpYl9lcnJvcl9hdF9saW5lPXllc10sCgkJW2FjX2N2X2xpYl9lcnJvcl9hdF9saW5lPW5vXSldKQppZiB0ZXN0ICRhY19jdl9saWJfZXJyb3JfYXRfbGluZSA9IG5vOyB0aGVuCiAgQUNfTElCT0JKKGVycm9yKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDEwNgptNF9sb2NhdGlvbihBQ19TWVNfSU5URVJQUkVURVIpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo2MQpUMjIsMTA2Cm00X2xvY2F0aW9uKEFDX01PREVfVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00OjY3ClQxNCwxMTYKQVNfTElORU5PX1BVU0hfbTRfZGVmdW5fcHJvKFskMF0pYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFja1tdX200X2RlZnVuX2VwaShbJDBdKQpUMjQsMzgKQUNfTEFOR19DQUxMKEZvcnRyYW4gNzcpQUNfTEFOR19QUk9HUkFNKFskMV0sClsgICAgICBjYWxsICQyXSkKRjEyLDgKX200X3VuZGVmaW5ldW5kZWZpbmUKVDE4LDk1CkFDX1BST0dfQ1BQX1dFUlJPUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0NQUF0pZG5sCmFjX2NfcHJlcHJvY193YXJuX2ZsYWc9eWVzW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwxMDMKbTRfbG9jYXRpb24oQUNfTEFOR19DT05GVEVTVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6MTk0ClQxMCw3OQpfbTRfc2hpZnRubTRfaWYoWyQxXSwgMSwgW200X3NoaWZ0KF0sCiAgICAgICBbJDAobTRfZGVjcihbJDFdKV0pLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKQpUMTMsODE0Cl9BQ19QUk9HX0ZDX1ZfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZPUlRSQU5fQVNTRVJUKClkbmwKQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byBnZXQgdmVyYm9zZSBsaW5raW5nIG91dHB1dCBmcm9tICRbXV9BQ19GQ1tdXSwKCQlbYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX3ZdLApbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTSgpXSwKW2FjX2N2X3Byb2dfW11fQUNfTEFOR19BQkJSRVZbXV92PQojIFRyeSBzb21lIG9wdGlvbnMgZnJlcXVlbnRseSB1c2VkIHZlcmJvc2Ugb3V0cHV0CmZvciBhY192ZXJiIGluIC12IC12ZXJib3NlIC0tdmVyYm9zZSAtViAtXCNcI1wjOyBkbwogIF9BQ19QUk9HX0ZDX1ZfT1VUUFVUKCRhY192ZXJiKQogICMgbG9vayBmb3IgLWwqIGFuZCAqLmEgY29uc3RydWN0cyBpbiB0aGUgb3V0cHV0CiAgZm9yIGFjX2FyZyBpbiAkYWNfW11fQUNfTEFOR19BQkJSRVZbXV92X291dHB1dDsgZG8KICAgICBjYXNlICRhY19hcmcgaW4KCVtbXFwvXV0qLmEgfCA/OltbXFwvXV0qLmEgfCAtW1tsTFJ1XV0qKQoJICBhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fdj0kYWNfdmVyYgoJICBicmVhayAyIDs7CiAgICAgZXNhYwogIGRvbmUKZG9uZQppZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX3YiOyB0aGVuCiAgIEFDX01TR19XQVJOKFtjYW5ub3QgZGV0ZXJtaW5lIGhvdyB0byBvYnRhaW4gbGlua2luZyBpbmZvcm1hdGlvbiBmcm9tICRbXV9BQ19GQ1tdXSkKZmldLAoJCSAgW0FDX01TR19XQVJOKFtjb21waWxhdGlvbiBmYWlsZWRdKV0pCl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNyw4NDYKX0FDX09VVFBVVF9IRUFERVIKICAjCiAgIyBDT05GSUdfSEVBREVSCiAgIwogIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KICAgIHsKICAgICAgQVNfRUNITyhbIi8qICRjb25maWd1cmVfaW5wdXQgICovIl0pIFwKICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJGFjX3RtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCiAgICB9ID4iJGFjX3RtcC9jb25maWcuaCIgXAogICAgICB8fCBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGVdKQogICAgaWYgZGlmZiAiJGFjX2ZpbGUiICIkYWNfdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgQUNfTVNHX05PVElDRShbJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkXSkKICAgIGVsc2UKICAgICAgcm0gLWYgIiRhY19maWxlIgogICAgICBtdiAiJGFjX3RtcC9jb25maWcuaCIgIiRhY19maWxlIiBcCgl8fCBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGVdKQogICAgZmkKICBlbHNlCiAgICBBU19FQ0hPKFsiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iXSkgXAogICAgICAmJiBldmFsICckQVdLIC1mICIkYWNfdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIgXAogICAgICB8fCBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBjcmVhdGUgLV0pCiAgZmkKZG5sIElmIHJ1bm5pbmcgZm9yIEF1dG9tYWtlLCBiZSByZWFkeSB0byBwZXJmb3JtIGFkZGl0aW9uYWwKZG5sIGNvbW1hbmRzIHRvIHNldCB1cCB0aGUgdGltZXN0YW1wIGZpbGVzLgptNF9pZmRlZihbX0FDX0FNX0NPTkZJR19IRUFERVJfSE9PS10sCgkgW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0soWyIkYWNfZmlsZSJdKQpdKWRubAoKVDE3LDE5MgpBQ19ZWVRFWFRfUE9JTlRFUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19ZWVRFWFRfUE9JTlRFUicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19ERUNMX1lZVEVYVF0sIFtBQ19ERUNMX1lZVEVYVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTYsMjQ4CkFDX0NPTVBJTEVfQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ09NUElMRV9DSEVDSycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWZ2YWxuKFskMV0sIFtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pXSlkbmwKQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWyQyXV0sIFtbJDNdXSldLCBbJDRdLCBbJDVdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMTcwCl9tNF92ZXJzaW9uX3VubGV0dGVybTRfYnBhdHN1YnN0KG00X2JwYXRzdWJzdChtNF90cmFuc2xpdChbW1tbMCwkMV1dXV0sIFsuLV0sIFssLF0pLFtbYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl1dWytdLAoJICAgICAgWysxLC0xLFswcjM2OlwmXV0pLCBbLDBdLCBbLFswcjEwOjBdXSkKVDcsNjMzCkFTX0lOSVQjIFdyYXAgb3VyIGNsZWFudXAgcHJpb3IgdG8gbTRzdWdhcidzIGNsZWFudXAuCm00X3dyYXAoW19BU19DTEVBTlVQXSkKbTRfaW5pdAptNF9wcm92aWRlKFtBU19JTklUXSkKCiMgRm9yYmlkZGVuIHRva2VucyBhbmQgZXhjZXB0aW9ucy4KbTRfcGF0dGVybl9mb3JiaWQoW15fP0FTX10pCgojIEJhbmdzaGUgYW5kIG1pbmltYWwgaW5pdGlhbGl6YXRpb24uCm00X2RpdmVydF90ZXh0KFtCSU5TSF0sIFtAJTpAISAvYmluL3NoXSkKbTRfZGl2ZXJ0X3RleHQoW0hFQURFUi1DT01NRU5UXSwKCSAgICAgICBbQCU6QCBHZW5lcmF0ZWQgZnJvbSBfX2ZpbGVfXyBieSBtNF9QQUNLQUdFX1NUUklORy5dKQptNF9kaXZlcnRfdGV4dChbTTRTSC1TQU5JVElaRV0sIFtfQVNfU0hFTExfU0FOSVRJWkVdKQptNF9kaXZlcnRfdGV4dChbTTRTSC1JTklULUZOXSwgW200X3RleHRfYm94KFtNNHNoIFNoZWxsIEZ1bmN0aW9ucy5dKV0pCgojIExldCdzIGdvIQptNF9kaXZlcnQoW0JPRFldKWRubAptNF90ZXh0X2JveChbTWFpbiBib2R5IG9mIHNjcmlwdC5dKQpfQVNfREVURUNUX1JFUVVJUkVEKFtfQVNfU0hFTExfRk5fV09SS10pZG5sCkFTX1JFUVVJUkUoW19BU19VTlNFVF9QUkVQQVJFXSwgW10sIFtNNFNILUlOSVQtRk5dKWRubAoKVDIxLDYKX0FDX0NDKE9iamVjdGl2ZSBDKyspT0JKQ1hYClQyNCwxMDcKQUNfTEFOR19DT01QSUxFUl9SRVFVSVJFX200X2RlZnVuX3BybyhbJDBdKW00X3JlcXVpcmUoW0FDX0xBTkdfQ09NUElMRVIoXV9BQ19MQU5HWyldLAoJICAgIFtBQ19MQU5HX0NPTVBJTEVSXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDE5OQpBQ19DSEFSX1VOU0lHTkVEX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NIQVJfVU5TSUdORUQnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ19DSEFSX1VOU0lHTkVEXSwgW0FDX0NfQ0hBUl9VTlNJR05FRCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTAzCkFDX0xBTkdfU09VUkNFX200X2RlZnVuX3BybyhbJDBdKUFDX0xBTkdfREVGSU5FU19QUk9WSURFRFtdX0FDX0xBTkdfRElTUEFUQ0goWyQwXSwgX0FDX0xBTkcsICRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOCwxMzYKdW5kaXZlcnRtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbJCNdLCBbMV0sIFtfbTRfdW5kaXZlcnQoX200X2RpdmVydChbJDFdKSldLAogICAgICAgW200X21hcF9hcmdzKFskMF0sICRAKV0pClQxMSwxMzYKbTRfdW5kaXZlcnRtNF9pZihbJCNdLCBbMF0sIFttNF9mYXRhbChbJDA6IG1pc3NpbmcgYXJndW1lbnRdKV0sCiAgICAgICBbJCNdLCBbMV0sIFtfbTRfdW5kaXZlcnQoX200X2RpdmVydChbJDFdKSldLAogICAgICAgW200X21hcF9hcmdzKFskMF0sICRAKV0pClQxNSw3NgpfQVNfQk9YX0xJVEVSQUxBU19FQ0hPKFsiX0FTX0VTQ0FQRShtNF9kcXVvdGUobTRfZXhwYW5kKFttNF90ZXh0X2JveCgkQCldKSksIFtgXSwgW1wiJF0pIl0pClQyOCwzMTYKQUNfTEFOR19QUk9HUkFNKE9iamVjdGl2ZSBDKSQxCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRjc3X0hPT0tTXSwgW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdKVtdZG5sCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0ZDX0hPT0tTXSlbXWRubAppbnQKbWFpbiAoKQp7CmRubCBEbyAqbm90KiBpbmRlbnQgdGhlIGZvbGxvd2luZyBsaW5lOiB0aGVyZSBtYXkgYmUgQ1BQIGRpcmVjdGl2ZXMuCmRubCBEb24ndCBtb3ZlIHRoZSBgOycgcmlnaHQgYWZ0ZXIgZm9yIHRoZSBzYW1lIHJlYXNvbi4KJDIKICA7CiAgcmV0dXJuIDA7Cn0KVDI4LDAKbTRfaW5jbHVkZShhdXRvY29uZi9saWJzLm00KQpUMTUsMTAzCl9BQ19DSEVDS19UWVBFU1skMV0sIFtBQ19ERUZJTkVfVU5RVU9URUQoQVNfVFJfQ1BQKFtIQVZFXyQxXSksIFsxXSwKICBbRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYCQxJy5dKV0KVDE2LDQxNApBQ19IRUFERVJfUkVTT0xWX200X2RlZnVuX3BybyhbJDBdKUFDX0NIRUNLX0hFQURFUlMoc3lzL3R5cGVzLmggbmV0aW5ldC9pbi5oIGFycGEvbmFtZXNlci5oIG5ldGRiLmggcmVzb2x2LmgsCgkJICBbXSwgW10sCltbI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgIC8qIGluZXRfIGZ1bmN0aW9ucyAvIHN0cnVjdHMgKi8KI2VuZGlmCiNpZmRlZiBIQVZFX0FSUEFfTkFNRVNFUl9ICiMgIGluY2x1ZGUgPGFycGEvbmFtZXNlci5oPiAvKiBETlMgSEVBREVSIHN0cnVjdCAqLwojZW5kaWYKI2lmZGVmIEhBVkVfTkVUREJfSAojICBpbmNsdWRlIDxuZXRkYi5oPgojZW5kaWZdXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCwwCkFDX0ZJTEVfREVQRU5ERU5DWV9UUkFDRQpUMjgsNApfQUNfTEFOR19QUkVGSVgoT2JqZWN0aXZlIEMpT0JKQwpUMTAsNDEyCm00X3JlcXVpcmVtNF9pZmRlZihbX200X2V4cGFuZGluZygkMSldLAogIFttNF9mYXRhbChbJDA6IGNpcmN1bGFyIGRlcGVuZGVuY3kgb2YgJDFdKV0pbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbbTRfZmF0YWwoWyQwKCQxKTogY2Fubm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhbiBdZG5sCm00X2lmKFskMF0sIFttNF9yZXF1aXJlXSwgW1ttNF9kZWZ1bl1dLCBbW0FDX0RFRlVOXV0pWydkIG1hY3JvXSldKW00X3Byb3ZpZGVfaWYoWyQxXSwgW200X3NldF9jb250YWlucyhbX200X3Byb3ZpZGVdLCBbJDFdLAogICAgW19tNF9yZXF1aXJlX2NoZWNrKFskMV0sIF9tNF9kZWZuKFttNF9wcm92aWRlKCQxKV0pLCBbJDBdKV0sIFttNF9pZ25vcmVdKV0sCiAgW19tNF9yZXF1aXJlX2NhbGxdKShbJDFdLCBbJDJdLCBfbTRfZGl2ZXJ0X2R1bXApClQyOCwxMDkKbTRfbG9jYXRpb24oQUNfRlVOQ19TVFJOTEVOKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE2ODEKVDcsMTE5Cm00X2Nhc2VtNF9pZihbJCNdLCAwLCBbXSwKICAgICAgIFskI10sIDEsIFtdLAogICAgICAgWyQjXSwgMiwgWyQyXSwKICAgICAgIFskMV0sIFskMl0sIFskM10sCiAgICAgICBbJDAoWyQxXSwgbTRfc2hpZnQzKCRAKSldKQpUMTIsOTU4CkFDX1NJVEVfTE9BRCMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCmFjX3NpdGVfZmlsZTE9Tk9ORQphY19zaXRlX2ZpbGUyPU5PTkUKaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgogICMgV2UgZG8gbm90IHdhbnQgYSBQQVRIIHNlYXJjaCBmb3IgY29uZmlnLnNpdGUuCiAgY2FzZSAkQ09ORklHX1NJVEUgaW4gQCU6QCgoCiAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OwogICAgKi8qKSBhY19zaXRlX2ZpbGUxPSRDT05GSUdfU0lURTs7CiAgICAqKSAgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OwogIGVzYWMKZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KICBhY19zaXRlX2ZpbGUxPSRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCmVsc2UKICBhY19zaXRlX2ZpbGUxPSRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQogIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQpmaQpmb3IgYWNfc2l0ZV9maWxlIGluICIkYWNfc2l0ZV9maWxlMSIgIiRhY19zaXRlX2ZpbGUyIgpkbwogIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCiAgaWYgdGVzdCAvZGV2L251bGwgIT0gIiRhY19zaXRlX2ZpbGUiICYmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCiAgICBBQ19NU0dfTk9USUNFKFtsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGVdKQogICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiZBU19NRVNTQUdFX0xPR19GRAogICAgLiAiJGFjX3NpdGVfZmlsZSIgXAogICAgICB8fCBBQ19NU0dfRkFJTFVSRShbZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZV0pCiAgZmkKZG9uZQoKVDgsNTUKc2luY2x1ZGVtNF9pbmNsdWRlX3VuaXF1ZShbJDFdKWRubAptNF9idWlsdGluKFtzaW5jbHVkZV0sIFskMV0pClQxMSw1NQptNF9zaW5jbHVkZW00X2luY2x1ZGVfdW5pcXVlKFskMV0pZG5sCm00X2J1aWx0aW4oW3NpbmNsdWRlXSwgWyQxXSkKVDMyLDEwNwptNF9sb2NhdGlvbihBQ19QQVRIX1RBUkdFVF9UT09MKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6MjczClQ0MSwxMDYKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihGb3J0cmFuIDc3KSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MjU1ClQyMywxMDYKbTRfbG9jYXRpb24oQUNfRkNfTUFJTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6ODc0CkY2LDYKZGVmaW5lZGVmaW5lClQyNSwyCl9BU19MSVRFUkFMX0hFUkVET0NfSUZfTk8kMgpUMTAsMTkwCkFDX1RSWV9SVU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfVFJZX1JVTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfUlVOX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW1skMV1dKV0sIFskMl0sIFskM10sIFskNF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxOTEKQUNfU0laRU9GX1RZUEVfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU0laRU9GX1RZUEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ0hFQ0tfU0laRU9GXSwgW0FDX0NIRUNLX1NJWkVPRigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMzA5CkFDX1BST0dfRkdSRVBfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19HUkVQXSlkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBmZ3JlcF0sIGFjX2N2X3BhdGhfRkdSRVAsCiAgIFtpZiBlY2hvICdhYipjJyB8ICRHUkVQIC1GICdhYipjJyA+L2Rldi9udWxsIDI+JjEKICAgdGhlbiBhY19jdl9wYXRoX0ZHUkVQPSIkR1JFUCAtRiIKICAgZWxzZQogICAgIF9BQ19QUk9HX0dSRVAoRkdSRVAsIGZncmVwLCBbRkdSRVBdKQogICBmaV0pCiBGR1JFUD0iJGFjX2N2X3BhdGhfRkdSRVAiCiBBQ19TVUJTVChbRkdSRVBdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDIyLDgyCkFDX0NPTkZJR19DT01NQU5EU19QUkVfbTRfZGVmdW5fcHJvKFskMF0pbTRfYXBwZW5kKFtBQ19PVVRQVVRfQ09NTUFORFNfUFJFXSwgWyQxCl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwyOTcKQUNfTEFOR19DQUxMKEMpQUNfTEFOR19QUk9HUkFNKFskMQptNF9pZihbJDJdLCBbbWFpbl0sICwKWy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgogICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKI2VuZGlmCmNoYXIgJDIgKCk7XSldLCBbcmV0dXJuICQyICgpO10pClQyNywxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfVE9PTFMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoyNDcKVDEyLDE5NwpBQ19TVF9CTE9DS1NfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfU1RfQkxPQ0tTJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1NUUlVDVF9TVF9CTE9DS1NdLCBbQUNfU1RSVUNUX1NUX0JMT0NLUygkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMjkzCkFDX0RFRlVOX09OQ0VtNF9kZWZpbmUoW200X2xvY2F0aW9uKCQxKV0sIG00X2xvY2F0aW9uKW00X2RlZmluZShbJDFdLCBbX200X2RlZnVuX29uY2UoWyQxXSwgWyQyXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oWyQxXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbJDFdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbJDFdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFskMV0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSldKQpUOSwyNTUKbTRfY3JfYWxsAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8tClQxOCwxOTMKQUNfV09SRFNfQklHRU5ESUFOX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1dPUkRTX0JJR0VORElBTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19DX0JJR0VORElBTl0sIFtBQ19DX0JJR0VORElBTigkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMzU5CkFDX0NIRUNLX1RBUkdFVF9UT09MX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9UQVJHRVRdKWRubApBQ19DSEVDS19QUk9HKFskMV0sIFskdGFyZ2V0X2FsaWFzLSQyXSwgWyR0YXJnZXRfYWxpYXMtJDJdLCAsIFskNF0pCmlmIHRlc3QgLXogIiRhY19jdl9wcm9nXyQxIjsgdGhlbgogIGlmIHRlc3QgIiRidWlsZCIgPSAiJHRhcmdldCI7IHRoZW4KICAgIGFjX2N0XyQxPSQkMQogICAgX0FDX0NIRUNLX1BST0coW2FjX2N0XyQxXSwgWyQyXSwgWyQyXSwgWyQzXSwgWyQ0XSkKICAgICQxPSRhY19jdF8kMQogIGVsc2UKICAgICQxPSIkMyIKICBmaQplbHNlCiAgJDE9IiRhY19jdl9wcm9nXyQxIgpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMxLDEwMAptNF9sb2NhdGlvbihBQ19QUk9HX0NQUF9XRVJST1IpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjQyMgpUMTksNjIKbTRfdmVyc2lvbl91bmxldHRlcm00X3N1YnN0cihtNF9tYXBfYXJncyhbLm00X2V2YWxdLCBtNF91bnF1b3RlKF8kMChbJDFdKSkpLCBbM10pClQyMywxMDcKbTRfbG9jYXRpb24oQUNfTUlOR1czMikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjM0NQpUMjYsMTA0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1RZUEUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDoyMzEKVDI2LDIzCl9BQ19MQU5HX05VTExfUFJPR1JBTShDKyspQUNfTEFOR19QUk9HUkFNKFtdLCBbXSkKVDE1LDMxOApBQ19MT05HXzY0X0JJVFNfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTE9OR182NF9CSVRTJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DSEVDS19TSVpFT0YoW2xvbmcgaW50XSkKdGVzdCAkYWNfY3Zfc2l6ZW9mX2xvbmdfaW50ID0gOCAmJgogIEFDX0RFRklORShMT05HXzY0X0JJVFMsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIGBzaXplb2YgKGxvbmcgaW50KScgPSA4LiAgT2Jzb2xldGUsIHVzZQoJICAgICBgU0laRU9GX0xPTkdfSU5UJy5dKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDEwNAptNF9sb2NhdGlvbihBQ19UWVBFX09GRl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjAzClQxMywzMzMKQUNfRElWRVJUX1BPUG00X2lmKFskMV0sIFtdLCBbXSwKICAgICAgIFskMV0sIF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pLCBbXSwKICAgICAgIFttNF9mYXRhbChbJDAoJDEpOiBkaXZlcnNpb24gbWlzbWF0Y2g6Cl1tNF9kaXZlcnRfc3RhY2spXSlfbTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X3N0YWNrXSwgW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSltNF9pZmRlZihbX200X2RpdmVydF9kaXZlcnNpb25dLCBbXSwKCSAgIFttNF9mYXRhbChbdG9vIG1hbnkgbTRfZGl2ZXJ0X3BvcF0pXSlfbTRfZGl2ZXJ0X3JhdyhfbTRfZGl2ZXJ0KF9tNF9kZWZuKFtfbTRfZGl2ZXJ0X2RpdmVyc2lvbl0pLCBbLV0pKQpUMjQsMTA2Cm00X2xvY2F0aW9uKEFDX1BST0dfRjc3KS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDozNTgKVDE3LDMyCm00X2RlZmluZV9kZWZhdWx0bTRfaWZuZGVmKFskMV0sIFttNF9kZWZpbmUoJEApXSkKVDE1LDE5MgpBTV9GVU5DX09CU1RBQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQU1fRlVOQ19PQlNUQUNLJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfT0JTVEFDS10sIFtBQ19GVU5DX09CU1RBQ0soJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDExNApBQ19SRVFVSVJFX1NIRUxMX0ZOX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkVfU0hFTExfRk4oWyQxXSwgWyQyXSwgWyQzXSwgbTRfZGVmYXVsdF9xdW90ZWQoWyQ0XSwgW1NIRUxMX0ZOXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE2MAp1bmRlZmluZW00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF91bmRlZmluZShbJDFdKV0sCgkJCSAgICBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDExLDE2MAptNF91bmRlZmluZW00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF91bmRlZmluZShbJDFdKV0sCgkJCSAgICBbbTRfZmF0YWwoWyQwOiB1bmRlZmluZWQgbWFjcm86ICQxXSldKV0sCiAgICAgICBbbTRfbWFwX2FyZ3MoWyQwXSwgJEApXSkKVDIzLDEwNgptNF9sb2NhdGlvbihBTV9NSU5HVzMyKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6OTEKVDE1LDEyCm00X1BBQ0tBR0VfTkFNRUdOVSBBdXRvY29uZgpUMzYsMTA0Cm00X2xvY2F0aW9uKEFDX1NUUlVDVF9ESVJFTlRfRF9UWVBFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6OTYwClQyNywxMDcKbTRfbG9jYXRpb24oQUNfTElOS19JRkVMU0UpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjI2NzkKVDI5LDEwNgptNF9sb2NhdGlvbihBQ19DT05GSUdfU1JDRElSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDo0ODMKRjEwLDcKbTRfYnVpbHRpbmJ1aWx0aW4KVDI2LDQwCl9BQ19DT01QSUxFUl9FWEVFWFRfUkVKRUNUX0FDX0NPTVBJTEVSX09CSkVYVF9SRUpFQ1QgfCAqLm8gfCAqLm9iagpUMjQsNjM1Cl9BQ19DSEVDS19IRUFERVJfTU9OR1JFTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19oZWFkZXJfbW9uZ3JlbF0sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19oZWFkZXJfbW9uZ3JlbF0sCiAgICBbTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVNdLAogICAgW1Rlc3RzIHdoZXRoZXIgSEVBREVSIGV4aXN0cywgZ2l2aW5nIGEgd2FybmluZyBpZiBpdCBjYW5ub3QgYmUgY29tcGlsZWQKICAgICB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCiAgICAgYWNjb3JkaW5nbHkuXSldLAogIFskMF9CT0RZXSlBU19WQVJfUFVTSERFRihbYWNfSGVhZGVyXSwgW2FjX2N2X2hlYWRlcl8kMV0pYWNfZm5fW11fQUNfTEFOR19BQkJSRVZbXV9jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiQxIiAiYWNfSGVhZGVyIiAiQVNfRVNDQVBFKFtBQ19JTkNMVURFU19ERUZBVUxUKFskNF0pXSwgWyIiXSkiCkFTX1ZBUl9JRihbYWNfSGVhZGVyXSwgW3llc10sIFskMl0sIFskM10pCkFTX1ZBUl9QT1BERUYoW2FjX0hlYWRlcl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfUFJPR19GR1JFUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjM3MgpUNDEsMTAwCm00X2xvY2F0aW9uKEFDX0xBTkdfUFJFUFJPQyhPYmplY3RpdmUgQykpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjgxNQpUMzQsMAptNF9pbmNsdWRlKGF1dG9jb25mL2F1dG91cGRhdGUubTQpClQzMSwxMDYKbTRfbG9jYXRpb24oQUNfTUlOVVNfQ19NSU5VU19PKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjYKVDI2LDEwOAptNF9sb2NhdGlvbihBQ19GVU5DX0NIT1dOKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjQyOApUMzUsMTA2Cm00X2xvY2F0aW9uKEFDX0Y3N19MSUJSQVJZX0xERkxBR1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjcwMApUMTAsMjY2CkFTX1JFUVVJUkVfbTRfZGVmdW5fcHJvKFskMF0pbTRfZGVmaW5lKFtfbTRfZGl2ZXJ0X2Rlc2lyZWRdLCBbbTRfZGVmYXVsdF9xdW90ZWQoWyQzXSwgW000U0gtSU5JVF0pXSltNF9pZihtNF9ldmFsKF9tNF9kaXZlcnRfZHVtcCAtIDAgPD0gX200X2RpdmVydChfbTRfZGl2ZXJ0X2Rlc2lyZWQsIFstXSkpLAogICAgICAgMSwgW200X3JlcXVpcmUoXSwKCSAgW200X2RpdmVydF9yZXF1aXJlKF9tNF9kaXZlcnRfZGVzaXJlZCxdKSBbJDFdLCBbJDJdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzQsMTA2Cm00X2xvY2F0aW9uKF9BQ19GNzdfTkFNRV9NQU5HTElORykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6OTc3ClQxNCw0NAptNF9kaXZlcnRfb25jZW00X2V4cGFuZF9vbmNlKFttNF9kaXZlcnRfdGV4dChbJDFdLCBbJDJdKV0pClQxMSwxNDYKX200X2V4cGFuZF9tNF9pZihbJDRdLCBbfT49LV0sCiAgICAgICBbbTRfY2hhbmdlcXVvdGUoWy09PHskMl0sIFspfT49LV0pJDNtNF9jaGFuZ2VxdW90ZShbLCBdKV0sCiAgICAgICBbJDAoWyQxXSwgWygkMl0sIC09PHsoJDIkMSl9Pj0tLCBbfT49LV0pbTRfaWdub3JlJDJdKQpUMTIsODQ2CkFDX1BST0dfT0JKQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goT2JqZWN0aXZlIEMpZG5sCkFDX0FSR19WQVIoW09CSkNdLCAgICAgIFtPYmplY3RpdmUgQyBjb21waWxlciBjb21tYW5kXSlkbmwKQUNfQVJHX1ZBUihbT0JKQ0ZMQUdTXSwgW09iamVjdGl2ZSBDIGNvbXBpbGVyIGZsYWdzXSlkbmwKX0FDX0FSR19WQVJfTERGTEFHUygpZG5sCl9BQ19BUkdfVkFSX0xJQlMoKWRubApfQUNfQVJHX1ZBUl9DUFBGTEFHUygpZG5sCl9BQ19BUkdfVkFSX1BSRUNJT1VTKFtPQkpDXSlkbmwKQUNfQ0hFQ0tfVE9PTFMoT0JKQywKCSAgICAgICBbbTRfZGVmYXVsdChbJDFdLCBbZ2NjIG9iamNjIG9iamMgY2MgQ0NdKV0sCgkgICAgICAgZ2NjKQojIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCl9BU19FQ0hPX0xPRyhbY2hlY2tpbmcgZm9yIF9BQ19MQU5HIGNvbXBpbGVyIHZlcnNpb25dKQpzZXQgWCAkYWNfY29tcGlsZQphY19jb21waWxlcj0kWzJdCmZvciBhY19vcHRpb24gaW4gLS12ZXJzaW9uIC12IC1WIC1xdmVyc2lvbjsgZG8KICBfQUNfRE9fTElNSVQoWyRhY19jb21waWxlciAkYWNfb3B0aW9uID4mQVNfTUVTU0FHRV9MT0dfRkRdKQpkb25lCgptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW11kbmwKbTRfZXhwYW5kX29uY2UoW19BQ19DT01QSUxFUl9PQkpFWFRdKVtdZG5sCl9BQ19MQU5HX0NPTVBJTEVSX0dOVQppZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KICBHT0JKQz15ZXMKZWxzZQogIEdPQkpDPQpmaQpfQUNfUFJPR19PQkpDX0cKQUNfTEFOR19QT1AoT2JqZWN0aXZlIEMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksMTAyCm00X2xvY2F0aW9uKF9BU19CQVNFTkFNRV9TRUQpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6ODkzClQyNywxMDYKbTRfbG9jYXRpb24oX0FDX0NIRUNLX1BST0cpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDo0MgpUMjcsMTAyCm00X2xvY2F0aW9uKEFDX1NFQVJDSF9MSUJTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGlicy5tNDo0OApUMjAsMzc0CkFDX0NPTkZJR19MSUJPQkpfRElSX200X2RlZnVuX29uY2UoW0FDX0NPTkZJR19MSUJPQkpfRElSXSwgW200X2RpdmVydF90ZXh0KFtERUZBVUxUU10sIFthY19jb25maWdfbGlib2JqX2Rpcj0kMV0pXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX0NPTkZJR19MSUJPQkpfRElSXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfQ09ORklHX0xJQk9CSl9ESVJdKV1dLAptNF9pZmRlZihbX200X2RpdmVydGluZyhbQUNfQ09ORklHX0xJQk9CSl9ESVJdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19DT05GSUdfTElCT0JKX0RJUl0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDE0LDIyMQpBQ19DSEVDS19GVU5DU19tNF9kZWZ1bl9wcm8oWyQwXSltNF9tYXBfYXJnc193KFskMV0sIFtfQUhfQ0hFQ0tfRlVOQyhdLCBbKV0pQVNfRk9SKFtBQ19mdW5jXSwgW2FjX2Z1bmNdLCBbJDFdLApbQUNfQ0hFQ0tfRlVOQyhBQ19mdW5jLAoJICAgICAgIFtBQ19ERUZJTkVfVU5RVU9URUQoQVNfVFJfQ1BQKFtIQVZFX11BQ19mdW5jKSkgJDJdLAoJICAgICAgIFskM10pZG5sXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOSwxMDYKbTRfbG9jYXRpb24oX0FDX0ZDKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxNjgKVDExLDE4MwpBQ19JUklYX1NVTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19JUklYX1NVTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfRlVOQ19HRVRNTlRFTlQKQUNfQ0hFQ0tfTElCKFtzdW5dLCBbZ2V0cHduYW1dKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsODEwCkFDX0hFQURFUl9TVEFUX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4sCiAgYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuLApbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KCiNpZiBkZWZpbmVkIFNfSVNCTEsgJiYgZGVmaW5lZCBTX0lGRElSCmV4dGVybiBjaGFyIGMxW1NfSVNCTEsgKFNfSUZESVIpID8gLTEgOiAxXTsKI2VuZGlmCgojaWYgZGVmaW5lZCBTX0lTQkxLICYmIGRlZmluZWQgU19JRkNIUgpleHRlcm4gY2hhciBjMltTX0lTQkxLIChTX0lGQ0hSKSA/IC0xIDogMV07CiNlbmRpZgoKI2lmIGRlZmluZWQgU19JU0xOSyAmJiBkZWZpbmVkIFNfSUZSRUcKZXh0ZXJuIGNoYXIgYzNbU19JU0xOSyAoU19JRlJFRykgPyAtMSA6IDFdOwojZW5kaWYKCiNpZiBkZWZpbmVkIFNfSVNTT0NLICYmIGRlZmluZWQgU19JRlJFRwpleHRlcm4gY2hhciBjNFtTX0lTU09DSyAoU19JRlJFRykgPyAtMSA6IDFdOwojZW5kaWYKXV0pXSwgYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuPW5vLCBhY19jdl9oZWFkZXJfc3RhdF9icm9rZW49eWVzKV0pCmlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbiA9IHllczsgdGhlbgogIEFDX0RFRklORShTVEFUX01BQ1JPU19CUk9LRU4sIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHRoZSBgU19JUyonIG1hY3JvcyBpbiA8c3lzL3N0YXQuaD4gZG8gbm90CgkgICAgIHdvcmsgcHJvcGVybHkuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwyMjEKQUNfRlVOQ19GTk1BVENIX200X2RlZnVuX3BybyhbJDBdKV9BQ19GVU5DX0ZOTUFUQ0hfSUYoW1BPU0lYXSwgW2FjX2N2X2Z1bmNfZm5tYXRjaF93b3Jrc10sCgkJICAgICBbQUNfREVGSU5FKFtIQVZFX0ZOTUFUQ0hdLCAxLAoJCSAgICAgW0RlZmluZSB0byAxIGlmIHlvdXIgc3lzdGVtIGhhcyBhIHdvcmtpbmcgUE9TSVggYGZubWF0Y2gnCgkJICAgICAgZnVuY3Rpb24uXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMyLDAKbTRfaW5jbHVkZShhdXRvY29uZi9vbGRuYW1lcy5tNCkKRjYsNgpyZWdleHByZWdleHAKVDI3LDEwMQptNF9sb2NhdGlvbihBQ19QUk9HX0NDX0M5OSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6MTM2MgpUMTcsNjQKX200X2RpdmVydF91bnNhZmVtNF9mYXRhbChbJDA6IGNhbm5vdCBjaGFuZ2UgZGl2ZXJzaW9uIHRvIGAkMScgaW5zaWRlIG00X2V4cGFuZF0pClQ4LDk5Cl9tNF9jb25kbTRfaWYoKCQxKSwgWygkMildLCBbJDNdLAogICAgICAgWyQjXSwgWzNdLCBbXSwKICAgICAgIFskI10sIFs0XSwgWyQ0XSwKICAgICAgIFskMChtNF9zaGlmdDMoJEApKV0pClQzOCwxMDUKbTRfbG9jYXRpb24oX0FDX0hBVkVfVE9QX0JVSUxEX1BSRUZJWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3N0YXR1cy5tNDoxMjQKVDI5LDEwNgptNF9sb2NhdGlvbihBQ19QUk9HUkFNU19QQVRIKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NDAKVDE0LDE1NjMKQUNfUFJPR19DQ19DX09fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCmlmIHRlc3QgIngkQ0MiICE9IHhjYzsgdGhlbgogIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAkQ0MgYW5kIGNjIHVuZGVyc3RhbmQgLWMgYW5kIC1vIHRvZ2V0aGVyXSkKZWxzZQogIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBjYyB1bmRlcnN0YW5kcyAtYyBhbmQgLW8gdG9nZXRoZXJdKQpmaQpzZXQgZHVtbXkgJENDOyBhY19jYz1gQVNfRUNITyhbIiRbMl0iXSkgfAoJCSAgICAgIHNlZCAncy9bW15hLXpBLVowLTlfXV0vXy9nO3MvXltbMC05XV0vXy8nYApBQ19DQUNIRV9WQUwoYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28sCltBQ19MQU5HX0NPTkZURVNUKFtBQ19MQU5HX1BST0dSQU0oW10pXSkKIyBNYWtlIHN1cmUgaXQgd29ya3MgYm90aCB3aXRoICRDQyBhbmQgd2l0aCBzaW1wbGUgY2MuCiMgV2UgZG8gdGhlIHRlc3QgdHdpY2UgYmVjYXVzZSBzb21lIGNvbXBpbGVycyByZWZ1c2UgdG8gb3ZlcndyaXRlIGFuCiMgZXhpc3RpbmcgLm8gZmlsZSB3aXRoIC1vLCB0aG91Z2ggdGhleSB3aWxsIGNyZWF0ZSBvbmUuCmFjX3RyeT0nJENDIC1jIGNvbmZ0ZXN0LiRhY19leHQgLW8gY29uZnRlc3QyLiRhY19vYmpleHQgPiZBU19NRVNTQUdFX0xPR19GRCcKcm0gLWYgY29uZnRlc3QyLioKaWYgX0FDX0RPX1ZBUihhY190cnkpICYmCiAgIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgX0FDX0RPX1ZBUihhY190cnkpOwp0aGVuCiAgZXZhbCBhY19jdl9wcm9nX2NjXyR7YWNfY2N9X2Nfbz15ZXMKICBpZiB0ZXN0ICJ4JENDIiAhPSB4Y2M7IHRoZW4KICAgICMgVGVzdCBmaXJzdCB0aGF0IGNjIGV4aXN0cyBhdCBhbGwuCiAgICBpZiBfQUNfRE9fVE9LRU5TKGNjIC1jIGNvbmZ0ZXN0LiRhY19leHQgPiZBU19NRVNTQUdFX0xPR19GRCk7IHRoZW4KICAgICAgYWNfdHJ5PSdjYyAtYyBjb25mdGVzdC4kYWNfZXh0IC1vIGNvbmZ0ZXN0Mi4kYWNfb2JqZXh0ID4mQVNfTUVTU0FHRV9MT0dfRkQnCiAgICAgIHJtIC1mIGNvbmZ0ZXN0Mi4qCiAgICAgIGlmIF9BQ19ET19WQVIoYWNfdHJ5KSAmJgoJIHRlc3QgLWYgY29uZnRlc3QyLiRhY19vYmpleHQgJiYgX0FDX0RPX1ZBUihhY190cnkpOwogICAgICB0aGVuCgkjIGNjIHdvcmtzIHRvby4KCToKICAgICAgZWxzZQoJIyBjYyBleGlzdHMgYnV0IGRvZXNuJ3QgbGlrZSAtby4KCWV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KICAgICAgZmkKICAgIGZpCiAgZmkKZWxzZQogIGV2YWwgYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX289bm8KZmkKcm0gLWYgY29yZSBjb25mdGVzdCoKXSlkbmwKaWYgZXZhbCB0ZXN0IFwkYWNfY3ZfcHJvZ19jY18ke2FjX2NjfV9jX28gPSB5ZXM7IHRoZW4KICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQplbHNlCiAgQUNfTVNHX1JFU1VMVChbbm9dKQogIEFDX0RFRklORShOT19NSU5VU19DX01JTlVTX08sIDEsCgkgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBDIGNvbXBpbGVyIGRvZXNuJ3QgYWNjZXB0IC1jIGFuZCAtbyB0b2dldGhlci5dKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDAKbTRfcGF0dGVybl9hbGxvdwpUMTcsMjUzCm00X2RpdmVydF9yZXF1aXJlbTRfaWZkZWYoW19tNF9leHBhbmRpbmcoJDIpXSwKICBbbTRfZmF0YWwoWyQwOiBjaXJjdWxhciBkZXBlbmRlbmN5IG9mICQyXSldKW00X2lmKF9tNF9kaXZlcnRfZHVtcCwgW10sCiAgW200X2ZhdGFsKFskMCgkMik6IGNhbm5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYW4gbTRfZGVmdW4nZCBtYWNyb10pXSltNF9wcm92aWRlX2lmKFskMl0sIFtdLAogIFtfbTRfcmVxdWlyZV9jYWxsKFskMl0sIFskM10sIF9tNF9kaXZlcnQoWyQxXSwgWy1dKSldKQpUMTQsNjMKQUNfUkVRVUlSRV9DUFBfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QUkVQUk9DX1JFUVVJUkVbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEzLDQ5MgpBQ19DX1ZPTEFUSUxFX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyB2b2xhdGlsZV0sIGFjX2N2X2Nfdm9sYXRpbGUsCltBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbCnZvbGF0aWxlIGludCB4OwppbnQgKiB2b2xhdGlsZSB5ID0gKGludCAqKSAwOwpyZXR1cm4gIXggJiYgIXk7XSldLAoJCSAgIFthY19jdl9jX3ZvbGF0aWxlPXllc10sCgkJICAgW2FjX2N2X2Nfdm9sYXRpbGU9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2Nfdm9sYXRpbGUgPSBubzsgdGhlbgogIEFDX0RFRklORSh2b2xhdGlsZSwsCgkgICAgW0RlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBgdm9sYXRpbGUnIGRvZXMgbm90IHdvcmsuCgkgICAgIFdhcm5pbmc6IHZhbGlkIGNvZGUgdXNpbmcgYHZvbGF0aWxlJyBjYW4gYmVjb21lIGluY29ycmVjdAoJICAgICB3aXRob3V0LiAgRGlzYWJsZSB3aXRoIGNhcmUuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pCkY5LDYKbTRfc3lzdmFsc3lzdmFsClQyOCwxMDYKbTRfbG9jYXRpb24oQUNfTUFKT1JfSEVBREVSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjUKVDIzLDEwNwptNF9sb2NhdGlvbihBQ19BUkdfVkFSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNTEyClQxMyw5MQpBU19TRVRfU1RBVFVTX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW19BU19FWElUX1BSRVBBUkVdKVtdYXNfZm5fc2V0X3N0YXR1cyAkMVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTQsMTI3CkFDX0xBTkdfQVNTRVJUX200X2RlZnVuX3BybyhbJDBdKW00X2lmKF9BQ19MQU5HLCAkMSwgW10sCiAgICAgICBbbTRfZmF0YWwoWyQwOiBjdXJyZW50IGxhbmd1YWdlIGlzIG5vdCAkMTogXSBfQUNfTEFORyldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjAsMjY4CkFDX0xBTkcoT2JqZWN0aXZlIEMpYWNfZXh0PW0KYWNfY3BwPSckT0JKQ1BQICRDUFBGTEFHUycKYWNfY29tcGlsZT0nJE9CSkMgLWMgJE9CSkNGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19saW5rPSckT0JKQyAtbyBjb25mdGVzdCRhY19leGVleHQgJE9CSkNGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JkFTX01FU1NBR0VfTE9HX0ZEJwphY19jb21waWxlcl9nbnU9JGFjX2N2X29iamNfY29tcGlsZXJfZ251CgpUMjUsMTA0Cm00X2xvY2F0aW9uKF9BQ19UWVBFX0lOVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjY2MwpUMzAsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfVUlOVFBUUl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzY1ClQzMSwxMDcKbTRfbG9jYXRpb24oQUNfQ09ORklHX0FVWF9ESVJTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoxNjg5ClQyMiw1MjcKX0FTX1ZBUl9BUFBFTkRfUFJFUEFSRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19GVU5DVElPTl9ERVNDUklCRShbYXNfZm5fYXBwZW5kXSwgW1ZBUiBWQUxVRV0sCltBcHBlbmQgdGhlIHRleHQgaW4gVkFMVUUgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbiBjb250YWluZWQgaW4KVkFSLiAgVGFrZSBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQKbGluZWFyIGdyb3d0aCBvdmVyIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljCmdyb3d0aCBwcmVzZW50IGluIG5haXZlIGltcGxlbWVudGF0aW9ucy5dKQpBU19JRihbX0FTX1JVTihbIkFTX0VTQ0FQRShtNF9xdW90ZShfQVNfVkFSX0FQUEVORF9XT1JLUykpIl0pXSwKW2V2YWwgJ2FzX2ZuX2FwcGVuZCAoKQogIHsKICAgIGV2YWwgJFtdMSs9XCRbXTIKICB9J10sClthc19mbl9hcHBlbmQgKCkKICB7CiAgICBldmFsICRbXTE9XCQkW10xXCRbXTIKICB9XSkgIyBhc19mbl9hcHBlbmQKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNSwxMzEKX0FDX0VWQUxfU1RERVJSX200X2RlZnVuX3BybyhbJDBdKV9BQ19SVU5fTE9HX1NUREVSUihbZXZhbCAkMV0sCgkJICAgIFtldmFsIGVjaG8gIlwiXCRhc19tZVwiOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcIiQxXCIiXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE2LDI1MwpBQ19MQU5HX0NPTkZURVNUX200X2RlZnVuX3BybyhbJDBdKW00X3B1c2hkZWYoW19BQ19MQU5HX0RFRklORVNfUFJPVklERURdLAogIFttNF93YXJuKFtzeW50YXhdLCBbJDA6IG5vIEFDX0xBTkdfU09VUkNFIGNhbGwgZGV0ZWN0ZWQgaW4gYm9keV0pXSlfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApW11fQUNfTEFOR19ERUZJTkVTX1BST1ZJREVEW11tNF9wb3BkZWYoW19BQ19MQU5HX0RFRklORVNfUFJPVklERURdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMTg0CkFDX0ZVTkNfVkZPUktfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfRlVOQ19WRk9SSycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX0ZPUktdLCBbQUNfRlVOQ19GT1JLKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNiwxMDcKbTRfbG9jYXRpb24oX0FDX1RPT0xfV0FSTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjE5MApUMTgsMzcxCkFDX1NZU19JTlRFUlBSRVRFUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIEAlOkAhIHdvcmtzIGluIHNoZWxsIHNjcmlwdHMsIGFjX2N2X3N5c19pbnRlcnByZXRlciwKW2VjaG8gJyMhIC9iaW4vY2F0CmV4aXQgNjkKJyA+Y29uZnRlc3QKY2htb2QgdSt4IGNvbmZ0ZXN0CihTSEVMTD0vYmluL3NoOyBleHBvcnQgU0hFTEw7IC4vY29uZnRlc3QgPi9kZXYvbnVsbCAyPiYxKQppZiB0ZXN0ICQ/IC1uZSA2OTsgdGhlbgogICBhY19jdl9zeXNfaW50ZXJwcmV0ZXI9eWVzCmVsc2UKICAgYWNfY3Zfc3lzX2ludGVycHJldGVyPW5vCmZpCnJtIC1mIGNvbmZ0ZXN0XSkKaW50ZXJwdmFsPSRhY19jdl9zeXNfaW50ZXJwcmV0ZXIKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNSwxMDcKbTRfbG9jYXRpb24oQUNfTVNHX1JFU1VMVF9VTlFVT1RFRCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjI3NApUMTUsNzcKX0FDX0xBTkdfQUJCUkVWX200X2RlZnVuX3BybyhbJDBdKV9BQ19MQU5HX0RJU1BBVENIKFskMF0sIF9BQ19MQU5HLCAkQClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDU1MApBQ19GVU5DX1NUUkNPTExfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soZm9yIHdvcmtpbmcgc3RyY29sbCwgYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzLApbQUNfUlVOX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwKICBbW3JldHVybiAoc3RyY29sbCAoImFiYyIsICJkZWYiKSA+PSAwIHx8Cgkgc3RyY29sbCAoIkFCQyIsICJERUYiKSA+PSAwIHx8Cgkgc3RyY29sbCAoIjEyMyIsICI0NTYiKSA+PSAwKV1dKV0sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzPXllcywKCSAgICAgICBhY19jdl9mdW5jX3N0cmNvbGxfd29ya3M9bm8sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJjb2xsX3dvcmtzPW5vKV0pCmlmIHRlc3QgJGFjX2N2X2Z1bmNfc3RyY29sbF93b3JrcyA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX1NUUkNPTEwsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY29sbCcgZnVuY3Rpb24gYW5kIGl0IGlzIHByb3Blcmx5CgkgICAgIGRlZmluZWQuXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCwxMDEKbTRfbG9jYXRpb24oQUNfQ19JTkxJTkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjE2MTMKVDI5LDExMzAKX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0VfbTRfZGVmdW5fcHJvKFskMF0pYWNfcHJlcHJvY19vaz1mYWxzZQpmb3IgYWNfW11fQUNfTEFOR19BQkJSRVZbXV9wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKZG8KICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCiAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCiAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCiAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCiAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KICBfQUNfUFJFUFJPQ19JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtbQCU6QGlmZGVmIF9fU1REQ19fCkAlOkAgaW5jbHVkZSA8bGltaXRzLmg+CkAlOkBlbHNlCkAlOkAgaW5jbHVkZSA8YXNzZXJ0Lmg+CkAlOkBlbmRpZgoJCSAgICAgU3ludGF4IGVycm9yXV0pXSwKCQkgICAgIFtdLAoJCSAgICAgWyMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KY29udGludWVdKQoKICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycwogICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCiAgX0FDX1BSRVBST0NfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbW0AlOkBpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPl1dKV0sCgkJICAgICBbIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KY29udGludWVdLAoJCSAgICAgWyMgUGFzc2VzIGJvdGggdGVzdHMuCmFjX3ByZXByb2Nfb2s9OgpicmVha10pCgpkb25lCiMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgpybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CkFTX0lGKFskYWNfcHJlcHJvY19va10sIFskMV0sIFskMl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjEsMTk1MApfX0FDX0ZDX05BTUVfTUFOR0xJTkdfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZPUlRSQU5fQVNTRVJUKClkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBfQUNfTEFORyBuYW1lLW1hbmdsaW5nIHNjaGVtZV0sCgkgICAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZywKW0FDX0NPTVBJTEVfSUZFTFNFKApbWyAgICAgIHN1YnJvdXRpbmUgZm9vYmFyKCkKICAgICAgcmV0dXJuCiAgICAgIGVuZAogICAgICBzdWJyb3V0aW5lIGZvb19iYXIoKQogICAgICByZXR1cm4KICAgICAgZW5kXV0sClttdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNmb3J0cmFuX3Rlc3QuJGFjX29iamV4dAoKICBhY19zYXZlX0xJQlM9JExJQlMKICBMSUJTPSJjZm9ydHJhbl90ZXN0LiRhY19vYmpleHQgJExJQlMgJFtdX0FDX0xBTkdfUFJFRklYW11MSUJTIgoKICBBQ19MQU5HX1BVU0goQylkbmwKICBhY19zdWNjZXNzPW5vCiAgZm9yIGFjX2Zvb2JhciBpbiBmb29iYXIgRk9PQkFSOyBkbwogICAgZm9yIGFjX3VuZGVyc2NvcmUgaW4gIiIgIl8iOyBkbwogICAgICBhY19mdW5jPSIkYWNfZm9vYmFyJGFjX3VuZGVyc2NvcmUiCiAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX0NBTEwoW10sIFskYWNfZnVuY10pXSwKCQkgICAgIFthY19zdWNjZXNzPXllczsgYnJlYWsgMl0pCiAgICBkb25lCiAgZG9uZQogIEFDX0xBTkdfUE9QKEMpZG5sCgogIGlmIHRlc3QgIiRhY19zdWNjZXNzIiA9ICJ5ZXMiOyB0aGVuCiAgICAgY2FzZSAkYWNfZm9vYmFyIGluCglmb29iYXIpCgkgICBhY19jYXNlPWxvd2VyCgkgICBhY19mb29fYmFyPWZvb19iYXIKCSAgIDs7CglGT09CQVIpCgkgICBhY19jYXNlPXVwcGVyCgkgICBhY19mb29fYmFyPUZPT19CQVIKCSAgIDs7CiAgICAgZXNhYwoKICAgICBBQ19MQU5HX1BVU0goQylkbmwKICAgICBhY19zdWNjZXNzX2V4dHJhPW5vCiAgICAgZm9yIGFjX2V4dHJhIGluICIiICJfIjsgZG8KCWFjX2Z1bmM9IiRhY19mb29fYmFyJGFjX3VuZGVyc2NvcmUkYWNfZXh0cmEiCglBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19DQUxMKFtdLCBbJGFjX2Z1bmNdKV0sCgkJICAgICAgIFthY19zdWNjZXNzX2V4dHJhPXllczsgYnJlYWtdKQogICAgIGRvbmUKICAgICBBQ19MQU5HX1BPUChDKWRubAoKICAgICBpZiB0ZXN0ICIkYWNfc3VjY2Vzc19leHRyYSIgPSAieWVzIjsgdGhlbgoJYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZz0iJGFjX2Nhc2UgY2FzZSIKCWlmIHRlc3QgLXogIiRhY191bmRlcnNjb3JlIjsgdGhlbgoJICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZz0iJGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmcsIG5vIHVuZGVyc2NvcmUiCgllbHNlCgkgICBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZywgdW5kZXJzY29yZSIKCWZpCglpZiB0ZXN0IC16ICIkYWNfZXh0cmEiOyB0aGVuCgkgICBhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nPSIkYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZywgbm8gZXh0cmEgdW5kZXJzY29yZSIKCWVsc2UKCSAgIGFjX2N2X1tdX0FDX0xBTkdfQUJCUkVWW11fbWFuZ2xpbmc9IiRhY19jdl9bXV9BQ19MQU5HX0FCQlJFVltdX21hbmdsaW5nLCBleHRyYSB1bmRlcnNjb3JlIgoJZmkKICAgICAgZWxzZQoJYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZz0idW5rbm93biIKICAgICAgZmkKICBlbHNlCiAgICAgYWNfY3ZfW11fQUNfTEFOR19BQkJSRVZbXV9tYW5nbGluZz0idW5rbm93biIKICBmaQoKICBMSUJTPSRhY19zYXZlX0xJQlMKICBybSAtcmYgY29uZnRlc3QqCiAgcm0gLWYgY2ZvcnRyYW5fdGVzdCpdLAogIFtBQ19NU0dfRkFJTFVSRShbY2Fubm90IGNvbXBpbGUgYSBzaW1wbGUgRm9ydHJhbiBwcm9ncmFtXSldKQpdKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDYKX0FDX0xBTkdfQUJCUkVWKE9iamVjdGl2ZSBDKyspb2JqY3h4ClQyMywxMjM1Cl9BQ19DT01QVVRFX0lOVF9DT01QSUxFIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoWyQzXSwgWygkMSkgPj0gMF0pXSwKIFthY19sbz0wIGFjX21pZD0wCiAgd2hpbGUgOjsgZG8KICAgIF9BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKFskM10sIFsoJDEpIDw9ICRhY19taWRdKV0sCgkJICAgICAgIFthY19oaT0kYWNfbWlkOyBicmVha10sCgkJICAgICAgIFtBU19WQVJfQVJJVEgoW2FjX2xvXSwgWyRhY19taWQgKyAxXSkKCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KCQkJICBhY19sbz0gYWNfaGk9CgkJCSAgYnJlYWsKCQkJZmkKCQkJQVNfVkFSX0FSSVRIKFthY19taWRdLCBbMiAnKicgJGFjX21pZCArIDFdKV0pCiAgZG9uZV0sCltBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKFskM10sIFsoJDEpIDwgMF0pXSwKIFthY19oaT0tMSBhY19taWQ9LTEKICB3aGlsZSA6OyBkbwogICAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoWyQzXSwgWygkMSkgPj0gJGFjX21pZF0pXSwKCQkgICAgICAgW2FjX2xvPSRhY19taWQ7IGJyZWFrXSwKCQkgICAgICAgW0FTX1ZBUl9BUklUSChbYWNfaGldLCBbJygnICRhY19taWQgJyknIC0gMV0pCgkJCWlmIHRlc3QgJGFjX21pZCAtbGUgJGFjX2hpOyB0aGVuCgkJCSAgYWNfbG89IGFjX2hpPQoJCQkgIGJyZWFrCgkJCWZpCgkJCUFTX1ZBUl9BUklUSChbYWNfbWlkXSwgWzIgJyonICRhY19taWRdKV0pCiAgZG9uZV0sCiBbYWNfbG89IGFjX2hpPV0pXSkKIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4Kd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogIEFTX1ZBUl9BUklUSChbYWNfbWlkXSwgWycoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb10pCiAgX0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX0JPT0xfQ09NUElMRV9UUlkoWyQzXSwgWygkMSkgPD0gJGFjX21pZF0pXSwKCQkgICAgIFthY19oaT0kYWNfbWlkXSwKCQkgICAgIFtBU19WQVJfQVJJVEgoW2FjX2xvXSwgWycoJyAkYWNfbWlkICcpJyArIDFdKV0pCmRvbmUKY2FzZSAkYWNfbG8gaW4gQCU6QCgoCj8qKSBBU19WQVJfU0VUKFskMl0sIFskYWNfbG9dKTsgJDQgOzsKJycpICQ1IDs7CmVzYWNbXWRubAoKRjcsNwpidWlsdGluYnVpbHRpbgpUMTEsMTEKQUNfRElBR05PU0VtNF93YXJuKCRAKQpUMTcsMAptNF9wYXR0ZXJuX2ZvcmJpZApUMjQsMTA3Cm00X2xvY2F0aW9uKF9BQ19SVU5fTE9HKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyMjk5ClQzMCwxMDYKbTRfbG9jYXRpb24oX0FDX0lOSVRfRElSQ0hFQ0spL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjQ5MwpUMzMsMTA3Cm00X2xvY2F0aW9uKEFDX1NZU19QT1NJWF9URVJNSU9TKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6Mjg4ClQyNywxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfUFJPR1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoxMTEKVDksNjkKbTRfYXNzZXJ0bTRfaWYobTRfZXZhbChbJDFdKSwgMCwKICAgICAgIFttNF9mYXRhbChbYXNzZXJ0IGZhaWxlZDogJDFdLCBbJDJdKV0pClQyNiwxMTUyCl9BQ19UWVBFX0xPTkdfTE9OR19TTklQUEVUX200X2RlZnVuX3BybyhbJDBdKQogIEFDX0xBTkdfUFJPR1JBTSgKICAgIFtbLyogRm9yIG5vdywgZG8gbm90IHRlc3QgdGhlIHByZXByb2Nlc3NvcjsgYXMgb2YgMjAwNyB0aGVyZSBhcmUgdG9vIG1hbnkKCSBpbXBsZW1lbnRhdGlvbnMgd2l0aCBicm9rZW4gcHJlcHJvY2Vzc29ycy4gIFBlcmhhcHMgdGhpcyBjYW4KCSBiZSByZXZpc2l0ZWQgaW4gMjAxMi4gIEluIHRoZSBtZWFudGltZSwgY29kZSBzaG91bGQgbm90IGV4cGVjdAoJICNpZiB0byB3b3JrIHdpdGggbGl0ZXJhbHMgd2lkZXIgdGhhbiAzMiBiaXRzLiAgKi8KICAgICAgLyogVGVzdCBsaXRlcmFscy4gICovCiAgICAgIGxvbmcgbG9uZyBpbnQgbGwgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3bGw7CiAgICAgIGxvbmcgbG9uZyBpbnQgbmxsID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGwgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTDsKICAgICAgLyogVGVzdCBjb25zdGFudCBleHByZXNzaW9ucy4gICAqLwogICAgICB0eXBlZGVmIGludCBhWygoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCA8IDAgJiYgMCA8IDkyMjMzNzIwMzY4NTQ3NzU4MDdsbCkKCQkgICAgID8gMSA6IC0xKV07CiAgICAgIHR5cGVkZWYgaW50IGJbKDE4NDQ2NzQ0MDczNzA5NTUxNjE1VUxMIDw9ICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSAtMQoJCSAgICAgPyAxIDogLTEpXTsKICAgICAgaW50IGkgPSA2MztdXSwKICAgIFtbLyogVGVzdCBhdmFpbGFiaWxpdHkgb2YgcnVudGltZSByb3V0aW5lcyBmb3Igc2hpZnQgYW5kIGRpdmlzaW9uLiAgKi8KICAgICAgbG9uZyBsb25nIGludCBsbG1heCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdsbDsKICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCB1bGxtYXggPSAxODQ0Njc0NDA3MzcwOTU1MTYxNXVsbDsKICAgICAgcmV0dXJuICgobGwgPDwgNjMpIHwgKGxsID4+IDYzKSB8IChsbCA8IGkpIHwgKGxsID4gaSkKCSAgICAgIHwgKGxsbWF4IC8gbGwpIHwgKGxsbWF4ICUgbGwpCgkgICAgICB8ICh1bGwgPDwgNjMpIHwgKHVsbCA+PiA2MykgfCAodWxsIDw8IGkpIHwgKHVsbCA+PiBpKQoJICAgICAgfCAodWxsbWF4IC8gdWxsKSB8ICh1bGxtYXggJSB1bGwpKTtdXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiw0MTQKQUNfQ19MT05HX0RPVUJMRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19DX0xPTkdfRE9VQkxFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAoKICAgIEFDX1RZUEVfTE9OR19ET1VCTEVfV0lERVIKICAgIGFjX2N2X2NfbG9uZ19kb3VibGU9JGFjX2N2X3R5cGVfbG9uZ19kb3VibGVfd2lkZXIKICAgIGlmIHRlc3QgJGFjX2N2X2NfbG9uZ19kb3VibGUgPSB5ZXM7IHRoZW4KICAgICAgQUNfREVGSU5FKFtIQVZFX0xPTkdfRE9VQkxFXSwgMSwKCVtEZWZpbmUgdG8gMSBpZiB0aGUgdHlwZSBgbG9uZyBkb3VibGUnIHdvcmtzIGFuZCBoYXMgbW9yZSByYW5nZSBvcgoJIHByZWNpc2lvbiB0aGFuIGBkb3VibGUnLl0pCiAgICBmaQogIFtdX200X2RlZnVuX2VwaShbJDBdKQpGMTAsNwptNF9wdXNoZGVmcHVzaGRlZgpUMjcsMTA1Cm00X2xvY2F0aW9uKEFDX0xBTkdfRVJMQU5HKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjExMgpUMjIsMTA3Cm00X2xvY2F0aW9uKEFDX0VNWE9TMikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjMzMQpUMjEsMTQwCkFDX0ZDX0xJQlJBUllfTERGTEFHU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX0ZDXSlkbmwKQUNfTEFOR19QVVNIKEZvcnRyYW4pZG5sCl9BQ19GQ19MSUJSQVJZX0xERkxBR1MKQUNfTEFOR19QT1AoRm9ydHJhbilkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxOCwxMTIwCkFDX0NBTk9OSUNBTF9CVUlMRF9tNF9kZWZ1bl9vbmNlKFtBQ19DQU5PTklDQUxfQlVJTERdLCBbQUNfUkVRVUlSRShbQUNfQ09ORklHX0FVWF9ESVJfREVGQVVMVF0pZG5sCkFDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbmZpZy5zdWJdKWRubApBQ19SRVFVSVJFX0FVWF9GSUxFKFtjb25maWcuZ3Vlc3NdKWRubAptNF9kaXZlcnRfb25jZShbSEVMUF9DQU5PTl0sCltbClN5c3RlbSB0eXBlczoKICAtLWJ1aWxkPUJVSUxEICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtndWVzc2VkXV1dKWRubAojIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCiRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWJdKQoKQUNfQ0FDSEVfQ0hFQ0soW2J1aWxkIHN5c3RlbSB0eXBlXSwgW2FjX2N2X2J1aWxkXSwKW2FjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwp0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAp0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZV0pCmFjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKICBBQ19NU0dfRVJST1IoWyRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWRdKQpdKQpfQUNfQ0FOT05JQ0FMX1NQTElUKGJ1aWxkKQpdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfQ0FOT05JQ0FMX0JVSUxEXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfQ0FOT05JQ0FMX0JVSUxEXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX0NBTk9OSUNBTF9CVUlMRF0pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX0NBTk9OSUNBTF9CVUlMRF0sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDM5LDEwNAptNF9sb2NhdGlvbihfQUNfVFlQRV9MT05HX0xPTkdfU05JUFBFVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjQ3MwpUMjgsMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9NQUpPUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6NTA5ClQxNywzOTUKX0FDX1NUUlVDVF9ESVJFTlRfbTRfZGVmdW5fcHJvKFskMF0pCiAgQUNfUkVRVUlSRShbQUNfSEVBREVSX0RJUkVOVF0pCiAgQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IGRpcmVudC4kMV0sIFtdLCBbXSwKICAgIFtbCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfRElSRU5UX0gKIyBpbmNsdWRlIDxkaXJlbnQuaD4KI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGlmZGVmIEhBVkVfU1lTX05ESVJfSAojICBpbmNsdWRlIDxzeXMvbmRpci5oPgojIGVuZGlmCiMgaWZkZWYgSEFWRV9TWVNfRElSX0gKIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgojIGVuZGlmCiMgaWZkZWYgSEFWRV9ORElSX0gKIyAgaW5jbHVkZSA8bmRpci5oPgojIGVuZGlmCiNlbmRpZgogICAgXV0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMTI0CkFDX01TR19OT1RJQ0VtNF9pZnZhbChBU19NRVNTQUdFX0xPR19GRCwKCSAgW3sgX0FTX0VDSE9fTE9HKFskMV0pCl9BU19FQ0hPKFskYXNfbWU6ICQxXSwgWyQyXSk7fV0sCgkgIFtfQVNfRUNITyhbJGFzX21lOiAkMV0sIFskMl0pXSlbXVtdClQxMywxMjcKQUNfTVNHX05PVElDRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfTUVfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDEwNwptNF9sb2NhdGlvbihBQ19QQVRIX1BST0cpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoxNTcKVDIwLDUzCm00X2RpdmVydF9zdGFja19wdXNobTRfcHVzaGRlZihbX200X2RpdmVydF9zdGFja10sIG00X2xvY2F0aW9uWzogJDE6ICQyXSkKVDE3LDEwNQpfbTRfZGVmaW5lX2NyX25vdG00X2RlZmluZShbbTRfY3Jfbm90XyQxXSwKCSAgIG00X3RyYW5zbGl0KG00X2RxdW90ZShtNF9kZWZuKFttNF9jcl9hbGxdKSksCgkJICAgICAgIG00X2RlZm4oW200X2NyXyQxXSkpKQpUMTksMjEKX0FTX1ZBUl9BUklUSF9XT1JLU3Rlc3QgJCgoIDEgKyAxICkpID0gMgpUNywxNzgKQUNfTU1BUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19NTUFQJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0ZVTkNfTU1BUF0sIFtBQ19GVU5DX01NQVAoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDksNzUKQUNfQkVGT1JFbTRfcHJvdmlkZV9pZihbJDJdLAoJICAgICAgIFttNF93YXJuKFtzeW50YXhdLCBbJDIgd2FzIGNhbGxlZCBiZWZvcmUgJDFdKV0pClQzNywxMDcKbTRfbG9jYXRpb24oQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvc3BlY2lmaWMubTQ6MzY0ClQxNSw2NwpBQ19MQU5HX1BSRVBST0NBQ19MQU5HX0NPTVBJTEVSX1JFUVVJUkUoKWRubApfQUNfTEFOR19ESVNQQVRDSChbJDBdLCBfQUNfTEFORywgJEApClQyOCwxMDkKbTRfbG9jYXRpb24oQUNfRlVOQ19TVFJDT0xMKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE3MjkKVDIzLDM5Cm00X2V4cGFuc2lvbl9zdGFja19wdXNobTRfcHVzaGRlZihbX200X2V4cGFuc2lvbl9zdGFja10sIFskMV0pClQyMiwzCl9tNF9kaXZlcnQoSEVMUF9CRUdJTikxMDAKVDE0LDE5OQpBU19TRVRfQ0FURklMRWNhc2UgJDIgaW4gQCU6QCgoCi4pIEFTX1ZBUl9TRVQoWyQxXSwgWyQzXSk7OwoqKQogIGNhc2UgJDMgaW4gQCU6QCgoKAogIC4pIEFTX1ZBUl9TRVQoWyQxXSwgWyQyXSk7OwogIFtbXFwvXV0qIHwgPzpbW1xcL11dKiApIEFTX1ZBUl9TRVQoWyQxXSwgWyQzXSk7OwogICopIEFTX1ZBUl9TRVQoWyQxXSwgWyQyLyQzXSk7OwogIGVzYWM7Owplc2FjW10KVDEyLDE0MgpBQ19MQU5HX1BVU0hfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0xBTkdfU0VUKG00X2lmZGVmKFtfQUNfTEFOR10sIFttNF9kZWZuKFtfQUNfTEFOR10pXSksCgkgICAgICBbJDFdKWRubAptNF9wdXNoZGVmKFtfQUNfTEFOR10sIFskMV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw1MjcKQUNfQ09NUFVURV9JTlRfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19DT01QSUxFUl9SRVFVSVJFKClBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jb21wdXRlX2ludF0sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jb21wdXRlX2ludF0sCiAgICBbTElORU5PIEVYUFIgVkFSIElOQ0xVREVTXSwKICAgIFtUcmllcyB0byBmaW5kIHRoZSBjb21waWxlLXRpbWUgdmFsdWUgb2YgRVhQUiBpbiBhIHByb2dyYW0gdGhhdCBpbmNsdWRlcwogICAgIElOQ0xVREVTLCBzZXR0aW5nIFZBUiBhY2NvcmRpbmdseS4gIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgY291bGQKICAgICBiZSBjb21wdXRlZF0pXSwKICAgIFtfJDBfQk9EWV0pQVNfSUYoW2FjX2ZuX1tdX0FDX0xBTkdfQUJCUkVWW11fY29tcHV0ZV9pbnQgIiRMSU5FTk8iICIkMiIgIiQxIiBdZG5sCiAgICAgICBbIkFTX0VTQ0FQRShbJDNdLCBbIiJdKSJdLAogICAgICAgW10sIFskNF0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMTU1CkFDX0xBTkdfT0JKQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX09CSkMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkcoT2JqZWN0aXZlIEMpW11fbTRfZGVmdW5fZXBpKFskMF0pClQzNCwxMDMKbTRfbG9jYXRpb24oX0FTX1ZBUl9BUklUSF9QUkVQQVJFKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvbTRzdWdhci9tNHNoLm00OjE5MzAKVDExLDMwCkFDX01TR19XQVJOQVNfTUVTU0FHRShbV0FSTklORzogJDFdLCBbMl0pClQxMywyNgptNF9jcl9sZXR0ZXJzYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKVDEzLDMzMwpfQUNfRlVOQ19GT1JLX200X2RlZnVuX3BybyhbJDBdKUFDX0NBQ0hFX0NIRUNLKGZvciB3b3JraW5nIGZvcmssIGFjX2N2X2Z1bmNfZm9ya193b3JrcywKICAgIFtBQ19SVU5fSUZFTFNFKAogICAgICBbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwKCVsKCSAgLyogQnkgUnVlZGlnZXIgS3VobG1hbm4uICovCgkgIHJldHVybiBmb3JrICgpIDwgMDsKCV0pXSwKICAgICAgW2FjX2N2X2Z1bmNfZm9ya193b3Jrcz15ZXNdLAogICAgICBbYWNfY3ZfZnVuY19mb3JrX3dvcmtzPW5vXSwKICAgICAgW2FjX2N2X2Z1bmNfZm9ya193b3Jrcz1jcm9zc10pXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwyMjAKQUNfQ0FDSEVfQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfTVNHX0NIRUNLSU5HKFskMV0pCkFDX0NBQ0hFX1ZBTChbJDJdLCBbJDNdKWRubApBU19MSVRFUkFMX1dPUkRfSUYoWyQyXSwKCSAgICAgIFtBQ19NU0dfUkVTVUxUKFskJDJdKV0sCgkgICAgICBbQVNfVkFSX0NPUFkoW2FjX3Jlc10sIFskMl0pCgkgICAgICAgQUNfTVNHX1JFU1VMVChbJGFjX3Jlc10pXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMCwxMDkKbTRfbG9jYXRpb24oQUNfTU1BUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxMzU4ClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfRlVOQykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo2MApUMzAsNzEKQUNfTEFOR19QUkVQUk9DKE9iamVjdGl2ZSBDKyspX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX1BST0dfT0JKQ1hYQ1BQXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI0LDEwNwptNF9sb2NhdGlvbihBQ19TQ09fSU5UTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQ3NwpUNywxMwpBU19FQ0hPJGFzX2VjaG8gJDFbXQpUNywxMjQKQVNfRUNIT19tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfJDBfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDM2Cl9tNF9leHBhbmQkMF8oWyQxXSwgWyhdLCAtPTx7KCQxKX0+PS0sIFt9Pj0tXSkKVDI2LDEwNApfQVNfREVURUNUX1NVR0dFU1RFRF9QUlVORW00X3NldF9jb250YWlucyhbX0FTX0RFVEVDVF9SRVFVSVJFRF9CT0RZXSwgWyQxXSwKCQkgW200X3NldF9yZW1vdmUoW19BU19ERVRFQ1RfU1VHR0VTVEVEX0JPRFldLCBbJDFdKV0pClQxMCwyNwpBQ19XQVJOSU5HQUNfRElBR05PU0UoW3N5bnRheF0sIFskMV0pClQxNiw5MgpBQ19UUllfTElOS19GVU5DX200X2RlZnVuX3BybyhbJDBdKUFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX0NBTEwoW10sIFskMV0pXSwgWyQyXSwgWyQzXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI2LDEwOAptNF9sb2NhdGlvbihBQ19GVU5DX0NIRUNLKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjE1NgpUMTEsMTQ5Cm00X21hcF9hcmdzbTRfaWYoWyQjXSwgWzBdLCBbbTRfZmF0YWwoWyQwOiB0b28gZmV3IGFyZ3VtZW50czogJCNdKV0sCiAgICAgICBbJCNdLCBbMV0sIFtdLAogICAgICAgWyQjXSwgWzJdLCBbJDEoWyQyXSlbXV0sCiAgICAgICBbX200X2ZvcmVhY2goWyQxKF0sIFspXSwgJEApXSkKVDI2LDEwMQptNF9sb2NhdGlvbihfQUNfQ19TVERfVFJZKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxMTY4ClQxOSwyODgKX200X3NldF9jb250ZW50c18xY200X2lmZGVmKFtfbTRfc2V0KFskMV0pXSwKCSAgW200X3NldF9jb250YWlucyhbJDFdLCBfbTRfZGVmbihbX200X3NldChbJDFdKV0pLAoJCSAgIFttNF9wdXNoZGVmKFtfbTRfc2V0XygkMSldLCBfbTRfZGVmbihbX200X3NldChbJDFdKV0pKV0sCgkJICAgW19tNF9wb3BkZWYoW19tNF9zZXQoWyQxXSxdX200X2RlZm4oCiAgICAgIFtfbTRfc2V0KFskMV0pXSlbKV0pXSlfbTRfcG9wZGVmKFtfbTRfc2V0KFskMV0pXSkkMChbJDFdKV0sCgkgIFtfbTRfcG9wZGVmKFtfbTRfc2V0X2NsZWFudXAoJDEpXSldKQpUNyw2NQpfbTRfbWlubTRfZXZhbCgoKFskMV0pIDwgKFskMl0pKSAqIChbJDFdKSArICgoWyQxXSkgPj0gKFskMl0pKSAqIChbJDJdKSkKVDE1LDIKX0FDX0NDKEZvcnRyYW4pRkMKVDE0LDE4MApBU19IRUxQX1NUUklOR200X3RleHRfd3JhcChbJDJdLCBtNF9jb25kKFtbJDNdXSwgW10sIFsgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCgkJCSAgICBbbTRfZXZhbChbJDNdKzApXSwgWzBdLCBbWyQzXV0sCgkJCSAgICBbbTRfZm9ybWF0KFtbJSpzXV0sIFskM10sIFtdKV0pLAoJICAgICAgbTRfZXhwYW5kKFsgICQxIF0pLCBbJDRdKQpUMTUsNTYKQUNfVFlQRV9JTlQ2NF9UX200X2RlZnVuX3BybyhbJDBdKV9BQ19UWVBFX0lOVCg2NClbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRjgsNQptNF9zaGlmdHNoaWZ0ClQyOCwxMDYKbTRfbG9jYXRpb24oX0FDX1BST0dfRkNfQ19PKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo0MzMKVDM3LDEwNgptNF9sb2NhdGlvbihfQUNfQ0hFQ0tfSEVBREVSX01PTkdSRUwpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjEyOQpUMjcsMTAxCm00X2xvY2F0aW9uKEFDX1BST0dfT0JKQ1hYKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxMDEwClQzOCwxMDYKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihGb3J0cmFuKSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2ZvcnRyYW4ubTQ6MjYyClQxNiw0NTIKX200X3JlcXVpcmVfY2FsbG00X3B1c2hkZWYoW19tNF9kaXZlcnRfZ3Jvd10sIG00X2RlY3IoX200X2RpdmVydF9ncm93KSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0aW5nKFskMV0pXSltNF9wdXNoZGVmKFtfbTRfZGl2ZXJ0aW5nXSwgWyQxXSltNF9kaXZlcnRfcHVzaChfbTRfZGl2ZXJ0X2dyb3csIFstXSltNF9pZihbJDJdLCBbXSwgWyQxXSwgWyQyXSkKbTRfcHJvdmlkZV9pZihbJDFdLCBbbTRfc2V0X3JlbW92ZShbX200X3Byb3ZpZGVdLCBbJDFdKV0sCiAgW200X3dhcm4oW3N5bnRheF0sIFskMSBpcyBtNF9yZXF1aXJlJ2QgYnV0IG5vdCBtNF9kZWZ1bidkXSldKV9tNF9kaXZlcnRfcmF3KCQzKV9tNF91bmRpdmVydChfbTRfZGl2ZXJ0X2dyb3cpbTRfZGl2ZXJ0X3BvcChfbTRfZGl2ZXJ0X2dyb3cpX200X3BvcGRlZihbX200X2RpdmVydF9ncm93XSwKW19tNF9kaXZlcnRpbmcoWyQxXSldLCBbX200X2RpdmVydGluZ10pClQxMSw3MApfbTRfZm9yZWFjaG00X2lmKFskI10sIFszXSwgW10sCiAgICAgICBbJDFbJDRdJDJbXSQwKFskMV0sIFskMl0sIG00X3NoaWZ0MygkQCkpXSkKVDE0LDI4ODMKX0FDX0ZVTkNfVkZPUktfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soZm9yIHdvcmtpbmcgdmZvcmssIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MsCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWy8qIFRoYW5rcyB0byBQYXVsIEVnZ2VydCBmb3IgdGhpcyB0ZXN0LiAgKi8KXUFDX0lOQ0xVREVTX0RFRkFVTFRbCiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojaWZkZWYgSEFWRV9WRk9SS19ICiMgaW5jbHVkZSA8dmZvcmsuaD4KI2VuZGlmCi8qIE9uIHNvbWUgc3BhcmMgc3lzdGVtcywgY2hhbmdlcyBieSB0aGUgY2hpbGQgdG8gbG9jYWwgYW5kIGluY29taW5nCiAgIGFyZ3VtZW50IHJlZ2lzdGVycyBhcmUgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSBwYXJlbnQuICBUaGUgY29tcGlsZXIKICAgaXMgdG9sZCBhYm91dCB0aGlzIHdpdGggI2luY2x1ZGUgPHZmb3JrLmg+LCBidXQgc29tZSBjb21waWxlcnMKICAgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4gIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYQogICBzdGF0aWMgdmFyaWFibGUgd2hvc2UgYWRkcmVzcyBpcyBwdXQgaW50byBhIHJlZ2lzdGVyIHRoYXQgaXMKICAgY2xvYmJlcmVkIGJ5IHRoZSB2Zm9yay4gICovCnN0YXRpYyB2b2lkCiNpZmRlZiBfX2NwbHVzcGx1cwpzcGFyY19hZGRyZXNzX3Rlc3QgKGludCBhcmcpCiMgZWxzZQpzcGFyY19hZGRyZXNzX3Rlc3QgKGFyZykgaW50IGFyZzsKI2VuZGlmCnsKICBzdGF0aWMgcGlkX3QgY2hpbGQ7CiAgaWYgKCFjaGlsZCkgewogICAgY2hpbGQgPSB2Zm9yayAoKTsKICAgIGlmIChjaGlsZCA8IDApIHsKICAgICAgcGVycm9yICgidmZvcmsiKTsKICAgICAgX2V4aXQoMik7CiAgICB9CiAgICBpZiAoIWNoaWxkKSB7CiAgICAgIGFyZyA9IGdldHBpZCgpOwogICAgICB3cml0ZSgtMSwgIiIsIDApOwogICAgICBfZXhpdCAoYXJnKTsKICAgIH0KICB9Cn0KCmludAptYWluICgpCnsKICBwaWRfdCBwYXJlbnQgPSBnZXRwaWQgKCk7CiAgcGlkX3QgY2hpbGQ7CgogIHNwYXJjX2FkZHJlc3NfdGVzdCAoMCk7CgogIGNoaWxkID0gdmZvcmsgKCk7CgogIGlmIChjaGlsZCA9PSAwKSB7CiAgICAvKiBIZXJlIGlzIGFub3RoZXIgdGVzdCBmb3Igc3BhcmMgdmZvcmsgcmVnaXN0ZXIgcHJvYmxlbXMuICBUaGlzCiAgICAgICB0ZXN0IHVzZXMgbG90cyBvZiBsb2NhbCB2YXJpYWJsZXMsIGF0IGxlYXN0IGFzIG1hbnkgbG9jYWwKICAgICAgIHZhcmlhYmxlcyBhcyBtYWluIGhhcyBhbGxvY2F0ZWQgc28gZmFyIGluY2x1ZGluZyBjb21waWxlcgogICAgICAgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvciBnY2MgMS40MC4zIG9uIGEgU29sYXJpcwogICAgICAgNC4xLjMgc3BhcmMsIGJ1dCB3ZSB1c2UgOCB0byBiZSBzYWZlLiAgQSBidWdneSBjb21waWxlciBzaG91bGQKICAgICAgIHJldXNlIHRoZSByZWdpc3RlciBvZiBwYXJlbnQgZm9yIG9uZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLAogICAgICAgc2luY2UgaXQgd2lsbCB0aGluayB0aGF0IHBhcmVudCBjYW4ndCBwb3NzaWJseSBiZSB1c2VkIGFueSBtb3JlCiAgICAgICBpbiB0aGlzIHJvdXRpbmUuICBBc3NpZ25pbmcgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHdpbGwgdGh1cwogICAgICAgbXVuZ2UgcGFyZW50IGluIHRoZSBwYXJlbnQgcHJvY2Vzcy4gICovCiAgICBwaWRfdAogICAgICBwID0gZ2V0cGlkKCksIHAxID0gZ2V0cGlkKCksIHAyID0gZ2V0cGlkKCksIHAzID0gZ2V0cGlkKCksCiAgICAgIHA0ID0gZ2V0cGlkKCksIHA1ID0gZ2V0cGlkKCksIHA2ID0gZ2V0cGlkKCksIHA3ID0gZ2V0cGlkKCk7CiAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAogICAgICAgdXNlIHRoZSBzYW1lIGhhcmR3YXJlIHJlZ2lzdGVyIGZvciBhbGwgOCBsb2NhbCB2YXJpYWJsZXMuICAqLwogICAgaWYgKHAgIT0gcDEgfHwgcCAhPSBwMiB8fCBwICE9IHAzIHx8IHAgIT0gcDQKCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQogICAgICBfZXhpdCgxKTsKCiAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLCB2Zm9yayBkb2Vzbid0IHNlcGFyYXRlIHBhcmVudAogICAgICAgZnJvbSBjaGlsZCBmaWxlIGRlc2NyaXB0b3JzLiAgSWYgdGhlIGNoaWxkIGNsb3NlcyBhIGRlc2NyaXB0b3IKICAgICAgIGJlZm9yZSBpdCBleGVjcyBvciBleGl0cywgdGhpcyBtdW5nZXMgdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IKICAgICAgIGFzIHdlbGwuICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCiAgICBfZXhpdChjbG9zZShmaWxlbm8oc3Rkb3V0KSkgIT0gMCk7CiAgfSBlbHNlIHsKICAgIGludCBzdGF0dXM7CiAgICBzdHJ1Y3Qgc3RhdCBzdDsKCiAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKICAgICAgOwogICAgcmV0dXJuICgKCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwoJIGNoaWxkIDwgMAoKCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCgkgfHwgc3RhdHVzCgoJIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KCSB8fCBwYXJlbnQgIT0gZ2V0cGlkKCkKCgkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KCSB8fCBmc3RhdChmaWxlbm8oc3Rkb3V0KSwgJnN0KSAhPSAwCgkgKTsKICB9Cn1dXSldLAoJICAgIFthY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllc10sCgkgICAgW2FjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm9dLAoJICAgIFthY19jdl9mdW5jX3Zmb3JrX3dvcmtzPWNyb3NzXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDQ5MQpBQ19IRUFERVJfVElNRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbd2hldGhlciB0aW1lLmggYW5kIHN5cy90aW1lLmggbWF5IGJvdGggYmUgaW5jbHVkZWRdLAogIGFjX2N2X2hlYWRlcl90aW1lLApbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHRpbWUuaD4KXSwKW2lmICgoc3RydWN0IHRtICopIDApCnJldHVybiAwO10pXSwKCQkgICBbYWNfY3ZfaGVhZGVyX3RpbWU9eWVzXSwKCQkgICBbYWNfY3ZfaGVhZGVyX3RpbWU9bm9dKV0pCmlmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCiAgQUNfREVGSU5FKFRJTUVfV0lUSF9TWVNfVElNRSwgMSwKCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPgoJICAgICBhbmQgPHRpbWUuaD4uXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDIzCkFDX0RFRklORV9BQ19ERUZJTkVfUShbXyQwXSwgJEApClQyNCwxMDYKbTRfbG9jYXRpb24oX0FDX0ZDX01BSU4pL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mb3J0cmFuLm00OjgzMgpUMTMsMTYwCkFDX0dOVV9TT1VSQ0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfR05VX1NPVVJDRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwxMDcKbTRfbG9jYXRpb24oQUNfTUlOSVgpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo0MzcKVDEwLDY2Cl9BQ19GOTVfRkNnZm9ydHJhbiBnOTUgeGxmOTUgZjk1IGZvcnQgaWZvcnQgaWZjIGVmYyBwZ2ZvcnRyYW4gcGdmOTUgbGY5NSBmdG4KVDksMTgwCkFDX0VOQUJMRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19FTkFCTEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0FSR19FTkFCTEUoWyQxXSwgWyAgLS1lbmFibGUtJDFdLCBbJDJdLCBbJDNdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNjY4CkFDX0NBQ0hFX1ZBTF9tNF9kZWZ1bl9wcm8oWyQwXSlBU19MSVRFUkFMX1dPUkRfSUYoWyQxXSwgW200X2lmKG00X2luZGV4KG00X3F1b3RlKCQxKSwgW19jdl9dKSwgWy0xXSwKCQkJICAgIFtBQ19ESUFHTk9TRShbc3ludGF4XSwKWyQwKCQxLCAuLi4pOiBzdXNwaWNpb3VzIGNhY2hlLWlkLCBtdXN0IGNvbnRhaW4gX2N2XyB0byBiZSBjYWNoZWRdKV0pXSlkbmwKbTRfaWYobTRfaW5kZXgoWyQyXSwgW0FDX0RFRklORV0pLCBbLTFdLCBbXSwKICAgICAgW0FDX0RJQUdOT1NFKFtzeW50YXhdLApbJDAoJDEsIC4uLik6IHN1c3BpY2lvdXMgcHJlc2VuY2Ugb2YgYW4gQUNfREVGSU5FIGluIHRoZSBzZWNvbmQgYXJndW1lbnQsIF1kbmwKW3doZXJlIG5vIGFjdGlvbnMgc2hvdWxkIGJlIHRha2VuXSldKWRubAptNF9pZihtNF9pbmRleChbJDJdLCBbQUNfU1VCU1RdKSwgWy0xXSwgW10sCiAgICAgIFtBQ19ESUFHTk9TRShbc3ludGF4XSwKWyQwKCQxLCAuLi4pOiBzdXNwaWNpb3VzIHByZXNlbmNlIG9mIGFuIEFDX1NVQlNUIGluIHRoZSBzZWNvbmQgYXJndW1lbnQsIF1kbmwKW3doZXJlIG5vIGFjdGlvbnMgc2hvdWxkIGJlIHRha2VuXSldKWRubApBU19WQVJfU0VUX0lGKFskMV0sCgkgICAgICBbX0FTX0VDSE9fTihbKGNhY2hlZCkgXSldLAoJICAgICAgWyQyXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMiwxMDYKbTRfbG9jYXRpb24oQUNfSU5MSU5FKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6NjEKVDcsNjUKX200X21heG00X2V2YWwoKChbJDFdKSA+IChbJDJdKSkgKiAoWyQxXSkgKyAoKFskMV0pIDw9IChbJDJdKSkgKiAoWyQyXSkpClQyOCwxMDcKbTRfbG9jYXRpb24oQUNfRjc3X1dSQVBQRVJTKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDoxMDQ0CkY4LDgKX19maWxlX19fX2ZpbGVfXwpUMTgsMgpfQVNfTElURVJBTF9JRl9ZRVMkMwpUMTAsMTIxCl9BQ19MSUJPQkpjYXNlICIgJExJQkAmdEBPQkpTICIgaW4KICAqIiAkMS4kYWNfb2JqZXh0ICIqICkgOzsKICAqKSBBQ19TVUJTVChbTElCQCZ0QE9CSlNdLCBbIiRMSUJAJnRAT0JKUyAkMS4kYWNfb2JqZXh0Il0pIDs7CmVzYWMKClQyNCw3NwpBQ19MQU5HX0JPT0xfQ09NUElMRV9UUllfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0xBTkdfRElTUEFUQ0goWyQwXSwgX0FDX0xBTkcsICRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpGMTAsNgptNF9icmVnZXhwcmVnZXhwCkY3LDcKcHVzaGRlZnB1c2hkZWYKVDMyLDEwOAptNF9sb2NhdGlvbihBQ19GVU5DX0ZOTUFUQ0hfR05VKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjU4NgpUMzYsMTA1Cm00X2xvY2F0aW9uKEFDX0VSTEFOR19TVUJTVF9MSUJfRElSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjI0MQpUMTUsMzQ1Cl9BQ19DT01QVVRFX0lOVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DT01QVVRFX0lOVChbJDJdLCBbJDFdLCBbJDNdLCBbJDRdKQpBQ19ESUFHTk9TRShbb2Jzb2xldGVdLApbVGhlIG1hY3JvIGBfQUNfQ09NUFVURV9JTlQnIGlzIG9ic29sZXRlIGFuZCB3aWxsIGJlIGRlbGV0ZWQgaW4gYQpmdXR1cmUgdmVyc2lvbiBvciBBdXRvY29uZi4gIEhlbmNlLCBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgdXNlCmluc3RlYWQgdGhlIHB1YmxpYyBBQ19DT01QVVRFX0lOVCBtYWNyby4gIE5vdGUgdGhhdCB0aGUgYXJndW1lbnRzIGFyZQpzbGlnaHRseSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgdHdvLl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsNzYKQUNfUEFUSF9QUk9HX200X2RlZnVuX3BybyhbJDBdKV9BQ19QQVRIX1BST0coJEApCkFDX1NVQlNUKFskMV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzAsMzE2CkFDX0xBTkdfUFJPR1JBTShPYmplY3RpdmUgQysrKSQxCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRjc3X0hPT0tTXSwgW19BQ19MQU5HX1BST0dSQU1fQ19GNzdfSE9PS1NdKVtdZG5sCm00X2lmZGVmKFtfQUNfTEFOR19QUk9HUkFNX0NfRkNfSE9PS1NdLCBbX0FDX0xBTkdfUFJPR1JBTV9DX0ZDX0hPT0tTXSlbXWRubAppbnQKbWFpbiAoKQp7CmRubCBEbyAqbm90KiBpbmRlbnQgdGhlIGZvbGxvd2luZyBsaW5lOiB0aGVyZSBtYXkgYmUgQ1BQIGRpcmVjdGl2ZXMuCmRubCBEb24ndCBtb3ZlIHRoZSBgOycgcmlnaHQgYWZ0ZXIgZm9yIHRoZSBzYW1lIHJlYXNvbi4KJDIKICA7CiAgcmV0dXJuIDA7Cn0KVDE0LDEzODAKQUNfRlVOQ19BTExPQ0FfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfVFlQRV9TSVpFX1RdKSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCiMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCkFDX0NBQ0hFX0NIRUNLKFtmb3Igd29ya2luZyBhbGxvY2EuaF0sIGFjX2N2X3dvcmtpbmdfYWxsb2NhX2gsCltBQ19MSU5LX0lGRUxTRSgKICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW1tAJTpAaW5jbHVkZSA8YWxsb2NhLmg+XV0sCgkJCVtbY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMiAqIHNpemVvZiAoaW50KSk7CgkJCSAgaWYgKHApIHJldHVybiAwO11dKV0sCgkJW2FjX2N2X3dvcmtpbmdfYWxsb2NhX2g9eWVzXSwKCQlbYWNfY3Zfd29ya2luZ19hbGxvY2FfaD1ub10pXSkKaWYgdGVzdCAkYWNfY3Zfd29ya2luZ19hbGxvY2FfaCA9IHllczsgdGhlbgogIEFDX0RFRklORShIQVZFX0FMTE9DQV9ILCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZAoJICAgICAobm90IG9uIFVsdHJpeCkuXSkKZmkKCkFDX0NBQ0hFX0NIRUNLKFtmb3IgYWxsb2NhXSwgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKApbWyNpZmRlZiBfX0dOVUNfXwojIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQojZWxzZQojIGlmZGVmIF9NU0NfVkVSCiMgIGluY2x1ZGUgPG1hbGxvYy5oPgojICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKIyBlbHNlCiMgIGlmZGVmIEhBVkVfQUxMT0NBX0gKIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgojICBlbHNlCiMgICBpZmRlZiBfQUlYCiAjcHJhZ21hIGFsbG9jYQojICAgZWxzZQojICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCnZvaWQgKmFsbG9jYSAoc2l6ZV90KTsKIyAgICBlbmRpZgojICAgZW5kaWYKIyAgZW5kaWYKIyBlbmRpZgojZW5kaWYKXV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSAoMSk7CgkJCQkgICAgaWYgKHApIHJldHVybiAwO11dKV0sCgkJW2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllc10sCgkJW2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vXSldKQoKaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9BTExPQ0EsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIGBhbGxvY2EnLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLl0pCmVsc2UKICBfQUNfTElCT0JKX0FMTE9DQQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE1LDY4CkFDX0NPTkZJR19MSU5LU19tNF9kZWZ1bl9wcm8oWyQwXSlfQUNfQ09ORklHX0ZPT1MoW0xJTktTXSwgJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMSwxMDkKbTRfbG9jYXRpb24oQUNfV0FJVDMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MjAzNApUMjMsMjA4CkFDX1NZU19TSUdMSVNUX0RFQ0xBUkVEX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NZU19TSUdMSVNUX0RFQ0xBUkVEJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX0RFQ0xfU1lTX1NJR0xJU1RdLCBbQUNfREVDTF9TWVNfU0lHTElTVCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTksMTI4MQpBQ19FUkxBTkdfQ0hFQ0tfTElCX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0VSTEFOR19QQVRIX0VSTENdKVtdZG5sCkFDX1JFUVVJUkUoW0FDX0VSTEFOR19QQVRIX0VSTF0pW11kbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBFcmxhbmcvT1RQICckMScgbGlicmFyeSBzdWJkaXJlY3RvcnldLAogICAgW2FjX2N2X2VybGFuZ19saWJfZGlyXyQxXSwKICAgIFtBQ19MQU5HX1BVU0goRXJsYW5nKVtdZG5sCiAgICAgQUNfUlVOX0lGRUxTRSgKCVtBQ19MQU5HX1BST0dSQU0oW10sIFtkbmwKCSAgICBSZXR1cm5WYWx1ZSA9IGNhc2UgY29kZTpsaWJfZGlyKCJbJDFdIikgb2YKCSAgICB7ZXJyb3IsIGJhZF9uYW1lfSAtPgoJCWZpbGU6d3JpdGVfZmlsZSgiY29uZnRlc3Qub3V0IiwgIm5vdCBmb3VuZFxuIiksCgkJMTsKCSAgICBMaWJEaXIgLT4KCQlmaWxlOndyaXRlX2ZpbGUoImNvbmZ0ZXN0Lm91dCIsIExpYkRpciksCgkJMAoJICAgIGVuZCwKCSAgICBoYWx0KFJldHVyblZhbHVlKV0pXSwKCVthY19jdl9lcmxhbmdfbGliX2Rpcl8kMT1gY2F0IGNvbmZ0ZXN0Lm91dGAKCSBybSAtZiBjb25mdGVzdC5vdXRdLAoJW2lmIHRlc3QgISAtZiBjb25mdGVzdC5vdXQ7IHRoZW4KCSAgICAgQUNfTVNHX0ZBSUxVUkUoW3Rlc3QgRXJsYW5nIHByb2dyYW0gZXhlY3V0aW9uIGZhaWxlZF0pCgkgZWxzZQoJICAgICBhY19jdl9lcmxhbmdfbGliX2Rpcl8kMT0ibm90IGZvdW5kIgoJICAgICBybSAtZiBjb25mdGVzdC5vdXQKCSBmaV0pCiAgICAgQUNfTEFOR19QT1AoRXJsYW5nKVtdZG5sCiAgICBdKQpBQ19DQUNIRV9DSEVDSyhbZm9yIEVybGFuZy9PVFAgJyQxJyBsaWJyYXJ5IHZlcnNpb25dLAogICAgW2FjX2N2X2VybGFuZ19saWJfdmVyXyQxXSwKICAgIFtBU19JRihbdGVzdCAiJGFjX2N2X2VybGFuZ19saWJfZGlyXyQxIiA9ICJub3QgZm91bmQiXSwKCVthY19jdl9lcmxhbmdfbGliX3Zlcl8kMT0ibm90IGZvdW5kIl0sCglbYWNfY3ZfZXJsYW5nX2xpYl92ZXJfJDE9YEFTX0VDSE8oWyIkYWNfY3ZfZXJsYW5nX2xpYl9kaXJfJDEiXSkgfCBzZWQgLW4gLWUgJ3MsXi4qLVwoW1teLy1dXSpcKSQsXDEscCdgXSlbXWRubAogICAgXSkKQUNfU1VCU1QoW0VSTEFOR19MSUJfRElSXyQxXSwgWyRhY19jdl9lcmxhbmdfbGliX2Rpcl8kMV0pCkFDX1NVQlNUKFtFUkxBTkdfTElCX1ZFUl8kMV0sIFskYWNfY3ZfZXJsYW5nX2xpYl92ZXJfJDFdKQpBU19JRihbdGVzdCAiJGFjX2N2X2VybGFuZ19saWJfZGlyXyQxIiA9ICJub3QgZm91bmQiXSwgWyQzXSwgWyQyXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMiwxMDYKbTRfbG9jYXRpb24oQUNfREVDTF9TWVNfU0lHTElTVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQxClQxNCwxMDMKX0FTX1RSX1BSRVBBUkVfbTRfZGVmdW5fcHJvKFskMF0pQVNfUkVRVUlSRShbX0FTX1RSX1NIX1BSRVBBUkVdKUFTX1JFUVVJUkUoW19BU19UUl9DUFBfUFJFUEFSRV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw4MQpfQUhfQ0hFQ0tfRlVOQ0FIX1RFTVBMQVRFKEFTX1RSX0NQUChbSEFWRV8kMV0pLAogIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYCQxJyBmdW5jdGlvbi5dKQpUMTgsODMwCkFDX1NUUlVDVF9USU1FWk9ORV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19TVFJVQ1RfVE1dKWRubApBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3QgdG0udG1fem9uZV0sLCxbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8JGFjX2N2X3N0cnVjdF90bT4KXSkKaWYgdGVzdCAiJGFjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZSIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoSEFWRV9UTV9aT05FLCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3VyIGBzdHJ1Y3QgdG0nIGhhcyBgdG1fem9uZScuIERlcHJlY2F0ZWQsIHVzZQoJICAgICBgSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORScgaW5zdGVhZC5dKQplbHNlCiAgQUNfQ0hFQ0tfREVDTFMoW3R6bmFtZV0sICwgLCBbI2luY2x1ZGUgPHRpbWUuaD5dKQogIEFDX0NBQ0hFX0NIRUNLKGZvciB0em5hbWUsIGFjX2N2X3Zhcl90em5hbWUsCltBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKApbWyNpbmNsdWRlIDx0aW1lLmg+CiNpZiAhSEFWRV9ERUNMX1RaTkFNRQpleHRlcm4gY2hhciAqdHpuYW1lW107CiNlbmRpZgpdXSwKW1tyZXR1cm4gdHpuYW1lWzBdWzBdO11dKV0sCgkJW2FjX2N2X3Zhcl90em5hbWU9eWVzXSwKCQlbYWNfY3ZfdmFyX3R6bmFtZT1ub10pXSkKICBpZiB0ZXN0ICRhY19jdl92YXJfdHpuYW1lID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoSEFWRV9UWk5BTUUsIDEsCgkgICAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGRvbid0IGhhdmUgYHRtX3pvbmUnIGJ1dCBkbyBoYXZlIHRoZSBleHRlcm5hbAoJICAgICAgIGFycmF5IGB0em5hbWUnLl0pCiAgZmkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSwxMDEKbTRfbG9jYXRpb24oQUNfQ19DSEFSX1VOU0lHTkVEKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxNDE3ClQyNCwzCl9tNF9kaXZlcnQoSEVMUF9WQVJfRU5EKTEwNQpUMTAsMjQKQU5fTElCUkFSWUFOX09VVFBVVChbbGlicmFyeV0sICRAKQpUMTEsMjUKQU5fRlVOQ1RJT05BTl9PVVRQVVQoW2Z1bmN0aW9uXSwgJEApClQzOSwxMDcKbTRfbG9jYXRpb24oQUNfRElTQUJMRV9PUFRJT05fQ0hFQ0tJTkcpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0OTgKVDEyLDQ3CkFTX1ZBUl9BUklUSGFzX2ZuX2FyaXRoICQyICYmIEFTX1ZBUl9TRVQoWyQxXSwgWyRhc192YWxdKVtdClQxMiwxOTcKQVNfVkFSX0FSSVRIX200X2RlZnVuX3BybyhbJDBdKV9BU19ERVRFQ1RfU1VHR0VTVEVEKFtfQVNfVkFSX0FSSVRIX1dPUktTXSlBU19SRVFVSVJFKFtfQVNfVkFSX0FSSVRIX1BSRVBBUkVdLCBbXSwgW000U0gtSU5JVC1GTl0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDgyCkFTX0RJUk5BTUUkYXNfZGlybmFtZSAtLSAkMSB8fApfQVNfRElSTkFNRV9FWFBSKFskMV0pIDI+L2Rldi9udWxsIHx8Cl9BU19ESVJOQU1FX1NFRChbJDFdKVtdClQxMCwxMjQKQVNfRElSTkFNRV9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfJDBfUFJFUEFSRV0pW11fbTRfcG9wZGVmKFskMF0pbTRfaW5kaXIoWyQwXW00X2lmKFskI10sIFswXSwgW10sIFssJEBdKSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDMwNApBQ19FUkxBTkdfUEFUSF9FUkxDX200X2RlZnVuX3BybyhbJDBdKUFDX0FSR19WQVIoW0VSTENdLCBbRXJsYW5nL09UUCBjb21waWxlciBjb21tYW5kIFthdXRvZGV0ZWN0ZWRdXSlkbmwKaWYgdGVzdCAtbiAiJEVSTEMiOyB0aGVuCiAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBlcmxjXSkKICAgIEFDX01TR19SRVNVTFQoWyRFUkxDXSkKZWxzZQogICAgQUNfUEFUSF9UT09MKEVSTEMsIGVybGMsIFskMV0sIFskMl0pCmZpCkFDX0FSR19WQVIoW0VSTENGTEFHU10sIFtFcmxhbmcvT1RQIGNvbXBpbGVyIGZsYWdzIFtub25lXV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjUsMTA5Cm00X2xvY2F0aW9uKEFDX0ZVTkNfU1RBVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxNTI5ClQxMiwzNDUKQUNfUEFUSF9UT09MX200X2RlZnVuX3BybyhbJDBdKWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICBBQ19QQVRIX1BST0coWyQxXSwgWyR7YWNfdG9vbF9wcmVmaXh9JDJdLCAsIFskNF0pCmZpCmlmIHRlc3QgLXogIiRhY19jdl9wYXRoXyQxIjsgdGhlbgogIGFjX3B0XyQxPSQkMQogIF9BQ19QQVRIX1BST0coW2FjX3B0XyQxXSwgWyQyXSwgW10sIFskNF0pCiAgaWYgdGVzdCAieCRhY19wdF8kMSIgPSB4OyB0aGVuCiAgICAkMT0iJDMiCiAgZWxzZQogICAgX0FDX1RPT0xfV0FSTgogICAgJDE9JGFjX3B0XyQxCiAgZmkKZWxzZQogICQxPSIkYWNfY3ZfcGF0aF8kMSIKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw0OTkKQUNfQ0FDSEVfTE9BRGlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgogICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsIGZpbGVzCiAgIyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuICBESkdQUCBlbXVsYXRlcyBpdCBhcyBhIHJlZ3VsYXIgZmlsZS4KICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgogICAgQUNfTVNHX05PVElDRShbbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZV0pCiAgICBjYXNlICRjYWNoZV9maWxlIGluCiAgICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKiApIC4gIiRjYWNoZV9maWxlIjs7CiAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKICAgIGVzYWMKICBmaQplbHNlCiAgQUNfTVNHX05PVElDRShbY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGVdKQogID4kY2FjaGVfZmlsZQpmaQoKVDI0LDEwMAptNF9sb2NhdGlvbihBQ19QUk9HX0NYWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6Njk0ClQxMCw1MjAKX0FDX1BBVEhfWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9WQUwoYWNfY3ZfaGF2ZV94LApbIyBPbmUgb3IgYm90aCBvZiB0aGUgdmFycyBhcmUgbm90IHNldCwgYW5kIHRoZXJlIGlzIG5vIGNhY2hlZCB2YWx1ZS4KYWNfeF9pbmNsdWRlcz1ubyBhY194X2xpYnJhcmllcz1ubwpfQUNfUEFUSF9YX1hNS01GCl9BQ19QQVRIX1hfRElSRUNUCmNhc2UgJGFjX3hfaW5jbHVkZXMsJGFjX3hfbGlicmFyaWVzIGluICMoCiAgbm8sKiB8ICosbm8gfCAqXCcqKQogICAgIyBEaWRuJ3QgZmluZCBYLCBvciBhIGRpcmVjdG9yeSBoYXMgIiciIGluIGl0cyBuYW1lLgogICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9bm8iOzsgIygKICAqKQogICAgIyBSZWNvcmQgd2hlcmUgd2UgZm91bmQgWCBmb3IgdGhlIGNhY2hlLgogICAgYWNfY3ZfaGF2ZV94PSJoYXZlX3g9eWVzXAoJYWNfeF9pbmNsdWRlcz0nJGFjX3hfaW5jbHVkZXMnXAoJYWNfeF9saWJyYXJpZXM9JyRhY194X2xpYnJhcmllcyciCmVzYWNdKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDI3MgpfQUNfRE9fRUNIT19tNF9kZWZ1bl9wcm8oWyQwXSltNF9pZihbJDFdLCBbJGFjX3RyeV0sIFtdLCBbYWNfdHJ5PSIkMSIKXSlbY2FzZSAiKCgkYWNfdHJ5IiBpbgogICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwogICopIGFjX3RyeV9lY2hvPSRhY190cnk7Owplc2FjCmV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiXQpBU19FQ0hPKFsiJGFjX3RyeV9lY2hvIl0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQ4LDE4OQpBQ19GRF9DQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GRF9DQycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBU19NRVNTQUdFX0xPR19GRF0sIFtBU19NRVNTQUdFX0xPR19GRCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsODk5CkFDX0ZDX1NSQ0VYVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKQUNfQ0FDSEVfQ0hFQ0soW2ZvciBGb3J0cmFuIGZsYWcgdG8gY29tcGlsZSAuJDEgZmlsZXNdLAoJCWFjX2N2X2ZjX3NyY2V4dF8kMSwKW2FjX2V4dD0kMQphY19mY2ZsYWdzX3NyY2V4dF9zYXZlPSRhY19mY2ZsYWdzX3NyY2V4dAphY19mY2ZsYWdzX3NyY2V4dD0KYWNfY3ZfZmNfc3JjZXh0XyQxPXVua25vd24KZm9yIGFjX2ZsYWcgaW4gbm9uZSAtcXN1ZmZpeD1mPSQxIC1UZjsgZG8KICB0ZXN0ICJ4JGFjX2ZsYWciICE9IHhub25lICYmIGFjX2ZjZmxhZ3Nfc3JjZXh0PSIkYWNfZmxhZyIKICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKCldLCBbYWNfY3ZfZmNfc3JjZXh0XyQxPSRhY19mbGFnOyBicmVha10pCmRvbmUKcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kMQphY19mY2ZsYWdzX3NyY2V4dD0kYWNfZmNmbGFnc19zcmNleHRfc2F2ZQpdKQppZiB0ZXN0ICJ4JGFjX2N2X2ZjX3NyY2V4dF8kMSIgPSB4dW5rbm93bjsgdGhlbgogIG00X2RlZmF1bHQoWyQzXSxbQUNfTVNHX0VSUk9SKFtGb3J0cmFuIGNvdWxkIG5vdCBjb21waWxlIC4kMSBmaWxlc10pXSkKZWxzZQogIGFjX2ZjX3NyY2V4dD0kMQogIGlmIHRlc3QgIngkYWNfY3ZfZmNfc3JjZXh0XyQxIiA9IHhub25lOyB0aGVuCiAgICBhY19mY2ZsYWdzX3NyY2V4dD0iIgogICAgRkNGTEFHU19bXSQxW109IiIKICBlbHNlCiAgICBhY19mY2ZsYWdzX3NyY2V4dD0kYWNfY3ZfZmNfc3JjZXh0XyQxCiAgICBGQ0ZMQUdTX1tdJDFbXT0kYWNfY3ZfZmNfc3JjZXh0XyQxCiAgZmkKICBBQ19TVUJTVChGQ0ZMQUdTX1tdJDEpCiAgJDIKZmkKQUNfTEFOR19QT1AoRm9ydHJhbilkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMywxMDIKbTRfbG9jYXRpb24oX0FTX0JBU0VOQU1FX1BSRVBBUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9tNHN1Z2FyL200c2gubTQ6OTIxClQyNSwxMDcKbTRfbG9jYXRpb24oX0FDX0RPX0xJTUlUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDEzClQyNywxMDYKbTRfbG9jYXRpb24oQUNfTE9OR19ET1VCTEUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo2MwpUMzksMTAxCm00X2xvY2F0aW9uKEFDX0NfRkxFWElCTEVfQVJSQVlfTUVNQkVSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDoxODM3ClQyMywxMDYKX0FIX0NIRUNLX0hFQURFUl9ESVJFTlRBSF9URU1QTEFURShBU19UUl9DUFAoW0hBVkVfJDFdKSwKICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDwkMT4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLl0pClQxOCw2NwpBQ19MQU5HX0NPTkZURVNUKCljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkFDX0xBTkdfREVGSU5FU19QUk9WSURFRFtdJDEKX0FDRU9GClQxOSwxODgKQUNfRVJMQU5HX05FRURfRVJMQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19FUkxBTkdfUEFUSF9FUkxDKFtub3QgZm91bmRdLCBbJDFdKQppZiB0ZXN0ICIkRVJMQyIgPSAibm90IGZvdW5kIjsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtFcmxhbmcvT1RQIGNvbXBpbGVyIChlcmxjKSBub3QgZm91bmQgYnV0IHJlcXVpcmVkXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyMCwzCl9BQ19MQU5HX0FCQlJFVihDKyspY3h4ClQyNiwxMDcKbTRfbG9jYXRpb24oQUNfQVJHX0VOQUJMRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTQ2MwpUMzQsMTIyCl9BQ19MQU5HX0lPX1BST0dSQU0oT2JqZWN0aXZlIEMrKylBQ19MQU5HX1BST0dSQU0oW0AlOkBpbmNsdWRlIDxzdGRpby5oPl0sCltGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC5vdXQiLCAidyIpOwogcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwpdKQpUMTQsNDA4CkFDX0NIRUNLX1RPT0xTX200X2RlZnVuX3BybyhbJDBdKWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICBmb3IgYWNfcHJvZyBpbiAkMgogIGRvCiAgICBBQ19DSEVDS19QUk9HKFskMV0sCgkJICBbJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ddLCBbJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ddLCwKCQkgIFskNF0pCiAgICB0ZXN0IC1uICIkJDEiICYmIGJyZWFrCiAgZG9uZQpmaQppZiB0ZXN0IC16ICIkJDEiOyB0aGVuCiAgYWNfY3RfJDE9JCQxCiAgQUNfQ0hFQ0tfUFJPR1MoW2FjX2N0XyQxXSwgWyQyXSwgW10sIFskNF0pCiAgaWYgdGVzdCAieCRhY19jdF8kMSIgPSB4OyB0aGVuCiAgICAkMT0iJDMiCiAgZWxzZQogICAgX0FDX1RPT0xfV0FSTgogICAgJDE9JGFjX2N0XyQxCiAgZmkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMyw0MgptNF9tYXBhbGxfc2VwbTRfaWYoWyQzXSwgW10sIFtdLCBbXyQwKFskMV0sIFskMl0sICQzKV0pClQyNSwxMDMKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfTElCKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvbGlicy5tNDoxMDAKVDIxLDEwNwptNF9sb2NhdGlvbihfQUNfRVZBTCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjQyMwpGMTEsMTEKY2hhbmdlcXVvdGVjaGFuZ2VxdW90ZQpUMTYsMTE4Cl9BQ19SRVBMQUNFX0ZVTkNBQ19DSEVDS19GVU5DKFskMV0sCiAgW19BSF9DSEVDS19GVU5DKFskMV0pQUNfREVGSU5FKEFTX1RSX0NQUChbSEFWRV8kMV0pKV0sCiAgW19BQ19MSUJPQkooWyQxXSlBQ19MSUJTT1VSQ0UoWyQxLmNdKV0pClQxMCwxOTEKQUNfU1RfUkRFVl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19TVF9SREVWJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubAptNF9pZigkIywgMCwgW0FDX1NUUlVDVF9TVF9SREVWXSwgW0FDX1NUUlVDVF9TVF9SREVWKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwxMDcKbTRfbG9jYXRpb24oQUNfUFJPR19MTl9TKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvcHJvZ3JhbXMubTQ6ODAwClQ5LDI2Cm00X2lmbmRlZm00X2lmZGVmKFskMV0sIFskM10sIFskMl0pClQxOCwxNDQKQVNfVkVSU0lPTl9DT01QQVJFYXNfYXJnX3YxPSQxCmFzX2FyZ192Mj0kMgphd2sgIiRhc19hd2tfc3RydmVyc2NtcCIgdjE9IiRhc19hcmdfdjEiIHYyPSIkYXNfYXJnX3YyIiAvZGV2L251bGwKQVNfQ0FTRShbJD9dLAoJWzFdLCBbJDNdLAoJWzBdLCBbJDRdLAoJWzJdLCBbJDVdKVtdClQxOCwxMjQKQVNfVkVSU0lPTl9DT01QQVJFX200X2RlZnVuX3BybyhbJDBdKUFTX1JFUVVJUkUoW18kMF9QUkVQQVJFXSlbXV9tNF9wb3BkZWYoWyQwXSltNF9pbmRpcihbJDBdbTRfaWYoWyQjXSwgWzBdLCBbXSwgWywkQF0pKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsMTAzCm00X2xvY2F0aW9uKEFDX09CSkVYVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6NDkyClQyNiwxMDkKbTRfbG9jYXRpb24oQUNfRlVOQ19WRk9SSykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDoxOTQ4ClQxMyw0NwptNF9jb3B5X2ZvcmNlbTRfaWZkZWYoWyQyXSwgW19tNF91bmRlZmluZShbJDJdKV0pbTRfY29weSgkQCkKVDMyLDEyMgpfQUNfTEFOR19JT19QUk9HUkFNKE9iamVjdGl2ZSBDKUFDX0xBTkdfUFJPR1JBTShbQCU6QGluY2x1ZGUgPHN0ZGlvLmg+XSwKW0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CiByZXR1cm4gZmVycm9yIChmKSB8fCBmY2xvc2UgKGYpICE9IDA7Cl0pClQyNywxMDkKbTRfbG9jYXRpb24oQU1fRlVOQ19TVFJUT0QpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTYyMwpUMjcsMTA4Cm00X2xvY2F0aW9uKEFDX0ZVTkNfRlNFRUtPKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjYwNQpUMjQsNDk1Cl9BQ19DSEVDS19IRUFERVJfUFJFUFJPQ19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFX1NIRUxMX0ZOKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19oZWFkZXJfcHJlcHJvY10sCiAgW0FTX0ZVTkNUSU9OX0RFU0NSSUJFKFthY19mbl9dX0FDX0xBTkdfQUJCUkVWW19jaGVja19oZWFkZXJfcHJlcHJvY10sCiAgICBbTElORU5PIEhFQURFUiBWQVJdLAogICAgW1Rlc3RzIHdoZXRoZXIgSEVBREVSIGlzIHByZXNlbnQsIHNldHRpbmcgdGhlIGNhY2hlIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS5dKV0sCiAgWyQwX0JPRFldKUFTX1ZBUl9QVVNIREVGKFthY19IZWFkZXJdLCBbYWNfY3ZfaGVhZGVyXyQxXSlhY19mbl9bXV9BQ19MQU5HX0FCQlJFVltdX2NoZWNrX2hlYWRlcl9wcmVwcm9jICIkTElORU5PIiAiJDEiICJhY19IZWFkZXIiCkFTX1ZBUl9JRihbYWNfSGVhZGVyXSwgW3llc10sIFskMl0sIFskM10pCkFTX1ZBUl9QT1BERUYoW2FjX0hlYWRlcl0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjksNjYKQUNfTEFOR19DT01QSUxFUihPYmplY3RpdmUgQylfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19PQkpDXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDgsMTIKQUNfRkFUQUxtNF9mYXRhbCgkQCkKVDIyLDEwNgptNF9sb2NhdGlvbihBQ19GSU5EX1gpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9vbGRuYW1lcy5tNDo1NwpUMjIsMTA3Cm00X2xvY2F0aW9uKEFDX0NZR1dJTikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjMxNwpUNywxMDgKbTRfam9pbm00X2lmKFskI10sIFsxXSwgW10sCiAgICAgICBbJCNdLCBbMl0sIFtbJDJdXSwKICAgICAgIFttNF9pZihbJDJdLCBbXSwgW10sIFtbJDJdX10pJDAoWyQxXSwgbTRfc2hpZnQyKCRAKSldKQpUMjMsMjk0MgpfQVNfREVURUNUX0JFVFRFUl9TSEVMTF9tNF9kZWZ1bl9wcm8oWyQwXSltNF9zZXRfbWFwKFtfQVNfREVURUNUX1NVR0dFU1RFRF9CT0RZXSwgW19BU19ERVRFQ1RfU1VHR0VTVEVEX1BSVU5FXSltNF9wdXNoZGVmKFtBU19FWElUXSwgW2V4aXQgbTRfZGVmYXVsdChdbTRfZHF1b3RlKFskXVsxXSlbLCAxKV0paWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgogIGFzX2JvdXJuZV9jb21wYXRpYmxlPSJBU19FU0NBUEUoX200X2V4cGFuZChbX0FTX0JPVVJORV9DT01QQVRJQkxFXSkpIgogIF9BU19ERVRFQ1RfRVhQQU5EKFthc19yZXF1aXJlZF0sIFtfQVNfREVURUNUX1JFUVVJUkVEX0JPRFldKQogIF9BU19ERVRFQ1RfRVhQQU5EKFthc19zdWdnZXN0ZWRdLCBbX0FTX0RFVEVDVF9TVUdHRVNURURfQk9EWV0pCiAgQVNfSUYoW19BU19SVU4oWyIkYXNfcmVxdWlyZWQiXSldLAoJW2FzX2hhdmVfcmVxdWlyZWQ9eWVzXSwKCVthc19oYXZlX3JlcXVpcmVkPW5vXSkKICBBU19JRihbdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIF9BU19SVU4oWyIkYXNfc3VnZ2VzdGVkIl0pXSwKICAgIFtdLAogICAgW19BU19QQVRIX1dBTEsoWy9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIXSwKICAgICAgW2Nhc2UgJGFzX2RpciBpbiBAJTpAKAoJIC8qKQoJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwoJICAgICAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCgkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKCSAgICAgQVNfSUYoW3sgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgoJCSAgICBfQVNfUlVOKFsiJGFzX3JlcXVpcmVkIl0sIFsiJGFzX3NoZWxsIl0pXSwKCQkgICBbQ09ORklHX1NIRUxMPSRhc19zaGVsbCBhc19oYXZlX3JlcXVpcmVkPXllcwoJCSAgIG00X3NldF9lbXB0eShbX0FTX0RFVEVDVF9TVUdHRVNURURfQk9EWV0sIFticmVhayAyXSwKCQkgICAgIFtBU19JRihbX0FTX1JVTihbIiRhc19zdWdnZXN0ZWQiXSwgWyIkYXNfc2hlbGwiXSldLAoJCQkgICAgW2JyZWFrIDJdKV0pXSkKCSAgIGRvbmU7OwogICAgICAgZXNhY10sCiAgICAgIFtBU19JRihbeyB0ZXN0IC1mICIkU0hFTEwiIHx8IHRlc3QgLWYgIiRTSEVMTC5leGUiOyB9ICYmCgkgICAgICBfQVNfUlVOKFsiJGFzX3JlcXVpcmVkIl0sIFsiJFNIRUxMIl0pXSwKCSAgICAgW0NPTkZJR19TSEVMTD0kU0hFTEwgYXNfaGF2ZV9yZXF1aXJlZD15ZXNdKV0pCgogICAgICBBU19JRihbdGVzdCAieCRDT05GSUdfU0hFTEwiICE9IHhdLAoJWyMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCgkjIG5ldXRyYWxpemF0aW9uIHZhbHVlIGZvciBzaGVsbHMgd2l0aG91dCB1bnNldDsgYW5kIHRoaXMgYWxzbwoJIyB3b3JrcyBhcm91bmQgc2hlbGxzIHRoYXQgY2Fubm90IHVuc2V0IG5vbmV4aXN0ZW50IHZhcmlhYmxlcy4KCSMgUHJlc2VydmUgLXYgYW5kIC14IHRvIHRoZSByZXBsYWNlbWVudCBzaGVsbC4KCUJBU0hfRU5WPS9kZXYvbnVsbAoJRU5WPS9kZXYvbnVsbAoJKHVuc2V0IEJBU0hfRU5WKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQkFTSF9FTlYgRU5WCglleHBvcnQgQ09ORklHX1NIRUxMCgljYXNlICQtIGluIEAlOkAgKCgoKAoJICAqdip4KiB8ICp4KnYqICkgYXNfb3B0cz0tdnggOzsKCSAgKnYqICkgYXNfb3B0cz0tdiA7OwoJICAqeCogKSBhc19vcHRzPS14IDs7CgkgICogKSBhc19vcHRzPSA7OwoJZXNhYwoJZXhlYyAiJENPTkZJR19TSEVMTCIgJGFzX29wdHMgIiRhc19teXNlbGYiICR7MSsiJFtAXSJ9XSkKCmRubCBVbmZvcnR1bmF0ZWx5LCAkYXNfbWUgaXNuJ3QgYXZhaWxhYmxlIGhlcmUuCiAgICBBU19JRihbdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4bm9dLAogICAgICBbQVNfRUNITyhbIiRbXTA6IFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwiXSkKICBBU19FQ0hPKFsiJFtdMDogdGhlIHNoZWxscyB0aGF0IEkgZm91bmQgb24geW91ciBzeXN0ZW0uIl0pCiAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KICAgIEFTX0VDSE8oWyIkW10wOiBJbiBwYXJ0aWN1bGFyLCB6c2ggJFpTSF9WRVJTSU9OIGhhcyBidWdzIGFuZCBzaG91bGQiXSkKICAgIEFTX0VDSE8oWyIkW10wOiBiZSB1cGdyYWRlZCB0byB6c2ggNC4zLjQgb3IgbGF0ZXIuIl0pCiAgZWxzZQogICAgQVNfRUNITygibTRfdGV4dF93cmFwKFtQbGVhc2UgdGVsbCBdX200X2RlZm4oW200X1BBQ0tBR0VfQlVHUkVQT1JUXSkKbTRfaWZzZXQoW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSwgW200X2lmKF9tNF9kZWZuKFttNF9QQUNLQUdFX0JVR1JFUE9SVF0pLApfbTRfZGVmbihbQUNfUEFDS0FHRV9CVUdSRVBPUlRdKSwgW10sIFthbmQgX200X2RlZm4oW0FDX1BBQ0tBR0VfQlVHUkVQT1JUXSldKV0pClthYm91dCB5b3VyIHN5c3RlbSwgaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4KVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4gdGhlIHNjcmlwdCB1bmRlciBzdWNoIGEKc2hlbGwgaWYgeW91IGRvIGhhdmUgb25lLl0sIFskW10wOiBdLCBbXSwgWzYyXSkiKQogIGZpCiAgQVNfRVhJVF0pXSkKZmkKU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KZXhwb3J0IFNIRUxMCiMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgpDTElDT0xPUl9GT1JDRT0gR1JFUF9PUFRJT05TPQp1bnNldCBDTElDT0xPUl9GT1JDRSBHUkVQX09QVElPTlMKX200X3BvcGRlZihbQVNfRVhJVF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNCw3MzI4Cl9BQ19PVVRQVVRfRklMRVNfUFJFUEFSRSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCmlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCgpkbmwgRm9yIEFDX1NVQlNUX0ZJTEUsIGNoZWNrIGZvciB1c2FibGUgZ2V0bGluZSBzdXBwb3J0IGluIGF3aywKZG5sIGF0IGNvbmZpZy5zdGF0dXMgZXhlY3V0aW9uIHRpbWUuCmRubCBPdGhlcndpc2UsIGRvIHRoZSBpbnRlcnBvbGF0aW9uIGluIHNoLCB3aGljaCBpcyBzbG93ZXIuCmRubCBXaXRob3V0IGFueSBBQ19TVUJTVF9GSUxFLCBvbWl0IGFsbCByZWxhdGVkIGNvZGUuCmRubCBOb3RlIHRoZSBleHBhbnNpb24gaXMgZG91YmxlLXF1b3RlZCBmb3IgcmVhZGFiaWxpdHkuCm00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbW2lmICRBV0sgJ0JFR0lOIHsgZ2V0bGluZSA8Ii9kZXYvbnVsbCIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgogIGFjX2NzX2F3a19nZXRsaW5lPToKICBhY19jc19hd2tfcGlwZV9pbml0PQogIGFjX2NzX2F3a19yZWFkX2ZpbGU9JwogICAgICB3aGlsZSAoKGdldGxpbmUgYWxpbmUgPCAoRltrZXldKSkgPiAwKQoJcHJpbnQoYWxpbmUpCiAgICAgIGNsb3NlKEZba2V5XSknCiAgYWNfY3NfYXdrX3BpcGVfZmluaT0KZWxzZQogIGFjX2NzX2F3a19nZXRsaW5lPWZhbHNlCiAgYWNfY3NfYXdrX3BpcGVfaW5pdD0icHJpbnQgXCJjYXQgPDwnfCNfISFfI3wnICYmXCIiCiAgYWNfY3NfYXdrX3JlYWRfZmlsZT0nCiAgICAgIHByaW50ICJ8I18hIV8jfCIKICAgICAgcHJpbnQgImNhdCAiIEZba2V5XSAiICYmIgogICAgICAnJGFjX2NzX2F3a19waXBlX2luaXQKICAjIFRoZSBmaW5hbCBgOicgZmluaXNoZXMgdGhlIEFORCBsaXN0LgogIGFjX2NzX2F3a19waXBlX2Zpbmk9J0VORCB7IHByaW50ICJ8I18hIV8jfCI7IHByaW50ICI6IiB9JwpmaV1dKQphY19jcj1gZWNobyBYIHwgdHIgWCAnXDAxNSdgCiMgT24gY3lnd2luLCBiYXNoIGNhbiBlYXQgXHIgaW5zaWRlIGBgIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpZ25jci4KIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCiMgcG9pbnQsIHNvIHdlIGNhbiB1c2UgYSBiYXNoaXNtIGFzIGEgZmFsbGJhY2suCmlmIHRlc3QgIngkYWNfY3IiID0geDsgdGhlbgogIGV2YWwgYWNfY3I9XCRcJ1xcclwnCmZpCmFjX2NzX2F3a19jcj1gJEFXSyAnQkVHSU4geyBwcmludCAiYVxyYiIgfScgPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAKaWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KICBhY19jc19hd2tfY3I9J1xccicKZWxzZQogIGFjX2NzX2F3a19jcj0kYWNfY3IKZmkKZG5sCmRubCBEZWZpbmUgdGhlIHBpcGUgdGhhdCBkb2VzIHRoZSBzdWJzdGl0dXRpb24uCm00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbbTRfZGVmaW5lKFtfQUNfU1VCU1RfQ01EU10sIFt8CmlmICRhY19jc19hd2tfZ2V0bGluZTsgdGhlbgogICRBV0sgLWYgIiRhY190bXAvc3Vicy5hd2siCmVsc2UKICAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIiB8ICRTSEVMTApmaV0pXSwKW200X2RlZmluZShbX0FDX1NVQlNUX0NNRFNdLApbfCAkQVdLIC1mICIkYWNfdG1wL3N1YnMuYXdrIl0pXSlkbmwKCmVjaG8gJ0JFR0lOIHsnID4iJGFjX3RtcC9zdWJzMS5hd2siICYmCl9BQ0VPRgoKbTRfaWZkZWYoW19BQ19TVUJTVF9GSUxFU10sClsjIENyZWF0ZSBjb21tYW5kcyB0byBzdWJzdGl0dXRlIGZpbGUgb3V0cHV0IHZhcmlhYmxlcy4KewogIGVjaG8gImNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MSIgJiYKICBlY2hvICdjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmJyAmJgogIGVjaG8gIiRhY19zdWJzdF9maWxlcyIgfCBzZWQgJ3MvLiovRkA8OkAiJiJAOj5APSIkJiIvJyAmJgogIGVjaG8gIl9BQ0FXSyIgJiYKICBlY2hvICJfQUNFT0YiCn0gPmNvbmYkJGZpbGVzLnNoICYmCi4gLi9jb25mJCRmaWxlcy5zaCB8fAogIEFDX01TR19FUlJPUihbY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVNdKQpybSAtZiBjb25mJCRmaWxlcy5zaApdKWRubAoKewogIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCiAgZWNobyAiJGFjX3N1YnN0X3ZhcnMiIHwgc2VkICdzLy4qLyYhJCYkYWNfZGVsaW0vJyAmJgogIGVjaG8gIl9BQ0VPRiIKfSA+Y29uZiQkc3Vicy5zaCB8fAogIEFDX01TR19FUlJPUihbY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVNdKQphY19kZWxpbV9udW09YGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IGdyZXAgLWMgJ14nYAphY19kZWxpbT0nJSFfISMgJwpmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KICAuIC4vY29uZiQkc3Vicy5zaCB8fAogICAgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVU10pCgpkbmwgRG8gbm90IHVzZSBncmVwIG9uIGNvbmYkJHN1YnMuYXdrLCBzaW5jZSBBSVggZ3JlcCBoYXMgYSBsaW5lIGxlbmd0aCBsaW1pdC4KICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAogIGlmIHRlc3QgJGFjX2RlbGltX24gPSAkYWNfZGVsaW1fbnVtOyB0aGVuCiAgICBicmVhawogIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCiAgICBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTXSkKICBlbHNlCiAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgogIGZpCmRvbmUKcm0gLWYgY29uZiQkc3Vicy5zaAoKZG5sIEluaXRpYWxpemUgYW4gYXdrIGFycmF5IG9mIHN1YnN0aXR1dGlvbnMsIGtleWVkIGJ5IHZhcmlhYmxlIG5hbWUuCmRubApkbmwgVGhlIGluaXRpYWwgbGluZSBjb250YWlucyB0aGUgdmFyaWFibGUgbmFtZSBWQVIsIHRoZW4gYSBgIScuCmRubCBDb25zdHJ1Y3QgYFNbIlZBUiJdPScgZnJvbSBpdC4KZG5sIFRoZSByZXN0IG9mIHRoZSBsaW5lLCBhbmQgcG90ZW50aWFsbHkgZnVydGhlciBsaW5lcywgY29udGFpbiB0aGUKZG5sIHN1YnN0aXR1dGVkIHZhbHVlOyB0aGUgbGFzdCBvZiB0aG9zZSBlbmRzIHdpdGggJGFjX2RlbGltLiAgV2Ugc3BsaXQKZG5sIHRoZSBvdXRwdXQgYm90aCBhbG9uZyB0aG9zZSBzdWJzdGl0dXRlZCBuZXdsaW5lcyBhbmQgYXQgaW50ZXJ2YWxzIG9mCmRubCBsZW5ndGggX0FDX0FXS19MSVRFUkFMX0xJTUlULiAgVGhlIGxhdHRlciBpcyBkb25lIHRvIGNvbXBseSB3aXRoIGF3awpkbmwgc3RyaW5nIGxpdGVyYWwgbGltaXRhdGlvbnMsIHRoZSBmb3JtZXIgZm9yIHNpbXBsaWNpdHkgaW4gZG9pbmcgc28uCmRubApkbmwgV2UgZGVhbCB3aXRoIG9uZSBpbnB1dCBsaW5lIGF0IGEgdGltZSB0byBhdm9pZCBzZWQgcGF0dGVybiBzcGFjZQpkbmwgbGltaXRhdGlvbnMuICBXZSBraWxsIHRoZSBkZWxpbWl0ZXIgJGFjX2RlbGltIGJlZm9yZSBzcGxpdHRpbmcgdGhlCmRubCBzdHJpbmcgKG90aGVyd2lzZSB3ZSByaXNrIHNwbGl0dGluZyB0aGUgZGVsaW1pdGVyKS4gIEFuZCB3ZSBkbyB0aGUKZG5sIHNwbGl0dGluZyBiZWZvcmUgdGhlIHF1b3Rpbmcgb2YgYXdrIHNwZWNpYWwgY2hhcmFjdGVycyAob3RoZXJ3aXNlIHdlCmRubCByaXNrIHNwbGl0dGluZyBhbiBlc2NhcGUgc2VxdWVuY2UpLgpkbmwKZG5sIE91dHB1dCBhcyBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMsIGpvaW5lZCB3aXRoIGJhY2tzbGFzaC1uZXdsaW5lLgpkbmwgRWxpbWluYXRlIHRoZSBuZXdsaW5lIGFmdGVyIGA9JyBpbiBhIHNlY29uZCBzY3JpcHQsIGZvciByZWFkYWJpbGl0eS4KZG5sCmRubCBOb3RlcyB0byB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBhd2sgc2NyaXB0OgpkbmwgLSB0aGUgdW51c3VhbCBGUyB2YWx1ZSBoZWxwcyBwcmV2ZW50IHJ1bm5pbmcgaW50byB0aGUgbGltaXQgb2YgOTkgZmllbGRzLApkbmwgLSB3ZSBhdm9pZCBzdWIvZ3N1YiBiZWNhdXNlIG9mIHRoZSBcJiBxdW90aW5nIGlzc3Vlcywgc2VlCmRubCAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nYXdrL21hbnVhbC9odG1sX25vZGUvR29yeS1EZXRhaWxzLmh0bWwKZG5sIC0gV3JpdGluZyBgJCAwJyBwcmV2ZW50cyBleHBhbnNpb24gYnkgYm90aCB0aGUgc2hlbGwgYW5kIG00IGhlcmUuCmRubApkbmwgbTQtZG91YmxlLXF1b3RlIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBmb3IgcmVhZGFiaWxpdHkuCltjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKY2F0ID4+IlwkYWNfdG1wL3N1YnMxLmF3ayIgPDxcXF9BQ0FXSyAmJgpfQUNFT0YKc2VkIC1uICcKaApzL14vU1siLzsgcy8hLiovIl09LwpwCmcKcy9eW14hXSohLy8KOnJlcGwKdCByZXBsCnMvJyIkYWNfZGVsaW0iJyQvLwp0IGRlbGltCjpubApoCnMvXCguXHtdX0FDX0FXS19MSVRFUkFMX0xJTUlUW1x9XCkuLiovXDEvCnQgbW9yZTEKcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLwpwCm4KYiByZXBsCjptb3JlMQpzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCnAKZwpzLy5ce11fQUNfQVdLX0xJVEVSQUxfTElNSVRbXH0vLwp0IG5sCjpkZWxpbQpoCnMvXCguXHtdX0FDX0FXS19MSVRFUkFMX0xJTUlUW1x9XCkuLiovXDEvCnQgbW9yZTIKcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KcApiCjptb3JlMgpzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCnAKZwpzLy5ce11fQUNfQVdLX0xJVEVSQUxfTElNSVRbXH0vLwp0IGRlbGltCicgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKL15bXiIiXS97CiAgTgogIHMvXG4vLwp9CicgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKcm0gLWYgY29uZiQkc3Vicy5hd2sKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCl9BQ0FXSwpjYXQgPj4iXCRhY190bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgogIGZvciAoa2V5IGluIFMpIFNfaXNfc2V0W2tleV0gPSAxCiAgRlMgPSAiByIKXW00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbICBcJGFjX2NzX2F3a19waXBlX2luaXRdKVsKfQp7CiAgbGluZSA9ICQgMAogIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQogIHN1YnN0ZWQgPSAwCiAgbGVuID0gbGVuZ3RoKGZpZWxkWzFdKQogIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKICAgIGtleSA9IGZpZWxkW2ldCiAgICBrZXlsZW4gPSBsZW5ndGgoa2V5KQogICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKICAgICAgdmFsdWUgPSBTW2tleV0KICAgICAgbGluZSA9IHN1YnN0cihsaW5lLCAxLCBsZW4pICIiIHZhbHVlICIiIHN1YnN0cihsaW5lLCBsZW4gKyBrZXlsZW4gKyAzKQogICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQogICAgICBzdWJzdGVkID0gMQogICAgfSBlbHNlCiAgICAgIGxlbiArPSAxICsga2V5bGVuCiAgfQpdbTRfaWZkZWYoW19BQ19TVUJTVF9GSUxFU10sCltbICBpZiAobmZpZWxkcyA9PSAzICYmICFzdWJzdGVkKSB7CiAgICBrZXkgPSBmaWVsZFsyXQogICAgaWYgKEZba2V5XSAhPSAiIiAmJiBsaW5lIH4gL15bCSBdKkAuKkBbCSBdKiQvKSB7CiAgICAgIFwkYWNfY3NfYXdrX3JlYWRfZmlsZQogICAgICBuZXh0CiAgICB9CiAgfV1dKVsKICBwcmludCBsaW5lCn0KXWRubCBlbmQgb2YgZG91YmxlLXF1b3RlZCBwYXJ0Cm00X2lmZGVmKFtfQUNfU1VCU1RfRklMRVNdLApbXCRhY19jc19hd2tfcGlwZV9maW5pXSkKX0FDQVdLCl9BQ0VPRgpkbmwgU2VlIGlmIENSIGlzIHRoZSBFT0wgbWFya2VyLiAgSWYgbm90LCByZW1vdmUgYW55IEVPTC1yZWxhdGVkCmRubCBeTSBieXRlcyBhbmQgZXNjYXBlIGFueSByZW1haW5pbmcgb25lcy4gIElmIHNvLCBqdXN0IHVzZSBtdi4KZG5sIEluIGNhc2UgeW91J3JlIHdvbmRlcmluZyBob3cgXk0gYnl0ZXMgY2FuIG1ha2UgaXQgaW50byBzdWJzMS5hd2ssCmRubCBbZnJvbSBSYWxmIFdpbGRlbmh1ZXNdIG9uZSB3YXkgaXMgaWYgeW91IGhhdmUgZS5nLiwKZG5sIEFDX1NVQlNUKFt2YXJpYWJsZV90aGF0X2NvbnRhaW5zX2NyXSwgWyIKZG5sICJdKQpkbmwgVGhlIG9yaWdpbmFsIGFpbSB3YXMgdGhhdCB1c2VycyBzaG91bGQgYmUgYWJsZSB0byBzdWJzdGl0dXRlIGFueQpkbmwgY2hhcmFjdGVycyB0aGV5IGxpa2UgKGV4Y2VwdCBmb3IgXDApLiAgQW5kIHRoZSBhYm92ZSBpcyBub3Qgc28KZG5sIHVubGlrZWx5IGlmIHRoZSBjb25maWd1cmUgc2NyaXB0IGl0c2VsZiBoYXBwZW5zIHRvIGJlIGNvbnZlcnRlZApkbmwgdG8gdzMyIHRleHQgbW9kZS4KY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQppZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgplbHNlCiAgY2F0CmZpIDwgIiRhY190bXAvc3ViczEuYXdrIiA+ICIkYWNfdG1wL3N1YnMuYXdrIiBcCiAgfHwgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeV0pCl9BQ0VPRgoKIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSBzb2xlICQoc3JjZGlyKSwKIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGVudHJpZXMgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAojIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQojIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCmlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCiAgYWNfdnBzdWI9WycvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97CmgKcy8vLwpzL14vOi8Kcy9bCSBdKiQvOi8Kcy86XCQoc3JjZGlyKTovOi9nCnMvOlwke3NyY2Rpcn06LzovZwpzLzpAc3JjZGlyQDovOi9nCnMvXjoqLy8Kcy86KiQvLwp4CnMvXCg9WwkgXSpcKS4qL1wxLwpHCnMvXG4vLwpzL15bXj1dKj1bCSBdKiQvLwp9J10KZmkKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgoKClQyNiwxMDMKbTRfbG9jYXRpb24oQVNfTUVfUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMDg2CkY3LDYKbTRfZXhpdG00ZXhpdApUMjcsMwpfQUNfTEFOR19BQkJSRVYoRm9ydHJhbiA3NylmNzcKVDExLDc1NQpBQ19QUk9HX1NFRF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSwgYWNfY3ZfcGF0aF9TRUQsCiAgICBbZG5sIGFjX3NjcmlwdCBzaG91bGQgbm90IGNvbnRhaW4gbW9yZSB0aGFuIDk5IGNvbW1hbmRzIChmb3IgSFAtVVggc2VkKSwKICAgICBkbmwgYnV0IG1vcmUgdGhhbiBhYm91dCA3MDAwIGJ5dGVzLCB0byBjYXRjaCBhIGxpbWl0IGluIFNvbGFyaXMgOCAvdXNyL3VjYi9zZWQuCiAgICAgYWNfc2NyaXB0PXMvYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEvYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiLwogICAgIGZvciBhY19pIGluIDEgMiAzIDQgNSA2IDc7IGRvCiAgICAgICBhY19zY3JpcHQ9IiRhY19zY3JpcHQkYXNfbmwkYWNfc2NyaXB0IgogICAgIGRvbmUKICAgICBlY2hvICIkYWNfc2NyaXB0IiAyPi9kZXYvbnVsbCB8IHNlZCA5OXEgPmNvbmZ0ZXN0LnNlZAogICAgIEFTX1VOU0VUKFthY19zY3JpcHRdKQogICAgIF9BQ19QQVRIX1BST0dTX0ZFQVRVUkVfQ0hFQ0soU0VELCBbc2VkIGdzZWRdLAoJW19BQ19GRUFUVVJFX0NIRUNLX0xFTkdUSChbYWNfcGF0aF9TRURdLCBbYWNfY3ZfcGF0aF9TRURdLAoJCVsiJGFjX3BhdGhfU0VEIiAtZiBjb25mdGVzdC5zZWRdKV0pXSkKIFNFRD0iJGFjX2N2X3BhdGhfU0VEIgogQUNfU1VCU1QoW1NFRF0pZG5sCiBybSAtZiBjb25mdGVzdC5zZWQKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSwzNDQKQUNfUFJPR19GNzdfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpZG5sCkFDX0FSR19WQVIoW0Y3N10sICAgIFtGb3J0cmFuIDc3IGNvbXBpbGVyIGNvbW1hbmRdKWRubApBQ19BUkdfVkFSKFtGRkxBR1NdLCBbRm9ydHJhbiA3NyBjb21waWxlciBmbGFnc10pZG5sCl9BQ19BUkdfVkFSX0xERkxBR1MoKWRubApfQUNfQVJHX1ZBUl9MSUJTKClkbmwKX0FDX1BST0dfRkMoW0ZvcnRyYW4gNzddLCBbJDFdKQppZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KICBHNzc9eWVzCmVsc2UKICBHNzc9CmZpCkFDX0xBTkdfUE9QKEZvcnRyYW4gNzcpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsOTEKQUNfUFJFUFJPQ19JRkVMU0VfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QUkVQUk9DX1JFUVVJUkUoKWRubApfQUNfUFJFUFJPQ19JRkVMU0UoJEApW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNiwxNTAKQUNfRkNfRFVNTVlfTUFJTl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19GQ19MSUJSQVJZX0xERkxBR1NdKWRubApBQ19MQU5HX1BVU0goRm9ydHJhbilkbmwKX0FDX0ZDX0RVTU1ZX01BSU4oJEApCkFDX0xBTkdfUE9QKEZvcnRyYW4pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTMsMjcKQU5fSURFTlRJRklFUkFOX09VVFBVVChbaWRlbnRpZmllcl0sICRAKQpUMTIsODMKbTRfc2V0X3VuaW9ubTRfc2V0X2xpc3RjKFskMV0pbTRfaWYoWyQxXSwgWyQyXSwgW10sCiAgW200X3NldF9tYXBfc2VwKFskMl0sIFtfJDAoWyQxXSxdLCBbKV0pXSkKVDIwLDczCkFTX0JPVVJORV9DT01QQVRJQkxFIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCkRVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKXyQwCgpUMzAsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfVUlOVE1BWF9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MzI2ClQxNiwyCl9tNF9kaXZlcnQoS0lMTCktMQpUMTgsMjExCkFDX0dDQ19UUkFESVRJT05BTF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19HQ0NfVFJBRElUSU9OQUwnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUFJPR19HQ0NfVFJBRElUSU9OQUxdLCBbQUNfUFJPR19HQ0NfVFJBRElUSU9OQUwoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDEwLDEwMAptNF9mb3JlYWNobTRfaWYoWyQyXSwgW10sIFtdLAogICAgICAgW200X3B1c2hkZWYoWyQxXSlfJDAoW200X2RlZmluZShbJDFdLF0sIFspJDNdLCBbXSwKICAkMiltNF9wb3BkZWYoWyQxXSldKQpUMjAsMTA3Cm00X2xvY2F0aW9uKEFDX1dJVEgpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjE0OTMKVDIwLDEwNgptNF9sb2NhdGlvbihBQ19XQVJOKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvb2xkbmFtZXMubTQ6MzMKVDksMjY1Cl9BU19RVU9URW00X2NvbmQoW200X2luZGV4KFskMV0sIFtcXSldLCBbLTFdLCBbX0FTX1FVT1RFX01PREVSTl0sCgkgW200X2V2YWwobTRfaW5kZXgobTRfdHJhbnNsaXQoW1skMV1dLCBbJF0sIFtcXSksIFtcXF0pID49IDApXSwKWzFdLCBbX0FTX1FVT1RFX01PREVSTl0sCgkgW200X2V2YWwobTRfaW5kZXgobTRfdHJhbnNsaXQoW1skMV1dLCBbIl0sIFtgXSksIFtcYF0pID49IDApXSxkbmwiClsxXSwgW19BU19RVU9URV9PTERdLAoJIFtfQVNfUVVPVEVfTU9ERVJOXSkoWyQxXSkKVDE0LDc1MApBQ19QUk9HX09CSkNQUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19QUk9HX09CSkNdKWRubApBQ19BUkdfVkFSKFtPQkpDUFBdLCAgIFtPYmplY3RpdmUgQyBwcmVwcm9jZXNzb3JdKWRubApfQUNfQVJHX1ZBUl9DUFBGTEFHUygpZG5sCkFDX0xBTkdfUFVTSChPYmplY3RpdmUgQylkbmwKQUNfTVNHX0NIRUNLSU5HKFtob3cgdG8gcnVuIHRoZSBPYmplY3RpdmUgQyBwcmVwcm9jZXNzb3JdKQppZiB0ZXN0IC16ICIkT0JKQ1BQIjsgdGhlbgogIEFDX0NBQ0hFX1ZBTChhY19jdl9wcm9nX09CSkNQUCwKICBbZG5sCiAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBPQkpDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKICAgIGZvciBPQkpDUFAgaW4gIiRPQkpDIC1FIiAiL2xpYi9jcHAiCiAgICBkbwogICAgICBfQUNfUFJPR19QUkVQUk9DX1dPUktTX0lGRUxTRShbYnJlYWtdKQogICAgZG9uZQogICAgYWNfY3ZfcHJvZ19PQkpDUFA9JE9CSkNQUAogIF0pZG5sCiAgT0JKQ1BQPSRhY19jdl9wcm9nX09CSkNQUAplbHNlCiAgYWNfY3ZfcHJvZ19PQkpDUFA9JE9CSkNQUApmaQpBQ19NU0dfUkVTVUxUKFskT0JKQ1BQXSkKX0FDX1BST0dfUFJFUFJPQ19XT1JLU19JRkVMU0UoW10sCgkgIFtBQ19NU0dfRkFJTFVSRShbT2JqZWN0aXZlIEMgcHJlcHJvY2Vzc29yICIkT0JKQ1BQIiBmYWlscyBzYW5pdHkgY2hlY2tdKV0pCkFDX1NVQlNUKE9CSkNQUClkbmwKQUNfTEFOR19QT1AoT2JqZWN0aXZlIEMpZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTUsMTUzCkFDX0xBTkdfUkVTVE9SRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19MQU5HX1JFU1RPUkUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkdfUE9QKCRAKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsNjA5CkFDX0xBTkdfSU5UX1NBVkUoT2JqZWN0aXZlIEMrKylBQ19MQU5HX1BST0dSQU0oWyQxCnN0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuICQyOyB9CnN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAkMjsgfQpAJTpAaW5jbHVkZSA8c3RkaW8uaD4KQCU6QGluY2x1ZGUgPHN0ZGxpYi5oPl0sClsKICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwogIGlmICghIGYpCiAgICByZXR1cm4gMTsKICBpZiAoKCQyKSA8IDApCiAgICB7CiAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOwogICAgICBpZiAoaSAhPSAoJDIpKQoJcmV0dXJuIDE7CiAgICAgIGZwcmludGYgKGYsICIlbGQiLCBpKTsKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKICAgICAgaWYgKGkgIT0gKCQyKSkKCXJldHVybiAxOwogICAgICBmcHJpbnRmIChmLCAiJWx1IiwgaSk7CiAgICB9CiAgLyogRG8gbm90IG91dHB1dCBhIHRyYWlsaW5nIG5ld2xpbmUsIGFzIHRoaXMgY2F1c2VzIFxyXG4gY29uZnVzaW9uCiAgICAgb24gc29tZSBwbGF0Zm9ybXMuICAqLwogIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKXSkKRjgsOAp0cmFjZW9mZnRyYWNlb2ZmCkYxMSw4Cm00X3RyYWNlb2ZmdHJhY2VvZmYKVDgsMzMKbTRfYXBwbHltNF9pZihbJDJdLCBbXSwgWyQxXSwgWyQxKCQyKV0pW10KVDIzLDMzMQpfQUNfUFJFUFJPQ19JRkVMU0VfQk9EWSAgQVNfTElORU5PX1BVU0goWyRbXTFdKQogIEFTX0lGKFtfQUNfRE9fU1RERVJSKFskYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHRdKSA+IGNvbmZ0ZXN0LmkgJiYgewoJIHRlc3QgLXogIiRhY19bXV9BQ19MQU5HX0FCQlJFVltdX3ByZXByb2Nfd2Fybl9mbGFnJGFjX1tdX0FDX0xBTkdfQUJCUkVWW11fd2Vycm9yX2ZsYWciIHx8CgkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgogICAgICAgfV0sCiAgICBbYWNfcmV0dmFsPTBdLAogICAgW19BQ19NU0dfTE9HX0NPTkZURVNUCiAgICBhY19yZXR2YWw9MV0pCiAgQVNfTElORU5PX1BPUAogIEFTX1NFVF9TVEFUVVMoWyRhY19yZXR2YWxdKQoKVDE4LDE3NgpBQ19SRVBMQUNFX0ZOTUFUQ0hfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0ZVTkNfRk5NQVRDSF9JRihbUE9TSVhdLCBbYWNfY3ZfZnVuY19mbm1hdGNoX3dvcmtzXSwKCQkgICAgIFtybSAtZiAiJGFjX2NvbmZpZ19saWJvYmpfZGlyL2ZubWF0Y2guaCJdLAoJCSAgICAgW19BQ19MSUJPQkpfRk5NQVRDSF0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTgsMTkzCkFDX01JTlVTX0NfTUlOVVNfT19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19NSU5VU19DX01JTlVTX08nIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUFJPR19DQ19DX09dLCBbQUNfUFJPR19DQ19DX08oJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE3LDI5NwpBQ19MQU5HX0NBTEwoQysrKUFDX0xBTkdfUFJPR1JBTShbJDEKbTRfaWYoWyQyXSwgW21haW5dLCAsClsvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCiAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gIkMiCiNlbmRpZgpjaGFyICQyICgpO10pXSwgW3JldHVybiAkMiAoKTtdKQpUMzksOTUKQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKE9iamVjdGl2ZSBDKyspQUNfTEFOR19QUk9HUkFNKFskMV0sIFtzdGF0aWMgaW50IHRlc3RfYXJyYXkgQDw6QDEgLSAyICogISgkMilAOj5AOwp0ZXN0X2FycmF5IEA8OkAwQDo+QCA9IDAKXSkKVDMwLDAKbTRfaW5jbHVkZShtNHN1Z2FyL3ZlcnNpb24ubTQpClQyOCwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9JTlQzMl9UKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6NjE4ClQzMCwxMDUKbTRfbG9jYXRpb24oQUNfU1RSVUNUX1NUX1JERVYpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDoxMDAzClQzNywxMDUKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihFcmxhbmcpKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZXJsYW5nLm00OjE2NwpUMzIsMTAwCm00X2xvY2F0aW9uKEFDX0xBTkdfQ09NUElMRVIoQykpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9jLm00OjQyOQpUMTEsNDMKQUNfT0JTT0xFVEVBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbJDEgaXMgb2Jzb2xldGUkMl0pClQxNCwxODEKQUNfQ1JPU1NfQ0hFQ0tfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ1JPU1NfQ0hFQ0snIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ19DUk9TU10sIFtBQ19DX0NST1NTKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMywzNzUKQUNfVFlQRV9VSURfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhmb3IgdWlkX3QgaW4gc3lzL3R5cGVzLmgsIGFjX2N2X3R5cGVfdWlkX3QsCltBQ19FR1JFUF9IRUFERVIodWlkX3QsIHN5cy90eXBlcy5oLAogIGFjX2N2X3R5cGVfdWlkX3Q9eWVzLCBhY19jdl90eXBlX3VpZF90PW5vKV0pCmlmIHRlc3QgJGFjX2N2X3R5cGVfdWlkX3QgPSBubzsgdGhlbgogIEFDX0RFRklORSh1aWRfdCwgaW50LCBbRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuXSkKICBBQ19ERUZJTkUoZ2lkX3QsIGludCwgW0RlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzMsMTA2Cm00X2xvY2F0aW9uKF9BQ19QUk9HX0ZDX1ZfT1VUUFVUKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDo0OTIKVDIzLDEwNgptNF9sb2NhdGlvbihBQ19QUk9HX0ZDKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZm9ydHJhbi5tNDozNzgKVDMzLDEwMAptNF9sb2NhdGlvbihBQ19MQU5HX1BSRVBST0MoQysrKSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6NjI3ClQ0NCwxMDAKbTRfbG9jYXRpb24oQUNfTEFOR19DT01QSUxFUihPYmplY3RpdmUgQysrKSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2MubTQ6OTkyClQyOCwxMDcKbTRfbG9jYXRpb24oX0FDX0VWQUxfU1RERVJSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZ2VuZXJhbC5tNDoyNDMzClQyNiwxMDMKbTRfbG9jYXRpb24oQVNfVkFSX0FQUEVORCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxOTIxClQyNiwxMDUKbTRfbG9jYXRpb24oQUNfTElOS19GSUxFUykvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3N0YXR1cy5tNDo5NDAKVDE0LDczCl9tNF9tYXBhbGxfc2VwbTRfYXBwbHkoWyQxXSwgWyQzXSlfbTRfZm9yZWFjaChbbTRfYXBwbHkoWyQyW10kMV0sXSwgWyldLCBtNF9zaGlmdDIoJEApKQpUOSwxMzIKbTRfZGl2ZXJ0bTRfcG9wZGVmKFtfbTRfZGl2ZXJ0X3N0YWNrXSltNF9kZWZpbmUoW19tNF9kaXZlcnRfZGl2ZXJzaW9uXSwgWyQxXSltNF9kaXZlcnRfc3RhY2tfcHVzaChbJDBdLCBbJDFdKV9tNF9kaXZlcnRfcmF3KF9tNF9kaXZlcnQoWyQxXSkpClQxMCw0MwpfQUNfRjc3X0ZDZzc3IHhsZiBmNzcgZnJ0IHBnZjc3IGNmNzcgZm9ydDc3IGZsMzIgYWY3NwpUMTAsMTMzCkFDX0NfQ1JPU1NfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ19DUk9TUycgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNyw3NQpBQ19DT05GSUdfQVVYX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DT05GSUdfQVVYX0RJUlMoJDEgIiRzcmNkaXIiLyQxKVtdX200X2RlZnVuX2VwaShbJDBdKQpGMTAsNwptNF90cmFjZW9udHJhY2VvbgpUMjcsMTAwCm00X2xvY2F0aW9uKGFjX2N2X3Byb2dfZ3h4KS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDo2NzQKVDExLDEwNjEKX0FDX1NSQ0RJUlNhY19idWlsZGRpcj0uCgpjYXNlICQxIGluCi4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwoqKQogIGFjX2Rpcl9zdWZmaXg9L2BBU19FQ0hPKFskMV0pIHwgc2VkICdzfF5cLltbXFwvXV18fCdgCiAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgogIGFjX3RvcF9idWlsZGRpcl9zdWI9YEFTX0VDSE8oWyIkYWNfZGlyX3N1ZmZpeCJdKSB8IHNlZCAnc3wvW1teXFwvXV0qfC8uLnxnO3N8L3x8J2AKICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCiAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwogICopICBhY190b3BfYnVpbGRfcHJlZml4PSRhY190b3BfYnVpbGRkaXJfc3ViLyA7OwogIGVzYWMgOzsKZXNhYwphY19hYnNfdG9wX2J1aWxkZGlyPSRhY19wd2QKYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAojIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgphY190b3BfYnVpbGRkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgKCmNhc2UgJHNyY2RpciBpbgogIC4pICAjIFdlIGFyZSBidWlsZGluZyBpbiBwbGFjZS4KICAgIGFjX3NyY2Rpcj0uCiAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCiAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkIDs7CiAgW1tcXC9dXSogfCA/OltbXFwvXV0qICkgICMgQWJzb2x1dGUgbmFtZS4KICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CiAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKICAqKSAjIFJlbGF0aXZlIG5hbWUuCiAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCiAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKZXNhYwphY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4CgpUMjYsMTA3Cm00X2xvY2F0aW9uKEFDX0NIRUNLX1RPT0wpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9wcm9ncmFtcy5tNDoyMjIKVDEzLDUyCm00X2NyX0xldHRlcnNhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaClQxOCw0NTcKX0FDX0xJQk9CSl9GTk1BVENIX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0NfQ09OU1RdKWRubApBQ19SRVFVSVJFKFtBQ19GVU5DX0FMTE9DQV0pZG5sCkFDX1JFUVVJUkUoW0FDX1RZUEVfTUJTVEFURV9UXSlkbmwKQUNfQ0hFQ0tfREVDTFMoW2dldGVudl0pCkFDX0NIRUNLX0ZVTkNTKFtidG93YyBtYnNydG93Y3MgbWVtcGNweSB3bWVtcGNweV0pCkFDX0NIRUNLX0hFQURFUlMoW3djaGFyLmggd2N0eXBlLmhdKQpBQ19MSUJPQkooW2ZubWF0Y2hdKQpBQ19DT05GSUdfTElOS1MoWyRhY19jb25maWdfbGlib2JqX2Rpci9mbm1hdGNoLmg6JGFjX2NvbmZpZ19saWJvYmpfZGlyL2ZubWF0Y2hfLmhdKQpBQ19ERUZJTkUoZm5tYXRjaCwgcnBsX2ZubWF0Y2gsCgkgIFtEZWZpbmUgdG8gcnBsX2ZubWF0Y2ggaWYgdGhlIHJlcGxhY2VtZW50IGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLl0pCltdX200X2RlZnVuX2VwaShbJDBdKQpUNywxNDYKQVNfQ0FTRV9tNF9kZWZ1bl9wcm8oWyQwXSljYXNlICQxIGluW11tNF9tYXBfYXJnc19wYWlyKFtfJDBdLCBbXyQwX0RFRkFVTFRdLAogICBtNF9zaGlmdCgkQG00X2lmKG00X2V2YWwoWyQjICYgMV0pLCBbMV0sIFssXSkpKQplc2FjW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxNTcKQUNfRjc3X0RVTU1ZX01BSU5fbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfRjc3X0xJQlJBUllfTERGTEFHU10pZG5sCkFDX0xBTkdfUFVTSChGb3J0cmFuIDc3KWRubApfQUNfRkNfRFVNTVlfTUFJTigkQCkKQUNfTEFOR19QT1AoRm9ydHJhbiA3NylkbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOCwxMDQKbTRfbG9jYXRpb24oQUNfQ0hFQ0tfTUVNQkVSKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6ODgwClQyNCw0NApfQUNfTEFOR19PUEVOTVAoRm9ydHJhbilBQ19MQU5HX0ZVTkNfTElOS19UUlkoW29tcF9nZXRfbnVtX3RocmVhZHNdKQpUMzIsMTAzCm00X2xvY2F0aW9uKF9BQ19MQU5HX0lPX1BST0dSQU0pL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9sYW5nLm00OjI2NgpUOSw3NQptNF9iZWZvcmVtNF9wcm92aWRlX2lmKFskMl0sCgkgICAgICAgW200X3dhcm4oW3N5bnRheF0sIFskMiB3YXMgY2FsbGVkIGJlZm9yZSAkMV0pXSkKVDIzLDAKQUNfT1VUUFVUX0NPTU1BTkRTX1BPU1QKVDksMTc0CkFDX0ZJTkRfWF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19GSU5EX1gnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfUEFUSF9YXSwgW0FDX1BBVEhfWCgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUOSwyMTYKQUNfQ1lHV0lOX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0NZR1dJTicgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfQ0FOT05JQ0FMX0hPU1QKY2FzZSAkaG9zdF9vcyBpbgogICpjeWd3aW4qICkgQ1lHV0lOPXllczs7CgkgKiApIENZR1dJTj1ubzs7CmVzYWMKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCwxNDMKbTRfbWFwX3NlcG00X3B1c2hkZWYoW200X1NlcF0sIFttNF9kZWZpbmUoW200X1NlcF0sIF9tNF9kZWZuKFttNF91bnF1b3RlXSkpXSlfbTRfZm9yZWFjaChbX200X2FwcGx5KFttNF9TZXAoWyQyXSlbXSQxXSxdLCBbKV0sIFtdLCAkMyltNF9wb3BkZWYoW200X1NlcF0pClQxMiw1NQptNF9jb3B5X3VubTRtNF9jb3B5KFskMV0sIG00X2JwYXRzdWJzdChbJDFdLCBbXm00X1woLipcKV0sIFtbXDFdXSkpClQxNCw4NzMKQUNfUFJPR19PQkpDWFhfbTRfZGVmdW5fcHJvKFskMF0pQUNfTEFOR19QVVNIKE9iamVjdGl2ZSBDKyspZG5sCkFDX0FSR19WQVIoW09CSkNYWF0sICAgICAgW09iamVjdGl2ZSBDKysgY29tcGlsZXIgY29tbWFuZF0pZG5sCkFDX0FSR19WQVIoW09CSkNYWEZMQUdTXSwgW09iamVjdGl2ZSBDKysgY29tcGlsZXIgZmxhZ3NdKWRubApfQUNfQVJHX1ZBUl9MREZMQUdTKClkbmwKX0FDX0FSR19WQVJfTElCUygpZG5sCl9BQ19BUkdfVkFSX0NQUEZMQUdTKClkbmwKX0FDX0FSR19WQVJfUFJFQ0lPVVMoW09CSkNYWF0pZG5sCkFDX0NIRUNLX1RPT0xTKE9CSkNYWCwKCSAgICAgICBbbTRfZGVmYXVsdChbJDFdLCBbZysrIG9iamMrKyBvYmpjeHggYysrIENYWF0pXSwKCSAgICAgICBnKyspCiMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KX0FTX0VDSE9fTE9HKFtjaGVja2luZyBmb3IgX0FDX0xBTkcgY29tcGlsZXIgdmVyc2lvbl0pCnNldCBYICRhY19jb21waWxlCmFjX2NvbXBpbGVyPSRbMl0KZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbwogIF9BQ19ET19MSU1JVChbJGFjX2NvbXBpbGVyICRhY19vcHRpb24gPiZBU19NRVNTQUdFX0xPR19GRF0pCmRvbmUKCm00X2V4cGFuZF9vbmNlKFtfQUNfQ09NUElMRVJfRVhFRVhUXSlbXWRubAptNF9leHBhbmRfb25jZShbX0FDX0NPTVBJTEVSX09CSkVYVF0pW11kbmwKX0FDX0xBTkdfQ09NUElMRVJfR05VCmlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgogIEdPQkpDWFg9eWVzCmVsc2UKICBHT0JKQ1hYPQpmaQpfQUNfUFJPR19PQkpDWFhfRwpBQ19MQU5HX1BPUChPYmplY3RpdmUgQysrKWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE0LDQ4NjMKQUNfQ19CSUdFTkRJQU5fbTRfZGVmdW5fcHJvKFskMF0pQUhfVkVSQkFUSU0oW1dPUkRTX0JJR0VORElBTl0sClsvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCkuICovCiNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAojIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KIyAgZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCiMgZW5kaWYKI2Vsc2UKIyBpZm5kZWYgV09SRFNfQklHRU5ESUFOCiMgIHVuZGVmIFdPUkRTX0JJR0VORElBTgojIGVuZGlmCiNlbmRpZl0pZG5sCiBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbl0sIFthY19jdl9jX2JpZ2VuZGlhbl0sCiAgIFthY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCiAgICAjIFNlZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB1bml2ZXJzYWwgY29tcGlsZXIuCiAgICBBQ19DT01QSUxFX0lGRUxTRSgKCSBbQUNfTEFOR19TT1VSQ0UoCgkgICAgW1sjaWZuZGVmIF9fQVBQTEVfQ0NfXwoJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCgkgICAgICNlbmRpZgoJICAgICB0eXBlZGVmIGludCBkdW1teTsKCSAgICBdXSldLAoJIFsKCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCgkjIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gLWFyY2ggZmxhZ3Mgd2l0aCBkaWZmZXJlbnQgdmFsdWVzLgoJYWNfYXJjaD0KCWFjX3ByZXY9Cglmb3IgYWNfd29yZCBpbiAkQ0MgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1M7IGRvCgkgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCgkgICBjYXNlICRhY193b3JkIGluCgkgICAgIGk/ODYgfCB4ODZfNjQgfCBwcGMgfCBwcGM2NCkKCSAgICAgICBpZiB0ZXN0IC16ICIkYWNfYXJjaCIgfHwgdGVzdCAiJGFjX2FyY2giID0gIiRhY193b3JkIjsgdGhlbgoJCSBhY19hcmNoPSRhY193b3JkCgkgICAgICAgZWxzZQoJCSBhY19jdl9jX2JpZ2VuZGlhbj11bml2ZXJzYWwKCQkgYnJlYWsKCSAgICAgICBmaQoJICAgICAgIDs7CgkgICBlc2FjCgkgICBhY19wcmV2PQoJIGVsaWYgdGVzdCAieCRhY193b3JkIiA9ICJ4LWFyY2giOyB0aGVuCgkgICBhY19wcmV2PWFyY2gKCSBmaQogICAgICAgZG9uZV0pCiAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KICAgICAgIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KICAgICAgQUNfQ09NUElMRV9JRkVMU0UoCglbQUNfTEFOR19QUk9HUkFNKAoJICAgW1sjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KCSAgIF1dLAoJICAgW1sjaWYgISAoZGVmaW5lZCBCWVRFX09SREVSICYmIGRlZmluZWQgQklHX0VORElBTiBcCgkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCgkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCgkgICAgICNlbmRpZgoJICAgXV0pXSwKCVsjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgoJIEFDX0NPTVBJTEVfSUZFTFNFKAoJICAgW0FDX0xBTkdfUFJPR1JBTSgKCSAgICAgIFtbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoJCSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KCSAgICAgIF1dLAoJICAgICAgW1sjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCgkJIG5vdCBiaWcgZW5kaWFuCgkJI2VuZGlmCgkgICAgICBdXSldLAoJICAgW2FjX2N2X2NfYmlnZW5kaWFuPXllc10sCgkgICBbYWNfY3ZfY19iaWdlbmRpYW49bm9dKV0pCiAgICBmaQogICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCiAgICAgICMgU2VlIGlmIDxsaW1pdHMuaD4gZGVmaW5lcyBfTElUVExFX0VORElBTiBvciBfQklHX0VORElBTiAoZS5nLiwgU29sYXJpcykuCiAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKAoJW0FDX0xBTkdfUFJPR1JBTSgKCSAgIFtbI2luY2x1ZGUgPGxpbWl0cy5oPgoJICAgXV0sCgkgICBbWyNpZiAhIChkZWZpbmVkIF9MSVRUTEVfRU5ESUFOIHx8IGRlZmluZWQgX0JJR19FTkRJQU4pCgkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCgkgICAgICNlbmRpZgoJICAgXV0pXSwKCVsjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9CSUdfRU5ESUFOIG9yIG5vdC4KCSBBQ19DT01QSUxFX0lGRUxTRSgKCSAgIFtBQ19MQU5HX1BST0dSQU0oCgkgICAgICBbWyNpbmNsdWRlIDxsaW1pdHMuaD4KCSAgICAgIF1dLAoJICAgICAgW1sjaWZuZGVmIF9CSUdfRU5ESUFOCgkJIG5vdCBiaWcgZW5kaWFuCgkJI2VuZGlmCgkgICAgICBdXSldLAoJICAgW2FjX2N2X2NfYmlnZW5kaWFuPXllc10sCgkgICBbYWNfY3ZfY19iaWdlbmRpYW49bm9dKV0pCiAgICBmaQogICAgaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB1bmtub3duOyB0aGVuCiAgICAgICMgQ29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KICAgICAgQUNfUlVOX0lGRUxTRSgKCVtBQ19MQU5HX1BST0dSQU0oW0FDX0lOQ0xVREVTX0RFRkFVTFRdLAoJICAgW1sKCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLwoJICAgICB1bmlvbgoJICAgICB7CgkgICAgICAgbG9uZyBpbnQgbDsKCSAgICAgICBjaGFyIGNbc2l6ZW9mIChsb25nIGludCldOwoJICAgICB9IHU7CgkgICAgIHUubCA9IDE7CgkgICAgIHJldHVybiB1LmNbc2l6ZW9mIChsb25nIGludCkgLSAxXSA9PSAxOwoJICAgXV0pXSwKCVthY19jdl9jX2JpZ2VuZGlhbj1ub10sCglbYWNfY3ZfY19iaWdlbmRpYW49eWVzXSwKCVsjIFRyeSB0byBndWVzcyBieSBncmVwcGluZyB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgZmlsZS4KCSBBQ19DT01QSUxFX0lGRUxTRSgKCSAgIFtBQ19MQU5HX1BST0dSQU0oCgkgICAgICBbW3Nob3J0IGludCBhc2NpaV9tbVtdID0KCQkgIHsgMHg0MjQ5LCAweDQ3NjUsIDB4NkU0NCwgMHg2OTYxLCAweDZFNTMsIDB4Nzk1MywgMCB9OwoJCXNob3J0IGludCBhc2NpaV9paVtdID0KCQkgIHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9OwoJCWludCB1c2VfYXNjaWkgKGludCBpKSB7CgkJICByZXR1cm4gYXNjaWlfbW1baV0gKyBhc2NpaV9paVtpXTsKCQl9CgkJc2hvcnQgaW50IGViY2RpY19paVtdID0KCQkgIHsgMHg4OUQzLCAweEUzRTMsIDB4ODU5MywgMHg5NUM1LCAweDg5QzQsIDB4OTU4MSwgMCB9OwoJCXNob3J0IGludCBlYmNkaWNfbW1bXSA9CgkJICB7IDB4QzJDOSwgMHhDNzg1LCAweDk1QzQsIDB4ODk4MSwgMHg5NUUyLCAweEE4RTIsIDAgfTsKCQlpbnQgdXNlX2ViY2RpYyAoaW50IGkpIHsKCQkgIHJldHVybiBlYmNkaWNfbW1baV0gKyBlYmNkaWNfaWlbaV07CgkJfQoJCWV4dGVybiBpbnQgZm9vOwoJICAgICAgXV0sCgkgICAgICBbW3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTtdXSldLAoJICAgW2lmIGdyZXAgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbDsgdGhlbgoJICAgICAgYWNfY3ZfY19iaWdlbmRpYW49eWVzCgkgICAgZmkKCSAgICBpZiBncmVwIExpVFRsZUVuRGlhbiBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCgkgICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19iaWdlbmRpYW4iID0gdW5rbm93bjsgdGhlbgoJCWFjX2N2X2NfYmlnZW5kaWFuPW5vCgkgICAgICBlbHNlCgkJIyBmaW5kaW5nIGJvdGggc3RyaW5ncyBpcyB1bmxpa2VseSB0byBoYXBwZW4sIGJ1dCB3aG8ga25vd3M/CgkJYWNfY3ZfY19iaWdlbmRpYW49dW5rbm93bgoJICAgICAgZmkKCSAgICBmaV0pXSkKICAgIGZpXSkKIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCiAgIHllcykKICAgICBtNF9kZWZhdWx0KFskMV0sCiAgICAgICBbQUNfREVGSU5FKFtXT1JEU19CSUdFTkRJQU5dLCAxKV0pOzsgIygKICAgbm8pCiAgICAgJDIgOzsgIygKICAgdW5pdmVyc2FsKQpkbmwgTm90ZSB0aGF0IEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCBzb3J0cyBsZXNzIHRoYW4gV09SRFNfQklHRU5ESUFOOwpkbmwgdGhpcyBpcyBhIG5lY2Vzc2l0eSBmb3IgcHJvcGVyIGNvbmZpZyBoZWFkZXIgb3BlcmF0aW9uLiAgV2FybiBpZgpkbmwgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGEgY29uZmlnIGhlYWRlciBidXQgaXMgcmVseWluZyBvbiB0aGUKZG5sIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHVuaXZlcnNhbCBidWlsZHMuCiAgICAgbTRfZGVmYXVsdChbJDRdLAogICAgICAgW0FDX0NPTkZJR19DT01NQU5EU19QUkUoW200X2lmc2V0KFtBSF9IRUFERVJdLCBbXSwKCSBbQUNfRElBR05PU0UoW29ic29sZXRlXSwKCSAgIFtBQ19DX0JJR0VORElBTiBzaG91bGQgYmUgdXNlZCB3aXRoIEFDX0NPTkZJR19IRUFERVJTXSldKV0pZG5sCglBQ19ERUZJTkUoW0FDX0FQUExFX1VOSVZFUlNBTF9CVUlMRF0sMSwKCSAgW0RlZmluZSBpZiBidWlsZGluZyB1bml2ZXJzYWwgKGludGVybmFsIGhlbHBlciBtYWNybyldKV0pCiAgICAgOzsgIygKICAgKikKICAgICBtNF9kZWZhdWx0KFskM10sCiAgICAgICBbQUNfTVNHX0VSUk9SKFt1bmtub3duIGVuZGlhbm5lc3MKIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwXSldKSA7OwogZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMwLDAKbTRfaW5jbHVkZShhdXRvY29uZi9zdGF0dXMubTQpClQxMCw4NgptNF90b2xvd2VybTRfdHJhbnNsaXQoW1skMV1dLCBbQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpdLAoJCSAgICAgW2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XSkKVDE0LDE4OQpBTV9GVU5DX01LVElNRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBTV9GVU5DX01LVElNRScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKbTRfaWYoJCMsIDAsIFtBQ19GVU5DX01LVElNRV0sIFtBQ19GVU5DX01LVElNRSgkQCldKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMTIsMjA5CkFDX1BST0dfTE5fU19tNF9kZWZ1bl9wcm8oWyQwXSlBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgbG4gLXMgd29ya3NdKQpBQ19TVUJTVChbTE5fU10sIFskYXNfbG5fc10pZG5sCmlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQplbHNlCiAgQUNfTVNHX1JFU1VMVChbbm8sIHVzaW5nICRMTl9TXSkKZmkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCw2OTgKQUNfTEFOR19ERUZJTkVtNF9kZWZpbmUoW0FDX0xBTkcoJDEpXSwgWyQ2XSkKbTRfZGVmaW5lKFtfQUNfTEFOR19BQkJSRVYoJDEpXSwgWyQyXSkKbTRfZGVmaW5lKFtfQUNfTEFOR19QUkVGSVgoJDEpXSwgWyQzXSkKbTRfZGVmaW5lKFtfQUNfQ0MoJDEpXSwgWyQ0XSkKbTRfY29weShbQUNfTEFOR19DT05GVEVTVCgkNSldLCBbQUNfTEFOR19DT05GVEVTVCgkMSldKQptNF9jb3B5KFtBQ19MQU5HX1NPVVJDRSgkNSldLCBbQUNfTEFOR19TT1VSQ0UoJDEpXSkKbTRfY29weShbX0FDX0xBTkdfTlVMTF9QUk9HUkFNKCQ1KV0sIFtfQUNfTEFOR19OVUxMX1BST0dSQU0oJDEpXSkKbTRfaWZ2YWwoWyQ1XSwKW200X2NvcHkoW0FDX0xBTkdfUFJPR1JBTSgkNSldLCBbQUNfTEFOR19QUk9HUkFNKCQxKV0pXQpbbTRfY29weShbQUNfTEFOR19DQUxMKCQ1KV0sIFtBQ19MQU5HX0NBTEwoJDEpXSldClttNF9jb3B5KFtBQ19MQU5HX0ZVTkNfTElOS19UUlkoJDUpXSwgW0FDX0xBTkdfRlVOQ19MSU5LX1RSWSgkMSldKV0KW200X2NvcHkoW0FDX0xBTkdfQk9PTF9DT01QSUxFX1RSWSgkNSldLCBbQUNfTEFOR19CT09MX0NPTVBJTEVfVFJZKCQxKV0pXQpbbTRfY29weShbQUNfTEFOR19JTlRfU0FWRSgkNSldLCBbQUNfTEFOR19JTlRfU0FWRSgkMSldKV0KW200X2NvcHkoW19BQ19MQU5HX0lPX1BST0dSQU0oJDUpXSwgW19BQ19MQU5HX0lPX1BST0dSQU0oJDEpXSldKQpUMTgsMQpfQUNfTEFOR19QUkVGSVgoQylDClQxNiwxOTUKQUNfRlVOQ19TVFJGVElNRV9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DSEVDS19GVU5DUyhzdHJmdGltZSwgW10sClsjIHN0cmZ0aW1lIGlzIGluIC1saW50bCBvbiBTQ08gVU5JWC4KQUNfQ0hFQ0tfTElCKGludGwsIHN0cmZ0aW1lLAoJICAgICBbQUNfREVGSU5FKEhBVkVfU1RSRlRJTUUpCkxJQlM9Ii1saW50bCAkTElCUyJdKV0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUMzEsMTA3Cm00X2xvY2F0aW9uKF9BQ19DT01QSUxFX0lGRUxTRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MjU5MQpUNDMsMTA0Cm00X2xvY2F0aW9uKEFDX1RZUEVfVU5TSUdORURfTE9OR19MT05HX0lOVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjU0MgpUMjgsMTA4Cm00X2xvY2F0aW9uKEFDX0ZVTkNfR0VUUEdSUCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2Z1bmN0aW9ucy5tNDo4MzIKVDcsOTMKX0FTX0JPWG00X2lmKG00X2luZGV4KG00X3RyYW5zbGl0KFtbJDFdXSwgW2BcIl0sIFskJCRdKSwgWyRdKSwKICBbLTFdLCBbJDBfTElURVJBTF0sIFskMF9JTkRJUl0pKCRAKQpUMzUsMTA2Cm00X2xvY2F0aW9uKEFDX0NPTkZJR19DT01NQU5EU19QUkUpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zdGF0dXMubTQ6MTA1NQpUOCwxODkKX200X3dyYXBtNF9pZmRlZihbJDBfdGV4dF0sCgkgIFttNF9kZWZpbmUoWyQwX3RleHRdLCBbJDFdX200X2RlZm4oWyQwX3RleHRdKVskMl0pXSwKCSAgW200X2J1aWx0aW4oW200d3JhcF0sIFttNF91bnF1b3RlKAogIF9tNF9kZWZuKFskMF90ZXh0XSlfbTRfcG9wZGVmKFskMF90ZXh0XSkpXSltNF9kZWZpbmUoWyQwX3RleHRdLCBbJDEkMl0pXSkKVDI0LDIwMzAKQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TX200X2RlZnVuX29uY2UoW0FDX1VTRV9TWVNURU1fRVhURU5TSU9OU10sIFtBQ19CRUZPUkUoWyQwXSwgW0FDX0NPTVBJTEVfSUZFTFNFXSlkbmwKQUNfQkVGT1JFKFskMF0sIFtBQ19SVU5fSUZFTFNFXSlkbmwKCiAgQUNfQ0hFQ0tfSEVBREVSKFttaW5peC9jb25maWcuaF0sIFtNSU5JWD15ZXNdLCBbTUlOSVg9XSkKICBpZiB0ZXN0ICIkTUlOSVgiID0geWVzOyB0aGVuCiAgICBBQ19ERUZJTkUoW19QT1NJWF9TT1VSQ0VdLCBbMV0sCiAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlcgogICAgICAgdGhpbmdzIHRvIHdvcmsuXSkKICAgIEFDX0RFRklORShbX1BPU0lYXzFfU09VUkNFXSwgWzJdLAogICAgICBbRGVmaW5lIHRvIDIgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIFBPU0lYLjEgZmVhdHVyZXMKICAgICAgIGV4Y2VwdCB3aXRoIHRoaXMgZGVmaW5lZC5dKQogICAgQUNfREVGSU5FKFtfTUlOSVhdLCBbMV0sCiAgICAgIFtEZWZpbmUgdG8gMSBpZiBvbiBNSU5JWC5dKQogIGZpCgpkbmwgVXNlIGEgZGlmZmVyZW50IGtleSB0aGFuIF9fRVhURU5TSU9OU19fLCBhcyB0aGF0IG5hbWUgYnJva2UgZXhpc3RpbmcKZG5sIGNvbmZpZ3VyZS5hYyB3aGVuIHVzaW5nIGF1dG9oZWFkZXIgMi42Mi4KICBBSF9WRVJCQVRJTShbVVNFX1NZU1RFTV9FWFRFTlNJT05TXSwKWy8qIEVuYWJsZSBleHRlbnNpb25zIG9uIEFJWCAzLCBJbnRlcml4LiAgKi8KI2lmbmRlZiBfQUxMX1NPVVJDRQojIHVuZGVmIF9BTExfU09VUkNFCiNlbmRpZgovKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCiNpZm5kZWYgX0dOVV9TT1VSQ0UKIyB1bmRlZiBfR05VX1NPVVJDRQojZW5kaWYKLyogRW5hYmxlIHRocmVhZGluZyBleHRlbnNpb25zIG9uIFNvbGFyaXMuICAqLwojaWZuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUwojIHVuZGVmIF9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUwojZW5kaWYKLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gSFAgTm9uU3RvcC4gICovCiNpZm5kZWYgX1RBTkRFTV9TT1VSQ0UKIyB1bmRlZiBfVEFOREVNX1NPVVJDRQojZW5kaWYKLyogRW5hYmxlIGdlbmVyYWwgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KI2lmbmRlZiBfX0VYVEVOU0lPTlNfXwojIHVuZGVmIF9fRVhURU5TSU9OU19fCiNlbmRpZgpdKQogIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGl0IGlzIHNhZmUgdG8gZGVmaW5lIF9fRVhURU5TSU9OU19fXSwKICAgIFthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfX10sCiAgICBbQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKFsKIwkgIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCgkgIEFDX0lOQ0xVREVTX0RFRkFVTFRdKV0sCiAgICAgICBbYWNfY3Zfc2FmZV90b19kZWZpbmVfX19leHRlbnNpb25zX189eWVzXSwKICAgICAgIFthY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXz1ub10pXSkKICB0ZXN0ICRhY19jdl9zYWZlX3RvX2RlZmluZV9fX2V4dGVuc2lvbnNfXyA9IHllcyAmJgogICAgQUNfREVGSU5FKFtfX0VYVEVOU0lPTlNfX10pCiAgQUNfREVGSU5FKFtfQUxMX1NPVVJDRV0pCiAgQUNfREVGSU5FKFtfR05VX1NPVVJDRV0pCiAgQUNfREVGSU5FKFtfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1NdKQogIEFDX0RFRklORShbX1RBTkRFTV9TT1VSQ0VdKQpdLCBtNF9pZihfbTRfZGl2ZXJ0X2R1bXAsIFtdLAogIFtbX200X2RlZnVuX3BybyhbQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TXSltNF91bnF1b3RlKF0sIFspX200X2RlZnVuX2VwaShbQUNfVVNFX1NZU1RFTV9FWFRFTlNJT05TXSldXSwKbTRfaWZkZWYoW19tNF9kaXZlcnRpbmcoW0FDX1VTRV9TWVNURU1fRVhURU5TSU9OU10pXSwgWy1dKSwgWy1dLCBbW200X3VucXVvdGUoXSwgWyldXSwKICBbW19tNF9yZXF1aXJlX2NhbGwoW0FDX1VTRV9TWVNURU1fRVhURU5TSU9OU10sXSwgWywgX200X2RpdmVydF9kdW1wKV1dKSkKVDE3LDUyOApBQ19UWVBFX01CU1RBVEVfVF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyhbZm9yIG1ic3RhdGVfdF0sIGFjX2N2X3R5cGVfbWJzdGF0ZV90LAogICAgIFtBQ19DT01QSUxFX0lGRUxTRSgKCVtBQ19MQU5HX1BST0dSQU0oCgkgICBbQUNfSU5DTFVERVNfREVGQVVMVAojCSAgICBpbmNsdWRlIDx3Y2hhci5oPl0sCgkgICBbbWJzdGF0ZV90IHg7IHJldHVybiBzaXplb2YgeDtdKV0sCglbYWNfY3ZfdHlwZV9tYnN0YXRlX3Q9eWVzXSwKCVthY19jdl90eXBlX21ic3RhdGVfdD1ub10pXSkKICAgaWYgdGVzdCAkYWNfY3ZfdHlwZV9tYnN0YXRlX3QgPSB5ZXM7IHRoZW4KICAgICBBQ19ERUZJTkUoW0hBVkVfTUJTVEFURV9UXSwgMSwKCSAgICAgICBbRGVmaW5lIHRvIDEgaWYgPHdjaGFyLmg+IGRlY2xhcmVzIG1ic3RhdGVfdC5dKQogICBlbHNlCiAgICAgQUNfREVGSU5FKFttYnN0YXRlX3RdLCBpbnQsCgkgICAgICAgW0RlZmluZSB0byBhIHR5cGUgaWYgPHdjaGFyLmg+IGRvZXMgbm90IGRlZmluZS5dKQogICBmaVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjgsMTAzCm00X2xvY2F0aW9uKF9BQ19MQU5HX1BSRUZJWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2xhbmcubTQ6MTUwClQyOCw0Cl9BQ19MQU5HX0FCQlJFVihPYmplY3RpdmUgQylvYmpjClQxNCw4NwpBQ19QUk9HX0NDX0M4OV9tNF9kZWZ1bl9wcm8oWyQwXSkgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCiAgX0FDX1BST0dfQ0NfQzg5CltdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsMTA2Cm00X2xvY2F0aW9uKEFDX09VVFBVVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3N0YXR1cy5tNDoxMjQxClQxNCwxMjczCl9BQ19DQUNIRV9EVU1QIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCiMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCigKICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uIFsncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCddYDsgZG8KICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgogICAgY2FzZSAkYWNfdmFsIGluICMoCiAgICAqJHthc19ubH0qKQogICAgICBjYXNlICRhY192YXIgaW4gIygKICAgICAgKl9jdl8qKSBBQ19NU0dfV0FSTihbY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmVdKSA7OwogICAgICBlc2FjCiAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAogICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCiAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCiAgICAgICopIEFTX1VOU0VUKFskYWNfdmFyXSkgOzsKICAgICAgZXNhYyA7OwogICAgZXNhYwogIGRvbmUKCiAgKHNldCkgMj4mMSB8CiAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCiAgICAqJHthc19ubH1hY19zcGFjZT1cICopCiAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzOiBkb3VibGUtcXVvdGUKICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXC4KICAgICAgc2VkIC1uIFwKCVsicy8nLydcXFxcJycvZzsKCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIl0KICAgICAgOzsgIygKICAgICopCiAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCiAgICAgIHNlZCAtbiBbIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIl0KICAgICAgOzsKICAgIGVzYWMgfAogICAgc29ydAopZG5sCgpUMjAsMzU2CkFDX1NUUlVDVF9TVF9CTEtTSVpFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1NUUlVDVF9TVF9CTEtTSVpFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9ibGtzaXplXSwKCQkgW0FDX0RFRklORShIQVZFX1NUX0JMS1NJWkUsIDEsCgkJCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91ciBgc3RydWN0IHN0YXQnIGhhcwoJCQkgICAgIGBzdF9ibGtzaXplJy4gIERlcHJlY2F0ZWQsIHVzZQoJCQkgICAgIGBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMS1NJWkUnIGluc3RlYWQuXSldKQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDE5LDE5OApBQ19GVU5DX0ZOTUFUQ0hfR05VX200X2RlZnVuX3BybyhbJDBdKUFDX1JFUVVJUkUoW0FDX0dOVV9TT1VSQ0VdKQpfQUNfRlVOQ19GTk1BVENIX0lGKFtHTlVdLCBbYWNfY3ZfZnVuY19mbm1hdGNoX2dudV0sCgkJICAgIFtybSAtZiAiJGFjX2NvbmZpZ19saWJvYmpfZGlyL2ZubWF0Y2guaCJdLAoJCSAgICBbX0FDX0xJQk9CSl9GTk1BVENIXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMSw4NDYKQUNfQ19JTkxJTkVfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciBpbmxpbmVdLCBhY19jdl9jX2lubGluZSwKW2FjX2N2X2NfaW5saW5lPW5vCmZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoClsjaWZuZGVmIF9fY3BsdXNwbHVzCnR5cGVkZWYgaW50IGZvb190OwpzdGF0aWMgJGFjX2t3IGZvb190IHN0YXRpY19mb28gKCkge3JldHVybiAwOyB9CiRhY19rdyBmb29fdCBmb28gKCkge3JldHVybiAwOyB9CiNlbmRpZgpdKV0sCgkJICAgIFthY19jdl9jX2lubGluZT0kYWNfa3ddKQogIHRlc3QgIiRhY19jdl9jX2lubGluZSIgIT0gbm8gJiYgYnJlYWsKZG9uZQpdKQpBSF9WRVJCQVRJTShbaW5saW5lXSwKWy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgogICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KI2lmbmRlZiBfX2NwbHVzcGx1cwojdW5kZWYgaW5saW5lCiNlbmRpZl0pCmNhc2UgJGFjX2N2X2NfaW5saW5lIGluCiAgaW5saW5lIHwgeWVzKSA7OwogICopCiAgICBjYXNlICRhY19jdl9jX2lubGluZSBpbgogICAgICBubykgYWNfdmFsPTs7CiAgICAgICopIGFjX3ZhbD0kYWNfY3ZfY19pbmxpbmU7OwogICAgZXNhYwogICAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgojaWZuZGVmIF9fY3BsdXNwbHVzCiNkZWZpbmUgaW5saW5lICRhY192YWwKI2VuZGlmCl9BQ0VPRgogICAgOzsKZXNhYwpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDMzLDEwNgptNF9sb2NhdGlvbihfQUNfQ0hFQ0tfSEVBREVSX09MRCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2hlYWRlcnMubTQ6MjE1ClQyMywxMDYKbTRfbG9jYXRpb24oQUNfRk9SRUFDSCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL2dlbmVyYWwubTQ6MTk2ClQzOCwxMDQKbTRfbG9jYXRpb24oQUNfVFlQRV9MT05HX0RPVUJMRV9XSURFUikvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjQxMwpUNTAsMTA4Cm00X2xvY2F0aW9uKEFDX0ZVTkNfTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTkspL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6ODUzCkY5LDYKbTRfZGVmaW5lZGVmaW5lClQyNCwxODQ0Cl9BQ19QUk9HX0xFWF9ZWVRFWFRfREVDTGNhdCA+Y29uZnRlc3QubCA8PF9BQ0VPRlsKJSUKYSB7IEVDSE87IH0KYiB7IFJFSkVDVDsgfQpjIHsgeXltb3JlICgpOyB9CmQgeyB5eWxlc3MgKDEpOyB9CmUgeyB5eWxlc3MgKGlucHV0ICgpICE9IDApOyB9CmYgeyB1bnB1dCAoeXl0ZXh0WzBdKTsgfQouIHsgQkVHSU4gSU5JVElBTDsgfQolJQojaWZkZWYgWVlURVhUX1BPSU5URVIKZXh0ZXJuIGNoYXIgKnl5dGV4dDsKI2VuZGlmCmludAptYWluICh2b2lkKQp7CiAgcmV0dXJuICEgeXlsZXggKCkgKyAhIHl5d3JhcCAoKTsKfQpdX0FDRU9GCl9BQ19ET19WQVIoTEVYIGNvbmZ0ZXN0LmwpCkFDX0NBQ0hFX0NIRUNLKFtsZXggb3V0cHV0IGZpbGUgcm9vdF0sIFthY19jdl9wcm9nX2xleF9yb290XSwgWwppZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCiAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXgueXkKZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5CmVsc2UKICBBQ19NU0dfRVJST1IoW2Nhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cF0pCmZpXSkKQUNfU1VCU1QoW0xFWF9PVVRQVVRfUk9PVF0sIFskYWNfY3ZfcHJvZ19sZXhfcm9vdF0pZG5sCgppZiB0ZXN0IC16ICIke0xFWExJQitzZXR9IjsgdGhlbgogIEFDX0NBQ0hFX0NIRUNLKFtsZXggbGlicmFyeV0sIFthY19jdl9saWJfbGV4XSwgWwogICAgYWNfc2F2ZV9MSUJTPSRMSUJTCiAgICBhY19jdl9saWJfbGV4PSdub25lIG5lZWRlZCcKICAgIGZvciBhY19saWIgaW4gJycgLWxmbCAtbGw7IGRvCiAgICAgIExJQlM9IiRhY19saWIgJGFjX3NhdmVfTElCUyIKICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfREVGSU5FU19QUk9WSURFRFtgY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2BdXSwKCVthY19jdl9saWJfbGV4PSRhY19saWJdKQogICAgICB0ZXN0ICIkYWNfY3ZfbGliX2xleCIgIT0gJ25vbmUgbmVlZGVkJyAmJiBicmVhawogICAgZG9uZQogICAgTElCUz0kYWNfc2F2ZV9MSUJTCiAgXSkKICB0ZXN0ICIkYWNfY3ZfbGliX2xleCIgIT0gJ25vbmUgbmVlZGVkJyAmJiBMRVhMSUI9JGFjX2N2X2xpYl9sZXgKZmkKQUNfU1VCU1QoTEVYTElCKQoKQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyLCBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciwKWyMgUE9TSVggc2F5cyBsZXggY2FuIGRlY2xhcmUgeXl0ZXh0IGVpdGhlciBhcyBhIHBvaW50ZXIgb3IgYW4gYXJyYXk7IHRoZQojIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiAgRmlndXJlIG91dCB3aGljaCBpdCBpcywgc2luY2UKIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KYWNfc2F2ZV9MSUJTPSRMSUJTCkxJQlM9IiRMRVhMSUIgJGFjX3NhdmVfTElCUyIKQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfREVGSU5FU19QUk9WSURFRAogIFsjZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKYGNhdCAkTEVYX09VVFBVVF9ST09ULmNgXV0sCiAgW2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPXllc10pCkxJQlM9JGFjX3NhdmVfTElCUwpdKQpkbmwKaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoWVlURVhUX1BPSU5URVIsIDEsCgkgICAgW0RlZmluZSB0byAxIGlmIGBsZXgnIGRlY2xhcmVzIGB5eXRleHQnIGFzIGEgYGNoYXIgKicgYnkgZGVmYXVsdCwKCSAgICAgbm90IGEgYGNoYXJbXScuXSkKZmkKcm0gLWYgY29uZnRlc3QubCAkTEVYX09VVFBVVF9ST09ULmMKClQxOSwxNDQzMgpfQUNfSU5JVF9QQVJTRV9BUkdTbTRfZGl2ZXJ0X3B1c2goW1BBUlNFX0FSR1NdKWRubAoKIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgphY19pbml0X2hlbHA9CmFjX2luaXRfdmVyc2lvbj1mYWxzZQphY191bnJlY29nbml6ZWRfb3B0cz0KYWNfdW5yZWNvZ25pemVkX3NlcD0KIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgpjYWNoZV9maWxlPS9kZXYvbnVsbApBQ19TVUJTVChleGVjX3ByZWZpeCwgTk9ORSlkbmwKbm9fY3JlYXRlPQpub19yZWN1cnNpb249CkFDX1NVQlNUKHByZWZpeCwgTk9ORSlkbmwKcHJvZ3JhbV9wcmVmaXg9Tk9ORQpwcm9ncmFtX3N1ZmZpeD1OT05FCkFDX1NVQlNUKHByb2dyYW1fdHJhbnNmb3JtX25hbWUsIFtzLHgseCxdKWRubApzaWxlbnQ9CnNpdGU9CnNyY2Rpcj0KdmVyYm9zZT0KeF9pbmNsdWRlcz1OT05FCnhfbGlicmFyaWVzPU5PTkUKCiMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgojIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgojIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgojIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCkFDX1NVQlNUKFtiaW5kaXJdLCAgICAgICAgIFsnJHtleGVjX3ByZWZpeH0vYmluJ10pZG5sCkFDX1NVQlNUKFtzYmluZGlyXSwgICAgICAgIFsnJHtleGVjX3ByZWZpeH0vc2JpbiddKWRubApBQ19TVUJTVChbbGliZXhlY2Rpcl0sICAgICBbJyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnXSlkbmwKQUNfU1VCU1QoW2RhdGFyb290ZGlyXSwgICAgWycke3ByZWZpeH0vc2hhcmUnXSlkbmwKQUNfU1VCU1QoW2RhdGFkaXJdLCAgICAgICAgWycke2RhdGFyb290ZGlyfSddKWRubApBQ19TVUJTVChbc3lzY29uZmRpcl0sICAgICBbJyR7cHJlZml4fS9ldGMnXSlkbmwKQUNfU1VCU1QoW3NoYXJlZHN0YXRlZGlyXSwgWycke3ByZWZpeH0vY29tJ10pZG5sCkFDX1NVQlNUKFtsb2NhbHN0YXRlZGlyXSwgIFsnJHtwcmVmaXh9L3ZhciddKWRubApBQ19TVUJTVChbaW5jbHVkZWRpcl0sICAgICBbJyR7cHJlZml4fS9pbmNsdWRlJ10pZG5sCkFDX1NVQlNUKFtvbGRpbmNsdWRlZGlyXSwgIFsnL3Vzci9pbmNsdWRlJ10pZG5sCkFDX1NVQlNUKFtkb2NkaXJdLCAgICAgICAgIFttNF9pZnNldChbQUNfUEFDS0FHRV9UQVJOQU1FXSwKCQkJCSAgICAgWycke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFX1RBUk5BTUV9J10sCgkJCQkgICAgIFsnJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRX0nXSldKWRubApBQ19TVUJTVChbaW5mb2Rpcl0sICAgICAgICBbJyR7ZGF0YXJvb3RkaXJ9L2luZm8nXSlkbmwKQUNfU1VCU1QoW2h0bWxkaXJdLCAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW2R2aWRpcl0sICAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW3BkZmRpcl0sICAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW3BzZGlyXSwgICAgICAgICAgWycke2RvY2Rpcn0nXSlkbmwKQUNfU1VCU1QoW2xpYmRpcl0sICAgICAgICAgWycke2V4ZWNfcHJlZml4fS9saWInXSlkbmwKQUNfU1VCU1QoW2xvY2FsZWRpcl0sICAgICAgWycke2RhdGFyb290ZGlyfS9sb2NhbGUnXSlkbmwKQUNfU1VCU1QoW21hbmRpcl0sICAgICAgICAgWycke2RhdGFyb290ZGlyfS9tYW4nXSlkbmwKCmFjX3ByZXY9CmFjX2Rhc2hkYXNoPQpmb3IgYWNfb3B0aW9uCmRvCiAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCiAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCiAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCiAgICBhY19wcmV2PQogICAgY29udGludWUKICBmaQoKICBjYXNlICRhY19vcHRpb24gaW4KICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbW149XV0qPVwoLipcKSdgIDs7CiAgKj0pICAgYWNfb3B0YXJnPSA7OwogICopICAgIGFjX29wdGFyZz15ZXMgOzsKICBlc2FjCgogICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCgogIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgogIC0tKQogICAgYWNfZGFzaGRhc2g9eWVzIDs7CgogIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCiAgICBhY19wcmV2PWJpbmRpciA7OwogIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCiAgICBiaW5kaXI9JGFjX29wdGFyZyA7OwoKICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQogICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OwogIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQogICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OwoKICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCiAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCiAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQogICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CgogIC0tY29uZmlnLWNhY2hlIHwgLUMpCiAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OwoKICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCkKICAgIGFjX3ByZXY9ZGF0YWRpciA7OwogIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCiAgICBkYXRhZGlyPSRhY19vcHRhcmcgOzsKCiAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCiAgfCAtLWRhdGFyb28gfCAtLWRhdGFybyB8IC0tZGF0YXIpCiAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CiAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAogIHwgLS1kYXRhcm9vdD0qIHwgLS1kYXRhcm9vPSogfCAtLWRhdGFybz0qIHwgLS1kYXRhcj0qKQogICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OwoKICBfQUNfSU5JVF9QQVJTRV9FTkFCTEUoW2Rpc2FibGVdKQoKICAtZG9jZGlyIHwgLS1kb2NkaXIgfCAtLWRvY2RpIHwgLS1kb2MgfCAtLWRvKQogICAgYWNfcHJldj1kb2NkaXIgOzsKICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKICAgIGRvY2Rpcj0kYWNfb3B0YXJnIDs7CgogIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCiAgICBhY19wcmV2PWR2aWRpciA7OwogIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCiAgICBkdmlkaXI9JGFjX29wdGFyZyA7OwoKICBfQUNfSU5JVF9QQVJTRV9FTkFCTEUoW2VuYWJsZV0pCgogIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCiAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCiAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CiAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCiAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKCiAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgogICAgd2l0aF9nYXM9eWVzIDs7CgogIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCiAgICBhY19pbml0X2hlbHA9bG9uZyA7OwogIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCiAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKCiAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCiAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQogICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CgogIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQogICAgYWNfcHJldj1odG1sZGlyIDs7CiAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCiAgfCAtLWh0PSopCiAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKCiAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAogIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCiAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAogIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwoKICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQogICAgYWNfcHJldj1pbmZvZGlyIDs7CiAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OwoKICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQogICAgYWNfcHJldj1saWJkaXIgOzsKICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCiAgICBsaWJkaXI9JGFjX29wdGFyZyA7OwoKICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCiAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCiAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAogIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQogICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CgogIC1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpciB8IC0tbG9jYWxlZGkgfCAtLWxvY2FsZWQgfCAtLWxvY2FsZSkKICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CiAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKICAgIGxvY2FsZWRpcj0kYWNfb3B0YXJnIDs7CgogIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCB8IC0tbG9jYWxzKQogICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CiAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCiAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCiAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKCiAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKICAgIGFjX3ByZXY9bWFuZGlyIDs7CiAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQogICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKCiAgLW5mcCB8IC0tbmZwIHwgLS1uZikKICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCiAgICB3aXRoX2ZwPW5vIDs7CgogIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCiAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCiAgICBub19jcmVhdGU9eWVzIDs7CgogIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAogIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQogICAgbm9fcmVjdXJzaW9uPXllcyA7OwoKICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCiAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCiAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQogICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CiAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCiAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAogIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCiAgICBvbGRpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKCiAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKICAgIGFjX3ByZXY9cHJlZml4IDs7CiAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQogICAgcHJlZml4PSRhY19vcHRhcmcgOzsKCiAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCiAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CgogIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCiAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCiAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CiAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCiAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQogICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OwoKICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCiAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAogIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAogIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCiAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAogIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAogIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwogIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCiAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCiAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCiAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCiAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQogICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CgogIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCiAgICBhY19wcmV2PXBkZmRpciA7OwogIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCiAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwoKICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQogICAgYWNfcHJldj1wc2RpciA7OwogIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQogICAgcHNkaXI9JGFjX29wdGFyZyA7OwoKICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAogIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQogICAgc2lsZW50PXllcyA7OwoKICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKICAgIGFjX3ByZXY9c2JpbmRpciA7OwogIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCiAgfCAtLXNiaT0qIHwgLS1zYj0qKQogICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CgogIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAogIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAogIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCiAgfCAtLXNoYSB8IC0tc2gpCiAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CiAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCiAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKICB8IC0tc2hhPSogfCAtLXNoPSopCiAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CgogIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCiAgICBhY19wcmV2PXNpdGUgOzsKICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQogICAgc2l0ZT0kYWNfb3B0YXJnIDs7CgogIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCiAgICBhY19wcmV2PXNyY2RpciA7OwogIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCiAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwoKICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCiAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCiAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAogIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKICAgIHN5c2NvbmZkaXI9JGFjX29wdGFyZyA7OwoKICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQogICAgYWNfcHJldj10YXJnZXRfYWxpYXMgOzsKICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCiAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwoKICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQogICAgdmVyYm9zZT15ZXMgOzsKCiAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CgogIF9BQ19JTklUX1BBUlNFX0VOQUJMRShbd2l0aF0pCgogIF9BQ19JTklUX1BBUlNFX0VOQUJMRShbd2l0aG91dF0pCgogIC0teCkKICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KICAgIHdpdGhfeD15ZXMgOzsKCiAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAogIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCiAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAogIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKICAgIHhfaW5jbHVkZXM9JGFjX29wdGFyZyA7OwoKICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAogIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQogICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwogIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKCiAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogYCRhY19vcHRpb24nClRyeSBgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXSkKICAgIDs7CgogICo9KikKICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtbXj1dXSpcKT0nYAogICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgogICAgY2FzZSAkYWNfZW52dmFyIGluICMoCiAgICAgICcnIHwgW1swLTldXSogfCAqW1shXyRhc19jcl9hbG51bV1dKiApCiAgICAgIEFDX01TR19FUlJPUihbaW52YWxpZCB2YXJpYWJsZSBuYW1lOiBgJGFjX2VudnZhciddKSA7OwogICAgZXNhYwogICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCiAgICBleHBvcnQgJGFjX2VudnZhciA7OwoKICAqKQogICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgogICAgQUNfTVNHX1dBUk4oW3lvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXRdKQogICAgZXhwciAieCRhY19vcHRpb24iIDogIlsuKlteLS5fJGFzX2NyX2FsbnVtXV0iID4vZGV2L251bGwgJiYKICAgICAgQUNfTVNHX1dBUk4oW2ludmFsaWQgaG9zdCB0eXBlOiAkYWNfb3B0aW9uXSkKICAgIDogIiR7YnVpbGRfYWxpYXM9JGFjX29wdGlvbn0gJHtob3N0X2FsaWFzPSRhY19vcHRpb259ICR7dGFyZ2V0X2FsaWFzPSRhY19vcHRpb259IgogICAgOzsKCiAgZXNhYwpkb25lCgppZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KICBhY19vcHRpb249LS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgCiAgQUNfTVNHX0VSUk9SKFttaXNzaW5nIGFyZ3VtZW50IHRvICRhY19vcHRpb25dKQpmaQoKaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgogIGNhc2UgJGVuYWJsZV9vcHRpb25fY2hlY2tpbmcgaW4KICAgIG5vKSA7OwogICAgZmF0YWwpIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0c10pIDs7CiAgICAqKSAgICAgQUNfTVNHX1dBUk4oIFt1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzXSkgOzsKICBlc2FjCmZpCgojIENoZWNrIGFsbCBkaXJlY3RvcnkgYXJndW1lbnRzIGZvciBjb25zaXN0ZW5jeS4KZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCgkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCgkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAoJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCmRvCiAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KICBjYXNlICRhY192YWwgaW4KICAgICovICkKICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbW14vXV1cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKICBlc2FjCiAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgogIGNhc2UgJGFjX3ZhbCBpbgogICAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKiApICBjb250aW51ZTs7CiAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CiAgZXNhYwogIEFDX01TR19FUlJPUihbZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbF0pCmRvbmUKCiMgVGhlcmUgbWlnaHQgYmUgcGVvcGxlIHdobyBkZXBlbmQgb24gdGhlIG9sZCBicm9rZW4gYmVoYXZpb3I6IGAkaG9zdCcKIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCiMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KYnVpbGQ9JGJ1aWxkX2FsaWFzCmhvc3Q9JGhvc3RfYWxpYXMKdGFyZ2V0PSR0YXJnZXRfYWxpYXMKCiMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KaWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCiAgaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgPSB4OyB0aGVuCiAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKICAgIEFDX01TR19XQVJOKFtpZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgogICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWRdKQogIGVsaWYgdGVzdCAieCRidWlsZF9hbGlhcyIgIT0gIngkaG9zdF9hbGlhcyI7IHRoZW4KICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKICBmaQpmaQoKYWNfdG9vbF9wcmVmaXg9CnRlc3QgLW4gIiRob3N0X2FsaWFzIiAmJiBhY190b29sX3ByZWZpeD0kaG9zdF9hbGlhcy0KCnRlc3QgIiRzaWxlbnQiID0geWVzICYmIGV4ZWMgQVNfTUVTU0FHRV9GRD4vZGV2L251bGwKCm00X2RpdmVydF9wb3AoW1BBUlNFX0FSR1NdKWRubAoKVDEzLDE4OApBQ19SRVRTSUdUWVBFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1JFVFNJR1RZUEUnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9TSUdOQUxdLCBbQUNfVFlQRV9TSUdOQUwoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI4LDAKbTRfaW5jbHVkZShhdXRvY29uZi9sYW5nLm00KQpUMjEsMTE0Cl9BQ19JTklUX1BBUlNFX0VOQUJMRW00X2JtYXRjaChbJDFdLCBbXndpdGhdLAoJICAgW19BQ19JTklUX1BBUlNFX0VOQUJMRTIoWyQxXSwgW3dpdGhdKV0sCgkgICBbX0FDX0lOSVRfUEFSU0VfRU5BQkxFMihbJDFdLCBbZW5hYmxlXSldKQpUMTQsOTAxCkFDX0ZVTkNfU1RSVE9EX200X2RlZnVuX3BybyhbJDBdKUFDX1NVQlNUKFBPV19MSUIpZG5sCkFDX0NBQ0hFX0NIRUNLKGZvciB3b3JraW5nIHN0cnRvZCwgYWNfY3ZfZnVuY19zdHJ0b2QsCltBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbWwpdQUNfSU5DTFVERVNfREVGQVVMVFsKI2lmbmRlZiBzdHJ0b2QKZG91YmxlIHN0cnRvZCAoKTsKI2VuZGlmCmludAptYWluKCkKewogIHsKICAgIC8qIFNvbWUgdmVyc2lvbnMgb2YgTGludXggc3RydG9kIG1pcy1wYXJzZSBzdHJpbmdzIHdpdGggbGVhZGluZyAnKycuICAqLwogICAgY2hhciAqc3RyaW5nID0gIiArNjkiOwogICAgY2hhciAqdGVybTsKICAgIGRvdWJsZSB2YWx1ZTsKICAgIHZhbHVlID0gc3RydG9kIChzdHJpbmcsICZ0ZXJtKTsKICAgIGlmICh2YWx1ZSAhPSA2OSB8fCB0ZXJtICE9IChzdHJpbmcgKyA0KSkKICAgICAgcmV0dXJuIDE7CiAgfQoKICB7CiAgICAvKiBVbmRlciBTb2xhcmlzIDIuNCwgc3RydG9kIHJldHVybnMgdGhlIHdyb25nIHZhbHVlIGZvciB0aGUKICAgICAgIHRlcm1pbmF0aW5nIGNoYXJhY3RlciB1bmRlciBzb21lIGNvbmRpdGlvbnMuICAqLwogICAgY2hhciAqc3RyaW5nID0gIk5hTiI7CiAgICBjaGFyICp0ZXJtOwogICAgc3RydG9kIChzdHJpbmcsICZ0ZXJtKTsKICAgIGlmICh0ZXJtICE9IHN0cmluZyAmJiAqKHRlcm0gLSAxKSA9PSAwKQogICAgICByZXR1cm4gMTsKICB9CiAgcmV0dXJuIDA7Cn0KXV0pXSwKCSAgICAgICBhY19jdl9mdW5jX3N0cnRvZD15ZXMsCgkgICAgICAgYWNfY3ZfZnVuY19zdHJ0b2Q9bm8sCgkgICAgICAgYWNfY3ZfZnVuY19zdHJ0b2Q9bm8pXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19zdHJ0b2QgPSBubzsgdGhlbgogIF9BQ19MSUJPQkpfU1RSVE9ECmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUMjIsMTA2Cm00X2xvY2F0aW9uKEFNX0VYRUVYVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL29sZG5hbWVzLm00Ojg3ClQxMCwyNwptNF9kZWZhdWx0bTRfaWYoWyQxXSwgW10sIFskMl0sIFskMV0pClQ5LDUKX200X2N1cnJ5WyQxXSkKVDIyLDIyCkFDX09VVFBVVF9DT01NQU5EU19QUkVfQUNfTElCT0JKU19OT1JNQUxJWkUKClQxMywxMzYxCkFDX0NfUkVTVFJJQ1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0FDSEVfQ0hFQ0soW2ZvciBDL0MrKyByZXN0cmljdCBrZXl3b3JkXSwgYWNfY3ZfY19yZXN0cmljdCwKICBbYWNfY3ZfY19yZXN0cmljdD1ubwogICAjIFRoZSBvcmRlciBoZXJlIGNhdGVycyB0byB0aGUgZmFjdCB0aGF0IEMrKyBkb2VzIG5vdCByZXF1aXJlIHJlc3RyaWN0LgogICBmb3IgYWNfa3cgaW4gX19yZXN0cmljdCBfX3Jlc3RyaWN0X18gX1Jlc3RyaWN0IHJlc3RyaWN0OyBkbwogICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oCiAgICAgIFtbdHlwZWRlZiBpbnQgKiBpbnRfcHRyOwoJaW50IGZvbyAoaW50X3B0ciAkYWNfa3cgaXApIHsKCXJldHVybiBpcFswXTsKICAgICAgIH1dXSwKICAgICAgW1tpbnQgc1sxXTsKCWludCAqICRhY19rdyB0ID0gczsKCXRbMF0gPSAwOwoJcmV0dXJuIGZvbyh0KV1dKV0sCiAgICAgIFthY19jdl9jX3Jlc3RyaWN0PSRhY19rd10pCiAgICAgdGVzdCAiJGFjX2N2X2NfcmVzdHJpY3QiICE9IG5vICYmIGJyZWFrCiAgIGRvbmUKICBdKQogQUhfVkVSQkFUSU0oW3Jlc3RyaWN0XSwKWy8qIERlZmluZSB0byB0aGUgZXF1aXZhbGVudCBvZiB0aGUgQzk5ICdyZXN0cmljdCcga2V5d29yZCwgb3IgdG8KICAgbm90aGluZyBpZiB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICBEbyBub3QgZGVmaW5lIGlmIHJlc3RyaWN0IGlzCiAgIHN1cHBvcnRlZCBkaXJlY3RseS4gICovCiN1bmRlZiByZXN0cmljdAovKiBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBTdW4gQysrOiBpdCBkb2VzIG5vdCBzdXBwb3J0IF9SZXN0cmljdCBvcgogICBfX3Jlc3RyaWN0X18sIGV2ZW4gdGhvdWdoIHRoZSBjb3JyZXNwb25kaW5nIFN1biBDIGNvbXBpbGVyIGVuZHMgdXAgd2l0aAogICAiI2RlZmluZSByZXN0cmljdCBfUmVzdHJpY3QiIG9yICIjZGVmaW5lIHJlc3RyaWN0IF9fcmVzdHJpY3RfXyIgaW4gdGhlCiAgIHByZXZpb3VzIGxpbmUuICBQZXJoYXBzIHNvbWUgZnV0dXJlIHZlcnNpb24gb2YgU3VuIEMrKyB3aWxsIHdvcmsgd2l0aAogICByZXN0cmljdDsgaWYgc28sIGhvcGVmdWxseSBpdCBkZWZpbmVzIF9fUkVTVFJJQ1QgbGlrZSBTdW4gQyBkb2VzLiAgKi8KI2lmIGRlZmluZWQgX19TVU5QUk9fQ0MgJiYgIWRlZmluZWQgX19SRVNUUklDVAojIGRlZmluZSBfUmVzdHJpY3QKIyBkZWZpbmUgX19yZXN0cmljdF9fCiNlbmRpZl0pCiBjYXNlICRhY19jdl9jX3Jlc3RyaWN0IGluCiAgIHJlc3RyaWN0KSA7OwogICBubykgQUNfREVGSU5FKFtyZXN0cmljdF0sIFtdKSA7OwogICAqKSAgQUNfREVGSU5FX1VOUVVPVEVEKFtyZXN0cmljdF0sIFskYWNfY3ZfY19yZXN0cmljdF0pIDs7CiBlc2FjCltdX200X2RlZnVuX2VwaShbJDBdKQpUMTcsMjA0MQpfQUNfUEFUSF9YX0RJUkVDVCMgU3RhbmRhcmQgc2V0IG9mIGNvbW1vbiBkaXJlY3RvcmllcyBmb3IgWCBoZWFkZXJzLgojIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KYWNfeF9oZWFkZXJfZGlycz0nCi91c3IvWDExL2luY2x1ZGUKL3Vzci9YMTFSNy9pbmNsdWRlCi91c3IvWDExUjYvaW5jbHVkZQovdXNyL1gxMVI1L2luY2x1ZGUKL3Vzci9YMTFSNC9pbmNsdWRlCgovdXNyL2luY2x1ZGUvWDExCi91c3IvaW5jbHVkZS9YMTFSNwovdXNyL2luY2x1ZGUvWDExUjYKL3Vzci9pbmNsdWRlL1gxMVI1Ci91c3IvaW5jbHVkZS9YMTFSNAoKL3Vzci9sb2NhbC9YMTEvaW5jbHVkZQovdXNyL2xvY2FsL1gxMVI3L2luY2x1ZGUKL3Vzci9sb2NhbC9YMTFSNi9pbmNsdWRlCi91c3IvbG9jYWwvWDExUjUvaW5jbHVkZQovdXNyL2xvY2FsL1gxMVI0L2luY2x1ZGUKCi91c3IvbG9jYWwvaW5jbHVkZS9YMTEKL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI3Ci91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNgovdXNyL2xvY2FsL2luY2x1ZGUvWDExUjUKL3Vzci9sb2NhbC9pbmNsdWRlL1gxMVI0CgovdXNyL1gzODYvaW5jbHVkZQovdXNyL3gzODYvaW5jbHVkZQovdXNyL1hGcmVlODYvaW5jbHVkZS9YMTEKCi91c3IvaW5jbHVkZQovdXNyL2xvY2FsL2luY2x1ZGUKL3Vzci91bnN1cHBvcnRlZC9pbmNsdWRlCi91c3IvYXRoZW5hL2luY2x1ZGUKL3Vzci9sb2NhbC94MTFyNS9pbmNsdWRlCi91c3IvbHBwL1hhbXBsZXMvaW5jbHVkZQoKL3Vzci9vcGVud2luL2luY2x1ZGUKL3Vzci9vcGVud2luL3NoYXJlL2luY2x1ZGUnCgppZiB0ZXN0ICIkYWNfeF9pbmNsdWRlcyIgPSBubzsgdGhlbgogICMgR3Vlc3Mgd2hlcmUgdG8gZmluZCBpbmNsdWRlIGZpbGVzLCBieSBsb29raW5nIGZvciBYbGliLmguCiAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KICBBQ19QUkVQUk9DX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW0AlOkBpbmNsdWRlIDxYMTEvWGxpYi5oPl0pXSwKWyMgV2UgY2FuIGNvbXBpbGUgdXNpbmcgWCBoZWFkZXJzIHdpdGggbm8gc3BlY2lhbCBpbmNsdWRlIGRpcmVjdG9yeS4KYWNfeF9pbmNsdWRlcz1dLApbZm9yIGFjX2RpciBpbiAkYWNfeF9oZWFkZXJfZGlyczsgZG8KICBpZiB0ZXN0IC1yICIkYWNfZGlyL1gxMS9YbGliLmgiOyB0aGVuCiAgICBhY194X2luY2x1ZGVzPSRhY19kaXIKICAgIGJyZWFrCiAgZmkKZG9uZV0pCmZpICMgJGFjX3hfaW5jbHVkZXMgPSBubwoKaWYgdGVzdCAiJGFjX3hfbGlicmFyaWVzIiA9IG5vOyB0aGVuCiAgIyBDaGVjayBmb3IgdGhlIGxpYnJhcmllcy4KICAjIFNlZSBpZiB3ZSBmaW5kIHRoZW0gd2l0aG91dCBhbnkgc3BlY2lhbCBvcHRpb25zLgogICMgRG9uJ3QgYWRkIHRvICRMSUJTIHBlcm1hbmVudGx5LgogIGFjX3NhdmVfTElCUz0kTElCUwogIExJQlM9Ii1sWDExICRMSUJTIgogIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW0AlOkBpbmNsdWRlIDxYMTEvWGxpYi5oPl0sCgkJCQkgIFtYcm1Jbml0aWFsaXplICgpXSldLAoJCSBbTElCUz0kYWNfc2F2ZV9MSUJTCiMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgphY194X2xpYnJhcmllcz1dLAoJCSBbTElCUz0kYWNfc2F2ZV9MSUJTCmZvciBhY19kaXIgaW4gYEFTX0VDSE8oWyIkYWNfeF9pbmNsdWRlcyAkYWNfeF9oZWFkZXJfZGlycyJdKSB8IHNlZCBzL2luY2x1ZGUvbGliL2dgCmRvCiAgIyBEb24ndCBldmVuIGF0dGVtcHQgdGhlIGhhaXIgb2YgdHJ5aW5nIHRvIGxpbmsgYW4gWCBwcm9ncmFtIQogIGZvciBhY19leHRlbnNpb24gaW4gYSBzbyBzbCBkeWxpYiBsYSBkbGw7IGRvCiAgICBpZiB0ZXN0IC1yICIkYWNfZGlyL2xpYlgxMS4kYWNfZXh0ZW5zaW9uIjsgdGhlbgogICAgICBhY194X2xpYnJhcmllcz0kYWNfZGlyCiAgICAgIGJyZWFrIDIKICAgIGZpCiAgZG9uZQpkb25lXSkKZmkgIyAkYWNfeF9saWJyYXJpZXMgPSBubwoKVDgsMTAzNgpBVV9ERUZVTiMgVGhpcyBpcyB3aGF0IGF1dG91cGRhdGUncyBtNCBydW4gd2lsbCBleHBhbmQuICBJdCBmaXJlcwojIHRoZSB3YXJuaW5nICh3aXRoIF9hdV93YXJuX1hYWCksIG91dHB1dHMgaXQgaW50byB0aGUKIyB1cGRhdGVkIGNvbmZpZ3VyZS5hYyAod2l0aCBBQ19ESUFHTk9TRSksIGFuZCB0aGVuIG91dHB1dHMKIyB0aGUgcmVwbGFjZW1lbnQgZXhwYW5zaW9uLgpBVV9ERUZJTkUoWyQxXSwKW200X2lmdmFsKFskM10sIFtfYXVfd2Fybl8kMShbJDNdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFskM10pZFtdbmwKXSlkbmwKJDJdKQoKIyBUaGlzIGlzIGFuIGF1eGlsaWFyeSBtYWNybyB0aGF0IGlzIGFsc28gcnVuIHdoZW4KIyBhdXRvdXBkYXRlIHJ1bnMgbTQuICBJdCBzaW1wbHkgY2FsbHMgbTRfd2FybmluZywgYnV0CiMgd2UgbmVlZCBhIHdyYXBwZXIgc28gdGhhdCBlYWNoIHdhcm5pbmcgaXMgZW1pdHRlZCBvbmx5CiMgb25jZS4gIFdlIGJyZWFrIHRoZSBxdW90aW5nIGluIG00X3dhcm5pbmcncyBhcmd1bWVudCBpbgojIG9yZGVyIHRvIGV4cGFuZCB0aGlzIG1hY3JvJ3MgYXJndW1lbnRzLCBub3QgQVVfREVGVU4ncy4KQVVfREVGSU5FKFtfYXVfd2Fybl8kMV0sClttNF93YXJuaW5nKCRdW0ApZG5sCm00X2RlZmluZShbX2F1X3dhcm5fJDFdLCBbXSldKQoKIyBGaW5hbGx5LCB0aGlzIGlzIHRoZSBleHBhbnNpb24gdGhhdCBpcyBwaWNrZWQgdXAgYnkKIyBhdXRvY29uZi4gIEl0IHRlbGxzIHRoZSB1c2VyIHRvIHJ1biBhdXRvdXBkYXRlLCBhbmQKIyB0aGVuIG91dHB1dHMgdGhlIHJlcGxhY2VtZW50IGV4cGFuc2lvbi4gIFdlIGRvIG5vdCBjYXJlCiMgYWJvdXQgYXV0b3VwZGF0ZSdzIHdhcm5pbmcgYmVjYXVzZSB0aGF0IGNvbnRhaW5zCiMgaW5mb3JtYXRpb24gb24gd2hhdCB0byBkbyAqYWZ0ZXIqIHJ1bm5pbmcgYXV0b3VwZGF0ZS4KQUNfREVGVU4oWyQxXSwKCSBbQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgJDEnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCiQyXSkKRjcsNwp0cmFjZW9udHJhY2VvbgpUMzIsMTA0Cm00X2xvY2F0aW9uKEFDX0VSTEFOR19QQVRIX0VSTEMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9lcmxhbmcubTQ6NDkKVDIyLDQ5NgpBQ19QUkVTRVJWRV9IRUxQX09SREVSX200X2RlZnVuX3BybyhbJDBdKW00X2RpdmVydF9vbmNlKFtIRUxQX0VOQUJMRV0sIFtbCk9wdGlvbmFsIEZlYXR1cmVzIGFuZCBQYWNrYWdlczoKICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCiAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQogIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pXV0pCm00X2RlZmluZShbX200X2RpdmVydChIRUxQX0VOQUJMRSldLCAgICBfbTRfZGl2ZXJ0KEhFTFBfV0lUSCkpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOSwxNzU0CkFDX09QRU5NUF9tNF9kZWZ1bl9wcm8oWyQwXSkKICBPUEVOTVBfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTPQogIEFDX0FSR19FTkFCTEUoW29wZW5tcF0sCiAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1vcGVubXBdLCBbZG8gbm90IHVzZSBPcGVuTVBdKV0pCiAgaWYgdGVzdCAiJGVuYWJsZV9vcGVubXAiICE9IG5vOyB0aGVuCiAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRbXV9BQ19DQ1tdIG9wdGlvbiB0byBzdXBwb3J0IE9wZW5NUF0sCiAgICAgIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wXSwKICAgICAgW0FDX0xJTktfSUZFTFNFKFtfQUNfTEFOR19PUEVOTVBdLAoJIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wPSdub25lIG5lZWRlZCddLAoJIFthY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wPSd1bnN1cHBvcnRlZCcKCSAgZG5sIFRyeSB0aGVzZSBmbGFnczoKCSAgZG5sICAgR0NDID49IDQuMiAgICAgICAgICAgLWZvcGVubXAKCSAgZG5sICAgU3VuUFJPIEMgICAgICAgICAgICAgLXhvcGVubXAKCSAgZG5sICAgSW50ZWwgQyAgICAgICAgICAgICAgLW9wZW5tcAoJICBkbmwgICBTR0kgQywgUEdJIEMgICAgICAgICAtbXAKCSAgZG5sICAgVHJ1NjQgQ29tcGFxIEMgICAgICAgLW9tcAoJICBkbmwgICBJQk0gQyAoQUlYLCBMaW51eCkgICAtcXNtcD1vbXAKCSAgZG5sIElmIGluIHRoaXMgbG9vcCBhIGNvbXBpbGVyIGlzIHBhc3NlZCBhbiBvcHRpb24gdGhhdCBpdCBkb2Vzbid0CgkgIGRubCB1bmRlcnN0YW5kIG9yIHRoYXQgaXQgbWlzaW50ZXJwcmV0cywgdGhlIEFDX0xJTktfSUZFTFNFIHRlc3QKCSAgZG5sIHdpbGwgZmFpbCAoc2luY2Ugd2Uga25vdyB0aGF0IGl0IGZhaWxlZCB3aXRob3V0IHRoZSBvcHRpb24pLAoJICBkbmwgdGhlcmVmb3JlIHRoZSBsb29wIHdpbGwgY29udGludWUgc2VhcmNoaW5nIGZvciBhbiBvcHRpb24sIGFuZAoJICBkbmwgbm8gb3V0cHV0IGZpbGUgY2FsbGVkICdwZW5tcCcgb3IgJ21wJyBpcyBjcmVhdGVkLgoJICBmb3IgYWNfb3B0aW9uIGluIC1mb3Blbm1wIC14b3Blbm1wIC1vcGVubXAgLW1wIC1vbXAgLXFzbXA9b21wOyBkbwoJICAgIGFjX3NhdmVfW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRbXV9BQ19MQU5HX1BSRUZJWFtdRkxBR1MKCSAgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSIkW11fQUNfTEFOR19QUkVGSVhbXUZMQUdTICRhY19vcHRpb24iCgkgICAgQUNfTElOS19JRkVMU0UoW19BQ19MQU5HX09QRU5NUF0sCgkgICAgICBbYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX29wZW5tcD0kYWNfb3B0aW9uXSkKCSAgICBfQUNfTEFOR19QUkVGSVhbXUZMQUdTPSRhY19zYXZlX1tdX0FDX0xBTkdfUFJFRklYW11GTEFHUwoJICAgIGlmIHRlc3QgIiRhY19jdl9wcm9nX1tdX0FDX0xBTkdfQUJCUkVWW11fb3Blbm1wIiAhPSB1bnN1cHBvcnRlZDsgdGhlbgoJICAgICAgYnJlYWsKCSAgICBmaQoJICBkb25lXSldKQogICAgY2FzZSAkYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX29wZW5tcCBpbiAjKAogICAgICAibm9uZSBuZWVkZWQiIHwgdW5zdXBwb3J0ZWQpCgk7OyAjKAogICAgICAqKQoJT1BFTk1QX1tdX0FDX0xBTkdfUFJFRklYW11GTEFHUz0kYWNfY3ZfcHJvZ19bXV9BQ19MQU5HX0FCQlJFVltdX29wZW5tcCA7OwogICAgZXNhYwogIGZpCiAgQUNfU1VCU1QoW09QRU5NUF9dX0FDX0xBTkdfUFJFRklYW0ZMQUdTXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQzMSw3NgpBQ19MQU5HX0NPTkZURVNUKE9iamVjdGl2ZSBDKyspY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAovKiBlbmQgY29uZmRlZnMuaC4gICovCiQxCl9BQ0VPRgpUMTUsNDQ3CkFDX0ZVTkNfR0VUUEdSUF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIGdldHBncnAgcmVxdWlyZXMgemVybyBhcmd1bWVudHMsCiBhY19jdl9mdW5jX2dldHBncnBfdm9pZCwKWyMgVXNlIGl0IHdpdGggYSBzaW5nbGUgYXJnLgpBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtBQ19JTkNMVURFU19ERUZBVUxUXSwgW2dldHBncnAgKDApO10pXSwKCQkgIFthY19jdl9mdW5jX2dldHBncnBfdm9pZD1ub10sCgkJICBbYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQ9eWVzXSkKXSkKaWYgdGVzdCAkYWNfY3ZfZnVuY19nZXRwZ3JwX3ZvaWQgPSB5ZXM7IHRoZW4KICBBQ19ERUZJTkUoR0VUUEdSUF9WT0lELCAxLAoJICAgIFtEZWZpbmUgdG8gMSBpZiB0aGUgYGdldHBncnAnIGZ1bmN0aW9uIHJlcXVpcmVzIHplcm8gYXJndW1lbnRzLl0pCmZpCltdX200X2RlZnVuX2VwaShbJDBdKQpUOCwxNzUKQUNfQ09OU1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfQ09OU1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfQ19DT05TVF0sIFtBQ19DX0NPTlNUKCRAKV0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNCwxOTUKQUNfR0VUR1JPVVBTX1RfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfR0VUR1JPVVBTX1QnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCm00X2lmKCQjLCAwLCBbQUNfVFlQRV9HRVRHUk9VUFNdLCBbQUNfVFlQRV9HRVRHUk9VUFMoJEApXSlbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDI1LDEwNwptNF9sb2NhdGlvbihBQ19EWU5JWF9TRVEpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9zcGVjaWZpYy5tNDo0NjUKVDE5LDM1NQpfQUNfUlVOX0lGRUxTRV9CT0RZICBBU19MSU5FTk9fUFVTSChbJFtdMV0pCiAgQVNfSUYoW19BQ19ET19WQVIoYWNfbGluaykgJiYgX0FDX0RPX1RPS0VOUyguL2NvbmZ0ZXN0JGFjX2V4ZWV4dCldLAogICAgICBbYWNfcmV0dmFsPTBdLAogICAgICBbQVNfRUNITyhbIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyJdKSA+JkFTX01FU1NBR0VfTE9HX0ZECiAgICAgICBfQUNfTVNHX0xPR19DT05GVEVTVAogICAgICAgYWNfcmV0dmFsPSRhY19zdGF0dXNdKQogIHJtIC1yZiBjb25mdGVzdC5kU1lNIGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28KICBBU19MSU5FTk9fUE9QCiAgQVNfU0VUX1NUQVRVUyhbJGFjX3JldHZhbF0pCgpUMTMsMjAKQVNfVkFSX0FQUEVORGFzX2ZuX2FwcGVuZCAkMSAkMltdClQxMywxNTUKQVNfVkFSX0FQUEVORF9tNF9kZWZ1bl9wcm8oWyQwXSlBU19SRVFVSVJFKFtfQVNfVkFSX0FQUEVORF9QUkVQQVJFXSwgW10sIFtNNFNILUlOSVQtRk5dKVtdX200X3BvcGRlZihbJDBdKW00X2luZGlyKFskMF1tNF9pZihbJCNdLCBbMF0sIFtdLCBbLCRAXSkpW11fbTRfZGVmdW5fZXBpKFskMF0pClQyOSwxMDMKbTRfbG9jYXRpb24oX0FTX0VYUFJfUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMDczClQ4LDE5OApfbTRfcWxlbm00X2RlZmluZShbbTRfcWxlbi0kMV0sCm00X2lmKG00X2luZGV4KFskMV0sIFtAXSksIFstMV0sIFttNF9sZW4oWyQxXSldLAogICAgICBbbTRfbGVuKG00X2JwYXRzdWJzdChbWyQxXV0sCgkJCSAgIFtAXChcKDw6XHw6Plx8U3xcfCU6XHxcezpcfDpcfVwpXChAXClcfCZ0QFwpXSwKCQkJICAgW1wzXSkpXSkpX200X2RlZm4oW200X3FsZW4tJDFdKQpUMTIsMzQ0CkFDX1hFTklYX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19ESUFHTk9TRShbb2Jzb2xldGVdLCBbVGhlIG1hY3JvIGBBQ19YRU5JWF9ESVInIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX01TR19DSEVDS0lORyhbZm9yIFhlbml4XSkKQUNfRUdSRVBfQ1BQKFt5ZXNdLApbI2lmIGRlZmluZWQgTV9YRU5JWCAmJiAhIGRlZmluZWQgTV9VTklYCiAgeWVzCkAlOkBlbmRpZl0sCgkgICAgIFtBQ19NU0dfUkVTVUxUKFt5ZXNdKTsgWEVOSVg9eWVzXSwKCSAgICAgW0FDX01TR19SRVNVTFQoW25vXSk7IFhFTklYPV0pCgpBQ19IRUFERVJfRElSRU5UW11kbmwKW11fbTRfZGVmdW5fZXBpKFskMF0pClQxMCw3MgptNF9yZXZlcnNlbTRfaWYoWyQjXSwgWzBdLCBbXSwgWyQjXSwgWzFdLCBbWyQxXV0sCiAgICAgICBbJDAobTRfc2hpZnQoJEApKSwgWyQxXV0pClQyOSwxMDcKbTRfbG9jYXRpb24oQUNfUFJPR19NQUtFX1NFVCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3Byb2dyYW1zLm00OjgxOQpUMjksMTA0Cm00X2xvY2F0aW9uKEFDX0NIRUNLX01FTUJFUlMpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi90eXBlcy5tNDo5MTMKVDMxLDUzCl9BQ19GSUxFX0RFUEVOREVOQ1lfVFJBQ0VfQ09MT05BQ19GSUxFX0RFUEVOREVOQ1lfVFJBQ0UobTRfdHJhbnNsaXQoWyQxXSwgWzpdLCBbLF0pKQpUMTMsMQpBU19NRVNTQUdFX0ZENgpUMTQsMjAxCkFDX1RSWV9DT01QSUxFX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX1RSWV9DT01QSUxFJyBpcyBvYnNvbGV0ZS4KWW91IHNob3VsZCBydW4gYXV0b3VwZGF0ZS5dKWRubApBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbJDFdXSwgW1skMl1dKV0sIFskM10sIFskNF0pW11fbTRfZGVmdW5fZXBpKFskMF0pClQxNywxNTIKQUNfTEFOR19DUExVU1BMVVNfbTRfZGVmdW5fcHJvKFskMF0pQUNfRElBR05PU0UoW29ic29sZXRlXSwgW1RoZSBtYWNybyBgQUNfTEFOR19DUExVU1BMVVMnIGlzIG9ic29sZXRlLgpZb3Ugc2hvdWxkIHJ1biBhdXRvdXBkYXRlLl0pZG5sCkFDX0xBTkcoQysrKVtdX200X2RlZnVuX2VwaShbJDBdKQpUMjYsMzg2MApfQUNfT1VUUFVUX0hFQURFUlNfUFJFUEFSRSMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfSEVBREVSUyBzZWN0aW9uLgojIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCiMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUnLgppZiB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiOyB0aGVuCmRubCBUaGlzIGB8fCcgbGlzdCBpcyBmaW5pc2hlZCBhdCB0aGUgZW5kIG9mIF9BQ19PVVRQVVRfSEVBREVSU19QUkVQQVJFLgpjYXQgPiIkYWNfdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKQkVHSU4gewpfQUNFT0YKCiMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCiMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgoKIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQojIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCmFjX2RlbGltPSclIV8hIyAnCmZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbwogIGFjX3R0PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKICBpZiB0ZXN0IC16ICIkYWNfdHQiOyB0aGVuCiAgICBicmVhawogIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCiAgICBBQ19NU0dfRVJST1IoW2NvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSU10pCiAgZWxzZQogICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKICBmaQpkb25lCgojIEZvciB0aGUgYXdrIHNjcmlwdCwgRCBpcyBhbiBhcnJheSBvZiBtYWNybyB2YWx1ZXMga2V5ZWQgYnkgbmFtZSwKIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCiMgbmV3bGluZSBzZXF1ZW5jZXMuCmRubApkbmwgU3RydWN0dXJlIG9mIHRoZSBzZWQgc2NyaXB0IHRoYXQgcmVhZHMgY29uZmRlZnMuaDoKZG5sIHJzZXQ6ICBtYWluIGxvb3AsIHNlYXJjaGVzIGZvciBgI2RlZmluZScgbGluZXMKZG5sIGRlZjogICBkZWFsIHdpdGggYSBgI2RlZmluZScgbGluZQpkbmwgYnNubDogIGRlYWwgd2l0aCBhIGAjZGVmaW5lJyBsaW5lIHRoYXQgZW5kcyB3aXRoIGJhY2tzbGFzaC1uZXdsaW5lCmRubCBjb250OiAgaGFuZGxlIGEgY29udGludWF0aW9uIGxpbmUKZG5sIGJzbmxjOiBoYW5kbGUgYSBjb250aW51YXRpb24gbGluZSB0aGF0IGVuZHMgd2l0aCBiYWNrc2xhc2gtbmV3bGluZQpkbmwKZG5sIEVhY2ggc3ViIHBhcnQgZXNjYXBlcyB0aGUgYXdrIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgb3V0cHV0cyBhIHN0YXRlbWVudApkbmwgaW5zZXJ0aW5nIHRoZSBtYWNybyB2YWx1ZSBpbnRvIHRoZSBhcnJheSBELCBrZXllZCBieSBuYW1lLiAgSWYgdGhlIG1hY3JvCmRubCB1c2VzIHBhcmFtZXRlcnMsIHRoZXkgYXJlIGFkZGVkIGluIHRoZSBhcnJheSBQLCBrZXllZCBieSBuYW1lLgpkbmwKZG5sIExvbmcgdmFsdWVzIGFyZSBzcGxpdCBpbnRvIHNldmVyYWwgc3RyaW5nIGxpdGVyYWxzIHdpdGggaGVscCBvZiBhY19kZWxpbS4KZG5sIEFzc3VtZSBub2JvZHkgdXNlcyBtYWNybyBuYW1lcyBvZiBuZWFybHkgMTUwIGJ5dGVzIGxlbmd0aC4KZG5sCmRubCBUaGUgaW5pdGlhbCByZXBsYWNlIGZvciBgI2RlZmluZScgbGluZXMgaW5zZXJ0cyBhIGxlYWRpbmcgc3BhY2UKZG5sIGluIG9yZGVyIHRvIGVhc2UgbGF0ZXIgbWF0Y2hpbmc7IG90aGVyd2lzZSwgb3V0cHV0IGxpbmVzIG1heSBiZQpkbmwgcmVwZWF0ZWRseSBtYXRjaGVkLgpkbmwKZG5sIG00LWRvdWJsZS1xdW90ZSBtb3N0IG9mIHRoaXMgZm9yIFssIF0sIGRlZmluZSwgYW5kIHN1YnN0cjoKWwphY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgpzZWQgLW4gJwpzLy5ce11fQUNfQVdLX0xJVEVSQUxfTElNSVRbXH0vJiciJGFjX2RlbGltIicvZwp0IHJzZXQKOnJzZXQKcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovIC8KdCBkZWYKZAo6ZGVmCnMvXFwkLy8KdCBic25sCnMvWyJcXF0vXFwmL2cKcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCkRbIlwxIl09IiBcMyIvcApzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMiIvcApkCjpic25sCnMvWyJcXF0vXFwmL2cKcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCkRbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAp0IGNvbnQKcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKdCBjb250CmQKOmNvbnQKbgpzLy5ce11fQUNfQVdLX0xJVEVSQUxfTElNSVRbXH0vJiciJGFjX2RlbGltIicvZwp0IGNsZWFyCjpjbGVhcgpzL1xcJC8vCnQgYnNubGMKcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCmQKOmJzbmxjCnMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcApiIGNvbnQKJyA8Y29uZmRlZnMuaCB8IHNlZCAnCnMvJyIkYWNfZGVsaW0iJy8iXFxcCiIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKCmNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQogIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCiAgRlMgPSAiByIKfQovXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKICBsaW5lID0gXCQgMAogIHNwbGl0KGxpbmUsIGFyZywgIiAiKQogIGlmIChhcmdbMV0gPT0gIiMiKSB7CiAgICBkZWZ1bmRlZiA9IGFyZ1syXQogICAgbWFjMSA9IGFyZ1szXQogIH0gZWxzZSB7CiAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCiAgICBtYWMxID0gYXJnWzJdCiAgfQogIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKICBtYWNybyA9IG1hYzJbMV0KICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7CiAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgogICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQogICAgbmV4dAogIH0gZWxzZSB7CiAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCiAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCiAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CiAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKICAgICAgbmV4dAogICAgfQogIH0KfQp7IHByaW50IH0KXWRubCBFbmQgb2YgZG91YmxlLXF1b3RlZCBzZWN0aW9uCl9BQ0FXSwpfQUNFT0YKY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQpkbmwgZmluaXNoIGB8fCcgbGlzdCBpbmRpY2F0aW5nIHdyaXRlIGVycm9yOgogIEFDX01TR19FUlJPUihbY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeV0pCmZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgoKClQxNywxOTY2Cl9BQ19MSUJPQkpfQUxMT0NBIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCiMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAojIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KQUNfTElCU09VUkNFUyhhbGxvY2EuYykKQUNfU1VCU1QoW0FMTE9DQV0sIFtcJHtMSUJPQkpESVJ9YWxsb2NhLiRhY19vYmpleHRdKWRubApBQ19ERUZJTkUoQ19BTExPQ0EsIDEsIFtEZWZpbmUgdG8gMSBpZiB1c2luZyBgYWxsb2NhLmMnLl0pCgpBQ19DQUNIRV9DSEVDSyh3aGV0aGVyIGBhbGxvY2EuYycgbmVlZHMgQ3JheSBob29rcywgYWNfY3Zfb3NfY3JheSwKW0FDX0VHUkVQX0NQUCh3ZWJlY3JheSwKWyNpZiBkZWZpbmVkIENSQVkgJiYgISBkZWZpbmVkIENSQVkyCndlYmVjcmF5CiNlbHNlCndlbm90YmVjcmF5CiNlbmRpZgpdLCBhY19jdl9vc19jcmF5PXllcywgYWNfY3Zfb3NfY3JheT1ubyldKQppZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCiAgZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwogICAgQUNfQ0hFQ0tfRlVOQygkYWNfZnVuYywKCQkgIFtBQ19ERUZJTkVfVU5RVU9URUQoQ1JBWV9TVEFDS1NFR19FTkQsICRhY19mdW5jLAoJCQkJICAgICAgW0RlZmluZSB0byBvbmUgb2YgYF9nZXRiNjcnLCBgR0VUQjY3JywKCQkJCSAgICAgICBgZ2V0YjY3JyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUAoJCQkJICAgICAgIHN5c3RlbXMuIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yCgkJCQkgICAgICAgYGFsbG9jYS5jJyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuXSkKICAgIGJyZWFrXSkKICBkb25lCmZpCgpBQ19DQUNIRV9DSEVDSyhbc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYV0sCgkgICAgICAgW2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uXSwKW0FDX1JVTl9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKApbQUNfSU5DTFVERVNfREVGQVVMVAppbnQKZmluZF9zdGFja19kaXJlY3Rpb24gKCkKewogIHN0YXRpYyBjaGFyICphZGRyID0gMDsKICBhdXRvIGNoYXIgZHVtbXk7CiAgaWYgKGFkZHIgPT0gMCkKICAgIHsKICAgICAgYWRkciA9ICZkdW1teTsKICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwogICAgfQogIGVsc2UKICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Cn0KCmludAptYWluICgpCnsKICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCkgPCAwOwp9XSldLAoJICAgICAgIFthY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xXSwKCSAgICAgICBbYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTFdLAoJICAgICAgIFthY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wXSldKQpBSF9WRVJCQVRJTShbU1RBQ0tfRElSRUNUSU9OXSwKWy8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQogICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bnRpbWUuCglTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCglTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duICovCkAlOkB1bmRlZiBTVEFDS19ESVJFQ1RJT05dKWRubApBQ19ERUZJTkVfVU5RVU9URUQoU1RBQ0tfRElSRUNUSU9OLCAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24pCgpUMjAsNjgKQUNfTEFOR19QUkVQUk9DKEMrKylfbTRfZGVmdW5fcHJvKFskMF0pQUNfUkVRVUlSRShbQUNfUFJPR19DWFhDUFBdKVtdX200X2RlZnVuX2VwaShbJDBdKQpUNDAsMTAzCm00X2xvY2F0aW9uKF9BU19WRVJTSU9OX0NPTVBBUkVfUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxNjc5ClQyNywxMDcKbTRfbG9jYXRpb24oQUNfQ0FDSEVfQ0hFQ0spL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9nZW5lcmFsLm00OjIwNTMKVDMwLDEwMwptNF9sb2NhdGlvbihBU19MSU5FTk9fUFJFUEFSRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzaC5tNDoxMTMxClQxMCwyOTQKX200X2VzY2FwZW00X2NoYW5nZXF1b3RlKFstPTx7KF0sWyl9Pj0tXSltNF9icGF0c3Vic3QobTRfYnBhdHN1YnN0KG00X2JwYXRzdWJzdChtNF9icGF0c3Vic3QoCgkgIC09PHsoLT08eygtPTx7KC09PHsoLT08eygkMSl9Pj0tKX0+PS0pfT49LSl9Pj0tKX0+PS0sCgktPTx7KCMpfT49LSwgLT08eyhAJTpAKX0+PS0pLAogICAgICAtPTx7KFxbKX0+PS0sIC09PHsoQDw6QCl9Pj0tKSwKICAgIC09PHsoXF0pfT49LSwgLT08eyhAOj5AKX0+PS0pLAogIC09PHsoXCQpfT49LSwgLT08eyhAU3xAKX0+PS0pbTRfY2hhbmdlcXVvdGUoWyxdKQpUMTYsMTI4Cl9tNF9kaXZlcnRfc3RhY2svaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL200c3VnYXIvbTRzdWdhci5tNDozMjU5OiBtNF9kaXZlcnRfcHVzaDogS0lMTApUMTUsMTkxNwpfQUNfUFJPR19DQ19DODlfbTRfZGVmdW5fcHJvKFskMF0pX0FDX0NfU1REX1RSWShbYzg5XSwKW1sjaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgovKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCnN0cnVjdCBidWYgeyBpbnQgeDsgfTsKRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKc3RhdGljIGNoYXIgKmUgKHAsIGkpCiAgICAgY2hhciAqKnA7CiAgICAgaW50IGk7CnsKICByZXR1cm4gcFtpXTsKfQpzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCnsKICBjaGFyICpzOwogIHZhX2xpc3QgdjsKICB2YV9zdGFydCAodixwKTsKICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOwogIHZhX2VuZCAodik7CiAgcmV0dXJuIHM7Cn0KCi8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCiAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCiAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgogICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLwppbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwoKLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCiAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KI2RlZmluZSBGT08oeCkgJ3gnCmludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOwoKaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CnN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9OwpzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CmludCBhcmdjOwpjaGFyICoqYXJndjtdXSwKW1tyZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07XV0sCmRubCBEb24ndCB0cnkgZ2NjIC1hbnNpOyB0aGF0IHR1cm5zIG9mZiB1c2VmdWwgZXh0ZW5zaW9ucyBhbmQKZG5sIGJyZWFrcyBzb21lIHN5c3RlbXMnIGhlYWRlciBmaWxlcy4KZG5sIEFJWCBjaXJjYSAyMDAzCS1xbGFuZ2x2bD1leHRjODkKZG5sIG9sZCBBSVgJCS1xbGFuZ2x2bD1hbnNpCmRubCBVbHRyaXgsIE9TRi8xLCBUcnU2NAktc3RkCmRubCBIUC1VWCAxMC4yMCBhbmQgbGF0ZXIJLUFlCmRubCBIUC1VWCBvbGRlciB2ZXJzaW9ucwktQWEgLURfSFBVWF9TT1VSQ0UKZG5sIFNWUjQJCQktWGMgLURfX0VYVEVOU0lPTlNfXwpbLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iXSwgWyQxXSwgWyQyXSlbXWRubApbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDExLDU0CkFTX1ZBUl9DT1BZQVNfTElURVJBTF9XT1JEX0lGKFskMVtdJDJdLCBbJDE9JCQyXSwgW2V2YWwgJDE9XCQkMl0pClQyOSwxMDQKbTRfbG9jYXRpb24oQUNfQ19MT05HX0RPVUJMRSkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3R5cGVzLm00OjQ1MQpGMywzCmxlbmxlbgpUMjksMTA2Cm00X2xvY2F0aW9uKEFDX0hFQURFUl9SRVNPTFYpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9oZWFkZXJzLm00OjU0MwpUMTcsMjI5Cm00X2NyX25vdF9sZXR0ZXJzAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMqJSYnKCkkKywuLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2B7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e3+Dh4uPk5ebn6Onq6+zt7u/w8fLz9PX29/j5+vv8/f7/LQpUMTUsMTcyOQpBQ19QUk9HX01LRElSX1BfbTRfZGVmdW5fb25jZShbQUNfUFJPR19NS0RJUl9QXSwgW0FDX1JFUVVJUkUoW0FDX0NPTkZJR19BVVhfRElSX0RFRkFVTFRdKWRubApBQ19SRVFVSVJFX0FVWF9GSUxFKFtpbnN0YWxsLXNoXSlkbmwKQUNfTVNHX0NIRUNLSU5HKFtmb3IgYSB0aHJlYWQtc2FmZSBta2RpciAtcF0pCmlmIHRlc3QgLXogIiRNS0RJUl9QIjsgdGhlbgogIEFDX0NBQ0hFX1ZBTChbYWNfY3ZfcGF0aF9ta2Rpcl0sCiAgICBbX0FTX1BBVEhfV0FMSyhbJFBBVEgkUEFUSF9TRVBBUkFUT1Ivb3B0L3Nmdy9iaW5dLAogICAgICBbZm9yIGFjX3Byb2cgaW4gbWtkaXIgZ21rZGlyOyBkbwoJIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwoJICAgQVNfRVhFQ1VUQUJMRV9QKFsiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCJdKSB8fCBjb250aW51ZQoJICAgY2FzZSBgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC0tdmVyc2lvbiAyPiYxYCBpbiAjKAoJICAgICAnbWtkaXIgKEdOVSBjb3JldXRpbHMpICcqIHwgXAoJICAgICAnbWtkaXIgKGNvcmV1dGlscykgJyogfCBcCgkgICAgICdta2RpciAoZmlsZXV0aWxzKSAnNC4xKikKCSAgICAgICBhY19jdl9wYXRoX21rZGlyPSRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQKCSAgICAgICBicmVhayAzOzsKCSAgIGVzYWMKCSBkb25lCiAgICAgICBkb25lXSldKQogIHRlc3QgLWQgLi8tLXZlcnNpb24gJiYgcm1kaXIgLi8tLXZlcnNpb24KICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfbWtkaXIrc2V0fSIgPSBzZXQ7IHRoZW4KICAgIE1LRElSX1A9IiRhY19jdl9wYXRoX21rZGlyIC1wIgogIGVsc2UKICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKICAgICMgdmFsdWUgZm9yIE1LRElSX1Agd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCiAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCiAgICBNS0RJUl9QPSIkYWNfaW5zdGFsbF9zaCAtZCIKICBmaQpmaQpkbmwgc3RhdHVzLm00IGRvZXMgc3BlY2lhbCBtYWdpYyBmb3IgTUtESVJfUCBpbnN0ZWFkIG9mIEFDX1NVQlNULApkbmwgdG8gZ2V0IHJlbGF0aXZlIG5hbWVzIHJpZ2h0LiAgSG93ZXZlciwgYWxzbyBBQ19TVUJTVCBoZXJlIHNvCmRubCB0aGF0IEF1dG9tYWtlIHZlcnNpb25zIGJlZm9yZSAxLjEwIHdpbGwgcGljayBpdCB1cCAodGhleSBkbyBub3QKZG5sIHRyYWNlIEFDX1NVQlNUX1RSQUNFKS4KZG5sIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3IgQXV0b21ha2UgPCAxLjEwLgpBQ19TVUJTVChbTUtESVJfUF0pZG5sCkFDX01TR19SRVNVTFQoWyRNS0RJUl9QXSkKXSwgbTRfaWYoX200X2RpdmVydF9kdW1wLCBbXSwKICBbW19tNF9kZWZ1bl9wcm8oW0FDX1BST0dfTUtESVJfUF0pbTRfdW5xdW90ZShdLCBbKV9tNF9kZWZ1bl9lcGkoW0FDX1BST0dfTUtESVJfUF0pXV0sCm00X2lmZGVmKFtfbTRfZGl2ZXJ0aW5nKFtBQ19QUk9HX01LRElSX1BdKV0sIFstXSksIFstXSwgW1ttNF91bnF1b3RlKF0sIFspXV0sCiAgW1tfbTRfcmVxdWlyZV9jYWxsKFtBQ19QUk9HX01LRElSX1BdLF0sIFssIF9tNF9kaXZlcnRfZHVtcCldXSkpClQxMiwxNTIKQUNfRFlOSVhfU0VRX200X2RlZnVuX3BybyhbJDBdKUFDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sIFtUaGUgbWFjcm8gYEFDX0RZTklYX1NFUScgaXMgb2Jzb2xldGUuCllvdSBzaG91bGQgcnVuIGF1dG91cGRhdGUuXSlkbmwKQUNfRlVOQ19HRVRNTlRFTlRbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKVDYsMTU4CnBvcGRlZm00X2lmKFskI10sIFswXSwgW1skMF1dLAogICAgICAgWyQjXSwgWzFdLCBbbTRfaWZkZWYoWyQxXSwgW19tNF9wb3BkZWYoWyQxXSldLAoJCQkgICAgW200X2ZhdGFsKFskMDogdW5kZWZpbmVkIG1hY3JvOiAkMV0pXSldLAogICAgICAgW200X21hcF9hcmdzKFskMF0sICRAKV0pClQyMiwxMDgKbTRfbG9jYXRpb24oQUNfQUxMT0NBKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvZnVuY3Rpb25zLm00OjQyMQpUMTksMTA3Cm00X2xvY2F0aW9uKEFDX0FJWCkvaG9tZS94eHh4eHh4eHgveHh4L3h4eHh4eHh4L3h4eHh4L2J1aWxkL3Rvb2xzL3BhY2thZ2VzL2F1dG9jb25mL2F1dG9jb25mLTIuNjgvbGliL2F1dG9jb25mL3NwZWNpZmljLm00OjQzMgpUNDIsMTAwCm00X2xvY2F0aW9uKEFDX0xBTkdfQ09NUElMRVIoT2JqZWN0aXZlIEMpKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvYy5tNDo4NTMKVDE3LDExNwptNF9pbmNsdWRlX3VuaXF1ZW00X2lmZGVmKFttNF9pbmNsdWRlKCQxKV0sCgkgIFttNF93YXJuKFtzeW50YXhdLCBbZmlsZSBgJDEnIGluY2x1ZGVkIHNldmVyYWwgdGltZXNdKV0pZG5sCm00X2RlZmluZShbbTRfaW5jbHVkZSgkMSldKQpUMjEsMwpfbTRfZGl2ZXJ0KEhFTFBfV0lUSCkxMDMKVDE5LDg1Cl9BQ19DSEVDS19ERUNMX09OQ0VBQ19ERUZVTihbX0FDX0NoZWNrX0RlY2xfJDFdLCBbX0FDX0NIRUNLX0RFQ0xTKFskMV0pXSlBQ19SRVFVSVJFKFtfQUNfQ2hlY2tfRGVjbF8kMV0pClQyOSwyCkFDX0xBTkdfU09VUkNFKE9iamVjdGl2ZSBDKyspJDEKVDExLDM0NQpBQ19BUkdfV0lUSF9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJFU0VSVkVfSEVMUF9PUkRFUl0sCltdLApbbTRfZGl2ZXJ0X29uY2UoW0hFTFBfV0lUSF0sIFtbCk9wdGlvbmFsIFBhY2thZ2VzOgogIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQogIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubyldXSldKQptNF9kaXZlcnRfb25jZShbSEVMUF9XSVRIXSwgWyQyXSlkbmwKX0FDX0VOQUJMRV9JRihbd2l0aF0sIFskMV0sIFskM10sIFskNF0pZG5sCltdX200X2RlZnVuX2VwaShbJDBdKQpUOCw3NwptNF9zdHJpcG00X2JwYXRzdWJzdHMoWyQxIF0sCgkgICAgICAgW1sJIF0rXSwgWyBdLAoJICAgICAgIFteLiA/XCguKlwpIC4kXSwgW1tbXDFdXV0pClQ5LDQKbTRfZHF1b3RlWyRAXQpUMTEsODcKQUNfUkVWSVNJT05tNF9kaXZlcnRfdGV4dChbSEVBREVSLVJFVklTSU9OXSwKCQlbQCU6QCBGcm9tIF9fZmlsZV9fIG00X3RyYW5zbGl0KFskMV0sIFskIiJdKS5dKWRubAoKVDI0LDE2CkFDX0xBTkdfREVGSU5FU19QUk9WSURFRG00X2RlZmluZShbXyQwXSkKVDIzLDYzOApBQ19FUkxBTkdfU1VCU1RfTElCX0RJUl9tNF9kZWZ1bl9wcm8oWyQwXSlBQ19SRVFVSVJFKFtBQ19FUkxBTkdfTkVFRF9FUkxDXSlbXWRubApBQ19SRVFVSVJFKFtBQ19FUkxBTkdfTkVFRF9FUkxdKVtdZG5sCkFDX0NBQ0hFX0NIRUNLKFtmb3IgRXJsYW5nL09UUCBsaWJyYXJ5IGJhc2UgZGlyZWN0b3J5XSwKICAgIFthY19jdl9lcmxhbmdfbGliX2Rpcl0sCiAgICBbQUNfTEFOR19QVVNIKEVybGFuZylbXWRubAogICAgIEFDX1JVTl9JRkVMU0UoCglbQUNfTEFOR19QUk9HUkFNKFtdLCBbZG5sCgkgICAgTGliRGlyID0gY29kZTpsaWJfZGlyKCksCgkgICAgZmlsZTp3cml0ZV9maWxlKCJjb25mdGVzdC5vdXQiLCBMaWJEaXIpLAoJICAgIFJldHVyblZhbHVlID0gMCwKCSAgICBoYWx0KFJldHVyblZhbHVlKV0pXSwKCVthY19jdl9lcmxhbmdfbGliX2Rpcj1gY2F0IGNvbmZ0ZXN0Lm91dGAKCSBybSAtZiBjb25mdGVzdC5vdXRdLAoJW3JtIC1mIGNvbmZ0ZXN0Lm91dAoJIEFDX01TR19GQUlMVVJFKFt0ZXN0IEVybGFuZyBwcm9ncmFtIGV4ZWN1dGlvbiBmYWlsZWRdKV0pCiAgICAgQUNfTEFOR19QT1AoRXJsYW5nKVtdZG5sCiAgICBdKQpBQ19TVUJTVChbRVJMQU5HX0xJQl9ESVJdLCBbJGFjX2N2X2VybGFuZ19saWJfZGlyXSkKW11fbTRfZGVmdW5fZXBpKFskMF0pClQ5LDEwMgptNF9yZWdleHBtNF9leHBhbmRfb25jZShbbTRfd2Fybihbc3ludGF4XSwKCQkgW2RvIG5vdCB1c2UgbTRfcmVnZXhwOiB1c2UgcmVnZXhwIG9yIG00X2JyZWdleHBdKV0pZG5sCnJlZ2V4cCgkQCkKVDIzLDEyMzQKQUNfRlVOQ19TRUxFQ1RfQVJHVFlQRVNfbTRfZGVmdW5fcHJvKFskMF0pQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc2VsZWN0Lmggc3lzL3NvY2tldC5oKQpBQ19DQUNIRV9DSEVDSyhbdHlwZXMgb2YgYXJndW1lbnRzIGZvciBzZWxlY3RdLApbYWNfY3ZfZnVuY19zZWxlY3RfYXJnc10sCltmb3IgYWNfYXJnMjM0IGluICdmZF9zZXQgKicgJ2ludCAqJyAndm9pZCAqJzsgZG8KIGZvciBhY19hcmcxIGluICdpbnQnICdzaXplX3QnICd1bnNpZ25lZCBsb25nIGludCcgJ3Vuc2lnbmVkIGludCc7IGRvCiAgZm9yIGFjX2FyZzUgaW4gJ3N0cnVjdCB0aW1ldmFsIConICdjb25zdCBzdHJ1Y3QgdGltZXZhbCAqJzsgZG8KICAgQUNfQ09NUElMRV9JRkVMU0UoCiAgICAgICBbQUNfTEFOR19QUk9HUkFNKApbQUNfSU5DTFVERVNfREVGQVVMVAojaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKIyBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgpdLAoJCQlbZXh0ZXJuIGludCBzZWxlY3QgKCRhY19hcmcxLAoJCQkJCSAgICAkYWNfYXJnMjM0LCAkYWNfYXJnMjM0LCAkYWNfYXJnMjM0LAoJCQkJCSAgICAkYWNfYXJnNSk7XSldLAoJICAgICAgW2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3M9IiRhY19hcmcxLCRhY19hcmcyMzQsJGFjX2FyZzUiOyBicmVhayAzXSkKICBkb25lCiBkb25lCmRvbmUKIyBQcm92aWRlIGEgc2FmZSBkZWZhdWx0IHZhbHVlLgo6ICIke2FjX2N2X2Z1bmNfc2VsZWN0X2FyZ3M9aW50LGludCAqLHN0cnVjdCB0aW1ldmFsICp9IgpdKQphY19zYXZlX0lGUz0kSUZTOyBJRlM9JywnCnNldCBkdW1teSBgZWNobyAiJGFjX2N2X2Z1bmNfc2VsZWN0X2FyZ3MiIHwgc2VkICdzL1wqL1wqL2cnYApJRlM9JGFjX3NhdmVfSUZTCnNoaWZ0CkFDX0RFRklORV9VTlFVT1RFRChTRUxFQ1RfVFlQRV9BUkcxLCAkWzFdLAoJCSAgIFtEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYXJnIDEgZm9yIGBzZWxlY3QnLl0pCkFDX0RFRklORV9VTlFVT1RFRChTRUxFQ1RfVFlQRV9BUkcyMzQsICgkWzJdKSwKCQkgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZ3MgMiwgMyBhbmQgNCBmb3IgYHNlbGVjdCcuXSkKQUNfREVGSU5FX1VOUVVPVEVEKFNFTEVDVF9UWVBFX0FSRzUsICgkWzNdKSwKCQkgICBbRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZyA1IGZvciBgc2VsZWN0Jy5dKQpybSAtZiBjb25mdGVzdCoKW11fbTRfZGVmdW5fZXBpKFskMF0pClQyNSwxMDUKbTRfbG9jYXRpb24oQUNfU1RSVUNUX1RNKS9ob21lL3h4eHh4eHh4eC94eHgveHh4eHh4eHgveHh4eHgvYnVpbGQvdG9vbHMvcGFja2FnZXMvYXV0b2NvbmYvYXV0b2NvbmYtMi42OC9saWIvYXV0b2NvbmYvdHlwZXMubTQ6MTAxOApUMjksMTA4Cm00X2xvY2F0aW9uKEFDX1JFUExBQ0VfRlVOQ1MpL2hvbWUveHh4eHh4eHh4L3h4eC94eHh4eHh4eC94eHh4eC9idWlsZC90b29scy9wYWNrYWdlcy9hdXRvY29uZi9hdXRvY29uZi0yLjY4L2xpYi9hdXRvY29uZi9mdW5jdGlvbnMubTQ6MTMzClQxOCwxODgKQUNfRVJMQU5HX05FRURfRVJMX200X2RlZnVuX3BybyhbJDBdKUFDX0VSTEFOR19QQVRIX0VSTChbbm90IGZvdW5kXSwgWyQxXSkKaWYgdGVzdCAiJEVSTCIgPSAibm90IGZvdW5kIjsgdGhlbgogICAgQUNfTVNHX0VSUk9SKFtFcmxhbmcvT1RQIGludGVycHJldGVyIChlcmwpIG5vdCBmb3VuZCBidXQgcmVxdWlyZWRdKQpmaQpbXV9tNF9kZWZ1bl9lcGkoWyQwXSkKRC0xLDAKCiMgRW5kIG9mIGZyb3plbiBzdGF0ZSBmaWxlCg==