ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlbG9nCgpWZXJzaW9uIDcuMTAuNyAoMTUgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDE0IEF1Z3VzdCkKLSBJIG1vZGlmaWVkIHRoZSBtZW1kZWJ1ZyBzeXN0ZW0gdG8gcmV0dXJuIGZhaWx1cmUgb24gbWVtb3J5IGFsbG9jYXRpb24KICBmdW5jdGlvbnMgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHN1Y2Nlc3NmdWwgb25lcy4gVGhpcyBlbmFibGVzIHVzIHRvIHRlc3QKICBvdXQtb2YtbWVtb3J5IHNpdHVhdGlvbnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciBhbmQgd2UgY2FuIG1ha2Ugc3VyZSB0aGF0CiAgY3VybC9saWJjdXJsIGJlaGF2ZXMgZ29vZCBpbiB0aG9zZS4KCiAgVGhpcyBtYWRlIG1lIGZpbmQgYW5kIGZpeCBzZXZlcmFsIHNwb3RzIHdoZXJlIHdlIGRpZCBub3QgY2xlYW51cCBwcm9wZXJseQogIHdoZW4gYmFpbGluZyBvdXQgZHVlIHRvIGVycm9ycyAobG93IG1lbW9yeSkuCgotIENvcnJlY3RlZCB0ZXN0IGNhc2UgNzQuIE1hZGUgdXNpbmcgLW8gd2l0aCBiYWQgI1tudW1dIGNvZGVzIGNvbXBsYWluIGFuZAogIGJhaWwgb3V0LiBNYWRlICNbbnVtXSBzdXBwb3J0IG51bWJlcnMgbGFyZ2VyIHRoYW4gOSBhcyB3ZWxsLiBBZGRlZCB0ZXN0CiAgY2FzZSA4NiBmb3IgYSBwcm9wZXIgcmFuZ2UgZ2xvYmJpbmcgdGVzdCBhcyB3ZWxsLgoKVmVyc2lvbiA3LjEwLjctcHJlNCAoMTIgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDEyIEF1Z3VzdCkKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgZmxhZyBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFzeW5jaCBETlMKICBzdXBwb3J0LCBhbmQgdGhpcyBpcyBub3cgYWxzbyBkaXNwbGF5ZWQgd2l0aCAnY3VybCAtVicuCgotIEFkZGVkIGEgZmV3IG5ldyBtYW4gcGFnZXMgdG8gdGhlIGRvY3MvbGliY3VybCBkaXI6IGN1cmxfc2hhcmVfaW5pdCwKICBjdXJsX3NoYXJlX3NldG9wdCwgY3VybF9zaGFyZV9jbGVhbnVwLCBsaWJjdXJsLWVhc3kgYW5kIGxpYmN1cmwtc2hhcmUuCgpEYW5pZWwgKDExIEF1Z3VzdCkKLSBNaWtlIENoZXJlcG92IG1hZGUgdGhlIGxvY2FsIGJpbmRpbmcgY29kZSB3b3JrIGZvciBXaW5kb3dzLCB3aGljaCBtYWtlcwogIHRoZSBvcHRpb24gQ1VSTE9QVF9JTlRFUkZBQ0Ugd29yayBvbiBXaW5kb3dzIGFzIHdlbGwuCgotIFZpbmNlbnQgU2FuZGVycyB1cGRhdGVkIHRoZSBmb3Blbi5jIGV4YW1wbGUgY29kZSBhIGxvdC4KCi0gLS1wcm94eS1udGxtIGlzIG5vdyBzdXBwb3J0ZWQgYnkgdGhlIGN1cmwgdG9vbC4gSXQgZm9yY2VzIHRoZSBwcm94eQogIGF1dGhlbnRpY2F0aW9uIHRvIGJlIG1hZGUgdXNpbmcgTlRMTS4gSXQgZG9lcyBub3QgeWV0IHdvcmsgZm9yIEhUVFBTIG92ZXIKICBwcm94aWVzIChvciBvdGhlciBwcm94eS10dW5uZWxpbmcgb3B0aW9ucykuIFRlc3QgY2FzZSA4MSBhbmQgODIgZG8gc29tZQogIHNpbXBsZSBpbml0aWFsIG50bG0gdGVzdGluZy4KCi0gRm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcmUtdXNlZCBjb25uZWN0aW9ucyB3aXRoCiAgcHJveHktYXV0aGVudGljYXRpb24uCgotIEkgcmVtb3ZlZCAtQCBhbmQgLVogYXMgdmFsaWQgc2hvcnQgb3B0aW9ucy4gVGhleSB3ZXJlIHZlcnkgcmFyZWx5IHVzZWQgKEAKICB3YXNuJ3QgZXZlbiBkb2N1bWVudGVkKS4KCi0gU2VyZ2UgU2VtYXNoa28gaW50cm9kdWNlZCBDVVJMT1BUX1BST1hZQVVUSCwgYW5kIG1ha2UgaXQgd29yayB3aGVuIHNldCB0bwogIENVUkxBVVRIX05UTE0gYW5kL29yIENVUkxBVVRIX0JBU0lDLiBUaGUgUFJPWEFVVEggaXMgc2ltaWxhciB0byBIVFRQQVVUSCwKICBidXQgaXMgZm9yIHRoZSBwcm94eSBjb25uZWN0aW9uIG9ubHksIGFuZCBIVFRQQVVUSCBpcyBmb3IgdGhlIHJlbW90ZSBob3N0LgoKLSBGaXhlZCBsb2FkaW5nIG9mIGNvb2tpZXMgd2l0aCBibGFuayBjb250ZW50cyBmcm9tIGEgY29va2llIGphci4gQWxzbyBtYWRlIHRoZQogIGNvb2tpZSBmdW5jdGlvbnMgaW5mb3JtIG9uIGFkZGVkIGFuZCBza2lwcGVkIGNvb2tpZXMgKGZvciBjb29raWUgZGVidWdnaW5nKS4KClZlcnNpb24gNy4xMC43LXByZTMgKDggQXVndXN0IDIwMDMpCgpEYW5pZWwgKDggQXVndXN0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBmaXggZm9yIGZpbGU6Ly8gVVJMcyB3aXRoIGRyaXZlIGxldHRlcnMgaW5jbHVkZWQuCgotIEkgYWRkZWQgdGhlIC0tZnRwLWNyZWF0ZS1kaXJzIHRvIHRoZSBjbGllbnQgY29kZSwgd2hpY2ggYWN0aXZhdGVzIEVhcmx5J3MKICBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiwgYW5kIHdyb3RlIHRlc3QgY2FzZSAxNDcgdG8gdmVyaWZ5CiAgaXQuIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlIGN1cmwuMSBtYW4gcGFnZSB0b28uIEFkZGVkIHRoZSBvcHRpb24gdG8gdGhlCiAgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHRvby4KCkRhbmllbCAoNyBBdWd1c3QpCi0gVGVzdCBjYXNlIDYwIGZhaWxlZCBvbiBpYTY0IGFuZCBBTUQgT3B0ZXJvbi4gRml4ZWQgbm93LgoKLSBGaXhlZCBhIHByaW50ZiBwcm9ibGVtIHRoYXQgcmVzdWx0ZWQgaW4gdXJsZ2xvYmJpbmcgYnVncyAoYnVnICMyMDM4MjcgaW4gdGhlCiAgZGViaWFuIGJ1ZyB0cmFja2VyKS4gQWRkZWQgdGVzdCBjYXNlIDc0IHRvIHZlcmlmeSB0aGUgZml4IGFuZCB0byBkaXNjb3ZlciBpZgogIHRoaXMgYnJlYWtzIGluIHRoZSBmdXR1cmUuCgotICJtYWtlIGRpc3RjaGVjayIgd29ya3MgYWdhaW4uCgpWZXJzaW9uIDcuMTAuNy1wcmUyICg2IEF1Z3VzdCAyMDAzKQoKRGFuaWVsICg1IEF1Z3VzdCkKLSBEdW5jYW4gV2lsY294IGhlbHBlZCBtZSB2ZXJpZnkgdGhhdCB0aGUgbGF0ZXN0IGluY2FybmF0aW9uIG9mIG15IGFyZXMgcGF0Y2gKICBidWlsZHMgZmluZSBvbiBNYWMgT1MgWCAoc2VlIHRoZSBuZXcgbGliL1JFQURNRS5hcmVzKSBmaWxlIGZvciBhbGwgZGV0YWlscy4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZmlsZWQgYnVnIHJlcG9ydCAjNzgzMTE2IGFuZCBFYXJseSBFaGxpbmdlciBwb3N0ZWQgYQogIGJ1ZyByZXBvcnQgdG8gdGhlIGxpYmN1cmwgbGlzdCwgYm90aCBpZGVudGlmeWluZyBhIHByb2JsZW0gd2l0aCBGVFAKICBwZXJzaXRlbnQgY29ubmVjdGlvbnMgYW5kIGhvdyB0aGUgZGlyIGhpZWFyY2h5IHdhcyBub3QgcHJvcGVybHkgcmVzZXQKICBiZXR3ZWVuIGZpbGVzLgoKLSBEYXZpZCBCeXJvbidzIHRob3VnaHRzIG9uIGEgZml4ZWQgTWFrZWZpbGUgaW4gdGVzdHMvIHdlcmUgYXBwbGllZC4KCi0gSmFuIFN1bmRpbiByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgY3VybCBpZ25vcmVkIGEgY29va2llIHRoYXQgYnJvd3NlcnMgZG9uJ3QsCiAgd2hpY2ggdHVybmVkIHVwIHRvIGJlIGR1ZSB0byB0aGUgbnVtYmVyIG9mIGRvdHMgaW4gdGhlICdkb21haW4nLiBJJ3ZlIG5vdwogIG1hZGUgY3VybCBmb2xsb3cgdGhlIHRoZSBvcmlnaW5hbCBuZXRzY2FwZSBjb29raWUgc3BlYyBsZXNzIHN0cmljdCBvbiB0aGF0CiAgcGFydC4KCkRhbmllbCAoNCBBdWd1c3QpCi0gRGlyayBNYW5za2UgYWRkZWQgY29va2llIHN1cHBvcnQgZm9yIHRoZSBleHBlcmltZW50YWwsIGhpZGRlbiBhbmQgc3RpbGwKICB1bmRvY3VtZW50ZWQgc2hhcmUgZmVhdHVyZSEKCi0gTWFyayBGbGV0Y2hlciBwcm92aWRlZCBhbiBleGNlbGxlbnQgYnVnIHJlcG9ydCB0aGF0IGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCBGT0xMT1dMT0NBVElPTiBhbmQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZywgYXMgbGliY3VybCB3b3VsZCBub3QKICBwcm9wZXJseSBpZ25vcmUgdGhlIGJvZHkgY29udGVudHMgb2YgM1hYIHJlc3BvbnNlIHRoYXQgaW5jbHVkZWQgdGhlCiAgTG9jYXRpb246IGhlYWRlci4KCkVhcmx5ICg2IEF1Z3VzdCkKLSBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgVGhpcyBvcHRpb24gd2lsbCBmb3JjZSB0aGUgdGFyZ2V0IGZpbGUncyBwYXRoIHRvIGJlIGNyZWF0ZWQgaWYgaXQKICAgIGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb24gdGhlIHJlbW90ZSBzeXN0ZW0uCiAKICBGaWxlcyBhZmZlY3RlZDoKICAgIC0gaW5jbHVkZS9jdXJsL2N1cmwuaAogICAgICAgIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi9mdHAuYwogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9ta2QsIHdoaWNoIGlzc3VlcyBhIE1LRCBjb21tYW5kCiAgICAgICAgQWRkZWQgZnVuY3Rpb24gZnRwX2ZvcmNlX2N3ZCwgd2hpY2ggYXR0ZW1wdHMgYSBDV0QsCiAgICAgICAgICBhbmQgZG9lcyBhIE1LRCBhbmQgcmV0cmllcyB0aGUgQ1dEIGlmIHRoZSBvcmlnaW5hbCBDV0QKICAgICAgICAgIGZhaWxzCiAgICAgICAgTW9kaWZpZWQgZnRwX3BlcmZvcm0oKSB0byBjYWxsIGl0cyBjaGFuZ2UgZGlyZWN0b3J5IGZ1bmN0aW9uCiAgICAgICAgICB0aHJvdWdoIGEgcG9pbnRlci4gIFRoZSBwb2ludGVyIHBvaW50cyB0byBmdHBfY3dkIGJ5IGRlZmF1bHQsCiAgICAgICAgICBhbmQgaXMgbW9kaWZpZWQgdG8gcG9pbnQgdG8gZnRwX2ZvcmNlX2N3ZCBJRkYKICAgICAgICAgIGRhdGEtPnNldC5mdHBfY3JlYXRlX21pc3NpbmdfZGlycyBpcyBub3QgMC4gICAgICAgIAogICAgLSBsaWIvdXJsLmMKICAgICAgICBNb2RpZmllZCBDdXJsX3NldG9wdCB0byByZWNvZ25pemUgQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgLSBsaWIvdXJsZGF0YS5oCiAgICAgICAgQWRkZWQgZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgdG8gc3RydWN0IFVzZXJEZWZpbmVkCiAgICAgICAKLSBNaW5vciBCdWdmaXggZm9yIENVUkxPUFRfVElNRUNPTkRJVElPTiB3aXRoIEZUUCAtIGlmIHRoZSBmaWxlIHdhcyBub3QKICBwcmVzZW50IHRvIGRvIHRoZSB0aW1lIGNvbXBhcmlzb24sIGl0IHdvdWxkIGZhaWwuCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGxpYi9mdHAuYwogICAgICAgIEluIGZ0cF9wZXJmb3JtKCksIHRoZSBjYWxsIHRvIGZ0cF9nZXRmaWxldGltZSgpIHVzZWQgdG8gYmUgZm9sbG93ZWQKICAgICAgICBieQoJICBpZiAocmVzdWx0KQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIEFuZCB0aGVuIGJ5IHRoZSBjb2RlIHRoYXQgYWN0dWFsbHkgZGlkIHRoZSB0aW1lIGNvbXBhcmlzb24uCiAgICAgICAgVGhlIGNvZGUgdGhhdCBkaWQgdGhlIGNvbXBhcmlzb24gaGFuZGxlZCB0aGUgY2FzZSB3aGVyZSB0aGUgZmlsZXRpbWUKICAgICAgICB3YXMgbm90IGF2YWlsYWJsZSAoYXMgaW5kaWNhdGVkIGJ5IGluZm8uZmlsZXRpbWUgPCAwIG9yIHNldC50aW1ldmFsdWUgCiAgICAgICAgPCAwKSwgc28gSSByZXBsYWNlZCB0aGUgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdCB3aXRoIGEgc3dpdGNoKHJlc3VsdCkKICAgICAgICB0aGF0IGFsbG93cyBDVVJMRV9GVFBfQ09VTEROVF9SRVRSX0ZJTEUgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZSAKICAgICAgICBub3JtYWwgdGltZSBjb21wYXJpc29uLgoKRGFuaWVsICgzIEF1Z3VzdCkKLSBXaGVuIHByb3h5IGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQgaW4gYSBDT05ORUNUIHJlcXVlc3QgKGFzIHVzZWQgZm9yIGFsbCBTU0wKICBjb25uZWN0cyBhbmQgb3RoZXJ3aXNlIGVuZm9yY2VkIHR1bm5lbC10aHJ1LXByb3h5IHJlcXVlc3RzKSwgdGhlIHNhbWUKICBhdXRoZW50aWNhdGlvbiBoZWFkZXIgaXMgYWxzbyB3cm9uZ2x5IHNlbnQgdG8gdGhlIHJlbW90ZSBob3N0LgoKICBUaGlzIGlzIGEgcmF0aGVyIHNpZ25pZmljYW50IGluZm8gbGVhay4gSSd2ZSBmaXhlZCBpdCBub3cgYW5kIG1haWxlZCBhIHBhdGNoCiAgYW5kIHdhcm5pbmcgdG8gdGhlIG1haWxpbmcgbGlzdHMuCgpEYW5pZWwgKDEgQXVndXN0KQotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSA3LjEwLjYgYnVpbGQgY29ycmVjdGx5IHdpdGggdGhlCiAgY29tcHJlc3NlZCBodWdlaGVscC5jIHNvdXJjZSBmaWxlLgoKVmVyc2lvbiA3LjEwLjctcHJlMSAoMzEgSnVseSAyMDAzKQoKRGFuaWVsICgzMCBKdWx5KQotIEr2cmcgTfxsbGVyLVRvbGsgdXBkYXRlZCB0aGUgVkMgbWFrZWZpbGUuCgotIERhbmllbCBOb2d1ZXJvbCBtYWRlIHRoZSBmdHAgY29kZSBvdXRwdXQgIkFjY2VwdC1SYW5nZXM6IGJ5dGVzIiBpbiBzaW1pbGFyCiAgc3R5bGUgbGlrZSBvdGhlciBmYWtlZCBIVFRQIGhlYWRlcnMgd2hlbiBOT0JPRFkgYW5kIEhFQURFUiBhcmUgdXNlZC4gSQogIHVwZGF0ZWQgdHdvIGNvcnJlc3BvbmRpbmcgdGVzdCBjYXNlcyB0b28uCgotIE1hcnR5IEt1aHJ0IHBvaW50ZWQgb3V0IGEgY29tcGlsYXRpb24gcHJvYmxlbSBvbiBWTVMgZHVlIHRvIG15IGhhdmluZwogIGNoYW5nZWQgYSB0eXBlIGZyb20gbG9uZyB0byB0aW1lX3QsIGFuZCBJJ20gbm93IGNoYW5naW5nIGl0IGJhY2sgdG8gd29yawogIG1vcmUgcG9ydGFibHkuLi4KCiAgSGUgYWxzbyBpbmRpY2F0ZWQgdGhhdCBkaXN0cmlidXRpbmcgdGhlIHNyYy9odWdlaGVscC5jIGluIGEgY29tcHJlc3NlZCBzdGF0ZQogIGxpa2UgSSBhY2NjaWRlbnRhbGx5IGRpZCBtYXkgbm90IGJlIHRoZSBzbWFydGVzdCBtb3ZlLi4uIEkndmUgbm93IGZpeGVkIHRoZQogIGRpc3RyaWJ1dGUgcHJvY3VkZXJlIHRvIGF1dG9tYXRpY2x5IGdlbmVyYXRlIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIHdoZW4gSQogIG1ha2UgcmVsZWFzZSBhcmNoaXZlcy4KCkRhbmllbCAoMjkgSnVseSkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNoYW5nZXMgdG8gdGhlIG1raGVscCBzY3JpcHQgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQogIGNvbXByZXNzZWQgaGVscCB0ZXh0IG9uIHNvbWUgcGxhdGZvcm1zLgoKVmVyc2lvbiA3LjEwLjYgKDI4IEp1bHkgMjAwMykKCkRhbmllbCAoMjggSnVseSkKLSBGcmFu529pcyBQb25zIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG9uY2UgYWdhaW4gbWFkZSBjdXJsIGRlYWwgd2l0aCBmdHAgYW5kCiAgImRvdWJsZSBzbGFzaCIgYXMgaW5kaWNhdGluZyB0aGUgcm9vdCBkaXJlY3RvcnkuIEluIHRoZSBSRkMxNzM4LWZpeCBvZiBBcHJpbAogIDMwLCB0aGF0IGFiaWxpdHkgd2FzIHJlbW92ZWQgKHNpbmNlIGl0IGlzIG5vdCB0aGUgInJpZ2h0IiB3YXkpLiBTbywgc3RhcnRpbmcKICBub3cgd2UgY2FuIGxpc3QgdGhlIHJvb3QgZGlyIG9mIGFuIGZ0cCBzZXJ2ZXIgYm90aCB0aGVzZSB3YXlzOgoKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8lMmYgIGFzIHdlbGwgYXMKICAgIGN1cmwgZnRwOi8vc2VydmVyLmNvbS8vCgpEYW5pZWwgKDI0IEp1bHkpCi0gSGVucnkgQmxhbmQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBpbmNsdWRlZCBzeXMvcmVzb3VyY2UuaCB3aXRob3V0IGdvb2QgcmVhc29uCiAgaW4gc2V2ZXJhbCBzb3VyY2UgZmlsZXMuIFdpdGhvdXQgaXQgaW5jbHVkZWQsIFFOWCBidWlsZHMgYmV0dGVyLi4uCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKRGFuaWVsICgyMyBKdWx5KQotIFRyYWN5IEJvZWhyZXIgZXhwZXJpZW5jZWQgRE5TIGNhY2hlIHByb2JsZW1zIGFuZCBkaWQgc29tZSBuaWNlIGRlYnVnZ2luZwogIGFuZCB0cmFja2luZyB3aGljaCBtYWRlIGl0IGVhc3kgZm9yIG1lIHRvIGNvcnJlY3QgdGhlIHByb2JsZW0gYW5kIFRyYWN5CiAgY291bGQgdmVyaWZ5IHRoYXQgaXQgZGlkIGN1cmUgdGhlIHByb2JsZW0hIFdoZW4gcmUtdXNpbmcgYSBjb25uZWN0aW9uIHdlCiAgbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCByZS11c2UgdGhlICdjb25uZWN0X2FkZHInIHN0cnVjdC4KCi0gRGFuaWVsIEtvdXJpbCBjb3JyZWN0ZWQgdGhlIEdTUy1OZWdvdGlhdGUgY29kZS4KCi0gSnVhbiBGLiBDb2RhZ25vbmUgcHJvdmlkZWQgZml4ZXMgdG8gYWxsb3cgY3VybCB0byBidWlsZCBmaW5lIG9uIFdpbmRvd3MKICBhZ2Fpbi4KCkRhbmllbCAoMjIgSnVseSkKLSBFZGl0ZWQgdGhlIGN1cmwvY3VybC5oIGluY2x1ZGUgZmlsZSB0byBidWlsZCBvbiBXaW5kb3dzIHByb3Blcmx5LgoKRGFuaWVsICgyMSBKdWx5KQotIE1vdmVkIHRoZSBwcm94eSBjcmVkZW50aWFscyBmcm9tIHRoZSBTZXNzaW9uSGFuZGxlIHN0cnVjdCB0byB0aGUgY29ubmVjdGRhdGEKICBzdHJ1Y3QsIHRvIG1ha2UgbXVsdGlwbGUgcHJveHkgY29ubmVjdGlvbnMgd2l0aCBkaWZmZXJlcmVudCB1c2VyIG5hbWVzIHdvcmsuCgotIEFkanVzdGVkIHRoZSBOVExNIGNvZGUgdG8gc3VwcG9ydCBwcm94eSBmdW5jdGlvbmFsaXR5LgoKLSBNYWRlIHRoZSBrcmI0IHN0dWZmIGNvbXBpbGUgd2l0aCB0aGUgdXNlcitwYXNzd29yZCBmaWVsZHMgbW92ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmU0ICgyMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDIwIEp1bHkpCi0gRGF2aWQgR2FyZG5lciBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0IDc3MDc1NSB0aGF0IHVzaW5nIHRoZSBGVFAgY29tbWFuZAogIENXRCB3aXRoIGEgYmxhbmsgYXJndW1lbnQgaXMgYSBiYWQgaWRlYSBhbmQgSSBtYWRlIGxpYmN1cmwgc2tpcCBlbXB0eSBwYXRoCiAgc2VnbWVudHMgc3RhcnRpbmcgbm93LgoKRGFuaWVsICgxOCBKdWx5KQotIENyaXMgcG9pbnRlZCBvdXQgdGhhdCBteSBmaXggb24gSnVseSAxNnRoIGRpZG4ndCB3b3JrIGZ1bGx5LiBIaXMgcG9pbnRpbmcKICBvdXQgdGhpcyAoYW5kIGhpcyBwYXRjaCkgYWxzbyBtYWRlIG1lIHJlYWxpemUgdGhhdCB3ZSBoYXZlIGEgdmVyeSBzaW1pbGFyCiAgYnVnIGluIHRoZSBGVFAgY29ubmVjdGlvbiByZS11c2UgY29kZS4gV2UgbXVzdCBzdG9yZSBhIHNlcGFyYXRlIHVzZXIgYW5kCiAgcGFzc3dvcmQgZmllbGQgZm9yIGVhY2ggY29ubmVjdGlvbiB3ZSBrZWVwIChhdCBsZWFzdCBmb3IgRlRQIGFuZCBIVFRQK05UTE0KICBjb25uZWN0aW9ucywgc28gSSBtYWRlIHVzIGRvIHRoaXMgdW5jb25kaXRpb25hbGx5KS4KCi0gU2luY2UgTlRMTSBhdXRoZW50aWNhdGVzIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2luZ2xlIHJlcXVlc3RzLCBJIGhhZCB0bwogIHJlLWFycmFuZ2UgaG93IHdlIHN0b3JlIHRoZSBOVExNIGRhdGEgYW5kIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3Qgc3VpdGUgdG8KICBmaW5hbGx5IHdvcmsgcHJvcGVybHkgd2l0aCBwZXJzaXN0YW5jeSB0byBtYWtlIHRoZSBOVExNIHRlc3RzIHJ1biBmaW5lCiAgYWdhaW4uIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gaGF2ZSB0byB1cGRhdGUgbG90cyBvZiBIVFRQIHRlc3QgY2FzZXMuCgpEYW5pZWwgKDE2IEp1bHkpCi0gQ3JpcyBCYWlsaWZmJ3MgYnVnIHJlcG9ydCA3NjgyNzUgcG9pbnRlZCBvdXQgdGhhdCB1c2luZyBCYXNpYyBhdXRoIHdpdGgKICB3cm9uZyB1c2VyK3Bhc3N3b3JkIGNhdXNlZCBhbiBlbmRsZXNzIGxvb3AuIEZpeGVkIG5vdy4gSGUgYWxzbyBmb3VuZCBvdXQgdGhhdAogIHdlIGRpZG4ndCBwcm9wZXJseSBhdXRoZW50aWNhdGUgY29ubmVjdGlvbnMgd2l0aCBOVExNLiBGaXhlZCB0b28uCgotIERhbiBXaW5zaGlwIHByb3ZpZGVkIGZpeGVzIGZvciB0aGUgTlRMTSBjb2RlLgoKRGFuaWVsICg1IEp1bHkpCi0gRG91ZyBLYXVmbWFuIHByb3ZpZGVkIGFkZGl0aW9uYWwgZml4ZXMgZm9yIHRoZSBET1MgcG9ydC4KCkRhbmllbCAoNCBKdWx5KQotIFJpY2sgUmljaGFyZHNvbiBwb2ludGVkIG91dCB0aGF0IHVzaW5nIHNldHZidWYoKSB0byBhY2hpdmUgbm9uLWJ1ZmZlcmluZwogIG9uIG91dHB1dCBpcyBuby1nb29kIGZvciBTQ08gWGVuaXggYW5kIG90aGVyIHVuaXhlcy4gV2Ugc3dpdGNoZWQgb3ZlciB0bwogIHVzaW5nIHBsYWluIGZmbHVzaCgpIGluc3RlYWQuCgotIERhbiBHcmF5c29uIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2V0IHRoZSBDVVJMX0NBX0JVTkRMRSB2YXJpYWJsZSB3cm9uZ2x5IGluCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGFuZCBJIGhhZCB0byBjaGFuZ2Ugc29tZSBidWlsZCBzdHVmZiB0byBtYWtlIHRoZSBuZXcKICB3YXkgd29yay4KCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggd2FzIGFwcGxpZWQgdGhhdCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmc6CgogICBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gdG8gc2V0IGEgY2FsbGJhY2sgdGhhdCBnZXRzIGNhbGxlZCB3aXRoIHRoZQogICBPcGVuU1NMJ3Mgc3NsX2N0eCBwb2ludGVyIHBhc3NlZCBpbiBhbmQgYWxsb3cgYSBjYWxsYmFjayB0byBhY3Qgb24gaXQuIElmCiAgIGFueXRoaW5nIGJ1dCBDVVJMRV9PSyBpcyByZXR1cm5lZCwgdGhhdCB3aWxsIGFsc28gYmUgcmV0dXJuZWQgYnkgbGliY3VybAogICBhbGwgdGhlIHdheSBiYWNrLiBJZiB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIENVUkxPUFRfVVJMLCBsaWJjdXJsIHdpbGwKICAgZGV0ZWN0IHRoaXMgYW5kIGluc3RlYWQgZ28gdXNlIHRoZSBuZXcgVVJMLgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0RBVEEgaXMgYSBwb2ludGVyIHlvdSBzZXQgdG8gZ2V0IHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgc2V0CiAgIHdpdGggQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OLgoKRGFuaWVsICgxIEp1bHkpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyBhIGNsaWVudCB0byBxdWl0IHRoZSB0ZXN0IHN1aXRlJ3MKICBIVFRQIHNlcnZlci4KCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIHBhdGNoZWQgYSBsaWIgaGFuZGxlIGxlYWsgaW4gdGhlIGxkYXAgY29kZS4KCkRhbmllbCAoMjUgSnVuZSkKLSBNb3JlIE5UTE0taW1wcm92ZW1lbnRzLiBMZXNzIGNvZGUuIFNtYWxsZXIgcGFja2V0cyBiYWNrIGFuZCBmb3J0aC4KCkRhbmllbCAoMjMgSnVuZSkKLSBFcmljIEdsYXNzIHByb3ZpZGVkIHVzIHdpdGggYSBiZXR0ZXIgZG9jIG9uIE5UTE0gZGV0YWlscywgYW5kIEkgYWRkZWQgbW9yZQogIGNvbW1lbnRzIGFuZCBjbGFyaWZpZWQgdGhlIGN1cnJlbnQgY29kZSBtb3JlLiBVc2luZyB0aGUgbmV3IGtub3dsZWRnZSwgd2UKICBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBOVExNIHN0dWZmIHdvcmsgZXZlbiBiZXR0ZXIuCiAgRXJpYydzIG9yaWdpbmFsIFVSTDogaHR0cDovL2RhdmVucG9ydC5zb3VyY2Vmb3JnZS5uZXQvbnRsbS5odG1sCiAgVmVyc2lvbiBzdG9yZWQgYW5kIHByb3ZpZGVkIGF0IGN1cmwgc2l0ZTogaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvbnRsbS5odG1sCgotIEZpeGVkIHRoZSBtaW5vciBjb21waWxlIHByb2JsZW1zIHByZTMgaGFkIGlmIGJ1aWx0IHdpdGhvdXQgR1NTQVBJIGFuZC9vcgogIFNTTC4KClZlcnNpb24gNy4xMC42LXByZTMgKDE5IEp1bmUgMjAwMykKCkRhbmllbCAoMTkgSnVuZSkKLSBNYWRlIGN1cmwgdXNlIGN1cmxfZnJlZSgpIG9uIG1lbW9yeSByZXR1cm5lZCBieSBjdXJsX2dldGVudigpLCBhcyB0aGlzCiAgc2hvdWxkIHRoZW9yZXRpY2x5IG1ha2UgaXQgcG9zc2libHkgdG8gYnVpbGQgYW5kIHJ1biBjdXJsIGFuZCBsaWJjdXJsIHdpdGgKICBkaWZmZXJlbnQgbWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lcyB3aXRoIG5vIHByb2JsZW1zLgoKRGFuaWVsICgxOCBKdW5lKQotIEltcHJvdmVkIHRoZSBta2hlbHAucGwgYSBiaXQgZnVydGhlciB0byBtYWtlIGEgbmljZXIgaHVnZWhlbHAgdGV4dCBhbmQgdG8KICBpbmNsdWRlIGEgYmV0dGVyIGNvbW1lbnQgaW4gdGhlIHRvcCBmb3IgdGhlIGd6aXAgY29tcHJlc3NlZCB2ZXJzaW9uLgoKRGFuaWVsICgxNyBKdW5lKQotIENVUkxPUFRfSFRUUEFVVEggaXMgbm93IGEgYml0bWFzaywgaW4gd2hpY2ggeW91IHNldCB3aGljaCBhdXRoZW50aWNhdGlvbgogIHR5cGUocykgeW91IHdhbnQgdG8gdXNlLiBJZiBtb3JlIHRoYW4gb25lIGlzIHNldCwgbGliY3VybCB3aWxsIHVzZSBvbmUgb2YKICB0aGUgc2VsZWN0ZWQgb25lIGFuZCB0aGUgb25lIGl0IGNvbnNpZGVycyBpcyBtb3JlIHNlY3VyZS4gVGVzdCBjYXNlIDY3IGFuZAogIDY4IChmb3IgTlRMTSkgd2VyZSBmaXhlZCBhbmQgd2UndmUgcmVkdWNlZCBhIHJvdW5kLXRyaXAgZm9yIHNwZWNpZmljIC0tbnRsbQogIGZlYXRjaGVzLCBhbmQgdGVzdCBjYXNlIDY5IGFuZCA3MCB3ZXJlIGFkZGVkIGZvciB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uCiAgInBpY2tpbmciLiAtLWFueWF1dGggaXMgdGhlIG5ldyBjb21tYW5kIGxpbmUgdG9vbCBvcHRpb24sIGFuZCBJIGFsc28gYWRkZWQKICAtLWJhc2ljIGZvciBjb21wbGV0ZW5lc3MgKHRoYXQncyB0aGUgZGVmYXVsdCB0eXBlKS4KCi0gRml4ZWQgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byB1c2UgdGhlIGluZm8gcHJvdmlkZWQgYnkgdGhlIG5ldyBjdXJsIC1WCiAgb3V0cHV0LgoKLSAtLWVuYWJsZS1kZWJ1ZyBub3cgc2V0cyB0aGUgQ1VSTERFQlVHIGRlZmluZSBpbnN0ZWFkIG9mIE1BTExPQ0RFQlVHLCBhcyBpdAogIGlzIG1lYW50IHRvIGJlIGEgZ2VuZXJpYyBkZWJ1ZyBjb25kaXRpb25hbC4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBjYW4gbm93IHJldHVybiBDVVJMX1ZFUlNJT05fREVCVUcgYXMgYSBmZWF0dXJlIGJpdCwgdG8KICBpbmRpY2F0ZSB0aGF0IHRoZSBsaWJyYXJ5IHdhcyBidWlsdCB3aXRoIENVUkxERUJVRyBzZXQuCgotIFJhbHBoIE1pdGNoZWxsIGZvdW5kIG91dCB0aGF0IHNvbWUgd2ViIGFwcGxpY2F0aW9ucyB2ZXJ5IGJhZGx5IHVzZXMgd2hpdGUKICBzcGFjZXMgaW4gTG9jYXRpb246IHJlZGlyZWN0cywgYW5kIGFwcGFyZW50bHkgSUUgaXMgYSBicm93c2VyICh0aGUgb25seQogIG9uZT8pIHRoYXQgc3VwcG9ydHMgdGhpcyBhYm9taW5hdGlvbi4gQmFzZWQgb24gUmFscGgncyBwYXRjaCwgSSBhZGRlZCBjb2RlCiAgdGhhdCBub3cgYXR0ZW1wdHMgdG8gcmVwbGFjZSB3aGl0ZSBzcGFjZXMgd2l0aCB0aGUgcHJvcGVyICIlMjAiIG9yICIrIi4KICBUZXN0IGNhc2UgNDAgYW5kIDQyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IG15IGNoYW5nZXMuCgotIGN1cmwgLVYgbm93IGFsc28gb3V0cHV0cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhlIGF2YWlsYWJsZSBsaWJyYXJ5IG9mZmVycyAoaWYKICBhbnkpLgoKLSBUaGUgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBpbmNsdWRlcyAiR1NTIiBpZiBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggR1NTQVBJCiAgc3VwcG9ydC4KCi0gRGF2aWQgT3JyZWxsIHJlcG9ydGVkIHRoYXQgbGliY3VybCBzdGlsbCBjcmFzaGVkIHdoZW4gc2VuZGluZyBIVUdFIHJlcXVlc3RzCiAgb3ZlciBIVFRQUy4uLiBJIGZpeGVkLgoKVmVyc2lvbiA3LjEwLjYtcHJlMiAoMTYgSnVuZSAyMDAzKQoKRGFuaWVsICgxNiBKdW5lKQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYml0bWFza2VkIGluZm9ybWF0aW9uIHdlYXRoZXIgTlRMTSBhbmQKICBHU1NORUdPVElBVEUgYXJlIHN1cHBvcnRlZCwgc2luY2UgaXQgaXMgZG9vbWVkIHRvIHZhcnkgb24gZGlmZmVyZW50CiAgaW5zdGFsbGF0aWlvbnMuCgotIEkgcmVtYWRlIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgTUQ1LWNvZGUgcHJvdmlkZWQgYnkgT3BlblNTTCBpZgogIHRoYXQgaXMgcHJlc2VudCwgYW5kIG9ubHkgdXNlIG91ciBvd24gTUQ1LWNvZGUgaWYgaXQgaXNuJ3QuCiAgCkRhbmllbCAoMTMgSnVuZSkKLSBNb3JlIE5UTE0gaGVscCwgZml4ZXMgYW5kIHBhdGNoZXMgZnJvbSBDcmlzIEJhaWxpZmYuCgotIE1hcnR5IEt1aHJ0IGJyb3VnaHQgaW5jbHVkZSBmaXhlcyBmb3IgbWFraW5nIFZNUyBidWlsZHMgd2FybmluZy1mcmVlLgoKRGFuaWVsICgxMiBKdW5lKQotIE5UTE0gYXV0aGVudGljYXRpb24gd29ya3Mgc29tZXdoYXQgYWdhaW5zdCB0aGUgdGVzdCBzZXJ2ZXJzIHByb3ZpZGVkIGJ5CiAgTWF0aGlhcyBBeGVsc3NvbiBhbmQgQ3JpcyBCYWlsaWZmLiBVc2UgYnkgc2V0dGluZyBDVVJMT1BUX0hUVFBBVVRIIHRvCiAgQ1VSTEFVVEhfTlRMTSB0byBsaWJjdXJsLCBvciAtLW50bG0gZm9yIHRoZSBjdXJsIHRvb2wuIFRlc3QgY2FzZSA2NyBhbmQgNjgKICB3ZXJlIGFkZGVkIGZvciB0aGlzLiBOVExNLXN1cHBvcnQgcmVxdWlyZXMgT3BlblNTTC4KCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgcGF0Y2gsIHRoYXQgZ3JhbnRlZCB0aGF0IGd6aXAgYW5kIGxpYnogYXJlIGF2YWlsYWJsZQogIGF0IGJ1aWxkLXRpbWUsIGNvbXByZXNzZXMgdGhlIGh1Z2VoZWxwIHRleHQgaW4gdGhlIGN1cmwgY29tbWFuZCBsaW5lIGFuZAogIHVuY29tcHJlc3NlcyBpdCBhdCByZXF1ZXN0LiBTYXZlcyBzb21lIH42MEsgaW4gdGhlIGZpbmFsIG91dHB1dCBleGVjdXRhYmxlLgoKRGFuaWVsICgxMSBKdW5lKQotIExvbmcgZGF5IG9mIGZpZ2h0aW5nIHRoZSBOVExNIGRlbW9ucy4KCkRhbmllbCAoMTAgSnVuZSkKLSBNb2RpZmllZCBob3cgdG8gc2V0IGF1dGggdHlwZSB0byBsaWJjdXJsLiBOb3cgdXNlIENVUkxPUFRfSFRUUEFVVEggaW5zdGVhZCwKICBhbmQgcGljayBtZXRob2QuIFN1cHBvcnRlZCBvbmVzIGN1cnJlbnRseSBhcmU6CiAgQ1VSTEFVVEhfQkFTSUMgICAgIC0gZGVmYXVsdCBzZWxlY3Rpb24KICBDVVJMQVVUSF9ESUdFU1QgICAgLSBmb3JtZXJseSBDVVJMT1BUX0hUVFBESUdFU1QKICBDVVJMQVVUSF9HU1NORUdPVElBVEUKCi0gRGFuaWVsIEtvdXJpbCBhZGRlZCBIVFRQIEdTUy1OZWdvdGlhdGUgYXV0aGVudGljYXRpb24gc3VwcG9ydCwgYXMgZGVmaW5lZCBpbgogIHRoZSBJRVRGIGRyYWZ0IGRyYWZ0LWJyZXphay1zcG5lZ28taHR0cC0wNC50eHQuIEluIHVzZSBhbHJlYWR5IGJ5IHZhcmlvdXMKICBNaWNyb3NvZnQgd2ViIGFwcGxpY2F0aW9ucy4gLS1uZWdvdGlhdGUgaXMgdGhlIG5ldyBmYW1pbHkgbWVtYmVyLiBUbyB0YWtlCiAgYWR2YW50YWdlIG9mIHRoaXMsIHlvdSBuZWVkIG9uZSBvZiB0aGVzZSBwYWNrYWdlczoKCiAgbyBIZWltZGFsIEtlcmJlcm9zNSAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucGRjLmt0aC5zZS9oZWltZGFsL2hlaW1kYWwuaHRtbAogIG8gR1NTQVBJIGZyb20gR2xvYnVzICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZ2xvYnVzLm9yZy8KICBvIEdTU0FQSSBsaWJyYXJpZXMgZnJvbSBNSVQgS2VyYmVyb3M1ICBodHRwOi8vd2ViLm1pdC5lZHUva2VyYmVyb3Mvd3d3LwoKLSBBIG1pc3NpbmcgZW5kaW5nIGJyYWNrZXQgKCddJykgd2hpbGUgZG9pbmcgVVJMIGdsb2JiaW5nIGNvdWxkIGxlYWQgdG8gYQogIHNlZ2ZhdWx0LiBXaGlsZSBmaXhpbmcgdGhpcywgSSBhbHNvIGludHJvZHVjZWQgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBpbiB0aGUKICBnbG9iYmluZyBjb2RlLiAoQWxsIHRoaXMgaXMgYXBwbGljYXRpb24gY29kZSBvdXRzaWRlIGxpYmN1cmwuKQoKRGFuaWVsICg2IEp1bmUpCi0gRGF2aWQgT3JyZWxsIGZvdW5kIG91dCB0aGF0IHNlbmRpbmcgYSBodWdlIEdFVCByZXF1ZXN0IG92ZXIgSFRUUFMgY291bGQKICBtYWtlIGxpYmN1cmwgZmFpbCBhbmQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCgpEYW5pZWwgKDIgSnVuZSkKLSBSaWNoYXJkIEJyYW1hbnRlIGZvdW5kIG91dCB0aGF0ICJDb250ZW50LUxlbmd0aDogMCIgd2FzIG5vdCBwcm9wZXJseSB1c2VkIGJ5CiAgbGliY3VybCBpZiB0aGUgcmVzcG9uc2UtaGVhZGVycyBpbmRpY2F0ZWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3b3VsZCBiZQogIGNsb3NlZC4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwbGllZCwgdGhhdCBtYWtlcyB0aGUgLS1wcm9ncmVzcy1iYXIgdGFrZSB0aGUKICBsb2NhbCBzaXplIGludG8gYWNjb3VudCB3aGVuIGRvaW5nIHJlc3VtZWQgZG93bmxvYWRzLgoKLSBGZWVkYmFjayBmcm9tIFNlcmdlIFNlbWFzaGtvIG1hZGUgbWUgY2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHJldHVybmVkIHdoZW4KICBDVVJMRV9IVFRQX1JFVFVSTkVEX0VSUk9SIGlzIHJldHVybmVkLgoKLSBBbm9ueW1vdXMgaW4gYnVnIHJlcG9ydCAjNzQ1MTIyIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZwogIFNTTF9DVFhfc2V0X29wdGlvbnMoLi4uIFNTTF9PUF9BTEwpIHRvIHdvcmsgYXJvdW5kIGZsYXdzIGluIGV4aXN0aW5nIFNTTAogIGltcGxlbWVudGF0aW9ucy4KCkRhbmllbCAoMjcgTWF5KQotIEFuZHJlYXMgTGV5IGFuZCBSaWNoIEdyYXkgaGVscGVkIG1lIHBvaW50IG91dCB0aGF0IG5vIHZlcnNpb24gb2YgSFAtVVggaGFzCiAgdGhlIHN5cy9zZWxlY3QuaCBoZWFkZXIgZmlsZSBzbyBpbmNsdWRpbmcgaXQgdW5jb25kaXRpb25hbGx5IGluIGN1cmwvbXVsdGkuaAogIGlzIG5vdCBhIGdvb2QgdGhpbmcuIE5vdyB3ZSBjaGVjayBmb3IgSFBVWCBhbmQgYXZvaWQgdXNpbmcgdGhhdCBoZWFkZXIgb24KICBzdWNoIHN5c3RlbXMuCgotIFJ1ZHkgS29lbnRvIGV4cGVyaWVuY2VkIHByb2JsZW1zIHdpdGggY3VybCdzIHJlY2VudCBoYWJpdCBvZiBQT1NUaW5nIGRhdGEgaW4KICB0d28gc2VwYXJhdGUgc2VuZCgpIGNhbGxzLCBmaXJzdCB0aGUgaGVhZGVycyBhbmQgdGhlbiB0aGUgZGF0YS4gSSd2ZSBub3cKICBtYWRlIGEgZml4IHRoYXQgZm9yIHN0YXRpYyBhbmQga25vd24gY29udGVudCB0aGF0IGlzIGxlc3MgdGhhbiAxMDBLIGluIHNpemUsCiAgZXZlcnl0aGluZyBpcyBub3cgc2VudCBpbiBvbmUgc2luZ2xlIHN5c3RlbSBjYWxsIGFnYWluLiBUaGlzIGlzIGFsc28gYmV0dGVyCiAgZm9yIG5ldHdvcmsgcGVyZm9ybWFuY2UgcmVhc29ucy4KCi0gSSBtb2RpZmllZCB0aGUgbWFpbiBtYWtlZmlsZSB0byBub3QgYnVpbGQgdGhlIHRlc3Qgc3VpdGUgYW5kIGEgZmV3IG90aGVyCiAgdW5uZWNlc3NhcnkgdGhpbmdzIGJ5IGRlZmF1bHQuIE5vdywgdGhlIHRlc3Qgc3VpdGUgaXMgYnVpbHQgd2hlbiAnbWFrZSB0ZXN0JwogIGlzIHJ1bi4gIFRoaXMgcmVkdWNlcyBidWlsZCB0aW1lIGZvciB0aG9zZSB3aG8gZG9uJ3QgY2FyZSBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgYW5kIGl0IGFsc28gcmVkdWNlcyBjb25mdXNpb24gZm9yIHBlb3BsZSB1c2luZyBwbGF0Zm9ybXMgd2hlcmUgdGhlCiAgdGVzdCBzdWl0ZSBidWlsZCBmYWlscyEKCkRhbmllbCAoMjYgTWF5KQotIENocmlzIExld2lzIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgI2lmZGVmcyBpbiBjdXJsL211bHRpLmggZm9yIFdpbmRvd3MsCiAgd2hpY2ggaXMgbm93IGNvcnJlY3RlZC4KCi0gSmlzIEpveSBmb3VuZCBhbm90aGVyIGZsYXcgaW4gdGhlIFNPQ0s1IGNvZGUsIGFzIGxpYmN1cmwgdHJlYXRlZCB0aGUgc29ja3M1CiAgcHJveHkgYSBsaXR0bGUgdG9vIG11Y2ggbGlrZSBhcyBpZiBpdCB3YXMgYSBodHRwIHByb3h5LgoKRGFuaWVsICgyMyBNYXkpCi0gUmljYXJkbyBDYWRpbWUgZm91bmQgYSBzb2NrZXQgbGVhayB3aGVuIGxpc3RpbmcgZGlyZWN0b3JpZXMgd2l0aG91dAogIGNvbnRlbnRzLiBUZXN0IGNhc2VzIDE0NCBhbmQgMTQ1IHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIFJ1ZHkgS29lbnRvIGZvdW5kIHlldCBhbm90aGVyIHByb2JsZW0gd2hlbiBhIEhUVFAgc2VydmVyIHJldHVybnMgb25seSBhCiAgc2luZ2xlLWxpbmUgb2YgY29udGVudHMgd2l0aG91dCBhbnkgaGVhZGVycyBhdCBhbGwuIGxpYmN1cmwgdGhlbiBmYWlsZWQgdG8KICBjb3VudCB0aGUgZGF0YSwgdGh1cyByZXR1cm5pbmcgZXJyb3IgNTIgIm5vIGNvbnRlbnRzIi4gVGVzdCBjYXNlIDY2IHdhcwogIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHdlIG5vdyBkbyByaWdodC4KClZlcnNpb24gNy4xMC42LXByZTEgKDIzIE1heSAyMDAzKQoKRGFuaWVsICgyMyBNYXkpCi0gSmlzIGluIGJ1ZyByZXBvcnQgIzc0MTg0MSwgZml4ZWQgYSBidWcgaW4gdGhlIFNPQ0tTNSBwcm94eS11c2luZyBjb2RlLgoKRGFuaWVsICgyMiBNYXkpCi0gRGF2aWQgUmVtYWhsIHNldCB1cCBhIHRlc3Qtc2VydmVyIGZvciBtZSBwcm92aWRpbmcgRGlnZXN0IGF1dGhlbnRpY2F0aW9uLAogIGFuZCBJIHdyb3RlIHRoZSBmaXJzdCB3b3JraW5nIGNvZGUgdGhhdCBzdXBwb3J0IGl0LiBUaGUgdGVzdCBzdWl0ZSB3YXMKICBtb2RpZmllZCBzbGlnaHRseSBhcyB3ZWxsIHRvIHdvcmsgYmV0dGVyIGZvciBpdCBhbmQgLS1kaWdlc3Qgd2FzIGFkZGVkIHRvCiAgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIChhbmQgQ1VSTE9QVF9IVFRQRElHRVNUIHRvIHRoZSBsaWJyYXJ5KS4uLiAgUkZDMjYxNwogIGhhcyBhbGwgdGhlIGdvcnkgZGV0YWlscy4KCkRhbmllbCAoMjEgTWF5KQotIERhdmlkIEJhbGF6aWMgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX3VuZXNjYXBlKCkgZGlkbid0IGNoZWNrIHRoYXQgJS1jb2RlcwogIHdlcmUgY29ycmVjdGx5IGZvbGxvd2VkIGJ5IHR3byBoZXhhZGVjaW1hbCBkaWdpdHMgd2hlbiBpdCB1bmVzY2FwZSBzdHJpbmdzLgogIE5vdywgd2UgZG8gdGhlIGNoZWNrIGFuZCBvbmx5ICVYWCBjb2RlcyBhcmUgdW5lc2NhcGVkIGlmIHRoZSBYIGxldHRlcnMgYXJlCiAgaGV4YWRlY2ltYWxzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgYnVpbGQgd2l0aCBkamdwcCBvbiBET1MuCgotIEdpc2xlIFZhbmVtIGltcHJvdmVkIHRoZSBta2hlbHAucGwgc2NyaXB0IHRvIG1ha2UgYSBuaWNlciBtYW51YWwgdGhhdCBpcwogIHNob3duIHdpdGggY3VybCAtTS4KCkRhbmllbCAoMjAgTWF5KQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgbGliY3VybCBtb3JlIGNvbnNlcnZhdGl2ZSwgbm90CiAgZXhwZWN0aW5nIGhfYWxpYXNlcyBvZiB0aGUgaG9zdGVudCBzdHJ1Y3QgdG8gYWx3YXlzIGJlIG5vbi1OVUxMLgoKRGFuaWVsICgxOSBNYXkpCi0gQXMgcmVxdWVzdGVkIGJ5IE1hcnRpbiBNaWNobG1heXIgaW4gRGViaWFuIGJ1ZyByZXBvcnQgIzE5MzYzMCwgbGliY3VybCBub3cKICBzdXBwb3J0cyB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGluIHRoZSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEFkZGVkCiAgdGVzdCBjYXNlIDYzIHRvIHZlcmlmeSB0aGlzLgoKVmVyc2lvbiA3LjEwLjUgKDE5IE1heSAyMDAzKQoKRGFuaWVsICgxNSBNYXkpCi0gQ2hhbmdlZCB0aGUgb3JkZXIgZm9yIHRoZSBpbl9hZGRyX3QgdGVzdGluZywgYXMgJ3Vuc2lnbmVkIGxvbmcnIHNlZW1zIHRvIGJlCiAgYSB2ZXJ5IGNvbW1vbiB0eXBlIGluZXRfYWRkcigpIHJldHVybnMuCgpEYW5pZWwgKDE0IE1heSkKLSBHZW9yZ2UgQ29tbmlub3MgcHJvdmlkZWQgYSBmaXggdGhhdCBjYWxscyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB3YWl0aW5nCiAgZm9yIEZUUCBjb21tYW5kIHJlc3BvbnNlcyB0YWtlID4xIHNlY29uZC4gSXQnbGwgbWFrZSBhcHBsaWNhdGlvbnMgbW9yZQogICJyZXNwb25zaXZlIiBldmVuIHdoZW4gZGVhbGluZyB3aXRoIHZlcnkgc2xvdyBmdHAgc2VydmVycy4KCkRhbmllbCAoMTIgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgdXBsb2FkcyBoYWQgdHdvIHF1aXJrczoKICAgbyB3aGVuIHVzaW5nIEZUUCBQT1JUIGNvbW1hbmQsIGl0IHVzZWQgYmxvY2tpbmcgc29ja2V0cyEKICAgbyBpdCBjb3VsZCBsb29wIGEgbG9uZyB0aW1lIHdpdGhvdXQgZG9pbmcgcHJvZ3Jlc3MgbWV0ZXIgdXBkYXRlcwogIEJvdGggaXRlbXMgYXJlIGZpeGVkIG5vdy4KCkRhbmllbCAoOSBNYXkpCi0gRGFuIEZhbmRyaWNoIGNoYW5nZWQgQ1VSTE9QVF9FTkNPRElORyB0byBzZWxlY3QgYWxsIHN1cHBvcnRlZCBlbmNvZGluZ3MgaWYKICBzZXQgdG8gIiIuICBUaGlzIGZyZWVzIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGhhdmluZyB0byBrbm93IHdoaWNoIGVuY29kaW5ncwogIHRoZSBsaWJyYXJ5IHN1cHBvcnRzLgoKLSBEYW4gRmFuZHJpY2ggcG9pbnRlZCBvdXQgd2UgaGFkIHRocmVlIHVubmVjZXNzYXJ5IGZpbGVzIGluIENWUyB0aGF0IGlzCiAgZ2VuZXJhdGVkIHdpdGggbGlidG9vbGl6ZSwgc28gdGhleSdyZSBub3cgcmVtb3ZlZCBhbmQgbGlidG9vbGl6ZSBpcyBpbnZva2VkCiAgYWNjb3JkaW5nbHkgaW4gdGhlIGJ1aWxkY29uZiBzY3JpcHQuCgotIEF2ZXJ5IEZheSBmb3VuZCBvdXQgdGhhdCB0aGUgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2F5IG9mIGZpcnN0IGNoZWNraW5nIGlmIHRoZQogIGdpdmVuIG5hbWUgaXMgYSBuZXR3b3JrIGludGVyZmFjZSBnYXZlIGEgcmVhbCBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIExpbnV4LAogIHNvIG5vdyB3ZSBtb3JlIGFwcHJvcHJpYXRlbHkgZmlyc3QgY2hlY2sgaWYgaXQgaXMgYW4gSVAgbnVtYmVyIGFuZCBpZiBzbwogIHdlIGRvbid0IGNoZWNrIGZvciBhIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggdGhhdCBuYW1lLgoKLSBDVVJMT1BUX0ZUUF9VU0VfRVBSVCBhZGRlZC4gU2V0IHRoaXMgdG8gRkFMU0UgdG8gZGlzYWJsZSBsaWJjdXJsJ3MgYXR0ZW1wdHMKICB0byB1c2UgRVBSVCBhbmQgTFBSVCBiZWZvcmUgdGhlIHRyYWRpdGlvbmFsIFBPUlQgY29tbWFuZC4gVGhlIGNvbW1hbmQgbGluZQogIHRvb2wgc2V0cyB0aGlzIG9wdGlvbiB3aXRoICctLWRpc2FibGUtZXBydCcuCgpWZXJzaW9uIDcuMTAuNS1wcmUyICg2IE1heSAyMDAzKQoKRGFuaWVsICg2IE1heSkKLSBLZXZpbiBEZWxhZmllbGQgcmVwb3J0ZWQgYW5vdGhlciBjYXNlIHdoZXJlIHdlIGRpZG4ndCBjb3JyZWN0bHkgY2hlY2sgZm9yCiAgRUFHQUlOIGJ1dCBvbmx5IEVXT1VMREJMT0NLLCB3aGljaCBjYXVzZWQgYmFkbmVzcyBvbiBIUFVYLgoKRGFuaWVsICg0IE1heSkKLSBCZW4gR3JlZWFyIG5vdGljZWQgdGhhdCB0aGUgY2hlY2sgZm9yICd3cml0YWJsZSBhcmd2JyBleGl0ZWQgdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB3aGVuIHJ1biBmb3IgY3Jvc3MtY29tcGlsaW5nLCB3aGljaCB3YXNuJ3QgbmljZS4gTm93IGl0J2xsIGRlZmF1bHQgdG8KICBubyBhbmQgb3V0cHV0IGEgd2FybmluZyBhYm91dCB0aGUgZmFjdCB0aGF0IGl0IHdhcyBub3QgY2hlY2tlZCBmb3IuCgpEYW5pZWwgKDIgTWF5KQotIEFkZGVkIHRlc3QgY2FzZSA2MiBhbmQgZml4ZWQgc29tZSBtb3JlIG9uIHRoZSBjb29raWUgc2VuZGluZyB3aXRoIGEgY3VzdG9tCiAgSG9zdDogaGVhZGVyIHNldC4KCkRhbmllbCAoMSBNYXkpCi0gQW5keSBDZWRpbG5payBmaXhlZCBhIGZldyBjb21waWxlciB3YXJuaW5ncy4KCi0gTWFkZSB0aGUgIlNTTCByZWFkIGVycm9yOiA1IiBlcnJvciBtZXNzYWdlIG1vcmUgdmVyYm9zZSwgYnkgYWRkaW5nIGNvZGUgdGhhdAogIHF1ZXJpZXMgdGhlIE9wZW5TU0wgbGlicmFyeSB0byBmaWxsIGluIHRoZSBlcnJvciBidWZmZXIuCgpEYW5pZWwgKDMwIEFwcikKLSBBZGRlZCBzeXMvc2VsZWN0LmggaW5jbHVkZSBpbiB0aGUgY3VybC9tdWx0aS5oIGZpbGUsIGFmdGVyIGhhdmluZyBiZWVuCiAgcmVtaW5kZWQgYWJvdXQgdGhpcyBieSBSaWNoIEdyYXkuCgotIEkgbWFkZSBlYWNoIHRlc3Qgc2V0IGl0cyBvd24gc2VydmVyIHJlcXVpcmVtZW50cywgdGh1cyBhYmFuZG9uaW5nIHRoZQogIHByZXZpb3VzIHN5c3RlbSB3aGVyZSB0aGUgdGVzdCBudW1iZXIgaW1wbGllZCB3aGF0IHNlcnZlcihzKSB0byB1c2UgZm9yIGEKICBzcGVjaWZpYyB0ZXN0LgoKLSBEYXZpZCBCYWxhemljIG1hZGUgY3VybCBtb3JlIFJGQzE3MzgtY29tcGxpYW50IGZvciBGVFAgVVJMcywgYnkgZml4aW5nIHNvCiAgdGhhdCBsaWJjdXJsIG5vdyB1c2VzIG9uZSBDV0QgY29tbWFuZCBmb3IgZWFjaCBwYXRoIHBhcnQuIEEgYnVuY2ggb2YgdGVzdAogIGNhc2VzIHdlcmUgZml4ZWQgdG8gd29yayBhY2NvcmRpbmdseS4KCi0gQ29va2llIGZpeGVzOgoKICBBLiBTYXZlIGRvbWFpbnMgaW4gamFycyBsaWtlIE1vemlsbGEgZG9lcy4gSXQgbWVhbnMgYWxsIGRvbWFpbnMgc2V0IGluCiAgICAgU2V0LUNvb2tpZTogaGVhZGVycyBhcmUgZG90LXByZWZpeGVkLgogIEIuIFNhdmUgYW5kIHVzZSB0aGUgJ3RhaWxtYXRjaCcgZmllbGQgaW4gdGhlIE1vemlsbGEvTmV0c2NhcGUgY29va2llIGphcnMKICAgICAodGhlIHNlY29uZCBjb2x1bW4pLgogIEMuIFJlamVjdCBjb29raWVzIHVzaW5nIGlsbGVnYWwgZG9tYWlucyBpbiB0aGUgU2V0LUNvb2tpZTogbGluZS4gQ29uY2VybnMKICAgICBib3RoIGRvbWFpbnMgd2l0aCB0b28gZmV3IGRvdHMgb3IgZG9tYWlucyB0aGF0IGFyZSBvdXRzaWRlIHRoZSBjdXJyZW50bHkKICAgICBvcGVyYXRpbmcgc2VydmVyIGhvc3QncyBkb21haW4uCiAgRC4gU2V0IHRoZSBwYXRoIHBhcnQgYnkgZGVmYXVsdCB0byB0aGUgb25lIHVzZWQgaW4gdGhlIHJlcXVlc3QsIGlmIG5vbmUgd2FzCiAgICAgc2V0IGluIHRoZSBTZXQtQ29va2llIGxpbmUuCgogIFRvIG1ha2UgaXRlbSBDIHJlYWxseSBnb29kLCBJIGFsc28gbWFkZSBsaWJjdXJsIG5vdGljZSBjdXN0b20gSG9zdDogaGVhZGVycwogIGFuZCBleHRyYWN0IHRoZSBob3N0IG5hbWUgc2V0IGluIHRoZXJlIGFuZCB1c2UgdGhhdCBhcyB0aGUgaG9zdCBuYW1lIGZvciB0aGUKICBzaXRlIHdlJ3JlIGdldHRpbmcgdGhlIGNvb2tpZXMgZnJvbS4gVGhpcyBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGEgc2l0ZSdzCiAgSVAtYWRkcmVzcywgYnV0IHN0aWxsIGJlIGFibGUgdG8gcmVjZWl2ZSBhbmQgc2VuZCBpdHMgY29va2llcyBwcm9wZXJseSBpZgogIHlvdSBwcm92aWRlIGEgdmFsaWQgSG9zdDogbmFtZSBmb3IgdGhlIHNpdGUuCgpEYW5pZWwgKDI5IEFwcikKLSBQZXRlciBLb3ZhY3MgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDVVJMSU5GT19DT05ORUNUX1RJTUUgd29yayBmaW5lCiAgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlICh0b28pLgoKVmVyc2lvbiA3LjEwLjUtcHJlMSAoMjMgQXByIDIwMDMpCgpEYW5pZWwgKDIzIEFwcikKLSBVcGdyYWRlZCB0byBsaWJ0b29sIDEuNS4KCkRhbmllbCAoMjIgQXByKQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCB0aGF0IGN1cmxfZWFzeV9zZXRvcHQoKSB3aWxsIGFsd2F5cyAod3JvbmdseSkKICByZXR1cm4gQ1VSTEVfT0sgbm8gbWF0dGVyIHdoYXQgaGFwcGVucy4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHNvbWUgZ3ppcCBkZWNvbXByZXNzaW9uIGJ1Z3MgYW5kIGZsYXdzLgoKRGFuaWVsICgxNiBBcHIpCi0gRml4ZWQgbWlub3IgdHlwbyBpbiBtYW4gcGFnZSwgcmVwb3J0ZWQgaW4gdGhlIERlYmlhbiBidWcgdHJhY2tlci4KCkRhbmllbCAoMTUgQXByKQotIEZpeGVkIHNvbWUgRlRQIHRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgZmFpbGVkIG9uIG15IFNvbGFyaXMgaG9zdCwgZHVlCiAgdG8gdGhlIGNvbmZpZy5oIG5vdCBiZWluZyBpbmNsdWRlZCBiZWZvcmUgdGhlIHN5c3RlbSBoZWFkZXJzLiBXaGVuIGRvbmUgdGhhdAogIHdheSwgaXQgZGlkIGdldCBhIG1peGVkIHNlbnNlIG9mIGlmIGJpZyBmaWxlcyBhcmUgc3VwcG9ydGVkIG9yIG5vdCBhbmQgdGhlbgogIHN0YXQoKSBhbmQgZnN0YXQoKSAoYXMgdXNlZCBpbiB0ZXN0IGNhc2UgNTA1KSBnb3QgY29uZnVzZWQgYW5kIGZhaWxlZCB0bwogIHJldHVybiBhIHByb3BlciBmaWxlIHNpemUuCgotIEZvcm1wb3N0aW5nIGEgZmlsZSB1c2luZyBhIC5odG1sIHN1ZmZpeCBpcyBub3cgcHJvcGVybHkgc2V0IHRvIENvbnRlbnQtVHlwZTogICAgdGV4dC9odG1sLgoKRGFuaWVsICgxNCBBcHIpCi0gRml4ZWQgdGhlIFNTTCBlcnJvciBoYW5kbGluZyB0byByZXR1cm4gcHJvcGVyIFNTTCBlcnJvciBtZXNzYWdlcyBhZ2FpbiwgdGhleQogIGJyb2tlIGluIDcuMTAuNC4gSSBhbHNvIGF0dGVtcHQgdG8gdHJhY2sgZG93biBDQSBjZXJ0IHByb2JsZW1zIGFuZCB0aGVuCiAgcmV0dXJuIHRoZSBDVVJMRV9TU0xfQ0FDRVJUIGVycm9yIGNvZGUuCgotIFRoZSBjdXJsIHRvb2wgbm93IGludGVyY2VwdHMgdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZSBhbmQgZGlzcGxheXMKICBhIGZhaXJseSBiaWcgYW5kIGV4cGxhbmF0b3J5IGVycm9yIG1lc3NhZ2UuIEtldmluIFJvdGggaGVscGVkIG1lIG91dCB3aXRoCiAgdGhlIHdvcmRpbmcuCgpEYW5pZWwgKDExIEFwcikKLSBOaWMgSGluZXMgcHJvdmlkZWQgYSBzZWNvbmQgcGF0Y2ggZm9yIGd6aXAgZGVjb21wcmVzc2lvbiwgYW5kIGZpeGVkIGEgYnVnCiAgd2hlbiBkZWZsYXRlIG9yIGd6aXAgY29udGVudHMgd2VyZSBkb3dubG9hZGVkIHVzaW5nIGNodW5rZWQgZW5jb2RpbmcuCgotIERhbiBGYW5kcmljaCBtYWRlIGxpYmN1cmwgc3VwcG9ydCBhdXRvbWF0aWMgZGVjb21wcmVzc2lvbiBvZiBnemlwIGNvbnRlbnRzCiAgKGFzIGFuIGFkZGl0aW9uIHRvIHRoZSBwcmV2aW91cyBkZWZsYXRlIHN1cHBvcnQpLgoKLSBJIG1hZGUgdGhlIENXRCBjb21tYW5kIGR1cmluZyBGVFAgc2Vzc2lvbiBjb25zaWRlciBhbGwgMnh5IGNvZGVzIHRvIGJlIE9LCiAgcmVzcG9uc2VzLgoKRGFuaWVsICgxMCBBcHIpCi0gVmxhZCBLcnVwaW4gZml4ZWQgYSBVUkwgcGFyc2luZyBpc3N1ZS4gVVJMcyB0aGF0IHdlcmUgbm90IHVzaW5nIGEgc2xhc2gKICBhZnRlciB0aGUgaG9zdCBuYW1lLCBidXQgc3RpbGwgaGFkICI/IiBhbmQgcGFyYW1ldGVycyBhcHBlbmRlZCwgYXMgaW4KICAiaHR0cDovL2hvc3RuYW1lLmNvbT9mb29iYXI9bW9vIiwgd2VyZSBub3QgcHJvcGVybHkgcGFyc2VkIGJ5IGxpYmN1cmwuCgpEYW5pZWwgKDkgQXByKQotIE1hZGUgQ1VSTE9QVF9USU1FQ09ORElUSU9OIHdvcmsgZm9yIEZUUCB0cmFuc2ZlcnMsIHVzaW5nIHRoZSBzYW1lIHN5bnRheCBhcwogIGZvciBIVFRQLiBUaGlzIHRoZW4gbWFkZSAteiB3b3JrIGZvciBmdHAgdHJhbnNmZXJzIHRvby4gQWRkZWQgdGVzdCBjYXNlIDEzOQogIGFuZCAxNDAgZm9yIHZlcmlmeWluZyB0aGlzLgoKLSBHZXR0aW5nIHRoZSBmaWxlIGRhdGUgb2YgYW4gZnRwIGZpbGUgdXNlZCB0aGUgd3JvbmcgdGltZSB6b25lIHdoZW4KICBkaXNwbGF5ZWQuIEl0IGlzIHN1cHBvc2VkbHkgYWx3YXlzIEdNVC4gQWRkZWQgdGVzdCBjYXNlIDE0MSBmb3IgdGhpcy4KCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgc3VwcG9ydCBNRFRNLgoKLSBUaGUgZGVmYXVsdCBERUJVR0ZVTkNUSU9OLCBhcyBlbmFibGVkIHdpdGggQ1VSTE9QVF9WRVJCT1NFIG5vdyBvdXRwdXRzCiAgQ1VSTElORk9fSEVBREVSX0lOIGRhdGEgYXMgd2VsbC4gVGhlIG1vc3Qgbm90YWJsZSBlZmZlY3QgZnJvbSB0aGlzIGlzIHRoYXQKICB1c2luZyBjdXJsIC12LCB5b3UgZ2V0IHRvIHNlZSB0aGUgaW5jb21pbmcgImhlYWRlcnMiIGFzIHdlbGwuIFRoaXMgaXMKICBwZXJoYXBzIG1vc3QgdXNlZnVsIHdoZW4gZG9pbmcgZnRwLgoKRGFuaWVsICg4IEFwcikKLSBKYW1lcyBCdXJzYSBmaXhlZCBhIGZsYXcgaW4gdGhlIENvbnRlbnQtVHlwZSBleHRyYWN0aW9uIGNvZGUsIHdoaWNoIG1pc3NlZAogIHRoZSBmaXJzdCBsZXR0ZXIgaWYgbm8gc3BhY2UgZm9sbG93ZWQgdGhlIGNvbG9uLgoKLSBNYWdudXMgTmlsc3NvbiBwb2ludGVkIG91dCB0aGF0IHNoYXJlLmMgd2FzIG1pc3NpbmcgaW4gdGhlIE1TVkMgcHJvamVjdAogIGZpbGUuCgpEYW5pZWwgKDYgQXByKQotIFJ5YW4gV2VhdmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgQ0EgY2VydCBidW5kbGUgbm90IGdldCBpbnN0YWxsZWQKICBhbnltb3JlIHdoZW4gJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtc3NsJyBoYXMgYmVlbiB1c2VkLgoKRGFuaWVsICg0IEFwcikKLSBNYXJ0aWpuIEJyb2VubGFuZCBmb3VuZCBhbm90aGVyIGNhc2VzIHdoZXJlIGEgc2VydmVyIGFwcGxpY2F0aW9uIGRpZG4ndAogIGxpa2UgdGhlIGJvdW5kYXJ5IHN0cmluZyB1c2VkIGJ5IGN1cmwgd2hlbiBmb2luZyBhIG11bHRpLXBhcnQvZm9ybXBvc3QuIFdlCiAgbW9kaWZpZWQgdGhlIGJvdW5kYXJ5IHN0cmluZyB0byBsb29rIGxpa2UgdGhlIG9uZSBJRSB1c2VzLCBhcyB0aGlzIGlzCiAgcHJvYmFibHkgZ29ubmEgbWFrZSBjdXJsIHdvcmsgd2l0aCBtb3JlIGFwcGxpY2F0aW9ucy4KCkRhbmllbCAoMyBBcHIpCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0aGF0IGEgYnVuY2ggb2YgdGVzdHMgZmFpbHMgb24gY3lnd2luLiBPbmUgc2V0IGZhaWxzCiAgd2hlbiB1c2luZyBwZXJsIDUuOCAoYW5kIHRoZXkgcnVuIGZpbmUgd2l0aCBwZXJsIDUuNiksIGFuZCBhbm90aGVyIHNldAogIGZhaWxlZCBiZWNhdXNlIG9mIGFuIGFydGlmYWN0IGluIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0aGF0IEkKICBjb3JyZWN0ZWQuIEl0IHR1cm5lZCBvdXQgdGhlIEZUUCBzZXJ2ZXIgY29kZSB3YXMgc3RpbGwgaGF2aW5nIGEgZmlsZSBvcGVuZWQKICB3aGlsZSB0aGUgbWFpbiB0ZXN0IHNjcmlwdCByZW1vdmVkIGl0IGFuZCBpbnZva2VkIHRoZSBIVFRQIHNlcnZlciB0aGF0CiAgYXR0ZW1wdGVkIHRvIGNyZWF0ZSB0aGUgc2FtZSBmaWxlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIEZUUCBzZXJ2ZXIga2VwdCBvcGVuLgogIFRoaXMgb3BlcmF0aW9uIHdvcmtzIGZpbmUgb24gdW5peCwgYnV0IG5vdCBvbiBjeWd3aW4uCgpWZXJzaW9uIDcuMTAuNCAoMiBBcHIgMjAwMykKCkRhbmllbCAoMSBBcHIpCi0gQWRkZWQgdGVzdCBjYXNlIDUwNSB0byBleGVyY2lzZSBGVFAgdXBsb2FkIHdpdGggcmVuYW1lIGRvbmUgd2l0aCBsaWJjdXJsLAogIGFuZCBmb3IgdGhhdCBJIGhhZCB0byBleHRlbmQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIGRlYWwgd2l0aCB0aGUKICBSTkZSIGFuZCBSTlRPIGNvbW1hbmRzLgoKRGFuaWVsICgzMSBNYXIpCi0gRXZlbiBtb3JlIFNTTCBjb25maWcgY2hlY2sgbW9kaWZpY2F0aW9ucyBhZnRlciBSaWNoYXJkJ3MgdGVzdGluZy4KClZlcnNpb24gNy4xMC40LXByZTYgKDMxIE1hciAyMDAzKQoKRGFuaWVsICgzMSBNYXIpCi0gTW9yZSBmaXhlcyBmb3IgdGhlIFNTTCBzZXNzaW9uIElEIGNhY2hlIGNoZWNrcyB3aGVuIFNTTCBjb25maWdzIGFyZSBjaGFuZ2VkCiAgYmV0d2VlbiBjb25uZWN0aW9ucy4gQmFzZWQgb24gdGVzdHMgYW5kIHRhbGtzIHdpdGggUmljaGFyZCBCcmFtYW50ZS4KCi0gR3VpbGxhdW1lIENvdHRlbmNlYXUgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFkZGVkIENVUkxPUFRfVU5SRVNUUklDVEVEX0FVVEguCiAgV2hlbiBlbmFibGVkLCBpdCB3aWxsIHByZXZlbnQgbGliY3VybCBmcm9tIGxpbWl0aW5nIHRvIHdoaWNoIGhvc3QgaXQgc2VuZHMKICB1c2VyK3Bhc3N3b3JkIHRvIHdoZW4gZm9sbG93aW5nIGxvY2F0aW9ucy4gQnkgZGVmYXVsdCwgbGliY3VybCBvbmx5IHNlbmRzCiAgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhlIG9yaWdpbmFsIGhvc3QgdXNlZCBpbiB0aGUgZmlyc3QgVVJMLCBidXQgd2l0aCB0aGlzCiAgb3B0aW9uIHNldCBpdCB3aWxsIHNlbmQgdGhlIGF1dGggaW5mbyB0byBhbGwgaG9zdHMgaXQgZm9sbG93cyBsb2NhdGlvbgogIGhlYWRlcnMgdG8uIFRoZSBuZXcgdG9vbCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciB0aGlzIGlzIG5hbWVkCiAgIi0tbG9jYXRpb24tdHJ1c3RlZCIuCgotIEZyYW5raWUgRm9uZyByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsIGlmIHlvdSByZS11c2VkIGFuIGVhc3kgaGFuZGxlCiAgd2l0aCBhIHByb3h5LCBhbmQgeW91IGZpcnN0IG1hZGUgYSBodHRwczovLyBjb25uY3Rpb24gdG8gYSBob3N0IGFuZCB0aGVuCiAgc3dpdGNoZWQgdG8gYSBodHRwOi8vIG9uZSB0byB0aGUgc2FtZSBob3N0LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSByZS11c2UKICB0aGUgc2FtZSBjb25uZWN0aW9uIGZvciBpdCBhbmQgZmFpbCB0byBnZXQgdGhlIHNlY29uZCBVUkwgcHJvcGVybHkKCkRhbmllbCAoMjkgTWFyKQotIERhbiBTaGVhcmVyJ3MgZml4IHRoYXQgbWFrZXMgY3VybCBjb21wbGFpbiBpZiBpbnZva2VkIHdpdGggbm90aGluZyBidXQgImN1cmwKICAtTyIgd2FzIGFwcGxpZWQuCgpEYW5pZWwgKDI2IE1hcikKLSBCcnlhbiBLZW1wIHdhcyBmcmllbmRseSBlbm91Z2ggdG8gbGVuZCBtZSBhbiBhY2NvdW50IG9uIGhpcyBSZWRoYXQgOSBib3ggYW5kCiAgSSBjb3VsZCBmaXggdGhlIGNvbmZpZ3VyZSBwcm9ibGVtcyBvbiByZWRoYXQgOC4xIGFuZCA5IGluIG5vIHRpbWUgdGhhbmtzIHRvCiAgdGhpcy4gVGhhbmtzIGEgYnVuY2ggQnJ5YW4hCgpEYW5pZWwgKDI1IE1hcikKLSBSZW5hbWVkIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMKClZlcnNpb24gNy4xMC40LXByZTUgKDI1IE1hciAyMDAzKQoKRGFuaWVsICgyNSBNYXIpCi0gUmljaGFyZCBCcmFtYW50ZSBwcm92aWRlZCBhIGZpeCBmb3IgYSBoYW5kbGUgcmUtdXNlIHByb2JsZW0gc2VlbiB3aGVuIHlvdQogIGNoYW5nZSBvcHRpb25zIG9uIGFuIFNTTC1lbmFibGVkIGNvbm5lY3Rpb24gYmV0d2VlbiByZXF1ZXN0cy4gUHJldmlvdXNseSwKICBjaGFuZ2luZyBwZWVyIHZlcmlmaWNhdGlvbiBvciBob3N0IHZlcmlmaWNhdGlvbiBhbmQgc2ltaWxhciB0aGluZ3Mgd2FzIG5vdAogIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGEgY29ubmVjdGlvbiB3ZXJlIGNoZWNrZWQgZm9yIHJlLXVzZSBhbmQgdGh1cwogIGVuYWJsaW5nIHN0cmljdGVyIGNoZWNrIGJldHdlZW4gcmVxdWVzdHMgb24gYSByZS11c2VkIGNvbm5lY3Rpb24gbWFkZSBubwogIGRpZmZlcmVuY2UgYW5kIHRoZSBjb25uZWN0aW9uIHdvdWxkIHRodXMgYmUgdXNlZCBlcnJvbmVvdXNseS4KCkRhbmllbCAoMjQgTWFyKQotIEf2dHogQmFiaW4tRWJlbGwgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY2EtYnVuZGxlLmNydCBmaWxlIGNvbnRhaW5lZCBhCiAgY2VydGlmaWNhdGUgZnJvbSBUcnVzdGNlbnRlciB0aGF0IHdhcyBhIGRlbW8gY2VydGlmaWNhdGUgb25seSB0aGF0IHdhcyBuZXZlcgogIGluZGVuZGVkIHRvIGJlIHBhcnQgb2YgYSBDQSBidW5kbGUuCgpEYW5pZWwgKDIxIE1hcikKLSBMaWZlIGlzIGEgbXlzdGVyeS4gV2l0aGluIGEgdGltZSBwZXJpb2Qgb2YgMTcgaG91cnMsIFRpbSBQb3BlIGFuZCBNaWNoYWVsCiAgQ2h1cmNoaWxsIGZpbGVkIG9uZSBidWcgcmVwb3J0IGVhY2gsIGJvdGggaWRlbnRpZnlpbmcgcHJvYmxlbXMgd2l0aCBhIHNlY29uZAogIHRyYW5zZmVyIHdoZW4gZG9pbmcgcGVyc2lzdGFudCB0cmFuc2ZlcnMgcmUtdXNpbmcgYSBjb25uZWN0aW9uLiBUaW0ncyBvbmUgaXMKICAjNzA2NjI0LCBsYWJlbGVkICJNdWx0aXBsZSB1cGxvYWRzIHBlciBoYW5kbGUgZmFpbCIgYW5kIE1pY2hhZWwncyAjNzA3MDAzCiAgIkRvZXMgbm90IHNlbmQgQXV0aG9yaXphdGlvbjogaGVhZGVyIHdoZW4gcmV1c2luZyBjb25uZWN0aW9uIi4gSSBjb3VsZCB0cmFjawogIGJvdGggZG93biB0byB0aGUgc2FtZSBwaWVjZSBvZiBsb2dpYyBhbmQgaXQgdHVybmVkIG91dCBsaWJjdXJsIHdhcyBub3QgdXNpbmcKICBuZXcgc2V0dGluZ3MgcHJvcGVybHkgd2hlbiByZS11c2luZyBhbiBleGlzdGluZyBjb25uZWN0aW9uLiBUaGlzIGNvbmNlcm5lZAogIGJvdGggdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBhbmQgaW52b2x2ZWQgZXhhY3RseSB0aG9zZSBwaWVjZXMgdGhlc2UgdHdvCiAgcmVwb3J0cyBpZGVudGlmaWVkLiBUaGlzIGNvZGUgaGFzIGJlZW4gdGhpcyBmYXVsdHkgc2luY2UgdGhlIGRheSBJCiAgaW50cm9kdWNlZCBwZXJzaXN0YW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLCBtb3JlIHRoYW4gMiB5ZWFycyBhZ28uCgpEYW5pZWwgKDIwIE1hciAyMDAzKQotIEZpdmUgeWVhciBhbm5pdmVyc2FyeS4gVG9kYXkgZml2ZSB5ZWFycyBhZ28sIHRoZSBmaXJzdCBldmVyIGN1cmwgcmVsZWFzZSBzYXcKICB0aGUgbGlnaHQgb2YgZGF5LgoKRGFuaWVsICgxNyBNYXIpCi0gQW5keSBDZWRpbG5payBjb3JyZWN0ZWQgZmxhd3MgaW4gc29tZSBsaWJjdXJsIGV4YW1wbGUtdXNhZ2Ugc291cmNlcy4KCkRhbmllbCAoMTYgTWFyKQotIEp1YW4gRi4gQ29kYWdub25lIHJlcG9ydGVkIHRoYXQgdGhlIGZpeCBmcm9tIE1hcmNoIDJuZCB3YXMgaW5jb21wbGV0ZS4KCi0gQWRkZWQgY29kZSB0byB0aGUgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvciBzZWxlY3QoKSBhcmd1bWVudCB0eXBlcy4gSSd2ZQogIG5vdCBtYWRlIGFueSBjb2RlIHVzZSB0aGUgcmVzdWx0cyBqdXN0IHlldCB0aG91Z2guCgpEYW5pZWwgKDE1IE1hcikKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCB0d28gcGF0Y2hlcyB0byBidWlsZCBiZXR0ZXIgb24gV2luZG93cy4KCi0gQWRqdXN0ZWQgdGhlIHRlc3Qgc3VpdGUgY29kZSB0byBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIHNlcnZlcihzKSByZXF1aXJlZAogIGZvciBhIHNwZWNpZmljIHRlc3QgaXMgcHJvcGVybHkgc3RhcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBpcyBhdHRlbXB0ZWQuCiAgTWFueSB0ZXN0cyBub3cgcnVuIGEgbG90IGZhc3RlciB0aGFuIGJlZm9yZS4KCkRhbmllbCAoMTQgTWFyKQotIEFub3RoZXIgY29uZmlndXJlLmluIGFkanVzdG1lbnQgbWFkZSB0aGUgY29uZmlndXJlIGRldGVjdCBmdW5jdGlvbnMgcHJvcGVybHkKICBvbiBIUFVYIG5vdy4KCkRhbmllbCAoMTMgTWFyKQotIFBoaWxpcHBlIFJhb3VsdCBmaXhlZCBwcmU0LWNvbXBpbGUgcXVpcmtzIGZvciBGcmVlQlNELgoKVmVyc2lvbiA3LjEwLjQtcHJlNCAoMTMgTWFyIDIwMDMpCgpEYW5pZWwgKDEzIE1hcikKLSBBZGRlZCBhIGJhY2t1cC1jaGVjayBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGZvdW5kIGJ5IEFDX0NIRUNLX0ZVTkNTKCkKICBhcyBJIGJlbGlldmUgc29tZSBjaGVja3Mgb24gSFBVWCBuZWVkIHRoaXMuIEF0IGxlYXN0IHNvbWUgb2YgdGhlIGluZm8gZ2l2ZW4KICB0byB1cyBieSBSaWNrIEpvbmVzIHNlZW1lZCB0byBpbmRpY2F0ZSB0aGlzLgoKRGFuaWVsICgxMiBNYXIpCi0gVGhvbWFzIFRvbmlubyBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgdXNlZCB0aGUgY3VybCB0b29sIHRvIGRvIFBVVCBvcGVyYXRpb25zCiAgYXMgaW4gJ2N1cmwgd3d3LmZvby5jb20vZGlyLyAtVCBmaWxlJyBhbmQgdGhlIGZpbGUgbmFtZSBpbmNsdWRlZCBmb3IgZXhhbXBsZQogIHNwYWNlIG9yIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBkb24ndCBiZWxvbmcgaW4gVVJMcywgY3VybCBkaWQgbm90IHByb3Blcmx5CiAgVVJMIGVuY29kZSB0aGVtIGJlZm9yZSB1c2luZyB0aGVtIGluIHRoZSBVUkwuCgotIEFkZGVkIGFuIG9wdGlvbiB0byBjb25maWd1cmUgY2FsbGVkIC0tZW5hYmxlLWxpYmdjYyB0aGF0IHNpbXBseSBhZGRzIC1sZ2NjCiAgdG8gdGhlIExJQlMgdmFyaWFibGUsIGFzIHRoaXMgc2VlbXMgdG8gYmUgYSBjb21tb24gcHJvYmxlbS4KCi0gSSBtb2RpZmllZCB0aGUgY29uZmlndXJlLmluIGZpbGUsIHNvIHRoYXQgdGhlIGhlYWRlcnMgYXJlIG5vdyBjaGVja2VkIGluIGFuCiAgb3JkZXIgb2YgInZpYWxpdHkiLiBXZSBtdXN0IGFsc28gbWFrZSBzdXJlIHRvIHVzZSB0aGUgImRlZmF1bHQgaGVhZGVycyIKICBwYXJhbWV0ZXIgdG8gQUNfQ0hFQ0tfSEVBREVSUygpIHNvIHRoYXQgaGVhZGVycyBhcmUgY2hlY2tlZCB3aXRoIHRoZSBwcm9wZXIKICBwcmVyZXF1aXNpdGVzIGluY2x1ZGVkIChpLmUgYWxsIHRoZSBtYWpvciBhbmQgZ2VuZXJhbGx5IGltcG9ydGFudCBoZWFkZXIKICBmaWxlcyBhcmUgaW5jbHVkZWQgdGhlcmUgYnkgZGVmYXVsdCkuIFRoaXMgbWlnaHQgYmUgd2hhdCB3ZSBuZWVkIGZvciB2YXJpb3VzCiAgU3VuLCBIUCwgQUlYIGFuZCBUcnU2NCBzeXN0ZW1zIHRvIGJlaGF2ZSBnb29kIGFnYWluIG9uIHRoZSBoZWFkZXIgY2hlY2sKICBmcm9udC4KCi0gUmljayBKb25lcyBwb2ludGVkIG91dCBhIGZldyBjb21waWxlciB3YXJuaW5ncyBvbiBIUC1VWCB0aGF0IEkgYWRkcmVzc2VkLgoKLSBJIG1hZGUgdGhlIGNvbmZpZ3VyZSAtLWhlbHAgb3V0cHV0IG5pY2VyIGJ5IHVzaW5nIEFDX0hFTFBfU1RSSU5HKCkgYSBsb3QKICBtb3JlLgoKRGFuaWVsICgxMSBNYXIpCi0gQ2hyaXN0b3BoZSBEZW1vcnkgZml4ZWQgdGhlIHNvY2tldCBzZW5kaW5nIGNvZGUgdG8gd29yayBiZXR0ZXIgb24gSFAtVVgKICB3aGVuIHNlbmRpbmcgZGF0YSB0byBhIHNvY2tldCB0aGF0IHdvdWxkIGJsb2NrLiBJdCB0aGVuIHJldHVybnMgRUFHQUlOLCBub3QKICBFV09VTERCTE9DSy4KCi0gUmljaGFyZCBHb3J0b24gaW1wcm92ZWQgdGhlIHNlZWRpbmcgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBhIGdvb2QKICBhbmQgcmVsaWFibGUgcmFuZG9tIHNvdXJjZS4KCi0gUmljaGFyZCBHb3J0b24gZml4ZWQgYSBmZXcgd2FybmluZ3MgdGhhdCBwb3BwZWQgdXAgd2hlbiB5b3UgYnVpbHQgY3VybAogIHVzaW5nIHRoZSBTdW4gY29tcGlsZXIgb24gYSA2NGJpdCBTUEFSQyBwbGF0Zm9ybS4KCi0gTWFydGluIEMuIE1hcnRpbiBmaXhlZCBhIGNhc2Ugd2hlcmUgYSBjb25uZWN0IGZhaWx1cmUgdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGRpZG4ndCBwcm9kdWNlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nLgoKRGFuaWVsICgxMCBNYXIpCi0gUmV2ZXJ0ZWQgbHRtYWluLnNoIGJhY2sgdG8gbGlidG9vbCAxLjQuMiBzdGF0dXMgYWdhaW4sIGFzIHRoZSAxLjQuMyB2ZXJzaW9uCiAgYnJva2UgdGhlIGJ1aWxkIG9uIG51bWVyb3VzIHBsYXRmb3Jtcy4gSXQgc2VlbXMgdGhhdCBsaWJ0b29sIDEuNC4zIHB1dHMgc29tZQogIHJlcXVpcmVtZW50cyBvbiB3aGF0IHZlcnNpb25zIG9mIHRoZSBvdGhlciB0b29scyAoYXV0b2NvbmYgKyBhdXRvbWFrZSkgdGhhdAogIEkgYW0gbm90IGZhbWlsaWFyIHdpdGggYW5kIHRodXMgSSBjb3VsZG4ndCBmdWxmaWxsIGF0IHRoaXMgcG9pbnQuCgogIFllcywgdGhpcyBpcyBtb3JlIHRoYW4gbWlsZGx5IGZydXN0cmF0aW5nLgoKRGFuaWVsICg3IE1hcikKLSBSdW4gbGlidG9vbGl6ZSB2ZXJzaW9uIDEuNC4zLgoKVmVyc2lvbiA3LjEwLjQtcHJlMyAoNCBNYXIgMjAwMykKCkRhbmllbCAoMyBNYXIpCi0gQWRkZWQgc2hhcmUub2JqIHRvIHRoZSBWQzYgYW5kIEJvcmxhbmQgbGliY3VybCBtYWtlZmlsZXMuCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmb3VuZCBhbmQgaW52ZXN0aWdhdGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgb24gQUlYLAogIHByZXN1bWFibHkgb25seSBvbiA0LjMgb3IgbGF0ZXIuIGdldGhvc3RieW5hbWVfcigpIGlzIG5vdCByZXR1cm5pbmcgZGF0YQogIHRoYXQgaXMgcG9zc2libGUgdG8gImtlZXAiIGFuZCBjYWNoZSB0aGUgd2F5IGxpYmN1cmwgZG9lcy4gQnV0IGluc3RlYWQgdGhlc2UKICB2ZXJzaW9ucyBvZiBBSVggdXNlcyBhIGdldGhvc3RieW5hbWUoKSB0aGF0IHdvcmtzIHRocmVhZC1zYWZlbHkgd2UgY2FuCiAgaW5zdGVhZCB1c2UgdGhlIG9yZGluYXJ5IGdldGhvc3RieW5hbWUoKSBhbmQgb3VyIHBhY2tfaG9zdGVudCgpIGFwcHJvYWNoIHRvCiAgYWNoaWV2ZSB3aGF0IHdlIHdhbnQuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBhdHRlbXB0cyB0byBkZXRlY3QgQUlYIDQuMyBvcgogIGxhdGVyIHRvIGFkanVzdCBmb3IgdGhpcy4KCkRhbmllbCAoMiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgZm91bmQgYSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy4xMC4zIHdoZW4geW91IGZpcnN0IGRpZCBhCiAgUE9TVCBhbmQgdGhlbiBiYWNrIHRvIGEgR0VUIHVzaW5nIHRoZSBzYW1lIGVhc3kgaGFuZGxlLgoKRGFuaWVsICgyOCBGZWIpCi0gUmVtb3ZlZCB0aGUgc3RyZXF1YWwgYW5kIHN0cm5lcXVhbCBkZWZpbmVzIGZyb20gY3VybC9jdXJsLmggaGVhZGVyLiBUaGV5CiAgd2VyZSBuZXZlciBtZWFudCBmb3IgdGhlIHB1YmxpYyBoZWFkZXIgYW55d2F5LiBQaGlsaXBwZSBSYW91bHQgYnJvdWdodCBpdAogIHVwLgoKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgUklTQyBPUyBidWlsZC4KCkRhbmllbCAoMjcgRmViKQotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGUgdmVyeSBtaXNsZWFkaW5nIGN1cmxfbXVsdGlfaW5mb19yZWFkIG1hbiBwYWdlLCBhbmQKICBJIHVwZGF0ZWQgaXQgdG8gYmVjb21lIG1vcmUgYWNjdXJhdGUuCgotIFNhbHZhdG9yZSBTb3JyZW50aW5vIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZGluZyB0aGF0IHR1cm5lZCBvdXQgdG8KICBiZSBoaXMgRlRQIHNlcnZlciByZXR1cm5pbmcgc2l6ZSB6ZXJvICgwIGJ5dGVzKSB3aGVuIFNJWkUgd2FzIHVzZWQgb24gYSBmaWxlCiAgd2hpbGUgYmVpbmcgaW4gQklOQVJZIG1vZGUuIFdlIG5vdyBtYWtlIGEgc2Vjb25kIGNoZWNrIGZvciB0aGUgYWN0dWFsIHNpemUKICBieSBzY2FubmluZyB0aGUgUkVUUiByZXBseSBhbnl3YXksIGV2ZW4gaWYgdGhlIFNJWkUgY29tbWFuZCByZXR1cm5lZCAwLgoKRGFuaWVsICgyNiBGZWIpCi0gS3lsZSBTYWxsZWUgcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGhlIHdvdWxkIGRvIGEgdHJhbnNmZXIgdGhhdCBkaWRuJ3QgdXBkYXRlCiAgdGhlIHByb2dyZXNzIG1ldGVyIHByb3Blcmx5LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHdvdWxkCiAgbG9vcCBhIGxpdHRsZSB0b28gZWFnZXJseSBpbiB0aGUgdHJhbmZlciBsb29wLCB3aGljaCBpc24ndCByZWFsbHkgZ29vZCBmb3IKICB0aGUgQVBJcywgZXNwZWNpYWxseSBub3QgdGhlIG11bHRpIEFQSS4KClZlcnNpb24gNy4xMC40LXByZTIgKDI0IEZlYiAyMDAzKQoKRGFuaWVsICgyNCBGZWIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIG91dCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byBhIHZhbHVlIGhpZ2hlcgogIHRoYW4gNSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0LgoKLSBJIGJlbGlldmUgSSBmaXhlZCB0aGUgJ0V4cGVjdDogMTAwLWNvbnRpbnVlJyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIGJyb2tlbgogIGZvciBhIHdoaWxlIChJIHRoaW5rIHNpbmNlIG15IGNoYW5nZSBkYXRlZCBEZWMgMTAgMjAwMikuIFdoZW4gdGhpcyBoZWFkZXIgaXMKICB1c2VkLCBsaWJjdXJsIHNob3VsZCB3YWl0IGZvciBhIEhUVFAgMTAwIChvciB0aW1lb3V0KSBiZWZvcmUgc2VuZGluZyB0aGUKICBwb3N0L3B1dCBkYXRhLgoKRGFuaWVsICgxNCBGZWIpCi0gTWF0dGhldyBDbGFya2UgcHJvdmlkZWQgc29tZSBpbmZvIHdoYXQgdG8gbW9kaWZ5IHRvIG1ha2UgY3VybCBidWlsZAogIGZsYXdsZXNzbHkgb24gQUlYIDMuMi41LgoKLSBNYXJ0aW4gQy4gTWFydGluIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSB3aGVuCiAgcnVubmluZyBvbiBXaW5kb3dzIGFuZCB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHBvcnQgd2l0aG91dCBhIGxpc3RlbmVyLgoKRGFuaWVsICgxMyBGZWIpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIEN1cmxfYmFzZTY0X2VuY29kZSgpIHRvIGRlYWwgd2l0aCB6ZXJvZXMgaW4gdGhlCiAgZGF0YSB0byBlbmNvZGUuCgpEYW5pZWwgKDQgRmViKQotIEplYW4tUGhpbGlwcGUgYWRkZWQgdGhlIGZpcnN0IGNvZGUgdGhhdCBlbmFibGVzIHRoZSAnc2hhcmUnIHN5c3RlbS4gVGhpcwogIHNob3VsZCBub3cgZW5hYmxlIHNoYXJpbmcgb2YgRE5TIGRhdGEgYmV0d2VlbiB0d28gY3VybCBlYXN5IGhhbmRsZXMuCgotIEluY29ycG9yYXRlZCBOaWNvIEJhZ2d1cycgZml4ZXMgdG8gYWdhaW4gY29tcGlsZSBmbGF3bGVzc2x5IG9uIFZNUy4KCi0gSmFtZXMgQnVyc2EgY29ycmVjdGVkIGEgYmFkIGNvbW1lbnQgaW4gdGhlIHB1YmxpYyBpbmNsdWRlIGZpbGUgY3VybC9tdWx0aS5oCgotIFBldGVyIEZvcnJldCByZXBvcnRlZCBvbmUgb2YgdGhvc2UgZXJyb3I6MDAwMDAwMDAgY2FzZXMgaW4gbGliY3VybCBhZ2FpbgogIHdoZW4gY29ubmVjdGluZyB0byBhIEhUVFBTIHNpdGUsIGFuZCB0aGlzIHRpbWUgSSBkaWQgZGlzY292ZXIgc29tZSBvZGRpdGllcwogIGluIGhvdyBjdXJsIHJlcG9ydHMgU1NMIGVycm9ycyBiYWNrLiBJdCBjb3VsZCBtaXNzIHNob3dpbmcgdGhlIGFjdHVhbCBlcnJvci4KClZlcnNpb24gNy4xMC40LXByZTEgKDMgRmViIDIwMDMpCgpEYW5pZWwgKDMgRmViKQotIFJlbW92ZWQgdGhpbmdzIGluIHRoZSBkb2NzIHNheWluZyBjYXBhdGggZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MsIGFzIEp1bGlhbgogIE5vYmxlIHRvbGQgdXMgaXQgd29ya3MgZmluZS4KCkRhbmllbCAoMzEgSmFuKQotIEtldmluIFJvdGggZml4ZWQgdGhlIHpsaWIgYnVpbGQgc3R1ZmYgaW4gdGhlIE1pbmd3MzIgbWFrZWZpbGUuCgpEYW5pZWwgKDMwIEphbikKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGN1cmwgb24gV2luZG93cyBhbHdheXMgY2hlY2tlZCBmb3IgdGhlIENBIGNlcnQKICBidW5kbGUgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgcGF0aCBzY2FuLCBldmVuIHRob3VnaAogIC1rLy0taW5zZWN1cmUgd2FzIHVzZWQuCgotIEhhbWlzaCBNYWNrZW56aWUgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIG9ubHkgZGlkIHN0cmljdCBob3N0IG5hbWUgdmVyaWZ5aW5nCiAgaWYgY2FwYXRoIG9yIGNhaW5mbyB3YXMgdXNlZC4gTm93IGl0J2xsIGFsd2F5cyBkbyBpdCB1bmxlc3MgLWsgLyAtLWluc2VjdXJlCiAgaXMgdXNlZCEKCi0gUGF2ZWwgQ2VuZWsgcG9pbnRlZCBvdXQgdGhhdCB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gd2FzIGRvbmUgd3JvbmdseQogIGFzIHRoZSBmdWxsIHN0cmluZyB3YXMgbm90IGZldGNoZWQuIEFkZGVkIHRlc3QgY2FzZSA1NyB0byB2ZXJpZnkgdGhhdCBjdXJsCiAgZG9lcyBpdCByaWdodCBub3cuCgpEYW5pZWwgKDI5IEphbikKLSBKYW1pZSBXaWxraW5zb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBjdXJsIGF0dGVtcHQgdG8gY2xlYXIgb3V0CiAgInNlbnNpdGl2ZSIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIHBzIG91dHB1dHMKICAob25seSBvbiBwbGF0Zm9ybXMgdGhhdCBhbGxvdyB3cml0aW5nIHRvIGFyZ3ZbXSkuCgotIEpvaG4gTWNHb3dhbiBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBiYWQKICBhcmd1bWVudHMgYW5kIHRodXMgY2F1c2UgdGhlIC0tdHJhY2Ugb3V0cHV0cyB0byBnbyB3cm9uZy4KCi0gUmVtb3ZlZCBhbGwgdGhlIGVtYWNzIGxvY2FsIHZhcmlhYmxlcyBmcm9tIGFsbCBmaWxlcy4gTWF0cyBMaWRlbGwgcHJvdmlkZWQKICB0aGUgbmV3IHNhbXBsZS5lbWFjcyBmaWxlIChmb3IgYSBzYW1wbGUgb2Ygd2hhdCB0byBpbmNsdWRlIGluIHlvdXIgLmVtYWNzKQogIGFuZCB0aGUgY3VybC1zdHlsZS5lbCB0aGF0IHNldHMgYSBiZXR0ZXIgYy1zdHlsZSBmb3IgZWRpdGluZyBjdXJsIHNvdXJjZXMuCgotIERhdmUgSGFsYmFra2VuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZHMgdGhhdCBjb3VsZCBhY2NpZGVudGx5CiAgcmV0dXJuIENVUkxFX1BBUlRJQUxfRklMRSB3aGVuIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2FzIGNhbGxlZCB3aXRoIE5PQk9EWQogIHNldCBUUlVFLgoKRGFuaWVsICgyNyBKYW4pCi0gVGhlIGZvcGVuLmMgZXhhbXBsZSB3YXMgZmxhd2VkIGFzIE5pY2sgSHVtZnJleSBub3RpY2VkLCBhbmQgSSBmaXhlZCBpdCB0bwogIHdvcmsgYWdhaW4uCgpEYW5pZWwgKDI0IEphbikKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayAodGhlIGNvbnRlbnQtdHlwZSBzdHJpbmcpCiAgd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLgoKRGFuaWVsICgyMiBKYW4gMjAwMykKLSBJYW4gV2lsa2VzIGFuZCBMZWdvZmYgVmluY2VudCBib3RoIGluZGVwZW5kZW50bHkgcHJvdmlkZWQgZml4ZXMgZm9yIG1ha2luZwogIGN1cmwvbXVsdGkuaCB3b3JrIHByb3Blcmx5IHdoZW4gY29tcGlsZWQgd2l0aCBhIEMrKyBjb21waWxlci4KCkRhbmllbCAoMjAgSmFuIDIwMDMpCi0gRml4ZWQgJ2J1aWxkY29uZicgdG8gY2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlcXVpcmVkIHRvb2xzIGJlZm9yZQogIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KCi0gV3JvdGUgJ3Rlc3RjdXJsLnNoJywgYSBzY3JpcHQgdGFyZ2V0ZWQgZm9yIGF1dG9tYXRpYyBhbmQgZGlzdHJpYnV0ZWQgY3VybAogIHRlc3RzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgoKLSBEYXZpZCBUaGllbCBwb2ludGVkIG91dCB0aGF0IHRoZSAubmV0cmMgZmlsZSB3YXMgbm90IGJlaW5nIGRlYWx0IHdpdGgKICBwcm9wZXJseSBhbnltb3JlLiBJIGJyb2tlIHRoaXMgaW4gdGhlIHBhc3N3b3JkIHByb21wdGluZyAiZml4Ii4KCi0gTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgcGF0Y2hlZCBsaWJjdXJsIHRvIGFsbG9jYXRlIHRoZSBzY3JhdGNoIGJ1ZmZlciBvbmx5CiAgb24gZGVtYW5kIGFuZCB0aHVzIHdlIHNhdmUgMzJLQiBpbiBlYWNoIGN1cmwgaGFuZGxlIHRoYXQgZG9uJ3QgdXNlIHRoYXQKICBidWZmZXIuIFRoaXMgbmVlZCBhcHBlYXJlZCB3aGVuIHNvbWUgcGVvcGxlIHN0YXJ0ZWQgdXNpbmcgdGhvdXNhbmRzIG9mCiAgc2ltdWx0YW5lb3VzIGN1cmwgaGFuZGxlcy4uLiA6LSkKCkRhbmllbCAoMTYgSmFuIDIwMDMpCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBjdXJsLWNvbmZpZyAtLWNmbGFncyB3aGVuIHRoZSBpbmNsdWRlZGlyIHdhcyBub3QKICAvdXNyL2luY2x1ZGUuCgotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgQ1VSTElORk9fUFJJVkFURSB0byBwcm9wZXJseSByZXR1cm4gTlVMTCBpZiBpdCB3YXMKICBzZXQgdG8gTlVMTCEKClZlcnNpb24gNy4xMC4zICgxNCBKYW4gMjAwMykKCkRhbmllbCAoMTAgSmFuIDIwMDMpCi0gU3RldmUgT2xpcGhhbnQgcG9pbnRlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgMTA1IGRpZCBub3Qgd29yayBhbnltb3JlIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBhIG1pc3NpbmcgZml4IGZvciB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nLgoKVmVyc2lvbiA3LjEwLjMtcHJlNiAoMTAgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gQnJ5YW4gS2VtcCBwb2ludGVkIG91dCB0aGF0IGN1cmwgLXUgY291bGQgbm90IHByb3ZpZGUgYSBibGFuayBwYXNzd29yZAogIHdpdGhvdXQgcHJvbXB0aW5nIHRoZSB1c2VyLiBJdCBjYW4gbm93LiAtdSB1c2VybmFtZTogbWFrZXMgdGhlIHBhc3N3b3JkCiAgZW1wdHksIHdoaWxlIC11IHVzZXJuYW1lIG1ha2VzIGN1cmwgcHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgoKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSByZW1haW5pbmcgY29ubmVjdCBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb24KICBpcHY0IHN5c3RlbXMgKExpbnV4IG9ubHk/KSwgdGhhdCBJIGZpeGVkIGFuZCBLamV0aWwgdmVyaWZpZWQgdGhhdCBpdCBmaXhlZAogIGhpcyBwcm9ibGVtcy4KCi0gbWVtYW5hbHl6ZS5wbCBub3cgcmVhZHMgYSBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgbm8gbG9uZ2VyCiAgdGFrZXMgdGhlIGRhdGEgb24gc3RkaW4gYXMgYmVmb3JlLgoKVmVyc2lvbiA3LjEwLjMtcHJlNSAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBGaXhlZCB0ZXN0cy9tZW1hbmFseXplLnBsIHRvIHdvcmsgd2l0aCBmaWxlIG5hbWVzIHRoYXQgY29udGFpbiBjb2xvbnMgKGFzIG9uCiAgV2luZG93cykuCiAgCi0gS2pldGlsIEphY29ic2VuIHF1aWNrbHkgcG9pbnRlZCBvdXQgdGhhdCBsaWIvc2hhcmUuaCB3YXMgbWlzc2luZy4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlNCAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBVcGRhdGVkIGxpYi9zaGFyZS5jIHF1aXRlIGEgYml0IHRvIG1hdGNoIHRoZSBkZXNpZ24gZG9jdW1lbnQgYXQKICBodHRwOi8vY3VybC5oYXh4LnNlL2Rldi9zaGFyaW5nLnR4dCBhIGxvdCBtb3JlLgoKICBJJ2xsIHRyeSB0byB1cGRhdGUgdGhlIGRvY3VtZW50IHNvb25pc2guIHNoYXJlLmMgaXMgc3RpbGwgbm90IGFjdHVhbGx5IHVzZWQKICBieSBsaWJjdXJsLCBidXQgdGhlIEFQSSBpcyBzbG93bHkgZ2V0dGluZyB0aGVyZSBhbmQgd2UgY2FuIHN0YXJ0CiAgaW1wbGVtZW50aW5nIGNvZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBzeXN0ZW0uCgpEYW5pZWwgKDggSmFuIDIwMDMpCi0gVXBkYXRlZCBzaGFyZSBzdHVmZiBpbiBjdXJsL2N1cmwuaCwgaW5jbHVkaW5nIGRhdGEgdHlwZXMsIHN0cnVjdHMgYW5kCiAgZnVuY3Rpb24gcHJvdG90eXBlcy4gVGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgaW4gbGliLyB3ZXJlIGFsc28gbW9kaWZpZWQKICBvZiBjb3Vyc2UgdG8gcmVtYWluIGNvbXBpbGFibGUuIEJhc2VkIG9uIGlucHV0IGZyb20gSmVhbi1QaGlsaXBwZSBhbmQgYWxzbwogIHRvIG1ha2UgaXQgbW9yZSBpbiBsaW5lIHdpdGggdGhlIGRlc2lnbiBkb2N1bWVudC4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwYXRjaGVkIGEgdmVyeSB0cml2aWFsIG1lbW9yeSBsZWFrIGluCiAgY3VybF9lc2NhcGUoKSB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIHJlYWxsb2MoKSByZXR1cm5zIE5VTEwuLi4KCi0gTWF0dGhldyBCbGFpbiBwcm92aWRlZCBmZWVkYmFjayB0byBtYWtlIHRoZSAtLWNyZWF0ZS1kaXJzIHN0dWZmIGJ1aWxkCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIHRlc3RzL2xpYnRlc3QvZmlyc3QuYyBhcyBMZWdvZmYgVmluY2VudCBwb2ludGVkIG91dC4KCkRhbmllbCAoNyBKYW4gMjAwMykKLSBQaGlsaXBwZSBSYW91bHQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIHByb3Blcmx5IHN1cHBvcnQKICB3aWxkY2FyZCBjaGVja3MgZm9yIGNlcnRpZmljYXRlIG5hbWVzLgoKLSBTaW1vbiBMaXUgYWRkZWQgQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUywgdG8gbGV0IGFuIGFwcGxpY2F0aW9uIHNldCBvdGhlcgogIHN0cmluZ3MgcmVjb2duaXplZCBhcyAiSFRUUCAyMDAiIHRvIGFsbG93IGh0dHAtbGlrZSBwcm90b2NvbHMgdG8gZ2V0CiAgZG93bmxvYWRlZCBmaW5lIGJ5IGN1cmwuCgotIE5vdyB1c2luZyBhdXRvY29uZiAyLjU3IGFuZCBhdXRvbWFrZSAxLjcuMgoKLSBEb2luZyAiY3VybCAtSSBmdHA6Ly9kb21haW4vbm9uLWV4aXN0aW5nLWZpbGUiIHN0aWxsIG91dHB1dGVkIGEgZGF0ZSEKICBXYXluZSBIYWlnaCByZXBvcnRlZC4KCi0gVGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IHdyaXR0ZW4gcHJvcGVybHkgd2l0aCBhIG5ld2xpbmUgaW4gdGhlIC0tdHJhY2UKICBmaWxlLgoKRGFuaWVsICg2IEphbiAyMDAzKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHBvc3NpYmxlIGJ1ZzogcHJldmlvdXNseSwgaWYgeW91IGNhbGxlZAogIGN1cmxfZWFzeV9wZXJmb3JtIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGRucyBjYWNoZSwgdGhlIGdsb2JhbCBjYWNoZQogIHdvdWxkbid0IGJlIHVzZWQuIFBvaW50ZWQgb3V0IGJ5IEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUuCgotIE1hdHRoZXcgQmxhaW4ncyBmaXhlZCB0aGUgVkM2IGxpYmN1cmwgbWFrZWZpbGUgdG8gaW5jbHVkZSBiZXR0ZXIgZGVidWcgZGF0YQogIG9uIGRlYnVnIGJ1aWxkcy4K