ZGlmZiAtLWdpdCBhL0dyYW1tYXIvR3JhbW1hciBiL0dyYW1tYXIvR3JhbW1hcgppbmRleCA5ZjY2ZGY2Li4zM2MzN2QyIDEwMDY0NAotLS0gYS9HcmFtbWFyL0dyYW1tYXIKKysrIGIvR3JhbW1hci9HcmFtbWFyCkBAIC03LDE4ICs3LDYgQEAKICMgICAgICAgIHdpdGggc29tZW9uZSB3aG8gY2FuOyBhc2sgYXJvdW5kIG9uIHB5dGhvbi1kZXYgZm9yIGhlbHAuICBGcmVkCiAjICAgICAgICBEcmFrZSA8ZmRyYWtlQGFjbS5vcmc+IHdpbGwgcHJvYmFibHkgYmUgbGlzdGVuaW5nIHRoZXJlLgogCi0jIENvbW1hbmRzIGZvciBLZWVzIEJsb20ncyByYWlscm9hZCBwcm9ncmFtCi0jZGlhZ3JhbTp0b2tlbiBOQU1FCi0jZGlhZ3JhbTp0b2tlbiBOVU1CRVIKLSNkaWFncmFtOnRva2VuIFNUUklORwotI2RpYWdyYW06dG9rZW4gTkVXTElORQotI2RpYWdyYW06dG9rZW4gRU5ETUFSS0VSCi0jZGlhZ3JhbTp0b2tlbiBJTkRFTlQKLSNkaWFncmFtOm91dHB1dFxpbnB1dCBweXRob24uYmxhCi0jZGlhZ3JhbTp0b2tlbiBERURFTlQKLSNkaWFncmFtOm91dHB1dFx0ZXh0d2lkdGggMjAuMDRjbVxvZGRzaWRlbWFyZ2luICAwLjBjbVxldmVuc2lkZW1hcmdpbiAwLjBjbQotI2RpYWdyYW06cnVsZXMKLQogIyBTdGFydCBzeW1ib2xzIGZvciB0aGUgZ3JhbW1hcjoKICMJc2luZ2xlX2lucHV0IGlzIGEgc2luZ2xlIGludGVyYWN0aXZlIHN0YXRlbWVudDsKICMJZmlsZV9pbnB1dCBpcyBhIG1vZHVsZSBvciBzZXF1ZW5jZSBvZiBjb21tYW5kcyByZWFkIGZyb20gYW4gaW5wdXQgZmlsZTsKQEAgLTYxLDggKzQ5LDggQEAKIGltcG9ydF9uYW1lOiAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKIGltcG9ydF9mcm9tOiAoJ2Zyb20nICgnLicqIGRvdHRlZF9uYW1lIHwgJy4nKQogICAgICAgICAgICAgICAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpKQotaW1wb3J0X2FzX25hbWU6IE5BTUUgWygnYXMnIHwgTkFNRSkgTkFNRV0KLWRvdHRlZF9hc19uYW1lOiBkb3R0ZWRfbmFtZSBbKCdhcycgfCBOQU1FKSBOQU1FXQoraW1wb3J0X2FzX25hbWU6IE5BTUUgWydhcycgTkFNRV0KK2RvdHRlZF9hc19uYW1lOiBkb3R0ZWRfbmFtZSBbJ2FzJyBOQU1FXQogaW1wb3J0X2FzX25hbWVzOiBpbXBvcnRfYXNfbmFtZSAoJywnIGltcG9ydF9hc19uYW1lKSogWycsJ10KIGRvdHRlZF9hc19uYW1lczogZG90dGVkX2FzX25hbWUgKCcsJyBkb3R0ZWRfYXNfbmFtZSkqCiBkb3R0ZWRfbmFtZTogTkFNRSAoJy4nIE5BTUUpKgpAQCAtODAsNyArNjgsNyBAQAogCSAgICBbJ2ZpbmFsbHknICc6JyBzdWl0ZV0gfAogCSAgICdmaW5hbGx5JyAnOicgc3VpdGUpKQogd2l0aF9zdG10OiAnd2l0aCcgdGVzdCBbIHdpdGhfdmFyIF0gJzonIHN1aXRlCi13aXRoX3ZhcjogKCdhcycgfCBOQU1FKSBleHByCit3aXRoX3ZhcjogJ2FzJyBleHByCiAjIE5CIGNvbXBpbGUuYyBtYWtlcyBzdXJlIHRoYXQgdGhlIGRlZmF1bHQgZXhjZXB0IGNsYXVzZSBpcyBsYXN0CiBleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbdGVzdCBbJywnIHRlc3RdXQogc3VpdGU6IHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgc3RtdCsgREVERU5UCmRpZmYgLS1naXQgYS9JbmNsdWRlL2NvZGUuaCBiL0luY2x1ZGUvY29kZS5oCmluZGV4IDllNmNiNTYuLmE0NTA5ZTMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvY29kZS5oCisrKyBiL0luY2x1ZGUvY29kZS5oCkBAIC00MSwxNyArNDEsMTcgQEAKICNkZWZpbmUgQ09fTk9GUkVFICAgICAgIDB4MDA0MAogCiAjaWYgMAotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gIFN0b3BwZWQgZGVmaW5pbmcgaW4gMi41LCBkbyBub3QgcmUtdXNlLiAqLworLyogVGhlc2UgYXJlIG5vIGxvbmdlciB1c2VkLiAqLwogI2RlZmluZSBDT19HRU5FUkFUT1JfQUxMT1dFRCAgICAweDEwMDAKLSNlbmRpZgogI2RlZmluZSBDT19GVVRVUkVfRElWSVNJT04gICAgCTB4MjAwMAogI2RlZmluZSBDT19GVVRVUkVfQUJTSU1QT1JUCTB4NDAwMCAvKiBhYnNvbHV0ZSBpbXBvcnQgYnkgZGVmYXVsdCAqLwogI2RlZmluZSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQgIDB4ODAwMAorI2VuZGlmCiAKIC8qIFRoaXMgc2hvdWxkIGJlIGRlZmluZWQgaWYgYSBmdXR1cmUgc3RhdGVtZW50IG1vZGlmaWVzIHRoZSBzeW50YXguCiAgICBGb3IgZXhhbXBsZSwgd2hlbiBhIGtleXdvcmQgaXMgYWRkZWQuCiAqLwotI2RlZmluZSBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKKy8qICNkZWZpbmUgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JEICovCiAKICNkZWZpbmUgQ09fTUFYQkxPQ0tTIDIwIC8qIE1heCBzdGF0aWMgYmxvY2sgbmVzdGluZyB3aXRoaW4gYSBmdW5jdGlvbiAqLwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL3BhcnNldG9rLmggYi9JbmNsdWRlL3BhcnNldG9rLmgKaW5kZXggMGY4N2U4MS4uMmI0Y2UxZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9wYXJzZXRvay5oCisrKyBiL0luY2x1ZGUvcGFyc2V0b2suaApAQCAtMjMsNyArMjMsOSBAQAogCiAjZGVmaW5lIFB5UEFSU0VfRE9OVF9JTVBMWV9ERURFTlQJMHgwMDAyCiAKKyNpZiAwCiAjZGVmaW5lIFB5UEFSU0VfV0lUSF9JU19LRVlXT1JECQkweDAwMDMKKyNlbmRpZgogCiBQeUFQSV9GVU5DKG5vZGUgKikgUHlQYXJzZXJfUGFyc2VTdHJpbmcoY29uc3QgY2hhciAqLCBncmFtbWFyICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICopOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9wYXRjaGxldmVsLmggYi9JbmNsdWRlL3BhdGNobGV2ZWwuaAppbmRleCAyOTA0ZmI2Li41NmNmNzYyIDEwMDY0NAotLS0gYS9JbmNsdWRlL3BhdGNobGV2ZWwuaAorKysgYi9JbmNsdWRlL3BhdGNobGV2ZWwuaApAQCAtMSw5ICsxLDUgQEAKIAotLyogTmV3ZmFuZ2xlZCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIHNjaGVtZS4KLQotICAgVGhpcyBzY2hlbWUgd2FzIGFkZGVkIGluIFB5dGhvbiAxLjUuMmIyOyBiZWZvcmUgdGhhdCB0aW1lLCBvbmx5IFBBVENITEVWRUwKLSAgIHdhcyBhdmFpbGFibGUuICBUbyB0ZXN0IGZvciBwcmVzZW5jZSBvZiB0aGUgc2NoZW1lLCB0ZXN0IGZvcgotICAgZGVmaW5lZChQWV9NQUpPUl9WRVJTSU9OKS4KKy8qIFB5dGhvbiB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIHNjaGVtZS4KIAogICAgV2hlbiB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLCB0aGUgVkVSU0lPTiB2YXJpYWJsZSBpbgogICAgY29uZmlndXJlLmluIG11c3QgYWxzbyBiZSBjaGFuZ2VkLgpAQCAtMTksMTQgKzE1LDE0IEBACiAJCQkJCS8qIEhpZ2hlciBmb3IgcGF0Y2ggcmVsZWFzZXMgKi8KIAogLyogVmVyc2lvbiBwYXJzZWQgb3V0IGludG8gbnVtZXJpYyB2YWx1ZXMgKi8KLSNkZWZpbmUgUFlfTUFKT1JfVkVSU0lPTgkyCi0jZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNQorI2RlZmluZSBQWV9NQUpPUl9WRVJTSU9OCTAKKyNkZWZpbmUgUFlfTUlOT1JfVkVSU0lPTgkwCiAjZGVmaW5lIFBZX01JQ1JPX1ZFUlNJT04JMAogI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMCVBZX1JFTEVBU0VfTEVWRUxfQUxQSEEKICNkZWZpbmUgUFlfUkVMRUFTRV9TRVJJQUwJMAogCiAvKiBWZXJzaW9uIGFzIGEgc3RyaW5nICovCi0jZGVmaW5lIFBZX1ZFUlNJT04JCSIyLjVhMCIKKyNkZWZpbmUgUFlfVkVSU0lPTgkJIjMuMHgiCiAKIC8qIFN1YnZlcnNpb24gUmV2aXNpb24gbnVtYmVyIG9mIHRoaXMgZmlsZSAobm90IG9mIHRoZSByZXBvc2l0b3J5KSAqLwogI2RlZmluZSBQWV9QQVRDSExFVkVMX1JFVklTSU9OICAiJFJldmlzaW9uJCIKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHllcnJvcnMuaCBiL0luY2x1ZGUvcHllcnJvcnMuaAppbmRleCAxZmUyZTQ1Li4wZTc3MThjIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXJyb3JzLmgKKysrIGIvSW5jbHVkZS9weWVycm9ycy5oCkBAIC0yOCwyNSArMjgsMTggQEAKIAogLyogKi8KIAotI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpCQkJCQlcCi0JKFB5Q2xhc3NfQ2hlY2soKHgpKQkJCQkJCVwKLQkgfHwgKFB5VHlwZV9DaGVjaygoeCkpICYmIFB5VHlwZV9Jc1N1YnR5cGUoCQkJXAotCQkgICAgIChQeVR5cGVPYmplY3QqKSh4KSwgKFB5VHlwZU9iamVjdCopUHlFeGNfQmFzZUV4Y2VwdGlvbikpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpIFwKKwkgICAgKFB5VHlwZV9DaGVjaygoeCkpICYmIFB5VHlwZV9Jc1N1YnR5cGUoCQkJXAorCQkgICAgIChQeVR5cGVPYmplY3QqKSh4KSwgKFB5VHlwZU9iamVjdCopUHlFeGNfQmFzZUV4Y2VwdGlvbikpCiAKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHgpCQkJXAotCShQeUluc3RhbmNlX0NoZWNrKCh4KSkgfHwJCQlcCi0JIChQeVR5cGVfSXNTdWJ0eXBlKCh4KS0+b2JfdHlwZSwgKFB5VHlwZU9iamVjdCopUHlFeGNfQmFzZUV4Y2VwdGlvbikpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHgpIFwKKwkgKFB5VHlwZV9Jc1N1YnR5cGUoKHgpLT5vYl90eXBlLCAoUHlUeXBlT2JqZWN0KilQeUV4Y19CYXNlRXhjZXB0aW9uKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkJCQkJICAgXAotCShQeUNsYXNzX0NoZWNrKCh4KSkJCQkJCSAgIFwKLQkgPyBQeVN0cmluZ19BU19TVFJJTkcoKChQeUNsYXNzT2JqZWN0KikoeCkpLT5jbF9uYW1lKQkgICBcCi0JIDogKGNoYXIgKikoKChQeVR5cGVPYmplY3QqKSh4KSktPnRwX25hbWUpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkgXAorCSAoKGNoYXIgKikoKChQeVR5cGVPYmplY3QqKSh4KSktPnRwX25hbWUpKQogCi0jZGVmaW5lIFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3MoeCkJCQkJCVwKLQkoKFB5SW5zdGFuY2VfQ2hlY2soKHgpKQkJCQkJCVwKLQkgID8gKFB5T2JqZWN0KikoKFB5SW5zdGFuY2VPYmplY3QqKSh4KSktPmluX2NsYXNzCQlcCi0JICA6IChQeU9iamVjdCopKCh4KS0+b2JfdHlwZSkpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHgpICgoUHlPYmplY3QqKSgoeCktPm9iX3R5cGUpKQogCiAJCiAvKiBQcmVkZWZpbmVkIGV4Y2VwdGlvbnMgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aG9ucnVuLmggYi9JbmNsdWRlL3B5dGhvbnJ1bi5oCmluZGV4IDFlY2IzZDcuLjUyNjIzYmEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHl0aG9ucnVuLmgKKysrIGIvSW5jbHVkZS9weXRob25ydW4uaApAQCAtNyw5ICs3LDggQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgUHlDRl9NQVNLIChDT19GVVRVUkVfRElWSVNJT04gfCBDT19GVVRVUkVfQUJTSU1QT1JUIHwgXAotICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVCkKLSNkZWZpbmUgUHlDRl9NQVNLX09CU09MRVRFIChDT19ORVNURUQpCisjZGVmaW5lIFB5Q0ZfTUFTSyAwCisjZGVmaW5lIFB5Q0ZfTUFTS19PQlNPTEVURSAwCiAjZGVmaW5lIFB5Q0ZfU09VUkNFX0lTX1VURjggIDB4MDEwMAogI2RlZmluZSBQeUNGX0RPTlRfSU1QTFlfREVERU5UIDB4MDIwMAogI2RlZmluZSBQeUNGX09OTFlfQVNUIDB4MDQwMApkaWZmIC0tZ2l0IGEvTGliL2NvcHlfcmVnLnB5IGIvTGliL2NvcHlfcmVnLnB5CmluZGV4IGY0OTkwMTMuLjE2OTUyMGQgMTAwNjQ0Ci0tLSBhL0xpYi9jb3B5X3JlZy5weQorKysgYi9MaWIvY29weV9yZWcucHkKQEAgLTQsMTcgKzQsMTIgQEAKIEMsIG5vdCBmb3IgaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzLgogIiIiCiAKLWZyb20gdHlwZXMgaW1wb3J0IENsYXNzVHlwZSBhcyBfQ2xhc3NUeXBlCi0KIF9fYWxsX18gPSBbInBpY2tsZSIsICJjb25zdHJ1Y3RvciIsCiAgICAgICAgICAgICJhZGRfZXh0ZW5zaW9uIiwgInJlbW92ZV9leHRlbnNpb24iLCAiY2xlYXJfZXh0ZW5zaW9uX2NhY2hlIl0KIAogZGlzcGF0Y2hfdGFibGUgPSB7fQogCiBkZWYgcGlja2xlKG9iX3R5cGUsIHBpY2tsZV9mdW5jdGlvbiwgY29uc3RydWN0b3Jfb2I9Tm9uZSk6Ci0gICAgaWYgdHlwZShvYl90eXBlKSBpcyBfQ2xhc3NUeXBlOgotICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNvcHlfcmVnIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIHdpdGggY2xhc3NlcyIpCi0KICAgICBpZiBub3QgY2FsbGFibGUocGlja2xlX2Z1bmN0aW9uKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJyZWR1Y3Rpb24gZnVuY3Rpb25zIG11c3QgYmUgY2FsbGFibGUiKQogICAgIGRpc3BhdGNoX3RhYmxlW29iX3R5cGVdID0gcGlja2xlX2Z1bmN0aW9uCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IDliZGJiMTYuLmRjNjAzYmUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC0xNiw3ICsxNiw3IEBACiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiAKLWZyb20gZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCitmcm9tIC5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKIAogIyBUaGVzZSBhcmUgbmVlZGVkIGluIGEgY291cGxlIG9mIHNwb3RzLCBzbyBqdXN0IGNvbXB1dGUgdGhlbSBvbmNlLgogUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9fX2luaXRfXy5weSBiL0xpYi9lbmNvZGluZ3MvX19pbml0X18ucHkKaW5kZXggMDE0NjNiYy4uZGRhYWNiOSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9fX2luaXRfXy5weQorKysgYi9MaWIvZW5jb2RpbmdzL19faW5pdF9fLnB5CkBAIC0yNyw3ICsyNyw4IEBACiAKICIiIiMiCiAKLWltcG9ydCBjb2RlY3MsIHR5cGVzLCBhbGlhc2VzCitpbXBvcnQgY29kZWNzLCB0eXBlcworZnJvbSAuIGltcG9ydCBhbGlhc2VzCiAKIF9jYWNoZSA9IHt9CiBfdW5rbm93biA9ICctLXVua25vd24tLScKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQppbmRleCBjMTkyOTYzLi43NDIyNjdmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CkBAIC0yNSw5ICsyNSw5IEBACiAKIHByaW50ICcyLjIgcmFpc2UgY2xhc3MgZXhjZXB0aW9ucycKIAotY2xhc3MgQUNsYXNzOiBwYXNzCitjbGFzcyBBQ2xhc3MoRXhjZXB0aW9uKTogcGFzcwogY2xhc3MgQkNsYXNzKEFDbGFzcyk6IHBhc3MKLWNsYXNzIENDbGFzczogcGFzcworY2xhc3MgQ0NsYXNzKEV4Y2VwdGlvbik6IHBhc3MKIGNsYXNzIERDbGFzcyhBQ2xhc3MpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZ25vcmUpOgogICAgICAgICBwYXNzCkBAIC01OCw4ICs1OCw4IEBACiAgICAgaWYgdiAhPSBiOiByYWlzZSBUZXN0RmFpbGVkLCAidiE9YiBBQ2xhc3MiCiAKICMgbm90IGVub3VnaCBhcmd1bWVudHMKLXRyeTogIHJhaXNlIEJDbGFzcywgYQotZXhjZXB0IFR5cGVFcnJvcjogcGFzcworIyN0cnk6ICByYWlzZSBCQ2xhc3MsIGEKKyMjZXhjZXB0IFR5cGVFcnJvcjogcGFzcwogCiB0cnk6ICByYWlzZSBEQ2xhc3MsIGEKIGV4Y2VwdCBEQ2xhc3MsIHY6CmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggMWMxNDJmYi4uMTExMTEyYiAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtNCw2MjQ1ICs0LDU4IEBACiAKIChlZGl0b3JzOiBjaGVjayBORVdTLmhlbHAgZm9yIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgTkVXUyB1c2luZyBSZVNULikKIAotV2hhdCdzIE5ldyBpbiBQeXRob24gMi41IGFscGhhIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1doYXQncyBOZXcgaW4gUHl0aG9uIDMwMDA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0qUmVsZWFzZSBkYXRlOiBYWC1YWFgtMjAwNioKKypSZWxlYXNlIGRhdGU6IFhYLVhYWC0yMDBYKgogCi1Db3JlIGFuZCBidWlsdGlucworVE8gRE8KKy0tLS0tCisKKy0gTWFrZSBzdHJpbmdzIGFsbCBVbmljb2RlLiAgKEZpcnN0IGhhdmUgdG8gaW50cm9kdWNlIHRoZSBieXRlcyB0eXBlLikKKworLSBHZXQgcmlkIG9mIGNsYXNzaWMgY2xhc3MgaW1wbGVtZW50YXRpb24uCisKKy0gR2V0IHJpZCBvZiB2YXJpb3VzIGNvbXBhdGliaWxpdHktcmVsYXRlZCBmbGFncyAoZS5nLiBkaXZpc2lvbiBmbGFncykuCisKK0NvcmUgYW5kIEJ1aWx0aW5zCiAtLS0tLS0tLS0tLS0tLS0tLQogCi0tIFBhdGNoICMxNDM0MDM4OiBwcm9wZXJ0eSgpIG5vdyB1c2VzIHRoZSBnZXR0ZXIncyBkb2NzdHJpbmcgaWYgdGhlcmUgaXMKLSAgbm8gImRvYyIgYXJndW1lbnQgZ2l2ZW4uIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gbGVnaXRpbWF0ZWx5IHVzZQotICBwcm9wZXJ0eSgpIGFzIGEgZGVjb3JhdG9yIHRvIHByb2R1Y2UgYSByZWFkLW9ubHkgcHJvcGVydHkuCistIENsYXNzaWMgY2xhc3NlcyBhcmUgYSB0aGluZyBvZiB0aGUgcGFzdC4gIEFsbCBjbGFzc2VzIGFyZSBuZXcgc3R5bGUuCiAKLS0gUEVQIDM1NywgcGF0Y2ggMTQzNjM2ODogYWRkIGFuIF9faW5kZXhfXyBtZXRob2QgdG8gaW50L2xvbmcgYW5kIGEgbWF0Y2hpbmcKLSAgbmJfaW5kZXggc2xvdCB0byB0aGUgUHlOdW1iZXJNZXRob2RzIHN0cnVjdC4gIFRoZSBzbG90IGlzIGNvbnN1bHRlZCBpbnN0ZWFkCi0gIG9mIHJlcXVpcmluZyBhbiBpbnQgb3IgbG9uZyBpbiBzbGljaW5nIGFuZCBhIGZldyBvdGhlciBjb250ZXh0cywgZW5hYmxpbmcKLSAgb3RoZXIgb2JqZWN0cyAoZS5nLiBOdW1lcmljIFB5dGhvbidzIGludGVnZXJzKSB0byBiZSB1c2VkIGFzIHNsaWNlIGluZGljZXMuCistIEV4Y2VwdGlvbnMgKm11c3QqIGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24uCiAKLS0gRml4ZWQgdmFyaW91cyBidWdzIHJlcG9ydGVkIGJ5IENvdmVyaXR5J3MgUHJldmVudCB0b29sLgorLSBJbnRlZ2VyIGRpdmlzaW9uIGFsd2F5cyByZXR1cm5zIGEgZmxvYXQuICBUaGUgLVEgb3B0aW9uIGlzIG5vIG1vcmUuCiAKLS0gUEVQIDM1MiwgcGF0Y2ggIzExMDQ2Njk6IE1ha2UgZXhjZXB0aW9ucyBuZXctc3R5bGUgb2JqZWN0cy4gIEludHJvZHVjZWQgdGhlCi0gIG5ldyBleGNlcHRpb24gYmFzZSBjbGFzcywgQmFzZUV4Y2VwdGlvbiwgd2hpY2ggaGFzIGEgbmV3IG1lc3NhZ2UgYXR0cmlidXRlLgotICBLZXlib2FyZEludGVycnVwdCBhbmQgU3lzdGVtRXhpdCB0byBkaXJlY3RseSBpbmhlcml0IGZyb20gQmFzZUV4Y2VwdGlvbiBub3cuCi0gIFJhaXNpbmcgYSBzdHJpbmcgZXhjZXB0aW9uIG5vdyByYWlzZXMgYSBEZXByZWNhdGlvbldhcm5pbmcuCistICdhcycgYW5kICd3aXRoJyBhcmUga2V5d29yZHMuCiAKLS0gUGF0Y2ggIzE0MzgzODcsIFBFUCAzMjg6IHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBpbXBvcnRzLiBJbXBvcnRzIGNhbiBub3cgYmUKLSAgZXhwbGljaXRseSByZWxhdGl2ZSwgdXNpbmcgJ2Zyb20gLm1vZHVsZSBpbXBvcnQgbmFtZScgdG8gbWVhbiAnZnJvbSB0aGUgc2FtZQotICBwYWNrYWdlIGFzIHRoaXMgbW9kdWxlIGlzIGluLiBJbXBvcnRzIHdpdGhvdXQgZG90cyBzdGlsbCBkZWZhdWx0IHRvIHRoZQotICBvbGQgcmVsYXRpdmUtdGhlbi1hYnNvbHV0ZSwgdW5sZXNzICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0Ci0gIGFic29sdXRlX2ltcG9ydCcgaXMgdXNlZC4KLQotLSBQcm9wZXJseSBjaGVjayBpZiAnd2FybmluZ3MnIHJhaXNlcyBhbiBleGNlcHRpb24gKHVzdWFsbHkgd2hlbiBhIGZpbHRlciBzZXQKLSAgdG8gImVycm9yIiBpcyB0cmlnZ2VyZWQpIHdoZW4gcmFpc2luZyBhIHdhcm5pbmcgZm9yIHJhaXNpbmcgc3RyaW5nCi0gIGV4Y2VwdGlvbnMuCi0KLS0gQ09fR0VORVJBVE9SX0FMTE9XRUQgaXMgbm8gbG9uZ2VyIGRlZmluZWQsIHRoaXMgYmVoYXZpb3IgaXMgdGhlIGRlZmF1bHQuCi0gIFRoZSBuYW1lIHdhcyByZW1vdmVkIGZyb20gSW5jbHVkZS9jb2RlLmguCi0KLS0gUEVQIDMwODogY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgd2VyZSBhZGRlZCAoeCBpZiBjb25kIGVsc2UgeSkuCi0KLS0gUGF0Y2ggMTQzMzkyODoKLSAgLSBUaGUgY29weSBtb2R1bGUgbm93ICJjb3BpZXMiIGZ1bmN0aW9uIG9iamVjdHMgKGFzIGF0b21pYyBvYmplY3RzKS4KLSAgLSBkaWN0Ll9fZ2V0aXRlbV9fIG5vdyBsb29rcyBmb3IgYSBfX21pc3NpbmdfXyBob29rIGJlZm9yZSByYWlzaW5nCi0gICAgS2V5RXJyb3IuCi0KLS0gUEVQIDM0Mzogd2l0aCBzdGF0ZW1lbnQgaW1wbGVtZW50ZWQuIE5lZWRzIGBgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydAotICB3aXRoX3N0YXRlbWVudGBgLiBVc2Ugb2YgJ3dpdGgnIGFzIGEgdmFyaWFibGUgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCi0gIFVzZSBvZiAnYXMnIGFzIGEgdmFyaWFibGUgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyAodW5sZXNzIGl0J3MKLSAgcGFydCBvZiBhbiBpbXBvcnQgc3RhdGVtZW50KS4KLSAgVGhlIGZvbGxvd2luZyBvYmplY3RzIGhhdmUgX19jb250ZXh0X18gbWV0aG9kczoKLSAgLSBUaGUgYnVpbHQtaW4gZmlsZSB0eXBlLgotICAtIFRoZSB0aHJlYWQuTG9ja1R5cGUgdHlwZS4KLSAgLSBUaGUgZm9sbG93aW5nIHR5cGVzIGRlZmluZWQgYnkgdGhlIHRocmVhZGluZyBtb2R1bGU6Ci0gICAgTG9jaywgUkxvY2ssIENvbmRpdGlvbiwgU2VtYXBob3JlLCBCb3VuZGVkU2VtYXBob3JlLgotICAtIFRoZSBkZWNpbWFsLkNvbnRleHQgY2xhc3MuCi0KLS0gRml4IHRoZSBlbmNvZGluZ3MgcGFja2FnZSBjb2RlYyBzZWFyY2ggZnVuY3Rpb24gdG8gb25seSBzZWFyY2gKLSAgaW5zaWRlIGl0cyBvd24gcGFja2FnZS4gRml4ZXMgcHJvYmxlbSByZXBvcnRlZCBpbiBwYXRjaCAjMTQzMzE5OC4KLQotICBOb3RlOiBDb2RlYyBwYWNrYWdlcyBzaG91bGQgaW1wbGVtZW50IGFuZCByZWdpc3RlciB0aGVpciBvd24KLSAgY29kZWMgc2VhcmNoIGZ1bmN0aW9uLiBQRVAgMTAwIGhhcyB0aGUgZGV0YWlscy4KLQotLSBQRVAgMzUzOiBVc2luZyBzc2l6ZV90IGFzIHRoZSBpbmRleCB0eXBlLgotCi0tIFBhdGNoICMxNDAwMTgxLCBmaXggdW5pY29kZSBzdHJpbmcgZm9ybWF0dGluZyB0byBub3QgdXNlIHRoZSBsb2NhbGUuCi0gIFRoaXMgaXMgaG93IHN0cmluZyBvYmplY3RzIHdvcmsuICB1JyVmJyBjb3VsZCB1c2UgLCBpbnN0ZWFkIG9mIC4KLSAgZm9yIHRoZSBkZWNpbWFsIHBvaW50LiAgTm93IGJvdGggc3RyaW5ncyBhbmQgdW5pY29kZSBhbHdheXMgdXNlIHBlcmlvZHMuCi0KLS0gQnVnICMxMjQ0NjEwLCAjMTM5MjkxNSwgZml4IGJ1aWxkIHByb2JsZW0gb24gT3BlbkJTRCAzLjcgYW5kIDMuOC4KLSAgY29uZmlndXJlIHdvdWxkIGJyZWFrIGNoZWNraW5nIGN1cnNlcy5oLgotCi0tIEJ1ZyAjOTU5NTc2OiBUaGUgcHdkIG1vZHVsZSBpcyBub3cgYnVpbHRpbi4gVGhpcyBhbGxvd3MgUHl0aG9uIHRvIGJlCi0gIGJ1aWx0IG9uIFVOSVggcGxhdGZvcm1zIHdpdGhvdXQgJEhPTUUgc2V0LgotCi0tIEJ1ZyAjMTA3MjE4MiwgZml4IHNvbWUgcG90ZW50aWFsIHByb2JsZW1zIGlmIGNoYXJhY3RlcnMgYXJlIHNpZ25lZC4KLQotLSBCdWcgIzg4OTUwMCwgZml4IGxpbmUgbnVtYmVyIG9uIFN5bnRheFdhcm5pbmcgZm9yIGdsb2JhbCBkZWNsYXJhdGlvbnMuCi0KLS0gQnVnICMxMzc4MDIyLCBVVEYtOCBmaWxlcyB3aXRoIGEgbGVhZGluZyBCT00gY3Jhc2hlZCB0aGUgaW50ZXJwcmV0ZXIuCi0KLS0gU3VwcG9ydCBmb3IgY29udmVydGluZyBoZXggc3RyaW5ncyB0byBmbG9hdHMgbm8gbG9uZ2VyIHdvcmtzLgotICBUaGlzIHdhcyBub3QgcG9ydGFibGUuICBmbG9hdCgnMHgzJykgbm93IHJhaXNlcyBhIFZhbHVlRXJyb3IuCi0KLS0gUGF0Y2ggIzEzODIxNjM6IEV4cG9zZSBTdWJ2ZXJzaW9uIHJldmlzaW9uIG51bWJlciB0byBQeXRob24uICBOZXcgQyBBUEkKLSAgZnVuY3Rpb24gUHlfR2V0QnVpbGROdW1iZXIoKS4gIE5ldyBhdHRyaWJ1dGUgc3lzLnN1YnZlcnNpb24uICBCdWlsZCBudW1iZXIKLSAgaXMgbm93IGRpc3BsYXllZCBpbiBpbnRlcmFjdGl2ZSBwcm9tcHQgYmFubmVyLgotCi0tIEltcGxlbWVudGF0aW9uIG9mIFBFUCAzNDEgLSBVbmlmaWNhdGlvbiBvZiB0cnkvZXhjZXB0IGFuZCB0cnkvZmluYWxseS4KLSAgImV4Y2VwdCIgY2xhdXNlcyBjYW4gbm93IGJlIHdyaXR0ZW4gdG9nZXRoZXIgd2l0aCBhICJmaW5hbGx5IiBjbGF1c2UgaW4KLSAgb25lIHRyeSBzdGF0ZW1lbnQgaW5zdGVhZCBvZiB0d28gbmVzdGVkIG9uZXMuICBQYXRjaCAjMTM1NTkxMy4KLQotLSBCdWcgIzEzNzk5OTQ6IEJ1aWx0aW4gdW5pY29kZV9lc2NhcGUgYW5kIHJhd191bmljb2RlX2VzY2FwZSBjb2RlYwotICBub3cgZW5jb2RlcyBiYWNrc2xhc2ggY29ycmVjdGx5LgotCi0tIFBhdGNoICMxMzUwNDA5OiBXb3JrIGFyb3VuZCBzaWduYWwgaGFuZGxpbmcgYnVnIGluIFZpc3VhbCBTdHVkaW8gMjAwNS4KLQotLSBCdWcgIzEyODE0MDg6IFB5X0J1aWxkVmFsdWUgbm93IHdvcmtzIGNvcnJlY3QgZXZlbiB3aXRoIHVuc2lnbmVkIGxvbmdzCi0gIGFuZCBsb25nIGxvbmdzLgotCi0tIFNGIEJ1ZyAjMTM1MDE4OCwgInNldGRsb3BlbmZsYWdzIiBsZWFkcyB0byBjcmFzaCB1cG9uICJpbXBvcnQiCi0gIEl0IHdhcyBwb3NzaWJsZSBkbGVycm9yKCkgcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgdXNlIGEgZGVmYXVsdCBlcnJvcgotICBtZXNzYWdlIGluIHRoaXMgY2FzZS4KLQotLSBSZXBsYWNlZCBtb3N0IFVuaWNvZGUgY2hhcm1hcCBjb2RlY3Mgd2l0aCBuZXcgb25lcyB1c2luZyB0aGUKLSAgbmV3IFVuaWNvZGUgdHJhbnNsYXRlIHN0cmluZyBmZWF0dXJlIGluIHRoZSBidWlsdGluIGNoYXJtYXAKLSAgY29kZWM7IHRoZSBjb2RlY3Mgd2VyZSBjcmVhdGVkIGZyb20gdGhlIG1hcHBpbmcgdGFibGVzIGF2YWlsYWJsZQotICBhdCBmdHAudW5pY29kZS5vcmcgYW5kIGNvbnRhaW4gYSBmZXcgdXBkYXRlcyAoZS5nLiB0aGUgTWFjIE9TCi0gIGVuY29kaW5ncyBub3cgaW5jbHVkZSBhIG1hcHBpbmcgZm9yIHRoZSBBcHBsZSBsb2dvKQotCi0tIEFkZGVkIGEgZmV3IG1vcmUgY29kZWNzIGZvciBNYWMgT1MgZW5jb2RpbmdzCi0KLS0gU3BlZWQgdXAgc29tZSBVbmljb2RlIG9wZXJhdGlvbnMuCi0KLS0gQSBuZXcgQVNUIHBhcnNlciBpbXBsZW1lbnRhdGlvbiB3YXMgY29tcGxldGVkLiBUaGUgYWJzdHJhY3QKLSAgc3ludGF4IHRyZWUgaXMgYXZhaWxhYmxlIGZvciByZWFkLW9ubHkgKG5vbi1jb21waWxlKSBhY2Nlc3MKLSAgdG8gUHl0aG9uIGNvZGU7IGFuIF9hc3QgbW9kdWxlIHdhcyBhZGRlZC4KLQotLSBTRiBidWcgIzExNjc3NTE6IGZpeCBpbmNvcnJlY3QgY29kZSBiZWluZyBmb3IgZ2VuZXJhdG9yIGV4cHJlc3Npb25zLgotICBUaGUgZm9sbG93aW5nIGNvZGUgbm93IHJhaXNlcyBhIFN5bnRheEVycm9yOiAgZm9vKGEgPSBpIGZvciBpIGluIHJhbmdlKDEwKSkKLQotLSBTRiBCdWcgIzk3NjYwODogZml4IFN5c3RlbUVycm9yIHdoZW4gbXRpbWUgb2YgYW4gaW1wb3J0ZWQgZmlsZSBpcyAtMS4KLQotLSBTRiBCdWcgIzg4Nzk0NjogZml4IHNlZ2ZhdWx0IHdoZW4gcmVkaXJlY3Rpbmcgc3RkaW4gZnJvbSBhIGRpcmVjdG9yeS4KLSAgUHJvdmlkZSBhIHdhcm5pbmcgd2hlbiBhIGRpcmVjdG9yeSBpcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotLSBGaXggc2VnZmF1bHQgd2l0aCBpbnZhbGlkIGNvZGluZy4KLQotLSBTRiBidWcgIzc3Mjg5NjogdW5rbm93biBlbmNvZGluZyByZXN1bHRzIGluIE1lbW9yeUVycm9yLgotCi0tIEFsbCBpdGVyYXRvcnMgbm93IGhhdmUgYSBCb29sZWFuIHZhbHVlIG9mIHRydWUuICBGb3JtZXJseSwgc29tZSBpdGVyYXRvcnMKLSAgc3VwcG9ydGVkIGEgX19sZW5fXygpIG1ldGhvZCB3aGljaCBldmFsdWF0ZWQgdG8gRmFsc2Ugd2hlbiB0aGUgaXRlcmF0b3IKLSAgd2FzIGVtcHR5LgotCi0tIE9uIDY0LWJpdCBwbGF0Zm9ybXMsIHdoZW4gX19sZW5fXygpIHJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZQotICByZXByZXNlbnRlZCBhcyBhIEMgaW50LCByYWlzZSBPdmVyZmxvd0Vycm9yLgotCi0tIHRlc3RfX2xvY2FsZSBpcyBza2lwcGVkIG9uIE9TIFggPCAxMC40IChvbmx5IHBhcnRpYWwgbG9jYWxlIHN1cHBvcnQgaXMKLSAgcHJlc2VudCkuCi0KLS0gU0YgYnVnICM4OTM1NDk6IHBhcnNpbmcga2V5d29yZCBhcmd1bWVudHMgd2FzIGJyb2tlbiB3aXRoIGEgZmV3IGZvcm1hdAotICBjb2Rlcy4KLQotLSBDaGFuZ2VzIGRvbmF0ZWQgYnkgRWxlbWVudGFsIFNlY3VyaXR5IHRvIG1ha2UgaXQgd29yayBvbiBBSVggNS4zCi0gIHdpdGggSUJNJ3MgNjQtYml0IGNvbXBpbGVyIChTRiBwYXRjaCAjMTI4NDI4OSkuICBUaGlzIGFsc28gY2xvc2VzIFNGCi0gIGJ1ZyAjMTA1NDcwOiB0ZXN0X3B3ZCBmYWlscyBvbiA2NGJpdCBzeXN0ZW0gKE9wdGVyb24pLgotCi0tIENoYW5nZXMgZG9uYXRlZCBieSBFbGVtZW50YWwgU2VjdXJpdHkgdG8gbWFrZSBpdCB3b3JrIG9uIEhQLVVYIDExIG9uCi0gIEl0YW5pdW0yIHdpdGggSFAncyA2NC1iaXQgY29tcGlsZXIgKFNGIHBhdGNoICMxMjI1MjEyKS4KLQotLSBEaXNhbGxvdyBrZXl3b3JkIGFyZ3VtZW50cyBmb3IgdHlwZSBjb25zdHJ1Y3RvcnMgdGhhdCBkb24ndCB1c2UgdGhlbQotICAoZml4ZXMgYnVnICMxMTE5NDE4KS4KLQotLSBGb3J3YXJkIFVuaWNvZGVEZWNvZGVFcnJvciBpbnRvIFN5bnRheEVycm9yIGZvciBzb3VyY2UgZW5jb2RpbmcgZXJyb3JzLgotCi0tIFNGIGJ1ZyAjOTAwMDkyOiBXaGVuIHRyYWNpbmcgKGUuZy4gZm9yIGhvdHNob3QpLCByZXN0b3JlICdyZXR1cm4nIGV2ZW50cyBmb3IKLSAgZXhjZXB0aW9ucyB0aGF0IGNhdXNlIGEgZnVuY3Rpb24gdG8gZXhpdC4KLQotLSBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc2V0KCkgYW5kIGZyb3plbnNldCgpIHdhcyByZXZpc2VkIHRvIHVzZSBpdHMKLSAgb3duIGludGVybmFsIGRhdGEgc3RydWN0dXJlLiAgTWVtb3J5IGNvbnN1bXB0aW9uIGlzIHJlZHVjZWQgYnkgMS8zCi0gIGFuZCB0aGVyZSBhcmUgbW9kZXN0IHNwZWVkLXVwcyBhcyB3ZWxsLiAgVGhlIEFQSSBpcyB1bmNoYW5nZWQuCi0KLS0gU0YgYnVnICMxMjM4NjgxOiAgZnJlZWQgcG9pbnRlciBpcyB1c2VkIGluIGxvbmdvYmplY3QuYzpsb25nX3BvdygpLgotCi0tIFNGIGJ1ZyAjMTIyOTQyOTogUHlPYmplY3RfQ2FsbE1ldGhvZCBmYWlsZWQgdG8gZGVjcmVtZW50IHNvbWUKLSAgcmVmZXJlbmNlIGNvdW50cyBpbiBzb21lIGVycm9yIGV4aXQgY2FzZXMuCi0KLS0gU0YgYnVnICMxMTg1ODgzOiAgUHl0aG9uJ3Mgc21hbGwtb2JqZWN0IG1lbW9yeSBhbGxvY2F0b3IgdG9vayBvdmVyCi0gIGEgYmxvY2sgbWFuYWdlZCBieSB0aGUgcGxhdGZvcm0gQyBsaWJyYXJ5IHdoZW5ldmVyIGEgcmVhbGxvYyBzcGVjaWZpZWQKLSAgYSBzbWFsbCBuZXcgc2l6ZS4gIEhvd2V2ZXIsIHRoZXJlJ3Mgbm8gcG9ydGFibGUgd2F5IHRvIGtub3cgdGhlbiBob3cKLSAgbXVjaCBvZiB0aGUgYWRkcmVzcyBzcGFjZSBmb2xsb3dpbmcgdGhlIHBvaW50ZXIgaXMgdmFsaWQsIHNvIG5vCi0gIHBvcnRhYmxlIHdheSB0byBjb3B5IGRhdGEgZnJvbSB0aGUgQy1tYW5hZ2VkIGJsb2NrIGludG8gUHl0aG9uJ3MKLSAgc21hbGwtb2JqZWN0IHNwYWNlIHdpdGhvdXQgcmlza2luZyBhIG1lbW9yeSBmYXVsdC4gIFB5dGhvbidzIHNtYWxsLW9iamVjdAotICByZWFsbG9jIG5vdyBsZWF2ZXMgc3VjaCBibG9ja3MgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHBsYXRmb3JtIEMKLSAgcmVhbGxvYy4KLQotLSBTRiBidWcgIzEyMzI1MTc6IEFuIG92ZXJmbG93IGVycm9yIHdhcyBub3QgZGV0ZWN0ZWQgcHJvcGVybHkgd2hlbgotICBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgYSBsYXJnZSBmbG9hdCB0byBhbiBpbnQgaW4gb3MudXRpbWUoKS4KLQotLSBTRiBidWcgIzEyMjQzNDc6IGhleCBsb25ncyBub3cgcHJpbnQgd2l0aCBsb3dlcmNhc2UgbGV0dGVycyBqdXN0Ci0gIGxpa2UgdGhlaXIgaW50IGNvdW50ZXJwYXJ0cy4KLQotLSBTRiBidWcgIzExNjM1NjM6IHRoZSBvcmlnaW5hbCBmaXggZm9yIGJ1ZyAjMTAxMDY3NyAoInRocmVhZCBNb2R1bGUKLSAgQnJlYWtzIFB5R0lMU3RhdGVfRW5zdXJlKCkiKSBicm9rZSBiYWRseSBpbiB0aGUgY2FzZSBvZiBtdWx0aXBsZQotICBpbnRlcnByZXRlciBzdGF0ZXM7IGJhY2sgb3V0IHRoYXQgZml4IGFuZCBkbyBhIGJldHRlciBqb2IgKHNlZQotICBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDUtSnVuZS8wNTQyNTguaHRtbAotICBmb3IgYSBsb25nZXIgd3JpdGUtdXAgb2YgdGhlIHByb2JsZW0pLgotCi0tIFNGIHBhdGNoICMxMTgwOTk1OiBtYXJzaGFsIG5vdyB1c2VzIGEgYmluYXJ5IGZvcm1hdCBieSBkZWZhdWx0IHdoZW4KLSAgc2VyaWFsaXppbmcgZmxvYXRzLgotCi0tIFNGIHBhdGNoICMxMTgxMzAxOiBvbiBwbGF0Zm9ybXMgdGhhdCBhcHBlYXIgdG8gdXNlIElFRUUgNzU0IGZsb2F0cywKLSAgdGhlIHJvdXRpbmVzIHRoYXQgcHJvbWlzZSB0byBwcm9kdWNlIElFRUUgNzU0IGJpbmFyeSByZXByZXNlbnRhdGlvbnMKLSAgb2YgZmxvYXRzIG5vdyBzaW1wbHkgY29weSBieXRlcyBhcm91bmQuCi0KLS0gYnVnICM5NjcxODI6IGRpc2FsbG93IG9wZW5pbmcgZmlsZXMgd2l0aCAnd1UnIG9yICdhVScgYXMgc3BlY2lmaWVkIGJ5IFBFUAotICAyNzguCi0KLS0gcGF0Y2ggIzExMDk0MjQ6IGludCwgbG9uZywgZmxvYXQsIGNvbXBsZXgsIGFuZCB1bmljb2RlIG5vdyBjaGVjayBmb3IgdGhlCi0gIHByb3BlciBtYWdpYyBzbG90IGZvciB0eXBlIGNvbnZlcnNpb25zIHdoZW4gc3ViY2xhc3NlZC4gIFByZXZpb3VzbHkgdGhlCi0gIG1hZ2ljIHNsb3Qgd2FzIGlnbm9yZWQgZHVyaW5nIGNvbnZlcnNpb24uICBTZW1hbnRpY3Mgbm93IG1hdGNoIHRoZSB3YXkKLSAgc3ViY2xhc3NlcyBvZiBzdHIgYWx3YXlzIGJlaGF2ZWQuICBpbnQvbG9uZy9mbG9hdCwgY29udmVyc2lvbiBvZiBhbiBpbnN0YW5jZQotICB0byB0aGUgYmFzZSBjbGFzcyBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgcHJvcGVyIG5iXyogbWFnaWMgc2xvdCBhbmQgb3V0IG9mCi0gIFB5TnVtYmVyXyooKS4KLSAgVGhhbmtzIFdhbHRlciBE9nJ3YWxkLgotCi0tIERlc2NyaXB0b3JzIGRlZmluZWQgaW4gQyB3aXRoIGEgUHlHZXRTZXREZWYgc3RydWN0dXJlLCB3aGVyZSB0aGUgc2V0dGVyIGlzCi0gIE5VTEwsIG5vdyByYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gc2V0IG9yIGRlbGV0ZSB0aGUKLSAgYXR0cmlidXRlLiAgUHJldmlvdXNseSBhIFR5cGVFcnJvciB3YXMgcmFpc2VkLCBidXQgdGhpcyB3YXMgaW5jb25zaXN0ZW50Ci0gIHdpdGggdGhlIGVxdWl2YWxlbnQgcHVyZS1QeXRob24gaW1wbGVtZW50YXRpb24uCi0KLS0gSXQgaXMgbm93IHNhZmUgdG8gY2FsbCBQeUdJTFN0YXRlX1JlbGVhc2UoKSBiZWZvcmUKLSAgUHlFdmFsX0luaXRUaHJlYWRzKCkgKG5vdGUgdGhhdCBpZiB0aGVyZSBpcyByZWFzb24gdG8gYmVsaWV2ZSB0aGVyZQotICBhcmUgbXVsdGlwbGUgdGhyZWFkcyBhcm91bmQgeW91IHN0aWxsIG11c3QgY2FsbCBQeUV2YWxfSW5pdFRocmVhZHMoKQotICBiZWZvcmUgdXNpbmcgdGhlIFB5dGhvbiBBUEk7IHRoaXMgZml4IGlzIGZvciBleHRlbnNpb24gbW9kdWxlcyB0aGF0Ci0gIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaWYgUHl0aG9uIGlzIG11bHRpLXRocmVhZGVkIHlldCkuCi0KLS0gVHlwaW5nIEN0cmwtQyB3aGlsc3QgcmF3X2lucHV0KCkgd2FzIHdhaXRpbmcgaW4gYSBidWlsZCB3aXRoIHRocmVhZHMKLSAgZGlzYWJsZWQgY2F1c2VkIGEgY3Jhc2guCi0KLS0gQnVnICMxMTY1MzA2OiBpbnN0YW5jZW1ldGhvZF9uZXcgYWxsb3dlZCB0aGUgY3JlYXRpb24gb2YgYSBtZXRob2QKLSAgd2l0aCBpbV9jbGFzcyA9PSBpbV9zZWxmID09IE5VTEwsIHdoaWNoIGNhdXNlZCBhIGNyYXNoIHdoZW4gY2FsbGVkLgotCi0tIE1vdmUgZXhjZXB0aW9uIGZpbmFsaXNhdGlvbiBsYXRlciBpbiB0aGUgc2h1dGRvd24gcHJvY2VzcyAtIHRoaXMKLSAgZml4ZXMgdGhlIGNyYXNoIHNlZW4gaW4gYnVnICMxMTY1NzYxCi0KLS0gQWRkZWQgdHdvIG5ldyBidWlsdGlucywgYW55KCkgYW5kIGFsbCgpLgotCi0tIERlZmluaW5nIGEgY2xhc3Mgd2l0aCBlbXB0eSBwYXJlbnRoZXNlcyBpcyBub3cgYWxsb3dlZAotICAoZS5nLiwgYGBjbGFzcyBDKCk6IHBhc3NgYCBpcyBubyBsb25nZXIgYSBzeW50YXggZXJyb3IpLgotICBQYXRjaCAjMTE3NjAxMiBhZGRlZCBzdXBwb3J0IHRvIHRoZSAncGFyc2VyJyBtb2R1bGUgYW5kICdjb21waWxlcicgcGFja2FnZQotICAodGhhbmtzIHRvIGxvZ2lzdGl4IGZvciB0aGF0IGFkZGVkIHN1cHBvcnQpLgotCi0tIFBhdGNoICMxMTE1MDg2OiBTdXBwb3J0IFBZX0xPTkdMT05HIGluIHN0cnVjdG1lbWJlci4KLQotLSBCdWcgIzExNTU5Mzg6IG5ldyBzdHlsZSBjbGFzc2VzIGRpZCBub3QgY2hlY2sgdGhhdCBfX2luaXRfXygpIHdhcwotICByZXR1cm5pbmcgTm9uZS4KLQotLSBQYXRjaCAjODAyMTg4OiBSZXBvcnQgY2hhcmFjdGVycyBhZnRlciBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIKLSAgKCdcJykgd2l0aCBhIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuCi0KLS0gQnVnICM3MjMyMDE6IFJhaXNlIGEgVHlwZUVycm9yIGZvciBwYXNzaW5nIGJhZCBvYmplY3RzIHRvICdMJyBmb3JtYXQuCi0KLS0gQnVnICMxMTI0Mjk1OiB0aGUgX19uYW1lX18gYXR0cmlidXRlIG9mIGZpbGUgb2JqZWN0cyB3YXMKLSAgaW5hZHZlcnRlbnRseSBtYWRlIGluYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUuCi0KLS0gQnVnICMxMDc0MDExOiBjbG9zaW5nIHN5cy5zdGR7b3V0LGVycn0gbm93IGNhdXNlcyBhIGZsdXNoKCkgYW5kCi0gIGFuIGZlcnJvcigpIGNhbGwuCi0KLS0gbWluKCkgYW5kIG1heCgpIG5vdyBzdXBwb3J0IGtleT0gYXJndW1lbnRzIHdpdGggdGhlIHNhbWUgbWVhbmluZyBhcyBpbgotICBsaXN0LnNvcnQoKS4KLQotLSBUaGUgcGVlcGhvbGUgb3B0aW1pemVyIG5vdyBwZXJmb3JtcyBzaW1wbGUgY29uc3RhbnQgZm9sZGluZyBpbiBleHByZXNzaW9uczoKLSAgICAgICgyKzMpIC0tPiAoNSkuCi0KLS0gc2V0IGFuZCBmcm96ZW5zZXQgb2JqZWN0cyBjYW4gbm93IGJlIG1hcnNoYWxsZWQuICBTRiAjMTA5ODk4NS4KLQotLSBCdWcgIzEwNzcxMDY6IFBvb3IgYXJndW1lbnQgY2hlY2tpbmcgY291bGQgY2F1c2UgbWVtb3J5IGNvcnJ1cHRpb24KLSAgaW4gY2FsbHMgdG8gb3MucmVhZCgpLgotCi0tIFRoZSBwYXJzZXIgZGlkIG5vdCBjb21wbGFpbiBhYm91dCBmdXR1cmUgc3RhdGVtZW50cyBpbiBpbGxlZ2FsCi0gIHBvc2l0aW9ucy4gIEl0IG9uY2UgYWdhaW4gcmVwb3J0cyBhIHN5bnRheCBlcnJvciBpZiBhIGZ1dHVyZQotICBzdGF0ZW1lbnQgb2NjdXJzIGFmdGVyIGFueXRoaW5nIG90aGVyIHRoYW4gYSBkb2Mgc3RyaW5nLgotCi0tIENoYW5nZSB0aGUgJXMgZm9ybWF0IHNwZWNpZmllciBmb3Igc3RyIG9iamVjdHMgc28gdGhhdCBpdCByZXR1cm5zIGEKLSAgdW5pY29kZSBpbnN0YW5jZSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IGFuIGluc3RhbmNlIG9mIGJhc2VzdHJpbmcgYW5kCi0gIGNhbGxpbmcgX19zdHJfXyBvbiB0aGUgYXJndW1lbnQgcmV0dXJucyBhIHVuaWNvZGUgaW5zdGFuY2UuCi0KLS0gUGF0Y2ggIzE0MTMxODE6ICBjaGFuZ2VkIGBgUHlUaHJlYWRTdGF0ZV9EZWxldGUoKWBgIHRvIGZvcmdldCBhYm91dCB0aGUKLSAgY3VycmVudCB0aHJlYWQgc3RhdGUgd2hlbiB0aGUgYXV0by1HSUwtc3RhdGUgbWFjaGluZXJ5IGtub3dzIGFib3V0Ci0gIGl0IChzaW5jZSB0aGUgdGhyZWFkIHN0YXRlIGlzIGJlaW5nIGRlbGV0ZWQsIGNvbnRpbnVpbmcgdG8gcmVtZW1iZXIgaXQKLSAgY2FuJ3QgaGVscCwgYnV0IGNhbiBodXJ0IGlmIGFub3RoZXIgdGhyZWFkIGhhcHBlbnMgdG8gZ2V0IGNyZWF0ZWQgd2l0aAotICB0aGUgc2FtZSB0aHJlYWQgaWQpLgorLSBBYnNvbHV0ZSBpbXBvcnQgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yICdpbXBvcnQgZm9vJyBldGMuCiAKIEV4dGVuc2lvbiBNb2R1bGVzCiAtLS0tLS0tLS0tLS0tLS0tLQogCi0tIEJ1ZyAjMTQ0ODQ5MDogRml4ZWQgYSBidWcgdGhhdCBJU08tMjAyMiBjb2RlY3MgY291bGQgbm90IGhhbmRsZQotICBTUzIgKHNpbmdsZS1zaGlmdCAyKSBlc2NhcGUgc2VxdWVuY2VzIGNvcnJlY3RseS4KLQotLSBUaGUgdW5pY29kZWRhdGEgbW9kdWxlIHdhcyB1cGRhdGVkIHRvIHRoZSA0LjEgdmVyc2lvbiBvZiB0aGUgVW5pY29kZQotICBkYXRhYmFzZS4gVGhlIDMuMiB2ZXJzaW9uIGlzIHN0aWxsIGF2YWlsYWJsZSBhcyB1bmljb2RlZGF0YS5kYl8zXzJfMAotICBmb3IgYXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSB0aGlzIHNwZWNpZmljIHZlcnNpb24gKHN1Y2ggYXMgSUROQSkuCi0KLS0gVGhlIHRpbWluZyBtb2R1bGUgaXMgbm8gbG9uZ2VyIGJ1aWx0IGJ5IGRlZmF1bHQuICBJdCB3YXMgZGVwcmVjYXRlZAotICBpbiBQRVAgNCBpbiBQeXRob24gMi4wIG9yIGVhcmxpZXIuCi0KLS0gUGF0Y2ggMTQzMzkyODogQWRkZWQgYSBuZXcgdHlwZSwgZGVmYXVsdGRpY3QsIHRvIHRoZSBjb2xsZWN0aW9ucyBtb2R1bGUuCi0gIFRoaXMgdXNlcyB0aGUgbmV3IF9fbWlzc2luZ19fIGhvb2sgYmVoYXZpb3IgYWRkZWQgdG8gZGljdCAoc2VlIGFib3ZlKS4KLQotLSBCdWcgIzg1NDgyMzogc29ja2V0bW9kdWxlIG5vdyBidWlsZHMgb24gU3VuIHBsYXRmb3JtcyBldmVuIHdoZW4KLSAgSU5FVF9BRERSU1RSTEVOIGlzIG5vdCBkZWZpbmVkLgotCi0tIFBhdGNoICMxMzkzMTU3OiBvcy5zdGFydGZpbGUoKSBub3cgaGFzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHNwZWNpZnkKLSAgYSAiY29tbWFuZCB2ZXJiIiB0byBpbnZva2Ugb24gdGhlIGZpbGUuCi0KLS0gQnVnICM4NzY2MzcsIHByZXZlbnQgc3RhY2sgY29ycnVwdGlvbiB3aGVuIHNvY2tldCBkZXNjcmlwdG9yCi0gIGlzIGxhcmdlciB0aGFuIEZEX1NFVFNJWkUuCi0KLS0gUGF0Y2ggIzE0MDcxMzUsIGJ1ZyAjMTQyNDA0MTogaGFybW9uaXplIG1tYXAgYmVoYXZpb3Igb2YgYW5vbnltb3VzIG1lbW9yeS4KLSAgbW1hcC5tbWFwKC0xLCBzaXplKSBub3cgcmV0dXJucyBhbm9ueW1vdXMgbWVtb3J5IGluIGJvdGggVW5peCBhbmQgV2luZG93cy4KLSAgbW1hcC5tbWFwKDAsIHNpemUpIHNob3VsZCBub3QgYmUgdXNlZCBvbiBXaW5kb3dzIGZvciBhbm9ueW1vdXMgbWVtb3J5LgotCi0tIFBhdGNoICMxNDIyMzg1OiBUaGUgbmlzIG1vZHVsZSBub3cgc3VwcG9ydHMgYWNjZXNzIHRvIGRvbWFpbnMgb3RoZXIKLSAgdGhhbiB0aGUgc3lzdGVtIGRlZmF1bHQgZG9tYWluLgotCi0tIFVzZSBXaW4zMiBBUEkgdG8gaW1wbGVtZW50IG9zLnN0YXQvZnN0YXQuIEFzIGEgcmVzdWx0LCBzdWJzZWNvbmQgdGltZXN0YW1wcwotICBhcmUgcmVwb3J0ZWQsIHRoZSBsaW1pdCBvbiBwYXRoIG5hbWUgbGVuZ3RocyBpcyByZW1vdmVkLCBhbmQgc3RhdCByZXBvcnRzCi0gIFdpbmRvd3NFcnJvciBub3cgKGluc3RlYWQgb2YgT1NFcnJvcikuCi0KLS0gQWRkIGJzZGRiLmRiLkRCRW52LnNldF90eF90aW1lc3RhbXAgYWxsb3dpbmcgdGltZSBiYXNlZCBkYXRhYmFzZSByZWNvdmVyeS4KLQotLSBCdWcgIzE0MTMxOTIsIGZpeCBzZWcgZmF1bHQgaW4gYnNkZGIgaWYgYSB0cmFuc2FjdGlvbiB3YXMgZGVsZXRlZAotICBiZWZvcmUgdGhlIGVudi4KLQotLSBQYXRjaCAjMTEwMzExNjogQmFzaWMgQUZfTkVUTElOSyBzdXBwb3J0LgotCi0tIEJ1ZyAjMTQwMjMwOCwgKHBvc3NpYmxlKSBzZWdmYXVsdCB3aGVuIHVzaW5nIG1tYXAubW1hcCgtMSwgLi4uKQotCi0tIEJ1ZyAjMTQwMDgyMiwgX2N1cnNlcyBvdmVye2xheSx3cml0ZX0gZG9lc24ndCB3b3JrIHdoZW4gcGFzc2luZyA2IGludHMuCi0gIEFsc28gZml4IHVuZ2V0bW91c2UoKSB3aGljaCBkaWQgbm90IGFjY2VwdCBhcmd1bWVudHMgcHJvcGVybHkuCi0gIFRoZSBjb2RlIG5vdyBjb25mb3JtcyB0byB0aGUgZG9jdW1lbnRlZCBzaWduYXR1cmUuCi0KLS0gQnVnICMxNDAwMTE1LCBGaXggc2VnZmF1bHQgd2hlbiBjYWxsaW5nIGN1cnNlcy5wYW5lbC51c2VycHRyKCkKLSAgd2l0aG91dCBwcmlvciBzZXR0aW5nIG9mIHRoZSB1c2VycHRyLgotCi0tIEZpeCA2NC1iaXQgcHJvYmxlbXMgaW4gYnNkZGIuCi0KLS0gUGF0Y2ggIzEzNjU5MTY6IGZpeCBzb21lIHVuc2FmZSA2NC1iaXQgbW1hcCBtZXRob2RzLgotCi0tIEJ1ZyAjMTI5MDMzMzogQWRkZWQgYSB3b3JrYXJvdW5kIGZvciBjamtjb2RlY3MnIF9jb2RlY3NfY24gYnVpbGQKLSAgcHJvYmxlbSBvbiBBSVguCi0KLS0gQnVnICM4NjkxOTc6IG9zLnNldGdyb3VwcyByZWplY3RzIGxvbmcgaW50ZWdlciBhcmd1bWVudHMKLQotLSBCdWcgIzEzNDY1MzMsIHNlbGVjdC5wb2xsKCkgZG9lc24ndCByYWlzZSBhbiBlcnJvciBpZiB0aW1lb3V0ID4gc3lzLm1heGludAotCi0tIEJ1ZyAjMTM0NDUwOCwgRml4IFVOSVggbW1hcCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMKLQotLSBQYXRjaCAjMTMzODMxNCwgQnVnICMxMzM2NjIzOiBmaXggdGFyZmlsZSBzbyBpdCBjYW4gZXh0cmFjdAotICBSRUdUWVBFIGRpcmVjdG9yaWVzIGZyb20gdGFyZmlsZXMgd3JpdHRlbiBieSBvbGQgcHJvZ3JhbXMuCi0KLS0gUGF0Y2ggIzE0MDc5OTIsIGZpeGVzIGJyb2tlbiBic2RkYiBtb2R1bGUgZGIgYXNzb2NpYXRlIHdoZW4gdXNpbmcKLSAgQmVya2VsZXlEQiAzLjMsIDQuMCBvciA0LjEuCi0KLS0gR2V0IGJzZGRiIG1vZHVsZSB0byBidWlsZCB3aXRoIEJlcmtlbGV5REIgdmVyc2lvbiA0LjQKLQotLSBHZXQgYnNkZGIgbW9kdWxlIHRvIGJ1aWxkIHdpdGggQmVya2VsZXlEQiB2ZXJzaW9uIDMuMgotCi0tIFBhdGNoICMxMzA5MDA5LCBGaXggc2VnZmF1bHQgaW4gcHlleHBhdCB3aGVuIHRoZSBYTUwgZG9jdW1lbnQgaXMgaW4gbGF0aW5fMSwKLSAgYnV0IFB5dGhvbiBpbmNvcnJlY3RseSBhc3N1bWVzIGl0IGlzIGluIFVURi04IGZvcm1hdAotCi0tIEZpeCBwYXJzZSBlcnJvcnMgaW4gdGhlIHJlYWRsaW5lIG1vZHVsZSB3aGVuIGNvbXBpbGluZyB3aXRob3V0IHRocmVhZHMuCi0KLS0gUGF0Y2ggIzEyODg4MzM6IFJlbW92ZWQgdGhyZWFkIGxvY2sgZnJvbSBzb2NrZXQuZ2V0YWRkcmluZm8gb24KLSAgRnJlZUJTRCA1LjMgYW5kIGxhdGVyIHZlcnNpb25zIHdoaWNoIGdvdCB0aHJlYWQtc2FmZSBnZXRhZGRyaW5mbygzKS4KLQotLSBQYXRjaGVzICMxMjk4NDQ5IGFuZCAjMTI5ODQ5OTogQWRkIHNvbWUgbWlzc2luZyBjaGVja3MgZm9yIGVycm9yCi0gIHJldHVybnMgaW4gY1N0cmluZ0lPLmMuCi0KLS0gUGF0Y2ggIzEyOTcwMjg6IGZpeCBzZWdmYXVsdCBpZiBjYWxsIHR5cGUgb24gTXVsdGlieXRlQ29kZWMsCi0gIE11bHRpYnl0ZVN0cmVhbVJlYWRlciwgb3IgTXVsdGlieXRlU3RyZWFtV3JpdGVyCi0KLS0gRml4IG1lbW9yeSBsZWFrIGluIHBvc2l4LmFjY2VzcygpLgotCi0tIFBhdGNoICMxMjEzODMxOiBGaXggdHlwbyBpbiB1bmljb2RlZGF0YS5fZ2V0Y29kZS4KLQotLSBCdWcgIzEwMDcwNDY6IG9zLnN0YXJ0ZmlsZSgpIGRpZCBub3QgYWNjZXB0IHVuaWNvZGUgc3RyaW5ncyBlbmNvZGVkIGluCi0gIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZy4KLQotLSBQYXRjaCAjNzU2MDIxOiBTcGVjaWFsLWNhc2Ugc29ja2V0LmluZXRfYXRvbignMjU1LjI1NS4yNTUuMjU1JykgZm9yCi0gIHBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgaW5ldF9hdG9uKCkuCi0KLS0gQnVnICMxMjE1OTI4OiBGaXggYnoyLkJaMkZpbGUuc2VlaygpIGZvciA2NC1iaXQgZmlsZSBvZmZzZXRzLgotCi0tIEJ1ZyAjMTE5MTA0MzogRml4IGJ6Mi5CWjJGaWxlLih4KXJlYWRsaW5lcyBmb3IgZmlsZXMgY29udGFpbmluZyBvbmUKLSAgbGluZSB3aXRob3V0IG5ld2xpbmVzLgotCi0tIEJ1ZyAjNzI4NTE1OiBtbWFwLnJlc2l6ZSgpIG5vdyByZXNpemVzIHRoZSBmaWxlIG9uIFVuaXggYXMgaXQgZGlkCi0gIG9uIFdpbmRvd3MuCi0KLS0gUGF0Y2ggIzExODA2OTU6IEFkZCBuYW5vc2Vjb25kIHN0YXQgcmVzb2x1dGlvbiwgYW5kIHN0X2dlbiwKLSAgc3RfYmlydGh0aW1lIGZvciBGcmVlQlNELgotCi0tIFBhdGNoICMxMjMxMDY5OiBUaGUgZmNudGwuaW9jdGwgZnVuY3Rpb24gbm93IHVzZXMgdGhlICdJJyBjb2RlIGZvcgotICB0aGUgcmVxdWVzdCBjb2RlIGFyZ3VtZW50LCB3aGljaCByZXN1bHRzIGluIG1vcmUgQy1saWtlIGJlaGF2aW91cgotICBmb3IgbGFyZ2Ugb3IgbmVnYXRpdmUgdmFsdWVzLgotCi0tIEJ1ZyAjMTIzNDk3OTogRm9yIHRoZSBhcmd1bWVudCBvZiB0aHJlYWQuTG9jay5hY3F1aXJlLCB0aGUgV2luZG93cwotICBpbXBsZW1lbnRhdGlvbiB0cmVhdGVkIGFsbCBpbnRlZ2VyIHZhbHVlcyBleGNlcHQgMSBhcyBmYWxzZS4KLQotLSBCdWcgIzExOTQxODE6IGJ6Mi5CWjJGaWxlIGRpZG4ndCBoYW5kbGUgbW9kZSAnVScgY29ycmVjdGx5LgotCi0tIFBhdGNoICMxMjEyMTE3OiBvcy5zdGF0KCkuc3RfZmxhZ3MgaXMgbm93IGFjY2Vzc2libGUgYXMgYSBhdHRyaWJ1dGUKLSAgaWYgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS4KLQotLSBQYXRjaCAjMTEwMzk1MTogRXhwb3NlIE9fU0hMT0NLIGFuZCBPX0VYTE9DSyBpbiB0aGUgcG9zaXggbW9kdWxlIGlmCi0gIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0uCi0KLS0gQnVnICMxMTY2NjYwOiBUaGUgcmVhZGxpbmUgbW9kdWxlIGNvdWxkIHNlZ2ZhdWx0IGlmIGhvb2sgZnVuY3Rpb25zCi0gIHdlcmUgc2V0IGluIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoYXQgd2hpY2ggY2FsbGVkIHJlYWRsaW5lLgotCi0tIGNvbGxlY3Rpb25zLmRlcXVlIG9iamVjdHMgbm93IHN1cHBvcnQgYSByZW1vdmUoKSBtZXRob2QuCi0KLS0gb3BlcmF0b3IuaXRlbWdldHRlcigpIGFuZCBvcGVyYXRvci5hdHRyZ2V0dGVyKCkgbm93IHN1cHBvcnQgcmV0cmlldmluZwotICBtdWx0aXBsZSBmaWVsZHMuICBUaGlzIHByb3ZpZGVzIGRpcmVjdCBzdXBwb3J0IGZvciBzb3J0aW5nIG9uIG11bHRpcGxlCi0gIGtleXMgKHByaW1hcnksIHNlY29uZGFyeSwgZXRjKS4KLQotLSBvcy5hY2Nlc3Mgbm93IHN1cHBvcnRzIFVuaWNvZGUgcGF0aCBuYW1lcyBvbiBub24tV2luMzIgc3lzdGVtcy4KLQotLSBQYXRjaGVzICM5MjUxNTIsICMxMTE4NjAyOiBBdm9pZCByZWFkaW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgotICBpbiBweWV4cGF0LkdldElucHV0Q29udGV4dC4KLQotLSBQYXRjaGVzICM3NDk4MzAsICMxMTQ0NTU1OiBhbGxvdyBVTklYIG1tYXAgc2l6ZSB0byBkZWZhdWx0IHRvIGN1cnJlbnQKLSAgZmlsZSBzaXplLgotCi0tIEFkZGVkIGZ1bmN0aW9uYWwucGFydGlhbCgpLiAgU2VlIFBFUDMwOS4KLQotLSBQYXRjaCAjMTA5MzU4NTogcmFpc2UgYSBWYWx1ZUVycm9yIGZvciBuZWdhdGl2ZSBoaXN0b3J5IGl0ZW1zIGluIHJlYWRsaW5lLgotICB7cmVtb3ZlX2hpc3RvcnkscmVwbGFjZV9oaXN0b3J5fQotCi0tIFRoZSBzcHdkIG1vZHVsZSBoYXMgYmVlbiBhZGRlZCwgYWxsb3dpbmcgYWNjZXNzIHRvIHRoZSBzaGFkb3cgcGFzc3dvcmQKLSAgZGF0YWJhc2UuCi0KLS0gc3RhdF9mbG9hdF90aW1lcyBpcyBub3cgVHJ1ZS4KLQotLSBhcnJheS5hcnJheSBvYmplY3RzIGFyZSBub3cgcGlja2xhYmxlLgotCi0tIHRoZSBjUGlja2xlIG1vZHVsZSBubyBsb25nZXIgYWNjZXB0cyB0aGUgZGVwcmVjYXRlZCBOb25lIG9wdGlvbiBpbiB0aGUKLSAgYXJncyB0dXBsZSByZXR1cm5lZCBieSBfX3JlZHVjZV9fKCkuCi0KLS0gaXRlcnRvb2xzLmlzbGljZSgpIG5vdyBhY2NlcHRzIE5vbmUgZm9yIHRoZSBzdGFydCBhbmQgc3RlcCBhcmd1bWVudHMuCi0gIFRoaXMgYWxsb3dzIGlzbGljZSgpIHRvIHdvcmsgbW9yZSByZWFkaWx5IHdpdGggc2xpY2VzOgotICAgICAgaXNsaWNlKHMuc3RhcnQsIHMuc3RvcCwgcy5zdGVwKQotCi0tIGRhdGV0aW1lLmRhdGV0aW1lKCkgbm93IGhhcyBhIHN0cnB0aW1lIGNsYXNzIG1ldGhvZCB3aGljaCBjYW4gYmUgdXNlZCB0bwotICBjcmVhdGUgZGF0ZXRpbWUgb2JqZWN0IHVzaW5nIGEgc3RyaW5nIGFuZCBmb3JtYXQuCi0KIExpYnJhcnkKIC0tLS0tLS0KIAotLSBBIHJlZ3J0ZXN0IG9wdGlvbiAtdyB3YXMgYWRkZWQgdG8gcmUtcnVuIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUuCi0KLS0gUGF0Y2ggIzE0NDYzNzI6IHF1aXQgYW5kIGV4aXQgY2FuIG5vdyBiZSBjYWxsZWQgZnJvbSB0aGUgaW50ZXJhY3RpdmUKLSAgaW50ZXJwcmV0ZXIgdG8gZXhpdC4KLQotLSBUaGUgZnVuY3Rpb24gZ2V0X2NvdW50KCkgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGdjIG1vZHVsZSwgYW5kIGdjLmNvbGxlY3QoKQotICBncmV3IGFuIG9wdGlvbmFsICdnZW5lcmF0aW9uJyBhcmd1bWVudC4KLQotLSBBIGxpYnJhcnkgbXNpbGliIHRvIGdlbmVyYXRlIFdpbmRvd3MgSW5zdGFsbGVyIGZpbGVzLCBhbmQgYSBkaXN0dXRpbHMKLSAgY29tbWFuZCBiZGlzdF9tc2kgaGF2ZSBiZWVuIGFkZGVkLgotCi0tIFBFUCAzNDM6IG5ldyBtb2R1bGUgY29udGV4dGxpYi5weSBkZWZpbmVzIGRlY29yYXRvciBAY29udGV4dG1hbmFnZXIKLSAgYW5kIGhlbHBmdWwgY29udGV4dCBtYW5hZ2VycyBuZXN0ZWQoKSBhbmQgY2xvc2luZygpLgotCi0tIFRoZSBjb21waWxlciBwYWNrYWdlIG5vdyBzdXBwb3J0cyBmdXR1cmUgaW1wb3J0cyBhZnRlciB0aGUgbW9kdWxlIGRvY3N0cmluZy4KLQotLSBCdWcgIzE0MTM3OTA6IHppcGZpbGUgbm93IHNhbml0aXplcyBhYnNvbHV0ZSBhcmNoaXZlIG5hbWVzIHRoYXQgYXJlCi0gIG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjcy4KLQotLSBQYXRjaCAjMTIxNTE4NDogRmlsZUlucHV0IG5vdyBjYW4gYmUgZ2l2ZW4gYW4gb3BlbmluZyBob29rIHdoaWNoIGNhbgotICBiZSB1c2VkIHRvIGNvbnRyb2wgaG93IGZpbGVzIGFyZSBvcGVuZWQuCi0KLS0gUGF0Y2ggIzEyMTIyODc6IGZpbGVpbnB1dC5pbnB1dCgpIG5vdyBoYXMgYSBtb2RlIHBhcmFtZXRlciBmb3IKLSAgc3BlY2lmeWluZyB0aGUgZmlsZSBtb2RlIGlucHV0IGZpbGVzIHNob3VsZCBiZSBvcGVuZWQgd2l0aC4KLQotLSBQYXRjaCAjMTIxNTE4NDogZmlsZWlucHV0IG5vdyBoYXMgYSBmaWxlbm8oKSBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUKLSAgY3VycmVudCBmaWxlIG51bWJlci4KLQotLSBQYXRjaCAjMTM0OTI3NDogZ2V0dGV4dC5pbnN0YWxsKCkgbm93IG9wdGlvbmFsbHkgaW5zdGFsbHMgYWRkaXRpb25hbAotICB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgb3RoZXIgdGhhbiBfKCkgaW4gdGhlIGJ1aWx0aW4gbmFtZXNwYWNlLgotCi0tIFBhdGNoICMxMzM3NzU2OiBmaWxlaW5wdXQgbm93IGFjY2VwdHMgVW5pY29kZSBmaWxlbmFtZXMuCi0KLS0gUGF0Y2ggIzEzNzM2NDM6IFRoZSBjaHVuayBtb2R1bGUgY2FuIG5vdyByZWFkIGNodW5rcyBsYXJnZXIgdGhhbgotICB0d28gZ2lnYWJ5dGVzLgotCi0tIFBhdGNoICMxNDE3NTU1OiBTaW1wbGVIVFRQU2VydmVyIG5vdyByZXR1cm5zIExhc3QtTW9kaWZpZWQgaGVhZGVycy4KLQotLSBCdWcgIzE0MzAyOTg6IEl0IGlzIG5vdyBwb3NzaWJsZSB0byBzZW5kIGEgbWFpbCB3aXRoIGFuIGVtcHR5Ci0gIHJldHVybiBhZGRyZXNzIHVzaW5nIHNtdHBsaWIuCi0KLS0gQnVnICMxNDMyMjYwOiBUaGUgbmFtZXMgb2YgbGFtYmRhIGZ1bmN0aW9ucyBhcmUgbm93IHByb3Blcmx5IGRpc3BsYXllZAotICBpbiBweWRvYy4KLQotLSBQYXRjaCAjMTQxMjg3MjogemlwZmlsZSBub3cgc2V0cyB0aGUgY3JlYXRvciBzeXN0ZW0gdG8gMyAoVW5peCkKLSAgdW5sZXNzIHRoZSBzeXN0ZW0gaXMgV2luMzIuCi0KLS0gUGF0Y2ggIzEzNDkxMTg6IHVybGxpYiBub3cgc3VwcG9ydHMgdXNlcjpwYXNzQCBzdHlsZSBwcm94eQotICBzcGVjaWZpY2F0aW9ucywgcmFpc2VzIElPRXJyb3JzIHdoZW4gcHJveGllcyBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2xzCi0gIGFyZSBkZWZpbmVkLCBhbmQgdXNlcyB0aGUgaHR0cHMgcHJveHkgb24gaHR0cHMgcmVkaXJlY3Rpb25zLgotCi0tIEJ1ZyAjOTAyMDc1OiB1cmxsaWIyIG5vdyBzdXBwb3J0cyAnaG9zdDpwb3J0JyBzdHlsZSBwcm94eSBzcGVjaWZpY2F0aW9ucy4KLQotLSBCdWcgIzE0MDc5MDI6IEFkZCBzdXBwb3J0IGZvciBzZnRwOi8vIFVSSXMgdG8gdXJscGFyc2UuCi0KLS0gQnVnICMxMzcxMjQ3OiBVcGRhdGUgV2luZG93cyBsb2NhbGUgaWRlbnRpZmllcnMgaW4gbG9jYWxlLnB5LgotCi0tIEJ1ZyAjMTM5NDU2NTogU2ltcGxlSFRUUFNlcnZlciBub3cgZG9lc24ndCBjaG9rZSBvbiBxdWVyeSBwYXJhbWV0ZXJzCi0gIGFueSBtb3JlLgotCi0tIEJ1ZyAjMTQwMzQxMDogVGhlIHdhcm5pbmdzIG1vZHVsZSBub3cgZG9lc24ndCBnZXQgY29uZnVzZWQKLSAgd2hlbiBpdCBjYW4ndCBmaW5kIG91dCB0aGUgbW9kdWxlIG5hbWUgaXQgZ2VuZXJhdGVzIGEgd2FybmluZyBmb3IuCi0KLS0gUGF0Y2ggIzExNzczMDc6IEFkZGVkIGEgbmV3IGNvZGVjIHV0Zl84X3NpZyBmb3IgVVRGLTggd2l0aCBhIEJPTSBzaWduYXR1cmUuCi0KLS0gUGF0Y2ggIzExNTcwMjc6IGNvb2tpZWxpYiBtaXNoYW5kbGVzIFJGQyAyMTA5IGNvb2tpZXMgaW4gTmV0c2NhcGUgbW9kZQotCi0tIFBhdGNoICMxMTE3Mzk4OiBjb29raWVsaWIuTFdQQ29va2llSmFyIGFuZCAuTW96aWxsYUNvb2tpZUphciBub3cgcmFpc2UKLSAgTG9hZEVycm9yIGFzIGRvY3VtZW50ZWQsIGluc3RlYWQgb2YgSU9FcnJvci4gIEZvciBjb21wYXRpYmlsaXR5LAotICBMb2FkRXJyb3Igc3ViY2xhc3NlcyBJT0Vycm9yLgotCi0tIEFkZGVkIHRoZSBoYXNobGliIG1vZHVsZS4gIEl0IHByb3ZpZGVzIHNlY3VyZSBoYXNoIGZ1bmN0aW9ucyBmb3IgTUQ1IGFuZAotICBTSEExLCAyMjQsIDI1NiwgMzg0LCBhbmQgNTEyLiAgTm90ZSB0aGF0IHJlY2VudCBkZXZlbG9wbWVudHMgbWFrZSB0aGUKLSAgaGlzdG9yaWMgTUQ1IGFuZCBTSEExIHVuc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoaWMtc3RyZW5ndGggYXBwbGljYXRpb25zLgotICBJbiA8aHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDA1LURlY2VtYmVyLzA1ODg1MC5odG1sPgotICBSb25hbGQgTC4gUml2ZXN0IG9mZmVyZWQgdGhpcyBhZHZpY2UgZm9yIFB5dGhvbjoKLQotICAgICAgIlRoZSBjb25zZW5zdXMgb2YgcmVzZWFyY2hlcnMgaW4gdGhpcyBhcmVhIChhdCBsZWFzdCBhcwotICAgICAgZXhwcmVzc2VkIGF0IHRoZSBOSVNUIEhhc2ggRnVuY3Rpb24gV29ya3Nob3AgMTAvMzEvMDUpLAotICAgICAgaXMgdGhhdCBTSEEtMjU2IGlzIGEgZ29vZCBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nLCBidXQKLSAgICAgIHRoYXQgcmVzZWFyY2ggc2hvdWxkIGNvbnRpbnVlLCBhbmQgb3RoZXIgYWx0ZXJuYXRpdmVzIG1heQotICAgICAgYXJpc2UgZnJvbSB0aGlzIHJlc2VhcmNoLiAgVGhlIGxhcmdlciBTSEEncyBhbHNvIHNlZW0gT0suIgotCi0tIEFkZGVkIGEgc3Vic2V0IG9mIEZyZWRyaWsgTHVuZGgncyBFbGVtZW50VHJlZSBwYWNrYWdlLiAgQXZhaWxhYmxlCi0gIG1vZHVsZXMgYXJlIHhtbC5ldHJlZS5FbGVtZW50VHJlZSwgeG1sLmV0cmVlLkVsZW1lbnRQYXRoLCBhbmQKLSAgeG1sLmV0cmVlLkVsZW1lbnRJbmNsdWRlLCBmcm9tIEVsZW1lbnRUcmVlIDEuMi42LgotCi0tIFBhdGNoICMxMTYyODI1OiBTdXBwb3J0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIElETEUgd2luZG93IHRpdGxlcy4KLQotLSBCdWcgIzEzNjU5ODQ6IHVybGxpYiBub3cgb3BlbnMgImRhdGE6IiBVUkxzIGFnYWluLgotCi0tIFBhdGNoICMxMzE0Mzk2OiBwcmV2ZW50IGRlYWRsb2NrIGZvciB0aHJlYWRpbmcuVGhyZWFkLmpvaW4oKSB3aGVuIGFuIGV4Y2VwdGlvbgotICBpcyByYWlzZWQgd2l0aGluIHRoZSBtZXRob2QgaXRzZWxmIG9uIGEgcHJldmlvdXMgY2FsbCAoZS5nLiwgcGFzc2luZyBpbiBhbgotICBpbGxlZ2FsIGFyZ3VtZW50KQotCi0tIEJ1ZyAjMTM0MDMzNzogY2hhbmdlIHRpbWUuc3RycHRpbWUoKSB0byBhbHdheXMgcmV0dXJuIFZhbHVlRXJyb3Igd2hlbiB0aGVyZQotICBpcyBhbiBlcnJvciBpbiB0aGUgZm9ybWF0IHN0cmluZy4KLQotLSBQYXRjaCAjNzU0MDIyOiBHcmVhdGx5IGVuaGFuY2VkIHdlYmJyb3dzZXIucHkgKGJ5IE9sZWcgQnJveXRtYW5uKS4KLQotLSBCdWcgIzcyOTEwMzogcHlkb2MucHk6IEZpeCBkb2NvdGhlcigpIG1ldGhvZCB0byBhY2NlcHQgYWRkaXRpb25hbAotICAicGFyZW50IiBhcmd1bWVudC4KLQotLSBQYXRjaCAjMTMwMDUxNTogeGRybGliLnB5OiBGaXggcGFja19mc3RyaW5nKCkgdG8gcmVhbGx5IHVzZSBudWxsIGJ5dGVzCi0gIGZvciBwYWRkaW5nLgotCi0tIEJ1ZyAjMTI5NjAwNDogaHR0cGxpYi5weTogTGltaXQgbWF4aW1hbCBhbW91bnQgb2YgZGF0YSByZWFkIGZyb20gdGhlCi0gIHNvY2tldCB0byBhdm9pZCBhIE1lbW9yeUVycm9yIG9uIFdpbmRvd3MuCi0KLS0gUGF0Y2ggIzExNjY5NDg6IGxvY2FsZS5weTogUHJlZmVyIExDX0FMTCwgTENfQ1RZUEUgYW5kIExBTkcgb3ZlciBMQU5HVUFHRQotICB0byBnZXQgdGhlIGNvcnJlY3QgZW5jb2RpbmcuCi0KLS0gUGF0Y2ggIzExNjY5Mzg6IGxvY2FsZS5weTogUGFyc2UgTEFOR1VBR0UgYXMgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZgotICBsYW5ndWFnZXMuCi0KLS0gUGF0Y2ggIzEyNjgzMTQ6IENhY2hlIGxpbmVzIGluIFN0cmVhbVJlYWRlci5yZWFkbGluZXMgZm9yIHBlcmZvcm1hbmNlLgotCi0tIEJ1ZyAjMTI5MDUwNTogRml4IGNsZWFyaW5nIHRoZSByZWdleCBjYWNoZSBmb3IgdGltZS5zdHJwdGltZSgpLgotCi0tIEJ1ZyAjMTE2NzEyODogRml4IHNpemUgb2YgYSBzeW1saW5rIGluIGEgdGFyZmlsZSB0byBiZSAwLgotCi0tIFBhdGNoICM4MTAwMjM6IEZpeCBvZmYtYnktb25lIGJ1ZyBpbiB1cmxsaWIudXJscmV0cmlldmUgcmVwb3J0aG9vawotICBmdW5jdGlvbmFsaXR5LgotCi0tIEJ1ZyAjMTE2MzE3ODogTWFrZSBJRE5BIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkuCi0KLS0gUGF0Y2ggIzg0ODAxNzogTWFrZSBDb29raWUgbW9yZSBSRkMtY29tcGxpYW50LiBVc2UgQ1JMRiBhcyBkZWZhdWx0IG91dHB1dAotICBzZXBhcmF0b3IgYW5kIGRvIG5vdCBvdXRwdXQgdHJhaWxpbmcgc2VtaWNvbGEuCi0KLS0gUGF0Y2ggIzEwNjIwNjA6IHVybGxpYi51cmxyZXRyaWV2ZSgpIG5vdyByYWlzZXMgYSBuZXcgZXhjZXB0aW9uLCBuYW1lZAotICBDb250ZW50VG9vU2hvcnRFeGNlcHRpb24sIHdoZW4gdGhlIGFjdHVhbGx5IGRvd25sb2FkZWQgc2l6ZSBkb2VzIG5vdAotICBtYXRjaCB0aGUgQ29udGVudC1MZW5ndGggaGVhZGVyLgotCi0tIEJ1ZyAjMTEyMTQ5NDogZGlzdHV0aWxzLmRpcl91dGlscy5ta3BhdGggbm93IGFjY2VwdHMgVW5pY29kZSBzdHJpbmdzLgotCi0tIEJ1ZyAjMTE3ODQ4NDogUmV0dXJuIGNvbXBsZXRlIGxpbmVzIGZyb20gY29kZWMgc3RyZWFtIHJlYWRlcnMKLSAgZXZlbiBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gaW4gbGF0ZXIgbGluZXMsIHJlc3VsdGluZyBpbgotICBjb3JyZWN0IGxpbmUgbnVtYmVycyBmb3IgZGVjb2RpbmcgZXJyb3JzIGluIHNvdXJjZSBjb2RlLgotCi0tIEJ1ZyAjMTE5MjMxNTogRGlzYWxsb3cgbmVnYXRpdmUgYXJndW1lbnRzIHRvIGNsZWFyKCkgaW4gcGRiLgotCi0tIFBhdGNoICM4MjczODY6IFN1cHBvcnQgYWJzb2x1dGUgc291cmNlIHBhdGhzIGluIG1zdmNjb21waWxlci5weS4KLQotLSBQYXRjaCAjMTEwNTczMDogQXBwbHkgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBjb21tb25wcmVmaXggaW4gcG9zaXhwYXRoCi0gIHRvIG50cGF0aCwgbWFjcGF0aCwgb3MyZW14cGF0aCBhbmQgcmlzY29zcGF0aC4KLQotLSBGaXggYSBwcm9ibGVtIGluIFRraW50ZXIgaW50cm9kdWNlZCBieSBTRiBwYXRjaCAjODY5NDY4OiBkZWxldGUgYm9ndXMKLSAgX19oYXNhdHRyX18gYW5kIF9fZGVsYXR0cl9fIG1ldGhvZHMgb24gY2xhc3MgVGsgdGhhdCB3ZXJlIGJyZWFraW5nCi0gIFRrZG5kLgotCi0tIEJ1ZyAjMTAxNTE0MDogZGlzYW1iaWd1YXRlZCB0aGUgdGVybSAiYXJ0aWNsZSBpZCIgaW4gbm50cGxpYiBkb2NzIGFuZAotICBkb2NzdHJpbmdzIHRvIGVpdGhlciAiYXJ0aWNsZSBudW1iZXIiIG9yICJtZXNzYWdlIGlkIi4KLQotLSBCdWcgIzEyMzgxNzA6IHRocmVhZGluZy5UaHJlYWQuX19pbml0X18gbm8gbG9uZ2VyIGhhcyAia3dhcmdzPXt9IiBhcyBhCi0gIHBhcmFtZXRlciwgYnV0IHVzZXMgdGhlIHVzdWFsICJrd2FyZ3M9Tm9uZSIuCi0KLS0gdGV4dHdyYXAgbm93IHByb2Nlc3NlcyB0ZXh0IGNodW5rcyBhdCBPKG4pIHNwZWVkIGluc3RlYWQgb2YgTyhuKioyKS4KLSAgUGF0Y2ggIzEyMDk1MjcgKENvbnRyaWJ1dGVkIGJ5IENvbm5lbGx5KS4KLQotLSB1cmxsaWIyIGhhcyBub3cgYW4gYXR0cmlidXRlICdodHRwcmVzcG9uc2VzJyBtYXBwaW5nIGZyb20gSFRUUCBzdGF0dXMgY29kZQotICB0byBXM0MgbmFtZSAoNDA0IC0+ICdOb3QgRm91bmQnKS4gUkZFICMxMjE2OTQ0LgotCi0tIEJ1ZyAjMTE3NzQ2ODogRG9uJ3QgY2FjaGUgdGhlIC9kZXYvdXJhbmRvbSBmaWxlIGRlc2NyaXB0b3IgZm9yIG9zLnVyYW5kb20sCi0gIGFzIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggYXBwcyBjbG9zaW5nIGFsbCBmaWxlIGRlc2NyaXB0b3JzLgotCi0tIEJ1ZyAjODM5MTUxOiBGaXggYW4gYXR0ZW1wdCB0byBhY2Nlc3Mgc3lzLmFyZ3YgaW4gdGhlIHdhcm5pbmdzIG1vZHVsZQotICBpdCBjYW4gYmUgbWlzc2luZyBpbiBlbWJlZGRlZCBpbnRlcnByZXRlcnMKLQotLSBCdWcgIzExNTU2Mzg6IEZpeCBhIGJ1ZyB3aGljaCBhZmZlY3RlZCBIVFRQIDAuOSByZXNwb25zZXMgaW4gaHR0cGxpYi4KLQotLSBCdWcgIzExMDAyMDE6IENyb3NzLXNpdGUgc2NyaXB0aW5nIHdhcyBwb3NzaWJsZSBvbiBCYXNlSFRUUFNlcnZlciB2aWEKLSAgZXJyb3IgbWVzc2FnZXMuCi0KLS0gQnVnICMxMTA4OTQ4OiBDb29raWUucHkgcHJvZHVjZWQgaW52YWxpZCBKYXZhU2NyaXB0IGNvZGUuCi0KLS0gVGhlIHRva2VuaXplIG1vZHVsZSBub3cgZGV0ZWN0cyBhbmQgcmVwb3J0cyBpbmRlbnRhdGlvbiBlcnJvcnMuCi0gIEJ1ZyAjMTIyNDYyMS4KLQotLSBUaGUgdG9rZW5pemUgbW9kdWxlIGhhcyBhIG5ldyB1bnRva2VuaXplKCkgZnVuY3Rpb24gdG8gc3VwcG9ydCBhIGZ1bGwKLSAgcm91bmR0cmlwIGZyb20gbGV4ZWQgdG9rZW5zIGJhY2sgdG8gUHl0aG9uIHNvdXJjZWNvZGUuICBJbiBhZGRpdGlvbiwKLSAgdGhlIGdlbmVyYXRlX3Rva2VucygpIGZ1bmN0aW9uIG5vdyBhY2NlcHRzIGEgY2FsbGFibGUgYXJndW1lbnQgdGhhdAotICB0ZXJtaW5hdGVzIGJ5IHJhaXNpbmcgU3RvcEl0ZXJhdGlvbi4KLQotLSBCdWcgIzExOTYzMTU6IGZpeCB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkgY29uc3RydWN0b3IuCi0KLS0gQnVnICMxMjEzODk0OiBvcy5wYXRoLnJlYWxwYXRoIGRpZG4ndCByZXNvbHZlIHN5bWxpbmtzIHRoYXQgd2VyZSB0aGUgZmlyc3QKLSAgY29tcG9uZW50IG9mIHRoZSBwYXRoLgotCi0tIFBhdGNoICMxMTIwMzUzOiBUaGUgeG1scnBjbGliIG1vZHVsZSBwcm92aWRlcyBiZXR0ZXIsIG1vcmUgdHJhbnNwYXJlbnQsCi0gIHN1cHBvcnQgZm9yIGRhdGV0aW1lLntkYXRldGltZSxkYXRlLHRpbWV9IG9iamVjdHMuICBXaXRoIHVzZV9kYXRldGltZSBzZXQKLSAgdG8gVHJ1ZSwgYXBwbGljYXRpb25zIHNob3VsZG4ndCBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBEYXRlVGltZSB3cmFwcGVyCi0gIGNsYXNzIGF0IGFsbC4KLQotLSBkaXN0dXRpbHMuY29tbWFuZHMudXBsb2FkIHdhcyBhZGRlZCB0byBzdXBwb3J0IHVwbG9hZGluZyBkaXN0cmlidXRpb24KLSAgZmlsZXMgdG8gUHlQSS4KLQotLSBkaXN0dXRpbHMuY29tbWFuZHMucmVnaXN0ZXIgbm93IGVuY29kZXMgdGhlIGRhdGEgYXMgVVRGLTggYmVmb3JlIHBvc3RpbmcKLSAgdGhlbSB0byBQeVBJLgotCi0tIGRlY2ltYWwgb3BlcmF0b3IgYW5kIGNvbXBhcmlzb24gbWV0aG9kcyBub3cgcmV0dXJuIE5vdEltcGxlbWVudGVkCi0gIGluc3RlYWQgb2YgcmFpc2luZyBhIFR5cGVFcnJvciB3aGVuIGludGVyYWN0aW5nIHdpdGggb3RoZXIgdHlwZXMuICBUaGlzCi0gIGFsbG93cyBvdGhlciBjbGFzc2VzIHRvIGltcGxlbWVudCBfX3JhZGRfXyBzdHlsZSBtZXRob2RzIGFuZCBoYXZlIHRoZW0KLSAgd29yayBhcyBleHBlY3RlZC4KLQotLSBCdWcgIzExNjMzMjU6ICBEZWNpbWFsIGluZmluaXRpZXMgZmFpbGVkIHRvIGhhc2guICBBdHRlbXB0aW5nIHRvCi0gIGhhc2ggYSBOYU4gcmFpc2VkIGFuIEludmFsaWRPcGVyYXRpb24gaW5zdGVhZCBvZiBhIFR5cGVFcnJvci4KLQotLSBQYXRjaCAjOTE4MTAxOiBBZGQgdGFyZmlsZSBvcGVuIG1vZGUgcnwqIGZvciBhdXRvLWRldGVjdGlvbiBvZiB0aGUKLSAgc3RyZWFtIGNvbXByZXNzaW9uOyBhZGQsIGZvciBzeW1tZXRyeSByZWFzb25zLCByOiogYXMgYSBzeW5vbnltIG9mIHIuCi0KLS0gUGF0Y2ggIzEwNDM4OTA6IEFkZCBleHRyYWN0YWxsIG1ldGhvZCB0byB0YXJmaWxlLgotCi0tIFBhdGNoICMxMDc1ODg3OiBEb24ndCByZXF1aXJlIE1TVkMgaW4gZGlzdHV0aWxzIGlmIHRoZXJlIGlzIG5vdGhpbmcKLSAgdG8gYnVpbGQuCi0KLS0gUGF0Y2ggIzExMDM0MDc6IFByb3Blcmx5IGRlYWwgd2l0aCB0YXJmaWxlIGl0ZXJhdG9ycyB3aGVuIHVudGFycmluZwotICBzeW1ib2xpYyBsaW5rcyBvbiBXaW5kb3dzLgotCi0tIFBhdGNoICM2NDU4OTQ6IFVzZSBnZXRydXNhZ2UgZm9yIGNvbXB1dGluZyB0aGUgdGltZSBjb25zdW1wdGlvbiBpbgotICBwcm9maWxlLnB5IGlmIGF2YWlsYWJsZS4KLQotLSBQYXRjaCAjMTA0NjgzMTogVXNlIGdldF9weXRob25fdmVyc2lvbiB3aGVyZSBhcHByb3ByaWF0ZSBpbiBzeXNjb25maWcucHkuCi0KLS0gUGF0Y2ggIzExMTc0NTQ6IFJlbW92ZSBjb2RlIHRvIHNwZWNpYWwtY2FzZSBjb29raWVzIHdpdGhvdXQgdmFsdWVzCi0gIGluIExXUENvb2tpZUphci4KLQotLSBQYXRjaCAjMTExNzMzOTogQWRkIGNvb2tpZWxpYiBzcGVjaWFsIG5hbWUgdGVzdHMuCi0KLS0gUGF0Y2ggIzExMTI4MTI6IE1ha2UgYnNkZGIvX19pbml0X18ucHkgbW9yZSBmcmllbmRseSBmb3IgbW9kdWxlZmluZGVyLgotCi0tIFBhdGNoICMxMTEwMjQ4OiBTWU5DX0ZMVVNIIHRoZSB6bGliIGJ1ZmZlciBmb3IgR1ppcEZpbGUuZmx1c2guCi0KLS0gUGF0Y2ggIzExMDc5NzM6IEFsbG93IHRvIGl0ZXJhdGUgb3ZlciB0aGUgbGluZXMgb2YgYSB0YXJmaWxlLkV4RmlsZU9iamVjdC4KLQotLSBQYXRjaCAjMTEwNDExMTogQWx0ZXIgc2V0dXAucHkgLS1oZWxwIGFuZCAtLWhlbHAtY29tbWFuZHMuCi0KLS0gUGF0Y2ggIzExMjEyMzQ6IFByb3Blcmx5IGNsZWFudXAgX2V4aXQgYW5kIHRrZXJyb3IgY29tbWFuZHMuCi0KLS0gUGF0Y2ggIzEwNDkxNTE6IHhkcmxpYiBub3cgdW5wYWNrcyBib29sZWFucyBhcyBUcnVlIG9yIEZhbHNlLgotCi0tIEZpeGVkIGJ1ZyBpbiBhIE5hbWVFcnJvciBidWcgaW4gY29va2llbGliLiAgUGF0Y2ggIzExMTY1ODMuCi0KLS0gQXBwbGllZCBhIHNlY3VyaXR5IGZpeCB0byBTaW1wbGVYTUxSUENzZXJ2ZXIgKFBTRi0yMDA1LTAwMSkuICBUaGlzCi0gIGRpc2FibGVzIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwgdGhyb3VnaCBpbnN0YW5jZSBhdHRyaWJ1dGVzLCB3aGljaCBjYW4KLSAgYmUgZXhwbG9pdGVkIGluIHZhcmlvdXMgd2F5cy4KLQotLSBCdWcgIzEyMjI3OTA6IGluIFNpbXBsZVhNTFJQQ1NlcnZlciwgc2V0IHRoZSByZXVzZS1hZGRyZXNzIGFuZCBjbG9zZS1vbi1leGVjCi0gIGZsYWdzIG9uIHRoZSBIVFRQIGxpc3RlbmluZyBzb2NrZXQuCi0KLS0gQnVnICM3OTI1NzA6IFNpbXBsZVhNTFJQQ1NlcnZlciBoYWQgcHJvYmxlbXMgaWYgdGhlIHJlcXVlc3QgZ3JldyB0b28gbGFyZ2UuCi0gIEZpeGVkIGJ5IHJlYWRpbmcgdGhlIEhUVFAgYm9keSBpbiBjaHVua3MgaW5zdGVhZCBvZiBvbmUgYmlnIHNvY2tldC5yZWFkKCkuCi0KLS0gUGF0Y2hlcyAjODkzNjQyLCAjMTAzOTA4MzogYWRkIGFsbG93X25vbmUsIGVuY29kaW5nIGFyZ3VtZW50cyB0byBjb25zdHJ1Y3RvcnMgb2YKLSAgU2ltcGxlWE1MUlBDU2VydmVyIGFuZCBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlci4KLQotLSBCdWcgIzExMTA0Nzg6IFJldmVydCBvcy5lbnZpcm9uLnVwZGF0ZSB0byBkbyBwdXRlbnYgYWdhaW4uCi0KLS0gQnVnICMxMTAzODQ0OiBmaXggZGlzdHV0aWxzLmluc3RhbGwuZHVtcF9kaXJzKCkgd2l0aCBuZWdhdGVkIG9wdGlvbnMuCi0KLS0gb3Mue1NFRUtfU0VULCBTRUVLX0NVUiwgU0VFS19FTkR9IGhhdmUgYmVlbiBhZGRlZCBmb3IgY29udmVuaWVuY2UuCi0KLS0gRW5oYW5jZW1lbnRzIHRvIHRoZSBjc3YgbW9kdWxlOgotCi0gICsgRGlhbGVjdHMgYXJlIG5vdyB2YWxpZGF0ZWQgYnkgdGhlIHVuZGVybHlpbmcgQyBjb2RlLCBiZXR0ZXIKLSAgICByZWZsZWN0aW5nIGl0cyBjYXBhYmlsaXRpZXMsIGFuZCBpbXByb3ZpbmcgaXRzIGNvbXBsaWFuY2Ugd2l0aAotICAgIFBFUCAzMDUuCi0gICsgRGlhbGVjdCBwYXJhbWV0ZXIgcGFyc2luZyBoYXMgYmVlbiByZS1pbXBsZW1lbnRlZCB0byBpbXByb3ZlIGVycm9yCi0gICAgcmVwb3J0aW5nLgotICArIHF1b3RlY2hhcj1Ob25lIGFuZCBxdW90aW5nPVFVT1RFX05PTkUgbm93IHdvcmsgdGhlIHdheSBQRVAgMzA1Ci0gICAgZGljdGF0ZXMuCi0gICsgdGhlIHBhcnNlciBub3cgcmVtb3ZlcyB0aGUgZXNjYXBlY2hhciBwcmVmaXggZnJvbSBlc2NhcGVkIGNoYXJhY3RlcnMuCi0gICsgd2hlbiBxdW90aW5nPVFVT1RFX05PTk5VTUVSSUMsIHRoZSB3cml0ZXIgbm93IHRlc3RzIGZvciBudW1lcmljCi0gICAgdHlwZXMsIHJhdGhlciB0aGFuIGFueSBvYmplY3QgdGhhbiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBudW1lcmljLgotICArIHdoZW4gcXVvdGluZz1RVU9URV9OT05OVU1FUklDLCB0aGUgcmVhZGVyIG5vdyBjYXN0cyB1bnF1b3RlZCBmaWVsZHMKLSAgICB0byBmbG9hdHMuCi0gICsgcmVhZGVyIG5vdyBhbGxvd3MgXHIgY2hhcmFjdGVycyB0byBiZSBxdW90ZWQgKHByZXZpb3VzbHkgaXQgb25seSBhbGxvd2VkCi0gICAgXG4gdG8gYmUgcXVvdGVkKS4KLSAgKyB3cml0ZXIgZG91YmxlcXVvdGUgaGFuZGxpbmcgaW1wcm92ZWQuCi0gICsgRGlhbGVjdCBjbGFzc2VzIHBhc3NlZCB0byB0aGUgbW9kdWxlIGFyZSBubyBsb25nZXIgaW5zdGFudGlhdGVkIGJ5Ci0gICAgdGhlIG1vZHVsZSBiZWZvcmUgYmVpbmcgcGFyc2VkICh0aGUgZm9ybWVyIHZhbGlkYXRpb24gc2NoZW1lIHJlcXVpcmVkCi0gICAgdGhpcywgYnV0IHRoZSBtZWNoYW5pc20gd2FzIHVucmVsaWFibGUpLgotICArIFRoZSBkaWFsZWN0IHJlZ2lzdHJ5IG5vdyBjb250YWlucyBpbnN0YW5jZXMgb2YgdGhlIGludGVybmFsCi0gICAgQy1jb2RlZCBkaWFsZWN0IHR5cGUsIHJhdGhlciB0aGFuIHJlZmVyZW5jZXMgdG8gcHl0aG9uIG9iamVjdHMuCi0gICsgdGhlIGludGVybmFsIGMtY29kZWQgZGlhbGVjdCB0eXBlIGlzIG5vdyBpbW11dGFibGUuCi0gICsgcmVnaXN0ZXJfZGlhbGVjdCBub3cgYWNjZXB0cyB0aGUgc2FtZSBrZXl3b3JkIGRpYWxlY3Qgc3BlY2lmaWNhdGlvbnMKLSAgICBhcyB0aGUgcmVhZGVyIGFuZCB3cml0ZXIsIGFsbG93aW5nIHRoZSB1c2VyIHRvIHJlZ2lzdGVyIGRpYWxlY3RzCi0gICAgd2l0aG91dCBmaXJzdCBjcmVhdGluZyBhIGRpYWxlY3QgY2xhc3MuCi0gICsgYSBjb25maWd1cmFibGUgbGltaXQgdG8gdGhlIHNpemUgb2YgcGFyc2VkIGZpZWxkcyBoYXMgYmVlbiBhZGRlZCAtCi0gICAgcHJldmlvdXNseSwgYW4gdW5tYXRjaGVkIHF1b3RlIGNoYXJhY3RlciBjb3VsZCByZXN1bHQgaW4gdGhlIGVudGlyZQotICAgIGZpbGUgYmVpbmcgcmVhZCBpbnRvIHRoZSBmaWVsZCBidWZmZXIgYmVmb3JlIGFuIGVycm9yIHdhcyByZXBvcnRlZC4KLSAgKyBBIG5ldyBtb2R1bGUgbWV0aG9kIGNzdi5maWVsZF9zaXplX2xpbWl0KCkgaGFzIGJlZW4gYWRkZWQgdGhhdCBzZXRzCi0gICAgdGhlIHBhcnNlciBmaWVsZCBzaXplIGxpbWl0IChyZXR1cm5pbmcgdGhlIGZvcm1lciBsaW1pdCkuIFRoZSBpbml0aWFsCi0gICAgbGltaXQgaXMgMTI4a0IuCi0gICsgQSBsaW5lX251bSBhdHRyaWJ1dGUgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIHJlYWRlciBvYmplY3QsIHdoaWNoIHRyYWNrcwotICAgIHRoZSBudW1iZXIgb2YgbGluZXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UgaXRlcmF0b3IuIFRoaXMgaXMgbm90Ci0gICAgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByZWNvcmRzIHJldHVybmVkLCBhcyByZWNvcmRzIGNhbiBzcGFuCi0gICAgbXVsdGlwbGUgbGluZXMuCi0gICsgcmVhZGVyIGFuZCB3cml0ZXIgb2JqZWN0cyB3ZXJlIG5vdCBiZWluZyByZWdpc3RlcmVkIHdpdGggdGhlIGN5Y2xpYy1HQy4KLSAgICBUaGlzIGhhcyBiZWVuIGZpeGVkLgotCi0tIF9EdW1teVRocmVhZCBvYmplY3RzIGluIHRoZSB0aHJlYWRpbmcgbW9kdWxlIG5vdyBkZWxldGUgc2VsZi5fX2Jsb2NrIHRoYXQgaXMKLSAgaW5oZXJpdGVkIGZyb20gX1RocmVhZCBzaW5jZSBpdCB1c2VzIHVwIGEgbG9jayBhbGxvY2F0ZWQgYnkgJ3RocmVhZCcuICBUaGUKLSAgbG9jayBwcmltaXRpdmVzIHRlbmQgdG8gYmUgbGltaXRlZCBpbiBudW1iZXIgYW5kIHRodXMgc2hvdWxkIG5vdCBiZSB3YXN0ZWQgb24KLSAgYSBfRHVtbXlUaHJlYWQgb2JqZWN0LiAgRml4ZXMgYnVnICMxMDg5NjMyLgotCi0tIFRoZSBpbWdoZHIgbW9kdWxlIG5vdyBkZXRlY3RzIEV4aWYgZmlsZXMuCi0KLS0gU3RyaW5nSU8udHJ1bmNhdGUoKSBub3cgY29ycmVjdGx5IGFkanVzdHMgdGhlIHNpemUgYXR0cmlidXRlLgotICAoQnVnICM5NTE5MTUpLgotCi0tIGxvY2FsZS5weSBub3cgdXNlcyBhbiB1cGRhdGVkIGxvY2FsZSBhbGlhcyB0YWJsZSAoYnVpbHQgdXNpbmcKLSAgVG9vbHMvaTE4bi9tYWtlbG9jYWxlYWxpYXMucHksIGEgdG9vbCB0byBwYXJzZSB0aGUgWDExIGxvY2FsZQotICBhbGlhcyBmaWxlKTsgdGhlIGVuY29kaW5nIGxvb2t1cCB3YXMgZW5oYW5jZWQgdG8gdXNlIFB5dGhvbidzCi0gIGVuY29kaW5nIGFsaWFzIHRhYmxlLgotCi0tIG1vdmVkIGRlcHJlY2F0ZWQgbW9kdWxlcyB0byBMaWIvbGliLW9sZDogIHdocmFuZG9tLCB0enBhcnNlLCBzdGF0Y2FjaGUuCi0KLS0gdGhlIHBpY2tsZSBtb2R1bGUgbm8gbG9uZ2VyIGFjY2VwdHMgdGhlIGRlcHJlY2F0ZWQgTm9uZSBvcHRpb24gaW4gdGhlCi0gIGFyZ3MgdHVwbGUgcmV0dXJuZWQgYnkgX19yZWR1Y2VfXygpLgotCi0tIG9wdHBhcnNlIG5vdyBvcHRpb25hbGx5IGltcG9ydHMgZ2V0dGV4dC4gIFRoaXMgYWxsb3dzIGl0cyB1c2UgaW4gc2V0dXAucHkuCi0KLS0gdGhlIHBpY2tsZSBtb2R1bGUgbm8gbG9uZ2VyIHVzZXMgdGhlIGRlcHJlY2F0ZWQgYmluIHBhcmFtZXRlci4KLQotLSB0aGUgc2hlbHZlIG1vZHVsZSBubyBsb25nZXIgdXNlcyB0aGUgZGVwcmVjYXRlZCBiaW5hcnkgcGFyYW1ldGVyLgotCi0tIHRoZSBwc3RhdHMgbW9kdWxlIG5vIGxvbmdlciB1c2VzIHRoZSBkZXByZWNhdGVkIGlnbm9yZSgpIG1ldGhvZC4KLQotLSB0aGUgZmlsZWNtcCBtb2R1bGUgbm8gbG9uZ2VyIHVzZXMgdGhlIGRlcHJlY2F0ZWQgdXNlX3N0YXRjYWNoZSBhcmd1bWVudC4KLQotLSB1bml0dGVzdC5UZXN0Q2FzZS5ydW4oKSBhbmQgdW5pdHRlc3QuVGVzdFN1aXRlLnJ1bigpIGNhbiBub3cgYmUgc3VjY2Vzc2Z1bGx5Ci0gIGV4dGVuZGVkIG9yIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gIEZvcm1lcmx5LCB0aGUgc3ViY2xhc3NlZCBtZXRob2Qgd291bGQKLSAgYmUgaWdub3JlZCBieSB0aGUgcmVzdCBvZiB0aGUgbW9kdWxlLiAgKEJ1ZyAjMTA3ODkwNSkuCi0KLS0gaGVhcHEubnNtYWxsZXN0KCkgYW5kIGhlYXBxLm5sYXJnZXN0KCkgbm93IHN1cHBvcnQga2V5PSBhcmd1bWVudHMgd2l0aAotICB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIGxpc3Quc29ydCgpLgotCi0tIEJ1ZyAjMTA3Njk4NTogYGBjb2RlY3MuU3RyZWFtUmVhZGVyLnJlYWRsaW5lKClgYCBub3cgY2FsbHMgYGByZWFkKClgYCBvbmx5Ci0gIG9uY2Ugd2hlbiBhIHNpemUgYXJndW1lbnQgaXMgZ2l2ZW4uIFRoaXMgcHJldmVudHMgYSBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlCi0gIHRva2VuaXplciB3aXRoIHZlcnkgbG9uZyBzb3VyY2UgbGluZXMuCi0KLS0gQnVnICMxMDgzMTEwOiBgYHpsaWIuZGVjb21wcmVzcy5mbHVzaCgpYGAgd291bGQgc2VnZmF1bHQgaWYgY2FsbGVkCi0gIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW5nIHRoZSBvYmplY3QsIHdpdGhvdXQgYW55IGludGVydmVuaW5nCi0gIGBgLmRlY29tcHJlc3MoKWBgIGNhbGxzLgotCi0tIFRoZSByZWNvbnZlcnQucXVvdGUgZnVuY3Rpb24gY2FuIG5vdyBlbWl0IHRyaXBsZS1xdW90ZWQgc3RyaW5ncy4gIFRoZQotICByZWNvbnZlcnQgbW9kdWxlIG5vdyBoYXMgc29tZSBzaW1wbGUgZG9jdW1lbnRhdGlvbi4KLQotLSBgYFVzZXJTdHJpbmcuTXV0YWJsZVN0cmluZ2BgIG5vdyBzdXBwb3J0cyBuZWdhdGl2ZSBpbmRpY2VzIGluCi0gIGBgX19zZXRpdGVtX19gYCBhbmQgYGBfX2RlbGl0ZW1fX2BgCi0KLS0gQnVnICMxMTQ5NTA4OiBgYHRleHR3cmFwYGAgbm93IGhhbmRsZXMgaHlwaGVuYXRlZCBudW1iZXJzIChlZy4gIjIwMDQtMDMtMDUiKQotICBjb3JyZWN0bHkuCi0KLS0gUGFydGlhbCBmaXhlcyBmb3IgU0YgYnVncyAjMTE2MzI0NCBhbmQgIzExNzUzOTY6IElmIGEgY2h1bmsgcmVhZCBieQotICBgYGNvZGVjcy5TdHJlYW1SZWFkZXIucmVhZGxpbmUoKWBgIGhhcyBhIHRyYWlsaW5nICJcciIsIHJlYWQgb25lIG1vcmUKLSAgY2hhcmFjdGVyIGV2ZW4gaWYgdGhlIHVzZXIgaGFzIHBhc3NlZCBhIHNpemUgcGFyYW1ldGVyIHRvIGdldCBhIHByb3BlcgotICBsaW5lIGVuZGluZy4gUmVtb3ZlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIG9mIGEgIlxyXG4iIHRoYXQgaGFzIGJlZW4gc3BsaXQKLSAgYmV0d2VlbiB0d28gbGluZXMuCi0KLS0gQnVnICMxMjUxMzAwOiBPbiBVQ1MtNCBidWlsZHMgdGhlICJ1bmljb2RlLWludGVybmFsIiBjb2RlYyB3aWxsIG5vdyBjb21wbGFpbgotICBhYm91dCBpbGxlZ2FsIGNvZGUgcG9pbnRzLiBUaGUgY29kZWMgbm93IHN1cHBvcnRzIFBFUCAyOTMgc3R5bGUgZXJyb3IKLSAgaGFuZGxlcnMuCi0KLS0gQnVnICMxMjM1NjQ2OiBgYGNvZGVjcy5TdHJlYW1SZWNvZGVyLm5leHQoKWBgIG5vdyByZWVuY29kZXMgdGhlIGRhdGEgaXQgcmVhZHMKLSAgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBzbyB0aGF0IHRoZSBvdXRwdXQgaXMgYSBieXRlIHN0cmluZyBpbiB0aGUgY29ycmVjdAotICBlbmNvZGluZyBpbnN0ZWFkIG9mIGEgdW5pY29kZSBzdHJpbmcuCi0KLS0gQnVnICMxMjAyNDkzOiBGaXhpbmcgU1JFIHBhcnNlciB0byBoYW5kbGUgJ3t9JyBhcyBwZXJsIGRvZXMsIHJhdGhlciB0aGFuCi0gIGNvbnNpZGVyaW5nIGl0IGV4YWN0bHkgbGlrZSBhICcqJy4KLQotLSBCdWcgIzEyNDUzNzk6IEFkZCAidW5pY29kZS0xLTEtdXRmLTciIGFzIGFuIGFsaWFzIGZvciAidXRmLTciIHRvCi0gIGBgZW5jb2RpbmdzLmFsaWFzZXNgYC4KLQotLSBgIHV1LmVuY29kZSgpYGAgYW5kIGBgdXUuZGVjb2RlKClgYCBub3cgc3VwcG9ydCB1bmljb2RlIGZpbGVuYW1lcy4KLQotLSBQYXRjaCAjMTQxMzcxMTogQ2VydGFpbiBwYXR0ZXJucyBvZiBkaWZmZXJlbmNlcyB3ZXJlIG1ha2luZyBkaWZmbGliCi0gIHRvdWNoIHRoZSByZWN1cnNpb24gbGltaXQuCi0KIEJ1aWxkCiAtLS0tLQogCi0tIFBhdGNoICMxNDMyMzQ1OiBNYWtlIHB5dGhvbiBjb21waWxlIG9uIERyYWdvbkZseS4KLQotLSBCdWlsZCBzdXBwb3J0IGZvciBXaW42NC1BTUQ2NCB3YXMgYWRkZWQuCi0KLS0gUGF0Y2ggIzE0Mjg0OTQ6IFByZWZlciBsaW5raW5nIGFnYWluc3QgbmN1cnNlc3cgb3ZlciBuY3Vyc2VzIGxpYnJhcnkuCi0KLS0gUGF0Y2ggIzg4MTgyMDogbG9vayBmb3Igb3BlbnB0eSBhbmQgZm9ya3B0eSBhbHNvIGluIGxpYmJzZC4KLQotLSBUaGUgc291cmNlcyBvZiB6bGliIGFyZSBub3cgcGFydCBvZiB0aGUgUHl0aG9uIGRpc3RyaWJ1dGlvbiAoemxpYiAxLjIuMykuCi0gIFRoZSB6bGliIG1vZHVsZSBpcyBub3cgYnVpbHRpbiBvbiBXaW5kb3dzLgotCi0tIFVzZSAteGNvZGU9cGljMzIgZm9yIENDU0hBUkVEIG9uIFNvbGFyaXMgd2l0aCBTdW5Qcm8uCi0KLS0gQnVnICMxMTg5MzMwOiBjb25maWd1cmUgZGlkIG5vdCBjb3JyZWN0bHkgZGV0ZXJtaW5lIHRoZSBuZWNlc3NhcnkKLSAgdmFsdWUgb2YgTElOS0NDIGlmIHB5dGhvbiB3YXMgYnVpbHQgd2l0aCBHQ0MgNC4wLgotCi0tIFVwZ3JhZGUgV2luZG93cyBidWlsZCB0byB6bGliIDEuMi4zIHdoaWNoIGVsaW1pbmF0ZXMgYSBwb3RlbnRpYWwgc2VjdXJpdHkKLSAgdnVsbmVyYWJpbGl0eSBpbiB6bGliIDEuMi4xIGFuZCAxLjIuMi4KLQotLSBFWFRSQV9DRkxBR1MgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBob2xkIGNvbXBpbGVyCi0gIGZsYWdzIHRoYXQgY2hhbmdlIGJpbmFyeSBjb21wYXRpYmlsaXR5LiAgQ2hhbmdlcyB3ZXJlIGFsc28gbWFkZSB0bwotICBkaXN0dXRpbHMuc3lzY29uZmlnIHRvIGFsc28gdXNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHVzZWQgZHVyaW5nCi0gIGNvbXBpbGF0aW9uIG9mIHRoZSBpbnRlcnByZXRlciBhbmQgb2YgQyBleHRlbnNpb25zIHRocm91Z2ggZGlzdHV0aWxzLgotCi0tIFNGIHBhdGNoIDExNzE3MzU6IERhcndpbiA4J3MgaGVhZGVycyBhcmUgYW5hbCBhYm91dCBQT1NJWCBjb21wbGlhbmNlLAotICBhbmQgbGlua2luZyBoYXMgY2hhbmdlZCAocHJlYmluZGluZyBpcyBub3cgZGVwcmVjYXRlZCwgYW5kIGxpYmNjX2R5bmFtaWMKLSAgbm8gbG9uZ2VyIGV4aXN0cykuIFRoaXMgY29uZmlndXJlIHBhdGNoIG1ha2VzIHRoaW5ncyByaWdodC4KLQotLSBCdWcgIzExNTg2MDc6IEJ1aWxkIHdpdGggLS1kaXNhYmxlLXVuaWNvZGUgYWdhaW4uCi0KLS0gc3B3ZG1vZHVsZS5jIGlzIGJ1aWx0IG9ubHkgaWYgZWl0aGVyIEhBVkVfR0VUU1BOQU0gb3IgSEFWRV9IQVZFX0dFVFNQRU5UIGlzCi0gIGRlZmluZWQuICBEaXNjb3ZlcmVkIGFzIGEgcmVzdWx0IG9mIG5vdCBiZWluZyBhYmxlIHRvIGJ1aWxkIG9uIE9TIFguCi0KLS0gc2V0dXAucHkgbm93IHVzZXMgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiBMREZMQUdTIHVzaW5nIHRoZSAtTCBvcHRpb24KLSAgYW5kIGluIENQUEZMQUdTIHVzaW5nIHRoZSAtSSBvcHRpb24gZm9yIGFkZGluZyBsaWJyYXJ5IGFuZCBpbmNsdWRlCi0gIGRpcmVjdG9yaWVzLCByZXNwZWN0aXZlbHksIGZvciBjb21waWxpbmcgZXh0ZW5zaW9uIG1vZHVsZXMgYWdhaW5zdC4gIFRoaXMgaGFzCi0gIGxlZCB0byB0aGUgY29yZSBiZWluZyBjb21waWxlZCB1c2luZyB0aGUgdmFsdWVzIGluIENQUEZMQUdTLiAgSXQgYWxzbyByZW1vdmVzCi0gIHRoZSBuZWVkIGZvciB0aGUgc3BlY2lhbC1jYXNpbmcgb2YgYm90aCBEYXJ3aW5Qb3J0cyBhbmQgRmluayBmb3IgZGFyd2luIHNpbmNlCi0gIHRoZSBwcm9wZXIgZGlyZWN0b3JpZXMgY2FuIGJlIHNwZWNpZmllZCBpbiBMREZMQUdTIChgYC1ML3N3L2xpYmBgIGZvciBGaW5rLAotICBgYC1ML29wdC9sb2NhbC9saWJgYCBmb3IgRGFyd2luUG9ydHMpIGFuZCBDUFBGTEFHUyAoYGAtSS9zdy9pbmNsdWRlYGAgZm9yCi0gIEZpbmssIGBgLUkvb3B0L2xvY2FsL2luY2x1ZGVgYCBmb3IgRGFyd2luUG9ydHMpLgotCi0tIFRlc3QgaW4gY29uZmlndXJlLmluIHRoYXQgY2hlY2tzIGZvciB0enNldCBubyBsb25nZXIgZGVwZW5kZW50IG9uIHRtLT50bV96b25lCi0gIHRvIGV4aXN0IGluIHRoZSBzdHJ1Y3QgKG5vdCByZXF1aXJlZCBieSBlaXRoZXIgSVNPIEMgbm9yIHRoZSBVTklYIDIgc3BlYykuCi0gIFRlc3RzIGZvciBzYW5pdHkgaW4gdHpuYW1lIHdoZW4gSEFWRV9UWk5BTUUgZGVmaW5lZCB3ZXJlIGFsc28gZGVmaW5lZC4KLSAgQ2xvc2VzIGJ1ZyAjMTA5NjI0NC4gIFRoYW5rcyBHcmVnb3J5IEJvbmQuCi0KIEMgQVBJCiAtLS0tLQogCi0tIEFkZGVkIGEgQyBBUEkgZm9yIHNldCBhbmQgZnJvemVuc2V0IG9iamVjdHMuCi0KLS0gUmVtb3ZlZCBQeVJhbmdlX05ldygpLgotCi0tIFBhdGNoICMxMzEzOTM5OiBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcCgpIGFjY2VwdHMgYSB1bmljb2RlIHN0cmluZyBhcyB0aGUKLSAgbWFwcGluZyBhcmd1bWVudCBub3cuIFRoaXMgc3RyaW5nIGlzIHVzZWQgYXMgYSBtYXBwaW5nIHRhYmxlLiBCeXRlIHZhbHVlcwotICBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGFuZCAweEZGRkUgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkCi0gIG1hcHBpbmdzLgotCi0KIFRlc3RzCiAtLS0tLQogCi0tIEluIHRlc3Rfb3MsIHN0Xz90aW1lIGlzIG5vdyB0cnVuY2F0ZWQgYmVmb3JlIGNvbXBhcmluZyBpdCB3aXRoIFNUXz9USU1FLgotCi0tIFBhdGNoICMxMjc2MzU2OiBOZXcgcmVzb3VyY2UgInVybGZldGNoIiBpcyBpbXBsZW1lbnRlZC4gIFRoaXMgZW5hYmxlcwotICBldmVuIGltcGF0aWVudCBwZW9wbGUgdG8gcnVuIHRlc3RzIHRoYXQgcmVxdWlyZSByZW1vdGUgZmlsZXMuCi0KLQogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCi0tIEJ1ZyAjMTQwMjIyNDogQWRkIHdhcm5pbmcgdG8gZGwgZG9jcyBhYm91dCBjcmFzaGVzLgotCi0tIEJ1ZyAjMTM5NjQ3MTogRG9jdW1lbnQgdGhhdCBXaW5kb3dzJyBmdGVsbCgpIGNhbiByZXR1cm4gaW52YWxpZAotICB2YWx1ZXMgZm9yIHRleHQgZmlsZXMgd2l0aCBVTklYLXN0eWxlIGxpbmUgZW5kaW5ncy4KLQotLSBCdWcgIzEyNzQ4Mjg6IERvY3VtZW50IG9zLnBhdGguc3BsaXR1bmMoKS4KLQotLSBCdWcgIzExOTAyMDQ6IENsYXJpZnkgd2hpY2ggZGlyZWN0b3JpZXMgYXJlIHNlYXJjaGVkIGJ5IHNpdGUucHkuCi0KLS0gQnVnICMxMTkzODQ5OiBDbGFyaWZ5IG9zLnBhdGguZXhwYW5kdXNlcigpIGRvY3VtZW50YXRpb24uCi0KLS0gQnVnICMxMjQzMTkyOiByZS5VTklDT0RFIGFuZCByZS5MT0NBTEUgYWZmZWN0IFxkLCBcRCwgXHMgYW5kIFxTLgotCi0tIEJ1ZyAjNzU1NjE3OiBEb2N1bWVudCB0aGUgZWZmZWN0cyBvZiBvcy5jaG93bigpIG9uIFdpbmRvd3MuCi0KLS0gUGF0Y2ggIzExODAwMTI6IFRoZSBkb2N1bWVudGF0aW9uIGZvciBtb2R1bGVmaW5kZXIgaXMgbm93IGluIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZS4KLQotLSBQYXRjaCAjMTIxMzAzMTogRG9jdW1lbnQgdGhhdCBvcy5jaG93bigpIGFjY2VwdHMgYXJndW1lbnQgdmFsdWVzIG9mIC0xLgotCi0tIEJ1ZyAjMTE5MDU2MzogRG9jdW1lbnQgb3Mud2FpdHBpZCgpIHJldHVybiB2YWx1ZSB3aXRoIFdOT0hBTkcgZmxhZy4KLQotLSBCdWcgIzExNzUwMjI6IENvcnJlY3QgdGhlIGV4YW1wbGUgY29kZSBmb3IgcHJvcGVydHkoKS4KLQotLSBEb2N1bWVudCB0aGUgSXRlcmFibGVVc2VyRGljdCBjbGFzcyBpbiB0aGUgVXNlckRpY3QgbW9kdWxlLgotICBDbG9zZXMgYnVnICMxMTY2NTgyLgotCi0tIFJlbW92ZSBhbGwgbGF0ZW50IHJlZmVyZW5jZXMgZm9yICJNYWNpbnRvc2giIHRoYXQgcmVmZXJyZWQgdG8gc2VtYW50aWNzIGZvcgotICBNYWMgT1MgOSBhbmQgY2hhbmdlIHRvIHJlZmxlY3QgdGhlIHN0YXRlIGZvciBPUyBYLgotICBDbG9zZXMgcGF0Y2ggIzEwOTU4MDIuICBUaGFua3MgSmFjayBKYW5zZW4uCi0KIE1hYwogLS0tCiAKLQogTmV3IHBsYXRmb3JtcwogLS0tLS0tLS0tLS0tLQogCi0tIEZyZWVCU0QgNyBzdXBwb3J0IGlzIGFkZGVkLgotCi0KIFRvb2xzL0RlbW9zCiAtLS0tLS0tLS0tLQogCi0tIENyZWF0ZWQgTWlzYy9WaW0vdmltX3N5bnRheC5weSB0byBhdXRvLWdlbmVyYXRlIGEgcHl0aG9uLnZpbSBmaWxlIGluIHRoYXQKLSAgZGlyZWN0b3J5IGZvciBzeW50YXggaGlnaGxpZ2h0aW5nIGluIFZpbS4gIFZpbSBkaXJlY3Rvcnkgd2FzIGFkZGVkIGFuZCBwbGFjZWQKLSAgdmltcmMgdG8gaXQgKHdhcyBwcmV2aW91cyB1cCBhIGxldmVsKS4KLQotLSBBZGRlZCB0d28gbmV3IGZpbGVzIHRvIFRvb2xzL3NjcmlwdHM6IHB5c291cmNlLnB5LCB3aGljaCByZWN1cnNpdmVseQotICBmaW5kcyBQeXRob24gc291cmNlIGZpbGVzLCBhbmQgZmluZG5vY29kaW5nLnB5LCB3aGljaCBmaW5kcyBQeXRob24KLSAgc291cmNlIGZpbGVzIHRoYXQgbmVlZCBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbi4KLSAgUGF0Y2ggIzc4NDA4OSwgY3JlZGl0cyB0byBPbGVnIEJyb3l0bWFubi4KLQotLSBCdWcgIzEwNzI4NTM6IHBpbmRlbnQucHkgdXNlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlLgotCi0tIFBhdGNoICMxMTc3NTk3OiBDb3JyZWN0IENvbXBsZXguX19pbml0X18uCi0KLS0gRml4ZWQgYSBkaXNwbGF5IGdsaXRjaCBpbiBQeW5jaGUsIHdoaWNoIGNvdWxkIGNhdXNlIHRoZSByaWdodCBhcnJvdyB0bwotICB3aWdnbGUgb3ZlciBieSBhIHBpeGVsLgotCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjQgZmluYWw/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDMwLU5PVi0yMDA0KgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBCdWcgODc1NjkyOiBJbXByb3ZlIHNpZ25hbCBoYW5kbGluZywgZXNwZWNpYWxseSB3aGVuIHVzaW5nIHRocmVhZHMsIGJ5Ci0gIGZvcmNpbmcgYW4gZWFybHkgcmUtZXhlY3V0aW9uIG9mIFB5RXZhbF9FdmFsRnJhbWUoKSAicGVyaW9kaWMiIGNvZGUgd2hlbgotICB0aGluZ3NfdG9fZG8gaXMgbm90IGNsZWFyZWQgYnkgUHlfTWFrZVBlbmRpbmdDYWxscygpLgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDIuNCAocmVsZWFzZSBjYW5kaWRhdGUgMSkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMTgtTk9WLTIwMDQqCi0KLUNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIEJ1ZyAxMDYxOTY4OiAgRml4ZXMgaW4gMi40YTMgdG8gYWRkcmVzcyB0aHJlYWQgYnVnIDEwMTA2NzcgcmVpbnRyb2R1Y2VkCi0gIHRoZSB5ZWFycy1vbGQgdGhyZWFkIHNodXRkb3duIHJhY2UgYnVnIDIyNTY3My4gIE51bWVyaWMgaGlzdG9yeSBsZXNzb24KLSAgYXNpZGUsIGFsbCBidWdzIGluIGFsbCB0aHJlZSByZXBvcnRzIGFyZSBmaXhlZCBub3cuCi0KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIEJ1ZyAxMDUyMjQyOiBJZiBleGNlcHRpb25zIGFyZSByYWlzZWQgYnkgYW4gYXRleGl0IGhhbmRsZXIgZnVuY3Rpb24gYW4KLSAgYXR0ZW1wdCBpcyBtYWRlIHRvIGV4ZWN1dGUgdGhlIHJlbWFpbmluZyBoYW5kbGVycy4gIFRoZSBsYXN0IGV4Y2VwdGlvbgotICByYWlzZWQgaXMgcmUtcmFpc2VkLgotCi0tIGBgZG9jdGVzdGBgJ3MgbmV3IHN1cHBvcnQgZm9yIGFkZGluZyBgYHBkYi5zZXRfdHJhY2UoKWBgIGNhbGxzIHRvCi0gIGRvY3Rlc3RzIHdhcyBicm9rZW4gaW4gYSBkcmFtYXRpYyBidXQgc2hhbGxvdyB3YXkuICBGaXhlZC4KLQotLSBCdWcgMTA2NTM4ODogIGBgY2FsZW5kYXJgYCdzIGBgZGF5X25hbWVgYCwgYGBkYXlfYWJicmBgLCBgYG1vbnRoX25hbWVgYCwKLSAgYW5kIGBgbW9udGhfYWJicmBgIGF0dHJpYnV0ZXMgZW11bGF0ZSBzZXF1ZW5jZXMgb2YgbG9jYWxlLWNvcnJlY3QKLSAgc3BlbGxpbmdzIG9mIG1vbnRoIGFuZCBkYXkgbmFtZXMuICBCZWNhdXNlIHRoZSBsb2NhbGUgY2FuIGNoYW5nZSBhdAotICBhbnkgdGltZSwgdGhlIGNvcnJlY3Qgc3BlbGxpbmcgaXMgcmVjb21wdXRlZCB3aGVuZXZlciBvbmUgb2YgdGhlc2UgaXMKLSAgaW5kZXhlZC4gIEluIHRoZSB3b3JzdCBjYXNlLCB0aGUgaW5kZXggbWF5IGJlIGEgc2xpY2Ugb2JqZWN0LCBzbyB0aGVzZQotICByZWNvbXB1dGVkIGV2ZXJ5IGRheSBvciBtb250aCBuYW1lIGVhY2ggdGltZSB0aGV5IHdlcmUgaW5kZXhlZC4gIFRoaXMgaXMKLSAgbXVjaCBzbG93ZXIgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHVzdWFsIGNhc2UsIHdoZW4gdGhlIGluZGV4IGlzIGp1c3QgYW4KLSAgaW50ZWdlci4gIEluIHRoYXQgY2FzZSwgb25seSB0aGUgc2luZ2xlIHNwZWxsaW5nIG5lZWRlZCBpcyByZWNvbXB1dGVkCi0gIG5vdzsgYW5kLCB3aGVuIHRoZSBpbmRleCBpcyBhIHNsaWNlIG9iamVjdCwgb25seSB0aGUgc3BlbGxpbmdzIG5lZWRlZAotICBieSB0aGUgc2xpY2UgYXJlIHJlY29tcHV0ZWQgbm93LgotCi0tIFBhdGNoIDEwNjE2Nzk6IEFkZGVkIGBgX19hbGxfX2BgIHRvIHBpY2tsZXRvb2xzLnB5LgotCi1CdWlsZAotLS0tLS0KLQotLSBCdWcgMTAzNDI3NyAvIFBhdGNoIDEwMzUyNTU6IFJlbW92ZSBjb21waWxhdGlvbiBvZiBjb3JlIGFnYWluc3QgQ29yZVNlcnZpY2VzCi0gIGFuZCBDb3JlRm91bmRhdGlvbiBvbiBPUyBYLiAgSW52b2x2ZWQgcmVtb3ZpbmcgUHlNYWNfR2V0QXBwbGV0U2NyaXB0RmlsZSgpCi0gIHdoaWNoIGhhcyBubyBrbm93biB1c2Vycy4gIFRoYW5rcyBCb2IgSXBwb2xpdG8uCi0KLUMgQVBJCi0tLS0tLQotCi0tIFRoZSBQeVJhbmdlX05ldygpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IGJldGEgMj8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDAzLU5PVi0yMDA0KgotCi1MaWNlbnNlCi0tLS0tLS0tCi0KLVRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBjaGFuZ2VkIHRoZSBsaWNlbnNlIHVuZGVyIHdoaWNoIFB5dGhvbgotaXMgcmVsZWFzZWQsIHRvIHJlbW92ZSBQeXRob24gdmVyc2lvbiBudW1iZXJzLiAgVGhlcmUgd2VyZSBubyBvdGhlcgotY2hhbmdlcyB0byB0aGUgbGljZW5zZS4gIFNvLCBmb3IgZXhhbXBsZSwgd2hlcmV2ZXIgdGhlIGxpY2Vuc2UgZm9yCi1QeXRob24gMi4zIHNhaWQgIlB5dGhvbiAyLjMiLCB0aGUgbmV3IGxpY2Vuc2Ugc2F5cyAiUHl0aG9uIi4gIFRoZQotaW50ZW50IGlzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVmZXIgdG8gdGhlIFBTRiBsaWNlbnNlIGluIGEgbW9yZQotZHVyYWJsZSB3YXkuICBGb3IgZXhhbXBsZSwgc29tZSBwZW9wbGUgc2F5IHRoZXkncmUgY29uZnVzZWQgYnkgdGhhdAotdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUncyBlbnRyeSBmb3IgdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1MaWNlbnNlOjoKLQotICAgICAgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9QeXRob25Tb2Z0Rm91bmRhdGlvbi5waHAKLQotc2F5cyAiUHl0aG9uIDIuMS4xIiBhbGwgb3ZlciBpdCwgd29uZGVyaW5nIHdoZXRoZXIgaXQgYXBwbGllcyBvbmx5Ci10byBQeXRob24gMi4xLjEuCi0KLVRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBuZXcgbGljZW5zZSBpcyB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KLUxpY2Vuc2UgVmVyc2lvbiAyLgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBCdWcgIzEwNTU4MjAgQ3ljbGljIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgbm90IHByb3RlY3RpbmcgYWdhaW5zdCB0aGF0Ci0gIGNhbGxpbmcgYSBsaXZlIHdlYWtyZWYgdG8gYSBwaWVjZSBvZiBjeWNsaWMgdHJhc2ggY291bGQgcmVzdXJyZWN0IGFuCi0gIGluc2FuZSBtdXRhdGlvbiBvZiB0aGUgdHJhc2ggaWYgYW55IFB5dGhvbiBjb2RlIHJhbiBkdXJpbmcgZ2MgKHZpYQotICBydW5uaW5nIGEgZGVhZCBvYmplY3QncyBfX2RlbF9fIG1ldGhvZCwgcnVubmluZyBhbm90aGVyIGNhbGxiYWNrIG9uIGEKLSAgd2Vha3JlZiB0byBhIGRlYWQgb2JqZWN0LCBvciB2aWEgYW55IFB5dGhvbiBjb2RlIHJ1biBpbiBhbnkgb3RoZXIgdGhyZWFkCi0gIHRoYXQgbWFuYWdlZCB0byBvYnRhaW4gdGhlIEdJTCB3aGlsZSBhIF9fZGVsX18gb3IgY2FsbGJhY2sgd2FzIHJ1bm5pbmcKLSAgaW4gdGhlIHRocmVhZCBkb2luZyBnYykuICBUaGUgbW9zdCBsaWtlbHkgc3ltcHRvbSB3YXMgImltcG9zc2libGUiCi0gIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb25zLCBhcHBlYXJpbmcgc2VlbWluZ2x5IGF0IHJhbmRvbSwgb24gd2Vha2x5Ci0gIHJlZmVyZW5jZWQgb2JqZWN0cy4gIFRoZSBjdXJlIHdhcyB0byBjbGVhciBhbGwgd2Vha3JlZnMgdG8gdW5yZWFjaGFibGUKLSAgb2JqZWN0cyBiZWZvcmUgYWxsb3dpbmcgYW55IGNhbGxiYWNrcyB0byBydW4uCi0KLS0gQnVnICMxMDU0MTM5IF9QeVN0cmluZ19SZXNpemUoKSBub3cgaW52YWxpZGF0ZXMgaXRzIGNhY2hlZCBoYXNoIHZhbHVlLgotCi1FeHRlbnNpb24gTW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBCdWcgIzEwNDg4NzA6ICB0aGUgY29tcGlsZXIgbm93IGdlbmVyYXRlcyBkaXN0aW5jdCBjb2RlIG9iamVjdHMgZm9yCi0gIGZ1bmN0aW9ucyB3aXRoIGlkZW50aWNhbCBib2RpZXMuICBUaGlzIHdhcyBwcm9kdWNpbmcgY29uZnVzaW5nCi0gIHRyYWNlYmFjayBtZXNzYWdlcyB3aGljaCBwb2ludGVkIHRvIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgY29kZQotICBvYmplY3Qgd2FzIGZpcnN0IGRlZmluZWQgcmF0aGVyIHRoYW4gdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkLgotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KLS0gUGF0Y2ggIzEwNTY5NjcgY2hhbmdlcyB0aGUgc2VtYW50aWNzIG9mIFRlbXBsYXRlLnNhZmVfc3Vic3RpdHV0ZSgpIHNvIHRoYXQKLSAgbm8gVmFsdWVFcnJvciBpcyByYWlzZWQgb24gYW4gJ2ludmFsaWQnIG1hdGNoIGdyb3VwLiAgTm93IHRoZSBkZWxpbWl0ZXIgaXMKLSAgcmV0dXJuZWQuCi0KLS0gQnVnICMxMDUyNTAzIHBkYi5ydW5jYWxsKCkgd2FzIG5vdCBwYXNzaW5nIGFsb25nIGtleXdvcmQgYXJndW1lbnRzLgotCi0tIEJ1ZyAjOTAyMDM3OiBYTUwuc2F4LnNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKCkgbm93IGNvbWJpbmVzIHJlbGF0aXZlCi0gIHBhdGhzIHdpdGggYSBiYXNlIHBhdGggYmVmb3JlIGNoZWNraW5nIG9zLnBhdGguaXNmaWxlKCkuCi0KLS0gVGhlIHdoaWNoZGIgbW9kdWxlIGNhbiBub3cgYmUgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLQotLSBCdWcgIzEwNDUzODE6IHRpbWUuc3RycHRpbWUoKSBjYW4gbm93IGluZmVyIHRoZSBkYXRlIHVzaW5nICVVIG9yICVXICh3ZWVrIG9mCi0gIHRoZSB5ZWFyKSB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHllYXIgYXJlIGFsc28gc3BlY2lmaWVkLgotCi0tIEJ1ZyAjMTA0ODgxNjogZml4IGJ1ZyBpbiBDdHJsLUsgYXQgc3RhcnQgb2YgbGluZSBpbiBjdXJzZXMudGV4dHBhZC5UZXh0Ym94Ci0KLS0gQnVnICMxMDE3NTUzOiBmaXggYnVnIGluIHRhcmZpbGUuZmlsZW1vZGUoKQotCi0tIFBhdGNoICM3Mzc0NzM6IGZpeCBidWcgdGhhdCBvbGQgc291cmNlIGNvZGUgaXMgc2hvd24gaW4gdHJhY2ViYWNrcyBldmVuIGlmCi0gIHRoZSBzb3VyY2UgY29kZSBpcyB1cGRhdGVkIGFuZCByZWxvYWRlZC4KLQotQnVpbGQKLS0tLS0tCi0KLS0gUGF0Y2ggIzEwNDQzOTU6IC0tZW5hYmxlLXNoYXJlZCBpcyBhbGxvd2VkIGluIEZyZWVCU0QgYWxzby4KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IGJldGEgMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDE1LU9DVC0yMDA0KgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBQYXRjaCAjOTc1MDU2OiBSZXN0YXJ0YWJsZSBzaWduYWxzIHdlcmUgbm90IGNvcnJlY3RseSBkaXNhYmxlZCBvbgotICBCU0Qgc3lzdGVtcy4gQ29uc2lzdGVudGx5IHVzZSBQeU9TX3NldHNpZygpIGluc3RlYWQgb2Ygc2lnbmFsKCkuCi0KLS0gVGhlIGludGVybmFsIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC1sb2NhbCBzdG9yYWdlIChUTFMpLCB1c2VkCi0gIGJ5IHRoZSBgYFB5R0lMU3RhdGVfRW5zdXJlKClgYC9gYFB5R0lMU3RhdGVfUmVsZWFzZSgpYGAgQVBJLCB3YXMgbm90Ci0gIHRocmVhZC1jb3JyZWN0LiAgVGhpcyBjb3VsZCBsZWFkIHRvIGEgdmFyaWV0eSBvZiBwcm9ibGVtcywgdXAgdG8gYW5kCi0gIGluY2x1ZGluZyBzZWdmYXVsdHMuICBTZWUgYnVnIDEwNDE2NDUgZm9yIGFuIGV4YW1wbGUuCi0KLS0gQWRkZWQgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCAtbSBtb2R1bGUsIHdoaWNoIHNlYXJjaGVzIHN5cy5wYXRoIGZvciB0aGUKLSAgbW9kdWxlIGFuZCB0aGVuIHJ1bnMgaXQuICAoQ29udHJpYnV0ZWQgYnkgTmljayBDb2dobGFuLikKLQotLSBUaGUgYnl0ZWNvZGUgb3B0aW1pemVyIG5vdyBmb2xkcyB0dXBsZXMgb2YgY29uc3RhbnRzIGludG8gYSBzaW5nbGUKLSAgY29uc3RhbnQuCi0KLS0gU0YgYnVnICM1MTM4NjY6ICBGbG9hdC9sb25nIGNvbXBhcmlzb24gYW5vbWFseS4gIFByaW9yIHRvIDIuNGIxLCB3aGVuCi0gIGFuIGludGVnZXIgd2FzIGNvbXBhcmVkIHRvIGEgZmxvYXQsIHRoZSBpbnRlZ2VyIHdhcyBjb2VyY2VkIHRvIGEgZmxvYXQuCi0gIFRoYXQgY291bGQgeWllbGQgc3B1cmlvdXMgb3ZlcmZsb3cgZXJyb3JzIChpZiB0aGUgaW50ZWdlciB3YXMgdmVyeQotICBsYXJnZSksIGFuZCB0byBhbm9tYWxpZXMgc3VjaCBhcwotICBgYGxvbmcoMWUyMDApKzEgPT0gMWUyMDAgPT0gbG9uZygxZTIwMCktMWBgLiAgQ29lcmNpb24gdG8gZmxvYXQgaXMgbm8KLSAgbG9uZ2VyIHBlcmZvcm1lZCwgYW5kIGNhc2VzIGxpa2UgYGBsb25nKDFlMjAwKS0xIDwgMWUyMDBgYCwKLSAgYGBsb25nKDFlMjAwKSsxID4gMWUyMDBgYCBhbmQgYGAoMSA8PCAyMDAwMCkgPiAxZTIwMGBgIGFyZSBjb21wdXRlZAotICBjb3JyZWN0bHkgbm93LgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBgYGNvbGxlY3Rpb25zLmRlcXVlYGAgb2JqZWN0cyBkaWRuJ3QgcGxheSBxdWl0ZSByaWdodCB3aXRoIGdhcmJhZ2UKLSAgY29sbGVjdGlvbiwgd2hpY2ggY291bGQgbGVhZCB0byBhIHNlZ2ZhdWx0IGluIGEgcmVsZWFzZSBidWlsZCwgb3IKLSAgYW4gYXNzZXJ0IGZhaWx1cmUgaW4gYSBkZWJ1ZyBidWlsZC4gIEFsc28sIGFkZGVkIG92ZXJmbG93IGNoZWNrcywKLSAgYmV0dGVyIGRldGVjdGlvbiBvZiBtdXRhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLCBhbmQgc2hpZWxkZWQgZGVxdWUKLSAgY29tcGFyaXNvbnMgZnJvbSB1bnVzdWFsIHN1YmNsYXNzIG92ZXJyaWRlcyBvZiB0aGUgX19pdGVyX18oKSBtZXRob2QuCi0KLUxpYnJhcnkKLS0tLS0tLS0KLQotLSBQYXRjaCAxMDQ2NjQ0OiBkaXN0dXRpbHMgYnVpbGRfZXh0IGdyZXcgdHdvIG5ldyBvcHRpb25zIC0gLS1zd2lnIGZvcgotICBzcGVjaWZ5aW5nIHRoZSBzd2lnIGV4ZWN1dGFibGUgdG8gdXNlLCBhbmQgLS1zd2lnLW9wdHMgdG8gc3BlY2lmeQotICBvcHRpb25zIHRvIHBhc3MgdG8gc3dpZy4gLS1zd2lnLW9wdHM9Ii1jKysiIGlzIHRoZSBuZXcgd2F5IHRvIHNwZWxsCi0gIC0tc3dpZy1jcHAuCi0KLS0gUGF0Y2ggOTgzMjA2OiBkaXN0dXRpbHMgbm93IG9iZXlzIGVudmlyb25tZW50IHZhcmlhYmxlIExEU0hBUkVELCBpZgotICBpdCBpcyBzZXQuCi0KLS0gQWRkZWQgUGV0ZXIgQXN0cmFuZCdzIHN1YnByb2Nlc3MucHkgbW9kdWxlLiAgU2VlIFBFUCAzMjQgZm9yIGRldGFpbHMuCi0KLS0gdGltZS5zdHJwdGltZSgpIG5vdyBwcm9wZXJseSBlc2NhcGVzIHRpbWV6b25lcyBhbmQgYWxsIG90aGVyIGxvY2FsZS1zcGVjaWZpYwotICBzdHJpbmdzIGZvciByZWdleC1zcGVjaWZpYyBzeW1ib2xzLiAgV2FzIGJyZWFraW5nIHVuZGVyIEphcGFuZXNlIFdpbmRvd3Mgd2hlbgotICB0aGUgdGltZXpvbmUgd2FzIHNwZWNpZmllZCBhcyAiVG9reW8gKHN0YW5kYXJkIHRpbWUpIi4KLSAgQ2xvc2VzIGJ1ZyAjMTAzOTI3MC4KLQotLSBVcGRhdGVzIGZvciB0aGUgZW1haWwgcGFja2FnZToKLQotICArIGVtYWlsLlV0aWxzLmZvcm1hdGRhdGUoKSBncmV3IGEgJ3VzZWdtdCcgYXJndW1lbnQgZm9yIEhUVFAgc3VwcG9ydC4KLSAgKyBBbGwgZGVwcmVjYXRlZCBBUElzIHRoYXQgaW4gZW1haWwgMi54IGlzc3VlZCB3YXJuaW5ncyBoYXZlIGJlZW4gcmVtb3ZlZDoKLSAgICBfZW5jb2RlciBhcmd1bWVudCB0byB0aGUgTUlNRVRleHQgY29uc3RydWN0b3IsIE1lc3NhZ2UuYWRkX3BheWxvYWQoKSwKLSAgICBVdGlscy5kdW1wX2FkZHJlc3NfcGFpcigpLCBVdGlscy5kZWNvZGUoKSwgVXRpbHMuZW5jb2RlKCkKLSAgKyBOZXcgZGVwcmVjYXRpb25zOiBHZW5lcmF0b3IuX19jYWxsX18oKSwgTWVzc2FnZS5nZXRfdHlwZSgpLAotICAgIE1lc3NhZ2UuZ2V0X21haW5fdHlwZSgpLCBNZXNzYWdlLmdldF9zdWJ0eXBlKCksIHRoZSAnc3RyaWN0JyBhcmd1bWVudCB0bwotICAgIHRoZSBQYXJzZXIgY29uc3RydWN0b3IuICBUaGVzZSB3aWxsIGJlIHJlbW92ZWQgaW4gZW1haWwgMy4xLgotICArIFN1cHBvcnQgZm9yIFB5dGhvbiBlYXJsaWVyIHRoYW4gMi4zIGhhcyBiZWVuIHJlbW92ZWQgKHNlZSBQRVAgMjkxKS4KLSAgKyBBbGwgZGVmZWN0IGNsYXNzZXMgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gZW5kIGluICdEZWZlY3QnLgotICArIFNvbWUgRmVlZFBhcnNlciBmaXhlczsgYWxzbyBhIE11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCB3aWxsIGJlCi0gICAgYWRkZWQgdG8gbWVzc2FnZXMgdGhhdCBjbGFpbSB0byBiZSBtdWx0aXBhcnQgYnV0IHJlYWxseSBhcmVuJ3QuCi0gICsgVXBkYXRlcyB0byBkb2N1bWVudGF0aW9uLgotCi0tIHJlJ3MgZmluZGFsbCgpIGFuZCBmaW5kaXRlcigpIGZ1bmN0aW9ucyBub3cgdGFrZSBhbiBvcHRpb25hbCBmbGFncyBhcmd1bWVudAotICBqdXN0IGxpa2UgdGhlIGNvbXBpbGUoKSwgc2VhcmNoKCksIGFuZCBtYXRjaCgpIGZ1bmN0aW9ucy4gIEFsc28sIGRvY3VtZW50ZWQKLSAgdGhlIHByZXZpb3VzbHkgZXhpc3Rpbmcgc3RhcnQgYW5kIHN0b3AgcGFyYW1ldGVycyBmb3IgdGhlIGZpbmRhbGwoKSBhbmQKLSAgZmluZGl0ZXIoKSBtZXRob2RzIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBvYmplY3RzLgotCi0tIHJmYzgyMiBNZXNzYWdlcyBub3cgc3VwcG9ydCBpdGVyYXRpbmcgb3ZlciB0aGUgaGVhZGVycy4KLQotLSBUaGUgKHVuZG9jdW1lbnRlZCkgdGFyZmlsZS5UYXJmaWxlLm1lbWJlcm5hbWVzIGhhcyBiZWVuIHJlbW92ZWQ7Ci0gIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBnZXRtZW1iZXIgZnVuY3Rpb24uCi0KLS0gaHR0cGxpYiBub3cgb2ZmZXJzIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgdGhlIEhUVFAgc3RhdHVzIGNvZGVzLgotCi0tIFNGIGJ1ZyAjMTAyODMwNjogIFRyeWluZyB0byBjb21wYXJlIGEgYGBkYXRldGltZS5kYXRlYGAgdG8gYQotICBgYGRhdGV0aW1lLmRhdGV0aW1lYGAgbWlzdGFrZW5seSBjb21wYXJlZCBvbmx5IHRoZSB5ZWFyLCBtb250aCBhbmQgZGF5LgotICBOb3cgaXQgYWN0cyBsaWtlIGEgbWl4ZWQtdHlwZSBjb21wYXJpc29uOiAgYGBGYWxzZWBgIGZvciBgYD09YGAsCi0gIGBgVHJ1ZWBgIGZvciBgYCE9YGAsIGFuZCByYWlzZXMgYGBUeXBlRXJyb3JgYCBmb3Igb3RoZXIgY29tcGFyaXNvbgotICBvcGVyYXRvcnMuICBCZWNhdXNlIGRhdGV0aW1lIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZSwgY29tcGFyaW5nIG9ubHkgdGhlCi0gIGJhc2UgY2xhc3MgKGRhdGUpIG1lbWJlcnMgY2FuIHN0aWxsIGJlIGRvbmUsIGlmIHRoYXQncyBkZXNpcmVkLCBieQotICBmb3JjaW5nIHVzaW5nIG9mIHRoZSBhcHByb3ByYXRlIGRhdGUgbWV0aG9kOyBlLmcuLAotICBgYGFfZGF0ZS5fX2VxX18oYV9kYXRldGltZSlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSB5ZWFyLCBtb250aAotICBhbmQgZGF5IG1lbWJlcnMgb2YgYGBhX2RhdGVgYCBhbmQgYGBhX2RhdGV0aW1lYGAgYXJlIGVxdWFsLgotCi0tIGJkaXN0X3JwbSBub3cgc3VwcG9ydHMgY29tbWFuZCBsaW5lIG9wdGlvbnMgLS1mb3JjZS1hcmNoLAotICB7cHJlLHBvc3R9LWluc3RhbGwsICB7cHJlLHBvc3R9LXVuaW5zdGFsbCwgYW5kCi0gIHtwcmVwLGJ1aWxkLGluc3RhbGwsY2xlYW4sdmVyaWZ5fS1zY3JpcHQuCi0KLS0gU0YgcGF0Y2ggIzk5ODk5MzogVGhlIFVURi04IGFuZCB0aGUgVVRGLTE2IHN0YXRlZnVsIGRlY29kZXJzIG5vdyBzdXBwb3J0Ci0gIGRlY29kaW5nIGluY29tcGxldGUgaW5wdXQgKHdoZW4gdGhlIGlucHV0IHN0cmVhbSBpcyB0ZW1wb3JhcmlseSBleGhhdXN0ZWQpLgotICBgYGNvZGVjcy5TdHJlYW1SZWFkZXJgYCBub3cgaW1wbGVtZW50cyBidWZmZXJpbmcsIHdoaWNoIGVuYWJsZXMgcHJvcGVyCi0gIHJlYWRsaW5lIHN1cHBvcnQgZm9yIHRoZSBVVEYtMTYgZGVjb2RlcnMuIGBgY29kZWNzLlN0cmVhbVJlYWRlci5yZWFkKClgYAotICBoYXMgYSBuZXcgYXJndW1lbnQgYGBjaGFyc2BgIHdoaWNoIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8KLSAgcmV0dXJuLiBgYGNvZGVjcy5TdHJlYW1SZWFkZXIucmVhZGxpbmUoKWBgIGFuZAotICBgYGNvZGVjcy5TdHJlYW1SZWFkZXIucmVhZGxpbmVzKClgYCBoYXZlIGEgbmV3IGFyZ3VtZW50IGBga2VlcGVuZHNgYC4KLSAgVHJhaWxpbmcgIlxuInMgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBsaW5lcyBpZiBgYGtlZXBlbmRzYGAgaXMgZmFsc2UuCi0KLS0gVGhlIGRvY3VtZW50YXRpb24gZm9yIGRvY3Rlc3QgaXMgZ3JlYXRseSBleHBhbmRlZCwgYW5kIG5vdyBjb3ZlcnMgYWxsCi0gIHRoZSBuZXcgcHVibGljIGZlYXR1cmVzIChvZiB3aGljaCB0aGVyZSBhcmUgbWFueSkuCi0KLS0gYGBkb2N0ZXN0Lm1hc3RlcmBgIHdhcyBwdXQgYmFjayBpbiwgYW5kIGBgZG9jdGVzdC50ZXN0bW9kKClgYCBvbmNlIGFnYWluCi0gIHVwZGF0ZXMgaXQuICBUaGlzIGlzbid0IGdvb2QsIGJlY2F1c2UgZXZlcnkgYGB0ZXN0bW9kKClgYCBjYWxsCi0gIGNvbnRyaWJ1dGVzIHRvIGJsb2F0aW5nIHRoZSAiaGlkZGVuIiBzdGF0ZSBvZiBgYGRvY3Rlc3QubWFzdGVyYGAsIGJ1dAotICBzb21lIG9sZCBjb2RlIGFwcGFyZW50bHkgcmVsaWVzIG9uIGl0LiAgRm9yIG5vdywgYWxsIHdlIGNhbiBkbyBpcwotICBlbmNvdXJhZ2UgcGVvcGxlIHRvIHN0aXRjaCBkb2N0ZXN0cyB0b2dldGhlciB2aWEgZG9jdGVzdCdzIHVuaXR0ZXN0Ci0gIGludGVncmF0aW9uIGZlYXR1cmVzIGluc3RlYWQuCi0KLS0gaHR0cGxpYiBub3cgaGFuZGxlcyBpcHY2IGFkZHJlc3MvcG9ydCBwYWlycy4KLQotLSBTRiBidWcgIzEwMTc4NjQ6IENvbmZpZ1BhcnNlciBub3cgY29ycmVjdGx5IGhhbmRsZXMgZGVmYXVsdCBrZXlzLAotICBwcm9jZXNzaW5nIHRoZW0gd2l0aCBgYENvbmZpZ1BhcnNlci5vcHRpb254Zm9ybWBgIHdoZW4gc3VwcGxpZWQsCi0gIGNvbnNpc3RlbnQgd2l0aCB0aGUgaGFuZGxpbmcgb2YgY29uZmlnIGZpbGUgZW50cmllcyBhbmQgcnVudGltZS1zZXQKLSAgb3B0aW9ucy4KLQotLSBTRiBidWcgIzk5NzA1MDogRG9jdW1lbnQsIHRlc3QsICYgY2hlY2sgZm9yIG5vbi1zdHJpbmcgdmFsdWVzIGluCi0gIENvbmZpZ1BhcnNlci4gIE1vdmVkIHRoZSBuZXcgc3RyaW5nLW9ubHkgcmVzdHJpY3Rpb24gYWRkZWQgaW4KLSAgcmV2LiAxLjY1IHRvIHRoZSBTYWZlQ29uZmlnUGFyc2VyIGNsYXNzLCBsZWF2aW5nIGV4aXN0aW5nCi0gIENvbmZpZ1BhcnNlciAmIFJhd0NvbmZpZ1BhcnNlciBiZWhhdmlvciBhbG9uZSwgYW5kIGRvY3VtZW50ZWQgdGhlCi0gIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggbm9uLXN0cmluZyB2YWx1ZXMgd29yay4KLQotQnVpbGQKLS0tLS0tCi0KLS0gQnVpbGRpbmcgb24gZGFyd2luIG5vdyBpbmNsdWRlcyAvb3B0L2xvY2FsL2luY2x1ZGUgYW5kIC9vcHQvbG9jYWwvbGliIGZvcgotICBidWlsZGluZyBleHRlbnNpb24gbW9kdWxlcy4gIFRoaXMgaXMgc28gYXMgdG8gaW5jbHVkZSBzb2Z0d2FyZSBpbnN0YWxsZWQgYXMKLSAgYSBEYXJ3aW5Qb3J0cyBwb3J0IDxodHRwOi8vZGFyd2lucG9ydHMub3BlbmRhcndpbi5vcmcvPgotCi0tIHB5cG9ydC5oIG5vdyBkZWZpbmVzIGEgUHlfSVNfTkFOIG1hY3JvLiAgSXQgd29ya3MgYXMtaXMgd2hlbiB0aGUKLSAgcGxhdGZvcm0gQyBjb21wdXRlcyB0cnVlIGZvciBgYHggIT0geGBgIGlmIGFuZCBvbmx5IGlmIFggaXMgYSBOYU4uCi0gIE90aGVyIHBsYXRmb3JtcyBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVmaW5pdGlvbiB3aXRoIGEgcGxhdGZvcm0tCi0gIHNwZWNpZmljIHNwZWxsaW5nIGluIHRoYXQgcGxhdGZvcm0ncyBweWNvbmZpZy5oLiAgWW91IGNhbiBhbHNvIG92ZXJyaWRlCi0gIHB5cG9ydC5oJ3MgZGVmYXVsdCBQeV9JU19JTkZJTklUWSBkZWZpbml0aW9uIG5vdy4KLQotQyBBUEkKLS0tLS0tCi0KLS0gU0YgcGF0Y2ggMTA0NDA4OTogIE5ldyBmdW5jdGlvbiBgYFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQoKWBgIHJldHVybnMKLSAgbm9uLXplcm8gaWYgUHlFdmFsX0luaXRUaHJlYWRzKCkgaGFzIGJlZW4gY2FsbGVkLgotCi0tIFRoZSB1bmRvY3VtZW50ZWQgYW5kIHVudXNlZCBleHRlcm4gaW50IGBgX1B5VGhyZWFkX1N0YXJ0ZWRgYCB3YXMgcmVtb3ZlZC4KLQotLSBUaGUgQyBBUEkgY2FsbHMgYGBQeUludGVycHJldGVyU3RhdGVfTmV3KClgYCBhbmQgYGBQeVRocmVhZFN0YXRlX05ldygpYGAKLSAgYXJlIHR3byBvZiB0aGUgdmVyeSBmZXcgYWR2ZXJ0aXNlZCBhcyBiZWluZyBzYWZlIHRvIGNhbGwgd2l0aG91dCBob2xkaW5nCi0gIHRoZSBHSUwuICBIb3dldmVyLCB0aGlzIHdhc24ndCB0cnVlIGluIGEgZGVidWcgYnVpbGQsIGFzIGJ1ZyAxMDQxNjQ1Ci0gIGRlbW9uc3RyYXRlZC4gIEluIGEgZGVidWcgYnVpbGQsIFB5dGhvbiByZWRpcmVjdHMgdGhlIGBgUHlNZW1gYCBmYW1pbHkKLSAgb2YgY2FsbHMgdG8gUHl0aG9uJ3Mgc21hbGwtb2JqZWN0IGFsbG9jYXRvciwgdG8gZ2V0IHRoZSBiZW5lZml0IG9mCi0gIGl0cyBleHRyYSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLiAgQnV0IFB5dGhvbidzIHNtYWxsLW9iamVjdCBhbGxvY2F0b3IKLSAgaXNuJ3QgdGhyZWFkc2FmZSwgcmVseWluZyBvbiB0aGUgR0lMIHRvIGF2b2lkIHRoZSBleHBlbnNlIG9mIGRvaW5nIGl0cwotICBvd24gbG9ja2luZy4gIGBgUHlJbnRlcnByZXRlclN0YXRlX05ldygpYGAgYW5kIGBgUHlUaHJlYWRTdGF0ZV9OZXcoKWBgCi0gIGNhbGwgdGhlIHBsYXRmb3JtIGBgbWFsbG9jKClgYCBkaXJlY3RseSBub3csIHJlZ2FyZGxlc3Mgb2YgYnVpbGQgdHlwZS4KLQotLSBQeUxvbmdfQXNVbnNpZ25lZExvbmdbTWFza10gbm93IHN1cHBvcnQgaW50IG9iamVjdHMgYXMgd2VsbC4KLQotLSBTRiBwYXRjaCAjOTk4OTkzOiBgYFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWxgYCBhbmQKLSAgYGBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bGBgIGhhdmUgYmVlbiBhZGRlZCwgd2hpY2ggaW1wbGVtZW50IHN0YXRlZnVsCi0gIGRlY29kaW5nLgotCi1UZXN0cwotLS0tLS0KLQotLSB0ZXN0X19sb2NhbGUgcG9ydGVkIHRvIHVuaXR0ZXN0Ci0KLU1hYwotLS0tCi0KLS0gYGBwbGlzdGxpYmBgIG5vdyBzdXBwb3J0cyBub24tZGljdCByb290IG9iamVjdHMuICBUaGVyZSBpcyBhbHNvIGEgbmV3Ci0gIGludGVyZmFjZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBwbGlzdCBmaWxlczogYGByZWFkUGxpc3QocGF0aE9yRmlsZSlgYAotICBhbmQgYGB3cml0ZVBsaXN0KHJvb3RPYmplY3QsIHBhdGhPckZpbGUpYGAKLQotVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0tCi0KLS0gVGhlIHRleHQgZmlsZSBjb21wYXJpc29uIHNjcmlwdHMgYGBuZGlmZi5weWBgIGFuZCBgYGRpZmYucHlgYCBub3cKLSAgcmVhZCB0aGUgaW5wdXQgZmlsZXMgaW4gdW5pdmVyc2FsLW5ld2xpbmUgbW9kZS4gIFRoaXMgc3BhcmVzIHRoZW0KLSAgZnJvbSBjb25zdW1pbmcgYSBncmVhdCBkZWFsIG9mIHRpbWUgdG8gZGVkdWNlIHRoZSB1c2VsZXNzIHJlc3VsdCB0aGF0LAotICBlLmcuLCBhIGZpbGUgd2l0aCBXaW5kb3dzIGxpbmUgZW5kcyBhbmQgYSBmaWxlIHdpdGggTGludXggbGluZSBlbmRzCi0gIGhhdmUgbm8gbGluZXMgaW4gY29tbW9uLgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDIuNCBhbHBoYSAzPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDAyLVNFUC0yMDA0KgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBTRiBwYXRjaCAjMTAwNzE4OTogYGBmcm9tIC4uLiBpbXBvcnQgLi4uYGAgc3RhdGVtZW50cyBub3cgYWxsb3cgdGhlIG5hbWUKLSAgbGlzdCB0byBiZSBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2VzLgotCi0tIFNvbWUgc3BlZWR1cHMgZm9yIGxvbmcgYXJpdGhtZXRpYywgdGhhbmtzIHRvIFRyZXZvciBQZXJyaW4uICBHcmFkZXNjaG9vbAotICBtdWx0aXBsaWNhdGlvbiB3YXMgc3BlZCBhIGxpdHRsZSBieSBvcHRpbWl6aW5nIHRoZSBDIGNvZGUuICBHcmFkZXNjaG9vbAotICBzcXVhcmluZyB3YXMgc3BlZCBieSBhYm91dCBhIGZhY3RvciBvZiAyLCBieSBleHBsb2l0aW5nIHRoYXQgYWJvdXQgaGFsZgotICB0aGUgZGlnaXQgcHJvZHVjdHMgYXJlIGR1cGxpY2F0ZXMgaW4gYSBzcXVhcmUuICBCZWNhdXNlIGV4cG9uZW50aWF0aW9uCi0gIHVzZXMgc3F1YXJpbmcgb2Z0ZW4sIHRoaXMgYWxzbyBzcGVlZHMgbG9uZyBwb3dlci4gIEZvciBleGFtcGxlLCB0aGUgdGltZQotICB0byBjb21wdXRlIDE3KioxMDAwMDAwIGRyb3BwZWQgZnJvbSBhYm91dCAxNCBzZWNvbmRzIHRvIDkgb24gbXkgYm94IGR1ZQotICB0byB0aGlzIG11Y2guICBUaGUgY3V0b2ZmIGZvciBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gd2FzIHJhaXNlZCwKLSAgc2luY2UgZ3JhZGVzY2hvb2wgbXVsdGlwbGljYXRpb24gZ290IHF1aWNrZXIsIGFuZCB0aGUgY3V0b2ZmIHdhcwotICBhZ2dyZXNzaXZlbHkgc21hbGwgcmVnYXJkbGVzcy4gIFRoZSBleHBvbmVudGlhdGlvbiBhbGdvcml0aG0gd2FzIHN3aXRjaGVkCi0gIGZyb20gcmlnaHQtdG8tbGVmdCB0byBsZWZ0LXRvLXJpZ2h0LCB3aGljaCBpcyBtb3JlIGVmZmljaWVudCBmb3Igc21hbGwKLSAgYmFzZXMuICBJbiBhZGRpdGlvbiwgaWYgdGhlIGV4cG9uZW50IGlzIGxhcmdlLCB0aGUgYWxnb3JpdGhtIG5vdyBkb2VzCi0gIDUgYml0cyAoaW5zdGVhZCBvZiAxIGJpdCkgYXQgYSB0aW1lLiAgVGhhdCBjdXQgdGhlIHRpbWUgdG8gY29tcHV0ZQotICAxNyoqMTAwMDAwMCBvbiBteSBib3ggaW4gaGFsZiBhZ2FpbiwgZG93biB0byBhYm91dCA0LjUgc2Vjb25kcy4KLQotLSBPdmVyZmxvd1dhcm5pbmcgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZC4gIFBFUCAyMzcgc2NoZWR1bGVkIHRoaXMgdG8KLSAgb2NjdXIgaW4gUHl0aG9uIDIuMywgYnV0IHNpbmNlIE92ZXJmbG93V2FybmluZyB3YXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwKLSAgbm9ib2R5IHJlYWxpemVkIGl0IHdhcyBzdGlsbCBiZWluZyBnZW5lcmF0ZWQuICBPbiB0aGUgY2hhbmNlIHRoYXQgdXNlcgotICBjb2RlIGlzIHN0aWxsIHVzaW5nIHRoZW0sIHRoZSBQeXRob24gYnVpbHRpbiBPdmVyZmxvd1dhcm5pbmcsIGFuZAotICBjb3JyZXNwb25kaW5nIEMgQVBJIFB5RXhjX092ZXJmbG93V2FybmluZywgd2lsbCBleGlzdCB1bnRpbCBQeXRob24gMi41LgotCi0tIFB5X0luaXRpYWxpemVFeCBoYXMgYmVlbiBhZGRlZC4KLQotLSBGaXggdGhlIG9yZGVyIG9mIGFwcGxpY2F0aW9uIG9mIGRlY29yYXRvcnMuICBUaGUgcHJvcGVyIG9yZGVyIGlzIGJvdHRvbS11cDsKLSAgdGhlIGZpcnN0IGRlY29yYXRvciBsaXN0ZWQgaXMgdGhlIGxhc3Qgb25lIGNhbGxlZC4KLQotLSBTRiBwYXRjaCAjMTAwNTc3OC4gIEZpeCBhIHNlZyBmYXVsdCBpZiB0aGUgbGlzdCBzaXplIGNoYW5nZWQgd2hpbGUKLSAgY2FsbGluZyBsaXN0LmluZGV4KCkuICBUaGlzIGNvdWxkIGhhcHBlbiBpZiBhIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbgotICBtb2RpZmllZCB0aGUgbGlzdC4KLQotLSBUaGUgYGBmdW5jX25hbWVgYCAoYS5rLmEuIGBgX19uYW1lX19gYCkgYXR0cmlidXRlIG9mIHVzZXItZGVmaW5lZAotICBmdW5jdGlvbnMgaXMgbm93IHdyaXRhYmxlLgotCi0tIGNvZGVfbmV3IChhLmsuYSBuZXcuY29kZSgpKSBub3cgY2hlY2tzIGl0cyBhcmd1bWVudHMgc3VmZmljaWVudGx5Ci0gIGNhcmVmdWxseSB0aGF0IHBhc3NpbmcgdGhlbSBvbiB0byBQeUNvZGVfTmV3KCkgd29uJ3QgdHJpZ2dlciBjYWxscwotICB0byBQeV9GYXRhbEVycm9yKCkgb3IgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkuICBJdCBpcyBzdGlsbCB0aGUgY2FzZQotICB0aGF0IHRoZSByZXR1cm5lZCBjb2RlIG9iamVjdCBtaWdodCBiZSBlbnRpcmVseSBpbnNhbmUuCi0KLS0gU3ViY2xhc3NlcyBvZiBzdHJpbmcgY2FuIG5vIGxvbmdlciBiZSBpbnRlcm5lZC4gIFRoZSBzZW1hbnRpY3Mgb2YKLSAgaW50ZXJuaW5nIHdlcmUgbm90IGNsZWFyIGhlcmUgLS0gYSBzdWJjbGFzcyBjb3VsZCBiZSBtdXRhYmxlLCBmb3IKLSAgZXhhbXBsZSAtLSBhbmQgaGFkIGJ1Z3MuICBFeHBsaWNpdGx5IGludGVybmluZyBhIHN1YmNsYXNzIG9mIHN0cmluZwotICB2aWEgaW50ZXJuKCkgd2lsbCByYWlzZSBhIFR5cGVFcnJvci4gIEludGVybmFsIG9wZXJhdGlvbnMgdGhhdCBhdHRlbXB0Ci0gIHRvIGludGVybiBhIHN0cmluZyBzdWJjbGFzcyB3aWxsIGhhdmUgbm8gZWZmZWN0LgotCi0tIEJ1ZyAxMDAzOTM1OiAgeHJhbmdlKCkgY291bGQgcmVwb3J0IGJvZ3VzIE92ZXJmbG93RXJyb3JzLiAgRG9jdW1lbnRlZAotICB3aGF0IHhyYW5nZSgpIGludGVuZHMsIGFuZCByZXBhaXJlZCB0ZXN0cyBhY2NvcmRpbmdseS4KLQotRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gZGlmZmxpYiBub3cgc3VwcG9ydHMgSFRNTCBzaWRlLWJ5LXNpZGUgZGlmZi4KLQotLSBvcy51cmFuZG9tIGhhcyBiZWVuIGFkZGVkIGZvciBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzb3VyY2VzIG9mIHJhbmRvbQotICBkYXRhLgotCi0tIFBhdGNoIDEwMTI3NDA6ICB0cnVuY2F0ZSgpIG9uIGEgd3JpdGVhYmxlIGNTdHJpbmdJTyBub3cgcmVzZXRzIHRoZQotICBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3JpZ2luYWwKLSAgU3RyaW5nSU8gbW9kdWxlIGFuZCBhdm9pZHMgaW5hZHZlcnRlbnRseSByZXN1cnJlY3RpbmcgZGF0YSB0aGF0IHdhcwotICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gdHJ1bmNhdGVkIGF3YXkuCi0KLS0gQWRkZWQgc29ja2V0LnNvY2tldHBhaXIoKS4KLQotLSBBZGRlZCBDdXJyZW50Qnl0ZUluZGV4LCBDdXJyZW50Q29sdW1uTnVtYmVyLCBDdXJyZW50TGluZU51bWJlcgotICBtZW1iZXJzIHRvIHhtbC5wYXJzZXJzLmV4cGF0LlhNTFBhcnNlciBvYmplY3QuCi0KLS0gVGhlIG1weiwgcm90b3IsIGFuZCB4cmVhZGxpbmVzIG1vZHVsZXMsIGFsbCBkZXByZWNhdGVkIGluIGVhcmxpZXIKLSAgdmVyc2lvbnMgb2YgUHl0aG9uLCBoYXZlIG5vdyBiZWVuIHJlbW92ZWQuCi0KLUxpYnJhcnkKLS0tLS0tLS0KLQotLSBQYXRjaCAjOTM0MzU2OiBpZiBhIG1vZHVsZSBkZWZpbmVzIF9fYWxsX18sIGJlbGlldmUgdGhhdCByYXRoZXIgdGhhbiB1c2luZwotICBoZXVyaXN0aWNzIGZvciBmaWx0ZXJpbmcgb3V0IGltcG9ydGVkIG5hbWVzLgotCi0tIFBhdGNoICM5NDE0ODY6IGFkZGVkIG9zLnBhdGgubGV4aXN0cygpLCB3aGljaCByZXR1cm5zIFRydWUgZm9yIGJyb2tlbgotICBzeW1saW5rcywgdW5saWtlIG9zLnBhdGguZXhpc3RzKCkuCi0KLS0gdGhlIHJhbmRvbSBtb2R1bGUgbm93IHVzZXMgb3MudXJhbmRvbSgpIGZvciBzZWVkaW5nIGlmIGl0IGlzIGF2YWlsYWJsZS4KLSAgQWRkZWQgYSBuZXcgZ2VuZXJhdG9yIGJhc2VkIG9uIG9zLnVyYW5kb20oKS4KLQotLSBkaWZmbGliIGFuZCBkaWZmLnB5IGNhbiBub3cgZ2VuZXJhdGUgSFRNTC4KLQotLSBiZGlzdF9ycG0gbm93IGluY2x1ZGVzIHZlcnNpb24gYW5kIHJlbGVhc2UgaW4gdGhlIEJ1aWxkUm9vdCwgYW5kCi0gIHJlcGxhY2VzIC0gYnkgYGBfYGAgaW4gdmVyc2lvbiBhbmQgcmVsZWFzZS4KLQotLSBkaXN0dXRpbHMgYnVpbGQvYnVpbGRfc2NyaXB0cyBub3cgaGFzIGFuIC1lIG9wdGlvbiB0byBzcGVjaWZ5IHRoZQotICBwYXRoIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgZm9yIGluc3RhbGxlZCBzY3JpcHRzLgotCi0tIFBFUCAyOTIgY2xhc3NlcyBUZW1wbGF0ZSBhbmQgU2FmZVRlbXBsYXRlIGFyZSBhZGRlZCB0byB0aGUgc3RyaW5nIG1vZHVsZS4KLQotLSB0YXJmaWxlIG5vdyBnZW5lcmF0ZXMgR05VIHRhciBmaWxlcyBieSBkZWZhdWx0LgotCi0tIEhUVFBSZXNwb25zZSBoYXMgbm93IGEgZ2V0aGVhZGVycyBtZXRob2QuCi0KLS0gUGF0Y2ggIzEwMDYyMTk6IGxldCBpbnNwZWN0LmdldHNvdXJjZSBoYW5kbGUgJ0AnIGRlY29yYXRvcnMuIFRoYW5rcyBTaW1vbgotICBQZXJjaXZhbGwuCi0KLS0gbG9nZ2luZy5oYW5kbGVycy5TTVRQSGFuZGxlci5kYXRlX3RpbWUgaGFzIGJlZW4gcmVtb3ZlZDsKLSAgdGhlIGNsYXNzIG5vdyB1c2VzIGVtYWlsLlV0aWxzLmZvcm1hdGRhdGUgdG8gZ2VuZXJhdGUgdGhlIHRpbWUgc3RhbXAuCi0KLS0gQSBuZXcgZnVuY3Rpb24gdGtGb250Lm5hbWV0b2ZvbnQgd2FzIGFkZGVkIHRvIHJldHVybiBhbiBleGlzdGluZwotICBmb250LiBUaGUgRm9udCBjbGFzcyBjb25zdHJ1Y3RvciBub3cgaGFzIGFuIGFkZGl0aW9uYWwgZXhpc3RzIGFyZ3VtZW50Ci0gIHdoaWNoLCBpZiBUcnVlLCByZXF1ZXN0cyB0byByZXR1cm4vY29uZmlndXJlIGFuIGV4aXN0aW5nIGZvbnQsIHJhdGhlcgotICB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQotLSBVcGRhdGVkIHRoZSBkZWNpbWFsIHBhY2thZ2UncyBtaW4oKSBhbmQgbWF4KCkgbWV0aG9kcyB0byBtYXRjaCB0aGUKLSAgbGF0ZXN0IHJldmlzaW9uIG9mIHRoZSBHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBTcGVjaWZpY2F0aW9uLgotICBRdWlldCBOYU5zIGFyZSBpZ25vcmVkIGFuZCBlcXVhbCB2YWx1ZXMgYXJlIHNvcnRlZCBiYXNlZCBvbiBzaWduCi0gIGFuZCBleHBvbmVudC4KLQotLSBUaGUgZGVjaW1hbCBwYWNrYWdlJ3MgQ29udGV4dC5jb3B5KCkgbWV0aG9kIG5vdyByZXR1cm5zIGRlZXAgY29waWVzLgotCi0tIERlcHJlY2F0ZWQgc3lzLmV4aXRmdW5jIGluIGZhdm9yIG9mIHRoZSBhdGV4aXQgbW9kdWxlLiAgVGhlIHN5cy5leGl0ZnVuYwotICBhdHRyaWJ1dGUgd2lsbCBiZSBrZXB0IGFyb3VuZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYW5kIGF0ZXhpdAotICB3aWxsIGp1c3QgYmVjb21lIHRoZSBvbmUgcHJlZmVycmVkIHdheSB0byBkbyBpdC4KLQotLSBwYXRjaCAjNjc1NTUxOiBBZGQgZ2V0X2hpc3RvcnlfaXRlbSBhbmQgcmVwbGFjZV9oaXN0b3J5X2l0ZW0gZnVuY3Rpb25zCi0gIHRvIHRoZSByZWFkbGluZSBtb2R1bGUuCi0KLS0gYnVnICM5ODk2NzI6IHBkYi5kb2MgYW5kIHRoZSBoZWxwIG1lc3NhZ2VzIGZvciB0aGUgaGVscF9kIGFuZCBoZWxwX3UgbWV0aG9kcwotICBvZiB0aGUgcGRiLlBkYiBjbGFzcyBnaXZlcyBoYXZlIGJlZW4gY29ycmVjdGVkLiBkKG93bikgZ29lcyB0byBhIG5ld2VyCi0gIGZyYW1lLCB1KHApIHRvIGFuIG9sZGVyIGZyYW1lLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuCi0KLS0gYnVnICM5OTA2Njk6IG9zLnBhdGgucmVhbHBhdGgoKSB3aWxsIHJlc29sdmUgc3ltbGlua3MgYmVmb3JlIG5vcm1hbGl6aW5nIHRoZQotICBwYXRoLCBhcyBub3JtYWxpemluZyB0aGUgcGF0aCBtYXkgYWx0ZXIgdGhlIG1lYW5pbmcgb2YgdGhlIHBhdGggaWYgaXQKLSAgY29udGFpbnMgc3ltbGlua3MuCi0KLS0gYnVnICM4NTExMjM6IHNodXRpbC5jb3B5ZmlsZSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBjb3B5IGEKLSAgZmlsZSBvbnRvIGEgbGluayB0byBpdHNlbGYuIFRoYW5rcyBHcmVnb3J5IEJhbGwuCi0KLS0gYnVnICM1NzAzMDA6IEZpeCBpbnNwZWN0IHRvIHJlc29sdmUgZmlsZSBsb2NhdGlvbnMgdXNpbmcgb3MucGF0aC5yZWFscGF0aCgpCi0gIHNvIGFzIHRvIHByb3Blcmx5IGxpc3QgYWxsIGZ1bmN0aW9ucyBpbiBhIG1vZHVsZSB3aGVuIHRoZSBtb2R1bGUgaXRzZWxmIGlzCi0gIHJlYWNoZWQgdGhyb3VnaCBhIHN5bWxpbmsuICBUaGFua3MgSm9oYW5uZXMgR2lqc2JlcnMuCi0KLS0gZG9jdGVzdCByZWZhY3RvcmluZyBjb250aW51ZWQuICBTZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMuICBBcyBwYXJ0IG9mCi0gIHRoaXMgZWZmb3J0LCBzb21lIG9sZCBhbmQgbGl0dGxlLSAobmV2ZXI/KSB1c2VkIGZlYXR1cmVzIGFyZSBub3cKLSAgZGVwcmVjYXRlZDogIHRoZSBUZXN0ZXIgY2xhc3MsIHRoZSBtb2R1bGUgaXNfcHJpdmF0ZSgpIGZ1bmN0aW9uLCBhbmQgdGhlCi0gIGlzcHJpdmF0ZSBhcmd1bWVudCB0byB0ZXN0bW9kKCkuICBUaGUgVGVzdGVyIGNsYXNzIHN1cHBsaWVkIGEgZmVlYmxlCi0gICJieSBoYW5kIiB3YXkgdG8gY29tYmluZSBtdWx0aXBsZSBkb2N0ZXN0cywgaWYgeW91IGtuZXcgZXhhY3RseSB3aGF0Ci0gIHlvdSB3ZXJlIGRvaW5nLiAgVGhlIG5ld2VyIGRvY3Rlc3QgZmVhdHVyZXMgZm9yIHVuaXR0ZXN0IGludGVncmF0aW9uCi0gIGFscmVhZHkgZGlkIGEgYmV0dGVyIGpvYiBvZiB0aGF0LCBhcmUgc3Ryb25nZXIgbm93IHRoYW4gZXZlciwgYW5kIHRoZQotICBuZXcgRG9jVGVzdFJ1bm5lciBjbGFzcyBpcyBhIHNhbmVyIGZvdW5kYXRpb24gaWYgeW91IHdhbnQgdG8gZG8gaXQgYnkKLSAgaGFuZC4gIFRoZSAicHJpdmF0ZSBuYW1lIiBmaWx0ZXJpbmcgZ2ltbWljayB3YXMgYSBtaXN0YWtlIGZyb20gdGhlCi0gIHN0YXJ0LCBhbmQgdGVzdG1vZCgpIGNoYW5nZWQgbG9uZyBhZ28gdG8gaWdub3JlIGl0IGJ5IGRlZmF1bHQuICBJZgotICB5b3Ugd2FudCB0byBmaWx0ZXIgb3V0IHRlc3RzLCB0aGUgbmV3IERvY1Rlc3RGaW5kZXIgY2xhc3MgY2FuIGJlIHVzZWQKLSAgdG8gcmV0dXJuIGEgbGlzdCBvZiBhbGwgZG9jdGVzdHMsIGFuZCB5b3UgY2FuIGZpbHRlciB0aGF0IGxpc3QgYnkKLSAgYW55IGNvbXB1dGFibGUgY3JpdGVyaWEgYmVmb3JlIHBhc3NpbmcgaXQgdG8gYSBEb2NUZXN0UnVubmVyIGluc3RhbmNlLgotCi0tIEJ1ZyAjODkxNjM3LCBwYXRjaCAjMTAwNTQ2NjogZml4IGluc3BlY3QuZ2V0YXJncygpIGNyYXNoIG9uIGRlZiBmb28oKGJhcikpLgotCi1Ub29scy9EZW1vcwotLS0tLS0tLS0tLS0KLQotLSBJRExFJ3Mgc2hvcnRjdXQga2V5cyBmb3Igd2luZG93cyBhcmUgbm93IGNhc2UgaW5zZW5zaXRpdmUgc28gdGhhdAotICBDb250cm9sLVYgd29ya3MgdGhlIHNhbWUgYXMgQ29udHJvbC12LgotCi0tIHB5Z2V0dGV4dC5weTogR2VuZXJhdGUgUE9ULUNyZWF0aW9uLURhdGUgaGVhZGVyIGluIElTTyBmb3JtYXQuCi0KLUJ1aWxkCi0tLS0tLQotCi0tIEJhY2t3YXJkIGluY29tcGF0aWJpbGl0eTogIGxvbmdpbnRyZXByLmggbm93IHRyaWdnZXJzIGEgY29tcGlsZS10aW1lCi0gIGVycm9yIGlmIFNISUZUICh0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBQeXRob24gbG9uZyAiZGlnaXQiKSBpc24ndAotICBkaXZpc2libGUgYnkgNS4gIFRoaXMgbmV3IHJlcXVpcmVtZW50IGFsbG93cyBzaW1wbGUgY29kZSBmb3IgdGhlIG5ldwotICA1LWJpdHMtYXQtYS10aW1lIGxvbmdfcG93KCkgaW1wbGVtZW50YXRpb24uICBJZiBuZWNlc3NhcnksIHRoZQotICByZXN0cmljdGlvbiBjb3VsZCBiZSByZW1vdmVkIChieSBjb21wbGljYXRpbmcgbG9uZ19wb3coKSwgb3IgYnkKLSAgZmFsbGluZyBiYWNrIHRvIHRoZSAxLWJpdC1hdC1hLXRpbWUgYWxnb3JpdGhtKSwgYnV0IHRoZXJlIGFyZSBubwotICBwbGFucyB0byBkbyBzby4KLQotLSBidWcgIzk5MTk2MjogV2hlbiBidWlsZGluZyB3aXRoIC0tZGlzYWJsZS10b29sYm94LWdsdWUgb24gRGFyd2luIG5vCi0gIGF0dGVtcHQgdG8gYnVpbGQgTWFjLXNwZWNpZmljIG1vZHVsZXMgb2NjdXJzLgotCi0tIFRoZSAtLXdpdGgtdHNjIGZsYWcgdG8gY29uZmlndXJlIHRvIGVuYWJsZSBWTSBwcm9maWxpbmcgd2l0aCB0aGUKLSAgcHJvY2Vzc29yJ3MgdGltZXN0YW1wIGNvdW50ZXIgbm93IHdvcmtzIG9uIFBQQyBwbGF0Zm9ybXMuCi0KLS0gcGF0Y2ggIzEwMDY2Mjk6IERlZmluZSBfWE9QRU5fU09VUkNFIHRvIDUwMCBvbiBTb2xhcmlzIDgvOSB0byBtYXRjaAotICBHQ0MncyBkZWZpbml0aW9uIGFuZCBhdm9pZCByZWRlZmluaXRpb24gd2FybmluZ3MuCi0KLS0gRGV0ZWN0IHB0aHJlYWRzIHN1cHBvcnQgKHByb3ZpZGVkIGJ5IGdudSBwdGggcHRocmVhZCBlbXVsYXRpb24pIG9uCi0gIEdOVS9rKkJTRCBzeXN0ZW1zLgotCi0tIGJ1ZyAjMTAwNTczNywgIzEwMDcyNDk6IEZpeGVkIHNldmVyYWwgYnVpbGQgcHJvYmxlbXMgYW5kIHdhcm5pbmdzCi0gIGZvdW5kIG9uIG9sZC9sZWdhY3kgQyBjb21waWxlcnMgb2YgSFAtVVgsIElSSVggYW5kIFRydTY0LgotCi1DIEFQSQotLS0tLS0KLQotLi4KLQotRG9jdW1lbnRhdGlvbgotLS0tLS0tLS0tLS0tLQotCi0tIHBhdGNoICMxMDA1OTM2LCBidWcgIzEwMDkzNzM6IGZpeCBpbmRleCBlbnRyaWVzIHdoaWNoIGNvbnRhaW4KLSAgYW4gdW5kZXJzY29yZSB3aGVuIHZpZXdlZCB3aXRoIEFjcm9iYXQuCi0KLS0gYnVnICM5OTA2Njk6IG9zLnBhdGgubm9ybXBhdGggbWF5IGFsdGVyIHRoZSBtZWFuaW5nIG9mIGEgcGF0aCBpZgotICBpdCBjb250YWlucyBzeW1ib2xpYyBsaW5rcy4gVGhpcyBoYXMgYmVlbiBkb2N1bWVudGVkIGluIGEgY29tbWVudAotICBzaW5jZSAxOTkyLCBidXQgaXMgbm93IGluIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZSBhcyB3ZWxsLgotCi1OZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0tCi0KLS0gRnJlZUJTRCA2IGlzIG5vdyBzdXBwb3J0ZWQuCi0KLVRlc3RzCi0tLS0tLQotCi0uLgotCi1XaW5kb3dzCi0tLS0tLS0tCi0KLS0gQm9vc3RlZCB0aGUgc3RhY2sgcmVzZXJ2YXRpb24gZm9yIHB5dGhvbi5leGUgYW5kIHB5dGhvbncuZXhlIGZyb20KLSAgdGhlIGRlZmF1bHQgMU1CIHRvIDJNQi4gIFN0YWNrIGZyYW1lcyB1bmRlciBWQyA3LjEgZm9yIDIuNCBhcmUgZW5vdWdoCi0gIGJpZ2dlciB0aGFuIHVuZGVyIFZDIDYuMCBmb3IgMi4zLjQgdGhhdCBkZWVwbHkgcmVjdXJzaXZlIHByb2dhbXMKLSAgd2l0aGluIHRoZSBkZWZhdWx0IHN5cy5nZXRyZWN1cnNpb25saW1pdCgpIGRlZmF1bHQgdmFsdWUgb2YgMTAwMCB3ZXJlCi0gIGFibGUgdG8gc3VmZmVyIHVuZGV0ZWN0ZWQgQyBzdGFjayBvdmVyZmxvd3MuICBUaGUgc3RhbmRhcmQgdGVzdCBwcm9ncmFtCi0gIHRlc3RfY29tcGlsZXIgd2FzIG9uZSBzdWNoIHByb2dyYW0uICBJZiBhIFB5dGhvbiBwcm9jZXNzIG9uIFdpbmRvd3MKLSAgImp1c3QgdmFuaXNoZXMiIHdpdGhvdXQgYSB0cmFjZSwgYW5kIHdpdGhvdXQgYW4gZXJyb3IgbWVzc2FnZSBvZiBhbnkKLSAga2luZCwgYnV0IHdpdGggYW4gZXhpdCBjb2RlIG9mIDEyOCwgdW5kZXRlY3RlZCBzdGFjayBvdmVyZmxvdyBtYXkgYmUKLSAgdGhlIHByb2JsZW0uCi0KLU1hYwotLS0tCi0KLS4uCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi40IGFscGhhIDI/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMDUtQVVHLTIwMDQqCi0KLUNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIFBhdGNoICM5ODA2OTU6ICBJbXBsZW1lbnRzIGVmZmljaWVudCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBmb3Igc3RhdGVtZW50cwotICBvZiB0aGUgZm9ybSBzPXMrdCBhbmQgcys9dC4gIFRoaXMgd2lsbCB2YXJ5IGFjcm9zcyBpbXBsZW1lbnRhdGlvbnMuCi0gIEFjY29yZGluZ2x5LCB0aGUgc3RyLmpvaW4oKSBtZXRob2QgaXMgc3Ryb25nbHkgcHJlZmVycmVkIGZvciBwZXJmb3JtYW5jZQotICBzZW5zaXRpdmUgY29kZS4KLQotLSBQRVAtMDMxOCwgRnVuY3Rpb24gRGVjb3JhdG9ycyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlLiBUaGVzZSBhcmUKLSAgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIEphdmEtc3R5bGUgQGRlY29yYXRvciBzeW50YXgsIGxpa2Ugc286OgotCi0gICAgIEBzdGF0aWNtZXRob2QKLSAgICAgZGVmIGZvbyhiYXIpOgotCi0gIChUaGUgUEVQIG5lZWRzIHRvIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBzdGF0ZSkKLQotLSBXaGVuIGltcG9ydGluZyBhIG1vZHVsZSBNIHJhaXNlcyBhbiBleGNlcHRpb24sIFB5dGhvbiBubyBsb25nZXIgbGVhdmVzIE0KLSAgaW4gc3lzLm1vZHVsZXMuICBCZWZvcmUgMi40YTIgaXQgZGlkLCBhbmQgYSBzdWJzZXF1ZW50IGltcG9ydCBvZiBNIHdvdWxkCi0gIHN1Y2NlZWQsIHBpY2tpbmcgdXAgYSBtb2R1bGUgb2JqZWN0IGZyb20gc3lzLm1vZHVsZXMgcmVmbGVjdGluZyBhcyBtdWNoCi0gIG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiBNIGFzIGNvbXBsZXRlZCBiZWZvcmUgdGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgotICBTdWJzZXF1ZW50IGltcG9ydHMgZ290IG5vIGluZGljYXRpb24gdGhhdCBNIHdhcyBpbiBhIHBhcnRpYWxseS0KLSAgaW5pdGlhbGl6ZWQgc3RhdGUsIGFuZCB0aGUgaW1wb3J0ZXJzIGNvdWxkIGdldCBpbnRvIGFyYml0cmFyaWx5IGJhZAotICB0cm91YmxlIGFzIGEgcmVzdWx0ICh0aGUgTSB0aGV5IGdvdCB3YXMgaW4gYW4gdW5pbnRlbmRlZCBzdGF0ZSwKLSAgYXJiaXRyYXJpbHkgZmFyIHJlbW92ZWQgZnJvbSBNJ3MgYXV0aG9yJ3MgaW50ZW50KS4gIE5vdyBzdWJzZXF1ZW50Ci0gIGltcG9ydHMgb2YgTSB3aWxsIGNvbnRpbnVlIHJhaXNpbmcgZXhjZXB0aW9ucyAoYnV0IGlmLCBmb3IgZXhhbXBsZSwgdGhlCi0gIHNvdXJjZSBjb2RlIGZvciBNIGlzIGVkaXRlZCBiZXR3ZWVuIGltcG9ydCBhdHRlbXB0cywgdGhlbiBwZXJoYXBzIGxhdGVyCi0gIGF0dGVtcHRzIHdpbGwgc3VjY2VlZCwgb3IgcmFpc2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uKS4KLQotICBUaGlzIGNhbiBicmVhayBleGlzdGluZyBjb2RlLCBidXQgaW4gc3VjaCBjYXNlcyB0aGUgY29kZSB3YXMgcHJvYmFibHkKLSAgd29ya2luZyBiZWZvcmUgYnkgYWNjaWRlbnQuICBJbiB0aGUgUHl0aG9uIHNvdXJjZSwgdGhlIG9ubHkgY2FzZSBvZgotICBicmVha2FnZSBkaXNjb3ZlcmVkIHdhcyBpbiBhIHRlc3QgYWNjaWRlbnRhbGx5IHJlbHlpbmcgb24gYSBkYW1hZ2VkCi0gIG1vZHVsZSByZW1haW5pbmcgaW4gc3lzLm1vZHVsZXMuICBDYXNlcyBhcmUgYWxzbyBrbm93biB3aGVyZSB0ZXN0cwotICBkZWxpYmVyYXRlbHkgcHJvdm9raW5nIGltcG9ydCBlcnJvcnMgcmVtb3ZlIGRhbWFnZWQgbW9kdWxlcyBmcm9tCi0gIHN5cy5tb2R1bGVzIHRoZW1zZWx2ZXMsIGFuZCBzdWNoIHRlc3RzIHdpbGwgYnJlYWsgbm93IGlmIHRoZXkgZG8gYW4KLSAgdW5jb25kaXRpb25hbCBkZWwgc3lzLm1vZHVsZXNbTV0uCi0KLS0gdSclcycgJSBvYmogd2lsbCBub3cgdHJ5IG9iai5fX3VuaWNvZGVfXygpIGZpcnN0IGFuZCBmYWxsYmFjayB0bwotICBvYmouX19zdHJfXygpIGlmIG5vIF9fdW5pY29kZV9fIG1ldGhvZCBjYW4gYmUgZm91bmQuCi0KLS0gUGF0Y2ggIzU1MDczMjogQWRkIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkuICBBbmFsb2dvdXMgdG8KLSAgUHlBcmdfVmFQYXJzZSgpLiAgQm90aCBhcmUgbm93IGRvY3VtZW50ZWQuICBUaGFua3MgR3JlZyBDaGFwbWFuLgotCi0tIEFsbG93IHN0cmluZyBhbmQgdW5pY29kZSByZXR1cm4gdHlwZXMgZnJvbSAuZW5jb2RlKCkvLmRlY29kZSgpCi0gIG1ldGhvZHMgb24gc3RyaW5nIGFuZCB1bmljb2RlIG9iamVjdHMuICBBZGRlZCB1bmljb2RlLmRlY29kZSgpCi0gIHdoaWNoIHdhcyBtaXNzaW5nIGZvciBubyBhcHBhcmVudCByZWFzb24uCi0KLS0gQW4gYXR0ZW1wdCB0byBmaXggdGhlIG1lc3MgdGhhdCBpcyBQeXRob24ncyBiZWhhdmlvdXIgd2l0aAotICBzaWduYWwgaGFuZGxlcnMgYW5kIHRocmVhZHMsIGNvbXBsaWNhdGVkIGJ5IHJlYWRsaW5lJ3MgYmVoYXZpb3VyLgotICBJdCdzIHF1aXRlIHBvc3NpYmxlIHRoYXQgdGhlcmUgYXJlIHN0aWxsIGJ1Z3MgaGVyZS4KLQotLSBBZGRlZCBDIG1hY3JvcyBQeV9DTEVBUiBhbmQgUHlfVklTSVQgdG8gZWFzZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKLSAgdHlwZXMgdGhhdCBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbi4KLQotLSBDb21waWxlciBub3cgdHJlYXRzIE5vbmUgYXMgYSBjb25zdGFudC4KLQotLSBUaGUgdHlwZSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgX19pbnRfXywgX19mbG9hdF9fLCBfX2xvbmdfXywKLSAgX19vY3RfXywgYW5kIF9faGV4X18gYXJlIG5vdyBjaGVja2VkLiAgUmV0dXJuaW5nIGFuIGludmFsaWQgdHlwZQotICB3aWxsIGNhdXNlIGEgVHlwZUVycm9yIHRvIGJlIHJhaXNlZC4gIFRoaXMgbWF0Y2hlcyB0aGUgYmVoYXZpb3Igb2YKLSAgSnl0aG9uLgotCi0tIEltcGxlbWVudGVkIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KCkgaW4gbG9jYWxlIG1vZHVsZS4KLQotLSBBZGRlZCBhIHdvcmthcm91bmQgZm9yIHByb3BlciBzdHJpbmcgb3BlcmF0aW9ucyBpbiBCU0RzLiAgc3RyLnNwbGl0Ci0gIGFuZCBzdHIuaXMqIG1ldGhvZHMgY2FuIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIFVURi04IGxvY2FsZXMuCi0KLS0gQnVnICM5ODkxODU6IHVuaWNvZGUuaXN3aWRlKCkgYW5kIHVuaWNvZGUud2lkdGgoKSBpcyBkcm9wcGVkIGFuZAotICB0aGUgRWFzdCBBc2lhbiBXaWR0aCBzdXBwb3J0IGlzIG1vdmVkIHRvIHVuaWNvZGVkYXRhIGV4dGVuc2lvbgotICBtb2R1bGUuCi0KLS0gUGF0Y2ggIzk0MTIyOTogVGhlIHNvdXJjZSBjb2RlIGVuY29kaW5nIGluIGludGVyYWN0aXZlIG1vZGUKLSAgbm93IHJlZmVycyBzeXMuc3RkaW4uZW5jb2Rpbmcgbm90IGp1c3QgSVNPLTg4NTktMSBhbnltb3JlLiAgVGhpcwotICBhbGxvd3MgZm9yIG5vbi1sYXRpbi0xIHVzZXJzIHRvIHdyaXRlIHVuaWNvZGUgc3RyaW5ncyBkaXJlY3RseS4KLQotRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gY3BpY2tsZSBub3cgc3VwcG9ydHMgdGhlIHNhbWUga2V5d29yZCBhcmd1bWVudHMgYXMgcGlja2xlLgotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KLS0gQWRkZWQgbmV3IGNvZGVjcyBhbmQgYWxpYXNlcyBmb3IgSVNPXzg4NTktMTEsIElTT184ODU5LTE2IGFuZAotICBUSVMtNjIwCi0KLS0gVGhhbmtzIHRvIEVkd2FyZCBMb3BlciwgZG9jdGVzdCBoYXMgYmVlbiBtYXNzaXZlbHkgcmVmYWN0b3JlZCwgYW5kCi0gIG1hbnkgbmV3IGZlYXR1cmVzIHdlcmUgYWRkZWQuICBGdWxsIGRvY3Mgd2lsbCBhcHBlYXIgbGF0ZXIuICBGb3Igbm93Ci0gIHRoZSBkb2N0ZXN0IG1vZHVsZSBjb21tZW50cyBhbmQgbmV3IHRlc3QgY2FzZXMgZ2l2ZSBnb29kIGNvdmVyYWdlLgotICBUaGUgcmVmYWN0b3JpbmcgcHJvdmlkZXMgbWFueSBob29rIHBvaW50cyBmb3IgY3VzdG9taXppbmcgYmVoYXZpb3IKLSAgKHN1Y2ggYXMgaG93IHRvIHJlcG9ydCBlcnJvcnMsIGFuZCBob3cgdG8gY29tcGFyZSBleHBlY3RlZCB0byBhY3R1YWwKLSAgb3V0cHV0KS4gIE5ldyBmZWF0dXJlcyBpbmNsdWRlIGEgPEJMQU5LTElORT4gbWFya2VyIGZvciBleHBlY3RlZAotICBvdXRwdXQgY29udGFpbmluZyBibGFuayBsaW5lcywgb3B0aW9ucyB0byBwcm9kdWNlIHVuaWZpZWQgb3IgY29udGV4dAotICBkaWZmcyB3aGVuIGFjdHVhbCBvdXRwdXQgZG9lc24ndCBtYXRjaCBleHBlY3RhdGlvbnMsIGFuIG9wdGlvbiB0bwotICBub3JtYWxpemUgd2hpdGVzcGFjZSBiZWZvcmUgY29tcGFyaW5nLCBhbmQgYW4gb3B0aW9uIHRvIHVzZSBhbgotICBlbGxpcHNpcyB0byBzaWduaWZ5ICJkb24ndCBjYXJlIiByZWdpb25zIG9mIG91dHB1dC4KLQotLSBUa2ludGVyIG5vdyBzdXBwb3J0cyB0aGUgd2lzaCAtc3luYyBhbmQgLXVzZSBvcHRpb25zLgotCi0tIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBpbiB0aW1lIHN1cHBvcnQgcGFzc2luZyBvZiBOb25lOiBjdGltZSgpLCBnbXRpbWUoKSwKLSAgYW5kIGxvY2FsdGltZSgpLiAgSWYgTm9uZSBpcyBwcm92aWRlZCwgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkICh0aGUKLSAgc2FtZSBhcyB3aGVuIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkKS4KLSAgW1NGIGJ1ZyA2NTgyNTQsIHBhdGNoIDY2MzQ4Ml0KLQotLSBubnRwbGliIGRvZXMgbm93IGFsbG93IHRvIGlnbm9yZSBhIC5uZXRyYyBmaWxlLgotCi0tIHVybGxpYjIgbm93IHJlY29nbml6ZXMgQmFzaWMgYXV0aGVudGljYXRpb24gZXZlbiBpZiBvdGhlciBhdXRoZW50aWNhdGlvbgotICBzY2hlbWVzIGFyZSBvZmZlcmVkLgotCi0tIEJ1ZyAjMTAwMTA1My4gIHdhdmUub3BlbigpIG5vdyBhY2NlcHRzIHVuaWNvZGUgZmlsZW5hbWVzLgotCi0tIGd6aXAuR3ppcEZpbGUgaGFzIGEgbmV3IGZpbGVubygpIG1ldGhvZCwgdG8gcmV0cmlldmUgdGhlIGhhbmRsZSBvZiB0aGUKLSAgdW5kZXJseWluZyBmaWxlIG9iamVjdCAocHJvdmlkZWQgaXQgaGFzIGEgZmlsZW5vKCkgbWV0aG9kKS4gIFRoaXMgaXMKLSAgbmVlZGVkIGlmIHlvdSB3YW50IHRvIHVzZSBvcy5mc3luYygpIG9uIGEgR3ppcEZpbGUuCi0KLS0gaW1hcGxpYiBoYXMgdHdvIG5ldyBtZXRob2RzOiBkZWxldGVhY2wgYW5kIG15cmlnaHRzLgotCi0tIG5udHBsaWIgaGFzIHR3byBuZXcgbWV0aG9kczogZGVzY3JpcHRpb24gYW5kIGRlc2NyaXB0aW9ucy4gVGhleQotICB1c2UgYSBtb3JlIFJGQy1jb21wbGlhbnQgd2F5IG9mIGdldHRpbmcgYSBuZXdzZ3JvdXAgZGVzY3JpcHRpb24uCi0KLS0gQnVnICM5OTMzOTQuICBGaXggYSBwb3NzaWJsZSByZWQgaGVycmluZyBvZiBLZXlFcnJvciBpbiAndGhyZWFkaW5nJyBiZWluZwotICByYWlzZWQgZHVyaW5nIGludGVycHJldGVyIHNodXRkb3duIGZyb20gYSByZWdpc3RlcmVkIGZ1bmN0aW9uIHdpdGggYXRleGl0Ci0gIHdoZW4gZHVtbXlfdGhyZWFkaW5nIGlzIGJlaW5nIHVzZWQuCi0KLS0gQnVnICM4NTcyOTcvUGF0Y2ggIzkxNjg3NC4gIEZpeCBhbiBlcnJvciB3aGVuIGV4dHJhY3RpbmcgYSBoYXJkIGxpbmsKLSAgZnJvbSBhIHRhcmZpbGUuCi0KLS0gUGF0Y2ggIzg0NjY1OS4gIEZpeCBhbiBlcnJvciBpbiB0YXJmaWxlLnB5IHdoZW4gdXNpbmcKLSAgR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uLgotCi0tIFRoZSBvYnNvbGV0ZSBGQ05UTC5weSBoYXMgYmVlbiBkZWxldGVkLiAgVGhlIGJ1aWx0aW4gZmNudGwgbW9kdWxlCi0gIGhhcyBiZWVuIGF2YWlsYWJsZSAob24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBmY250bCkgc2luY2UgUHl0aG9uCi0gIDEuNWEzLCBhbmQgYWxsIEZDTlRMLnB5IGRpZCBpcyBleHBvcnQgZmNudGwncyBuYW1lcywgYWZ0ZXIgZ2VuZXJhdGluZwotICBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgdGVsbGluZyB5b3UgdG8gdXNlIGZjbnRsIGRpcmVjdGx5LgotCi0tIFNldmVyYWwgbmV3IHVuaWNvZGUgY29kZWNzIGFyZSBhZGRlZDogYmlnNWhrc2NzLCBldWNfamlzXzIwMDQsCi0gIGlzbzIwMjJfanBfMjAwNCwgc2hpZnRfamlzXzIwMDQuCi0KLS0gQnVnICM3ODg1MjAuICBRdWV1ZS57Z2V0LCBnZXRfbm93YWl0LCBwdXQsIHB1dF9ub3dhaXR9IGhhdmUgbmV3Ci0gIGltcGxlbWVudGF0aW9ucywgZXhwbG9pdGluZyBDb25kaXRpb25zICh3aGljaCBkaWRuJ3QgZXhpc3QgYXQgdGhlIHRpbWUKLSAgUXVldWUgd2FzIGludHJvZHVjZWQpLiAgQSBtaW5vciBzZW1hbnRpYyBjaGFuZ2UgaXMgdGhhdCB0aGUgRnVsbCBhbmQKLSAgRW1wdHkgZXhjZXB0aW9ucyByYWlzZWQgYnkgbm9uLWJsb2NraW5nIGNhbGxzIG5vdyBvY2N1ciBvbmx5IGlmIHRoZQotICBxdWV1ZSB0cnVseSB3YXMgZnVsbCBvciBlbXB0eSBhdCB0aGUgaW5zdGFudCB0aGUgcXVldWUgd2FzIGNoZWNrZWQgKG9mCi0gIGNvdXJzZSB0aGUgUXVldWUgbWF5IG5vIGxvbmdlciBiZSBmdWxsIG9yIGVtcHR5IGJ5IHRoZSB0aW1lIGEgY2FsbGluZwotICB0aHJlYWQgc2VlcyB0aG9zZSBleGNlcHRpb25zLCB0aG91Z2gpLiAgQmVmb3JlLCB0aGUgZXhjZXB0aW9ucyBjb3VsZAotICBhbHNvIGJlIHJhaXNlZCBpZiBpdCB3YXMgIm1lcmVseSBpbmNvbnZlbmllbnQiIGZvciB0aGUgaW1wbGVtZW50YXRpb24KLSAgdG8gZGV0ZXJtaW5lIHRoZSB0cnVlIHN0YXRlIG9mIHRoZSBRdWV1ZSAoYmVjYXVzZSB0aGUgUXVldWUgd2FzIGxvY2tlZAotICBieSBzb21lIG90aGVyIG1ldGhvZCBpbiBwcm9ncmVzcykuCi0KLS0gQnVncyAjOTc5Nzk0IGFuZCAjOTgwMTE3OiBkaWZmbGliLmdldF9ncm91cGVkX29wY29kZXMoKSBub3cgaGFuZGxlcyB0aGUKLSAgY2FzZSBvZiBjb21wYXJpbmcgdHdvIGVtcHR5IGxpc3RzLiAgVGhpcyBhZmZlY3RlZCBib3RoIGNvbnRleHRfZGlmZigpIGFuZAotICB1bmlmaWVkX2RpZmYoKSwKLQotLSBCdWcgIzk4MDkzODogc210cGxpYiBub3cgcHJpbnRzIGRlYnVnIG91dHB1dCB0byBzeXMuc3RkZXJyLgotCi0tIEJ1ZyAjOTMwMDI0OiBwb3NpeHBhdGgucmVhbHBhdGgoKSBub3cgaGFuZGxlcyBpbmZpbml0ZSBsb29wcyBpbiBzeW1saW5rcyBieQotICByZXR1cm5pbmcgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIHBhdGggdGhhdCB3YXMgbm90IHBhcnQgb2YgYW55IGxvb3AuICBUaGFua3MKLSAgQU0gS3VjaGxpbmcuCi0KLS0gQnVnICM5ODAzMjc6IG50cGF0aCBub3QgaGFuZGxlcyBjb21wcmVzc2luZyBlcnJvbmVvdXMgc2xhc2hlcyBiZXR3ZWVuIHRoZQotICBkcml2ZSBsZXR0ZXIgYW5kIHRoZSByZXN0IG9mIHRoZSBwYXRoLiAgQWxzbyBjbGVhcmx5IGhhbmRsZXMgVU5DIGFkZHJlc3NlcyBub3cKLSAgYXMgd2VsbC4gIFRoYW5rcyBQYXVsIE1vb3JlLgotCi0tIGJ1ZyAjNjc5OTUzOiB6aXBmaWxlLnB5IHNob3VsZCBub3cgd29yayBmb3IgZmlsZXMgb3ZlciAyIEdCLiAgVGhlIHBhY2tlZCBkYXRhCi0gIGZvciBmaWxlIHNpemVzIChjb21wcmVzc2VkIGFuZCB1bmNvbXByZXNzZWQpIHdhcyBiZWluZyBzdG9yZWQgYXMgc2lnbmVkCi0gIGluc3RlYWQgb2YgdW5zaWduZWQuCi0KLS0gZGVjaW1hbC5weSBub3cgb25seSB1c2VzIHNpZ25hbHMgaW4gdGhlIElCTSBzcGVjLiAgVGhlIG90aGVyIGNvbmRpdGlvbnMgYXJlCi0gIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLgotCi0tIGNvZGVjcyBtb2R1bGUgbm93IGhhcyB0d28gbmV3IGdlbmVyaWMgQVBJczogZW5jb2RlKCkgYW5kIGRlY29kZSgpCi0gIHdoaWNoIGRvbid0IHJlc3RyaWN0IHRoZSByZXR1cm4gdHlwZXMgKHVubGlrZSB0aGUgdW5pY29kZSBhbmQKLSAgc3RyaW5nIG1ldGhvZHMgb2YgdGhlIHNhbWUgbmFtZSkuCi0KLS0gTm9uLWJsb2NraW5nIFNTTCBzb2NrZXRzIHdvcmsgYWdhaW47IHRoZXkgd2VyZSBicm9rZW4gaW4gUHl0aG9uIDIuMy4KLSAgU0YgcGF0Y2ggOTQ1NjQyLgotCi0tIGRvY3Rlc3QgdW5pdHRlc3QgaW50ZWdyYXRpb24gaW1wcm92ZW1lbnRzOgotCi0gIG8gSW1wcm92ZWQgdGhlIHVuaXRlc3QgdGVzdCBvdXRwdXQgZm9yIGRvY3Rlc3QtYmFzZWQgdW5pdCB0ZXN0cwotCi0gIG8gQ2FuIG5vdyBwYXNzIHNldFVwIGFuZCB0ZWFyRG93biBmdW5jdGlvbnMgd2hlbiBjcmVhdGluZwotICAgIERvY1Rlc3RTdWl0ZXMuCi0KLS0gVGhlIHRocmVhZGluZyBtb2R1bGUgaGFzIGEgbmV3IGNsYXNzLCBsb2NhbCwgZm9yIGNyZWF0aW5nIG9iamVjdHMKLSAgdGhhdCBwcm92aWRlIHRocmVhZC1sb2NhbCBkYXRhLgotCi0tIEJ1ZyAjOTkwMzA3OiB3aGVuIGtlZXBfZW1wdHlfdmFsdWVzIGlzIFRydWUsIGNnaS5wYXJzZV9xc2woKQotICBubyBsb25nZXIgcmV0dXJucyBzcHVyaW91cyBlbXB0eSBmaWVsZHMuCi0KLS0gSW1wbGVtZW50ZWQgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKSBpbiBnZXR0ZXh0IG1vZHVsZS4KLQotLSBJbnRyb2R1Y2VkIGluIGdldHRleHQgbW9kdWxlIHRoZSBsKmdldHRleHQoKSBmYW1pbHkgb2YgZnVuY3Rpb25zLAotICB3aGljaCByZXR1cm4gdHJhbnNsYXRpb24gc3RyaW5ncyBlbmNvZGVkIGluIHRoZSBwcmVmZXJyZWQgZW5jb2RpbmcsCi0gIGFzIGluZm9ybWVkIGJ5IGxvY2FsZSBtb2R1bGUncyBnZXRwcmVmZXJyZWRlbmNvZGluZygpLgotCi0tIG9wdHBhcnNlIG1vZHVsZSAoYW5kIHRlc3RzKSB1cGdyYWRlZCB0byBPcHRpayAxLjVhMS4gIENoYW5nZXM6Ci0KLSAgLSBBZGQgZXhwYW5zaW9uIG9mIGRlZmF1bHQgdmFsdWVzIGluIGhlbHAgdGV4dDogdGhlIHN0cmluZwotICAgICIlZGVmYXVsdCIgaW4gYW4gb3B0aW9uJ3MgaGVscCBzdHJpbmcgaXMgZXhwYW5kZWQgdG8gc3RyKCkgb2YKLSAgICB0aGF0IG9wdGlvbidzIGRlZmF1bHQgdmFsdWUsIG9yICJub25lIiBpZiBubyBkZWZhdWx0IHZhbHVlLgotCi0gIC0gQnVnICM5NTU4ODk6IG9wdGlvbiBkZWZhdWx0IHZhbHVlcyB0aGF0IGhhcHBlbiB0byBiZSBzdHJpbmdzIGFyZQotICAgIG5vdyBwcm9jZXNzZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmU7IHRoaXMKLSAgICBhbGxvd3MgZ2VuZXJhdGlvbiBvZiBuaWNlciBoZWxwIHdoZW4gdXNpbmcgY3VzdG9tIHR5cGVzLiAgQ2FuCi0gICAgYmUgZGlzYWJsZWQgd2l0aCBwYXJzZXIuc2V0X3Byb2Nlc3NfZGVmYXVsdF92YWx1ZXMoRmFsc2UpLgotCi0gIC0gQnVnICM5NjA1MTU6IGRvbid0IGNyYXNoIHdoZW4gZ2VuZXJhdGluZyBoZWxwIGZvciBjYWxsYmFjawotICAgIG9wdGlvbnMgdGhhdCBzcGVjaWZ5ICd0eXBlJywgYnV0IG5vdCAnZGVzdCcgb3IgJ21ldGF2YXInLgotCi0gIC0gRmVhdHVyZSAjODE1MjY0OiBjaGFuZ2UgdGhlIGRlZmF1bHQgaGVscCBmb3JtYXQgZm9yIHNob3J0IG9wdGlvbnMKLSAgICB0aGF0IHRha2UgYW4gYXJndW1lbnQgZnJvbSBlLmcuICItb0FSRyIgdG8gIi1vIEFSRyI7IGFkZAotICAgIHNldF9zaG9ydF9vcHRfZGVsaW1pdGVyKCkgYW5kIHNldF9sb25nX29wdF9kZWxpbWl0ZXIoKSBtZXRob2RzIHRvCi0gICAgSGVscEZvcm1hdHRlciB0byBhbGxvdyAoc2xpZ2h0KSBjdXN0b21pemF0aW9uIG9mIHRoZSBmb3JtYXR0aW5nLgotCi0gIC0gUGF0Y2ggIzczNjk0MDogaW50ZXJuYXRpb25hbGl6ZSBPcHRpazogYWxsIGJ1aWx0LWluIHVzZXItCi0gICAgdGFyZ2V0ZWQgbGl0ZXJhbCBzdHJpbmdzIGFyZSBwYXNzZWQgdGhyb3VnaCBnZXR0ZXh0LmdldHRleHQoKS4gIChJZgotICAgIHlvdSB3YW50IHRyYW5zbGF0aW9ucyAoLnBvIGZpbGVzKSwgdGhleSdyZSBub3QgaW5jbHVkZWQgd2l0aCBQeXRob24KLSAgICAtLSB5b3UnbGwgZmluZCB0aGVtIGluIHRoZSBPcHRpayBzb3VyY2UgZGlzdHJpYnV0aW9uIGZyb20KLSAgICBodHRwOi8vb3B0aWsuc291cmNlZm9yZ2UubmV0LyAuKQotCi0gIC0gQnVnICM4Nzg0NTM6IHJlc3BlY3QgJENPTFVNTlMgZW52aXJvbm1lbnQgdmFyaWFibGUgZm9yCi0gICAgd3JhcHBpbmcgaGVscCBvdXRwdXQuCi0KLSAgLSBGZWF0dXJlICM5ODgxMjI6IGV4cGFuZCAiJXByb2ciIGluIHRoZSAnZGVzY3JpcHRpb24nIHBhc3NlZAotICAgIHRvIE9wdGlvblBhcnNlciwganVzdCBsaWtlIGluIHRoZSAndXNhZ2UnIGFuZCAndmVyc2lvbicgc3RyaW5ncy4KLSAgICAoVGhpcyBpcyAqbm90KiBkb25lIGluIHRoZSAnZGVzY3JpcHRpb24nIHBhc3NlZCB0byBPcHRpb25Hcm91cC4pCi0KLUMgQVBJCi0tLS0tLQotCi0tIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlKCkgYW5kIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoKTogIGlmIGFuCi0gIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBtb2R1bGUsIHRoZXNlIG5vdyBkZWxldGUgdGhlIG1vZHVsZSdzCi0gIGVudHJ5IGZyb20gc3lzLm1vZHVsZXMuICBBbGwgd2F5cyBvZiBsb2FkaW5nIG1vZHVsZXMgZXZlbnR1YWxseSBjYWxsCi0gIG9uZSBvZiB0aGVzZSwgc28gdGhpcyBpcyBhbiBlcnJvci1jYXNlIGNoYW5nZSBpbiBzZW1hbnRpY3MgZm9yIGFsbAotICB3YXlzIG9mIGxvYWRpbmcgbW9kdWxlcy4gIEluIHJhcmUgY2FzZXMsIGEgbW9kdWxlIGxvYWRlciBtYXkgd2lzaAotICB0byBrZWVwIGEgbW9kdWxlIG9iamVjdCBpbiBzeXMubW9kdWxlcyBkZXNwaXRlIHRoYXQgdGhlIG1vZHVsZSdzCi0gIGNvZGUgY2Fubm90IGJlIGV4ZWN1dGVkLiAgSW4gc3VjaCBjYXNlcywgdGhlIG1vZHVsZSBsb2FkZXIgbXVzdAotICBhcnJhbmdlIHRvIHJlaW5zZXJ0IHRoZSBuYW1lIGFuZCBtb2R1bGUgb2JqZWN0IGluIHN5cy5tb2R1bGVzLgotICBQeUltcG9ydF9SZWxvYWRNb2R1bGUoKSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJlaW5zZXJ0IHRoZSBvcmlnaW5hbAotICBtb2R1bGUgb2JqZWN0IGludG8gc3lzLm1vZHVsZXMgaWYgdGhlIG1vZHVsZSByZWxvYWQgZmFpbHMsIHNvIHRoYXQKLSAgaXRzIHZpc2libGUgc2VtYW50aWNzIGhhdmUgbm90IGNoYW5nZWQuCi0KLS0gQSBsYXJnZSBwaWxlIG9mIGRhdGV0aW1lIGZpZWxkLWV4dHJhY3Rpb24gbWFjcm9zIGlzIG5vdyBkb2N1bWVudGVkLAotICB0aGFua3MgdG8gQW50aG9ueSBUdWluaW5nYSAocGF0Y2ggIzk4NjAxMCkuCi0KLURvY3VtZW50YXRpb24KLS0tLS0tLS0tLS0tLS0KLQotLSBJbXByb3ZlZCB0aGUgdHV0b3JpYWwgb24gY3JlYXRpbmcgdHlwZXMgaW4gQy4KLQotICAtIHBvaW50IG91dCB0aGUgaW1wb3J0YW5jZSBvZiByZWFzc2lnbmluZyBkYXRhIG1lbWJlcnMgYmVmb3JlCi0gICAgYXNzaWduaW5nIHRoZWlyIHZhbHVlcwotCi0gIC0gY29ycmVjdCBteSBtaXNjb25jZXB0aW9uIGFib3V0IHJldHVybiB2YWx1ZXMgZnJvbSB2aXNpdHByb2NzLiBTaWdoLgotCi0gIC0gbWVudGlvbiB0aGUgbGFib3Igc2F2aW5nIFB5X1ZJU0lUIGFuZCBQeV9DTEVBUiBtYWNyb3MuCi0KLS0gTWFqb3IgcmV3cml0ZSBvZiB0aGUgbWF0aCBtb2R1bGUgZG9jcywgdG8gYWRkcmVzcyBjb21tb24gY29uZnVzaW9ucy4KLQotVGVzdHMKLS0tLS0tCi0KLS0gVGhlIHRlc3QgZGF0YSBmaWxlcyBmb3IgdGhlIGRlY2ltYWwgdGVzdCBzdWl0ZSBhcmUgbm93IGluc3RhbGxlZCBvbgotICBwbGF0Zm9ybXMgdGhhdCB1c2UgdGhlIE1ha2VmaWxlLgotCi0tIFNGIHBhdGNoIDk5NTIyNTogIFRoZSB0ZXN0IGZpbGUgdGVzdHRhci50YXIgYWNjaWRlbnRhbGx5IGNvbnRhaW5lZAotICBDVlMga2V5d29yZHMgKGxpa2UgJElkJCksIHdoaWNoIGNvdWxkIGNhdXNlIHNwdXJpb3VzIGZhaWx1cmVzIGluCi0gIHRlc3RfdGFyZmlsZS5weSBkZXBlbmRpbmcgb24gaG93IHRoZSB0ZXN0IGZpbGUgd2FzIGNoZWNrZWQgb3V0LgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDIuNCBhbHBoYSAxPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDA4LUpVTC0yMDA0KgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSB3ZWFrcmVmLnJlZiBpcyBub3cgdGhlIHR5cGUgb2JqZWN0IGFsc28ga25vd24gYXMKLSAgd2Vha3JlZi5SZWZlcmVuY2VUeXBlOyBpdCBjYW4gYmUgc3ViY2xhc3NlZCBsaWtlIGFueSBvdGhlciBuZXctc3R5bGUKLSAgY2xhc3MuICBUaGVyZSdzIGxlc3MgcGVyLWVudHJ5IG92ZXJoZWFkIGluIFdlYWtWYWx1ZURpY3Rpb25hcnkKLSAgb2JqZWN0cyBub3cgKG9uZSBvYmplY3QgaW5zdGVhZCBvZiB0aHJlZSkuCi0KLS0gQnVnICM5NTE4NTE6IFB5dGhvbiBjcmFzaGVkIHdoZW4gcmVhZGluZyBpbXBvcnQgdGFibGUgb2YgY2VydGFpbgotICBXaW5kb3dzIERMTHMuCi0KLS0gQnVnICMyMTUxMjYuICBUaGUgbG9jYWxzIGFyZ3VtZW50IHRvIGV2YWwoKSwgZXhlY2ZpbGUoKSwgYW5kIGV4ZWMgbm93Ci0gIGFjY2VwdCBhbnkgbWFwcGluZyB0eXBlLgotCi0tIG1hcnNoYWwgbm93IHNoYXJlcyBpbnRlcm5lZCBzdHJpbmdzLiBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzCi0gIGEgbmV3IC5weWMgbWFnaWMuCi0KLS0gQnVnICM5NjY2MjMuIGNsYXNzZXMgY3JlYXRlZCB3aXRoIHR5cGUoKSBpbiBhbiBleGVjKCwge30pIGRvbid0Ci0gIGhhdmUgYSBfX21vZHVsZV9fLCBidXQgY29kZSBpbiB0eXBlb2JqZWN0IGFzc3VtZWQgaXQgd291bGQgYWx3YXlzCi0gIGJlIHRoZXJlLgotCi0tIFB5dGhvbiBubyBsb25nZXIgcmVsaWVzIG9uIHRoZSBMQ19OVU1FUklDIGxvY2FsZSBzZXR0aW5nIHRvIGJlCi0gIHRoZSAiQyIgbG9jYWxlOyBhcyBhIHJlc3VsdCwgaXQgbm8gbG9uZ2VyIHRyaWVzIHRvIHByZXZlbnQgY2hhbmdpbmcKLSAgdGhlIExDX05VTUVSSUMgY2F0ZWdvcnkuCi0KLS0gQnVnICM5NTI4MDc6ICBVbnBpY2tsaW5nIHBpY2tsZWQgaW5zdGFuY2VzIG9mIHN1YmNsYXNzZXMgb2YKLSAgZGF0ZXRpbWUuZGF0ZSwgZGF0ZXRpbWUuZGF0ZXRpbWUgYW5kIGRhdGV0aW1lLnRpbWUgY291bGQgeWllbGQgaW5zYW5lCi0gIG9iamVjdHMuICBUaGFua3MgdG8gSml3b24gU2VvIGZvciBhIGZpeC4KLQotLSBCdWcgIzg0NTgwMjogUHl0aG9uIGNyYXNoZXMgd2hlbiBfX2luaXRfXy5weSBpcyBhIGRpcmVjdG9yeS4KLQotLSBVbmljb2RlIG9iamVjdHMgcmVjZWl2ZWQgdHdvIG5ldyBtZXRob2RzOiBpc3dpZGUoKSBhbmQgd2lkdGgoKS4KLSAgVGhlc2UgcXVlcnkgRWFzdCBBc2lhbiB3aWR0aCBpbmZvcm1hdGlvbiwgYXMgc3BlY2lmaWVkIGluIFVuaWNvZGUKLSAgVFIxMS4KLQotLSBJbXByb3ZlZCB0aGUgdHVwbGUgaGFzaGluZyBhbGdvcml0aG0gdG8gZ2l2ZSBmZXdlciBjb2xsaXNpb25zIGluCi0gIGNvbW1vbiBjYXNlcy4gIEZpeGVzIGJ1ZyAgIzk0Mjk1Mi4KLQotLSBJbXBsZW1lbnRlZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgKFBFUCAyODkpLiAgQ29kZWQgYnkgSml3b24gU2VvLgotCi0tIEVuYWJsZWQgdGhlIHByb2ZpbGluZyBvZiBDIGV4dGVuc2lvbiBmdW5jdGlvbnMgKGFuZCBidWlsdGlucykgLSBjaGVjawotICBuZXcgZG9jdW1lbnRhdGlvbiBhbmQgbW9kaWZpZWQgcHJvZmlsZSBhbmQgYmRiIG1vZHVsZXMgZm9yIG1vcmUgZGV0YWlscwotCi0tIFNldCBmaWxlLm5hbWUgdG8gdGhlIG9iamVjdCBwYXNzZWQgdG8gb3BlbiAoaW5zdGVhZCBvZiBhIG5ldyBzdHJpbmcpCi0KLS0gTW92ZWQgdHJhY2ViYWNrb2JqZWN0IGludG8gdHJhY2ViYWNrLmggYW5kIHJlbmFtZWQgdG8gUHlUcmFjZWJhY2tPYmplY3QKLQotLSBPcHRpbWl6ZWQgdGhlIGJ5dGUgY29kaW5nIGZvciBtdWx0aXBsZSBhc3NpZ25tZW50cyBsaWtlICJhLGI9YixhIiBhbmQKLSAgImEsYixjPTEsMiwzIi4gIEltcHJvdmVzIHRoZWlyIHNwZWVkIGJ5IDI1JSB0byAzMCUuCi0KLS0gTGltaXQgdGhlIG5lc3RlZCBkZXB0aCBvZiBhIHR1cGxlIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGlzaW5zdGFuY2UoKQotICBhbmQgaXNzdWJjbGFzcygpIHRvIHRoZSByZWN1cnNpb24gbGltaXQgb2YgdGhlIGludGVycHJldGVyLgotICBGaXhlcyBidWcgICM4NTgwMTYgLgotCi0tIE9wdGltaXplZCBkaWN0IGl0ZXJhdG9ycywgY3JlYXRpbmcgc2VwYXJhdGUgdHlwZXMgZm9yIGVhY2gKLSAgYW5kIGhhdmluZyB0aGVtIHJldmVhbCB0aGVpciBsZW5ndGguICBBbHNvIG9wdGltaXplZCB0aGUKLSAgbWV0aG9kczogIGtleXMoKSwgdmFsdWVzKCksIGFuZCBpdGVtcygpLgotCi0tIEltcGxlbWVudGVkIGEgbmV3Y29kZSBvcGNvZGUsIExJU1RfQVBQRU5ELCB0aGF0IHNpbXBsaWZpZXMKLSAgdGhlIGdlbmVyYXRlZCBieXRlY29kZSBmb3IgbGlzdCBjb21wcmVoZW5zaW9ucyBhbmQgZnVydGhlcgotICBpbXByb3ZlcyB0aGVpciBwZXJmb3JtYW5jZSAoYWJvdXQgMzUlKS4KLQotLSBJbXBsZW1lbnRlZCByaWNoIGNvbXBhcmlzb25zIGZvciBmbG9hdHMsIHdoaWNoIHNlZW1zIHRvIG1ha2UKLSAgY29tcGFyaXNvbnMgaW52b2x2aW5nIE5hTnMgc29tZXdoYXQgbGVzcyBzdXJwcmlzaW5nIHdoZW4gdGhlCi0gIHVuZGVybHlpbmcgQyBjb21waWxlciBhY3R1YWxseSBpbXBsZW1lbnRzIEM5OSBzZW1hbnRpY3MuCi0KLS0gT3B0aW1pemVkIGxpc3QuZXh0ZW5kKCkgdG8gc2F2ZSBtZW1vcnkgYW5kIG5vIGxvbmdlciBjcmVhdGUKLSAgaW50ZXJtZWRpYXRlIHNlcXVlbmNlcy4gIEFsc28sIGV4dGVuZCgpIG5vdyBwcmUtYWxsb2NhdGVzIHRoZQotICBuZWVkZWQgbWVtb3J5IHdoZW5ldmVyIHRoZSBsZW5ndGggb2YgdGhlIGl0ZXJhYmxlIGlzIGtub3duIGluCi0gIGFkdmFuY2UgLS0gdGhpcyBoYWx2ZXMgdGhlIHRpbWUgdG8gZXh0ZW5kIHRoZSBsaXN0LgotCi0tIE9wdGltaXplZCBsaXN0IHJlc2l6ZSBvcGVyYXRpb25zIHRvIG1ha2UgZmV3ZXIgY2FsbHMgdG8gdGhlIHN5c3RlbQotICByZWFsbG9jKCkuICBTaWduaWZpY2FudGx5IHNwZWVkcyB1cCBsaXN0IGFwcGVuZHMsIGxpc3QgcG9wcywKLSAgbGlzdCBjb21wcmVoZW5zaW9ucywgYW5kIHRoZSBsaXN0IGNvbnN0cnVjdG9yICh3aGVuIHRoZSBpbnB1dCBpdGVyYWJsZQotICBsZW5ndGggaXMgbm90IGtub3duKS4KLQotLSBDaGFuZ2VkIHRoZSBpbnRlcm5hbCBsaXN0IG92ZXItYWxsb2NhdGlvbiBzY2hlbWUuICBGb3IgbGFyZ2VyIGxpc3RzLAotICBvdmVyYWxsb2NhdGlvbiByYW5nZWQgYmV0d2VlbiAzJSBhbmQgMjUlLiAgTm93LCBpdCBpcyBhIGNvbnN0YW50IDEyJS4KLSAgRm9yIHNtYWxsZXIgbGlzdHMgKG48OCksIG92ZXJhbGxvY2F0aW9uIHdhcyB1cHRvIGVpZ2h0IGVsZW1lbnRzLiAgTm93LAotICB0aGUgb3ZlcmFsbG9jYXRpb24gaXMgbm8gbW9yZSB0aGFuIHRocmVlIGVsZW1lbnRzIC0tIHRoaXMgaW1wcm92ZXMgc3BhY2UKLSAgdXRpbGl6YXRpb24gZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGhhdmUgbGFyZ2UgbnVtYmVycyBvZiBzbWFsbCBsaXN0cy4KLQotLSBNb3N0IGxpc3QgYm9kaWVzIG5vdyBnZXQgcmUtdXNlZCByYXRoZXIgdGhhbiBmcmVlZC4gIFNwZWVkcyB1cCBsaXN0Ci0gIGluc3RhbnRpYXRpb24gYW5kIGRlbGV0aW9uIGJ5IHNhdmluZyBjYWxscyB0byBtYWxsb2MoKSBhbmQgZnJlZSgpLgotCi0tIFRoZSBkaWN0LnVwZGF0ZSgpIG1ldGhvZCBub3cgYWNjZXB0cyBhbGwgdGhlIHNhbWUgYXJndW1lbnQgZm9ybXMKLSAgYXMgdGhlIGRpY3QoKSBjb25zdHJ1Y3Rvci4gIFRoaXMgbm93IGluY2x1ZGVzIGl0ZW0gbGlzdHMgYW5kL29yCi0gIGtleXdvcmQgYXJndW1lbnRzLgotCi0tIFN1cHBvcnQgZm9yIGFyYml0cmFyeSBvYmplY3RzIHN1cHBvcnRpbmcgdGhlIHJlYWQtb25seSBidWZmZXIKLSAgaW50ZXJmYWNlIGFzIHRoZSBjb19jb2RlIGZpZWxkIG9mIGNvZGUgb2JqZWN0cyAoc29tZXRoaW5nIHRoYXQgd2FzCi0gIG9ubHkgcG9zc2libGUgdG8gY3JlYXRlIGZyb20gQyBjb2RlKSBoYXMgYmVlbiByZW1vdmVkLgotCi0tIE1hZGUgb21pdHRlZCBjYWxsYmFjayBhbmQgTm9uZSBlcXVpdmFsZW50IGZvciB3ZWFrcmVmLnJlZigpIGFuZAotICB3ZWFrcmVmLnByb3h5KCk7IHRoZSBOb25lIGNhc2Ugd2Fzbid0IGhhbmRsZWQgY29ycmVjdGx5IGluIGFsbAotICBjYXNlcy4KLQotLSBGaXhlZCBwcm9ibGVtIHdoZXJlIFB5V2Vha3JlZl9OZXdSZWYoKSBhbmQgUHlXZWFrcmVmX05ld1Byb3h5KCkKLSAgYXNzdW1lZCB0aGF0IGluaXRpYWwgZXhpc3RpbmcgZW50cmllcyBpbiBhbiBvYmplY3QncyB3ZWFrcmVmIGxpc3QKLSAgd291bGQgbm90IGJlIHJlbW92ZWQgd2hpbGUgYWxsb2NhdGluZyBhIG5ldyB3ZWFrcmVmIG9iamVjdC4gIFNpbmNlCi0gIEdDIGNvdWxkIGJlIGludm9rZWQgYXQgdGhhdCB0aW1lLCBob3dldmVyLCB0aGF0IGFzc3VtcHRpb24gd2FzCi0gIGludmFsaWQuICBJbiBhIHRydWx5IG9ic2N1cmUgY2FzZSBvZiBHQyBiZWluZyB0cmlnZ2VyZWQgZHVyaW5nCi0gIGNyZWF0aW9uIGZvciBhIG5ldyB3ZWFrcmVmIG9iamVjdCBmb3IgYW4gcmVmZXJlbnQgd2hpY2ggYWxyZWFkeQotICBoYXMgYSB3ZWFrcmVmIHdpdGhvdXQgYSBjYWxsYmFjayB3aGljaCBpcyBvbmx5IHJlZmVyZW5jZWQgZnJvbQotICBjeWNsaWMgdHJhc2gsIGEgbWVtb3J5IGVycm9yIGNhbiBvY2N1ci4gIFRoaXMgY29uc2lzdGVudGx5IGNyZWF0ZWQgYQotICBzZWdmYXVsdCBpbiBhIGRlYnVnIGJ1aWxkLCBidXQgcHJvdmlkZWQgbGVzcyBwcmVkaWN0YWJsZSBiZWhhdmlvciBpbgotICBhIHJlbGVhc2UgYnVpbGQuCi0KLS0gaW5wdXQoKSBidWlsdGluIGZ1bmN0aW9uIG5vdyByZXNwZWN0cyBjb21waWxlciBmbGFncyBzdWNoIGFzCi0gIF9fZnV0dXJlX18gc3RhdGVtZW50cy4gIFNGIHBhdGNoIDg3NjE3OC4KLQotLSBSZW1vdmVkIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgZnJvbSBhcHBseSgpLiAgYXBwbHkoKSByZW1haW5zCi0gIGRlcHJlY2F0ZWQsIGJ1dCB0aGUgbnVpc2FuY2Ugd2FybmluZyB3aWxsIG5vdCBiZSBpc3N1ZWQuCi0KLS0gQXQgUHl0aG9uIHNodXRkb3duIHRpbWUgKFB5X0ZpbmFsaXplKCkpLCAyLjMgY2FsbGVkIGN5Y2xpYyBnYXJiYWdlCi0gIGNvbGxlY3Rpb24gdHdpY2UsIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0ZWFyaW5nIGRvd24gbW9kdWxlcy4gIFRoZQotICBjYWxsIGFmdGVyIHRlYXJpbmcgZG93biBtb2R1bGVzIGhhcyBiZWVuIGRpc2FibGVkLCBiZWNhdXNlIHRvbyBtdWNoCi0gIG9mIFB5dGhvbiBoYXMgYmVlbiB0b3JuIGRvd24gdGhlbiBmb3IgX19kZWxfXyBtZXRob2RzIGFuZCB3ZWFrcmVmCi0gIGNhbGxiYWNrcyB0byBleGVjdXRlIHNhbmVseS4gIFRoZSBtb3N0IGNvbW1vbiBzeW1wdG9tIHdhcyBhIHNlcXVlbmNlCi0gIG9mIHVuaW5mb3JtYXRpdmUgbWVzc2FnZXMgb24gc3RkZXJyIHdoZW4gUHl0aG9uIHNodXQgZG93biwgcHJvZHVjZWQKLSAgYnkgdGhyZWFkcyB0cnlpbmcgdG8gcmFpc2UgZXhjZXB0aW9ucywgYnV0IHVuYWJsZSB0byByZXBvcnQgdGhlIG5hdHVyZQotICBvZiB0aGVpciBwcm9ibGVtcyBiZWNhdXNlIHRvbyBtdWNoIG9mIHRoZSBzeXMgbW9kdWxlIGhhZCBhbHJlYWR5IGJlZW4KLSAgZGVzdHJveWVkLgotCi0tIFJlbW92ZWQgRnV0dXJlV2FybmluZ3MgcmVsYXRlZCB0byBoZXgvb2N0IGxpdGVyYWxzIGFuZCBjb252ZXJzaW9ucwotICBhbmQgbGVmdCBzaGlmdHMuICAoVGhhbmtzIHRvIEthbGxlIFN2ZW5zc29uIGZvciBTRiBwYXRjaCA4NDkyMjcuKQotICBUaGlzIGFkZHJlc3NlcyBtb3N0IG9mIHRoZSByZW1haW5pbmcgc2VtYW50aWMgY2hhbmdlcyBwcm9taXNlZCBieQotICBQRVAgMjM3LCBleGNlcHQgZm9yIHJlcHIoKSBvZiBhIGxvbmcsIHdoaWNoIHN0aWxsIHNob3dzIHRoZSB0cmFpbGluZwotICAnTCcuICBUaGUgUEVQIGFwcGVhcnMgdG8gcHJvbWlzZSB3YXJuaW5ncyBmb3Igb3BlcmF0aW9ucyB0aGF0Ci0gIGNoYW5nZWQgc2VtYW50aWNzIGNvbXBhcmVkIHRvIFB5dGhvbiAyLjMsIGJ1dCB0aGlzIGlzIG5vdAotICBpbXBsZW1lbnRlZDsgd2UndmUgc3VmZmVyZWQgdGhyb3VnaCBlbm91Z2ggd2FybmluZ3MgcmVsYXRlZCB0bwotICBoZXgvb2N0IGxpdGVyYWxzIGFuZCBJIHRoaW5rIGl0J3MgYmVzdCB0byBiZSBzaWxlbnQgbm93LgotCi0tIEZvciBzdHIgYW5kIHVuaWNvZGUgb2JqZWN0cywgdGhlIGxqdXN0KCksIGNlbnRlcigpLCBhbmQgcmp1c3QoKQotICBtZXRob2RzIG5vdyBhY2NlcHQgYW4gb3B0aW9uYWwgYXJndW1lbnQgc3BlY2lmeWluZyBhIGZpbGwKLSAgY2hhcmFjdGVyIG90aGVyIHRoYW4gYSBzcGFjZS4KLQotLSBXaGVuIG1ldGhvZCBvYmplY3RzIGhhdmUgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHNhdGlzZmllZCBlaXRoZXIKLSAgYnkgdGhlIGZ1bmN0aW9uIG9iamVjdCBvciBieSB0aGUgbWV0aG9kIG9iamVjdCwgdGhlIGZ1bmN0aW9uCi0gIG9iamVjdCdzIGF0dHJpYnV0ZSB1c3VhbGx5IHdpbnMuICBDaHJpc3RpYW4gVGlzbWVyIHBvaW50ZWQgb3V0IHRoYXQKLSAgdGhhdCB0aGlzIGlzIHJlYWxseSBhIG1pc3Rha2UsIGJlY2F1c2UgdGhpcyBvbmx5IGhhcHBlbnMgZm9yIHNwZWNpYWwKLSAgbWV0aG9kcyAobGlrZSBfX3JlZHVjZV9fKSB3aGVyZSB0aGUgbWV0aG9kIG9iamVjdCdzIHZlcnNpb24gaXMKLSAgcmVhbGx5IG1vcmUgYXBwcm9wcmlhdGUgdGhhbiB0aGUgZnVuY3Rpb24ncyBhdHRyaWJ1dGUuICBTbyBmcm9tIG5vdwotICBvbiwgYWxsIG1ldGhvZCBhdHRyaWJ1dGVzIHdpbGwgaGF2ZSBwcmVjZWRlbmNlIG92ZXIgZnVuY3Rpb24KLSAgYXR0cmlidXRlcyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0KLS0gQ3JpdGljYWwgYnVnZml4LCBmb3IgU0YgYnVnIDgzOTU0ODogIGlmIGEgd2Vha3JlZiB3aXRoIGEgY2FsbGJhY2ssCi0gIGl0cyBjYWxsYmFjaywgYW5kIGl0cyB3ZWFrbHkgcmVmZXJlbmNlZCBvYmplY3QsIGFsbCBiZWNhbWUgcGFydCBvZgotICBjeWNsaWMgZ2FyYmFnZSBkdXJpbmcgYSBzaW5nbGUgcnVuIG9mIGdhcmJhZ2UgY29sbGVjdGlvbiwgdGhlIG9yZGVyCi0gIGluIHdoaWNoIHRoZXkgd2VyZSB0b3JuIGRvd24gd2FzIHVucHJlZGljdGFibGUuICBJdCB3YXMgcG9zc2libGUgZm9yCi0gIHRoZSBjYWxsYmFjayB0byBzZWUgcGFydGlhbGx5LXRvcm4tZG93biBvYmplY3RzLCBsZWFkaW5nIHRvIGltbWVkaWF0ZQotICBzZWdmYXVsdHMsIG9yLCBpZiB0aGUgY2FsbGJhY2sgcmVzdXJyZWN0ZWQgZ2FyYmFnZSBvYmplY3RzLCB0bwotICByZXN1cnJlY3QgaW5zYW5lIG9iamVjdHMgdGhhdCBjYXVzZWQgc2VnZmF1bHRzIChvciBvdGhlciBzdXJwcmlzZXMpCi0gIGxhdGVyLiAgSW4gb25lIHNlbnNlIHRoaXMgd2Fzbid0IHN1cnByaXNpbmcsIGJlY2F1c2UgUHl0aG9uJ3MgY3ljbGljIGdjCi0gIGhhZCBubyBrbm93bGVkZ2Ugb2YgUHl0aG9uJ3Mgd2Vha3JlZiBvYmplY3RzLiAgSXQgZG9lcyBub3cuICBXaGVuCi0gIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzIGJlY29tZSBwYXJ0IG9mIGN5Y2xpYyBnYXJiYWdlIG5vdywgdGhvc2UKLSAgd2Vha3JlZnMgYXJlIGNsZWFyZWQgZmlyc3QuICBUaGUgY2FsbGJhY2tzIGRvbid0IHRyaWdnZXIgdGhlbiwKLSAgcHJldmVudGluZyB0aGUgcHJvYmxlbXMuICBJZiB5b3UgbmVlZCBjYWxsYmFja3MgdG8gdHJpZ2dlciwgdGhlbiBqdXN0Ci0gIGFzIHdoZW4gY3ljbGljIGdjIGlzIG5vdCBpbnZvbHZlZCwgeW91IG5lZWQgdG8gd3JpdGUgeW91ciBjb2RlIHNvCi0gIHRoYXQgd2Vha3JlZiBvYmplY3RzIG91dGxpdmUgdGhlIG9iamVjdHMgdGhleSB3ZWFrbHkgcmVmZXJlbmNlLgotCi0tIENyaXRpY2FsIGJ1Z2ZpeCwgZm9yIFNGIGJ1ZyA4NDA4Mjk6ICBpZiBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0aW9uCi0gIGhhcHBlbmVkIHRvIG9jY3VyIGR1cmluZyBhIHdlYWtyZWYgY2FsbGJhY2sgZm9yIGEgbmV3LXN0eWxlIGNsYXNzCi0gIGluc3RhbmNlLCBzdWJ0bGUgbWVtb3J5IGNvcnJ1cHRpb24gd2FzIHRoZSByZXN1bHQgKGluIGEgcmVsZWFzZSBidWlsZDsKLSAgaW4gYSBkZWJ1ZyBidWlsZCwgYSBzZWdmYXVsdCBvY2N1cnJlZCByZWxpYWJseSB2ZXJ5IHNvb24gYWZ0ZXIpLgotICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLgotCi0tIENvbXBpbGVyIGZsYWdzIHNldCBpbiBQWVRIT05TVEFSVFVQIGFyZSBub3cgYWN0aXZlIGluIF9fbWFpbl9fLgotCi0tIEFkZGVkIHR3byBidWlsdGluIHR5cGVzLCBzZXQoKSBhbmQgZnJvemVuc2V0KCkuCi0KLS0gQWRkZWQgYSByZXZlcnNlZCgpIGJ1aWx0aW4gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcmV2ZXJzZSBpdGVyYXRvcgotICBvdmVyIGEgc2VxdWVuY2UuCi0KLS0gQWRkZWQgYSBzb3J0ZWQoKSBidWlsdGluIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBzb3J0ZWQgbGlzdAotICBmcm9tIGFueSBpdGVyYWJsZS4KLQotLSBDT2JqZWN0cyBhcmUgbm93IG11dGFibGUgKG9uIHRoZSBDIGxldmVsKSB0aHJvdWdoIFB5Q09iamVjdF9TZXRWb2lkUHRyLgotCi0tIGxpc3Quc29ydCgpIG5vdyBzdXBwb3J0cyB0aHJlZSBrZXl3b3JkIGFyZ3VtZW50czogIGNtcCwga2V5LCBhbmQgcmV2ZXJzZS4KLSAgVGhlIGtleSBhcmd1bWVudCBjYW4gYmUgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBleHRyYWN0cyBhCi0gIGNvbXBhcmlzb24ga2V5IGZyb20gdGhlIG9yaWdpbmFsIHJlY29yZDogIG15bGlzdC5zb3J0KGtleT1zdHIubG93ZXIpLgotICBUaGUgcmV2ZXJzZSBhcmd1bWVudCBpcyBhIGJvb2xlYW4gdmFsdWUgYW5kIGlmIFRydWUgd2lsbCBjaGFuZ2UgdGhlCi0gIHNvcnQgb3JkZXIgYXMgaWYgdGhlIGNvbXBhcmlzb24gYXJndW1lbnRzIHdlcmUgcmV2ZXJzZWQuICBJbiBhZGRpdGlvbiwKLSAgdGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gYW1lbmRlZCB0byBwcm92aWRlIGEgZ3VhcmFudGVlIHRoYXQgYWxsIHNvcnRzCi0gIHN0YXJ0aW5nIHdpdGggUHkyLjMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlICh0aGUgcmVsYXRpdmUgb3JkZXIgb2YKLSAgcmVjb3JkcyB3aXRoIGVxdWFsIGtleXMgaXMgdW5jaGFuZ2VkKS4KLQotLSBBZGRlZCB0ZXN0IHdoZXRoZXIgd2NoYXJfdCBpcyBzaWduZWQgb3Igbm90LiBBIHNpZ25lZCB3Y2hhcl90IGlzIG5vdAotICB1c2FibGUgYXMgaW50ZXJuYWwgdW5pY29kZSB0eXBlIGJhc2UgZm9yIFB5X1VOSUNPREUgc2luY2UgdGhlCi0gIHVuaWNvZGUgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBhbiB1bnNpZ25lZCB0eXBlLgotCi0tIEZpeGVkIGEgYnVnIGluIHRoZSBjYWNoZSBvZiBsZW5ndGgtb25lIFVuaWNvZGUgc3RyaW5ncyB0aGF0IGNvdWxkCi0gIGxlYWQgdG8gYSBzZWcgZmF1bHQuICBUaGUgc3BlY2lmaWMgcHJvYmxlbSBvY2N1cnJlZCB3aGVuIGFuIGVhcmxpZXIsCi0gIG5vbi1mYXRhbCBlcnJvciBsZWZ0IGFuIHVuaW5pdGlhbGl6ZWQgVW5pY29kZSBvYmplY3QgaW4gdGhlCi0gIGZyZWVsaXN0LgotCi0tIFRoZSAlIGZvcm1hdHRpbmcgb3BlcmF0b3Igbm93IHN1cHBvcnRzICclRicgd2hpY2ggaXMgZXF1aXZhbGVudCB0bwotICAnJWYnLiAgVGhpcyBoYXMgYWx3YXlzIGJlZW4gZG9jdW1lbnRlZCBidXQgbmV2ZXIgaW1wbGVtZW50ZWQuCi0KLS0gY29tcGxleChvYmopIGNvdWxkIGxlYWsgYSBsaXR0bGUgbWVtb3J5IGlmIG9iaiB3YXNuJ3QgYSBzdHJpbmcgb3IKLSAgbnVtYmVyLgotCi0tIHppcCgpIHdpdGggbm8gYXJndW1lbnRzIG5vdyByZXR1cm5zIGFuIGVtcHR5IGxpc3QgaW5zdGVhZCBvZiByYWlzaW5nCi0gIGEgVHlwZUVycm9yIGV4Y2VwdGlvbi4KLQotLSBvYmouX19jb250YWluc19fKCkgbm93IHJldHVybnMgVHJ1ZS9GYWxzZSBpbnN0ZWFkIG9mIDEvMC4gIFNGIHBhdGNoCi0gIDgyMDE5NS4KLQotLSBQeXRob24gbm8gbG9uZ2VyIHRyaWVzIHRvIGJlIHNtYXJ0IGFib3V0IHJlY3Vyc2l2ZSBjb21wYXJpc29ucy4KLSAgV2hlbiBjb21wYXJpbmcgY29udGFpbmVycyB3aXRoIGN5Y2xpYyByZWZlcmVuY2VzIHRvIHRoZW1zZWx2ZXMgaXQKLSAgd2lsbCBub3cganVzdCBoaXQgdGhlIHJlY3Vyc2lvbiBsaW1pdC4gIFNlZSBTRiBwYXRjaCA4MjU2MzkuCi0KLS0gc3RyIGFuZCB1bmljb2RlIGJ1aWx0aW4gdHlwZXMgbm93IGhhdmUgYW4gcnNwbGl0KCkgbWV0aG9kIHRoYXQgaXMKLSAgc2FtZSBhcyBzcGxpdCgpIGV4Y2VwdCB0aGF0IGl0IHNjYW5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgZW5kCi0gIHdvcmtpbmcgdG93YXJkcyB0aGUgYmVnaW5uaW5nLiAgU2VlIFNGIGZlYXR1cmUgcmVxdWVzdCA4MDE4NDcuCi0KLS0gRml4ZWQgYSBidWcgaW4gb2JqZWN0Ll9fcmVkdWNlX2V4X18gd2hlbiB1c2luZyBwcm90b2NvbCAyLiAgRmFpbHVyZQotICB0byBjbGVhciB0aGUgZXJyb3Igd2hlbiBhdHRlbXB0cyB0byBnZXQgdGhlIF9fZ2V0c3RhdGVfXyBhdHRyaWJ1dGUKLSAgZmFpbCBjYXVzZWQgaW50ZXJtaXR0ZW50IGVycm9ycyBhbmQgb2RkIGJlaGF2aW9yLgotCi0tIGJ1ZmZlciBvYmplY3RzIGJhc2VkIG9uIG90aGVyIG9iamVjdHMgbm8gbG9uZ2VyIGNhY2hlIGEgcG9pbnRlciB0bwotICB0aGUgZGF0YSBhbmQgdGhlIGRhdGEgbGVuZ3RoLiAgSW5zdGVhZCwgdGhlIGFwcHJvcHJpYXRlIHRwX2FzX2J1ZmZlcgotICBtZXRob2QgaXMgY2FsbGVkIGFzIG5lY2Vzc2FyeS4KLQotLSBmaXhlZDogaWYgYSBmaWxlIGlzIG9wZW5lZCB3aXRoIGFuIGV4cGxpY2l0IGJ1ZmZlciBzaXplID49IDEsIHJlcGVhdGVkCi0gIGNsb3NlKCkgY2FsbHMgd291bGQgYXR0ZW1wdCB0byBmcmVlKCkgdGhlIGJ1ZmZlciBhbHJlYWR5IGZyZWUoKWVkIG9uCi0gIHRoZSBmaXJzdCBjYWxsLgotCi0KLUV4dGVuc2lvbiBtb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIEFkZGVkIHNvY2tldC5nZXRzZXJ2Ynlwb3J0KCksIGFuZCBtYWtlIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4KLSAgZ2V0c2VydmJ5bmFtZSgpIGFuZCBnZXRzZXJ2Ynlwb3J0KCkgb3B0aW9uYWwuCi0KLS0gdGltZSBtb2R1bGUgY29kZSB0aGF0IGRlYWxzIHdpdGggaW5wdXQgUE9TSVggdGltZXN0YW1wcyB3aWxsIG5vdyByYWlzZQotICBWYWx1ZUVycm9yIGlmIG1vcmUgdGhhbiBhIHNlY29uZCBpcyBsb3N0IGluIHByZWNpc2lvbiB3aGVuIHRoZQotICB0aW1lc3RhbXAgaXMgY2FzdCB0byB0aGUgcGxhdGZvcm0gQyB0aW1lX3QgdHlwZS4gIFRoZXJlJ3Mgbm8gY2hhbmNlCi0gIHRoYXQgdGhlIHBsYXRmb3JtIHdpbGwgZG8gYW55dGhpbmcgc2Vuc2libGUgd2l0aCB0aGUgcmVzdWx0IGluIHN1Y2gKLSAgY2FzZXMuICBUaGlzIGluY2x1ZGVzIGN0aW1lKCksIGxvY2FsdGltZSgpIGFuZCBnbXRpbWUoKS4gIEFzc29ydGVkCi0gIGZyb210aW1lc3RhbXAoKSBhbmQgdXRjZnJvbXRpbWVzdGFtcCgpIG1ldGhvZHMgaW4gdGhlIGRhdGV0aW1lIG1vZHVsZQotICB3ZXJlIGFsc28gcHJvdGVjdGVkLiAgQ2xvc2VzIGJ1Z3MgIzkxOTAxMiBhbmQgOTc1OTk2LgotCi0tIGZjbnRsLmlvY3RsIG5vdyB3YXJucyBpZiB0aGUgbXV0YXRlIGZsYWcgaXMgbm90IHNwZWNpZmllZC4KLQotLSBudCBub3cgcHJvcGVybHkgYWxsb3dzIHRvIHJlZmVyIHRvIFVOQyByb290cywgZS5nLiBpbiBudC5zdGF0KCkuCi0KLS0gdGhlIHdlYWtyZWYgbW9kdWxlIG5vdyBzdXBwb3J0cyBhZGRpdGlvbmFsIG9iamVjdHM6ICBhcnJheS5hcnJheSwKLSAgc3JlLnBhdHRlcm5fb2JqZWN0cywgZmlsZSBvYmplY3RzLCBhbmQgc29ja2V0cy4KLQotLSBvcGVyYXRvci5pc01hcHBpbmdUeXBlKCkgYW5kIG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKCkgbm93IGdpdmUKLSAgZmV3ZXIgZmFsc2UgcG9zaXRpdmVzLgotCi0tIHNvY2tldC5zc2xlcnJvciBpcyBub3cgYSBzdWJjbGFzcyBvZiBzb2NrZXQuZXJyb3IgLiAgQWxzbyBhZGRlZAotICBzb2NrZXQuZXJyb3IgdG8gdGhlIHNvY2tldCBtb2R1bGUncyBDIEFQSS4KLQotLSBCdWcgIzkyMDU3NTogQSBwcm9ibGVtIHdoZXJlIHRoZSBfbG9jYWxlIG1vZHVsZSBzZWdmYXVsdHMgb24KLSAgbmxfbGFuZ2luZm8oRVJBKSBjYXVzZWQgYnkgR05VIGxpYmMncyBpbGxlZ2FsIE5VTEwgcmV0dXJuIGlzIGZpeGVkLgotCi0tIGFycmF5IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlIGNvcHkgbW9kdWxlLiAgQWxzbywgdGhlaXIgcmVzaXppbmcKLSAgc2NoZW1lIGhhcyBiZWVuIHVwZGF0ZWQgdG8gbWF0Y2ggdGhhdCB1c2VkIGZvciBsaXN0IG9iamVjdHMuICBUaGlzIGltcHJvdmVzCi0gIHRoZSBwZXJmb3JtYW5jZSAoc3BlZWQgYW5kIG1lbW9yeSB1c2FnZSkgb2YgYXBwZW5kKCkgb3BlcmF0aW9ucy4KLSAgQWxzbywgYXJyYXkuYXJyYXkoKSBhbmQgYXJyYXkuZXh0ZW5kKCkgbm93IGFjY2VwdCBhbnkgaXRlcmFibGUgYXJndW1lbnQKLSAgZm9yIHJlcGVhdGVkIGFwcGVuZHMgd2l0aG91dCBuZWVkaW5nIHRvIGNyZWF0ZSBhbm90aGVyIHRlbXBvcmFyeSBhcnJheS4KLQotLSBjU3RyaW5nSU8ud3JpdGVsaW5lcygpIG5vdyBhY2NlcHRzIGFueSBpdGVyYWJsZSBhcmd1bWVudCBhbmQgd3JpdGVzCi0gIHRoZSBsaW5lcyBvbmUgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGpvaW5pbmcgdGhlbSBhbmQgd3JpdGluZyBvbmNlLgotICBNYWRlIGEgcGFyYWxsZWwgY2hhbmdlIHRvIFN0cmluZ0lPLndyaXRlbGluZXMoKS4gIFNhdmVzIG1lbW9yeSBhbmQKLSAgbWFrZXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIGdlbmVyYXRvciBleHByZXNzaW9ucy4KLQotLSB0aW1lLnN0cmZ0aW1lKCkgbm93IGNoZWNrcyB0aGF0IHRoZSB2YWx1ZXMgaW4gaXRzIHRpbWUgdHVwbGUgYXJndW1lbnQKLSAgYXJlIHdpdGhpbiB0aGUgcHJvcGVyIGJvdW5kYXJpZXMgdG8gcHJldmVudCBwb3NzaWJsZSBjcmFzaGVzIGZyb20gdGhlCi0gIHBsYXRmb3JtJ3MgQyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIG9mIHN0cmZ0aW1lKCkuICBDYW4gcG9zc2libHkKLSAgYnJlYWsgY29kZSB0aGF0IHVzZXMgdmFsdWVzIG91dHNpZGUgdGhlIHJhbmdlIHRoYXQgZGlkbid0IGNhdXNlCi0gIHByb2JsZW1zIHByZXZpb3VzbHkgKHN1Y2ggYXMgc2l0dGluZyBkYXkgb2YgeWVhciB0byAwKS4gIEZpeGVzIGJ1ZwotICAjODk3NjI1LgotCi0tIFRoZSBzb2NrZXQgbW9kdWxlIG5vdyBzdXBwb3J0cyBCbHVldG9vdGggc29ja2V0cywgaWYgdGhlCi0gIHN5c3RlbSBoYXMgPGJsdWV0b290aC9ibHVldG9vdGguaD4KLQotLSBBZGRlZCBhIGNvbGxlY3Rpb25zIG1vZHVsZSBjb250YWluaW5nIGEgbmV3IGRhdGF0eXBlLCBkZXF1ZSgpLAotICBvZmZlcmluZyBoaWdoLXBlcmZvcm1hbmNlLCB0aHJlYWQtc2FmZSwgbWVtb3J5IGZyaWVuZGx5IGFwcGVuZHMKLSAgYW5kIHBvcHMgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGRlcXVlLgotCi0tIFNldmVyYWwgbW9kdWxlcyBub3cgdGFrZSBhZHZhbnRhZ2Ugb2YgY29sbGVjdGlvbnMuZGVxdWUoKSBmb3IKLSAgaW1wcm92ZWQgcGVyZm9ybWFuY2U6ICBRdWV1ZSwgbXV0ZXgsIHNobGV4LCB0aHJlYWRpbmcsIGFuZCBweWRvYy4KLQotLSBUaGUgb3BlcmF0b3IgbW9kdWxlIGhhcyB0d28gbmV3IGZ1bmN0aW9ucywgYXR0cmdldHRlcigpIGFuZAotICBpdGVtZ2V0dGVyKCkgd2hpY2ggYXJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmFzdCBkYXRhIGV4dHJhY3RvcgotICBmdW5jdGlvbnMgZm9yIG1hcCgpLCBsaXN0LnNvcnQoKSwgaXRlcnRvb2xzLmdyb3VwYnkoKSwgYW5kCi0gIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBhIGZ1bmN0aW9uIGFyZ3VtZW50LgotCi0tIHNvY2tldC5TSFVUX3tSRCxXUixSRFdSfSB3YXMgYWRkZWQuCi0KLS0gb3MuZ2V0c2lkIHdhcyBhZGRlZC4KLQotLSBUaGUgcHdkIG1vZHVsZSBpbmNvcnJlY3RseSBhZHZlcnRpc2VkIGl0cyBzdHJ1Y3QgdHlwZSBhcwotICBzdHJ1Y3RfcHdlbnQ7IHRoaXMgaGFzIGJlZW4gcmVuYW1lZCB0byBzdHJ1Y3RfcGFzc3dkLiAgKFRoZSBvbGQgbmFtZQotICBpcyBzdGlsbCBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LikKLQotLSBUaGUgeG1sLnBhcnNlcnMuZXhwYXQgbW9kdWxlIG5vdyBwcm92aWRlcyBFeHBhdCAxLjk1LjcuCi0KLS0gc29ja2V0LklQUFJPVE9fSVBWNiB3YXMgYWRkZWQuCi0KLS0gcmVhZGxpbmUuY2xlYXJfaGlzdG9yeSB3YXMgYWRkZWQuCi0KLS0gc2VsZWN0LnNlbGVjdCgpIG5vdyBhY2NlcHRzIHNlcXVlbmNlcyBmb3IgaXRzIGZpcnN0IHRocmVlIGFyZ3VtZW50cy4KLQotLSBjU3RyaW5nSU8gbm93IHN1cHBvcnRzIHRoZSBmLmNsb3NlZCBhdHRyaWJ1dGUuCi0KLS0gVGhlIHNpZ25hbCBtb2R1bGUgbm93IGV4cG9zZXMgU0lHUlRNSU4gYW5kIFNJR1JUTUFYIChpZiBhdmFpbGFibGUpLgotCi0tIGN1cnNlcyBtb2R1bGUgbm93IHN1cHBvcnRzIHVzZV9kZWZhdWx0X2NvbG9ycygpLiAgW3BhdGNoICM3MzkxMjRdCi0KLS0gQnVnICM4MTEwMjg6IG5jdXJzZXMuaCBicmVha2FnZSBvbiBGcmVlQlNEL01hY09TIFgKLQotLSBCdWcgIzgxNDYxMzogSU5FVF9BRERSU1RSTEVOIGZpeCBuZWVkZWQgZm9yIGFsbCBjb21waWxlcnMgb24gU0dJCi0KLS0gSW1wbGVtZW50ZWQgbm9uLXJlY3Vyc2l2ZSBTUkUgbWF0Y2hpbmcgc2NoZW1lICgjNzU3NjI0KS4KLQotLSBJbXBsZW1lbnRlZCAoPyhpZC9uYW1lKXllc3xubykgc3VwcG9ydCBpbiBTUkUgKCM1NzI5MzYpLgotCi0tIHJhbmRvbS5zZWVkKCkgd2l0aCBubyBhcmd1bWVudHMgb3IgTm9uZSB1c2VzIHRpbWUudGltZSgpIGFzIGEgZGVmYXVsdAotICBzZWVkLiAgTW9kaWZpZWQgdG8gbWF0Y2ggUHkyLjIgYmVoYXZpb3IgYW5kIHVzZSBmcmFjdGlvbmFsIHNlY29uZHMgc28KLSAgdGhhdCBzdWNjZXNzaXZlIHJ1bnMgYXJlIG1vcmUgbGlrZWx5IHRvIHByb2R1Y2UgZGlmZmVyZW50IHNlcXVlbmNlcy4KLQotLSByYW5kb20uUmFuZG9tIGhhcyBhIG5ldyBtZXRob2QsIGdldHJhbmRiaXRzKGspLCB3aGljaCByZXR1cm5zIGFuIGludAotICB3aXRoIGsgcmFuZG9tIGJpdHMuICBUaGlzIG1ldGhvZCBpcyBub3cgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgQVBJCi0gIGZvciB1c2VyIGRlZmluZWQgZ2VuZXJhdG9ycy4gIEFueSBnZW5lcmF0b3IgdGhhdCBkZWZpbmVzIGdlbnJhbmRiaXRzKCkKLSAgY2FuIG5vdyB1c2UgcmFuZHJhbmdlKCkgZm9yIHJhbmdlcyB3aXRoIGEgbGVuZ3RoID49IDIqKjUzLiAgRm9ybWVybHksCi0gIHJhbmRyYW5nZSB3b3VsZCByZXR1cm4gb25seSBldmVuIG51bWJlcnMgZm9yIHJhbmdlcyB0aGF0IGxhcmdlIChzZWUKLSAgU0YgYnVnICM4MTIyMDIpLiAgR2VuZXJhdG9ycyB0aGF0IGRvIG5vdCBkZWZpbmUgZ2VucmFuZGJpdHMoKSBub3cKLSAgaXNzdWUgYSB3YXJuaW5nIHdoZW4gcmFuZHJhbmdlKCkgaXMgY2FsbGVkIHdpdGggYSByYW5nZSB0aGF0IGxhcmdlLgotCi0tIGl0ZXJ0b29scyBoYXMgYSBuZXcgZnVuY3Rpb24sIGdyb3VwYnkoKSBmb3IgYWdncmVnYXRpbmcgaXRlcmFibGVzCi0gIGludG8gZ3JvdXBzIHNoYXJpbmcgdGhlIHNhbWUga2V5IChhcyBkZXRlcm1pbmVkIGJ5IGEga2V5IGZ1bmN0aW9uKS4KLSAgSXQgb2ZmZXJzIHNvbWUgb2YgZnVuY3Rpb25hbGl0eSBvZiBTUUwncyBncm91cGJ5IGtleXdvcmQgYW5kIG9mCi0gIHRoZSBVbml4IHVuaXEgZmlsdGVyLgotCi0tIGl0ZXJ0b29scyBub3cgaGFzIGEgbmV3IHRlZSgpIGZ1bmN0aW9uIHdoaWNoIHByb2R1Y2VzIHR3byBpbmRlcGVuZGVudAotICBpdGVyYXRvcnMgZnJvbSBhIHNpbmdsZSBpdGVyYWJsZS4KLQotLSBpdGVydG9vbHMuaXppcCgpIHdpdGggbm8gYXJndW1lbnRzIG5vdyByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhdG9yIGluc3RlYWQKLSAgb2YgcmFpc2luZyBhIFR5cGVFcnJvciBleGNlcHRpb24uCi0KLS0gRml4ZWQgIzg1MzA2MTogYWxsb3cgQloyQ29tcHJlc3Nvci5jb21wcmVzcygpIHRvIHJlY2VpdmUgYW4gZW1wdHkgc3RyaW5nCi0gIGFzIHBhcmFtZXRlci4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIEFkZGVkIGEgbmV3IG1vZHVsZTogY1Byb2ZpbGUsIGEgQyBwcm9maWxlciB3aXRoIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUKLSAgcHJvZmlsZSBtb2R1bGUuICBjUHJvZmlsZSBhdm9pZHMgc29tZSBvZiB0aGUgZHJhd2JhY2tzIG9mIHRoZSBob3RzaG90Ci0gIHByb2ZpbGVyIGFuZCBwcm92aWRlcyBhIGJpdCBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlIG90aGVyIHR3byBwcm9maWxlcnMuCi0gIEJhc2VkIG9uICJsc3Byb2YiIChwYXRjaCAjMTIxMjgzNykuCi0KLS0gQnVnICMxMjY2MjgzOiBUaGUgbmV3IGZ1bmN0aW9uICJsZXhpc3RzIiBpcyBub3cgaW4gb3MucGF0aC5fX2FsbF9fLgotCi0tIEJ1ZyAjOTgxNTMwOiBGaXggVW5ib3VuZExvY2FsRXJyb3IgaW4gc2h1dGlsLnJtdHJlZSgpLiAgVGhpcyBhZmZlY3RzCi0gIHRoZSBkb2N1bWVudGVkIGJlaGF2aW9yOiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBvbmVycm9yKCkKLSAgaGFuZGxlciBjYW4gbm93IGFsc28gYmUgb3MubGlzdGRpci4KLQotLSBCdWcgIzc1NDQ0OTogdGhyZWFkaW5nLlRocmVhZCBvYmplY3RzIG5vIGxvbmdlciBtYXNrIGV4Y2VwdGlvbnMgcmFpc2VkIGR1cmluZwotICBpbnRlcnByZXRlciBzaHV0ZG93biB3aXRoIGFub3RoZXIgZXhjZXB0aW9uIGZyb20gYXR0ZW1wdGluZyB0byBoYW5kbGUgdGhlCi0gIG9yaWdpbmFsIGV4Y2VwdGlvbi4KLQotLSBBZGRlZCBkZWNpbWFsLnB5IHBlciBQRVAgMzI3LgotCi0tIEJ1ZyAjOTgxMjk5OiByc3luYyBpcyBub3cgYSByZWNvZ25pemVkIHByb3RvY29sIGluIHVybHBhcnNlIHRoYXQgdXNlcyBhCi0gICJuZXRsb2MiIHBvcnRpb24gb2YgYSBVUkwuCi0KLS0gQnVnICM5MTkwMTI6IHNodXRpbC5tb3ZlKCkgd2lsbCBub3QgdHJ5IHRvIG1vdmUgYSBkaXJlY3RvcnkgaW50byBpdHNlbGYuCi0gIFRoYW5rcyBKb2hhbm5lcyBHaWpzYmVycy4KLQotLSBCdWcgIzkzNDI4MjogcHlkb2Muc3RyaXBpZCgpIGlzIG5vdyBjYXNlLWluc2Vuc2l0aXZlLiAgVGhhbmtzIFJvYmluIEJlY2tlci4KLQotLSBCdWcgIzgyMzIwOTogIGNtYXRoLmxvZygpIG5vdyB0YWtlcyBhbiBvcHRpb25hbCBiYXNlIGFyZ3VtZW50IHNvIHRoYXQgaXRzCi0gIEFQSSBtYXRjaGVzIG1hdGgubG9nKCkuCi0KLS0gQnVnICM5NTczODE6IGRpc3R1dGlscyBiZGlzdF9ycG0gbm8gbG9uZ2VyIGZhaWxzIG9uIHJlY2VudCBSUE0gdmVyc2lvbnMKLSAgdGhhdCBnZW5lcmF0ZSBhIC1kZWJ1Z2luZm8ucnBtCi0KLS0gb3MucGF0aC5kZXZudWxsIGhhcyBiZWVuIGFkZGVkIGZvciBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4KLQotLSBGaXhlZCAjODc3MTY1OiBkaXN0dXRpbHMgbm93IHBpY2tzIHRoZSByaWdodCBDKysgY29tcGlsZXIgY29tbWFuZAotICBvbiBjeWd3aW4gYW5kIG1pbmd3MzIuCi0KLS0gdXJsbGliLnVybG9wZW4oKS5yZWFkbGluZSgpIG5vdyBoYW5kbGVzIEhUVFAvMC45IGNvcnJlY3RseS4KLQotLSByZWZhY3RvcmVkIHNpdGUucHkgaW50byBmdW5jdGlvbnMuICBBbHNvIHdyb3RlIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIHRoZQotICBtb2R1bGUuCi0KLS0gVGhlIGRpc3R1dGlscyBpbnN0YWxsIGNvbW1hbmQgbm93IHN1cHBvcnRzIHRoZSAtLWhvbWUgb3B0aW9uIGFuZAotICBpbnN0YWxsYXRpb24gc2NoZW1lIGZvciBhbGwgcGxhdGZvcm1zLgotCi0tIGFzeW5jb3JlLmxvb3Agbm93IGhhcyBhIHJlcGVhdCBjb3VudCBwYXJhbWV0ZXIgdGhhdCBkZWZhdWx0cyB0bwotICBsb29waW5nIGZvcmV2ZXIuCi0KLS0gVGhlIGRpc3R1dGlscyBzZGlzdCBjb21tYW5kIG5vdyBpZ25vcmVzIGFsbCAuc3ZuIGRpcmVjdG9yaWVzLCBpbgotICBhZGRpdGlvbiB0byBDVlMgYW5kIFJDUyBkaXJlY3Rvcmllcy4gIC5zdm4gZGlyZWN0b3JpZXMgaG9sZAotICBhZG1pbmlzdHJhdGl2ZSBmaWxlcyBmb3IgdGhlIFN1YnZlcnNpb24gc291cmNlIGNvbnRyb2wgc3lzdGVtLgotCi0tIEFkZGVkIGEgbmV3IG1vZHVsZTogY29va2llbGliLiAgQXV0b21hdGljIGNvb2tpZSBoYW5kbGluZyBmb3IgSFRUUAotICBjbGllbnRzLiAgQWxzbywgc3VwcG9ydCBmb3IgY29va2llbGliIGhhcyBiZWVuIGFkZGVkIHRvIHVybGxpYjIsIHNvCi0gIHVybGxpYjIudXJsb3BlbigpIGNhbiB0cmFuc3BhcmVudGx5IGhhbmRsZSBjb29raWVzLgotCi0tIHN0cmluZ3ByZXAucHkgbm93IHVzZXMgYnVpbHQtaW4gc2V0KCkgaW5zdGVhZCBvZiBzZXRzLlNldCgpLgotCi0tIEJ1ZyAjODc2Mjc4OiBVbmJvdW5kZWQgcmVjdXJzaW9uIGluIG1vZHVsZWZpbmRlcgotCi0tIEJ1ZyAjNzgwMzAwOiBTd2FwIHB1YmxpYyBhbmQgc3lzdGVtIElEIGluIExleGljYWxIYW5kbGVyLnN0YXJ0RFRELgotICBBcHBsaWNhdGlvbnMgcmVseWluZyBvbiB0aGUgd3Jvbmcgb3JkZXIgbmVlZCB0byBiZSBjb3JyZWN0ZWQuCi0KLS0gQnVnICM5MjYwNzU6IEZpeGVkIGEgYnVnIHRoYXQgcmV0dXJucyBhIHdyb25nIHBhdHRlcm4gb2JqZWN0Ci0gIGZvciBhIHN0cmluZyBvciB1bmljb2RlIG9iamVjdCBpbiBzcmUuY29tcGlsZSgpIHdoZW4gYSBkaWZmZXJlbnQKLSAgdHlwZSBwYXR0ZXJuIHdpdGggdGhlIHNhbWUgdmFsdWUgZXhpc3RzLgotCi0tIEFkZGVkIGNvdW50Y2FsbGVycyBhcmcgdG8gdHJhY2UuVHJhY2UgY2xhc3MgKC0tdHJhY2tjYWxscyBjb21tYW5kIGxpbmUgYXJnCi0gIHdoZW4gcnVuIGZyb20gdGhlIGNvbW1hbmQgcHJvbXB0KS4KLQotLSBGaXhlZCBhIGNhY2hpbmcgYnVnIGluIHBsYXRmb3JtLnBsYXRmb3JtKCkgd2hlcmUgdGhlIGFyZ3VtZW50IG9mICd0ZXJzZScgd2FzCi0gIG5vdCB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gd2hlbiBjYWNoaW5nIHZhbHVlLgotCi0tIEFkZGVkIHR3byBuZXcgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgcHJvZmlsZSAob3V0cHV0IGZpbGUgYW5kCi0gIGRlZmF1bHQgc29ydCkuCi0KLS0gQWRkZWQgZ2xvYmFsIHJ1bmN0eCBmdW5jdGlvbiB0byBwcm9maWxlIG1vZHVsZQotCi0tIEFkZCBobGlzdCBtaXNzaW5nIGVudHJ5Y29uZmlndXJlIGFuZCBlbnRyeWNnZXQgbWV0aG9kcy4KLQotLSBUaGUgcHRjcDE1NCBjb2RlYyB3YXMgYWRkZWQgZm9yIEthemFraCBjaGFyYWN0ZXIgc2V0IHN1cHBvcnQuCi0KLS0gU3VwcG9ydCBub24tYW5vbnltb3VzIGZ0cCBVUkxzIGluIHVybGxpYjIuCi0KLS0gVGhlIGVuY29kaW5ncyBwYWNrYWdlIHdpbGwgbm93IGFwcGx5IGNvZGVjIG5hbWUgYWxpYXNlcwotICBmaXJzdCBiZWZvcmUgc3RhcnRpbmcgdG8gdHJ5IHRoZSBpbXBvcnQgb2YgdGhlIGNvZGVjIG1vZHVsZS4KLSAgVGhpcyBzaW1wbGlmaWVzIG92ZXJyaWRpbmcgYnVpbHQtaW4gY29kZWNzIHdpdGggZXh0ZXJuYWwKLSAgcGFja2FnZXMsIGUuZy4gdGhlIGluY2x1ZGVkIENKSyBjb2RlY3Mgd2l0aCB0aGUgSmFwYW5lc2VDb2RlY3MKLSAgcGFja2FnZSwgYnkgYWRqdXN0aW5nIHRoZSBhbGlhc2VzIGRpY3Rpb25hcnkgaW4gZW5jb2RpbmdzLmFsaWFzZXMKLSAgYWNjb3JkaW5nbHkuCi0KLS0gYmFzZTY0IG5vdyBzdXBwb3J0cyBSRkMgMzU0OCBCYXNlMTYsIEJhc2UzMiwgYW5kIEJhc2U2NCBlbmNvZGluZyBhbmQKLSAgZGVjb2Rpbmcgc3RhbmRhcmRzLgotCi0tIHVybGxpYjIgbm93IHN1cHBvcnRzIHByb2Nlc3NvcnMuICBBIHByb2Nlc3NvciBpcyBhIGhhbmRsZXIgdGhhdAotICBpbXBsZW1lbnRzIGFuIHh4eF9yZXF1ZXN0IG9yIHh4eF9yZXNwb25zZSBtZXRob2QuICBUaGVzZSBtZXRob2RzIGFyZQotICBjYWxsZWQgZm9yIGFsbCByZXF1ZXN0cy4KLQotLSBkaXN0dXRpbHMgY29tcGlsZXJzIG5vdyBjb21waWxlIHNvdXJjZSBmaWxlcyBpbiB0aGUgc2FtZSBvcmRlciBhcwotICB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLgotCi0tIHBwcmludC5wcHJpbnQoKSBhbmQgcHByaW50LnBmb3JtYXQoKSBub3cgaGF2ZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKLSAgaW5kZW50LCB3aWR0aCBhbmQgZGVwdGguCi0KLS0gUGF0Y2ggIzc1MDU0MjogcHByaW50IG5vdyB3aWxsIHByZXR0eSBwcmludCBzdWJjbGFzc2VzIG9mIGxpc3QsIHR1cGxlCi0gIGFuZCBkaWN0IHRvbywgYXMgbG9uZyBhcyB0aGV5IGRvbid0IG92ZXJ3cml0ZSBfX3JlcHJfXygpLgotCi0tIEJ1ZyAjODQ4NjE0OiBkaXN0dXRpbHMnIG1zdmNjb21waWxlciBmYWlscyB0byBmaW5kIHRoZSBNU1ZDNgotICBjb21waWxlciBiZWNhdXNlIG9mIGluY29tcGxldGUgcmVnaXN0cnkgZW50cmllcy4KLQotLSBodHRwbGliLkhUVFAucHV0cmVxdWVzdCBub3cgb2ZmZXJzIHRvIG9taXQgdGhlIGltcGxpY2l0IEFjY2VwdC1FbmNvZGluZy4KLQotLSBQYXRjaCAjODQxOTc3OiBtb2R1bGVmaW5kZXIgZGlkbid0IGZpbmQgZXh0ZW5zaW9uIG1vZHVsZXMgaW4gcGFja2FnZXMKLQotLSBpbWFwbGliLklNQVA0LnRocmVhZCB3YXMgYWRkZWQuCi0KLS0gUGx1Z2dlZCBhIG1pbm9yIGhvbGUgaW4gdGVtcGZpbGUubWt0ZW1wKCkgZHVlIHRvIHRoZSB1c2Ugb2YKLSAgb3MucGF0aC5leGlzdHMoKSwgc3dpdGNoZWQgdG8gdXNpbmcgb3MubHN0YXQoKSBkaXJlY3RseSBpZiBwb3NzaWJsZS4KLQotLSBiaXNlY3QucHkgYW5kIGhlYXBxLnB5IG5vdyBoYXZlIHVuZGVybHlpbmcgQyBpbXBsZW1lbnRhdGlvbnMKLSAgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KLQotLSBoZWFwcS5weSBoYXMgdHdvIG5ldyBmdW5jdGlvbnMsIG5zbWFsbGVzdCgpIGFuZCBubGFyZ2VzdCgpLgotCi0tIHRyYWNlYmFjay5mb3JtYXRfZXhjIGhhcyBiZWVuIGFkZGVkIChzaW1pbGFyIHRvIHByaW50X2V4YyBidXQgaXQgcmV0dXJucwotICBhIHN0cmluZykuCi0KLS0geG1scnBjbGliLk11bHRpQ2FsbCBoYXMgYmVlbiBhZGRlZC4KLQotLSBwb3BsaWIuUE9QM19TU0wgaGFzIGJlZW4gYWRkZWQuCi0KLS0gdG1wZmlsZS5ta3N0ZW1wIG5vdyByZXR1cm5zIGFuIGFic29sdXRlIHBhdGggZXZlbiBpZiBkaXIgaXMgcmVsYXRpdmUuCi0KLS0gdXJscGFyc2UgaXMgUkZDIDIzOTYgY29tcGxpYW50LgotCi0tIFRoZSBmaWVsZG5hbWVzIGFyZ3VtZW50IHRvIHRoZSBjc3YgbW9kdWxlJ3MgRGljdFJlYWRlciBjb25zdHJ1Y3RvciBpcyBub3cKLSAgb3B0aW9uYWwuICBJZiBvbWl0dGVkLCB0aGUgZmlyc3Qgcm93IG9mIHRoZSBmaWxlIHdpbGwgYmUgdXNlZCBhcyB0aGUKLSAgbGlzdCBvZiBmaWVsZG5hbWVzLgotCi0tIGVuY29kaW5ncy5iejJfY29kZWMgd2FzIGFkZGVkIGZvciBhY2Nlc3MgdG8gYnoyIGNvbXByZXNzaW9uCi0gIHVzaW5nICJhIGxvbmcgc3RyaW5nIi5lbmNvZGUoJ2J6MicpCi0KLS0gVmFyaW91cyBpbXByb3ZlbWVudHMgdG8gdW5pdHRlc3QucHksIHJlYWxpZ25lZCB3aXRoIFB5VW5pdCBDVlMuCi0KLS0gZGlyY2FjaGUgbm93IHBhc3NlcyBleGNlcHRpb25zIHRvIHRoZSBjYWxsZXIsIGluc3RlYWQgb2YgcmV0dXJuaW5nCi0gIGVtcHR5IGxpc3RzLgotCi0tIFRoZSBic2RkYiBtb2R1bGUgYW5kIGRiaGFzaCBtb2R1bGUgbm93IHN1cHBvcnQgdGhlIGl0ZXJhdG9yIGFuZAotICBtYXBwaW5nIHByb3RvY29scyB3aGljaCBtYWtlIHRoZW0gbW9yZSBzdWJzdGl0dXRhYmxlIGZvciBkaWN0aW9uYXJpZXMKLSAgYW5kIHNoZWx2ZXMuCi0KLS0gVGhlIGNzdiBtb2R1bGUncyBEaWN0UmVhZGVyIGFuZCBEaWN0V3JpdGVyIGNsYXNzZXMgbm93IGFjY2VwdCBrZXl3b3JkCi0gIGFyZ3VtZW50cy4gIFRoaXMgd2FzIGFuIG9taXNzaW9uIGluIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotCi0tIFRoZSBlbWFpbCBwYWNrYWdlIGhhbmRsZXMgc29tZSBSRkMgMjIzMSBwYXJhbWV0ZXJzIHdpdGggbWlzc2luZwotICBDSEFSU0VUIGZpZWxkcyBiZXR0ZXIuICBJdCBhbHNvIGluY2x1ZGVzIGEgcGF0Y2ggdG8gcGFyYW1ldGVyCi0gIHBhcnNpbmcgd2hlbiBzZW1pY29sb25zIGFwcGVhciBpbnNpZGUgcXVvdGVzLgotCi0tIHNldHMucHkgbm93IHJ1bnMgdW5kZXIgUHkyLjIuICBJbiBhZGRpdGlvbiwgdGhlIGFyZ3VtZW50IHJlc3RyaWN0aW9ucwotICBmb3IgbW9zdCBzZXQgbWV0aG9kcyAoYnV0IG5vdCB0aGUgb3BlcmF0b3JzKSBoYXZlIGJlZW4gcmVsYXhlZCB0bwotICBhbGxvdyBhbnkgaXRlcmFibGUuCi0KLS0gX3N0cnB0aW1lLnB5IG5vdyBoYXMgYSBiZWhpbmQtdGhlLXNjZW5lcyBjYWNoaW5nIG1lY2hhbmlzbSBmb3IgdGhlIG1vc3QKLSAgcmVjZW50IFRpbWVSRSBpbnN0YW5jZSB1c2VkIGFsb25nIHdpdGggdGhlIGxhc3QgZml2ZSB1bmlxdWUgZGlyZWN0aXZlCi0gIHBhdHRlcm5zLiAgVGhlIG92ZXJhbGwgbW9kdWxlIHdhcyBhbHNvIG1hZGUgbW9yZSB0aHJlYWQtc2FmZS4KLQotLSByYW5kb20uY3VuaWZ2YXJpYXRlKCkgYW5kIHJhbmRvbS5zdGRnYW1tYSgpIHdlcmUgZGVwcmVjYXRlZCBpbiBQeTIuMwotICBhbmQgcmVtb3ZlZCBpbiBQeTIuNC4KLQotLSBCdWcgIzgyMzMyODogdXJsbGliMi5weSdzIEhUVFAgRGlnZXN0IEF1dGggc3VwcG9ydCB3b3JrcyBhZ2Fpbi4KLQotLSBQYXRjaCAjODczNTk3OiBDSksgY29kZWNzIGFyZSBpbXBvcnRlZCBpbnRvIHJhbmsgb2YgZGVmYXVsdCBjb2RlY3MuCi0KLVRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tLQotCi0tIEEgaG90c2hvdG1haW4gc2NyaXB0IHdhcyBhZGRlZCB0byB0aGUgVG9vbHMvc2NyaXB0cyBkaXJlY3RvcnkgdGhhdAotICBtYWtlcyBpdCBlYXN5IHRvIHJ1biBhIHNjcmlwdCB1bmRlciBjb250cm9sIG9mIHRoZSBob3RzaG90IHByb2ZpbGVyLgotCi0tIFRoZSBkYjJwaWNrbGUgYW5kIHBpY2tsZTJkYiBzY3JpcHRzIGNhbiBub3cgZHVtcC9sb2FkIGdkYm0gZmlsZXMuCi0KLS0gVGhlIGZpbGUgb3JkZXIgb24gdGhlIGNvbW1hbmQgbGluZSBvZiB0aGUgcGlja2xlMmRiIHNjcmlwdCB3YXMgcmV2ZXJzZWQuCi0gIEl0IGlzIG5vdyBbIHBpY2tsZWZpbGUgXSBkYmZpbGUuICBUaGlzIHByb3ZpZGVzIGJldHRlciBzeW1tZXRyeSB3aXRoCi0gIGRiMnBpY2tsZS4gIFRoZSBmaWxlIGFyZ3VtZW50cyB0byBib3RoIHNjcmlwdHMgYXJlIG5vdyBzb3VyY2UgZm9sbG93ZWQgYnkKLSAgZGVzdGluYXRpb24gaW4gc2l0dWF0aW9ucyB3aGVyZSBib3RoIGZpbGVzIGFyZSBnaXZlbi4KLQotLSBUaGUgcHlkb2Mgc2NyaXB0IHdpbGwgZGlzcGxheSBhIGxpbmsgdG8gdGhlIG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvcgotICBtb2R1bGVzIGRldGVybWluZWQgdG8gYmUgcGFydCBvZiB0aGUgY29yZSBkaXN0cmlidXRpb24uICBUaGUgZG9jdW1lbnRhdGlvbgotICBiYXNlIGRpcmVjdG9yeSBkZWZhdWx0cyB0byBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2N1cnJlbnQvbGliLyBidXQgY2FuCi0gIGJlIGNoYW5nZWQgYnkgc2V0dGluZyB0aGUgUFlUSE9ORE9DUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLQotLSB0ZXhjaGVjay5weSBub3cgZGV0ZWN0cyBkb3VibGUgd29yZCBlcnJvcnMuCi0KLS0gbWQ1c3VtLnB5IG1pc3Rha2VubHkgb3BlbmVkIGlucHV0IGZpbGVzIGluIHRleHQgbW9kZSBieSBkZWZhdWx0LCBhCi0gIHNpbGVudCBhbmQgZGFuZ2Vyb3VzIGNoYW5nZSBmcm9tIHByZXZpb3VzIHJlbGVhc2VzLiAgSXQgb25jZSBhZ2FpbgotICBvcGVucyBpbnB1dCBmaWxlcyBpbiBiaW5hcnkgbW9kZSBieSBkZWZhdWx0LiAgVGhlIC10IGFuZCAtYiBmbGFncwotICByZW1haW4gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgMi4zIHJlbGVhc2UsIGJ1dCAtYiBpcyB0aGUgZGVmYXVsdAotICBub3cuCi0KLS0gcHktZWxlY3RyaWMtY29sb24gbm93IHdvcmtzIHdoZW4gcGVuZGluZy1kZWxldGUvZGVsZXRlLXNlbGVjdGlvbiBtb2RlIGlzCi0gIGluIGVmZmVjdAotCi0tIHB5LWhlbHAtYXQtcG9pbnQgaXMgbm8gbG9uZ2VyIGJvdW5kIHRvIHRoZSBGMSBrZXkgLSBpdCdzIHN0aWxsIGJvdW5kIHRvCi0gIEMtYyBDLWgKLQotLSBQeW5jaGUgd2FzIGZpeGVkIHRvIG5vdCBjcmFzaCB3aGVuIHRoZXJlIGlzIG5vIH4vLnB5bmNoZSBmaWxlIGFuZCBubwotICAtZCBvcHRpb24gd2FzIGdpdmVuLgotCi1CdWlsZAotLS0tLS0KLQotLSBCdWcgIzk3ODY0NTogTW9kdWxlcy9nZXRwYXRoLmMgbm93IGJ1aWxkcyBwcm9wZXJseSBpbiAtLWRpc2FibGUtZnJhbWV3b3JrCi0gIGJ1aWxkIHVuZGVyIE9TIFguCi0KLS0gUHJvZmlsaW5nIHVzaW5nIGdwcm9mIGlzIG5vdyBhdmFpbGFibGUgaWYgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgd2l0aAotICAtLWVuYWJsZS1wcm9maWxpbmcuCi0KLS0gUHJvZmlsaW5nIHRoZSBWTSB1c2luZyB0aGUgUGVudGl1bSBUU0MgaXMgbm93IHBvc3NpYmxlIGlmIFB5dGhvbgotICBpcyBjb25maWd1cmVkIC0td2l0aC10c2MuCi0KLS0gSW4gb3JkZXIgdG8gZmluZCBsaWJyYXJpZXMsIHNldHVwLnB5IG5vdyBhbHNvIGxvb2tzIGluIC9saWI2NCwgZm9yIHVzZQotICBvbiBBTUQ2NC4KLQotLSBCdWcgIzkzNDYzNTogRml4ZWQgYSBidWcgd2hlcmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY291bGRuJ3QgZGV0ZWN0Ci0gIGdldGFkZHJpbmZvKCkgcHJvcGVybHkgaWYgdGhlIEtBTUUgc3RhY2sgaGFkIFNDVFAgc3VwcG9ydC4KLQotLSBTdXBwb3J0IGZvciBtaXNzaW5nIEFOU0kgQyBoZWFkZXIgZmlsZXMgKGxpbWl0cy5oLCBzdGRkZWYuaCwgZXRjKSB3YXMKLSAgcmVtb3ZlZC4KLQotLSBTeXN0ZW1zIHJlcXVpcmluZyB0aGUgRDQsIEQ2IG9yIEQ3IHZhcmlhbnRzIG9mIHB0aHJlYWRzIGFyZSBubyBsb25nZXIKLSAgc3VwcG9ydGVkIChzZWUgUEVQIDExKS4KLQotLSBVbml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IGNhbiBubyBsb25nZXIgYmUgZGlzYWJsZWQgKHNlZSBQRVAgMTEpLgotCi0tIFN1cHBvcnQgZm9yIERHVVgsIFN1bk9TIDQsIElSSVggNCBhbmQgTWluaXggd2FzIHJlbW92ZWQgKHNlZSBQRVAgMTEpLgotCi0tIFN1cHBvcnQgZm9yIHN5c3RlbXMgcmVxdWlyaW5nIC0td2l0aC1kbC1kbGQgb3IgLS13aXRoLXNnaS1kbCB3YXMgcmVtb3ZlZAotICAoc2VlIFBFUCAxMSkuCi0KLS0gVGVzdHMgZm9yIHNpemVvZihjaGFyKSB3ZXJlIHJlbW92ZWQgc2luY2UgQU5TSSBDIG1hbmRhdGVzIHRoYXQKLSAgc2l6ZW9mKGNoYXIpIG11c3QgYmUgMS4KLQotQyBBUEkKLS0tLS0tCi0KLS0gVGhhbmtzIHRvIEFudGhvbnkgVHVpbmluZ2EsIHRoZSBkYXRldGltZSBtb2R1bGUgbm93IHN1cHBsaWVzIGEgQyBBUEkKLSAgY29udGFpbmluZyB0eXBlLWNoZWNrIG1hY3JvcyBhbmQgY29uc3RydWN0b3JzLiAgU2VlIG5ldyBkb2NzIGluIHRoZQotICBQeXRob24vQyBBUEkgUmVmZXJlbmNlIE1hbnVhbCBmb3IgZGV0YWlscy4KLQotLSBQcml2YXRlIGZ1bmN0aW9uIF9QeVRpbWVfRG91YmxlVG9UaW1ldCBhZGRlZCwgdG8gY29udmVydCBhIFB5dGhvbgotICB0aW1lc3RhbXAgKEMgZG91YmxlKSB0byBwbGF0Zm9ybSB0aW1lX3Qgd2l0aCBzb21lIG91dC1vZi1ib3VuZHMKLSAgY2hlY2tpbmcuICBEZWNsYXJlZCBpbiBuZXcgaGVhZGVyIGZpbGUgdGltZWZ1bmNzLmguICBJdCB3b3VsZCBiZQotICBnb29kIHRvIGV4cG9zZSBzb21lIG90aGVyIGludGVybmFsIHRpbWVtb2R1bGUuYyBmdW5jdGlvbnMgdGhlcmUuCi0KLS0gTmV3IHB1YmxpYyBmdW5jdGlvbnMgUHlFdmFsX0V2YWx1YXRlRnJhbWUgYW5kIFB5R2VuX05ldyB0byBleHBvc2UKLSAgZ2VuZXJhdG9yIG9iamVjdHMuCi0KLS0gTmV3IHB1YmxpYyBmdW5jdGlvbnMgUHlfSW5jUmVmKCkgYW5kIFB5X0RlY1JlZigpLCBleHBvc2luZyB0aGUKLSAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgUHlfWElOQ1JFRigpIGFuZCBQeV9YREVDUkVGIG1hY3Jvcy4gVXNlZnVsIGZvcgotICBydW50aW1lIGR5bmFtaWMgZW1iZWRkaW5nIG9mIFB5dGhvbi4gIFNlZSBwYXRjaCAjOTM4MzAyLCBieSBCb2IKLSAgSXBwb2xpdG8uCi0KLS0gQWRkZWQgYSBuZXcgbWFjcm8sIFB5U2VxdWVuY2VfRmFzdF9JVEVNUywgd2hpY2ggcmV0cmlldmVzIGEgZmFzdCBzZXF1ZW5jZSdzCi0gIHVuZGVybHlpbmcgYXJyYXkgb2YgUHlPYmplY3QgcG9pbnRlcnMuICBVc2VmdWwgZm9yIGhpZ2ggc3BlZWQgbG9vcGluZy4KLQotLSBDcmVhdGVkIGEgbmV3IG1ldGhvZCBmbGFnLCBNRVRIX0NPRVhJU1QsIHdoaWNoIGNhdXNlcyBhIG1ldGhvZCB0byBiZSBsb2FkZWQKLSAgZXZlbiBpZiBhbHJlYWR5IGRlZmluZWQgYnkgYSBzbG90IHdyYXBwZXIuICBUaGlzIGFsbG93cyBhIF9fY29udGFpbnNfXwotICBtZXRob2QsIGZvciBleGFtcGxlLCB0byBjby1leGlzdCB3aXRoIGEgZGVmaW5lZCBzcV9jb250YWlucyBzbG90LiAgVGhpcwotICBpcyBoZWxwZnVsIGJlY2F1c2UgdGhlIFB5Q0Z1bmN0aW9uIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBvcHRpbWl6ZWQgY2FsbHMKLSAgd2hlbmV2ZXIgTUVUSF9PIG9yIE1FVEhfTk9BUkdTIGZsYWdzIGFyZSBkZWZpbmVkLgotCi0tIEFkZGVkIGEgbmV3IGZ1bmN0aW9uLCBQeURpY3RfQ29udGFpbnMoZCwgaykgd2hpY2ggaXMgbGlrZQotICBQeVNlcXVlbmNlX0NvbnRhaW5zKCkgYnV0IGlzIHNwZWNpZmljIHRvIGRpY3Rpb25hcmllcyBhbmQgZXhlY3V0ZXMKLSAgYWJvdXQgMTAlIGZhc3Rlci4KLQotLSBBZGRlZCB0aHJlZSBuZXcgbWFjcm9zOiBQeV9SRVRVUk5fTk9ORSwgUHlfUkVUVVJOX1RSVUUsIGFuZCBQeV9SRVRVUk5fRkFMU0UuCi0gIEVhY2ggcmV0dXJuIHRoZSBzaW5nbGV0b24gdGhleSBtZW50aW9uIGFmdGVyIFB5X0lOQ1JFRigpaW5nIHRoZW0uCi0KLS0gQWRkZWQgYSBuZXcgZnVuY3Rpb24sIFB5VHVwbGVfUGFjayhuLCAuLi4pIGZvciBjb25zdHJ1Y3RpbmcgdHVwbGVzIGZyb20gYQotICB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnQgbGlzdCBvZiBQeXRob24gb2JqZWN0cyB3aXRob3V0IGhhdmluZyB0byBpbnZva2UKLSAgdGhlIG1vcmUgY29tcGxleCBtYWNoaW5lcnkgb2YgUHlfQnVpbGRWYWx1ZSgpLiAgUHlUdXBsZV9QYWNrKDMsIGEsIGIsIGMpCi0gIGlzIGVxdWl2YWxlbnQgdG8gUHlfQnVpbGRWYWx1ZSgiKE9PTykiLCBhLCBiLCBjKS4KLQotV2luZG93cwotLS0tLS0tLQotCi0tIFRoZSBfd2lucmVnIG1vZHVsZSBjb3VsZCBzZWdmYXVsdCB3aGVuIHJlYWRpbmcgdmVyeSBsYXJnZSByZWdpc3RyeQotICB2YWx1ZXMsIGR1ZSB0byB1bmNoZWNrZWQgYWxsb2NhKCkgY2FsbHMgKFNGIGJ1ZyA4NTEwNTYpLiAgVGhlIGZpeCBpcwotICB1c2VzIGVpdGhlciBQeU1lbV9NYWxsb2Mobikgb3IgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbiksCi0gIGFzIGFwcHJvcHJpYXRlLCBmb2xsb3dlZCBieSBhIHNpemUgY2hlY2suCi0KLS0gZmlsZS50cnVuY2F0ZSgpIGNvdWxkIG1pc2JlaGF2ZSBpZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3IgdXBkYXRlCi0gIChtb2RlcyByKywgcmIrLCB3Kywgd2IrKSwgYW5kIHRoZSBtb3N0IHJlY2VudCBmaWxlIG9wZXJhdGlvbiBiZWZvcmUKLSAgdGhlIHRydW5jYXRlKCkgY2FsbCB3YXMgYW4gaW5wdXQgb3BlcmF0aW9uLiAgU0YgYnVnIDgwMTYzMS4KLQotCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgZmluYWw/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDI5LUp1bC0yMDAzKgotCi1JRExFCi0tLS0tCi0KLS0gQnVnIDc3ODQwMDogIElETEUgaGFuZ3Mgd2hlbiBzZWxlY3RpbmcgIkVkaXQgd2l0aCBJRExFIiBmcm9tIGV4cGxvcmVyLgotICBUaGlzIHdhcyB1bmlxdWUgdG8gV2luZG93cywgYW5kIHdhcyBmaXhlZCBieSBhZGRpbmcgYW4gLW4gc3dpdGNoIHRvCi0gIHRoZSBjb21tYW5kIHRoZSBXaW5kb3dzIGluc3RhbGxlciBjcmVhdGVzIHRvIGV4ZWN1dGUgIkVkaXQgd2l0aCBJRExFIgotICBjb250ZXh0LW1lbnUgYWN0aW9ucy4KLQotLSBJRExFIGRpc3BsYXlzIGEgbmV3IG1lc3NhZ2UgdXBvbiBzdGFydHVwOiAgc29tZSAicGVyc29uYWwgZmlyZXdhbGwiCi0gIGtpbmRzIG9mIHByb2dyYW1zIChmb3IgZXhhbXBsZSwgWm9uZUFsYXJtKSBvcGVuIGEgZGlhbG9nIG9mIHRoZWlyCi0gIG93biB3aGVuIGFueSBwcm9ncmFtIG9wZW5zIGEgc29ja2V0LiAgSURMRSBkb2VzIHVzZSBzb2NrZXRzLCB0YWxraW5nCi0gIG9uIHRoZSBjb21wdXRlcidzIGludGVybmFsIGxvb3BiYWNrIGludGVyZmFjZS4gIFRoaXMgY29ubmVjdGlvbiBpcyBub3QKLSAgdmlzaWJsZSBvbiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGFuZCBubyBkYXRhIGlzIHNlbnQgdG8gb3IgcmVjZWl2ZWQKLSAgZnJvbSB0aGUgSW50ZXJuZXQuICBTbywgaWYgeW91IGdldCBzdWNoIGEgZGlhbG9nIHdoZW4gb3BlbmluZyBJRExFLAotICBhc2tpbmcgd2hldGhlciB0byBsZXQgcHl0aG9udy5leGUgdGFsayB0byBhZGRyZXNzIDEyNy4wLjAuMSwgc2F5IHllcywKLSAgYW5kIHJlc3QgYXNzdXJlZCBubyBjb21tdW5pY2F0aW9uIGV4dGVybmFsIHRvIHlvdXIgbWFjaGluZSBpcyB0YWtpbmcKLSAgcGxhY2UuICBJZiB5b3UgZG9uJ3QgYWxsb3cgaXQsIElETEUgd29uJ3QgYmUgYWJsZSB0byBzdGFydC4KLQotCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgcmVsZWFzZSBjYW5kaWRhdGUgMj8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qUmVsZWFzZSBkYXRlOiAyNC1KdWwtMjAwMyoKLQotQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gSXQgaXMgbm93IHBvc3NpYmxlIHRvIGltcG9ydCBmcm9tIHppcGZpbGVzIGNvbnRhaW5pbmcgYWRkaXRpb25hbAotICBkYXRhIGJ5dGVzIGJlZm9yZSB0aGUgemlwIGNvbXBhdGlibGUgYXJjaGl2ZS4gIFppcGZpbGVzIGNvbnRhaW5pbmcgYQotICBjb21tZW50IGF0IHRoZSBlbmQgYXJlIHN0aWxsIHVuc3VwcG9ydGVkLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBBIGxvbmdzdGFuZGluZyBidWcgaW4gdGhlIHBhcnNlciBtb2R1bGUncyBpbml0aWFsaXphdGlvbiBjb3VsZCBjYXVzZQotICBmYXRhbCBpbnRlcm5hbCByZWZjb3VudCBjb25mdXNpb24gd2hlbiB0aGUgbW9kdWxlIGdvdCBpbml0aWFsaXplZCBtb3JlCi0gIHRoYW4gb25jZS4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuCi0KLS0gRml4ZWQgbWVtb3J5IGxlYWsgaW4gcHlleHBhdDsgdXNpbmcgdGhlIHBhcnNlcidzIFBhcnNlRmlsZSgpIG1ldGhvZAotICB3aXRoIG9wZW4gZmlsZXMgdGhhdCBhcmVuJ3QgaW5zdGFuY2VzIG9mIHRoZSBzdGFuZGFyZCBmaWxlIHR5cGUKLSAgY2F1c2VkIGFuIGluc3RhbmNlIG9mIHRoZSBib3VuZCAucmVhZCgpIG1ldGhvZCB0byBiZSBsZWFrZWQgb24gZXZlcnkKLSAgY2FsbC4KLQotLSBGaXhlZCBzb21lIGxlYWtzIGluIHRoZSBsb2NhbGUgbW9kdWxlLgotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KLS0gTGliL2VuY29kaW5ncy9yb3RfMTMucHkgd2hlbiB1c2VkIGFzIGEgc2NyaXB0LCBub3cgbW9yZSBwcm9wZXJseQotICB1c2VzIHRoZSBmaXJzdCBQeXRob24gaW50ZXJwcmV0ZXIgb24geW91ciBwYXRoLgotCi0tIFJlbW92ZWQgY2FjaGluZyBvZiBUaW1lUkUgKGFuZCB0aHVzIExvY2FsZVRpbWUpIGluIF9zdHJwdGltZS5weSB0bwotICBmaXggYSBsb2NhbGUgcmVsYXRlZCBidWcgaW4gdGhlIHRlc3Qgc3VpdGUuICBBbHRob3VnaCBhbm90aGVyIHBhdGNoCi0gIHdhcyBuZWVkZWQgdG8gYWN0dWFsbHkgZml4IHRoZSBwcm9ibGVtLCB0aGUgY2FjaGUgY29kZSB3YXMgbm90Ci0gIHJlc3RvcmVkLgotCi1JRExFCi0tLS0tCi0KLS0gQ2FsbHRpcHMgcGF0Y2hlcy4KLQotQnVpbGQKLS0tLS0tCi0KLS0gRm9yIE1hY09TWCwgYWRkZWQgLW1uby1mdXNlZC1tYWRkIHRvIEJBU0VDRkxBR1MgdG8gZml4IHRlc3RfY29lcmNpb24KLSAgb24gUGFudGhlciAoT1NYIDEwLjMpLgotCi1DIEFQSQotLS0tLS0KLQotV2luZG93cwotLS0tLS0tLQotCi0tIFRoZSB0ZW1wZmlsZSBtb2R1bGUgY291bGQgZG8gaW5zYW5lIGltcG9ydHMgb24gV2luZG93cyBpZiBQWVRIT05DQVNFT0sKLSAgd2FzIHNldCwgbWFraW5nIHRlbXAgZmlsZSBjcmVhdGlvbiBpbXBvc3NpYmxlLiAgUmVwYWlyZWQuCi0KLS0gQWRkIGEgcGF0Y2ggdG8gd29ya2Fyb3VuZCBwdGhyZWFkX3NpZ21hc2soKSBidWdzIGluIEN5Z3dpbi4KLQotTWFjCi0tLS0KLQotLSBWYXJpb3VzIGZpeGVzIHRvIHBpbXAuCi0KLS0gU2NyaXB0cyBydW5zIHdpdGggcHl0aG9udyBubyBsb25nZXIgaGFkIGZ1bGwgd2luZG93IG1hbmFnZXIgYWNjZXNzLgotCi0tIERvbid0IGZvcmNlIGJvb3QtZGlzay1vbmx5IGluc3RhbGwsIGZvciByZWFzb25zIHVua25vd24gaXQgY2F1c2VzCi0gIG1vcmUgcHJvYmxlbXMgdGhhbiBpdCBzb2x2ZXMuCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIHJlbGVhc2UgY2FuZGlkYXRlIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMTgtSnVsLTIwMDMqCi0KLUNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIFRoZSBuZXcgZnVuY3Rpb24gc3lzLmdldGNoZWNraW50ZXJ2YWwoKSByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHNldAotICBieSBzeXMuc2V0Y2hlY2tpbnRlcnZhbCgpLgotCi0tIFNldmVyYWwgYnVncyBpbiB0aGUgc3ltYm9sIHRhYmxlIHBoYXNlIG9mIHRoZSBjb21waWxlciBoYXZlIGJlZW4KLSAgZml4ZWQuICBFcnJvcnMgY291bGQgYmUgbG9zdCBhbmQgY29tcGlsYXRpb24gY291bGQgZmFpbCB3aXRob3V0Ci0gIHJlcG9ydGluZyBhbiBlcnJvci4gIFNGIHBhdGNoIDc2MzIwMS4KLQotLSBUaGUgaW50ZXJwcmV0ZXIgaXMgbm93IG1vcmUgcm9idXN0IGFib3V0IGltcG9ydGluZyB0aGUgd2FybmluZ3MKLSAgbW9kdWxlLiAgSW4gYW4gZXhlY3V0YWJsZSBnZW5lcmF0ZWQgYnkgZnJlZXplIG9yIHNpbWlsYXIgcHJvZ3JhbXMsCi0gIGVhcmxpZXIgdmVyc2lvbnMgb2YgMi4zIHdvdWxkIGZhaWwgaWYgdGhlIHdhcm5pbmdzIG1vZHVsZSBjb3VsZAotICBub3QgYmUgZm91bmQgb24gdGhlIGZpbGUgc3lzdGVtLiAgRml4ZXMgU0YgYnVnIDc3MTA5Ny4KLQotLSBBIHdhcm5pbmcgYWJvdXQgYXNzaWdubWVudHMgdG8gbW9kdWxlIGF0dHJpYnV0ZXMgdGhhdCBzaGFkb3cKLSAgYnVpbHRpbnMsIHByZXNlbnQgaW4gZWFybGllciByZWxlYXNlcyBvZiAyLjMsIGhhcyBiZWVuIHJlbW92ZWQuCi0KLS0gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBzdWJjbGFzc2VzIG9mIGJ1aWx0aW4gdHlwZXMgbGlrZSBzdHIKLSAgYW5kIHR1cGxlIHRoYXQgZGVmaW5lIGFuIGl0ZW1zaXplLiAgRWFybGllciByZWxlYXNlcyBvZiBQeXRob24gMi4zCi0gIGFsbG93ZWQgdGhpcyBieSBtaXN0YWtlLCBsZWFkaW5nIHRvIGNyYXNoZXMgYW5kIG90aGVyIHByb2JsZW1zLgotCi0tIFRoZSB0aHJlYWRfaWQgaXMgbm93IGluaXRpYWxpemVkIHRvIDAgaW4gYSBub24tdGhyZWFkIGJ1aWxkLiAgU0YgYnVnCi0gIDc3MDI0Ny4KLQotLSBTRiBidWcgNzYyODkxOiAiZGVsIHBba2V5XSIgb24gcHJveHkgb2JqZWN0IG5vIGxvbmdlciByYWlzZXMgU3lzdGVtRXJyb3IuCi0KLUV4dGVuc2lvbiBtb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIHdlYWtyZWYucHJveHkoKSBjYW4gbm93IGhhbmRsZSAiZGVsIG9ialtpXSIgZm9yIHByb3h5IG9iamVjdHMKLSAgZGVmaW5pbmcgX19kZWxpdGVtX18uICBGb3JtZXJseSwgaXQgZ2VuZXJhdGVkIGEgU3lzdGVtRXJyb3IuCi0KLS0gU1NMIG5vIGxvbmdlciBjcmFzaGVzIHRoZSBpbnRlcnByZXRlciB3aGVuIHRoZSByZW1vdGUgc2lkZSBkaXNjb25uZWN0cy4KLQotLSBPbiBVbml4IHRoZSBtbWFwIG1vZHVsZSBjYW4gYWdhaW4gYmUgdXNlZCB0byBtYXAgZGV2aWNlIGZpbGVzLgotCi0tIHRpbWUuc3RycHRpbWUgbm93IGV4Y2x1c2l2ZWx5IHVzZXMgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgotICBjb250YWluZWQgd2l0aGluIHRoZSBfc3RycHRpbWUgbW9kdWxlLgotCi0tIFRoZSBwcmludCBzbG90IG9mIHdlYWtyZWYgcHJveHkgb2JqZWN0cyB3YXMgcmVtb3ZlZCwgYmVjYXVzZSBpdCB3YXMKLSAgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgb2JqZWN0J3MgcmVwciBzbG90LgotCi0tIFRoZSBtbWFwIG1vZHVsZSBvbmx5IGNoZWNrcyBmaWxlIHNpemUgZm9yIHJlZ3VsYXIgZmlsZXMsIG5vdAotICBjaGFyYWN0ZXIgb3IgYmxvY2sgZGV2aWNlcy4gIFNGIHBhdGNoIDcwODM3NC4KLQotLSBUaGUgY1BpY2tsZSBQaWNrbGVyIGdhcmJhZ2UgY29sbGVjdGlvbiBzdXBwb3J0IHdhcyBmaXhlZCB0byB0cmF2ZXJzZQotICB0aGUgZmluZF9jbGFzcyBhdHRyaWJ1dGUsIGlmIHByZXNlbnQuCi0KLS0gVGhlcmUgYXJlIHNldmVyYWwgZml4ZXMgZm9yIHRoZSBic2RkYjMgd3JhcHBlciBtb2R1bGUuCi0KLSAgYnNkZGIzIG5vIGxvbmdlciBjcmFzaGVzIGlmIGFuIGVudmlyb25tZW50IGlzIGNsb3NlZCBiZWZvcmUgYSBjdXJzb3IKLSAgKFNGIGJ1ZyA3NjMyOTgpLgotCi0gIFRoZSBEQiBhbmQgREJFbnYgc2V0X2dldF9yZXR1cm5zX25vbmUgZnVuY3Rpb24gd2FzIGV4dGVuZGVkIHRvIHRha2UKLSAgYSBsZXZlbCBpbnN0ZWFkIG9mIGEgYm9vbGVhbiBmbGFnLiAgVGhlIG5ldyBsZXZlbCAyIG1lYW5zIHRoYXQgaW4KLSAgYWRkaXRpb24sIGN1cnNvci5zZXQoKS8uZ2V0KCkgbWV0aG9kcyByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIHJhaXNpbmcKLSAgYW4gZXhjZXB0aW9uLgotCi0gIEEgdHlwbyB3YXMgZml4ZWQgaW4gREJDdXJzb3Iuam9pbl9pdGVtKCksIHByZXZlbnRpbmcgYSBjcmFzaC4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIGRpc3R1dGlscyBub3cgc3VwcG9ydHMgTVNWQyA3LjEKLQotLSBkb2N0ZXN0IG5vdyBleGFtaW5lcyBhbGwgZG9jc3RyaW5ncyBieSBkZWZhdWx0LiAgUHJldmlvdXNseSwgaXQgd291bGQKLSAgc2tpcCBvdmVyIGZ1bmN0aW9ucyB3aXRoIHByaXZhdGUgbmFtZXMgKGFzIGluZGljYXRlZCBieSB0aGUgdW5kZXJzY29yZQotICBuYW1pbmcgY29udmVudGlvbikuICBUaGUgb2xkIGRlZmF1bHQgY3JlYXRlZCB0b28gbXVjaCBvZiBhIHJpc2sgdGhhdAotICB1c2VyIHRlc3RzIHdlcmUgYmVpbmcgc2tpcHBlZCBpbmFkdmVydGVudGx5LiAgTm90ZSwgdGhpcyBjaGFuZ2UgY291bGQKLSAgYnJlYWsgY29kZSBpbiB0aGUgdW5saWtlbHkgY2FzZSB0aGF0IHNvbWVvbmUgaGFkIGludGVudGlvbmFsbHkgcHV0Ci0gIGZhaWxpbmcgdGVzdHMgaW4gdGhlIGRvY3N0cmluZ3Mgb2YgcHJpdmF0ZSBmdW5jdGlvbnMuICBUaGUgYnJlYWthZ2UKLSAgaXMgZWFzaWx5IGZpeGFibGUgYnkgc3BlY2lmeWluZyB0aGUgb2xkIGJlaGF2aW9yIHdoZW4gY2FsbGluZyB0ZXN0bW9kKCkKLSAgb3IgVGVzdGVyKCkuCi0KLS0gVGhlcmUgd2VyZSBzZXZlcmFsIGZpeGVzIHRvIHRoZSB3YXkgZHVtYmRibXMgYXJlIGNsb3NlZC4gIEl0J3Mgdml0YWwKLSAgdGhhdCBhIGR1bWJkYm0gZGF0YWJhc2UgYmUgY2xvc2VkIHByb3Blcmx5LCBlbHNlIHRoZSBvbi1kaXNrIGRhdGEKLSAgYW5kIGRpcmVjdG9yeSBmaWxlcyBjYW4gYmUgbGVmdCBpbiBtdXR1YWxseSBpbmNvbnNpc3RlbnQgc3RhdGVzLgotICBkdW1iZGJtLnB5J3MgX0RhdGFiYXNlLl9fZGVsX18oKSBtZXRob2QgYXR0ZW1wdGVkIHRvIGNsb3NlIHRoZQotICBkYXRhYmFzZSBwcm9wZXJseSwgYnV0IGEgc2h1dGRvd24gcmFjZSBpbiBfRGF0YWJhc2UuX2NvbW1pdCgpIGNvdWxkCi0gIHByZXZlbnQgdGhpcyBmcm9tIHdvcmtpbmcsIHNvIHRoYXQgYSBwcm9ncmFtIHRydXN0aW5nIF9fZGVsX18oKSB0bwotICBnZXQgdGhlIG9uLWRpc2sgZmlsZXMgaW4gc3luY2ggY291bGQgYmUgYmFkbHkgc3VycHJpc2VkLiAgVGhlIHJhY2UKLSAgaGFzIGJlZW4gcmVwYWlyZWQuICBBIHN5bmMoKSBtZXRob2Qgd2FzIGFsc28gYWRkZWQgc28gdGhhdCBzaGVsdmUKLSAgY2FuIGd1YXJhbnRlZSBkYXRhIGlzIHdyaXR0ZW4gdG8gZGlzay4KLQotICBUaGUgY2xvc2UoKSBtZXRob2QgY2FuIG5vdyBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aG91dCBjb21wbGFpbnQuCi0KLS0gVGhlIGNsYXNzZXMgaW4gdGhyZWFkaW5nLnB5IGFyZSBub3cgbmV3LXN0eWxlIGNsYXNzZXMuICBUaGF0IHRoZXkKLSAgd2VyZW4ndCBiZWZvcmUgd2FzIGFuIG92ZXJzaWdodC4KLQotLSBUaGUgdXJsbGliMiBkaWdlc3QgYXV0aGVudGljYXRpb24gaGFuZGxlcnMgbm93IGRlZmluZSB0aGUgY29ycmVjdAotICBhdXRoX2hlYWRlci4gIFRoZSBlYXJsaWVyIHZlcnNpb25zIHdvdWxkIGZhaWwgYXQgcnVudGltZS4KLQotLSBTRiBidWcgNzYzMDIzOiBmaXggdW5jYXVnaHQgWmVyb0RpdmlzaW9uRXJyb3IgaW4gZGlmZmxpYiByYXRpbyBtZXRob2RzCi0gIHdoZW4gdGhlcmUgYXJlIG5vIGxpbmVzLgotCi0tIFNGIGJ1ZyA3NjM2Mzc6IGZpeCBleGNlcHRpb24gaW4gVGtpbnRlciB3aXRoIGFmdGVyX2NhbmNlbAotICB3aGljaCBjb3VsZCBvY2N1ciB3aXRoIFRrIDguNAotCi0tIFNGIGJ1ZyA3NzA2MDE6IENHSUhUVFBTZXJ2ZXIucHkgbm93IHBhc3NlcyB0aGUgZW50aXJlIGVudmlyb25tZW50Ci0gIHRvIGNoaWxkIHByb2Nlc3Nlcy4KLQotLSBTRiBidWcgNzY1MjM4OiBhZGQgZmlsdGVyIHRvIGZubWF0Y2gncyBfX2FsbF9fLgotCi0tIFNGIGJ1ZyA3NDgyMDE6IG1ha2UgdGltZS5zdHJwdGltZSgpIGVycm9yIG1lc3NhZ2VzIG1vcmUgaGVscGZ1bC4KLQotLSBTRiBwYXRjaCA3NjQ0NzA6IERvIG5vdCBkdW1wIHRoZSBhcmdzIGF0dHJpYnV0ZSBvZiBhIEZhdWx0IG9iamVjdCBpbgotICB4bWxycGNsaWIuCi0KLS0gU0YgcGF0Y2ggNTQ5MTUxOiB1cmxsaWIgYW5kIHVybGxpYjIgbm93IHJlZGlyZWN0IFBPU1RzIG9uIDMwMQotICByZXNwb25zZXMuCi0KLS0gU0YgcGF0Y2ggNzY2NjUwOiBUaGUgd2hpY2hkYiBtb2R1bGUgd2FzIGZpeGVkIHRvIHJlY29nbml6ZSBkYm0gZmlsZXMKLSAgZ2VuZXJhdGVkIGJ5IGdkYm0gb24gT1MvMiBFTVguCi0KLS0gU0YgYnVncyA3NjMwNDcgYW5kIDc2MzA1MjogZml4ZXMgYnVnIG9mIHRpbWV6b25lIHZhbHVlIGJlaW5nIGxlZnQgYXMKLSAgLTEgd2hlbiBgYHRpbWUudHpuYW1lWzBdID09IHRpbWUudHpuYW1lWzFdIGFuZCBub3QgdGltZS5kYXlsaWdodGBgCi0gIGlzIHRydWUgd2hlbiBpdCBzaG91bGQgb25seSB3aGVuIHRpbWUuZGF5bGlnaHQgaXMgdHJ1ZS4KLQotLSBTRiBidWcgNzY0NTQ4OiByZSBub3cgYWxsb3dzIHN1YmNsYXNzZXMgb2Ygc3RyIGFuZCB1bmljb2RlIHRvIGJlCi0gIHVzZWQgYXMgcGF0dGVybnMuCi0KLS0gU0YgYnVnIDc2MzYzNzogSW4gVGtpbnRlciwgY2hhbmdlIGFmdGVyX2NhbmNlbCgpIHRvIGhhbmRsZSB0dXBsZXMKLSAgb2YgdmFyeWluZyBzaXplcy4gIFRrIDguNCByZXR1cm5zIGEgZGlmZmVyZW50IG51bWJlciBvZiB2YWx1ZXMKLSAgdGhhbiBUayA4LjMuCi0KLS0gU0YgYnVnIDc2MzAyMzogZGlmZmxpYi5yYXRpbygpIGRpZCBub3QgY2F0Y2ggemVybyBkaXZpc2lvbi4KLQotLSBUaGUgUXVldWUgbW9kdWxlIG5vdyBoYXMgYW4gX19hbGxfXyBhdHRyaWJ1dGUuCi0KLVRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tLQotCi0tIFNlZSBMaWIvaWRsZWxpYi9ORVdTLnR4dCBmb3IgSURMRSBuZXdzLgotCi0tIFNGIGJ1ZyA3NTM1OTI6IHdlYmNoZWNrZXIvd3NndWkgbm93IGhhbmRsZXMgdXNlciBzdXBwbGllZCBkaXJlY3Rvcmllcy4KLQotLSBUaGUgdHJhY2UucHkgc2NyaXB0IGhhcyBiZWVuIHJlbW92ZWQuICBJdCBpcyBub3cgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuCi0KLUJ1aWxkCi0tLS0tLQotCi0tIFB5dGhvbiBub3cgY29tcGlsZXMgd2l0aCAtZm5vLXN0cmljdC1hbGlhc2luZyBpZiBwb3NzaWJsZSAoU0YgYnVnIDc2NjY5NikuCi0KLS0gVGhlIHNvY2tldCBtb2R1bGUgY29tcGlsZXMgb24gSVJJWCA2LjUuMTAuCi0KLS0gQW4gaXJpeDY0IHN5c3RlbSBpcyB0cmVhdGVkIHRoZSBzYW1lIHdheSBhcyBhbiBpcml4NiBzeXN0ZW0gKFNGCi0gIHBhdGNoIDc2NDU2MCkuCi0KLS0gU2V2ZXJhbCBkZWZpbml0aW9ucyB3ZXJlIG1pc3Npbmcgb24gRnJlZUJTRCA1LnggdW5sZXNzIHRoZQotICBfX0JTRF9WSVNJQkxFIHN5bWJvbCB3YXMgZGVmaW5lZC4gIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBpdCBhcwotICBuZWVkZWQuCi0KLUMgQVBJCi0tLS0tLQotCi0tIFVuaWNvZGUgb2JqZWN0cyBub3cgc3VwcG9ydCBtYmNzIGFzIGEgYnVpbHQtaW4gZW5jb2RpbmcsIHNvIHRoZSBDCi0gIEFQSSBjYW4gdXNlIGl0IHdpdGhvdXQgZGVmZXJyaW5nIHRvIHRoZSBlbmNvZGluZ3MgcGFja2FnZS4KLQotV2luZG93cwotLS0tLS0tLQotCi0tIFRoZSBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoKSBuZXZlcgotICBjaGVja2VkIGVycm9yIHJldHVybnMgZnJvbSBXaW5kb3dzIGZ1bmN0aW9ucyBjb3JyZWN0bHkuICBBcyBhIHJlc3VsdCwKLSAgaXQgY291bGQgY2xhaW0gdG8gc3RhcnQgYSBuZXcgdGhyZWFkIGV2ZW4gd2hlbiB0aGUgTWljcm9zb2Z0Ci0gIF9iZWdpbnRocmVhZCgpIGZ1bmN0aW9uIGZhaWxlZCAoZHVlIHRvICJ0b28gbWFueSB0aHJlYWRzIiAtLSB0aGlzIGlzCi0gIG9uIHRoZSBvcmRlciBvZiB0aG91c2FuZHMgd2hlbiBpdCBoYXBwZW5zKS4gIEluIHRoZXNlIGNhc2VzLCB0aGUKLSAgUHl0aG9uIGV4Y2VwdGlvbiA6OgotCi0gICAgICB0aHJlYWQuZXJyb3I6IGNhbid0IHN0YXJ0IG5ldyB0aHJlYWQKLQotICBpcyByYWlzZWQgbm93LgotCi0tIFNGIGJ1ZyA3NjY2Njk6IFByZXZlbnQgYSBHUEYgb24gaW50ZXJwcmV0ZXIgZXhpdCB3aGVuIHNvY2tldHMgYXJlIGluCi0gIHVzZS4gIFRoZSBpbnRlcnByZXRlciBub3cgY2FsbHMgV1NBQ2xlYW51cCgpIGZyb20gUHlfRmluYWxpemUoKQotICBpbnN0ZWFkIG9mIGZyb20gRExMIHRlYXJkb3duLgotCi1NYWMKLS0tLQotCi0tIEJ1bmRsZWJ1aWxkZXIgbm93IGluaGVyaXRzIGRlZmF1bHQgdmFsdWVzIGluIHRoZSByaWdodCB3YXkuICBJdCB3YXMKLSAgcHJldmlvdXNseSBwb3NzaWJsZSBmb3IgYXBwIGJ1bmRsZXMgdG8gZ2V0IGEgdHlwZSBvZiAiQk5ETCIgaW5zdGVhZAotICBvZiAiQVBQTC4iICBPdGhlciBpbXByb3ZlbWVudHMgaW5jbHVkZSwgYSAtLWJ1aWxkLWlkIG9wdGlvbiB0bwotICBzcGVjaWZ5IHRoZSBDRkJ1bmRsZUlkZW50aWZpZXIgYW5kIHVzaW5nIHRoZSAtLXB5dGhvbiBvcHRpb24gdG8gc2V0Ci0gIHRoZSBleGVjdXRhYmxlIGluIHRoZSBidW5kbGUuCi0KLS0gRml4ZWQgdHdvIGJ1Z3MgaW4gTWFjT1NYIGZyYW1ld29yayBoYW5kbGluZy4KLQotLSBweXRob253IGRpZCBub3QgYWxsb3cgdXNlciBpbnRlcmFjdGlvbiBpbiAyLjNyYzEsIHRoaXMgaGFzIGJlZW4gZml4ZWQuCi0KLS0gUHl0aG9uIGlzIG5vdyBjb21waWxlZCB3aXRoIC1tbm8tZnVzZWQtbWFkZCwgbWFraW5nIGFsbCB0ZXN0cyBwYXNzCi0gIG9uIFBhbnRoZXIuCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDIuMyBiZXRhIDI/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qUmVsZWFzZSBkYXRlOiAyOS1KdW4tMjAwMyoKLQotQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gQSBwcm9ncmFtIGNhbiBub3cgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQWVRIT05JTlNQRUNUIHRvIHNvbWUKLSAgc3RyaW5nIHZhbHVlIGluIFB5dGhvbiwgYW5kIGNhdXNlIHRoZSBpbnRlcnByZXRlciB0byBlbnRlciB0aGUKLSAgaW50ZXJhY3RpdmUgcHJvbXB0IGF0IHByb2dyYW0gZXhpdCwgYXMgaWYgUHl0aG9uIGhhZCBiZWVuIGludm9rZWQKLSAgd2l0aCB0aGUgLWkgb3B0aW9uLgotCi0tIGxpc3QuaW5kZXgoKSBub3cgYWNjZXB0cyBvcHRpb25hbCBzdGFydCBhbmQgc3RvcCBhcmd1bWVudHMuICBTaW1pbGFyCi0gIGNoYW5nZXMgd2VyZSBtYWRlIHRvIFVzZXJMaXN0LmluZGV4KCkuIFNGIGZlYXR1cmUgcmVxdWVzdCA3NTQwMTQuCi0KLS0gU0YgcGF0Y2ggNzUxOTk4IGZpeGVzIGFuIHVud2FudGVkIHNpZGUgZWZmZWN0IG9mIHRoZSBwcmV2aW91cyBmaXgKLSAgZm9yIFNGIGJ1ZyA3NDI4NjAgKHRoZSBuZXh0IGl0ZW0pLgotCi0tIFNGIGJ1ZyA3NDI4NjA6ICJXZWFrS2V5RGljdGlvbmFyeSBfX2RlbGl0ZW1fXyB1c2VzIGl0ZXJrZXlzIi4gIFRoaXMKLSAgd2Fzbid0IHRocmVhZHNhZmUsIHdhcyB2ZXJ5IGluZWZmaWNpZW50IChleHBlY3RlZCB0aW1lIE8obGVuKGRpY3QpKQotICBpbnN0ZWFkIG9mIE8oMSkpLCBhbmQgY291bGQgcmFpc2UgYSBzcHVyaW91cyBSdW50aW1lRXJyb3IgaWYgYW5vdGhlcgotICB0aHJlYWQgbXV0YXRlZCB0aGUgZGljdCBkdXJpbmcgX19kZWxpdGVtX18sIG9yIGlmIGEgY29tcGFyaXNvbiBmdW5jdGlvbgotICBtdXRhdGVkIGl0LiAgSXQgYWxzbyBuZWdsZWN0ZWQgdG8gcmFpc2UgS2V5RXJyb3Igd2hlbiB0aGUga2V5IHdhc24ndAotICBwcmVzZW50OyBkaWRuJ3QgcmFpc2UgVHlwZUVycm9yIHdoZW4gdGhlIGtleSB3YXNuJ3Qgb2YgYSB3ZWFrbHkKLSAgcmVmZXJlbmNhYmxlIHR5cGU7IGFuZCBicm9rZSB2YXJpb3VzIG1vcmUtb3ItbGVzcyBvYnNjdXJlIGRpY3QKLSAgaW52YXJpYW50cyBieSB1c2luZyBhIHNlcXVlbmNlIG9mIGVxdWFsaXR5IGNvbXBhcmlzb25zIG92ZXIgdGhlIHdob2xlCi0gIHNldCBvZiBkaWN0IGtleXMgaW5zdGVhZCBvZiBjb21wdXRpbmcgdGhlIGtleSdzIGhhc2ggY29kZSB0byBuYXJyb3cKLSAgdGhlIHNlYXJjaCB0byB0aG9zZSBrZXlzIHdpdGggdGhlIHNhbWUgaGFzaCBjb2RlLiAgQWxsIG9mIHRoZXNlIGFyZQotICBjb25zaWRlcmVkIHRvIGJlIGJ1Z3MuICBBIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBfX2RlbGl0ZW1fXyByZXBhaXJzIGFsbAotICB0aGF0LCBidXQgbm90ZSB0aGF0IGZpeGluZyB0aGVzZSBidWdzIG1heSBjaGFuZ2UgdmlzaWJsZSBiZWhhdmlvciBpbgotICBjb2RlIHJlbHlpbmcgKHdoZXRoZXIgaW50ZW50aW9uYWxseSBvciBhY2NpZGVudGFsbHkpIG9uIG9sZCBiZWhhdmlvci4KLQotLSBTRiBidWcgNzM0ODY5OiBGaXhlZCBhIGNvbXBpbGVyIGJ1ZyB0aGF0IGNhdXNlZCBhIGZhdGFsIGVycm9yIHdoZW4KLSAgY29tcGlsaW5nIGEgbGlzdCBjb21wcmVoZW5zaW9uIHRoYXQgY29udGFpbmVkIGFub3RoZXIgbGlzdCBjb21wcmVoZW5zaW9uCi0gIGVtYmVkZGVkIGluIGEgbGFtYmRhIGV4cHJlc3Npb24uCi0KLS0gU0YgYnVnIDcwNTIzMTogIGJ1aWx0aW4gcG93KCkgbm8gbG9uZ2VyIGxldHMgdGhlIHBsYXRmb3JtIEMgcG93KCkKLSAgcmFpc2UgLTEuMCB0byBpbnRlZ2VyIHBvd2VycywgYmVjYXVzZSAoYXQgbGVhc3QpIGdsaWJjIGdldHMgaXQgd3JvbmcKLSAgaW4gc29tZSBjYXNlcy4gIFRoZSByZXN1bHQgc2hvdWxkIGJlIC0xLjAgaWYgdGhlIHBvd2VyIGlzIG9kZCBhbmQgMS4wCi0gIGlmIHRoZSBwb3dlciBpcyBldmVuLCBhbmQgYW55IGZsb2F0IHdpdGggYSBzdWZmaWNpZW50bHkgbGFyZ2UgZXhwb25lbnQKLSAgaXMgKG1hdGhlbWF0aWNhbGx5KSBhbiBleGFjdCBldmVuIGludGVnZXIuCi0KLS0gU0YgYnVnIDc1OTIyNzogQSBuZXctc3R5bGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIF9fbm9uemVyb19fKCkgbXVzdAotICByZXR1cm4gYSBib29sIG9yIGludCAoYnV0IG5vdCBhbiBpbnQgc3ViY2xhc3MpIGZyb20gdGhhdCBtZXRob2QuICBUaGlzCi0gIG1hdGNoZXMgdGhlIHJlc3RyaWN0aW9uIG9uIGNsYXNzaWMgY2xhc3Nlcy4KLQotLSBUaGUgZW5jb2RpbmcgYXR0cmlidXRlIGhhcyBiZWVuIGFkZGVkIGZvciBmaWxlIG9iamVjdHMsIGFuZCBzZXQgdG8KLSAgdGhlIHRlcm1pbmFsIGVuY29kaW5nIG9uIFVuaXggYW5kIFdpbmRvd3MuCi0KLS0gVGhlIHNvZnRzcGFjZSBhdHRyaWJ1dGUgb2YgZmlsZSBvYmplY3RzIGJlY2FtZSByZWFkLW9ubHkgYnkgb3ZlcnNpZ2h0LgotICBJdCdzIHdyaXRhYmxlIGFnYWluLgotCi0tIFJldmVydGVkIGEgMi4zIGJldGEgMSBjaGFuZ2UgdG8gaXRlcmF0b3JzIGZvciBzdWJjbGFzc2VzIG9mIGxpc3QgYW5kCi0gIHR1cGxlLiAgQnkgZGVmYXVsdCwgdGhlIGl0ZXJhdG9ycyBub3cgYWNjZXNzIGRhdGEgZWxlbWVudHMgZGlyZWN0bHkKLSAgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIF9fZ2V0aXRlbV9fLiAgSWYgX19nZXRpdGVtX18gYWNjZXNzIGlzCi0gIHByZWZlcnJlZCwgdGhlbiBfX2l0ZXJfXyBjYW4gYmUgb3ZlcnJpZGRlbi4KLQotLSBTRiBidWcgNzM1MjQ3OiBUaGUgc3RhdGljbWV0aG9kIGFuZCBzdXBlciB0eXBlcyBwYXJ0aWNpcGF0ZSBpbgotICBnYXJiYWdlIGNvbGxlY3Rpb24uIEJlZm9yZSB0aGlzIGNoYW5nZSwgaXQgd2FzIHBvc3NpYmxlIGZvciBsZWFrcyB0bwotICBvY2N1ciBpbiBmdW5jdGlvbnMgd2l0aCBub24tZ2xvYmFsIGZyZWUgdmFyaWFibGVzIHRoYXQgdXNlZCB0aGVzZSB0eXBlcy4KLQotRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gdGhlIHNvY2tldCBtb2R1bGUgaGFzIGEgbmV3IGV4Y2VwdGlvbiwgc29ja2V0LnRpbWVvdXQsIHRvIGFsbG93Ci0gIHRpbWVvdXRzIHRvIGJlIGhhbmRsZWQgc2VwYXJhdGVseSBmcm9tIG90aGVyIHNvY2tldCBlcnJvcnMuCi0KLS0gU0YgYnVnIDc1MTI3NjogY1BpY2tsZSBoYXMgZml4ZWQgdG8gcHJvcGFnYXRlIGV4Y2VwdGlvbnMgcmFpc2VkIGluCi0gIHVzZXIgY29kZS4gIEluIGVhcmxpZXIgdmVyc2lvbnMsIGNQaWNrbGUgY2F1Z2h0IGFuZCBpZ25vcmVkIGFueQotICBleGNlcHRpb24gd2hlbiBpdCBwZXJmb3JtZWQgb3BlcmF0aW9ucyB0aGF0IGl0IGV4cGVjdGVkIHRvIHJhaXNlCi0gIHNwZWNpZmljIGV4Y2VwdGlvbnMgbGlrZSBBdHRyaWJ1dGVFcnJvci4KLQotLSBjUGlja2xlIFBpY2tsZXIgYW5kIFVucGlja2xlciBvYmplY3RzIG5vdyBwYXJ0aWNpcGF0ZSBpbiBnYXJiYWdlCi0gIGNvbGxlY3Rpb24uCi0KLS0gbWltZXRvb2xzLmNob29zZV9ib3VuZGFyeSgpIGNvdWxkIHJldHVybiBkdXBsaWNhdGUgc3RyaW5ncyBhdCB0aW1lcywKLSAgZXNwZWNpYWxseSBsaWtlbHkgb24gV2luZG93cy4gIFRoZSBzdHJpbmdzIHJldHVybmVkIGFyZSBub3cgZ3VhcmFudGVlZAotICB1bmlxdWUgd2l0aGluIGEgc2luZ2xlIHByb2dyYW0gcnVuLgotCi0tIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpIHJhaXNlcyBLZXlib2FyZEludGVycnVwdCBpbiB0aGUgbWFpbiB0aHJlYWQuCi0gIGR1bW15X3RocmVhZCBoYXMgYWxzbyBiZWVuIG1vZGlmaWVkIHRvIHRyeSB0byBzaW11bGF0ZSB0aGUgYmVoYXZpb3IuCi0KLS0gYXJyYXkuYXJyYXkuaW5zZXJ0KCkgbm93IHRyZWF0cyBuZWdhdGl2ZSBpbmRpY2VzIGFzIGJlaW5nIHJlbGF0aXZlCi0gIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5LCBqdXN0IGxpa2UgbGlzdC5pbnNlcnQoKSBkb2VzLiAoU0YgYnVnICM3MzkzMTMpCi0KLS0gVGhlIGRhdGV0aW1lIG1vZHVsZSBjbGFzc2VzIGRhdGV0aW1lLCB0aW1lLCBhbmQgdGltZWRlbHRhIGFyZSBub3cKLSAgcHJvcGVybHkgc3ViY2xhc3NhYmxlLgotCi0tIF90a2ludGVyLntnZXR8c2V0fWJ1c3l3YWl0aW50ZXJ2YWwgd2FzIGFkZGVkLgotCi0tIGl0ZXJ0b29scy5pc2xpY2UoKSBub3cgYWNjZXB0cyBzdG9wPU5vbmUgYXMgZG9jdW1lbnRlZC4KLSAgRml4ZXMgU0YgYnVnICM3MzA2ODUuCi0KLS0gdGhlIGJzZGRiMTg1IG1vZHVsZSBpcyBidWlsdCBpbiBvbmUgcmVzdHJpY3RlZCBpbnN0YW5jZSAtCi0gIC91c3IvaW5jbHVkZS9kYi5oIGV4aXN0cyBhbmQgZGVmaW5lcyBIQVNIVkVSU0lPTiB0byBiZSAyLiAgVGhpcyBpcyB0cnVlCi0gIGZvciBtYW55IEJTRC1kZXJpdmVkIHN5c3RlbXMuCi0KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIFNvbWUgaGFwcHkgZG9jdGVzdCBleHRlbnNpb25zIGZyb20gSmltIEZ1bHRvbiBoYXZlIGJlZW4gYWRkZWQgdG8KLSAgZG9jdGVzdC5weS4gIFRoZXNlIGFyZSBhbHJlYWR5IGJlaW5nIHVzZWQgaW4gWm9wZTMuICBUaGUgdHdvCi0gIHByaW1hcnkgb25lczoKLQotICBkb2N0ZXN0LmRlYnVnKG1vZHVsZSwgbmFtZSkgZXh0cmFjdHMgdGhlIGRvY3Rlc3RzIGZyb20gdGhlIG5hbWVkIG9iamVjdAotICBpbiB0aGUgZ2l2ZW4gbW9kdWxlLCBwdXRzIHRoZW0gaW4gYSB0ZW1wIGZpbGUsIGFuZCBzdGFydHMgcGRiIHJ1bm5pbmcKLSAgb24gdGhhdCBmaWxlLiAgVGhpcyBpcyBncmVhdCB3aGVuIGEgZG9jdGVzdCBmYWlscy4KLQotICBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZShtb2R1bGU9Tm9uZSkgcmV0dXJucyBhIHN5bnRoZXNpemVkIHVuaXR0ZXN0Ci0gIFRlc3RTdWl0ZSBpbnN0YW5jZSwgdG8gYmUgcnVuIGJ5IHRoZSB1bml0dGVzdCBmcmFtZXdvcmssIHdoaWNoCi0gIHJ1bnMgYWxsIHRoZSBkb2N0ZXN0cyBpbiB0aGUgbW9kdWxlLiAgVGhpcyBhbGxvd3Mgd3JpdGluZyB0ZXN0cyBpbgotICBkb2N0ZXN0IHN0eWxlICh3aGljaCBjYW4gYmUgY2xlYXJlciBhbmQgc2hvcnRlciB0aGFuIHdyaXRpbmcgdGVzdHMKLSAgaW4gdW5pdHRlc3Qgc3R5bGUpLCB3aXRob3V0IGxvc2luZyB1bml0dGVzdCdzIHBvd2VyZnVsIHRlc3RpbmcKLSAgZnJhbWV3b3JrIGZlYXR1cmVzICh3aGljaCBkb2N0ZXN0IGxhY2tzKS4KLQotLSBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGRvY3Rlc3RzIGNyZWF0ZWQgYmVmb3JlIDIuMywgaWYgYW4gZXhwZWN0ZWQKLSAgb3V0cHV0IGJsb2NrIGNvbnNpc3RzIHNvbGVseSBvZiAiMSIgYW5kIHRoZSBhY3R1YWwgb3V0cHV0IGJsb2NrCi0gIGNvbnNpc3RzIHNvbGVseSBvZiAiVHJ1ZSIsIGl0J3MgYWNjZXB0ZWQgYXMgYSBtYXRjaDsgc2ltaWxhcmx5Ci0gIGZvciAiMCIgYW5kICJGYWxzZSIuICBUaGlzIGlzIHF1aXRlIHVuLWRvY3Rlc3QtbGlrZSwgYnV0IGlzIHByYWN0aWNhbC4KLSAgVGhlIGJlaGF2aW9yIGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIHRoZSBuZXcgZG9jdGVzdCBtb2R1bGUKLSAgY29uc3RhbnQgRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSB0byB0aGUgbmV3IG9wdGlvbmZsYWdzIG9wdGlvbmFsCi0gIGFyZ3VtZW50LgotCi0tIFppcEZpbGUudGVzdHppcCgpIG5vdyBvbmx5IHRyYXBzIEJhZFppcGZpbGUgZXhjZXB0aW9ucy4gIFByZXZpb3VzbHksCi0gIGEgYmFyZSBleGNlcHQgY2F1Z2h0IHRvIG11Y2ggYW5kIHJlcG9ydGVkIGFsbCBlcnJvcnMgYXMgYSBwcm9ibGVtCi0gIGluIHRoZSBhcmNoaXZlLgotCi0tIFRoZSBsb2dnaW5nIG1vZHVsZSBub3cgaGFzIGEgbmV3IGZ1bmN0aW9uLCBtYWtlTG9nUmVjb3JkKCkgbWFraW5nCi0gIExvZ0hhbmRsZXIgZWFzaWVyIHRvIGludGVyYWN0IHdpdGggRGF0YWdyYW1IYW5kbGVyIGFuZCBTb2NrZXRIYW5kbGVyLgotCi0tIFRoZSBjZ2l0YiBtb2R1bGUgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBwbGFpbiB0ZXh0IGRpc3BsYXkgKFNGIHBhdGNoCi0gIDU2OTU3NCkuCi0KLS0gQSBicmFuZCBuZXcgdmVyc2lvbiBvZiBJRExFIChmcm9tIHRoZSBJRExFZm9yayBwcm9qZWN0IGF0Ci0gIFNvdXJjZUZvcmdlKSBpcyBub3cgaW5jbHVkZWQgYXMgTGliL2lkbGVsaWIuICBUaGUgb2xkIFRvb2xzL2lkbGUgaXMKLSAgbm8gbW9yZS4KLQotLSBBZGRlZCBhIG5ldyBtb2R1bGU6IHRyYWNlIChkb2N1bWVudGF0aW9uIG1pc3NpbmcpLiAgVGhpcyBtb2R1bGUgdXNlZAotICB0byBiZSBkaXN0cmlidXRlZCBpbiBUb29scy9zY3JpcHRzLiAgSXQgdXNlcyBzeXMuc2V0dHJhY2UoKSB0byB0cmFjZQotICBjb2RlIGV4ZWN1dGlvbiAtLSBlaXRoZXIgZnVuY3Rpb24gY2FsbHMgb3IgaW5kaXZpZHVhbCBsaW5lcy4gIEl0IGNhbgotICBnZW5lcmF0ZSB0cmFjaW5nIG91dHB1dCBkdXJpbmcgZXhlY3V0aW9uIG9yIGEgcG9zdC1tb3J0ZW0gcmVwb3J0IG9mCi0gIGNvZGUgY292ZXJhZ2UuCi0KLS0gVGhlIHRocmVhZGluZyBtb2R1bGUgaGFzIG5ldyBmdW5jdGlvbnMgc2V0dHJhY2UoKSBhbmQgc2V0cHJvZmlsZSgpCi0gIHRoYXQgY29vcGVyYXRlIHdpdGggdGhlIGZ1bmN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzeXMKLSAgbW9kdWxlLiAgQSBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIHRocmVhZGluZyBtb2R1bGUgd2lsbAotICBiZSB1c2VkIGZvciBhbGwgdGhyZWFkcyBpdCBjcmVhdGVzLiAgVGhlIG5ldyB0cmFjZSBtb2R1bGUgdXNlcyB0aGlzCi0gIHRvIHByb3ZpZGUgdHJhY2luZyBmb3IgY29kZSBydW5uaW5nIGluIHRocmVhZHMuCi0KLS0gY29weS5weTogYXBwbGllZCBTRiBwYXRjaCA3MDc5MDAsIGZpeGluZyBidWcgNzAyODU4LCBieSBTdGV2ZW4KLSAgVGFzY2h1ay4gIENvcHlpbmcgYSBuZXctc3R5bGUgY2xhc3MgdGhhdCBoYWQgYSByZWZlcmVuY2UgdG8gaXRzZWxmCi0gIGRpZG4ndCB3b3JrLiAgKFRoZSBzYW1lIHRoaW5nIHdvcmtlZCBmaW5lIGZvciBvbGQtc3R5bGUgY2xhc3Nlcy4pCi0gIEJ1aWx0aW4gZnVuY3Rpb25zIGFyZSBub3cgdHJlYXRlZCBhcyBhdG9taWMsIGZpeGluZyBidWcgIzc0NjMwNC4KLQotLSBkaWZmbGliLnB5IGhhcyB0d28gbmV3IGZ1bmN0aW9uczogIGNvbnRleHRfZGlmZigpIGFuZCB1bmlmaWVkX2RpZmYoKS4KLQotLSBNb3JlIGZpeGVzIHRvIHVybGxpYiAoU0YgNTQ5MTUxKTogKGEpIFdoZW4gcmVkaXJlY3RpbmcsIGFsd2F5cyB1c2UKLSAgR0VULiAgVGhpcyBpcyBjb21tb24gcHJhY3RpY2UgYW5kIG1vcmUtb3ItbGVzcyBzYW5jdGlvbmVkIGJ5IHRoZQotICBIVFRQIHN0YW5kYXJkLiAoYikgQWRkIGEgaGFuZGxlciBmb3IgMzA3IHJlZGlyZWN0aW9uLCB3aGljaCBiZWNvbWVzCi0gIGFuIGVycm9yIGZvciBQT1NULCBidXQgYSByZWd1bGFyIHJlZGlyZWN0IGZvciBHRVQgYW5kIEhFQUQKLQotLSBBZGRlZCBvcHRpb25hbCAnb25lcnJvcicgYXJndW1lbnQgdG8gb3Mud2FsaygpLCB0byBjb250cm9sIGVycm9yCi0gIGhhbmRsaW5nLgotCi0tIGluc3BlY3QuaXN7bWV0aG9kfGRhdGF9ZGVzY3JpcHRvciB3YXMgYWRkZWQsIHRvIGFsbG93IHB5ZG9jIGRpc3BsYXkKLSAgX19kb2NfXyBvZiBkYXRhIGRlc2NyaXB0b3JzLgotCi0tIEZpeGVkIHNvY2tldCBzcGVlZCBsb3NzIGNhdXNlZCBieSB1c2Ugb2YgdGhlIF9zb2NrZXRvYmplY3Qgd3JhcHBlciBjbGFzcwotICBpbiBzb2NrZXQucHkuCi0KLS0gdGltZWl0LnB5IG5vdyBjaGVja3MgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZvciBpbXBvcnRzLgotCi0tIHVybGxpYjIucHkgbm93IGtub3dzIGhvdyB0byBvcmRlciBwcm94eSBjbGFzc2VzLCBzbyB0aGUgdXNlciBkb2Vzbid0Ci0gIGhhdmUgdG8gaW5zZXJ0IGl0IGluIGZyb250IG9mIG90aGVyIGNsYXNzZXMsIG5vciBkbyBkaXJ0eSB0cmlja3MgbGlrZQotICBpbnNlcnRpbmcgYSAiZHVtbXkiIEhUVFBIYW5kbGVyIGFmdGVyIGEgUHJveHlIYW5kbGVyIHdoZW4gYnVpbGRpbmcgYW4KLSAgb3BlbmVyIHdpdGggcHJveHkgc3VwcG9ydC4KLQotLSBJdGVyYXRvcnMgaGF2ZSBiZWVuIGFkZGVkIGZvciBkYm0ga2V5cy4KLQotLSByYW5kb20uUmFuZG9tIG9iamVjdHMgY2FuIG5vdyBiZSBwaWNrbGVkLgotCi1Ub29scy9EZW1vcwotLS0tLS0tLS0tLS0KLQotLSBweWRvYyBub3cgb2ZmZXJzIGhlbHAgb24ga2V5d29yZHMgYW5kIHRvcGljcy4KLQotLSBUb29scy9pZGxlIGlzIGdvbmU7IGxvbmcgbGl2ZSBMaWIvaWRsZWxpYi4KLQotLSBkaWZmLnB5IHByaW50cyBmaWxlIGRpZmZzIGluIGNvbnRleHQsIHVuaWZpZWQsIG9yIG5kaWZmIGZvcm1hdHMsCi0gIHByb3ZpZGluZyBhIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gZGlmZmxpYi5weS4KLQotLSB0ZXhjaGVjay5weSBpcyBhIG5ldyBzY3JpcHQgZm9yIG1ha2luZyBhIHJvdWdoIHZhbGlkYXRpb24gb2YgUHl0aG9uIExhVGVYCi0gIGZpbGVzLgotCi1CdWlsZAotLS0tLS0KLQotLSBTZXR0aW5nIERFU1RESVIgZHVyaW5nICdtYWtlIGluc3RhbGwnIG5vdyBhbGxvd3Mgc3BlY2lmeWluZyBhCi0gIGRpZmZlcmVudCByb290IGRpcmVjdG9yeS4KLQotQyBBUEkKLS0tLS0tCi0KLS0gUHlUeXBlX1JlYWR5KCk6ICBJZiBhIHR5cGUgZGVjbGFyZXMgdGhhdCBpdCBwYXJ0aWNpcGF0ZXMgaW4gZ2MKLSAgKFB5X1RQRkxBR1NfSEFWRV9HQyksIGFuZCBpdHMgYmFzZSBjbGFzcyBkb2VzIG5vdCwgYW5kIGl0cyBiYXNlIGNsYXNzJ3MKLSAgdHBfZnJlZSBzbG90IGlzIHRoZSBkZWZhdWx0IF9QeU9iamVjdF9EZWwsIGFuZCB0eXBlIGRvZXMgbm90IGRlZmluZQotICBhIHRwX2ZyZWUgc2xvdCBpdHNlbGYsIF9QeU9iamVjdF9HQ19EZWwgaXMgYXNzaWduZWQgdG8gdHlwZS0+dHBfZnJlZS4KLSAgUHJldmlvdXNseSBfUHlPYmplY3RfRGVsIHdhcyBpbmhlcml0ZWQsIHdoaWNoIGNvdWxkIGF0IGJlc3QgbGVhZCB0byBhCi0gIHNlZ2ZhdWx0LiAgSW4gYWRkaXRpb24sIGlmIGV2ZW4gYWZ0ZXIgdGhpcyBtYWdpYyB0aGUgdHlwZSdzIHRwX2ZyZWUKLSAgc2xvdCBpcyBfUHlPYmplY3RfRGVsIG9yIE5VTEwsIGFuZCB0aGUgdHlwZSBpcyBhIGJhc2UgdHlwZQotICAoUHlfVFBGTEFHU19CQVNFVFlQRSksIFR5cGVFcnJvciBpcyByYWlzZWQ6ICBzaW5jZSB0aGUgdHlwZSBpcyBhIGJhc2UKLSAgdHlwZSwgaXRzIGRlYWxsb2MgZnVuY3Rpb24gbXVzdCBjYWxsIHR5cGUtPnRwX2ZyZWUsIGFuZCBzaW5jZSB0aGUgdHlwZQotICBpcyBnYydhYmxlLCB0cF9mcmVlIG11c3Qgbm90IGJlIE5VTEwgb3IgX1B5T2JqZWN0X0RlbC4KLQotLSBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjKCk6IEEgbmV3IEFQSSAoZGVsaWJlcmF0ZWx5IGFjY2Vzc2libGUgb25seQotICBmcm9tIEMpIHRvIGludGVycnVwdCBhIHRocmVhZCBieSBzZW5kaW5nIGl0IGFuIGV4Y2VwdGlvbi4gIEl0IGlzCi0gIGludGVudGlvbmFsIHRoYXQgeW91IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gQyBleHRlbnNpb24gdG8gY2FsbCBpdAotICBmcm9tIFB5dGhvbi4KLQotCi1OZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0tCi0KLU5vbmUgdGhpcyB0aW1lLgotCi1UZXN0cwotLS0tLS0KLQotLSB0ZXN0X2ltcCByZXdyaXR0ZW4gc28gdGhhdCBpdCBkb2Vzbid0IHJhaXNlIFJ1bnRpbWVFcnJvciBpZiBydW4gYXMgYQotICBzaWRlIGVmZmVjdCBvZiBiZWluZyBpbXBvcnRlZCAoImltcG9ydCB0ZXN0LmF1dG90ZXN0IikuCi0KLVdpbmRvd3MKLS0tLS0tLS0KLQotLSBUaGUgV2luZG93cyBpbnN0YWxsZXIgc2hpcHMgd2l0aCBUY2wvVGsgOC40LjMgKHVwZ3JhZGVkIGZyb20gOC40LjEpLgotCi0tIFRoZSBpbnN0YWxsZXIgYWx3YXlzIHN1Z2dlc3RlZCB0aGF0IFB5dGhvbiBiZSBpbnN0YWxsZWQgb24gdGhlIEM6Ci0gIGRyaXZlLCBkdWUgdG8gYSBoYXJkY29kZWQgIkM6IiBnZW5lcmF0ZWQgYnkgdGhlIFdpc2UgaW5zdGFsbGF0aW9uCi0gIHdpemFyZC4gIFBlb3BsZSB3aXRoIG1hY2hpbmVzIHdoZXJlIEM6IGlzIG5vdCB0aGUgc3lzdGVtIGRyaXZlCi0gIHVzdWFsbHkgd2FudCBQeXRob24gaW5zdGFsbGVkIG9uIHdoaWNoZXZlciBkcml2ZSBpcyB0aGVpciBzeXN0ZW0gZHJpdmUKLSAgaW5zdGVhZC4gIFdlIHJlbW92ZWQgdGhlIGhhcmRjb2RlZCAiQzoiLCBhbmQgdHdvIHRlc3RlcnMgb24gbWFjaGluZXMKLSAgd2hlcmUgQzogaXMgbm90IHRoZSBzeXN0ZW0gZHJpdmUgcmVwb3J0IHRoYXQgdGhlIGluc3RhbGxlciBub3cKLSAgc3VnZ2VzdHMgdGhlaXIgc3lzdGVtIGRyaXZlLiAgTm90ZSB0aGF0IHlvdSBjYW4gYWx3YXlzIHNlbGVjdCB0aGUKLSAgZGlyZWN0b3J5IHlvdSB3YW50IGluIHRoZSAiU2VsZWN0IERlc3RpbmF0aW9uIERpcmVjdG9yeSIgZGlhbG9nIC0tCi0gIHRoYXQncyB3aGF0IGl0J3MgZm9yLgotCi1NYWMKLS0tLQotCi0tIFRoZXJlJ3MgYSBuZXcgbW9kdWxlIGNhbGxlZCAiYXV0b0dJTCIsIHdoaWNoIG9mZmVycyBhIG1lY2hhbmlzbSB0bwotICBhdXRvbWF0aWNhbGx5IHJlbGVhc2UgdGhlIEdsb2JhbCBJbnRlcnByZXRlciBMb2NrIHdoZW4gYW4gZXZlbnQgbG9vcAotICBnb2VzIHRvIHNsZWVwLCBhbGxvd2luZyBvdGhlciB0aHJlYWRzIHRvIHJ1bi4gSXQncyBjdXJyZW50bHkgb25seQotICBzdXBwb3J0ZWQgb24gT1NYLCBpbiB0aGUgTWFjaC1PIHZlcnNpb24uCi0tIFRoZSBPU0EgbW9kdWxlcyBub3cgYWxsb3cgZGlyZWN0IGFjY2VzcyB0byBwcm9wZXJ0aWVzIG9mIHRoZQotICB0b3BsZXZlbCBhcHBsaWNhdGlvbiBjbGFzcyAoaW4gQXBwbGVTY3JpcHQgdGVybWlub2xvZ3kpLgotLSBUaGUgUGFja2FnZSBNYW5hZ2VyIGNhbiBub3cgdXBkYXRlIGl0c2VsZi4KLQotU291cmNlRm9yZ2UgQnVncyBhbmQgUGF0Y2hlcyBBcHBsaWVkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotNDMwMTYwLCA0NzE4OTMsIDUwMTcxNiwgNTQyNTYyLCA1NDkxNTEsIDU2OTU3NCwgNTk1ODM3LCA1OTY0MzQsCi01OTgxNjMsIDYwNDIxMCwgNjA0NzE2LCA2MTAzMzIsIDYxMjYyNywgNjE0NzcwLCA2MjAxOTAsIDYyMTg5MSwKLTYyMjA0MiwgNjM5MTM5LCA2NDAyMzYsIDY0NDM0NSwgNjQ5NzQyLCA2NDk3NDIsIDY1ODIzMywgNjYwMDIyLAotNjYxMzE4LCA2NjE2NzYsIDY2MjgwNywgNjYyOTIzLCA2NjYyMTksIDY3Mjg1NSwgNjc4MzI1LCA2ODIzNDcsCi02ODM0ODYsIDY4NDk4MSwgNjg1NzczLCA2ODYyNTQsIDY5Mjc3NiwgNjkyOTU5LCA2OTMwOTQsIDY5Njc3NywKLTY5Nzk4OSwgNzAwODI3LCA3MDM2NjYsIDcwODQ5NSwgNzA4NjA0LCA3MDg5MDEsIDcxMDczMywgNzExOTAyLAotNzEzNzIyLCA3MTU3ODIsIDcxODI4NiwgNzE5MzU5LCA3MTkzNjcsIDcyMzEzNiwgNzIzODMxLCA3MjM5NjIsCi03MjQ1ODgsIDcyNDc2NywgNzI0NzY3LCA3MjU5NDIsIDcyNjE1MCwgNzI2NDQ2LCA3MjY4NjksIDcyNzA1MSwKLTcyNzcxOSwgNzI3NzE5LCA3Mjc4MDUsIDcyODI3NywgNzI4NTYzLCA3Mjg2NTYsIDcyOTA5NiwgNzI5MTAzLAotNzI5MjkzLCA3MjkyOTcsIDcyOTMwMCwgNzI5MzE3LCA3MjkzOTUsIDcyOTYyMiwgNzI5ODE3LCA3MzAxNzAsCi03MzAyOTYsIDczMDU5NCwgNzMwNjg1LCA3MzA4MjYsIDczMDk2MywgNzMxMjA5LCA3MzE0MDMsIDczMTUwNCwKLTczMTUxNCwgNzMxNjI2LCA3MzE2MzUsIDczMTY0MywgNzMxNjQ0LCA3MzE2NDQsIDczMTY4OSwgNzMyMTI0LAotNzMyMTQzLCA3MzIyMzQsIDczMjI4NCwgNzMyMjg0LCA3MzI0NzksIDczMjc2MSwgNzMyNzgzLCA3MzI5NTEsCi03MzM2NjcsIDczMzc4MSwgNzM0MTE4LCA3MzQyMzEsIDczNDg2OSwgNzM1MDUxLCA3MzUyOTMsIDczNTUyNywKLTczNTYxMywgNzM1Njk0LCA3MzY5NjIsIDczNjk2MiwgNzM3OTcwLCA3MzgwNjYsIDczOTMxMywgNzQwMDU1LAotNzQwMjM0LCA3NDAzMDEsIDc0MTgwNiwgNzQyMTI2LCA3NDI3NDEsIDc0Mjg2MCwgNzQyODYwLCA3NDI5MTEsCi03NDQwNDEsIDc0NDEwNCwgNzQ0MjM4LCA3NDQ2ODcsIDc0NDg3NywgNzQ1MDU1LCA3NDU0NzgsIDc0NTUyNSwKLTc0NTYyMCwgNzQ2MDEyLCA3NDYzMDQsIDc0NjM2NiwgNzQ2ODAxLCA3NDY5NTMsIDc0NzM0OCwgNzQ3NjY3LAotNzQ3OTU0LCA3NDg4NDYsIDc0ODg0OSwgNzQ4OTczLCA3NDg5NzUsIDc0OTE5MSwgNzQ5MjEwLCA3NDk3NTksCi03NDk4MzEsIDc0OTkxMSwgNzUwMDA4LCA3NTAwOTIsIDc1MDU0MiwgNzUwNTk1LCA3NTEwMzgsIDc1MTEwNywKLTc1MTI3NiwgNzUxNDUxLCA3NTE5MTYsIDc1MTk0MSwgNzUxOTU2LCA3NTE5OTgsIDc1MjY3MSwgNzUzNDUxLAotNzUzNjAyLCA3NTM2MTcsIDc1Mzg0NSwgNzUzOTI1LCA3NTQwMTQsIDc1NDM0MCwgNzU0NDQ3LCA3NTUwMzEsCi03NTUwODcsIDc1NTE0NywgNzU1MjQ1LCA3NTU2ODMsIDc1NTk4NywgNzU2MDMyLCA3NTY5OTYsIDc1NzA1OCwKLTc1NzIyOSwgNzU3ODE4LCA3NTc4MjEsIDc1NzgyMiwgNzU4MTEyLCA3NTg5MTAsIDc1OTIyNywgNzU5ODg5LAotNzYwMjU3LCA3NjA3MDMsIDc2MDc5MiwgNzYxMTA0LCA3NjEzMzcsIDc2MTUxOSwgNzYxODMwLCA3NjI0NTUKLQotCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgYmV0YSAxPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMjUtQXByLTIwMDMqCi0KLUNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIE5ldyBmb3JtYXQgY29kZXMgQiwgSCwgSSwgayBhbmQgSyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgZm9yCi0gIFB5QXJnX1BhcnNlVHVwbGUgYW5kIFB5QnVpbGRfVmFsdWUuCi0KLS0gTmV3IGJ1aWx0aW4gZnVuY3Rpb24gc3VtKHNlcSwgc3RhcnQ9MCkgcmV0dXJucyB0aGUgc3VtIG9mIGFsbCB0aGUKLSAgaXRlbXMgaW4gaXRlcmFibGUgb2JqZWN0IHNlcSwgcGx1cyBzdGFydCAoaXRlbXMgYXJlIG5vcm1hbGx5IG51bWJlcnMsCi0gIGFuZCBjYW5ub3QgYmUgc3RyaW5ncykuCi0KLS0gYm9vbCgpIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cyBub3cgcmV0dXJucyBGYWxzZSByYXRoZXIgdGhhbgotICByYWlzaW5nIGFuIGV4Y2VwdGlvbi4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGNhbGxpbmcgdGhlCi0gIGNvbnN0cnVjdG9ycyBmb3IgdGhlIG90aGVyIGJ1aWx0aW4gdHlwZXMgLS0gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnQKLSAgdGhleSBhbGwgcmV0dXJuIHRoZSBmYWxzZSB2YWx1ZSBvZiB0aGF0IHR5cGUuICAoU0YgcGF0Y2ggIzcyNDEzNSkKLQotLSBJbiBzdXBwb3J0IG9mIFBFUCAyNjkgKG1ha2luZyB0aGUgcGdlbiBwYXJzZXIgZ2VuZXJhdG9yIGFjY2Vzc2libGUKLSAgZnJvbSBQeXRob24pLCBzb21lIGNoYW5nZXMgdG8gdGhlIHBnZW4gY29kZSBzdHJ1Y3R1cmUgd2VyZSBtYWRlOyBhCi0gIGZldyBmaWxlcyB0aGF0IHVzZWQgdG8gYmUgbGlua2VkIG9ubHkgd2l0aCBwZ2VuIGFyZSBub3cgbGlua2VkIHdpdGgKLSAgUHl0aG9uIGl0c2VsZi4KLQotLSBUaGUgcmVwcigpIG9mIGEgd2Vha3JlZiBvYmplY3Qgbm93IHNob3dzIHRoZSBfX25hbWVfXyBhdHRyaWJ1dGUgb2YKLSAgdGhlIHJlZmVyZW5jZWQgb2JqZWN0LCBpZiBpdCBoYXMgb25lLgotCi0tIHN1cGVyKCkgbm8gbG9uZ2VyIGlnbm9yZXMgZGF0YSBkZXNjcmlwdG9ycywgZXhjZXB0IF9fY2xhc3NfXy4gIFNlZQotICB0aGUgdGhyZWFkIHN0YXJ0ZWQgYXQKLSAgaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDAzLUFwcmlsLzAzNDMzOC5odG1sCi0KLS0gbGlzdC5pbnNlcnQoaSwgeCkgbm93IGludGVycHJldHMgbmVnYXRpdmUgaSBhcyBpdCB3b3VsZCBiZQotICBpbnRlcnByZXRlZCBieSBzbGljaW5nLCBzbyBuZWdhdGl2ZSB2YWx1ZXMgY291bnQgZnJvbSB0aGUgZW5kIG9mIHRoZQotICBsaXN0LiAgVGhpcyB3YXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgc3VjaCBhbiBpbnRlcnByZXRhdGlvbiB3YXMgbm90Ci0gIHBsYWNlZCBvbiBhIGxpc3QgaW5kZXguCi0KLS0gcmFuZ2UoKSBub3cgd29ya3MgZXZlbiBpZiB0aGUgYXJndW1lbnRzIGFyZSBsb25ncyB3aXRoIG1hZ25pdHVkZQotICBsYXJnZXIgdGhhbiBzeXMubWF4aW50LCBhcyBsb25nIGFzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHNlcXVlbmNlCi0gIGZpdHMuICBFLmcuLCByYW5nZSgyKioxMDAsIDIqKjEwMSwgMioqMTAwKSBpcyB0aGUgZm9sbG93aW5nIGxpc3Q6Ci0gIFsxMjY3NjUwNjAwMjI4MjI5NDAxNDk2NzAzMjA1Mzc2TF0uICAoU0YgcGF0Y2ggIzcwNzQyNy4pCi0KLS0gU29tZSBob3JyaWRseSBvYnNjdXJlIHByb2JsZW1zIHdlcmUgZml4ZWQgaW52b2x2aW5nIGludGVyYWN0aW9uCi0gIGJldHdlZW4gZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBvbGQtc3R5bGUgY2xhc3NlcyB3aXRoICJhbWJpdGlvdXMiCi0gIGdldGF0dHIgaG9va3MuICBJZiBhbiBvbGQtc3R5bGUgaW5zdGFuY2UgZGlkbid0IGhhdmUgYSBfX2RlbF9fIG1ldGhvZCwKLSAgYnV0IGRpZCBoYXZlIGEgX19nZXRhdHRyX18gaG9vaywgYW5kIHRoZSBpbnN0YW5jZSBiZWNhbWUgcmVhY2hhYmxlCi0gIG9ubHkgZnJvbSBhbiB1bnJlYWNoYWJsZSBjeWNsZSwgYW5kIHRoZSBob29rIHJlc3VycmVjdGVkIG9yIGRlbGV0ZWQKLSAgdW5yZWFjaGFibGUgb2JqZWN0cyB3aGVuIGFza2VkIHRvIHJlc29sdmUgIl9fZGVsX18iLCBhbnl0aGluZyB1cCB0bwotICBhIHNlZ2ZhdWx0IGNvdWxkIGhhcHBlbi4gIFRoYXQncyBiZWVuIHJlcGFpcmVkLgotCi0tIGRpY3QucG9wIG5vdyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCBzcGVjaWZ5aW5nIGEgZGVmYXVsdAotICB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIGRpY3QuICBJZiBhIGRlZmF1bHQgaXMgbm90Ci0gIGdpdmVuIGFuZCB0aGUga2V5IGlzIG5vdCBmb3VuZCwgYSBLZXlFcnJvciB3aWxsIHN0aWxsIGJlIHJhaXNlZC4KLSAgUGFyYWxsZWwgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gVXNlckRpY3QuVXNlckRpY3QgYW5kIFVzZXJEaWN0LkRpY3RNaXhpbi4KLSAgW1NGIHBhdGNoICM2OTM3NTNdIChjb250cmlidXRlZCBieSBNaWNoYWVsIFN0b25lLikKLQotLSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgd2FzIGFkZGVkIHRvIGV4cG9zZQotICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLgotCi0tIE5ldyBmdW5jdGlvbiBzeXMuZXhjX2NsZWFyKCkgY2xlYXJzIHRoZSBjdXJyZW50IGV4Y2VwdGlvbi4gIFRoaXMgaXMKLSAgcmFyZWx5IG5lZWRlZCwgYnV0IGNhbiBzb21ldGltZXMgYmUgdXNlZnVsIHRvIHJlbGVhc2Ugb2JqZWN0cwotICByZWZlcmVuY2VkIGJ5IHRoZSB0cmFjZWJhY2sgaGVsZCBpbiBzeXMuZXhjX2luZm8oKVsyXS4gIChTRiBwYXRjaAotICAjNjkzMTk1LikKLQotLSBPbiA2NC1iaXQgc3lzdGVtcywgYSBkaWN0aW9uYXJ5IGNvdWxkIGNvbnRhaW4gZHVwbGljYXRlIGxvbmcvaW50IGtleXMKLSAgaWYgdGhlIGtleSB2YWx1ZSB3YXMgbGFyZ2VyIHRoYW4gMioqMzIuICBTZWUgU0YgYnVnICM2ODk2NTkuCi0KLS0gRml4ZWQgU0YgYnVnICM2NjMwNzQuIFRoZSBjb2RlYyBzeXN0ZW0gd2FzIHVzaW5nIGdsb2JhbCBzdGF0aWMKLSAgdmFyaWFibGVzIHRvIHN0b3JlIGludGVybmFsIGRhdGEuIEFzIGEgcmVzdWx0LCBhbnkgYXR0ZW1wdHMgdG8gdXNlIHRoZQotICB1bmljb2RlIHN5c3RlbSB3aXRoIG11bHRpcGxlIGFjdGl2ZSBpbnRlcnByZXRlcnMsIG9yIHN1Y2Nlc3NpdmUKLSAgaW50ZXJwcmV0ZXIgZXhlY3V0aW9ucywgd291bGQgZmFpbC4KLQotLSAiJWMiICUgdSJhIiBub3cgcmV0dXJucyBhIHVuaWNvZGUgc3RyaW5nIGluc3RlYWQgb2YgcmFpc2luZyBhCi0gIFR5cGVFcnJvci4gdSIlYyIgJSAweGZmZmZmZmZmIG5vdyByYWlzZXMgYSBPdmVyZmxvd0Vycm9yIGluc3RlYWQKLSAgb2YgYSBWYWx1ZUVycm9yIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCAiJWMiICUgMjU2LiBTZWUgU0YgcGF0Y2ggIzcxMDEyNy4KLQotRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gVGhlIHNvY2tldCBtb2R1bGUgbm93IHByb3ZpZGVzIHRoZSBmdW5jdGlvbnMgaW5ldF9wdG9uIGFuZCBpbmV0X250b3AKLSAgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBzdHJpbmcgYW5kIHBhY2tlZCByZXByZXNlbnRhdGlvbiBvZiBJUAotICBhZGRyZXNzZXMuICBUaGVyZSBpcyBhbHNvIGEgbmV3IG1vZHVsZSB2YXJpYWJsZSwgaGFzX2lwdjYsIHdoaWNoIGlzCi0gIFRydWUgaWZmIHRoZSBjdXJyZW50IFB5dGhvbiBoYXMgSVB2NiBzdXBwb3J0LiAgU2VlIFNGIHBhdGNoICM2NTgzMjcuCi0KLS0gVGtpbnRlciB3cmFwcGVycyBhcm91bmQgVGNsIHZhcmlhYmxlcyBub3cgcGFzcyBvYmplY3RzIGRpcmVjdGx5Ci0gIHRvIFRjbCwgaW5zdGVhZCBvZiBmaXJzdCBjb252ZXJ0aW5nIHRoZW0gdG8gc3RyaW5ncy4KLQotLSBUaGUgLio/IHBhdHRlcm4gaW4gdGhlIHJlIG1vZHVsZSBpcyBub3cgc3BlY2lhbC1jYXNlZCB0byBhdm9pZCB0aGUKLSAgcmVjdXJzaW9uIGxpbWl0LiAgKFNGIHBhdGNoICM3MjA5OTEgLS0gbWFueSB0aGFua3MgdG8gR2FyeSBIZXJyb24KLSAgYW5kIEdyZWcgQ2hhcG1hbi4pCi0KLS0gTmV3IGZ1bmN0aW9uIHN5cy5jYWxsX3RyYWNpbmcoKSBhbGxvd3MgcGRiIHRvIGRlYnVnIGNvZGUKLSAgcmVjdXJzaXZlbHkuCi0KLS0gTmV3IGZ1bmN0aW9uIGdjLmdldF9yZWZlcmVudHMob2JqKSByZXR1cm5zIGEgbGlzdCBvZiBvYmplY3RzCi0gIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgb2JqLiAgSW4gZWZmZWN0LCBpdCBleHBvc2VzIHdoYXQgdGhlIG9iamVjdCdzCi0gIHRwX3RyYXZlcnNlIHNsb3QgZG9lcywgYW5kIGNhbiBiZSBoZWxwZnVsIHdoZW4gZGVidWdnaW5nIG1lbW9yeQotICBsZWFrcy4KLQotLSBUaGUgaWNvbnYgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGlzIHJlbGVhc2UuCi0KLS0gVGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IHJvdXRpbmVzIGZvciBwYWNraW5nIGZsb2F0cyBpbiBJRUVFIGZvcm1hdHMKLSAgKHN0cnVjdC5wYWNrJ3MgPGYsID5mLCA8ZCwgYW5kID5kIGNvZGVzOyBwaWNrbGUgYW5kIGNQaWNrbGUncyBwcm90b2NvbCAxCi0gIHBpY2tsaW5nIG9mIGZsb2F0cykgaWdub3JlZCB0aGF0IHJvdW5kaW5nIGNhbiBjYXVzZSBhIGNhcnJ5IHRvCi0gIHByb3BhZ2F0ZS4gIFRoZSB3b3JzdCBjb25zZXF1ZW5jZSB3YXMgdGhhdCwgaW4gcmFyZSBjYXNlcywgPGYgYW5kID5mCi0gIGNvdWxkIHByb2R1Y2Ugc3RyaW5ncyB0aGF0LCB3aGVuIHVucGFja2VkIGFnYWluLCB3ZXJlIGEgZmFjdG9yIG9mIDIKLSAgYXdheSBmcm9tIHRoZSBvcmlnaW5hbCBmbG9hdC4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuICBTZWUgU0YgYnVnCi0gICM3MDU4MzYuCi0KLS0gTmV3IGZ1bmN0aW9uIHRpbWUudHpzZXQoKSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIEMgbGlicmFyeSB0enNldCgpCi0gIGZ1bmN0aW9uLCBpZiBzdXBwb3J0ZWQuICAoU0YgcGF0Y2ggIzY3NTQyMi4pCi0KLS0gVXNpbmcgY3JlYXRlZmlsZWhhbmRsZXIsIGRlbGV0ZWZpbGVoYW5kbGVyLCBjcmVhdGV0aW1lcmhhbmRsZXIgZnVuY3Rpb25zCi0gIG9uIFRraW50ZXIudGtpbnRlciAoX3RraW50ZXIgbW9kdWxlKSBubyBsb25nZXIgY3Jhc2hlcyB0aGUgaW50ZXJwcmV0ZXIuCi0gIFNlZSBTRiBidWcgIzY5MjQxNi4KLQotLSBNb2RpZmllZCB0aGUgZmNudGwuaW9jdGwoKSBmdW5jdGlvbiB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgYSBwYXNzZWQKLSAgbXV0YWJsZSBidWZmZXIgKGZvciBkZXRhaWxzIHNlZSB0aGUgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24pLgotCi0tIE1hZGUgdXNlciByZXF1ZXN0ZWQgY2hhbmdlcyB0byB0aGUgaXRlcnRvb2xzIG1vZHVsZS4KLSAgU3Vic3VtZWQgdGhlIHRpbWVzKCkgZnVuY3Rpb24gaW50byByZXBlYXQoKS4KLSAgQWRkZWQgY2hhaW4oKSBhbmQgY3ljbGUoKS4KLQotLSBUaGUgcm90b3IgbW9kdWxlIGlzIG5vdyBkZXByZWNhdGVkOyB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gaXQgdXNlcwotICBpcyBub3QgYmVsaWV2ZWQgdG8gYmUgc2VjdXJlLCBhbmQgaW5jbHVkaW5nIGNyeXB0byBjb2RlIHdpdGggUHl0aG9uCi0gIGhhcyBpbXBsaWNhdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIGl0IGluIHZhcmlvdXMgY291bnRyaWVzLgotCi0tIFRoZSBzb2NrZXQgbW9kdWxlIG5vdyBhbHdheXMgdXNlcyB0aGUgX3NvY2tldG9iamVjdCB3cmFwcGVyIGNsYXNzLCBldmVuIG9uCi0gIHBsYXRmb3JtcyB3aGljaCBoYXZlIGR1cCgyKS4gIFRoZSBtYWtlZmlsZSgpIG1ldGhvZCBpcyBidWlsdCBkaXJlY3RseQotICBvbiB0b3Agb2YgdGhlIHNvY2tldCB3aXRob3V0IGR1cGxpY2F0aW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFsbG93aW5nCi0gIHRpbWVvdXRzIHRvIHdvcmsgcHJvcGVybHkuCi0KLUxpYnJhcnkKLS0tLS0tLS0KLQotLSBOZXcgZ2VuZXJhdG9yIGZ1bmN0aW9uIG9zLndhbGsoKSBpcyBhbiBlYXN5LXRvLXVzZSBhbHRlcm5hdGl2ZSB0bwotICBvcy5wYXRoLndhbGsoKS4gIFNlZSBvcyBtb2R1bGUgZG9jcyBmb3IgZGV0YWlscy4gIG9zLnBhdGgud2FsaygpCi0gIGlzbid0IGRlcHJlY2F0ZWQgYXQgdGhpcyB0aW1lLCBidXQgbWF5IGJlY29tZSBkZXByZWNhdGVkIGluIGEKLSAgZnV0dXJlIHJlbGVhc2UuCi0KLS0gQWRkZWQgbmV3IG1vZHVsZSAicGxhdGZvcm0iIHdoaWNoIHByb3ZpZGVzIGEgd2lkZSByYW5nZSBvZiB0b29scwotICBmb3IgcXVlcnlpbmcgcGxhdGZvcm0gZGVwZW5kZW50IGZlYXR1cmVzLgotCi0tIG5ldHJjIG5vdyBhbGxvd3MgQVNDSUkgcHVuY3R1YXRpb24gY2hhcmFjdGVycyBpbiBwYXNzd29yZHMuCi0KLS0gc2hlbHZlIG5vdyBzdXBwb3J0cyB0aGUgb3B0aW9uYWwgd3JpdGViYWNrIGFyZ3VtZW50LCBhbmQgZXhwb3NlcwotICBwaWNrbGUgcHJvdG9jb2wgdmVyc2lvbnMuCi0KLS0gU2V2ZXJhbCBtZXRob2RzIG9mIG5udHBsaWIuTk5UUCBoYXZlIGdyb3duIGFuIG9wdGlvbmFsIGZpbGUgYXJndW1lbnQKLSAgd2hpY2ggc3BlY2lmaWVzIGEgZmlsZSB3aGVyZSB0byBkaXZlcnQgdGhlIGNvbW1hbmQncyBvdXRwdXQKLSAgKGFscmVhZHkgc3VwcG9ydGVkIGJ5IHRoZSBib2R5KCkgbWV0aG9kKS4gIChTRiBwYXRjaCAjNzIwNDY4KQotCi0tIFRoZSBzZWxmLWRvY3VtZW50aW5nIFhNTCBzZXJ2ZXIgbGlicmFyeSBEb2NYTUxSUENTZXJ2ZXIgd2FzIGFkZGVkLgotCi0tIFN1cHBvcnQgZm9yIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lcyBoYXMgYmVlbiBhZGRlZCB0aHJvdWdoCi0gIHRoZSAnaWRuYScgYW5kICdwdW55Y29kZScgZW5jb2RpbmdzLCB0aGUgJ3N0cmluZ3ByZXAnIG1vZHVsZSwgdGhlCi0gICdta3N0cmluZ3ByZXAnIHRvb2wsIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlIHNvY2tldCBhbmQgaHR0cGxpYgotICBtb2R1bGVzLgotCi0tIGh0bWxlbnRpdHlkZWZzIGhhcyB0d28gbmV3IGRpY3Rpb25hcmllczogbmFtZTJjb2RlcG9pbnQgbWFwcwotICBIVE1MIGVudGl0eSBuYW1lcyB0byBVbmljb2RlIGNvZGVwb2ludHMgKGFzIGludGVnZXJzKS4KLSAgY29kZXBvaW50Mm5hbWUgaXMgdGhlIHJldmVyc2UgbWFwcGluZy4gU2VlIFNGIHBhdGNoICM3MjIwMTcuCi0KLS0gcGRiIGhhcyBhIG5ldyBjb21tYW5kLCAiZGVidWciLCB3aGljaCBsZXRzIHlvdSBzdGVwIHRocm91Z2gKLSAgYXJiaXRyYXJ5IGNvZGUgZnJvbSB0aGUgZGVidWdnZXIncyAocGRiKSBwcm9tcHQuCi0KLS0gdW5pdHRlc3QuZmFpbFVubGVzc0VxdWFsIGFuZCBpdHMgZXF1aXZhbGVudCB1bml0dGVzdC5hc3NlcnRFcXVhbCBub3cKLSAgcmV0dXJuICdub3QgYSA9PSBiJyByYXRoZXIgdGhhbiAnYSAhPSBiJy4gIFRoaXMgZ2l2ZXMgdGhlIGRlc2lyZWQKLSAgcmVzdWx0IGZvciBjbGFzc2VzIHRoYXQgZGVmaW5lIF9fZXFfXyB3aXRob3V0IGRlZmluaW5nIF9fbmVfXy4KLQotLSBzZ21sbGliIG5vdyBzdXBwb3J0cyBTR01MIG1hcmtlZCBzZWN0aW9ucywgaW4gcGFydGljdWxhciB0aGUKLSAgTVMgT2ZmaWNlIGV4dGVuc2lvbnMuCi0KLS0gVGhlIHVybGxpYiBtb2R1bGUgbm93IG9mZmVycyBzdXBwb3J0IGZvciB0aGUgaXRlcmF0b3IgcHJvdG9jb2wuCi0gIFNGIHBhdGNoIDY5ODUyMCBjb250cmlidXRlZCBieSBCcmV0dCBDYW5ub24uCi0KLS0gTmV3IG1vZHVsZSB0aW1laXQgcHJvdmlkZXMgYSBzaW1wbGUgZnJhbWV3b3JrIGZvciB0aW1pbmcgdGhlCi0gIGV4ZWN1dGlvbiBzcGVlZCBvZiBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cy4KLQotLSBzZXRzLlNldCBvYmplY3RzIG5vdyBzdXBwb3J0IG1peGVkLXR5cGUgX19lcV9fIGFuZCBfX25lX18sIGluc3RlYWQKLSAgb2YgcmFpc2luZyBUeXBlRXJyb3IuICBJZiB4IGlzIGEgU2V0IG9iamVjdCBhbmQgeSBpcyBhIG5vbi1TZXQgb2JqZWN0LAotICB4ID09IHkgaXMgRmFsc2UsIGFuZCB4ICE9IHkgaXMgVHJ1ZS4gIFRoaXMgaXMgYWtpbiB0byB0aGUgY2hhbmdlIG1hZGUKLSAgZm9yIG1peGVkLXR5cGUgY29tcGFyaXNvbnMgb2YgZGF0ZXRpbWUgb2JqZWN0cyBpbiAyLjNhMjsgbW9yZSBpbmZvCi0gIGFib3V0IHRoZSByYXRpb25hbGUgaXMgaW4gdGhlIE5FV1MgZW50cnkgZm9yIHRoYXQuICBTZWUgYWxzbyBTRiBidWcKLSAgcmVwb3J0IDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjkzMTIxPi4KLQotLSBPbiBVbml4IHBsYXRmb3JtcywgaWYgb3MubGlzdGRpcigpIGlzIGNhbGxlZCB3aXRoIGEgVW5pY29kZSBhcmd1bWVudCwKLSAgaXQgbm93IHJldHVybnMgVW5pY29kZSBzdHJpbmdzLiAgKFRoaXMgYmVoYXZpb3Igd2FzIGFkZGVkIGVhcmxpZXIKLSAgdG8gdGhlIFdpbmRvd3MgTlQvMmsvWFAgdmVyc2lvbiBvZiBvcy5saXN0ZGlyKCkuKQotCi0tIERpc3R1dGlsczogYm90aCAncHlfbW9kdWxlcycgYW5kICdwYWNrYWdlcycga2V5d29yZHMgY2FuIG5vdyBiZSBzcGVjaWZpZWQKLSAgaW4gY29yZS5zZXR1cCgpLiAgUHJldmlvdXNseSB5b3UgY291bGQgc3VwcGx5IG9uZSBvciB0aGUgb3RoZXIsIGJ1dAotICBub3QgYm90aCBvZiB0aGVtLiAgKFNGIHBhdGNoICM2OTUwOTAgZnJvbSBCZXJuaGFyZCBIZXJ6b2cpCi0KLS0gTmV3IGNzdiBwYWNrYWdlIG1ha2VzIGl0IGVhc3kgdG8gcmVhZC93cml0ZSBDU1YgZmlsZXMuCi0KLS0gTW9kdWxlIHNobGV4IGhhcyBiZWVuIGV4dGVuZGVkIHRvIGFsbG93IHBvc2l4LWxpa2Ugc2hlbGwgcGFyc2luZ3MsCi0gIGluY2x1ZGluZyBhIHNwbGl0KCkgZnVuY3Rpb24gZm9yIGVhc3kgc3BsaXRpbmcgb2YgcXVvdGVkIHN0cmluZ3MgYW5kCi0gIGNvbW1hbmRzLiBBbiBpdGVyYXRvciBpbnRlcmZhY2Ugd2FzIGFsc28gaW1wbGVtZW50ZWQuCi0KLVRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tLQotCi0tIE5ldyBzY3JpcHQgY29tYmluZXJlZnMucHkgaGVscHMgYW5hbHl6ZSBuZXcgUFlUSE9ORFVNUFJFRlMgb3V0cHV0LgotICBTZWUgdGhlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIGRldGFpbHMuCi0KLUJ1aWxkCi0tLS0tLQotCi0tIEZpeCBwcm9ibGVtIGJ1aWxkaW5nIG9uIE9TRjEgYmVjYXVzZSB0aGUgY29tcGlsZXIgb25seSBhY2NlcHRlZAotICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0aGF0IHN0YXJ0IGluIGNvbHVtbiAxLiAgKFNGIGJ1ZyAjNjkxNzkzLikKLQotQyBBUEkKLS0tLS0tCi0KLS0gQWRkZWQgUHlHQ19Db2xsZWN0KCksIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBnYy5jb2xsZWN0KCkuCi0KLS0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCkgd2FzIGNoYW5nZWQgbm90IHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBvcgotICBpc3N1ZSBhIGZhdGFsIGVycm9yIHdoZW4gbm8gY3VycmVudCB0aHJlYWQgc3RhdGUgaXMgYXZhaWxhYmxlLiAgVGhpcwotICBtYWtlcyBpdCBwb3NzaWJsZSB0byBwcmludCBkaWN0aW9uYXJpZXMgd2hlbiBubyB0aHJlYWQgaXMgYWN0aXZlLgotCi0tIExPTkdfTE9ORyB3YXMgcmVuYW1lZCB0byBQWV9MT05HX0xPTkcuICBFeHRlbnNpb25zIHRoYXQgdXNlIHRoaXMgYW5kCi0gIG5lZWQgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIGNhbiB1c2UgdGhpczoKLQotICAgICNpZm5kZWYgIFBZX0xPTkdfTE9ORwotICAgICNkZWZpbmUgIFBZX0xPTkdfTE9ORyAgTE9OR19MT05HCi0gICAgI2VuZGlmCi0KLS0gQWRkZWQgUHlPYmplY3RfU2VsZkl0ZXIoKSB0byBmaWxsIHRoZSB0cF9pdGVyIHNsb3QgZm9yIHRoZQotICB0eXBpY2FsIGNhc2Ugd2hlcmUgdGhlIG1ldGhvZCByZXR1cm5zIGl0cyBzZWxmIGFyZ3VtZW50LgotCi0tIFRoZSBleHRlbmRlZCB0eXBlIHN0cnVjdHVyZSB1c2VkIGZvciBoZWFwIHR5cGVzIChuZXctc3R5bGUKLSAgY2xhc3NlcyBkZWZpbmVkIGJ5IFB5dGhvbiBjb2RlIHVzaW5nIGEgY2xhc3Mgc3RhdGVtZW50KSBpcyBub3cKLSAgZXhwb3J0ZWQgZnJvbSBvYmplY3QuaCBhcyBQeUhlYXBUeXBlT2JqZWN0LiAgKFNGIHBhdGNoICM2OTYxOTMuKQotCi1OZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0tCi0KLU5vbmUgdGhpcyB0aW1lLgotCi1UZXN0cwotLS0tLS0KLQotLSB0ZXN0X3RpbWVvdXQgbm93IHJlcXVpcmVzIC11IG5ldHdvcmsgdG8gYmUgcGFzc2VkIHRvIHJlZ3J0ZXN0IHRvIHJ1bi4KLSAgU2VlIFNGIGJ1ZyAjNjkyOTg4LgotCi1XaW5kb3dzCi0tLS0tLS0tCi0KLS0gb3MuZnN5bmMoKSBub3cgZXhpc3RzIG9uIFdpbmRvd3MsIGFuZCBjYWxscyB0aGUgTWljcm9zb2Z0IF9jb21taXQoKQotICBmdW5jdGlvbi4KLQotLSBOZXcgZnVuY3Rpb24gd2luc291bmQuTWVzc2FnZUJlZXAoKSB3cmFwcyB0aGUgV2luMzIgQVBJCi0gIE1lc3NhZ2VCZWVwKCkuCi0KLU1hYwotLS0tCi0KLS0gb3MubGlzdGRpcigpIG5vdyByZXR1cm5zIFVuaWNvZGUgc3RyaW5ncyBvbiBNYWNPUyBYIHdoZW4gY2FsbGVkIHdpdGgKLSAgYSBVbmljb2RlIGFyZ3VtZW50LiBTZWUgdGhlIGdlbmVyYWwgbmV3cyBpdGVtIHVuZGVyICJMaWJyYXJ5Ii4KLQotLSBBIG5ldyBtZXRob2QgTWFjT1MuV01BdmFpbGFibGUoKSByZXR1cm5zIHRydWUgaWYgaXQgaXMgc2FmZSB0byBhY2Nlc3MKLSAgdGhlIHdpbmRvdyBtYW5hZ2VyLCBmYWxzZSBvdGhlcndpc2UuCi0KLS0gRWFzeURpYWxvZ3MgZGlhbG9ncyBhcmUgbm93IG1vdmFibGUtbW9kYWwsIGFuZCBpZiB0aGUgYXBwbGljYXRpb24gaXMKLSAgY3VycmVudGx5IGluIHRoZSBiYWNrZ3JvdW5kIHRoZXkgd2lsbCBhc2sgdG8gYmUgbW92ZWQgdG8gdGhlIGZvcmVncm91bmQKLSAgYmVmb3JlIGRpc3BsYXlpbmcuCi0KLS0gT1NBIFNjcmlwdGluZyBzdXBwb3J0IGhhcyBpbXByb3ZlZCBhIGxvdCwgYW5kIGdlbnN1aXRlbW9kdWxlLnB5IGNhbiBub3cKLSAgYmUgdXNlZCBieSBtZXJlIG1vcnRhbHMuIFRoZSBkb2N1bWVudGF0aW9uIGlzIG5vdyBhbHNvIG1vcmUgb3IgbGVzcwotICBjb21wbGV0ZS4KLQotLSBUaGUgSURFIChpbiBhIGZyYW1ld29yayBidWlsZCkgbm93IGluY2x1ZGVzIGludHJvZHVjdG9yeSBkb2N1bWVudGF0aW9uCi0gIGluIEFwcGxlIEhlbHAgVmlld2VyIGZvcm1hdC4KLQotCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjMgYWxwaGEgMj8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qUmVsZWFzZSBkYXRlOiAxOS1GZWItMjAwMyoKLQotQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gTmVnYXRpdmUgcG9zaXRpb25zIHJldHVybmVkIGZyb20gUEVQIDI5MyBlcnJvciBjYWxsYmFja3MgYXJlIG5vdwotICB0cmVhdGVkIGFzIGJlaW5nIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy4gUG9zaXRpb25zCi0gIHRoYXQgYXJlIG91dCBvZiBib3VuZHMgcmFpc2UgYW4gSW5kZXhFcnJvci4KLQotLSBzeXMucGF0aFswXSAodGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRoZSBzY3JpcHQgaXMgbG9hZGVkKSBpcyBub3cKLSAgdHVybmVkIGludG8gYW4gYWJzb2x1dGUgcGF0aG5hbWUsIHVubGVzcyBpdCBpcyB0aGUgZW1wdHkgc3RyaW5nLgotICAoU0YgcGF0Y2ggIzY2NDM3Ni4pCi0KLS0gRmluYWxseSBmaXhlZCB0aGUgYnVnIGluIGNvbXBpbGUoKSBhbmQgZXhlYyB3aGVyZSBhIHN0cmluZyBlbmRpbmcKLSAgd2l0aCBhbiBpbmRlbnRlZCBjb2RlIGJsb2NrIGJ1dCBubyBuZXdsaW5lIHdvdWxkIHJhaXNlIFN5bnRheEVycm9yLgotICBUaGlzIHdvdWxkIGhhdmUgYmVlbiBhIGZvdXItbGluZSBjaGFuZ2UgaW4gcGFyc2V0b2suYy4uLiAgRXhjZXB0Ci0gIGNvZGVvcC5weSBkZXBlbmRzIG9uIHRoaXMgYmVoYXZpb3IsIHNvIGEgY29tcGlsYXRpb24gZmxhZyBoYWQgdG8gYmUKLSAgaW52ZW50ZWQgdGhhdCBjYXVzZXMgdGhlIHRva2VuaXplciB0byByZXZlcnQgdG8gdGhlIG9sZCBiZWhhdmlvcjsKLSAgdGhpcyByZXF1aXJlZCBleHRyYSBjaGFuZ2VzIHRvIDIgLmggZmlsZXMsIDIgLmMgZmlsZXMsIGFuZCAyIC5weQotICBmaWxlcy4gIChGaXhlcyBTRiBidWcgIzUwMTYyMi4pCi0KLS0gSWYgYSBuZXctc3R5bGUgY2xhc3MgZGVmaW5lcyBuZWl0aGVyIF9fbmV3X18gbm9yIF9faW5pdF9fLCBpdHMKLSAgY29uc3RydWN0b3Igd291bGQgaWdub3JlIGFsbCBhcmd1bWVudHMuICBUaGlzIGlzIGNoYW5nZWQgbm93OiB0aGUKLSAgY29uc3RydWN0b3IgcmVmdXNlcyBhcmd1bWVudHMgaW4gdGhpcyBjYXNlLiAgVGhpcyBtaWdodCBicmVhayBjb2RlCi0gIHRoYXQgd29ya2VkIHVuZGVyIFB5dGhvbiAyLjIuICBUaGUgc2ltcGxlc3QgZml4IGlzIHRvIGFkZCBhIG5vLW9wCi0gIF9faW5pdF9fOiBgYGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6IHBhc3NgYC4KLQotLSBUaHJvdWdoIGEgYnl0ZWNvZGUgb3B0aW1pemVyIGJ1ZyAoYW5kIEkgYmV0IHlvdSBkaWRuJ3QgZXZlbiBrbm93Ci0gIFB5dGhvbiAqaGFkKiBhIGJ5dGVjb2RlIG9wdGltaXplciA6LSksICJ1bnNpZ25lZCIgaGV4L29jdCBjb25zdGFudHMKLSAgd2l0aCBhIGxlYWRpbmcgbWludXMgc2lnbiB3b3VsZCBjb21lIG91dCB3aXRoIHRoZSB3cm9uZyBzaWduLgotICAoIlVuc2lnbmVkIiBoZXgvb2N0IGNvbnN0YW50cyBhcmUgdGhvc2Ugd2l0aCBhIGZhY2UgdmFsdWUgaW4gdGhlCi0gIHJhbmdlIHN5cy5tYXhpbnQrMSB0aHJvdWdoIHN5cy5tYXhpbnQqMisxLCBpbmNsdXNpdmU7IHRoZXNlIGhhdmUKLSAgYWx3YXlzIGJlZW4gaW50ZXJwcmV0ZWQgYXMgbmVnYXRpdmUgbnVtYmVycyB0aHJvdWdoIHNpZ24gZm9sZGluZy4pCi0gIEUuZy4gMHhmZmZmZmZmZiBpcyAtMSwgYW5kIC0oMHhmZmZmZmZmZikgaXMgMSwgYnV0IC0weGZmZmZmZmZmIHdvdWxkCi0gIGNvbWUgb3V0IGFzIC00Mjk0OTY3Mjk1LiAgVGhpcyB3YXMgdGhlIGNhc2UgaW4gUHl0aG9uIDIuMiB0aHJvdWdoCi0gIDIuMi4yIGFuZCAyLjNhMSwgYW5kIGluIFB5dGhvbiAyLjQgaXQgd2lsbCBvbmNlIGFnYWluIGhhdmUgdGhhdAotICB2YWx1ZSwgYnV0IGFjY29yZGluZyB0byBQRVAgMjM3IGl0IHJlYWxseSBuZWVkcyB0byBiZSAxIG5vdy4gIFRoaXMKLSAgd2lsbCBiZSBiYWNrcG9ydGVkIHRvIFB5dGhvbiAyLjIuMyBhIHdlbGwuICAoU0YgIzY2MDQ1NSkKLQotLSBpbnQocywgYmFzZSkgc29tZXRpbWVzIHNpZ24tZm9sZHMgaGV4IGFuZCBvY3QgY29uc3RhbnRzOyBpdCBvbmx5Ci0gIGRvZXMgdGhpcyB3aGVuIGJhc2UgaXMgMCBhbmQgcy5zdHJpcCgpIHN0YXJ0cyB3aXRoIGEgJzAnLiAgV2hlbiB0aGUKLSAgc2lnbiBpcyBhY3R1YWxseSBmb2xkZWQsIGFzIGluIGludCgiMHhmZmZmZmZmZiIsIDApIG9uIGEgMzItYml0Ci0gIG1hY2hpbmUsIHdoaWNoIHJldHVybnMgLTEsIGEgRnV0dXJlV2FybmluZyBpcyBub3cgaXNzdWVkOyBpbiBQeXRob24KLSAgMi40LCB0aGlzIHdpbGwgcmV0dXJuIDQyOTQ5NjcyOTVMLCBhcyBkbyBpbnQoIisweGZmZmZmZmZmIiwgMCkgYW5kCi0gIGludCgiMHhmZmZmZmZmZiIsIDE2KSByaWdodCBub3cuICAoUEVQIDM0NykKLQotLSBzdXBlcihYLCB4KTogeCBtYXkgbm93IGJlIGEgcHJveHkgZm9yIGFuIFggaW5zdGFuY2UsIGkuZS4KLSAgaXNzdWJjbGFzcyh4Ll9fY2xhc3NfXywgWCkgYnV0IG5vdCBpc3N1YmNsYXNzKHR5cGUoeCksIFgpLgotCi0tIGlzaW5zdGFuY2UoeCwgWCk6IGlmIFggaXMgYSBuZXctc3R5bGUgY2xhc3MsIHRoaXMgaXMgbm93IGVxdWl2YWxlbnQKLSAgdG8gaXNzdWJjbGFzcyh0eXBlKHgpLCBYKSBvciBpc3N1YmNsYXNzKHguX19jbGFzc19fLCBYKS4gIFByZXZpb3VzbHkKLSAgb25seSB0eXBlKHgpIHdhcyB0ZXN0ZWQuICAoRm9yIGNsYXNzaWMgY2xhc3NlcyB0aGlzIHdhcyBhbHJlYWR5IHRoZQotICBjYXNlLikKLQotLSBjb21waWxlKCksIGV2YWwoKSBhbmQgdGhlIGV4ZWMgc3RhdGVtZW50IG5vdyBmdWxseSBzdXBwb3J0IHNvdXJjZSBjb2RlCi0gIHBhc3NlZCBhcyB1bmljb2RlIHN0cmluZ3MuCi0KLS0gaW50IHN1YmNsYXNzZXMgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggbG9uZ3MgaWYgdGhlIHZhbHVlIGZpdHMgaW4gYW4gaW50LgotICBTZWUgU0YgYnVnICM2ODM0NjcuCi0KLS0gbG9uZyhzdHJpbmcsIGJhc2UpIHRha2VzIHRpbWUgbGluZWFyIGluIGxlbihzdHJpbmcpIHdoZW4gYmFzZSBpcyBhIHBvd2VyCi0gIG9mIDIgbm93LiAgSXQgdXNlZCB0byB0YWtlIHRpbWUgcXVhZHJhdGljIGluIGxlbihzdHJpbmcpLgotCi0tIGZpbHRlciByZXR1cm5zIG5vdyBVbmljb2RlIHJlc3VsdHMgZm9yIFVuaWNvZGUgYXJndW1lbnRzLgotCi0tIHJhd19pbnB1dCBjYW4gbm93IHJldHVybiBVbmljb2RlIG9iamVjdHMuCi0KLS0gTGlzdCBvYmplY3RzJyBzb3J0KCkgbWV0aG9kIG5vdyBhY2NlcHRzIE5vbmUgYXMgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24uCi0gIFBhc3NpbmcgTm9uZSBpcyBzZW1hbnRpY2FsbHkgaWRlbnRpY2FsIHRvIGNhbGxpbmcgc29ydCgpIHdpdGggbm8KLSAgYXJndW1lbnRzLgotCi0tIEZpeGVkIGNyYXNoIHdoZW4gcHJpbnRpbmcgYSBzdWJjbGFzcyBvZiBzdHIgYW5kIF9fc3RyX18gcmV0dXJuZWQgc2VsZi4KLSAgU2VlIFNGIGJ1ZyAjNjY3MTQ3LgotCi0tIEZpeGVkIGFuIGludmFsaWQgUnVudGltZVdhcm5pbmcgYW5kIGFuIHVuZGV0ZWN0ZWQgZXJyb3Igd2hlbiB0cnlpbmcKLSAgdG8gY29udmVydCBhIGxvbmcgaW50ZWdlciBpbnRvIGEgZmxvYXQgd2hpY2ggY291bGRuJ3QgZml0LgotICBTZWUgU0YgYnVnICM2NzYxNTUuCi0KLS0gRnVuY3Rpb24gb2JqZWN0cyBub3cgaGF2ZSBhIF9fbW9kdWxlX18gYXR0cmlidXRlIHRoYXQgaXMgYm91bmQgdG8KLSAgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuICBUaGlzCi0gIGFwcGxpZXMgZm9yIEMgZnVuY3Rpb25zIGFuZCBtZXRob2RzIGFzIHdlbGwgYXMgZnVuY3Rpb25zIGFuZCBtZXRob2RzCi0gIGRlZmluZWQgaW4gUHl0aG9uLiAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBieSBwaWNrbGUud2hpY2htb2R1bGUoKSwKLSAgd2hpY2ggY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2Ygd2hpY2htb2R1bGUgc2xpZ2h0bHkuICBJbiBQeXRob24gMi4yCi0gIHdoaWNobW9kdWxlKCkgcmV0dXJucyAiX19tYWluX18iIGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGRlZmluZWQKLSAgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIG1vZHVsZSAoZXhhbXBsZXM6IG1ldGhvZHMsIG5lc3RlZCBmdW5jdGlvbnMpLgotICBOb3cgd2hpY2htb2R1bGUoKSB3aWxsIHJldHVybiB0aGUgcHJvcGVyIG1vZHVsZSBuYW1lLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBvcGVyYXRvci5pc051bWJlclR5cGUoKSBub3cgY2hlY2tzIHRoYXQgdGhlIG9iamVjdCBoYXMgYSBuYl9pbnQgb3IKLSAgbmJfZmxvYXQgc2xvdCwgcmF0aGVyIHRoYW4gc2ltcGx5IGNoZWNraW5nIHdoZXRoZXIgaXQgaGFzIGEgbm9uLU5VTEwKLSAgdHBfYXNfbnVtYmVyIHBvaW50ZXIuCi0KLS0gVGhlIGltcCBtb2R1bGUgbm93IGhhcyB3YXlzIHRvIGFjcXVpcmUgYW5kIHJlbGVhc2UgdGhlICJpbXBvcnQKLSAgbG9jayI6IGltcC5hY3F1aXJlX2xvY2soKSBhbmQgaW1wLnJlbGVhc2VfbG9jaygpLiAgTm90ZTogdGhpcyBpcyBhCi0gIHJlZW50cmFudCBsb2NrLCBzbyByZWxlYXNpbmcgdGhlIGxvY2sgb25seSB0cnVseSByZWxlYXNlcyBpdCB3aGVuCi0gIHRoaXMgaXMgdGhlIGxhc3QgcmVsZWFzZV9sb2NrKCkgY2FsbC4gIFlvdSBjYW4gY2hlY2sgd2l0aAotICBpbXAubG9ja19oZWxkKCkuICAoU0YgYnVnICM1ODA5NTIgYW5kIHBhdGNoICM2ODMyNTcuKQotCi0tIENoYW5nZSB0byBjUGlja2xlIHRvIG1hdGNoIHBpY2tsZS5weSAoc2VlIGJlbG93IGFuZCBQRVAgMzA3KS4KLQotLSBGaXggc29tZSBidWdzIGluIHRoZSBwYXJzZXIgbW9kdWxlLiAgU0YgYnVnICM2Nzg1MTguCi0KLS0gVGhhbmtzIHRvIFNjb3R0IERhdmlkIERhbmllbHMsIGEgc3VidGxlIGJ1ZyBpbiBob3cgdGhlIHpsaWIKLSAgZXh0ZW5zaW9uIGltcGxlbWVudGVkIGZsdXNoKCkgd2FzIGZpeGVkLiAgU2NvdHQgYWxzbyByZXdyb3RlIHRoZQotICB6bGliIHRlc3Qgc3VpdGUgdXNpbmcgdGhlIHVuaXR0ZXN0IG1vZHVsZS4gIChTRiBidWcgIzY0MDIzMCBhbmQKLSAgcGF0Y2ggIzY3ODUzMS4pCi0KLS0gQWRkZWQgYW4gaXRlcnRvb2xzIG1vZHVsZSBjb250YWluaW5nIGhpZ2ggc3BlZWQsIG1lbW9yeSBlZmZpY2llbnQKLSAgbG9vcGluZyBjb25zdHJ1Y3RzIGluc3BpcmVkIGJ5IHRvb2xzIGZyb20gSGFza2VsbCBhbmQgU01MLgotCi0tIFRoZSBTU0wgbW9kdWxlIG5vdyBoYW5kbGVzIHNvY2tldHMgd2l0aCBhIHRpbWVvdXQgc2V0IGNvcnJlY3RseSAoU0YKLSAgcGF0Y2ggIzY3NTc1MCwgZml4aW5nIFNGIGJ1ZyAjNjc1NTUyKS4KLQotLSBvcy9wb3NpeG1vZHVsZSBoYXMgZ3Jvd24gdGhlIHN5c2V4aXRzLmggY29uc3RhbnRzIChFWF9PSyBhbmQgZnJpZW5kcykuCi0KLS0gRml4ZWQgYnJva2VuIHRocmVhZHN0YXRlIHN3YXAgaW4gcmVhZGxpbmUgdGhhdCBjb3VsZCBjYXVzZSBmYXRhbAotICBlcnJvcnMgd2hlbiBhIHJlYWRsaW5lIGhvb2sgd2FzIGJlaW5nIGludm9rZWQgd2hpbGUgYSBiYWNrZ3JvdW5kCi0gIHRocmVhZCB3YXMgYWN0aXZlLiAgKFNGIGJ1Z3MgIzY2MDQ3NiBhbmQgIzUxMzAzMy4pCi0KLS0gZmNudGwgbm93IGV4cG9zZXMgdGhlIHN0cm9wcy5oIElfKiBjb25zdGFudHMuCi0KLS0gRml4IGEgY3Jhc2ggb24gU29sYXJpcyB0aGF0IG9jY3VycmVkIHdoZW4gY2FsbGluZyBjbG9zZSgpIG9uCi0gIGFuIG1tYXAnZWQgZmlsZSB3aGljaCB3YXMgYWxyZWFkeSBjbG9zZWQuICAoU0YgcGF0Y2ggIzY2NTkxMykKLQotLSBGaXhlZCBzZXZlcmFsIHNlcmlvdXMgYnVncyBpbiB0aGUgemlwaW1wb3J0IGltcGxlbWVudGF0aW9uLgotCi0tIGRhdGV0aW1lIGNoYW5nZXM6Ci0KLSAgVGhlIGRhdGUgY2xhc3MgaXMgbm93IHByb3Blcmx5IHN1YmNsYXNzYWJsZS4gIChTRiBidWcgIzcyMDkwOCkKLQotICBUaGUgZGF0ZXRpbWUgYW5kIGRhdGV0aW1ldHogY2xhc3NlcyBoYXZlIGJlZW4gY29sbGFwc2VkIGludG8gYSBzaW5nbGUKLSAgZGF0ZXRpbWUgY2xhc3MsIGFuZCBsaWtld2lzZSB0aGUgdGltZSBhbmQgdGltZXR6IGNsYXNzZXMgaW50byBhIHNpbmdsZQotICB0aW1lIGNsYXNzLiAgUHJldmlvdXNseSwgYSBkYXRldGltZXR6IG9iamVjdCB3aXRoIHR6aW5mbz1Ob25lIGFjdGVkCi0gIGV4YWN0bHkgbGlrZSBhIGRhdGV0aW1lIG9iamVjdCwgYW5kIHNpbWlsYXJseSBmb3IgdGltZXR6LiAgVGhpcyB3YXNuJ3QKLSAgZW5vdWdoIG9mIGEgZGlmZmVyZW5jZSB0byBqdXN0aWZ5IGRpc3RpbmN0IGNsYXNzZXMsIGFuZCBsaWZlIGlzIHNpbXBsZXIKLSAgbm93LgotCi0gIHRvZGF5KCkgYW5kIG5vdygpIG5vdyByb3VuZCBzeXN0ZW0gdGltZXN0YW1wcyB0byB0aGUgY2xvc2VzdAotICBtaWNyb3NlY29uZCA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzY2MTA4Nj4uICBUaGlzIHJlcGFpcnMgYW4KLSAgaXJyaXRhdGlvbiBtb3N0IGxpa2VseSBzZWVuIG9uIFdpbmRvd3Mgc3lzdGVtcy4KLQotICBJbiBkdC5hc3RpbWV6b25lKHR6KSwgaWYgdHoudXRjb2Zmc2V0KGR0KSByZXR1cm5zIGEgZHVyYXRpb24sCi0gIFZhbHVlRXJyb3IgaXMgcmFpc2VkIGlmIHR6LmRzdChkdCkgcmV0dXJucyBOb25lICgyLjNhMSB0cmVhdGVkIGl0Ci0gIGFzIDAgaW5zdGVhZCwgYnV0IGEgdHppbmZvIHN1YmNsYXNzIHdpc2hpbmcgdG8gcGFydGljaXBhdGUgaW4KLSAgdGltZSB6b25lIGNvbnZlcnNpb24gaGFzIHRvIHRha2UgYSBzdGFuZCBvbiB3aGV0aGVyIGl0IHN1cHBvcnRzCi0gIERTVDsgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgRFNULCB0aGVuIGNvZGUgZHN0KCkgdG8gcmV0dXJuIDAgbWludXRlcywKLSAgbWVhbmluZyB0aGF0IERTVCBpcyBuZXZlciBpbiBlZmZlY3QpLgotCi0gIFRoZSB0emluZm8gbWV0aG9kcyB1dGNvZmZzZXQoKSBhbmQgZHN0KCkgbXVzdCByZXR1cm4gYSB0aW1lZGVsdGEgb2JqZWN0Ci0gIChvciBOb25lKSBub3cuICBJbiAyLjNhMSB0aGV5IGNvdWxkIGFsc28gcmV0dXJuIGFuIGludCBvciBsb25nLCBidXQgdGhhdAotICB3YXMgYW4gdW5oZWxwZnVsbHkgcmVkdW5kYW50IGxlZnRvdmVyIGZyb20gYW4gZWFybGllciB2ZXJzaW9uIHdoZXJlaW4KLSAgdGhleSBjb3VsZG4ndCByZXR1cm4gYSB0aW1lZGVsdGEuICBUT09XVERJLgotCi0gIFRoZSBleGFtcGxlIHR6aW5mbyBjbGFzcyBmb3IgbG9jYWwgdGltZSBoYWQgYSBidWcuICBJdCB3YXMgcmVwbGFjZWQKLSAgYnkgYSBsYXRlciBleGFtcGxlIGNvZGVkIGJ5IEd1aWRvLgotCi0gIGRhdGV0aW1lLmFzdGltZXpvbmUodHopIG5vIGxvbmdlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCi0gIGlucHV0IGRhdGV0aW1lIGhhcyBubyBVVEMgZXF1aXZhbGVudCBpbiB0ei4gIEZvciB0eXBpY2FsICJoeWJyaWQiIHRpbWUKLSAgem9uZXMgKGEgc2luZ2xlIHR6aW5mbyBzdWJjbGFzcyBtb2RlbGluZyBib3RoIHN0YW5kYXJkIGFuZCBkYXlsaWdodAotICB0aW1lKSwgdGhpcyBjYXNlIGNhbiBhcmlzZSBvbmUgaG91ciBwZXIgeWVhciwgYXQgdGhlIGhvdXIgZGF5bGlnaHQgdGltZQotICBlbmRzLiAgU2VlIG5ldyBkb2NzIGZvciBkZXRhaWxzLiAgSW4gc2hvcnQsIHRoZSBuZXcgYmVoYXZpb3IgbWltaWNzCi0gIHRoZSBsb2NhbCB3YWxsIGNsb2NrJ3MgYmVoYXZpb3Igb2YgcmVwZWF0aW5nIGFuIGhvdXIgaW4gbG9jYWwgdGltZS4KLQotICBkdC5hc3RpbWV6b25lKCkgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiBuYWl2ZSBhbmQgYXdhcmUKLSAgZGF0ZXRpbWUgb2JqZWN0cy4gIElmIHlvdSBtZXJlbHkgd2FudCB0byBhdHRhY2gsIG9yIHJlbW92ZSwgYSB0emluZm8KLSAgb2JqZWN0LCB3aXRob3V0IGFueSBjb252ZXJzaW9uIG9mIGRhdGUgYW5kIHRpbWUgbWVtYmVycywgdXNlCi0gIGR0LnJlcGxhY2UodHppbmZvPXdoYXRldmVyKSBpbnN0ZWFkLCB3aGVyZSAid2hhdGV2ZXIiIGlzIE5vbmUgb3IgYQotICB0emluZm8gc3ViY2xhc3MgaW5zdGFuY2UuCi0KLSAgQSBuZXcgbWV0aG9kIHR6aW5mby5mcm9tdXRjKGR0KSBjYW4gYmUgb3ZlcnJpZGRlbiBpbiB0emluZm8gc3ViY2xhc3NlcwotICB0byBnaXZlIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBob3cgYSBVVEMgdGltZSBpcyB0byBiZSBjb252ZXJ0ZWQgdG8KLSAgYSBsb2NhbCB0aW1lLiAgVGhlIGRlZmF1bHQgYXN0aW1lem9uZSgpIGltcGxlbWVudGF0aW9uIGNhbGxzIGZyb211dGMoKQotICBhcyBpdHMgbGFzdCBzdGVwLCBzbyBhIHR6aW5mbyBzdWJjbGFzcyBjYW4gYWZmZWN0IHRoYXQgdG9vIGJ5IG92ZXJyaWRpbmcKLSAgZnJvbXV0YygpLiAgSXQncyBleHBlY3RlZCB0aGF0IHRoZSBkZWZhdWx0IGZyb211dGMoKSBpbXBsZW1lbnRhdGlvbiB3aWxsCi0gIGJlIHN1aXRhYmxlIGFzLWlzIGZvciAiYWxtb3N0IGFsbCIgdGltZSB6b25lIHN1YmNsYXNzZXMsIGJ1dCB0aGUKLSAgY3JlYXRpdml0eSBvZiBwb2xpdGljYWwgdGltZSB6b25lIGZpZGRsaW5nIGFwcGVhcnMgdW5ib3VuZGVkIC0tIGZyb211dGMoKQotICBhbGxvd3MgdGhlIGhpZ2hseSBtb3RpdmF0ZWQgdG8gZW11bGF0ZSBhbnkgc2NoZW1lIGV4cHJlc3NpYmxlIGluIFB5dGhvbi4KLQotICBkYXRldGltZS5ub3coKTogIFRoZSBvcHRpb25hbCB0emluZm8gYXJndW1lbnQgd2FzIHVuZG9jdW1lbnRlZCAodGhhdCdzCi0gIHJlcGFpcmVkKSwgYW5kIGl0cyBuYW1lIHdhcyBjaGFuZ2VkIHRvIHR6ICgidHppbmZvIiBpcyBvdmVybG9hZGVkIGVub3VnaAotICBhbHJlYWR5KS4gIFdpdGggYSB0eiBhcmd1bWVudCwgbm93KHR6KSB1c2VkIHRvIHJldHVybiB0aGUgbG9jYWwgZGF0ZQotICBhbmQgdGltZSwgYW5kIGF0dGFjaCB0eiB0byBpdCwgd2l0aG91dCBhbnkgY29udmVyc2lvbiBvZiBkYXRlIGFuZCB0aW1lCi0gIG1lbWJlcnMuICBUaGlzIHdhcyBsZXNzIHRoYW4gdXNlZnVsLiAgTm93IG5vdyh0eikgcmV0dXJucyB0aGUgY3VycmVudAotICBkYXRlIGFuZCB0aW1lIGFzIGxvY2FsIHRpbWUgaW4gdHoncyB0aW1lIHpvbmUsIGFraW4gdG8gOjoKLQotICAgICAgdHouZnJvbXV0YyhkYXRldGltZS51dGNub3coKS5yZXBsYWNlKHR6aW5mbz11dGMpKQotCi0gIHdoZXJlICJ1dGMiIGlzIGFuIGluc3RhbmNlIG9mIGEgdHppbmZvIHN1YmNsYXNzIG1vZGVsaW5nIFVUQy4gIFdpdGhvdXQKLSAgYSB0eiBhcmd1bWVudCwgbm93KCkgY29udGludWVzIHRvIHJldHVybiB0aGUgY3VycmVudCBsb2NhbCBkYXRlIGFuZCB0aW1lLAotICBhcyBhIG5haXZlIGRhdGV0aW1lIG9iamVjdC4KLQotICBkYXRldGltZS5mcm9tdGltZXN0YW1wKCk6ICBMaWtlIGRhdGV0aW1lLm5vdygpIGFib3ZlLCB0aGlzIGhhZCBsZXNzIHRoYW4KLSAgdXNlZnVsIGJlaGF2aW9yIHdoZW4gdGhlIG9wdGlvbmFsIHRpbnpvIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQuICBTZWUKLSAgYWxzbyBTRiBidWcgcmVwb3J0IDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjYwODcyPi4KLQotICBkYXRlIGFuZCBkYXRldGltZSBjb21wYXJpc29uOiAgSW4gb3JkZXIgdG8gcHJldmVudCBjb21wYXJpc29uIGZyb20KLSAgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0IGNvbXBhcmUtb2JqZWN0LWFkZHJlc3NlcyBzdHJhdGVneSwgdGhlc2UKLSAgcmFpc2VkIFR5cGVFcnJvciB3aGVuZXZlciB0aGV5IGRpZG4ndCB1bmRlcnN0YW5kIHRoZSBvdGhlciBvYmplY3QgdHlwZS4KLSAgVGhleSBzdGlsbCBkbywgZXhjZXB0IHdoZW4gdGhlIG90aGVyIG9iamVjdCBoYXMgYSAidGltZXR1cGxlIiBhdHRyaWJ1dGUsCi0gIGluIHdoaWNoIGNhc2UgdGhleSByZXR1cm4gTm90SW1wbGVtZW50ZWQgbm93LiAgVGhpcyBnaXZlcyBvdGhlcgotICBkYXRldGltZSBvYmplY3RzIChlLmcuLCBteERhdGVUaW1lKSBhIGNoYW5jZSB0byBpbnRlcmNlcHQgdGhlCi0gIGNvbXBhcmlzb24uCi0KLSAgZGF0ZSwgdGltZSwgZGF0ZXRpbWUgYW5kIHRpbWVkZWx0YSBjb21wYXJpc29uOiAgV2hlbiB0aGUgZXhjZXB0aW9uCi0gIGZvciBtaXhlZC10eXBlIGNvbXBhcmlzb25zIGluIHRoZSBsYXN0IHBhcmFncmFwaCBkb2Vzbid0IGFwcGx5LCBpZgotICB0aGUgY29tcGFyaXNvbiBpcyA9PSB0aGVuIEZhbHNlIGlzIHJldHVybmVkLCBhbmQgaWYgdGhlIGNvbXBhcmlzb24gaXMKLSAgIT0gdGhlbiBUcnVlIGlzIHJldHVybmVkLiAgQmVjYXVzZSBkaWN0IGxvb2t1cCBhbmQgdGhlICJpbiIgb3BlcmF0b3IKLSAgb25seSBpbnZva2UgX19lcV9fLCB0aGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIDo6Ci0KLSAgICAgIGlmIHNvbWVfZGF0ZXRpbWUgaW4gc29tZV9zZXF1ZW5jZToKLQotICBhbmQgOjoKLQotICAgICAgc29tZV9kaWN0W3NvbWVfdGltZWRlbHRhXSA9IHdoYXRldmVyCi0KLSAgdG8gd29yayBhcyBleHBlY3RlZCwgd2l0aG91dCByYWlzaW5nIFR5cGVFcnJvciBqdXN0IGJlY2F1c2UgdGhlCi0gIHNlcXVlbmNlIGlzIGhldGVyb2dlbmVvdXMsIG9yIHRoZSBkaWN0IGhhcyBtaXhlZC10eXBlIGtleXMuICBbVGhpcwotICBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCBmb3IgYWxsIG1peGVkLXR5cGUgY29tcGFyaXNvbnMKLSAgdGhhdCBkb24ndCB3YW50IHRvIGFsbG93IGZhbGxpbmcgYmFjayB0byBhZGRyZXNzIGNvbXBhcmlzb24uXQotCi0gIFRoZSBjb25zdHJ1Y3RvcnMgYnVpbGRpbmcgYSBkYXRldGltZSBmcm9tIGEgdGltZXN0YW1wIGNvdWxkIHJhaXNlCi0gIFZhbHVlRXJyb3IgaWYgdGhlIHBsYXRmb3JtIEMgbG9jYWx0aW1lKCkvZ210aW1lKCkgaW5zZXJ0ZWQgImxlYXAKLSAgc2Vjb25kcyIuICBMZWFwIHNlY29uZHMgYXJlIGlnbm9yZWQgbm93LiAgT24gc3VjaCBwbGF0Zm9ybXMsIGl0J3MKLSAgcG9zc2libGUgdG8gaGF2ZSB0aW1lc3RhbXBzIHRoYXQgZGlmZmVyIGJ5IGEgc2Vjb25kLCB5ZXQgd2hlcmUKLSAgZGF0ZXRpbWVzIGNvbnN0cnVjdGVkIGZyb20gdGhlbSBhcmUgZXF1YWwuCi0KLSAgVGhlIHBpY2tsZSBmb3JtYXQgb2YgZGF0ZSwgdGltZSBhbmQgZGF0ZXRpbWUgb2JqZWN0cyBoYXMgY2hhbmdlZAotICBjb21wbGV0ZWx5LiAgVGhlIHVuZG9jdW1lbnRlZCBwaWNrbGVyIGFuZCB1bnBpY2tsZXIgZnVuY3Rpb25zIG5vCi0gIGxvbmdlciBleGlzdC4gIFRoZSB1bmRvY3VtZW50ZWQgX19zZXRzdGF0ZV9fKCkgYW5kIF9fZ2V0c3RhdGVfXygpCi0gIG1ldGhvZHMgbm8gbG9uZ2VyIGV4aXN0IGVpdGhlci4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIFRoZSBsb2dnaW5nIG1vZHVsZSB3YXMgdXBkYXRlZCBzbGlnaHRseTsgdGhlIFdBUk4gbGV2ZWwgd2FzIHJlbmFtZWQKLSAgdG8gV0FSTklORywgYW5kIHRoZSBtYXRjaGluZyBmdW5jdGlvbi9tZXRob2Qgd2FybigpIHRvIHdhcm5pbmcoKS4KLQotLSBUaGUgcGlja2xlIGFuZCBjUGlja2xlIG1vZHVsZXMgd2VyZSB1cGRhdGVkIHdpdGggYSBuZXcgcGlja2xpbmcKLSAgcHJvdG9jb2wgKGRvY3VtZW50ZWQgYnkgcGlja2xldG9vbHMucHksIHNlZSBiZWxvdykgYW5kIHNldmVyYWwKLSAgZXh0ZW5zaW9ucyB0byB0aGUgcGlja2xlIGN1c3RvbWl6YXRpb24gQVBJIChfX3JlZHVjZV9fLCBfX3NldHN0YXRlX18KLSAgZXRjLikuICBUaGUgY29weSBtb2R1bGUgbm93IHVzZXMgbW9yZSBvZiB0aGUgcGlja2xlIGN1c3RvbWl6YXRpb24KLSAgQVBJIHRvIGNvcHkgb2JqZWN0cyB0aGF0IGRvbid0IGltcGxlbWVudCBfX2NvcHlfXyBvciBfX2RlZXBjb3B5X18uCi0gIFNlZSBQRVAgMzA3IGZvciBkZXRhaWxzLgotCi0tIFRoZSBkaXN0dXRpbHMgInJlZ2lzdGVyIiBjb21tYW5kIG5vdyB1c2VzIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpCi0gIGFzIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkuICAoU2VlIFBFUCAzMDEuKQotCi0tIHRoZSBwbGF0Zm9ybSBkZXBlbmRlbnQgcGF0aCByZWxhdGVkIHZhcmlhYmxlcyBzZXAsIGFsdHNlcCwgZXh0c2VwLAotICBwYXRoc2VwLCBjdXJkaXIsIHBhcmRpciBhbmQgZGVmcGF0aCBhcmUgbm93IGRlZmluZWQgaW4gdGhlIHBsYXRmb3JtCi0gIGRlcGVuZGVudCBwYXRoIG1vZHVsZXMgKGUuZy4gbnRwYXRoLnB5KSByYXRoZXIgdGhhbiBvcy5weSwgc28gdGhlc2UKLSAgdmFyaWFibGVzIGFyZSBub3cgYXZhaWxhYmxlIHZpYSBvcy5wYXRoLiAgVGhleSBjb250aW51ZSB0byBiZQotICBhdmFpbGFibGUgZnJvbSB0aGUgb3MgbW9kdWxlLgotICAoc2VlIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjgwNzg5PikuCi0KLS0gYXJyYXkuYXJyYXkgd2FzIGFkZGVkIHRvIHRoZSB0eXBlcyByZXByLnB5IGtub3dzIGFib3V0IChzZWUKLSAgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi82ODA3ODk+KS4KLQotLSBUaGUgbmV3IHBpY2tsZXRvb2xzLnB5IGNvbnRhaW5zIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBhYm91dCBwaWNrbGUKLSAgaW50ZXJuYWxzLCBhbmQgc3VwcGxpZXMgc29tZSBoZWxwZXJzIGZvciB3b3JraW5nIHdpdGggcGlja2xlcywgc3VjaCBhcwotICBhIHN5bWJvbGljIHBpY2tsZSBkaXNhc3NlbWJsZXIuCi0KLS0gWG1scnBjbGliLnB5IG5vdyBzdXBwb3J0cyB0aGUgYnVpbHRpbiBib29sZWFuIHR5cGUuCi0KLS0gcHlfY29tcGlsZSBoYXMgYSBuZXcgJ2RvcmFpc2UnIGZsYWcgYW5kIGEgbmV3IFB5Q29tcGlsZUVycm9yCi0gIGV4Y2VwdGlvbi4KLQotLSBTaW1wbGVYTUxSUENTZXJ2ZXIgbm93IHN1cHBvcnRzIENHSSB0aHJvdWdoIHRoZSBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcgotICBjbGFzcy4KLQotLSBUaGUgc2V0cyBtb2R1bGUgbm93IHJhaXNlcyBUeXBlRXJyb3IgaW4gX19jbXBfXywgdG8gY2xhcmlmeSB0aGF0Ci0gIHNldHMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB0aHJlZS13YXktY29tcGFyZWQ7IHRoZSBjb21wYXJpc29uCi0gIG9wZXJhdG9ycyBhcmUgb3ZlcmxvYWRlZCBhcyBzdWJzZXQvc3VwZXJzZXQgdGVzdHMuCi0KLS0gQmFzdGlvbi5weSBhbmQgcmV4ZWMucHkgYXJlIGRpc2FibGVkLiAgVGhlc2UgbW9kdWxlcyBhcmUgbm90IHNhZmUgaW4KLSAgUHl0aG9uIDIuMi4gb3IgMi4zLgotCi0tIHJlYWxwYXRoIGlzIG5vdyBleHBvcnRlZCB3aGVuIGRvaW5nIGBgZnJvbSBwb3hpeHBhdGggaW1wb3J0ICpgYC4KLSAgSXQgaXMgYWxzbyBleHBvcnRlZCBmb3IgbnRwYXRoLCBtYWNwYXRoLCBhbmQgb3MyZW14cGF0aC4KLSAgU2VlIFNGIGJ1ZyAjNjU5MjI4LgotCi0tIE5ldyBtb2R1bGUgdGFyZmlsZSBmcm9tIExhcnMgR3VzdORiZWwgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIGludGVyZmFjZQotICB0byB0YXIgYXJjaGl2ZSBmaWxlcyB3aXRoIHRyYW5zcGFyZW50IGd6aXAgYW5kIGJ6aXAyIGNvbXByZXNzaW9uLgotICBTZWUgU0YgcGF0Y2ggIzY1MTA4Mi4KLQotLSB1cmxwYXJzZSBjYW4gbm93IHBhcnNlIGltYXA6Ly8gVVJMcy4gIFNlZSBTRiBmZWF0dXJlIHJlcXVlc3QgIzYxODAyNC4KLQotLSBUa2ludGVyLkNhbnZhcy5zY2FuX2RyYWd0bygpIHByb3ZpZGVzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBzdXBwb3J0Ci0gIHRoZSBnYWluIHZhbHVlIHdoaWNoIGlzIHBhc3NlZCB0byBUay4gIFNGIGJ1ZyMgNjAyMjU5LgotCi0tIEZpeCBsb2dnaW5nLmhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIgcHJvdG9jb2wgd2hlbiB1c2luZyBVTklYIGRvbWFpbiBzb2NrZXRzLgotICBTZWUgU0YgcGF0Y2ggIzY0Mjk3NC4KLQotLSBUaGUgZG9zcGF0aCBtb2R1bGUgd2FzIGRlbGV0ZWQuICBVc2UgdGhlIG50cGF0aCBtb2R1bGUgd2hlbiBtYW5pcHVsYXRpbmcKLSAgRE9TIHBhdGhzIGZyb20gb3RoZXIgcGxhdGZvcm1zLgotCi1Ub29scy9EZW1vcwotLS0tLS0tLS0tLS0KLQotLSBUd28gbmV3IHNjcmlwdHMgKGRiMnBpY2tsZS5weSBhbmQgcGlja2xlMmRiLnB5KSB3ZXJlIGFkZGVkIHRvIHRoZQotICBUb29scy9zY3JpcHRzIGRpcmVjdG9yeSB0byBmYWNpbGl0YXRlIGNvbnZlcnNpb24gZnJvbSB0aGUgb2xkIGJzZGRiIG1vZHVsZQotICB0byB0aGUgbmV3IG9uZS4gIFdoaWxlIHRoZSB1c2VyLXZpc2libGUgQVBJIG9mIHRoZSBuZXcgbW9kdWxlIGlzCi0gIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIG9uZSwgaXQncyBsaWtlbHkgdGhhdCB0aGUgdmVyc2lvbiBvZiB0aGUKLSAgdW5kZXJseWluZyBkYXRhYmFzZSBsaWJyYXJ5IGhhcyBjaGFuZ2VkLiAgVG8gY29udmVydCBmcm9tIHRoZSBvbGQgbGlicmFyeSwKLSAgcnVuIHRoZSBkYjJwaWNrbGUucHkgc2NyaXB0IHVzaW5nIHRoZSBvbGQgdmVyc2lvbiBvZiBQeXRob24gdG8gY29udmVydCBpdAotICB0byBhIHBpY2tsZSBmaWxlLiAgQWZ0ZXIgdXBncmFkaW5nIFB5dGhvbiwgcnVuIHRoZSBwaWNrbGUyZGIucHkgc2NyaXB0Ci0gIHVzaW5nIHRoZSBuZXcgdmVyc2lvbiBvZiBQeXRob24gdG8gcmVjb25zdGl0dXRlIHlvdXIgZGF0YWJhc2UuICBGb3IKLSAgZXhhbXBsZToKLQotICAgICUgcHl0aG9uMi4yIGRiMnBpY2tsZS5weSAtaCBzb21lLmRiID4gc29tZS5waWNrbGUKLSAgICAlIHB5dGhvbjIuMyBwaWNrbGUyZGIucHkgLWggc29tZS5kYi5uZXcgPCBzb21lLnBpY2tsZQotCi0gIFJ1biB0aGUgc2NyaXB0cyB3aXRob3V0IGFueSBhcmdzIHRvIGdldCBhIHVzYWdlIG1lc3NhZ2UuCi0KLQotQnVpbGQKLS0tLS0tCi0KLS0gVGhlIGF1ZGlvIGRyaXZlciB0ZXN0cyAodGVzdF9vc3NhdWRpb2Rldi5weSBhbmQKLSAgdGVzdF9saW51eGF1ZGlvZGV2LnB5KSBhcmUgbm8gbG9uZ2VyIHJ1biBieSBkZWZhdWx0LiAgVGhpcyBpcwotICBiZWNhdXNlIHRoZXkgZG9uJ3QgYWx3YXlzIHdvcmssIGRlcGVuZGluZyBvbiB5b3VyIGhhcmR3YXJlIGFuZAotICBzb2Z0d2FyZS4gIFRvIHJ1biB0aGVzZSB0ZXN0cywgeW91IG11c3QgdXNlIGFuIGludm9jYXRpb24gbGlrZSA6OgotCi0gICAgLi9weXRob24gTGliL3Rlc3QvcmVncnRlc3QucHkgLXUgYXVkaW8gdGVzdF9vc3NhdWRpb2RldgotCi0tIE9uIHN5c3RlbXMgd2hpY2ggYnVpbGQgdXNpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGNvbXBpbGVyIGZsYWdzIHdoaWNoCi0gIHVzZWQgdG8gYmUgbHVtcGVkIHRvZ2V0aGVyIHVzaW5nIHRoZSBPUFQgZmxhZyBoYXZlIGJlZW4gc3BsaXQgaW50byB0d28KLSAgZ3JvdXBzLCBPUFQgYW5kIEJBU0VDRkxBR1MuICBPUFQgaXMgbWVhbnQgdG8gY2FycnkganVzdCBvcHRpbWl6YXRpb24tIGFuZAotICBkZWJ1Zy1yZWxhdGVkIGZsYWdzIGxpa2UgIi1nIiBhbmQgIi1PMyIuICBCQVNFQ0ZMQUdTIGlzIG1lYW50IHRvIGNhcnJ5Ci0gIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGdldCBhIGNsZWFuIGNvbXBpbGUuICBPbiBzb21lCi0gIHBsYXRmb3JtcyAobWFueSBMaW51eCBmbGF2b3JzIGluIHBhcnRpY3VsYXIpIEJBU0VDRkxBR1Mgd2lsbCBiZSBlbXB0eSBieQotICBkZWZhdWx0LiAgT24gb3RoZXJzLCBzdWNoIGFzIE1hYyBPUyBYIGFuZCBTQ08sIGl0IHdpbGwgY29udGFpbiByZXF1aXJlZAotICBmbGFncy4gIFRoaXMgY2hhbmdlIGFsbG93cyBwZW9wbGUgYnVpbGRpbmcgUHl0aG9uIHRvIG92ZXJyaWRlIE9QVCB3aXRob3V0Ci0gIGZlYXIgb2YgY2xvYmJlcmluZyBjb21waWxlciBmbGFncyB3aGljaCBhcmUgcmVxdWlyZWQgdG8gZ2V0IGEgY2xlYW4gYnVpbGQuCi0KLS0gT24gRGFyd2luL01hYyBPUyBYIHBsYXRmb3JtcywgL3N3L2xpYiBhbmQgL3N3L2luY2x1ZGUgYXJlIGFkZGVkIHRvIHRoZQotICByZWxldmFudCBzZWFyY2ggbGlzdHMgaW4gc2V0dXAucHkuICBUaGlzIGFsbG93cyB1c2VycyBidWlsZGluZyBQeXRob24gdG8KLSAgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG1hbnkgcGFja2FnZXMgYXZhaWxhYmxlIGZyb20gdGhlIGZpbmsgcHJvamVjdAotICA8aHR0cDovL2Zpbmsuc2YubmV0Lz4uCi0KLS0gQSBuZXcgTWFrZWZpbGUgdGFyZ2V0LCBzY3JpcHRzaW5zdGFsbCwgaW5zdGFsbHMgYSBudW1iZXIgb2YgdXNlZnVsIHNjcmlwdHMKLSAgZnJvbSB0aGUgVG9vbHMvc2NyaXB0cyBkaXJlY3RvcnkuCi0KLUMgQVBJCi0tLS0tLQotCi0tIFB5RXZhbF9HZXRGcmFtZSgpIGlzIG5vdyBkZWNsYXJlZCB0byByZXR1cm4gYSBgYFB5RnJhbWVPYmplY3QgKmBgCi0gIGluc3RlYWQgb2YgYSBwbGFpbiBgYFB5T2JqZWN0ICpgYC4gIChTRiBwYXRjaCAjNjg2NjAxLikKLQotLSBQeU51bWJlcl9DaGVjaygpIG5vdyBjaGVja3MgdGhhdCB0aGUgb2JqZWN0IGhhcyBhIG5iX2ludCBvciBuYl9mbG9hdAotICBzbG90LCByYXRoZXIgdGhhbiBzaW1wbHkgY2hlY2tpbmcgd2hldGhlciBpdCBoYXMgYSBub24tTlVMTAotICB0cF9hc19udW1iZXIgcG9pbnRlci4KLQotLSBBIEMgdHlwZSB0aGF0IGluaGVyaXRzIGZyb20gYSBiYXNlIHR5cGUgdGhhdCBkZWZpbmVzIHRwX2FzX2J1ZmZlcgotICB3aWxsIG5vdyBpbmhlcml0IHRoZSB0cF9hc19idWZmZXIgcG9pbnRlciBpZiBpdCBkb2Vzbid0IGRlZmluZSBvbmUuCi0gIChTRiAjNjgxMzY3KQotCi0tIFRoZSBQeUFyZ19QYXJzZSBmdW5jdGlvbnMgbm93IGlzc3VlIGEgRGVwcmVjYXRpb25XYXJuaW5nIGlmIGEgZmxvYXQKLSAgYXJndW1lbnQgaXMgcHJvdmlkZWQgd2hlbiBhbiBpbnRlZ2VyIGlzIHNwZWNpZmllZCAodGhpcyBhZmZlY3RzIHRoZSAnYicsCi0gICdCJywgJ2gnLCAnSCcsICdpJywgYW5kICdsJyBjb2RlcykuICBGdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uIHdpbGwKLSAgcmFpc2UgYSBUeXBlRXJyb3IuCi0KLVRlc3RzCi0tLS0tLQotCi0tIFNldmVyYWwgdGVzdHMgd2VyZW4ndCBiZWluZyBydW4gZnJvbSByZWdydGVzdC5weSAodGVzdF90aW1lb3V0LnB5LAotICB0ZXN0X3RhcmZpbGUucHksIHRlc3RfbmV0cmMucHksIHRlc3RfbXVsdGlmaWxlLnB5LAotICB0ZXN0X2ltcG9ydGhvb2tzLnB5IGFuZCB0ZXN0X2ltcC5weSkuICBOb3cgdGhleSBhcmUuICAoTm90ZSB0bwotICBkZXZlbG9wZXJzOiBwbGVhc2UgcmVhZCBMaWIvdGVzdC9SRUFETUUgd2hlbiBjcmVhdGluZyBhIG5ldyB0ZXN0LCB0bwotICBtYWtlIHN1cmUgdG8gZG8gaXQgcmlnaHQhICBBbGwgdGVzdHMgbmVlZCB0byB1c2UgZWl0aGVyIHVuaXR0ZXN0IG9yCi0gIHB5ZG9jLikKLQotLSBBZGRlZCB0ZXN0X3Bvc2l4LnB5LCBhIHRlc3Qgc3VpdGUgZm9yIHRoZSBwb3NpeCBtb2R1bGUuCi0KLS0gQWRkZWQgdGVzdF9oZXhvY3QucHksIGEgdGVzdCBzdWl0ZSBmb3IgaGV4L29jdCBjb25zdGFudCBmb2xkaW5nLgotCi1XaW5kb3dzCi0tLS0tLS0tCi0KLS0gVGhlIHRpbWVvdXQgY29kZSBmb3Igc29ja2V0IGNvbm5lY3QoKSBkaWRuJ3Qgd29yayByaWdodDsgdGhpcyBoYXMKLSAgbm93IGJlZW4gZml4ZWQuICB0ZXN0X3RpbWVvdXQucHkgc2hvdWxkIHBhc3MgKGF0IGxlYXN0IG1vc3Qgb2YgdGhlCi0gIHRpbWUpLgotCi0tIGRpc3R1dGlscycgbXN2Y2NvbXBpbGVyIGNsYXNzIG5vdyBwYXNzZXMgdGhlIHByZXByb2Nlc3NvciBvcHRpb25zIHRvCi0gIHRoZSByZXNvdXJjZSBjb21waWxlci4gIFNlZSBTRiBwYXRjaCAjNjY5MTk4LgotCi0tIFRoZSBic2RkYiBtb2R1bGUgbm93IHNoaXBzIHdpdGggU2xlZXB5Y2F0J3MgNC4xLjI1Lk5DLCB0aGUgbGF0ZXN0Ci0gIHJlbGVhc2Ugd2l0aG91dCBzdHJvbmcgY3J5cHRvZ3JhcGh5LgotCi0tIHN5cy5wYXRoWzBdLCBpZiBpdCBjb250YWlucyBhIGRpcmVjdG9yeSBuYW1lLCBpcyBub3cgYWx3YXlzIGFuCi0gIGFic29sdXRlIHBhdGhuYW1lLiAoU0YgcGF0Y2ggIzY2NDM3Ni4pCi0KLS0gVGhlIG5ldyBsb2dnaW5nIHBhY2thZ2UgaXMgbm93IGluc3RhbGxlZCBieSB0aGUgV2luZG93cyBpbnN0YWxsZXIuICBJdAotICB3YXNuJ3QgaW4gMi4zYTEgZHVlIHRvIG92ZXJzaWdodC4KLQotTWFjCi0tLS0KLQotLSBUaGVyZSBhcmUgbmV3IGRpYWxvZ3MgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4sIEFza0ZpbGVGb3JTYXZlCi0gIGFuZCBBc2tGb2xkZXIuIFRoZSBvbGQgbWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLgotCi0tIE1vc3Qgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgbm93IHVzZXMgcGF0aG5hbWVzIG9yIEZTUmVmcyBpbiBwcmVmZXJlbmNlCi0gIG9mIEZTU3BlY3MsIGFuZCB1c2UgdGhlIHVuZGVybHlpbmcgQ2FyYm9uLkZpbGUgYW5kIENhcmJvbi5Gb2xkZXIgbW9kdWxlcwotICBpbiBzdGVhZCBvZiBtYWNmcy4gbWFjZnMgd2lsbCBwcm9iYWJseSBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuCi0KLS0gVHlwZSBDYXJib24uRmlsZS5GU0NhdGFsb2dJbmZvIGFuZCBzdXBwb3J0aW5nIG1ldGhvZHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotICBUaGlzIGFsc28gbWFrZXMgbWFjZnMuRlNTcGVjLlNldERhdGVzKCkgd29yayBhZ2Fpbi4KLQotLSBUaGVyZSBpcyBhIG5ldyBtb2R1bGUgcGltcCwgdGhlIHBhY2thZ2UgaW5zdGFsbCBtYW5hZ2VyIGZvciBQeXRob24sIGFuZAotICBhY2NvbXBhbnlpbmcgYXBwbGV0IFBhY2thZ2VNYW5hZ2VyLiBUaGVzZSBhbGxvdyB5b3UgdG8gZWFzaWx5IGRvd25sb2FkCi0gIGFuZCBpbnN0YWxsIHByZXRlc3RlZCBleHRlbnNpb24gcGFja2FnZXMgZWl0aGVyIGluIHNvdXJjZSBvciBiaW5hcnkKLSAgZm9ybS4gT25seSBpbiBNYWNQeXRob24tT1NYLgotCi0tIEFwcGxldHMgYXJlIG5vdyBidWlsdCB3aXRoIGJ1bmRsZWJ1aWxkZXIgaW4gTWFjUHl0aG9uLU9TWCwgd2hpY2ggc2hvdWxkIG1ha2UKLSAgdGhlbSBtb3JlIHJvYnVzdCBhbmQgYWxzbyBwcm92aWRlcyBhIHBhdGggdG93YXJkcyBCdWlsZEFwcGxpY2F0aW9uLiBUaGUKLSAgZG93bnNpZGUgb2YgdGhpcyBjaGFuZ2UgaXMgdGhhdCBhcHBsZXRzIGNhbiBubyBsb25nZXIgYmUgcnVuIGZyb20gdGhlCi0gIFRlcm1pbmFsIHdpbmRvdywgdGhpcyB3aWxsIGhvcGVmdWxseSBiZSBmaXhlZCBpbiB0aGUgMi4zYjEuCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGFscGhhIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMzEtRGVjLTIwMDIqCi0KLVR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIE9uZSBjYW4gbm93IGFzc2lnbiB0byBfX2Jhc2VzX18gYW5kIF9fbmFtZV9fIG9mIG5ldy1zdHlsZSBjbGFzc2VzLgotCi0tIGRpY3QoKSBub3cgYWNjZXB0cyBrZXl3b3JkIGFyZ3VtZW50cyBzbyB0aGF0IGRpY3Qob25lPTEsIHR3bz0yKQotICBpcyB0aGUgZXF1aXZhbGVudCBvZiB7Im9uZSI6IDEsICJ0d28iOiAyfS4gIEFjY29yZGluZ2x5LAotICB0aGUgZXhpc3RpbmcgKGJ1dCB1bmRvY3VtZW50ZWQpICdpdGVtcycga2V5d29yZCBhcmd1bWVudCBoYXMKLSAgYmVlbiBlbGltaW5hdGVkLiAgVGhpcyBtZWFucyB0aGF0IGRpY3QoaXRlbXM9c29tZU1hcHBpbmcpIG5vdyBoYXMKLSAgYSBkaWZmZXJlbnQgbWVhbmluZyB0aGFuIGJlZm9yZS4KLQotLSBpbnQoKSBub3cgcmV0dXJucyBhIGxvbmcgb2JqZWN0IGlmIHRoZSBhcmd1bWVudCBpcyBvdXRzaWRlIHRoZQotICBpbnRlZ2VyIHJhbmdlLCBzbyBpbnQoIjQiICogMTAwMCksIGludCgxZTIwMCkgYW5kIGludCgxTDw8MTAwMCkgd2lsbAotICBhbGwgcmV0dXJuIGxvbmcgb2JqZWN0cyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gT3ZlcmZsb3dFcnJvci4KLQotLSBBc3NpZ25tZW50IHRvIF9fY2xhc3NfXyBpcyBkaXNhbGxvd2VkIGlmIGVpdGhlciB0aGUgb2xkIG9yIHRoZSBuZXcKLSAgY2xhc3MgaXMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0eXBlIG9iamVjdCAoc3VjaCBhcyBkZWZpbmVkIGJ5IGFuCi0gIGV4dGVuc2lvbiBtb2R1bGUpLiAgVGhpcyBwcmV2ZW50cyBhbm9tYWxpZXMgbGlrZSAyLl9fY2xhc3NfXyA9IGJvb2wuCi0KLS0gTmV3LXN0eWxlIG9iamVjdCBjcmVhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGhhdmUgYmVlbiBzcGVkIHVwCi0gIHNpZ25pZmljYW50bHk7IHRoZXkgYXJlIG5vdyBmYXN0ZXIgdGhhbiBjbGFzc2ljIGluc3RhbmNlIGNyZWF0aW9uCi0gIGFuZCBkZWFsbG9jYXRpb24uCi0KLS0gVGhlIF9fc2xvdHNfXyB2YXJpYWJsZSBjYW4gbm93IG1lbnRpb24gInByaXZhdGUiIG5hbWVzLCBhbmQgdGhlCi0gIHJpZ2h0IHRoaW5nIHdpbGwgaGFwcGVuIChlLmcuIF9fc2xvdHNfXyA9IFsiX19mb28iXSkuCi0KLS0gVGhlIGJ1aWx0LWlucyBzbGljZSgpIGFuZCBidWZmZXIoKSBhcmUgbm93IGNhbGxhYmxlIHR5cGVzLiAgVGhlCi0gIHR5cGVzIGNsYXNzb2JqIChmb3JtZXJseSBjbGFzcyksIGNvZGUsIGZ1bmN0aW9uLCBpbnN0YW5jZSwgYW5kCi0gIGluc3RhbmNlbWV0aG9kIChmb3JtZXJseSBpbnN0YW5jZS1tZXRob2QpLCB3aGljaCBoYXZlIG5vIGJ1aWx0LWluCi0gIG5hbWVzIGJ1dCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSB0eXBlcyBtb2R1bGUsIGFyZSBub3cgYWxzbwotICBjYWxsYWJsZS4gIFRoZSB0eXBlIGRpY3QtcHJveHkgaXMgcmVuYW1lZCB0byBkaWN0cHJveHkuCi0KLS0gQ3ljbGVzIGdvaW5nIHRocm91Z2ggdGhlIF9fY2xhc3NfXyBsaW5rIG9mIGEgbmV3LXN0eWxlIGluc3RhbmNlIGFyZQotICBub3cgZGV0ZWN0ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgotCi0tIENsYXNzZXMgdXNpbmcgX19zbG90c19fIGFyZSBub3cgcHJvcGVybHkgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIFtTRiBidWcgNTE5NjIxXQotCi0tIFRpZ2h0ZW5lZCB0aGUgX19zbG90c19fIHJ1bGVzOiBhIHNsb3QgbmFtZSBtdXN0IGJlIGEgdmFsaWQgUHl0aG9uCi0gIGlkZW50aWZpZXIuCi0KLS0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kdWxlIHR5cGUgbm93IHJlcXVpcmVzIGEgbmFtZSBhcmd1bWVudCBhbmQKLSAgdGFrZXMgYW4gb3B0aW9uYWwgZG9jc3RyaW5nIGFyZ3VtZW50LiAgUHJldmlvdXNseSwgdGhpcyBjb25zdHJ1Y3RvcgotICBpZ25vcmVkIGl0cyBhcmd1bWVudHMuICBBcyBhIGNvbnNlcXVlbmNlLCBkZXJpdmluZyBhIGNsYXNzIGZyb20gYQotICBtb2R1bGUgKG5vdCBmcm9tIHRoZSBtb2R1bGUgdHlwZSkgaXMgbm93IGlsbGVnYWw7IHByZXZpb3VzbHkgdGhpcwotICBjcmVhdGVkIGFuIHVubmFtZWQgbW9kdWxlLCBqdXN0IGxpa2UgaW52b2tpbmcgdGhlIG1vZHVsZSB0eXBlIGRpZC4KLSAgW1NGIGJ1ZyA1NjMwNjBdCi0KLS0gQSBuZXcgdHlwZSBvYmplY3QsICdiYXNlc3RyaW5nJywgaXMgYWRkZWQuICBUaGlzIGlzIGEgY29tbW9uIGJhc2UgdHlwZQotICBmb3IgJ3N0cicgYW5kICd1bmljb2RlJywgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YKLSAgdHlwZXMuU3RyaW5nVHlwZXMsIGUuZy4gdG8gdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyAiYSBzdHJpbmciOgotICBpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpIGlzIFRydWUgZm9yIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3MuICBUaGlzCi0gIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgYW5kIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCi0KLS0gQ2hhbmdlZCBuZXctc3R5bGUgY2xhc3MgaW5zdGFudGlhdGlvbiBzbyB0aGF0IHdoZW4gQydzIF9fbmV3X18KLSAgbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHRoYXQncyBub3QgYSBDIGluc3RhbmNlLCBpdHMgX19pbml0X18gaXMKLSAgbm90IGNhbGxlZC4gIFtTRiBidWcgIzUzNzQ1MF0KLQotLSBGaXhlZCBzdXBlcigpIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggY2xhc3MgbWV0aG9kcy4gIFtTRiBidWcgIzUzNTQ0NF0KLQotLSBJZiB5b3UgdHJ5IHRvIHBpY2tsZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIF9fc2xvdHNfXyBidXQKLSAgZG9lc24ndCBkZWZpbmUgb3Igb3ZlcnJpZGUgX19nZXRzdGF0ZV9fLCBhIFR5cGVFcnJvciBpcyBub3cgcmFpc2VkLgotICBUaGlzIGlzIGRvbmUgYnkgYWRkaW5nIGEgYm96byBfX2dldHN0YXRlX18gdG8gdGhlIGNsYXNzIHRoYXQgYWx3YXlzCi0gIHJhaXNlcyBUeXBlRXJyb3IuICAoQmVmb3JlLCB0aGlzIHdvdWxkIGFwcGVhciB0byBiZSBwaWNrbGVkLCBidXQgdGhlCi0gIHN0YXRlIG9mIHRoZSBzbG90cyB3b3VsZCBiZSBsb3N0LikKLQotQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gSW1wb3J0IGZyb20gemlwZmlsZXMgaXMgbm93IHN1cHBvcnRlZC4gIFRoZSBuYW1lIG9mIGEgemlwZmlsZSBwbGFjZWQKLSAgb24gc3lzLnBhdGggY2F1c2VzIHRoZSBpbXBvcnQgc3RhdGVtZW50IHRvIGxvb2sgZm9yIGltcG9ydGFibGUgUHl0aG9uCi0gIG1vZHVsZXMgKHdpdGggLnB5LCBweWMgYW5kIC5weW8gZXh0ZW5zaW9ucykgYW5kIHBhY2thZ2VzIGluc2lkZSB0aGUKLSAgemlwZmlsZS4gIFRoZSB6aXBmaWxlIGltcG9ydCBmb2xsb3dzIHRoZSBzcGVjaWZpY2F0aW9uICh0aG91Z2ggbm90Ci0gIHRoZSBzYW1wbGUgaW1wbGVtZW50YXRpb24pIG9mIFBFUCAyNzMuICBUaGUgc2VtYW50aWNzIG9mIF9fcGF0aF9fIGFyZQotICBjb21wYXRpYmxlIHdpdGggdGhvc2UgdGhhdCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gSnl0aG9uIHNpbmNlCi0gIEp5dGhvbiAyLjEuCi0KLS0gUEVQIDMwMiBoYXMgYmVlbiBhY2NlcHRlZC4gIEFsdGhvdWdoIGl0IHdhcyBpbml0aWFsbHkgZGV2ZWxvcGVkIHRvCi0gIHN1cHBvcnQgemlwaW1wb3J0LCBpdCBvZmZlcnMgYSBuZXcsIGdlbmVyYWwgaW1wb3J0IGhvb2sgbWVjaGFuaXNtLgotICBTZXZlcmFsIG5ldyB2YXJpYWJsZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBzeXMgbW9kdWxlOgotICBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcywgYW5kIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlOyB0aGVzZQotICBtYWtlIGV4dGVuZGluZyB0aGUgaW1wb3J0IHN0YXRlbWVudCBtdWNoIG1vcmUgY29udmVuaWVudCB0aGFuCi0gIG92ZXJyaWRpbmcgdGhlIF9faW1wb3J0X18gYnVpbHQtaW4gZnVuY3Rpb24uICBGb3IgYSBkZXNjcmlwdGlvbiBvZgotICB0aGVzZSwgc2VlIFBFUCAzMDIuCi0KLS0gQSBmcmFtZSBvYmplY3QncyBmX2xpbmVubyBhdHRyaWJ1dGUgY2FuIG5vdyBiZSB3cml0dGVuIHRvIGZyb20gYQotICB0cmFjZSBmdW5jdGlvbiB0byBjaGFuZ2Ugd2hpY2ggbGluZSB3aWxsIGV4ZWN1dGUgbmV4dC4gIEEgY29tbWFuZCB0bwotICBleHBsb2l0IHRoaXMgZnJvbSBwZGIgaGFzIGJlZW4gYWRkZWQuICBbU0YgcGF0Y2ggIzY0MzgzNV0KLQotLSBUaGUgX2NvZGVjcyBzdXBwb3J0IG1vZHVsZSBmb3IgY29kZWNzLnB5IHdhcyB0dXJuZWQgaW50byBhIGJ1aWx0aW4KLSAgbW9kdWxlIHRvIGFzc3VyZSB0aGF0IGF0IGxlYXN0IHRoZSBidWlsdGluIGNvZGVjcyBhcmUgYXZhaWxhYmxlCi0gIHRvIHRoZSBQeXRob24gcGFyc2VyIGZvciBzb3VyY2UgY29kZSBkZWNvZGluZyBhY2NvcmRpbmcgdG8gUEVQIDI2My4KLQotLSBpc3N1YmNsYXNzIG5vdyBzdXBwb3J0cyBhIHR1cGxlIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGp1c3QgbGlrZQotICBpc2luc3RhbmNlIGRvZXMuIGBgaXNzdWJjbGFzcyhYLCAoQSwgQikpYGAgaXMgZXF1aXZhbGVudCB0bwotICBgYGlzc3ViY2xhc3MoWCwgQSkgb3IgaXNzdWJjbGFzcyhYLCBCKWBgLgotCi0tIFRoYW5rcyB0byBBcm1pbiBSaWdvLCB0aGUgbGFzdCBrbm93biB3YXkgdG8gcHJvdm9rZSBhIHN5c3RlbSBjcmFzaAotICBieSBjbGV2ZXJseSBhcnJhbmdpbmcgZm9yIGEgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBtdXRhdGUgYSBsaXN0Ci0gIGR1cmluZyBhIGxpc3Quc29ydCgpIG9wZXJhdGlvbiBoYXMgYmVlbiBmaXhlZC4gIFRoZSBlZmZlY3Qgb2YKLSAgYXR0ZW1wdGluZyB0byBtdXRhdGUgYSBsaXN0LCBvciBldmVuIHRvIGluc3BlY3QgaXRzIGNvbnRlbnRzIG9yCi0gIGxlbmd0aCwgd2hpbGUgYSBzb3J0IGlzIGluIHByb2dyZXNzLCBpcyBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCi0gIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiAyLjMgYXR0ZW1wdHMgdG8gZGV0ZWN0IG11dGF0aW9ucywKLSAgYW5kIHJhaXNlIFZhbHVlRXJyb3IgaWYgb25lIG9jY3VycywgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQKLSAgYWxsIG11dGF0aW9ucyB3aWxsIGJlIGNhdWdodCwgb3IgdGhhdCBhbnkgd2lsbCBiZSBjYXVnaHQgYWNyb3NzCi0gIHJlbGVhc2VzIG9yIGltcGxlbWVudGF0aW9ucy4KLQotLSBVbmljb2RlIGZpbGUgbmFtZSBwcm9jZXNzaW5nIGZvciBXaW5kb3dzIChQRVAgMjc3KSBpcyBpbXBsZW1lbnRlZC4KLSAgQWxsIHBsYXRmb3JtcyBub3cgaGF2ZSBhbiBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzIGF0dHJpYnV0ZSwKLSAgd2hpY2ggaXMgc2V0IHRvIFRydWUgb24gV2luZG93cyBOVC8yMDAwL1hQLCBhbmQgRmFsc2UgZWxzZXdoZXJlLgotCi0tIENvZGVjIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrcyAoUEVQIDI5MykgYXJlIGltcGxlbWVudGVkLgotICBFcnJvciBoYW5kbGluZyBpbiB1bmljb2RlLmVuY29kZSBvciBzdHIuZGVjb2RlIGNhbiBub3cgYmUgY3VzdG9taXplZC4KLQotLSBBIHN1YnRsZSBjaGFuZ2UgdG8gdGhlIHNlbWFudGljcyBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gaW50ZXJuKCk6Ci0gIGludGVybmVkIHN0cmluZ3MgYXJlIG5vIGxvbmdlciBpbW1vcnRhbC4gIFlvdSBtdXN0IGtlZXAgYSByZWZlcmVuY2UKLSAgdG8gdGhlIHJldHVybiB2YWx1ZSBpbnRlcm4oKSBhcm91bmQgdG8gZ2V0IHRoZSBiZW5lZml0LgotCi0tIFVzZSBvZiAnTm9uZScgYXMgYSB2YXJpYWJsZSwgYXJndW1lbnQgb3IgYXR0cmlidXRlIG5hbWUgbm93Ci0gIGlzc3VlcyBhIFN5bnRheFdhcm5pbmcuICBJbiB0aGUgZnV0dXJlLCBOb25lIG1heSBiZWNvbWUgYSBrZXl3b3JkLgotCi0tIFNFVF9MSU5FTk8gaXMgZ29uZS4gIGNvX2xub3RhYiBpcyBub3cgY29uc3VsdGVkIHRvIGRldGVybWluZSB3aGVuIHRvCi0gIGNhbGwgdGhlIHRyYWNlIGZ1bmN0aW9uLiAgQyBjb2RlIHRoYXQgYWNjZXNzZWQgZl9saW5lbm8gc2hvdWxkIGNhbGwKLSAgUHlDb2RlX0FkZHIyTGluZSBpbnN0ZWFkIChmX2xpbmVubyBpcyBzdGlsbCB0aGVyZSwgYnV0IG9ubHkga2VwdCB1cAotICB0byBkYXRlIHdoZW4gdGhlcmUgaXMgYSB0cmFjZSBmdW5jdGlvbiBzZXQpLgotCi0tIFRoZXJlJ3MgYSBuZXcgd2FybmluZyBjYXRlZ29yeSwgRnV0dXJlV2FybmluZy4gIFRoaXMgaXMgdXNlZCB0byB3YXJuCi0gIGFib3V0IGEgbnVtYmVyIG9mIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHZhbHVlIG9yIHNpZ24gb2YgYW4gaW50ZWdlcgotICByZXN1bHQgd2lsbCBjaGFuZ2UgaW4gUHl0aG9uIDIuNCBhcyBhIHJlc3VsdCBvZiBQRVAgMjM3IChpbnRlZ2VyCi0gIHVuaWZpY2F0aW9uKS4gIFRoZSB3YXJuaW5ncyBpbXBsZW1lbnQgc3RhZ2UgQjAgbWVudGlvbmVkIGluIHRoYXQKLSAgUEVQLiAgVGhlIHdhcm5pbmdzIGFyZSBhYm91dCB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6Ci0KLSAgICAtIE9jdGFsIGFuZCBoZXggbGl0ZXJhbHMgd2l0aG91dCAnTCcgcHJlZml4IGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UKLSAgICAgIFsweDgwMDAwMDAwLi4weGZmZmZmZmZmXTsgdGhlc2UgYXJlIGN1cnJlbnRseSBuZWdhdGl2ZSBpbnRzLCBidXQKLSAgICAgIGluIFB5dGhvbiAyLjQgdGhleSB3aWxsIGJlIHBvc2l0aXZlIGxvbmdzIHdpdGggdGhlIHNhbWUgYml0Ci0gICAgICBwYXR0ZXJuLgotCi0gICAgLSBMZWZ0IHNoaWZ0cyBvbiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGNhdXNlIHRoZSBvdXRjb21lIHRvIGxvc2UKLSAgICAgIGJpdHMgb3IgaGF2ZSBhIGRpZmZlcmVudCBzaWduIHRoYW4gdGhlIGxlZnQgb3BlcmFuZC4gIFRvIGJlCi0gICAgICBwcmVjaXNlOiB4PDxuIHdoZXJlIHRoaXMgY3VycmVudGx5IGRvZXNuJ3QgeWllbGQgdGhlIHNhbWUgdmFsdWUKLSAgICAgIGFzIGxvbmcoeCk8PG47IGluIFB5dGhvbiAyLjQsIHRoZSBvdXRjb21lIHdpbGwgYmUgbG9uZyh4KTw8bi4KLQotICAgIC0gQ29udmVyc2lvbnMgZnJvbSBpbnRzIHRvIHN0cmluZyB0aGF0IHNob3cgbmVnYXRpdmUgdmFsdWVzIGFzCi0gICAgICB1bnNpZ25lZCBpbnRzIGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UgWzB4ODAwMDAwMDAuLjB4ZmZmZmZmZmZdOwotICAgICAgdGhpcyBhZmZlY3RzIHRoZSBmdW5jdGlvbnMgaGV4KCkgYW5kIG9jdCgpLCBhbmQgdGhlIHN0cmluZwotICAgICAgZm9ybWF0dGluZyBjb2RlcyAldSwgJW8sICV4LCBhbmQgJVguICBJbiBQeXRob24gMi40LCB0aGVzZSB3aWxsCi0gICAgICBzaG93IHNpZ25lZCB2YWx1ZXMgKGUuZy4gaGV4KC0xKSBjdXJyZW50bHkgcmV0dXJucyAiMHhmZmZmZmZmZiI7Ci0gICAgICBpbiBQeXRob24gMi40IGl0IHdpbGwgcmV0dXJuICItMHgxIikuCi0KLS0gVGhlIGJpdHMgbWFuaXB1bGF0ZWQgdW5kZXIgdGhlIGNvdmVyIGJ5IHN5cy5zZXRjaGVja2ludGVydmFsKCkgaGF2ZQotICBiZWVuIGNoYW5nZWQuICBCb3RoIHRoZSBjaGVjayBpbnRlcnZhbCBhbmQgdGhlIHRpY2tlciB1c2VkIHRvIGJlCi0gIHBlci10aHJlYWQgdmFsdWVzLiAgVGhleSBhcmUgbm93IGp1c3QgYSBwYWlyIG9mIGdsb2JhbCB2YXJpYWJsZXMuCi0gIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBjaGVjayBpbnRlcnZhbCB3YXMgYm9vc3RlZCBmcm9tIDEwIHRvIDEwMAotICBieXRlY29kZSBpbnN0cnVjdGlvbnMuICBUaGlzIG1heSBoYXZlIHNvbWUgZWZmZWN0IG9uIHN5c3RlbXMgdGhhdAotICByZWxpZWQgb24gdGhlIG9sZCBkZWZhdWx0IHZhbHVlLiAgSW4gcGFydGljdWxhciwgaW4gbXVsdGktdGhyZWFkZWQKLSAgYXBwbGljYXRpb25zIHdoaWNoIHRyeSB0byBiZSBoaWdobHkgcmVzcG9uc2l2ZSwgcmVzcG9uc2UgdGltZSB3aWxsCi0gIGluY3JlYXNlIGJ5IHNvbWUgKHBlcmhhcHMgaW1wZXJjZXB0aWJsZSkgYW1vdW50LgotCi0tIFdoZW4gbXVsdGlwbHlpbmcgdmVyeSBsYXJnZSBpbnRlZ2VycywgYSB2ZXJzaW9uIG9mIHRoZSBzby1jYWxsZWQKLSAgS2FyYXRzdWJhIGFsZ29yaXRobSBpcyBub3cgdXNlZC4gIFRoaXMgaXMgbW9zdCBlZmZlY3RpdmUgaWYgdGhlCi0gIGlucHV0cyBoYXZlIHJvdWdobHkgdGhlIHNhbWUgc2l6ZS4gIElmIHRoZXkgYm90aCBoYXZlIGFib3V0IE4gZGlnaXRzLAotICBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gaGFzIE8oTioqMS41OCkgcnVudGltZSAodGhlIGV4cG9uZW50IGlzCi0gIGxvZ19iYXNlXzIoMykpIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIE8oTioqMikuICBNZWFzdXJlZCByZXN1bHRzIG1heQotICBiZSBiZXR0ZXIgb3Igd29yc2UgdGhhbiB0aGF0LCBkZXBlbmRpbmcgb24gcGxhdGZvcm0gcXVpcmtzLiAgQmVzaWRlcwotICB0aGUgTygpIGltcHJvdmVtZW50IGluIHJhdyBpbnN0cnVjdGlvbiBjb3VudCwgdGhlIEthcmF0c3ViYSBhbGdvcml0aG0KLSAgYXBwZWFycyB0byBoYXZlIG11Y2ggYmV0dGVyIGNhY2hlIGJlaGF2aW9yIG9uIGV4dHJlbWVseSBsYXJnZSBpbnRlZ2VycwotICAoc3RhcnRpbmcgaW4gdGhlIGJhbGxwYXJrIG9mIGEgbWlsbGlvbiBiaXRzKS4gIE5vdGUgdGhhdCB0aGlzIGlzIGEKLSAgc2ltcGxlIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlcmUncyBubyBpbnRlbnQgaGVyZSB0byBjb21wZXRlIHdpdGgsCi0gIGUuZy4sIEdNUC4gIEl0IGdpdmVzIGEgdmVyeSBuaWNlIHNwZWVkdXAgd2hlbiBpdCBhcHBsaWVzLCBidXQgYSBwYWNrYWdlCi0gIGRldm90ZWQgdG8gZmFzdCBsYXJnZS1pbnRlZ2VyIGFyaXRobWV0aWMgc2hvdWxkIHJ1biBjaXJjbGVzIGFyb3VuZCBpdC4KLQotLSB1JyVjJyB3aWxsIG5vdyByYWlzZSBhIFZhbHVlRXJyb3IgaW4gY2FzZSB0aGUgYXJndW1lbnQgaXMgYW4KLSAgaW50ZWdlciBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBvZiBVbmljb2RlIGNvZGUgcG9pbnQgb3JkaW5hbHMuCi0KLS0gVGhlIHRlbXBmaWxlIG1vZHVsZSBoYXMgYmVlbiBvdmVyaGF1bGVkIGZvciBlbmhhbmNlZCBzZWN1cml0eS4gIFRoZQotICBta3RlbXAoKSBmdW5jdGlvbiBpcyBub3cgZGVwcmVjYXRlZDsgbmV3LCBzYWZlIHJlcGxhY2VtZW50cyBhcmUKLSAgbWtzdGVtcCgpIChmb3IgZmlsZXMpIGFuZCBta2R0ZW1wKCkgKGZvciBkaXJlY3RvcmllcyksIGFuZCB0aGUKLSAgaGlnaGVyLWxldmVsIGZ1bmN0aW9ucyBOYW1lZFRlbXBvcmFyeUZpbGUoKSBhbmQgVGVtcG9yYXJ5RmlsZSgpLgotICBVc2Ugb2Ygc29tZSBnbG9iYWwgdmFyaWFibGVzIGluIHRoaXMgbW9kdWxlIGlzIGFsc28gZGVwcmVjYXRlZDsgdGhlCi0gIG5ldyBmdW5jdGlvbnMgaGF2ZSBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcm92aWRlIHRoZSBzYW1lCi0gIGZ1bmN0aW9uYWxpdHkuICBBbGwgTGliLCBUb29scyBhbmQgRGVtbyBtb2R1bGVzIHRoYXQgdXNlZCB0aGUgdW5zYWZlCi0gIGludGVyZmFjZXMgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gdXNlIHRoZSBzYWZlIHJlcGxhY2VtZW50cy4gIFRoYW5rcwotICB0byBaYWNrIFdlaW5iZXJnIQotCi0tIFdoZW4geCBpcyBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgaW1wbGVtZW50cyBfX211bF9fIGFuZCBfX3JtdWxfXywKLSAgMS4wKnggd291bGQgY29ycmVjdGx5IGludm9rZSBfX3JtdWxfXywgYnV0IDEqeCB3b3VsZCBlcnJvbmVvdXNseQotICBpbnZva2UgX19tdWxfXy4gIFRoaXMgd2FzIGR1ZSB0byB0aGUgc2VxdWVuY2UtcmVwZWF0IGNvZGUgaW4gdGhlIGludAotICB0eXBlLiAgVGhpcyBoYXMgYmVlbiBmaXhlZCBub3cuCi0KLS0gUHJldmlvdXNseSwgInN0cjEgaW4gc3RyMiIgcmVxdWlyZWQgc3RyMSB0byBiZSBhIHN0cmluZyBvZiBsZW5ndGggMS4KLSAgVGhpcyByZXN0cmljdGlvbiBoYXMgYmVlbiByZWxheGVkIHRvIGFsbG93IHN0cjEgdG8gYmUgYSBzdHJpbmcgb2YKLSAgYW55IGxlbmd0aC4gIFRodXMgIidlbCcgaW4gJ2hlbGxvIHdvcmxkJyIgcmV0dXJucyBUcnVlIG5vdy4KLQotLSBGaWxlIG9iamVjdHMgYXJlIG5vdyB0aGVpciBvd24gaXRlcmF0b3JzLiAgRm9yIGEgZmlsZSBmLCBpdGVyKGYpIG5vdwotICByZXR1cm5zIGYgKHVubGVzcyBmIGlzIGNsb3NlZCksIGFuZCBmLm5leHQoKSBpcyBzaW1pbGFyIHRvCi0gIGYucmVhZGxpbmUoKSB3aGVuIEVPRiBpcyBub3QgcmVhY2hlZDsgaG93ZXZlciwgZi5uZXh0KCkgdXNlcyBhCi0gIHJlYWRhaGVhZCBidWZmZXIgdGhhdCBtZXNzZXMgdXAgdGhlIGZpbGUgcG9zaXRpb24sIHNvIG1peGluZwotICBmLm5leHQoKSBhbmQgZi5yZWFkbGluZSgpIChvciBvdGhlciBtZXRob2RzKSBkb2Vzbid0IHdvcmsgcmlnaHQuCi0gIENhbGxpbmcgZi5zZWVrKCkgZHJvcHMgdGhlIHJlYWRhaGVhZCBidWZmZXIsIGJ1dCBvdGhlciBvcGVyYXRpb25zCi0gIGRvbid0LiAgSXQgc28gaGFwcGVucyB0aGF0IHRoaXMgZ2l2ZXMgYSBuaWNlIGFkZGl0aW9uYWwgc3BlZWQgYm9vc3QKLSAgdG8gImZvciBsaW5lIGluIGZpbGU6IjsgdGhlIHhyZWFkbGluZXMgbWV0aG9kIGFuZCBjb3JyZXNwb25kaW5nCi0gIG1vZHVsZSBhcmUgbm93IG9ic29sZXRlLiAgVGhhbmtzIHRvIE9yZW4gVGlyb3NoIQotCi0tIEVuY29kaW5nIGRlY2xhcmF0aW9ucyAoUEVQIDI2MywgcGhhc2UgMSkgaGF2ZSBiZWVuIGltcGxlbWVudGVkLiAgQQotICBjb21tZW50IG9mIHRoZSBmb3JtICIjIC0qLSBjb2Rpbmc6IDxlbmNvZGluZ25hbWU+IC0qLSIgaW4gdGhlIGZpcnN0Ci0gIG9yIHNlY29uZCBsaW5lIG9mIGEgUHl0aG9uIHNvdXJjZSBmaWxlIGluZGljYXRlcyB0aGUgZW5jb2RpbmcuCi0KLS0gbGlzdC5zb3J0KCkgaGFzIGEgbmV3IGltcGxlbWVudGF0aW9uLiAgV2hpbGUgY3Jvc3MtcGxhdGZvcm0gcmVzdWx0cwotICBtYXkgdmFyeSwgYW5kIGluIGRhdGEtZGVwZW5kZW50IHdheXMsIHRoaXMgaXMgbXVjaCBmYXN0ZXIgb24gbWFueQotICBraW5kcyBvZiBwYXJ0aWFsbHkgb3JkZXJlZCBsaXN0cyB0aGFuIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiwKLSAgYW5kIHJlcG9ydGVkIHRvIGJlIGp1c3QgYXMgZmFzdCBvbiByYW5kb21seSBvcmRlcmVkIGxpc3RzIG9uCi0gIHNldmVyYWwgbWFqb3IgcGxhdGZvcm1zLiAgVGhpcyBzb3J0IGlzIGFsc28gc3RhYmxlIChpZiBBPT1CIGFuZCBBCi0gIHByZWNlZGVzIEIgaW4gdGhlIGxpc3QgYXQgdGhlIHN0YXJ0LCBBIHByZWNlZGVzIEIgYWZ0ZXIgdGhlIHNvcnQgdG9vKSwKLSAgYWx0aG91Z2ggdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gZG9lcyBub3QgZ3VhcmFudGVlIHN0YWJpbGl0eS4gIEEKLSAgcG90ZW50aWFsIGRyYXdiYWNrIGlzIHRoYXQgbGlzdC5zb3J0KCkgbWF5IHJlcXVpcmUgdGVtcCBzcGFjZSBvZgotICBsZW4obGlzdCkqMiBieXRlcyAoYGAqNGBgIG9uIGEgNjQtYml0IG1hY2hpbmUpLiAgSXQncyB0aGVyZWZvcmUgcG9zc2libGUKLSAgZm9yIGxpc3Quc29ydCgpIHRvIHJhaXNlIE1lbW9yeUVycm9yIG5vdywgZXZlbiBpZiBhIGNvbXBhcmlzb24gZnVuY3Rpb24KLSAgZG9lcyBub3QuICBTZWUgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi81ODcwNzY+IGZvciBmdWxsIGRldGFpbHMuCi0KLS0gQWxsIHN0YW5kYXJkIGl0ZXJhdG9ycyBub3cgZW5zdXJlIHRoYXQsIG9uY2UgU3RvcEl0ZXJhdGlvbiBoYXMgYmVlbgotICByYWlzZWQsIGFsbCBmdXR1cmUgY2FsbHMgdG8gbmV4dCgpIG9uIHRoZSBzYW1lIGl0ZXJhdG9yIHdpbGwgYWxzbwotICByYWlzZSBTdG9wSXRlcmF0aW9uLiAgVGhlcmUgdXNlZCB0byBiZSB2YXJpb3VzIGNvdW50ZXJleGFtcGxlcyB0bwotICB0aGlzIGJlaGF2aW9yLCB3aGljaCBjb3VsZCBjYXVzZWQgY29uZnVzaW9uIG9yIHN1YnRsZSBwcm9ncmFtCi0gIGJyZWFrYWdlLCB3aXRob3V0IGFueSBiZW5lZml0cy4gIChOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbCBhbgotICBpdGVyYXRvcidzIHJlc3BvbnNpYmlsaXR5OyB0aGUgaXRlcmF0b3IgZnJhbWV3b3JrIGRvZXMgbm90IGVuZm9yY2UKLSAgdGhpcy4pCi0KLS0gQ3RybCtDIGhhbmRsaW5nIG9uIFdpbmRvd3MgaGFzIGJlZW4gbWFkZSBtb3JlIGNvbnNpc3RlbnQgd2l0aAotICBvdGhlciBwbGF0Zm9ybXMuICBLZXlib2FyZEludGVycnVwdCBjYW4gbm93IHJlbGlhYmx5IGJlIGNhdWdodCwKLSAgYW5kIEN0cmwrQyBhdCBhbiBpbnRlcmFjdGl2ZSBwcm9tcHQgbm8gbG9uZ2VyIHRlcm1pbmF0ZXMgdGhlCi0gIHByb2Nlc3MgdW5kZXIgTlQvMmsvWFAgKGl0IG5ldmVyIGRpZCB1bmRlciBXaW45eCkuICBDdHJsK0Mgd2lsbAotICBpbnRlcnJ1cHQgdGltZS5zbGVlcCgpIGluIHRoZSBtYWluIHRocmVhZCwgYW5kIGFueSBjaGlsZCBwcm9jZXNzZXMKLSAgY3JlYXRlZCB2aWEgdGhlIHBvcGVuIGZhbWlseSAob24gd2luMms7IHdlIGNhbid0IG1ha2Ugd2luOXggd29yawotICByZWxpYWJseSkgYXJlIGFsc28gaW50ZXJydXB0ZWQgKGFzIGdlbmVyYWxseSBoYXBwZW5zIG9uIGZvciBMaW51eC9Vbml4LikKLSAgW1NGIGJ1Z3MgMjMxMjczLCA0Mzk5OTIgYW5kIDU4MTIzMl0KLQotLSBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKSBoYXMgYmVlbiBhZGRlZCBvbiBXaW5kb3dzLiAgVGhpcwotICByZXR1cm5zIGEgdHVwbGUgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVyc2lvbiBvZiBXaW5kb3dzCi0gIGN1cnJlbnRseSBydW5uaW5nLgotCi0tIFNsaWNlcyBhbmQgcmVwZXRpdGlvbnMgb2YgYnVmZmVyIG9iamVjdHMgbm93IGNvbnNpc3RlbnRseSByZXR1cm4KLSAgYSBzdHJpbmcuICBGb3JtZXJseSwgc3RyaW5ncyB3b3VsZCBiZSByZXR1cm5lZCBtb3N0IG9mIHRoZSB0aW1lLAotICBidXQgYSBidWZmZXIgb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHJlcGV0aXRpb24gY291bnQKLSAgd2FzIG9uZSBvciB3aGVuIHRoZSBzbGljZSByYW5nZSB3YXMgYWxsIGluY2x1c2l2ZS4KLQotLSBVbmljb2RlIG9iamVjdHMgaW4gc3lzLnBhdGggYXJlIG5vIGxvbmdlciBpZ25vcmVkIGJ1dCB0cmVhdGVkCi0gIGFzIGRpcmVjdG9yeSBuYW1lcy4KLQotLSBGaXhlZCBzdHJpbmcuc3RhcnRzd2l0aCBhbmQgc3RyaW5nLmVuZHN3aXRoIGJ1aWx0aW4gbWV0aG9kcwotICBzbyB0aGV5IGFjY2VwdCBuZWdhdGl2ZSBpbmRpY2VzLiAgW1NGIGJ1ZyA0OTM5NTFdCi0KLS0gRml4ZWQgYSBidWcgd2l0aCBhIGNvbnRpbnVlIGluc2lkZSBhIHRyeSBibG9jayBhbmQgYSB5aWVsZCBpbiB0aGUKLSAgZmluYWxseSBjbGF1c2UuICBbU0YgYnVnIDU2NzUzOF0KLQotLSBNb3N0IGJ1aWx0aW4gc2VxdWVuY2VzIG5vdyBzdXBwb3J0ICJleHRlbmRlZCBzbGljZXMiLCBpLmUuIHNsaWNlcwotICB3aXRoIGEgdGhpcmQgInN0cmlkZSIgcGFyYW1ldGVyLiAgRm9yIGV4YW1wbGUsICJoZWxsbyB3b3JsZCJbOjotMV0KLSAgZ2l2ZXMgImRscm93IG9sbGVoIi4KLQotLSBBIG5ldyB3YXJuaW5nIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgd2FzIGFkZGVkIHRvIHByb3ZpZGUKLSAgZGlyZWN0aW9uIG9uIGZlYXR1cmVzIHdoaWNoIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXByZWNhdGVkLgotICBUaGUgd2FybmluZyB3aWxsIG5vdCBiZSBwcmludGVkIGJ5IGRlZmF1bHQuICBUbyBzZWUgdGhlIHBlbmRpbmcKLSAgZGVwcmVjYXRpb25zLCB1c2UgLVdhbHdheXM6OlBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc6OgotICBhcyBhIGNvbW1hbmQgbGluZSBvcHRpb24gb3Igd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoKSBpbiBjb2RlLgotCi0tIERlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgeHJhbmdlIG9iamVjdHMgaGF2ZSBiZWVuIHJlbW92ZWQgYXMKLSAgcHJvbWlzZWQuICBUaGUgc3RhcnQsIHN0b3AsIGFuZCBzdGVwIGF0dHJpYnV0ZXMgYW5kIHRoZSB0b2xpc3QoKQotICBtZXRob2Qgbm8gbG9uZ2VyIGV4aXN0LiAgeHJhbmdlIHJlcGV0aXRpb24gYW5kIHNsaWNpbmcgaGF2ZSBiZWVuCi0gIHJlbW92ZWQuCi0KLS0gTmV3IGJ1aWx0aW4gZnVuY3Rpb24gZW51bWVyYXRlKHgpLCBmcm9tIFBFUCAyNzkuICBFeGFtcGxlOgotICBlbnVtZXJhdGUoImFiYyIpIGlzIGFuIGl0ZXJhdG9yIHJldHVybmluZyAoMCwiYSIpLCAoMSwiYiIpLCAoMiwiYyIpLgotICBUaGUgYXJndW1lbnQgY2FuIGJlIGFuIGFyYml0cmFyeSBpdGVyYWJsZSBvYmplY3QuCi0KLS0gVGhlIGFzc2VydCBzdGF0ZW1lbnQgbm8gbG9uZ2VyIHRlc3RzIF9fZGVidWdfXyBhdCBydW50aW1lLiAgVGhpcyBtZWFucwotICB0aGF0IGFzc2VydCBzdGF0ZW1lbnRzIGNhbm5vdCBiZSBkaXNhYmxlZCBieSBhc3NpZ25pbmcgYSBmYWxzZSB2YWx1ZQotICB0byBfX2RlYnVnX18uCi0KLS0gQSBtZXRob2QgemZpbGwoKSB3YXMgYWRkZWQgdG8gc3RyIGFuZCB1bmljb2RlLCB0aGF0IGZpbGxzIGEgbnVtZXJpYwotICBzdHJpbmcgdG8gdGhlIGxlZnQgd2l0aCB6ZXJvcy4gIEZvciBleGFtcGxlLAotICAiKzEyMyIuemZpbGwoNikgLT4gIiswMDEyMyIuCi0KLS0gQ29tcGxleCBudW1iZXJzIHN1cHBvcnRlZCBkaXZtb2QoKSBhbmQgdGhlIC8vIGFuZCAlIG9wZXJhdG9ycywgYnV0Ci0gIHRoZXNlIG1ha2Ugbm8gc2Vuc2UuICBTaW5jZSB0aGlzIHdhcyBkb2N1bWVudGVkLCB0aGV5J3JlIGJlaW5nCi0gIGRlcHJlY2F0ZWQgbm93LgotCi0tIFN0cmluZyBhbmQgdW5pY29kZSBtZXRob2RzIGxzdHJpcCgpLCByc3RyaXAoKSBhbmQgc3RyaXAoKSBub3cgdGFrZQotICBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IHNwZWNpZmllcyB0aGUgY2hhcmFjdGVycyB0byBzdHJpcC4gIEZvcgotICBleGFtcGxlLCAiRm9vISEhPyE/IT8iLnJzdHJpcCgiPyEiKSAtPiAiRm9vIi4KLQotLSBUaGVyZSdzIGEgbmV3IGRpY3Rpb25hcnkgY29uc3RydWN0b3IgKGEgY2xhc3MgbWV0aG9kIG9mIHRoZSBkaWN0Ci0gIGNsYXNzKSwgZGljdC5mcm9ta2V5cyhpdGVyYWJsZSwgdmFsdWU9Tm9uZSkuICBJdCBjb25zdHJ1Y3RzIGEKLSAgZGljdGlvbmFyeSB3aXRoIGtleXMgdGFrZW4gZnJvbSB0aGUgaXRlcmFibGUgYW5kIGFsbCB2YWx1ZXMgc2V0IHRvIGEKLSAgc2luZ2xlIHZhbHVlLiAgSXQgY2FuIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHNldHMgYW5kIGZvciByZW1vdmluZwotICBkdXBsaWNhdGVzIGZyb20gc2VxdWVuY2VzLgotCi0tIEFkZGVkIGEgbmV3IGRpY3QgbWV0aG9kIHBvcChrZXkpLiAgVGhpcyByZW1vdmVzIGFuZCByZXR1cm5zIHRoZQotICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleS4gIFtTRiBwYXRjaCAjNTM5OTQ5XQotCi0tIEEgbmV3IGJ1aWx0LWluIHR5cGUsIGJvb2wsIGhhcyBiZWVuIGFkZGVkLCBhcyB3ZWxsIGFzIGJ1aWx0LWluCi0gIG5hbWVzIGZvciBpdHMgdHdvIHZhbHVlcywgVHJ1ZSBhbmQgRmFsc2UuICBDb21wYXJpc29ucyBhbmQgc3VuZHJ5Ci0gIG90aGVyIG9wZXJhdGlvbnMgdGhhdCByZXR1cm4gYSB0cnV0aCB2YWx1ZSBoYXZlIGJlZW4gY2hhbmdlZCB0bwotICByZXR1cm4gYSBib29sIGluc3RlYWQuICBSZWFkIFBFUCAyODUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzCi0gIGlzIGJhY2t3YXJkIGNvbXBhdGlibGUuCi0KLS0gRml4ZWQgdHdvIGJ1Z3MgcmVwb3J0ZWQgYXMgU0YgIzUzNTkwNTogdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLAotICBkZWFsbG9jYXRpbmcgYSBkZWVwbHkgbmVzdGVkIHN0cnVjdHVyZSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0IGluIHRoZQotICBnYXJiYWdlIGNvbGxlY3RvciwgZHVlIHRvIGludGVyYWN0aW9uIHdpdGggdGhlICJ0cmFzaGNhbiIgY29kZTsKLSAgYWNjZXNzIHRvIHRoZSBjdXJyZW50IGZyYW1lIGR1cmluZyBkZXN0cnVjdGlvbiBvZiBhIGxvY2FsIHZhcmlhYmxlCi0gIGNvdWxkIGFjY2VzcyBhIHBvaW50ZXIgdG8gZnJlZWQgbWVtb3J5LgotCi0tIFRoZSBvcHRpb25hbCBvYmplY3QgYWxsb2NhdG9yICgicHltYWxsb2MiKSBoYXMgYmVlbiBlbmFibGVkIGJ5Ci0gIGRlZmF1bHQuICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAotICBkZWFsbG9jYXRpb24gaGFzIGJlZW4gc3RyZWFtbGluZWQuICBBIGhlYWRlciBmaWxlIGlzIGluY2x1ZGVkLAotICBNaXNjL3B5bWVtY29tcGF0LmgsIHdoaWNoIGNhbiBiZSBidW5kbGVkIHdpdGggM3JkIHBhcnR5IGV4dGVuc2lvbnMKLSAgYW5kIGxldHMgdGhlbSB1c2UgdGhlIHNhbWUgQVBJIHdpdGggUHl0aG9uIHZlcnNpb25zIGZyb20gMS41LjIKLSAgb253YXJkcy4KLQotLSBQeUVycl9EaXNwbGF5IHdpbGwgcHJvdmlkZSBmaWxlIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBhbGwgZXhjZXB0aW9ucwotICB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHByaW50X2ZpbGVfYW5kX2xpbmUsIG5vdCBqdXN0IFN5bnRheEVycm9ycy4KLQotLSBUaGUgVVRGLTggY29kZWMgd2lsbCBub3cgZW5jb2RlIGFuZCBkZWNvZGUgVW5pY29kZSBzdXJyb2dhdGVzCi0gIGNvcnJlY3RseSBhbmQgd2l0aG91dCByYWlzaW5nIGV4Y2VwdGlvbnMgZm9yIHVucGFpcmVkIG9uZXMuCi0KLS0gVW5pdmVyc2FsIG5ld2xpbmVzIChQRVAgMjc4KSBpcyBpbXBsZW1lbnRlZC4gIEJyaWVmbHksIHVzaW5nICdVJwotICBpbnN0ZWFkIG9mICdyJyB3aGVuIG9wZW5pbmcgYSB0ZXh0IGZpbGUgZm9yIHJlYWRpbmcgY2hhbmdlcyB0aGUgbGluZQotICBlbmRpbmcgY29udmVudGlvbiBzbyB0aGF0IGFueSBvZiAnXHInLCAnXHJcbicsIGFuZCAnXG4nIGlzCi0gIHJlY29nbml6ZWQgKGV2ZW4gbWl4ZWQgaW4gb25lIGZpbGUpOyBhbGwgdGhyZWUgYXJlIGNvbnZlcnRlZCB0bwotICAnXG4nLCB0aGUgc3RhbmRhcmQgUHl0aG9uIGxpbmUgZW5kIGNoYXJhY3Rlci4KLQotLSBmaWxlLnhyZWFkbGluZXMoKSBub3cgcmFpc2VzIGEgVmFsdWVFcnJvciBpZiB0aGUgZmlsZSBpcyBjbG9zZWQ6Ci0gIFByZXZpb3VzbHksIGFuIHhyZWFkbGluZXMgb2JqZWN0IHdhcyByZXR1cm5lZCB3aGljaCB3b3VsZCByYWlzZQotICBhIFZhbHVlRXJyb3Igd2hlbiB0aGUgeHJlYWRsaW5lcy5uZXh0KCkgbWV0aG9kIHdhcyBjYWxsZWQuCi0KLS0gc3lzLmV4aXQoKSBpbmFkdmVydGVudGx5IGFsbG93ZWQgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4KLSAgQW4gZXhjZXB0aW9uIHdpbGwgbm93IGJlIHJhaXNlZCBpZiBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IGlzIHVzZWQuCi0KLS0gQ2hhbmdlZCBldmFsdWF0aW9uIG9yZGVyIG9mIGRpY3Rpb25hcnkgbGl0ZXJhbHMgdG8gY29uZm9ybSB0byB0aGUKLSAgZ2VuZXJhbCBsZWZ0IHRvIHJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgcnVsZS4gTm93IHtmMSgpOiBmMigpfSB3aWxsCi0gIGV2YWx1YXRlIGYxIGZpcnN0LgotCi0tIEZpeGVkIGJ1ZyAjNTIxNzgyOiB3aGVuIGEgZmlsZSB3YXMgaW4gbm9uLWJsb2NraW5nIG1vZGUsIGZpbGUucmVhZCgpCi0gIGNvdWxkIHNpbGVudGx5IGxvc2UgZGF0YSBvciB3cm9uZ2x5IHRocm93IGFuIHVua25vd24gZXJyb3IuCi0KLS0gVGhlIHNxX3JlcGVhdCwgc3FfaW5wbGFjZV9yZXBlYXQsIHNxX2NvbmNhdCBhbmQgc3FfaW5wbGFjZV9jb25jYXQKLSAgc2xvdHMgYXJlIG5vdyBhbHdheXMgdHJpZWQgYWZ0ZXIgdHJ5aW5nIHRoZSBjb3JyZXNwb25kaW5nIG5iXyogc2xvdHMuCi0gIFRoaXMgZml4ZXMgYSBudW1iZXIgb2YgbWlub3IgYnVncyAoc2VlIGJ1ZyAjNjI0ODA3KS4KLQotLSBGaXggcHJvYmxlbSB3aXRoIGR5bmFtaWMgbG9hZGluZyBvbiA2NC1iaXQgQUlYIChzZWUgYnVnICM2Mzk5NDUpLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBBZGRlZCB0aHJlZSBvcGVyYXRvcnMgdG8gdGhlIG9wZXJhdG9yIG1vZHVsZToKLSAgICBvcGVyYXRvci5wb3coYSxiKSB3aGljaCBpcyBlcXVpdmFsZW50IHRvOiAgYSoqYi4KLSAgICBvcGVyYXRvci5pc18oYSxiKSB3aGljaCBpcyBlcXVpdmFsZW50IHRvOiAgYSBpcyBiLgotICAgIG9wZXJhdG9yLmlzX25vdChhLGIpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86ICBhIGlzIG5vdCBiLgotCi0tIHBvc2l4Lm9wZW5wdHkgbm93IHdvcmtzIG9uIGFsbCBzeXN0ZW1zIHRoYXQgaGF2ZSAvZGV2L3B0bXguCi0KLS0gQSBtb2R1bGUgemlwaW1wb3J0IGV4aXN0cyB0byBzdXBwb3J0IGltcG9ydGluZyBjb2RlIGZyb20gemlwCi0gIGFyY2hpdmVzLgotCi0tIFRoZSBuZXcgZGF0ZXRpbWUgbW9kdWxlIHN1cHBsaWVzIGNsYXNzZXMgZm9yIG1hbmlwdWxhdGluZyBkYXRlcyBhbmQKLSAgdGltZXMuICBUaGUgYmFzaWMgZGVzaWduIGNhbWUgZnJvbSB0aGUgWm9wZSAiZmlzaGJvd2wgcHJvY2VzcyIsIGFuZAotICBmYXZvcnMgcHJhY3RpY2FsIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zIG92ZXIgY2FsZW5kYXIgZXNvdGVyaWNhLiAgU2VlCi0KLSAgICAgIGh0dHA6Ly93d3cuem9wZS5vcmcvTWVtYmVycy9mZHJha2UvRGF0ZVRpbWVXaWtpL0Zyb250UGFnZQotCi0tIF90a2ludGVyIG5vdyByZXR1cm5zIFRjbCBvYmplY3RzLCBpbnN0ZWFkIG9mIHN0cmluZ3MuIE9iamVjdHMgd2hpY2gKLSAgaGF2ZSBQeXRob24gZXF1aXZhbGVudHMgYXJlIGNvbnZlcnRlZCB0byBQeXRob24gb2JqZWN0cywgb3RoZXIgb2JqZWN0cwotICBhcmUgd3JhcHBlZC4gVGhpcyBjYW4gYmUgY29uZmlndXJlZCB0aHJvdWdoIHRoZSB3YW50b2JqZWN0cyBtZXRob2QsCi0gIG9yIFRraW50ZXIud2FudG9iamVjdHMuCi0KLS0gVGhlIFB5QlNEREIgd3JhcHBlciBhcm91bmQgdGhlIFNsZWVweWNhdCBCZXJrZWxleSBEQiBsaWJyYXJ5IGhhcwotICBiZWVuIGFkZGVkIGFzIHRoZSBwYWNrYWdlIGJzZGRiLiAgVGhlIHRyYWRpdGlvbmFsIGJzZGRiIG1vZHVsZSBpcwotICBzdGlsbCBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUsIGJ1dCBub3QgYnVpbHQgYXV0b21hdGljYWxseSBhbnltb3JlLAotICBhbmQgaXMgbm93IG5hbWVkIGJzZGRiMTg1LiAgVGhpcyBzdXBwb3J0cyBCZXJrZWxleSBEQiB2ZXJzaW9ucyBmcm9tCi0gIDMuMCB0byA0LjEuICBGb3IgaGVscCBjb252ZXJ0aW5nIHlvdXIgZGF0YWJhc2VzIGZyb20gdGhlIG9sZCBtb2R1bGUgKHdoaWNoCi0gIHByb2JhYmx5IHVzZWQgYW4gb2Jzb2xldGUgdmVyc2lvbiBvZiBCZXJrZWxleSBEQikgdG8gdGhlIG5ldyBtb2R1bGUsIHNlZQotICB0aGUgZGIycGlja2xlLnB5IGFuZCBwaWNrbGUyZGIucHkgc2NyaXB0cyBkZXNjcmliZWQgaW4gdGhlIFRvb2xzL0RlbW9zCi0gIHNlY3Rpb24gYWJvdmUuCi0KLS0gdW5pY29kZWRhdGEgd2FzIHVwZGF0ZWQgdG8gVW5pY29kZSAzLjIuIEl0IHN1cHBvcnRzIG5vcm1hbGl6YXRpb24KLSAgYW5kIG5hbWVzIGZvciBIYW5ndWwgc3lsbGFibGVzIGFuZCBDSksgdW5pZmllZCBpZGVvZ3JhcGhzLgotCi0tIHJlc291cmNlLmdldHJsaW1pdCgpIG5vdyByZXR1cm5zIGxvbmdzIGluc3RlYWQgb2YgaW50cy4KLQotLSByZWFkbGluZSBub3cgZHluYW1pY2FsbHkgYWRqdXN0cyBpdHMgaW5wdXQvb3V0cHV0IHN0cmVhbSBpZgotICBzeXMuc3RkaW4vc3Rkb3V0IGNoYW5nZXMuCi0KLS0gVGhlIF90a2ludGVyIG1vZHVsZSAoYW5kIGhlbmNlIFRraW50ZXIpIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yCi0gIFRjbC9UayA4LjAgYW5kIDguMS4gIE9ubHkgVGNsL1RrIHZlcnNpb25zIDguMiwgOC4zIGFuZCA4LjQgYXJlCi0gIHN1cHBvcnRlZC4KLQotLSBjUGlja2xlLkJhZFBpY2tsZUdldCBpcyBub3cgYSBjbGFzcy4KLQotLSBUaGUgdGltZSBzdGFtcHMgaW4gb3Muc3RhdF9yZXN1bHQgYXJlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKLSAgYWZ0ZXIgc3RhdF9mbG9hdF90aW1lcyBoYXMgYmVlbiBjYWxsZWQuCi0KLS0gSWYgdGhlIHNpemUgcGFzc2VkIHRvIG1tYXAubW1hcCgpIGlzIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlCi0gIGZpbGUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLCBhIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiBbU0YgYnVnIDU4NTc5Ml0KLQotLSBUaGUgeHJlYWRsaW5lcyBtb2R1bGUgaXMgc2xhdGVkIGZvciBvYnNvbGVzY2VuY2UuCi0KLS0gVGhlIHN0cnB0aW1lIGZ1bmN0aW9uIGluIHRoZSB0aW1lIG1vZHVsZSBpcyBub3cgYWx3YXlzIGF2YWlsYWJsZSAoYQotICBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgdXNlZCB3aGVuIHRoZSBDIGxpYnJhcnkgZG9lc24ndCBkZWZpbmUgaXQpLgotCi0tIFRoZSAnbmV3JyBtb2R1bGUgaXMgbm8gbG9uZ2VyIGFuIGV4dGVuc2lvbiwgYnV0IGEgUHl0aG9uIG1vZHVsZSB0aGF0Ci0gIG9ubHkgZXhpc3RzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0cyBjb250ZW50cyBhcmUgbm8gbG9uZ2VyCi0gIGZ1bmN0aW9ucyBidXQgY2FsbGFibGUgdHlwZSBvYmplY3RzLgotCi0tIFRoZSBic2RkYi4qb3BlbiBmdW5jdGlvbnMgY2FuIG5vdyB0YWtlICdOb25lJyBhcyBhIGZpbGVuYW1lLgotICBUaGlzIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGluLW1lbW9yeSBic2RkYiB0aGF0IHdvbid0IGJlCi0gIHdyaXR0ZW4gdG8gZGlzay4KLQotLSBwb3NpeC5nZXRsb2FkYXZnLCBwb3NpeC5sY2hvd24sIHBvc2l4LmtpbGxwZywgcG9zaXgubWtub2QsIGFuZAotICBwb3NpeC5nZXRwZ2lkIGhhdmUgYmVlbiBhZGRlZCB3aGVyZSBhdmFpbGFibGUuCi0KLS0gVGhlIGxvY2FsZSBtb2R1bGUgbm93IGV4cG9zZXMgdGhlIEMgbGlicmFyeSdzIGdldHRleHQgaW50ZXJmYWNlLiBJdAotICBhbHNvIGhhcyBhIG5ldyBmdW5jdGlvbiBnZXRwcmVmZXJyZWRlbmNvZGluZy4KLQotLSBBIHNlY3VyaXR5IGhvbGUgKCJkb3VibGUgZnJlZSIpIHdhcyBmb3VuZCBpbiB6bGliLTEuMS4zLCBhIHBvcHVsYXIKLSAgdGhpcmQgcGFydHkgY29tcHJlc3Npb24gbGlicmFyeSB1c2VkIGJ5IHNvbWUgUHl0aG9uIG1vZHVsZXMuICBUaGUKLSAgaG9sZSB3YXMgcXVpY2tseSBwbHVnZ2VkIGluIHpsaWItMS4xLjQsIGFuZCB0aGUgV2luZG93cyBidWlsZCBvZgotICBQeXRob24gbm93IHNoaXBzIHdpdGggemxpYi0xLjEuNC4KLQotLSBwd2QsIGdycCwgYW5kIHJlc291cmNlIHJldHVybiBlbmhhbmNlZCB0dXBsZXMgbm93LCB3aXRoIHN5bWJvbGljCi0gIGZpZWxkIG5hbWVzLgotCi0tIGFycmF5LmFycmF5IGlzIG5vdyBhIHR5cGUgb2JqZWN0LiBBIG5ldyBmb3JtYXQgY2hhcmFjdGVyCi0gICd1JyBpbmRpY2F0ZXMgUHlfVU5JQ09ERSBhcnJheXMuIEZvciB0aG9zZSwgLnRvdW5pY29kZSBhbmQKLSAgLmZyb211bmljb2RlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZS4gQXJyYXlzIG5vdyBzdXBwb3J0IF9faWFkZF9fCi0gIGFuZCBfX2ltdWxfXy4KLQotLSBkbCBub3cgYnVpbGRzIG9uIGV2ZXJ5IHN5c3RlbSB0aGF0IGhhcyBkbGZjbi5oLiAgRmFpbHVyZSBpbiBjYXNlCi0gIG9mIHNpemVvZihpbnQpIT1zaXplb2YobG9uZykhPXNpemVvZih2b2lkKikgaXMgZGVsYXllZCB1bnRpbCBkbC5vcGVuCi0gIGlzIGNhbGxlZC4KLQotLSBUaGUgc3lzIG1vZHVsZSBhY3F1aXJlZCBhIG5ldyBhdHRyaWJ1dGUsIGFwaV92ZXJzaW9uLCB3aGljaCBldmFsdWF0ZXMKLSAgdG8gdGhlIHZhbHVlIG9mIHRoZSBQWVRIT05fQVBJX1ZFUlNJT04gbWFjcm8gd2l0aCB3aGljaCB0aGUKLSAgaW50ZXJwcmV0ZXIgd2FzIGNvbXBpbGVkLgotCi0tIEZpeGVkIGJ1ZyAjNDcwNTgyOiBzcmUgbW9kdWxlIHdvdWxkIHJldHVybiBhIHR1cGxlIChOb25lLCAnYScsICdhYicpCi0gIHdoZW4gYXBwbHlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAnXigoYSljKT8oYWIpJCcgb24gJ2FiJy4gSXQgbm93Ci0gIHJldHVybnMgKE5vbmUsIE5vbmUsICdhYicpLCBhcyBleHBlY3RlZC4gQWxzbyBmaXhlZCBoYW5kbGluZyBvZgotICBsYXN0aW5kZXgvbGFzdGdyb3VwIG1hdGNoIGF0dHJpYnV0ZXMgaW4gc2ltaWxhciBjYXNlcy4gRm9yIGV4YW1wbGUsCi0gIHdoZW4gcnVubmluZyB0aGUgZXhwcmVzc2lvbiByJyhhKShiKT9iJyBvdmVyICdhYicsIGxhc3RpbmRleCBtdXN0IGJlCi0gIDEsIG5vdCAyLgotCi0tIEZpeGVkIGJ1ZyAjNTgxMDgwOiBzcmUgc2Nhbm5lciB3YXMgbm90IGNoZWNraW5nIHRoZSBidWZmZXIgbGltaXQKLSAgYmVmb3JlIGluY3JlYXNpbmcgdGhlIGN1cnJlbnQgcG9pbnRlci4gVGhpcyB3YXMgY3JlYXRpbmcgYW4gaW5maW5pdGUKLSAgbG9vcCBpbiB0aGUgc2VhcmNoIGZ1bmN0aW9uLCBvbmNlIHRoZSBwb2ludGVyIGV4Y2VlZGVkIHRoZSBidWZmZXIKLSAgbGltaXQuCi0KLS0gVGhlIG9zLmZkb3BlbiBmdW5jdGlvbiBub3cgZW5mb3JjZXMgYSBmaWxlIG1vZGUgc3RhcnRpbmcgd2l0aCB0aGUKLSAgbGV0dGVyICdyJywgJ3cnIG9yICdhJywgb3RoZXJ3aXNlIGEgVmFsdWVFcnJvciBpcyByYWlzZWQuIFRoaXMgZml4ZXMKLSAgYnVnICM2MjM0NjQuCi0KLS0gVGhlIGxpbnV4YXVkaW9kZXYgbW9kdWxlIGlzIG5vdyBkZXByZWNhdGVkOyBpdCBpcyBiZWluZyByZXBsYWNlZCBieQotICBvc3NhdWRpb2Rldi4gIFRoZSBpbnRlcmZhY2UgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gY292ZXIgYSBsb3QgbW9yZSBvZgotICBPU1MgKHNlZSB3d3cub3BlbnNvdW5kLmNvbSksIGluY2x1ZGluZyBtb3N0IERTUCBpb2N0bHMgYW5kIHRoZQotICBPU1MgbWl4ZXIgQVBJLiAgRG9jdW1lbnRhdGlvbiBmb3J0aGNvbWluZyBpbiAyLjNhMi4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIGltYXBsaWIucHkgbm93IHN1cHBvcnRzIFNTTCAoVGlubyBMYW5nZSBhbmQgUGllcnMgTGF1ZGVyKS4KLQotLSBGcmVlemUncyBtb2R1bGVmaW5kZXIucHkgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnk7Ci0gIHNsaWdodGx5IGltcHJvdmVkIHNvIGl0IHdpbGwgaXNzdWUgbGVzcyBmYWxzZSBtaXNzaW5nIHN1Ym1vZHVsZQotICByZXBvcnRzIChzZWUgc2YgcGF0aCAjNjQzNzExIGZvciBkZXRhaWxzKS4gIERvY3VtZW50YXRpb24gd2lsbCBmb2xsb3cKLSAgd2l0aCBQeXRob24gMi4zYTIuCi0KLS0gb3MucGF0aCBleHBvc2VzIGdldGN0aW1lLgotCi0tIHVuaXR0ZXN0LnB5IG5vdyBoYXMgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcyBjYWxsZWQgYXNzZXJ0QWxtb3N0RXF1YWwoKQotICBhbmQgZmFpbElmQWxtb3N0RXF1YWwoKS4gIFRoZXkgaW1wbGVtZW50IGFuIGFwcHJveGltYXRlIGNvbXBhcmlzb24KLSAgYnkgcm91bmRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGFyZ3VtZW50cyBhbmQgY29tcGFyaW5nCi0gIHRoZSByZXN1bHQgdG8gemVyby4gIEFwcHJveGltYXRlIGNvbXBhcmlzb24gaXMgZXNzZW50aWFsIGZvcgotICB1bml0IHRlc3RzIG9mIGZsb2F0aW5nIHBvaW50IHJlc3VsdHMuCi0KLS0gY2FsZW5kYXIucHkgbm93IGRlcGVuZHMgb24gdGhlIG5ldyBkYXRldGltZSBtb2R1bGUgcmF0aGVyIHRoYW4KLSAgdGhlIHRpbWUgbW9kdWxlLiAgQXMgYSByZXN1bHQsIHRoZSByYW5nZSBvZiBhbGxvd2FibGUgZGF0ZXMKLSAgaGFzIGJlZW4gaW5jcmVhc2VkLgotCi0tIHBkYiBoYXMgYSBuZXcgJ2oodW1wKScgY29tbWFuZCB0byBzZWxlY3QgdGhlIG5leHQgbGluZSB0byBiZQotICBleGVjdXRlZC4KLQotLSBUaGUgZGlzdHV0aWxzIGNyZWF0ZWQgd2luZG93cyBpbnN0YWxsZXJzIG5vdyBjYW4gcnVuIGEKLSAgcG9zdGluc3RhbGxhdGlvbiBzY3JpcHQuCi0KLS0gZG9jdGVzdC50ZXN0bW9kIGNhbiBub3cgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnQsIHdoaWNoIG1lYW5zIHRvCi0gIHRlc3QgdGhlIGN1cnJlbnQgbW9kdWxlLgotCi0tIFdoZW4gY2FuY2VsaW5nIGEgc2VydmVyIHRoYXQgaW1wbGVtZW50ZWQgdGhyZWFkaW5nIHdpdGggYSBrZXlib2FyZAotICBpbnRlcnJ1cHQsIHRoZSBzZXJ2ZXIgd291bGQgc2h1dCBkb3duIGJ1dCBub3QgdGVybWluYXRlICh3YWl0aW5nIG9uCi0gIGNsaWVudCB0aHJlYWRzKS4gQSBuZXcgbWVtYmVyIHZhcmlhYmxlLCBkYWVtb25fdGhyZWFkcywgd2FzIGFkZGVkIHRvCi0gIHRoZSBUaHJlYWRpbmdNaXhJbiBjbGFzcyBpbiBTb2NrZXRTZXJ2ZXIucHkgdG8gbWFrZSBpdCBleHBsaWNpdCB0aGF0Ci0gIHRoaXMgYmVoYXZpb3IgbmVlZHMgdG8gYmUgY29udHJvbGxlZC4KLQotLSBBIG5ldyBtb2R1bGUsIG9wdHBhcnNlLCBwcm92aWRlcyBhIGZhbmN5IGFsdGVybmF0aXZlIHRvIGdldG9wdCBmb3IKLSAgY29tbWFuZCBsaW5lIHBhcnNpbmcuICBJdCBpcyBhIHNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgR3JlZwotICBXYXJkJ3MgT3B0aWsgcGFja2FnZS4KLQotLSBVc2VyRGljdC5weSBub3cgZGVmaW5lcyBhIERpY3RNaXhpbiBjbGFzcyB3aGljaCBkZWZpbmVzIGFsbCBkaWN0aW9uYXJ5Ci0gIG1ldGhvZHMgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBtaW5pbXVtIG1hcHBpbmcgaW50ZXJmYWNlLgotICBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB3cml0aW5nIGNsYXNzZXMgdGhhdCBuZWVkIHRvIGJlIHN1YnN0aXR1dGFibGUKLSAgZm9yIGRpY3Rpb25hcmllcyAoc3VjaCBhcyB0aGUgc2hlbHZlIG1vZHVsZSkuCi0KLS0gc2hlbHZlLnB5IG5vdyBzdWJjbGFzc2VzIGZyb20gVXNlckRpY3QuRGljdE1peGluLiAgTm93IHNoZWx2ZSBzdXBwb3J0cwotICBhbGwgZGljdGlvbmFyeSBtZXRob2RzLiAgVGhpcyBlYXNlcyB0aGUgdHJhbnNpdGlvbiB0byBwZXJzaXN0ZW50Ci0gIHN0b3JhZ2UgZm9yIHNjcmlwdHMgb3JpZ2luYWxseSB3cml0dGVuIHdpdGggZGljdGlvbmFyaWVzIGluIG1pbmQuCi0KLS0gc2hlbHZlLm9wZW4gYW5kIHRoZSB2YXJpb3VzIGNsYXNzZXMgaW4gc2hlbHZlLnB5IG5vdyBhY2NlcHQgYW4gb3B0aW9uYWwKLSAgYmluYXJ5IGZsYWcsIHdoaWNoIGRlZmF1bHRzIHRvIEZhbHNlLiAgSWYgVHJ1ZSwgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlCi0gIHNoZWxmIGFyZSBiaW5hcnkgcGlja2xlcy4KLQotLSBBIG5ldyBwYWNrYWdlLCBsb2dnaW5nLCBpbXBsZW1lbnRzIHRoZSBsb2dnaW5nIEFQSSBkZWZpbmVkIGJ5IFBFUAotICAyODIuICBUaGUgY29kZSBpcyB3cml0dGVuIGJ5IFZpbmF5IFNhamlwLgotCi0tIFN0cmVhbVJlYWRlciwgU3RyZWFtUmVhZGVyV3JpdGVyIGFuZCBTdHJlYW1SZWNvZGVyIGluIHRoZSBjb2RlY3MKLSAgbW9kdWxlcyBhcmUgaXRlcmF0b3JzIG5vdy4KLQotLSBnemlwLnB5IG5vdyBoYW5kbGVzIGZpbGVzIGV4Y2VlZGluZyAyR0IuICBGaWxlcyBvdmVyIDRHQiBhbHNvIHdvcmsKLSAgbm93IChwcm92aWRlZCB0aGUgT1Mgc3VwcG9ydHMgaXQsIGFuZCBQeXRob24gaXMgY29uZmlndXJlZCB3aXRoIGxhcmdlCi0gIGZpbGUgc3VwcG9ydCksIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIHVuZGVybHlpbmcgZ3ppcCBmaWxlIGZvcm1hdCBjYW4KLSAgcmVjb3JkIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IDMyIGJpdHMgb2YgdGhlIGZpbGUgc2l6ZSwgc28gdGhhdAotICBzb21lIHRvb2xzIHdvcmtpbmcgd2l0aCBnemlwcGVkIGZpbGVzIG1heSByZXBvcnQgYW4gaW5jb3JyZWN0IGZpbGUKLSAgc2l6ZS4KLQotLSB4bWwuc2F4LnNheHV0aWxzLnVuZXNjYXBlIGhhcyBiZWVuIGFkZGVkLCB0byByZXBsYWNlIGVudGl0eSByZWZlcmVuY2VzCi0gIHdpdGggdGhlaXIgZW50aXR5IHZhbHVlLgotCi0tIFF1ZXVlLlF1ZXVlLntwdXQsZ2V0fSBub3cgc3VwcG9ydCBhbiBvcHRpb25hbCB0aW1lb3V0IGFyZ3VtZW50LgotCi0tIFZhcmlvdXMgZmVhdHVyZXMgb2YgVGsgOC40IGFyZSBleHBvc2VkIGluIFRraW50ZXIucHkuIFRoZSBtdWx0aXBsZQotICBvcHRpb24gb2YgdGtGaWxlRGlhbG9nIGlzIGV4cG9zZWQgYXMgZnVuY3Rpb24gYXNrb3BlbmZpbGV7LG5hbWV9cy4KLQotLSBWYXJpb3VzIGNvbmZpZ3VyZSBtZXRob2RzIG9mIFRraW50ZXIgaGF2ZSBiZWVuIHN0cmVhbS1saW5lZCwgc28gdGhhdAotICB0YWdfY29uZmlndXJlLCBpbWFnZV9jb25maWd1cmUsIHdpbmRvd19jb25maWd1cmUgbm93IHJldHVybiBhCi0gIGRpY3Rpb25hcnkgd2hlbiBpbnZva2VkIHdpdGggbm8gYXJndW1lbnQuCi0KLS0gSW1wb3J0aW5nIHRoZSByZWFkbGluZSBtb2R1bGUgbm93IG5vIGxvbmdlciBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mCi0gIGNhbGxpbmcgc2V0bG9jYWxlKExDX0NUWVBFLCAiIikuICBUaGUgaW5pdGlhbCAiQyIgbG9jYWxlLCBvcgotICB3aGF0ZXZlciBsb2NhbGUgaXMgZXhwbGljaXRseSBzZXQgYnkgdGhlIHVzZXIsIGlzIHByZXNlcnZlZC4gIElmIHlvdQotICB3YW50IHJlcHIoKSBvZiA4LWJpdCBzdHJpbmdzIGluIHlvdXIgcHJlZmVycmVkIGVuY29kaW5nIHRvIHByZXNlcnZlCi0gIGFsbCBwcmludGFibGUgY2hhcmFjdGVycyBvZiB0aGF0IGVuY29kaW5nLCB5b3UgaGF2ZSB0byBhZGQgdGhlCi0gIGZvbGxvd2luZyBjb2RlIHRvIHlvdXIgJFBZVEhPTlNUQVJUVVAgZmlsZSBvciB0byB5b3VyIGFwcGxpY2F0aW9uJ3MKLSAgbWFpbigpOgotCi0gICAgaW1wb3J0IGxvY2FsZQotICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAiIikKLQotLSBzaHV0aWwubW92ZSB3YXMgYWRkZWQuIHNodXRpbC5jb3B5dHJlZSBub3cgcmVwb3J0cyBlcnJvcnMgYXMgYW4KLSAgZXhjZXB0aW9uIGF0IHRoZSBlbmQsIGluc3RlYWQgb2YgcHJpbnRpbmcgZXJyb3IgbWVzc2FnZXMuCi0KLS0gRW5jb2RpbmcgbmFtZSBub3JtYWxpemF0aW9uIHdhcyBnZW5lcmFsaXplZCB0byBub3Qgb25seQotICByZXBsYWNlIGh5cGhlbnMgd2l0aCB1bmRlcnNjb3JlcywgYnV0IGFsc28gYWxsIG90aGVyIG5vbi1hbHBoYW51bWVyaWMKLSAgY2hhcmFjdGVycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBkb3Qgd2hpY2ggaXMgdXNlZCBmb3IgUHl0aG9uCi0gIHBhY2thZ2UgbmFtZXMgZHVyaW5nIGxvb2t1cCkuIFRoZSBhbGlhc2VzLnB5IG1hcHBpbmcgd2FzIHVwZGF0ZWQKLSAgdG8gdGhlIG5ldyBzdGFuZGFyZC4KLQotLSBtaW1ldHlwZXMgaGFzIHR3byBuZXcgZnVuY3Rpb25zOiBndWVzc19hbGxfZXh0ZW5zaW9ucygpIHdoaWNoCi0gIHJldHVybnMgYSBsaXN0IG9mIGFsbCBrbm93biBleHRlbnNpb25zIGZvciBhIG1pbWUgdHlwZSwgYW5kCi0gIGFkZF90eXBlKCkgd2hpY2ggYWRkcyBvbmUgbWFwcGluZyBiZXR3ZWVuIGEgbWltZSB0eXBlIGFuZAotICBhbiBleHRlbnNpb24gdG8gdGhlIGRhdGFiYXNlLgotCi0tIE5ldyBtb2R1bGU6IHNldHMsIGRlZmluZXMgdGhlIGNsYXNzIFNldCB0aGF0IGltcGxlbWVudHMgYSBtdXRhYmxlCi0gIHNldCB0eXBlIHVzaW5nIHRoZSBrZXlzIG9mIGEgZGljdCB0byByZXByZXNlbnQgdGhlIHNldC4gIFRoZXJlJ3MKLSAgYWxzbyBhIGNsYXNzIEltbXV0YWJsZVNldCB3aGljaCBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCBzZXRzIG9mIHNldHMKLSAgb3Igd2hlbiB5b3UgbmVlZCB0byB1c2Ugc2V0cyBhcyBkaWN0IGtleXMsIGFuZCBhIGNsYXNzIEJhc2VTZXQgd2hpY2gKLSAgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHR3by4KLQotLSBBZGRlZCByYW5kb20uc2FtcGxlKHBvcHVsYXRpb24saykgZm9yIHJhbmRvbSBzYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50LgotICBSZXR1cm5zIGEgayBsZW5ndGggbGlzdCBvZiB1bmlxdWUgZWxlbWVudHMgY2hvc2VuIGZyb20gdGhlIHBvcHVsYXRpb24uCi0KLS0gcmFuZG9tLnJhbmRyYW5nZSgtc3lzLm1heGludC0xLCBzeXMubWF4aW50KSBubyBsb25nZXIgcmFpc2VzCi0gIE92ZXJmbG93RXJyb3IuICBUaGF0IGlzLCBpdCBub3cgYWNjZXB0cyBhbnkgY29tYmluYXRpb24gb2YgJ3N0YXJ0JwotICBhbmQgJ3N0b3AnIGFyZ3VtZW50cyBzbyBsb25nIGFzIGVhY2ggaXMgaW4gdGhlIHJhbmdlIG9mIFB5dGhvbidzCi0gIGJvdW5kZWQgaW50ZWdlcnMuCi0KLS0gVGhhbmtzIHRvIFJheW1vbmQgSGV0dGluZ2VyLCByYW5kb20ucmFuZG9tKCkgbm93IHVzZXMgYSBuZXcgY29yZQotICBnZW5lcmF0b3IuICBUaGUgTWVyc2VubmUgVHdpc3RlciBhbGdvcml0aG0gaXMgaW1wbGVtZW50ZWQgaW4gQywKLSAgdGhyZWFkc2FmZSwgZmFzdGVyIHRoYW4gdGhlIHByZXZpb3VzIGdlbmVyYXRvciwgaGFzIGFuIGFzdHJvbm9taWNhbGx5Ci0gIGxhcmdlIHBlcmlvZCAoMioqMTk5MzctMSksIGNyZWF0ZXMgcmFuZG9tIGZsb2F0cyB0byBmdWxsIDUzLWJpdAotICBwcmVjaXNpb24sIGFuZCBtYXkgYmUgdGhlIG1vc3Qgd2lkZWx5IHRlc3RlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotICBpbiBleGlzdGVuY2UuCi0KLSAgVGhlIHJhbmRvbS5qdW1wYWhlYWQobikgbWV0aG9kIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZvciB0aGUgbmV3Ci0gIGdlbmVyYXRvci4gIEluc3RlYWQgb2YganVtcGluZyBuIHN0ZXBzIGFoZWFkLCBpdCB1c2VzIG4gYW5kIHRoZQotICBleGlzdGluZyBzdGF0ZSB0byBjcmVhdGUgYSBuZXcgc3RhdGUuICBUaGlzIG1lYW5zIHRoYXQganVtcGFoZWFkKCkKLSAgY29udGludWVzIHRvIHN1cHBvcnQgbXVsdGktdGhyZWFkZWQgY29kZSBuZWVkaW5nIGdlbmVyYXRvcnMgb2YKLSAgbm9uLW92ZXJsYXBwaW5nIHNlcXVlbmNlcy4gIEhvd2V2ZXIsIGl0IHdpbGwgYnJlYWsgY29kZSB3aGljaCByZWxpZXMKLSAgb24ganVtcGFoZWFkIG1vdmluZyBhIHNwZWNpZmljIG51bWJlciBvZiBzdGVwcyBmb3J3YXJkLgotCi0gIFRoZSBhdHRyaWJ1dGVzIHJhbmRvbS53aHNlZWQgYW5kIHJhbmRvbS5fX3doc2VlZCBoYXZlIG5vIG1lYW5pbmcgZm9yCi0gIHRoZSBuZXcgZ2VuZXJhdG9yLiAgQ29kZSB1c2luZyB0aGVzZSBhdHRyaWJ1dGVzIHNob3VsZCBzd2l0Y2ggdG8gYQotICBuZXcgY2xhc3MsIHJhbmRvbS5XaWNobWFubkhpbGwgd2hpY2ggaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkCi0gIGNvbXBhdGliaWxpdHkgYW5kIHRvIG1ha2UgYW4gYWx0ZXJuYXRlIGdlbmVyYXRvciBhdmFpbGFibGUuCi0KLS0gTmV3ICJhbGdvcml0aG1zIiBtb2R1bGU6IGhlYXBxLCBpbXBsZW1lbnRzIGEgaGVhcCBxdWV1ZS4gIFRoYW5rcyB0bwotICBLZXZpbiBPJ0Nvbm5vciBmb3IgdGhlIGNvZGUgYW5kIEZyYW7nb2lzIFBpbmFyZCBmb3IgYW4gZW50ZXJ0YWluaW5nCi0gIHdyaXRlLXVwIGV4cGxhaW5pbmcgdGhlIHRoZW9yeSBhbmQgcHJhY3RpY2FsIHVzZXMgb2YgaGVhcHMuCi0KLS0gTmV3IGVuY29kaW5nIGZvciB0aGUgUGFsbSBPUyBjaGFyYWN0ZXIgc2V0OiBwYWxtb3MuCi0KLS0gYmluYXNjaWkuY3JjMzIoKSBhbmQgdGhlIHppcGZpbGUgbW9kdWxlIGhhZCBwcm9ibGVtcyBvbiBzb21lIDY0LWJpdAotICBwbGF0Zm9ybXMuICBUaGVzZSBoYXZlIGJlZW4gZml4ZWQuICBPbiBhIHBsYXRmb3JtIHdpdGggOC1ieXRlIEMgbG9uZ3MsCi0gIGNyYzMyKCkgbm93IHJldHVybnMgYSBzaWduZWQtZXh0ZW5kZWQgNC1ieXRlIHJlc3VsdCwgc28gdGhhdCBpdHMgdmFsdWUKLSAgYXMgYSBQeXRob24gaW50IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBjb21wdXRlZCBhIDMyLWJpdCBwbGF0Zm9ybS4KLQotLSB4bWwuZG9tLm1pbmlkb20udG94bWwgYW5kIHRvcHJldHR5eG1sIG5vdyB0YWtlIGFuIG9wdGlvbmFsIGVuY29kaW5nCi0gIGFyZ3VtZW50LgotCi0tIFNvbWUgZml4ZXMgaW4gdGhlIGNvcHkgbW9kdWxlOiB3aGVuIGFuIG9iamVjdCBpcyBjb3BpZWQgdGhyb3VnaCBpdHMKLSAgX19yZWR1Y2VfXyBtZXRob2QsIHRoZXJlIHdhcyBubyBjaGVjayBmb3IgYSBfX3NldHN0YXRlX18gbWV0aG9kIG9uCi0gIHRoZSByZXN1bHQgW1NGIHBhdGNoIDU2NTA4NV07IGRlZXBjb3B5IHNob3VsZCB0cmVhdCBpbnN0YW5jZXMgb2YKLSAgY3VzdG9tIG1ldGFjbGFzc2VzIHRoZSBzYW1lIHdheSBpdCB0cmVhdHMgaW5zdGFuY2VzIG9mIHR5cGUgJ3R5cGUnCi0gIFtTRiBwYXRjaCA1NjA3OTRdLgotCi0tIFNvY2tldHMgbm93IHN1cHBvcnQgdGltZW91dCBtb2RlLiAgQWZ0ZXIgcy5zZXR0aW1lb3V0KFQpLCB3aGVyZSBUIGlzCi0gIGEgZmxvYXQgZXhwcmVzc2luZyBzZWNvbmRzLCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgcmFpc2UgYW4gZXhjZXB0aW9uCi0gIGlmIHRoZXkgY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gVCBzZWNvbmRzLiAgVG8gZGlzYWJsZSB0aW1lb3V0Ci0gIG1vZGUsIHVzZSBzLnNldHRpbWVvdXQoTm9uZSkuICBUaGVyZSdzIGFsc28gYSBtb2R1bGUgZnVuY3Rpb24sCi0gIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChUKSwgd2hpY2ggc2V0cyB0aGUgZGVmYXVsdCBmb3IgYWxsIHNvY2tldHMKLSAgY3JlYXRlZCBoZW5jZWZvcnRoLgotCi0tIGdldG9wdC5nbnVfZ2V0b3B0IHdhcyBhZGRlZC4gIFRoaXMgc3VwcG9ydHMgR05VLXN0eWxlIG9wdGlvbgotICBwcm9jZXNzaW5nLCB3aGVyZSBvcHRpb25zIGNhbiBiZSBtaXhlZCB3aXRoIG5vbi1vcHRpb24gYXJndW1lbnRzLgotCi0tIFN0b3AgdXNpbmcgc3RyaW5ncyBmb3IgZXhjZXB0aW9ucy4gIFN0cmluZyBvYmplY3RzIHVzZWQgZm9yCi0gIGV4Y2VwdGlvbnMgYXJlIG5vdyBjbGFzc2VzIGRlcml2aW5nIGZyb20gRXhjZXB0aW9uLiAgVGhlIG9iamVjdHMKLSAgY2hhbmdlZCB3ZXJlOiBUa2ludGVyLlRjbEVycm9yLCBiZGIuQmRiUXVpdCwgbWFjcGF0aC5ub3JtX2Vycm9yLAotICB0YWJuYW5ueS5OYW5ueU5hZywgYW5kIHhkcmxpYi5FcnJvci4KLQotLSBDb25zdGFudHMgQk9NX1VURjgsIEJPTV9VVEYxNiwgQk9NX1VURjE2X0xFLCBCT01fVVRGMTZfQkUsCi0gIEJPTV9VVEYzMiwgQk9NX1VURjMyX0xFIGFuZCBCT01fVVRGMzJfQkUgdGhhdCByZXByZXNlbnQgdGhlIEJ5dGUKLSAgT3JkZXIgTWFyayBpbiBVVEYtOCwgVVRGLTE2IGFuZCBVVEYtMzIgZW5jb2RpbmdzIGZvciBsaXR0bGUgYW5kCi0gIGJpZyBlbmRpYW4gc3lzdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSBjb2RlY3MgbW9kdWxlLiBUaGUgb2xkIG5hbWVzCi0gIEJPTTMyXyogYW5kIEJPTTY0Xyogd2VyZSBvZmYgYnkgYSBmYWN0b3Igb2YgMi4KLQotLSBBZGRlZCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBtYXRoLmRlZ3JlZXMoKSBhbmQgbWF0aC5yYWRpYW5zKCkuCi0KLS0gbWF0aC5sb2coKSBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQ6ICBtYXRoLmxvZyh4WywgYmFzZV0pLgotCi0tIGZ0cGxpYi5yZXRybGluZXMoKSBub3cgdGVzdHMgZm9yIGNhbGxiYWNrIGlzIE5vbmUgcmF0aGVyIHRoYW4gdGVzdGluZwotICBmb3IgRmFsc2UuICBXYXMgY2F1c2luZyBhbiBlcnJvciB3aGVuIGdpdmVuIGEgY2FsbGJhY2sgb2JqZWN0IHdoaWNoCi0gIHdhcyBjYWxsYWJsZSBidXQgYWxzbyByZXR1cm5lZCBsZW4oKSBhcyB6ZXJvLiAgVGhlIGNoYW5nZSBtYXkKLSAgY3JlYXRlIG5ldyBicmVha2FnZSBpZiB0aGUgY2FsbGVyIHJlbGllZCBvbiB0aGUgdW5kb2N1bWVudGVkIGJlaGF2aW9yCi0gIGFuZCBjYWxsZWQgd2l0aCBjYWxsYmFjayBzZXQgdG8gW10gb3Igc29tZSBvdGhlciBGYWxzZSB2YWx1ZSBub3QKLSAgaWRlbnRpY2FsIHRvIE5vbmUuCi0KLS0gcmFuZG9tLmdhdXNzKCkgdXNlcyBhIHBpZWNlIG9mIGhpZGRlbiBzdGF0ZSB1c2VkIGJ5IG5vdGhpbmcgZWxzZSwKLSAgYW5kIHRoZSAuc2VlZCgpIGFuZCAud2hzZWVkKCkgbWV0aG9kcyBmYWlsZWQgdG8gcmVzZXQgaXQuICBJbiBvdGhlcgotICB3b3Jkcywgc2V0dGluZyB0aGUgc2VlZCBkaWRuJ3QgY29tcGxldGVseSBkZXRlcm1pbmUgdGhlIHNlcXVlbmNlIG9mCi0gIHJlc3VsdHMgcHJvZHVjZWQgYnkgcmFuZG9tLmdhdXNzKCkuICBJdCBkb2VzIG5vdy4gIFByb2dyYW1zIHJlcGVhdGVkbHkKLSAgbWl4aW5nIGNhbGxzIHRvIGEgc2VlZCBtZXRob2Qgd2l0aCBjYWxscyB0byBnYXVzcygpIG1heSBzZWUgZGlmZmVyZW50Ci0gIHJlc3VsdHMgbm93LgotCi0tIFRoZSBwaWNrbGUuUGlja2xlciBjbGFzcyBncmV3IGEgY2xlYXJfbWVtbygpIG1ldGhvZCB0byBtaW1pYyB0aGF0Ci0gIHByb3ZpZGVkIGJ5IGNQaWNrbGUuUGlja2xlci4KLQotLSBkaWZmbGliJ3MgU2VxdWVuY2VNYXRjaGVyIGNsYXNzIG5vdyBkb2VzIGEgZHluYW1pYyBhbmFseXNpcyBvZgotICB3aGljaCBlbGVtZW50cyBhcmUgc28gZnJlcXVlbnQgYXMgdG8gY29uc3RpdHV0ZSBub2lzZS4gIEZvcgotICBjb21wYXJpbmcgZmlsZXMgYXMgc2VxdWVuY2VzIG9mIGxpbmVzLCB0aGlzIGdlbmVyYWxseSB3b3JrcyBiZXR0ZXIKLSAgdGhhbiB0aGUgSVNfTElORV9KVU5LIGZ1bmN0aW9uLCBhbmQgZnVuY3Rpb24gbmRpZmYncyBsaW5lanVuawotICBhcmd1bWVudCBkZWZhdWx0cyB0byBOb25lIG5vdyBhcyBhIHJlc3VsdC4gIEEgaGFwcHkgYmVuZWZpdCBpcwotICB0aGF0IFNlcXVlbmNlTWF0Y2hlciBtYXkgcnVuIG11Y2ggZmFzdGVyIG5vdyB3aGVuIGFwcGxpZWQKLSAgdG8gbGFyZ2UgZmlsZXMgd2l0aCBtYW55IGR1cGxpY2F0ZSBsaW5lcyAoZm9yIGV4YW1wbGUsIEMgcHJvZ3JhbQotICB0ZXh0IHdpdGggbG90cyBvZiByZXBlYXRlZCAifSIgYW5kICJyZXR1cm4gTlVMTDsiIGxpbmVzKS4KLQotLSBOZXcgVGV4dC5kdW1wKCkgbWV0aG9kIGluIFRraW50ZXIgbW9kdWxlLgotCi0tIE5ldyBkaXN0dXRpbHMgY29tbWFuZHMgZm9yIGJ1aWxkaW5nIHBhY2thZ2VycyB3ZXJlIGFkZGVkIHRvCi0gIHN1cHBvcnQgcGtndG9vbCBvbiBTb2xhcmlzIGFuZCBzd2luc3RhbGwgb24gSFAtVVguCi0KLS0gZGlzdHV0aWxzIG5vdyBoYXMgYSBuZXcgYWJzdHJhY3QgYmluYXJ5IHBhY2thZ2VyIGJhc2UgY2xhc3MKLSAgY29tbWFuZC9iZGlzdF9wYWNrYWdlciwgd2hpY2ggc2ltcGxpZmllcyB3cml0aW5nIHBhY2thZ2Vycy4KLSAgVGhpcyB3aWxsIGhvcGVmdWxseSBwcm92aWRlIHRoZSBtaXNzaW5nIGJpdHMgdG8gZW5jb3VyYWdlCi0gIHBlb3BsZSB0byBzdWJtaXQgbW9yZSBwYWNrYWdlcnMsIGUuZy4gZm9yIERlYmlhbiwgRnJlZUJTRAotICBhbmQgb3RoZXIgc3lzdGVtcy4KLQotLSBUaGUgVVRGLTE2LCAtTEUgYW5kIC1CRSBzdHJlYW0gcmVhZGVycyBub3cgcmFpc2UgYQotICBOb3RJbXBsZW1lbnRlZEVycm9yIGZvciBhbGwgY2FsbHMgdG8gLnJlYWRsaW5lKCkuIFByZXZpb3VzbHksIHRoZXkKLSAgdXNlZCB0byBqdXN0IHByb2R1Y2UgZ2FyYmFnZSBvciBmYWlsIHdpdGggYW4gZW5jb2RpbmcgZXJyb3IgLS0KLSAgVVRGLTE2IGlzIGEgMi1ieXRlIGVuY29kaW5nIGFuZCB0aGUgQyBsaWIncyBsaW5lIHJlYWRpbmcgQVBJcyBkb24ndAotICB3b3JrIHdlbGwgd2l0aCB0aGVzZS4KLQotLSBjb21waWxlYWxsIG5vdyBzdXBwb3J0cyBxdWlldCBvcGVyYXRpb24uCi0KLS0gVGhlIEJhc2VIVFRQU2VydmVyIG5vdyBpbXBsZW1lbnRzIG9wdGlvbmFsIEhUVFAvMS4xIHBlcnNpc3RlbnQKLSAgY29ubmVjdGlvbnMuCi0KLS0gc29ja2V0IG1vZHVsZTogdGhlIFNTTCBzdXBwb3J0IHdhcyBicm9rZW4gb3V0IG9mIHRoZSBtYWluCi0gIF9zb2NrZXQgbW9kdWxlIEMgaGVscGVyIGFuZCBwbGFjZWQgaW50byBhIG5ldyBfc3NsIGhlbHBlcgotICB3aGljaCBub3cgZ2V0cyBpbXBvcnRlZCBieSBzb2NrZXQucHkgaWYgYXZhaWxhYmxlIGFuZCB3b3JraW5nLgotCi0tIGVuY29kaW5ncyBwYWNrYWdlOiBhZGRlZCBhbGlhc2VzIGZvciBhbGwgc3VwcG9ydGVkIElBTkEgY2hhcmFjdGVyCi0gIHNldHMKLQotLSBmdHBsaWI6IHRvIHNhZmVndWFyZCB0aGUgdXNlcidzIHByaXZhY3ksIGFub255bW91cyBsb2dpbiB3aWxsIHVzZQotICAiYW5vbnltb3VzQCIgYXMgZGVmYXVsdCBwYXNzd29yZCwgcmF0aGVyIHRoYW4gdGhlIHJlYWwgdXNlciBhbmQgaG9zdAotICBuYW1lLgotCi0tIHdlYmJyb3dzZXI6IHRpZ2h0ZW5lZCB1cCB0aGUgY29tbWFuZCBwYXNzZWQgdG8gb3Muc3lzdGVtKCkgc28gdGhhdAotICBhcmJpdHJhcnkgc2hlbGwgY29kZSBjYW4ndCBiZSBleGVjdXRlZCBiZWNhdXNlIGEgYm9ndXMgVVJMIHdhcwotICBwYXNzZWQgaW4uCi0KLS0gZ2V0dGV4dC50cmFuc2xhdGlvbiBoYXMgYW4gb3B0aW9uYWwgZmFsbGJhY2sgYXJndW1lbnQsIGFuZAotICBnZXR0ZXh0LmZpbmQgYW4gb3B0aW9uYWwgYWxsIGFyZ3VtZW50LiBUcmFuc2xhdGlvbnMgd2lsbCBub3cgZmFsbGJhY2sKLSAgb24gYSBwZXItbWVzc2FnZSBiYXNpcy4gVGhlIG1vZHVsZSBzdXBwb3J0cyBwbHVyYWwgZm9ybXMsIGJ5IG1lYW5zCi0gIG9mIGdldHRleHQuW2RdbmdldHRleHQgYW5kIFRyYW5zbGF0aW9uLlt1XW5nZXR0ZXh0LgotCi0tIGRpc3R1dGlscyBiZGlzdCBjb21tYW5kcyBub3cgb2ZmZXIgYSAtLXNraXAtYnVpbGQgb3B0aW9uLgotCi0tIHdhcm5pbmdzLndhcm4gbm93IGFjY2VwdHMgYSBXYXJuaW5nIGluc3RhbmNlIGFzIGZpcnN0IGFyZ3VtZW50LgotCi0tIFRoZSB4bWwuc2F4LmV4cGF0cmVhZGVyLkV4cGF0UGFyc2VyIGNsYXNzIHdpbGwgbm8gbG9uZ2VyIGNyZWF0ZQotICBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IHVzaW5nIGl0c2VsZiBhcyB0aGUgbG9jYXRvciB0aGF0IGdldHMgcGFzc2VkCi0gIHRvIHRoZSBjb250ZW50IGhhbmRsZXIgaW1wbGVtZW50YXRpb24uICBbU0YgYnVnICM1MzU0NzRdCi0KLS0gVGhlIGVtYWlsLlBhcnNlci5QYXJzZXIgY2xhc3Mgbm93IHByb3Blcmx5IHBhcnNlcyBzdHJpbmdzIHJlZ2FyZGxlc3MKLSAgb2YgdGhlaXIgbGluZSBlbmRpbmdzLCB3aGljaCBjYW4gYmUgYW55IG9mIFxyLCBcbiwgb3IgXHJcbiAoQ1IsIExGLAotICBvciBDUkxGKS4gIEFsc28sIHRoZSBIZWFkZXIgY2xhc3MncyBjb25zdHJ1Y3RvciBkZWZhdWx0IGFyZ3VtZW50cwotICBoYXMgY2hhbmdlZCBzbGlnaHRseSBzbyB0aGF0IGFuIGV4cGxpY2l0IG1heGxpbmVsZW4gdmFsdWUgaXMgYWx3YXlzCi0gIGhvbm9yZWQsIGFuZCBzbyB1bmljb2RlIGNvbnZlcnNpb24gZXJyb3IgaGFuZGxpbmcgY2FuIGJlIHNwZWNpZmllZC4KLQotLSBkaXN0dXRpbHMnIGJ1aWxkX2V4dCBjb21tYW5kIG5vdyBsaW5rcyBDKysgZXh0ZW5zaW9ucyB3aXRoIHRoZSBDKysKLSAgY29tcGlsZXIgYXZhaWxhYmxlIGluIHRoZSBNYWtlZmlsZSBvciBDWFggZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmCi0gIHJ1bm5pbmcgdW5kZXIgXCpuaXguCi0KLS0gTmV3IG1vZHVsZSBiejI6IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBpbnRlcmZhY2UgZm9yIHRoZSBiejIgY29tcHJlc3Npb24KLSAgbGlicmFyeS4gIEl0IGltcGxlbWVudHMgYSBjb21wbGV0ZSBmaWxlIGludGVyZmFjZSwgb25lLXNob3QgKGRlKWNvbXByZXNzaW9uCi0gIGZ1bmN0aW9ucywgYW5kIHR5cGVzIGZvciBzZXF1ZW50aWFsIChkZSljb21wcmVzc2lvbi4KLQotLSBOZXcgcGRiIGNvbW1hbmQgJ3BwJyB3aGljaCBpcyBsaWtlICdwJyBleGNlcHQgdGhhdCBpdCBwcmV0dHktcHJpbnRzCi0gIHRoZSB2YWx1ZSBvZiBpdHMgZXhwcmVzc2lvbiBhcmd1bWVudC4KLQotLSBOb3cgYmRpc3RfcnBtIGRpc3R1dGlscyBjb21tYW5kIHVuZGVyc3RhbmRzIGEgdmVyaWZ5X3NjcmlwdCBvcHRpb24gaW4KLSAgdGhlIGNvbmZpZyBmaWxlLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcnJlZCBmaWxlbmFtZSBpbgotICB0aGUgIiV2ZXJpZnlzY3JpcHQiIHNlY3Rpb24gb2YgdGhlIHJwbSBzcGVjIGZpbGUuCi0KLS0gRml4ZWQgYnVnICM0OTU2OTU6IHdlYmJyb3dzZXIgbW9kdWxlIHdvdWxkIHJ1biBncmFwaGljIGJyb3dzZXJzIGluIGEKLSAgdW5peCBlbnZpcm9ubWVudCBldmVuIGlmIERJU1BMQVkgd2FzIG5vdCBzZXQuIEFsc28sIHN1cHBvcnQgZm9yCi0gIHNraXBzdG9uZSBicm93c2VyIHdhcyBpbmNsdWRlZC4KLQotLSBGaXhlZCBidWcgIzYzNjc2OTogcmV4ZWMgd291bGQgcnVuIHVuYWxsb3dlZCBjb2RlIGlmIHN1YmNsYXNzZXMgb2YKLSAgc3RyaW5ncyB3ZXJlIHVzZWQgYXMgcGFyYW1ldGVycyBmb3IgY2VydGFpbiBmdW5jdGlvbnMuCi0KLVRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tLQotCi0tIHB5Z2V0dGV4dC5weSBub3cgc3VwcG9ydHMgZ2xvYmJpbmcgb24gV2luZG93cywgYW5kIGFjY2VwdHMgbW9kdWxlCi0gIG5hbWVzIGluIGFkZGl0aW9uIHRvIGFjY2VwdGluZyBmaWxlIG5hbWVzLgotCi0tIFRoZSBTR0kgZGVtb3MgKERlbW8vc2dpKSBoYXZlIGJlZW4gcmVtb3ZlZC4gIE5vYm9keSB0aG91Z2h0IHRoZXkKLSAgd2VyZSBpbnRlcmVzdGluZyBhbnkgbW9yZS4gIChUaGUgU0dJIGxpYnJhcnkgbW9kdWxlcyBhbmQgZXh0ZW5zaW9ucwotICBhcmUgc3RpbGwgdGhlcmU7IGl0IGlzIGJlbGlldmVkIHRoYXQgYXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBhcmUKLSAgc3RpbGwgdXNlZCBhbmQgdXNlZnVsLikKLQotLSBJRExFIHN1cHBvcnRzIHRoZSBuZXcgZW5jb2RpbmcgZGVjbGFyYXRpb25zIChQRVAgMjYzKTsgaXQgY2FuIGFsc28KLSAgZGVhbCB3aXRoIGxlZ2FjeSA4LWJpdCBmaWxlcyBpZiB0aGV5IHVzZSB0aGUgbG9jYWxlJ3MgZW5jb2RpbmcuIEl0Ci0gIGFsbG93cyBub24tQVNDSUkgc3RyaW5ncyBpbiB0aGUgaW50ZXJhY3RpdmUgc2hlbGwgYW5kIGV4ZWN1dGVzIHRoZW0KLSAgaW4gdGhlIGxvY2FsZSdzIGVuY29kaW5nLgotCi0tIGZyZWV6ZS5weSBub3cgcHJvZHVjZXMgYmluYXJpZXMgd2hpY2ggY2FuIGltcG9ydCBzaGFyZWQgbW9kdWxlcywKLSAgdW5saWtlIGJlZm9yZSB3aGVuIHRoaXMgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHN5bWJvbCBleHBvcnRzIGluCi0gIHRoZSBnZW5lcmF0ZWQgYmluYXJ5LgotCi1CdWlsZAotLS0tLS0KLQotLSBPbiBVbml4LCBJRExFIGlzIG5vdyBpbnN0YWxsZWQgYXV0b21hdGljYWxseS4KLQotLSBUaGUgZnBlY3RsIG1vZHVsZSBpcyBub3QgYnVpbHQgYnkgZGVmYXVsdDsgaXQncyBkYW5nZXJvdXMgb3IgdXNlbGVzcwotICBleGNlcHQgaW4gdGhlIGhhbmRzIG9mIGV4cGVydHMuCi0KLS0gVGhlIHB1YmxpYyBQeXRob24gQyBBUEkgd2lsbCBnZW5lcmFsbHkgYmUgZGVjbGFyZWQgdXNpbmcgUHlBUElfRlVOQwotICBhbmQgUHlBUElfREFUQSBtYWNyb3MsIHdoaWxlIFB5dGhvbiBleHRlbnNpb24gbW9kdWxlIGluaXQgZnVuY3Rpb25zCi0gIHdpbGwgYmUgZGVjbGFyZWQgd2l0aCBQeU1PRElOSVRfRlVOQy4gIERMX0VYUE9SVC9ETF9JTVBPUlQgbWFjcm9zCi0gIGFyZSBkZXByZWNhdGVkLgotCi0tIEEgYnVnIHdhcyBmaXhlZCB0aGF0IGNvdWxkIGNhdXNlIENPVU5UX0FMTE9DUyBidWlsZHMgdG8gc2VnZmF1bHQsIG9yCi0gIGdldCBpbnRvIGluZmluaXRlIGxvb3BzLCB3aGVuIGEgbmV3LXN0eWxlIGNsYXNzIGdvdCBnYXJiYWdlLWNvbGxlY3RlZC4KLSAgVW5mb3J0dW5hdGVseSwgdG8gYXZvaWQgdGhpcywgdGhlIHdheSBDT1VOVF9BTExPQ1Mgd29ya3MgcmVxdWlyZXMKLSAgdGhhdCBuZXctc3R5bGUgY2xhc3NlcyBiZSBpbW1vcnRhbCBpbiBDT1VOVF9BTExPQ1MgYnVpbGRzLiAgTm90ZSB0aGF0Ci0gIENPVU5UX0FMTE9DUyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LCBpbiBlaXRoZXIgcmVsZWFzZSBvciBkZWJ1ZwotICBidWlsZHMsIGFuZCB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGFyZSBpbW1vcnRhbCBvbmx5IGluIENPVU5UX0FMTE9DUwotICBidWlsZHMuCi0KLS0gQ29tcGlsaW5nIG91dCB0aGUgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIG5vIGxvbmdlciBhbiBvcHRpb24uCi0gIFRoZSBvbGQgc3ltYm9sIFdJVEhfQ1lDTEVfR0MgaXMgbm93IGlnbm9yZWQsIGFuZCBQeXRob24uaCBhcnJhbmdlcwotICB0aGF0IGl0J3MgYWx3YXlzIGRlZmluZWQgKGZvciB0aGUgYmVuZWZpdCBvZiBhbnkgZXh0ZW5zaW9uIG1vZHVsZXMKLSAgdGhhdCBtYXkgYmUgY29uZGl0aW9uYWxpemluZyBvbiBpdCkuICBBIGJvbnVzIGlzIHRoYXQgYW55IGV4dGVuc2lvbgotICB0eXBlIHBhcnRpY2lwYXRpbmcgaW4gY3ljbGljIGdjIGNhbiBjaG9vc2UgdG8gcGFydGljaXBhdGUgaW4gdGhlCi0gIFB5X1RSQVNIQ0FOIG1lY2hhbmlzbSBub3cgdG9vOyBpbiB0aGUgYWJzZW5jZSBvZiBjeWNsaWMgZ2MsIHRoaXMgdXNlZAotICB0byByZXF1aXJlIGVkaXRpbmcgdGhlIGNvcmUgdG8gdGVhY2ggdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBhYm91dCB0aGUKLSAgbmV3IHR5cGUuCi0KLS0gQWNjb3JkaW5nIHRvIEFubmV4IEYgb2YgdGhlIGN1cnJlbnQgQyBzdGFuZGFyZCwKLQotICAgIFRoZSBTdGFuZGFyZCBDIG1hY3JvIEhVR0VfVkFMIGFuZCBpdHMgZmxvYXQgYW5kIGxvbmcgZG91YmxlIGFuYWxvZ3MsCi0gICAgSFVHRV9WQUxGIGFuZCBIVUdFX1ZBTEwsIGV4cGFuZCB0byBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlCi0gICAgcG9zaXRpdmUgaW5maW5pdGllcy4KLQotICBQeXRob24gb25seSB1c2VzIHRoZSBkb3VibGUgSFVHRV9WQUwsIGFuZCBvbmx5IHRvICNkZWZpbmUgaXRzIG93biBzeW1ib2wKLSAgUHlfSFVHRV9WQUwuICBTb21lIHBsYXRmb3JtcyBoYXZlIGluY29ycmVjdCBkZWZpbml0aW9ucyBmb3IgSFVHRV9WQUwuCi0gIHB5cG9ydC5oIHVzZWQgdG8gdHJ5IHRvIHdvcm0gYXJvdW5kIHRoYXQsIGJ1dCB0aGUgd29ya2Fyb3VuZHMgdHJpZ2dlcmVkCi0gIG90aGVyIGJ1Z3Mgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyB3ZSBnYXZlIHVwLiAgSWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzCi0gIEhVR0VfVkFMIGluY29ycmVjdGx5LCB5b3UnbGwgbmVlZCB0byAjZGVmaW5lIFB5X0hVR0VfVkFMIHRvIHNvbWV0aGluZwotICB0aGF0IHdvcmtzIG9uIHlvdXIgcGxhdGZvcm0uICBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIEknbSBzdXJlIGFib3V0Ci0gIGlzIG9uIGFuIHVua25vd24gc3Vic2V0IG9mIENyYXkgc3lzdGVtcywgZGVzY3JpYmVkIGhlcmU6Ci0KLSAgaHR0cDovL3d3dy5jcmF5LmNvbS9zd3B1YnMvbWFudWFscy9TTi0yMTk0XzIuMC9odG1sLVNOLTIxOTRfMi4wL3gzMTM4Lmh0bQotCi0gIFByZXN1bWFibHkgMi4zYTEgYnJlYWtzIHN1Y2ggc3lzdGVtcy4gIElmIGFueW9uZSB1c2VzIHN1Y2ggYSBzeXN0ZW0sIGhlbHAhCi0KLS0gVGhlIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRob3V0LWRvYy1zdHJpbmdzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUKLSAgZG9jIHN0cmluZ3MgZnJvbSB0aGUgYnVpbHRpbiBmdW5jdGlvbnMgYW5kIG1vZHVsZXM7IHRoaXMgcmVkdWNlcyB0aGUKLSAgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZS4KLQotLSBUaGUgdW5pdmVyc2FsIG5ld2xpbmVzIG9wdGlvbiAoUEVQIDI3OCkgaXMgb24gYnkgZGVmYXVsdC4gIE9uIFVuaXgKLSAgaXQgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgLS13aXRob3V0LXVuaXZlcnNhbC1uZXdsaW5lcyB0byB0aGUKLSAgY29uZmlndXJlIHNjcmlwdC4gIE9uIG90aGVyIHBsYXRmb3JtcywgcmVtb3ZlCi0gIFdJVEhfVU5JVkVSU0FMX05FV0xJTkVTIGZyb20gcHljb25maWcuaC4KLQotLSBPbiBVbml4LCBhIHNoYXJlZCBsaWJweXRob24yLjMuc28gY2FuIGJlIGNyZWF0ZWQgd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0KLS0gQWxsIHVzZXMgb2YgdGhlIENBQ0hFX0hBU0gsIElOVEVSTl9TVFJJTkdTLCBhbmQgRE9OVF9TSEFSRV9TSE9SVF9TVFJJTkdTCi0gIHByZXByb2Nlc3NvciBzeW1ib2xzIHdlcmUgZWxpbWluYXRlZC4gIFRoZSBpbnRlcm5hbCBkZWNpc2lvbnMgdGhleQotICBjb250cm9sbGVkIHN0b3BwZWQgYmVpbmcgZXhwZXJpbWVudGFsIGxvbmcgYWdvLgotCi0tIFRoZSB0b29scyB1c2VkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uIG5vdyB3b3JrIHVuZGVyIEN5Z3dpbiBhcwotICB3ZWxsIGFzIFVuaXguCi0KLS0gVGhlIGJzZGRiIGFuZCBkYm0gbW9kdWxlIGJ1aWxkcyBoYXZlIGJlZW4gY2hhbmdlZCB0byB0cnkgYW5kIGF2b2lkIHZlcnNpb24KLSAgc2tldyBwcm9ibGVtcyBhbmQgZGlzYWJsZSBsaW5rYWdlIHdpdGggQmVya2VsZXkgREIgMS44NSB1bmxlc3MgdGhlCi0gIGluc3RhbGxlciBrbm93cyB3aGF0IHMvaGUncyBkb2luZy4gIFNlZSB0aGUgc2VjdGlvbiBvbiBidWlsZGluZyB0aGVzZQotICBtb2R1bGVzIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgZGV0YWlscy4KLQotQyBBUEkKLS0tLS0tCi0KLS0gUHlOdW1iZXJfQ2hlY2soKSBub3cgcmV0dXJucyB0cnVlIGZvciBzdHJpbmcgYW5kIHVuaWNvZGUgb2JqZWN0cy4KLSAgVGhpcyBpcyBhIHJlc3VsdCBvZiB0aGVzZSB0eXBlcyBoYXZpbmcgYSBwYXJ0aWFsbHkgZGVmaW5lZAotICB0cF9hc19udW1iZXIgc2xvdC4gIChUaGlzIGlzIG5vdCBhIGZlYXR1cmUsIGJ1dCBhbiBpbmRpY2F0aW9uIHRoYXQKLSAgUHlOdW1iZXJfQ2hlY2soKSBpcyBub3QgdmVyeSB1c2VmdWwgdG8gZGV0ZXJtaW5lIG51bWVyaWMgYmVoYXZpb3IuCi0gIEl0IG1heSBiZSBkZXByZWNhdGVkLikKLQotLSBUaGUgc3RyaW5nIG9iamVjdCdzIGxheW91dCBoYXMgY2hhbmdlZDogdGhlIHBvaW50ZXIgbWVtYmVyCi0gIG9iX3NpbnRlcm5lZCBoYXMgYmVlbiByZXBsYWNlZCBieSBhbiBpbnQgbWVtYmVyIG9iX3NzdGF0ZS4gIE9uIHNvbWUKLSAgcGxhdGZvcm1zIChlLmcuIG1vc3QgNjQtYml0IHN5c3RlbXMpIHRoaXMgbWF5IGNoYW5nZSB0aGUgb2Zmc2V0IG9mCi0gIHRoZSBvYl9zdmFsIG1lbWJlciwgc28gYXMgYSBwcmVjYXV0aW9uIHRoZSBBUElfVkVSU0lPTiBoYXMgYmVlbgotICBpbmNyZW1lbnRlZC4gIFRoZSBhcHBhcmVudGx5IHVudXNlZCBmZWF0dXJlIG9mICJpbmRpcmVjdCBpbnRlcm5lZAotICBzdHJpbmdzIiwgc3VwcG9ydGVkIGJ5IHRoZSBvYl9zaW50ZXJuZWQgbWVtYmVyLCBpcyBnb25lLiAgSW50ZXJuZWQKLSAgc3RyaW5ncyBhcmUgbm93IHVzdWFsbHkgbW9ydGFsOyB0aGVyZSBpcyBhIG5ldyBBUEksCi0gIFB5U3RyaW5nX0ludGVybkltbW9ydGFsKCkgdGhhdCBjcmVhdGVzIGltbW9ydGFsIGludGVybmVkIHN0cmluZ3MuCi0gIChUaGUgb2Jfc3N0YXRlIG1lbWJlciBjYW4gb25seSB0YWtlIHRocmVlIHZhbHVlczsgaG93ZXZlciwgd2hpbGUKLSAgbWFraW5nIGl0IGEgY2hhciBzYXZlcyBhIGZldyBieXRlcyBwZXIgc3RyaW5nIG9iamVjdCBvbiBhdmVyYWdlLCBpbgotICBpdCBhbHNvIHNsb3dlZCB0aGluZ3MgZG93biBhIGJpdCBiZWNhdXNlIG9iX3N2YWwgd2FzIG5vIGxvbmdlcgotICBhbGlnbmVkLikKLQotLSBUaGUgUHlfSW5pdE1vZHVsZSooKSBmdW5jdGlvbnMgbm93IGFjY2VwdCBOVUxMIGZvciB0aGUgJ21ldGhvZHMnCi0gIGFyZ3VtZW50LiAgTW9kdWxlcyB3aXRob3V0IGdsb2JhbCBmdW5jdGlvbnMgYXJlIGJlY29taW5nIG1vcmUgY29tbW9uCi0gIG5vdyB0aGF0IGZhY3RvcmllcyBjYW4gYmUgdHlwZXMgcmF0aGVyIHRoYW4gZnVuY3Rpb25zLgotCi0tIE5ldyBDIEFQSSBQeVVuaWNvZGVfRnJvbU9yZGluYWwoKSB3aGljaCBleHBvc2VzIHVuaWNocigpIGF0IEMKLSAgbGV2ZWwuCi0KLS0gTmV3IGZ1bmN0aW9ucyBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycigpIGFuZAotICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgpLiBTaW1pbGFyIHRvCi0gIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKCkgYW5kCi0gIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKCksIGJ1dCB0aGV5IGFsbG93IHRvIHNwZWNpZnkKLSAgdGhlIGV4Y2VwdGlvbiB0eXBlIHRvIHJhaXNlLiBBdmFpbGFibGUgb24gV2luZG93cy4KLQotLSBQeV9GYXRhbEVycm9yKCkgaXMgbm93IGRlY2xhcmVkIGFzIHRha2luZyBhIGNvbnN0IGNoYXIqIGFyZ3VtZW50LiAgSXQKLSAgd2FzIHByZXZpb3VzbHkgZGVjbGFyZWQgd2l0aG91dCBjb25zdC4gIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3Qgd29ya2luZwotICBjb2RlLgotCi0tIEFkZGVkIG5ldyBtYWNybyBQeVNlcXVlbmNlX0lURU0obywgaSkgdGhhdCBkaXJlY3RseSBjYWxscwotICBzcV9pdGVtIHdpdGhvdXQgcmVjaGVja2luZyB0aGF0IG8gaXMgYSBzZXF1ZW5jZSBhbmQgd2l0aG91dAotICBhZGp1c3RpbmcgZm9yIG5lZ2F0aXZlIGluZGljZXMuCi0KLS0gUHlSYW5nZV9OZXcoKSBub3cgcmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIGZvdXJ0aCBhcmd1bWVudCBpcyBub3QgMS4KLSAgVGhpcyBpcyBwYXJ0IG9mIHRoZSByZW1vdmFsIG9mIGRlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgdGhlIHhyYW5nZQotICBvYmplY3QuCi0KLS0gUHlOdW1iZXJfQ29lcmNlKCkgYW5kIFB5TnVtYmVyX0NvZXJjZUV4KCkgbm93IGFsc28gaW52b2tlIHRoZSB0eXBlJ3MKLSAgY29lcmNpb24gaWYgYm90aCBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlIGJ1dCB0aGlzIHR5cGUgaGFzIHRoZQotICBDSEVDS1RZUEVTIGZsYWcgc2V0LiAgVGhpcyBpcyB0byBiZXR0ZXIgc3VwcG9ydCBwcm94aWVzLgotCi0tIFRoZSB0eXBlIG9mIHRwX2ZyZWUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJgYHZvaWQgKCopKFB5T2JqZWN0ICopYGAiIHRvCi0gICJgYHZvaWQgKCopKHZvaWQgKilgYCIuCi0KLS0gUHlPYmplY3RfRGVsLCBQeU9iamVjdF9HQ19EZWwgYXJlIG5vdyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBtYWNyb3MuCi0KLS0gQSB0eXBlIGNhbiBub3cgaW5oZXJpdCBpdHMgbWV0YXR5cGUgZnJvbSBpdHMgYmFzZSB0eXBlLiAgUHJldmlvdXNseSwKLSAgd2hlbiBQeVR5cGVfUmVhZHkoKSB3YXMgY2FsbGVkLCBpZiBvYl90eXBlIHdhcyBmb3VuZCB0byBiZSBOVUxMLCBpdAotICB3YXMgYWx3YXlzIHNldCB0byAmUHlUeXBlX1R5cGU7IG5vdyBpdCBpcyBzZXQgdG8gYmFzZS0+b2JfdHlwZSwKLSAgd2hlcmUgYmFzZSBpcyB0cF9iYXNlLCBkZWZhdWx0aW5nIHRvICZQeU9iamVjdF9UeXBlLgotCi0tIFB5VHlwZV9SZWFkeSgpIGFjY2lkZW50YWxseSBkaWQgbm90IGluaGVyaXQgdHBfaXNfZ2M7IG5vdyBpdCBkb2VzLgotCi0tIFRoZSBQeUNvcmVfKiBmYW1pbHkgb2YgQVBJcyBoYXZlIGJlZW4gcmVtb3ZlZC4KLQotLSBUaGUgInUjIiBwYXJzZXIgbWFya2VyIHdpbGwgbm93IHBhc3MgdGhyb3VnaCBVbmljb2RlIG9iamVjdHMgYXMtaXMKLSAgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSBidWZmZXIgQVBJLgotCi0tIFRoZSBlbnVtZXJhdG9ycyBvZiBjbXBfb3AgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdXNlIHRoZSBwcmVmaXggYGBQeUNtcF9gYC4KLQotLSBBbiBvbGQgI2RlZmluZSBvZiBBTlkgYXMgdm9pZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gcHlwb3J0LmguICBUaGlzCi0gIGhhc24ndCBiZWVuIHVzZWQgc2luY2UgUHl0aG9uJ3MgcHJlLUFOU0kgZGF5cywgYW5kIHRoZSAjZGVmaW5lIGhhcwotICBiZWVuIG1hcmtlZCBhcyBvYnNvbGV0ZSBzaW5jZSB0aGVuLiAgU0YgYnVnIDQ5NTU0OCBzYXlzIGl0IGNyZWF0ZWQKLSAgY29uZmxpY3RzIHdpdGggb3RoZXIgcGFja2FnZXMsIHNvIGtlZXBpbmcgaXQgYXJvdW5kIHdhc24ndCBoYXJtbGVzcy4KLQotLSBCZWNhdXNlIFB5dGhvbidzIG1hZ2ljIG51bWJlciBzY2hlbWUgYnJva2Ugb24gSmFudWFyeSAxc3QsIHdlIGRlY2lkZWQKLSAgdG8gc3RvcCBQeXRob24gZGV2ZWxvcG1lbnQuICBUaGFua3MgZm9yIGFsbCB0aGUgZmlzaCEKLQotLSBTb21lIG9mIHVzIGRvbid0IGxpa2UgZmlzaCwgc28gd2UgY2hhbmdlZCBQeXRob24ncyBtYWdpYyBudW1iZXIKLSAgc2NoZW1lIHRvIGEgbmV3IG9uZS4gU2VlIFB5dGhvbi9pbXBvcnQuYyBmb3IgZGV0YWlscy4KLQotTmV3IHBsYXRmb3JtcwotLS0tLS0tLS0tLS0tLQotCi0tIE9wZW5WTVMgaXMgbm93IHN1cHBvcnRlZC4KLQotLSBBdGhlT1MgaXMgbm93IHN1cHBvcnRlZC4KLQotLSB0aGUgRU1YIHJ1bnRpbWUgZW52aXJvbm1lbnQgb24gT1MvMiBpcyBub3cgc3VwcG9ydGVkLgotCi0tIEdOVS9IdXJkIGlzIG5vdyBzdXBwb3J0ZWQuCi0KLVRlc3RzCi0tLS0tLQotCi0tIFRoZSByZWdydGVzdC5weSBzY3JpcHQncyAtdSBvcHRpb24gbm93IHByb3ZpZGVzIGEgd2F5IHRvIHNheSAiYWxsb3cKLSAgYWxsIHJlc291cmNlcyBleGNlcHQgdGhpcyBvbmUuIiAgRm9yIGV4YW1wbGUsIHRvIGFsbG93IGV2ZXJ5dGhpbmcKLSAgZXhjZXB0IGJzZGRiLCBnaXZlIHRoZSBvcHRpb24gJy11YWxsLC1ic2RkYicuCi0KLVdpbmRvd3MKLS0tLS0tLS0KLQotLSBUaGUgV2luZG93cyBkaXN0cmlidXRpb24gbm93IHNoaXBzIHdpdGggdmVyc2lvbiA0LjAuMTQgb2YgdGhlCi0gIFNsZWVweWNhdCBCZXJrZWxleSBkYXRhYmFzZSBsaWJyYXJ5LiAgVGhpcyBzaG91bGQgYmUgYSBodWdlCi0gIGltcHJvdmVtZW50IG92ZXIgdGhlIHByZXZpb3VzIEJlcmtlbGV5IERCIDEuODUsIHdoaWNoIGhhZCBtYW55Ci0gIGJ1Z3MuCi0gIFhYWCBXaGF0IGFyZSB0aGUgbGljZW5zaW5nIGlzc3VlcyBoZXJlPwotICBYWFggSWYgYSB1c2VyIGhhcyBhIGRhdGFiYXNlIGNyZWF0ZWQgd2l0aCBhIHByZXZpb3VzIHZlcnNpb24gb2YKLSAgWFhYICAgICBQeXRob24sIHdoYXQgbXVzdCB0aGV5IGRvIHRvIGNvbnZlcnQgaXQ/Ci0gIFhYWCBJJ20gc3RpbGwgbm90IHN1cmUgaG93IHRvIGxpbmsgdGhpcyB0aGluZyAoc2VlIFBDYnVpbGQvcmVhZG1lLnR4dCkuCi0gIFhYWCBUaGUgdmVyc2lvbiAjIGlzIGxpa2VseSB0byBjaGFuZ2UgYmVmb3JlIDIuM2ExLgotCi0tIFRoZSBXaW5kb3dzIGRpc3RyaWJ1dGlvbiBub3cgc2hpcHMgd2l0aCBhIFNlY3VyZSBTb2NrZXRzIExpYnJhcnkgKFNMTCkKLSAgIG1vZHVsZSAoX3NzbC5weWQpCi0KLS0gVGhlIFdpbmRvd3MgZGlzdHJpYnV0aW9uIG5vdyBzaGlwcyB3aXRoIFRjbC9UayB2ZXJzaW9uIDguNC4xIChpdAotICBwcmV2aW91c2x5IHNoaXBwZWQgd2l0aCBUY2wvVGsgOC4zLjIpLgotCi0tIFdoZW4gUHl0aG9uIGlzIGJ1aWx0IHVuZGVyIGEgTWljcm9zb2Z0IGNvbXBpbGVyLCBzeXMudmVyc2lvbiBub3cKLSAgaW5jbHVkZXMgdGhlIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyIChfTVNDX1ZFUikuICBGb3IgZXhhbXBsZSwgdW5kZXIKLSAgTVNWQyA2LCBzeXMudmVyc2lvbiBjb250YWlucyB0aGUgc3Vic3RyaW5nICJNU0Mgdi4xMjAwICIuICAxMjAwIGlzCi0gIHRoZSB2YWx1ZSBvZiBfTVNDX1ZFUiB1bmRlciBNU1ZDIDYuCi0KLS0gU29tZXRpbWVzIHRoZSB1bmluc3RhbGwgZXhlY3V0YWJsZSAoVU5XSVNFLkVYRSkgdmFuaXNoZXMuICBPbmUgY2F1c2UKLSAgb2YgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiB0aGUgaW5zdGFsbGVyIChkaXNhYmxlZCBXaXNlJ3MgImRlbGV0ZSBpbi0KLSAgdXNlIGZpbGVzIiB1bmluc3RhbGwgb3B0aW9uKS4KLQotLSBGaXhlZCBhIGJ1ZyBpbiB1cmxsaWIncyBwcm94eSBoYW5kbGluZyBpbiBXaW5kb3dzLiAgW1NGIGJ1ZyAjNTAzMDMxXQotCi0tIFRoZSBpbnN0YWxsZXIgbm93IGluc3RhbGxzIFN0YXJ0IG1lbnUgc2hvcnRjdXRzIHVuZGVyICh0aGUgbG9jYWwKLSAgZXF1aXZhbGVudCBvZikgIkFsbCBVc2VycyIgd2hlbiBkb2luZyBhbiBBZG1pbiBpbnN0YWxsLgotCi0tIGZpbGUudHJ1bmNhdGUoW25ld3NpemVdKSBub3cgd29ya3Mgb24gV2luZG93cyBmb3IgYWxsIG5ld3NpemUgdmFsdWVzLgotICBJdCB1c2VkIHRvIGZhaWwgaWYgbmV3c2l6ZSBkaWRuJ3QgZml0IGluIDMyIGJpdHMsIHJlZmxlY3RpbmcgYQotICBsaW1pdGF0aW9uIG9mIE1TIF9jaHNpemUgKHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkKS4KLQotLSBvcy53YWl0cGlkKCkgaXMgbm93IGltcGxlbWVudGVkIGZvciBXaW5kb3dzLCBhbmQgY2FuIGJlIHVzZWQgdG8gYmxvY2sKLSAgdW50aWwgYSBzcGVjaWZpZWQgcHJvY2VzcyBleGl0cy4gIFRoaXMgaXMgc2ltaWxhciB0bywgYnV0IG5vdCBleGFjdGx5Ci0gIHRoZSBzYW1lIGFzLCBvcy53YWl0cGlkKCkgb24gUE9TSVggc3lzdGVtcy4gIElmIHlvdSdyZSB3YWl0aW5nIGZvcgotICBhIHNwZWNpZmljIHByb2Nlc3Mgd2hvc2UgcGlkIHdhcyBvYnRhaW5lZCBmcm9tIG9uZSBvZiB0aGUgc3Bhd24oKQotICBmdW5jdGlvbnMsIHRoZSBzYW1lIFB5dGhvbiBvcy53YWl0cGlkKCkgY29kZSB3b3JrcyBhY3Jvc3MgcGxhdGZvcm1zLgotICBTZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMuICBUaGUgZG9jcyB3ZXJlIGNoYW5nZWQgdG8gY2xhcmlmeSB0aGF0Ci0gIHNwYXduIGZ1bmN0aW9ucyByZXR1cm4sIGFuZCB3YWl0cGlkIHJlcXVpcmVzLCBhIHByb2Nlc3MgaGFuZGxlIG9uCi0gIFdpbmRvd3MgKG5vdCB0aGUgc2FtZSB0aGluZyBhcyBhIFdpbmRvd3MgcHJvY2VzcyBpZCkuCi0KLS0gTmV3IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUgaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3M6ICB0aGlzIGRvZXNuJ3QKLSAgbmVlZCBhIFRlbXBvcmFyeUZpbGVXcmFwcGVyIHdyYXBwZXIgYW55bW9yZSwgYW5kIHNob3VsZCBiZSBpbW11bmUKLSAgdG8gYSBuYXN0eSBwcm9ibGVtOiAgYmVmb3JlIDIuMywgaWYgeW91IGdvdCBhIHRlbXAgZmlsZSBvbiBXaW5kb3dzLCBpdAotICBnb3Qgd3JhcHBlZCBpbiBhbiBvYmplY3Qgd2hvc2UgY2xvc2UoKSBtZXRob2QgZmlyc3QgY2xvc2VkIHRoZQotICB1bmRlcmx5aW5nIGZpbGUsIHRoZW4gZGVsZXRlZCB0aGUgZmlsZS4gIFRoaXMgdXN1YWxseSB3b3JrZWQgZmluZS4KLSAgSG93ZXZlciwgdGhlIHNwYXduIGZhbWlseSBvZiBmdW5jdGlvbnMgb24gV2luZG93cyBjcmVhdGUgKGF0IGEgbG93IEMKLSAgbGV2ZWwpIHRoZSBzYW1lIHNldCBvZiBvcGVuIGZpbGVzIGluIHRoZSBzcGF3bmVkIHByb2Nlc3MgUSBhcyB3ZXJlCi0gIG9wZW4gaW4gdGhlIHNwYXduaW5nIHByb2Nlc3MgUC4gIElmIGEgdGVtcCBmaWxlIGYgd2FzIGFtb25nIHRoZW0sIHRoZW4KLSAgZG9pbmcgZi5jbG9zZSgpIGluIFAgZmlyc3QgY2xvc2VkIFAncyBDLWxldmVsIGZpbGUgaGFuZGxlIG9uIGYsIGJ1dCBRJ3MKLSAgQy1sZXZlbCBmaWxlIGhhbmRsZSBvbiBmIHJlbWFpbmVkIG9wZW4sIHNvIHRoZSBhdHRlbXB0IGluIFAgdG8gZGVsZXRlIGYKLSAgYmxldyB1cCB3aXRoIGEgIlBlcm1pc3Npb24gZGVuaWVkIiBlcnJvciAoV2luZG93cyBkb2Vzbid0IGFsbG93Ci0gIGRlbGV0aW5nIG9wZW4gZmlsZXMpLiAgVGhpcyB3YXMgc3VycHJpc2luZywgc3VidGxlLCBhbmQgZGlmZmljdWx0IHRvCi0gIHdvcmsgYXJvdW5kLgotCi0tIFRoZSBvcyBtb2R1bGUgbm93IGV4cG9ydHMgYWxsIHRoZSBzeW1ib2xpYyBjb25zdGFudHMgdXNhYmxlIHdpdGggdGhlCi0gIGxvdy1sZXZlbCBvcy5vcGVuKCkgb24gV2luZG93czogIHRoZSBuZXcgY29uc3RhbnRzIGluIDIuMyBhcmUKLSAgT19OT0lOSEVSSVQsIE9fU0hPUlRfTElWRUQsIE9fVEVNUE9SQVJZLCBPX1JBTkRPTSBhbmQgT19TRVFVRU5USUFMLgotICBUaGUgb3RoZXJzIHdlcmUgYWxzbyBhdmFpbGFibGUgaW4gMi4yOiAgT19BUFBFTkQsIE9fQklOQVJZLCBPX0NSRUFULAotICBPX0VYQ0wsIE9fUkRPTkxZLCBPX1JEV1IsIE9fVEVYVCwgT19UUlVOQyBhbmQgT19XUk9OTFkuICBDb250cmFyeQotICB0byBNaWNyb3NvZnQgZG9jcywgT19TSE9SVF9MSVZFRCBkb2VzIG5vdCBzZWVtIHRvIGltcGx5IE9fVEVNUE9SQVJZCi0gIChzbyBzcGVjaWZ5IGJvdGggaWYgeW91IHdhbnQgYm90aDsgbm90ZSB0aGF0IG5laXRoZXIgaXMgdXNlZnVsIHVubGVzcwotICBzcGVjaWZpZWQgd2l0aCBPX0NSRUFUIHRvbykuCi0KLU1hYwotLS0tLQotCi0tIE1hYy9SZWxub3RlcyBpcyBnb25lLCB0aGUgcmVsZWFzZSBub3RlcyBhcmUgbm93IGhlcmUuCi0KLS0gUHl0aG9uICh0aGUgT1NYLW9ubHksIHVuaXgtYmFzZWQgdmVyc2lvbiwgbm90IHRoZSBPUzktY29tcGF0aWJsZSBDRk0KLSAgdmVyc2lvbikgbm93IGZ1bGx5IHN1cHBvcnRzIHVuaWNvZGUgc3RyaW5ncyBhcyBhcmd1bWVudHMgdG8gdmFyaW91cyBmaWxlCi0gIHN5c3RlbSBjYWxscywgZWcuIG9wZW4oKSwgZmlsZSgpLCBvcy5zdGF0KCkgYW5kIG9zLmxpc3RkaXIoKS4KLQotLSBUaGUgY3VycmVudCBuYW1pbmcgY29udmVudGlvbiBmb3IgUHl0aG9uIG9uIHRoZSBNYWNpbnRvc2ggaXMgdGhhdCBNYWNQeXRob24KLSAgcmVmZXJzIHRvIHRoZSB1bml4LWJhc2VkIE9TWC1vbmx5IHZlcnNpb24sIGFuZCBNYWNQeXRob24tT1M5IHJlZmVycyB0byB0aGUKLSAgQ0ZNLWJhc2VkIHZlcnNpb24gdGhhdCBydW5zIG9uIGJvdGggT1M5IGFuZCBPU1guCi0KLS0gQWxsIE1hY1B5dGhvbi1PUzkgZnVuY3Rpb25hbGl0eSBpcyBub3cgYXZhaWxhYmxlIGluIGFuIE9TWCB1bml4IGJ1aWxkLAotICBpbmNsdWRpbmcgdGhlIENhcmJvbiBtb2R1bGVzLCB0aGUgSURFLCBPU0Egc3VwcG9ydCwgZXRjLiBBIGxvdCBvZiB0aGlzCi0gIHdpbGwgb25seSB3b3JrIGNvcnJlY3RseSBpbiBhIGZyYW1ld29yayBidWlsZCwgdGhvdWdoLCBiZWNhdXNlIHlvdSBjYW5ub3QKLSAgdGFsayB0byB0aGUgd2luZG93IG1hbmFnZXIgdW5sZXNzIHlvdXIgYXBwbGljYXRpb24gaXMgcnVuIGZyb20gYSAuYXBwCi0gIGJ1bmRsZS4gVGhlcmUgaXMgYSBjb21tYW5kIGxpbmUgdG9vbCAicHl0aG9udyIgdGhhdCBydW5zIHlvdXIgc2NyaXB0Ci0gIHdpdGggYW4gaW50ZXJwcmV0ZXIgbGl2aW5nIGluIHN1Y2ggYSAuYXBwIGJ1bmRsZSwgdGhpcyBpbnRlcnByZXRlciBzaG91bGQKLSAgYmUgdXNlZCB0byBydW4gYW55IFB5dGhvbiBzY3JpcHQgdXNpbmcgdGhlIHdpbmRvdyBtYW5hZ2VyIChpbmNsdWRpbmcKLSAgVGtpbnRlciBvciB3eFB5dGhvbiBzY3JpcHRzKS4KLQotLSBNb3N0IG9mIE1hYy9MaWIgaGFzIG1vdmVkIHRvIExpYi9wbGF0LW1hYywgd2hpY2ggaXMgYWdhaW4gdXNlZCBib3RoIGluCi0gIE1hY1B5dGhvbi1PU1ggYW5kIE1hY1B5dGhvbi1PUzkuIFRoZSBvbmx5IG1vZHVsZXMgcmVtYWluaW5nIGluIE1hYy9MaWIKLSAgYXJlIHNwZWNpZmljYWxseSBmb3IgTWFjUHl0aG9uLU9TOSAoQ0ZNIHN1cHBvcnQsIHByZWZlcmVuY2UgcmVzb3VyY2VzLCBldGMpLgotCi0tIEEgbmV3IHV0aWxpdHkgUHl0aG9uTGF1bmNoZXIgd2lsbCBzdGFydCBhIFB5dGhvbiBpbnRlcnByZXRlciB3aGVuIGEgLnB5IG9yCi0gIC5weXcgc2NyaXB0IGlzIGRvdWJsZS1jbGlja2VkIGluIHRoZSBGaW5kZXIuIEJ5IGRlZmF1bHQgLnB5IHNjcmlwdHMgYXJlCi0gIHJ1biB3aXRoIGEgbm9ybWFsIFB5dGhvbiBpbnRlcnByZXRlciBpbiBhIFRlcm1pbmFsIHdpbmRvdyBhbmQgLnB5dwotICBmaWxlcyBhcmUgcnVuIHdpdGggYSB3aW5kb3ctYXdhcmUgcHl0aG9udyBpbnRlcnByZXRlciB3aXRob3V0IGEgVGVybWluYWwKLSAgd2luZG93LCBidXQgYWxsIHRoaXMgY2FuIGJlIGN1c3RvbWl6ZWQuCi0KLS0gTWFjUHl0aG9uLU9TOSBpcyBub3cgQ2FyYm9uLW9ubHksIHNvIGl0IHJ1bnMgb24gTWFjIE9TIDkgb3IgTWFjIE9TIFggYW5kCi0gIHBvc3NpYmx5IG9uIE1hYyBPUyA4LjYgd2l0aCB0aGUgcmlnaHQgQ2FyYm9uTGliIGluc3RhbGxlZCwgYnV0IG5vdCBvbiBlYXJsaWVyCi0gIHJlbGVhc2VzLgotCi0tIE1hbnkgdG9vbHMgc3VjaCBhcyBCdWlsZEFwcGxldC5weSBhbmQgZ2Vuc3VpdGVtb2R1bGUucHkgbm93IHN1cHBvcnQgYSBjb21tYW5kCi0gIGxpbmUgaW50ZXJmYWNlIHRvby4KLQotLSBBbGwgdGhlIENhcmJvbiBjbGFzc2VzIGFyZSBub3cgUEVQMjUzIGNvbXBsaWFudCwgbWVhbmluZyB0aGF0IHlvdSBjYW4KLSAgc3ViY2xhc3MgdGhlbSBmcm9tIFB5dGhvbi4gTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBoYXZlIGdvbmUsIHlvdSBzaG91bGQKLSAgbm93IHVzZSB0aGUgYWNjZXNzb3IgZnVuY3Rpb24gY2FsbCBBUEksIHdoaWNoIGlzIGFsc28gd2hhdCBBcHBsZSdzCi0gIGRvY3VtZW50YXRpb24gdXNlcy4gU29tZSBhdHRyaWJ1dGVzIHN1Y2ggYXMgZ3JhZnBvcnQudmlzUmduIGFyZSBzdGlsbAotICBhdmFpbGFibGUgZm9yIGNvbnZlbmllbmNlLgotCi0tIE5ldyBDYXJib24gbW9kdWxlcyBGaWxlIChpbXBsZW1lbnRpbmcgdGhlIEFQSXMgaW4gRmlsZXMuaCBhbmQgQWxpYXNlcy5oKQotICBhbmQgRm9sZGVyIChBUElzIGZyb20gRm9sZGVycy5oKS4gVGhlIG9sZCBtYWNmcyBidWlsdGluIG1vZHVsZSBpcwotICBnb25lLCBhbmQgcmVwbGFjZWQgYnkgYSBQeXRob24gd3JhcHBlciBhcm91bmQgdGhlIG5ldyBtb2R1bGVzLgotCi0tIFBhdGhuYW1lIGhhbmRsaW5nIHNob3VsZCBub3cgYmUgZnVsbHkgY29uc2lzdGVudDogTWFjUHl0aG9uLU9TWCBhbHdheXMgdXNlcwotICB1bml4IHBhdGhuYW1lcyBhbmQgTWFjUHl0aG9uLU9TOSBhbHdheXMgdXNlcyBjb2xvbi1zZXBhcmF0ZWQgTWFjIHBhdGhuYW1lcwotICAoYWxzbyB3aGVuIHJ1bm5pbmcgb24gTWFjIE9TIFgpLgotCi0tIE5ldyBDYXJib24gbW9kdWxlcyBIZWxwIGFuZCBBSCBnaXZlIGFjY2VzcyB0byB0aGUgQ2FyYm9uIEhlbHAgTWFuYWdlci4KLSAgVGhlcmUgYXJlIGhvb2tzIGluIHRoZSBJREUgdG8gYWxsb3cgYWNjZXNzaW5nIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbgotICAoYW5kIEFwcGxlJ3MgQ2FyYm9uIGFuZCBDb2NvYSBkb2N1bWVudGF0aW9uKSB0aHJvdWdoIHRoZSBIZWxwIFZpZXdlci4KLSAgU2VlIE1hYy9PU1gvUkVBRE1FIGZvciBjb252ZXJ0aW5nIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiB0byBhCi0gIEhlbHAgVmlld2VyIGNvbXBhdGlibGUgZm9ybSBhbmQgaW5zdGFsbGluZyBpdC4KLQotLSBPU0Egc3VwcG9ydCBoYXMgYmVlbiByZWRlc2lnbmVkIGFuZCB0aGUgZ2VuZXJhdGVkIFB5dGhvbiBjbGFzc2VzIG5vdwotICBtaXJyb3IgdGhlIGluaGVyaXRhbmNlIGRlZmluZWQgYnkgdGhlIHVuZGVybHlpbmcgT1NBIGNsYXNzZXMuCi0KLS0gTWFjUHl0aG9uIG5vIGxvbmdlciBtYXBzIGJvdGggXHIgYW5kIFxuIHRvIFxuIG9uIGlucHV0IGZvciBhbnkgdGV4dCBmaWxlLgotICBUaGlzIGZlYXR1cmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCAoUEVQMjc4KS4KLQotLSBUaGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgUHl0aG9uIHNvdXJjZWZpbGVzIGluIE1hY1B5dGhvbi1PUzkgaXMgbm8gbG9uZ2VyCi0gIG1hYy1yb21hbiAob3Igd2hhdGV2ZXIgeW91ciBsb2NhbCBNYWMgZW5jb2Rpbmcgd2FzKSBidXQgImFzY2lpIiwgbGlrZSBvbgotICBvdGhlciBwbGF0Zm9ybXMuIElmIHlvdSByZWFsbHkgbmVlZCBzb3VyY2VmaWxlcyB3aXRoIE1hYyBjaGFyYWN0ZXJzIGluIHRoZW0KLSAgeW91IGNhbiBjaGFuZ2UgdGhpcyBpbiBzaXRlLnB5LgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDIuMiBmaW5hbD8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMjEtRGVjLTIwMDEqCi0KLVR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIHBpY2tsZS5weSwgY1BpY2tsZTogYWxsb3cgcGlja2xpbmcgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzCi0gIHdpdGggYSBjdXN0b20gbWV0YWNsYXNzLgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSB3ZWFrcmVmIHByb3h5IG9iamVjdDogd2hlbiBjb21wYXJpbmcsIHVud3JhcCBib3RoIGFyZ3VtZW50cyBpZiBib3RoCi0gIGFyZSBwcm94aWVzLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBiaW5hc2NpaS5iMmFfYmFzZTY0KCk6IGZpeCBhIHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biB3aGVuIGVuY29kaW5nCi0gIHZlcnkgc2hvcnQgc3RyaW5ncy4KLQotLSBjUGlja2xlOiB0aGUgb2JzY3VyZSAiZmFzdCIgbW9kZSB3YXMgc3VzcGVjdGVkIG9mIGNhdXNpbmcgc3RhY2sKLSAgb3ZlcmZsb3dzIG9uIHRoZSBNYWMuICBIb3BlZnVsbHkgZml4ZWQgdGhpcyBieSBzZXR0aW5nIHRoZSByZWN1cnNpb24KLSAgbGltaXQgbXVjaCBzbWFsbGVyLiAgSWYgdGhlIGxpbWl0IGlzIHRvbyBsb3cgKGl0IG9ubHkgYWZmZWN0cwotICBwZXJmb3JtYW5jZSksIHlvdSBjYW4gY2hhbmdlIGl0IGJ5IGRlZmluaW5nIFBZX0NQSUNLTEVfRkFTVF9MSU1JVAotICB3aGVuIGNvbXBpbGluZyBjUGlja2xlLmMgKG9yIGluIHB5Y29uZmlnLmgpLgotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KLS0gZHVtYmRibS5weTogZml4ZWQgYSBkdW1iIG9sZCBidWcgKHRoZSBmaWxlIGRpZG4ndCBnZXQgc3luY2hlZCBhdAotICBjbG9zZSBvciBkZWxldGUgdGltZSkuCi0KLS0gcmZjODIyLnB5OiBmaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgYWRkcmVzcyAnPD4nIHdhcyBjb252ZXJ0ZWQgdG8gTm9uZQotICBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZyAoYWxzbyBmaXhlcyB0aGUgZW1haWwuVXRpbHMgbW9kdWxlKS4KLQotLSB4bWxycGNsaWIucHk6IHZlcnNpb24gMS4wLjA7IHVzZXMgcHJlY2lzaW9uIGZvciBkb3VibGVzLgotCi0tIHRlc3Qgc3VpdGU6IHRoZSBwaWNrbGUgYW5kIGNQaWNrbGUgdGVzdHMgd2VyZSBub3QgZXhlY3V0aW5nIGFueSBjb2RlCi0gIHdoZW4gcnVuIGZyb20gdGhlIHN0YW5kYXJkIHJlZ3Jlc3Npb24gdGVzdC4KLQotVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0tCi0KLUJ1aWxkCi0tLS0tLQotCi1DIEFQSQotLS0tLS0KLQotTmV3IHBsYXRmb3JtcwotLS0tLS0tLS0tLS0tLQotCi1UZXN0cwotLS0tLS0KLQotV2luZG93cwotLS0tLS0tLQotCi0tIGRpc3R1dGlscyBwYWNrYWdlOiBmaXhlZCBicm9rZW4gV2luZG93cyBpbnN0YWxsZXJzIChiZGlzdF93aW5pbnN0KS4KLQotLSB0ZW1wZmlsZS5weTogcHJldmVudCBteXN0ZXJpb3VzIHdhcm5pbmdzIHdoZW4gVGVtcG9yYXJ5RmlsZVdyYXBwZXIKLSAgaW5zdGFuY2VzIGFyZSBkZWxldGVkIGF0IHByb2Nlc3MgZXhpdCB0aW1lLgotCi0tIHNvY2tldC5weTogcHJldmVudCBteXN0ZXJpb3VzIHdhcm5pbmdzIHdoZW4gc29ja2V0IGluc3RhbmNlcyBhcmUKLSAgZGVsZXRlZCBhdCBwcm9jZXNzIGV4aXQgdGltZS4KLQotLSBwb3NpeG1vZHVsZS5jOiBmaXggYSBXaW5kb3dzIGNyYXNoIHdpdGggc3RhdCgpIG9mIGEgZmlsZW5hbWUgZW5kaW5nCi0gIGluIGJhY2tzbGFzaC4KLQotTWFjCi0tLS0tCi0KLS0gVGhlIENhcmJvbiB0b29sYm94IG1vZHVsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIFVuaXZlcnNhbCBIZWFkZXJzCi0gIDMuNCwgYW5kIGV4cGVyaW1lbnRhbCBDb3JlR3JhcGhpY3MgYW5kIENhcmJvbkV2ZW50cyBtb2R1bGVzIGhhdmUKLSAgYmVlbiBhZGRlZC4gIEFsbCBvbmx5IGZvciBmcmFtZXdvcmstZW5hYmxlZCBNYWNPU1guCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYzE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMTQtRGVjLTIwMDEqCi0KLVR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIEd1aWRvJ3MgdHV0b3JpYWwgaW50cm9kdWN0aW9uIHRvIHRoZSBuZXcgdHlwZS9jbGFzcyBmZWF0dXJlcyBoYXMKLSAgYmVlbiBleHRlbnNpdmVseSB1cGRhdGVkLiAgU2VlCi0KLSAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sCi0KLSAgVGhhdCByZW1haW5zIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gaW4gdGhpcyBhcmVhLgotCi0tIEZpeGVkIGEgbGVhazogaW5zdGFuY2UgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGggX19zbG90c19fIHdlcmUgbmV2ZXIKLSAgZGVsZXRlZCEKLQotLSBUaGUgImRlbGV0ZSBhdHRyaWJ1dGUiIG1ldGhvZCBvZiBkZXNjcmlwdG9yIG9iamVjdHMgaXMgY2FsbGVkCi0gIF9fZGVsZXRlX18sIG5vdCBfX2RlbF9fLiAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0IHdhcyBtaXN0YWtlbmx5Ci0gIGNhbGxlZCBfX2RlbF9fLCB3aGljaCBjcmVhdGVkIGFuIHVuZm9ydHVuYXRlIG92ZXJsb2FkaW5nIGNvbmRpdGlvbgotICB3aXRoIGZpbmFsaXplcnMuICAoVGhlICJnZXQgYXR0cmlidXRlIiBhbmQgInNldCBhdHRyaWJ1dGUiIG1ldGhvZHMKLSAgYXJlIHN0aWxsIGNhbGxlZCBfX2dldF9fIGFuZCBfX3NldF9fLCByZXNwZWN0aXZlbHkuKQotCi0tIFNvbWUgc3VidGxlIGlzc3VlcyB3aXRoIHRoZSBzdXBlciBidWlsdC1pbiB3ZXJlIGZpeGVkOgotCi0gIChhKSBXaGVuIHN1cGVyIGl0c2VsZiBpcyBzdWJjbGFzc2VkLCBpdHMgX19nZXRfXyBtZXRob2Qgd291bGQgc3RpbGwKLSAgICAgIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjbGFzcyAoaS5lLiwgb2Ygc3VwZXIpLgotCi0gIChiKSBzdXBlcihDLCBDKCkpLl9fY2xhc3NfXyB3b3VsZCByZXR1cm4gQyByYXRoZXIgdGhhbiBzdXBlci4gIFRoaXMKLSAgICAgIGlzIGNvbmZ1c2luZy4gIFRvIGZpeCB0aGlzLCBJIGRlY2lkZWQgdG8gY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YKLSAgICAgIHN1cGVyIHNvIHRoYXQgaXQgb25seSBhcHBsaWVzIHRvIGNvZGUgYXR0cmlidXRlcywgbm90IHRvIGRhdGEKLSAgICAgIGF0dHJpYnV0ZXMuICBBZnRlciBhbGwsIG92ZXJyaWRpbmcgZGF0YSBhdHRyaWJ1dGVzIGlzIG5vdAotICAgICAgc3VwcG9ydGVkIGFueXdheS4KLQotICAoYykgVGhlIF9fZ2V0X18gbWV0aG9kIGRpZG4ndCBjaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYW4KLSAgICAgIGluc3RhbmNlIG9mIHRoZSB0eXBlIHVzZWQgaW4gY3JlYXRpb24gb2YgdGhlIHN1cGVyIGluc3RhbmNlLgotCi0tIFByZXZpb3VzbHksIGhhc2goKSBvZiBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIGEgbXV0YWJsZSB0eXBlCi0gIChsaXN0IG9yIGRpY3Rpb25hcnkpIHdvdWxkIHJldHVybiBzb21lIHZhbHVlLCByYXRoZXIgdGhhbiByYWlzaW5nCi0gIFR5cGVFcnJvci4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuICBBbHNvLCBkaXJlY3RseSBjYWxsaW5nCi0gIGRpY3QuX19oYXNoX18gYW5kIGxpc3QuX19oYXNoX18gbm93IHJhaXNlcyB0aGUgc2FtZSBUeXBlRXJyb3IKLSAgKHByZXZpb3VzbHksIHRoZXNlIHdlcmUgdGhlIHNhbWUgYXMgb2JqZWN0Ll9faGFzaF9fKS4KLQotLSBOZXctc3R5bGUgb2JqZWN0cyBub3cgc3VwcG9ydCBkZWxldGluZyB0aGVpciBfX2RpY3RfXy4gIFRoaXMgaXMgZm9yCi0gIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyBlcXVpdmFsZW50IHRvIGFzc2lnbmluZyBhIGJyYW5kIG5ldyBlbXB0eQotICBkaWN0aW9uYXJ5LCBidXQgc2F2ZXMgc3BhY2UgaWYgdGhlIG9iamVjdCBpcyBub3QgdXNlZCBmdXJ0aGVyLgotCi1Db3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSAtUW5ldyBub3cgd29ya3MgYXMgZG9jdW1lbnRlZCBpbiBQRVAgMjM4OiAgd2hlbiAtUW5ldyBpcyBwYXNzZWQgb24KLSAgdGhlIGNvbW1hbmQgbGluZSwgYWxsIG9jY3VycmVuY2VzIG9mICIvIiB1c2UgdHJ1ZSBkaXZpc2lvbiBpbnN0ZWFkCi0gIG9mIGNsYXNzaWMgZGl2aXNpb24uICBTZWUgdGhlIFBFUCBmb3IgZGV0YWlscy4gIE5vdGUgdGhhdCAiYWxsIgotICBtZWFucyBhbGwgaW5zdGFuY2VzIGluIGxpYnJhcnkgYW5kIDNyZC1wYXJ0eSBtb2R1bGVzLCBhcyB3ZWxsIGFzIGluCi0gIHlvdXIgb3duIGNvZGUuICBBcyB0aGUgUEVQIHNheXMsIC1RbmV3IGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBpbgotICBlZHVjYXRpb25hbCBlbnZpcm9ubWVudHMgd2l0aCBjb250cm9sIG92ZXIgdGhlIGxpYnJhcmllcyBpbiB1c2UuCi0gIE5vdGUgdGhhdCB0ZXN0X2NvZXJjaW9uLnB5IGluIHRoZSBzdGFuZGFyZCBQeXRob24gdGVzdCBzdWl0ZSBmYWlscwotICB1bmRlciAtUW5ldzsgdGhpcyBpcyBleHBlY3RlZCwgYW5kIHdvbid0IGJlIHJlcGFpcmVkIHVudGlsIHRydWUKLSAgZGl2aXNpb24gYmVjb21lcyB0aGUgZGVmYXVsdCAoaW4gdGhlIG1lYW50aW1lLCB0ZXN0X2NvZXJjaW9uIGlzCi0gIHRlc3RpbmcgdGhlIGN1cnJlbnQgcnVsZXMpLgotCi0tIGNvbXBsZXgoKSBub3cgb25seSBhbGxvd3MgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGJlIGEgc3RyaW5nCi0gIGFyZ3VtZW50LCBhbmQgcmFpc2VzIFR5cGVFcnJvciBpZiBlaXRoZXIgdGhlIHNlY29uZCBhcmcgaXMgYSBzdHJpbmcKLSAgb3IgaWYgdGhlIHNlY29uZCBhcmcgaXMgc3BlY2lmaWVkIHdoZW4gdGhlIGZpcnN0IGlzIGEgc3RyaW5nLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBnYy5nZXRfcmVmZXJlbnRzIHdhcyByZW5hbWVkIHRvIGdjLmdldF9yZWZlcnJlcnMuCi0KLUxpYnJhcnkKLS0tLS0tLS0KLQotLSBGdW5jdGlvbnMgaW4gdGhlIG9zLnNwYXduKCkgZmFtaWx5IG5vdyByZWxlYXNlIHRoZSBnbG9iYWwgaW50ZXJwcmV0ZXIKLSAgbG9jayBhcm91bmQgY2FsbGluZyB0aGUgcGxhdGZvcm0gc3Bhd24uICBUaGV5IHNob3VsZCBhbHdheXMgaGF2ZSBkb25lCi0gIHRoaXMsIGJ1dCBkaWQgbm90IGJlZm9yZSAyLjJjMS4gIE11bHRpdGhyZWFkZWQgcHJvZ3JhbXMgY2FsbGluZwotICBhbiBvcy5zcGF3biBmdW5jdGlvbiB3aXRoIFBfV0FJVCB3aWxsIG5vIGxvbmdlciBibG9jayBhbGwgUHl0aG9uIHRocmVhZHMKLSAgdW50aWwgdGhlIHNwYXduZWQgcHJvZ3JhbSBjb21wbGV0ZXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBwcm9ncmFtcwotICByZWxpZXMgb24gYmxvY2tpbmcsIGFsdGhvdWdoIG1vcmUgbGlrZWx5IGJ5IGFjY2lkZW50IHRoYW4gYnkgZGVzaWduLgotCi0tIHdlYmJyb3dzZXIgZGVmYXVsdHMgdG8gbmV0c2NhcGUuZXhlIG9uIE9TLzIgbm93LgotCi0tIFRpeC5SZXNpemVIYW5kbGUgZXhwb3NlcyBkZXRhY2hfd2lkZ2V0LCBoaWRlLCBhbmQgc2hvdy4KLQotLSBUaGUgY2hhcnNldCBhbGlhcyB3aW5kb3dzXzEyNTIgaGFzIGJlZW4gYWRkZWQuCi0KLS0gdHlwZXMuU3RyaW5nVHlwZXMgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBkZWZpbmVkIHN0cmluZyB0eXBlczsKLSAgdXN1YWxseSB0aGlzIHdpbGwgYmUgKHN0ciwgdW5pY29kZSksIGJ1dCBpZiBQeXRob24gd2FzIGNvbXBpbGVkCi0gIHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0IGl0IHdpbGwgYmUganVzdCAoc3RyLCkuCi0KLS0gVGhlIHB1bGxkb20gYW5kIG1pbmlkb20gbW9kdWxlcyB3ZXJlIHN5bmNocm9uaXplZCB0byBQeVhNTC4KLQotVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0tCi0KLS0gQSBuZXcgc2NyaXB0IGNhbGxlZCBUb29scy9zY3JpcHRzL2dvb2dsZS5weSB3YXMgYWRkZWQsIHdoaWNoIGZpcmVzCi0gIG9mZiBhIHNlYXJjaCBvbiBHb29nbGUuCi0KLUJ1aWxkCi0tLS0tLQotCi0tIE5vdGUgdGhhdCByZWxlYXNlIGJ1aWxkcyBvZiBQeXRob24gc2hvdWxkIGFycmFuZ2UgdG8gZGVmaW5lIHRoZQotICBwcmVwcm9jZXNzb3Igc3ltYm9sIE5ERUJVRyBvbiB0aGUgY29tbWFuZCBsaW5lIChvciBlcXVpdmFsZW50KS4KLSAgSW4gdGhlIDIuMiBwcmUtcmVsZWFzZSBzZXJpZXMgd2UgdHJpZWQgdG8gZGVmaW5lIHRoaXMgYnkgbWFnaWMgaW4KLSAgUHl0aG9uLmggaW5zdGVhZCwgYnV0IGl0IHByb3ZlZCB0byBjYXVzZSBwcm9ibGVtcyBmb3IgZXh0ZW5zaW9uCi0gIGF1dGhvcnMuICBUaGUgVW5peCwgV2luZG93cyBhbmQgTWFjIGJ1aWxkcyBub3cgYWxsIGRlZmluZSBOREVCVUcgaW4KLSAgcmVsZWFzZSBidWlsZHMgdmlhIGNtZGxpbmUgKG9yIGVxdWl2YWxlbnQpIGluc3RlYWQuICBQb3J0cyB0bwotICBvdGhlciBwbGF0Zm9ybXMgc2hvdWxkIGRvIGxpa2V3aXNlLgotCi0tIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gdXNlIC0td2l0aC1zdWZmaXggd2hlbiBidWlsZGluZyBvbiBhCi0gIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0gKHN1Y2ggYXMgTWFjIE9TIFggSEZTKykuIEluIHRoZSBidWlsZAotICBkaXJlY3RvcnkgYW4gZXh0ZW5zaW9uIGlzIHVzZWQsIGJ1dCBub3QgaW4gdGhlIGluc3RhbGxlZCBweXRob24uCi0KLUMgQVBJCi0tLS0tLQotCi0tIE5ldyBmdW5jdGlvbiBQeURpY3RfTWVyZ2VGcm9tU2VxMigpIGV4cG9zZXMgdGhlIGJ1aWx0aW4gZGljdAotICBjb25zdHJ1Y3RvcidzIGxvZ2ljIGZvciB1cGRhdGluZyBhIGRpY3Rpb25hcnkgZnJvbSBhbiBpdGVyYWJsZSBvYmplY3QKLSAgcHJvZHVjaW5nIGtleS12YWx1ZSBwYWlycy4KLQotLSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSByZXF1aXJlcyB0aGF0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotICB0aGUga2V5d29yZCBsaXN0IGVxdWFsIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgc3BlY2lmaWVycy4gIFRoaXMKLSAgd2Fzbid0IGNoZWNrZWQgY29ycmVjdGx5LCBhbmQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIGNvdWxkIGV2ZW4KLSAgZHVtcCBjb3JlIGluIHNvbWUgYmFkIGNhc2VzLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4gIEFzIGEgcmVzdWx0LAotICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgbWF5IHJhaXNlIFJ1bnRpbWVFcnJvciBpbiBiYWQgY2FzZXMgdGhhdAotICBwcmV2aW91c2x5IHdlbnQgdW5jaGFsbGVuZ2VkLgotCi1OZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0tCi0KLVRlc3RzCi0tLS0tLQotCi1XaW5kb3dzCi0tLS0tLS0tCi0KLU1hYwotLS0tLQotCi0tIEluIHVuaXgtUHl0aG9uIG9uIE1hYyBPUyBYIChhbmQgZGFyd2luKSBzeXMucGxhdGZvcm0gaXMgbm93ICJkYXJ3aW4iLAotICB3aXRob3V0IGFueSB0cmFpbGluZyBkaWdpdHMuCi0KLS0gQ2hhbmdlZCBsb2dpYyBmb3IgZmluZGluZyBweXRob24gaG9tZSBpbiBNYWMgT1MgWCBmcmFtZXdvcmsgUHl0aG9ucy4KLSAgTm93IHN5cy5leGVjdXRhYmxlIHBvaW50cyB0byB0aGUgZXhlY3V0YWJsZSBhZ2FpbiwgaW4gc3RlYWQgb2YgdG8KLSAgdGhlIHNoYXJlZCBsaWJyYXJ5LiBUaGUgbGF0dGVyIGlzIHVzZWQgb25seSBmb3IgbG9jYXRpbmcgdGhlIHB5dGhvbgotICBob21lLgotCi0KLVdoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmIyPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSpSZWxlYXNlIGRhdGU6IDE2LU5vdi0yMDAxKgotCi1UeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBNdWx0aXBsZSBpbmhlcml0YW5jZSBtaXhpbmcgbmV3LXN0eWxlIGFuZCBjbGFzc2ljIGNsYXNzZXMgaW4gdGhlCi0gIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIGlzIG5vdyBhbGxvd2VkLCBzbyB0aGlzIHdvcmtzIG5vdzoKLQotICAgICAgY2xhc3MgQ2xhc3NpYzogcGFzcwotICAgICAgY2xhc3MgTWl4ZWQoQ2xhc3NpYywgb2JqZWN0KTogcGFzcwotCi0gIFRoZSBNUk8gKG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyKSBmb3IgZWFjaCBiYXNlIGNsYXNzIGlzIHJlc3BlY3RlZAotICBhY2NvcmRpbmcgdG8gaXRzIGtpbmQsIGJ1dCB0aGUgTVJPIGZvciB0aGUgZGVyaXZlZCBjbGFzcyBpcyBjb21wdXRlZAotICB1c2luZyBuZXctc3R5bGUgTVJPIHJ1bGVzIGlmIGFueSBiYXNlIGNsYXNzIGlzIGEgbmV3LXN0eWxlIGNsYXNzLgotICBUaGlzIG5lZWRzIHRvIGJlIGRvY3VtZW50ZWQuCi0KLS0gVGhlIG5ldyBidWlsdGluIGRpY3Rpb25hcnkoKSBjb25zdHJ1Y3RvciwgYW5kIGRpY3Rpb25hcnkgdHlwZSwgaGF2ZQotICBiZWVuIHJlbmFtZWQgdG8gZGljdC4gIFRoaXMgcmVmbGVjdHMgYSBkZWNhZGUgb2YgY29tbW9uIHVzYWdlLgotCi0tIGRpY3QoKSBub3cgYWNjZXB0cyBhbiBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIDItc2VxdWVuY2VzLiAgRm9yCi0gIGV4YW1wbGUsIGRpY3QoZC5pdGVtcygpKSA9PSBkIGZvciBhbnkgZGljdGlvbmFyeSBkLiAgVGhlIGFyZ3VtZW50LAotICBhbmQgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcmd1bWVudCwgY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3RzLgotCi0tIE5ldy1zdHlsZSBjbGFzc2VzIGNhbiBub3cgaGF2ZSBhIF9fZGVsX18gbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQKLSAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVsZXRlZCAoanVzdCBsaWtlIGZvciBjbGFzc2ljIGNsYXNzZXMpLgotCi0tIEFzc2lnbm1lbnQgdG8gb2JqZWN0Ll9fZGljdF9fIGlzIG5vdyBwb3NzaWJsZSwgZm9yIG9iamVjdHMgdGhhdCBhcmUKLSAgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIHRoYXQgaGF2ZSBhIF9fZGljdF9fICh1bmxlc3MgdGhlIGJhc2UKLSAgY2xhc3MgZm9yYmlkcyBpdCkuCi0KLS0gTWV0aG9kcyBvZiBidWlsdC1pbiB0eXBlcyBub3cgcHJvcGVybHkgY2hlY2sgZm9yIGtleXdvcmQgYXJndW1lbnRzCi0gIChmb3JtZXJseSB0aGVzZSB3ZXJlIHNpbGVudGx5IGlnbm9yZWQpLiAgVGhlIG9ubHkgYnVpbHQtaW4gbWV0aG9kcwotICB0aGF0IHRha2Uga2V5d29yZCBhcmd1bWVudHMgYXJlIF9fY2FsbF9fLCBfX2luaXRfXyBhbmQgX19uZXdfXy4KLQotLSBUaGUgc29ja2V0IGZ1bmN0aW9uIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBhIHR5cGU7IHNlZSBiZWxvdy4KLQotQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS0gQXNzaWdubWVudCB0byBfX2RlYnVnX18gcmFpc2VzIFN5bnRheEVycm9yIGF0IGNvbXBpbGUtdGltZS4gIFRoaXMKLSAgd2FzIHByb21pc2VkIHdoZW4gMi4xYzEgd2FzIHJlbGVhc2VkIGFzICJXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjFjMSIKLSAgKHNlZSBiZWxvdykgc2F5cy4KLQotLSBDbGFyaWZpZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBvcGVyYW5kcyB0byBhbiBvcGVyYXRvcgotICAobGlrZSAxICsgJycpLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBtbWFwIGhhcyBhIG5ldyBrZXl3b3JkIGFyZ3VtZW50LCAiYWNjZXNzIiwgYWxsb3dpbmcgYSB1bmlmb3JtIHdheSBmb3IKLSAgYm90aCBXaW5kb3dzIGFuZCBVbml4IHVzZXJzIHRvIGNyZWF0ZSByZWFkLW9ubHksIHdyaXRlLXRocm91Z2ggYW5kCi0gIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcHBpbmdzLiAgVGhpcyB3YXMgcHJldmlvdXNseSBwb3NzaWJsZSBvbmx5IG9uCi0gIFVuaXguICBBIG5ldyBrZXl3b3JkIGFyZ3VtZW50IHdhcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMgaW4gYQotICB1bmlmb3JtIHdheSBiZWNhdXNlIHRoZSBtbWFwKCkgc2lnbmF0dXJlcyBoYWQgZGl2ZXJnZWQgYWNyb3NzCi0gIHBsYXRmb3Jtcy4gIFRoYW5rcyB0byBKYXkgVCBNaWxsZXIgZm9yIHJlcGFpcmluZyB0aGlzIQotCi0tIEJ5IGRlZmF1bHQsIHRoZSBnYy5nYXJiYWdlIGxpc3Qgbm93IGNvbnRhaW5zIG9ubHkgdGhvc2UgaW5zdGFuY2VzIGluCi0gIHVucmVhY2hhYmxlIGN5Y2xlcyB0aGF0IGhhdmUgX19kZWxfXyBtZXRob2RzOyBpbiAyLjEgaXQgY29udGFpbmVkIGFsbAotICBpbnN0YW5jZXMgaW4gdW5yZWFjaGFibGUgY3ljbGVzLiAgIkluc3RhbmNlcyIgaGVyZSBoYXMgYmVlbiBnZW5lcmFsaXplZAotICB0byBpbmNsdWRlIGluc3RhbmNlcyBvZiBib3RoIG5ldy1zdHlsZSBhbmQgb2xkLXN0eWxlIGNsYXNzZXMuCi0KLS0gVGhlIHNvY2tldCBtb2R1bGUgZGVmaW5lcyBhIG5ldyBtZXRob2QgZm9yIHNvY2tldCBvYmplY3RzLAotICBzZW5kYWxsKCkuICBUaGlzIGlzIGxpa2Ugc2VuZCgpIGJ1dCBtYXkgbWFrZSBtdWx0aXBsZSBjYWxscyB0bwotICBzZW5kKCkgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gc2VudC4gIEFsc28sIHRoZSBzb2NrZXQgZnVuY3Rpb24gaGFzCi0gIGJlZW4gY29udmVydGVkIHRvIGEgc3ViY2xhc3NhYmxlIHR5cGUsIGxpa2UgbGlzdCBhbmQgdHVwbGUgKGV0Yy4pCi0gIGJlZm9yZSBpdDsgc29ja2V0IGFuZCBTb2NrZXRUeXBlIGFyZSBub3cgdGhlIHNhbWUgdGhpbmcuCi0KLS0gVmFyaW91cyBidWdmaXhlcyB0byB0aGUgY3Vyc2VzIG1vZHVsZS4gIFRoZXJlIGlzIG5vdyBhIHRlc3Qgc3VpdGUKLSAgZm9yIHRoZSBjdXJzZXMgbW9kdWxlICh5b3UgaGF2ZSB0byBydW4gaXQgbWFudWFsbHkpLgotCi0tIGJpbmFzY2lpLmIyYV9iYXNlNjQgbm8gbG9uZ2VyIHBsYWNlcyBhbiBhcmJpdHJhcnkgcmVzdHJpY3Rpb24gb2YgNTcKLSAgYnl0ZXMgb24gaXRzIGlucHV0LgotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KLS0gdGtGaWxlRGlhbG9nIGV4cG9zZXMgYSBEaXJlY3RvcnkgY2xhc3MgYW5kIGFza2RpcmVjdG9yeQotICBjb252ZW5pZW5jZSBmdW5jdGlvbi4KLQotLSBTeW1ib2xpYyBncm91cCBuYW1lcyBpbiByZWd1bGFyIGV4cHJlc3Npb25zIG11c3QgYmUgdW5pcXVlLiAgRm9yCi0gIGV4YW1wbGUsIHRoZSByZWdleHAgcicoP1A8YWJjPikoP1A8YWJjPiknIGlzIG5vdCBhbGxvd2VkLCBiZWNhdXNlIGEKLSAgc2luZ2xlIG5hbWUgY2FuJ3QgbWVhbiBib3RoICJncm91cCAxIiBhbmQgImdyb3VwIDIiIHNpbXVsdGFuZW91c2x5LgotICBQeXRob24gMi4yIGRldGVjdHMgdGhpcyBlcnJvciBhdCByZWdleHAgY29tcGlsYXRpb24gdGltZTsKLSAgcHJldmlvdXNseSwgdGhlIGVycm9yIHdlbnQgdW5kZXRlY3RlZCwgYW5kIHJlc3VsdHMgd2VyZQotICB1bnByZWRpY3RhYmxlLiAgQWxzbyBpbiBzcmUsIHRoZSBwYXR0ZXJuLnNwbGl0KCksIHBhdHRlcm4uc3ViKCksIGFuZAotICBwYXR0ZXJuLnN1Ym4oKSBtZXRob2RzIGhhdmUgYmVlbiByZXdyaXR0ZW4gaW4gQy4gIEFsc28sIGFuCi0gIGV4cGVyaW1lbnRhbCBmdW5jdGlvbi9tZXRob2QgZmluZGl0ZXIoKSBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggd29ya3MKLSAgbGlrZSBmaW5kYWxsKCkgYnV0IHJldHVybnMgYW4gaXRlcmF0b3IuCi0KLS0gVGl4IGV4cG9zZXMgbW9yZSBjb21tYW5kcyB0aHJvdWdoIHRoZSBjbGFzc2VzIERpclNlbGVjdEJveCwKLSAgRGlyU2VsZWN0RGlhbG9nLCBMaXN0Tm90ZUJvb2ssIE1ldGVyLCBDaGVja0xpc3QsIGFuZCB0aGUKLSAgbWV0aG9kcyB0aXhfYWRkYml0bWFwZGlyLCB0aXhfY2dldCwgdGl4X2NvbmZpZ3VyZSwgdGl4X2ZpbGVkaWFsb2csCi0gIHRpeF9nZXRiaXRtYXAsIHRpeF9nZXRpbWFnZSwgdGl4X29wdGlvbl9nZXQsIGFuZCB0aXhfcmVzZXRvcHRpb25zLgotCi0tIFRyYWNlYmFjayBvYmplY3RzIGFyZSBub3cgc2Nhbm5lZCBieSBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0aW9uLCBzbwotICBjeWNsZXMgY3JlYXRlZCBieSBjYXN1YWwgdXNlIG9mIHN5cy5leGNfaW5mbygpIG5vIGxvbmdlciBjYXVzZQotICBwZXJtYW5lbnQgbWVtb3J5IGxlYWtzIChwcm92aWRlZCBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgZW5hYmxlZCkuCi0KLS0gb3MuZXh0c2VwIC0tIGEgbmV3IHZhcmlhYmxlIG5lZWRlZCBieSB0aGUgUklTQ09TIHN1cHBvcnQuICBJdCBpcyB0aGUKLSAgc2VwYXJhdG9yIHVzZWQgYnkgZXh0ZW5zaW9ucywgYW5kIGlzICcuJyBvbiBhbGwgcGxhdGZvcm1zIGV4Y2VwdAotICBSSVNDT1MsIHdoZXJlIGl0IGlzICcvJy4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoaXMgdmFyaWFibGUKLSAgdW5sZXNzIHlvdSBoYXZlIGEgbWFzb2NoaXN0aWMgZGVzaXJlIHRvIHBvcnQgeW91ciBjb2RlIHRvIFJJU0NPUy4KLQotLSBtaW1ldHlwZXMucHkgaGFzIG9wdGlvbmFsIHN1cHBvcnQgZm9yIG5vbi1zdGFuZGFyZCwgYnV0IGNvbW1vbmx5Ci0gIGZvdW5kIHR5cGVzLiAgZ3Vlc3NfdHlwZSgpIGFuZCBndWVzc19leHRlbnNpb24oKSBub3cgYWNjZXB0IGFuCi0gIG9wdGlvbmFsICdzdHJpY3QnIGZsYWcsIGRlZmF1bHRpbmcgdG8gdHJ1ZSwgd2hpY2ggY29udHJvbHMgd2hldGhlcgotICByZWNvZ25pemUgbm9uLXN0YW5kYXJkIHR5cGVzIG9yIG5vdC4gIEEgZmV3IG5vbi1zdGFuZGFyZCB0eXBlcyB3ZQotICBrbm93IGFib3V0IGhhdmUgYmVlbiBhZGRlZC4gIEFsc28sIHdoZW4gcnVuIGFzIGEgc2NyaXB0LCB0aGVyZSBhcmUKLSAgbmV3IC1sIGFuZCAtZSBvcHRpb25zLgotCi0tIHN0YXRjYWNoZSBpcyBub3cgZGVwcmVjYXRlZC4KLQotLSBlbWFpbC5VdGlscy5mb3JtYXRkYXRlKCkgbm93IHByb2R1Y2VzIHRoZSBwcmVmZXJyZWQgUkZDIDI4MjIgc3R5bGUKLSAgZGF0ZXMgd2l0aCBudW1lcmljIHRpbWV6b25lcyAoaXQgdXNlZCB0byBwcm9kdWNlIG9ic29sZXRlIGRhdGVzCi0gIGhhcmQgY29kZWQgdG8gIkdNVCIgdGltZXpvbmUpLiAgQW4gb3B0aW9uYWwgJ2xvY2FsdGltZScgZmxhZyBpcwotICBhZGRlZCB0byBwcm9kdWNlIGRhdGVzIGluIHRoZSBsb2NhbCB0aW1lem9uZSwgd2l0aCBkYXlsaWdodCBzYXZpbmdzCi0gIHRpbWUgcHJvcGVybHkgdGFrZW4gaW50byBhY2NvdW50LgotCi0tIEluIHBpY2tsZSBhbmQgY1BpY2tsZSwgaW5zdGVhZCBvZiBtYXNraW5nIGVycm9ycyBpbiBsb2FkKCkgYnkKLSAgdHJhbnNmb3JtaW5nIHRoZW0gaW50byBTeXN0ZW1FcnJvciwgd2UgbGV0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24KLSAgcHJvcGFnYXRlIG91dC4gIEFsc28sIGltcGxlbWVudCBzdXBwb3J0IGZvciBfX3NhZmVfZm9yX3VucGlja2xpbmdfXwotICBpbiBwaWNrbGUsIGFzIGl0IGFscmVhZHkgd2FzIHN1cHBvcnRlZCBpbiBjUGlja2xlLgotCi1Ub29scy9EZW1vcwotLS0tLS0tLS0tLS0KLQotQnVpbGQKLS0tLS0tCi0KLS0gVGhlIGRibSBtb2R1bGUgaXMgYnVpbHQgdXNpbmcgbGliZGIxIGlmIGF2YWlsYWJsZS4gIFRoZSBic2RkYiBtb2R1bGUKLSAgaXMgYnVpbHQgd2l0aCBsaWJkYjMgaWYgYXZhaWxhYmxlLgotCi0tIE1pc2MvTWFrZWZpbGUucHJlLmluIGhhcyBiZWVuIHJlbW92ZWQgYnkgQkRGTCBwcm9ub3VuY2VtZW50LgotCi1DIEFQSQotLS0tLS0KLQotLSBOZXcgZnVuY3Rpb24gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG5vbi0KLSAgTlVMTCByZXN1bHQgZnJvbSBQeVNlcXVlbmNlX0Zhc3QoKSwgbW9yZSBxdWlja2x5IHRoYW4gY2FsbGluZwotICBQeVNlcXVlbmNlX1NpemUoKS4KLQotLSBOZXcgYXJndW1lbnQgdW5wYWNraW5nIGZ1bmN0aW9uIFB5QXJnX1VucGFja1R1cGxlKCkgYWRkZWQuCi0KLS0gTmV3IGZ1bmN0aW9ucyBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKCkgYW5kCi0gIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKCkgaGF2ZSBiZWVuIGFkZGVkIHRvIG1ha2UgaXQgbW9yZQotICBjb252ZW5pZW50IGFuZCBlZmZpY2llbnQgdG8gY2FsbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgZnJvbSBDLgotCi0tIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vIGxvbmdlciBtYXNrcyBlcnJvcnMsIHNvIGl0J3MKLSAgcG9zc2libGUgdGhhdCB0aGlzIHdpbGwgcHJvcGFnYXRlIGVycm9ycyBpdCBkaWRuJ3QgYmVmb3JlLgotCi0tIE5ldyBmdW5jdGlvbiBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoKSwgd2hpY2ggcmV0dXJucyB0cnVlIGlmIGl0cwotICBhcmd1bWVudCBzdXBwb3J0cyB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUgYnVmZmVyIGludGVyZmFjZS4KLQotTmV3IHBsYXRmb3JtcwotLS0tLS0tLS0tLS0tLQotCi0tIFdlJ3ZlIGZpbmFsbHkgY29uZmlybWVkIHRoYXQgdGhpcyByZWxlYXNlIGJ1aWxkcyBvbiBIUC1VWCAxMS4wMCwKLSAgKndpdGgqIHRocmVhZHMsIGFuZCBwYXNzZXMgdGhlIHRlc3Qgc3VpdGUuCi0KLS0gVGhhbmtzIHRvIGEgc2VyaWVzIG9mIHBhdGNoZXMgZnJvbSBNaWNoYWVsIE11bGxlciwgUHl0aG9uIG1heSBidWlsZAotICBhZ2FpbiB1bmRlciBPUy8yIFZpc3VhbCBBZ2UgQysrLgotCi0tIFVwZGF0ZWQgUklTQ09TIHBvcnQgYnkgRGlldG1hciBTY2h3ZXJ0YmVyZ2VyLgotCi1UZXN0cwotLS0tLS0KLQotLSBBZGRlZCBhIHRlc3Qgc2NyaXB0IGZvciB0aGUgY3Vyc2VzIG1vZHVsZS4gIEl0IGlzbid0IHJ1biBhdXRvbWF0aWNhbGx5OwotICByZWdydGVzdC5weSBtdXN0IGJlIHJ1biB3aXRoICctdSBjdXJzZXMnIHRvIGVuYWJsZSBpdC4KLQotV2luZG93cwotLS0tLS0tLQotCi1NYWMKLS0tLS0KLQotLSBQeXRob25TY3JpcHQgaGFzIGJlZW4gbW92ZWQgdG8gdW5zdXBwb3J0ZWQgYW5kIGlzIHNsYXRlZCB0byBiZQotICByZW1vdmVkIGNvbXBsZXRlbHkgaW4gdGhlIG5leHQgcmVsZWFzZS4KLQotLSBJdCBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGFwcGxldHMgdGhhdCB3b3JrIG9uIGJvdGggT1M5IGFuZAotICBPU1guCi0KLS0gVGhlIGNvcmUgaXMgbm93IGxpbmtlZCB3aXRoIENvcmVTZXJ2aWNlcyBub3QgQ2FyYm9uOyBhcyBhIHNpZGUKLSAgcmVzdWx0LCBkZWZhdWx0IDhiaXQgZW5jb2Rpbmcgb24gT1NYIGlzIG5vdyBBU0NJSS4KLQotLSBQeXRob24gc2hvdWxkIG5vdyBidWlsZCBvbiBPU1ggMTAuMS4xCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYjE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMTktT2N0LTIwMDEqCi0KLVR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIE5ldy1zdHlsZSBjbGFzc2VzIGFyZSBub3cgYWx3YXlzIGR5bmFtaWMgKGV4Y2VwdCBmb3IgYnVpbHQtaW4gYW5kCi0gIGV4dGVuc2lvbiB0eXBlcykuICBUaGVyZSBpcyBubyBsb25nZXIgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBhbmQgSQotICBubyBsb25nZXIgc2VlIGFub3RoZXIgcmVhc29uIHRvIGtlZXAgdGhpcyBiYWdnYWdlIGFyb3VuZC4gIE9uZSByZWxpYwotICByZW1haW5zOiB0aGUgX19kaWN0X18gb2YgYSBuZXctc3R5bGUgY2xhc3MgaXMgYSByZWFkLW9ubHkgcHJveHk7IHlvdQotICBtdXN0IHNldCB0aGUgY2xhc3MncyBhdHRyaWJ1dGUgdG8gbW9kaWZ5IGl0LiAgQXMgYSBjb25zZXF1ZW5jZSwgdGhlCi0gIF9fZGVmaW5lZF9fIGF0dHJpYnV0ZSBvZiBuZXctc3R5bGUgdHlwZXMgbm8gbG9uZ2VyIGV4aXN0cywgZm9yIGxhY2sKLSAgb2YgbmVlZDogdGhlcmUgaXMgb25jZSBhZ2FpbiBvbmx5IG9uZSBfX2RpY3RfXyAoYWx0aG91Z2ggaW4gdGhlCi0gIGZ1dHVyZSBhIF9fY2FjaGVfXyBtYXkgYmUgcmVzdXJyZWN0ZWQgd2l0aCBhIHNpbWlsYXIgZnVuY3Rpb24sIGlmIEkKLSAgY2FuIHByb3ZlIHRoYXQgaXQgYWN0dWFsbHkgc3BlZWRzIHRoaW5ncyB1cCkuCi0KLS0gQy5fX2RvY19fIG5vdyB3b3JrcyBhcyBleHBlY3RlZCBmb3IgbmV3LXN0eWxlIGNsYXNzZXMgKGluIDIuMmE0IGl0Ci0gIGFsd2F5cyByZXR1cm5lZCBOb25lLCBldmVuIHdoZW4gdGhlcmUgd2FzIGEgY2xhc3MgZG9jc3RyaW5nKS4KLQotLSBkb2N0ZXN0IG5vdyBmaW5kcyBhbmQgcnVucyBkb2NzdHJpbmdzIGF0dGFjaGVkIHRvIG5ldy1zdHlsZSBjbGFzc2VzLAotICBjbGFzcyBtZXRob2RzLCBzdGF0aWMgbWV0aG9kcywgYW5kIHByb3BlcnRpZXMuCi0KLUNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIEEgdmVyeSBzdWJ0bGUgc3ludGFjdGljYWwgcGl0ZmFsbCBpbiBsaXN0IGNvbXByZWhlbnNpb25zIHdhcyBmaXhlZC4KLSAgRm9yIGV4YW1wbGU6IFthK2IgZm9yIGEgaW4gJ2FiYycsIGZvciBiIGluICdkZWYnXS4gIFRoZSBjb21tYSBpbgotICB0aGlzIGV4YW1wbGUgaXMgYSBtaXN0YWtlLiAgUHJldmlvdXNseSwgdGhpcyB3b3VsZCBzaWxlbnRseSBsZXQgJ2EnCi0gIGl0ZXJhdGUgb3ZlciB0aGUgc2luZ2xldG9uIHR1cGxlICgnYWJjJywpLCB5aWVsZGluZyBbJ2FiY2QnLCAnYWJjZScsCi0gICdhYmNmJ10gcmF0aGVyIHRoYW4gdGhlIGludGVuZGVkIFsnYWQnLCAnYWUnLCAnYWYnLCAnYmQnLCAnYmUnLAotICAnYmYnLCAnY2QnLCAnY2UnLCAnY2YnXS4gIE5vdywgdGhpcyBpcyBmbGFnZ2VkIGFzIGEgc3ludGF4IGVycm9yLgotICBOb3RlIHRoYXQgW2EgZm9yIGEgaW4gPHNpbmdsZXRvbj5dIGlzIGEgY29udm9sdXRlZCB3YXkgdG8gc2F5Ci0gIFs8c2luZ2xldG9uPl0gYW55d2F5LCBzbyBpdCdzIG5vdCBsaWtlIGFueSBleHByZXNzaXZlbmVzcyBpcyBsb3N0LgotCi0tIGdldGF0dHIob2JqLCBuYW1lLCBkZWZhdWx0KSBub3cgb25seSBjYXRjaGVzIEF0dHJpYnV0ZUVycm9yLCBhcwotICBkb2N1bWVudGVkLCByYXRoZXIgdGhhbiByZXR1cm5pbmcgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbAotICBleGNlcHRpb25zICh3aGljaCBjb3VsZCBtYXNrIGJ1Z3MgaW4gYSBfX2dldGF0dHJfXyBob29rLCBmb3IKLSAgZXhhbXBsZSkuCi0KLS0gV2VhayByZWZlcmVuY2Ugb2JqZWN0cyBhcmUgbm93IHBhcnQgb2YgdGhlIGNvcmUgYW5kIG9mZmVyIGEgQyBBUEkuCi0gIEEgYnVnIHdoaWNoIGNvdWxkIGFsbG93IGEgY29yZSBkdW1wIHdoZW4gYmluYXJ5IG9wZXJhdGlvbnMgaW52b2x2ZWQKLSAgcHJveHkgcmVmZXJlbmNlIGhhcyBiZWVuIGZpeGVkLiAgd2Vha3JlZi5SZWZlcmVuY2VFcnJvciBpcyBub3cgYQotICBidWlsdC1pbiBleGNlcHRpb24uCi0KLS0gdW5pY29kZShvYmopIG5vdyBiZWhhdmVzIG1vcmUgbGlrZSBzdHIob2JqKSwgYWNjZXB0aW5nIGFyYml0cmFyeQotICBvYmplY3RzLCBhbmQgY2FsbGluZyBhIF9fdW5pY29kZV9fIG1ldGhvZCBpZiBpdCBleGlzdHMuCi0gIHVuaWNvZGUob2JqLCBlbmNvZGluZykgYW5kIHVuaWNvZGUob2JqLCBlbmNvZGluZywgZXJyb3JzKSBzdGlsbAotICByZXF1aXJlIGFuIDgtYml0IHN0cmluZyBvciBjaGFyYWN0ZXIgYnVmZmVyIGFyZ3VtZW50LgotCi0tIGlzaW5zdGFuY2UoKSBub3cgYWxsb3dzIGFueSBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBhCi0gIGNsYXNzLCBhIHR5cGUgb3Igc29tZXRoaW5nIHdpdGggYSBfX2Jhc2VzX18gdHVwbGUgYXR0cmlidXRlIGZvciB0aGUKLSAgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBtYXkgYWxzbyBiZSBhIHR1cGxlIG9mIGEKLSAgY2xhc3MsIHR5cGUsIG9yIHNvbWV0aGluZyB3aXRoIF9fYmFzZXNfXywgaW4gd2hpY2ggY2FzZSBpc2luc3RhbmNlKCkKLSAgd2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYW55IG9mIHRoZQotICB0aGluZ3MgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgdHVwbGUuICBFLmcuCi0KLSAgaXNpbnN0YW5jZSh4LCAoQSwgQikpCi0KLSAgcmV0dXJucyB0cnVlIGlmIHggaXMgYW4gaW5zdGFuY2Ugb2YgQSBvciBCLgotCi1FeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIHRoZSB0aHJlYWQgSUQgKHByZXZpb3VzbHkgTm9uZSkuCi0KLS0gYmluYXNjaWkgaGFzIG5vdyB0d28gcXVvcHJpIHN1cHBvcnQgZnVuY3Rpb25zLCBhMmJfcXAgYW5kIGIyYV9xcC4KLQotLSByZWFkbGluZSBub3cgc3VwcG9ydHMgc2V0dGluZyB0aGUgc3RhcnR1cF9ob29rIGFuZCB0aGUKLSAgcHJlX2V2ZW50X2hvb2ssIGFuZCBhZGRzIHRoZSBhZGRfaGlzdG9yeSgpIGZ1bmN0aW9uLgotCi0tIG9zIGFuZCBwb3NpeCBzdXBwb3J0cyBjaHJvb3QoKSwgc2V0Z3JvdXBzKCkgYW5kIHVuc2V0ZW52KCkgd2hlcmUKLSAgYXZhaWxhYmxlLiAgVGhlIHN0YXQoKSwgZnN0YXQoKSwgc3RhdHZmcygpIGFuZCBmc3RhdHZmcygpIGZ1bmN0aW9ucwotICBub3cgcmV0dXJuICJwc2V1ZG8tc2VxdWVuY2VzIiAtLSB0aGUgdmFyaW91cyBmaWVsZHMgY2FuIG5vdyBiZQotICBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIChlLmcuIG9zLnN0YXQoIi8iKS5zdF9tdGltZSkgYnV0IGZvcgotICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0aGV5IGFsc28gYmVoYXZlIGFzIGEgZml4ZWQtbGVuZ3RoIHNlcXVlbmNlLgotICBTb21lIHBsYXRmb3JtLXNwZWNpZmljIGZpZWxkcyAoZS5nLiBzdF9yZGV2KSBhcmUgb25seSBhY2Nlc3NpYmxlIGFzCi0gIGF0dHJpYnV0ZXMuCi0KLS0gdGltZTogbG9jYWx0aW1lKCksIGdtdGltZSgpIGFuZCBzdHJwdGltZSgpIG5vdyByZXR1cm4gYQotICBwc2V1ZG8tc2VxdWVuY2Ugc2ltaWxhciB0byB0aGUgb3Muc3RhdCgpIHJldHVybiB2YWx1ZSwgd2l0aAotICBhdHRyaWJ1dGVzIGxpa2UgdG1feWVhciBldGMuCi0KLS0gRGVjb21wcmVzc2lvbiBvYmplY3RzIGluIHRoZSB6bGliIG1vZHVsZSBub3cgYWNjZXB0IGFuIG9wdGlvbmFsCi0gIHNlY29uZCBwYXJhbWV0ZXIgdG8gZGVjb21wcmVzcygpIHRoYXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudAotICBvZiBtZW1vcnkgdG8gdXNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCi0KLS0gb3B0aW9uYWwgU1NMIHN1cHBvcnQgaW4gdGhlIHNvY2tldCBtb2R1bGUgbm93IGV4cG9ydHMgT3BlblNTTAotICBmdW5jdGlvbnMgUkFORF9hZGQoKSwgUkFORF9lZ2QoKSwgYW5kIFJBTkRfc3RhdHVzKCkuICBUaGVzZSBjYWxscwotICBhcmUgdXNlZnVsIG9uIHBsYXRmb3JtcyBsaWtlIFNvbGFyaXMgd2hlcmUgT3BlblNTTCBkb2VzIG5vdAotICBhdXRvbWF0aWNhbGx5IHNlZWQgaXRzIFBSTkcuICBBbHNvLCB0aGUga2V5ZmlsZSBhbmQgY2VydGZpbGUKLSAgYXJndW1lbnRzIHRvIHNvY2tldC5zc2woKSBhcmUgbm93IG9wdGlvbmFsLgotCi0tIHBvc2l4bW9kdWxlIChhbmQgYnkgZXh0ZW5zaW9uLCB0aGUgb3MgbW9kdWxlIG9uIFBPU0lYIHBsYXRmb3Jtcykgbm93Ci0gIGV4cG9ydHMgT19MQVJHRUZJTEUsIE9fRElSRUNULCBPX0RJUkVDVE9SWSwgYW5kIE9fTk9GT0xMT1cuCi0KLUxpYnJhcnkKLS0tLS0tLS0KLQotLSBkb2N0ZXN0IG5vdyBleGNsdWRlcyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgbm90IGRlZmluZWQgYnkgdGhlIG1vZHVsZQotICBiZWluZyB0ZXN0ZWQsIHRoYW5rcyB0byBUaW0gSG9jaGJlcmcuCi0KLS0gSG90U2hvdCwgYSBuZXcgcHJvZmlsZXIgaW1wbGVtZW50ZWQgdXNpbmcgYSBDLWJhc2VkIGNhbGxiYWNrLCBoYXMKLSAgYmVlbiBhZGRlZC4gIFRoaXMgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBvdmVyaGVhZCBvZiBwcm9maWxpbmcsCi0gIGJ1dCBpdCBpcyBzdGlsbCBxdWl0ZSBwcmVsaW1pbmFyeS4gIFN1cHBvcnQgbW9kdWxlcyBhbmQKLSAgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIGluIHVwY29taW5nIHJlbGVhc2VzIChiZWZvcmUgMi4yIGZpbmFsKS4KLQotLSBwcm9maWxlIG5vdyBwcm9kdWNlcyBjb3JyZWN0IG91dHB1dCBpbiBzaXR1YXRpb25zIHdoZXJlIGFuIGV4Y2VwdGlvbgotICByYWlzZWQgaW4gUHl0aG9uIGlzIGNsZWFyZWQgYnkgQyBjb2RlIChlLmcuIGhhc2F0dHIoKSkuICBUaGlzIHVzZWQKLSAgdG8gY2F1c2Ugd3Jvbmcgb3V0cHV0LCBpbmNsdWRpbmcgc3B1cmlvdXMgY2xhaW1zIG9mIHJlY3Vyc2l2ZQotICBmdW5jdGlvbnMgYW5kIGF0dHJpYnV0aW9uIG9mIHRpbWUgc3BlbnQgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLgotCi0gIFRoZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgZGVyaXZlZCBPbGRQcm9maWxlIGFuZCBIb3RQcm9maWxlCi0gIHByb2ZpbGluZyBjbGFzc2VzIHdhcyByZW1vdmVkLiAgVGhlIGNvZGUgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMgKGlmCi0gIHlvdSB0cmllZCB0byB1c2UgdGhlbSwgdGhleSByYWlzZWQgZXhjZXB0aW9ucykuICBPbGRQcm9maWxlCi0gIGludGVuZGVkIHRvIHJlcHJvZHVjZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2ZpbGVyIFB5dGhvbiB1c2VkIG1vcmUKLSAgdGhhbiA3IHllYXJzIGFnbywgYW5kIGlzbid0IGludGVyZXN0aW5nIGFueW1vcmUuICBIb3RQcm9maWxlIGludGVuZGVkCi0gIHRvIHByb3ZpZGUgYSBmYXN0ZXIgcHJvZmlsZXIgKGJ1dCBwcm9kdWNpbmcgbGVzcyBpbmZvcm1hdGlvbiksIGFuZAotICB0aGF0J3MgYSB3b3J0aHkgZ29hbCB3ZSBpbnRlbmQgdG8gbWVldCB2aWEgYSBkaWZmZXJlbnQgYXBwcm9hY2ggKGJ1dAotICB3aXRob3V0IGxvc2luZyBpbmZvcm1hdGlvbikuCi0KLS0gUHJvZmlsZS5jYWxpYnJhdGUoKSBoYXMgYSBuZXcgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgZGVsaXZlcgotICBhIG11Y2ggYmV0dGVyIHN5c3RlbS1zcGVjaWZpYyBjYWxpYnJhdGlvbiBjb25zdGFudC4gIFRoZSBjb25zdGFudCBjYW4KLSAgbm93IGJlIHNwZWNpZmllZCBpbiBhbiBpbnN0YW5jZSBjb25zdHJ1Y3Rvciwgb3IgYXMgYSBQcm9maWxlIGNsYXNzIG9yCi0gIGluc3RhbmNlIHZhcmlhYmxlLCBpbnN0ZWFkIG9mIGJ5IGVkaXRpbmcgcHJvZmlsZS5weSdzIHNvdXJjZSBjb2RlLgotICBDYWxpYnJhdGlvbiBtdXN0IHN0aWxsIGJlIGRvbmUgbWFudWFsbHkgKHNlZSB0aGUgZG9jcyBmb3IgdGhlIHByb2ZpbGUKLSAgbW9kdWxlKS4KLQotICBOb3RlIHRoYXQgUHJvZmlsZS5jYWxpYnJhdGUoKSBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KLSAgSW1wcm92aW5nIHRoZSBhY2N1cmFjeSByZXF1aXJlZCBleHBsb2l0aW5nIGRldGFpbGVkIGtub3dsZWRnZSBvZgotICBwcm9maWxlciBpbnRlcm5hbHM7IHRoZSBlYXJsaWVyIG1ldGhvZCBhYnN0cmFjdGVkIGF3YXkgdGhlIGRldGFpbHMKLSAgYW5kIG1lYXN1cmVkIGEgc2ltcGxpZmllZCBtb2RlbCBpbnN0ZWFkLCBidXQgY29uc2VxdWVudGx5IGNvbXB1dGVkCi0gIGEgY29uc3RhbnQgdG9vIHNtYWxsIGJ5IGEgZmFjdG9yIG9mIDIgb24gc29tZSBtb2Rlcm4gbWFjaGluZXMuCi0KLS0gcXVvcHJpJ3MgZW5jb2RlIGFuZCBkZWNvZGUgbWV0aG9kcyB0YWtlIGFuIG9wdGlvbmFsIGhlYWRlciBwYXJhbWV0ZXIsCi0gIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG91dHB1dCBpcyBpbnRlbmRlZCBmb3IgdGhlIGhlYWRlciAnUScKLSAgZW5jb2RpbmcuCi0KLS0gVGhlIFNvY2tldFNlcnZlci5UaHJlYWRpbmdNaXhJbiBjbGFzcyBub3cgY2xvc2VzIHRoZSByZXF1ZXN0IGFmdGVyCi0gIGZpbmlzaF9yZXF1ZXN0KCkgcmV0dXJucy4gIChOb3Qgd2hlbiBpdCBlcnJvcnMgb3V0IHRob3VnaC4pCi0KLS0gVGhlIG5udHBsaWIgbW9kdWxlJ3MgTk5UUC5ib2R5KCkgbWV0aG9kIGhhcyBncm93biBhICdmaWxlJyBhcmd1bWVudAotICB0byBhbGxvdyBzYXZpbmcgdGhlIG1lc3NhZ2UgYm9keSB0byBhIGZpbGUuCi0KLS0gVGhlIGVtYWlsIHBhY2thZ2UgaGFzIGFkZGVkIGEgY2xhc3MgZW1haWwuUGFyc2VyLkhlYWRlclBhcnNlciB3aGljaAotICBvbmx5IHBhcnNlcyBoZWFkZXJzIGFuZCBkb2VzIG5vdCByZWN1cnNlIGludG8gdGhlIG1lc3NhZ2UncyBib2R5LgotICBBbHNvLCB0aGUgbW9kdWxlL2NsYXNzIE1JTUVBdWRpbyBoYXMgYmVlbiBhZGRlZCBmb3IgcmVwcmVzZW50aW5nCi0gIGF1ZGlvIGRhdGEgKGNvbnRyaWJ1dGVkIGJ5IEFudGhvbnkgQmF4dGVyKS4KLQotLSBmdHBsaWIgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGZpbGVzID4gMkdCLgotCi0tIENvbmZpZ1BhcnNlci5nZXRib29sZWFuKCkgbm93IGFsc28gaW50ZXJwcmV0cyBUUlVFLCBGQUxTRSwgWUVTLCBOTywKLSAgT04sIGFuZCBPRkYuCi0KLS0geG1sLmRvbS5taW5pZG9tIE5vZGVMaXN0IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlIGxlbmd0aCBhdHRyaWJ1dGUKLSAgYW5kIGl0ZW0oKSBtZXRob2QgYXMgcmVxdWlyZWQgYnkgdGhlIERPTSBzcGVjaWZpY2F0aW9ucy4KLQotVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0tCi0KLS0gRGVtby9kbnMgd2FzIHJlbW92ZWQuICBJdCBubyBsb25nZXIgc2VydmVzIGFueSBwdXJwb3NlOyBhIHBhY2thZ2UKLSAgZGVyaXZlZCBmcm9tIGl0IGlzIG5vdyBtYWludGFpbmVkIGJ5IEFudGhvbnkgQmF4dGVyLCBzZWUKLSAgaHR0cDovL1B5RE5TLlNvdXJjZUZvcmdlLm5ldC4KLQotLSBUaGUgZnJlZXplIHRvb2wgaGFzIGJlZW4gbWFkZSBtb3JlIHJvYnVzdCwgYW5kIHR3byBuZXcgb3B0aW9ucyBoYXZlCi0gIGJlZW4gYWRkZWQ6IC1YIGFuZCAtRS4KLQotQnVpbGQKLS0tLS0tCi0KLS0gY29uZmlndXJlIHdpbGwgdXNlIENYWCBpbiBMSU5LQ0MgaWYgQ1hYIGlzIHVzZWQgdG8gYnVpbGQgbWFpbigpIGFuZAotICB0aGUgc3lzdGVtIHJlcXVpcmVzIHRvIGxpbmsgYSBDKysgbWFpbiB1c2luZyB0aGUgQysrIGNvbXBpbGVyLgotCi1DIEFQSQotLS0tLS0KLQotLSBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHRwX2NvbXBhcmUgc2xvdCBpcyB1cGRhdGVkIHRvIHJlcXVpcmUgdGhhdAotICB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgLTEsIDAsIDE7IGFuIGFyYml0cmFyeSBudW1iZXIgPDAgb3IgPjAgaXMKLSAgbm90IGNvcnJlY3QuICBUaGlzIGlzIG5vdCB5ZXQgZW5mb3JjZWQgYnV0IHdpbGwgYmUgZW5mb3JjZWQgaW4KLSAgUHl0aG9uIDIuMzsgZXZlbiBsYXRlciwgd2UgbWF5IHVzZSAtMiB0byBpbmRpY2F0ZSBlcnJvcnMgYW5kICsyIGZvcgotICAiTm90SW1wbGVtZW50ZWQiLiAgUmlnaHQgbm93LCAtMSBzaG91bGQgYmUgdXNlZCBmb3IgYW4gZXJyb3IgcmV0dXJuLgotCi0tIFB5TG9uZ19Bc0xvbmdMb25nKCkgbm93IGFjY2VwdHMgaW50IChhcyB3ZWxsIGFzIGxvbmcpIGFyZ3VtZW50cy4KLSAgQ29uc2VxdWVudGx5LCBQeUFyZ19QYXJzZVR1cGxlJ3MgJ0wnIGNvZGUgYWxzbyBhY2NlcHRzIGludCAoYXMgd2VsbAotICBhcyBsb25nKSBhcmd1bWVudHMuCi0KLS0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIGEgbG9uZyBpbnQgZ2l2aW5nIHRoZSB0aHJlYWQKLSAgSUQsIGlmIG9uZSBjYW4gYmUgY2FsY3VsYXRlZDsgaXQgcmV0dXJucyAtMSBmb3IgZXJyb3IsIDAgaWYgbm8KLSAgdGhyZWFkIElEIGlzIGNhbGN1bGF0ZWQgKHRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSwgYnV0IG9ubHkKLSAgdGhlIHRocmVhZCBtb2R1bGUgdXNlZCB0aGlzIEFQSSkuICBUaGlzIGNvZGUgaGFzIG9ubHkgcmVhbGx5IGJlZW4KLSAgdGVzdGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzOyBvdGhlciBwbGF0Zm9ybXMgcGxlYXNlIGJld2FyZSAoYW5kCi0gIHJlcG9ydCBhbnkgYnVncyBvciBzdHJhbmdlIGJlaGF2aW9yKS4KLQotLSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKSBubyBsb25nZXIgYWNjZXB0cyBVbmljb2RlIG9iamVjdHMgYXMKLSAgaW5wdXQuCi0KLU5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLS0KLQotVGVzdHMKLS0tLS0tCi0KLVdpbmRvd3MKLS0tLS0tLS0KLQotLSBJbnN0YWxsZXI6ICBJZiB5b3UgaW5zdGFsbCBJRExFLCBhbmQgZG9uJ3QgZGlzYWJsZSBmaWxlLWV4dGVuc2lvbgotICByZWdpc3RyYXRpb24sIGEgbmV3ICJFZGl0IHdpdGggSURMRSIgY29udGV4dCAocmlnaHQtY2xpY2spIG1lbnUgZW50cnkKLSAgaXMgY3JlYXRlZCBmb3IgLnB5IGFuZCAucHl3IGZpbGVzLgotCi0tIFRoZSBzaWduYWwgbW9kdWxlIG5vdyBzdXBwb3J0cyBTSUdCUkVBSyBvbiBXaW5kb3dzLCB0aGFua3MgdG8gU3RldmVuCi0gIFNjb3R0LiAgTm90ZSB0aGF0IFNJR0JSRUFLIGlzIHVuaXF1ZSB0byBXaW5kb3dzLiAgVGhlIGRlZmF1bHQgU0lHQlJFQUsKLSAgYWN0aW9uIHJlbWFpbnMgdG8gY2FsbCBXaW4zMiBFeGl0UHJvY2VzcygpLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEKLSAgc2lnbmFsLnNpZ25hbCgpLiAgRm9yIGV4YW1wbGU6OgotCi0gICAgICAjIE1ha2UgQ3RybCtCcmVhayByYWlzZSBLZXlib2FyZEludGVycnVwdCwgbGlrZSBQeXRob24ncyBkZWZhdWx0IEN0cmwrQwotICAgICAgIyAoU0lHSU5UKSBiZWhhdmlvci4KLSAgICAgIGltcG9ydCBzaWduYWwKLSAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0JSRUFLLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKLQotICAgICAgdHJ5OgotICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgIHBhc3MKLSAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAjIFdlIGdldCBoZXJlIG9uIEN0cmwrQyBvciBDdHJsK0JyZWFrIG5vdzsgaWYgd2UgaGFkIG5vdCBjaGFuZ2VkCi0gICAgICAgICAgIyBTSUdCUkVBSywgb25seSBvbiBDdHJsK0MgKGFuZCBDdHJsK0JyZWFrIHdvdWxkIHRlcm1pbmF0ZSB0aGUKLSAgICAgICAgICAjIHByb2dyYW0gd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgZm9yIGFueSBQeXRob24tbGV2ZWwgY2xlYW51cCkuCi0gICAgICAgICAgcHJpbnQgIkNsZWFuIGV4aXQiCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTQ/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMjgtU2VwLTIwMDEqCi0KLVR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIHB5ZG9jIGFuZCBpbnNwZWN0IGFyZSBub3cgYXdhcmUgb2YgbmV3LXN0eWxlIGNsYXNzZXM7Ci0gIGUuZy4gaGVscChsaXN0KSBhdCB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0IG5vdyBzaG93cyBwcm9wZXIKLSAgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIG9wZXJhdGlvbnMgb24gbGlzdCBvYmplY3RzLgotCi0tIEFwcGxpY2F0aW9ucyB1c2luZyBKaW0gRnVsdG9uJ3MgRXh0ZW5zaW9uQ2xhc3MgbW9kdWxlIGNhbiBub3cgc2FmZWx5Ci0gIGJlIHVzZWQgd2l0aCBQeXRob24gMi4yLiAgSW4gcGFydGljdWxhciwgWm9wZSAyLjQuMSBub3cgd29ya3Mgd2l0aAotICBQeXRob24gMi4yIChhcyB3ZWxsIGFzIHdpdGggUHl0aG9uIDIuMS4xKS4gIFRoZSBEZW1vL21ldGFjbGFzcwotICBleGFtcGxlcyBhbHNvIHdvcmsgYWdhaW4uICBJdCBpcyBob3BlZCB0aGF0IEd0ayBhbmQgQm9vc3QgYWxzbyB3b3JrCi0gIHdpdGggMi4yYTQgYW5kIGJleW9uZC4gIChJZiB5b3UgY2FuIGNvbmZpcm0gdGhpcywgcGxlYXNlIHdyaXRlCi0gIHdlYm1hc3RlckBweXRob24ub3JnOyBpZiB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMsIHBsZWFzZSBvcGVuIGEgYnVnCi0gIHJlcG9ydCBvbiBTb3VyY2VGb3JnZS4pCi0KLS0gcHJvcGVydHkoKSBub3cgdGFrZXMgNCBrZXl3b3JkIGFyZ3VtZW50czogIGZnZXQsIGZzZXQsIGZkZWwgYW5kIGRvYy4KLSAgVGhlc2UgbWFwIHRvIHJlYWQtb25seSBhdHRyaWJ1dGVzICdmZ2V0JywgJ2ZzZXQnLCAnZmRlbCcsIGFuZCAnX19kb2NfXycKLSAgaW4gdGhlIGNvbnN0cnVjdGVkIHByb3BlcnR5IG9iamVjdC4gIGZnZXQsIGZzZXQgYW5kIGZkZWwgd2VyZW4ndAotICBkaXNjb3ZlcmFibGUgZnJvbSBQeXRob24gaW4gMi4yYTMuICBfX2RvY19fIGlzIG5ldywgYW5kIGFsbG93cyB0bwotICBhc3NvY2lhdGUgYSBkb2NzdHJpbmcgd2l0aCBhIHByb3BlcnR5LgotCi0tIENvbXBhcmlzb24gb3ZlcmxvYWRpbmcgaXMgbm93IG1vcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZC4gIEZvcgotICBleGFtcGxlLCBhIHN0ciBzdWJjbGFzcyBpbnN0YW5jZSBjYW4gcHJvcGVybHkgYmUgY29tcGFyZWQgdG8gYSBzdHIKLSAgaW5zdGFuY2UsIGFuZCBpdCBjYW4gcHJvcGVybHkgb3ZlcmxvYWQgY29tcGFyaXNvbi4gIERpdHRvIGZvciBtb3N0Ci0gIG90aGVyIGJ1aWx0LWluIG9iamVjdCB0eXBlcy4KLQotLSBUaGUgcmVwcigpIG9mIG5ldy1zdHlsZSBjbGFzc2VzIGhhcyBjaGFuZ2VkOyBpbnN0ZWFkIG9mIDx0eXBlCi0gICdNLkZvbyc+IGEgbmV3LXN0eWxlIGNsYXNzIGlzIG5vdyByZW5kZXJlZCBhcyA8Y2xhc3MgJ00uRm9vJz4sCi0gICpleGNlcHQqIGZvciBidWlsdC1pbiB0eXBlcywgd2hpY2ggYXJlIHN0aWxsIHJlbmRlcmVkIGFzIDx0eXBlCi0gICdGb28nPiAodG8gYXZvaWQgdXBzZXR0aW5nIGV4aXN0aW5nIGNvZGUgdGhhdCBtaWdodCBwYXJzZSBvcgotICBvdGhlcndpc2UgcmVseSBvbiByZXByKCkgb2YgY2VydGFpbiB0eXBlIG9iamVjdHMpLgotCi0tIFRoZSByZXByKCkgb2YgbmV3LXN0eWxlIG9iamVjdHMgaXMgbm93IGFsd2F5cyA8Rm9vIG9iamVjdCBhdCBYWFg+OwotICBwcmV2aW91c2x5LCBpdCB3YXMgc29tZXRpbWVzIDxGb28gaW5zdGFuY2UgYXQgWFhYPi4KLQotLSBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHdoYXQgd2FzIHByZXZpb3VzbHkgY2FsbGVkIF9fZ2V0YXR0cl9fIGlzIG5vdwotICBjYWxsZWQgX19nZXRhdHRyaWJ1dGVfXy4gIFRoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZm9yCi0gICpldmVyeSogYXR0cmlidXRlIGFjY2Vzcy4gIEEgbmV3IF9fZ2V0YXR0cl9fIGhvb2sgbW9yZSBzaW1pbGFyIHRvIHRoZQotICBvbmUgaW4gY2xhc3NpYyBjbGFzc2VzIGlzIGRlZmluZWQgd2hpY2ggaXMgY2FsbGVkIG9ubHkgaWYgcmVndWxhcgotICBhdHRyaWJ1dGUgYWNjZXNzIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcjsgdG8gY2F0Y2ggKmFsbCogYXR0cmlidXRlCi0gIGFjY2VzcywgeW91IGNhbiB1c2UgX19nZXRhdHRyaWJ1dGVfXyAoZm9yIG5ldy1zdHlsZSBjbGFzc2VzKS4gIElmCi0gIGJvdGggYXJlIGRlZmluZWQsIF9fZ2V0YXR0cmlidXRlX18gaXMgY2FsbGVkIGZpcnN0LCBhbmQgaWYgaXQgcmFpc2VzCi0gIEF0dHJpYnV0ZUVycm9yLCBfX2dldGF0dHJfXyBpcyBjYWxsZWQuCi0KLS0gVGhlIF9fY2xhc3NfXyBhdHRyaWJ1dGUgb2YgbmV3LXN0eWxlIG9iamVjdHMgY2FuIGJlIGFzc2lnbmVkIHRvLgotICBUaGUgbmV3IGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBDLWxldmVsIG9iamVjdCBsYXlvdXQgYXMgdGhlIG9sZAotICBjbGFzcy4KLQotLSBUaGUgYnVpbHRpbiBmaWxlIHR5cGUgY2FuIGJlIHN1YmNsYXNzZWQgbm93LiAgSW4gdGhlIHVzdWFsIHBhdHRlcm4sCi0gICJmaWxlIiBpcyB0aGUgbmFtZSBvZiB0aGUgYnVpbHRpbiB0eXBlLCBhbmQgZmlsZSgpIGlzIGEgbmV3IGJ1aWx0aW4KLSAgY29uc3RydWN0b3IsIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBidWlsdGluIG9wZW4oKSBmdW5jdGlvbi4KLSAgZmlsZSgpIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBvcGVuIGEgZmlsZS4KLQotLSBQcmV2aW91c2x5LCBfX25ld19fIHdvdWxkIG9ubHkgc2VlIHNlcXVlbnRpYWwgYXJndW1lbnRzIHBhc3NlZCB0bwotICB0aGUgdHlwZSBpbiBhIGNvbnN0cnVjdG9yIGNhbGw7IF9faW5pdF9fIHdvdWxkIHNlZSBib3RoIHNlcXVlbnRpYWwKLSAgYW5kIGtleXdvcmQgYXJndW1lbnRzLiAgVGhpcyBtYWRlIG5vIHNlbnNlIHdoYXRzb2V2ZXIgYW55IG1vcmUsIHNvCi0gIG5vdyBib3RoIF9fbmV3X18gYW5kIF9faW5pdF9fIHNlZSBhbGwgYXJndW1lbnRzLgotCi0tIFByZXZpb3VzbHksIGhhc2goKSBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2Ygc3RyIG9yCi0gIHVuaWNvZGUgYWx3YXlzIHJldHVybmVkIDAuICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLgotCi0tIFByZXZpb3VzbHksIGFuIG9wZXJhdGlvbiBvbiBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIGFuCi0gIGltbXV0YWJsZSB0eXBlIChpbnQsIGxvbmcsIGZsb2F0LCBjb21wbGV4LCB0dXBsZSwgc3RyLCB1bmljb2RlKSwKLSAgd2hlcmUgdGhlIHN1YnR5cGUgZGlkbid0IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gKGFuZCBzbyB0aGUKLSAgb3BlcmF0aW9uIHdhcyBoYW5kbGVkIGJ5IHRoZSBidWlsdGluIHR5cGUpLCBjb3VsZCByZXR1cm4gdGhhdAotICBpbnN0YW5jZSBpbnN0ZWFkIGEgdmFsdWUgb2YgdGhlIGJhc2UgdHlwZS4gIEZvciBleGFtcGxlLCBpZiBzIHdhcyBvZgotICBhIHN0ciBzdWJjbGFzcyB0eXBlLCBzWzpdIHJldHVybmVkIHMgYXMtaXMuICBOb3cgaXQgcmV0dXJucyBhIHN0cgotICB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHMuCi0KLS0gUHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgcGlja2xpbmcgbmV3LXN0eWxlIG9iamVjdHMgaGFzIGJlZW4gYWRkZWQuCi0KLUNvcmUKLS0tLS0KLQotLSBmaWxlLndyaXRlbGluZXMoKSBub3cgYWNjZXB0cyBhbnkgaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZyBzdHJpbmdzLgotCi0tIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgpIG5vdyB3b3JrcyB2ZXJ5IG11Y2ggbGlrZQotICBQeU9iamVjdF9TdHIob2JqKSBpbiB0aGF0IGl0IHRyaWVzIHRvIHVzZSBfX3N0cl9fL3RwX3N0cgotICBvbiB0aGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaXMgbm90IGEgc3RyaW5nIG9yIGJ1ZmZlci4gVGhpcwotICBtYWtlcyB1bmljb2RlKCkgYmVoYXZlIGxpa2Ugc3RyKCkgd2hlbiBhcHBsaWVkIHRvIG5vbi1zdHJpbmcvYnVmZmVyCi0gIG9iamVjdHMuCi0KLS0gUHlGaWxlX1dyaXRlT2JqZWN0IG5vdyBwYXNzZXMgVW5pY29kZSBvYmplY3RzIHRvIHRoZSBmaWxlJ3Mgd3JpdGUKLSAgbWV0aG9kLiBBcyBhIHJlc3VsdCwgYWxsIGZpbGUtbGlrZSBvYmplY3RzIHdoaWNoIG1heSBiZSB0aGUgdGFyZ2V0Ci0gIG9mIGEgcHJpbnQgc3RhdGVtZW50IG11c3Qgc3VwcG9ydCBVbmljb2RlIG9iamVjdHMsIGkuZS4gdGhleSBtdXN0Ci0gIGF0IGxlYXN0IGNvbnZlcnQgdGhlbSBpbnRvIEFTQ0lJIHN0cmluZ3MuCi0KLS0gVGhyZWFkIHNjaGVkdWxpbmcgb24gU29sYXJpcyBzaG91bGQgYmUgaW1wcm92ZWQ7IGl0IGlzIG5vIGxvbmdlcgotICBuZWNlc3NhcnkgdG8gaW5zZXJ0IGEgc21hbGwgc2xlZXAgYXQgdGhlIHN0YXJ0IG9mIGEgdGhyZWFkIGluIG9yZGVyCi0gIHRvIGxldCBvdGhlciBydW5uYWJsZSB0aHJlYWRzIGJlIHNjaGVkdWxlZC4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIFN0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBhbmQgY1N0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBzdXBwb3J0Ci0gIHJlYWQgY2hhcmFjdGVyIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdHMgZm9yIHRoZWlyIC53cml0ZSgpIG1ldGhvZHMuCi0gIFRoZXNlIG9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIGFuZCB0aGVuIGhhbmRsZWQgYXMgc3VjaAotICBieSB0aGUgaW5zdGFuY2VzLgotCi0tIFRoZSAiZW1haWwiIHBhY2thZ2UgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGlzIGJhc2ljYWxseSBhIHBvcnQgb2YgdGhlCi0gIG1pbWVsaWIgcGFja2FnZSA8aHR0cDovL3NmLm5ldC9wcm9qZWN0cy9taW1lbGliPiB3aXRoIEFQSSBjaGFuZ2VzCi0gIGFuZCBzb21lIGltcGxlbWVudGF0aW9ucyB1cGRhdGVkIHRvIHVzZSBpdGVyYXRvcnMgYW5kIGdlbmVyYXRvcnMuCi0KLS0gZGlmZmxpYi5uZGlmZigpIGFuZCBkaWZmbGliLkRpZmZlci5jb21wYXJlKCkgYXJlIGdlbmVyYXRvcnMgbm93LiAgVGhpcwotICByZXN0b3JlcyB0aGUgYWJpbGl0eSBvZiBUb29scy9zY3JpcHRzL25kaWZmLnB5IHRvIHN0YXJ0IHByb2R1Y2luZyBvdXRwdXQKLSAgYmVmb3JlIHRoZSBlbnRpcmUgY29tcGFyaXNvbiBpcyBjb21wbGV0ZS4KLQotLSBTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgYW5kIGNTdHJpbmdJTy5TdHJpbmdJTyBpbnN0YW5jZXMgc3VwcG9ydAotICBpdGVyYXRpb24ganVzdCBsaWtlIGZpbGUgb2JqZWN0cyAoaS5lLiB0aGVpciAucmVhZGxpbmUoKSBtZXRob2QgaXMKLSAgY2FsbGVkIGZvciBlYWNoIGl0ZXJhdGlvbiB1bnRpbCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZykuCi0KLS0gVGhlIGNvZGVjcyBtb2R1bGUgaGFzIGdyb3duIGZvdXIgbmV3IGhlbHBlciBBUElzIHRvIGFjY2VzcwotICBidWlsdGluIGNvZGVjczogZ2V0ZW5jb2RlcigpLCBnZXRkZWNvZGVyKCksIGdldHJlYWRlcigpLAotICBnZXR3cml0ZXIoKS4KLQotLSBTaW1wbGVYTUxSUENTZXJ2ZXI6IGEgbmV3IG1vZHVsZSAoYmFzZWQgdXBvbiBTaW1wbGVIVE1MU2VydmVyKQotICBzaW1wbGlmaWVzIHdyaXRpbmcgWE1MIFJQQyBzZXJ2ZXJzLgotCi0tIG9zLnBhdGgucmVhbHBhdGgoKTogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRobmFtZQotICBhZnRlciBpbnRlcnByZXRhdGlvbiBvZiBzeW1ib2xpYyBsaW5rcy4gIE9uIG5vbi1Vbml4IHN5c3RlbXMsIHRoaXMKLSAgaXMgYW4gYWxpYXMgZm9yIG9zLnBhdGguYWJzcGF0aCgpLgotCi0tIG9wZXJhdG9yLmluZGV4T2YoKSAoUHlTZXF1ZW5jZV9JbmRleCgpIGluIHRoZSBDIEFQSSkgbm93IHdvcmtzIHdpdGggYW55Ci0gIGl0ZXJhYmxlIG9iamVjdC4KLQotLSBzbXRwbGliIG5vdyBzdXBwb3J0cyB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIGFuZCBzZWN1cml0eSBmZWF0dXJlcyBvZgotICB0aGUgU01UUCBwcm90b2NvbCB0aHJvdWdoIHRoZSBuZXcgbG9naW4oKSBhbmQgc3RhcnR0bHMoKSBtZXRob2RzLgotCi0tIGhtYWM6IGEgbmV3IG1vZHVsZSBpbXBsZW1lbnRpbmcga2V5ZWQgaGFzaGluZyBmb3IgbWVzc2FnZQotICBhdXRoZW50aWNhdGlvbi4KLQotLSBtaW1ldHlwZXMgbm93IHJlY29nbml6ZXMgbW9yZSBleHRlbnNpb25zIGFuZCBmaWxlIHR5cGVzLiAgQXQgdGhlCi0gIHNhbWUgdGltZSwgc29tZSBtYXBwaW5ncyBub3Qgc2FuY3Rpb25lZCBieSBJQU5BIHdlcmUgcmVtb3ZlZC4KLQotLSBUaGUgImNvbXBpbGVyIiBwYWNrYWdlIGhhcyBiZWVuIGJyb3VnaHQgdXAgdG8gZGF0ZSB0byB0aGUgc3RhdGUgb2YKLSAgUHl0aG9uIDIuMiBieXRlY29kZSBnZW5lcmF0aW9uLiAgSXQgaGFzIGFsc28gYmVlbiBwcm9tb3RlZCBmcm9tIGEKLSAgVG9vbCB0byBhIHN0YW5kYXJkIGxpYnJhcnkgcGFja2FnZS4gIChUb29scy9jb21waWxlciBzdGlsbCBleGlzdHMgYXMKLSAgYSBzYW1wbGUgZHJpdmVyLikKLQotQnVpbGQKLS0tLS0tCi0KLS0gTGFyZ2UgZmlsZSBzdXBwb3J0IChMRlMpIGlzIG5vdyBhdXRvbWF0aWMgd2hlbiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMKLSAgaXQ7IG5vIG1vcmUgbWFudWFsIGNvbmZpZ3VyYXRpb24gdHdlYWtzIGFyZSBuZWVkZWQuICBPbiBMaW51eCwgYXQKLSAgbGVhc3QsIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIHN5c3RlbSB3aG9zZSBDIGxpYnJhcnkgc3VwcG9ydHMgbGFyZ2UKLSAgZmlsZXMgYnV0IHdob3NlIGtlcm5lbCBkb2Vzbid0OyBpbiB0aGlzIGNhc2UsIGxhcmdlIGZpbGUgc3VwcG9ydCBpcwotICBzdGlsbCBlbmFibGVkIGJ1dCBkb2Vzbid0IGRvIHlvdSBhbnkgZ29vZCB1bmxlc3MgeW91IHVwZ3JhZGUgeW91cgotICBrZXJuZWwgb3Igc2hhcmUgeW91ciBQeXRob24gZXhlY3V0YWJsZSB3aXRoIGFub3RoZXIgc3lzdGVtIHdob3NlCi0gIGtlcm5lbCBoYXMgbGFyZ2UgZmlsZSBzdXBwb3J0LgotCi0tIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBzdXBwbGllcyBwbGF1c2libGUgZGVmYXVsdHMgaW4gYQotICBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudC4gIFRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHN1cHBsaWVkCi0gIHZhbHVlcyBhcmUgYWx3YXlzIGNvcnJlY3QsIG9yIHRoYXQgY3Jvc3MtY29tcGlsYXRpb24gbm93IHdvcmtzCi0gIGZsYXdsZXNzbHkgLS0gYnV0IGl0J3MgYSBmaXJzdCBzdGVwIChhbmQgaXQgc2h1dHMgdXAgbW9zdCBvZgotICBhdXRvY29uZidzIHdhcm5pbmdzIGFib3V0IEFDX1RSWV9SVU4pLgotCi0tIFRoZSBVbml4IGJ1aWxkIGlzIG5vdyBhIGJpdCBsZXNzIGNoYXR0eSwgY291cnRlc3kgb2YgdGhlIHBhcnNlcgotICBnZW5lcmF0b3IuICBUaGUgYnVpbGQgaXMgY29tcGxldGVseSBzaWxlbnQgKGV4Y2VwdCBmb3IgZXJyb3JzKSB3aGVuCi0gIHVzaW5nICJtYWtlIC1zIiwgdGhhbmtzIHRvIGEgLXEgb3B0aW9uIHRvIHNldHVwLnB5LgotCi1DIEFQSQotLS0tLS0KLQotLSBUaGUgInN0cnVjdG1lbWJlciIgQVBJIG5vdyBzdXBwb3J0cyBzb21lIG5ldyBmbGFnIGJpdHMgdG8gZGVueSByZWFkCi0gIGFuZC9vciB3cml0ZSBhY2Nlc3MgdG8gYXR0cmlidXRlcyBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlLgotCi1OZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0tCi0KLS0gQ29tcGFxJ3MgaVBBUSBoYW5kaGVsZCwgcnVubmluZyB0aGUgImZhbWlsaWFyIiBMaW51eCBkaXN0cmlidXRpb24KLSAgKGh0dHA6Ly9mYW1pbGlhci5oYW5kaGVsZHMub3JnKS4KLQotVGVzdHMKLS0tLS0tCi0KLS0gVGhlICJjbGFzc2ljIiBzdGFuZGFyZCB0ZXN0cywgd2hpY2ggd29yayBieSBjb21wYXJpbmcgc3Rkb3V0IHRvCi0gIGFuIGV4cGVjdGVkLW91dHB1dCBmaWxlIHVuZGVyIExpYi90ZXN0L291dHB1dC8sIG5vIGxvbmdlciBzdG9wIGF0Ci0gIHRoZSBmaXJzdCBtaXNtYXRjaC4gIEluc3RlYWQgdGhlIHRlc3QgaXMgcnVuIHRvIGNvbXBsZXRpb24sIGFuZCBhCi0gIHZhcmlhbnQgb2YgbmRpZmYtc3R5bGUgY29tcGFyaXNvbiBpcyB1c2VkIHRvIHJlcG9ydCBhbGwgZGlmZmVyZW5jZXMuCi0gIFRoaXMgaXMgbXVjaCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGFuIHRoZSBwcmV2aW91cyBzdHlsZSBvZiByZXBvcnRpbmcuCi0KLS0gVGhlIHVuaXR0ZXN0LWJhc2VkIHN0YW5kYXJkIHRlc3RzIG5vdyB1c2UgcmVncnRlc3QncyB0ZXN0X21haW4oKQotICBjb252ZW50aW9uLCBpbnN0ZWFkIG9mIHJ1bm5pbmcgYXMgYSBzaWRlLWVmZmVjdCBvZiBtZXJlbHkgYmVpbmcKLSAgaW1wb3J0ZWQuICBUaGlzIGFsbG93cyB0aGVzZSB0ZXN0cyB0byBiZSBydW4gaW4gbW9yZSBuYXR1cmFsIGFuZAotICBmbGV4aWJsZSB3YXlzIGFzIHVuaXR0ZXN0cywgb3V0c2lkZSB0aGUgcmVncnRlc3QgZnJhbWV3b3JrLgotCi0tIHJlZ3J0ZXN0LnB5IGlzIG11Y2ggYmV0dGVyIGludGVncmF0ZWQgd2l0aCB1bml0dGVzdCBhbmQgZG9jdGVzdCBub3csCi0gIGVzcGVjaWFsbHkgaW4gcmVnYXJkIHRvIHJlcG9ydGluZyBlcnJvcnMuCi0KLVdpbmRvd3MKLS0tLS0tLS0KLQotLSBMYXJnZSBmaWxlIHN1cHBvcnQgbm93IGFsc28gd29ya3MgZm9yIGZpbGVzID4gNEdCLCBvbiBmaWxlc3lzdGVtcwotICB0aGF0IHN1cHBvcnQgaXQgKE5URlMgdW5kZXIgV2luZG93cyAyMDAwKS4gIFNlZSAiV2hhdCdzIE5ldyBpbgotICBQeXRob24gMi4yYTMiIGZvciBtb3JlIGRldGFpbC4KLQotCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhMz8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0qUmVsZWFzZSBEYXRlOiAwNy1TZXAtMjAwMSoKLQotQ29yZQotLS0tLQotCi0tIENvbnZlcnNpb24gb2YgbG9uZyB0byBmbG9hdCBub3cgcmFpc2VzIE92ZXJmbG93RXJyb3IgaWYgdGhlIGxvbmcgaXMgdG9vCi0gIGJpZyB0byByZXByZXNlbnQgYXMgYSBDIGRvdWJsZS4KLQotLSBUaGUgMy1hcmd1bWVudCBidWlsdGluIHBvdygpIG5vIGxvbmdlciBhbGxvd3MgYSB0aGlyZCBub24tTm9uZSBhcmd1bWVudAotICBpZiBlaXRoZXIgb2YgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgaXMgYSBmbG9hdCwgb3IgaWYgYm90aCBhcmUgb2YKLSAgaW50ZWdlciB0eXBlcyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZSAoaW4gd2hpY2ggbGF0dGVyIGNhc2UKLSAgdGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGZsb2F0LCBzbyB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZQotICByZXN0cmljdGlvbikuCi0KLS0gVGhlIGJ1aWx0aW4gZGlyKCkgbm93IHJldHVybnMgbW9yZSBpbmZvcm1hdGlvbiwgYW5kIHNvbWV0aW1lcyBtdWNoCi0gIG1vcmUsIGdlbmVyYWxseSBuYW1pbmcgYWxsIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0LCBhbmQgYWxsIGF0dHJpYnV0ZXMKLSAgcmVhY2hhYmxlIGZyb20gdGhlIG9iamVjdCB2aWEgaXRzIGNsYXNzLCBhbmQgZnJvbSBpdHMgY2xhc3MncyBiYXNlCi0gIGNsYXNzZXMsIGFuZCBzbyBvbiBmcm9tIHRoZW0gdG9vLiAgRXhhbXBsZTogIGluIDIuMmEyLCBkaXIoW10pIHJldHVybmVkCi0gIGFuIGVtcHR5IGxpc3QuICBJbiAyLjJhMywKLQotICA+Pj4gZGlyKFtdKQotICBbJ19fYWRkX18nLCAnX19jbGFzc19fJywgJ19fY29udGFpbnNfXycsICdfX2RlbGF0dHJfXycsICdfX2RlbGl0ZW1fXycsCi0gICAnX19lcV9fJywgJ19fZ2VfXycsICdfX2dldGF0dHJfXycsICdfX2dldGl0ZW1fXycsICdfX2dldHNsaWNlX18nLAotICAgJ19fZ3RfXycsICdfX2hhc2hfXycsICdfX2lhZGRfXycsICdfX2ltdWxfXycsICdfX2luaXRfXycsICdfX2xlX18nLAotICAgJ19fbGVuX18nLCAnX19sdF9fJywgJ19fbXVsX18nLCAnX19uZV9fJywgJ19fbmV3X18nLCAnX19yZXByX18nLAotICAgJ19fcm11bF9fJywgJ19fc2V0YXR0cl9fJywgJ19fc2V0aXRlbV9fJywgJ19fc2V0c2xpY2VfXycsICdfX3N0cl9fJywKLSAgICdhcHBlbmQnLCAnY291bnQnLCAnZXh0ZW5kJywgJ2luZGV4JywgJ2luc2VydCcsICdwb3AnLCAncmVtb3ZlJywKLSAgICdyZXZlcnNlJywgJ3NvcnQnXQotCi0gIGRpcihtb2R1bGUpIGNvbnRpbnVlcyB0byByZXR1cm4gb25seSB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcywgdGhvdWdoLgotCi0tIE92ZXJmbG93aW5nIG9wZXJhdGlvbnMgb24gcGxhaW4gaW50cyBub3cgcmV0dXJuIGEgbG9uZyBpbnQgcmF0aGVyCi0gIHRoYW4gcmFpc2luZyBPdmVyZmxvd0Vycm9yLiAgVGhpcyBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgUEVQCi0gIDIzNy4gIFlvdSBjYW4gdXNlIC1XZGVmYXVsdDo6T3ZlcmZsb3dXYXJuaW5nIHRvIGVuYWJsZSBhIHdhcm5pbmcgZm9yCi0gIHRoaXMgc2l0dWF0aW9uLCBhbmQgLVdlcnJvcjo6T3ZlcmZsb3dXYXJuaW5nIHRvIHJldmVydCB0byB0aGUgb2xkCi0gIE92ZXJmbG93RXJyb3IgZXhjZXB0aW9uLgotCi0tIEEgbmV3IGNvbW1hbmQgbGluZSBvcHRpb24sIC1RPGFyZz4sIGlzIGFkZGVkIHRvIGNvbnRyb2wgcnVuLXRpbWUKLSAgd2FybmluZ3MgZm9yIHRoZSB1c2Ugb2YgY2xhc3NpYyBkaXZpc2lvbi4gIChTZWUgUEVQIDIzOC4pICBQb3NzaWJsZQotICB2YWx1ZXMgYXJlIC1Rb2xkLCAtUXdhcm4sIC1Rd2FybmFsbCwgYW5kIC1RbmV3LiAgVGhlIGRlZmF1bHQgaXMKLSAgLVFvbGQsIG1lYW5pbmcgdGhlIC8gb3BlcmF0b3IgaGFzIGl0cyBjbGFzc2ljIG1lYW5pbmcgYW5kIG5vCi0gIHdhcm5pbmdzIGFyZSBpc3N1ZWQuICBVc2luZyAtUXdhcm4gaXNzdWVzIGEgcnVuLXRpbWUgd2FybmluZyBhYm91dAotICBhbGwgdXNlcyBvZiBjbGFzc2ljIGRpdmlzaW9uIGZvciBpbnQgYW5kIGxvbmcgYXJndW1lbnRzOyAtUXdhcm5hbGwKLSAgYWxzbyB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uIGZvciBmbG9hdCBhbmQgY29tcGxleCBhcmd1bWVudHMKLSAgKGZvciB1c2Ugd2l0aCBmaXhkaXYucHkpLgotICBbTm90ZTogIHRoZSByZW1haW5kZXIgb2YgdGhpcyBpdGVtIChwcmVzZXJ2ZWQgYmVsb3cpIGJlY2FtZQotICBvYnNvbGV0ZSBpbiAyLjJjMSAtLSAtUW5ldyBoYXMgZ2xvYmFsIGVmZmVjdCBpbiAyLjJdIDo6Ci0KLSAgICBVc2luZyAtUW5ldyBpcyBxdWVzdGlvbmFibGU7IGl0IHR1cm5zIG9uIG5ldyBkaXZpc2lvbiBieSBkZWZhdWx0LCBidXQKLSAgICBvbmx5IGluIHRoZSBfX21haW5fXyBtb2R1bGUuICBZb3UgY2FuIHVzZWZ1bGx5IGNvbWJpbmUgLVF3YXJuIG9yCi0gICAgLVF3YXJuYWxsIGFuZCAtUW5ldzogdGhpcyBnaXZlcyB0aGUgX19tYWluX18gbW9kdWxlIG5ldyBkaXZpc2lvbiwgYW5kCi0gICAgd2FybnMgYWJvdXQgY2xhc3NpYyBkaXZpc2lvbiBldmVyeXdoZXJlIGVsc2UuCi0KLS0gTWFueSBidWlsdC1pbiB0eXBlcyBjYW4gbm93IGJlIHN1YmNsYXNzZWQuICBUaGlzIGFwcGxpZXMgdG8gaW50LAotICBsb25nLCBmbG9hdCwgc3RyLCB1bmljb2RlLCBhbmQgdHVwbGUuICAoVGhlIHR5cGVzIGNvbXBsZXgsIGxpc3QgYW5kCi0gIGRpY3Rpb25hcnkgY2FuIGFsc28gYmUgc3ViY2xhc3NlZDsgdGhpcyB3YXMgaW50cm9kdWNlZCBlYXJsaWVyLikKLSAgTm90ZSB0aGF0IHJlc3RyaWN0aW9ucyBhcHBseSB3aGVuIHN1YmNsYXNzaW5nIGltbXV0YWJsZSBidWlsdC1pbgotICB0eXBlczogeW91IGNhbiBvbmx5IGFmZmVjdCB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIGJ5IG92ZXJsb2FkaW5nCi0gIF9fbmV3X18uICBZb3UgY2FuIGFkZCBtdXRhYmxlIGF0dHJpYnV0ZXMsIGFuZCB0aGUgc3ViY2xhc3MgaW5zdGFuY2VzCi0gIHdpbGwgaGF2ZSBhIF9fZGljdF9fIGF0dHJpYnV0ZSwgYnV0IHlvdSBjYW5ub3QgY2hhbmdlIHRoZSAidmFsdWUiCi0gIChhcyBpbXBsZW1lbnRlZCBieSB0aGUgYmFzZSBjbGFzcykgb2YgYW4gaW1tdXRhYmxlIHN1YmNsYXNzIGluc3RhbmNlCi0gIG9uY2UgaXQgaXMgY3JlYXRlZC4KLQotLSBUaGUgZGljdGlvbmFyeSBjb25zdHJ1Y3RvciBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQsIGEKLSAgbWFwcGluZy1saWtlIG9iamVjdCwgYW5kIGluaXRpYWxpemVzIHRoZSBkaWN0aW9uYXJ5IGZyb20gaXRzCi0gIChrZXksIHZhbHVlKSBwYWlycy4KLQotLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBzdXBlciwgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGZhY2lsaXRhdGVzIG1ha2luZwotICAiY29vcGVyYXRpdmUgc3VwZXIgY2FsbHMiIGluIGEgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugc2V0dGluZy4gIEZvciBhbgotICBleHBsYW5hdGlvbiwgc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sI2Nvb3BlcmF0aW9uCi0KLS0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgcHJvcGVydHksIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBlbmFibGVzIHRoZQotICBjcmVhdGlvbiBvZiAicHJvcGVydGllcyIuICBUaGVzZSBhcmUgYXR0cmlidXRlcyBpbXBsZW1lbnRlZCBieQotICBnZXR0ZXIgYW5kIHNldHRlciBmdW5jdGlvbnMgKG9yIG9ubHkgb25lIG9mIHRoZXNlIGZvciByZWFkLW9ubHkgb3IKLSAgd3JpdGUtb25seSBhdHRyaWJ1dGVzKSwgd2l0aG91dCB0aGUgbmVlZCB0byBvdmVycmlkZSBfX2dldGF0dHJfXy4KLSAgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sI3Byb3BlcnR5Ci0KLS0gVGhlIHN5bnRheCBvZiBmbG9hdGluZy1wb2ludCBhbmQgaW1hZ2luYXJ5IGxpdGVyYWxzIGhhcyBiZWVuCi0gIGxpYmVyYWxpemVkLCB0byBhbGxvdyBsZWFkaW5nIHplcm9lcy4gIEV4YW1wbGVzIG9mIGxpdGVyYWxzIG5vdwotICBsZWdhbCB0aGF0IHdlcmUgU3ludGF4RXJyb3JzIGJlZm9yZToKLQotICAgICAgMDAuMCAgICAwZTMgICAwMTAwaiAgIDA3LjUgICAwMDAwMDAwMDAwMDAwMDAwMDAwOC4KLQotLSBBbiBvbGQgdG9rZW5pemVyIGJ1ZyBhbGxvd2VkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIHdpdGggYW4gaW5jb21wbGV0ZQotICBleHBvbmVudCwgc3VjaCBhcyAxZSBhbmQgMy4xZS0uICBTdWNoIGxpdGVyYWxzIG5vdyByYWlzZSBTeW50YXhFcnJvci4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgotICBzZXR0aW5nIGFuIG9wdGlvbiBuZWdvdGlhdGlvbiBjYWxsYmFjay4gSXQgYWxzbyBzdXBwb3J0cyBwcm9jZXNzaW5nCi0gIG9mIHN1Ym9wdGlvbnMuCi0KLS0gVGhlIG5ldyBDIHN0YW5kYXJkIG5vIGxvbmdlciByZXF1aXJlcyB0aGF0IG1hdGggbGlicmFyaWVzIHNldCBlcnJubyB0bwotICBFUkFOR0Ugb24gb3ZlcmZsb3cuICBGb3IgcGxhdGZvcm0gbGlicmFyaWVzIHRoYXQgZXhwbG9pdCB0aGlzIG5ldwotICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQotICBjaGVja2luZyBzY2hlbWUgYXR0ZW1wdHMgdG8gcmVwYWlyIHRoYXQsIGJ1dCBtYXkgbm90IGJlIHJlbGlhYmxlIG9uIGFsbAotICBwbGF0Zm9ybXMgKEMgZG9lc24ndCBzZWVtIHRvIHByb3ZpZGUgYW55dGhpbmcgYm90aCB1c2VmdWwgYW5kIHBvcnRhYmxlCi0gIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KLQotLSBBc3luY2hyb25vdXMgdGltZW91dCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgbmV3IGNsYXNzCi0gIHRocmVhZGluZy5UaW1lci4KLQotLSBtYXRoLmxvZyBhbmQgbWF0aC5sb2cxMCBub3cgcmV0dXJuIHNlbnNpYmxlIHJlc3VsdHMgZm9yIGV2ZW4gaHVnZQotICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgotCi0tIEEgbmV3IGZ1bmN0aW9uLCBpbXAubG9ja19oZWxkKCksIHJldHVybnMgMSB3aGVuIHRoZSBpbXBvcnQgbG9jayBpcwotICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCi0KLS0gcGlja2xlLCBjUGlja2xlIGFuZCBtYXJzaGFsIG9uIDMyLWJpdCBwbGF0Zm9ybXMgY2FuIG5vdyBjb3JyZWN0bHkgcmVhZAotICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCi0gIFdoZW4gcmVhZCBvbiBhIGJveCB3aGVyZSBQeXRob24gaW50cyBhcmUgNCBieXRlcywgc3VjaCB2YWx1ZXMgYXJlCi0gIGNvbnZlcnRlZCB0byBQeXRob24gbG9uZ3MuCi0KLS0gSW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSAodXNpbmcgdGhlIHJleGVjIG1vZHVsZSksIHVubWFyc2hhbGxpbmcKLSAgY29kZSBvYmplY3RzIGlzIG5vIGxvbmdlciBhbGxvd2VkLiAgVGhpcyBwbHVncyBhIHNlY3VyaXR5IGhvbGUuCi0KLS0gdW5pdHRlc3QuVGVzdFJlc3VsdCBpbnN0YW5jZXMgbm8gbG9uZ2VyIHN0b3JlIHJlZmVyZW5jZXMgdG8gdHJhY2ViYWNrcwotICBnZW5lcmF0ZWQgYnkgdGVzdCBmYWlsdXJlcy4gVGhpcyBwcmV2ZW50cyB1bmV4cGVjdGVkIGRhbmdsaW5nIHJlZmVyZW5jZXMKLSAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgotCi1Ub29scwotLS0tLS0KLQotLSBUb29scy9zY3JpcHRzL2ZpeGRpdi5weSBoYXMgYmVlbiBhZGRlZCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaXgKLSAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgotCi1CdWlsZAotLS0tLS0KLQotLSBJZiB5b3UgYXJlIGFuIGFkdmVudHVyb3VzIHBlcnNvbiB1c2luZyBNYWMgT1MgWCB5b3UgbWF5IHdhbnQgdG8gbG9vayBhdAotICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYwotICBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGV4cGVyaW1lbnRpbmcgd2l0aCBDYXJib24gb3IgQ29jb2EuCi0gIERpc2N1c3Npb24gb2YgdGhpcyBvbiBweXRob25tYWMtc2lnLCBwbGVhc2UuCi0KLUMgQVBJCi0tLS0tLQotCi0tIE5ldyBmdW5jdGlvbiBQeU9iamVjdF9EaXIob2JqKSwgbGlrZSBQeXRob24gX19idWlsdGluX18uZGlyKG9iaikuCi0KLS0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubwotICBjYWxsZXJzIGNoZWNrZWQgZm9yIGl0LiAgSXQncyBtb3JlIGxpa2VseSB0byBmYWlsIG5vdywgYmVjYXVzZSBvdmVyZmxvdwotICBlcnJvcnMgYXJlIHByb3Blcmx5IGRldGVjdGVkIG5vdy4gIFRoZSBwcm9wZXIgd2F5IHRvIGNoZWNrOjoKLQotICAgICAgZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoc29tZV9sb25nX29iamVjdCk7Ci0gICAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgLyogVGhlIGNvbnZlcnNpb24gZmFpbGVkLiAqLwotICAgICAgfQotCi0tIFRoZSBHQyBBUEkgaGFzIGJlZW4gY2hhbmdlZC4gIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhlIG9sZCBBUEkgd2lsbCBzdGlsbAotICBjb21waWxlIGJ1dCB3aWxsIG5vdCBwYXJ0aWNpcGF0ZSBpbiBHQy4gIFRvIHVwZ3JhZGUgYW4gZXh0ZW5zaW9uCi0gIG1vZHVsZToKLQotICAgIC0gcmVuYW1lIFB5X1RQRkxBR1NfR0MgdG8gUHlUUEZMQUdTX0hBVkVfR0MKLQotICAgIC0gdXNlIFB5T2JqZWN0X0dDX05ldyBvciBQeU9iamVjdF9HQ19OZXdWYXIgdG8gYWxsb2NhdGUgb2JqZWN0cyBhbmQKLSAgICAgIFB5T2JqZWN0X0dDX0RlbCB0byBkZWFsbG9jYXRlIHRoZW0KLQotICAgIC0gcmVuYW1lIFB5T2JqZWN0X0dDX0luaXQgdG8gUHlPYmplY3RfR0NfVHJhY2sgYW5kIFB5T2JqZWN0X0dDX0ZpbmkKLSAgICAgIHRvIFB5T2JqZWN0X0dDX1VuVHJhY2sKLQotICAgIC0gcmVtb3ZlIFB5R0NfSEVBRF9TSVpFIGZyb20gb2JqZWN0IHNpemUgY2FsY3VsYXRpb25zCi0KLSAgICAtIHJlbW92ZSBjYWxscyB0byBQeU9iamVjdF9BU19HQyBhbmQgUHlPYmplY3RfRlJPTV9HQwotCi0tIFR3byBuZXcgZnVuY3Rpb25zOiBQeVN0cmluZ19Gcm9tRm9ybWF0KCkgYW5kIFB5U3RyaW5nX0Zyb21Gb3JtYXRWKCkuCi0gIFRoZXNlIGNhbiBiZSB1c2VkIHNhZmVseSB0byBjb25zdHJ1Y3Qgc3RyaW5nIG9iamVjdHMgZnJvbSBhCi0gIHNwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZyAoc2ltaWxhciB0byB0aGUgZm9ybWF0IHN0cmluZyBzdXBwb3J0ZWQKLSAgYnkgUHlFcnJfRm9ybWF0KCkpLgotCi1OZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0tCi0KLS0gU3RlcGhlbiBIYW5zZW4gY29udHJpYnV0ZWQgcGF0Y2hlcyBzdWZmaWNpZW50IHRvIGdldCBhIGNsZWFuIGNvbXBpbGUKLSAgdW5kZXIgQm9ybGFuZCBDIChXaW5kb3dzKSwgYnV0IGhlIHJlcG9ydHMgcHJvYmxlbXMgcnVubmluZyBpdCBhbmQgcmFuCi0gIG91dCBvZiB0aW1lIHRvIGNvbXBsZXRlIHRoZSBwb3J0LiAgVm9sdW50ZWVycz8gIEV4cGVjdCBhIE1lbW9yeUVycm9yCi0gIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlcyBtb2R1bGU7IHRoaXMgaXMgcHJvYmFibHkgc2hhbGxvdywgYW5kCi0gIGNhdXNpbmcgbGF0ZXIgZmFpbHVyZXMgdG9vLgotCi1UZXN0cwotLS0tLS0KLQotV2luZG93cwotLS0tLS0tLQotCi0tIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW4zMiBwbGF0Zm9ybXMgYXMgd2VsbCBhcyBvbgotICBXaW42NC4gIFRoaXMgbWVhbnMgdGhhdCwgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIGYudGVsbCgpIGFuZCBmLnNlZWsoKQotICB0byBtYW5pcHVsYXRlIGZpbGVzIGxhcmdlciB0aGFuIDIgZ2lnYWJ5dGVzIChwcm92aWRlZCB5b3UgaGF2ZSBlbm91Z2gKLSAgZGlzayBzcGFjZSwgYW5kIGFyZSB1c2luZyBhIFdpbmRvd3MgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIGxhcmdlCi0gIHBhcnRpdGlvbnMpLiAgV2luZG93cyBmaWxlc3lzdGVtIGxpbWl0czogIEZBVCBoYXMgYSAyR0IgKGdpZ2FieXRlKQotICBmaWxlc2l6ZSBsaW1pdCwgYW5kIGxhcmdlIGZpbGUgc3VwcG9ydCBtYWtlcyBubyBkaWZmZXJlbmNlIHRoZXJlLgotICBGQVQzMidzIGxpbWl0IGlzIDRHQiwgYW5kIGZpbGVzID49IDJHQiBhcmUgZWFzaWVyIHRvIHVzZSBmcm9tIFB5dGhvbiBub3cuCi0gIE5URlMgaGFzIG5vIHByYWN0aWNhbCBsaW1pdCBvbiBmaWxlIHNpemUsIGFuZCBmaWxlcyBvZiBhbnkgc2l6ZSBjYW4gYmUKLSAgdXNlZCBmcm9tIFB5dGhvbiBub3cuCi0KLS0gVGhlIHc5eHBvcGVuIGhhY2sgaXMgbm93IHVzZWQgb24gV2luZG93cyBOVCBhbmQgMjAwMCB0b28gd2hlbiBDT01QU1BFQwotICBwb2ludHMgdG8gY29tbWFuZC5jb20gKHBhdGNoIGZyb20gQnJpYW4gUXVpbmxhbikuCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTI/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgRGF0ZTogMjItQXVnLTIwMDEqCi0KLUJ1aWxkCi0tLS0tLQotCi0tIFRpbSBQZXRlcnMgZGV2ZWxvcGVkIGEgYnJhbmQgbmV3IFdpbmRvd3MgaW5zdGFsbGVyIHVzaW5nIFdpc2UgOC4xLAotICBnZW5lcm91c2x5IGRvbmF0ZWQgdG8gdXMgYnkgV2lzZSBTb2x1dGlvbnMuCi0KLS0gY29uZmlndXJlIHN1cHBvcnRzIGEgbmV3IG9wdGlvbiAtLWVuYWJsZS11bmljb2RlLCB3aXRoIHRoZSB2YWx1ZXMKLSAgdWNzMiBhbmQgdWNzNCAobmV3IGluIDIuMmExKS4gV2l0aCAtLWRpc2FibGUtdW5pY29kZSwgdGhlIFVuaWNvZGUKLSAgdHlwZSBhbmQgc3VwcG9ydGluZyBjb2RlIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcnByZXRlci4KLQotLSBBIG5ldyBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLWZyYW1ld29yayBidWlsZHMgYSBNYWMgT1MgWCBmcmFtZXdvcmssCi0gIHdoaWNoICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHdpbGwgaW5zdGFsbC4gVGhpcyBwcm92aWRlcyBhIHN0YXJ0aW5nCi0gIHBvaW50IGZvciBtb3JlIG1hYy1saWtlIGZ1bmN0aW9uYWxpdHksIGpvaW4gcHl0aG9ubWFjLXNpZ0BweXRob24ub3JnCi0gIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nLgotCi0tIFRoZSBOZVhUIHBsYXRmb3JtIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0KLS0gVGhlICduZXcnIG1vZHVsZSBpcyBub3cgc3RhdGljYWxseSBsaW5rZWQuCi0KLVRvb2xzCi0tLS0tLQotCi0tIFRoZSBuZXcgVG9vbHMvc2NyaXB0cy9jbGVhbmZ1dHVyZS5weSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5Ci0gIGVkaXQgb3V0IG9ic29sZXRlIGZ1dHVyZSBzdGF0ZW1lbnRzIGZyb20gUHl0aG9uIHNvdXJjZSBjb2RlLiAgU2VlCi0gIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBkZXRhaWxzLgotCi1UZXN0cwotLS0tLS0KLQotLSByZWdydGVzdC5weSBub3cga25vd3Mgd2hpY2ggdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQgb24gc29tZQotICBwbGF0Zm9ybXMsIGFsbG93aW5nIHRvIGdpdmUgY2xlYXJlciB0ZXN0IHJlc3VsdCBvdXRwdXQuICByZWdydGVzdAotICBhbHNvIGhhcyBvcHRpb25hbCAtLXVzZS8tdSBzd2l0Y2ggdG8gcnVuIG5vcm1hbGx5IGRpc2FibGVkIHRlc3RzCi0gIHdoaWNoIHJlcXVpcmUgbmV0d29yayBhY2Nlc3Mgb3IgY29uc3VtZSBzaWduaWZpY2FudCBkaXNrIHJlc291cmNlcy4KLQotLSBTZXZlcmFsIG5ldyB0ZXN0cyBpbiB0aGUgc3RhbmRhcmQgdGVzdCBzdWl0ZSwgd2l0aCBzcGVjaWFsIHRoYW5rcyB0bwotICBOaWNrIE1hdGhld3Nvbi4KLQotQ29yZQotLS0tLQotCi0tIFRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciAvLyBoYXMgYmVlbiBhZGRlZCBhcyBvdXRsaW5lZCBpbiBQRVAKLSAgMjM4LiAgVGhlIC8gb3BlcmF0b3Igc3RpbGwgcHJvdmlkZXMgY2xhc3NpYyBkaXZpc2lvbiAoYW5kIHdpbGwgdW50aWwKLSAgUHl0aG9uIDMuMCkgdW5sZXNzICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIiBpcyBpbmNsdWRlZCwgaW4KLSAgd2hpY2ggY2FzZSB0aGUgLyBvcGVyYXRvciB3aWxsIHByb3ZpZGUgdHJ1ZSBkaXZpc2lvbi4gIFRoZSBvcGVyYXRvcgotICBtb2R1bGUgcHJvdmlkZXMgdHJ1ZWRpdigpIGFuZCBmbG9vcmRpdigpIGZ1bmN0aW9ucy4gIEF1Z21lbnRlZAotICBhc3NpZ25tZW50IHZhcmlhbnRzIGFyZSBpbmNsdWRlZCwgYXMgYXJlIHRoZSBlcXVpdmFsZW50IG92ZXJsb2FkYWJsZQotICBtZXRob2RzIGFuZCBDIEFQSSBtZXRob2RzLiAgU2VlIHRoZSBQRVAgZm9yIGEgZnVsbCBkaXNjdXNzaW9uOgotICA8aHR0cDovL3B5dGhvbi5zZi5uZXQvcGVwcy9wZXAtMDIzOC5odG1sPgotCi0tIEZ1dHVyZSBzdGF0ZW1lbnRzIGFyZSBub3cgZWZmZWN0aXZlIGluIHNpbXVsYXRlZCBpbnRlcmFjdGl2ZSBzaGVsbHMKLSAgKGxpa2UgSURMRSkuICBUaGlzIHNob3VsZCAianVzdCB3b3JrIiBieSBtYWdpYywgYnV0IHJlYWQgTWljaGFlbAotICBIdWRzb24ncyAiRnV0dXJlIHN0YXRlbWVudHMgaW4gc2ltdWxhdGVkIHNoZWxscyIgUEVQIDI2NCBmb3IgZnVsbAotICBkZXRhaWxzOiAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyNjQuaHRtbD4uCi0KLS0gVGhlIHR5cGUvY2xhc3MgdW5pZmljYXRpb24gKFBFUCAyNTItMjUzKSB3YXMgaW50ZWdyYXRlZCBpbnRvIHRoZQotICB0cnVuayBhbmQgaXMgbm90IHNvIHRlbnRhdGl2ZSBhbnkgbW9yZSAodGhlIGV4YWN0IHNwZWNpZmljYXRpb24gb2YKLSAgc29tZSBmZWF0dXJlcyBpcyBzdGlsbCB0ZW50YXRpdmUpLiAgQSBsb3Qgb2Ygd29yayBoYXMgZG9uZSBvbiBmaXhpbmcKLSAgYnVncyBhbmQgYWRkaW5nIHJvYnVzdG5lc3MgYW5kIGZlYXR1cmVzIChwZXJmb3JtYW5jZSBzdGlsbCBoYXMgdG8KLSAgY29tZSBhIGxvbmcgd2F5KS4KLQotLSBXYXJuaW5ncyBhYm91dCBhIG1pc21hdGNoIGluIHRoZSBQeXRob24gQVBJIGR1cmluZyBleHRlbnNpb24gaW1wb3J0Ci0gIG5vdyB1c2UgdGhlIFB5dGhvbiB3YXJuaW5nIGZyYW1ld29yayAod2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8KLSAgd3JpdGUgZmlsdGVycyBmb3IgdGhlc2Ugd2FybmluZ3MpLgotCi0tIEEgZnVuY3Rpb24ncyBfX2RpY3RfXyAoYWthIGZ1bmNfZGljdCkgd2lsbCBub3cgYWx3YXlzIGJlIGEKLSAgZGljdGlvbmFyeS4gIEl0IHVzZWQgdG8gYmUgcG9zc2libGUgdG8gZGVsZXRlIGl0IG9yIHNldCBpdCB0byBOb25lLAotICBidXQgbm93IGJvdGggYWN0aW9ucyByYWlzZSBUeXBlRXJyb3JzLiAgSXQgaXMgc3RpbGwgbGVnYWwgdG8gc2V0IGl0Ci0gIHRvIGEgZGljdGlvbmFyeSBvYmplY3QuICBHZXR0aW5nIGZ1bmMuX19kaWN0X18gYmVmb3JlIGFueSBhdHRyaWJ1dGVzCi0gIGhhdmUgYmVlbiBhc3NpZ25lZCBub3cgcmV0dXJucyBhbiBlbXB0eSBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgTm9uZS4KLQotLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtRSwgd2FzIGFkZGVkIHdoaWNoIGRpc2FibGVzIHRoZSB1c2Ugb2YKLSAgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcywgb3IgYXQgbGVhc3QgdGhvc2UgdGhhdCBhcmUgc3BlY2lmaWNhbGx5Ci0gIHNpZ25pZmljYW50IHRvIFB5dGhvbi4gIFVzdWFsbHkgdGhvc2UgaGF2ZSBhIG5hbWUgc3RhcnRpbmcgd2l0aAotICAiUFlUSE9OIi4gIFRoaXMgd2FzIHVzZWQgdG8gZml4IGEgcHJvYmxlbSB3aGVyZSB0aGUgdGVzdHMgZmFpbCBpZgotICB0aGUgdXNlciBoYXBwZW5zIHRvIGhhdmUgUFlUSE9OSE9NRSBvciBQWVRIT05QQVRIIHBvaW50aW5nIHRvIGFuCi0gIG9sZGVyIGRpc3RyaWJ1dGlvbi4KLQotTGlicmFyeQotLS0tLS0tLQotCi0tIE5ldyBjbGFzcyBEaWZmZXIgYW5kIG5ldyBmdW5jdGlvbnMgbmRpZmYoKSBhbmQgcmVzdG9yZSgpIGluIGRpZmZsaWIucHkuCi0gIFRoZXNlIHBhY2thZ2UgdGhlIGFsZ29yaXRobXMgdXNlZCBieSB0aGUgcG9wdWxhciBUb29scy9zY3JpcHRzL25kaWZmLnB5LAotICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgotCi0tIE5ldyBmdW5jdGlvbiB4bWwuc2F4LnNheHV0aWxzLnF1b3RlYXR0cigpOiAgUXVvdGUgYW4gWE1MIGF0dHJpYnV0ZQotICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKLSAgcmVsaWFibGUgdGhhbiB1c2luZyB4bWwuc2F4LnNheHV0aWxzLmVzY2FwZSgpIGZvciBhdHRyaWJ1dGUgdmFsdWVzLgotCi0tIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCi0KLS0gQ2FsbGluZyBvcy50ZW1wbmFtKCkgb3Igb3MudG1wbmFtKCkgZ2VuZXJhdGUgUnVudGltZVdhcm5pbmdzLgotCi0tIEFkZGVkIGZ1bmN0aW9uIHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKCkKLQotLSBBZGRlZCBLYS1QaW5nIFllZSdzIGNnaXRiLnB5IG1vZHVsZS4KLQotLSBUaGUgJ25ldycgbW9kdWxlIG5vdyBleHBvc2VzIHRoZSBDT194eHggZmxhZ3MuCi0KLS0gVGhlIGdjIG1vZHVsZSBvZmZlcnMgdGhlIGdldF9yZWZlcmVudHMgZnVuY3Rpb24uCi0KLU5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLS0KLQotQyBBUEkKLS0tLS0tCi0KLS0gVHdvIG5ldyBBUElzIFB5T1Nfc25wcmludGYoKSBhbmQgUHlPU192c25wcmludGYoKSB3ZXJlIGFkZGVkCi0gIHdoaWNoIHByb3ZpZGUgYSBjcm9zcy1wbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQotICByZWxhdGl2ZWx5IG5ldyBzbnByaW50ZigpL3ZzbnByaW50ZigpIEMgbGliIEFQSXMuIEluIGNvbnRyYXN0IHRvCi0gIHRoZSBzdGFuZGFyZCBzcHJpbnRmKCkgYW5kIHZzcHJpbnRmKCkgQyBsaWIgQVBJcywgdGhlc2UgdmVyc2lvbnMKLSAgYXBwbHkgYm91bmRzIGNoZWNraW5nIG9uIHRoZSB1c2VkIGJ1ZmZlciB3aGljaCBlbmhhbmNlcyBwcm90ZWN0aW9uCi0gIGFnYWluc3QgYnVmZmVyIG92ZXJydW5zLgotCi0tIFVuaWNvZGUgQVBJcyBub3cgdXNlIG5hbWUgbWFuZ2xpbmcgdG8gYXNzdXJlIHRoYXQgbWl4aW5nIGludGVycHJldGVycwotICBhbmQgZXh0ZW5zaW9ucyB1c2luZyBkaWZmZXJlbnQgVW5pY29kZSB3aWR0aHMgaXMgcmVuZGVyZWQgbmV4dCB0bwotICBpbXBvc3NpYmxlLiBUcnlpbmcgdG8gaW1wb3J0IGFuIGluY29tcGF0aWJsZSBVbmljb2RlLWF3YXJlIGV4dGVuc2lvbgotICB3aWxsIHJlc3VsdCBpbiBhbiBJbXBvcnRFcnJvci4gIFVuaWNvZGUgZXh0ZW5zaW9ucyB3cml0ZXJzIG11c3QgbWFrZQotICBzdXJlIHRvIGNoZWNrIHRoZSBVbmljb2RlIHdpZHRoIGNvbXBhdGliaWxpdHkgaW4gdGhlaXIgZXh0ZW5zaW9ucyBieQotICB1c2luZyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hbmdsZWQgVW5pY29kZSBBUElzIGluIHRoZSBleHRlbnNpb24uCi0KLS0gVHdvIG5ldyBmbGFncyBNRVRIX05PQVJHUyBhbmQgTUVUSF9PIGFyZSBhdmFpbGFibGUgaW4gbWV0aG9kIGRlZmluaXRpb24KLSAgdGFibGVzIHRvIHNpbXBsaWZ5IGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgd2l0aCBubyBhcmd1bWVudHMgYW5kIGEKLSAgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcgc3VjaCBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KLSAgY2FsbGluZyBjb3JyZXNwb25kaW5nIE1FVEhfVkFSQVJHUyBtZXRob2RzLiBNRVRIX09MREFSR1MgaXMgbm93Ci0gIGRlcHJlY2F0ZWQuCi0KLVdpbmRvd3MKLS0tLS0tLS0KLQotLSAiaW1wb3J0IG1vZHVsZSIgbm93IGNvbXBpbGVzIG1vZHVsZS5weXcgaWYgaXQgZXhpc3RzIGFuZCBub3RoaW5nIGVsc2UKLSAgcmVsZXZhbnQgaXMgZm91bmQuCi0KLQotV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotKlJlbGVhc2UgZGF0ZTogMTgtSnVsLTIwMDEqCi0KLUNvcmUKLS0tLS0KLQotLSBURU5UQVRJVkVMWSwgYSBsYXJnZSBhbW91bnQgb2YgY29kZSBpbXBsZW1lbnRpbmcgbXVjaCBvZiB3aGF0J3MKLSAgZGVzY3JpYmVkIGluIFBFUCAyNTIgKE1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzKSBhbmQgUEVQCi0gIDI1MyAoU3VidHlwaW5nIEJ1aWx0LWluIFR5cGVzKSB3YXMgYWRkZWQuICBUaGlzIHdpbGwgYmUgcmVsZWFzZWQKLSAgd2l0aCBQeXRob24gMi4yYTEuICBEb2N1bWVudGF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgc2VwYXJhdGVseQotICB0aHJvdWdoIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvLiAgVGhlIHB1cnBvc2Ugb2YgcmVsZWFzaW5nIHRoaXMKLSAgd2l0aCBQeXRob24gMi4yYTEgaXMgdG8gdGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0IGlzCi0gIHBvc3NpYmxlLCB0aG91Z2ggbm90IGxpa2VseSwgdGhhdCBhIGRlY2lzaW9uIGlzIG1hZGUgbm90IHRvIHJlbGVhc2UKLSAgdGhpcyBjb2RlIGFzIHBhcnQgb2YgMi4yIGZpbmFsLCBpZiBhbnkgc2VyaW91cyBiYWNrd2FyZHMKLSAgaW5jb21wYXRpYmlsaXRpZXMgYXJlIGZvdW5kIGR1cmluZyBhbHBoYSB0ZXN0aW5nIHRoYXQgY2Fubm90IGJlCi0gIHJlcGFpcmVkLgotCi0tIEdlbmVyYXRvcnMgd2VyZSBhZGRlZDsgdGhpcyBpcyBhIG5ldyB3YXkgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yIChzZWUKLSAgYmVsb3cpIHVzaW5nIHdoYXQgbG9va3MgbGlrZSBhIHNpbXBsZSBmdW5jdGlvbiBjb250YWluaW5nIG9uZSBvcgotICBtb3JlICd5aWVsZCcgc3RhdGVtZW50cy4gIFNlZSBQRVAgMjU1LiAgU2luY2UgdGhpcyBhZGRzIGEgbmV3Ci0gIGtleXdvcmQgdG8gdGhlIGxhbmd1YWdlLCB0aGlzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGJ5IGluY2x1ZGluZyBhCi0gIGZ1dHVyZSBzdGF0ZW1lbnQ6ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiIChzZWUgUEVQIDIzNikuCi0gIEdlbmVyYXRvcnMgd2lsbCBiZWNvbWUgYSBzdGFuZGFyZCBmZWF0dXJlIGluIGEgZnV0dXJlIHJlbGVhc2UKLSAgKHByb2JhYmx5IDIuMykuICBXaXRob3V0IHRoaXMgZnV0dXJlIHN0YXRlbWVudCwgJ3lpZWxkJyByZW1haW5zIGFuCi0gIG9yZGluYXJ5IGlkZW50aWZpZXIsIGJ1dCBhIHdhcm5pbmcgaXMgaXNzdWVkIGVhY2ggdGltZSBpdCBpcyB1c2VkLgotICAoVGhlc2Ugd2FybmluZ3MgY3VycmVudGx5IGRvbid0IGNvbmZvcm0gdG8gdGhlIHdhcm5pbmdzIGZyYW1ld29yayBvZgotICBQRVAgMjMwOyB3ZSBpbnRlbmQgdG8gZml4IHRoaXMgaW4gMi4yYTIuKQotCi0tIFRoZSBVVEYtMTYgY29kZWMgd2FzIG1vZGlmaWVkIHRvIGJlIG1vcmUgUkZDIGNvbXBsaWFudC4gSXQgd2lsbCBub3cKLSAgb25seSByZW1vdmUgQk9NIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgYW5kIHRoZW4KLSAgb25seSBpZiBydW5uaW5nIGluIG5hdGl2ZSBtb2RlIChVVEYtMTYtTEUgYW5kIC1CRSB3b24ndCByZW1vdmUgYQotICBsZWFkaW5nIEJNTyBjaGFyYWN0ZXIpLgotCi0tIFN0cmluZ3Mgbm93IGhhdmUgYSBuZXcgbWV0aG9kIC5kZWNvZGUoKSB0byBjb21wbGVtZW50IHRoZSBhbHJlYWR5Ci0gIGV4aXN0aW5nIC5lbmNvZGUoKSBtZXRob2QuIFRoZXNlIHR3byBtZXRob2RzIHByb3ZpZGUgZGlyZWN0IGFjY2VzcwotICB0byB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgb2YgdGhlIHJlZ2lzdGVyZWQgY29kZWNzLgotCi0gIFRvIGVuaGFuY2UgdGhlIHVzYWJpbGl0eSBvZiB0aGUgLmVuY29kZSgpIG1ldGhvZCwgdGhlIHNwZWNpYWwKLSAgY2FzaW5nIG9mIFVuaWNvZGUgb2JqZWN0IHJldHVybiB2YWx1ZXMgd2FzIGRyb3BwZWQgKFVuaWNvZGUgb2JqZWN0cwotICB3ZXJlIGF1dG8tbWFnaWNhbGx5IGNvbnZlcnRlZCB0byBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcpLgotCi0gIEJvdGggbWV0aG9kcyB3aWxsIG5vdyByZXR1cm4gd2hhdGV2ZXIgdGhlIGNvZGVjIGluIGNoYXJnZSBvZiB0aGUKLSAgcmVxdWVzdGVkIGVuY29kaW5nIHJldHVybnMgYXMgb2JqZWN0LCBlLmcuIFVuaWNvZGUgY29kZWNzIHdpbGwKLSAgcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyB3aGVuIGRlY29kaW5nIGlzIHJlcXVlc3RlZCAoIuT2/CIuZGVjb2RlKCJsYXRpbi0xIikKLSAgd2lsbCByZXR1cm4gdSLk9vwiKS4gVGhpcyBlbmFibGVzIGNvZGVjIHdyaXRlciB0byBjcmVhdGUgY29kZWNzCi0gIGZvciB2YXJpb3VzIHNpbXBsZSB0byB1c2UgY29udmVyc2lvbnMuCi0KLSAgTmV3IGNvZGVjcyB3ZXJlIGFkZGVkIHRvIGRlbW9uc3RyYXRlIHRoZXNlIG5ldyBmZWF0dXJlcyAodGhlIC5lbmNvZGUoKQotICBhbmQgLmRlY29kZSgpIGNvbHVtbnMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIG9iamVjdHMpOgotCi0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHxOYW1lICAgICB8IC5lbmNvZGUoKSB8IC5kZWNvZGUoKSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICB8Ci0gICs9PT09PT09PT0rPT09PT09PT09PT0rPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCi0gIHx1dSAgICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IFVVIGNvZGVjIChlLmcuIGZvciBlbWFpbCkgICB8Ci0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHxiYXNlNjQgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IGJhc2U2NCBjb2RlYyAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHxxdW9wcmkgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHF1b3RlZC1wcmludGFibGUgY29kZWMgICAgICB8Ci0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHx6bGliICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHpsaWIgY29tcHJlc3Npb24gICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHxoZXggICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IDItYnl0ZSBoZXggY29kZWMgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHxyb3QtMTMgICB8IHN0cmluZyAgICB8IFVuaWNvZGUgICB8IFJPVC0xMyBVbmljb2RlIGNoYXJtYXAgY29kZWN8Ci0gICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLS0gU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBub3cgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBhIGRlZmF1bHQgVW5pY29kZQotICBlbmNvZGluZyBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4gIE5vdGFibHksIFdpbmRvd3Mgc3VwcG9ydHMgJ21iY3MnCi0gIGFzIHRoZSBkZWZhdWx0LiAgVGhlIE1hY2ludG9zaCB3aWxsIGFsc28gYWRvcHQgdGhpcyBjb25jZXB0IGluIHRoZSBtZWRpdW0KLSAgdGVybSwgYWx0aG91Z2ggdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoYXQgcGxhdGZvcm0gd2lsbCBiZSBvdGhlciB0aGFuCi0gICdtYmNzJy4KLQotICBPbiBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgc3VwcG9ydCBub24tQVNDSUkgZmlsZW5hbWVzLCBpdCBpcyBjb21tb24gZm9yCi0gIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmaWxlbmFtZXMgKHN1Y2ggYXMgb3MubGlzdGRpcigpKSB0byByZXR1cm4gUHl0aG9uCi0gIHN0cmluZyBvYmplY3RzIHByZS1lbmNvZGVkIHVzaW5nIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGVuY29kaW5nIGZvcgotICB0aGUgcGxhdGZvcm0uICBBcyB0aGlzIGVuY29kaW5nIGlzIGxpa2VseSB0byBiZSBkaWZmZXJlbnQgZnJvbSBQeXRob24ncwotICBkZWZhdWx0IGVuY29kaW5nLCBjb252ZXJ0aW5nIHRoaXMgbmFtZSB0byBhIFVuaWNvZGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nCi0gIGl0IGJhY2sgdG8gdGhlIE9wZXJhdGluZyBTeXN0ZW0gd291bGQgcmVzdWx0IGluIGEgVW5pY29kZSBlcnJvciwgYXMgUHl0aG9uCi0gIHdvdWxkIGF0dGVtcHQgdG8gdXNlIGl0cyBkZWZhdWx0IGVuY29kaW5nIChnZW5lcmFsbHkgQVNDSUkpIHJhdGhlciB0aGFuCi0gIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0uCi0KLSAgSW4gZ2VuZXJhbCwgdGhpcyBjaGFuZ2Ugc2ltcGx5IHJlbW92ZXMgc3VycHJpc2VzIHdoZW4gd29ya2luZyB3aXRoCi0gIFVuaWNvZGUgYW5kIHRoZSBmaWxlIHN5c3RlbSwgbWFraW5nIHRoZXNlIG9wZXJhdGlvbnMgd29yayBhcyB5b3UgZXhwZWN0LAotICBpbmNyZWFzaW5nIHRoZSB0cmFuc3BhcmVuY3kgb2YgVW5pY29kZSBvYmplY3RzIGluIHRoaXMgY29udGV4dC4KLSAgU2VlIFs/Pz8/XSBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgZXhhbXBsZXMuCi0KLS0gRmxvYXQgKGFuZCBjb21wbGV4KSBsaXRlcmFscyBpbiBzb3VyY2UgY29kZSB3ZXJlIGV2YWx1YXRlZCB0byBmdWxsCi0gIHByZWNpc2lvbiBvbmx5IHdoZW4gcnVubmluZyBmcm9tIGEgLnB5IGZpbGU7IHRoZSBzYW1lIGNvZGUgbG9hZGVkIGZyb20gYQotICAucHljIChvciAucHlvKSBmaWxlIGNvdWxkIHN1ZmZlciBudW1lcmljIGRpZmZlcmVuY2VzIHN0YXJ0aW5nIGF0IGFib3V0IHRoZQotICAxMnRoIHNpZ25pZmljYW50IGRlY2ltYWwgZGlnaXQuICBGb3IgZXhhbXBsZSwgb24gYSBtYWNoaW5lIHdpdGggSUVFRS03NTQKLSAgZmxvYXRpbmcgYXJpdGhtZXRpYywKLQotICAgICAgeCA9IDkwMDcxOTkyNTQ3NDA5OTIuMAotICAgICAgcHJpbnQgbG9uZyh4KQotCi0gIHByaW50ZWQgOTAwNzE5OTI1NDc0MDk5MiBpZiBydW4gZGlyZWN0bHkgZnJvbSAucHksIGJ1dCA5MDA3MTk5MjU0NzQwMDAwCi0gIGlmIGZyb20gYSBjb21waWxlZCAoLnB5YyBvciAucHlvKSBmaWxlLiAgVGhpcyB3YXMgZHVlIHRvIG1hcnNoYWwgdXNpbmcKLSAgc3RyKGZsb2F0KSBpbnN0ZWFkIG9mIHJlcHIoZmxvYXQpIHdoZW4gYnVpbGRpbmcgY29kZSBvYmplY3RzLiAgbWFyc2hhbAotICBub3cgdXNlcyByZXByKGZsb2F0KSBpbnN0ZWFkLCB3aGljaCBzaG91bGQgcmVwcm9kdWNlIGZsb2F0cyB0byBmdWxsCi0gIG1hY2hpbmUgcHJlY2lzaW9uIChhc3N1bWluZyB0aGUgcGxhdGZvcm0gQyBmbG9hdDwtPnN0cmluZyBJL08gY29udmVyc2lvbgotICBmdW5jdGlvbnMgYXJlIG9mIGdvb2QgcXVhbGl0eSkuCi0KLSAgVGhpcyBtYXkgY2F1c2UgZmxvYXRpbmctcG9pbnQgcmVzdWx0cyB0byBjaGFuZ2UgaW4gc29tZSBjYXNlcywgYW5kCi0gIHVzdWFsbHkgZm9yIHRoZSBiZXR0ZXIsIGJ1dCBtYXkgYWxzbyBjYXVzZSBudW1lcmljYWxseSB1bnN0YWJsZQotICBhbGdvcml0aG1zIHRvIGJyZWFrLgotCi0tIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0cyBzdWZmZXJzIGZld2VyIGNvbGxpc2lvbnMsIHdoaWNoIGhhcyBzcGVlZAotICBiZW5lZml0cy4gIEhvd2V2ZXIsIHRoZSBvcmRlciBpbiB3aGljaCBkaWN0IGVudHJpZXMgYXBwZWFyIGluIGRpY3Qua2V5cygpLAotICBkaWN0LnZhbHVlcygpIGFuZCBkaWN0Lml0ZW1zKCkgbWF5IGRpZmZlciBmcm9tIHByZXZpb3VzIHJlbGVhc2VzIGZvciBhCi0gIGdpdmVuIGRpY3QuICBOb3RoaW5nIGlzIGRlZmluZWQgYWJvdXQgdGhpcyBvcmRlciwgc28gbm8gcHJvZ3JhbSBzaG91bGQKLSAgcmVseSBvbiBpdC4gIE5ldmVydGhlbGVzcywgaXQncyBlYXN5IHRvIHdyaXRlIHRlc3QgY2FzZXMgdGhhdCByZWx5IG9uIHRoZQotICBvcmRlciBieSBhY2NpZGVudCwgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgcHJpbnRpbmcgdGhlIHN0cigpIG9yIHJlcHIoKSBvZiBhCi0gIGRpY3QgdG8gYW4gImV4cGVjdGVkIHJlc3VsdHMiIGZpbGUuICBTZWUgTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5J3MgbmV3Ci0gIHNvcnRkaWN0KGRpY3QpIGZ1bmN0aW9uIGZvciBhIHNpbXBsZSB3YXkgdG8gZGlzcGxheSBhIGRpY3QgaW4gc29ydGVkCi0gIG9yZGVyLgotCi0tIE1hbnkgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBkaWN0cyB3ZXJlIG1hZGUsIHJlc3VsdGluZyBpbiBmYXN0ZXIKLSAgb3BlcmF0aW9uIGFsb25nIHRoZSBtb3N0IGNvbW1vbiBjb2RlIHBhdGhzLgotCi0tIERpY3Rpb25hcnkgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgImluIiBvcGVyYXRvcjogInggaW4gZGljdCIgbWVhbnMKLSAgdGhlIHNhbWUgYXMgZGljdC5oYXNfa2V5KHgpLgotCi0tIFRoZSB1cGRhdGUoKSBtZXRob2Qgb2YgZGljdGlvbmFyaWVzIG5vdyBhY2NlcHRzIGdlbmVyaWMgbWFwcGluZwotICBvYmplY3RzLiAgU3BlY2lmaWNhbGx5IHRoZSBhcmd1bWVudCBvYmplY3QgbXVzdCBzdXBwb3J0IHRoZSAua2V5cygpCi0gIGFuZCBfX2dldGl0ZW1fXygpIG1ldGhvZHMuICBUaGlzIGFsbG93cyB5b3UgdG8gc2F5LCBmb3IgZXhhbXBsZSwKLSAge30udXBkYXRlKFVzZXJEaWN0KCkpCi0KLS0gSXRlcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBnZW5lcmFsaXplZCB3YXkgb2YgcHJvdmlkaW5nIHZhbHVlcwotICB0byBhIGZvciBsb29wLiAgU2VlIFBFUCAyMzQuICBUaGVyZSdzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uIGl0ZXIoKQotICB0byByZXR1cm4gYW4gaXRlcmF0b3IuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCB0aGUgbmV4dCB2YWx1ZQotICBmcm9tIGFuIGl0ZXJhdG9yIHVzaW5nIHRoZSBuZXh0KCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZQotICB0cF9pdGVybmV4dCBzbG90IChpbiBDKS4gIFRoZXJlJ3MgYSBuZXcgcHJvdG9jb2wgdG8gZ2V0IGl0ZXJhdG9ycwotICB1c2luZyB0aGUgX19pdGVyX18oKSBtZXRob2QgKGluIFB5dGhvbikgb3IgdGhlIHRwX2l0ZXIgc2xvdCAoaW4gQykuCi0gIEl0ZXJhdGluZyAoaS5lLiBhIGZvciBsb29wKSBvdmVyIGEgZGljdGlvbmFyeSBnZW5lcmF0ZXMgaXRzIGtleXMuCi0gIEl0ZXJhdGluZyBvdmVyIGEgZmlsZSBnZW5lcmF0ZXMgaXRzIGxpbmVzLgotCi0tIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgZ2VuZXJhbGl6ZWQgdG8gd29yayBuaWNlbHkgd2l0aCBpdGVyYXRvcgotICBhcmd1bWVudHM6OgotCi0gICAgbWFwKCksIGZpbHRlcigpLCByZWR1Y2UoKSwgemlwKCkKLSAgICBsaXN0KCksIHR1cGxlKCkgKFB5U2VxdWVuY2VfVHVwbGUoKSBhbmQgUHlTZXF1ZW5jZV9GYXN0KCkgaW4gQyBBUEkpCi0gICAgbWF4KCksIG1pbigpCi0gICAgam9pbigpIG1ldGhvZCBvZiBzdHJpbmdzCi0gICAgZXh0ZW5kKCkgbWV0aG9kIG9mIGxpc3RzCi0gICAgJ3ggaW4geScgYW5kICd4IG5vdCBpbiB5JyAoUHlTZXF1ZW5jZV9Db250YWlucygpIGluIEMgQVBJKQotICAgIG9wZXJhdG9yLmNvdW50T2YoKSAoUHlTZXF1ZW5jZV9Db3VudCgpIGluIEMgQVBJKQotICAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSB0YXJnZXRzLCBzdWNoIGFzIDo6Ci0gICAgICAgIHgsIHksIHogPSBzb21lX2l0ZXJhYmxlX29iamVjdF9yZXR1cm5pbmdfZXhhY3RseV8zX3ZhbHVlcwotCi0tIEFjY2Vzc2luZyBtb2R1bGUgYXR0cmlidXRlcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZm9yIGV4YW1wbGUsCi0gIHJhbmRvbS5yYW5kb20gb3Igb3MucGF0aCBvciB5b3VyUHl0aG9uTW9kdWxlLnlvdXJBdHRyaWJ1dGUpLgotCi0tIENvbXBhcmluZyBkaWN0aW9uYXJ5IG9iamVjdHMgdmlhID09IGFuZCAhPSBpcyBmYXN0ZXIsIGFuZCBub3cgd29ya3MgZXZlbgotICBpZiB0aGUga2V5cyBhbmQgdmFsdWVzIGRvbid0IHN1cHBvcnQgY29tcGFyaXNvbnMgb3RoZXIgdGhhbiA9PS4KLQotLSBDb21wYXJpbmcgZGljdGlvbmFyaWVzIGluIHdheXMgb3RoZXIgdGhhbiA9PSBhbmQgIT0gaXMgc2xvd2VyOiAgdGhlcmUgd2VyZQotICBpbnNlY3VyaXRpZXMgaW4gdGhlIGRpY3QgY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvdWxkIGNhdXNlIFB5dGhvbgotICB0byBjcmFzaCBpZiB0aGUgZWxlbWVudCBjb21wYXJpc29uIHJvdXRpbmVzIGZvciB0aGUgZGljdCBrZXlzIGFuZC9vcgotICB2YWx1ZXMgbXV0YXRlZCB0aGUgZGljdHMuICBNYWtpbmcgdGhlIGNvZGUgYnVsbGV0cHJvb2Ygc2xvd2VkIGl0IGRvd24uCi0KLS0gQ29sbGlzaW9ucyBpbiBkaWN0cyBhcmUgcmVzb2x2ZWQgdmlhIGEgbmV3IGFwcHJvYWNoLCB3aGljaCBjYW4gaGVscAotICBkcmFtYXRpY2FsbHkgaW4gYmFkIGNhc2VzLiAgRm9yIGV4YW1wbGUsIGxvb2tpbmcgdXAgZXZlcnkga2V5IGluIGEgZGljdAotICBkIHdpdGggZC5rZXlzKCkgPT0gW2kgPDwgMTYgZm9yIGkgaW4gcmFuZ2UoMjAwMDApXSBpcyBhcHByb3hpbWF0ZWx5IDUwMHgKLSAgZmFzdGVyIG5vdy4gIFRoYW5rcyB0byBDaHJpc3RpYW4gVGlzbWVyIGZvciBwb2ludGluZyBvdXQgdGhlIGNhdXNlIGFuZAotICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KLQotLSByZXByKCkgaXMgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKGRpY3QsIGxpc3QsIHR1cGxlKS4KLQotCi1MaWJyYXJ5Ci0tLS0tLS0tCi0KLS0gVGhlIGNvbnN0YW50cyBhc2NpaV9sZXR0ZXJzLCBhc2NpaV9sb3dlcmNhc2UuIGFuZCBhc2NpaV91cHBlcmNhc2UKLSAgd2VyZSBhZGRlZCB0byB0aGUgc3RyaW5nIG1vZHVsZS4gIFRoZXNlIGEgbG9jYWxlLWluZGVwZW5kZW50Ci0gIGNvbnN0YW50cywgdW5saWtlIGxldHRlcnMsIGxvd2VyY2FzZSwgYW5kIHVwcGVyY2FzZS4gIFRoZXNlIGFyZSBub3cKLSAgdXNlIGluIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KLQotLSBUaGUgZmxhZ3MgdXNlZCBpbiBkbG9wZW4gY2FsbHMgY2FuIG5vdyBiZSBjb25maWd1cmVkIHVzaW5nCi0gIHN5cy5zZXRkbG9wZW5mbGFncyBhbmQgcXVlcmllZCB1c2luZyBzeXMuZ2V0ZGxvcGVuZmxhZ3MuCi0KLS0gRnJlZHJpayBMdW5kaCdzIHhtbHJwY2xpYiBpcyBub3cgYSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZS4gIFRoaXMKLSAgcHJvdmlkZXMgZnVsbCBjbGllbnQtc2lkZSBYTUwtUlBDIHN1cHBvcnQuICBJbiBhZGRpdGlvbiwKLSAgRGVtby94bWxycGMvIGNvbnRhaW5zIHR3byBzZXJ2ZXIgZnJhbWV3b3JrcyAob25lIFNvY2tldFNlcnZlci1iYXNlZCwKLSAgb25lIGFzeW5jb3JlLWJhc2VkKS4gIFRoYW5rcyB0byBFcmljIFJheW1vbmQgZm9yIHRoZSBkb2N1bWVudGF0aW9uLgotCi0tIFRoZSB4cmFuZ2UoKSBvYmplY3QgaXMgc2ltcGxpZmllZDogaXQgbm8gbG9uZ2VyIHN1cHBvcnRzIHNsaWNpbmcsCi0gIHJlcGV0aXRpb24sIGNvbXBhcmlzb25zLCBlZmZpY2llbnQgJ2luJyBjaGVja2luZywgdGhlIHRvbGlzdCgpCi0gIG1ldGhvZCwgb3IgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGF0dHJpYnV0ZXMuICBTZWUgUEVQIDI2MC4KLQotLSBBIG5ldyBmdW5jdGlvbiBmbm1hdGNoLmZpbHRlciB0byBmaWx0ZXIgbGlzdHMgb2YgZmlsZSBuYW1lcyB3YXMgYWRkZWQuCi0KLS0gY2FsZW5kYXIucHkgdXNlcyBtb250aCBhbmQgZGF5IG5hbWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KLQotLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAotICBhbmQgaXNzdWVzIERlcHJlY2F0aW9uV2FybmluZyB3aGVuIHVzZWQgKGV4Y2VwdCBmb3IgdGhlIGZvdXIgaXRlbXMKLSAgdGhhdCBhcmUgc3RpbGwgaW1wb3J0ZWQgaW50byBzdHJpbmcucHkpLgotCi0tIENvb2tpZS5weSBub3cgc29ydHMga2V5K3ZhbHVlIHBhaXJzIGJ5IGtleSBpbiBvdXRwdXQgc3RyaW5ncy4KLQotLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgotICBOb3cgaXQgZG9lcy4KLQotLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgotCi0tIE5ldyAncScgYW5kICdRJyBmb3JtYXQgY29kZXMgaW4gdGhlIHN0cnVjdCBtb2R1bGUsIGNvcnJlc3BvbmRpbmcgdG8gQwotICB0eXBlcyAibG9uZyBsb25nIiBhbmQgInVuc2lnbmVkIGxvbmcgbG9uZyIgKG9uIFdpbmRvd3MsIF9faW50NjQpLiAgSW4KLSAgbmF0aXZlIG1vZGUsIHRoZXNlIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gQyBjb21waWxlciBzdXBwb3J0cwotICB0aGVzZSB0eXBlcyAod2hlbiBIQVZFX0xPTkdfTE9ORyBpcyAjZGVmaW5lJ2QgYnkgdGhlIFB5dGhvbiBjb25maWcKLSAgcHJvY2VzcyksIGFuZCB0aGVuIHRoZXkgaW5oZXJpdCB0aGUgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlIEMgdHlwZXMuCi0gIEluIHN0YW5kYXJkIG1vZGUsICdxJyBhbmQgJ1EnIGFyZSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgYW5kIGFyZQotICA4LWJ5dGUgaW50ZWdyYWwgdHlwZXMuCi0KLS0gVGhlIHNpdGUgbW9kdWxlIGluc3RhbGxzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uICdoZWxwJyB0aGF0IGludm9rZXMKLSAgcHlkb2MuaGVscC4gIEl0IG11c3QgYmUgaW52b2tlZCBhcyAnaGVscCgpJzsgd2hlbiBpbnZva2VkIGFzICdoZWxwJywKLSAgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHJlbWluZGluZyB0aGUgdXNlciB0byB1c2UgJ2hlbHAoKScgb3IKLSAgJ2hlbHAob2JqZWN0KScuCi0KLVRlc3RzCi0tLS0tLQotCi0tIE5ldyB0ZXN0X211dGFudHMucHkgcnVucyBkaWN0IGNvbXBhcmlzb25zIHdoZXJlIHRoZSBrZXkgYW5kIHZhbHVlCi0gIGNvbXBhcmlzb24gb3BlcmF0b3JzIG11dGF0ZSB0aGUgZGljdHMgcmFuZG9tbHkgZHVyaW5nIGNvbXBhcmlzb24uICBUaGlzCi0gIHJhcGlkbHkgY2F1c2VzIFB5dGhvbiB0byBjcmFzaCB1bmRlciBlYXJsaWVyIHJlbGVhc2VzIChub3QgZm9yIHRoZSBmYWludAotICBvZiBoZWFydDogIGl0IGNhbiBhbHNvIGNhdXNlIFdpbjl4IHRvIGZyZWV6ZSBvciByZWJvb3QhKS4KLQotLSBOZXcgdGVzdF9wcHJpbnQucHkgdmVyaWZpZXMgdGhhdCBwcHJpbnQuaXNyZWN1cnNpdmUoKSBhbmQKLSAgcHByaW50LmlzcmVhZGFibGUoKSByZXR1cm4gc2Vuc2libGUgcmVzdWx0cy4gIEFsc28gdmVyaWZpZXMgdGhhdCBzaW1wbGUKLSAgY2FzZXMgcHJvZHVjZSBjb3JyZWN0IG91dHB1dC4KLQotQyBBUEkKLS0tLS0tCi0KLS0gUmVtb3ZlZCB0aGUgdW51c2VkIGxhc3RfaXNfc3RpY2t5IGFyZ3VtZW50IGZyb20gdGhlIGludGVybmFsCi0gIF9QeVR1cGxlX1Jlc2l6ZSgpLiAgSWYgdGhpcyBhZmZlY3RzIHlvdSwgeW91IHdlcmUgY2hlYXRpbmcuCi0KLS0tLS0KLQogKiooRm9yIGluZm9ybWF0aW9uIGFib3V0IG9sZGVyIHZlcnNpb25zLCBjb25zdWx0IHRoZSBISVNUT1JZIGZpbGUuKSoqCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IDhlN2M1MGIuLmM4Mjk4ZmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC0yLDcgKzIsNiBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAib3NkZWZzLmgiCi0jaW5jbHVkZSAiY29kZS5oIiAvKiBGb3IgQ09fRlVUVVJFX0RJVklTSU9OICovCiAjaW5jbHVkZSAiaW1wb3J0LmgiCiAKICNpZmRlZiBfX1ZNUwpAQCAtMzQsNyArMzMsNyBAQAogc3RhdGljIGludCAgb3JpZ19hcmdjOwogCiAvKiBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLwotI2RlZmluZSBCQVNFX09QVFMgImM6ZEVoaW06T1E6U3R1VXZWVzp4WCIKKyNkZWZpbmUgQkFTRV9PUFRTICJjOmRFaGltOk9TdHV2Vlc6eFgiCiAKICNpZm5kZWYgUklTQ09TCiAjZGVmaW5lIFBST0dSQU1fT1BUUyBCQVNFX09QVFMKQEAgLTY0LDcgKzYzLDYgQEAKIC1tIG1vZCA6IHJ1biBsaWJyYXJ5IG1vZHVsZSBhcyBhIHNjcmlwdCAodGVybWluYXRlcyBvcHRpb24gbGlzdClcblwKIC1PICAgICA6IG9wdGltaXplIGdlbmVyYXRlZCBieXRlY29kZSAoYSB0YWQ7IGFsc28gUFlUSE9OT1BUSU1JWkU9eClcblwKIC1PTyAgICA6IHJlbW92ZSBkb2Mtc3RyaW5ncyBpbiBhZGRpdGlvbiB0byB0aGUgLU8gb3B0aW1pemF0aW9uc1xuXAotLVEgYXJnIDogZGl2aXNpb24gb3B0aW9uczogLVFvbGQgKGRlZmF1bHQpLCAtUXdhcm4sIC1Rd2FybmFsbCwgLVFuZXdcblwKIC1TICAgICA6IGRvbid0IGltcGx5ICdpbXBvcnQgc2l0ZScgb24gaW5pdGlhbGl6YXRpb25cblwKIC10ICAgICA6IGlzc3VlIHdhcm5pbmdzIGFib3V0IGluY29uc2lzdGVudCB0YWIgdXNhZ2UgKC10dDogaXNzdWUgZXJyb3JzKVxuXAogLXUgICAgIDogdW5idWZmZXJlZCBiaW5hcnkgc3Rkb3V0IGFuZCBzdGRlcnIgKGFsc28gUFlUSE9OVU5CVUZGRVJFRD14KVxuXApAQCAtMjIwLDMzICsyMTgsNiBAQAogCQkJUHlfRGVidWdGbGFnKys7CiAJCQlicmVhazsKIAotCQljYXNlICdRJzoKLQkJCWlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAib2xkIikgPT0gMCkgewotCQkJCVB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJ3YXJuIikgPT0gMCkgewotCQkJCVB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJ3YXJuYWxsIikgPT0gMCkgewotCQkJCVB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPSAyOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0cmNtcChfUHlPU19vcHRhcmcsICJuZXciKSA9PSAwKSB7Ci0JCQkJLyogVGhpcyBvbmx5IGFmZmVjdHMgX19tYWluX18gKi8KLQkJCQljZi5jZl9mbGFncyB8PSBDT19GVVRVUkVfRElWSVNJT047Ci0JCQkJLyogQW5kIHRoaXMgdGVsbHMgdGhlIGV2YWwgbG9vcCB0byB0cmVhdAotCQkJCSAgIEJJTkFSWV9ESVZJREUgYXMgQklOQVJZX1RSVUVfRElWSURFICovCi0JCQkJX1B5X1FuZXdGbGFnID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSItUSBvcHRpb24gc2hvdWxkIGJlIGAtUW9sZCcsICIKLQkJCQkiYC1Rd2FybicsIGAtUXdhcm5hbGwnLCBvciBgLVFuZXcnIG9ubHlcbiIpOwotCQkJcmV0dXJuIHVzYWdlKDIsIGFyZ3ZbMF0pOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCiAJCWNhc2UgJ2knOgogCQkJaW5zcGVjdCsrOwogCQkJc2F3X2luc3BlY3RfZmxhZyA9IDE7CkBAIC0yODgsMTIgKzI1OSwxMCBAQAogCQkJc2tpcGZpcnN0bGluZSA9IDE7CiAJCQlicmVhazsKIAotCQljYXNlICdVJzoKLQkJCVB5X1VuaWNvZGVGbGFnKys7Ci0JCQlicmVhazsKIAkJY2FzZSAnaCc6CiAJCQloZWxwKys7CiAJCQlicmVhazsKKwogCQljYXNlICdWJzoKIAkJCXZlcnNpb24rKzsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IDM5OTY1NmYuLjA1MmUzY2EgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTIxMDYsMTIgKzIxMDYsNyBAQAogCQkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChQeUNsYXNzX0NoZWNrKGNscykgJiYgUHlJbnN0YW5jZV9DaGVjayhpbnN0KSkgewotCQlQeU9iamVjdCAqaW5jbGFzcyA9Ci0JCQkoUHlPYmplY3QqKSgoUHlJbnN0YW5jZU9iamVjdCopaW5zdCktPmluX2NsYXNzOwotCQlyZXR2YWwgPSBQeUNsYXNzX0lzU3ViY2xhc3MoaW5jbGFzcywgY2xzKTsKLQl9Ci0JZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGNscykpIHsKKwlpZiAoUHlUeXBlX0NoZWNrKGNscykpIHsKIAkJcmV0dmFsID0gUHlPYmplY3RfVHlwZUNoZWNrKGluc3QsIChQeVR5cGVPYmplY3QgKiljbHMpOwogCQlpZiAocmV0dmFsID09IDApIHsKIAkJCVB5T2JqZWN0ICpjID0gUHlPYmplY3RfR2V0QXR0cihpbnN0LCBfX2NsYXNzX18pOwpAQCAtMjE3Nyw3ICsyMTcyLDcgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKCFQeUNsYXNzX0NoZWNrKGRlcml2ZWQpIHx8ICFQeUNsYXNzX0NoZWNrKGNscykpIHsKKyAgICAgICAgewogCQlpZiAoIWNoZWNrX2NsYXNzKGRlcml2ZWQsCiAJCQkJICJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzIikpCiAJCQlyZXR1cm4gLTE7CkBAIC0yMjEyLDExICsyMjA3LDYgQEAKIAogCQlyZXR2YWwgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKGRlcml2ZWQsIGNscyk7CiAJfQotCWVsc2UgewotCQkvKiBzaG9ydGN1dCAqLwotCSAgCWlmICghKHJldHZhbCA9IChkZXJpdmVkID09IGNscykpKQotCQkJcmV0dmFsID0gUHlDbGFzc19Jc1N1YmNsYXNzKGRlcml2ZWQsIGNscyk7Ci0JfQogCiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXIuYyBiL1BhcnNlci9wYXJzZXIuYwppbmRleCBhZGE2YmUyLi4yMTM0MTBjIDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2VyLmMKKysrIGIvUGFyc2VyL3BhcnNlci5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAkJCSAgICBzdHJjbXAobC0+bGJfc3RyLCBzKSAhPSAwKQogCQkJCWNvbnRpbnVlOwogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAorICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVhdmluZyB0aGlzIGluIGFzIGFuIGV4YW1wbGUgKi8KIAkJCWlmICghKHBzLT5wX2ZsYWdzICYgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSkgewogCQkJCWlmIChzWzBdID09ICd3JyAmJiBzdHJjbXAocywgIndpdGgiKSA9PSAwKQogCQkJCQlicmVhazsgLyogbm90IGEga2V5d29yZCB5ZXQgKi8KQEAgLTE3Nyw2ICsxNzgsNyBAQAogfQogCiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECisvKiBMZWF2aW5nIHRoaXMgaW4gYXMgYW4gZXhhbXBsZSAqLwogc3RhdGljIHZvaWQKIGZ1dHVyZV9oYWNrKHBhcnNlcl9zdGF0ZSAqcHMpCiB7CmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2V0b2suYyBiL1BhcnNlci9wYXJzZXRvay5jCmluZGV4IDc3YTJjYWMuLjA3NTkwYzIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXRvay5jCisrKyBiL1BhcnNlci9wYXJzZXRvay5jCkBAIC0xOTIsNyArMTkyLDggQEAKIAkJCWNvbF9vZmZzZXQgPSAtMTsKIAkJCQogCQlpZiAoKGVycl9yZXQtPmVycm9yID0KLQkJICAgICBQeVBhcnNlcl9BZGRUb2tlbihwcywgKGludCl0eXBlLCBzdHIsIHRvay0+bGluZW5vLCBjb2xfb2Zmc2V0LAorCQkgICAgIFB5UGFyc2VyX0FkZFRva2VuKHBzLCAoaW50KXR5cGUsIHN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2stPmxpbmVubywgY29sX29mZnNldCwKIAkJCQkgICAgICAgJihlcnJfcmV0LT5leHBlY3RlZCkpKSAhPSBFX09LKSB7CiAJCQlpZiAoZXJyX3JldC0+ZXJyb3IgIT0gRV9ET05FKQogCQkJCVB5T2JqZWN0X0ZSRUUoc3RyKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggZGUyYjM1Yi4uYzg1NGZjZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTMwMjUsMTUgKzMwMjUsNyBAQAogCQlQeV9ERUNSRUYodG1wKTsKIAl9CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh0eXBlKSkgewotCQkvKiBSYWlzaW5nIGJ1aWx0aW4gc3RyaW5nIGlzIGRlcHJlY2F0ZWQgYnV0IHN0aWxsIGFsbG93ZWQgLS0KLQkJICogZG8gbm90aGluZy4gIFJhaXNpbmcgYW4gaW5zdGFuY2Ugb2YgYSBuZXctc3R5bGUgc3RyCi0JCSAqIHN1YmNsYXNzIGlzIHJpZ2h0IG91dC4gKi8KLQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJICAgInJhaXNpbmcgYSBzdHJpbmcgZXhjZXB0aW9uIGlzIGRlcHJlY2F0ZWQiKSkKLQkJCWdvdG8gcmFpc2VfZXJyb3I7Ci0JfQotCWVsc2UgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpCisJaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpCiAJCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwZSwgJnZhbHVlLCAmdGIpOwogCiAJZWxzZSBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh0eXBlKSkgewpAQCAtMzA1NCwxMCArMzA0Niw4IEBACiAJZWxzZSB7CiAJCS8qIE5vdCBzb21ldGhpbmcgeW91IGNhbiByYWlzZS4gIFlvdSBnZXQgYW4gZXhjZXB0aW9uCiAJCSAgIGFueXdheSwganVzdCBub3Qgd2hhdCB5b3Ugc3BlY2lmaWVkIDotKSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZXhjZXB0aW9ucyBtdXN0IGJlIGNsYXNzZXMsIGluc3RhbmNlcywgb3IgIgotCQkJICAgICAic3RyaW5ncyAoZGVwcmVjYXRlZCksIG5vdCAlcyIsCi0JCQkgICAgIHR5cGUtPm9iX3R5cGUtPnRwX25hbWUpOworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24iKTsKIAkJZ290byByYWlzZV9lcnJvcjsKIAl9CiAJUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdGIpOwpAQCAtNDE0OCw3ICs0MTM4LDcgQEAKIAkJaWYgKGcgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soZykpCiAJCQltZXRhY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhnLCAiX19tZXRhY2xhc3NfXyIpOwogCQlpZiAobWV0YWNsYXNzID09IE5VTEwpCi0JCQltZXRhY2xhc3MgPSAoUHlPYmplY3QgKikgJlB5Q2xhc3NfVHlwZTsKKwkJCW1ldGFjbGFzcyA9IChQeU9iamVjdCAqKSAmUHlUeXBlX1R5cGU7CiAJCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwogCX0KIAlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0YWNsYXNzLCAiT09PIiwgbmFtZSwgYmFzZXMsIG1ldGhvZHMpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvbXBpbGUuYyBiL1B5dGhvbi9jb21waWxlLmMKaW5kZXggYmFmMzk4OS4uY2ZjNmVmMSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NvbXBpbGUuYworKysgYi9QeXRob24vY29tcGlsZS5jCkBAIC0yNDY0LDExICsyNDY0LDcgQEAKIAkJaW50IHI7CiAJCVB5T2JqZWN0ICpsZXZlbDsKIAotCQlpZiAoYy0+Y19mbGFncyAmJiAoYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfQUJTSU1QT1JUKSkKLQkJCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JCWVsc2UKLQkJCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOwotCisgICAgICAgICAgICAgICAgbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygwKTsKIAkJaWYgKGxldmVsID09IE5VTEwpCiAJCQlyZXR1cm4gMDsKIApAQCAtMjUxMSwxMiArMjUwNyw3IEBACiAJaWYgKCFuYW1lcykKIAkJcmV0dXJuIDA7CiAKLQlpZiAocy0+di5JbXBvcnRGcm9tLmxldmVsID09IDAgJiYgYy0+Y19mbGFncyAmJgotCSAgICAhKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0FCU0lNUE9SVCkpCi0JCWxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOwotCWVsc2UKLQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZyhzLT52LkltcG9ydEZyb20ubGV2ZWwpOwotCisgICAgICAgIGxldmVsID0gUHlJbnRfRnJvbUxvbmcocy0+di5JbXBvcnRGcm9tLmxldmVsKTsKIAlpZiAoIWxldmVsKSB7CiAJCVB5X0RFQ1JFRihuYW1lcyk7CiAJCXJldHVybiAwOwpAQCAtMjc0NiwxMCArMjczNyw3IEBACiAJY2FzZSBNdWx0OgogCQlyZXR1cm4gQklOQVJZX01VTFRJUExZOwogCWNhc2UgRGl2OgotCQlpZiAoYy0+Y19mbGFncyAmJiBjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9ESVZJU0lPTikKLQkJCXJldHVybiBCSU5BUllfVFJVRV9ESVZJREU7Ci0JCWVsc2UKLQkJCXJldHVybiBCSU5BUllfRElWSURFOworCQlyZXR1cm4gQklOQVJZX1RSVUVfRElWSURFOwogCWNhc2UgTW9kOgogCQlyZXR1cm4gQklOQVJZX01PRFVMTzsKIAljYXNlIFBvdzoKQEAgLTI4MDksMTAgKzI3OTcsNyBAQAogCWNhc2UgTXVsdDoKIAkJcmV0dXJuIElOUExBQ0VfTVVMVElQTFk7CiAJY2FzZSBEaXY6Ci0JCWlmIChjLT5jX2ZsYWdzICYmIGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0RJVklTSU9OKQotCQkJcmV0dXJuIElOUExBQ0VfVFJVRV9ESVZJREU7Ci0JCWVsc2UKLQkJCXJldHVybiBJTlBMQUNFX0RJVklERTsKKwkJcmV0dXJuIElOUExBQ0VfVFJVRV9ESVZJREU7CiAJY2FzZSBNb2Q6CiAJCXJldHVybiBJTlBMQUNFX01PRFVMTzsKIAljYXNlIFBvdzoKZGlmZiAtLWdpdCBhL1B5dGhvbi9lcnJvcnMuYyBiL1B5dGhvbi9lcnJvcnMuYwppbmRleCA3ZmM0Yzk3Li5hNjQ5MDBiIDEwMDY0NAotLS0gYS9QeXRob24vZXJyb3JzLmMKKysrIGIvUHl0aG9uL2Vycm9ycy5jCkBAIC01NTcsNyArNTU3LDggQEAKIAliYXNlcyA9IFB5VHVwbGVfUGFjaygxLCBiYXNlKTsKIAlpZiAoYmFzZXMgPT0gTlVMTCkKIAkJZ290byBmYWlsdXJlOwotCXJlc3VsdCA9IFB5Q2xhc3NfTmV3KGJhc2VzLCBkaWN0LCBjbGFzc25hbWUpOworCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikgKGJhc2UtPm9iX3R5cGUpLAorCQkJCSAgICAgICAiT09PIiwgY2xhc3NuYW1lLCBiYXNlcywgZGljdCk7CiAgIGZhaWx1cmU6CiAJUHlfWERFQ1JFRihiYXNlcyk7CiAJUHlfWERFQ1JFRihteWRpY3QpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Z1dHVyZS5jIGIvUHl0aG9uL2Z1dHVyZS5jCmluZGV4IDRhNDhiYTUuLjE5MDJmMWQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mdXR1cmUuYworKysgYi9QeXRob24vZnV0dXJlLmMKQEAgLTI4LDExICsyOCwxMSBAQAogCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfR0VORVJBVE9SUykgPT0gMCkgewogCQkJY29udGludWU7CiAJCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9ESVZJU0lPTikgPT0gMCkgewotCQkJZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9ESVZJU0lPTjsKKwkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfQUJTSU1QT1JUKSA9PSAwKSB7Ci0JCQlmZi0+ZmZfZmVhdHVyZXMgfD0gQ09fRlVUVVJFX0FCU0lNUE9SVDsKKwkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfV0lUSF9TVEFURU1FTlQpID09IDApIHsKLQkJCWZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ7CisJCQljb250aW51ZTsKIAkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgImJyYWNlcyIpID09IDApIHsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKIAkJCQkJIm5vdCBhIGNoYW5jZSIpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldGFyZ3MuYyBiL1B5dGhvbi9nZXRhcmdzLmMKaW5kZXggOGVlN2QyZi4uZmFjMGI2ZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldGFyZ3MuYworKysgYi9QeXRob24vZ2V0YXJncy5jCkBAIC00ODYsMTUgKzQ4NiwxNiBAQAogCiAjZGVmaW5lIENPTlZfVU5JQ09ERSAiKHVuaWNvZGUgY29udmVyc2lvbiBlcnJvcikiCiAKLS8qIGV4cGxpY2l0bHkgY2hlY2sgZm9yIGZsb2F0IGFyZ3VtZW50cyB3aGVuIGludGVnZXJzIGFyZSBleHBlY3RlZC4gIEZvciBub3cKLSAqIHNpZ25hbCBhIHdhcm5pbmcuICBSZXR1cm5zIHRydWUgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQuICovCisvKiBFeHBsaWNpdGx5IGNoZWNrIGZvciBmbG9hdCBhcmd1bWVudHMgd2hlbiBpbnRlZ2VycyBhcmUgZXhwZWN0ZWQuCisgICBSZXR1cm4gMSBmb3IgZXJyb3IsIDAgaWYgb2suICovCiBzdGF0aWMgaW50CiBmbG9hdF9hcmd1bWVudF9lcnJvcihQeU9iamVjdCAqYXJnKQogewotCWlmIChQeUZsb2F0X0NoZWNrKGFyZykgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiApKQorCWlmIChQeUZsb2F0X0NoZWNrKGFyZykpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKwkJCQkiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiApOwogCQlyZXR1cm4gMTsKKwl9CiAJZWxzZQogCQlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9ncmFtaW5pdC5jIGIvUHl0aG9uL2dyYW1pbml0LmMKaW5kZXggMTg1M2NhNC4uNDBmMTc3MCAxMDA2NDQKLS0tIGEvUHl0aG9uL2dyYW1pbml0LmMKKysrIGIvUHl0aG9uL2dyYW1pbml0LmMKQEAgLTU1Niw5ICs1NTYsOCBAQAogc3RhdGljIGFyYyBhcmNzXzI3XzBbMV0gPSB7CiAJezE5LCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjdfMVszXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18yN18xWzJdID0gewogCXs3OCwgMn0sCi0JezE5LCAyfSwKIAl7MCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzI3XzJbMV0gPSB7CkBAIC01NjksMTYgKzU2OCwxNSBAQAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfMjdbNF0gPSB7CiAJezEsIGFyY3NfMjdfMH0sCi0JezMsIGFyY3NfMjdfMX0sCisJezIsIGFyY3NfMjdfMX0sCiAJezEsIGFyY3NfMjdfMn0sCiAJezEsIGFyY3NfMjdfM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzI4XzBbMV0gPSB7CiAJezEyLCAxfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMjhfMVszXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18yOF8xWzJdID0gewogCXs3OCwgMn0sCi0JezE5LCAyfSwKIAl7MCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzI4XzJbMV0gPSB7CkBAIC01ODksNyArNTg3LDcgQEAKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzI4WzRdID0gewogCXsxLCBhcmNzXzI4XzB9LAotCXszLCBhcmNzXzI4XzF9LAorCXsyLCBhcmNzXzI4XzF9LAogCXsxLCBhcmNzXzI4XzJ9LAogCXsxLCBhcmNzXzI4XzN9LAogfTsKQEAgLTkxNyw5ICs5MTUsOCBAQAogCXsxLCBhcmNzXzQwXzR9LAogCXsxLCBhcmNzXzQwXzV9LAogfTsKLXN0YXRpYyBhcmMgYXJjc180MV8wWzJdID0geworc3RhdGljIGFyYyBhcmNzXzQxXzBbMV0gPSB7CiAJezc4LCAxfSwKLQl7MTksIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180MV8xWzFdID0gewogCXs4MiwgMn0sCkBAIC05MjgsNyArOTI1LDcgQEAKIAl7MCwgMn0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc180MVszXSA9IHsKLQl7MiwgYXJjc180MV8wfSwKKwl7MSwgYXJjc180MV8wfSwKIAl7MSwgYXJjc180MV8xfSwKIAl7MSwgYXJjc180MV8yfSwKIH07CkBAIC0xODcwLDcgKzE4NjcsNyBAQAogCXsyOTYsICJ3aXRoX3N0bXQiLCAwLCA2LCBzdGF0ZXNfNDAsCiAJICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDEwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKIAl7Mjk3LCAid2l0aF92YXIiLCAwLCAzLCBzdGF0ZXNfNDEsCi0JICJcMDAwXDAwMFwwMTBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMTAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKKwkgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwxMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogCXsyOTgsICJleGNlcHRfY2xhdXNlIiwgMCwgNSwgc3RhdGVzXzQyLAogCSAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDA0MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAJezI5OSwgInN1aXRlIiwgMCwgNSwgc3RhdGVzXzQzLApkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydC5jIGIvUHl0aG9uL2ltcG9ydC5jCmluZGV4IDczMDUxYTIuLmI2NDU5NGQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnQuYworKysgYi9QeXRob24vaW1wb3J0LmMKQEAgLTI4LDcgKzI4LDcgQEAKICAgIGEgLnB5YyBmaWxlIGluIHRleHQgbW9kZSB0aGUgbWFnaWMgbnVtYmVyIHdpbGwgYmUgd3Jvbmc7IGFsc28sIHRoZQogICAgQXBwbGUgTVBXIGNvbXBpbGVyIHN3YXBzIHRoZWlyIHZhbHVlcywgYm90Y2hpbmcgc3RyaW5nIGNvbnN0YW50cy4KIAotICAgVGhlIG1hZ2ljIG51bWJlcnMgbXVzdCBiZSBzcGFjZWQgYXBhcnQgYXRsZWFzdCAyIHZhbHVlcywgYXMgdGhlCisgICBUaGUgbWFnaWMgbnVtYmVycyBtdXN0IGJlIHNwYWNlZCBhcGFydCBhdCBsZWFzdCAyIHZhbHVlcywgYXMgdGhlCiAgICAtVSBpbnRlcnBldGVyIGZsYWcgd2lsbCBjYXVzZSBNQUdJQysxIGJlaW5nIHVzZWQuIFRoZXkgaGF2ZSBiZWVuCiAgICBvZGQgbnVtYmVycyBmb3Igc29tZSB0aW1lIG5vdy4KIApAQCAtNTYsOSArNTYsMTAgQEAKICAgICAgICBQeXRob24gMi41YTA6IDYyMDgxIChhc3QtYnJhbmNoKQogICAgICAgIFB5dGhvbiAyLjVhMDogNjIwOTEgKHdpdGgpCiAgICAgICAgUHl0aG9uIDIuNWEwOiA2MjA5MiAoY2hhbmdlZCBXSVRIX0NMRUFOVVAgb3Bjb2RlKQorICAgICAgIFB5dGhvbiAzMDAwOiAgIDMwMDAKIC4KICovCi0jZGVmaW5lIE1BR0lDICg2MjA5MiB8ICgobG9uZyknXHInPDwxNikgfCAoKGxvbmcpJ1xuJzw8MjQpKQorI2RlZmluZSBNQUdJQyAoMzAwMCB8ICgobG9uZyknXHInPDwxNikgfCAoKGxvbmcpJ1xuJzw8MjQpKQogCiAvKiBNYWdpYyB3b3JkIGFzIGdsb2JhbDsgbm90ZSB0aGF0IF9QeUltcG9ydF9Jbml0KCkgY2FuIGNoYW5nZSB0aGUKICAgIHZhbHVlIG9mIHRoaXMgZ2xvYmFsIHRvIGFjY29tbW9kYXRlIGZvciBhbHRlcmF0aW9ucyBvZiBob3cgdGhlCmRpZmYgLS1naXQgYS9QeXRob24vcHl0aG9ucnVuLmMgYi9QeXRob24vcHl0aG9ucnVuLmMKaW5kZXggN2IxZjI2NC4uZDA0ZDExMSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGhvbnJ1bi5jCisrKyBiL1B5dGhvbi9weXRob25ydW4uYwpAQCAtNjk2LDkgKzY5Niw3IEBACiAvKiBjb21wdXRlIHBhcnNlciBmbGFncyBiYXNlZCBvbiBjb21waWxlciBmbGFncyAqLwogI2RlZmluZSBQQVJTRVJfRkxBR1MoZmxhZ3MpIFwKIAkoKGZsYWdzKSA/ICgoKChmbGFncyktPmNmX2ZsYWdzICYgUHlDRl9ET05UX0lNUExZX0RFREVOVCkgPyBcCi0JCSAgICAgIFB5UEFSU0VfRE9OVF9JTVBMWV9ERURFTlQgOiAwKSBcCi0JCSAgICB8ICgoZmxhZ3MpLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVCA/IFwKLQkJICAgICAgIFB5UEFSU0VfV0lUSF9JU19LRVlXT1JEIDogMCkpIDogMCkKKwkJICAgICAgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCA6IDApKSA6IDApCiAKIGludAogUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggY2NlNjBmYS4uNzBjYjI2ZCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKLVRoaXMgaXMgUHl0aG9uIHZlcnNpb24gMi41IGFscGhhIDAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgaXMgUHl0aG9uIDMwMDAgLS0gdW52ZXJzaW9uZWQgKGJyYW5jaGVkIG9mZiAyLjUgcHJlIGFscGhhIDEpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiBBbGwgcmlnaHRzIHJlc2VydmVkLgo=