Q1ZTLVZlcnNpb246ICRJZDogQ2hhbmdlTG9nLHYgMS4xOCAyMDA0LzA0LzA5IDIyOjA4OjE5IHdlaWdvbiBFeHAgJAoKKiogTk9URSAqKgoKVGhpcyBmaWxlIGlzIGFib25kZW5kIGluIGZhdm91ciBvZiB0aGUgTkVXUyBmaWxlCgoqKiBOT1RFICoqCgoKMTUuMDYuMjAwNSAyMDoxMCAtIDEuMy4xNQotIG1vZF9jbWwsIG1vZF90cmlnZ2VyX2I0X2RsCgogIGFkZGVkIGJvdGggcGx1Z2lucwoKICBjaGVjayBodHRwOi8vdHJhYy5saWdodHRwZC5uZXQvdHJhYy9sb2cvYnJhbmNoZXMvbGlnaHR0cGQtMS4zLngvIGZvciB0aGUKICByZXN0CgoxNS4wNi4yMDA1IDEzOjU5IC0gMS4zLjE0Ci0gZG9jdW1lbnRhdGlvbgoKICBtb3JlIGZpeC11cHMgZm9yIG1vZF9mYXN0Y2dpLCBjb25maWd1cmF0aW9uIGFuZCBteXNxbC12aG9zdAoKLSB0ZXN0cwoKICB1bmlmaWVkIHRlc3Qtc2NyaXB0cyB0byB1c2UgdGhlIHNhbWUgZnJhbWV3b3JrCgoxNC4wNi4yMDA1IDIzOjM4Ci0gZG9jdW1lbnRhdGlvbgoKICB1cGRhdGVkIGRvY3MgZm9yIG1vZF9wcm94eSBhbmQgbW9kX3NjZ2kKCjEyLjA2LjIwMDUgMTI6NTUgLSBwcmUtcmVsZWFzZQotIG1vZF9mYXN0Y2dpCgogIGZpeGVkIGV2ZW50IGhhbmRsaW5nIGFmdGVyIGRlbGF5ZWQgY29ubmVjdAoKICBtYWtlIHJldHJ5IHRpbWVvdXQgY29uZmlndXJhYmxlCgogIHJlbW92ZWQgdW51c2VkIGV2ZW50cyBpZiB3ZSBzd2l0Y2ggdG8gRkNHSV9TVEFURV9SRUFECgogIGRpc2FibGVkIGFkYXB0aXZlIHNwYXduaW5nCgotIG1vZF9wcm94eQoKICBhZGRlZCBoYXNoLWJhc2VkIGFuZCByb3VuZC1yb2JpbiBiYWxhbmNpbmcKCiAgdXNlIHBvcnQgODAgaXMgZGVmYXVsdAoKICBmaXhlZCBlcnJvcmhhbmRsaW5nIG9uIGNvbm5lY3Rpb24gcmVmdXNlZAoKICBmaXhlZCB1c2FnZSBvZiBkZWFkIGhvc3RzIFsyODVdCgotIG1vZF9jZ2kKCiAgc2VuZCA1MDAgaWYgdGhlIENHSSBkaWVkIGJlZm9yZSB3ZSByZWNlaXZlZCBhbnkgZGF0YQoKICByZWRpcmVjdCB0aGUgc3RkZXJyIG9mIENHSSB0byBvdXIgZXJyb3Jsb2cKCiAgY2xlYW51cCBjZ2ktZW52IGFmdGVyIHdlIGZpbmlzaGVkIG91ciByZXF1ZXN0CgotIHVyaS1oYW5kbGluZwoKICBkb24ndCByZXBsYWNlICsgdG8gc3BhY2UgYmVmb3JlIHRoZSA/cXVlcnkgcGFydAoKICBhY2NlcHQgY2hhcmFjdGVycyA+IDEyNyBhZ2FpbgoKLSBtb2RfYXV0aAoKICBmaXhlZCBzZWdmYXVsdCBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCBbMzcxXQoKLSBtb2Rfc2NnaQoKICBhZGRlZCBTQ0dJIHN1cHBvcnQgZm9yIHB5dGhvbiArIFdTR0kgWzM4MV0sIFszODJdCgotIG1vZF9zZXRlbnYKCiAgZml4ZWQgY29uZGl0aW9uYWxzIGZvciBzZXRlbnYuYWRkLWVudmlyb25tZW50IFsxMDldCgotIGdlbmVyaWMKCiAgcmVwb3J0IGFuIGVycm9yIG9uIGR1cGxpY2F0ZSBjb25maWcta2V5cyBpbiBjb25maWdmaWxlIFsyNjddCgogIGNhbGwgaW5pdGdyb3VwcyB0byBqb2luIHRoZSBncm91cHMgb2YgdGhlIHVzZXJzIFsyMzldCgogIGZpeGVkIGF1dG9tYXRpYyByZWRpcmVjdHMgaWYgU1NMIGlzIHVzZWQKCiAgZml4ZWQgY29tcGlsYXRpb24gb24gU29sYXJpcyBbMjgzXQoKICBkaXNhYmxlIGFjY2VwdC1maWx0ZXJpbmcgb24gRnJlZUJTRCBpZiBzc2wgaXMgdXNlZCBbMzIwXQoKICBmaXhlZCBoYW5kbGluZyBvZiByYW5nZS1yZXF1ZXN0IGxhcmdlciB0aGFuIDJHYgoKICBmaXhlZCBjb21wYXJpc2lvbnMgb2YgbWltZS10eXBlcyB0byBjYXNlLWluc2Vuc2l0aXZlIFsyNjZdCgogIGFkZGVkIHF1b3RhdGlvbiBvZiBFVGFncyBbMzc2XSwgWzM3OF0KCjA2LjAzLjIwMDUgMTI6MjIgLSAxLjMuMTMKLSBtb2RfYWNjZXNzbG9nCgogIGZpeGVkIE5VTEwgZGVyZWZlcmVuY2Ugb24gbG9nZmlsZSBjeWNsaW5nIGlmIGFjY2Vzc2xvZyBpcyBub3Qgc2V0CgowNS4wMy4yMDA1IDE3OjMwCi0gbW9kX3Byb3h5CgogIGhhbmRsZSBkZWxheWVkIGNvbm5lY3QgaW4gdGhlIHNhbWUgd2F5IGFzIG1vZF9mYXN0Y2dpCgowMy4wMy4yMDA1IDE5OjAwCi0gZnJlZWJzZAoKICBoYW5kbGUgcmVtb3RlLWNsb3NlIGdyYWNlZnVsbHkKCi0gc3NsCgogIGhhbmRsZSByZW1vdGUtY2xvc2UgZ3JhY2VmdWxseQoKLSBkaXItbGlzdGluZwoKICBhZGRlZCBkaXItbGlzdGluZy5oaWRlLWRvdGZpbGVzIGFuZCBhZGRlZCBhbiBvcHRpb24gdG8gc2V0IGNzcyBmaWxlcwoKMDIuMDMuMjAwNSAxOTo0MQotIGZhc3RjZ2kKCiAgZml4ZWQgcGF0aC1pbmZvIGZvciBwcmVmaXgtcGF0dGVybnMKCiAgZml4ZWQgcGF0aC1pbmZvIGZvciBQSFAKCjAyLjAzLjIwMDUgMTQ6NDcgLSAxLjMuMTIKLSBtb2RfZmFzdGNnaQoKICBmaXhlZCBoYW5kbGluZyBvZiBkZWFkIGZhc3RjZ2kgcHJvY2VzcyB3aGljaCBzZW50IHRoZWlyIFNJR0NMRCB0bwogIGluaXRkIGFuZCBub3QgdG8gbGlnaHR0cGQuIE1vdmluZyB0aGUgZGFlbW9uaXplIGJlZm9yZSBzdGFydGluZwogIHRoZSBmYXN0Y2dpIHByb2NzIGZpeGVzIHRoaXMuCgowMS4wMy4yMDA1IDIzOjU5Ci0gaXJpeAoKICBmaXhlZCBtaW5vciBjb21waWxlIGlzc3VlcyB3aXRoIE1JUFNwcm8KCjAxLjAzLjIwMDUgMTE6NTcKLSByZXF1ZXN0LWhhbmRsaW5nCgogIGhhbmRsZSBtb3N0IGR1cGxpY2F0ZSBoZWFkZXJzIGFzIDQwMCwgQnVnICMyNQoKLSBtb2RfZmFzdGNnaQoKICBhZGRlZCBtb3JlIGNoZWNrcwoKMjguMDIuMjAwNSAxODoyNgotIG1vZF9leHBpcmUKCiAgZG9uJ3QgaWdub3JlICdtb2RpZmljYXRpb24nIGFueSBtb3JlLCBCdWcgIzM5CiAgb25seSBoYW5kbGVzIHN0YXRpYyBmaWxlcwoKLSBsYXN0LW1vZGlmaWVkCgogIHJlYWxseSBjb21wYXJlIHRpbWVzdGFtcHMsIEJ1ZyAjMzQKCjI4LjAyLjIwMDUgMTE6NTQKLSBidWZmZXIKCiAgcmV3cm90ZSBpbnQyYnVmZmVyIGZ1bmN0aW9ucwoKICBzaW1wbGlmaWVkIHBhdGhfc2ltcGxpZnkKCi0gcGlkLWZpbGUKCiAgaWdub3JlIEVBQ0NFU1Mgb24gdW5saW5rCgoyOC4wMi4yMDA1IDEwOjM1Ci0gbW9kX2Zhc3RjZ2kKCiAgYWNjZXB0IFxuXG4sIEJ1ZyAjMzIKCi0gY3lnd2luCgogIG1vdmVkIGZ1bmN0aW9ucyB1c2VkIGJ5IHBsdWdpbiBhbmQgbWFpbi1wcm9ncmFtIHRvICotZ2x1ZS5jCgotIGxlbW9uCgogIHJlbW92ZWQgd2FybmluZ3MgYWJvdXQgc2hhZG93ZWQgdmFyaWFibGVzCgoyOC4wMi4yMDA1IDAxOjAwCi0gc3NsCgogIGFkZGVkIHNzbC5jYS1maWxlLCBCdWcgIzE5CgogIGltcHJvdmVkIGVycm9yLW1lc3NhZ2VzCgoyNy4wMi4yMDA1IDIzOjQ4Ci0gdGVzdCBjYXNlcwoKICByZXdyb3RlIHRvIHRlc3QtZnJhbWV3b3JrIHRvIHVzZSBQZXJsICsgVGVzdDo6TW9yZQogIHBvcnRlZCBtb3JlIHRlc3QtY2FzZXMKCjIyLjAyLjIwMDUgMDE6MjAKLSBtb2RfZmFzdGNnaQoKICByZXBsYWNlZCBpbmV0X2FkZHIgYnkgaW5ldF9hdG9uCgotIHJlcXVlc3QtaGFuZGxpbmcKCiAgZml4ZWQgc2VnZmF1bHQgaWYgaG9zdCBpcyBlbXB0eQoKMjAuMDIuMjAwNSAyMDowNQotIGNnaQoKICBmaXhlZCBjZ2kuYXNzaWduIGZvciBlbXB0eSBoYW5kbGVycyBhZ2FpbgoKMjAuMDIuMjAwNSAxNjo1NCAtIDEuMy4xMQotIHJlcXVlc3QgaGFuZGxpbmcKCiAgaWdub3JlIFxyXG4gYmVmb3JlIHJlcXVlc3QtbGluZSBpbiBrZWVwLWFsaXZlIHJlcXVlc3RzIChCdWcgIzEzKQoKLSBjZ2ksIGZhc3RjZ2kKCiAgYWRkZWQgUkVNT1RFX1BPUlQgYW5kIFNFUlZFUl9BRERSCgogIGZpeGVkIGNoZWNrIGZvciBicm9rZW4gc3RhdHVzLWNvZGUgaW4gbnBoLXNjcmlwdHMgKEJ1ZyAjMTQpCgotIGZhc3RjZ2kKCiAgZml4ZWQgcGFzc2luZyBjbWRsaW5lIG9wdGlvbnMgdGhlIHNwYXduZWQgYmluYXJ5IChCdWcgIzE2KQoKICBmaXhlZCBmYWlsZWQgcmVjb25uZWN0cyAoQnVnICM5KQoKLSBtYWNvcyB4CgogIGZpeGVkIGJ1aWxkIG9uIG1heAoKLSBtb2Rfc2VjZG93bmxvYWQKCiAgcGFyc2UgY29uZGl0aW9uYWwgc2VjdXJlLWRvd25sb2FkLnNlY3JldCAoQnVnICM4KQoKLSBtb2RfdXNlcmRpcgoKICByZWRpcmVjdCBpZiB1c2VybmFtZSBpcyBub3QgZm9sbG93ZWQgYnkgLyAoQnVnICMxNSkKCjEzLjAyLjIwMDUgMTc6MzMKLSBtb2RfYXV0aAoKICBmaXggY3Jhc2ggaWYgcmVxdWlyZSwgcmVhbG0gb3IgbWV0aG9kIGFyZSBlbXB0eSAoQnVnICM1KQoKMTMuMDIuMjAwNSAxNDo1MgotIG5ldHdvcmsKCiAgaGFuZGxlIEVQSVBFIGFuZCBFQ09OTlJFU0VUIGFzICdjbGllbnQgaGFzIGNsb3NlZCBjb25uZWN0aW9uJyBpbiB3cml0ZXYoKQogIChCdWcgIzEpCgotIG1hY29zeAoKICBjb21waWxlIGVycm9yIG9uIE1hY09TIFggZHVlIHRvIG1pc3NpbmcgZW52aXJvbiAocGF0Y2ggYnkgSm9oYW4gU/ZyZW5zZW4pCiAgKEJ1ZyAjMikKCi0gaW5kZXhmaWxlcwoKICBhcHBlbmQgdGhlIGRldGVjdGVkIGluZGV4ZmlsZSBvbmx5IG9uY2UgdG8gdXJpLnBhdGggKHJlcG9ydGVkIGJ5IFRob21hcwogIFNlaWZlcnQpCiAgKEJ1ZyAjMykKCjA2LjAyLjIwMDUgMTU6MTYgLSAxLjMuMTAKLSBmYXN0Y2dpCgogIGRpc3BsYXkgYSBlcnJvci1tZXNzYWdlIGlmIGEgaG9zdG5hbWUgaWYgc3BlY2lmaWVkIGluIGZhc3RjZ2kuc2VydmVyLT5ob3N0CiAgd2UgbmVlZCBhbiBJUCBoZXJlCgotIGRlYnVnCgogIGFkZGVkIGRlYnVnLmxvZy1zdGF0ZS1oYW5kbGluZwoKLSBzcGF3bi1mY2dpCgogIGFjY2VwdCBhIGZ1bGwgY29tbWFuZGxpbmUgZm9yIHNwYXduaW5nCgowNi4wMi4yMDA1IDEyOjUwCi0gZmFzdGNnaQoKICBmaXhlZCBvcGVuc3NsIGhhbmRsaW5nCgotIG5ldHdvcmtfZnJlZWJzZF9zZW5kZmlsZXYKCiAgZ3JhY2VmdWxsIGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zIGNsb3NlZCBvbiBjbGllbnQtc2lkZQogIHJlbW92ZWQgZGVidWctbWVzc2FnZQoKMDYuMDIuMjAwNSAwMTo0NCAtIDEuMy45Ci0gZG9jdW1lbnRhdGlvbgoKICBhZGRlZCBkb2NzIGZvciBTU0wgc2V0dXAgYW5kIG1vZF9zdGF0dXMKCi0gZmFzdGNnaQoKICBmaXhlZCBjb25maWcgaGFuZGxpbmcgb24gUG93ZXJQQyBmb3IgbG9jYWwtc3Bhd25pbmcKCjA1LjAyLjIwMDUgMTU6MTQKLSBmYXN0Y2dpCgogIGFkZGVkIGJpbi1lbnZpcm9ubWVudCB0byBzZXR1cCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHNwYXduZWQgcHJvY2VzcwoKICBhZGRlZCBiaW4tY29weS1lbnZpcm9ubWVudCB0byBjb3B5IG9ubHkgdGhlIHNwZWNpZmllZCBzZXQgb2Ygb3B0aW9ucwogIGZyb20gdGhlIG9sZCBlbnZpcm9ubWVudAoKICBhZGRlZCBoYW5kbGluZyBvZiBjbWQtbGluZSBvcHRpb25zIHRvIGJpbi1wYXRoCgotIHNldGVudgoKICBmaXhlZCBjcmFzaGVkIGluIHNldGVudi5hZGQtcmVzcG9uc2UtaGVhZGVyCgowNC4wMi4yMDA1IDE4OjA5Ci0gY29uZmlndXJlCgogIGZpeGVkIGRvY3MgZm9yIC0td2l0aC1teXNxbAoKLSBmYXN0Y2dpCgogIGltcHJvdmVkIHBlcmZvcm1hbmNlIG9mIGJ1aWxkaW5nIHRoZSBoZWFkZXIgKGRyb3Agc3RybGVuKCkpCgowNC4wMi4yMDA1IDAxOjU5Ci0gY2dpCgogIGRvbid0IHNlbmQgZmlsZSBvbiBlcnJvcgoKICBjaGVjayBpZiBjZ2ktaGFuZGxlciBleGlzdHMgYmVmb3JlIGV4ZWN1dGluZyBpdAoKICBhZGRlZCBzdXBwb3J0IGZvciBucGgtLi4uCgowMi4wMi4yMDA1IDIxOjE4IC0gcHJlLXJlbGVhc2UKLSByZXF1ZXN0IHBhcnNpbmcKCiAgaGFuZGxlIGludmFsaWQgY2hhcmFjdGVycyBpbiBVUkkKCjAyLjAyLjIwMDUgMTU6MTIKLSBtYWtlZmlsZXMKCiAgZHJvcHBlZCB1bnVzZWQgaGVhZGVyIGZpbGVzIGZyb20gdGhlIGRpc3RyaWJ1dGlvbgoKMDIuMDIuMjAwNSAxNDoxOAotIGZhc3RjZ2kKCiAgZGVsZXRlIHNvY2tldHMgb24gc2h1dGRvd24KCi0gaHR0cC8xLjEKCiAgYWRkaW5nIG9wdGlvbiB0byBkaXNhYmxlIGh0dHAvMS4xCgowMS4wMi4yMDA1IDEyOjAzCi0gY3lnd2luCgogIGZpeGVkIHBsdWdpbnNfbG9hZCB0byB1c2UgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgYWdhaW4KICByZW1vdmVkIG1tYXAgY2hlY2sKICBhZGRlZCBzc2wgc3VwcG9ydAoKMDEuMDIuMjAwNSAwMTo0OQotIGNvbmZpZ3VyZQoKICBtYWtlIGNoZWNrIGZvciB2YWxncmluZC5oIGNvdmVyZWQgYnkgLS13aXRoLXZhbGdyaW5kCgotIG1vZF9sb2NhbGl6ZXIsIG1vZF9tYXBzCgogIHJlbW92ZSBib3RoIHBsdWdpbnMgZnJvbSB0aGUgZGlzdHJpYnV0aW9uCgotIGZpbGUtbm90LWZvdW5kCgogIGhhbmRsZSBmaWxlIG5vdCBmb3VuZCBhZ2FpbgoKMzAuMDEuMjAwNSAxNjo0NAotIEhFQUQgcmVxdWVzdHMKCiAgZG9uJ3Qgc2VuZCBjb250ZW50IG9uIGR5bmFtaWMgSEVBRCByZXF1ZXN0cyB3aXRoIHN0YXR1cyAyMDAKCjMwLjAxLjIwMDUgMTU6MTYgLSAxLjMuOAotIG5ldHdvcmstaGFuZGxlcgoKICByZW1vdmUgZGVidWcgb3V0cHV0IG9uIHdyaXRldigpIGlmIHRoZSByZW1vdGUgc2lkZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24KCi0gZGlyZWN0b3J5IGluZGV4CgogIGhhbmRsZSBFQUNDRVMgY29ycmVjdGx5CgoyOS4wMS4yMDA1IDE1OjE2IC0gcHJlLXJlbGVhc2UKLSBtb2RfYWxpYXMKCiAgZml4ZWQgbW9kX2FsaWFzICsgcGF0aGluZm8gaGFuZGxpbmcKCi0gbW9kX2FjY2Vzc2xvZwoKICBhZGRlZCBhY2Nlc3MtbG9nIHRvIHN5c2xvZyBwYXRjaCBmcm9tIGFsbGFuCgoyOC4wMS4yMDA1IDE3OjMwCi0gZGlyZWN0b3J5IHJlZGlyZWN0IHdpdGhvdXQgSG9zdC1oZWFkZXIKCiAgdXNlIHNlcnZlci1pcCBpbnN0ZWFkIG9mIGNsaWVudC1pcCBmb3IgdGhlIExvY2F0aW9uOgoKLSBmYXN0Y2dpICsgcGF0aGluZm8KCiAgaWYgZmFzdGNnaS1hdXRoIHJlZGlyZWN0cyB0byBhIGRpcmVjdG9yeSB3aGljaCBkb2Vzbid0IGV4aXN0IGhhbmRsZSBpdAogIGNvcnJlY3RseSAoYnVnIGludHJvZHVjZWQgaW4gMS4zLjgpCgotIHJlcXVlc3RpbmcgZGlyZWN0b3JpZXMKCiAgY2xlYW4gcGh5c2ljYWwucGF0aCBpZiBkaXJlY3RvcnkgaXMgcmVxdWVzdGVkIGFuZCBkaXItbGlzdGluZyBpcyBkaXNhYmxlZAogIHNlbmQgNDAzIGFnYWluIChidWYgaW50cm9kdWNlZCBpbiAxLjMuOCkKCjI4LjAxLjIwMDUgMTI6MDgKLSBmYXN0Y2dpCgogICBpZ25vcmUgRkRFVkVOVF9IVVAgZm9yIHVuaXgtc29ja2V0cyBhcyBhIHNpbXBsZSByZWFkICsgdGltZW91dCB3aWxsIGRvCiAgIHRoZSBqb2IgYW55d2F5CgoyMi4wMS4yMDA1IDIwOjI4IC0gcHJlLXJlbGVhc2UKLSBmYXN0Y2dpCgogIHNlbmQgY29udGVudCBhbmQgaGVhZGVycyBpZiBhdXRob3JpemVyIG1vZGUgaXMgdXNlZAoKICB1c2UgYSBuZXcgY29ubmVjdGlvbiBpZiBjb25uZWN0aW9uIGlzIGRpZWQgdG8gZmFzdGNnaQogIGFuZCB3ZSBoYXZlIG5vdCB1c2VkIGl0IHlldAoKMTguMDEuMjAwNSAyMToyMSAtIHByZS1yZWxlYXNlCi0gcGx1Z2lucwoKICBhZGRlZCB2ZXJzaW9uLWlkIHRvIHBsdWdpbnMgdG8gZGV0ZWN0IHBsdWdpbnMgd2hpY2ggYXJlIG5vdCB1cC10by1kYXRlCgoxNi4wMS4yMDA1IDIzOjExCi0gZmFzdGNnaQoKICBmaXhlZCB3cml0ZS1mYWlsZWQgYWZ0ZXIgY3Jhc2ggb2YgZmFzdGNnaS1jaGlsZAoKMTYuMDEuMjAwNSAyMDo0MwotIHNldGVudgoKICBmaXhlZCBzZXRlbnYuYWRkLWVudmlyb25tZW50CgotIGZhc3RjZ2kKCiAgZml4ZWQgYXV0aG9yaXplciArIGFkZGVkIHRlc3RjYXNlcwoKMTYuMDEuMjAwNSAxNzo0MCAtIHByZS1yZWxlYXNlCi0gbW9kX3N0YXR1cwoKICBiZWF1dGlmaWVkIG1vZF9zdGF0dXMKCi0gbW9kX3NldGVudgoKICBhZGRlZCBzZXRlbnYuYWRkLWVudmlyb25tZW50CgotIHRpbWVvdXRzCgogIGFkZCB0aW1lb3V0IHRvIHJlYWQtcG9zdAoKMTUuMDEuMjAwNSAxMjo1NwotIGRlYnVnCgogIGFkZGVkIGRlYnVnIG9wdGlvbnMgdG8gbG9nCiAgLSBtaXNzaW5nIGZpbGVzCiAgLSByZXF1ZXN0IGhlYWRlcgogIC0gcmVzcG9uc2UgaGVhZGVyCiAgLSByZXF1ZXN0IGhhbmRsaW5nCgogIGFkZGVkIGEgbW9yZSB1c2VmdWxsIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBzdGF0dXMtY29kZSBjaGFuZ2VzIGluIHRoZQogIHJlcXVlc3QgcGFyc2VyCgotIHNlcnZlciBhbm5vdW5jZW1lbnQKCiAgc2V0IFNlcnZlcjogaGVhZGVyIGZvciBkeW5hbWljIGNvbnRlbnQgdG9vCgotIGZhc3RjZ2kKCiAgZml4ZWQgZG91YmxlIGZyZWUKCiAgZG9uJ3QgY3Jhc2ggb24gRkRFVkVOVF9FUlIKCiAgYWRkZWQgYSBjb21tZW50IGZvciBFQUdBSU4gb24gY29ubmVjdCgpCgowOC4wMS4yMDA1IDE3OjQ1Ci0gc3NsCgogIHJlcG9ydCBhbiBlcnJvciBpZiBzc2wuZW5naW5lIGlzIGVuYWJsZSBidXQgbm8gc3NsIHN1cHBvcnQgY29tcGlsZWQgaW4KCjA4LjAxLjIwMDUgMTI6MjMKLSBtb2Rfc3RhdHVzCgogIGFkZGVkIHJlcXVlc3QgdGltZSB0byB0aGUgb3V0cHV0CgogIChsYXRlIGNoYW5nZWxvZykgYWRkZWQgaG9zdCBhbmQgZmlsZW5hbWUgdG8gdGhlIG91dHB1dCAoZm9iYXgpCiAgKGxhdGUgY2hhbmdlbG9nKSBIVE1MYWxpemVkIHRoZSBvdXRwdXQgKGZvYmF4KQoKMDYuMDEuMjAwNSAxOTo1MSAtIHByZS1yZWxlYXNlCi0gZXJyb3ItaGFuZGxlcgoKICBsZXQgdGhlIGVycm9yLWhhbmRsZXIgaGFuZGxlIDQwMyByZXF1ZXN0cyB0b28KCiAgbWFrZSB0aGUgZXJyb3ItaGFuZGxlciBzZXRhYmxlIGJ5IGEgbW9kdWxlCgotIGVycm9yLXBhZ2VzCgogIHJld29ya2VkIHRoZSBlcnJvci1wYWdlIGhhbmRsaW5nCgowNS4wMS4yMDA1IDEzOjEwCi0ga2VlcC1hbGl2ZSBoYW5kbGluZwoKICBtYWRlIHN1cmUgdGhhdCBrZWVwLWFsaXZlIGlzIHJlYWxseSBoYW5kbGVkIGNvcnJlY3RseQoKMDQuMDEuMjAwNSAxNzowMgotIG1vZF9zZXRlbnYKCiAgYWRkZWQgYSBtb2R1bGUgdG8gYWRkZWQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGVhZGVycyBvbiB0aGUgZmx5CgotIGVycm9yLWxvZwoKICBzZW5kIGVycm9yIGxvZyB0byBzeXNsb2coKSBpZiBubyBlcnJvcmxvZ2ZpbGUgaXMgc3BlY2lmaWVkIChhZ2FpbikKCjAyLjAxLjIwMDUgMjI6NDQgLSBwcmUtcmVsZWFzZQotIHJlc3BvbnNlIGhhbmRsaW5nCgogIGN1dCBvZiBib2R5IGZvciBzdGF0dXMgMzAxLCAzMDQgYW5kIDIwNQoKLSBidWZmZXIKCiAgb3B0aW1pemVkIGFsbCBfaGV4IGZ1bmN0aW9ucyAoU2lsdmFuIE1pbmdoZXR0aSkKCjAyLjAxLjIwMDUgMjA6MzIKLSBmYXN0Y2dpCgogIGlmIGJpbi1wYXRoIGlzIG5vdCBzcGVjaWZpZWQsIGRvbid0IGRpZSAoYnVnIGludHJvZHVjZWQgaW4gdGhlIGxhc3QgcHJlLXJlbCkKCi0gYXV0aAoKICBpZiB1c2VyZmlsZSBpcyBlbXB0eSBkb24ndCBhdXRoLgoKMDIuMDEuMjAwNSAxOTowNgotIG1vZF9jb21wcmVzcwoKICBmaXhlZCBvZmYgYnkgb25lIGlmIGNhY2hlLWRpciBpcyBub3Qgc2V0CgowMi4wMS4yMDA1IDE2OjEwCi0gY29uZGl0aW9uYWwgY29uZmlnCgogIGZpeGVkICF+IGFuZCAhPQoKLSBidWZmZXIKCiAgY29weSBlbXB0eSBidWZmZXJzIGNvcnJlY3RseQoKMzEuMTIuMjAwNCAxNzo0NQotIGlwdjYgKyBwaWRmaWxlCgogIGRvbid0IGNvbXBsYWluIGlmIHdlIGNhbid0IHJlbW92ZSB0aGUgcGlkZmlsZSAoU2lsdmFuIE1pbmdoZXR0aSkKCiAgcmVtb3ZlIGlwdjYgb3B0aW9uIGZyb20gdGhlIGNvbW1hbmRsaW5lIG9mIGxpZ2h0dHBkIGRvZXNuJ3Qgc3VwcG9ydAogIGlwdjYgKFNpbHZhbiBNaW5naGV0dGkpCgozMS4xMi4yMDA0IDE1OjQxIC0gcHJlLXJlbGVhc2UKLSBrcXVldWUKCiAgc2ltcGxpZmllZCBldmVudCBoYW5kbGluZyAoYWRhbSkKCi0gZmFzdGNnaQoKICBmaXhlZCBkaXYtYnktemVybyBidWdzIGluIHRoZSBhZGFwdGl2ZSBwcm9jZXNzIHNwYXduaW5nCgotIG15c3FsLXZob3N0CgogIGFkZGVkIG15c3FsLXZob3N0IChDaHJpc3RlciBIb2xnZXJzc29uKQoKMzAuMTIuMjAwNCAxOTowOQotIGZhc3RjZ2kKCiAgYWRkZWQgYWRhcHRpdmUgc3Bhd25pbmcgb2YgRmFzdENHSSBwcm9jZXNzZXMKCi0gdHJhZmZpYyBzaGFwaW5nCgogIGFkZGVkIHRyYWZmaWMgc2hhcGluZyBwZXIgdmlydHVhbCBzZXJ2ZXIKCjI4LjEyLjIwMDQgMjM6MjYKLSB0cmFmZmljIHNoYXBpbmcKCiAgYWRkZWQgdHJhZmZpYyBzaGFwaW5nIHBlciBjb25uZWN0aW9uCgoyNS4xMi4yMDA0IDIyOjU4Ci0gbW9kX3N0YXR1cwoKICBmaXhlZCBzdGF0dXMudXJsIGFnYWluIChUaW1vKQoKMjEuMTIuMjAwNCAxMToyOQotIGNvbmZpZ3VyZQoKICBhZGRlZCBjaGVjayBmb3Igc2lnbmFsIGFuZCBzZWxlY3QgKGNvbXBpbGUgZml4IGZvciBuZXRic2QgMS40IGFuZCAxLjUpCgoxMS4xMi4yMDA0IDEyOjM4IC0gMS4zLjcKLSBmYXN0Y2dpICsgcGhwCgogIHJldHJ5IHRvIGNvbm5lY3QgdG8gYW5vdGhlciBQSFAgY2hpbGQgaWYgb25lIG9mIHRoZW0gZGllcyBhZnRlcgogIGNvbm5lY3QKCi0gY2dpICsgbXVsdGlwYXJ0CgogIGRvbid0IHRyYW5zZm9ybSBDT05URU5UX1RZUEUgdG8gSFRUUF9DT05URU5UX1RZUEUKCi0gZGViaWFuCgogIG1vcmUgY2xlYW51cCwgdXBkYXRlZCBjaGFuZ2Vsb2csIGFkZGVkIG1vcmUgZGVwcyBhbmQgc3VnZ2VzdHMKICAoQ2hyaXMgQnJvd24pCgoxMC4xMi4yMDA0IDIyOjMzCi0gZXZlbnQgaGFuZGxlcgoKICBmaXhlZCBjcmFzaGVzIGluIGtxdWV1ZQoKMTAuMTIuMjAwNCAxMzo1NyAtIHByZS1yZWxlYXNlCi0gbW9kX3N0YXR1cwoKICBmaXhlZCB3cmFwYXJvdW5kIGluIHRvdGFsIHJlcXVlc3RzIGFuZCB0b3RhbCB0cmFmZmljCgotIGRlYmlhbgoKICB1cGRhdGVkIGxpY2VuY2UgYW5kIHBhY2thZ2luZwoKLSBzZWN1cml0eQoKICBjYWxsIHNldGdyb3VwcygpIHRvIGdldCByaWQgb2YgYWxsIGdyb3VwcwoKLSBzc2wKCiAgaGFuZGxlIFNTTF9zaHV0ZG93bigpID09IDAgY29ycmVjdGx5CgogIGZpeGVkIG9wZW5zc2wgZGV0ZWN0aW9uIGluIGNvbmZpZ3VyZQoKICBmaXhlZCBoYW5kbGluZyBvZiBjaHVua2VkIGVuY29kaW5nCgotIHJlcXVlc3QgaGFuZGxpbmcKCiAgaGFuZGxlIENvbm5lY3Rpb246IGtlZXAtYWxpdmUgY29ycmVjdGx5IChjYXNlIGFzIG5vdCBpZ25vcmVkKQoKMjEuMTEuMjAwNCAwMjozOQotIHdpbmRvd3MKCiAgbWVyZ2VkIGJhc2ljIG5hdGl2ZSB3aW5kb3dzIHBvcnQgKGNvbXBpbGVzIHdpdGggbWluZ3cpCgoyMC4xMS4yMDA0IDE4OjQzCi0gY29uZGl0aW9uYWwKCiAgcG9ydGVkCiAgLSBjZ2kKICAtIHNlY2Rvd25sb2FkCiAgLSBleHBpcmUKICAtIGxvY2FsaXplcgogIC0gdXNlcnRyYWNrCiAgLSBzdGF0dXMKICAtIHByb3h5CgotIHNlcnZlci10YWcKCiAgU2VydmVyOiAuLi4gY2FuIG5vdyBiZSBzcGVjaWZpZWQgYnkgc2VydmVyLnRhZyA9ICIuLi4iCgotIHNwYXduLWZjZ2kKCiAgZml4ZWQgdHlwbyBpbiB1c2FnZSB0ZXh0CgotIHNzbAoKICBmaXhlZCBkZXRlY3Rpb24gb2YgbGlicyBhbmQgaGVhZGVycwoKMDUuMTEuMjAwNCAxNjowMQotIGZhc3RjZ2kKCiAgYWRkZWQgbW9yZSB1c2VmdWxsIGVycm9yIG1lc3NhZ2VzCgowNC4xMS4yMDA0IDIzOjAxCi0gc3NpCgogIGFkZGVkIHN1cHBvcnQgZm9yICR7Li4ufQoKMDMuMTEuMjAwNCAxNDo1MSAtIDEuMy42Ci0gZmFzdGNnaQoKICBhZGRlZCBzcGF3bi1mY2dpIHRvIHRoZSBkaXN0cmlidXRpb24KICBhZGRlZCBzcGF3bi1sb2NhbC1mYXN0Y2dpIHlvdXJzZWxmICggYmluLXBhdGggKQoKMDMuMTEuMjAwNCAxMToyMgotIGFjY2Vzc2xvZwoKICBkb24ndCBjeWNsZSBhY2Nlc3Nsb2dzIG9mIGV4dGVybmFsIHByb2Nlc3NlcyBhcmUgdXNlZAoKMDIuMTEuMjAwNCAxNTozNAotIGZhc3RjZ2kKCiAgaGFuZGxlIEVORC1PRi1SRVFVRVNUIGNvcnJlY3RseSBpZiBjaHVuay1lbmNvZGluZyBpcyBub3QgdXNlZAoKMDIuMTEuMjAwNCAxMDo1MwotIGludGVybmFsIHJlZGlyZWN0cwoKICBmaXhlZCBoYW5kbGluZyBvZiBxdWVyeSBzdHJpbmdzIGluIGludGVybmFsIHJlZGlyZWN0cyBmb3IgZGlyZWN0b3JpZXMKCjAyLjExLjIwMDQgMDk6NTQgLSBwcmUtcmVsZWFzZQotIGNnaQoKICBhZGQgUkVNT1RFX1VTRVIsIHN1cHByZXNzIEFVVEhPUklaQVRJT04KICBoYW5kbGUgcGF5bG9hZHMgPiA0awoKLSBtb2RfYWxpYXMKCiAgZml4ZWQgdXJsIGNoZWNraW5nCgotIGZvbGxvdy1zeW1saW5rCgogIGZpeGVkIGNvbmZpZwoKMzEuMTAuMjAwNCAxMTozMCAtIDEuMy41Ci0gd3JpdGV2CgogIGZpeGVkIHNlZy1mYXVsdCBpbiBkZWJ1Zy1tZXNzYWdlIGlmIHdyaXRlKCkgZmFpbHMgYW5kIExGUyBpcyBlbmFibGVkCiAgaGFuZGxlIEVJTlRSCgotIHNlbmRmaWxlIGxpbnV4CgogIGhhbmRsZSBFSU5UUgoKMzEuMTAuMjAwNCAwOTowOQotIGZyZWVic2QKCiAgYWRkZWQgbWlzc2luZyBoZWFkZXIgaW4gam9ibGlzdC5jCiAgZml4ZWQgdGVzdC1zY3JpcHRzIGZvciB6c2gKCjMwLjEwLjIwMDQgMjI6MjYKLSBtb2R1bGVzCgogIGFkZGVkIG1vZF91c2VyZGlyIGFuZCBtb2RfYWxpYXMKICBhZGRlZCBkb2NzIGZvciB0aGUgbmV3IG1vZHVsZXMKCjMwLjEwLjIwMDQgMTk6NTIKLSBwb3J0aW5nCgogIGFkZGVkIGRlZmluZXMgZm9yIE1BUF9GQUlMRUQgZm9yIE5ldEJTRCAxLjMueAoKMzAuMTAuMjAwNCAxODo1NCAtIHByZS1yZWxlYXNlCi0gcGlwZWxpbmluZwoKICBmaXhlZCBvZmZzZXQgY2FsY3VsYXRpb25zCgotIGlwdjYKCiAgSVB2NiBtaWdodCBiZSBkaXNhYmxlZCBhdCBjb21waWxlLXRpbWUKCi0gcmV3cml0ZQoKICBjbG9zZSBtZW0tbGVhawoKLSBhdXRoCgogIGZvcmdvdCB0byByZXNldCB0aGUgZ2xvYmFsLWNvbmZpZyBoYW5kbGVyCgotIHN5bWxpbmsKCiAgYWRkIG9wdGlvbiB0byBkaXNhYmxlIGZvbGxvdy1zeW1saW5rCgotIHNzaQoKICBhZGRlZCBzdXBwb3J0IGZvciBleGVjLWNtZAoKMjMuMTAuMjAwNCAtIDEuMy40Ci0gbWF4LWZkcwoKICBzZXQgdGhlIHVwcGVyIGxpbWl0IG9mIGZkcyBvbmx5IGlmIHNlcnZlci5tYXgtZmRzIGlzIHNldAoKMjMuMTAuMjAwNCAxMzo0OQotIGFjY2Vzc2xvZwoKICB1c2UgYSBzaGVsbCB0byBoYW5kbGUgYWNjZXNzbG9nLXBpcGVzCgoyMi4xMC4yMDA0IDE3OjAwCi0gYWNjZXNzbG9nCgogIGFkZGVkIGxvZ2dpbmcgb2YgdXNlci1zdXBwbGllZCBkYXRhIHZpYSAley4uLn1vIGFuZAogIFgtTElHSFRUUEQtKiBoZWFkZXIKCjIyLjEwLjIwMDQgMTQ6NTcgLSBwcmUtcmVsZWFzZQotIG9wZW53cnQKCiAgZml4ZWQgY29uZmlndXJlLWNoZWNrcyBhbmQgTWFrZWZpbGUuYW0ncyB0byBidWlsZCBjbGVhbmx5IHdpdGggYQogIGNyb3NzLWNvbXBpbGVyCgogIGJ1aWxkcyBjbGVhbmx5IGZvciBvcGVud3J0CgoyMi4xMC4yMDA0IDEzOjAzCi0gb3V0LW9mLWZkCgogIGltcHJvdmVkIHRoZSBvdXQtb2YtZmQgaGFuZGxlcgoKLSBjZ2ksIGZhc3RjZ2kKCiAgc2V0IFNFUlZFUl9OQU1FIHRvIHNlcnZlci5uYW1lIG9yIHRoZSB2YWx1ZSBzdWJtaXR0ZWQgYnkgSG9zdDoKCi0gZXJyb3ItaGFuZGxlcgoKICBvbmx5IHNldCBvbGQgc3RhdHVzIGNvZGUgaWYgaXQgd2Fzbid0IHNldCBieSBhIGhhbmRsZXIKCjIxLjEwLjIwMDQgMjI6MzYgLSBwcmUtcmVsZWFzZQotIGZhc3RjZ2kKCiAgZG9uJ3QgY3Jhc2ggb24gb3V0LW9mLWZkIGNvbmRpdGlvbgoKLSBvdXQtb2YtZmQKCiAgdHJ5IGhhbmRsZSB0aGUgb3V0LW9mLWZkIGNvbmRpdGlvbiBpbiBhIHNhbmUgd2F5CgoyMS4xMC4yMDA0IDE1OjAzCi0gbW9kX2F1dGgKCiAgc2VwZXJhdGVkIGF1dGguYmFja2VuZC4qLnVzZXJmaWxlIGZvciBwbGFpbiwgaHRwYXNzd2QgYW5kIGh0ZGlnZXN0CgogIGFkZGVkICdkaWdlc3QtYXV0aCcgYWdhaW5zdCAncGxhaW4tYmFja2VuZCcKCiAgYWRkZWQgYXV0aC5kZWJ1ZyBmb3IgZGVidWdnaW5nCgoxNi4xMC4yMDA0IDEwOjE4IC0gMS4zLjMKLSBtb2Rfc2ltcGxlX3Zob3N0LCBtb2RfZXZob3N0CgogIGNvbmRpdGlvbmFsLWl6ZWQKCi0gbW9kX3JyZHRvb2wKCiAgbWFpbnRhaW4gdGhlIHJlcXVlc3QtY291bnRlciBmb3IgZWFjaCBjb25kaXRpb25hbC1jb25maWcgKGFkYW0pCgoxNC4xMC4yMDA0IDExOjMwCi0gYWNjZXNzbG9ncwoKICBjeWNsZSBhbGwgYWNjZXNzLWxvZ3MKCi0gbW9kX3Jld3JpdGUKCiAgdGVsbCB0aGUgdXNlciB0byBpbnN0YWxsIHBjcmUuaCBpZiBoZSB3YW50cyB0byB1c2UgbW9kX3Jld3JpdGUKCjEwLjEwLjIwMDQgMTA6MTEgLSBwcmUtcmVsZWFzZQotIGVycm9yLWhhbmRsZXIKCiAgYWRkZWQgYSBlcnJvci1oYW5kbGVyIGZvciBzdGF0dXMgNDA0IChzZXJ2ZXIuZXJyb3ItaGFuZGxlci00MDQpCgowOS4xMC4yMDA0IDE2OjI4IC0gcHJlLXJlbGVhc2UKLSBjZ2kKCiAgYWRkZWQgc3VwcG9ydCBmb3IgXG4gaW4gaGVhZGVycwoKLSBtb2RfYXV0aAoKICBhZGRlZCBjb25kaXRpb25hbCBhdXRoCgowMS4xMC4yMDA0IDA5OjI4Ci0gcGx1Z2lucwoKICBmaXhlZCBvZmYgYnkgb25lIGVycm9yIGluIHBsdWdpbiBpbml0aWFsaXphdGlvbiAoTWlrZSkKICByZWxhdGVkIGludG8gYSBzZWdmYXVsdCBvbiBBTUQ2NAoKMzAuMDkuMjAwNCAyMTo0NCAtIDEuMy4yCi0gZmlsZS1jYWNoZQoKICBkaXNhYmxlZCB0aGUgZmlsZS1jYWNoZSBpdCB3YXMgdGFrZW4gdGhlIHdyb25nIGZpbGVzIGZyb20gdGhlIGNhY2hlCgozMC4wOS4yMDA0IDA4OjM5IC0gMS4zLjEKLSBmaWxlLWNhY2hlCgogIGRyb3AgYSB1bnVzZWQgZmlsZS1jYWNoZSBlbnRyeSBhZnRlciAxMCBzZWNvbmRzCiAgcmV1c2UgdW51c2VkIGVudHJpZXMKCi0gcmVxdWVzdC1wYXJzZXIKCiAgYWNjZXB0IElQdjYgYWRyZXNzZXMgaW4gSG9zdCBoZWFkZXIKCi0gdGVzdHMKCiAgbW9kaWZpZWQgdGhlIHNjcmlwdHMgdG8gd29yayB3aXRoIHpzaCAoY2hlY2sgb24gTGludXgsIElyaXggYW5kIEZyZWVCU0QpCgoyNi4wOS4yMDA0IDEyOjI4Ci0gY29tcGFyaXNzaW9uIGZ1bmN0aW9uCgogIGZpbGUtY2FjaGUgaGFzIGRlbGl2ZXJpbmcgdGhlIHdyb25nIGVudHJ5IGlmIG9ubHkgdGhlIGxhc3QgY2hhcmFjdGVyIG9mCiAgdGhlIGZpbGVuYW1lIGRpZmZlcmVkIGFuZCB0aGUgZmlsZXNpemUgd2FzIHRoZSBzYW1lLgoKLSBjZ2kgKyBjeWd3aW4KCiAgY2dpIG5lZWQgcyBTWVNURU1ST09UIGVudmlyb25tZW50CgoKMjIuMDkuMjAwNCAwODo1NQotIG5ldHdvcmsKCiAgZGV0ZWN0IG9mIGZpbGUgaGFzIGJlZW4gc2hyaW5rZWQgd2hpbGUgd2UgYXJlIHNlbmRpbmcgaXQgb3V0IGFuZCB0ZXJtaW5hdGUKICB0aGUgY29ubmVjdGlvbiBpZiB3b3VsZCBydW4gb3ZlciB0aGUgZWRnZQoKMjIuMDkuMjAwNCAwNzo1NgotIG1vZCByZXdyaXRlLCBmYXN0Y2dpLCAuLi4KCiAga2VlcCBSRVFVRVNUX1VSSSBhZnRlciByZXdyaXRlCgoyMS4wOS4yMDA0IDIyOjQ5Ci0gZmFzdGNnaSBhdXRob3JpemVyCgogIGZpeGVkIGNsZWFudXAgY29kZSAobWF0dCkKCjIxLjA5LjIwMDQgMjA6MDgKLSBycmR0b29sCgogIHJyZHRvb2wuZGItbmFtZSBpcyBub3cgY29uZGl0aW9uYWwKCiAgZml4ZWQgY2hlY2sgaWYgd3JpdGUoKSBmYWlsZWQgKGFkYW0pCgoxNy4wOS4yMDA0IDE3OjUwIC0gMS4zLjAKLSByZXdyaXRlCgogIGFkZGVkIHVybC5yZXdyaXRlLWZpbmFsID0gLi4uCgoxNy4wOS4yMDA0IDE1OjU1Ci0gY29kZSBjbGVhbnVwCgogIGludGVncmF0ZWQgdGhlIGZpeGVzIGZyb20gY3lnd2luIGludG8gdGhlIG1haW4gdHJlZQoKLSBrcXVldWUKCiAgaW5pdCBrcXVldWUgYWZ0ZXIgZGFlbW9uaXppbmcgKGJyb2tlbiBzaW5jZSAxMi4wOS4yMDA0IDE0OjAyKQoKMTYuMDkuMjAwNCAyMTowMAotIGN5Z3dpbiArIG1hY29zeAoKICBmaW5pc2hlZCB0aGUgY3lnd2luIHBvcnQKICB0aGlzIHBvcnQgc2VlbXMgdG8gZml4IHRoZSBwcm9ibGVtcyBvbiBtYWNvc3ggdG9vCgoxMi4wOS4yMDA0IDE0OjAyCi0gc29ja2V0IGhhbmRsaW5nCgogIGFkZGVkIHN1cHBvcnQgdG8gaGFuZGxlIG1vcmUgdGhhbiBvbmUgc2VydmVyIHNvY2tldAoKMTEuMDkuMjAwNCAxMjoyMyAtIDEuMi44Ci0gRUlOVFIKCiAgaGFuZGxlIEVJTlRSIGZvciBsaW51eC1zZW5kZmlsZQoKLSBjb25maWdmaWxlCgogIGlnbm9yZSBhbiBleHRyYSBjb21tYSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSBkZWNsYXJhdGlvbgoKMTEuMDkuMjAwNCAwOTo0NgotIG1vZF9wcm94eQoKICBwYXNzIHJlbW90ZS1hZGRyIGFzIFgtRm9yd2FyZGVkLUZvciB0byB0aGUgcmVhbCBzZXJ2ZXIgYmVoaW5kIHRoZSBwcm94eQoKLSBjb2RlIGNsZWFudXAKCiAgbW92ZWQgYWxsIGN1dCduJ3Bhc3RlIHZlcnNpb25zIG9mIHRoZSBpbmV0X250b3AgY2FjaGUgdG8gaW5ldF9udG9wX2NhY2hlLmMKCi0gZmNnaQoKICBkb24ndCBvdmVyd3JpdGUgdGhlIGZkIGluIGZjZ2lfZXN0YWJsaXNoIGNvbm5lY3Rpb24gaWYgY29ubmVjdCBmYWlscy4gdGhpcwogIHJlc3VsdHMgaW4gdmFyaW91cyBwcm9ibGVtIGluIG90aGVyIHBsYWNlcy4KCjA1LjA5LjIwMDQgMDk6NDYKLSBmaWxlLWNhY2hlCgogIGNhY2hlIHRoZSBtaW1ldHlwZQoKLSBsYXN0LW1vZGlmaWVkCgogIGRvbid0IGNvbXBsYWluIGlmIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBjb250YWlucyBhIHZhbGlkIGNvbW1lbnQvb3B0aW9uCiAgbGlrZSA8dGltZXN0YW1wPjsgbGVuZ3RoID0gLi4uCgowNS4wOS4yMDA0IDA5OjEzCi0gZXhwaXJlcwoKICBvdmVyd3JpdGUgdGhlIEV4cGlyZSBpZiBpdCBpcyBzZXQgYnkgYSBwcmV2aW91cyBwbHVnaW4KCi0gY29uZGl0aW9uYWwgY29uZmlnCgogIGNvbmRpdGlvbmFsIGNvbmZpZyBhcyBkaXNhYmxlZCBpbiAxLjIuNyBieSBhY2NpZGVudAoKMDQuMDkuMjAwNCAxMDowMiAtIDEuMi43Ci0gbW9kLXByb3h5CgogIHJlbW92ZSB0aGUgXDAgYmVmb3JlIHRoZSBwb3N0IGNvbnRlbnQKCi0gY2dpCgogIGZpeGVkIGhhbmdpbmcgcHJvY2VzcyBpZiBjZ2ktY3Jhc2ggdGVybWluYXRlcyB0byBmYXN0IChiZWZvcmUgd2UgcmVhZCBpdHMKICByZXNwb25zZSkKCi0gZXh0ZW50ZWQgYXR0cmlidXRlcwoKICBhZGRlZCB4YXR0ciBzdXBwb3J0LCBzdWJtaXR0ZWQgYnkgQXJpCgoyOS4wOC4yMDA0IDE2OjAwCi0gcnJkdG9vbAoKICBtb3ZlZCB0aGUgcnJkdG9vbCBzdXBwb3J0IGZyb20gbW9kX3N0YXR1cyBpbnRvIGl0cyBvd24gbW9kdWxlIG1vZF9ycmR0b29sCgogIHJyZHRvb2wuYmluYXJ5ID0gIi91c3IvYmluL3JyZHRvb2wiCiAgcnJkdG9vbC5kYi1uYW1lID0gIi92YXIvd3d3L2xpZ2h0dHBkLnJyZCIKCjI5LjA4LjIwMDQgMTE6MDAgLSBwcmUtcmVsZWFzZQotIHRpbWVvdXRzCgogIHNlcnZlci5tYXgta2VlcC1hbGl2ZS1yZXF1ZXN0cyA9IDAgcmVwbGFjZXMKICAgIHNlcnZlci51c2Uta2VlcC1hbGl2ZSA9ICJkaXNhYmxlIgoKICBhZGRlZAogICAgc2VydmVyLm1heC1rZWVwLWFsaXZlLWlkbGUKICAgIHNlcnZlci5tYXgtcmVhZC1pZGxlCiAgICBzZXJ2ZXIubWF4LXdyaXRlLWlkbGUKCi0gZG9jcwoKICBhZGRlZCBhIGVudHJ5IGZvciBlYWNoIGNvbmZpZy12YWx1ZSBpbnRvIGNvbmZpZ3VyYXRpb24udHh0CiAgYWRkZWQgc2ltcGxlIGRvY3MgZm9yCiAgICByZXdyaXRlCiAgICByZWRpcmVjdAogICAgY29tcHJlc3MKICAgIGNnaQogICAgc2ltcGxlLXZob3N0CgoyOS4wOC4yMDA0IDEwOjA1Ci0gY29uZmlnIG9wdGlvbnMKCiAgY29tcGxhaW4gaWYgbm8gY29uZmlnZmlsZSBpcyBzcGVjaWZpZWQKCi0gZmFzdGNnaQoKICByZW1vdmVkIHN0dXBpZCBhbGxvY2F0aW9uIGJ1ZyB3aGljaCBtaWdodCBjYXVzZSBhIHByb2JsZW0gaW4gcmVhbGx5IHJhcmUKICBjYXNlcwoKMjYuMDguMjAwNCAyMjowNiAtIDEuMi42Ci0gb3B0aW1pemUKCiAgdXNlIGFycmF5X3N0cmNhc2VjbXAoKSBpbiBmYXZvdXIgb2Ygc3RyY2FzZWNtcCgpIGFzIGl0IGlzIHNsaWdodGx5CiAgZmFzdGVyLgoKICBhcHBseSB0aGUgY2FzZS1pbnNlbnRpdmUgY29udmVyc2lvbiBhbHNvIG9uIHRoZSBsYXN0IGNoYXJhY3Rlci4gKGFkYW0pCgogIHNvcnQgdGhlIGNoZWNrZWQgZWxlbWVudHMgaW4gcmVxdWVzdC5jIGFuZCBmaWx0ZXIgYXBwbHkgdGhlIGxvZ2ljIHRvCiAgY29tcGFyZSBzb21lIGxlc3MgZmllbGRzLCBpZiB0aGUgaGVhZGVyIGlzIG5vdCB1c2VkLgoKICBpbXByb3ZlZCB0aGUgY29uZmlnLXBhdGNoIGZ1bmN0aW9uIHRvIHVzZSBvdXIgaW50ZXJuYWwgYnVmZmVyLWNvbXBhcmUKICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBzdHJjbXAKCjIyLjA4LjIwMDQgMTY6MDkgLSBwcmUtcmVsZWFzZQotIGNnaQoKICBhZGRlZCBtaXNzaW5nIGNsZWFudXAgY29kZQoKLSBmYXN0Y2dpCgogIHJlbW92ZSBkb3VibGUtZnJlZQogIGFkZGVkIGhhbmRsaW5nIG9mIEVJTlRSIGluIHNvbWUgcGxhY2VzCgotIGxlYWtzCgogIGZpeGVkIHNvbWUgbGVha3MgaW4gdGhlIG5ldyBjb25maWcgY29kZQoKLSBhcnJheV9zdHJjYXNlY21wCgogIGZpeGVkIGFsaWdubWVudCBpbiB0aGUgaW1wcm92ZWQgYXJyYXlfc3RyY2FzZWNtcCBmdW5jdGlvbiAoYWRhbSkKCjIwLjA4LjIwMDQgMTQ6NDYgLSBwcmUtcmVsZWFzZQotIHBlcmZvcm1hbmNlCgogIG9wdGltaXplZCBhIGZldyB1c2VsZXNzIHN0cmxlbigpIGF3YXkgYXMgd2UgZWl0aGVyIGtub3cgdGhlIGxlbmd0aCBmcm9tCiAgYnVmZmVyLT51c2VkIC0gMSBvciBieSBzaXplb2Yoc3RyKSAtIDEgaWYgaXQgaXMgY29uc3RhbnQuCgogIG9wdGltaXplZCB0aGUgJ2ZpbmQgdGhlIFxyXG5cclxuJyBmdW5jdGlvbi4KCiAgaW1wcm92ZWQgdGhlIGFycmF5X3N0cmNhc2VjbXAoKSBiYXNlZCBvbiBhbm90aGVyIGlkZWEgZnJvbSAocmFsZikKCi0gYWNjZXNzbG9nCgogIGVuYWJsZWQgdGhlIHN0cmZ0aW1lIGNhY2hlIGFnYWluCgoxNS4wOC4yMDA0IDIzOjQxCi0gYWNjZXNzbG9nCgogIGFkZGVkIGFwYWNoZS1saWtlIEN1c3RvbUxvZyBoYW5kbGluZyBpbiBhY2Nlc3Nsb2cuZm9ybWF0CgogIGFjY2Vzc2xvZy5mb3JtYXQgPSAiLi4uIgoKMTUuMDguMjAwNCAyMTowOAotIHRlc3QtY2FzZXMKCiAgcmVtb3ZlIHRlc3RkaXIKCi0gY29uZmlnZmlsZXMKCiAgaGFuZGxlIGVzY2FwaW5nIG9mICIgaW4gc3RyaW5ncyBwcm9wZXJseQoKMTMuMDguMjAwNCAxMjowNwotIGFycmF5CgogIGltcHJvdmVkIGlubmVyLWxvb3Agb2YgYXJyYXlfc3RyY2FzZWNtcCgpIChyYWxmKQoKMTEuMDguMjAwNCAxNDoxNAotIGZjZ2kgc29ja2V0CgogIHVzZSBTVU5fTEVOIGlmIGF2YWlsYWJsZQoKLSBrZWVwLWFsaXZlCgogIGRpc2FibGUga2VlcC1hbGl2ZSBvbiByZXF1ZXN0CgogIHNlcnZlci51c2Uta2VlcC1hbGl2ZSA9ICJkaXNhYmxlIgoKMTAuMDguMjAwNCAxNTo1OSAtIDEuMi41Ci0gY29uZGl0aW9uYWwgY29uZmlnCgogIG1vZF9mYXN0Y2dpCiAgbW9kX3Jld3JpdGUKICBtb2RfcmVkaXJlY3QKICBtb2RfYWNjZXNzCiAgbW9kX2NvbXByZXNzCiAgbW9kX2FjY2Vzc2xvZwoKICBhcmUgcG9ydGVkCgoxMC4wOC4yMDA0IDEzOjA1Ci0gcGlwZWxpbmluZwoKICBmaXhlZCB2ZXJ5IHN0dXBpZCBwaXBlbGluaW5nIGJ1ZwoKMDkuMDguMjAwNCAyMjowNyAtIHByZS1yZWxlYXNlCi0gY29uZGl0aW9uYWwgY29uZmlnCgogIGZpcnN0IGNvZGUgZm9yIGNvbmRpdGlvbmFsIGNvbmZpZwoKMDkuMDguMjAwNCAxNDoyMQotIGZjZ2kKCiAgZml4ZWQgYWNjZXNzIHRvIGZyZWUoKSdkIG1lbW9yeSAoZG9lc24ndCBjcmVhdGUgYW55IGhhcm0pCgotIGlzZGlnaXQsIHdhcmluZ3MKCiAgc2lnbmVkIC0+IHVuc2lnbmVkIGZvciAyIG1vcmUgaXNkaWdpdCgpIGNhbGxzIChhZGFtKQogIHJlbW92ZWQgc29tZSB1bnVzZWQgdmFyJ3MgaWYgcGNyZSBpcyBub3QgYXZhaWxhYmxlIChhZGFtKQoKMDguMDguMjAwNCAyMDo1NyAtIHByZS1yZWxlYXNlCi0gZGViaWFuCgogIGFkZGVkIGEgY2htb2QgdG8gL3Zhci9sb2cvbGlnaHR0cGQvIChhbGxhbikKCjA4LjA4LjIwMDQgMTI6MDUKLSBrcXVldWUKCiAgdXNlIEVWX1NFVCgpIGluc3RlYWQgb2Ygc2V0dGluZyB0aGUgZXYtc3RydWN0IGJ5IGhhbmQgKGFkYW0pCgotIGZjZ2kKCiAgZml4ZWQgdGhlIEVJTlBST0dSRVNTIGhhbmRsaW5nIHRvIHVzZSBnZXRzb2Nrb3B0IChlcikKICBmaXhlZCBhIGxlYWsgb2Ygc2VydmVyIGlzIGRpc2FibGVkIChlcikKCi0gc29sYXJpcyAxMCBwb3J0LWFwaQoKICBhZGRlZCBhIHNrZWxldG9uIGZvciB0aGUgc29sMTAgcG9ydCBhcGkKCjA2LjA4LjIwMDQgMTA6MTgKLSBtb2Rfc3NpCgogIGZpeCBEQVRFX0xPQ0FMIHNvIGl0IGRpc3BsYXlzIHRoZSBjb3JyZWN0IHRpbWUgem9uZSAoSmVyZW15IEhpbmVnYXJkbmVyKQoKMDQuMDguMjAwNCAxMTo0MwotIG9wZW5ic2QgZml4ZXMKCiAgZHJvcHBlZCB1c2FnZSBvZiBNQVgoKSBpbiBidWZmZXIuYwogIGFkZGVkIHByb2JlciBpbmNsdWRlcyBmb3IgbWQ1LmggaWYgb3BlbnNzbCBpcyBlbmFibGVkIChicmFkKQoKLSBtZW1vcnkgdXNhZ2UKCiAgZG9jdW1lbnRlZCB0aGUgd2F5IGhvdyBsaWdodHRwZCBjYWNoZXMgbWVtb3J5IGJsb2NrcwogIHJlc2V0IHRoZSBidWZmZXJzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIHdyaXR0ZW4gYnkgdGhlIG5ldHdvcmstbGF5ZXIKCi0ga3F1ZXVlCgogIG1vZGlmeSBmZC1iaXRtYXNrIG9ubHkgaWYga2V2ZW50IHN1Y2NlZWRlZCAoYWRhbSkKCgowMy4wOC4yMDA0IDE1OjA5Ci0gbW9kX2NvbXByZXNzCgogIGNvbXByZXNzIGV2ZW4gaWYgeW91IGhhdmUgbm8gY2FjaGVkaXIgc2V0CgowMy4wOC4yMDA0IDEzOjI2IC0gcHJlLXJlbGVhc2UKLSBNYWtlZmlsZQoKICBmaXhlZCBkZXBlbmRlbmNpZXMgZm9yIHBhcmFsbGVsIGJ1aWxkIGluIG1vZF9zc2lfZXhwci5jCgotIGNvbWJvIHBhdGNoCgogICogVGlua2VyIHdpdGgga3F1ZXVlKCkuICBBZGQgYSByZXNldCBtZXRob2Qgc28gdGhhdCB0aGUga3F1ZXVlIGZpbGUKICAgIGRlc2NyaXB0b3IgY2FuIGJlIHJlLWVuYWJsZWQgYWZ0ZXIgYSBmb3JrKCkuICBFbXVsYXRlIHRoZSBkZXZwb2xsIGRyaXZlcgogICAgaW4gdGhhdCBhZGRzIGFuZCBkZWxldGVzIGFyZSBzZW50IHRvIHRoZSBub3RpZmljYXRpb24gbWVjaGFuaXNtIGltLQogICAgbWVkaWF0ZWx5LCB3aGljaCBzaG91bGQgY3V0IGRvd24gb24gcGhhbnRvbSBldmVudHMuICBVc2UKICAgIGV2LT5rcV9yZXN1bHRzIGFzIGEgc2xpZGluZyB3aW5kb3cuCgogICogQ2hhbmdlIEZfU0VURkQgY2FsbHMgdG8gdXNlIHRoZSBwcmVmZXJyZWQgRkRfQ0xPRVhFQyBpbnN0ZWFkIG9mIDEuCgogICogUmVtb3ZlIHVubmVjZXNzYXJ5IGZkZXZlbnQgZmNudGwgaGFuZGxlcnMuICBJdCBhcHBlYXJzIHRoYXQgdGhlIG9ubHkKICAgIGRyaXZlciB0aGF0IG5lZWRzIG9uZSBpcyBMaW51eCBSVCBzaWduYWxzLgoKICAqIFF1aWV0IGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW51c2VkIHBhcmFtZXRlci4KCiAgKiBTZXQgdGhlIGNsb3NlLW9uLWV4ZWMgZmxhZyBmb3IgdGhlIC9kZXYvcG9sbCBhbmQgZXBvbGxfY3JlYXRlKCkgZmlsZQogICAgZGVzY3JpcHRvcnMuCgogICogUmV0dXJuIGZhaWx1cmUgaWYgL2Rldi9wb2xsIGNvdWxkIG5vdCBiZSBvcGVuZWQgaW5zdGVhZCBvZiBsb2dnaW5nCiAgICBhbmQgY29udGludWluZy4KCiAgKiBEZXRlY3QgRUFHQUlOIGFmdGVyIHdyaXRldigpIGZhaWx1cmVzLiAgRnJlZUJTRCBzZW5kZmlsZSgpIGRvZXNuJ3QgbmVlZAogICAgcHJvdGVjdGlvbiwgYXMgdGhlIG1hbiBwYWdlIHNheXM6CgogICAgIFdoZW4gdXNpbmcgYSBzb2NrZXQgbWFya2VkIGZvciBub24tYmxvY2tpbmcgSS9PLCBzZW5kZmlsZSgpIG1heSBzZW5kCiAgICAgZmV3ZXIgYnl0ZXMgdGhhbiByZXF1ZXN0ZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzcy0KICAgICBmdWxseSB3cml0dGVuIGlzIHJldHVybmVkIGluICpzYnl0ZXMgKGlmIHNwZWNpZmllZCksIGFuZCB0aGUgZXJyb3IKICAgICBFQUdBSU4gaXMgcmV0dXJuZWQuCgogIChhZGFtLCBnZW9yZywgbWF0dCkKCgowMi4wOC4yMDA0IDE4OjA4Ci0gbW9kX3NzaQoKICBjaGVjayBmb3IgcGNyZSBiZWZvcmUgY29tcGlsaW5nIHRoZSBtb2R1bGUKCi0gZmRldmVudHMKCiAgZHJvcHBlZCBmZGV2ZW50X2ZjbnRsIGFkZGVkIGJ5IHRoZSBsYXN0IHBhdGNoIChhZGFtKQogIGtxdWV1ZTogZXZlbnRzID09IEZERVZFTlRfSU4gLT4gZXZlbnRzICYgRkRFVkVOVF9JTiAoYWRhbSkKCjMxLjA3LjIwMDQgMjI6MDcgLSAxLjIuNAotIGZkZXZlbnRzCgogICogVGVzdCBhdCBjb25maWd1cmUgdGltZSBmb3Iga3F1ZXVlKCkgYW5kIDxzeXMvZXZlbnQuaD4KICAqIFJlbW92ZSB2YXJpb3VzIGhhcmQtY29kZWQgY29uc3RhbnRzIGZyb20gZXZlbnQgaGFuZGxlcnMKICAqIE1vdmUgbWF4ZmRzIGludG8gdGhlIGV2ZW50IHN0cnVjdHVyZSwgYW5kIG91dCBvZiB0aGUKICAgIGZkZXZlbnRfKl9pbml0IGhhbmRsZXJzLiAgRXZlbnQgaGFuZGxlcnMgY2FuIHVzZSB0aGUgbWF4ZmRzCiAgICBtZW1iZXIgdG8gc2l6ZSBhcnJheXMuCiAgKiBWYXJpb3VzIGV2ZW50IHN0cnVjdHVyZSByZW5hbWVzIHRvIGRpc2NvdXJhZ2UgY2xhc2hlcwogICogUmVtb3ZlIGV4dHJhIChpZ25vcmVkKSBjYWxsIHRvIGZkZXZlbnRfZXZlbnRfbmV4dF9mZG5keCgpIGluCiAgICB0aGUgbWFpbiBzZXJ2ZXIgbG9vcC4KICAqIFdyZXN0bGUgd2l0aCBrcXVldWUoKS4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gZGVhbCB3aXRoCiAgICBwaGFudG9tIGV2ZW50cyAoZm9yIGZkcyB3aGljaCBoYXZlIGJlZW4gZGVsZXRlZC9jbG9zZWQpLCBzaW1pbGFyCiAgICB0byB0aGUgTGludXggUlQgc2lnbmFscyBjb2RlLiAgTGlrZSB0aGUgUlQgY29kZSwgaXQgbWFpbnRhaW5zIGEKICAgIGJpdG1hc2sgb2YgYWN0aXZlIGZkcy4gIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGtldmVudCgpLCB0aGUKICAgIGNvZGUgd2lsbCBjb21wcmVzcy9vdmVyd3JpdGUgZGVhZCBldmVudHMuICBUaGUgb3RoZXIgYW5ub3lhbmNlIGlzCiAgICB0aGF0IHRoZSBoYW5kbGVyIG11c3QgdHJhY2sgdGhlIGV2ZW50IGZpbHRlciBmb3IgZWFjaCBmZCwgZXZlbgogICAgdGhvdWdoIHlvdSBjYW5ub3Qgc3VwcG9ydCBib3RoIHJlYWQgYW5kIHdyaXRlIGZpbHRlcnMgZm9yIHRoZSBzYW1lCiAgICBmZCBpbiBvbmUga3F1ZXVlLiAgVGhlIGhhbmRsZXIgbWFpbnRhaW5zIGEgc2VwYXJhdGUgYml0bWFzayBmb3IgZmQKICAgIGZpbHRlcnMgKDEgPT0gRVZGSUxUX0lOLCAwID09IEVWRklMVF9PVVQpLgogIChhZGFtKQoKLSBzZXJ2ZXIgc2lkZSBpbmNsdWRlcwoKICBhZGRlZCBuYXRpdmUgc2VydmVyLXNpZGUgaW5jbHVkZXMgYmFzZWQgb24gdGhlIGRvY3MgZnJvbSBhcGFjaGU6CiAgaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy9tb2QvbW9kX2luY2x1ZGUuaHRtbAoKICBub3Qgc3VwcG9ydGVkIGFyZToKICAtIGV4ZWMKICAtIG5lc3RlZCB2aXJ0dWFsCiAgLSBjb25maWcuZXJybXNnCiAgLSBlY2hvLmVuY29kaW5nCgoyNC4wNy4yMDA0Ci0gZmRldmVudHMKCiAgYWRkZWQgYSBiaXRzZXQgdG8gZmlndXJlIG91dCBpZiB3ZSByZWNlaXZlZCBhIGV2ZW50IGZvciBhbiB1bnJlZ2lzdGVyZWQgZmQKICBpbiBydC1zaWduYWwgKGFkYW0pCgotIGtxdWV1ZQoKICBhZGRlZCBrcXVldWUgc3VwcG9ydCAoTWF0dCBMZXZpbmUpCgoxMy4wNy4yMDA0IDA4OjU4Ci0gY29uZmlnZmlsZQoKICBwYXJzZSBrZXlzIGNvcnJlY3RseSB0aGF0IGNvbnRhaW4gYSBkaWdpdCAoR2VvZmYgQWRhbXMpCgotIGZjZ2kKCiAgZml4ZWQgbGFyZ2UgcG9zdCB1cGxvYWRzIChHZW9mZiBBZGFtcykKICBmaXhlZCB1cmkgaWYgZG9jcm9vdCBpcyBzZXQgKEdlb2ZmIEFkYW1zKQoKMDMuMDcuMjAwNCAyMjo1MCAtIDEuMi4zCi0gaW5kZXgtZmlsZXMKCiAgcmV3cml0ZSB1cmkucGF0aCB0byB0aGUgaW5kZXgtZmlsZSBpbnN0ZWFkIG9mIGtlZXBpbmcgaXQgYXQgLi4uLwogIHRoaXMgZml4ZXMgaW5kZXgtZmlsZSBoYW5kbGluZyBpbiBGYXN0Q0dJL0NHSSBkb2Nyb290IGlzIHVzZWQKCi0gY2xvc2Utb24tZXhlYwoKICBlbmFibGUgY2xvc2Utb24tZXhlYyBoYW5kbGluZyB0byBzaW1wbGlmeSBGRCBoYW5kbGluZyBpbiBDR0kgY29kZQoKLSBjZ2kKCiAga2VlcCBlcnJvci1sb2ctZmQgb3BlbiB0byBjYXRjaCB0aGUgZXJyb3IgaGFuZGxpbmcgZm9yIGV4ZWN2ZSgpCgogIHJlcG9ydCBlcnJvciBpZiBjZ2ktZXhlYyBmaWxlIGRvZXNuJ3QgZXhpc3QKCi0gcHJveHkKCiAgcGFzcyBwYWdlLWNvbnRlbnQgb24gZXJyb3IgdG8gdGhlIHVzZXIgKEUuUi4pCiAgY29kZSBjbGVhbnVwIChFLlIuKQoKLSBzc2kKCiAgZmlyc3Qgc2tlbGV0b24gb2YgYSBwbHVnaW4gZm9yIFNlcnZlclNpZGVJbmNsdWRlcwoKLSBzZWN1cml0eQoKICBsaW1pdCB0aGUgaGVhZGVybGVuZ3RoIGFnYWluIHRvIDY0ayBtYXgKCjAzLjA3LjIwMDQgMTQ6MjMKLSBjb25maWd1cmUKCiAgZml4ZWQgY29tcGlsZS1jaGVjayBmb3IgbGlicGNyZSBpZiBwY3JlLWNvbmZpZyBkb2Vzbid0IHBvaW50IHRvIC91c3IvbGliCgowMi4wNy4yMDA0IDE4OjE3Ci0gYnVmZmVycwoKICBhbHdheXMgYWxsb2NhdGUgYSBtdWx0aXBseSBvZiA2NGJ5dGVzLiB0aGlzIHNob3VsZCByZWR1Y2UgdGhlIG51bWJlciBvZgogIHJlYWxsb2MoKXMgYW5kIHN0aWxsIGRvZXNuJ3QgaGFzIGEgdG9vIGhpZ2ggb3ZlcmhlYWQuCgowMi4wNy4yMDA0IDExOjA3Ci0gZmRzCgogIGNvbm5lY3Qgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIHRvIC9kZXYvbnVsbCBpbnN0ZWFkIG9mIGp1c3QgY2xvc2luZyBpdAogIHVzZSBkdXAyKCkgaW5zdGVhZCBvZiBkdXAoKQoKLSBhY2Nlc3Nsb2cKCiAgaWYgYWNjZXNzbG9nLmZpbGVuYW1lIHN0YXJ0cyB3aXRoIGEgfCBzcGF3biBhIHByb2Nlc3Mgd2hpY2ggd2lsbCBnZXQgZGF0YQogIGluIG9uZSBjaHVuayBvbmNlIGluIGEgd2hpbGUKCjAxLjA3LjIwMDQgMTE6MDAKLSBzYW1wbGUgY29uZmlnCgogIGFkZGVkIHRleHQvY3NzIGFuZCB0ZXh0L2phdmFzY3JpcHQgbWltZXR5cGVzCgoyOC4wNi4yMDA0IDEyOjE4Ci0gcHJveHkgbW9kdWxlCgogIGFkZGVkIGEgcHJveHkgbW9kdWxlIChiYXNlZCBvbiB0aGUgZmFzdGNnaSBtb2R1bGUpIGFuZCBhZGRlZCBzb21lCiAgZG9jdW1lbnRhdGlvbgoKMjUuMDYuMjAwNCAyMTo0MQotIGxhc3QtbW9kaWZpZWQgaGFuZGxpbmcKCiAgcmVwbGFjZWQgJVogYnkgR01ULiBvdGhlcndpc2UgdGhlIGxhc3QtbW9kaWZpZWQgY2hlY2sgd2lsbCBtb3N0IG9mdGVuIGZhaWwuCgoyNC4wNi4yMDA0IDIwOjIwCi0gcmVsYXggaHR0cC1wYXJzZXIKCiAgZG9uJ3QgcmVwbHkgNDAwIGluIGNhc2Ugb2YgYW4gZW1wdHkgaGVhZGVyLWZpZWxkLCBqdXN0IGlnbm9yZSBpdAoKMjMuMDYuMjAwNCAyMjoxMAotIGZpbGUtY2FjaGUKCiAgZG9uJ3QgY2FjaGUgbW1hcCgpIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA2NGsgYXMgd2UgcnVuIG91dCBvZiBSQU0gb3RoZXJ3aXNlCiAgdG9vIGZhc3QgKGNoZWNrIHdpdGggc29tZSAyMDBtYiBmaWxlcykKCi0gNjRiaXQgZml4ZXMKCiAgZml4ZWQgYnVmZmVyX2VxdWFsIG9uIHNwYXJjNjQKCjE1LjA2LjIwMDQgMTk6MDkgLSAxLjIuMgotIG1tYXAgY2FjaGUKCiAgZml4ZWQgbW1hcC1jYWNoaW5nIGluIG5ldHdvcmtfd3JpdGUuYyBhbmQgbmV0d29ya193cml0ZXYuYyBhZnRlciBhIGRpcmVjdAogIGhpbnQgYnkgRS5Sb2RpY2hldgoKLSBzZW5kZmlsZSArIGxpbnV4CgogIGNoZWNrIGF0IGNvbmZpZy10aW1lIGlmIHNlbmRmaWxlKCkgd29ya3Mgb24gTGludXgKCjExLjA2LjIwMDQgMTU6MDkKLSBmY2dpICsgdW5peCBzb2NrZXRzCgogIGFkZGVkIHN1cHBvcnQgZm9yIHVuaXggZG9tYWluIHNvY2tldHMgKHNwYXduLWZjZ2kgMS4yLjAgcmVxdWlyZWQpCgoxMC4wNi4yMDA0IDExOjQ5Ci0gY29uZmlndXJlCgogIHVzZSBwY3JlLWNvbmZpZyB0byBkZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBwY3JlIGhlYWRlcnMKCjA1LjA2LjIwMDQgMjI6MDYKLSBmaWxlaGFuZGxlLWNhY2hlCgogIHJlbW92ZSBtbWFwLXNlZ21lbnQgaWYgZmlsZWNhY2hlIGdldHMgaW52YWxpZGF0ZWQKCjMwLjA1LjIwMDQgMTQ6MTMgLSBsaWdodHRwZCAxLjIuMQotIHJlc3BvbnNlIGhlYWRlcnMKCiAgcmVxdWVzdCBoZWFkZXJzIHRoYXQgYXBwZWFyIHR3aWNlIGFyZSBncm91cGVkIHRvZ2V0aGVyIGxpa2UgZXhwZWN0ZWQgYnkKICB0aGUgQ0dJIHNwZWMgKGNvbmNhdCB3aXRoIGEgIiwgIikKICByZXNwb25zZSBoZWFkZXJzIGJlaGF2ZWQgdGhlIHNhbWUgd2F5IGJ1dCBhcmUgbm90IGdyb3VwZWQgYW55bW9yZS4gVGhleQogIHN0YXkgc2VwZXJhdGVkLiBBY3R1YWxseSB0aGV5IGFyZSBjb25jYXRlZCBieSBcclxuPGtleT46IDx2YWx1ZT4gd2hpY2ggaXMKICB0aGUgc2FtZSBpbiB0aGUgZW5kLgoKLSBmaWxlIHVwbG9hZHMKCiAgdGhlIGhhbmRsaW5nIG9mIGxvbmdlciBwb3N0IHJlcXVlc3RzIGlzIGZpeGVkIG5vdy4KCjI4LjA1LjIwMDQgMDk6MTMKLSBjZ2kKCiAgYWRkZWQgc3VwcG9ydCBmb3IgZGlyZWN0IGNhbGxzIHRvIGNnaS1iaW5hcnkKCjIyLjA1LjIwMDQgMjE6NTgKLSBwaXBlbGluZwoKICB0aGUgY29kZSBjbGVhbnVwIGlzIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4gTm93IGFsbCBjYXNlcyBvZiBwaXBlbGluaW5nIGFyZQogIGhhbmRsZSB0aGUgcmlnaHQgd2F5LiBQT1NUIHBpcGVsaW5pbmcgd2FzIHN0aWxsIG5vdCB3b3JraW5nIHVwIHRvIG5vdy4KCjIyLjA1LjIwMDQgMTI6NTUKLSBjb2RlIGNsZWFudXAKCiAgdXNlIHRoZSB3ZWxsLXRlc3RlZCBjb2RlIGZyb20gdGhlIHdyaXRlLXF1ZXVlIGFzIHRoZSBiYXNlIGZvciB0aGUKICByZWFkLXF1ZXVlcyBhbmQgc2ltcGxpZnkgdGhlIHBpcGVsaW5lIGhhbmRsaW5nIGFsb3QgdGhhdCB3YXkuCgoyMC4wNS4yMDA0IDE1OjA4Ci0gbmV0d29yayBiYWNrZW5kcwoKICBlbmFibGVkIHNlbmRmaWxlIHN1cHBvcnQgYWdhaW4gKF9fRnJlZUJTRF9fIGluc3RlYWQgb2YgX19mcmVlYnNkX18pCgogIGFkZGVkIGEgbW1hcCBjYWNoZSBhcyBwYXJ0IG9mIHRoZSBmaWxlZGVzY3JpcHRvciBjYWNoZQoKICBhZGRlZCBBSVggc3BlY2lmaWMgc2VuZF9maWxlKCkgc3VwcG9ydCAodW50ZXN0ZWQpCgoyMC4wNS4yMDA0IDEwOjQwCi0gc2VnZmF1bHRzCgogIGZpeGVkIHNvbWUgbWlub3Igc2VnZmF1bHRzIG9uIHN0YXJ0dXAgd2hlbiBubyBjb25maWcgZmlsZSBpcyB1c2VkLgoKMTcuMDUuMjAwNCAxMDo1OCAtIGxpZ2h0dHBkIDEuMi4wCi0gZG9jdW1lbnRhdGlvbgoKICByZWZvcm1hdGVkIHRoZSBkb2N1bWVudGF0aW9uIHRoZSBkb2MvIGRpcmVjdG9yeQoKMTUuMDUuMjAwNCAxNDo0NQotIGxvY2FsaXplcgoKICBmaXhlZCBidWlsZCBvZiBsb2NhbGl6ZXIgZXh0ZW5zaW9uCgoxNS4wNS4yMDA0IDEyOjM1Ci0gUE9TVCByZXF1ZXN0cwoKICB0aGVyZSBpcyBubyBuZWVkIHRvIGRpZSBpZiB3ZSBzcG90IGEgc2ltcGxlIFBPU1QgcmVxdWVzdCBvbiBhIHN0YXRpYyBmaWxlCgotIHBpcGVsaW5pbmcKCiAgZml4ZWQgSFRUUC8xLjEgcGlwZWxpbmluZyB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW1zIHdpdGggb3BlcmEKCi0gYXJyYXkgaGFuZGxpbmcKCiAgaG93IGRpZCB0aGF0IGJ1ZyBzdXJ2aXZlIHN1Y2ggYSBsb25nIHRpbWUgPyBhIHdyb25nIGNvbXBhcmUgZnVuY3Rpb24gd2FzCiAgdXNlZCBpbiBvbmUgY2FzZSwgYnV0IG5vdCB0aGUgb3RoZXIuCgoxNS4wNS4yMDA0IDAzOjIwCi0gc2VjdXJlIGFuZCBmYXN0IGRvd25sb2FkcwoKICBhZGRlZCBhIG1vZHVsZSB3aGljaCBhbGxvd3Mgc2VjdXJlIGFuZCBmYXN0IGRvd25sb2FkaW5nIG9mIGZpbGVzOgogIDEuIHRoZSBhcHBsaWNhdGlvbiAoLnBocCwgLi4uKSBjb250cm9scyB0aGUgYWNjZXNzIHRvIHRoZSBmaWxlcwogIDIuIHRoZSB3ZWJzZXJ2ZXIgaXMgaGFuZGxpbmcgdGhlIHRyYW5zZmVyIChhbmQgY2hlY2sgdGhlIGFwcCBnZW5lcmF0ZWQKICAgICB0b2tlbnMpCgogIHRoZSB0b2tlbiBpcyBiYXNlZCBvbgogIC0gYSBzZWNyZXQKICAtIGEgdGltZXN0YW1wCiAgLSB0aGUgZmlsZW5hbWUKICB0aGlzIG1lYW5zIGV2ZW4gaWYgdGhlIHRva2VuIGlzIGlzIGRpc3RyaWJ1dGVkIGJ5IHRoZSB1c2VyIGl0IHdpbGwgZ2V0CiAgaW52YWxpZCBhZnRlciBhIGdpdmVuIHRpbWVvdXQgKGRlZmF1bHQgNjAgc2Vjb25kcykKCi0gZXJyb3JmaWxlcwoKICBjaGVjayBmb3IgZXJyb3JmaWxlcyBiZWZvcmUgdXNpbmcgdGhlbQoKLSBjb2RlIGNsZWFudXAKCiAgYXBwbGllZCBjbGVhbnVwIGZpeGVzIGZyb20gYWRhbQoKMTQuMDUuMjAwNCAxODo0NwotIGZkZXZlbnQgaGFuZGxpbmcKCiAgYWRkZWQgYSBtb3JlIGdlbmVyaWMgY2FsbGJhY2sgaW50ZXJmYWNlIHRvIHRoZSBmZGV2ZW50IHN0cnVjdHVyZXMgd2hpY2gKICBzaW1wbGlmaWVzIHRoZSB3cml0aW5nIG9mIHBsdWdpbnMuIHRoaXMgbWlnaHQgZGVzdGFiaWxpemUgbGlnaHR0cGQgZm9yIGEKICB3aGlsZQoKLSBjZ2kKCiAgZml4ZWQgaGVhZGVyIHBhcnNpbmcgb2YgdGhlIGhlYWRlciBpcyBzZW50IGluIGNodW5rcyBhbmQgdGhlIHRlcm1pbmF0b3IgaXMKICBzZW50IGluIGEgc2luZ2xlIGNodW5rCgotIEVJTlRSCgogIGZpeGVkIHNvbWUgb2NjdXJlbmNlcyBvZiBFSU5UUiB3aGljaCByZWFkKCkKCjAzLjA1LjIwMDQgMjM6NTUKLSBwb3J0YWJpbGl0eQoKICBFLlIuOgogICogcG9ydGFiaWxpdHkgZml4ZXMgZm9yIFNvbGFyaXMgMi41CgowMi4wNS4yMDA0IDEwOjE1Ci0gRXhwZWN0OiBIYW5kbGluZwoKICBhZGRlZCBpbmNvbXBsZXRlIHN1cHBvcnQgZm9yIEV4cGVjdDogMTAwLWNvbnRpbnVlIChSRkMgMjYxNiA4LjIuMykgYnkKICBzZW5kaW5nIGFsd2F5cyA0MTcgZm9yIGV2ZXJ5IEV4cGVjdC1yZXF1ZXN0IChzZWUgMTQuMjApCgogIHdlIGhhdmUgYmVlbiBibGFtZWQgZm9yIG5vdCBzdXBwb3J0aW5nIGl0OgogIGh0dHA6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL2lldGYtaHR0cC13Zy8yMDA0SmFuTWFyLzAwNTkuaHRtbAoKMjkuMDQuMjAwNCAyMzowNyAtIDEuMS45Ci0gdXNlcnRyYWNraW5nCgogIGFkZGVkIGEgdmVyeSBiYXNpYyB1c2VydHJhY2tpbmcgY29va2llIGhhbmRsZXIKCjI5LjA0LjIwMDQgMTk6MzcKLSBuZXR3b3JrLXdyaXRldgoKICBBZGFtOgogICogY2FsbCBtdW5tYXAoKSBvbiBlcnJvciBpbiB3cml0ZSgpCgotIGRvY3MKCiAgRS5SOgogICogZG9jdW1lbnRlZCAnY2hlY2stbG9jYWwnCgotIHRlc3QtZW52CgogIG1hZGUgdGhlIHNoZWxsIHNjcmlwdHMgbW9yZSBwb3J0YWJsZSAoY2hlY2tlZCB3aXRoIHpzaCwgYmFzaCBhbmQga3NoKQoKICBmaXhlZCBjb21waWxhdGlvbiBvbiBOZXRCU0QKCjI4LjA0LjIwMDQgMjI6MjIKLSBGYXN0Q0dJCgogIEUuUm9kaWNoZXY6CiAgKiBhZGRlZCAiQXV0aG9yaXplciIgbW9kZSBmb3IgRmFzdENHSQoKMjcuMDQuMjAwNCAxODowOAotIHNzbAoKICBBbGV4ZXkgU2x5bmtvOgogICogaGFuZGxlIFNTTF9FUlJPUl9XQU5UX1JFQUQgb3IgU1NMX0VSUk9SX1dBTlRfV1JJVEUgaW4gU1NMX3dyaXRlIHRoZQogICAgcmlnaHQgd2F5LgoKLSBGYXN0Q0dJCgogIGFkZCAnY2hlY2stbG9jYWwnIGluc3RlYWQgb2YgdGhlIGltcGxpY2l0ICdpZi1kb2Nyb290LWlzLXNldCcgaGFuZGxpbmcKICBpbXBsZW1lbnRlZCBhdCAyNC4wNC4yMDA0IDE0OjM0CgogIEUuUm9kaWNoZXY6CiAgKiByZW1vdmUgdXNlbGVzcyBleHRyYS0vIGluIGJlZm9yZSB1cmkucGF0aAogICogYWRkICdwcmVmaXgnIG5vdGF0aW9uIGZvciBGYXN0Q0dJIHByb2Nlc3NlcwoKMjYuMDQuMjAwNCAxNjo1MgotIGNvZGUgY2xlYW51cAoKICBwYXRjaGVzIGZyb20gQWxleGV5IFNseW5rbzoKICAqIHJlbW92ZSB0aGUgcGlkZmlsZSBpZiBsaWdodHRwZCB0ZXJtaW5hdGVzIHRoZSBub3JtYWwgd2F5IChpZiBub3QgaW4gY2hyb290KQogICogaW5pdCBTU0wgYmVmb3JlIGdldHRpbmcgZGFlbW9uaXplZAoKMjUuMDQuMjAwNCAxOS4xNQotIG1lbS1sZWFrCgogIGZpeGVkIG1lbS1sZWFrIG9uIGJyb2tlbiBIVFRQLWhlYWRlcnMKCi0gRmFzdENHSQoKICBwYXRjaGVzIGZyb20gRS5Sb2RpY2hldjoKCiAgMS4gQ09OVEVOVF9MRU5HVEgKICAiSWYgbm8gZGF0YSBhcmUgYXR0YWNoZWQsIHRoZW4gdGhpcyBtZXRhdmFyaWFibGUgaXMgZWl0aGVyIE5VTEwgb3Igbm90CiAgZGVmaW5lZCIuCgogIDIuIFFVRVJZX1NUUklORwogIElmIHRoZSBTY3JpcHQtVVJJIGRvZXMgbm90IGluY2x1ZGUgYSBxdWVyeSBjb21wb25lbnQsIHRoZSBRVUVSWV9TVFJJTkcKICBtZXRhdmFyaWFibGUgTVVTVCBiZSBkZWZpbmVkIGFzIGFuIGVtcHR5IHN0cmluZyAoIiIpLgoKICAzLiBEb3VibGluZyBvZiBSRU1PVEVfQUREUiByZW1vdmVkLgoKICBwYXRjaGVzIGZyb20gYWRhbToKICAqIGZpeGVkIGJ1ZyBpbiB0aGUgc2l6ZW9mKCkgcGF0Y2hlcyBmcm9tIHllc3RlcmRheS4KICAqIHNvbWUgbW9yZSAqX2xvbmcgdG8gKl9vZmZfdAoKMjQuMDQuMjAwNCAxNDozNAotIEZhc3RDR0kKCiAgZG9uJ3QgY2hlY2sgZm9yIGxvY2FsZmlsZSBpZiAnZG9jcm9vdCcgZm9yIGEgRmFzdENHSSBob3N0IGlzIHNwZWNpZmllZC4KCjI0LjA0LjIwMDQgMTI6MTMKLSBQT1NUCgogIGZpeGVkIFBPU1QgcmVxdWVzdCBoYW5kbGluZwoKLSBjaHVuay1lbmNvZGluZwoKICB0aGUgZ2VuZXJhdGVkIEhFWCBzdHJpbmdzIHdoZXJlIGJyb2tlbiBzaW5jZSB0aGUgMS4xLjgKICAodGhpcyBlZmZlY3RlZCBhbGwgSFRUUC8xLjEgcmVxdWVzdHMgd2l0aG91dCBDb250ZW50LUxlbmd0aCBsaWtlIEZhc3RDR0ktUEhQKQoKLSBjb2RlIGNsZWFudXAKCiAgcGF0Y2hlcyBmcm9tIGFkYW06CiAgKiBtYWxsb2MgKyBtZW1zZXQgLT4gY2FsbG9jCiAgKiBzaXplb2YoaW50KSAtPiBzaXplb2YoPHZhcmlhYmxlPikKICAqIGFzc2lnbiBmZF9zZXQgaW5zdGVhZCBvZiBtZW1jcHkoKQogICogaW5pdCBmZCAtPiBjb25uZWN0aW9uIGZkIHBvaW50ZXJzIHRvIC0xCgoxNi4wNC4yMDA0IDA4OjQ4IC0gMS4xLjgKLSBjb2RlIGNsZWFudXAKCiAgZG9uJ3QgcmV1c2UgYnVmZmVyID4gNjRrIChzZWUgc2V0dGluZ3MuaCkKCiAgYWRkZWQgc2VydmVyLm1heC1yZXF1ZXN0LXNpemUgdG8gbGltaXQgdGhlIG1heGltdW0gcmVxdWVzdC1ib2R5IHNpemUKICAoaW4ga0J5dGVzKQoKICBkb24ndCBhY2NlcHQgSFRUUC1yZXF1ZXN0IGhlYWRlcnMgbGFyZ2VyIHRoZW4gMzJrQnl0ZXMgKHNlZSBzZXR0aW5ncy5oKQoKICBtaW5vciBzcGVlZCBpbXByb3ZlbWVudHMgaW4gdGhlIHJlcXVlc3QtcGFyc2VyCgogIE1vcmUgY2xlYW51cCBwYXRjaGVzIGZyb20gYWRhbToKCiAgKiBjaGFuZ2UgcHJlLUFOU0kgQy92YWxpZCBDKysgc3ludGF4IGZvciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMvZGVmaW5pdGlvbnMKICAgIGZyb20gdXNpbmcgKCkgdG8gKHZvaWQpLiAgRXg6IGludCBmb28oKTsgLS0+IGludCBmb28odm9pZCk7CiAgKiB1c2Ugc3RhdGljIGxpbmthZ2UgYXMgbXVjaCBhcyBwb3NzaWJsZSwgdG8gbGltaXQgcG9zc2libGUgc3ltYm9sCiAgICBjb2xsaXNpb25zCiAgKiB3aGFjayBtb3JlIHVubmVlZGVkIHZhcmlhYmxlcwogICogdHJ5IGFuZCBwcmV2ZW50IGFueSBlcnJubyBjbG9iYmVyaW5nIGJ5IHN0b3JpbmcgdGhlIG9sZCBlcnJubyB2YWx1ZSBiZWZvcmUKICAgIGFueSBzdWJzZXF1ZW50IHN5c3RlbSBjYWxscywgYW5kIHJlc3RvcmluZyBiZWZvcmUgZnVuY3Rpb24gZXhpdC4KICAqIGNoYW5nZSBwcmludGYgc3ludGF4IGZvciB1bnNpZ25lZCB2YXJpYWJsZXMgZnJvbSAlZCB0byAldQoKMTUuMDQuMjAwNCAxODo0MQotIGNvZGUgY2xlYW51cAoKICBoYW5kbGUgYWxsIGludCAhPSBzaXplX3QgY2FzZXMgaW4gZmNnaS5jIGNvcnJlY3RseQoKICBjaGVjayBoZWFkZXJmaWVsZHMgdG8gaGF2ZSBhIHZhbHVlCgogIGhhbmRsZSBib3RoIEVJTlZBTCBjYXNlcyBvZiB3cml0ZXYoKSBiZWZvcmUgdGhlIGNhbiBvY2N1cgoKICBsaW1pdCBjb250ZW50LWxlbmd0aCB0byBTU0laRV9NQVgKICBkaXNhbGxvdyBuZWdhdGl2ZSBjb250ZW50LWxlbmd0aAoKICB0aGUgdXNhZ2Ugb2YgbHRvc3RyKCkgaGFzIGJlZW4gcmVkdWNlZCB0byB0aGUgbWluaW11bSBpbiBmYXZvdXIgb2YKICBidWZmZXJfL2FwcGVuZHxjb3B5KV8obG9uZ3xvZmZfdCkKCiAgZHJvcHBlZCB1bHRvc3RyKCkgYW5kIHVsdG9oZXgoKSBpbiBmYXZvdXIgb2YgYnVmZmVyXyoKCjE1LjA0LjIwMDQgMTY6MzUKLSBwb3J0YWJsaXR5CgogIG1vcmUgcGF0Y2hlcyBmcm9tIGFkYW06CgogICogcmVtb3ZlIHdhcm5pbmdzIGZvciB1bnVzZWQgcGFyYW1ldGVycyBhbmQgdmFyaWFibGVzCiAgKiByZW1vdmUgd2FybmluZ3MgZm9yIG1pc21hdGNoZWQgcG9pbnRlciBhc3NpZ25tZW50cwogICogY2hhbmdlICJndGltZV9yIiB0byAiZ210aW1lX3IiCgoxMy4wNC4yMDA0IDIwOjQ4Ci0gdGVzdC1jYXNlcwoKICBtYWRlIHRoZSAnbWFrZSBjaGVjaycgdGFyZ2V0IHNlbGYtY29udGFpbmVkCgogIEluIG91ciBjYXNlIHdlIGhhdmUgdG8gY2FsbCB0aGUgdGFyZ2V0cyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAkIC4vY29uZmlndXJlIC4uLgogICQgbWFrZQogICQgbWFrZSBpbnN0YWxsCiAgJCBtYWtlIGNoZWNrCgogIGJlY2F1c2UgdGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgaXMgaGFyZGNvZGVkIGluIHRoZSBiaW5hcnkgaXRzZWxmCgogIHVzaW5nCgogICQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3RtcC9saWdodHRwZC0xLjEueC8KICAuLi4KCiAgd2lsbCBoZWxwIGlmIHlvdSBkb24ndCByZWFsbHkgd2FudCB0byBpbnN0YWxsIGJlZm9yZSB0ZXN0aW5nLgoKMTMuMDQuMjAwNCAwMDowNQotIHBvcnRhYmlsaXR5CgogIGFkYW0gc2VudCBhbm90aGVyIHBhdGNoc2V0OgoKICAqIFdyYXAgUENSRS1zcGVjaWZpYyBkYXRhIG1lbWJlciBhY2Nlc3Mgd2l0aCBhbiAjaWZkZWYKICAqIEFkZCBjb25zdCB0byBwb2ludGVyIHVzaW5nIHJldHVybiB2YWx1ZSBmcm9tIGRsZXJyb3IoKQogICogRXhwbGljaXRseSBpbml0aWFsaXplIHBvaW50ZXIgaW4gdGhlIGxlbW9uIHBhcnNlciB0byAwLAogICAgaW4gb3JkZXIgdG8gY2F0Y2ggbWlzc2luZyBlbHNlIHsgfSBjbGF1c2UKICAqIFVzZSBhIHRpbWVfdCByYXRoZXIgdGhhbiBhbiBpbnQgZm9yIGdtdGltZSgpIGNhbGwuICBPbiBzb21lCiAgICBzeXN0ZW1zIChpbmNsdWRpbmcgMzItIGFuZCA2NC1iaXQgU1BBUkMpIHRpbWVfdCBpcyBhIGxvbmcuCgoxMi4wNC4yMDA0IDE3OjAwIC0gMS4xLjcKLSBmYXN0Y2dpCgogIHN0cmlwIFdTIGFmdGVyIEhUVFAtcmVzcG9uc2UgaGVhZGVycyBjb21pbmcgZnJvbSB0aGUgRmFzdENHSSBwcm9jZXNzCgogIGFkZGVkIFJFTU9URV9VU0VSIHRvIHRoZSBTZXJ2ZXItPkZhc3RDR0kgaGVhZGVycwogIHJlbW92ZWQgSFRUUF9BVVRIT1JJWkFUSU9OIGZyb20gdGhlIFNlcnZlci0+RmFzdENHSSBoZWFkZXJzCgoxMi4wNC4yMDA0IDEwOjI0Ci0gY2dpCgogIGlmIHdlIGRvbid0IGdldCBhIHBhcnRpYWwgSFRUUC1yZXNwb25zZS1oZWFkZXIgc2VuZCB0aGUgY29udGVudCBvdXQgYXMgc29vbgogIGFzIHRoZSBjZ2kgc2NyaXB0IGlzIGZpbmlzaGVkCgoxMi4wNC4yMDA0IDAxOjIzCi0gY29tcHJlc3Npb24KCiAgYWRkZWQgYnppcDIgY29tcHJlc3Npb24gKHN1cHBvcnRlZCBieSB3M20pCgoxMi4wNC4yMDA0IDAwOjEyCi0gY29uZmlnZmlsZQoKICBhZGQgc29tZSB1c2VmdWxsIGVycm9yIG1lc3NhZ2VzIGlmIHRoZSB0b2tlbml6ZXIgb3IgdGhlIHBhcnNlciBmYWlsIHRvCiAgcmVhZCB0aGUgY29uZmlnZmlsZQoKMTEuMDQuMjAwNCAyMjowNAotIGNvbmZpZ3VyZQoKICBhZGRlZCAtLXdpdGgtbGRhcCBhbmQgLS1kaXNhYmxlLWxmcyB0byB0aGUgY29uZmlndXJlIG9wdGlvbnMKCjExLjA0LjIwMDQgMjA6MjgKLSA2NGJpdCBvZmZzZXQgc2l6ZQoKICBkaXNhYmxlIGxpbnV4LXNlbmRmaWxlIHN1cHBvcnQgZm9yIGxpbnV4IDIuNC54IGZvciBub3cgYXMgaXQgZG9uJ3QKICBzdXBwb3J0IDY0Yml0IHRyYW5zZmVycwoKICBmaXhlZCBhbGwgYXNzaWdubWVudHMgb24gdGhlIHBhdGggZnJvbSB0aGUgc3RhdCgpIHRvIHRoZSBDb250ZW50LUxlbmd0aAogIEhUVFAtaGVhZGVyCgotIGhlYWQgcmVxdWVzdHMKICBzZXQgY29udGVudC1sZW5ndGggaW4gSEVBRCByZXF1ZXN0cwoKLSBhY2Nlc3Nsb2cKCiAgd3JpdGUgYWNjZXNzbG9nIGVudHJ5IG9uIG5ldHdvcmsgZXJyb3IKCiAgd3JpdGUgdGhlIGNvcnJlY3QgYW1vdW50IG9mIGJ5dGUgd3JpdHRlbiB0byB0aGUgYWNjZXNzbG9nCgoxMS4wNC4yMDA0IDExOjQ4Ci0gY29kZSBjbGVhbnVwCgogIG1vdmVkIHRoZSBjb25maWcgZm9yIHRoZSBjZ2ktcGx1Z2luIGZyb20gY29uZmlnLmMgdG8gdGhlIHBsdWdpbi4KCiAgbW92ZWQgc29tZSBidWZmZXJzIHdoaWNoIHdlcmUgb25seSB1c2VkIGJ5IGEgb25lIG9yIHR3byBwbHVnaW4gZnJvbQogIHRoZSBzZXJ2ZXItc3RydWN0dXJlIHRvIHRoZSBwbHVnaW5zCgogIGtlZXBpbmcgdGhlIHBsdWdpbnMgaW5kZXBlbmRlbnQgZnJvbSB0aGUgc2VydmVyLWNvcmUgaXMgYSAnZ29vZCB0aGluZycKCjEwLjA0LjIwMDQgMTk6MDYKLSBjb25maWdmaWxlIHBhcnNlcgoKICByZW1vdmVkIHRoZSBsZWFrcyBmcm9tIHRoZSBjb25maWdmaWxlIHBhcnNlcgoKMDkuMDQuMjAwNCAyMzoxNSAtIDEuMS42Ci0gc3RyaWN0ZXIgaHR0cC1wYXJzZXIKCiAgYWRkZWQgbGluZS1mb2xkaW5nIGFsdGhvdWdoIG5vb25lIHJlYWxseSBzZWVtcyB0byB1c2UgaXQuCgowOS4wNC4yMDA0IDE4OjQyCi0gY29uZmlnZmlsZSBwYXJzZXIKCiAgdGhlIGhhbmQtd3JpdHRlbiBjb25maWdmaWxlIHBhcnNlciBoYXMgYmVlbiByZXBsYWNlZCBieSBhIExBTFIoMSkgb25lLgogICdsZW1vbicgZnJvbSB0aGUgc3FsaXRlIGd1eXMgaGFzIGJlZW4gdXNlZCB0byBnZW5lcmF0ZSB0aGUgcGFyc2VyLgoKLSBieS1ob3N0LCBieS11cmwsIGJ5LWZpbGUsIGJ5IC4uLgoKICAkSFRUUFsidXJsIl0gPX4gIn4kIiB7CiAgICBhY2Nlc3MuZGVueSA9ICJhbGwiCiAgfQoKICAkSFRUUFsiaG9zdCJdID1+ICIuIiB7CiAgICBzaW1wbGUtdmhvc3Quc2VydmVyLXJvb3QgICAgPSAiL2hvbWUvd2VpZ29uL3d3d3Jvb3Qvc2VydmVycy8iCiAgICBzaW1wbGUtdmhvc3QuZGVmYXVsdC1ob3N0ICAgPSAiZ3Jpc3UuaG9tZS5rbmVzY2hrZS5kZSIKICAgIHNpbXBsZS12aG9zdC5kb2N1bWVudC1yb290ICA9ICJwYWdlcyIKICB9CgogICRIVFRQWyJob3N0Il0gPT0gImluY3JlbWVudGFsLmhvbWUua25lc2Noa2UuZGUiIHsKICAgIHNlcnZlci5kb2Nyb290ICAgICAgICAgICAgICA9ICIvaGFzZGFzZCIKICB9CgogIGF0IGxlYXN0IHRoZSBwYXJzZXIgY2FuIGhhbmRsZSBpdCBub3cuIEN1cnJlbnRseSB0aGVyZSBpcyBubyByZWFsIHN1cHBvcnQKICBmb3IgdGhpcyBjb250ZXh0LWJhc2VkIGNvbmZpZy1vcHRpb24uIEJ1dCB0aGUgc3ludGF4IGFuZCB0aGUgcGFyc2VyIGFyZQogIGRvbmUuCgowOS4wNC4yMDA0IDEwOjU4Ci0gc3NsIHN1cHBvcnQKCiAgZW5hYmxlIHNzbCBzdXBwb3J0IGFnYWluCgotIG1tYXAKCiAgZW5hYmxlZCBtbWFwK3dyaXRlIGFnYWluCgowOC4wNC4yMDA0IDEyOjM0Ci0gc3RyaWN0ZXIgaHR0cC1wYXJzZXIKCiAgYmFzZWQgb24gYSB0aHJlYWQgYXQKCiAgaHR0cDovL2xpc3RzLnczLm9yZy9BcmNoaXZlcy9QdWJsaWMvaWV0Zi1odHRwLXdnLzIwMDRKYW5NYXIvMDA1MC5odG1sCgogIHRoZSBIVFRQLXBhcnNlciBoYXMgYmVlbiBhZGp1c3RlZCB0byBiZSBtb3JlIGNvcnJlY3Qgd2hlbiBpdCBjb21lcyB0bwogIHJlcXVlc3QtaGVhZGVyIGZpZWxkbmFtZXMKCiAgdGhlIHdoaXRlc3BhY2UgaGFuZGxpbmcgYXJvdW5kIHRoZSAnOicgaGFzIGJlZW4gcmVsYXhlZCBhcyByZXF1ZXN0ZWQKCjA3LjA0LjIwMDQgMTc6MDYKLSBzaWdhY3Rpb24KCiAgdXNlIHNpZ2FjdGlvbiBpbnN0ZWFkIG9mIHNpZ25hbCBpZiBwb3NzaWJsZQoKMDcuMDQuMjAwNCAxMzo1NQotIGFjY2Vzc2xvZwoKICB1c2UgbG9jYWx0aW1lLXRpbWVzdGFtcHMgaW4gYWNjZXNzbG9ncyBpZiBzdHJ1Y3QgdG0gaGFzIGEgdG1fZ210b2ZmIGZpZWxkCgowNy4wNC4yMDA0IDEwOjQxIC0gMS4xLjUKLSAtRF9SRUVOVFJBTlQKCiAgc29sYXJpcyArIGxvY2FsdGltZV9yKCkgbmVlZHMgaXQKCjA3LjA0LjIwMDQgMDI6NTQKLSBtb2RfYXV0aCArIGxkYXAKCiAgYWRkZWQgYSBsZGFwIGJhY2tlbmQgdG8gdGhlIGF1dGggcGx1Z2luLgoKMDYuMDQuMjAwNCAxMzozNwotIHBpZGZpbGUKCiAgZml4ZWQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBwaWRmaWxlIChNYXR0aGlqcyB2YW4gZGVyIEtsaXApCgotIHNwZWNmaWxlCgogIG1lcmdlIHRoZSBSZWRIYXQgYW5kIFN1U0Ugc3BlY2ZpbGUgd2l0aCBNYXR0aGlqcwoKLSA2NGJpdCBmaWxlLW9mZnNldHMKCiAgbW92ZWQgdGhlIEZJTEVfT0ZGU0VUX0JJVFMgc2V0dGluZ3MgZnJvbSB0aGUgY29uZmlnLmggdGhlIE1ha2VmaWxlIHRvIGVuYWJsZQogIDY0Yml0IG9mZnNldHMgdGhlIHJpZ2h0IHdheQoKMDYuMDQuMjAwNCAxMjozMgotIG1vZF9leHBpcmUKCiAgYWRkZWQgYW4gYXBhY2hlIGNvbXBhdGlibGUgbW9kX2V4cGlyZSB3aGljaCBhZGRzIEV4cGlyZXM6IGhlYWRlcnMgdG8gdGhlCiAgcmVxdWVzdAoKICBleHBpcmUudXJsID0gKCAiL2J1Z2d5LyIgPT4gImFjY2VzcyAyIGhvdXJzIiApCgowNS4wNC4yMDA0IDIyOjM0Ci0gc29sYXJpcyBkZXZwb2xsCgogIGZvcmdvdCB0byBwcm92aWRlIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBhY3R1YWxseSBlbmFibGUgdGhlIGRldnBvbGwgZXZlbnQKICBoYW5kbGVyLiB0aGUgc2FtZSBoYXMgYmVlbiBkb25lIGZvciB0aGUgZnJlZWJzZC1rcXVldWUgaGFuZGxlciAod2hpY2gKICBkb2Vzbid0IHdvcmsgeWV0KQoKICBmaXhlZCB0aGUgZGV2cG9sbCBzdXBwb3J0IHdoaWxlIHRlc3RpbmcgaXQgb24gYSByZWFsIHNvbGFyaXMgYm94CgowNS4wNC4yMDA0IDA5OjQ5Ci0gZGViaWFuCgogIGFkZGVkIGRlYmlhbiBwYWNrYWdpbmcgc3VwcG9ydCB3cml0dGVuIGJ5IFZpbmNlbnQgV2FnZWxhYXIKCi0gc29sYXJpcwoKICBBbm90aGVyIHNldCBvZiBwYXRjaGVzIGZvciBTb2xhcmlzIGZyb20gQWRhbQogICogRGV0ZWN0IDxzeXMvZGV2cG9sbC5oPgogICogRGV0ZWN0IGFuZCBpbmNsdWRlIDxzeXMvZmlsaW8uaD4gZm9yIGRlZmluaXRpb24gb2YgRklPTlJFQUQKICAqIERldGVjdCBhbmQgbGluayBhZ2FpbnN0IHRoZSBsaWJyYXJ5IGV4cG9ydGluZyBoc3RyZXJyb3IKICAqIENvcnJlY3QgdHlwbyBpbiBTRU5ERklMRV9MSUIKICAqIFVzZV9fc3VuIGluc3RlYWQgb2YgX19zb2xhcmlzX18gZm9yIGRldGVjdGluZyBvcGVyYXRpbmcgc3lzdGVtLgogICAgUGxlYXNlIHNlZSBodHRwOi8vcHJlZGVmLnNvdXJjZWZvcmdlLm5ldC9wcmVvcy5odG1sIGZvciBtb3JlCiAgICBkZXRhaWwKICAqIEV4cGxpY2l0bHkgY2FzdCBhcmd1bWVudHMgdG8gaXNhbHBoYSgpIGFuZCB0b3VwcGVyKCkgdG8gdW5zaWduZWQKICAgIGNoYXIuICBUaGUgbWFuIHBhZ2Ugc2F5cyB0aGF0IHRoZSBmdW5jdGlvbnMgc3VwcG9ydCB0aGUgcmFuZ2Ugb2YKICAgIGFuIHVuc2lnbmVkIGNoYXIsIGFuZCBFT0YuCiAgKiBJbmNsdWRlIDxsaW1pdHMuaD4gYW5kIGRlZmluZSBVSU9fTUFYSU9WIGFzIElPVl9NQVggZm9yIFNvbGFyaXMuCgowNC4wNC4yMDA0IDE4OjA1IC0gMS4xLjQKLSBwaWRmaWxlCgogIGFkZGVkIHBpZGZpbGUgd3JpdGluZyBhZnRlciBkZWFtb25pemluZwoKMDQuMDQuMjAwNCAwMTowNQotIGZkZXZlbnQKCiAgYWRkZWQgZnJhbWV3b3JrIGZvciBmcmVlYnNkX2txdWV1ZSBhbmQgc29sYXJpc19kZXZwb2xsCgogIHRoZSBzb2xhcmlzX2RldnBvbGwgb25lIG1pZ2h0IGV2ZW50IHdvcmsgKHVudGVzdGVkKQoKMDMuMDQuMjAwNCAxNjo0MQotIG5ldHdvcmsKCiAgYWRkZWQgZnJhbWV3b3JrIGZvciBmaWxlYmFzZWQgY2h1bmtzCiAgLSByZWFkLXdyaXRlICsgbW1hcC13cml0ZQogIC0gbGludXgtc2VuZGZpbGUKICAtIGZyZWVic2Qtc2VuZGZpbGUKICAtIHNvbGFyaXMtc2VuZGZpbGV2ICh1bnRlc3RlZCkKCiAgYW5kIG1lbW9yeWJhc2VkIGNodW5rcwogIC0gd3JpdGUKICAtIHdyaXRldgoKICBtYWRlIFRDUF9DT1JLIGEgJ2dsb2JhbCcgZmxhZyBhcm91bmQgdGhlIHdyaXRlX2NodW5rcXVldWUtY2FsbHMKCiAgdGhlIHdyaXRldigpIHN1cHBvcnQgc2hvdWxkIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIGZvciBhbGwgbm9uLXN0YXRpYwogIHBhZ2VzLgoKICAxNzAgcmVxL3MgYWdhaW5zdCAxNTggcmVxL3MgZm9yIHRoZSBmb2xsb3dpbmcgc2NyaXB0IGlmIHdyaXRldigpIGlzIHVzZWQKICBpbnN0ZWFkIG9mIHdyaXRlKCkKCiAgPD9waHAKCiAgZm9yICgkaSA9IDA7ICRpIDwgMTAwMDsgJGkrKykgewogICAgICBwcmludCAkaS4iPGJyIC8+XG4iOwogICAgICBmbHVzaCgpOwogIH0KCiAgPz4KCjI4LjAzLjIwMDQgMTM6NDIKLSBjbGVhbnVwCgogIGFwcGxpZWQgc29tZSBjbGVhbnVwIHBhdGNoZXMgc3VibWl0dGVkIGJ5IEFkYW06CiAgKiB2YXJpYWJsZXMgbW9kaWZpZWQgaW4gc2lnbmFsIGhhbmRsZXJzIHNob3VsZCBiZSBzaWdfYXRvbWljX3QKICAqIGFzc2VydCBzdGF0ZW1lbnRzIHNob3VsZCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMKICAqIFNURHtJTixPVVQsRVJSfV9GSUxFTk8gcHJlZmVycmVkIGluc3RlYWQgb2YgezAsMSwyfQogICogZGllaW5nIC0tPiBkeWluZwogICogU0VHRkFVTFQgY2FsbHMgYWJvcnQgZGlyZWN0bHksIGluc3RlYWQgb2YgZGVyZWZlbmNpbmcgYSBOVUxMIHBvaW50ZXIKCi0gbW9kX2FjY2Vzc2xvZwoKICBtb2RpZmllZCB0aGUgYWNjZXNzbG9nIGZvcm1hdCB0byBiZSBDTEYgY29tcGF0aWJsZQogIHNldCBsb2NhbGUgZm9yIExDX1RJTUUgdG8gQwoKMjYuMDMuMjAwNCAxNjoxMwotIHBhdGggaW5mbwoKICBlbmFibGVkIHRoZSBwYXRoaW5mbyBjb2RlIGFnYWluCgoKMjUuMDMuMjAwNCAxMzozMCAtIDEuMS4zCi0gcG9ydGFiaWxpdHkKCiAgY29tcGlsZXMgZmluZSBub3cgd2l0aG91dCBhbnkgcGF0Y2hlcyBvbiBJUklYCgotIGhvc3RuYW1lIGRldGVjdGlvbgoKICByZXdvcmtlZCAiZ2V0IHRoZSBob3N0bmFtZSBmb3IgSFRUUC8xLjAgcmVxdWVzdHMgd2hpY2ggZG9uJ3Qgc3BlY2lmeSBhCiAgSG9zdDogLi4uIiB0byBvbmx5IHF1ZXJ5IHRoZSBuYW1lIGluIHRoaXMgc2luZ2xlIGNhc2UgZm9yIHRoZSBzZXJ2ZXIgc2lkZQogIG9mIHRoZSBjb25uZWN0aW9uCgotIGVycm9ybG9nIGhhbmRsaW5nCgogIHN0ZGVyciBpcyBvbmx5IHVzZWQgdW50aWwgdGhlIGVycm9ybG9nIGlzIGluaXQnZWQKICBpZiBubyBlcnJvci1sb2cgaXMgc3BlY2lmaWVkLCBzeXNsb2coKSBpcyB1c2VkCiAgaWYgY3ljbGluZyBlcnJvci1sb2cgZmFpbHMsIHN5c2xvZygpIGlzIHVzZWQKCi0gYWNjZXNzbG9nIGN5Y2xpbmcKCiAgZG9uJ3QgZmFsbCBiYWNrIHRvIHN0ZG91dCBhbnltb3JlCgotIGV2ZW50LWhhbmRsZXIKCiAgdXNlIHBvbGwoKSBhcyB0aGUgZGVmYXVsdCBldmVudC1oYW5kbGVyIGFnYWluCgoyNC4wMy4yMDA0IDAxOjM3IC0gMS4xLjJhCi0gZXJyb3IgbWVzc2FnZXMKCiAgYWRkZWQgc29tZSBoaW50cyB0byB0aGUgZmFpbGluZyBlcnJvci1tZXNzYWdlcwoKMjIuMDMuMjAwNCAwMTo1OCAtIDEuMS4yCi0gY29uZmlndXJlCgogIHNvbWUgcHJvdGFiaWxpdHkgY2hhbmdlcyB0byBnZXQgdGhlICdpbmxpbmUnIHdvcmtpbmcgd2l0aCB0aGUgTUlQUyBDQwoKMjEuMDMuMjAwNCAyMjowMAotIG1vZF9yZXdyaXRlLCBtb2RfcmVkaXJlY3QKCiAgcmVhZGluZyB0aGUgY29uZmlnIGZvciB0aG9zZSB0d28gcGx1Z2lucyB3YXMgbm90IHdvcmtpbmcKCi0gZmRldmVudHMKCiAgY2hhbmdlZCB0aGUgY29tcGlsZSB0aW1lIHNldHRpbmcgZm9yIHRoZSBldmVudCBoYW5kbGluZyBpbnRvIGEgcnVuLXRpbWUKICBzZXR0aW5nLgoKICBzZXJ2ZXIuZXZlbnQtaGFuZGxlciA9ICJzZWxlY3QiICMgcG9sbCwgbGludXgtcnRzaWcsIGxpbnV4LXN5c2Vwb2xsCgogIGFkZGVkIHN5c19lcG9sbCgpIGZvciBsaW51eCAyLjYKCiAgc2VsZWN0ICAgICAgIC0gYWxsIHN5c3RlbXMKICBwb2xsICAgICAgICAgLSBMaW51eCAyLjEuMjMrLCBhbGwgWFBHNC1VTklYCiAgc2lnaW8gICAgICAgIC0gbGludXggMi40LjArCiAgc3lzZXBvbGwgICAgIC0gbGludXggMi41LjY2KwoKICAgICAgICAgICAxMDAwLTRrLW5vayAgIDEwMDAtMTAway1ub2sKICBzZWxlY3QgICAgICAgMTc3Ni45OSAgICAgICAgICAyOTYuNTIKICBwb2xsICAgICAgICAgIDY3OC4wMiAgICAgICAgICA2MDcuMjgKICBzaWdpbyAgICAgICAgMzc1NC40NiAgICAgICAgIDE0MTEuMjMKICBzeXNlcG9sbCAgICAgMzgxNy42NyAgICAgICAgIDE0MzEuMDIKCjIxLjAzLjIwMDQgMDA6MTAKLSBjb25maWd1cmUgc2NyaXB0CgogIHJld3JvdGUgbGFyZ2UgcGFydHMgb2YgdGhlIGxpYi9oZWFkZXIgZGV0ZWN0aW9uIG9mIHRoZSBjb25maWd1cmUgc2NyaXB0CgoyMC4wMy4yMDA0IDAxOjM5Ci0gZmFzdGNnaQoKICBhcyB0aGUgZG9jcm9vdCBvbiBleHRlcm5hbCBob3N0cyBtaWdodCBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgd2Vic2VydmVyCiAgZG9jcm9vdCBpdCBjYW4gbm93IGJlIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnOgoKICBmYXN0Y2dpLnNlcnZlciAgICAgICAgICAgID0gKCAiLnBocCIgPT4KCQkJCSggImdyaXN1IiA9PgoJCQkJICAoCgkJCQkgICAgImhvc3QiID0+ICIxOTIuMTY4LjIuNDEiLAoJCQkJICAgICJkb2Nyb290IiA9PiAiL2hvbWUvamFuL3NlcnZlcnMvIiwKCQkJCSAgICAicG9ydCIgPT4gMTAyNgoJCQkJICApCgkJCQkpCgkJCSAgICAgICkKCiAgYSBodWdlIGludGVybmFsIGNsZWFudXAgaW4gdGhlIGNvbmZpZyBoYW5kbGluZyBtYWRlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuCiAgc29tZSBtb3JlIHdhcm5pbmdzIGFuZCBlcnJvciBjaGVja2luZyBzaG91bGQgdHJhY2sgbW9zdCBvZiB0aGUgY29uZmlnCiAgZXJyb3JzIGZvciB0aGUgZmFzdGNnaSBwbHVnaW4KCjE5LjAzLjIwMDQgMTI6MzQKLSBleHRlcm5hbCBwYXRjaGVzCgogIE1hdHRoaWpzIHZhbiBkZXIgS2xpcCBzdWJtaXR0ZWQgdGhyZWUgbmljZSBwYXRjaGVzOgogIC0gdHVybiBvZmYgd3JpdGluZyBpbiBtb2Rfc3RhdHVzIGlmIHN0YXR1cy5ycmQtcmVwb3J0cyBpcyBzZXQgdG8gZGlzYWJsZQogIC0gZml4IGZvciBhIGRlYnVnIG1lc3NhZ2UKICAtIGdldCB0aGUgaG9zdG5hbWUgZm9yIEhUVFAvMS4wIHJlcXVlc3RzIHdoaWNoIGRvbid0IHNwZWNpZnkgYSBIb3N0OiAuLi4KICAtIHJjLXNjcmlwdCBmb3IgUmVkSGF0CgotIGRvY3VtZW50YXRpb24KCiAgYWRkZWQgYSBkb2N1bWVudGF0aW9uIHNlY3Rpb24gYWJvdXQgYXV0aGVudGlmaWNhdGlvbgogIC0gZG9jL2F1dGhlbnRpZmljYXRpb24udHh0CgoxOS4wMy4yMDA0IDA1OjExCi0gb3B0aW1pemF0aW9ucwoKICBpbXBsZW1lbnRlZCBzcGVjaWFsIHZlcnNpb25zIG9mCiAgLSBzdHJjYXNlY21wIChhcnJheV9zdHJjYXNlY21wKQogIC0gaXNkaWdpdCwgaXNhbHBoYSwgaXNhbG51bSAobGlnaHRfKikKCiAgYWRkZWQgYSBmYXN0ZXIgY2hlY2sgZm9yIGEgZmluaXNoZWQgaGVhZGVyCgogIGFmdGVyIGRpc2FibGluZyBhbGwgbW9kdWxlcyBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBnZXQgMjAga3JlcS9zLgoKMTUuMDMuMjAwNCAxOTo0NSAtIDEuMS4xCi0gbG9jYWxpemVyIHNlcnZlcgoKICBhZGRlZCB0aGUgbG9jYWxpemVyLXNlcnZlciBtb2R1bGUgdG8gdGhlIGNvZGUKCi0gY2h1bmtlZC1lbmNvZGluZwoKICBBcHBsZSdzIFNhZmFyaSBvciBIVFRQLUhhbmRsZXIgZG9lc24ndCBoYW5kbGUgY2h1bmtlZC1leHRlbnNpb25zIGRlZmluZWQgYnkKICBSRkMgMjYxNiBjb3JyZWN0bHkgYW5kIGRvZXNuJ3QgaWdub3JlIHRoZW0uIERpc2FibGVkIHRoZSBjaHVua2VkLWV4dGVuc2lvbgogIHdoaWNoIHdlcmUganVzdCB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCgowNy4wMy4yMDA0IDEyOjIwCi0gb3B0aW1pemF0aW9uCgogIG1vdmVkIHRoZSBjaGVja3MgaWYgYSBwbHVnaW5zIHN1cHBvcnQgYSBnaXZlbiBmdW5jdGlvbiBmcm9tIHRoZSBkaXNwYXRjaGVyCiAgKHBsdWdpbnNfY2FsbCkgdG8gcGx1Z2luc19jYWxsX2luaXQoKSB0byBkbyB0aGUgY2hlY2sgb25seSBvbmNlLgoKICBlcXVhbGl6ZWQgdGhlIHBsdWdpbnMgZnVuY3Rpb25zIHRvIG9ubHkgdHdvIHR5cGVzOgogIFNFUlZFUl9GVU5DKCkKICBDT05ORUNUSU9OX0ZVTkMoKQoKICByZXBsYWNlZCBhbGwgaGFuZHdyaXR0ZW4gcGx1Z2luX2NhbGwtaGFuZGxlcnMgd2l0aCBtYWNyb3MKCiAgbWFkZSBhbGwgcGx1Z2luLWZ1bmN0aW9ucyAnc3RhdGljJwoKICB3aXRoIGFsbCBwbHVnaW5zIGxvYWRlZCB3ZSBhcmUgYXQgMTVrcmVxL3MgZ2FpbgogIHdpdGhvdXQgYW55IHBsdWdpbiBsb2FkZWQgYXQgMTZrcmVxL3MKCiAgYmVmb3JlIHRoZSBjaGFuZ2Ugd2Ugd2VyZSBhdCAxM2tyZXEvcwoKMDYuMDMuMjAwNCAyMToxMwotIGNvbXBpbGF0aW9uIGZpeGVzCgogIGZpeGVkIHNvbWUgd2FybmluZ3Mgb24gRnJlZUJTRCBhbmQgTmV0QlNEIGJ5IGFkZGluZwogICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CgogIGlmZGVmJ2VkIGEgcGNyZS1lbnRyeSBpbiBiYXNlLmgKCiAgcmVtb3ZlICNkZWZpbmUgX1hPUEVOX1NPVVJDRSBmcm9tIGh0dHBfYXV0aC5jIGZvciBJUklYCiAgY3J5cHQoKSBvbiBMaW51eCBuZWVkcyBfWE9QRU5fU09VUkNFCgowNi4wMy4yMDA0IDE5OjE4IC0gMS4xLjAKLSBhdXRoZW50aWZpY2F0aW9uCgogIGFkZGVkIGh0cGFzc3dkIGFuZCBodGRpZ2VzdCBiYWNrZW5kcyB0byB3b3JrIGFnYWluc3QgdXNlci1maWxlcyBnZW5lcmF0ZWQKICBieSBodHBhc3N3ZCBhbmQgaHRkaWdlc3QuCgogIGZvciBiYXNpYyBhdXRoOgogIC0gcGxhaW4KICAtIGh0cGFzc3dkIChjcnlwdCBvbmx5KQogIC0gaHRkaWdlc3QKCiAgZm9yIGRpZ2VzdCBhdXRoOgogIC0gcGxhaW4KICAtIGh0ZGlnZXN0CgowNi4wMy4yMDA0IDE3OjM1Ci0gYXV0aGVudGlmaWNhdGlvbgoKICBjaGVjayB0aGUgbWV0aG9kIGluIHRoZSBhdXRob3JpemF0aW9uIGhlYWRlciBhZ2FpbnQgdGhlIGNvbmZpZ3VyZWQgbWV0aG9kCgowNi4wMy4yMDA0IDE0OjU0Ci0gaG9zdG5hbWUgcGFyc2luZwoKICBhZGRlZCBhIFJGQy0yMzk2IGNvbmZvcm1pbmcgIkhvc3Q6IiBwYXJzZXIKICBhZGRlZCAxNyBjaGVja3MgZm9yIHRoZSBwYXJzZXIKCjA2LjAzLjIwMDQgMTA6MjUKLSBjb25maWd1cmF0aW9uCgogIGFkZGVkIGEgd2FybmluZyBmb3IgdW5rbm93biBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4KCiAgZHJvcHBlZCB0aGUgJ3NwZWNpZmljLWZvci51cmwnIGlkZWFzIGZvciBub3cgYXMgaXQgaXMgbm90IGtub3duIHlldCBob3cgdG8KICBpbXBsZW1lbnQgaXQgdGhlIHJpZ2h0IHdheQoKICByZW5hbWVkIHNvbWUgY29uZmlnLXZhcmlhYmxlcyB0byByZWZsZWN0IHRoZXJlIGFjdHVhbCBtZWFuaW5nCiAgLSBzZXJ2ZXIuaG9zdCAtPiBzZXJ2ZXIuYmluZAogIC0gc2VydmVyLnZpcnR1YWwtKiAtPiBzaW1wbGUtdmhvc3QuKgogIC0gc2VydmVyLnVzZXJpZCAtPiBzZXJ2ZXIudXNlcm5hbWUKICAtIHNlcnZlci5ncm91cGlkIC0+IHNlcnZlci5ncm91cG5hbWUKICAtIHNlcnZlci5kb2Nyb290IC0+IHNlcnZlci5kb2N1bWVudC1yb290CgoKMDUuMDMuMjAwNCAxNTozNgotIGZhc3RjZ2kKCiAgaW50ZXJuYWxzOiBtb3ZlZCBhbGwgbW9kX2Zhc3RjZ2kgc2V0dGluZ3MgZnJvbSB0aGUgZ2xvYmFsIHN0cnVjdCB0byB0aGUKICAgIHBsdWdpbiBpdHNlbGYKCi0gdmhvc3RpbmcKCiAgZ290IGEgcGF0Y2ggZm9yIGVuaGFuY2VkIHZpcnR1YWxob3N0aW5nIGZyb20gY2hyaXN0aWFuIGtydXNlIC0+IG1vZF9ldmhvc3QKCiAgbW92ZWQgdGhlIHZpcnR1YWwgaG9zdGluZyBjb25maWcgKHNlcnZlci52aXJ0dWFsLSopIHRvIGl0J3Mgb3duIG1vZHVsZQogIGNhbGxlZCBtb2Rfc2ltcGxlX3Zob3N0CgoyMy4wMi4yMDA0IDEwOjA2Ci0gY29uZmlnZmlsZQoKICByZWFycmFnbmVkIHRoZSBjb25maWctZmlsZSBzdHJ1Y3R1cmUgYWdhaW4gdG8gYmUgYWJsZSB0byBhZGQgc2V0dGluZ3MgZm9yCiAgYSBnaXZlbiBVUkwsIEhvc3QsIEZpbGVuYW1lLCAuLi4KICAgIFRoaXMgY2hhbmdlIGFmZmVjdHMgc29tZSBjb25maWctb3B0aW9ucyBkaXJlY3RseSAoYWNjZXNzLmRlbnksCiAgdXJsLnJld3JpdGUsIHVybC5yZWRpcmVjdCwgdmlydHVhbC1ob3N0aW5nLCAuLi4pCgogIGFkZGVkICdzcGVjaWZpYy1mb3IudXJsJyBmb3IgdXJsIHNwZWNpZmljIGNvbmZpZyBzZXR0aW5ncwoKLSBkaWdlc3QgYXV0aAoKICBGSVg6IG1kNS1zZXNzIHR5cGUKCiAgc2VwZXJhdGUgdGhlIGF1dGgtYmFja2VuZCBzdHVmZgoKMTMuMDIuMjAwNCAyMjoyMyAtIGxpZ2h0dHBkIDEuMC4zCi0gY29udGVudC1sZW5ndGggKyBQT1NUCgogIEZJWDogSWYgaGVhZGVyIGFuZCBjb250ZW50IGRpZG4ndCBmaXQgaW50byBvbmUgc2luZ2xlIHBhY2tldCB0aGUgcmVzdCBvZgogICAgICAgdGhlIGNvbnRlbnQgd2FzIG5vdCByZWFkIGNvcnJlY3RseQoKMTMuMDIuMjAwNCAwMTowNwotIGNvbnRlbnQtbGVuZ3RoICsgUE9TVAoKICB0aGUgY2hlY2sgZm9yIGNvbnRlbnQtbGVuZ3RoIG9uIGEgUE9TVCByZXF1ZXN0IHZhbmlzaGVkIHNvbWVob3cgaW4gb25lIG9mCiAgdGhlIHByZXZpb3VzIHJlbGVhc2VzLgoKLSBoZWFkZXIgc2VhcmNoCgogIEZJWDogdGhlIHNlYXJjaCBmb3IgaGVhZGVyIGZpZWxkcyB3YXMgdXAgdG8gbm93IGNhc2Utc2Vuc2l0aXZlLiBOb3cgaXQgaXMKICAgICAgIGxpa2UgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkIGNhc2UtaW4tc2Vuc2l0aXZlLgoKLSBicm93c2VyIGJ1Z3MKCiAgdzNtIDAuMi41IGFkZHMgYW4gYWRkaXRpb25hbCBcclxuIGF0IHRoZSBlbmQgb2YgdGhlIFBPU1QgcmVxdWVzdHMgd2hpY2ggaXMKICBoYW5kbGVkIG5vdwoKMTAuMDIuMjAwNCAxMDoxMgotIHN0YXJ0IHNjcmlwdAoKICB0b29rIHRoZSBzdXNlIHJjLXNrZWxldG9uIHdoaWNoIHN0YXRlcyB0byBiZSBMU0IgY29tcGxpYW50IGFuZCBtb2RpZmllZCBpdAogIGZvciBsaWdodHRwZCBuZWVkcwoKMDkuMDIuMjAwNCAxMTo0OAotIEhFQUQgcmVxdWVzdHMKCiAgRklYOiBIRUFEIHJlcXVlc3RzIGZvciBzdGF0aWMgZmlsZXMgZGVsaXZlZCB0aGUgY29udGVudCBmcm9tIHRoZSBHRVQKICAgICAgIHJlcXVlc3QuICh0ZXN0IGNhc2UgaXMgYWRkZWQpCgowOC4wMi4yMDA0IDE1OjUzCi0gZGlyZWN0b3J5IGxpc3RpbmdzCgogIEZJWDogdGhlIHBhdGhuYW1lIGhhcyBub3QgZW5jb2RlZCBhdCBhbGwgYmVmb3JlIGl0IHdhcyB0cmFuc2ZlcmVkIHRvIHRoZQogICAgICAgYnJvd3Nlci4gYSBwcm9wZXIgdXJsIGFuZCBodG1sLWVuY29kaW5nIGhhcyBiZWVuIGFkZGVkLgoKICBhZGRlZCBtb2RpZmljYXRpb24tdGltZSBhbmQgZmlsZXNpemUgdG8gdGhlIG91dHB1dAoKICBhZGRlZCBhIGJhc2ljIGNzcyBmb3IgdGhlIHZpcnR1YWwgbGlzdGluZ3MKCjA3LjAyLjIwMDQgMjI6MTUgLSBsaWdodHRwZCAxLjAuMgotIHNhbXBsZSBjb25maWdmaWxlCgogIHJlYXJyYW5nZWQgdGhlIGNvbmZpZy1maWxlIHRvIGhhdmUgYWxsIHRoZSBpbXBvcnRhbnQgb3B0aW9ucyBhdCB0aGUgdG9wCgotIGRvY3MKCiAgYWRkZWQgYSBtb2QtcmV3cml0ZSBvcHRpb25zCgotIG1vZF9hY2Nlc3Nsb2cKCiAgc3Rkb3V0IGlzIG5vIGxvbmdlciB1c2VkIGEgZGVmYXVsdCBmb3IgdGhlIGFjY2Vzc2xvZwoKLSBlcnJvci1tZXNzYWdlcwoKICB0aGUgNDA0IGlzIG5vdyByZXBvcnRlZCBpbiB0aGUgZXJyb3ItbG9nCgowNy4wMi4yMDA0IDE3OjMwCi0gY29uZmlnZmlsZSBoYW5kbGluZwoKICBpZiBhIGtleSBpcyB1c2VkIHR3aWNlIGxpa2UKCiAgdXJsLnJld3JpdGUgPSAoICJ1cmwxIiA9PiAidXJsIikKICB1cmwucmV3cml0ZSA9ICggInVybDIiID0+ICJ1cmwiKQoKICB5b3UgZ2V0IGFuIGVycm9yIG5vdy4gWW91IGhhdmUgdG8gd3JpdGU6CgogIHVybC5yZXdyaXRlID0gKCAidXJsMSIgPT4gInVybCIsCiAgICAgICAgICAgICAgICAgICJ1cmwyIiA9PiAidXJsIikKCjMxLjAxLjIwMDQgMTI6MjIgLSBsaWdodHRwZCAxLjAuMQotIGxvZyBjeWNsaW5nCgogIGFkZGVkIGEgc2lnaHVwLWhhbmRsZXIgdG8gdGhlIHBsdWdpbiBpbnRlcmZhY2UgYW5kIGZpeGVkIHRoZSBsb2ctY3ljbGluZwogIGZvciBhY2Nlc3MtbG9ncwoKLSBwb3J0YWJpbGl0eQoKICBkaXNhYmxlZCB0aGUgaW50ZXJ2YWwtdGltZSBvcHRpbWl6YXRpb24gb24gSVJJWAoKLSBkb2N1bWVudGF0aW9uCgogIGFkZGVkIGEgbG90IG9mIG5ldyBkb2N1bWVudGF0aW9uIHRvIFJFQURNRQoKMzEuMDEuMjAwNCAxMDo1OQotIHN0YXR1cyBtb2R1bGUKCiAgYWRkZWQgdHdvIG5ldyBvcHRpb25zIHJyZC1kaXIgYW5kIHJyZC1yZXBvcnRzOgoKICBycmQtcmVwb3J0cyA9IChib29sZWFuKSAgIyBlbmFibGVzIFJSRC1yZXBvcnRzCiAgcnJkLWRpciAgICAgPSAoc3RyaW5nKSAgICMgcGF0aCBmb3IgdGhlIGRhaWx5IHN0YXR1cy1maWxlcwoKICBmaXhlZCB0aGUgInN0YXR1cy1maWxlcyBpbiAvIi1idWcgdGhpcyB3YXkKCgoyMi4wMS4yMDA0IDEzOjM4IC0gbGlnaHR0cGQgMS4wLjAKLSBzaW1wbGUgZG9jcm9vdAoKICBmaXhlZCBoYW5kbGluZyBvZiBkb2Nyb290cyBpZiB2aXJ0dWFsLWhvc3QgaXMgZGlzYWJsZWQKCjI3LjEyLjIwMDMgMTE6MTIKLSBsaWNlbnNlIGhhbmRsaW5nCgogIGFkZGVkIHRoZSBmaXJzdCBpbnRlcmZhY2UgdG8gbGljZW5zZSBoYW5kbGluZy4KCjI1LjEyLjIwMDMgMjM6NDgKLSBwcm90YWJpbGl0eQoKICBWZXJpZmllZCBhZ2FpbiB0aGF0IHRoZSBjb2RlIGNvbXBpbGVzIGFuZCBydW5zIGNsZWFubHkgb24gTGludXgsIEZyZWVCU0QsCiAgTmV0QlNEIGFuZCBJUklYCgogIGNvbXBpbGluZyB3aXRoIGdjYyBhbmQgdGhlIG9wdGlvbiAtcGVkYW50aWMgd29ya3MgZmluZQogIGNvbXBpbGluZyB3aXRoIG1pcHNwcm8gY2Mgd29ya3MgZmluZSwgdG9vCgotIHRlc3RzCgogIGFkZGVkIHNvbWUgbW9yZSB0ZXN0czogMzkgdGVzdHMKCjI1LjEyLjIwMDMgMTY6MDEKLSBwcm90YWJpbGl0eQoKICBzb21lIGNvbXBpbGUgZml4ZXMgZm9yIEZyZWVCU0QgaGF2ZSBiZWVuIGFwcGxpZWQgYW5kIGEgbmV3IHN3aXRjaCBoYXMgYmVlbgogIGFkZGVkIHRvIGNob29zZSBiZXR3ZWVuIElQdjQgYW5kIElQdjYgb24gRnJlZUJTRC4KICAgIChjbWRsaW5lOiAtNiwgY29uZmlnZmlsZTogc2VydmVyLnVzZS1pcHY2KQoKLSBwYWNrYWdpbmcKCiAgY2xlYW5lZCB1cCB0aGUgc3BlY2ZpbGUgZm9yIGJ1aWxkaW5nIFJQTXMKCjIxLjEyLjIwMDMgMDE6MDAKLSBhdXRob3JpemF0aW9uCgogIGJyb3VnaHQgYmFzaWMgYW5kIGRpZ2VzdCBhdXRoIGJhY2sgdG8gbGlmZS4gdGhpcyBtb2R1bGUgYXMgdGhlIGxhc3Qgb25lCiAgd2hpY2ggaGFkIHRvIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGNvbmZpZy1maWxlIGNoYW5nZXMKCi0gdGVzdCBoYXJuZXNzIGZyYW1ld29yawoKICBhZGQgMyB0ZXN0cyBmb3IgYmFzaWMgYXV0aAoKMjAuMTIuMjAwMyAyMjoxMAotIGNvbXByZXNzaW9uCgogIGFkZGVkIGd6aXAgY29tcHJlc3Npb24gKGd6aXAtaGVhZGVyICsgZGVmbGF0ZSArIGNyYykKCi0gdGVzdCBoYXJuZXNzIGZyYW1ld29yawoKICBhZGRlZCBhIDIyIHRlc3RzIHRvIHZlcmlmeSB0aGUgY29ycmVjdCBiZWhhdmlvdXIgb2YgbGlnaHR0cGQKCi0gcmVxdWVzdCBwYXJzaW5nCgogIEdFVCBodHRwOi8vd3d3LnlhaG9vLmNvbS8gSFRUUC8xLjAKCiAgaXMgaGFuZGxlZCBub3cgYXMKCiAgR0VUIC8gSFRUUC8xLjAKCi0gcGx1Z2lucwoKICBtb3ZlZCBGYXN0Q0dJIGFuZCBDR0kgaGFuZGxpbmcgaW50byBtb2R1bGVzIHdoaWNoIGNhbiBiZSBsb2FkZWQgYXQgcnVuLXRpbWUKCjE3LjEyLjIwMDMgMTM6MTgKLSBjb21wcmVzc2lvbgoKICB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBpcyBub3cgYnVpbGQgYXV0b21hdGljbHkKCjE1LjEyLjIwMDMgMDE6MDAKLSBjb21wcmVzc2lvbgoKICBhZGRlZCBhIGNvbXByZXNzaW9uIGNhY2hlIHRvIHRoZSBjb21wcmVzc2lvbiBtb2R1bGUgKG1vZF9jb21wcmVzcykKCiAgVmFyeTogQWNjZXB0LUVuY29kaW5nIGlzIHNldCBub3cgYXMgaXQgaW5mbHVlbmNlcyB0byBkZWxpdmVyZWQgc3RyZWFtIG9mCiAgYnl0ZXMuIFRoaXMgaXMgaW1wb3J0YW50IGZvciBjYWNoZXMuCgoxMC4xMi4yMDAzIDAwOjI0Ci0gY29uZmlnIGZpbGVzCgogIGEgbmV3IGNvbmZpZy1maWxlIGZvcm1hdCBpcyByZWFkeSBmb3IgdGhlIGZpbmFsIHJlbGVhc2Ugb2YgbGlnaHR0cGQuCgogIGl0IHN1cHBvcnRzOgoKICBzZXJ2ZXIuZG9jcm9vdCAgID0gInN0cmluZyIKICBzZXJ2ZXIuaG9zdCAgICAgID0gaW50ZWdlcgogIHNlcnZlci5tb2R1bGVzICAgPSAoICJzdHJpbmciLCAic3RyaW5nIiApCiAgc2VydmVyLm1pbWV0eXBlcyA9ICggImtleSIgPT4gInZhbHVlIiApCiAgc2VydmVyLmNvbXBsZXggICA9ICggImtleSIgPT4gKCAic3RyaW5nIiwgaW50ZWdlciApLAogICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAoJCSAgICAgICBpbnRlZ2VyICkKCiAgdGhlIHN5bnRheCBzaG91bGQgbG9vayBmYW1pbGFyIHRvIGFsbCB3aG8gd29ya2VkIHdpdGggUGVybCBvciBQSFAuCgogIGNvbmZpZy1maWxlIGhhbmRsaW5nIGhhcyBiZWVuIHNlcGVyYXRlZCBpbnRvIGEgcGFyc2VyIGFuZCBhIGxleGVyLiBCb3RoCiAgYXJlIGN1cnJlbnRseSB3cml0dGVuIGJ5IGhhbmQgYW5kIHdpbGwgcHJvcGFibHkgYmUgcmV3cml0dGVuIGludG8gYmlzb24gKwogIGZsZXggaWYgdGltZSBwZXJtaXRzLiBCdXQgdGhhdCB3b3VsZCBiZSBhIGNvc21ldGljYWwgY2hhbmdlLgoKMDUuMTIuMjAwMyAwMzowNwotIHN0YXR1cy1wYWdlCgogIGltcHJvdmVkIHRoZSBzdGF0dXMgcGFnZSB0byBkaXNwbGF5CiAgLSB0aGUgY3VycmVudCBjb25uZWN0aW9uLXN0YXRpCiAgLSBhdmVyYWdlIHRocm91Z2hwdXQgb3ZlciA1IHNlY29uZHMKICAgIChyZXF1ZXN0cy9zIGFuZCBvdXRwdXQtYm91bmQgdHJhZmZpYykKCiAgbm93IHlvdSBjYW4gc2VlIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhlIHNlcnZlcgoKLSBhY2Nlc3MtbG9nCgogIHRoZSBhY2Nlc3Nsb2cgaXMgbm93IGEgbW9kdWxlIGFuZCBjYW4gYmUgZGlzYWJsZWQgYnkganVzdCByZW1vdmluZyB0aGUKICBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBsb2FkZWQgcGx1Z2lucwoKMDQuMTIuMjAwMyAxNjoxOAotIGNocm9vdC1pbmcKCiAgaG93LXRvOiB1c2luZyBjaHJvb3QKCiAgLSBjaHJvb3QgdG8gL2hvbWUvd3d3LwogIC0gZG9jcm9vdCBhdCAvc2VydmVycy88aG9zdG5hbWU+L3BhZ2VzLwogIC0gZGVmYXVsdGhvc3Qgd3d3LmV4YW1wbGUub3JnCgogIGUuZy4gKGV4dGVybmFsIHZpZXcpCiAgL2hvbWUvd3d3L3NlcnZlcnMvd3d3LmV4YW1wbGUub3JnL3BhZ2VzL2luZGV4Lmh0bWwKCiAgKGluIGNocm9vdCkKICAvc2VydmVycy93d3cuZXhhbXBsZS5vcmcvcGFnZXMvaW5kZXguaHRtbAoKICBjb25maWc6CgogIGNocm9vdCAgL2hvbWUvd3d3LwogIHVzZXJpZCAgd3d3cnVuCiAgZ3JvdXBpZCBub2dyb3VwCgogIHZpcnR1YWwtc2VydmVyLXJvb3QgL3NlcnZlcnMvCiAgdmlydHVhbC1zZXJ2ZXItZGVmYXVsdC1ob3N0IHd3dy5leGFtcGxlLm9yZwogIHZpcnR1YWwtc2VydmVyLWRvY3Jvb3QgL3BhZ2VzLwoKICBUaGUgRmFzdENHSSBwcm9jZXNzIGlzIGxpdmluZyBvdXRzaWRlIHRoaXMgY2hyb290IGRlZmluaXRpb24gYXMgaXQgaXMKICBzdGFydGVkIHNlcGVyYXRseS4KCjAxLjEyLjIwMDMgMDI6MDYKLSBjbGVhbnVwCgogIGluIHByZXBhcmF0aW9uIGZvciB0aGUgZmlyc3Qgc3RhYmxlIHJlbGVhc2Ugc29tZSBpbnRlcm5hbHMgaGFkIHRvIGJlCiAgY2xlYW5lZCB1cC4gQmFzaWNseSBpdCB3YXMgYSBjbGVhbnVwIG9mIHdvcmtmbG93IG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUKICByZXNwb25zZS1oZWFkZXIuIEFsbCBtb2R1bGVzIGNhbiB1c2UgYSBjbGVhbiBpbnRlcmZhY2UgZm9yIHRoaXMgcHVycG9zZQogIG5vdy4gVGhpcyBpcyBlc3BhY2lhbGx5IHVzZWZ1bGwgZm9yIGFsbCBtb2R1bGVzIHdoaWNoIGhhdmUgdG8gcGFzcyBzb21lCiAgSFRUUC1oZWFkZXJzIHRvIHRoZSBjbGllbnQuCgoyOS4xMS4yMDAzIDIyOjIyCi0gbW9kdWxlcwoKICBmaW5hbGx5IG1vdmVkIHRoZSBtb2R1bGVzIHRvIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGNsZWFuZWQgdXAgc29tZSBjb2RlCiAgcGF0aCB0byBiZWNvbWUgbW9yZSByZWFkYWJsZS4KCiAgU28gZmFyIHdlIGhhdmU6CgogIG1vZF9yZXdyaXRlCiAgbW9kX3JlZGlyZWN0CiAgbW9kX2FjY2VzcwogIG1vZF9hdXRoCiAgbW9kX2NhY2hlCiAgbW9kX2NoYXQKICBtb2Rfc3RhdHVzCiAgbW9kX21hcHMKCjI4LjExLjIwMDMgMTg6MTYKLSByZWRpcmVjdHMKCiAgYXMgbGlnaHR0cGQgc3VwcG9ydHMgdXJsLXJld3JpdGluZyByZWRpcmVjdGlvbiB3YXMgYSBmZXcgbGluZXMgb2YgbmV3IGNvZGUuCgogIHJlZGlyZWN0IF4vd2lzaGxpc3QvKC4rKSAgICBodHRwOi8vamFuLmtuZXNjaGtlLmRlL3dpc2hsaXN0LyQxCgogIHJld3JpdGUgIF4vd2lzaGxpc3QvKC4rKSAgICAvbmV3L3dpc2hsaXN0LyQxCgoyOC4xMS4yMDAzIDE3OjAwCi0gc2lnbmFsIHN0dWZmCgogIHNldGl0aW1lciBpcyB1c2VkIHRvIHNlbmQgYSBldmVudCBldmVyeSBzZWNvbmQgdG8gY2FsbCB0aW1lKCkgb25seSBvbmNlIGEKICBzZWNvbmQuIGFub3RoZXIgc3lzdGVtIGNhbGwgd2hpY2ggaGFzIGJlZW4gcmVtb3ZlIGZyb20gdGhlIG1haW4tbG9vcC4KCiAgc2VuZGluZyBIVVAgdG8gbGlnaHR0cGQgd2lsbCBjbG9zZSBhbmQgcmUtb3BlbiB0aGUgbG9nZmlsZXMuIHRoaXMgaXMgdXNlZAogIGZvciBjeWNsaW5nIGxvZ2ZpbGVzLgoKIyEgL2Jpbi9zaAoKIyMjCiMKIyBhIHNpbXBsZSBsb2dmaWxlIHJvdGF0b3IgZm9yIGxpZ2h0dHBkCiMKCkRBVEU9YGRhdGUgKyIlWSVtJWQtJUglTSJgCkxQSUQ9YHBpZG9mIGxpZ2h0dHBkYAptdiBhY2Nlc3MubG9nIGFjY2Vzcy5sb2cuJHtEQVRFfQpraWxsIC1IVVAgJHtMUElEfQpnemlwIGFjY2Vzcy5sb2cuJHtEQVRFfQoKMjcuMTEuMjAwMyAwMTowNwotIG5hdGl2ZSB3aW4zMiBwb3J0CgogIGEgZmlyc3QgYXR0ZW1wdCBmb3IgYSBuYXRpdmUgd2luMzIgaGFzIGJlZW4gZG9uZS4gRm9yIG5vdyBtaW5ndyBpcyB0aGUKICBiYXNlIGZvciB0aGUgZGV2ZWxvcG1lbnQgYXMgaXQgcHJvdmlkZXMgYSBiYXNpYyB1bml4LWxpa2UgZnJhbWV3b3JrIGZvcgogIGJ1aWxkaW5nIG5hdGl2ZSB3aW4zMiBhcHBsaWNhdGlvbnMuCgogIHRoZSBtb3N0IGludGVybmFsIGZpbGVzIGhhdmUgYmVlbiBwb3J0ZWQgYW5kIHRoZSBvdmVyIGFsbCBwcm9ncmVzcyBpcwogIGdvaW5nIHdlbGwuIEF0IHRoZSBlbmQgdGhpcyB3aWxsIGp1c3QgYmUgYSBwcm92ZSBvZiBjb25jZXB0LgoKMjYuMTEuMjAwMyAwMToxNwotIGFjY2VzcyBkZW5pZWQKCiAgYWRkZWQgYSBhY2Nlc3MtZGVueSBmaWx0ZXIgdG8gYmxvY2sgc3BlY2lmaWMgdXJscyBsaWtlCgogIGFjY2Vzcy1kZW55IH4KICBhY2Nlc3MtZGVueSAuaW5jCgoxNy4xMS4yMDAzIDAxOjA2Ci0gYnVnIGZpeGluZwoKICBhIGZzdGF0KCkgb24gYSBvcGVuZWQgZmQgd2hpY2ggaGFzIGNoYW5nZWQgcmVwb3J0cyB3cm9uZyB0aGUgZmlsZS1pbmZvLgogIFVzaW5nIHN0YXQoKSBhZ2FpbiBoZWxwcyB0byBzb2x2ZSB0aGlzIHByb2JsZW0uCgogIHRoZSBzaWctaW8gdmVyc2lvbiBkb2Vzbid0IHN1ZmZlciBmcm9tIHRoaXMgcHJvYmxlbS4KCiAgdGhlIGV0YWdzIGFyZSBub3cgdXNlZCBmb3IgdmVyaWZpbmcgZmlsZS1jYWNoZS1lbnRyaWVzLgoKLSBjaGF0CgogIGVuYWJsZWQgdGhlIGludGVybmFsIGxvZ2luIG1lY2hhbmlzbSBhZ2FpbgoKICBhZGRlZCBzdXBwb3J0IHRyYW5zZmVyaW5nIHNlc3Npb24taW5mb3Mgb3ZlciBNeVNRTC4KCjE1LjExLjIwMDMgMDA6MTkKLSBvcHRpbWl6aW5nCgogIGFkZGVkIGEgYnVmZmVyX2VxdWFsX3JldmVyc2UgZnVuY3Rpb24gd2hpY2ggaXMgb3B0aW1pemVkIHZlcnNpb24gb2Ygc3RyY21wCiAgd2hpY2ggaXMgZ29pbmcgYmFja3dhcmRzIGFzIHBhdGhuYW1lcyBhcmUgb2Z0ZW4gdGhlIHNhbWUgZm9yIGluIHRoZSBmaXJzdAogIGJ5dGVzLgoKICB3cm90ZSBhIG9uZS1wYXNzIHBhcnNlciBmb3IgdGhlIHJlcXVlc3QtaGVhZGVyLiBUaGUgY29tYmluYXRpb24gb2YKICBzdHJzdHIoLi4uLCAiXHJcbiIpIHRvIHNlcGVyYXRlIGxpbmVzIGFuZCBzdHJjaHIoLi4uLCAnOicpIHRvIHNlcGVyYXRlCiAga2V5cyBmcm9tIHZhbHVlcyBtb3JlIG9yIGxlc3MgdG91Y2hlZCBldmVyeSBieXRlIHR3aWNlLgoKICB3ZSBhcmUgc3RpbGwgYXQgMTguMDAwIHJlcS9zIGZvciA0a2Iga2VlcC1hbGl2ZSByZXF1ZXN0cyBldmVuIHdpdGggZXRhZ3MKICBhbmQgaGFuZGxpbmcgYWxsIGhlYWRlciBmaWVsZHMuCgoxNC4xMS4yMDAzIDE3OjI2Ci0gZmNnaQoKICBDb250ZW50LVR5cGUgd2Fzbid0IHBhc3NlZCBjb3JyZWN0bHkgdG8gdGhlIEZhc3RDR0kgYXBwLiBIVFRQX0NPTlRFTlRfVFlQRQogIHdhcyBzZW50IGluc3RlYWQuCgotIGNhY2hlCgogIHByb3ZpZGVkIGFjY2VzcyB0byB0aGUgU2Vzc2lvbi1JRAoKLSBlcnJvci1sb2cKCiAgdGhlIHRpbWVzdGFtcCBpcyBub3cgd3JpdHRlbiBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0KCjIyLjEwLjIwMDMgMDA6MDYKLSBmY2dpLCBjZ2kKCiAgYWRkZWQgYSBzcGVjaWFsIHNldCBvZiBhcnJheS1mdW5jdGlvbnMgd2hpY2ggYXJlIG9wdGltaXNlZCBmb3IgdGhlICJpbnNlcnQKICBvbmx5IG9uY2UiIGNhc2UuCgogIHRoaXMgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBub3cgZm9yd2FyZGVkIHRvIHRoZSBleHRlcm5hbAogIGludGVyZmFjZXMuIEJlZm9yZSB0aGlzIGNoYW5nZSBvbmx5IGEgbGltaXRlZCBzZXQgb2YgcmVxdWVzdC1oZWFkZXJzIHdlcmUKICBmb3J3YXJkZWQuCgoyMS4xMC4yMDAzIDExOjU4Ci0gbW9kdWxlcwoKICBhZGRlZCBhIG5ldyBtb2R1bGUtaG9vayBhZnRlciB0aGUgYmFzaWMtaW5pdCBvZiB0aGUgbW9kdWxlIGZvciBoYW5kbGluZwogIGNvbmZpZy1zZXR0aW5ncyBhbmQgcHJlcGFyZSB0aGUgb3ZlcmFsbCBvcGVyYXJ0aW9uIChsaWtlIGJ1aWxkaW5nCiAgZGItY29ubmVjdGlvbnMsIGNvbXBpbGluZyByZWdleGVzLCAuLi4pCgotIGNhY2hlCgogIHVzZSB0dXJja21tLWNhY2hlIDIuNC4zIHRvIGdldCBzb21lIG51bWJlcnMgZm9yIHRoZSBwaHAtbGF0ZW5jeToKCiAgL3Vzci9zYmluL2FiIC1uIDEwMDAwIC1jIDEwIGh0dHA6Ly9hbGJhLmhvbWUua25lc2Noa2UuZGU6MTAyNS9pbmRleC5waHAKCiAgaGFuZGxpbmcgdGhlIGNhY2hlLWRlY2lzaW9uIGFuZCB0aGUgY2FjaGUtaGl0IGluIHBocDoKCiAgICBjYWNoZS1taXNzOiAxMDAlICgtJmd0OyAkdmVyc2lvbiA9IDApCgogICAgcGxhaW4gICAgICAgIDogMTA4LjEzIHJlcS9zCiAgICB0dXJja21tLWNhY2hlOiAyMTguMzkgcmVxL3MKCiAgICBjYWNoZS1oaXQ6IDEwMCUgKC0mZ3Q7ICR2ZXJzaW9uID0gMSkKCiAgICBwbGFpbiAgICAgICAgOiAxNjQuNDUgcmVxL3MKICAgIHR1cmNrbW0tY2FjaGU6IDY1My45OCByZXEvcwoKICBoYW5kbGluZyB0aGUgY2FjaGUtZGVjaXNpb24gYW5kIHRoZSBjYWNoZS1oaXQgaW4gdGhlIHNlcnZlcjoKCiAgICBjYWNoZS1oaXQ6IDEwMCUsIGJ1dCB1c2luZyBpbmRleC5jbWwKCiAgICBjbWw6ICAgICAgICAgICA0OTE4Ljg0IHJlcS9zIChubyBrZWVwLWFsaXZlKQogICAgY21sOiAgICAgICAgICAgNjkwMS4zMSByZXEvcyAoa2VlcC1hbGl2ZSkKCiAgICBjYWNoZS1taXNzOiAxMDAlLCBidXQgdXNpbmcgaW5kZXguY21sCgogICAgcGxhaW4gICAgICAgIDogMTA4LjM5IHJlcS9zCiAgICB0dXJja21tLWNhY2hlOiAyMTcuODQgcmVxL3MKCiAgQ29uY2x1c2lvbjoKICAtIHRoZXJlIGlzIG5vIGxvc3MgaW4gdGhlIGNhY2hlLW1pc3MgY2FzZSB0aHJvdWdoIHRoZSBjbWwtaGFuZGxpbmcKICAtIHRoZSBjYWNoZS1oaXQgY2FzZSBjYW4gYmUgaW1wcm92ZWQgZHJhbWF0aWNseSB3aXRoIGxpZ2h0dHBkLWNhY2hlCiAgLSB0dXJja21tLWNhY2hlIGltcHJvdmVzIHRoZSBjYWNoZS1taXNzIGNhc2UgYWxvdAoKMjAuMTAuMjAwMyAwMDo0MAotIGNhY2hlCgogIHRoZSBmaXJzdCAncmVhbC1saWZlJyB0ZXN0IHNob3dlZCBkcmFtYXRpYyBpbXByb3ZlbWVudHMgaW4gdGhlIHJlcS9zCiAgaGFuZGxpbmcuCgogIFRoZSBiYXNpYyBpZGVhIHdhcyB0byBtb3ZlIHRoZSBkZWNpc2lvbiBpZiBhIHBocC1wYWdlIGNhbiBiZSB0YWtlbiBmcm9tCiAgdGhlIGNhY2hlIGZyb20gdGhlIHBocC1jb2RlIHRvIHRoZSB3ZWJzZXJ2ZXIuCgogIFNlZSBoZXJlIHdoeSB0aGlzIGlzIGEgZ29vZCB0aGluZzoKCiAgdGhlIHF1aXRlIGNvbW1vbiBjb2RlIHdoaWNoIHdvcmtzIGZvciBodHRwOi8vamFuLmtuZXNjaGtlLmRlLyBpcyB1c2luZwogIHRlbXBsYXRlcyBhbmQgaXMgcXVpdGUgc3RhdGljLCBidXQgZGVwZW5kcyBvbiA0IGV4dGVybmFsIGZpbGVzICh0aGUKICBtZW51LXN0cnVjdHVyZSwgdGhlIHRlbXBsYXRlLCB0aGUgY3VycmVudCBjb250ZW50LCB0aGUgY2xhc3MtZmlsZSkuCgogIHRoZSBpbmRleC1maWxlIGlzIGFsd2F5czoKCiAgaW5jbHVkZV9vbmNlICJqay5pbmMiOwoKICAkdiA9IG5ldyB2aWV3KCk7CiAgcHJpbnQgJHYtPmdldChhcnJheShhcnJheSAoImZpbGUiID0+ICJjb250ZW50Lmh0bWwiKSkpOwoKICBJdCBpcyBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgZm9yIGFsbCBwYWdlcy4KCiAgVGhpcyBiYXNpYyBzZXR1cCBjYW4gZGVsaXZlciAxMDAgcmVxdWVzdHMvcy4KCiAgVGhlIG5leHQgc3RlcCBoYXM6CiAgLSBhcHBsaWNhdGlvbiBiYXNlcyBjYWNoaW5nCgogIGFzIHdlIGtub3cgdGhhdCBlYWNoIHBhZ2VzIGRlcGVuZHMgb24gdGhvc2UgNCBmaWxlcywgeW91IGNhbiBjaGVjayBpZiB0aGV5CiAgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHJlcXVlc3QgYW5kIGRlbGl2ZXIgdGhlIGNvbnRlbnQgZnJvbSB0aGUKICBjYWNoZSBvdGhlcndpc2UuCgogIHRoaXMgaW5jcmVhc2VkIHRoZSB0aHJvdWdocHV0IHRvIDE1MCByZXEvcy4gKGNhY2hlLWhpdCByYXRpbyAxMDAlKQoKICBUaGUgbmV4dCBsb2dpYyBzdGVwIGlzIHRvIG1vdmUgdGhlIGRlY2lzaW9uLW1ha2luZyBwcm9jZXNzIG91dCBvZiB0aGUgUEhQCiAgY29kZSBhcyBQSFAgaXMgdG8gc2xvdyBmb3IgdGhlIGNhY2hlLWhpdCBwYXRoOgoKICBhIENNTCAoQ2FjaGUtTWFya3VwLUxhbmd1YWdlKSBoYXMgYmVlbiB3cml0dGVuIHdoaWNoIGRlc2NyaWJlcyB0aGUgd2hvbGUKICBkZWNpc2lvbiBwcm9jZXNzIHdoaWNoIGhhcyBiZWVuIHdyaXR0ZW4gaW4gUEhQLWNvZGUgYmVmb3JlOgoKCm91dHB1dC5jb250ZW50LXR5cGUgdGV4dC9odG1sCgpvdXRwdXQuaW5jbHVkZSBfY2FjaGUuaHRtbAoKdHJpZ2dlci5oYW5kbGVyIGluZGV4LnBocAoKdHJpZ2dlci5pZiAgZmlsZS5tdGltZSgiLi4vbGliL3BocC9tZW51LmNzdiIpID4gZmlsZS5tdGltZSgiX2NhY2hlLmh0bWwiKQp0cmlnZ2VyLmlmICBmaWxlLm10aW1lKCJ0ZW1wbGF0ZXMvamsudG1wbCIpID4gZmlsZS5tdGltZSgiX2NhY2hlLmh0bWwiKQp0cmlnZ2VyLmlmICBmaWxlLm10aW1lKCJjb250ZW50Lmh0bWwiKSA+IGZpbGUubXRpbWUoIl9jYWNoZS5odG1sIikKCiAgaWYgb25lIG9mIHRoZSAndHJpZ2dlci5pZicgc3RhdGVtZW50cyBpcyB0cnVlIHRoZSAndHJpZ2dlci5oYW5kbGVyJyBpcwogIGNhbGxlZCB0byBnZW5lcmF0ZSB0aGUgcGFnZXMuCgogIGlmIG5vbmUgb2YgdGhlIHRoZW0gaXMgdHJpZ2dlciB0aGUgZmlsZXMgZnJvbSAnb3V0cHV0LmluY2x1ZGUnIGFyZSBzZW50IHRvCiAgdGhlIGJyb3dzZXIgd2l0aCBjb250ZW50LXR5cGUgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCBsaW5lOgoKICBUaGUgcmVzdWx0IHdhcyB2ZXJ5ICdwcm9taXNzaW5nJzoKCiAgNTkwMCByZXEvcyB3aXRoIGtlZXAtYWxpdmUKICAzODAwIHJlcS9zIHdpdGhvdXQga2VlcC1hbGl2ZQoKICAoYm90aCBmb3IgYSBjYWNoZS1oaXQgcmF0aW8gb2YgMTAwJSkKCiAgZm9yIGtlZXAtYWxpdmUgdGhpcyBpcyBmYWN0b3IgPGI+NTk8L2I+IGFnYWluc3QgdGhlIHBsYWluIHVuLWNhY2hlZAogIHZlcnNpb24gYW5kIHN0aWxsIDxiPjM5PC9iPiBhZ2FpbnQgdGhlIHBocC1jYWNoZS12ZXJzaW9uIHdoaWNoIGlzIGRvaW5nCiAgZXhhY3RseSB0aGUgc2FtZS4KCiAgVGltZSBmb3IgcGFydHkuIDopCgoxOS4xMC4yMDAzIC0gMTg6NTUKLSBjYWNoZQoKICB0aGUgaGFuZGxpbmcgb2YgZnVuY3Rpb25zIGhhcyBiZWVuIGltcHJvdmVkLiB0aGV5IGFyZSBub3cgJ3BsdWdhYmxlJy4ganVzdAogIHRoZSBkbG9wZW4oKSBzdHVmZiBpcyBtaXNzaW5nLgoKICBhIG5ldyBkYXRhdHlwZSBoYXMgYmVlbiBhZGRlZDogdGhlIHN0cmluZwoKICB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGV2YWx1YXRlIHNvbWV0aGluZyBsaWtlOgoKdHJpZ2dlci5pZiB1bml4LnRpbWUubm93KCkgLSBmaWxlLm10aW1lKCJoZWFkLmh0bWwiKSA+IDMwCnRyaWdnZXIuaWYgbXlzcWwucXVlcnkoIlNFTEVDVCBjb3VudCgqKSAiICsgXAogICAgICAgICAgICAgICAgICAgICAgICIgIEZST00gc3RydWN0dXJlIEFTIHN0cnVjLCBzZXNzaW9uIEFTIHNlc3MgIiArIFwKCQkgICAgICAgIiBXSEVSRSBzdHJ1Y3QudXNlciA9IHNlc3MudXNlciIgKyBcCgkJICAgICAgICIgICBBTkQgc2Vzcy5pZCA9IFwiIiArIG15c3FsLmVzY2FwZSgiYWJcImMiKSArICJcIiIpCgogIHlvdSBzZWU6CiAgLSBzdHJpbmcgb3BlcmF0aW9ucyAoY29uY2F0KQogIC0gaGFuZGluZyBvZiBlc2NhcGUtc2VxdWVuY2VzCiAgLSBmdW5jdGlvbnMKICAtIGNvbXBhcmlzaW9ucwoKMTguMTAuMjAwMyAtIDEzOjM5Ci0gY3ZzCgogIGltcG9ydGVkIGV2ZXJ5dGhpbmcgaW50byB0aGUgY3ZzIHNlcnZlciB3aGljaCBtYWtlcyB0aGUgd2hvbGUgcmV2aXNpb24KICBoYW5kbGVyIGEgbG90IGVhc2llci4gVGhlIENWUyBzZXJ2ZXIgd2FzIHVwIGFsbCB0aGUgdGltZSBidXQgbm90IHVzZWQuCiAgSW1wb3J0aW5nIHJlcXVpcmVkIDUgbWludXRlcyBvZiB3b3JrIHdoaWNoIGluY2x1ZGVkIG1lcmdlIHRoZSBmcmVlYnNkIGFuZAogIHRoZSBsaW51eCB0cmVlLgoKLSBjb21waWxlcnMgKyBwbGF0Zm9ybXMKCiAgb24gYSByZWd1bGFyIHZhcmlvdXMgY29tcGlsZXJzIGFuZCBwbGF0Zm9ybSBhcmUgY2hlY2sgdG8gY29tcGlsZSB3aXRoIHdpdGgKICB0aGUgY3VycmVudCBjb2RlIGJhc2U6CgogIHBsYXRmb3JtIHwgb3MgICAgICAgICAgICAgICAgICB8IGNvbXBpbGVyICAgICB8IHN0YXRlCiAgLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0KICBpYTMyICAgICB8IExpbnV4IDIuNC4yMiAgICAgICAgfCBnY2MgMi45NS4zICAgfCBvawogIGlhMzIgICAgIHwgRnJlZUJTRCA1LjEtQ1VSUkVOVCB8IGdjYyAzLjMuMSAgICB8IG9rCiAgbWlwczY0ICAgfCBJUklYIDYuNSAgICAgICAgICAgIHwgZ2NjIDMuMi4yICAgIHwgb2sKICBtaXNwNjQgICB8IElSSVggNi41ICAgICAgICAgICAgfCBNSVBTcHJvIDcuNDEgfCBvawoKICB0aGUgbWlwc3BybyBjb21waWxlciByZXZlYWxlZCBzb21lIHdhcm5pbmcgd2hpY2ggcmVzdWx0ZWQgaW4gYSBuaWNlCiAgY29kZS1jbGVhbnVwIHRoYXQgbWFkZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLgoKMTguMTAuMjAwMyAtIDAzOjAwCi0gZS10YWdzIGFuZCBmcmllbmRzCgogIGluIHByZXBhcmF0aW9uIGZvciB0aGUgcGhwLWNvbmZlcmVuY2UgYXQgdGhlIGJlZ2luIG9mIG5vdmVtYmVyIGluCiAgZnJhbmtmdXJ0L21haW4gdGhlIHNlcnZlciBoYXMgdGhlIHN1cHBvcnQgc29tZSBtb3JlIGNhY2hpbmcvcHJveHkgdGFncwogIGxpa2U6CiAgLSBFLVRhZyAoMTQuMTkpIFtkb25lXQogIC0gSWYtTWF0Y2ggKDE0LjI0KQogIC0gSWYtTm9uZS1NYXRjaCAoMTQuMjYpIFtkb25lXQogIC0gSWYtUmFuZ2UgKDE0LjI3KQoKICBTZWN0aW9uICgxMy4zLjMpIGJpbmRzIHRoZW0gdG9nZXRoZXIuIFtSRkMgMjYxNl0KCiAgdXNpbmcgbHhyLmtkZS5vcmcgYW5kIGx4ci5tb3ppbGxhLm9yZyByZXZlYWxlZCB0aGF0CiAgLSBrb25xdWkgb25seSB1c2VzIGlmLW5vbmUtbWF0Y2gKICAtIG1vemlsbGEgdXNlcyBpZi1ub25lLW1hdGNoIGFuZCBpZi1yYW5nZQoKICBpdCBsb29rcyBsaWtlIGl0IGlzbid0IHRoYXQgZWFzeSB0byB0cmlnZ2VyIHRoZSBpZi1yYW5nZSBjYXNlLgoKICBBcyB1bGYgc3VnZ2VzdGVkIHRoZSBldGFnIGlzIGEgaGFzaCBvZiBmaWxlLXNpemUsIGlub2RlLW51bWJlciBhbmQgbXRpbWUuCgotIGZkLWNhY2hpbmcKCiAgdWxmIGp1c3QgcGhvbmVkIG1lIGFzayBwcm9wb3NlZCB0aGUgZnJlZSB0aGUgY2FjaGUgbW9yZSBhZ3Jlc3Npdmx5IGluIGNhc2UKICBvZiBmZC1zaG9ydGFnZS4gaW5jcmVhc2luZyB0aGUgdGhlIGZkLWxpbWl0IGlzIHRoZSBiZXR0ZXIgaWRlYS4gOikKCjE3LjEwLjIwMDMgMTI6NDUKLSBjaGF0CgogIGZpbmlzaGVkIHRoZSBteXNxbC1zdXBwb3J0IGZvciBzdG9yaW5nIHRoZSBzZXNzaW9ucwoKMTIuMTAuMjAwMyAyMDo1NgotIHZhbGdyaW5kCgogIHVzZWQgdmFsZ3JpbmQgYWdhaW4gdG8gdmVyaWZ5IHRoYXQgdGhlIGNvZGUgYSBmcmVlIG9mIG1lbS1sZWFrcyBhbmQgZm91bmQKICBhICdsZWFrIGdlbmVyYXRvcicgaW4gdGhlIGNodW5rLWFwaS4KCiAgdGhlIGxhc3QgZmV3IGxlYWtzIHdlcmUganVzdCBzb21lIG1pc3NpbmcgZnJlZSgpJ3MgYXQgdGhlIGVuZCBvZiB0aGUKICBwcm9ncmFtIHJ1biB3aGljaCB3b3VsZCBoYXZlIGJlZW4gZnJlZWQgYW55d2F5LgoKICBhdCB0aGUgZW5kIHZhbGdyaW5kIGNvdWxkbid0IGZpbmQgYW55IG1pc3NpbmcgZnJlZSgpJ3MuCgoxMS4xMC4yMDAzIDEyOjA5Ci0gRmFzdENHSQoKICByZWR1Y2VkIHRoZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzIGZvciBGYXN0Q0dJIHRvIFdlYlNlcnZlciB0byAyIGNhbGxzIHBlcgogIGZkLWV2ZW50LiAoaW9jdGwoKSArIHJlYWQoKSkKCiAgdGhpcyBoYXMgbm8gZGlyZWN0IGVmZmVjdCBvZiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIHNlcnZlciwgYnV0IGltcHJvdmVzCiAgdGhlIHBvc3NpYmxlIHRocm91Z3B1dCBvZiB0aGUgbG9hZC1iYWxhbmNlci4KCjEwLjEwLjIwMDMgMjE6MDkKLSBGYXN0Q0dJIC0gbG9hZC1iYWxhbmNpbmcKCiAgYSBicm93biBwYXBlciBidWcgaGFzIGJlZW4gZml4ZWQgd2hpY2ggY2F1c2VkIHRvIGRlY3JlYXNpbmcgdGhyb3VnaHB1dCBpZgogIGxvYWQtYmFsYW5jaW5nIHdhcyBlbmFibGVkLgoKCiAgYmVuY2htYXJraW5nIHRoZSByZXEvcyB3aXRoIGxvYWQtYmFsYW5jaW5nIHNob3dzIHJlYWxseSBuaWNlIHJlc3VsdHM6CgoKICBzZXJ2ZXIgICA6IHJlcS9zICAgY29tbWVudAogIC0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHVsZiAgICAgIDogNzY0LjA2ICAocGhwKQogIGxhcHBpICAgIDogODAwLjA2ICAocGhwKQoKICB1bGYrbGFwcGk6IDE1MjYuOTUgKDIgKiBwaHApCgogIGdyaXN1ICAgIDogMTI2NS42NiAocGhwICsgYWIgKyBsaWdodHRwZCkKCgogIGFsbCAgICAgIDogMTY0Ny43MiAoMyAqIHBocCArIGFiICsgbGlnaHR0cGQpCiAgYWxsKG5pY2UpOiAxOTA0LjQwIChzYW1lIGFzIGFsbCwgYnV0IHRoZSBsb2NhbCBwaHAgb24gZ3Jpc3UKICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuICduaWNlIC0yMCdkKQoKCiAgaWYgYSBwaHAgaXMgcnVuIG9uIHRoZSBsb2FkLWJhbGFuY2VyIGl0IGhhcyB0byBnZXQgYSBsb3dlciBwcmlvcml0eSB0aGFuCiAgdGhlIGxvYWQtYmFsYW5jZXIgaXRzZWxmIGFzIHRvIGhhbmRsZSB0aGUgd29yayBvZiAoaGVyZSkgMyBwaHAtc2VydmVycy4KCgoxMC4xMC4yMDAzIDE1OjExCi0gamF2YSA/CgogIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0L3RvbWNhdC00LjEtZG9jL2prMi9jb21tb24vQUpQdjEzLmh0bWwKCjA4LjEwLjIwMDMgMjE6MDgKLSBnaWdFCgogIExhc3Qgd2VlayAzIFJUTDgxNjlTIGdpZ0UgY2FyZHMgYXJyaXZlZCBhbmQgd2VyZSBpbnN0YWxsZWQgaW4gdGhlCiAgdGVzdC1mcmFtZXdvcmsuCgogIFRoZXkgYXJlIHZlcnkgY2hlYXAgKDIwIEV1cm9zKSBhbmQgYXJlIGEgZ29vZCBzdGFydCBmb3IgYSBsb3ctbGV2ZWwKICBiZW5jaG1hcmsgbmV0d29yay4KCiAgRmlyc3QgcmVzdWx0IHNob3cgdXM6CgogIDQ4IE1iL3Mgd2l0aCBhYi4KCiAgVGhlIHdlYnNlcnZlciBhbmQgdGhlIHRlc3Qtc2VydmVyIGFyZSBlcXVpcHBlZCB3aXRoIGEgMjAwMCsgQU1EIENQVS4gVGhlCiAgc3lzdGVtIGxvYWQgOTUlLCB1c2VyIGxvYWQgaXMgMyUsIHRoZSByZXN0IGlzIGlkbGUgb24gYm90aCBwbGF0dGZvcm1zLgoKICBBZnRlciBzb21lIGNhbGN1bGF0aW9ucyBhdCBnZXRzIGNsZWFyIHRoYXQgdGhlcmUgYXJlIHZhcmlvdXMgYm90dGxlbmVja3M6CgogIDEuIFRoZSBQQ0ktQnVzICgzMmJpdC8zM01oeikgY2FuIG9ubHkgdHJhbnNmZXIgMTMzTWIvcwogICAgLSA0OCBNYi9zIFRDUC1UcmFmZmljIHJlc3VsdHMgaW4gNTVNYi9zIEV0aGVybmV0LVRyYWZmaWMgKHZlcmlmaWVkIHdpdGgKICAgICAgc2x1cm0pIFtvdXRnb2luZ10KICAgIC0gdGhlcmUgaXMgYWJvdXQgMTBNYi9zIGluY29tbWluZyB0cmFmZmljIGF0IHRoZSBQQ0kgYnVzIHdoaWNoIHRoZQogICAgICByZXF1ZXN0cwogICAgLSB0aGUgcmVzdCBvZiB0aGUgZGV2aWNlcyBhdCB0aGUgUENJIGJ1cyBhcmUgZWF0aW5nIHRoZSBsYXN0IGZldyBtYi9zCiAgMi4gSVJRLUhhbmRsaW5nCiAgICAtIFRoZXJlIGFyZSByZWFzb25zIHdoeSB0aGUgUlRMODE2OVMgY2FyZHMgYXJlIHNvIGNoZWFwCiAgICAgIC0gdGhleSBjYW4ndCBzZW5kIGp1bWJvLWZyYW1lcwogICAgICAtIG9ubHkgOGsvNjRrIGJ1ZmZlcnMgd2hpY2ggcmVzdWx0cyBpbiBhIGludGVycnVwdCBldmVyeSAzIHBhY2tldHMKICAgICAgLSB0aGV5IGFyZSBhdCBsZWFzdCBoYW5kbGluZyBjaGVja3N1bSBvZmZsb2FkaW5nIGZvciBpcCwgdWRwIGFuZCB0Y3AKCiAgSW4gdGhlIGVuZCB0aGVyZSBpcyBhIG5lZWQgZm9yIG5ldyBoYXJkd2FyZSB0byBsaW1pdCB0aGUgdGhyb3VnaHB1dCBieSB0aGUKICBFdGhlcm5ldCBhZ2Fpbi4KICAtIFBDSS1YLCA2NGJpdC1QQ0ksIC4uLgogIC0gJ3JlYWwnIGdpZ0UtTmV0d29yayBjYXJkcwogIC0gLi4uCgoKICBCVFc6IDIuNC4yMiArIHRoZSByODEzOSBkcml2ZXIgYXJlIHZlcnkgZmxhY2t5IGFuZCByZXN1bHRlZCBpbiAzIGxvY2stdXBzCiAgZm9yIHRvZGF5LgoKICBJbiBhbm90aGVyIHRlc3QgdGhlIGR1YWwtUFByby1GcmVlQlNEIDUuMS1DVVJSRU5UIG1hY2hpbmUgaGFzIGJlZW4gdXNlZCBhcwogIHNlcnZlciB3aXRoIGEgZ2lnRSBpbnRlcmZhY2UgKHJlMCkgYXQgaGFzIHNob3duIHRoYXQgdGhlIENQVSBpcyB0aGUgbGltaXQKICBmb3IgdGhpcyBjb21iaW5hdGlvbi4gVGhlIG1heGltdW0gdGhvdWdocHV0IHdhcyA3TWIvcy4KCiAgQW5vdGhlciBzbWFsbCBiZW5jaG1hcms6CiAgJCBhYiAtbiAxMDAwIC1jIDEwIGh0dHA6Ly8xOTIuMTY4LjIuNDE6Jmx0O3BvcnQmZ3Q7L2xpZ2h0dHBkLTIwMDMwOTI1LnRhcgoKICBwb3J0ICB8IHNlcnZlciAgICAgICAgICB8IENQVSBJZGxlCiAgLS0tLS0tKy0tLS0tLS2tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCiAgMTAyNSAgfCBsaWdodHRwZCAgICAgICAgfCA3NSUKICAxMDI2ICB8IHRodHRwZCAyLjIzYjEgICB8IDc1JQogIDEwMjcgIHwgYm9hLTAuOTQuMTRyYzE3IHwgNjklICoKICAxMDI4ICB8IGFwYWNoZSAxLjMueCAgICB8IDc3JQoKCiAgSW4gYWxsIDQgY2FzZXMgdGhlIHRob3VnaHB1dCB3YXMgODYwMCBrYnl0ZXMvcy4KCiAgKiBib2EgaGFkIDkgZmFpbGVkIHRyYW5zZmVycy4KCi0gRnJlZUJTRAoKICBUaGUgcHJvYmxlbXMgd2l0aCBGcmVlQlNEIDUuMC1SRUxFQVNFIHZhbmlzaGVkIGFmdGVyIHVwZGF0aW5nIHRvCiAgNS4xLUNVUlJFTlQuCgoyNi4wOS4yMDAzIDE4OjIyCi0gRnJlZUJTRAoKICBBIFNNUC1tYWNoaW5lIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB0ZXN0LWZhcm0uIEl0IGlzIHJ1bm5pbmcgRnJlZUJTRAogIDUuMS1SRUxFQVNFIGFuZCB3aWxsIGhlbHAgdG8gdGhlIGltcHJvdmUgdGhlIHNjYWxhYmlsaXR5LgoKICBmaXhlZCBzZW5kZmlsZSgpIGhhbmRsaW5nLgoKLSBGcmVlQlNEIHByb2JsZW1zCgogIEZyZWVCU0QtNS4xLVJFTEVBU0UtU01QCiAgMiAqIFBlbnRpdW0gUHJvIDIwMCBNSHoKICAxOTIuMTY4LjIuMzggKGRvdWJsZWhlYXJ0KQogICh3ZWJzZXJ2ZXIgW2xpZ2h0dHBkIGF0IHBvcnQgMTAyNSwgdGh0dHBkIGF0IHBvcnQgMTAyN10pCgogIExpbnV4IDIuNC4yMAogIDEgKiBBTUQgMjAwMCsKICAxOTIuMTY4LjIuMTAgKGdyaXN1KQogIChhYikKCiAgUHJvYmxlbToKICBDb25uZWN0aW9ucyBhcmUgcmVzZXQgYnkgdGhlIGtlcm5lbCB3aXRob3V0IGFueSBhcHBsaWNhdGlvbiBpbnRlcnZlbnRpb24uCgogIENhbGxpbmcgJ2FiJyAoYXBhY2hlYmVuY2gpIGF0IGdyaXN1IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbXRlcnM6CgogIC91c3Ivc2Jpbi9hYiAtbiAxMDAwMCAtYyAxMCBodHRwOi8vMTkyLjE2OC4yLjM4OjEwMjUvaW5kZXguaHRtbAoKICByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgb3V0cHV0OgoKICAuLi4KICBUaW1lIHRha2VuIGZvciB0ZXN0czogICA0MC42MTAgc2Vjb25kcwogIENvbXBsZXRlIHJlcXVlc3RzOiAgICAgIDEwMDAwCiAgRmFpbGVkIHJlcXVlc3RzOiAgICAgICAgNTk4MAogICAgIChDb25uZWN0OiAwLCBMZW5ndGg6IDU5ODAsIEV4Y2VwdGlvbnM6IDApCiAgLi4uCgoKICBUaGlzIGlzIHJlcHJvZHVjYWJsZSBhbmQgdGhlIG51bWJlciBvZiBmYWlsZWQgcmVxdWVzdHMgaXMgYWx3YXlzCiAgNTk4MCArLy0gNTAgcmVxdWVzdHMuIEluIG90aGVyIHdvcmRzOiBhZnRlciA0MDAwIHJlcXVlc3RzIHRjcGR1bXAgc2hvd3MKICB0aGUgZm9sbG93aW5nIG91dHB1dDoKCiAgdGNwZHVtcCBzaG93czoKCiAgMDA6NTM6NDguOTIzMDI5IDE5Mi4xNjguMi4xMC4zOTc3NCAmZ3Q7IDE5Mi4xNjguMi4zOC4xMDI1OiBTIFt0Y3Agc3VtIG9rXQogICAgMTAxMzczNzMxNToxMDEzNzM3MzE1KDApIHdpbiA1ODQwICZsdDttc3MgMTQ2MCxzYWNrT0ssdGltZXN0YW1wIDUyMDg0NjEKICAgIDAsbm9wLHdzY2FsZTAmZ3Q7IChERikgKHR0bCA2NCwgaWQgNzkxOCwgbGVuIDYwKQoweDAwMDAgICA0NTAwIDAwM2MgMWVlZSA0MDAwIDQwMDYgOTY0ZCBjMGE4IDAyMGEgICAgICAgIEUuLiZsdDsuLkAuQC4uTS4uLi4KMHgwMDEwICAgYzBhOCAwMjI2IDliNWUgMDQwMSAzYzZjIDY3NjMgMDAwMCAwMDAwICAgICAgICAuLi4mYW1wOy5eLi4mbHQ7bGdjLi4uLgoweDAwMjAgICBhMDAyIDE2ZDAgZWVhYSAwMDAwIDAyMDQgMDViNCAwNDAyIDA4MGEgICAgICAgIC4uLi4uLi4uLi4uLi4uLi4KMHgwMDMwICAgMDA0ZiA3OThkIDAwMDAgMDAwMCAwMTAzIDAzMDAgICAgICAgICAgICAgICAgICAuT3kuLi4uLi4uLi4KCiAgMDA6NTM6NDguOTIzMzMwIDE5Mi4xNjguMi4zOC4xMDI1ICZndDsgMTkyLjE2OC4yLjEwLjM5Nzc0OiBTIFt0Y3Agc3VtIG9rXQogICAgMTgwMzg2MDY3MjoxODAzODYwNjcyKDApIGFjayAxMDEzNzM3MzE2IHdpbiA2NTUzNSAmbHQ7bXNzIDE0NjAsbm9wLHdzY2FsZQogICAgMSxub3Asbm9wLHRpbWVzdGFtcCA0NDU5Nzk0IDUyMDg0NjEmZ3Q7IChERikgKHR0bCA2NCwgaWQgNjgyMSwgbGVuIDYwKQoweDAwMDAgICA0NTAwIDAwM2MgMWFhNSA0MDAwIDQwMDYgOWE5NiBjMGE4IDAyMjYgICAgICAgIEUuLiZsdDsuLkAuQC4uLi4uLiZhbXA7CjB4MDAxMCAgIGMwYTggMDIwYSAwNDAxIDliNWUgNmI4NCBiYWMwIDNjNmMgNjc2NCAgICAgICAgLi4uLi4uLl5rLi4uJmx0O2xnZAoweDAwMjAgICBhMDEyIGZmZmYgZDRjZSAwMDAwIDAyMDQgMDViNCAwMTAzIDAzMDEgICAgICAgIC4uLi4uLi4uLi4uLi4uLi4KMHgwMDMwICAgMDEwMSAwODBhIDAwNDQgMGQxMiAwMDRmIDc5OGQgICAgICAgICAgICAgICAgICAuLi4uLkQuLi5PeS4KCiAgMDA6NTM6NDguOTI0MDA5IDE5Mi4xNjguMi4xMC4zOTc3NCAmZ3Q7IDE5Mi4xNjguMi4zOC4xMDI1OiAuIFt0Y3Agc3VtIG9rXSBhY2sgMQogICAgd2luIDU4NDAgJmx0O25vcCxub3AsdGltZXN0YW1wIDUyMDg0NjEgNDQ1OTc5NCZndDsgKERGKQogICAgKHR0bCA2NCwgaWQgNzkxOSwgbGVuIDUyKQoweDAwMDAgICA0NTAwIDAwMzQgMWVlZiA0MDAwIDQwMDYgOTY1NCBjMGE4IDAyMGEgICAgICAgIEUuLjQuLkAuQC4uVC4uLi4KMHgwMDEwICAgYzBhOCAwMjI2IDliNWUgMDQwMSAzYzZjIDY3NjQgNmI4NCBiYWMxICAgICAgICAuLi4mYW1wOy5eLi4mbHQ7bGdkay4uLgoweDAwMjAgICA4MDEwIDE2ZDAgZTljMyAwMDAwIDAxMDEgMDgwYSAwMDRmIDc5OGQgICAgICAgIC4uLi4uLi4uLi4uLi5PeS4KMHgwMDMwICAgMDA0NCAwZDEyCgogIDAwOjUzOjQ4LjkyNDE1MCAxOTIuMTY4LjIuMTAuMzk3NzQgJmd0OyAxOTIuMTY4LjIuMzguMTAyNTogUCBbdGNwIHN1bSBva10KICAgIDE6MjkoMjgpIGFjayAxIHdpbiA1ODQwICZsdDtub3Asbm9wLHRpbWVzdGFtcCA1MjA4NDYxIDQ0NTk3OTQmZ3Q7IChERikKICAgICh0dGwgNjQsIGlkIDc5MjAsIGxlbiA4MCkKIDB4MDAwMCAgIDQ1MDAgMDA1MCAxZWYwIDQwMDAgNDAwNiA5NjM3IGMwYTggMDIwYSAgICAgICAgRS4uUC4uQC5ALi43Li4uLgogMHgwMDEwICAgYzBhOCAwMjI2IDliNWUgMDQwMSAzYzZjIDY3NjQgNmI4NCBiYWMxICAgICAgICAuLi4mYW1wOy5eLi4mbHQ7bGdkay4uLgogMHgwMDIwICAgODAxOCAxNmQwIDI3ZTQgMDAwMCAwMTAxIDA4MGEgMDA0ZiA3OThkICAgICAgICAuLi4uJy4uLi4uLi4uT3kuCiAweDAwMzAgICAwMDQ0IDBkMTIgNDc0NSA1NDIwIDJmNjkgNmU2NCA2NTc4IDJlNjggICAgICAgIC5ELi5HRVQuL2luZGV4LmgKIDB4MDA0MCAgIDc0NmQgNmMyMCA0ODU0IDU0NTAgMmYzMSAyZTMwIDBkMGEgMGQwYSAgICAgICAgdG1sLkhUVFAvMS4wLi4uLgoKICAwMDo1Mzo0OC45MjQ3MjggMTkyLjE2OC4yLjM4LjEwMjUgJmd0OyAxOTIuMTY4LjIuMTAuMzk3NzQ6IFIgW3RjcCBzdW0gb2tdCiAgICAxODAzODYwNjczOjE4MDM4NjA2NzMoMCkgd2luIDAgKHR0bCA2NCwgaWQgNjgzMSwgbGVuIDQwKQoweDAwMDAgICA0NTAwIDAwMjggMWFhZiAwMDAwIDQwMDYgZGFhMCBjMGE4IDAyMjYgICAgICAgIEUuLiguLi4uQC4uLi4uLiZhbXA7CjB4MDAxMCAgIGMwYTggMDIwYSAwNDAxIDliNWUgNmI4NCBiYWMxIDAwMDAgMDAwMCAgICAgICAgLi4uLi4uLl5rLi4uLi4uLgoweDAwMjAgICA1MDA0IDAwMDAgNjRiYSAwMDAwCgogIFNZTiwgU1lOK0FDSywgQUNLLCBEQVRBLCBSU1QKCiAgc3RyYWNlIHNob3dzIHRoYXQgbm8gY29ubmVjdGlvbiBhdHRlbXB0IGhhcyBiZWVuIHJlcG9ydGVkIHRvIHRoZQogIGFwcGxpY2F0aW9uIHdoaWNoIGlzIHBvbGwoKSdpbmcgdGhlIHNlcnZlciBzb2NrZXQuCgogIC8qIHRoZSBjb21tb24gbG9vcCB3aXRob3V0IGFueSBibG9jayBhdHRlbXB0cyAqLwoKICBhY2NlcHQoMywge3NhX2ZhbWlseT1BRl9VTlNQRUMsIHNhX2RhdGE9IlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAifSwgWzBdKSA9IDUKICBmY250bCg1LCBGX1NFVEZMLCBPX1JEV1J8T19OT05CTE9DSykgICAgPSAwCiAgcmVhZCg1LCAiR0VUIC9pbmRleC5odG1sIEhUVFAvMS4wXHJcblxyXG4iLCA0MDk1KSA9IDI4CiAgc3RhdCgiL2hvbWUvamFuL2xpZ2h0dHBkLTAuMS4wL3NlcnZlcnMvIiwge3N0X21vZGU9U19JRkRJUnwwNzU1LCBzdF9zaXplPTUxMiwgLi4ufSkgPSAwCiAgZnN0YXQoNiwge3N0X21vZGU9U19JRlJFR3wwNjQ0LCBzdF9zaXplPTQzNDgsIC4uLn0pID0gMAogIHdyaXRlKDUsICJIVFRQLzEuMCAyMDAgT0tcclxuQ29ubmVjdGlvbjogY2xvIi4uLiwgMjM1KSA9IDIzNQogIHdyaXRlKDIsICIxMDY0ODc1MTM2OiAobmV0d29yay5jLjIxMCkgMjM1ICIuLi4sIDMzKSA9IDMzCiAgc3lzY2FsbF8zOTMoMHg2LCAweDUsIDAsIDAsIDB4MTBmYywgMCwgMHhiZmJmZjJjMCwgMCkgPSAwCiAgY2xvc2UoNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAoKICAvKiBubyBmdXRoZXIgd2FpdGluZyBjb25uZWN0aW9ucyAqLwoKICBhY2NlcHQoMywgMHhiZmJmZjcwMCwgWzE4NTI3MDI3MzBdKSAgICAgPSAtMSBFQUdBSU4gKFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlKQoKICAvKiBlbnRlciB0aGUgbWFpbi1sb29wICovCgogIGdldHRpbWVvZmRheSh7MTc2OTIzNTMwMSwgMTY2MzA2OTgwN30sIE5VTEwpID0gMAogIHBvbGwoW3tmZD0zLCBldmVudHM9UE9MTElOfV0sIDEsIDEwMDApICA9IDAKICBnZXR0aW1lb2ZkYXkoezQyOTQ5NjcyOTUsIDY1NTM3fSwgTlVMTCkgPSAwCiAgcG9sbChbe2ZkPTMsIGV2ZW50cz1QT0xMSU59XSwgMSwgMTAwMCkgID0gMAogIGdldHRpbWVvZmRheSh7NDI5NDk2NzI5NSwgNjU1Mzd9LCBOVUxMKSA9IDAKICBwb2xsKFt7ZmQ9MywgZXZlbnRzPVBPTExJTn1dLCAxLCAxMDAwKSAgPSAwCiAgLi4uCgogIChzdHJhY2UgaXMgYnJva2VuIGZvciBhY2NlcHQoKSBhbmQgZ2V0dGltZW9mZGF5KCksIHN5c2NhbGxfMzkzKCkgaXMgc2VuZGZpbGUoKSkKCiAgYWZ0ZXIgZW50ZXJpbmcgdGhlIG1haW4tbG9vcCB0aGUgd2Vic2VydmVyIGRvZXNuJ3QgcmVjZWl2ZSBhbnkgbmV3IFBPTExJTgogIGV2ZW50cyBhdCBhbGwgZm9yIHRoZSBuZXh0IDEwLTE1IHNlY29uZHMuIEFueSBjb25uZWN0aW9uLWF0dGVtcHQgd2l0aGluCiAgdGhlIHBlcmlvZCBpcywgYXMgeW91IGNhbiBzZWUgaW4gdGhlIHRjcGR1bXAgb3V0cHV0LCBhY2NlcHRlZCBieSB0aGUKICBrZXJuZWwgYW5kIHRoZSByZWNlaXZlZCBkYXRhIGlzIHRocm93biBhd2F5IGFzIHRoZSBrZXJuZWwgc2VuZHMgYSBSU1QuCiAgQWZ0ZXIgdGhvc2UgMTAtMTUgc2Vjb25kcyB0aGUgYXBwbGljYXRpb24gZ2V0cyBhIFBPTExJTiBldmVudCBmb3IgdGhlCiAgc2VydmVyIHNvY2tldCBhbmQgdGhlIG5vcm1hbCBkYXRhLXRyYW5zZmVyIHRha2VuIHBsYWNlIGZvciB0aGUgbmV4dCA0MDAwCiAgcmVxdWVzdHMuCgogIFRoaXMgYmVoYXZpb3VyIGlzIHJlcHJvZHVjYWJsZSB3aXRoIHRodHRwZCAyLjIwYyBhbmQgdGhlIGN1cnJlbnQgbGlnaHR0cGQuCgoKMjYuMDkuMjAwMyAxMTo0MgotIGxvY2FsaXplcgoKICBwb3J0ZWQgdGhlIGxvY2FsaXplci1zZXJ2ZXIgYXBwbGljYXRpb24gaW50byBhIG1vZHVsZSBmb3IgbGlnaHR0cGQuIEFmdGVyCiAgMzAgbWludXRlcyB0aGUgY29kZSB3YXMgcG9ydGVkIGFuZCBmdW50aW9uYWwuIFRoaXMgbW9kdWxlcyBwcm92aWRlcyBhY2Nlc3MKICB0byB0aGUgbG9jYWxpemVyLWRiIGJ5IGEgSFRUUC1JbnRlcmZhY2UgYW5kIGdlbmVyYXRlcyB0aGUgcmVzcG9uc2UgYXMKICBIVE1MLCBDU1YgYW5kIHBsYWluLXRleHQuCgogIFNvIGZhciwgdGhlIG1vZHVsZS1pbnRlcmZhY2UgbG9va3MgZ29vZCBhbmQgZmxleGlibGUgZW5vdWdoLgoKICA3MDAwIHJlcS9zIGlzIGdvb2QgZW5vdWdoIHRvby4gR2VuZXJhdGluZyB0aGUgSFRNTCBhbmQgcXVlcnlpbmcgdGhlIERCCiAgbmVlZHMgc29tZSB0aW1lLgoKMjIuMDkuMjAwMyAwODo0MAotIG1vZHVsZXMKCiAgaW50cm9kdWNlZCBhIHNpbXBsZSBtb2R1bGUgaW50ZXJmYWNlIHdoaWNoIGFsbG93IHRvIGhvb2sgaW50byB0aGUgcHJvY2VzcwogIG9mIGhhbmRsaW5nIHRoZSByZXF1ZXN0cy4gQmFzaWNseSBpdCBhbGxvd3MgdG8gbW92ZSB0aGUgdXJsLXJld3JpdGVyLCB0aGUKICBhdXRoLXN1Yi1zeXN0ZW0gYW5kIHRoZSBjYWNoZSBvdXQgb2YgdGhlIG1haW4tY29kZS4gVGhlIG1vZHVsZS1pbnRlcmZhY2UKICB3aWxsIGJlIGV4dGVuZGVkIHRvIGFsbG93IHRoZSBjZ2kgYW5kIHRoZSBmYXN0Y2dpIHN1Yi1wcm9jZXNzZXMgdG8gYmUKICBtb3ZlZCBpbnRvIGEgbW9kdWxlLgoKMTUuMDkuMjAwMyAwOTozNgotIGVycm9yLWhhbmRsaW5nCgogIGZhc3RjZ2kgYW5kIGNnaSBjb25uZWN0aW9ucyBhcmUgbm93IGNsb3NlZCBjb3JyZWN0bHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcKICBjbGllbnQtY29ubmVjdGlvbiBoYXMgZGllZC4KCjE0LjA5LjIwMDMgMTA6NDAKLSBjZ2kKCiAgZmluYWxseSBzdHJlYW1pbmcgd29ya3Mgd2l0aCBDR0ksIHRvbwoKICB0aGlzIGVuYWJsZSBzdXBwb3J0IGZvciBjZ2lpcmMuc2YubmV0IGFuZCBmcmllbmRzIHdoaWNoIHVzZSBzdHJlYW1pbmcgYXMKICB0aGVyZSB0cmFuc3BvcnQgbWVjaGFuaXNtLgoKICBzdHJlYW1pbmcgaGFzIGJlZW4gdmVyaWZpZWQgd2l0aCBjZ2lpcmMtMC41LjIuCgotIGZkZXZlbnRzCgogIHRoZXJlIHdoZXJlIHNvbWUgcmVwb3J0cyB0aGF0IHNpZ2lvIGRpZG4ndCB3b3JrIGFzIGV4cGVjdGVkLiBJdCBqdXN0CiAgcmVwb3J0ZWQgbm8gZXZlbnRzIGF0IGFsbC4gTG9va3MgbGlrZSBhIGtub3duIGJ1ZyBpbiB0aGUgZ2xpYmMgb24KICB0aG9zZSBwbGF0Zm9ybXMuCgogIFVzaW5nIHBvbGwoKSBpbnN0ZWFkIHNvbHZlIHRoZSBwcm9ibGVtcy4KCjI3LjA4LjIwMDMgMjI6MTIKLSByZXdyaXRlCgogIGEgcGNyZSBiYXNlZCByZXdyaXRlIGVuZ2luZSBoYXMgYmVlbiBpbnRlZ3JhdGVkCgotIGNnaQoKICB0aGUgZmlsZS1iYXNlZCBjZ2kgaW50ZXJmYWNlIGhhcyBiZWVuIHJlcGxhY2UgYnkgdHdvIHBpcGVzLgoKMjMuMDcuMjAwMyAxMzoyOQotIGZkZXZlbnRzCgogIHRoZSB3aG9sZSBmZC1ldmVudCBoYW5kbGluZyBoYXMgYmVlbiByZXdvcmtlZCBhbmQgc2V2ZXJhbCBzbWFsbGVyIGJ1Z3MKICBhbmQgZGVzaWduLWVycm9ycyBoYXZlIGZpeGVkLgoKICBzaWdpbywgcG9sbCgpIGFuZCBzZWxlY3QoKSBhcmUgd29ya2luZyBmaW5lIGFnYWluLgoKICBPbiBJUklYIDYuNSBTSUdJTyBjb3VsZCBiZSB1c2VkLCBidXQgd2l0aG91dCBmdXJ0aGVyIHRlc3RpbmcgcG9sbCgpIGlzIHVzZWQuCgotIGNnaQogIENHSS1zdXBwb3J0IGlzIHN0aWxsIGJyb2tlbi4KCjIxLjA3LjIwMDMgMTg6NDYKLSBkbm90aWZ5CgogIHVzaW5nIHRoZSBGX05PVElGWSBmZWF1dHJlIG9mIHRoZSBMaW51eCAyLjQueCBrZXJuZWwgZ2l2ZXMgYW5vdGhyZSBuaWNlCiAgcGVyZm9ybWFuY2UgYm9vc3QgYXMgbGlnaHR0cGQgY2FuIGNhY2hlIHRoZSBzdGF0KCkncyB0aGUgcmlnaHQgd2F5LCBub3cuCgogIDIzMDA5LjY2IEAgNS00ay1rIHdoaWNoIG1lYW5zICsxMCUgYWdhaW5zdCAzMC4wNi4yMDAzIDE0OjAzCgogIGZvciAxMDAwLTRrLW5vayB0aGUgcGVyZm9ybWFjZSBuZWFybHkgZG91YmxlczogMzczMC4yMyBnb2VzIHVwIHRvIDYxNDQuMzkKCjE3LjA3LjIwMDMgMTM6MjEKLSBGcmVlQlNECgogIGEgc21hbGwgcGF0Y2ggKCNpbmNsdWRlICZsdDsmZ3Q7KSB0byBjb21waWxlIGxpZ2h0dHBkIG9uIEZyZWVCU0QgYWdhaW4uCgowOC4wNy4yMDAzIDEwOjQ4Ci0gZmlsZWluZm8tY2FjaGUKCiAgQSByZWFsbGlmZSB0ZXN0IHNob3dlZCB0aGF0IHRoZSBjYWNoZSB3YXNuJ3QgcGVyZmVjdCBhdCBhbGwgYXMgaXQgbWFkZQogIGxpZ2h0dHBkIGNyYXNoLiBUaGlzIGlzIGZpeGVkIG5vdy4KCjMwLjA2LjIwMDMgMTc6NDAKLSBsaWdodHRwZC1iZW5jaAoKICBBZnRlciBzb21lIHByb2JsZW1zIHdpdGggb3RoZXIgYmVuY2htYXJraW5nIHRvb2xzIGZvciB3ZWJzZXJ2ZXJzIHRoZSBmaXJzdAogIHZlcnNpb24gb2YgbGlnaHR0cGQtYmVuY2ggaGFzIGJlZW4gd3JpdHRlbi4KCiAgSXQgYSByZXZlYWxlZCBhIG5hc3R5IHN0cmFuZ2UgYmVoYXZpb3VyIHdoaWNoIHdhcyBmaXhlZCBieSBpbmNyZWFzaW5nIHRoZQogIGxpc3Rlbi1iYWNrbG9nIGZyb20gNSB0byAxMDI0LgoKMzAuMDYuMjAwMyAxNDowMwotIGZpbGVpbmZvLWNhY2hlCgogIHRoZSBmaWxlaW5mby1jYWNoZSBoYXMgYmVlbiByZWxheGVkIGEgbGl0dGxlIGJpdCBhbmQgdGhlcmUgYXJlIGFsd2F5cyAyCiAgZnN0YXQoKSdzIHBlciBmaWxlLXJlcXVlc3Qgbm93LiBUaGlzIGlzbid0IHRoYXQgZHJhbWF0aWM6CgogIDIxODAwLjc0IHJlcS9zIGlzIHN0aWxsIGEgdmVyeSBnb29kIHJlc3VsdCAoNy00ay1rKS4KCjI5LjA2LjIwMDMgMDM6MjkKLSBmaWxlaW5mby1jYWNoZQoKICBhIGZpbGVpbmZvIGNhY2hlIGhhcyBiZWVuIGFkZGVkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHN5c3RlbS1jYWxscyB0bwogIHN0YXQgYW5kIG9wZW4gYSBmaWxlLgoKICBpbiB0aGUgcmVsZWFzZXMgYmVmb3JlIHRoZSBzYW1lIGZpbGUgd2FzIHN0YXQnZWQgYXQgbGVhc3QgMiB0aW1lcyBwbHVzIGEKICBzdGF0IG9uIHRoZSBkb2Nyb290IGZvciBlYWNoIHJlcXVlc3QuIE5vdyB0aGUgc3RhdCgpJ3MgYW5kIHRoZQogIGNvcnJlc3BvbmRpbmcgb3BlbigpICsgY2xvc2UoKSBjYWxscyBhcmUgY2FjaGVkIGFuZCB0aGUgbnVtYmVyIG9mIHN5c3RlbQogIGNhbGxzIGhhcyBiZWVuIHJlZHVjZWQgdG8gdGhlIG1pbmltdW06CgogICQgc3RyYWNlIC1lb3BlbixzdGF0NjQscmVhZCx3cml0ZSxzZW5kZmlsZSxhY2NlcHQsc2h1dGRvd24sY2xvc2UgXAogICAgLXAgYHBpZG9mIGxpZ2h0dHBkYAoKLyogZmlyc3QgY29ubmVjdGlvbiAqLwphY2NlcHQoMywge3Npbl9mYW1pbHk9QUZfSU5FVDYsIHNpbjZfcG9ydD1odG9ucyg1NjIxMSksCiAgaW5ldF9wdG9uKEFGX0lORVQ2LCAiOjpmZmZmOjE5Mi4xNjguMi4xMCIsICZhbXA7c2luNl9hZGRyKSwgc2luNl9mbG93aW5mbz0wLAogIHNpbjZfc2NvcGVfaWQ9MH0sIFsyOF0pID0gNQphY2NlcHQoMywgMHhiZmZmZjQ3MCwgWzI4XSkgICAgICAgICAgICAgPSAtMSBFQUdBSU4KcmVhZCg1LCAiR0VUIC9pbmRleC5odG1sIEhUVFAvMS4wXHJcblVzZXItQSIuLi4sIDQwOTUpID0gOTEKc3RhdDY0KCIvaG9tZS93ZWlnb24vcHJvamVjdHMvbGlnaHR0cGQvc2VydmVycy9ncmlzdS5ob21lLmtuZXNjaGtlLmRlOjEwMjUvcGFnZXMvIiwKICB7c3RfbW9kZT1TX0lGRElSfDA3NTUsIHN0X3NpemU9MzY1NiwgLi4ufSkgPSAwCnN0YXQ2NCgiL2hvbWUvd2VpZ29uL3Byb2plY3RzL2xpZ2h0dHBkL3NlcnZlcnMvZ3Jpc3UuaG9tZS5rbmVzY2hrZS5kZToxMDI1L3BhZ2VzLy9pbmRleC5odG1sIiwKICB7c3RfbW9kZT1TX0lGUkVHfDA2NDQsIHN0X3NpemU9NDM0OCwgLi4ufSkgPSAwCm9wZW4oIi9ob21lL3dlaWdvbi9wcm9qZWN0cy9saWdodHRwZC9zZXJ2ZXJzL2dyaXN1LmhvbWUua25lc2Noa2UuZGU6MTAyNS9wYWdlcy8vaW5kZXguaHRtbCIsCiAgT19SRE9OTFkpID0gNgp3cml0ZSg1LCAiSFRUUC8xLjAgMjAwIE9LXHJcbkNvbm5lY3Rpb246IGNsbyIuLi4sIDIzNSkgPSAyMzUKc2VuZGZpbGUoNSwgNiwgWzBdLCA0MzQ4KSAgICAgICAgICAgICAgID0gNDM0OApzaHV0ZG93big1LCAxIC8qIHNlbmQgKi8pICAgICAgICAgICAgICAgPSAwCmNsb3NlKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAKCi8qIHNlY29uZCBjb25uZWN0aW9uICovCmFjY2VwdCgzLCB7c2luX2ZhbWlseT1BRl9JTkVUNiwgc2luNl9wb3J0PWh0b25zKDU2MjEyKSwgaW5ldF9wdG9uKEFGX0lORVQ2LAogICI6OmZmZmY6MTkyLjE2OC4yLjEwIiwgJmFtcDtzaW42X2FkZHIpLCBzaW42X2Zsb3dpbmZvPTAsIHNpbjZfc2NvcGVfaWQ9MH0sIFsyOF0pCiAgPSA1CmFjY2VwdCgzLCAweGJmZmZmNDcwLCBbMjhdKSAgICAgICAgICAgICA9IC0xIEVBR0FJTgpyZWFkKDUsICJHRVQgL2luZGV4Lmh0bWwgSFRUUC8xLjBcclxuVXNlci1BIi4uLiwgNDA5NSkgPSA5MQp3cml0ZSg1LCAiSFRUUC8xLjAgMjAwIE9LXHJcbkNvbm5lY3Rpb246IGNsbyIuLi4sIDIzNSkgPSAyMzUKc2VuZGZpbGUoNSwgNiwgWzBdLCA0MzQ4KSAgICAgICAgICAgICAgID0gNDM0OApzaHV0ZG93big1LCAxIC8qIHNlbmQgKi8pICAgICAgICAgICAgICAgPSAwCmNsb3NlKDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAKCgogIEluIHRoZSBlbmQgd2UgaGF2ZSBhIG5ldyBzcGVlZCByZWNvcmQ6CgogIChhYiAtYyA4IC1uIDEwMDAwMCBodHRwOi8vMTkyLjE2OC4yLjEwOjEwMjUvaW5kZXguaHRtbCB3aXRoIHBvbGwoKSkKICBSZXF1ZXN0cyBwZXIgc2Vjb25kOiAgICAyMzQzNS42NyBbIy9zZWNdIChtZWFuKQoKICBUaGlzIGlzIGEgc3BlZWQgaW5jcmVhc2VtZW50IG9mIDIwLTMwJSBhZ2FpbnN0IHRoZSBsYXN0IGludGVybmFsIGJlbmNobWFyay4KCgoyOC4wNi4yMDAzIDAyOjMwCi0gY2FjaGluZyBmcmFtZXdvcmsKCiAgdGhlIHRyaWdnZXIuaWYgZGlyZWN0aXZlIGlzIHdvcmtpbmcgZmluZS4gdGhlIGJhc2ljIGFsZ2VicmEgaXMgZG9uZSAoICssCiAgLSwgKiwgLyBhbmQgY29tcGVyYXRpb25zID0sICZsdDs9LCAmZ3Q7PSwgJmd0OywgJmx0OyBhbmQgdGhlIGJvb2xlYW4gbG9naWMKICAmYW1wOyZhbXA7IGFuZCB8fCBpbmNsdWRpbmcgYnJhY2VzKQoKICB0d28gYmFzaWMgZnVuY3Rpb24gYXJlIGF2YWlsYWJsZToKICAtIHVuaXgudGltZS5ub3cKICAtIGZpbGUubXRpbWUoLi4uKQoKMjUuMDYuMjAwMyAxNzozMwotIGNhY2hpbmcgZnJhbWV3b3JrCgogIGFkZGVkIG91dHB1dC5pbmNsdWRlLCBvdXRwdXQuY29udGVudC10eXBlIGZvciBhIGNhY2hlLWhpdCBhbmQKICB0cmlnZ2VyLmhhbmRsZXIgZm9yIGEgY2FjaGUtbWlzcy4KCiAgdGhlIGFjdHVhbCBkZWNpc2lvbiBpcyBtYWRlIGJlIHRyaWdnZXIuaWYgd2hpY2ggd2lsbCBiZSBhZGRlZCB0b21vcnJvdy4KCjE1LjA2LjIwMDMgMTU6MzMKLSBzaWctaW8KCiAgQWZ0ZXIgc2V2ZXJhbCBvdGhlciBzbWFsbGVyIG9wdGltaXNhdGlvbnMgbGlnaHR0cGQgcGVyZm9ybXMgYmV0dGVyIHdpdGgKICBzaWctaW8gdW5kZXIgaGlnaCBsb2FkOgoKICAgICAgICAgICAgICAgICAgc2lnaW8rcG9sbCAgICAgICAgcG9sbAogIGMxMDAwLTRrLW5vayAgOiAgICAyNjM1Ljk1ICAgICAxNjQzLjM5CiAgYzEwMDAtNGstayAgICA6ICAgIDczMzUuNjggICAgIDY3ODguODcKICBjMTAwMC0xMDBrLW5vazogICAgMjM1My40OSAgICAgMTIxNy43MwogIGMxMDAwLTEwMGstayAgOiAgICAzMDk3Ljg5ICAgICAyMDgwLjczCgoKICBUaGUgdXNlci1zcGFjZSBwYXJ0IGhhcyBiZWVuIG9wdGltaXplZCBhIGxvdC4gTm93IGl0IGlzIHRpbWUgdG8gb3B0aW1pemVkCiAgdGhlIG51bWJlciBvZiBjb250ZXh0LXN3aXRjaGVzIGJldHdlZW4gdXNlciBhbmQga2VybmVsLW1vZGUuCgogIHVzZXIgICAgMG0wLjE4MHMKICBzeXMgICAgIDBtMS4xNjBzCgogIGEgZmlsZWluZm8tY2FjaGUgaXMgdGhlIHdheSB0byBnby4KCiAgc3RydWN0IHsKICAJIGJ1ZmZlciAqbmFtZTsKCSBzdHJ1Y3Qgc3RhdCBzdDsKCSBpbnQgaGFuZGxlcjsKCSAuLi4KCgkgaW50IGZkOwoJIHZvaWQgKm1tYXBfcDsKICB9CgoxMS4wNi4yMDAzIDE0OjU3Ci0gc2lnLWlvIGlzIGJhY2sgYWdhaW4KCiAgYW5kIGl0IHdvcmtzIGZpbmUuCgogIHNpZ2lvIChSZWFsdGltZS1TaWduYWxzIHVuZGVyIExpbnV4IDIuNC54KSBzZW5kcyBvbmUgc2lnbmFsIHBlciBldmVudCBhbmQKICBidWZmZXJzIHRoZSByZXN0IG9mIHRoZSBldmVudHMgaW4gYSBrZXJuZWwgcXVldWUuIElmIHRoZSBpcyBmdWxsIGEgU0lHSU8KICBpcyBzZW50IGFuZCBwb2xsKCkgZ2V0cyBhbGwgZXZlbnRzIGF0IG9uY2UgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KCgogIEN1cnJlbnRseSB0aGUgYmVoYXZpb3VyIGlzIGEgbGl0dGxlIGJpdCBzdHJhbmdlOgogIC0gc2lnLWlvICsgcG9sbCgpIGlzIGdvb2QgZm9yIG5vbi1rZWVwLWFsaXZlIGNvbm5lY3Rpb25zCiAgLSBwb2xsKCkgZm9yIGtlZXAtYWxpdmUgY29ubmVjdGlvbnMKCiAgYzEwMDAtNGstbm9rOiAoMTAwMCBjb25jdXJyZW50IHJlcXVlc3QsIDRrIGZpbGVzaXplLCBubyBrZWVwYWxpdmUpCiAgcG9sbCAgICAgIDogMTUyMS4zOAogIHNpZ2lvK3BvbGw6IDIxMjQuMDAKCiAgYzEwMDAtNGstazogKDEwMDAgY29uY3VycmVudCByZXF1ZXN0LCA0ayBmaWxlc2l6ZSwga2VlcGFsaXZlKQogIHBvbGwgICAgICA6IDU4ODIuMzUKICBzaWdpbytwb2xsOiAxMjM5LjQ2CgogIFZlcnkgc3RyYW5nZSBmb3Igbm93LgoKMDkuMDYuMjAwMyAyMzo1OQotIGNvZGUtY2xlYW51cAoKICB0aGUgZXZlbnQtaGFuZGxpbmcgY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4gdG8gaGFuZGxlIHNpbmdsZSBldmVudHMgYmV0dGVyCiAgYXMgdGhleSBhcmUgZXhwZWN0ZWQgZnJvbSBzaWctaW8uCgogIHRoZSBmYWxsYmFjay1tb2RlIG9mIHNpZy1pbyBpcyBicm9rZW4gbm93LCBidXQgdGhlIG5vcm1hbCBwb2xsKCkgbW9kZSBnb3QKICBhIDEwJSBpbmNyZWFzZW1lbnQgaW4gc3BlZWQuIFRoaXMgbWVhbnMgdGhlIHdlIGFyZSBiYWNrIHRoZSBzcGVlZCBsZXZlbCBvZgogIDIwMDMwMzA4LTAxNTUgYXJlIGFzIGZhc3QgYXMgemV1cyBhZ2Fpbi4KCiAgRXNwZWNpYWxseSB1bmRlciBoaWdoZXIgbG9hZCB0aGUgY3VycmVudCBsaWdodHRwZCBwZXJmb3JtZXMgYmV0dGVyLgoKMDkuMDYuMjAwMyAxMTo1MQotIHNpZy1pbyBiZW5jaG1hcmsKCiAgICAgICAgICAgICAgICAgICAgMjAwMzA2MDktMTE1MSAgICAgIDIwMDMwNjA4LTIxMTAgICAgICAgMjAwMzAzMDgtMDE1NQotYyAxMCAgICAgICAgICAgICAgICAgIHNpZ2lvICAgICAgIHNlbGVjdCgpICAgICAgICBwb2xsKCkgICAgICAgICBwb2xsKCkKNGsgICAgICAgICAgICAgICAgOiAgNzg3MC45MiAgICAgICAgNzkzNy43NyAgICAgICA4MDM1LjM2ICAgICAgICA5NDQzLjc2CjRrIChrZWVwLWFsaXZlKSAgIDogMTQwOTguNDEgICAgICAgMTQ1OTAuMDIgICAgICAxNDI3NS41MiAgICAgICAxNzk4NS42MQoxMDBrICAgICAgICAgICAgICA6ICAzMzY2LjMyICAgICAgICAzMzgyLjAzICAgICAgIDMyNjEuMTUgICAgICAgIDM3MjIuMzIKMTAwayAoa2VlcC1hbGl2ZSkgOiAgNTU0NC43NyAgICAgICAgNTU3Ni4wMCAgICAgICA1NTczLjIwICAgICAgICA1OTc1Ljg2Ci1jIDEwMAo0ayAgICAgICAgICAgICAgICA6ICA2MTQ0Ljc3ICAgICAgICA1ODIxLjQwICAgICAgIDU3MTQuMjkgICAgICAgIDY3MjQuOTUKNGsgKGtlZXAtYWxpdmUpICAgOiAgOTA5Ny41MyAgICAgICAgOTIxMy4xOSAgICAgICA4OTc5LjA4ICAgICAgIDEwODMzLjA2CjEwMGsgICAgICAgICAgICAgIDogIDI1NDkuMzMgICAgICAgIDI0OTUuOTQgICAgICAgMjMxOC45NSAgICAgICAgMjYwNy4zNgoxMDBrIChrZWVwLWFsaXZlKSA6ICA0MjY3LjY3ICAgICAgICA0MjgzLjk0ICAgICAgIDQwOTQuMTcgICAgICAgIDQzMTQuMDYKCgpGb3IgLWMgMTAwIDRrIGFuZCAxMDBrIHNpZy1pbyBnaXZlcyBhIHNtYWxsIGluY3JlYXNtZW50LgoKMDkuMDYuMjAwMyAwMTowMAotIHNpZy1pbwoKICB3cml0aW5nIGxhcmdlIGZpbGVzIHdvcmtzIG5vdyBhcyBleHBlY3RlZC4gQWZ0ZXIgcmVtb3ZpbmcgdGhlIGxpbWl0IGZvcgogIHRoZSBjaHVua3Mgb2Ygc2VuZGZpbGUgdGhlIHdyaXRlLWJ1ZmZlci1pcy1lbXB0eS1hZ2FpbiBzaWduYWwgaXMKICBnZW5lcmF0ZWQuIHRoYXQgd2FzIG1pc3NpbmcuCgogIDMyMSBvZiAxMDAwMCBjb25uZWN0aW9ucyBzdGlsbCBoYXZlIHRoZSB3cm9uZyBsZW5ndGguIEFmdGVyIHRoYXQgaXMgZml4ZWQKICBpdCBpcyB0aW1lIHRvIHN0YXJ0IHNvbWUgYmVuY2htYXJrcyBhZ2Fpbi4KCjA4LjA2LjIwMDMgMjE6MTAKLSBzaWctaW8KCiAgZmlyc3QgYXR0ZW1wdHMgaW4gZ2V0dGluZyBTSUdJTyBzdXBwb3J0IHJ1bm5pbmcgd2hpY2ggd2VyZSBub3QgdmVyeQogIHN1Y2Nlc3NmdWxsIHlldC4KCi0gcG9sbCgpL3NlbGVjdCgpIGJlbmNobWFyawoKICAgICAgICAgICAgICAgICAgICAgICAgMjAwMzA2MDgtMjExMCAgICAgICAyMDAzMDUyNS0xNjIzICAyMDAzMDMwOC0wMTU1Ci1jIDEwICAgICAgICAgICAgICAgc2VsZWN0KCkgICAgICAgIHBvbGwoKSAgICAgICAgIHBvbGwoKSAgICAgICAgIHBvbGwoKQo0ayAgICAgICAgICAgICAgICA6ICA3OTM3Ljc3ICAgICAgIDgwMzUuMzYgICAgICAgIDgxNjYuNjAgICAgICAgIDk0NDMuNzYKNGsgKGtlZXAtYWxpdmUpICAgOiAxNDU5MC4wMiAgICAgIDE0Mjc1LjUyICAgICAgIDE0NzgxLjk3ICAgICAgIDE3OTg1LjYxCjEwMGsgICAgICAgICAgICAgIDogIDMzODIuMDMgICAgICAgMzI2MS4xNSAgICAgICAgMzE3Ni40MiAgICAgICAgMzcyMi4zMgoxMDBrIChrZWVwLWFsaXZlKSA6ICA1NTc2LjAwICAgICAgIDU1NzMuMjAgICAgICAgIDU4MDkuNTYgICAgICAgIDU5NzUuODYKLWMgMTAwCjRrICAgICAgICAgICAgICAgIDogIDU4MjEuNDAgICAgICAgNTcxNC4yOSAgICAgICAgNTY2OS4yNiAgICAgICAgNjcyNC45NQo0ayAoa2VlcC1hbGl2ZSkgICA6ICA5MjEzLjE5ICAgICAgIDg5NzkuMDggICAgICAgIDg0MTguMjIgICAgICAgMTA4MzMuMDYKMTAwayAgICAgICAgICAgICAgOiAgMjQ5NS45NCAgICAgICAyMzE4Ljk1ICAgICAgICAyMzE0LjI4ICAgICAgICAyNjA3LjM2CjEwMGsgKGtlZXAtYWxpdmUpIDogIDQyODMuOTQgICAgICAgNDA5NC4xNyAgICAgICAgNDQ1Ni45MiAgICAgICAgNDMxNC4wNgoKCiAgYXMgdGhlIG92ZXJhbGwgcHJvY2Vzc2luZyBjeWNsZSBoYXMgYmVlbiByZWFycmFuZ2VkIHRoZSBvdmVyYWxsIGZpZ3VyZXMKICBjaGFuZ2VkIGluIG1pbm9yIHJhbmdlcy4gYzEwMC00ay1rIGluY3JlYXNlZCwgKi0xMDBrLWsgZGVjcmVhc2VkLgoKICBBdCBsZWFzdCBpdCBzdGlsbCB3b3Jrcy4KCjA4LjA2LjIwMDMgMTI6NDUKLSBzZWxlY3QoKS9wb2xsKCkKCiAgaW1wbGVtZW50YXRlIGFuIGFic3RyYXRpb24gbGF5ZXIgZm9yIGZkLWV2ZW50cyAobGlrZSBlZXZyeSBvdGhlciB3ZWJzZXJ2ZXIpLgogIGN1cnJlbnRseSB3ZSBzdXBwb3J0IHBvbGwoKSBhbmQgc2VsZWN0KCkuCgogIFRoaXMgc2hvdWxkIGJyaW5nIHVzIHN1cHBvcnQgZm9yIE1hYyBPUyBYIGFuZCBwcm9wYWJseSBXaW5kb3dzLgoKMDQuMDYuMjAwMyAxODozNQotIGNvbmZpZ3VyZQoKICBsaWdodHRwZCBjYW4gbm93IGJlIGJ1aWxkIHdpdGhvdXQgc3NsLXN1cHBvcnQgZXZlbiBpZiBvcGVuc3NsIGlzIGluc3RhbGxlZAoKLSBwcm90YWJpbGl0eQoKICAtIG9uIElSSVggSVB2NiBpcyBzdXBwb3J0ZWQgbm93IG91dCBvZiB0aGUgYm94CiAgLSBmb3IgRnJlZUJTRCBzb21lIG1pc3NpbmcgaGFlZGVycyBoYXZlIGJlZW4gYWRkZWQKCjA0LjA2LjIwMDMgMTQ6MzQKLSBwaXBlbGluaW5nCgogIGFkZGluZyBzdXBwb3J0IGZvciBwaXBlbGluZyBpbnRyb2R1Y2VzIGEgcHJvYmxlbSBpZiB0aGUgcmVxdWVzdC1oZWFkZXIKICB3YXMgYnJva2VuLiB0aGlzIGhhcyBiZWVuIGZpeGVkIG5vdy4KCi0gdW5uZWNjZXNhcnkgc2xhc2hlcwoKICB3aGVuIGJ1aWxkaW5nIHBhdGhlcyBmcm9tIGRpZmZlcmVudCBwb3J0aW9ucyBvZiBhIHN0cmluZyAoZS5nLiBkb2Nyb290ICsKICB2aXJ0LXNlcnZlci1kb2Nyb290ICsgcmVxdWVzdC11cmkpIHNsYXNoZXMgd2hlcmUgYWRkZWQgZm9yIHNlY3VyaXR5IGFuZAogIHNpbXBsaWNpdHkuIFRoaXMgcmVzdWx0ZWQgaW4gdXAgdG8gNSBhZGphY2VudCBzbGFzaGVzIHdoaWNoIGNhdXNlZCBubyBoYXJtCiAgYnV0IGxvb2tlZCBzdHJhbmdlLiAoZml4ZWQpCgowNC4wNi4yMDAzIDA5OjU3Ci0gc3RhcnQvc3RvcCBtZXNzYWdlcwoKICB0aGUgZXJyb3ItbG9nIGNvbnRhaW5zIHRoZSBzdGFydCBhbmQgZW5kLXRpbWVzIG9mIHRoZSBsaWdodHRwZCBwcm9jZXNzLAogIG5vdy4KCi0gY29uZmlnZmlsZQoKICB0aGUgY29uZmlnLWZpbGUgcGFyc2VyIGhhcyBiZWVuIHJlbGF4ZWQgdG8gYWNjZXB0cyB0YWJzIGluc3RlYWQgb2Ygc3BhY2VzLgoKLSBiZXR0ZXIgZXJyb3ItaGFuZGxpbmcKCiAgZml4ZWQgYSA8YQogIGhyZWY9Imh0dHA6Ly9idWdzLnBocC5uZXQvP2lkPTI0MDA5Ij5idWcgaW4gdGhlIEZhc3RDR0ktU0FQSSBvZiBQSFA8L2E+CgogIGlmIHRoZSBmYXN0Y2dpIHByb2Nlc3MgZGllcyBvciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gdW5leHBlY3RlZGx5IHdlCiAgcmV0dXJuIDUwMCBub3cgaW5zdGVhZCBvZiBjbG9zaW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCgotIExvY2F0aW9uCgogIHRoZSBDR0kvMS4xLXJldi0wMyBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHVzIHRvIHNlbmQgU3RhdHVzIDMwMiBpZiBhCiAgTG9jYXRpb24taGVhZGVyIGlzIHNlbnQgYnkgdGhlIGNsaWVudCBhbmQgYSBTdGF0dXMtaGVhZGVyIGlzIG1pc3NpbmcuCgotIFBBVEhfVFJBTlNMQVRFRAoKICBpZiBQSFAgaXMgY29tcGlsZWQgd2l0aG91dCAtLWRpc2NhcmQtcGF0aCBQQVRIX1RSQU5TTEFURUQgaGFzIHRvIGJlCiAgcHJvdmlkZWQuCgoyNy4wNS4yMDAzIDE1OjU0Ci0gZGlyZWN0b3J5IGxpc3RpbmdzCgogIGlmIGEgZGlyZWN0b3J5IGlzIHJlcXVlc3RlZCBhbmQgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gYSBpbmRleC1maWxlCiAgYSBkaXJlY3RvcnktbGlzdGluZyBjYW4gYmUgZGlzcGxheWVkLiBZb3UgaGF2ZSB0byBlbmFibGUgZGlyZWN0b3J5LWxpc3RpbmdzCiAgaW4gdGhlIGNvbmZpZy1maWxlIChkaXJlY3RvcnktbGlzdGluZ3Mgb24pCgotIHVybC1kZWNvZGluZwoKICB1cCB0byBrbm93IHVybHMgd2hlcmUgbm90IGRlY29kZWQgYXQgYWxsICglMjYgLT4gLiBhbmQgc28gb24pLiBUaGlzIGhhcwogIGJlZW4gYWRkZWQuIFVuaWNvZGUgaXNuJ3Qgc3VwcG9ydGVkIGFzIHdlIHVzZSA4LWJpdCBjaGFycyBpbnRlcm5hbGx5LgoKMjYuMDUuMjAwMyAwMDo0NAotIHBpcGVsaW5pbmcKCiAgYXMgU2FzY2hhIHJlcXVpcmVkIHBpcGVsaW5pbmcgZm9yIGhpcyBiZW5jaG1hcmtpbmcgdG9vbCBpdCBoYXMgYmVlbgogIGltcGxlbWVudGVkLgoKICBwaXBlbGluaW5nIGFsbG93cyBzZW5kaW5nIGEgYnVuY2ggb2YgcmVxdWVzdHMgYXQgb25jZSB3aXRob3V0IHdhaXRpbmcgZm9yCiAgdGhlIGFjdHVhbCByZXNwb25zZXMuIFRoaXMgcmVkdWNlcyB0aGUgbmV0d29yay1vdmVyaGVhZCBhbmQgdGhlCiAgcm91bmQtdHJpcC10aW1lLgoKLSBub24tZnJlZSgpZCBtZW1vcnkKCiAgZG1hbGxvYyBoZWxwZWQgdG8gY2xvc2Ugc29tZSBub24tZnJlZSgpZCBtZW1vcnkuIEZvciB0aGUgbm9ybWFsIG9wZXJhdGlvbgogIHRoaXMgaXNuJ3QgaW1wb3J0YW50IGFzIG9ubHkgbWVtb3J5IGNodW5rcyB3aGljaCBoYWQgdG8gYmUgZnJlZSgpZCBhdCB0aGUKICBlbmQgb2YgdGhlIGxpdmUtdGltZSBvZiB0aGUgbGlnaHR0cGQtcHJvY2VzcyB3ZXJlIG5vdCBkZS1hbGxvY2F0ZWQuCgotIHBhcnRseS1pbml0aWFsaXplZCB2YXJpYWJsZXMKCiAgbGlnaHR0cGQgd2Fzbid0IGluaXRpYWxpemluZyB0aGUgbWFpbi1zdHJ1Y3R1cmUgd2hpY2ggcmVzdWx0ZWQgaW4gc3RyYW5nZQogIGJlaGF2aW91ciBpbiByYXJlIGNpcmN1bXN0YW5jZXMuCgoKMjUuMDUuMjAwMyAxNjoyMwotIGJlbmNobWFya3MKCiAgYWZ0ZXIgcmVtb3Zpbmcgc29tZSB1c2VsZXNzIGludGVybmFsIGNvcGllcyB3ZSBhcmUgbW9yZSBvciBsZXNzIGF0IHRoZSBvbGQKICBzcGVlZCBsZXZlbHMuCgogIGFmdGVyIGFkZGluZyB2aXJ0dWFsLWhvc3RzIDEwJSBvZiB0aGUgcGVyZm9ybWFuY2Ugd2VyZSBsb3N0LiBVc2luZyBsZXNzCiAgbWVtY3B5KCkgb3BlcmF0aW9ucyBtaWdodCBhZGQgc2V2ZXJhbCBvdGhlciBib29zdHMuCgogIEkndmUganVzdCBjaGVja2VkIGhvdyBsaWdodHRwZCBjb21wYXJlcyB0byBaZXVzLgoKICAgICAgICAgICAgICAgICAgICBsaWdodHRwZCAoY3VycmVudCkgICAgICAgKG9sZCkKLWMgMTAgICAgICAgICAgICAgICAgIDIwMDMwNTI1LTE2MjMgIDIwMDMwMzA4LTAxNTUgICAgIFpldXMgNF8yCjRrICAgICAgICAgICAgICAgIDogICAgICAgICA4MTY2LjYwICAgICAgICA5NDQzLjc2ICAgICAgNzI3OC41NQo0ayAoa2VlcC1hbGl2ZSkgICA6ICAgICAgICAxNDc4MS45NyAgICAgICAxNzk4NS42MSAgICAgMTY0OTYuMjEKMTAwayAgICAgICAgICAgICAgOiAgICAgICAgIDMxNzYuNDIgICAgICAgIDM3MjIuMzIgICAgICAzMTU2LjM3CjEwMGsgKGtlZXAtYWxpdmUpIDogICAgICAgICA1ODA5LjU2ICAgICAgICA1OTc1Ljg2ICAgICAgNTQ2MC4zMAotYyAxMDAKNGsgICAgICAgICAgICAgICAgOiAgICAgICAgIDU2NjkuMjYgICAgICAgIDY3MjQuOTUgICAgICA1MTM0LjI2CjRrIChrZWVwLWFsaXZlKSAgIDogICAgICAgICA4NDE4LjIyICAgICAgIDEwODMzLjA2ICAgICAgODAxMC4yNQoxMDBrICAgICAgICAgICAgICA6ICAgICAgICAgMjMxNC4yOCAgICAgICAgMjYwNy4zNiAgICAgIDI2ODguMzIKMTAwayAoa2VlcC1hbGl2ZSkgOiAgICAgICAgIDQ0NTYuOTIgICAgICAgIDQzMTQuMDYgICAgICA0MjQwLjcwCgoyMy4wNS4yMDAzIDE0OjM4Ci0gY2dpLXZhcmlhYmxlcwoKICBIVFRQX0hPU1Qgd2FzIG1pc3NpbmcgZm9yIHRoZSBjZ2ktbW9kdWxlIHdoaWxlIHRoZSBmY2dpLW1vZHVsZSBwYXNzZWQgaXQKICB0aHJvdWdoIHRvIHRoZSBoYW5kbGVyLiBGaXhlZCB0aGF0LgoKLSBmY2dpLWVycm9ycwoKICB0aGUgY29ubmVjdGlvbiB0byB0aGUgZmNnaSB3YXMgZHJvcHBlZCBhbmQgcG9sbCgpIHJlcG9ydGVkIGFuIGVycm9yLCB0aGUKICBlcnJvciB3YXNuJ3QgcmVwb3J0ZWQgdG8gdGhlIGNsaWVudCB0aGUgcmlnaHQgd2F5LgoKMjIuMDUuMjAwMyAyMzowMgotIGF1dGhvcml6YXRpb24KCiAgdGhlIGZpcnN0IHBhc3N3b3JkLXN0b3JhZ2UgaGFzIGJlZW4gYWRkZWQ6CgogIFthdXRoXQogIGJhY2tlbmQgcGxhbgogIHBsYWluLXVzZXJmaWxlICZsdDtmaWxlbmFtZSZndDsKCiAgcmVxdWlyZSAgIC9kb3dubG9hZC8gdXNlcj1qYW58dXNlcj1hbm9tCiAgaHR0cC1hdXRoIC9kb3dubG9hZC8gImRvd25sb2FkIGFyY2hpdiIgZGlnZXN0CgogIGdyb3VwcyBhcmUgcHJlcGFyZWQgYnV0IG5vdCBpbXBsZW1lbnRlZC4gYmFzaWMgYW5kIGRpZ2VzdCBhcmUgd29ya2luZyBmaW5lLgoKMjAuMDUuMjAwMyAxNzo1MwotIGF1dGhlbnRpZmljYXRpb24KCiAgVGhlIGF1dGgtbWV0aG9kcyBmcm9tIFJGQyAyNjE3IGhhdmUgYmVlbiBhZGRlZC4KICAtIGF1dGggYmFzaWMKICAtIGF1dGggZGlnZXN0CgogIFRoZSBvbmx5IHNvdXJjZSBmb3IgYWNjb3VudHMgaXMgY3VycmVudGx5IG9ubHkgdGhlIGNvbmZpZy1maWxlLgoKICBhdXRoLWRpZ2VzdCBuZWVkcyB0aGUgcGxhaW4tdGV4dCBwYXNzd29ydC4gQXJlIHRoZXJlIGFueSBzb3VyY2Ugd2hpY2gKICBwcm92aWRlIGEgcGxhaW4tdGV4dCBwYXNzd29yZCA/CgoxMi4wNS4yMDAzIDE0OjMzCi0gdmlydHVhbCBob3N0cwoKICBhZGRlZCB2ZXJ5IGJhc2ljIHZpcnR1YWwtaG9zdCBzdXBwb3J0CgogIHZpcnR1YWwtc2VydmVyLXJvb3QgL2hvbWUvd2VpZ29uL3Byb2plY3RzL2xpZ2h0dHBkL3NlcnZlcnMvCiAgdmlydHVhbC1zZXJ2ZXItZGVmYXVsdC1ob3N0IGdyaXN1LmhvbWUua25lc2Noa2UuZGU6MTAyNQogIHZpcnR1YWwtc2VydmVyLWRvY3Jvb3QgL3BhZ2VzLwoKICBkb2Nyb290IGlzCgogIC0gaWYgaHR0cC1ob3N0IGV4aXN0cwogICAgJmx0O3ZpcnR1YWwtc2VydmVyLXJvb3QmZ3Q7ICsgJmx0O2h0dHAtaG9zdCZndDsgKyAmbHQ7dmlydHVhbC1zZXJ2ZXItZG9jcm9vdCZndDsKCiAgLSBvdGhlcndpc2UKICAgICZsdDt2aXJ0dWFsLXNlcnZlci1yb290Jmd0OyArICZsdDt2aXJ0dWFsLXNlcnZlci1kZWZhdWx0LWhvc3QmZ3Q7ICsKICAgICZsdDt2aXJ0dWFsLXNlcnZlci1kb2Nyb290Jmd0OwoKICAtIGlmIGV2ZW4gdmlydHVhbC1zZXJ2ZXItZGVmYXVsdC1ob3N0IGRvZXMgbm90IGV4aXN0LCA1MDAgaXMgc2VudAoKCjEyLjA1LjIwMDMgMTM6MDIKLSBjb2RlIGNsZWFudXAKCiAgQWZ0ZXIgdHdvIG1vbnRoIG9mIGRldmVsb3BtZW50IGl0IHdhcyB0aW1lIGNsZWFuLXVwIHRoZSBpbnRlcm5hbAogIHN0cnVjdHVyZXMuIEl0IGxvb2tzIGxpa2UgZXZlcnkgd2VudCBmaW5lIGFzIGxpZ2h0dHBkIHdvcmtzIGVzIGV4cGVjdGVkCiAgbGlrZSBiZWZvcmUuCgotIGRlZmxhdGUKICB0aGUgb24tdGhlLWZseSBjb21wcmVzc2lvbiBoYXMgYmVlbiB2ZXJpZmllZCB0byB3b3JrIGZpbmUgd2l0aCBvcGVyYSwKICBrb25xdWksIG1vemlsbGEgYW5kIHRoZSBJRS4KCjEyLjA1LjIwMDMgMDI6MTAKLSBvbi10aGUtZmx5IGNvbXByZXNzaW9uOiBkZWZsYXRlCgogIFdoeSB0aGUgaGVsbCBhcmUgdGhlIGRlZmluaW5nIGEgImRlZmxhdGUiIGVuY29kaW5nIGluIHRoZSBmb3JtIG9mCgogIF9kZWZsYXRlXyBUaGUgInpsaWIiIGZvcm1hdCBkZWZpbmVkIGluIFJGQyAxOTUwIFszMV0gaW4gY29tYmluYXRpb24KICB3aXRoIHRoZSAiZGVmbGF0ZSIgY29tcHJlc3Npb24gbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiBSRkMgMTk1MSBbMjldLgogIChSRkMgMjYxNikKCiAgYW5kIG5vb25lIGltcGxlbWVudHMgaXQgdGhhdCB3YXkgPyBLb25xdWkgYW5kIE1vemlsbGEgZXhwZWN0IGEgcGxhaW4KICBkZWZsYXRlKCkgcGFja2FnZSB3aXRob3V0IHRoZSB6bGliLWhlYWRlci4KCiAgS29ucXVpIGlzIHVzaW5nICJpbmZsYXRlMiguLi4sIC1NQVhfV0JJVFMpOyAiIHdoaWNoIGlzIG5vdGVkIGluIHRoZSB6bGliCiAgc291cmNlIGFzCgogIC8qIGhhbmRsZSB1bmRvY3VtZW50ZWQgbm93cmFwIG9wdGlvbiAobm8gemxpYiBoZWFkZXIgb3IgY2hlY2spICovCgogIEZ1bm55LiBWZXJ5LCB2ZXJ5IGZ1bm55LgoKCiAgQW55d2F5LiBXZSBoYXZlIG1pbWV0eXBlLWRlcGVuZGVkIGNvbXByZXNzaW9uIHN1cHBvcnQgbm93LgoKMTEuMDUuMjAwMyAyMTo1NgotIGxvZ2dpbmcKICByZS1hcnJhbmdlZCB0aGUgbG9nZmlsZSBzdHJ1Y3R1cmUgdG8gd3JpdGUgQ0xGICsgdXNlcmFnZW50ICsgcmVmZXJyZXIuCgoxMS4wNS4yMDAzIDEwOjIzCi0gUE9TVCBmaWxlLXVwbG9hZAogIGFkZGVkIHRoZSBtaXNzaW5nIGZ1bmN0aW9uYWxpdHkgdG8gc2VuZCBtb3JlIHRoYW4gYSBzaW5nbGUgcGFja2V0IHRvIHRoZQogIEZDR0ktU2VydmVyIChvciBDbGllbnQgPyAuLi4gdGhlIFBIUCkuCgogICAgVGhpcyBnaXZlcyB1cyB0aGUgZmlsZS11cGxvYWQgdGhpbmcgZm9yIGVnLiBQSFAgYW5kIGxhcmdlIHVzZXItZm9ybXMKICAoJmd0OzE2a2IpLgoKMDUuMDUuMjAwMyAxNToyMQotIFBBVEhfSU5GTwoKICBhZGRlZCBzdXBwb3J0IGZvciBQQVRIX0lORk8uIFBIUCBpcyBhIGxpdHRsZSBzdHJhbmdlIGFuZCBkb2Vzbid0IHRydXN0IHRoZQogIHBhc3NlZCBQQVRIX0lORk8gc2V0dGluZy4gV29ya3MgZmluZSBub3cuCgozMC4wNC4yMDAzIDE1OjI1Ci0gYnVnLWZpeGluZyBkYXkKCiAgV2hpbGUgdGVzdGluZyB0aGUgRmFzdENHSSBpbnRlcmZhY2Ugd2l0aCB0aGUgTVNJRSBCavZybiBTY2hvdHRlIGRpc2NvdmVyZWQKICB0aGF0IHNvbWV0aW1lcyB0aGUgb3V0cHV0IHJlcGVhdHMgaXRzZWxmIGZyb20gdGhlIHN0YXJ0IGluIGFuIGVuZGxlc3MgbG9vcC4KICAgIFRoaXMgYnVnIGhhcyBiZWVuIGZpeGVkLgoKICBUaGUgcmVhZC13cml0ZS1mYWxsYmFjayBmb3IgYW5jaWVudCBzeXN0ZW1zIHNlZWtlZCB0aGUgd3JvbmcgRkRzLgoKICBUaGUgRmFzdENHSSBoYW5kbGVyIGlzIG5vdyBzZXBhcnRpbmcgdGhlIEhUVFAtSGVhZGVyIGZyb20gdGhlCiAgcmVzcG9uc2UtYm9keSB3aGF0IHJlc3VsdHMgaW4gYSBjbGVhbmVyIGludGVyZmFjZS4gVGhlICJoZWFkZXIgdG9vIGxvbmcKICBmb3IgY2FjaGluZyIgbWVzc2FnZSBpcyBnb25lIG5vdy4KCjI4LjA0LjIwMDMgMTg6MTgKLSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nCgogIFRoZSBGYXN0Q0dJIHBhcnQgaXMgbm93IHVzaW5nIENodW5rZWQtVHJhbnNmZXItRW5jb2RpbmcgaWYgSFRUUC8xLjEgaXMKICB1c2VkIGFuZCBubyBjb250ZW50LWxlbmd0aCBpcyBzcGVjaWZpZWQuCgoyNy4wNC4yMDAzIDIzOjEwCi0gY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZwogIGFkZGVkICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgd2hpY2ggaXMgY3VycmVudGx5IHVzZWQgaW4gdGhlIHdlYi1jaGF0CiAgZm9yIHRoZSBlbmRsZXNzIHN0cmVhbS4gUGVyaGFwcyBpdCBoZWxwcyBzb21lIGJyb3dzZXJzLgoKICAgIFRoZSBGYXN0Q0dJIGludGVyZmFjZSB3aWxsIGdldCBhIHRoZSBjaHVua2VkLXN1cHBvcnQgdG9vLCBhcyBpdCB3aWxsCiAgZW5hYmxlIGtlZXAtYWxpdmUgZXZlbiBpZiBubyBjb250ZW50LWxlbmd0aCBpcyByZXR1cm5lZCBmcm9tIHRoZSBGYXN0Q0dJCiAgcHJvY2Vzcy4gV2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgY2h1bmtzIGFuZCB3aWxsIHJlcG9ydCBpdCB0byB0aGUgYnJvd3Nlci4KCjE2LjA0LjIwMDMgMTI6MDIKLSBnaWdFIGRlYXRjaG1hdGNoCgogIHNhc2NoYSBjb21wYXJlZCB0aGUgY3VycmVudCBsaWdodHRwZCB0byBoaXMgcHJlbWl1bSB0aHR0cGQgaW4gaGlzCiAgZ2lnYWJpdC1FdGhlcm5ldC1OZXR3b3JrLgoKICA8YQpocmVmPSJodHRwOi8vc2NodW1hbm4uY3gvZ2JpdF9kZWF0aG1hdGNoLnR4dCI+aHR0cDovL3NjaHVtYW5uLmN4L2diaXRfZGVhdGhtYXRjaC50eHQ8L2E+CgogIHNtYWxsIGNvbW1lbnQ6CiAgbGlnaHR0cGQgcHJvdmlkZXMgdGhlIHNhbWUgcGVyZm9ybWFuY2UgKHJlcS9zIGFuZCB0aG91Z2hwdXQpLCBidXQgdXNlcyBtb3JlCiAgQ1BVLVRpbWUuCgoxMC4wNC4yMDAzIDE3OjIyCi0gd29ya3Mgb24gSVJJWAoKICBK9nJnIEJlaHJlbnMgcHJvdmlkZWQgbWUgbG9naW4gdG8gaGlzIFNHSSBPcmlnaW4gYW5kIGFmdGVyIGZpeGluZyB0d28gc21hbGwKICB0eXBvcyBpdCB3b3JrZWQgZmluZSBvbiBJUklYLiAoI2lmIGRlZmluZSBIQVZFLi4uIHdhcyBtaXNzaW5nIGEgJ2QnIGFuZAogIGdldG9wdCByZXR1cm5zIGEgJ2ludCcgYW5kIG5vdCBhICdjaGFyJykKCiAgSVB2NiBzdXBwb3J0IGlzIGN1cnJlbnRseSBkaXNhYmxlZCBmb3IgSVJJWCBhIGdldGhvc3RieW5hbWUyKCkgaXNuJ3QKICBhdmFpbGFibGUuCgoxMC4wNC4yMDAzIDE1OjU2Ci0gYW5vdGhlciBidWctZml4aW5nIGRheQogIFRoZSB1cHBlciBsaW1pdCBvZiBvcGVuIGNvbm5lY3Rpb25zIHdhcyBlbmZvcmNlZCBhbmQgYSBjYXVzZWQgYSBzZWctZmF1bHQuCiAgVGhlIGN1cnJlbnQgbGltaXQgaXMgc2V0IHRvIDQwOTYgcGFyYWxsZWwgY29ubmVjdGlvbnMuCgogIEFzIHNhc2NoYSBiZW5jaG1hcmtlZCBsaWdodHRwZCBhbmQgaGlzIHByZW1pdW0gdGh0dHBkIEkgdHJpZWQgdG8gcmVwcm9kdWNlCiAgaGlzIHJlcG9ydGVkIHJlc3VsdHMgYW5kIGhhZCB0byBmaXggMiBmbGF3cyBpbiB0aGUgYXN5bmMtaW8gaGFuZGxpbmcgb2YKICBodHRwZF9sb2FkIHdoaWNoIHdhcyB1c2VkIGZvciB0aGUgdGVzdGluZy4KCiAgSWYgc2FzY2hhIHN0YXJ0cyBhbm90aGVyIGJlbmNobWFyayBzZXNzaW9uIEknbGwgcHV0IGEgbGluayB0byBpdCBoZXJlLgoKMDkuMDQuMjAwMyAwMDowOAotIGJ1Zy1maXhpbmcgdGltZQogIERhdGU6IGFuZCBMYXN0LU1vZGlmaWVkOiB3aGVyZSBzZW5kaW5nIGEgdGltZXpvbmUgIT0gR01UIHdoYXQgd2FzIGludmFsaWQuCiAgVGhlIHRpbWVzdGFtcCBpdHNlbGYgd2FzIGNvcnJlY3QsIGp1c3QgdGhlIHRpbWV6b25lIHVzZSB0aGUgd3JvbmcKICBjaGFyYWN0ZXJzLgoKICB0aGUgZmNnaS1jb2RlIGhhZCBhbiBidWZmZXItb3ZlcmZsb3cgZm9yIGxhcmdlciBQT1NULVJlcXVlc3RzLgoKICBUaGUgZmNnaS1jb2RlIHN0aWxsIGhhcyBwcm9ibGVtcyB3aXRoIFBPU1QtUmVxdWVzdCBsYXJnZXIgdGhhbiAxNmtiIGFzIHRoZQogIHRoZSB3cml0ZSBidWZmZXIgaXMgZnVsbC4gQ3VycmVudGx5IHdlIGRvbid0IGhhbmRsZSB0aGlzIGNhc2UgZXhjZXB0IGZyb20KICByZXBvcnRpbmcgaXQgaW4gdGhlIGVycm9yLWxvZy4KCjAyLjA0LjIwMDMgMDE6MTcKLSBjZ2kgaXMgYmFjawoKICBUaGUgQ0dJIEludGVyZmFjZSB3YXNuJ3QgdGVzdGVkIGZvciBhIGxvbmdlciB0aW1lLiBJdCBkb24ndCByZWFsbHkKICBzdXJ2aXZlZCB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSBjb25maWctZmlsZSBoYW5kbGluZyBhbmQgdGhlIGludGVybmFsCiAgY2hhbmdlcyB0aGF0IHdlcmUgcGFydCBvZiBpdC4KCiAgQSBzbWFsbCB0ZXN0IHdpdGgKCiMhIC91c3IvYmluL3BlcmwKcHJpbnQgIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sXHJcblxyXG4iOwpwcmludCB0aW1lKCkuIlxuIjsKMDsKCiAgcHJvZHVjZWQgMjE5IHJlcS9zLgoKICBDYWxsaW5nIFBIUCB2aWEgdGhlIENHSSBpbnRlcmZhY2UgcmVzdWx0cyBpbiAxMDAgcmVxL3MuIFNhbWUgc2NyaXB0LCBzYW1lCiAgcGFyYW1ldGVycyBmb3IgJ2FiJyBhbmQgc2FtZSBQSFAgcmVzdWx0IGluIDE0MDAgcmVxL3MgaWYgd2UgdXNlIHRoZQogIEZhc3RDR0kgaW50ZXJmYWNlLgoKICA8Yj5Eb24ndCBmb3JnZXQ8L2I+OiB0aGVzZSBiZW5jaG1hcmtzIG9ubHkgcmVwcmVzZW50IGZpZ3VyZXMgZm9yIHNjZW5hcmlvcyB3aGljaAogIGFyZSBub3QgdmVyeSByZWFsaXN0aWMuIFRoZXkgYXJlIGp1c3QgdXNlZnVsbCBmb3IgY29tcGFyaXNpb25zIG9mIHRoZQogIGludGVybmFscy4gV2UgZG9uJ3Qgd2FudCB0byBiZW5jaG1hcmsgYXBwbGljYXRpb25zLgoKMDEuMDQuMjAwMyAyMzowNAotIG5ldyBiZW5jaG1hcmtzCgogIFRoaXMgdGltZSB3ZSB3YW50ZWQgdG8gc2VlIGlmICB3ZSBjYW4gZ2V0IHRoZSBmYXN0Y2dpLUludGVyZmFjZSBhIGxpdHRsZSBiaXQKICBmYXN0ZXIuIFdlIHVzZSB0aGlzIHNtYWxsIHNjcmlwdCBmb3IgdGhlIHRlc3RpbmcgdGhlIGludGVyZmFjZS4KCiZsdDs/cGhwCgpvYl9zdGFydCgvKiJvYl9nemhhbmRsZXIiKi8pOwpwcmludCAiMTIzNDUmbHQ7YnIgLyZndDtcbiI7CmhlYWRlcigiQ29udGVudC1MZW5ndGg6ICIub2JfZ2V0X2xlbmd0aCgpKTsKb2JfZW5kX2ZsdXNoKCk7Cgo/Jmd0OwoKICBJdCBnZW5lcmF0ZSBhIHNtYWxsIG5ldHdvcmsgbG9hZCBhbmQgaXMgdGhlIGJlc3QgY2FzZSBmb3IgYmVuY2htYXJraW5nIHRoZQogIG92ZXJoZWFkIG9mIHRoZSBjYWxsIHRvIHRoZSBmYXN0Y2dpLXBocC4KCiAgVXNpbmcgdGhlIGNodW5rLUFQSSBpbnN0ZWFkIGF1ZiB0bXAtZmlsZXMgaW5jcmVhc2UgdGhlIHJlcS9zIHZvbSAxMjAwcmVxL3MKICB0byAxNjAwIHJlcS9zIGFuZCB0aGUgSU8tbG9hZCB3ZW50IGRvd24gYXMgZXhwZWN0ZWQuIFdhaXRpbmcgZm9yIHRoZQogIGZpbGVzeXN0ZW0gYW5kIGNyZWF0aW5nIDEyMDAgZmlsZXMgcGVyIHNlY29uZCByZXF1aXJlZCBzb21lIHRpbWUuIFRoZQogIENHSS1JbnRlcmZhY2UgaXMgc3RpbGwgdXNpbmcgdGVtcGZpbGVzLgoKMDEuMDQuMjAwMyAxOToyOCAobm8gYXByaWwgZm9vbHMgam9rZSkKLSBhZGRlZCBTU0wgc3VwcG9ydAogIEkgdG9vayAtbHNzbCBhbmQgLWxjcnlwdG8gYW5kIGFkZGVkIFNTTHYyL1NTTHYzL1RMUyBzdXBwb3J0IHRvIGxpZ2h0dHBkLgoKICBBZnRlciBzb21lIHJlYWRpbmcgSSByZWFsaXNpemVkIHRoYXQgbGliY3J5cHRvIGNvbnRhaW5lZCBzb21lIG9mIG15IGNvZGUuCiAgVGhleSBoYXZlIGEgc2ltaWxhciBidWZmZXItc3RydWN0IHdpdGggc2ltaWxhciBmdW5jdGlvbnMgYW5kIHRoZXkgdXNlIHRoZQogIHNhbWUgTUQ1LWNvZGUgZnJvbSB0aGUgUkZDLiA6KQoKICBBZGRpbmcgYmFzaWMgU1NMLXN1cHBvcnQgd2FzIHF1aXRlIGVzYXk6IHJlcGxhY2luZyBhbGwgd3JpdGUvcmVhZC1jYWxscyBieQogIFNTTF93cml0ZS9yZWFkLCBpbml0aWFsaXppbmcgdGhlIHNzbC1jb250ZXh0IHRoZSByaWdodCB3YXkgYW5kIHRlbGxpbmcKICBvcGVuc3NsIHdoZXJlIHRvIGdldCB0aGUgZGF0YSBmcm9tIChTU0xfc2V0X2ZkKS4gSXQgZml0cyByZWFsbHkgd2VsbCBpbnRvCiAgbGlnaHR0cGQuCgotIHNpZGVub3RlCiAgc29vbmVyIG9yIGxhdGVyIHRoZSBjb24tPmZpbGVuYW1lIGhhbmRsZXIgd2lsbCB2YW5pc2ggaW4gZmF2b3VyIG9mIHRoZQogIGRpcmVjdCBpbnRlcmZhY2UgdG8gdGhlIGNodW5rLUFQSSB3aGljaCB3aWxsIHNpbXBsaWZpeSB0aGUgZGVzaWduIGEgbGl0dGxlCiAgYml0LgoKMzEuMDMuMjAwMyAyMDo1MAotIGFkZGVkIGEgd2ViLWNoYXQgbW9kdWxlCiAgMTQwMCBsaW5lcyBvZiBDLWNvZGUgYXJlIG5lY2Nlc2FyeSB0byBhZGQgYSB3ZWItY2hhdCB0byBsaWdodHRwZC4KCiAgRmVhdHVyZXM6CiAgLSBiYi1jb2RlIGZvciB0ZXh0LWxheW91dGluZwogIC0gYXV0by1oaWdobGlnaHQgZm9yIFVSTHMgYW5kIEVtYWlsLWFkcmVzc2VzCiAgLSB1bmxpbWl0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzCiAgLSBtYXguIDMyLjAwMCB1c2VycyBwZXIgY2hhbm5lbAogIC0gZmFzdCBhcyBpdCBpcyBkaXJlY3RseSBpbnRlZ3JhdGVkIGludG8gdGhlIHdlYi1zZXJ2ZXIKICAtIGVhc3kgdG8gaW5zdGFsbCAoYXMgZWFzeSBhcyBsaWdodHRwZCkKICAtIElSQy1saWtlICgvbXNnLCAva2ljaywgL21lLCAuLi4pCiAgLSB3b3JrcyB3aXRoIE1TIElFLCBNb3ppbGxhLCBLb25xdWVyb3IsIC4uLgogIC0gdXNlcyBhcyBsaXR0bGUgSmF2YVNjcmlwdCBhcyBwb3NzaWJsZSB0byBzdGF5IGNvbXBhdGlibGUgd2l0aCBhbGwgYnJvd3NlcnMKICAtIGZsb29kLXByb3RlY3Rpb24gKDIgTGV2ZWxzOiBpZ25vcmUgYW5kIGtpY2spCiAgLSB1c2VzIENTUyBmb3IgY3VzdG9taXplZCBsb29rLWFuZC1mZWVsCgoyNS4wMy4yMDAzIDAwOjM2Ci0gZmluaXNoZWQgdGhlIGNvbmZpZy1maWxlIHN1cHBvcnQKICBub3cgd2UgaGF2ZSBjb25maWctc2VjdGlvbnMKCiAgW2Zhc3RjZ2ldCiAgZmFzdGNnaSAucGhwIDE5Mi4xNjguMi43NiAxMDI1CgogIFRoZSBvbmx5IHRoaXMgbWlzc2luZyBpcyAtSFVQIGhhbmRsaW5nIHRvIHJlLXJlYWQgdGhlIGNvbmZpZy4gQnV0IHRoYXQKICB3aWxsIGZvbGxvdyB3aGVuIEknbSB1cCBhZ2Fpbi4KCjIwLjAzLjIwMDMgMDE6MDQKLSBhZGRpbmcgY29uZmlnLWZpbGUgc3VwcG9ydAogIHRoZSBtb3N0IGJvcmluZyBwYXJ0IG9mIHRoZSB3cml0aW5nIHByb2dyYW1zIGFmdGVyIHdyaXRpbmcgZG9jdW1lbnRhdGlvbi4KICBUaGUgZm9ybWF0IGlzIHF1aXRlIHNpbXBsZSBhbmQgZ29vZCBlbm91Z2ggZm9yIGxpZ2h0dHBkLgoKMTkuMDMuMjAwMyAwMzowNQotIG1vcmUgb24gc2VuZGZpbGUgc3VwcG9ydAogIGFkZGVkIHN1cHBvcnQgZm9yIGZyZWVic2QncyB2ZXJzaW9uIG9mIHNlbmRmaWxlKCkuCgogIExpbnV4OgogIHNzaXplX3Qgc2VuZGZpbGUoaW50IG91dF9mZCwgaW50IGluX2ZkLCBvZmZfdCAqb2Zmc2V0LCBzaXplX3QgY291bnQpOwoKICBGcmVlQlNEOgogIGludCAgICAgc2VuZGZpbGUoaW50IGZkLCBpbnQgcywgb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgbmJ5dGVzLAogICAgICAgICAgICAgICAgICAgc3RydWN0IHNmX2hkdHIgKmhkdHIsIG9mZl90ICpzYnl0ZXMsIGludCBmbGFncyk7CgogIHRoZSBmaXJzdCAyIHBhcmFtcyBhcmUgc3dhcCwgdGhlIG5leHQgMiBhcmUgdGhlIHNhbWUgYW5kIHRoZSBsYXN0IDMgYXJlCiAgc2V0IHRvIE5VTEwgb3IgMC4KCiAgU29sYXJpcyA5IGlzIHByb3ZpZGluZyBhIGRpcmVjdCBpbnRlcmZhY2UgdG8gdGhlIGNodW5rLUFQSSB3aXRoIHRoZQogIHNlbmRmaWxldigpIHN5c3RlbSBjYWxsOgoKICBzc2l6ZV90IHNlbmRmaWxldihpbnQgZmlsZGVzLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzZW5kZmlsZXZlYyAqdmVjLCBpbnQgc2Z2Y250LCBzaXplX3QgKnhmZXJyZWQpOwoKICByZWNvdmVyaW5nIGZyb20gYSBmYWlsdXJlIGlzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbXBsZXgsIGJ1dCBpdCBzaG91bGQgYmUKICBmYXN0LiBJIGp1c3QgbmVlZCBhIHN5c3RlbSB0byB0ZXN0IGl0LiBBbnlvbmUgPwoKMTguMDMuMjAwMyAxNzozMgotIGluIHRoZSBuZXdzCiAgd2hhdCBhIHN1cnByaXNlOiBsaWdodHRwZCBpcyBhbm5vdW5jZWQgaW4gZW50d2lja2xlci5jb20uCgogIDxhIGhyZWY9Imh0dHA6Ly93d3cuZW50d2lja2xlci5jb20vaXRyL25ld3MvcHNlY29tLGlkLDk0ODMsbm9kZWlkLDgyLmh0bWwiPmh0dHA6Ly93d3cuZW50d2lja2xlci5jb20vaXRyL25ld3MvcHNlY29tLGlkLDk0ODMsbm9kZWlkLDgyLmh0bWw8L2E+CgogIHRoaXMgd2FzIG5vdCBwbGFubmVkLgoKCi0gaW1wbGVtZW50ZWQgdGhlIGNodW5rZWQtQVBJCiAgcmF0aGVyIHdyaXRpbmcgdGhlIGNvbnRlbnQgb2YgbXVsdGktcmFuZ2UnZCByZXF1ZXN0cyB0byBhIHRlbXAtZmlsZSB3ZQogIGp1c3QgcmVnaXN0ZXIgdGhlIHBhcnRzIGluIGEgY2h1bmstcXVldWUuCgogIGNodW5rIDEgW21lbV0gIC0gcGFydC1oZWFkZXIKICBjaHVuayAyIFtmaWxlXSAtIHNvdXJjZS1maWxlIChvZmZzZXQsIGxlbikKICBjaHVuayAzIFttZW1dICAtIHBhcnQtaGVhZGVyCiAgY2h1bmsgNCBbZmlsZV0gLSBzb3VyY2UtZmlsZSAob2Zmc2V0LCBsZW4pCiAgY2h1bmsgNSBbbWVtXSAgLSBwYXJ0LWZvb3RlcgoKICBJZiBldmVyeXRoaW5nIGlzIHByZXBhcmVkLCB0aGUgY29udGVudC1sZW5ndGggaXMgY2FsY3VsYXRlZCBhbmQgdGhlCiAgaHR0cC1oZWFkZXIgaXMgZ2VuZXJhdGVkIGFuZCBwcmVwZW5kZWQgdG8gdGhlIGNodW5rLXF1ZXVlLgoKICB0aGUgaGFuZGxlX3dyaXRlKCkgZnVuY3Rpb24gd2hpY2ggaGFuZGxlcyB0aGUgd3JpdGUtcHJvY2VzcyBqdXN0IHNlbmRzIHRoZQogIGNodW5rcyB0byB0aGUgbmV0d29yayB3aXRob3V0IG9ubHkgZnVydGhlciBtb2RpZmljYXRpb25zLgoKICB0aGUgY2h1bmstYXBpIGV2ZW4gc2ltcGxpZmllcyB0aGUKICAnbXktZmFzdGNnaS1wcm9jZXNzLW5lZWRzLXNvbWUtdGltZS10by1jcmVhdGUtdGhlLXJlc3BvbnNlLQogIGFuZC1zZW5kcy10aGUtZGF0YS1pbi1jaHVua3MnIGNhc2UuIEp1c3QgYWRkIHRoZSBjaHVuayB0byB0aGUgcXVldWUgaWYgaXQKICBpcyByZWNlaXZlZC4KCjEzLjAzLjIwMDMgMTA6NDkKLSBhbm90aGVyIHNldCBvZiByZWFsLWxpZmUgYmVuY2htYXJrcwoKICB0aGUgY2hhaXJtYW4gd2FzIGJlbmNobWFya2VkIGEgbGl0dGxlIGJpdC4gQ2hhaXJtYW4gaXMgZnVsbC1mbGVnZGVkIFdDTVMuCiAgQXMgZXZlcnkgQ01TIGl0IG5lZWRzIHNvbWUgdGltZSB0byBnZW5lcmF0ZSBwYWdlcy4gVG8gc3BlZWQgdGhlIHBhZ2UKICBnZW5lcmF0aW5nIHRoZSBzdGF0aWMtcGFydHMgb2YgdGhlIHBhZ2UgY2FuIGJlIGNhY2hlZCBpbnRlcm5hbGx5LgoKICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBjYWNoaW5nICAgd2l0aCBjYWNoaW5nCmFwYWNoZSArIG1vZF9waHAgICA6ICAgICAgICAgICAgMi41MCAgICAgICAgICAxMC42NCByZXEvcwpsaWdodHRwZCArIGZjZ2ktcGhwOiAgICAgICAgICAgIDIuNTAgICAgICAgICAgMjIuNzQgcmVxL3MKCiAgTG9va3MgbGlrZSBsaWdodHRwZCBpcyB0aGUgd2F5IHRvIGdvIDopCgogIFBsZWFzZSwgZG9uJ3QgY29tcGFyZSB0aGVzZSBudW1iZXJzIHdpdGggdGhlIG90aGVyIGJlbmNobWFya3M6CiAgV2UgdXNlZCBhIGRpZmZlcmVudCB0ZXN0LW1hY2hpbmUgd2hpY2ggaXMgYSBsaXR0bGUgYml0IHVuZGVyLXBvd2VyZWQKICBmb3IgdGhpcyB0ZXN0LWNhc2UuCgoxMi4wMy4yMDAzIDEzOjQzCi0gYW5vdGhlciBsYXJnZSBhcHBsaWNhdGlvbiB3b3JrcyB3aXRoIGxpZ2h0dHBkCgogIDxhCmhyZWY9Imh0dHA6Ly93d3cudGhpbmtwaHAuZGUvY29udGVudC9jb250ZW50Mi5waHA/Q2F0SUQ9NDQmYW1wO05ld3NJRD05NSI+Q2hhaXJtYW48L2E+IGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy50aGlua3BocC5kZS8iPnRoaW5rcGhwPC9hPiBoYXMgYmVlbiB2ZXJpZmllZCB0byB3b3JrIHdpdGggbGlnaHR0cGQuCgogIFRocmVlIHRoaW5ncyBhcmUgd29ydGggdG8gbm90ZToKCiAgMS4gQUxXQVlTIHVzZSBsb2dfZXJyb3IgaW4gdGhlIHBocC5pbmkgaWYgeW91IHVzZSBGYXN0Q0dJCiAgICAgb3RoZXJ3aXNlIGl0IHdpbGwgcHV0IHRoZSBlcnJvcm1lc3NhZ2VzIGRpcmVjdGx5IGludG8gZmFzdGNnaS1zb2NrZXQKICAgICB3aXRob3V0IGFueSBGYXN0Q0dJIEhlYWRlci4gVGhpcyB3aWxsIHJlc3VsdCBpbiBzdHJhbmdlIGVycm9ycy4KICAgICAoaXRzIGEgUEhQIGJ1ZykKICAyLiBET0NVTUVOVF9ST09UIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAzLiBhIHNtYWxsIGJ1ZyBmb3Igc2VuZGluZyBsYXJnZXIgb3V0cHV0IGZyb20gYSBmYXN0Y2dpIGNsaWVudCBoYXMgYmVlbgogICAgIGZpeGVkLgoKMTEuMDMuMjAwMyAxMTo1MgotIGFkZGVkIHR3byBuZWNjZXNhcnkgZmVhdHVyZXMKICAtIHJlZGlyZWN0IF9kaXJfIHRvIF9kaXJfLwogIC0gYXBwZW5kIGluZGV4LWZpbGUgdG8gX2Rpcl8vIGlmIHRoZXkgZXhpc3QKCjExLjAzLjIwMDMgMDA6MTMKLSBhbm90aGVyIHRhcmdldAogIGFmdGVyIGFkZGluZyBzb21lIGhlYWRlcnMgbGlnaHR0cGQgY29tcGlsZXMgd2l0aG91dCBhbnkgd2FybmluZ3MKICB1bmRlciBjeWd3aW4gb24gV2luZG93cy4KCiAgQSBuYXRpdmUgd2luZG93cyBwb3J0IHdpbGwgdGFrZSBzb21lIHRpbWUgYXMgSSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlCiAgY2hhbmdlcyBvbiB0aGUgd2luc29jay5oIHRvIHRoZSB1bml4IGhlYWRlcnMuCgoxMC4wMy4yMDAzIDExOjUyCi0gYWRkZWQgU29sYXJpcyA4IGFuZCA5CiAgbGlnaHR0cGQgaGFzIGJlZW4gY29uZmlybWVkIHRvIGNvbXBpbGUgYW5kIHdvcmsgb24KCiAgLSBsaW51eAogIC0gRnJlZUJTRCwgTmV0QlNECiAgLSBTb2xhcmlzIDgsIDkKCiAgUGVyaGFwcyBJIGNhbiBnZXQgbGNjIHRvIGNvbXBpbGUgaXQgb24gd2luZG93cy4KCjEwLjAzLjIwMDMgMDE6MzAKLSBhbm90aGVyIHBsYXRmb3JtIHdhcyBjb25maXJtZWQKICBsaWdodHRwZCB3b3JrcyBvbiBOZXRCU0QKCi0gYW5vdGhlciB3ZWJzZXJ2ZXIgYmVuY2htYXJrCiAgbWF0aG9wZCAoaHR0cDovL3d3dy5tYXRob3BkLm9yZy8pCgogICAgICAgICAgICAgICAgICAgIE1hdGhvcGQvMS40Ci1jIDEwCjRrICAgICAgICAgICAgICAgIDogIDYzMjkuMTEgWyMvc2VjXQo0ayAoa2VlcC1hbGl2ZSkgICA6IDEwMjM1LjQxIFsjL3NlY10KMTAwayAgICAgICAgICAgICAgOiAgMTE2OC41MCBbIy9zZWNdCjEwMGsgKGtlZXAtYWxpdmUpIDogICAyNjguODIgWyMvc2VjXSAoOTklIGlkbGUpCi1jIDEwMAo0ayAgICAgICAgICAgICAgICA6ICAgIC0tLS0gKGNvbm5lY3Rpb25zIGRyb3BwZWQpCjRrIChrZWVwLWFsaXZlKSAgIDogICAgLS0tLQoxMDBrICAgICAgICAgICAgICA6ICAgIC0tLS0KMTAwayAoa2VlcC1hbGl2ZSkgOiAgICAtLS0tCgpWZXJ5IGdvb2QgdmFsdWVzIGZvciBzbWFsbCBmaWxlcywgYnV0IHRoZSByZXN0ID8KCjEwLjAzLjIwMDMgMDA6MDYKLSBhZGRlZCBtb3JlIHdyaXRlLWhhbmRsZXJzCiAgMS4gc2VuZGZpbGUgKGxpbnV4IG9ubHkpCiAgMi4gbW1hcCArIHdyaXRlCiAgMy4gcmVhZCArIHdyaXRlCgogIFRoaXMgbWVhbnMgdGhhdCBsaWdodHRwZCBydW5zIG9uIHNvbWUgbW9yZSBzeXN0ZW1zLiBJdCBoYXMgYmVlbiB2ZXJpZmllZAogIHRvIGNvbXBpbGUgYW5kIHdvcmsgb24gbGludXggMi40LnggYW5kIEZyZWVCU0QuCgoKLWMgMTAwCiAgICAgICAgIHNlbmRmaWxlICBtbWFwICAgICByZWFkCjRrICAgICAgIDY0NzYuNjggICA1Njk4LjAxICA1MzYzLjA4IFsjL3NlY10KMTAwayAgICAgMjMxMi4zNSAgICA4NDEuNTQgICA3ODMuMDkgWyMvc2VjXQoKICBUaGUgbW1hcCgpIG51bWJlcnMgY291bGQgYmUgYmV0dGVyIHdpdGggYSBmZCttbWFwLWNhY2hlLiBUaGUgemVyby1jb3B5IHRoaW5nCiAgaXMgZ29vZCBmb3Igb3VyIHBlcmZvcm1hbmNlLgoKLSB0ZXN0ZWQgYW5vdGhlciBzbWFsbCBodHRwZCAtIEJPQQogIGp1c3QgdG8gZ2V0IGEgYmV0dGVyIHZpZXcgYWJvdXQgdGhlIHBlcmZvcm1hbmNlIG9mIGxpZ2h0dHBkIGkndmUgdGVzdGVkCiAgYW5vdGhlciBodHRwZDogQm9hLzAuOTQuMTRyYzE2IChodHRwOi8vd3d3LmJvYS5vcmcvKQoKICAgICAgICAgICAgICAgICAgICBCb2EvMC45NC4xNHJjMTYKLWMgMTAKNGsgICAgICAgICAgICAgICAgOiAgICAgICAgIDU2NTkuNjMgWyMvc2VjXQo0ayAoa2VlcC1hbGl2ZSkgICA6ICAgICAgICAgIDI1MC4yMyBbIy9zZWNdCjEwMGsgICAgICAgICAgICAgIDogICAgICAgICAxMTA0LjI5IFsjL3NlY10KMTAwayAoa2VlcC1hbGl2ZSkgOiAgICAgICAgIDEzNjMuMTQgWyMvc2VjXQotYyAxMDAKNGsgICAgICAgICAgICAgICAgOiAgICAgICAgIDQzMTkuNjUgWyMvc2VjXQo0ayAoa2VlcC1hbGl2ZSkgICA6ICAgICAgICAgMjQ5MC42NiBbIy9zZWNdCjEwMGsgICAgICAgICAgICAgIDogICAgICAgICAgODE1LjkzIFsjL3NlY10KMTAwayAoa2VlcC1hbGl2ZSkgOiAgICAgICAgIDEwMDcuMDUgWyMvc2VjXQoKICBUaGUgcmVzdWx0cyBhcmUgYSBsaXR0bGUgYml0IHN0cmFuZ2UuIEtlZXAtQWxpdmUgZm9yIHNtYWxsIGZpbGVzIHNlZW1zIHRvIGJlCiAgYnJva2VuLgoKICBJdCBsb29rcyBsaWtlIGxpZ2h0dHBkIGhhcyBlbm91Z2ggcG93ZXIgZm9yIG5vdy4gVGltZSB0aGUgcG9ydCBhbmQgYWRkIG1vcmUKICBmZWF0dXJlcy4KCjA5LjAzLjIwMDMgMTM6MjYKLSBsb2FkLWJhbGFuY2luZyB3b3JrcyBncmVhdAoKICBJIHVzZWQgdGhlIGZyYW1ld29yayBmcm9tIGh0dHA6Ly9mcmFtZXdvcmsubmV0dXNlLmRlLyBhcyBhCiAgcmVhbC1saWZlIGV4YW1wbGUgYWdhaW4gdG8gdGVzdCB0aGUgbG9hZC1iYWxhbmNlci4KCiAgc2V0dXA6CiAgLSBncmlzdQogICAgLSBBTUQgYXRobG9uIFhQIDIwMDArCiAgICAtIHJ1bnMgbGlnaHR0cGQgKyBhYiArIGEgJ25pY2UgLTE1J2VkIEZhc3RDR0ktUEhQCiAgICAtIGdlbmVyYXRlcyAxNTMgcmVxL3MgYWxvbmUKCiAgLSBsYXB0b3AKICAgIC0gSW50ZWwgUElJSSA4NTAKICAgIC0gcnVucyBhIEZhc3RDR0ktUEhQCiAgICAtIGdlbmVyYXRlcyA4OCByZXEvcwoKICAgdXNpbmcgdGhlIGludGVybmFsIGxvYWQtYmFsYW5jZXIgb2YgbGlnaHR0cGQgd2hpY2ggYmFsYW5jZXMgdGhlCiAgIHBocC1yZXF1ZXN0cyBvdmVyIGdyaXN1IGFuZCBsYXB0b3AgZ2VuZXJhdGU6CiAgICAgMjIxIHJlcS9zCgogICBBbiBhcGFjaGUgd2l0aCBtb2RfcGhwIHJ1bm5pbmcgb24gZ3Jpc3UgZ2l2ZXMgMTE3LjA0IHJlcS9zIG9ubHkuCgowOS4wMy4yMDAzIDEyOjQ2Ci0gYnVpbGRpbmcgdGhlIGNvbm5lY3QgY29ubmVjdGlvbiB0byB0aGUgZmNnaS1waHAgaXMgbm90IG5vbi1ibG9ja2luZwogIHNvY2tldCgpIC0+IGNvbm5lY3QoKSAtPiBmY250bChub24tYmxvY2tpbmcpIHJlc3VsdGVkIGluIHNvbWUgcHJvYmxlbXMgYXMKICB0aGUgY29ubmVjdCgpIGNhbGwgYmxvY2tlZCBzb21ldGltZXMgZm9yIDEgc2Vjb25kcy4KCiAgc29ja2V0KCkgLT4gZmNudGwobm9uLWJsb2NraW5nKSAtPiBjb25uZWN0KCkgc29sdmVzIHRoaXMgcHJvYmxlbSwgYnV0CiAgYWRkZXMgbW9yZSBvdmVyaGVhZC4gVGhlIGZpcnN0IGNvbm5lY3QtYXR0ZW1wdCBzZWVtcyBhbHdheXMgdG8KICByZXR1cm4gRUlOUFJPR1JFU1MuCgowOC4wMy4yMDAzIDE1OjA2Ci0gdGhlIGZpcnN0ICdyZWFsLWxpZmUnIFBIUCB0ZXN0IHNob3dlZCAyIGJ1Z3MgaW4gdGhlIFBPU1QgaGFuZGxpbmcuCiAgMS4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgd2FzIG5vdCBmb3J3YXJkZWQgdmlhIGZhc3RjZ2kKICAyLiB0aGUgaW50ZXJuYWwgY29udGVudF9sZW5ndGggaGFuZGxlciB3YXNuJ3QgcmVzZXQgYWZ0ZXIgdGhlIHJlcXVlc3QKCiAgbm93IGxpZ2h0dHBkICsgcGhwIHdvcmsgd2l0aAoKICBodHRwOi8vZnJhbWV3b3JrLm5ldHVzZS5kZS8KCiAgdGhlIGJhc2ljIGFwcGxpY2F0aW9uIGdpdmVzIHVzIDE0NSByZXEvcwoKMDguMDMuMjAwMyAxMTowNgotIHVzZSBkaWV0IHRvICd0ZXN0JyB5b3VyIGNvZGUKICBkaWV0IGdpdmVzIHNvbWUgdXNlIGZ1bGwgd2FybmluZ3Mgd2hpY2ggc2hvdWxkIGJlIGZvbGxvd2VkLiBJIHRvb2sgdGhlCiAgY2hhbmNlIGFuZCByZW1vdmVkIHRoZSBsYXN0IGZldyBmcHJpbnRmKCkgYW5kIHNwcmludGYoKSBmcm9tIHRoZSBjb2RlLgogIG5vdywgd2UgZG9uJ3QgbmVlZCBzdGRpby5oIGFueW1vcmUuCgogICAgYSBzdGF0aWNseSBsaW5rZWQsIHN0cmlwcGVkIGxpZ2h0dHBkIGlzIDQyODg0IGJ5dGVzIGxhcmdlLgoKMDguMDMuMjAwMyAwMTo1NQotIGJ1ZmZlcl9zdHJjYXQoKSB1c2VzIHN0cmxlbigpIHRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSAndG8tYmUtY2F0dGVkLXN0cmluZycKICBpZiB0aGUgc3RyaW5nIGlzIGNvbnN0YW50IG9yIGhhcyBhIGtub3duIGxlbmd0aCB5b3UgY2FuIHBhc3MgdGhhdCBmdW5jdGlvbgogIHdoaWNoIGdpdmVzIHVzZSBidWZmZXJfc3RyY2F0X2xlbigpIHdoaWNoIHBhc3NlcyB0aGUgc3RyaW5nIGxlbmd0aCBhcyBhCiAgcGFyYW1ldGVyLgoKLSB1c2luZyBhIHJhbWRpc2sgYXMgdGhlIGJhc2UgZm9yIHRoZSB0ZW1wZmlsZXMgZ2VuZXJhdGVkIG1rc3RlbXAoKSBpcyBhCiAgdmVyeSBjb29kIGlkZWEKICBpdCByZWR1Y2VzIHRoZSBpby1sb2FkIG9uIHRoZSBzeXN0ZW0gYW5kIGdpdmVzIGFzIG1vcmUgY3B1LXRpbWUgZm9yCiAgbG9hZC1iYWxhbmNpbmcgdGhlIHBocC1yZXF1ZXN0cy4KCi0gY2FjaGUgdGhlIG91dHB1dCBvZiBzdHJmdGltZSgpLCBnbXRpbWUoKSBhbmQgbG9jYWx0aW1lCiAgd2UgZ2VuZXJhdGUgbW9yZSB0aGVuIDEwLjAwMCByZXEvcyB3aGljaCByZXN1bHRzIGluIHVzaW5nIHRoZSBzYW1lCiAgdGltZXN0YW1wIG92ZXIgYW5kIG92ZXIgYWdhaW4uIEl0IGlzIHN1ZmZpY2llbnQgdG8gZ2VuZXJhdGUgdGhlIHRpbWVzdGFtcAogIG9uY2UgYSBzZWNvbmQgYW5kIGdpdmUgdXMgYSBidW5jaCBvZiBDUFUtY3ljbGVzIGZvciBzZW5kaW5nIGZpbGVzLgoKICB0aGUgc2FtZSBhcHBsaWVzIGZvciBvdGhlciB0aW1lc3RhbXBzIGxpa2UgTGFzdC1tb2RpZmllZCB3aGljaCBzZW5kcyBhCiAgc3RyaW5nIHZlcnNpb24gb2Ygc3Quc3RfbXRpbWUuIENhY2hlIGl0LgoKLSBkb24ndCB0cnkgdG8gb3Zlcm9wdGltaXplIGZvciBjb2RlIGZvciB0aGUgc2FrZSBvZiBjbGVhbiBjb2RlCiAgdGhlIHJhbmdlIHN1cHBvcnQgcmVxdWlyZSBzb21lIGhhY2sgaW4gdGhlIGZpcnN0IHZlcnNpb25zIGxpa2Ugc2V0dGluZyB0aGUKICB3cml0ZV9vZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBhbmQga2VlcGluZyB0aGUgcmVzdCBvZiB0aGUKICAiY29kZSAyMDAiIHNlbmQgY29kZSBhcyB1c3VhbC4gT25seSBhIGZldyBsaW5lcyBhZGRlZCB0aGlzIGZpcnN0IHJhbmdlCiAgZmVhdHVyZS4gZmFzdCwgYnV0IGEgaGFjay4gSXQgbWFkZSB0aGluZ3MgbW9yZSBjb21wbGljYXRlZCB0aGVuIG5lY2Nlc2FyeQogIHRvIGFkZCBtdWx0aS1yYW5nZSBzdXBwb3J0IGluIHRoaXMgc2NlbmFyaW8uCgogIHJlbW92aW5nIHRoZSBoYWNrIGRvaW5nIHNtYWxsIGNsZWFuIHByZXByb2Nlc3NpbmcgaGVscHMgdG8gY2xlYW4gdXAgdGhlCiAgd2hvbGUgJ3dyaXRlIGEgY2h1bmsgb24gdGhlIHdpcmUnIGNvZGUuIEF0IHRoZSBlbmQgd2UgdXNlIGxlc3MgY29kZSBhbmQKICBoYXZlIGEgY2xlYW5lciBkZXNpZ24uCgogIFNhc2NoYSBwcm9wb3NlZCBhIGNodW5rZWQgbGF5ZXIgd2hpY2gganVzdCB0YWtlcyB0aGUgY2h1bmtzIChodHRwLWhlYWRlciwKICBwYXJ0LWhlYWRlciwgcGFydC1tZXNzYWdlLCAuLi4gYW5kIHRoZSBsYXN0IGJvdW5kYXJ5KSBhbmQgcGFzc2VzIHRoZW0gdG8KICB0aGUgd3JpdGUtdG8tdGhlLXdpcmUtY29kZS4gVGhpcyBpcyBmYXIgbW9yZSBlbGVnYW50IGFuZCB3aWxsIHBlcmhhcHMgc2FtZQogIHVzIGZyb20gb3RoZXIgcHJvYmxlbXMsIHRvby4gQ3VycmVudGx5IEkgdGhpbmsgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5LgogIEZpcnN0IHdlIGhhdmUgdG8gZml4IHNvbWUgcHJvdGFiaWxpdHkgaXNzdWVzLgoKT2ssIHRvZGF5IGJlbmNoZXM6CgogICAgICAgICAgICAgICAgICAgICAgIHRvZGF5ICAgICAgbGFzdAotYyAxMAo0ayAgICAgICAgICAgICAgICA6ICA5NDQzLjc2ICAgNzczOS45NCAgICArIDIyJQo0ayAoa2VlcC1hbGl2ZSkgICA6IDE3OTg1LjYxICAxMzg4NS4wMyAgICArIDI5JQoxMDBrICAgICAgICAgICAgICA6ICAzNzIyLjMyICAgMzM0OS45NyAgICArIDExJQoxMDBrIChrZWVwLWFsaXZlKSA6ICA1OTc1Ljg2ICAgNDk2NS40OSAgICArIDIwJQotYyAxMDAKNGsgICAgICAgICAgICAgICAgOiAgNjcyNC45NSAgIDU5MTguNTYgICAgKyAxMyUKNGsgKGtlZXAtYWxpdmUpICAgOiAxMDgzMy4wNiAgIDg0MDUuNDggICAgKyAyOCUKMTAwayAgICAgICAgICAgICAgOiAgMjYwNy4zNiAgIDIzOTMuNjAgICAgKyAgOSUKMTAwayAoa2VlcC1hbGl2ZSkgOiAgNDMxNC4wNiAgIDQwMzUuMzUgICAgKyAgNyUKClRvcCBUcmFuc2ZlciBSYXRlOgoKICAgIDg2MzY1Ljc3IFtLYnl0ZXMvc2VjXSByZWNlaXZlZAoKVG9vIG11Y2ggZm9yIGEgR2lnRS1saW5rID8KCgpzbyBmYXI6CgotIHVzZSBzdGF0ZS1lbmdpbmVzCgogIGEgbm9uLWZvcmtpbmcgd2Vic2VydmVyIGxpa2UgZGVzY3JpYmVkIGluCgogIGh0dHA6Ly93d3cua2VnZWwuY29tL2MxMGsuaHRtbAoKLSBkb24ndCB1c2UgZnByaW50ZigpIGZvciBsb2dnaW5nLgogIHdyaXRpbmcgb25lIGxpbmUgdG8gbG9nIGZpbGUgdGFrZXMgbW9yZSB0aW1lIHRoYXQgc2VuZGluZyByZXNwb25zaW5nIHRoZSBhCiAgSFRUUC1yZXF1ZXN0CgotIHRha2UgY2FyZSBvZiB5b3VyIG1lbW9yeQoKICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICBjaGFyICpwdHI7CiAgICAgICAgICBzaXplX3QgdXNlZDsKICAgICAgICAgIHNpemVfdCBzaXplOwogIH0gYnVmZmVyOwoKICBidWZmZXIqIGJ1ZmZlcl9pbml0KCk7CiAgdm9pZCBidWZmZXJfZnJlZShidWZmZXIgKmIpOwogIGludCBidWZmZXJfcHJlcGFyZV9jb3B5KGJ1ZmZlciAqYiwgc2l6ZV90IHNpemUpOwogIGludCBidWZmZXJfcHJlcGFyZV9hcHBlbmQoYnVmZmVyICpiLCBzaXplX3Qgc2l6ZSk7CiAgaW50IGJ1ZmZlcl9zdHJjcHkoYnVmZmVyICpiLCBjb25zdCBjaGFyICpzKTsKICBpbnQgYnVmZmVyX3N0cmNweV9sZW4oYnVmZmVyICpiLCBjb25zdCBjaGFyICpzLCBpbnQgc19sZW4pOwogIGludCBidWZmZXJfc3RyY2F0KGJ1ZmZlciAqYiwgY29uc3QgY2hhciAqcyk7CiAgaW50IGJ1ZmZlcl9zdHJjYXRfbGVuKGJ1ZmZlciAqYiwgY29uc3QgY2hhciAqcywgaW50IHNfbGVuKTsKCiAgYnVmZmVyX2luaXQoKSBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciBidWZmZXIuIElmIHlvdSBkb24ndCBuZWVkIHRoZQogIGJ1ZmZlciwgc2V0ICd1c2VkJyB0byB6ZXJvIGFuZCByZXVzZWQgaXQgYWZ0ZXJ3YXJkLgogICAgYnVmZmVyX3N0cmNweSgpICsgYnVmZmVyX3N0cmNhdCgpIGNoZWNrIGlmIHRoZSAndXNlZCcgKyB0aGUgbmV3IHN0cmxlbigpCiAgZml0IGluIHRvIHRoZSAnc2l6ZScgb2YgdGhlIGJ1ZmZlci4gSWYgbm90IHRoZSByZWFsbG9jKCkgdGhlIGJ1ZmZlci4KICAgIGJ1ZmZlcl9zdHJjYXQoKSB1c2VzIG1lbWNweShwdHIgKyB1c2VkIC0gMSwgcywgc19sZW4gKyAxKTsgd2hpY2ggc2hvdWxkCiAgYmUgZmFzdGVyIHRoYW4gdGhlIG9yaWdpbmFsIHN0cmNhdCgpLgoKICBVc2luZyB0aG9zZSBidWZmZXJzIGtlZXAgdGhlIG1lbW9yeSB1c2FnZSBhdCAyTWIuIG1hbGxvYygpIGFuZCBmcmVlKCkgYXJlCiAgb25seSBjYWxsZWQgYXQgdGhlIGJlZ2lubmlnIG9mIHRoZSBwcm9ncmFtbSBhbmQgYXQgdGhlIGVuZC4KCi0gZG9uJ3QgdXNlZCBzcHJpbnRmKCkgdG8gY29udmVydCBhIGludGVnZXIgaW50byBhIHN0cmluZyBhcyBsaWtlCiAgc3ByaW50ZihidWYsICIlZCIsIGwpOwoKICB3cml0ZSB5b3VyIG93biBsdG9zdHIgZnVuY3Rpb24uIHNwcmludGYoKSBpcyB0byBnZW5lcmFsIGZvciB0aGUgY2FzZSBhbmQKICBpcyBzbG93LgoKClNwZWVkOgotLS0tLS0KCkxldCdzIGFzc3VtZSB0aGF0IDxhCmhyZWY9Imh0dHA6Ly93d3cuYWNtZS5jb20vc29mdHdhcmUvdGh0dHBkLyI+dGh0dHBkPC9hPiBpcyAob25lIG9mKSB0aGUKZmFzdGVzdCB3ZWJzZXJ2ZXJzIG91dCB0aGVyZS4KCmFsbCBodHRwZHMgd2VyZSBzdGFydGVkIHdpdGg6CgokIC4vdGh0dHBkIC1wIDEwMjYgLUQgXAogLWQgL2hvbWUvd2VpZ29uL3Byb2plY3RzL2xvY2FsaXplci9zcmMvbGlnaHR0cGQvZG9jcm9vdC8gXAogLWwgdGh0dHBkLmFjY2Vzcy5sb2cKCihsaWdodHRwZCB1c2VzIHRoZSBzYW1lIHBhcmFtZXRlcnMpLgoKV2UgdXNlZCBBcGFjaGVCZW5jaCBmb3IgdGVzdGluZyB0aGUgUlBTIChyZXF1ZXN0cyBwZXIgc2Vjb25kKS4KCiQgL3Vzci9zYmluL2FiIC1kUyAtYyAxMCAtbiAxMDAwMDAgaHR0cDovLzE5Mi4xNjguMi4xMDo4MC9kdW1teS5vdXQKCiAgICAgICAgICAgICAgICAgIGxpZ2h0dHBkICB0aHR0cGQvMi4yMWIrcGhwICB0aHR0cGQvMi4yMGMgIHRodHRwZC8yLjIzYjEKKGNvbmN1cnJlbmN5IDEwKQo0ayAgICAgICAgICAgICA6ICAgNzczOS45NCAgICAgICAgICAgNjA0MC44NCAgICAgICA1MDc4LjIwICAgICAgICA1ODg4LjI0IFsjL3NlY10KNGsgKGtlZXAtYWxpdmUpOiAgMTM4ODUuMDMgICAgICAgICAgMTAzNDkuODIgICAgICAgNTAzNC40OSAgICAgICAgNTg1My4wOSBbIy9zZWNdCjEwMGsgICAgICAgICAgIDogICAzMzQ5Ljk3ICAgICAgICAgICAxMTc2LjI5WzFdICAgIDExODguNzQgICAgICAgIDExOTguMjkgWyMvc2VjXQoxMDBrIChrZWVwLWEuKSA6ICAgNDk2NS40OSAgICAgICAgICAgMjUxMy4zOFsyXSAgICAxMTAwLjY1ICAgICAgICAxMTMwLjUxIFsjL3NlY10KKGNvbmN1cnJlbmN5IDEwMCkKNGsgICAgICAgICAgICAgOiAgIDU5MTguNTYgICAgICAgICAgIDQ5MDcuMDEgICAgICAgNDk4Ny41MyAgICAgICAgNDg4Ni44NyBbIy9zZWNdCjRrIChrZWVwLWFsaXZlKTogICA4NDA1LjQ4ICAgICAgICAgICA2Mzc5Ljk5ICAgICAgIDQ5MzguNzYgICAgICAgIDQ4MTYuMjYgWyMvc2VjXQoxMDBrICAgICAgICAgICA6ICAgMjM5My42MCAgICAgICAgICAgIDk3Mi43MyAgICAgICAgOTU4LjI3ICAgICAgICAgOTYxLjA5IFsjL3NlY10KMTAwayAoa2VlcC1hLikgOiAgIDQwMzUuMzUgICAgICAgICAgICA4OTMuNTFbM10gICAgIDk3MC4yMSAgICAgICAgIDk1NS4wNSBbIy9zZWNdCgp0aHR0cGQvMi4yMWIrcGhwIGhhcyBiZWVuIHBhdGNoZWQgd2l0aCB0aGUga2VlcC1hbGl2ZSArIHBocCBwYXRjaGVzIGZyb20gUEhQNApzYXBpL3RodHRwZC90aHR0cGRfcGF0Y2guCgpbMV0gYWIgcmVwb3J0ZWQ6CkZhaWxlZCByZXF1ZXN0czogICAgICAgIDEKICAgKENvbm5lY3Q6IDAsIExlbmd0aDogMSwgRXhjZXB0aW9uczogMCkKWzJdIGFiIHJlcG9ydGVkOgpGYWlsZWQgcmVxdWVzdHM6ICAgICAgICA1CiAgIChDb25uZWN0OiAwLCBMZW5ndGg6IDUsIEV4Y2VwdGlvbnM6IDApClszXSBhYiByZXBvcnRlZDoKRmFpbGVkIHJlcXVlc3RzOiAgICAgICAgMjQKICAgKENvbm5lY3Q6IDAsIExlbmd0aDogMjQsIEV4Y2VwdGlvbnM6IDApCgpUdW5uaW5nIHRoZSB0aHR0cGQ6Ci0tLS0tLS0tLS0tLS0tLS0tLS0KLSBkaXNhYmxlIHN5bWxpbmsgY2hlY2tpbmcgKGNocm9vdCgpIG9yIC1ub3MpCi0gbG9nIHRvIC9kZXYvc2htL2xvZ2ZpbGUsIGEgcmFtZGlzayBvciBkaXNhYmxlIGxvZ2dpbmcKCgokIC4vdGh0dHBkIC1wIDEwMjYgLUQgXAogLWQgL2hvbWUvd2VpZ29uL3Byb2plY3RzL2xvY2FsaXplci9zcmMvbGlnaHR0cGQvZG9jcm9vdC8gXAogLWwgL2Rldi9udWxsCgo=