CiAgICAgICAgICAgICAgICBDaGFuZ2VMb2cgZmlsZSBmb3IgemxpYgoKQ2hhbmdlcyBpbiAxLjIuMS4xICg5IEphbnVhcnkgMjAwNCkKLSBVcGRhdGVkIGVtYWlsIGFkZHJlc3MgaW4gUkVBRE1FCi0gU2V2ZXJhbCBGQVEgdXBkYXRlcwotIEZpeGVkIGEgYmlnIGZhdCBidWcgaW4gaW5mdHJlZXMuYyB0aGF0IHByZXZlbnRlZCBkZWNvZGluZyB2YWxpZAogIGR5bmFtaWMgYmxvY2tzIHdpdGggb25seSBsaXRlcmFscyBhbmQgbm8gZGlzdGFuY2UgY29kZXMuCi0gQWRkIGEgbm90ZSB0byBwdWZmLmMgb24gbm8gZGlzdGFuY2UgY29kZXMgY2FzZS4KCkNoYW5nZXMgaW4gMS4yLjEgKDE3IE5vdmVtYmVyIDIwMDMpCi0gUmVtb3ZlIGEgdGFiIGluIGNvbnRyaWIvZ3phcHBlbmQvZ3phcHBlbmQuYwotIFVwZGF0ZSBzb21lIGludGVyZmFjZXMgaW4gY29udHJpYiBmb3IgbmV3IHpsaWIgZnVuY3Rpb25zCi0gVXBkYXRlIHpsaWIgdmVyc2lvbiBudW1iZXIgaW4gc29tZSBjb250cmliIGVudHJpZXMKLSBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9uIGZvciBwdHJkaWZmX3QgaW4genV0aWwuaCBbTWFpLCBUcnV0YV0KLSBTdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gSHVyZCBhbmQgS0ZyZWVCU0QgW0Jyb3duXQotIEZpeCBlcnJvciBpbiBOT19ESVZJREUgb3B0aW9uIG9mIGFkbGVyMzIuYwoKQ2hhbmdlcyBpbiAxLjIuMC44ICg0IE5vdmVtYmVyIDIwMDMpCi0gVXBkYXRlIHZlcnNpb24gaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYW5kIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCi0gQWRkIGV4cGVyaW1lbnRhbCBOT19ESVZJREUgI2RlZmluZSBpbiBhZGxlcjMyLmMKICAgIC0gUG9zc2libHkgZmFzdGVyIG9uIHNvbWUgcHJvY2Vzc29ycyAobGV0IG1lIGtub3cgaWYgaXQgaXMpCi0gQ29ycmVjdCBaX0JMT0NLIHRvIG5vdCByZXR1cm4gb24gZmlyc3QgaW5mbGF0ZSBjYWxsIGlmIG5vIHdyYXAKLSBGaXggc3RybS0+ZGF0YV90eXBlIG9uIGluZmxhdGUoKSByZXR1cm4gdG8gY29ycmVjdGx5IGluZGljYXRlIEVPQgotIEFkZCBkZWZsYXRlUHJpbWUoKSBmdW5jdGlvbiBmb3IgYXBwZW5kaW5nIGluIHRoZSBtaWRkbGUgb2YgYSBieXRlCi0gQWRkIGNvbnRyaWIvZ3phcHBlbmQgZm9yIGFuIGV4YW1wbGUgb2YgYXBwZW5kaW5nIHRvIGEgc3RyZWFtCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLSBEZWxldGUgVHVyYm8gQyBjb21tZW50IGluIFJFQURNRSBbVHJ1dGFdCi0gSW1wcm92ZSBzb21lIGluZGVudGF0aW9uIGluIHpjb25mLmggW1RydXRhXQotIEZpeCBpbmZpbml0ZSBsb29wIG9uIGJhZCBpbnB1dCBpbiBjb25maWd1cmUgc2NyaXB0IFtDaHVyY2hdCi0gRml4IGd6ZW9mKCkgZm9yIGNvbmNhdGVuYXRlZCBnemlwIGZpbGVzIFtKb2huc29uXQotIEFkZCBleGFtcGxlIHRvIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBbTWljaGFlbCBCLl0KLSBBZGQgLXAgdG8gbWtkaXIncyBpbiBNYWtlZmlsZS5pbiBbdmRhXQotIEZpeCBjb25maWd1cmUgdG8gcHJvcGVybHkgZGV0ZWN0IHByZXNlbmNlIG9yIGxhY2sgb2YgcHJpbnRmIGZ1bmN0aW9ucwotIEFkZCBBUzQwMCBzdXBwb3J0IFtNb25uZXJhdF0KLSBBZGQgYSBsaXR0bGUgQ3lnd2luIHN1cHBvcnQgW1dpbHNvbl0KCkNoYW5nZXMgaW4gMS4yLjAuNyAoMjEgU2VwdGVtYmVyIDIwMDMpCi0gQ29ycmVjdCBzb21lIGRlYnVnIGZvcm1hdHMgaW4gY29udHJpYi9pbmZiYWNrOQotIENhc3QgYSB0eXBlIGluIGEgZGVidWcgc3RhdGVtZW50IGluIHRyZWVzLmMKLSBDaGFuZ2Ugc2VhcmNoIGFuZCByZXBsYWNlIGRlbGltaXRlciBpbiBjb25maWd1cmUgZnJvbSAlIHRvICMgW0JlZWJlXQotIFVwZGF0ZSBjb250cmliL3VudGd6IHRvIDAuMiB3aXRoIHZhcmlvdXMgZml4ZXMgW1RydXRhXQotIEFkZCBidWlsZCBzdXBwb3J0IGZvciBBbWlnYSBbTmlrbF0KLSBSZW1vdmUgc29tZSBkaXJlY3RvcmllcyBpbiBvbGQgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byAxLjIKLSBBZGQgZHlsaWIgYnVpbGRpbmcgZm9yIE1hYyBPUyBYIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4KLSBSZW1vdmUgb2xkIGRpc3RyaWJ1dGlvbiBzdHVmZiBmcm9tIE1ha2VmaWxlCi0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBETExfRkFRLnR4dCwgYW5kIGFkZCBjb21tZW50IG9uIE1hYyBPUyBYCi0gVXBkYXRlIGxpbmtzIGluIFJFQURNRQoKQ2hhbmdlcyBpbiAxLjIuMC42ICgxMyBTZXB0ZW1iZXIgMjAwMykKLSBNaW5vciBGQVEgdXBkYXRlcwotIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4wMCBbVm9sbGFudF0KLSBSZW1vdmUgdGVzdCBvZiBneiBmdW5jdGlvbnMgaW4gZXhhbXBsZS5jIHdoZW4gR1pfQ09NUFJFU1MgZGVmaW5lZCBbVHJ1dGFdCi0gVXBkYXRlIFBPU1RJTkMgY29tbWVudCBmb3IgNjgwNjAgW05pa2xdCi0gQWRkIGNvbnRyaWIvaW5mYmFjazkgd2l0aCBkZWZsYXRlNjQgZGVjb2RpbmcgKHVuc3VwcG9ydGVkKQotIEZvciBNVlMgZGVmaW5lIE5PX3ZzbnByaW50ZiBhbmQgdW5kZWZpbmUgRkFSIFt2YW4gQnVyaWtdCi0gQWRkIHByYWdtYSBmb3IgZmRvcGVuIG9uIE1WUyBbdmFuIEJ1cmlrXQoKQ2hhbmdlcyBpbiAxLjIuMC41ICg4IFNlcHRlbWJlciAyMDAzKQotIEFkZCBPRiB0byBpbmZsYXRlQmFja0VuZCgpIGRlY2xhcmF0aW9uIGluIHpsaWIuaAotIFJlbWVtYmVyIHN0YXJ0IHdoZW4gdXNpbmcgZ3pkb3BlbiBpbiB0aGUgbWlkZGxlIG9mIGEgZmlsZQotIFVzZSBpbnRlcm5hbCBvZmZfdCBjb3VudGVycyBpbiBneiogZnVuY3Rpb25zIHRvIHByb3Blcmx5IGhhbmRsZSBzZWVrcwotIFBlcmZvcm0gbW9yZSByaWdvcm91cyBjaGVjayBmb3IgZGlzdGFuY2UtdG9vLWZhciBpbiBpbmZmYXN0LmMKLSBBZGQgWl9CTE9DSyBmbHVzaCBvcHRpb24gdG8gcmV0dXJuIGZyb20gaW5mbGF0ZSBhdCBibG9jayBib3VuZGFyeQotIFNldCBzdHJtLT5kYXRhX3R5cGUgb24gcmV0dXJuIGZyb20gaW5mbGF0ZQogICAgLSBJbmRpY2F0ZSBiaXRzIHVudXNlZCwgaWYgYXQgYmxvY2sgYm91bmRhcnksIGFuZCBpZiBpbiBsYXN0IGJsb2NrCi0gUmVwbGFjZSBzaXplX3Qgd2l0aCBwdHJkaWZmX3QgaW4gY3JjMzIuYywgYW5kIGNoZWNrIGZvciBjb3JyZWN0IHNpemUKLSBBZGQgY29uZGl0aW9uIHNvIG9sZCBOT19ERUZMQVRFIGRlZmluZSBzdGlsbCB3b3JrcyBmb3IgY29tcGF0aWJpbGl0eQotIEZBUSB1cGRhdGUgcmVnYXJkaW5nIHRoZSBXaW5kb3dzIERMTCBbVHJ1dGFdCi0gSU5ERVggdXBkYXRlOiBhZGQgcW54IGVudHJ5LCByZW1vdmUgYWl4IGVudHJ5IFtUcnV0YV0KLSBJbnN0YWxsIHpsaWIuMyBpbnRvIG1hbmRpciBbV2lsc29uXQotIE1vdmUgY29udHJpYi96bGliX2RsbF9GQVEudHh0IHRvIHdpbjMyL0RMTF9GQVEudHh0OyB1cGRhdGUgW1RydXRhXQotIEFkYXB0IHRoZSB6bGliIGludGVyZmFjZSB0byB0aGUgbmV3IERMTCBjb252ZW50aW9uIGd1aWRlbGluZXMgW1RydXRhXQotIEludHJvZHVjZSBaTElCX1dJTkFQSSBtYWNybyB0byBhbGxvdyB0aGUgZXhwb3J0IG9mIGZ1bmN0aW9ucyB1c2luZwogIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uLCBmb3IgVmlzdWFsIEJhc2ljIFtWb2xsYW50LCBUcnV0YV0KLSBVcGRhdGUgbXNkb3MgYW5kIHdpbjMyIHNjcmlwdHMgYW5kIG1ha2VmaWxlcyBbVHJ1dGFdCi0gRXhwb3J0IHN5bWJvbHMgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwsIGluIHdpbjMyL3psaWIuZGVmIFtUcnV0YV0KLSBBZGQgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLSBNb3ZlIGFzbSBmaWxlcyBmcm9tIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbnRyaWIvYXNtMzg2IFtUcnV0YV0KLSBSZW5hbWUgY29udHJpYi9hc20zODYgdG8gY29udHJpYi9tYXNteDg2IFtUcnV0YSwgVm9sbGFudF0KLSBBZGQgY29udHJpYi9tYXNtNjg2IFtUcnV0YV0KLSBGaXggb2Zmc2V0cyBpbiBjb250cmliL2luZmxhdGU4NiBhbmQgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbQogIFtUcnV0YSwgVm9sbGFudF0KLSBVcGRhdGUgY29udHJpYi9kZWxwaGk7IHJlbmFtZSB0byBjb250cmliL3Bhc2NhbDsgYWRkIGV4YW1wbGUgW1RydXRhXQotIFJlbW92ZSBjb250cmliL2RlbHBoaTI7IGFkZCBhIG5ldyBjb250cmliL2RlbHBoaSBbVHJ1dGFdCi0gQXZvaWQgaW5jbHVzaW9uIG9mIHRoZSBub25zdGFuZGFyZCA8bWVtb3J5Lmg+IGluIGNvbnRyaWIvaW9zdHJlYW0sCiAgYW5kIGZpeCBzb21lIG1ldGhvZCBwcm90b3R5cGVzIFtUcnV0YV0KLSBGaXggdGhlIFpDUl9TRUVEMiBjb25zdGFudCB0byBhdm9pZCB3YXJuaW5ncyBpbiBjb250cmliL21pbml6aXAKICBbVHJ1dGFdCi0gQXZvaWQgdGhlIHVzZSBvZiBiYWNrc2xhc2ggKFwpIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLSBGaXggZmlsZSB0aW1lIGhhbmRsaW5nIGluIGNvbnRyaWIvdW50Z3o7IHVwZGF0ZSBtYWtlZmlsZXMgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb21wbHkgd2l0aCB0aGUgbmV3IERMTCBndWlkZWxpbmVzCiAgW1ZvbGxhbnRdCi0gUmVtb3ZlIGNvbnRyaWIvdnN0dWRpby92YzE1XzE2IFtWb2xsYW50XQotIFJlbmFtZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL3ZzdHVkaW8vdmM3IFtUcnV0YV0KLSBVcGRhdGUgUkVBRE1FLmNvbnRyaWIgW1RydXRhXQotIEludmVydCB0aGUgYXNzaWdubWVudCBvcmRlciBvZiBtYXRjaF9oZWFkIGFuZCBzLT5wcmV2Wy4uLl0gaW4KICBJTlNFUlRfU1RSSU5HIFtUcnV0YV0KLSBDb21wYXJlIFRPT19GQVIgd2l0aCAzMjc2NyBpbnN0ZWFkIG9mIDMyNzY4LCB0byBhdm9pZCAxNi1iaXQgd2FybmluZ3MKICBbVHJ1dGFdCi0gQ29tcGFyZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIDAsIG5vdCB3aXRoIE5VTEwgb3IgWl9OVUxMIFtUcnV0YV0KLSBGaXggcHJvdG90eXBlIG9mIHN5bmNzZWFyY2ggaW4gaW5mbGF0ZS5jIFtUcnV0YV0KLSBJbnRyb2R1Y2UgQVNNSU5GIG1hY3JvIHRvIGJlIGVuYWJsZWQgd2hlbiB1c2luZyBhbiBBU00gaW1wbGVtZW50YXRpb24KICBvZiBpbmZsYXRlX2Zhc3QgW1RydXRhXQotIENoYW5nZSBOT19ERUZMQVRFIHRvIE5PX0daQ09NUFJFU1MgW1RydXRhXQotIE1vZGlmeSB0ZXN0X2d6aW8gaW4gZXhhbXBsZS5jIHRvIHRha2UgYSBzaW5nbGUgZmlsZSBuYW1lIGFzIGEKICBwYXJhbWV0ZXIgW1RydXRhXQotIEV4aXQgdGhlIGV4YW1wbGUuYyBwcm9ncmFtIGlmIGd6b3BlbiBmYWlscyBbVHJ1dGFdCi0gQWRkIHR5cGUgY2FzdHMgYXJvdW5kIHN0cmxlbiBpbiBleGFtcGxlLmMgW1RydXRhXQotIFJlbW92ZSBjYXN0aW5nIHRvIHNpemVvZiBpbiBtaW5pZ3ppcC5jOyBnaXZlIGEgcHJvcGVyIHR5cGUKICB0byB0aGUgdmFyaWFibGUgY29tcGFyZWQgd2l0aCBTVUZGSVhfTEVOIFtUcnV0YV0KLSBVcGRhdGUgZGVmaW5pdGlvbnMgb2YgU1REQyBhbmQgU1REQzk5IGluIHpjb25mLmggW1RydXRhXQotIFN5bmNocm9uaXplIHpjb25mLmggd2l0aCB0aGUgbmV3IFdpbmRvd3MgRExMIGludGVyZmFjZSBbVHJ1dGFdCi0gVXNlIFNZUzE2QklUIGluc3RlYWQgb2YgX18zMkJJVF9fIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KICAxNi0gYW5kIDMyLWJpdCBwbGF0Zm9ybXMgW1RydXRhXQotIFVzZSBmYXIgbWVtb3J5IGFsbG9jYXRvcnMgaW4gc21hbGwgMTYtYml0IG1lbW9yeSBtb2RlbHMgZm9yCiAgVHVyYm8gQyBbVHJ1dGFdCi0gQWRkIGluZm8gYWJvdXQgdGhlIHVzZSBvZiBBU01WLCBBU01JTkYgYW5kIFpMSUJfV0lOQVBJIGluCiAgemxpYkNvbXBpbGVGbGFncyBbVHJ1dGFdCi0gQ3lnd2luIGhhcyB2c25wcmludGYgW1dpbHNvbl0KLSBJbiBXaW5kb3dzMTYsIE9TX0NPREUgaXMgMCwgYXMgaW4gTVNET1MgW1RydXRhXQotIEluIEN5Z3dpbiwgT1NfQ09ERSBpcyAzIChVbml4KSwgbm90IDExIChXaW5kb3dzMzIpIFtXaWxzb25dCgpDaGFuZ2VzIGluIDEuMi4wLjQgKDEwIEF1Z3VzdCAyMDAzKQotIE1pbm9yIEZBUSB1cGRhdGVzCi0gQmUgbW9yZSBzdHJpY3Qgd2hlbiBjaGVja2luZyBpbmZsYXRlSW5pdDIncyB3aW5kb3dCaXRzIHBhcmFtZXRlcgotIENoYW5nZSBOT19HVU5aSVAgY29tcGlsZSBvcHRpb24gdG8gTk9fR1pJUCB0byBjb3ZlciBkZWZsYXRlIGFzIHdlbGwKLSBBZGQgZ3ppcCB3cmFwcGVyIG9wdGlvbiB0byBkZWZsYXRlSW5pdDIgdXNpbmcgd2luZG93Qml0cwotIEFkZCB1cGRhdGVkIFFOWCBydWxlIGluIGNvbmZpZ3VyZSBhbmQgcW54IGRpcmVjdG9yeSBbQm9ubmVmb3ldCi0gTWFrZSBpbmZsYXRlIGRpc3RhbmNlLXRvby1mYXIgY2hlY2tzIG1vcmUgcmlnb3JvdXMKLSBDbGVhbiB1cCBGQVIgdXNhZ2UgaW4gaW5mbGF0ZQotIEFkZCBjYXN0aW5nIHRvIHNpemVvZigpIGluIGd6aW8uYyBhbmQgbWluaWd6aXAuYwoKQ2hhbmdlcyBpbiAxLjIuMC4zICgxOSBKdWx5IDIwMDMpCi0gRml4IHNpbGx5IGVycm9yIGluIGd6dW5nZXRjKCkgaW1wbGVtZW50YXRpb24gW1ZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCBhbmQgY29udHJpYi92c3R1ZGlvIFtWb2xsYW50XQotIEZpeCBwcmludGYgZm9ybWF0IGluIGV4YW1wbGUuYwotIENvcnJlY3QgY2RlY2wgc3VwcG9ydCBpbiB6Y29uZi5pbi5oIFtBbmlzaW1rb3ZdCi0gTWlub3IgRkFRIHVwZGF0ZXMKCkNoYW5nZXMgaW4gMS4yLjAuMiAoMTMgSnVseSAyMDAzKQotIEFkZCBaTElCX1ZFUk5VTSBpbiB6bGliLmggZm9yIG51bWVyaWNhbCBwcmVwcm9jZXNzb3IgY29tcGFyaXNvbnMKLSBBdHRlbXB0IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNyYzMyLmMgZm9yIHBvaW50ZXItaW50IGNvbnZlcnNpb24KLSBBZGQgQUlYIHRvIGNvbmZpZ3VyZSwgcmVtb3ZlIGFpeCBkaXJlY3RvcnkgW0Jha2tlcl0KLSBBZGQgc29tZSBjYXN0cyB0byBtaW5pZ3ppcC5jCi0gSW1wcm92ZSBjaGVja2luZyBhZnRlciBpbnNlY3VyZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBjYWxscwotIFJlbW92ZSAjZWxpZidzIGZyb20gY3JjMzIuYwotIENoYW5nZSBsZWF2ZSBsYWJlbCB0byBpbmZfbGVhdmUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMgdG8gYXZvaWQKICBsaWJyYXJ5IGNvbmZsaWN0cwotIFJlbW92ZSBpbmZsYXRlIGd6aXAgZGVjb2RpbmcgYnkgZGVmYXVsdC0tb25seSBlbmFibGUgZ3ppcCBkZWNvZGluZyBieQogIHNwZWNpYWwgcmVxdWVzdCBmb3Igc3RyaWN0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotIEFkZCB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gdG8gcmV0dXJuIGNvbXBpbGF0aW9uIGluZm9ybWF0aW9uCi0gTW9yZSB0eXBlY2FzdGluZyBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgd2FybmluZ3MKLSBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gX0NhcGl0YWwgI2RlZmluZXMgW1RydXRhXQotIEZpeCBjb25maWd1cmUgdG8gbGluayBzaGFyZWQgbGlicmFyeSB3aGVuIHRlc3RpbmcKLSBBZGQgc29tZSBXaW5kb3dzIENFIHRhcmdldCBhZGp1c3RtZW50cyBbTWFpXQotIFJlbW92ZSAjZGVmaW5lIFpMSUJfRExMIGluIHpjb25mLmggW1ZvbGxhbnRdCi0gQWRkIHpsaWIuMyBbUm9kZ2Vyc10KLSBVcGRhdGUgUkZDIFVSTCBpbiBkZWZsYXRlLmMgYW5kIGFsZ29yaXRobS50eHQgW01haV0KLSBBZGQgemxpYl9kbGxfRkFRLnR4dCB0byBjb250cmliIFtUcnV0YV0KLSBBZGQgVUwgdG8gc29tZSBjb25zdGFudHMgW1RydXRhXQotIFVwZGF0ZSBtaW5pemlwIGFuZCB2c3R1ZGlvIFtWb2xsYW50XQotIFJlbW92ZSB2ZXN0aWdpYWwgTkVFRF9EVU1NWV9SRVRVUk4gZnJvbSB6Y29uZi5pbi5oCi0gRXhwYW5kIHVzZSBvZiBOT19EVU1NWV9ERUNMIHRvIGF2b2lkIGFsbCBkdW1teSBzdHJ1Y3R1cmVzCi0gQWRkZWQgaW9zdHJlYW0zIHRvIGNvbnRyaWIgW1NjaHdhcmR0XQotIFJlcGxhY2UgcmV3aW5kKCkgd2l0aCBmc2VlaygpIGZvciBXaW5DRSBbVHJ1dGFdCi0gSW1wcm92ZSBzZXR0aW5nIG9mIHpsaWIgZm9ybWF0IGNvbXByZXNzaW9uIGxldmVsIGZsYWdzCiAgICAtIFJlcG9ydCAwIGZvciBodWZmbWFuIGFuZCBybGUgc3RyYXRlZ2llcyBhbmQgZm9yIGxldmVsID09IDAgb3IgMQogICAgLSBSZXBvcnQgMiBvbmx5IGZvciBsZXZlbCA9PSA2Ci0gT25seSBkZWFsIHdpdGggNjRLIGxpbWl0IHdoZW4gbmVjZXNzYXJ5IGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0gQWxsb3cgVE9PX0ZBUiBjaGVjayB0byBiZSB0dXJuZWQgb2ZmIGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0gQWRkIGd6Y2xlYXJlcnIoKSBmdW5jdGlvbiBbU291emFdCi0gQWRkIGd6dW5nZXRjKCkgZnVuY3Rpb24KCkNoYW5nZXMgaW4gMS4yLjAuMSAoMTcgTWFyY2ggMjAwMykKLSBBZGQgWl9STEUgc3RyYXRlZ3kgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgW1RydXRhXQogICAgLSBXaGVuIFpfUkxFIHJlcXVlc3RlZCwgcmVzdHJpY3QgbWF0Y2hlcyB0byBkaXN0YW5jZSBvbmUKICAgIC0gVXBkYXRlIHpsaWIuaCwgbWluaWd6aXAuYywgZ3pvcGVuKCksIGd6ZG9wZW4oKSBmb3IgWl9STEUKLSBDb3JyZWN0IEZBU1RFU1QgY29tcGlsYXRpb24gdG8gYWxsb3cgbGV2ZWwgPT0gMAotIENsZWFuIHVwIHdoYXQgZ2V0cyBjb21waWxlZCBmb3IgRkFTVEVTVAotIEluY29ycG9yYXRlIGNoYW5nZXMgdG8gemNvbmYuaW4uaCBbVm9sbGFudF0KICAgIC0gUmVmaW5lIGRldGVjdGlvbiBvZiBUdXJibyBDIG5lZWQgZm9yIGR1bW15IHJldHVybnMKICAgIC0gUmVmaW5lIFpMSUJfRExMIGNvbXBpbGF0aW9uCiAgICAtIEluY2x1ZGUgYWRkaXRpb25hbCBoZWFkZXIgZmlsZSBvbiBWTVMgZm9yIG9mZl90IHR5cGVkZWYKLSBUcnkgdG8gdXNlIF92c25wcmludGYgd2hlcmUgaXQgc3VwcGxhbnRzIHZzcHJpbnRmIFtWb2xsYW50XQotIEFkZCBzb21lIGNhc3RzIGluIGluZmZhc3QuYwotIEVuY2hhbmNlIGNvbW1lbnRzIGluIHpsaWIuaCBvbiB3aGF0IGhhcHBlbnMgaWYgZ3pwcmludGYoKSB0cmllcyB0bwogIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbgotIFJlbW92ZSB1bnVzZWQgc3RhdGUgZnJvbSBpbmZsYXRlQmFja0VuZCgpCi0gUmVtb3ZlIGV4aXQoMCkgZnJvbSBtaW5pZ3ppcC5jLCBleGFtcGxlLmMKLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMKLSBBZGQgImNoZWNrIiB0YXJnZXQgdG8gTWFrZWZpbGUuaW4gdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzICJ0ZXN0IgotIEFkZCAibW9zdGx5Y2xlYW4iIGFuZCAibWFpbnRhaW5lci1jbGVhbiIgdGFyZ2V0cyB0byBNYWtlZmlsZS5pbgotIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dCi0gVXBkYXRlIGNvbnRyaWIvdGVzdHpsaWIsIGNvbnRyaWIvdnN0dWRpbywgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEFkZCBtc2RvcyBhbmQgd2luMzIgZGlyZWN0b3JpZXMgd2l0aCBtYWtlZmlsZXMgW1RydXRhXQotIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQoKQ2hhbmdlcyBpbiAxLjIuMCAoOSBNYXJjaCAyMDAzKQotIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlCiAgICAtIEFib3V0IDIwJSBmYXN0ZXIKICAgIC0gRG9lcyBub3QgYWxsb2NhdGUgMzJLIHdpbmRvdyB1bmxlc3MgYW5kIHVudGlsIG5lZWRlZAogICAgLSBBdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIGRlY29tcHJlc3NlcyBnemlwIHN0cmVhbXMKICAgIC0gUmF3IGluZmxhdGUgbm8gbG9uZ2VyIG5lZWRzIGFuIGV4dHJhIGR1bW15IGJ5dGUgYXQgZW5kCiAgICAtIEFkZGVkIGluZmxhdGVCYWNrIGZ1bmN0aW9ucyB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZS0tZXZlbiBmYXN0ZXIKICAgICAgdGhhbiBpbmZsYXRlLCB1c2VmdWwgZm9yIGZpbGUgdXRpbGl0aWVzIChnemlwLCB6aXApCiAgICAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24gdG8gcmVjb3JkIHN0YXRlIGZvciByYW5kb20gYWNjZXNzIG9uCiAgICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGRlZmxhdGUgc3RyZWFtcyAoZS5nLiBpbiBnemlwIGZpbGVzKQogICAgLSBNb3JlIHJlYWRhYmxlIGNvZGUgKEkgaG9wZSkKLSBOZXcgYW5kIGltcHJvdmVkIGNyYzMyKCkKICAgIC0gQWJvdXQgNTAlIGZhc3RlciwgdGhhbmtzIHRvIHN1Z2dlc3Rpb25zIGZyb20gUm9kbmV5IEJyb3duCi0gQWRkIGRlZmxhdGVCb3VuZCgpIGFuZCBjb21wcmVzc0JvdW5kKCkgZnVuY3Rpb25zCi0gRml4IG1lbW9yeSBsZWFrIGluIGRlZmxhdGVJbml0MigpCi0gUGVybWl0IHNldHRpbmcgZGljdGlvbmFyeSBmb3IgcmF3IGRlZmxhdGUgKGZvciBwYXJhbGxlbCBkZWZsYXRlKQotIEZpeCBjb25zdCBkZWNsYXJhdGlvbiBmb3IgZ3p3cml0ZSgpCi0gQ2hlY2sgZm9yIHNvbWUgbWFsbG9jKCkgZmFpbHVyZXMgaW4gZ3ppby5jCi0gRml4IGJ1ZyBpbiBnem9wZW4oKSBvbiBzaW5nbGUtYnl0ZSBmaWxlIDB4MWYKLSBGaXggYnVnIGluIGd6cmVhZCgpIG9uIGNvbmNhdGVuYXRlZCBmaWxlIHdpdGggMHgxZiBhdCBlbmQgb2YgYnVmZmVyCiAgYW5kIG5leHQgYnVmZmVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCAweDhiCi0gRml4IHVuY29tcHJlc3MoKSB0byByZXR1cm4gWl9EQVRBX0VSUk9SIG9uIHRydW5jYXRlZCBpbnB1dAotIEZyZWUgbWVtb3J5IGF0IGVuZCBvZiBleGFtcGxlLmMKLSBSZW1vdmUgTUFYICNkZWZpbmUgaW4gdHJlZXMuYyAoY29uZmxpY3RlZCB3aXRoIHNvbWUgbGlicmFyaWVzKQotIEZpeCBzdGF0aWMgY29uc3QncyBpbiBkZWZsYXRlLmMsIGd6aW8uYywgYW5kIHp1dGlsLltjaF0KLSBEZWNsYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkgaW4gZ3ppby5jIGlmIFNUREMgbm90IGRlZmluZWQKLSBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiBjYWxsb2MoKSBpbiB6dXRpbC5jIGlmIGludCBiaWcgZW5vdWdoCi0gRGVmaW5lIFNUREMgZm9yIEFJWAotIEFkZCBhaXgvIHdpdGggYXBwcm9hY2ggZm9yIGNvbXBpbGluZyBzaGFyZWQgbGlicmFyeSBvbiBBSVgKLSBBZGQgSFAtVVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLSBBZGQgT3BlblVOSVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLSBVc2UgJGNjIGluc3RlYWQgb2YgZ2NjIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5Ci0gTWFrZSBwcmVmaXggZGlyZWN0b3J5IGlmIG5lZWRlZCB3aGVuIGluc3RhbGxpbmcKLSBDb3JyZWN0IE1hY2ludG9zaCBhdm9pZGFuY2Ugb2YgdHlwZWRlZiBCeXRlIGluIHpjb25mLmgKLSBDb3JyZWN0IFR1cmJvIEMgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiB1bmRlciBMaW51eAotIFVzZSBsaWJ6LmEgaW5zdGVhZCBvZiAtbHogaW4gTWFrZWZpbGUgKGFzc3VyZSB1c2Ugb2YgY29tcGlsZWQgbGlicmFyeSkKLSBVcGRhdGUgY29uZmlndXJlIHRvIGNoZWNrIGZvciBzbnByaW50ZiBvciB2c25wcmludGYgZnVuY3Rpb25zIGFuZCB0aGVpcgogIHJldHVybiB2YWx1ZSwgd2FybiBkdXJpbmcgbWFrZSBpZiB1c2luZyBhbiBpbnNlY3VyZSBmdW5jdGlvbgotIEZpeCBjb25maWd1cmUgcHJvYmxlbSB3aXRoIGNvbXBpbGUtdGltZSBrbm93bGVkZ2Ugb2YgSEFWRV9VTklTVERfSCB0aGF0CiAgaXMgbG9zdCB3aGVuIGxpYnJhcnkgaXMgdXNlZC0tcmVzb2x1dGlvbiBpcyB0byBidWlsZCBuZXcgemNvbmYuaAotIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpbiB6bGliLmgpOgogICAgLSBEb2N1bWVudCByYXcgZGVmbGF0ZSBhbmQgaW5mbGF0ZQogICAgLSBVcGRhdGUgUkZDcyBVUkwKICAgIC0gUG9pbnQgb3V0IHRoYXQgemxpYiBhbmQgZ3ppcCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQKICAgIC0gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbAogICAgLSBEb2N1bWVudCBzdHJpbmcgbGltaXQgZm9yIGd6cHJpbnRmKCkgYW5kIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdwogICAgLSBOb3RlIHJlcXVpcmVtZW50IG9uIGF2YWlsX291dCB3aGVuIGZsdXNoaW5nCiAgICAtIE5vdGUgcGVybWl0dGVkIHZhbHVlcyBvZiBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpCi0gQWRkIHNvbWUgRkFRcyAoYW5kIGV2ZW4gYW5zd2VycykgdG8gdGhlIEZBUQotIEFkZCBjb250cmliL2luZmxhdGU4Ni8gZm9yIHg4NiBmYXN0ZXIgaW5mbGF0ZQotIEFkZCBjb250cmliL2JsYXN0LyBmb3IgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSBkZWNvbXByZXNzaW9uCi0gQWRkIGNvbnRyaWIvcHVmZi8gc2ltcGxlIGluZmxhdGUgZm9yIGRlZmxhdGUgZm9ybWF0IGRlc2NyaXB0aW9uCgpDaGFuZ2VzIGluIDEuMS40ICgxMSBNYXJjaCAyMDAyKQotIFpGUkVFIHdhcyByZXBlYXRlZCBvbiBzYW1lIGFsbG9jYXRpb24gb24gc29tZSBlcnJvciBjb25kaXRpb25zLgogIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCiAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAotIFJldHVybmVkIGluY29ycmVjdCBlcnJvciAoWl9NRU1fRVJST1IpIG9uIHNvbWUgaW52YWxpZCBkYXRhCi0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdwogIGxlc3MgdGhhbiAzMksuCi0gZm9yY2Ugd2luZG93Qml0cyA+IDggdG8gYXZvaWQgYSBidWcgaW4gdGhlIGVuY29kZXIgZm9yIGEgd2luZG93IHNpemUKICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCgpDaGFuZ2VzIGluIDEuMS4zICg5IEp1bHkgMTk5OCkKLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKICBvY2Nhc2lvbnMiIChNYXJrKQotIGZpeCBnenJlYWQgYW5kIGd6dGVsbCBmb3IgY29uY2F0ZW5hdGVkIC5neiBmaWxlcyAoRGlkaWVyIExlIEJvdGxhbikKLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUKLSBmaXggY3JjIGNoZWNrIGFmdGVyIGEgZ3plZWsgKEZyYW5rIEZhdWJlcnQpCi0gZml4IG1pbml1bnppcCB3aGVuIHRoZSBsYXN0IGVudHJ5IGluIGEgemlwIGZpbGUgaXMgaXRzZWxmIGEgemlwIGZpbGUKICAoSiBMaWxsZ2UpCi0gYWRkIGNvbnRyaWIvYXNtNTg2IGFuZCBjb250cmliL2FzbTY4NiAoQnJpYW4gUmFpdGVyKQogIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCi0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkKLSBhZGQgc3VwcG9ydCBmb3IgQysrQnVpbGRlciAzIGFuZCBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaTIgKERhdmlkZSBNb3JldHRpKQotIGRvIG5vdCBleGl0IHByZW1hdHVyZWx5IGluIHVudGd6IGlmIDAgYXQgc3RhcnQgb2YgYmxvY2sgKE1hZ251cyBIb2xtZ3JlbikKLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpCi0gYWRkZWQgYSBGQVEgZmlsZQoKLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkKLSBEbyBub3QgcmVkZWZpbmUgQnl0ZSBvbiBNYWMgKEJyYWQgUGV0dGl0ICYgSmFzb24gTGluaGFydCkKLSBkZWZpbmUgU0VFS19FTkQgdG9vIGlmIFNFRUtfU0VUIGlzIG5vdCBkZWZpbmVkIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQotIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpCi0gZml4IGEgcHJvYmxlbSBpbiBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDE2LWJpdCBNU0RPUyAoR2lsbGVzIFZvbGxhbnQpCi0gZW11bGF0ZSB1dGltZSgpIGZvciBXSU4zMiBpbiBjb250cmliL3VudGd6ICAoR2lsbGVzIFZvbGxhbnQpCi0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpCi0gdXNlIGxpYmRpciBhbmQgaW5jbHVkZWRpciBpbiBNYWtlZmlsZS5pbiAoVGltIE1vb25leSkKLSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gT1NGMSBWNCAoVGltIE1vb25leSkKLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpCi0gZml4IG1ha2V0cmVlLmMgY29tcGlsYXRpb24gZXJyb3IgKEdsZW5uLCBNYXJrKQotIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiBub3cgaW4gUHl0aG9uIDEuNSAoSmVyZW15IEh5bHRvbikKLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikKLSBpbml0aWFsaXplIHN0YXRpYyBkZXNjcmlwdG9ycyBpbiB0cmVlcy5jIGZvciBlbWJlZGRlZCB0YXJnZXRzIChOaWNrIFNtaXRoKQotIHVzZSAiZm9vLWd6IiBpbiBleGFtcGxlLmMgZm9yIFJJU0NPUyBhbmQgVk1TIChOaWNrIFNtaXRoKQotIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpCi0gZml4IGZkb3BlbiBhbmQgaGFsbG9jIG1hY3JvcyBmb3IgTWljcm9zb2Z0IEMgNi4wIChUb20gTGFuZSkKLSBmaXggbWFrZXRyZWUuYyB0byBhbGxvdyBjbGVhbiBjb21waWxhdGlvbiBvZiBpbmZmaXhlZC5oIChNYXJrKQotIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkKLSBjbGVhbnVwIHRyZWVzLmMsIHVzZSBjb21wcmVzc2VkX2xlbiBvbmx5IGluIGRlYnVnIG1vZGUgKENocmlzdGlhbiBTcGllbGVyKQotIE1hbnkgcG9ydGFiaWxpdHkgcGF0Y2hlcyBieSBDaHJpc3RpYW4gU3BpZWxlcjoKICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qCiAgLiBNYWtlX3Ztcy5jb206IGZpeGVkIHNvbWUgdHlwb3MKICAuIE1ha2Vfdm1zLmNvbTogbXNkb3MvTWFrZWZpbGUuKjogcmVtb3ZlZCB6dXRpbC5oIGZyb20gc29tZSBkZXBlbmRlbmN5IGxpc3RzCiAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzCiAgLiBtc2Rvcy9NYWtlZmlsZS4qOiB1c2UgbW9kZWwtZGVwZW5kZW50IG5hbWUgZm9yIHRoZSBidWlsdCB6bGliIGxpYnJhcnkKICAuIG1zZG9zL01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5nY2M6CiAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQotIHVzZSBkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciBCeXRlZiBhbHNvIGZvciBNU0Mgc21hbGwvbWVkaXVtIChUb20gTGFuZSkKLSByZXBsYWNlIF9fZmFyIHdpdGggX2ZhciBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5IChDaHJpc3RpYW4gU3BpZWxlciwgVG9tIExhbmUpCi0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkKCkNoYW5nZXMgaW4gMS4xLjIgKDE5IE1hcmNoIDk4KQotIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpCiAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotIHByZWluaXRpYWxpemUgdGhlIGluZmxhdGUgdGFibGVzIGZvciBmaXhlZCBjb2RlcywgdG8gbWFrZSB0aGUgY29kZQogIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspCi0gc29tZSBzaW1wbGlmaWNhdGlvbnMgYW5kIHNsaWdodCBzcGVlZC11cCB0byB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKQotIGZpeCBnemVvZiBvbiBub24tY29tcHJlc3NlZCBmaWxlcyAoQWxsYW4gU2NocnVtKQotIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpCi0gdXNlIGRlZmF1bHQgdmFsdWUgb2YgNEsgZm9yIFpfQlVGU0laRSBmb3IgMTYtYml0IE1TRE9TIChUaW0gV2VnbmVyICsgR2xlbm4pCi0gYWRkZWQgb3MyL01ha2VmaWxlLmRlZiBhbmQgb3MyL3psaWIuZGVmIChBbmRyZXcgWmFib2xvdG55KQotIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpCi0gZG8gbm90IHdyYXAgZXh0ZXJuICJDIiBhcm91bmQgc3lzdGVtIGluY2x1ZGVzIChUb20gTGFuZSkKLSBtZW50aW9uIHpsaWIgYmluZGluZyBmb3IgVENMIGluIFJFQURNRSAoQW5kcmVhcyBLdXByaWVzKQotIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCi0gYWxsb3cgIm1ha2UgaW5zdGFsbCBwcmVmaXg9Li4uIiBldmVuIGFmdGVyIGNvbmZpZ3VyZSAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIGFsbG93ICJjb25maWd1cmUgLS1wcmVmaXggJEhPTUUiIChUaW0gTW9vbmV5KQotIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIG1vdmUgTWFrZWZpbGUuc2FzIHRvIGFtaWdhL01ha2VmaWxlLnNhcwoKQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQotIGZpeCBtYWNyb3MgX3RyX3RhbGx5XyogaW4gZGVmbGF0ZS5oIGZvciBkZWJ1ZyBtb2RlICAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIHJlbW92ZSBibG9jayB0cnVuY2F0aW9uIGhldXJpc3RpYyB3aGljaCBoYWQgdmVyeSBtYXJnaW5hbCBlZmZlY3QgZm9yIHpsaWIKICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUKICBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLiBUaGlzIGFsc28gYWxsb3dzIGlubGluaW5nIF90cl90YWxseSBmb3IKICBtYXRjaGVzIGluIGRlZmxhdGVfc2xvdy4KLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikKCkNoYW5nZXMgaW4gMS4xLjAgKDI0IEZlYiA5OCkKLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpCi0gcmV2ZXJ0IHRvIHRoZSB6bGliIDEuMC44IGluZmxhdGUgdG8gYXZvaWQgdGhlIGdjYyAyLjguMCBidWcgKEplcmVteSBCdWhsZXIpCi0gY29tcGlsZSB3aXRoIC1ERkFTVEVTVCB0byBnZXQgY29tcHJlc3Npb24gY29kZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIG9ubHkKLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpCi0gaW5jcmVhc2Ugc2l6ZSBvZiBJL08gYnVmZmVycyBpbiBtaW5pZ3ppcC5jIGFuZCBnemlvLmMgKG5vdCBhIGJpZyBnYWluCiAgb24gU3VuIGJ1dCBzaWduaWZpY2FudCBvbiBIUCkKCi0gYWRkIGEgcG9pbnRlciB0byBleHBlcmltZW50YWwgdW56aXAgbGlicmFyeSBpbiBSRUFETUUgKEdpbGxlcyBWb2xsYW50KQotIGluaXRpYWxpemUgdmFyaWFibGUgZ2NjIGluIGNvbmZpZ3VyZSAoQ2hyaXMgSGVyYm9ydGgpCgpDaGFuZ2VzIGluIDEuMC45ICgxNyBGZWIgMTk5OCkKLSBhZGRlZCBnenB1dHMgYW5kIGd6Z2V0cyBmdW5jdGlvbnMKLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQotIGZpeCBnenNlZWsgZm9yIGZpbGVzIGluIHRyYW5zcGFyZW50IG1vZGUgKE1hcmsgRGlla2hhbnMpCi0gZG8gbm90IGFzc3VtZSB0aGF0IHZzcHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChKZW5zIEtyaW5rZSkKLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcwotIGFkZGVkIGNvbXByZXNzMiBpbiB6Y29uZi5oLCB6bGliLmRlZiwgemxpYi5kbnQKLSBuZXcgYXNtIGNvZGUgZnJvbSBHaWxsZXMgVm9sbGFudCBpbiBjb250cmliL2FzbTM4NgotIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOgogLiBSZXBsYWNlIFpBTExPQydzIGluIGh1ZnRfYnVpbGQoKSB3aXRoIHNpbmdsZSBaQUxMT0MgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3KCkKIC4gWkFMTE9DIHRoZSBsZW5ndGggbGlzdCBpbiBpbmZsYXRlX3RyZWVzX2ZpeGVkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjawogLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCiAuIFNpbXBsaWZ5IFpfRklOSVNIIGNoZWNrIGluIGluZmxhdGUoKQoKLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44Ci0gaW4gaW5mdHJlZXMuYywgYXZvaWQgY2MgLU8gYnVnIG9uIEhQIChGYXJzaGlkIEVsYWhpKQotIGluIHpjb25mLmggbW92ZSB0aGUgWkxJQl9ETEwgc3R1ZmYgZWFybGllciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpCi0gaW5zdGFsbCBsaWJ6LnNvKiB3aXRoIG1vZGUgNzU1IChleGVjdXRhYmxlKSBpbnN0ZWFkIG9mIDY0NCAoTWFyYyBMZWhtYW5uKQotIHJlYWRfYnVmIGJ1ZiBwYXJhbWV0ZXIgb2YgdHlwZSBCeXRlZiogaW5zdGVhZCBvZiBjaGFyZioKLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQotIGRvIG5vdCByZWRlY2xhcmUgdW5saW5rIGluIG1pbmlnemlwLmMgZm9yIFdJTjMyIChKb2huIEJvd2xlcikKLSBmaXggY2hlY2sgZm9yIHByZXNlbmNlIG9mIGRpcmVjdG9yaWVzIGluICJtYWtlIGluc3RhbGwiIChJYW4gV2lsbGlzKQoKQ2hhbmdlcyBpbiAxLjAuOCAoMjcgSmFuIDE5OTgpCi0gZml4ZWQgb2Zmc2V0cyBpbiBjb250cmliL2FzbTM4Ni9ndm1hdDMyLmFzbSAoR2lsbGVzIFZvbGxhbnQpCi0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpCi0gYWRkZWQgY29tcHJlc3MyKCkgdG8gYWxsb3cgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLSBpbmNsdWRlIHN5cy90eXBlcy5oIHRvIGdldCBvZmZfdCBvbiBzb21lIHN5c3RlbXMgKE1hcmMgTGVobWFubiAmIFFpbmdMb25nKQotIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZwogIHRoZW0gYXQgcnVuIHRpbWUgKHRoYW5rcyB0byBLZW4gUmFlYnVybiBmb3IgdGhpcyBzdWdnZXN0aW9uKS4gVG8gY3JlYXRlCiAgdHJlZXMuaCwgY29tcGlsZSB3aXRoIEdFTl9UUkVFU19IIGFuZCBydW4gIm1ha2UgdGVzdCIuCi0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQKLSBwYXNzIG1pbmlnemlwIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGZpbGVfY29tcHJlc3MKLSBzaW1wbGlmeWluZyBjb2RlIG9mIGluZmxhdGVTeW5jIHRvIGF2b2lkIGdjYyAyLjggYnVnCgotIHN1cHBvcnQgQ0M9ImdjYyAtV2FsbCIgaW4gY29uZmlndXJlIC1zIChRaW5nTG9uZykKLSBhdm9pZCBhIGZsdXNoIGNhdXNlZCBieSBmdGVsbCBpbiBnem9wZW4gZm9yIHdyaXRlIG1vZGUgKEtlbiBSYWVidXJuKQotIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCi0gemxpYi5saWIgLT4gemxpYi5kbGwgaW4gbXNkb3MvemxpYi5yYyAoR2lsbGVzIFZvbGxhbnQpCi0gY2hlY2sgZm9yIFRBUkdFVF9PU19NQUMgaW4gYWRkaXRpb24gdG8gTUFDT1MgKEJyYWQgUGV0dGl0KQotIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQotIGFkZCBjaGVja3MgZm9yIGd6cHV0YyBhbmQgZ3pwdXRjIGluIGV4YW1wbGUuYwotIGF2b2lkIHdhcm5pbmdzIGluIGd6aW8uYyBhbmQgZGVmbGF0ZS5jIChBbmRyZWFzIEtsZWluZXJ0KQotIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pCi0gZml4ZWQgIm1ha2UgdW5pbnN0YWxsIiBmb3Igc2hhcmVkIGxpYnJhcmllcwotIHVzZSBUcmFjZXYgaW5zdGVhZCBvZiBUcmFjZSBpbiBpbmZibG9jay5jCi0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMKLSBzdXBwcmVzcyArdm5vY29tcGF0d2FybmluZ3MgaW4gY29uZmlndXJlIGZvciBIUFVYIChub3QgYWx3YXlzIHN1cHBvcnRlZCkKCkNoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQotIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCi0gcmV0dXJuIGVycm9yIGZvciBnenNlZWsgdG8gbmVnYXRpdmUgYWJzb2x1dGUgcG9zaXRpb24KLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQotIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCi0gZ2V0X2NyY190YWJsZSBhbmQgaW5mbGF0ZVN5bmNQb2ludCBhcmUgRVhQT1JUZWQgKEdpbGxlcyBWb2xsYW50KQotIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQotIGFkZGVkIG1hbiBwYWdlIHpsaWIuMyAoUmljayBSb2RnZXJzKQotIGZvciBjb250cmliL3VudGd6LCBmaXggbWFrZWRpcigpIGFuZCBpbXByb3ZlIE1ha2VmaWxlCgotIGNoZWNrIGd6c2VlayBpbiB3cml0ZSBtb2RlIGluIGV4YW1wbGUuYwotIGFsbG9jYXRlIGV4dHJhIGJ1ZmZlciBmb3Igc2Vla3Mgb25seSBpZiBnenNlZWsgaXMgYWN0dWFsbHkgY2FsbGVkCi0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKLSBhZGQgaW5mbGF0ZVN5bmNQb2ludCBpbiB6Y29uZi5oCi0gZml4IGxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIG50L3psaWIuZG50IGFuZCBtZHNvcy96bGliLmRlZgoKQ2hhbmdlcyBpbiAxLjAuNiAoMTkgSmFuIDE5OTgpCi0gYWRkIGZ1bmN0aW9ucyBnenByaW50ZiwgZ3pwdXRjLCBnemdldGMsIGd6dGVsbCwgZ3plb2YsIGd6c2VlaywgZ3pyZXdpbmQgYW5kCiAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKLSBGaXggYSBkZWZsYXRlIGJ1ZyBvY2N1cmluZyBvbmx5IHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMCAodGhhbmtzIHRvCiAgQW5keSBCdWNrbGVyIGZvciBmaW5kaW5nIHRoaXMgb25lKS4KLSBJbiBtaW5pZ3ppcCwgcGFzcyB0cmFuc3BhcmVudGx5IGFsc28gdGhlIGZpcnN0IGJ5dGUgZm9yIC5aIGZpbGVzLgotIHJldHVybiBaX0JVRl9FUlJPUiBpbnN0ZWFkIG9mIFpfT0sgaWYgb3V0cHV0IGJ1ZmZlciBmdWxsIGluIHVuY29tcHJlc3MoKQotIGNoZWNrIFpfRklOSVNIIGluIGluZmxhdGUgKHRoYW5rcyB0byBNYXJjIFNjaGx1cGVyKQotIEltcGxlbWVudCBkZWZsYXRlQ29weSAodGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8pCi0gbWFrZSBzdGF0aWMgbGlicmFyaWVzIGJ5IGRlZmF1bHQgaW4gY29uZmlndXJlLCBhZGQgLS1zaGFyZWQgb3B0aW9uLgotIG1vdmUgTVNET1Mgb3IgV2luZG93cyBzcGVjaWZpYyBmaWxlcyB0byBkaXJlY3RvcnkgbXNkb3MKLSBzdXBwcmVzcyB0aGUgbm90aW9uIG9mIHBhcnRpYWwgZmx1c2ggdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQogIChidXQgdGhlIHN5bWJvbCBaX1BBUlRJQUxfRkxVU0ggaXMga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMC40KQotIHN1cHByZXNzIGhpc3RvcnkgYnVmZmVyIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKICAodGhpcyBmZWF0dXJlIHdhcyBub3QgaW1wbGVtZW50ZWQgYW55d2F5IGluIDEuMC40KQotIG5leHRfaW4gYW5kIGF2YWlsX2luIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaW5mbGF0ZUluaXQgb3IKICBpbmZsYXRlSW5pdDIKLSBhZGQgRVhQT1JUIGluIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgKGZvciBXaW5kb3dzIERMTCkKLSBhZGRlZCBNYWtlZmlsZS5udCAodGhhbmtzIHRvIFN0ZXBoZW4gV2lsbGlhbXMpCi0gYWRkZWQgdGhlIHVuc3VwcG9ydGVkICJjb250cmliIiBkaXJlY3Rvcnk6CiAgIGNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CiAgICAgICAgMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCiAgIGNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgogICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCiAgIGNvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KICAgICAgICBBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKICAgY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgogICAgICAgIEEgdmVyeSBzaW1wbGUgdGFyLmd6IGZpbGUgZXh0cmFjdG9yIHVzaW5nIHpsaWIKICAgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CiAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCi0gcGFzcyBwYXJhbXMgLWYgKGZpbHRlcmVkIGRhdGEpLCAtaCAoaHVmZm1hbiBvbmx5KSwgLTEgdG8gLTkgKGNvbXByZXNzaW9uCiAgbGV2ZWwpIGluIG1pbmlnemlwICh0aGFua3MgdG8gVG9tIExhbmUpCgotIHVzZSBjb25zdCBmb3Igcm9tbWFibGUgY29uc3RhbnRzIGluIGRlZmxhdGUKLSBhZGRlZCB0ZXN0IGZvciBnenNlZWsgYW5kIGd6dGVsbCBpbiBleGFtcGxlLmMKLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQoKSAoaGFjayBmb3IgUGF1bCBNYWNrZXJyYXMpCi0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiB6RXJyb3IgdG8gY29udmVydCBlcnJvciBjb2RlIHRvIHN0cmluZwogIChmb3IgVGltIFNtaXRoZXJzKQotIEFsbG93IGNvbXBpbGF0aW9uIG9mIGd6aW8gd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCi0gVXNlIGRlZmF1bHQgbWVtY3B5IGZvciBTeW1hbnRlYyBNU0RPUyBjb21waWxlci4KLSBBZGQgRVhQT1JUIGtleXdvcmQgZm9yIGNoZWNrX2Z1bmMgKG5lZWRlZCBmb3IgV2luZG93cyBETEwpCi0gYWRkIGN1cnJlbnQgZGlyZWN0b3J5IHRvIExEX0xJQlJBUllfUEFUSCBmb3IgIm1ha2UgdGVzdCIKLSBjcmVhdGUgYWxzbyBhIGxpbmsgZm9yIGxpYnouc28uMQotIGFkZGVkIHN1cHBvcnQgZm9yIEZVSklUU1UgVVhQL0RTICh0aGFua3MgdG8gVG9zaGlha2kgTm9tdXJhKQotIHVzZSAkKFNIQVJFRExJQikgaW5zdGVhZCBvZiBsaWJ6LnNvIGluIE1ha2VmaWxlLmluIChmb3IgSFBVWCkKLSBhZGRlZCAtc29uYW1lIGZvciBMaW51eCBpbiBjb25maWd1cmUgKENodW4tQ2h1bmcgQ2hlbiwKLSBhc3NpZ24gbnVtYmVycyB0byB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIHpsaWIuZGVmIChmb3IgV2luZG93cyBETEwpCi0gYWRkIGFkdmljZSBpbiB6bGliLmggZm9yIGJlc3QgdXNhZ2Ugb2YgZGVmbGF0ZVNldERpY3Rpb25hcnkKLSB3b3JrIGFyb3VuZCBjb21waWxlciBidWcgb24gQXRhcmkgKGNhc3QgWl9OVUxMIGluIGNhbGwgb2Ygcy0+Y2hlY2tmbikKLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkIGZvciBUdXJib0MgaW4gbGFyZ2UgbW9kZWwKLSBhdm9pZCAidmVyc2lvblN0cmluZyJbMF0gKEJvcmxhbmQgYnVnKQotIGFkZCBORUVEX0RVTU1ZX1JFVFVSTiBmb3IgQm9ybGFuZAotIHVzZSB2YXJpYWJsZSB6X3ZlcmJvc2UgZm9yIHRyYWNpbmcgaW4gZGVidWcgbW9kZSAoTC4gUGV0ZXIgRGV1dHNjaCkuCi0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDQwotIGRlZmluZWQgU1REQyBmb3IgT1MvMiAoRGF2aWQgQ2hhcmxhcCkKLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQotIGluIG1pbmlnemlwLmMsIHVzZSBzdGF0aWMgYnVmZmVycyBvbmx5IGZvciAxNi1iaXQgc3lzdGVtcwotIGZpeCBzdWZmaXggY2hlY2sgZm9yICJtaW5pZ3ppcCAtZCBmb28uZ3oiCi0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpCi0gdXNlIF9mZG9wZW4gaW5zdGVhZCBvZiBmZG9wZW4gZm9yIE1TQyA+PSA2LjAgKFRob21hcyBGYW5zbGF1KQotIGFkZGVkIG1ha2VsY2MuYmF0IGZvciBsY2Mtd2luMzIgKFRvbSBTdCBEZW5pcykKLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkKLSBBdm9pZCBleHBhbmRlZCAkSWQkLiBVc2UgInJjcyAta2IiIG9yICJjdnMgYWRtaW4gLWtiIiB0byBhdm9pZCBJZCBleHBhbnNpb24uCi0gY2hlY2sgZm9yIHVuaXN0ZC5oIGluIGNvbmZpZ3VyZSAoZm9yIG9mZl90KQotIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlCi0gYXZvaWQgdXNlbGVzcyBhc3NpZ25tZW50IG9mIHMtPmNoZWNrIHRvIGl0c2VsZiBpbiBpbmZsYXRlX2Jsb2Nrc19uZXcKLSBkbyBub3QgZmx1c2ggdHdpY2UgaW4gZ3pjbG9zZSAodGhhbmtzIHRvIEtlbiBSYWVidXJuKQotIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaAotIHVzZSBOT19FUlJOT19IIGluc3RlYWQgb2YgZW51bWVyYXRpb24gb2Ygb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBlcnJuby5oCi0gd29yayBhcm91bmQgYnVnZ3kgZmNsb3NlIG9uIHBpcGVzIGZvciBIUC9VWAotIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCi0gZml4IGNvbmZpZ3VyZSBpZiBDQyBpcyBhbHJlYWR5IGVxdWFsIHRvIGdjYwoKQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpCi0gRml4IGluZmxhdGUgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgd2hlbiBmZWQgY29ycnVwdGVkIG9yIGludmFsaWQgZGF0YQotIFVzZSBjb25zdCBmb3Igcm9tbWFibGUgY29uc3RhbnRzIGluIGluZmxhdGUKLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQotIFJlbW92ZWQgc29tZSB2ZXN0aWdpYWwgY29kZSBpbiBpbmZsYXRlCi0gVXBkYXRlIHdlYiBhZGRyZXNzIGluIFJFQURNRQoKQ2hhbmdlcyBpbiAxLjAuNCAoMjQgSnVsIDk2KQotIEluIHZlcnkgcmFyZSBjb25kaXRpb25zLCBkZWZsYXRlKHMsIFpfRklOSVNIKSBjb3VsZCBmYWlsIHRvIHByb2R1Y2UgYW4gRU9GCiAgYml0LCBzbyB0aGUgZGVjb21wcmVzc29yIGNvdWxkIGRlY29tcHJlc3MgYWxsIHRoZSBjb3JyZWN0IGRhdGEgYnV0IHdlbnQKICBvbiB0byBhdHRlbXB0IGRlY29tcHJlc3NpbmcgZXh0cmEgZ2FyYmFnZSBkYXRhLiBUaGlzIGFmZmVjdGVkIG1pbmlnemlwIHRvby4KLSB6bGliVmVyc2lvbiBhbmQgZ3plcnJvciByZXR1cm4gY29uc3QgY2hhciogKG5lZWRlZCBmb3IgRExMKQotIHBvcnQgdG8gUklTQ09TIChubyBmZG9wZW4sIG5vIG11bHRpcGxlIGRvdHMsIG5vIHVubGluaywgbm8gZmlsZW5vKQotIHVzZSB6X2Vycm9yIG9ubHkgZm9yIERFQlVHIChhdm9pZCBwcm9ibGVtIHdpdGggRExMcykKCkNoYW5nZXMgaW4gMS4wLjMgKDIgSnVsIDk2KQotIHVzZSB6X3N0cmVhbXAgaW5zdGVhZCBvZiB6X3N0cmVhbSAqLCB3aGljaCBpcyBub3cgYSBmYXIgcG9pbnRlciBpbiBNU0RPUwogIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWxzOyB0aGlzIG1ha2VzIHRoZSBsaWJyYXJ5IGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzCiAgdmVyc2lvbnMgZm9yIHRoZXNlIG1vZGVscy4gKE5vIGVmZmVjdCBpbiBsYXJnZSBtb2RlbCBvciBvbiBvdGhlciBzeXN0ZW1zLikKLSByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgaWYgcHJldmlvdXMgZGVmbGF0ZSBjYWxsIHJldHVybmVkIHdpdGgKICBhdmFpbF9vdXQgYXMgemVybyBidXQgdGhlcmUgaXMgbm90aGluZyB0byBkbwotIGFkZGVkIG1lbWNtcCBmb3Igbm9uIFNUREMgY29tcGlsZXJzCi0gZGVmaW5lIE5PX0RVTU1ZX0RFQ0wgZm9yIG1vcmUgTWFjIGNvbXBpbGVycyAoLmggZmlsZXMgbWVyZ2VkIGluY29ycmVjdGx5KQotIGRlZmluZSBfXzMyQklUX18gaWYgX18zODZfXyBvciBpMzg2IGlzIGRlZmluZWQgKHBiLiB3aXRoIFdhdGNvbSBhbmQgU0NPKQotIGJldHRlciBjaGVjayBmb3IgMTYtYml0IG1vZGUgTVNDIChhdm9pZHMgcHJvYmxlbSB3aXRoIFN5bWFudGVjKQoKQ2hhbmdlcyBpbiAxLjAuMiAoMjMgTWF5IDk2KQotIGFkZGVkIFdpbmRvd3MgRExMIHN1cHBvcnQKLSBhZGRlZCBhIGZ1bmN0aW9uIHpsaWJWZXJzaW9uIChmb3IgdGhlIERMTCBzdXBwb3J0KQotIGZpeGVkIGRlY2xhcmF0aW9ucyB1c2luZyBCeXRlZiBpbiBpbmZ1dGlsLmMgKHBiIHdpdGggTVNET1MgbWVkaXVtIG1vZGVsKQotIEJ5dGVmIGlzIGRlZmluZSdzIGluc3RlYWQgb2YgdHlwZWRlZidkIG9ubHkgZm9yIEJvcmxhbmQgQwotIGF2b2lkIHJlYWRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gZXhhbXBsZS5jCi0gbWVudGlvbiBpbiBSRUFETUUgdGhhdCB0aGUgemxpYiBmb3JtYXQgaXMgbm93IFJGQzE5NTAKLSB1cGRhdGVkIE1ha2VmaWxlLmRqMgotIGFkZGVkIGFsZ29yaXRobS5kb2MKCkNoYW5nZXMgaW4gMS4wLjEgKDIwIE1heSA5NikgWzEuMCBza2lwcGVkIHRvIGF2b2lkIGNvbmZ1c2lvbl0KLSBmaXggYXJyYXkgb3ZlcmxheSBpbiBkZWZsYXRlLmMgd2hpY2ggc29tZXRpbWVzIGNhdXNlZCBiYWQgY29tcHJlc3NlZCBkYXRhCi0gZml4IGluZmxhdGUgYnVnIHdpdGggZW1wdHkgc3RvcmVkIGJsb2NrCi0gZml4IE1TRE9TIG1lZGl1bSBtb2RlbCB3aGljaCB3YXMgYnJva2VuIGluIDAuOTkKLSBmaXggZGVmbGF0ZVBhcmFtcygpIHdoaWNoIGNvdWxkIGdlbmVyYXRlZCBiYWQgY29tcHJlc3NlZCBkYXRhLgotIEJ5dGVmIGlzIGRlZmluZSdkIGluc3RlYWQgb2YgdHlwZWRlZidlZCAod29yayBhcm91bmQgQm9ybGFuZCBidWcpCi0gYWRkZWQgYW4gSU5ERVggZmlsZQotIG5ldyBtYWtlZmlsZXMgZm9yIERKR1BQIChNYWtlZmlsZS5kajIpLCAzMi1iaXQgQm9ybGFuZCAoTWFrZWZpbGUuYjMyKSwKICBXYXRjb20gKE1ha2VmaWxlLndhdCksIEFtaWdhIFNBUy9DIChNYWtlZmlsZS5zYXMpCi0gc3BlZWQgdXAgYWRsZXIzMiBmb3IgbW9kZXJuIG1hY2hpbmVzIHdpdGhvdXQgYXV0by1pbmNyZW1lbnQKLSBhZGRlZCAtYW5zaSBmb3IgSVJJWCBpbiBjb25maWd1cmUKLSBzdGF0aWNfaW5pdF9kb25lIGluIHRyZWVzLmMgaXMgYW4gaW50Ci0gZGVmaW5lIHVubGluayBhcyBkZWxldGUgZm9yIFZNUwotIGZpeCBjb25maWd1cmUgZm9yIFFOWAotIGFkZCBjb25maWd1cmUgYnJhbmNoIGZvciBTQ08gYW5kIEhQVVgKLSBhdm9pZCBtYW55IHdhcm5pbmdzICh1bnVzZWQgdmFyaWFibGVzLCBkZWFkIGFzc2lnbm1lbnRzLCBldGMuLi4pCi0gbm8gZmRvcGVuIGZvciBCZU9TCi0gZml4IHRoZSBXYXRjb20gZml4IGZvciAzMiBiaXQgbW9kZSAoZGVmaW5lIEZBUiBhcyBlbXB0eSkKLSByZW1vdmVkIHJlZGVmaW5pdGlvbiBvZiBCeXRlIGZvciBNS1dFUktTCi0gd29yayBhcm91bmQgYW4gTVdLRVJLUyBidWcgKGluY29ycmVjdCBtZXJnZSBvZiBhbGwgLmggZmlsZXMpCgpDaGFuZ2VzIGluIDAuOTkgKDI3IEphbiA5NikKLSBhbGxvdyBwcmVzZXQgZGljdGlvbmFyeSBzaGFyZWQgYmV0d2VlbiBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IKLSBhbGxvdyBjb21wcmVzc2lvbiBsZXZlbCAwIChubyBjb21wcmVzc2lvbikKLSBhZGQgZGVmbGF0ZVBhcmFtcyBpbiB6bGliLmg6IGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsCiAgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LgotIHRlc3QgbGFyZ2UgYnVmZmVycyBhbmQgZGVmbGF0ZVBhcmFtcyBpbiBleGFtcGxlLmMKLSBhZGQgb3B0aW9uYWwgImNvbmZpZ3VyZSIgdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5Ci0gc3VwcHJlc3MgTWFrZWZpbGUucW54LCB1c2UgY29uZmlndXJlIGluc3RlYWQKLSBmaXhlZCBkZWZsYXRlIGZvciA2NC1iaXQgc3lzdGVtcyAoZGV0ZWN0ZWQgb24gQ3JheSkKLSBmaXhlZCBpbmZsYXRlX2Jsb2NrcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIEFscGhhKQotIGRlY2xhcmUgWl9ERUZMQVRFRCBpbiB6bGliLmggKHBvc3NpYmxlIHBhcmFtZXRlciBmb3IgZGVmbGF0ZUluaXQyKQotIGFsd2F5cyByZXR1cm4gWl9CVUZfRVJST1Igd2hlbiBkZWZsYXRlKCkgaGFzIG5vdGhpbmcgdG8gZG8KLSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG5vdyBtYWNyb3MgdG8gYWxsb3cgdmVyc2lvbiBjaGVja2luZwotIHByZWZpeCBhbGwgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdHlwZXMgd2l0aCB6XyB3aXRoIC1EWl9QUkVGSVgKLSBtYWtlIGZhbGxvYyBjb21wbGV0ZWx5IHJlZW50cmFudCAoaW5mdHJlZXMuYykKLSBmaXhlZCB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIGN0X3N0YXRpY19pbml0Ci0gZnJlZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb24gdG8gaGVscCBtZW1vcnkgbWFuYWdlcgotIHVzZSB6bGliLTEuMC8qIGluc3RlYWQgb2YgemxpYi8qIGluc2lkZSB0aGUgdGFyLmd6Ci0gbWFrZSB6bGliIHdhcm5pbmctZnJlZSB3aXRoICJnY2MgLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGgKICAtV2NvbnZlcnNpb24gLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyIKLSBhbGxvdyBnenJlYWQgb24gY29uY2F0ZW5hdGVkIC5neiBmaWxlcwotIGRlZmxhdGVFbmQgbm93IHJldHVybnMgWl9EQVRBX0VSUk9SIGlmIGl0IHdhcyBwcmVtYXR1cmUKLSBkZWZsYXRlIGlzIGZpbmFsbHkgKD8pIGZ1bGx5IGRldGVybWluaXN0aWMgKG5vIG1hdGNoZXMgYmV5b25kIGVuZCBvZiBpbnB1dCkKLSBEb2N1bWVudCBaX1NZTkNfRkxVU0gKLSBhZGQgdW5pbnN0YWxsIGluIE1ha2VmaWxlCi0gQ2hlY2sgZm9yIF9fY3BsdXBsdXMgaW4gemxpYi5oCi0gQmV0dGVyIHRlc3QgaW4gY3RfYWxpZ24gZm9yIHBhcnRpYWwgZmx1c2gKLSBhdm9pZCBoYXJtbGVzcyB3YXJuaW5ncyBmb3IgQm9ybGFuZCBDKysKLSBpbml0aWFsaXplIGhhc2hfaGVhZCBpbiBkZWZsYXRlLmMKLSBhdm9pZCB3YXJuaW5nIG9uIGZkb3BlbiAoZ3ppby5jKSBmb3IgSFAgY2MgLUFhCi0gaW5jbHVkZSBzdGRsaWIuaCBmb3IgU1REQyBjb21waWxlcnMKLSBpbmNsdWRlIGVycm5vLmggZm9yIENyYXkKLSBpZ25vcmUgZXJyb3IgaWYgcmFubGliIGRvZXNuJ3QgZXhpc3QKLSBjYWxsIHJhbmxpYiB0d2ljZSBmb3IgTmVYVFNURVAKLSB1c2UgZXhlY19wcmVmaXggaW5zdGVhZCBvZiBwcmVmaXggZm9yIGxpYnouYQotIHJlbmFtZWQgY3RfKiBhcyBfdHJfKiB0byBhdm9pZCBjb25mbGljdCB3aXRoIGFwcGxpY2F0aW9ucwotIGNsZWFyIHotPm1zZyBpbiBpbmZsYXRlSW5pdDIgYmVmb3JlIGFueSBlcnJvciByZXR1cm4KLSBpbml0aWFsaXplIG9wYXF1ZSBpbiBleGFtcGxlLmMsIGd6aW8uYywgZGVmbGF0ZS5jIGFuZCBpbmZsYXRlLmMKLSBmaXhlZCB0eXBvIGluIHpjb25mLmggKF9HTlVDX18gPT4gX19HTlVDX18pCi0gY2hlY2sgZm9yIFdJTjMyIGluIHpjb25mLmggYW5kIHp1dGlsLmMgKGF2b2lkIGZhcm1hbGxvYyBpbiAzMi1iaXQgbW9kZSkKLSBmaXggdHlwbyBpbiBNYWtlX3Ztcy5jb20gKGYkdHJubG5tIC0+IGYkZ2V0c3lpKQotIGluIGZjYWxsb2MsIG5vcm1hbGl6ZSBwb2ludGVyIGlmIHNpemUgPiA2NTUyMCBieXRlcwotIGRvbid0IHVzZSBzcGVjaWFsIGZjYWxsb2MgZm9yIDMyIGJpdCBCb3JsYW5kIEMrKwotIHVzZSBTVERDIGluc3RlYWQgb2YgX19HTzMyX18gdG8gYXZvaWQgcmVkZWNsYXJpbmcgZXhpdCwgY2FsbG9jLCBldGMuLi4KLSB1c2UgWl9CSU5BUlkgaW5zdGVhZCBvZiBCSU5BUlkKLSBkb2N1bWVudCB0aGF0IGd6Y2xvc2UgYWZ0ZXIgZ3pkb3BlbiB3aWxsIGNsb3NlIHRoZSBmaWxlCi0gYWxsb3cgImEiIGFzIG1vZGUgaW4gZ3pvcGVuLgotIGZpeCBlcnJvciBjaGVja2luZyBpbiBnenJlYWQKLSBhbGxvdyBza2lwcGluZyAuZ3ogZXh0cmEtZmllbGQgb24gcGlwZXMKLSBhZGRlZCByZWZlcmVuY2UgdG8gUGVybCBpbnRlcmZhY2UgaW4gUkVBRE1FCi0gcHV0IHRoZSBjcmMgdGFibGUgaW4gRkFSIGRhdGEgKEkgZGlzbGlrZSBtb3JlIGFuZCBtb3JlIHRoZSBtZWRpdW0gbW9kZWwgOikKLSBhZGRlZCBnZXRfY3JjX3RhYmxlCi0gYWRkZWQgYSBkaW1lbnNpb24gdG8gYWxsIGFycmF5cyAoQm9ybGFuZCBDIGNhbid0IGNvdW50KS4KLSB3b3JrYXJvdW5kIEJvcmxhbmQgQyBidWcgaW4gZGVjbGFyYXRpb24gb2YgaW5mbGF0ZV9jb2Rlc19uZXcgJiBpbmZsYXRlX2Zhc3QKLSBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiBvZiAqLmggKGZvciBwcmVjb21waWxlZCBoZWFkZXIgb24gTWFjKQotIFdhdGNvbSBDIHByZXRlbmRzIHRvIGJlIE1pY3Jvc29mdCBDIHNtYWxsIG1vZGVsIGV2ZW4gaW4gMzIgYml0IG1vZGUuCi0gZG9uJ3QgdXNlIHVuc2l6ZWQgYXJyYXlzIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIGJ5IFZpc3VhbCBDKys6CiAgICAgd2FybmluZyBDNDc0NjogJ2luZmxhdGVfbWFzaycgOiB1bnNpemVkIGFycmF5IHRyZWF0ZWQgYXMgICdfX2ZhcicKICAgICAod2hhdCdzIHdyb25nIHdpdGggZmFyIGRhdGEgaW4gZmFyIG1vZGVsPykuCi0gZGVmaW5lIGVudW0gb3V0IG9mIGluZmxhdGVfYmxvY2tzX3N0YXRlIHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQysrCgpDaGFuZ2VzIGluIDAuOTUgKDE2IEF1ZyA5NSkKLSBmaXggTVNET1Mgc21hbGwgYW5kIG1lZGl1bSBtb2RlbCAobm93IGVhc2llciB0byBhZGFwdCB0byBhbnkgY29tcGlsZXIpCi0gaW5saW5lZCBzZW5kX2JpdHMKLSBmaXggdGhlIGZpbmFsICg6LSkgYnVnIGZvciBkZWZsYXRlIHdpdGggZmx1c2ggKG91dHB1dCB3YXMgY29ycmVjdCBidXQKICBub3QgY29tcGxldGVseSBmbHVzaGVkIGluIHJhcmUgb2NjYXNpb25zKS4KLSBkZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNhbWUgZm9yIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCiAgKGl0J3Mgbm93IHN1ZmZpY2llbnQgdG8gc2V0IE1BWF9XQklUUyBpbiB6Y29uZi5oKS4KLSB2b2lkcCAtPiB2b2lkcGYgYW5kIHZvaWRucCAtPiB2b2lkcCAoZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIKICB0eXBlZGVmcyBhbmQgYmVjYXVzZSB2b2lkbnAgd2FzIG5vdCBuZWFyIGluIGxhcmdlIG1vZGVsKS4KCkNoYW5nZXMgaW4gMC45NCAoMTMgQXVnIDk1KQotIHN1cHBvcnQgTVNET1MgbWVkaXVtIG1vZGVsCi0gZml4IGRlZmxhdGUgd2l0aCBmbHVzaCAoY291bGQgc29tZXRpbWVzIGdlbmVyYXRlIGJhZCBvdXRwdXQpCi0gZml4IGRlZmxhdGVSZXNldCAoemxpYiBoZWFkZXIgd2FzIGluY29ycmVjdGx5IHN1cHByZXNzZWQpCi0gYWRkZWQgc3VwcG9ydCBmb3IgVk1TCi0gYWxsb3cgYSBjb21wcmVzc2lvbiBsZXZlbCBpbiBnem9wZW4oKQotIGd6Zmx1c2ggbm93IGNhbGxzIGZmbHVzaAotIEZvciBkZWZsYXRlIHdpdGggZmx1c2gsIGZsdXNoIGV2ZW4gaWYgbm8gbW9yZSBpbnB1dCBpcyBwcm92aWRlZC4KLSByZW5hbWUgbGliZ3ouYSBhcyBsaWJ6LmEKLSBhdm9pZCBjb21wbGV4IGV4cHJlc3Npb24gaW4gaW5mY29kZXMuYyB0cmlnZ2VyaW5nIFR1cmJvIEMgYnVnCi0gd29yayBhcm91bmQgYSBwcm9ibGVtIHdpdGggZ2NjIG9uIEFscGhhIChpbiBJTlNFUlRfU1RSSU5HKQotIGRvbid0IHVzZSBpbmxpbmUgZnVuY3Rpb25zIChwcm9ibGVtIHdpdGggc29tZSBnY2MgdmVyc2lvbnMpCi0gYWxsb3cgcmVuYW1pbmcgb2YgQnl0ZSwgdUludCwgZXRjLi4uIHdpdGggI2RlZmluZS4KLSBhdm9pZCB3YXJuaW5nIGFib3V0ICh1bnVzZWQpIHBvaW50ZXIgYmVmb3JlIHN0YXJ0IG9mIGFycmF5IGluIGRlZmxhdGUuYwotIGF2b2lkIHZhcmlvdXMgd2FybmluZ3MgaW4gZ3ppby5jLCBleGFtcGxlLmMsIGluZmJsb2NrLmMsIGFkbGVyMzIuYywgenV0aWwuYwotIGF2b2lkIHJlc2VydmVkIHdvcmQgJ25ldycgaW4gdHJlZXMuYwoKQ2hhbmdlcyBpbiAwLjkzICgyNSBKdW5lIDk1KQotIHRlbXBvcmFyaWx5IGRpc2FibGUgaW5saW5lIGZ1bmN0aW9ucwotIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljCi0gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBQQVJUSUFMX0ZMVVNICi0gU2V0IGJpbmFyeSBtb2RlIGZvciBzdGRpbi9zdGRvdXQgaW4gbWluaWd6aXAuYyBmb3IgT1MvMgotIGRvbid0IGV2ZW4gdXNlIHNpZ25lZCBjaGFyIGluIGluZmxhdGUgKG5vdCBwb3J0YWJsZSBlbm91Z2gpCi0gZml4IGluZmxhdGUgbWVtb3J5IGxlYWsgZm9yIHNlZ21lbnRlZCBhcmNoaXRlY3R1cmVzCgpDaGFuZ2VzIGluIDAuOTIgKDMgTWF5IDk1KQotIGRvbid0IGFzc3VtZSB0aGF0IGNoYXIgaXMgc2lnbmVkIChwcm9ibGVtIG9uIFNHSSkKLSBDbGVhciBiaXQgYnVmZmVyIHdoZW4gc3RhcnRpbmcgYSBzdG9yZWQgYmxvY2sKLSBubyBtZW1jcHkgb24gUHlyYW1pZAotIHN1cHByZXNzZWQgaW5mdGVzdC5jCi0gb3B0aW1pemVkIGZpbGxfd2luZG93LCBwdXQgbG9uZ2VzdF9tYXRjaCBpbmxpbmUgZm9yIGdjYwotIG9wdGltaXplZCBpbmZsYXRlIG9uIHN0b3JlZCBibG9ja3MuCi0gdW50YWJpZnkgYWxsIHNvdXJjZXMgdG8gc2ltcGxpZnkgcGF0Y2hlcwoKQ2hhbmdlcyBpbiAwLjkxICgyIE1heSA5NSkKLSBEZWZhdWx0IE1FTV9MRVZFTCBpcyA4IChub3QgOSBmb3IgVW5peCkgYXMgZG9jdW1lbnRlZCBpbiB6bGliLmgKLSBEb2N1bWVudCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBpbiB6Y29uZi5oCi0gYWRkZWQgIm1ha2UgaW5zdGFsbCIKLSBmaXggc3luYyBzZWFyY2ggbG9naWMgaW4gaW5mbGF0ZVN5bmMKLSBkZWZsYXRlKFpfRlVMTF9GTFVTSCkgbm93IHdvcmtzIGV2ZW4gaWYgb3V0cHV0IGJ1ZmZlciB0b28gc2hvcnQKLSBhZnRlciBpbmZsYXRlU3luYywgZG9uJ3Qgc2NhcmUgcGVvcGxlIHdpdGgganVzdCAibG8gd29ybGQiCi0gYWRkZWQgc3VwcG9ydCBmb3IgREpHUFAKCkNoYW5nZXMgaW4gMC45ICgxIE1heSA5NSkKLSBkb24ndCBhc3N1bWUgdGhhdCB6YWxsb2MgY2xlYXJzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICh0aGUgVHVyYm9DIGJ1ZwogIHdhcyBNYXJrJ3MgYnVnIGFmdGVyIGFsbCA6KQotIGxldCBhZ2FpbiBnenJlYWQgY29weSB1bmNvbXByZXNzZWQgZGF0YSB1bmNoYW5nZWQgKHdhcyB3b3JraW5nIGluIDAuNzEpCi0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpLCBpbmZsYXRlUmVzZXQgYW5kIGluZmxhdGVTeW5jIGFyZSBub3cgZnVsbHkgaW1wbGVtZW50ZWQKLSBhZGRlZCBhIHRlc3Qgb2YgaW5mbGF0ZVN5bmMgaW4gZXhhbXBsZS5jCi0gbW92ZWQgTUFYX1dCSVRTIHRvIHpjb25mLmggYmVjYXVzZSB1c2VycyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGF0LgotIGRvY3VtZW50IGV4cGxpY2l0bHkgdGhhdCB6YWxsb2MoNjRLKSBvbiBNU0RPUyBtdXN0IHJldHVybiBhIG5vcm1hbGl6ZWQKICBwb2ludGVyICh6ZXJvIG9mZnNldCkKLSBhZGRlZCBNYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBDLCBUdXJibyBDLCBCb3JsYW5kIEMrKwotIGZhc3RlciBjcmMzMigpCgpDaGFuZ2VzIGluIDAuOCAoMjkgQXByaWwgOTUpCi0gYWRkZWQgZmFzdCBpbmZsYXRlIChpbmZmYXN0LmMpCi0gZGVmbGF0ZShaX0ZJTklTSCkgbm93IHJldHVybnMgWl9TVFJFQU1fRU5EIHdoZW4gZG9uZS4gV2FybmluZzogdGhpcwogIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHpsaWIgd2hpY2ggcmV0dXJuZWQgWl9PSy4KLSB3b3JrIGFyb3VuZCBhIFR1cmJvQyBjb21waWxlciBidWcgKGJhZCBjb2RlIGZvciBiIDw8IDAsIHNlZSBpbmZ1dGlsLmgpCiAgKGFjdHVhbGx5IHRoYXQgd2FzIG5vdCBhIGNvbXBpbGVyIGJ1Zywgc2VlIDAuODEgYWJvdmUpCi0gZ3pyZWFkIG5vIGxvbmdlciByZWFkcyBvbmUgZXh0cmEgYnl0ZSBpbiBjZXJ0YWluIGNhc2VzCi0gSW4gZ3ppbyBkZXN0cm95KCksIGRvbid0IHJlZmVyZW5jZSBhIGZyZWVkIHN0cnVjdHVyZQotIGF2b2lkIG1hbnkgd2FybmluZ3MgZm9yIE1TRE9TCi0gYXZvaWQgdGhlIEVSUk9SIHN5bWJvbCB3aGljaCBpcyB1c2VkIGJ5IE1TIFdpbmRvd3MKCkNoYW5nZXMgaW4gMC43MSAoMTQgQXByaWwgOTUpCi0gRml4ZWQgbW9yZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcyA6KCBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB3aXRoCiAgVHVyYm9DIGxhcmdlIG1vZGVsLgoKQ2hhbmdlcyBpbiAwLjcgKDE0IEFwcmlsIDk1KQotIEFkZGVkIGZ1bGwgaW5mbGF0ZSBzdXBwb3J0LgotIFNpbXBsaWZpZWQgdGhlIGNyYzMyKCkgaW50ZXJmYWNlLiBUaGUgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcKICAob25lJ3MgY29tcGxlbWVudCkgaXMgbm93IGRvbmUgaW5zaWRlIGNyYzMyKCkuIFdBUk5JTkc6IHRoaXMgaXMKICBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9uczsgc2VlIHpsaWIuaCBmb3IgdGhlIG5ldyB1c2FnZS4KCkNoYW5nZXMgaW4gMC42MSAoMTIgQXByaWwgOTUpCi0gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gVHVyYm9DLiBleGFtcGxlIGFuZCBtaW5pZ3ppcCBub3cgd29yayBvbiBNU0RPUy4KCkNoYW5nZXMgaW4gMC42ICgxMSBBcHJpbCA5NSkKLSBhZGRlZCBtaW5pZ3ppcC5jCi0gYWRkZWQgZ3pkb3BlbiB0byByZW9wZW4gYSBmaWxlIGRlc2NyaXB0b3IgYXMgZ3pGaWxlCi0gYWRkZWQgdHJhbnNwYXJlbnQgcmVhZGluZyBvZiBub24tZ3ppcGVkIGZpbGVzIGluIGd6cmVhZC4KLSBmaXhlZCBidWcgaW4gZ3pyZWFkIChkb24ndCByZWFkIGNyYyBhcyBkYXRhKQotIGZpeGVkIGJ1ZyBpbiBkZXN0cm95IChnemlvLmMpIChkb24ndCByZXR1cm4gWl9TVFJFQU1fRU5EIGZvciBnemNsb3NlKS4KLSBkb24ndCBhbGxvY2F0ZSBiaWcgYXJyYXlzIGluIHRoZSBzdGFjayAoZm9yIE1TRE9TKQotIGZpeCBzb21lIE1TRE9TIGNvbXBpbGF0aW9uIHByb2JsZW1zCgpDaGFuZ2VzIGluIDAuNToKLSBkbyByZWFsIGNvbXByZXNzaW9uIGluIGRlZmxhdGUuYy4gWl9QQVJUSUFMX0ZMVVNIIGlzIHN1cHBvcnRlZCBidXQKICBub3QgeWV0IFpfRlVMTF9GTFVTSC4KLSBzdXBwb3J0IGRlY29tcHJlc3Npb24gYnV0IG9ubHkgaW4gYSBzaW5nbGUgc3RlcCAoZm9yY2VkIFpfRklOSVNIKQotIGFkZGVkIG9wYXF1ZSBvYmplY3QgZm9yIHphbGxvYyBhbmQgemZyZWUuCi0gYWRkZWQgZGVmbGF0ZVJlc2V0IGFuZCBpbmZsYXRlUmVzZXQKLSBhZGRlZCBhIHZhcmlhYmxlIHpsaWJfdmVyc2lvbiBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuCi0gcmVuYW1lZCB0aGUgJ2ZpbHRlcicgcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0MiBhcyAnc3RyYXRlZ3knLgogIEFkZGVkIFpfRklMVEVSRUQgYW5kIFpfSFVGRk1BTl9PTkxZIGNvbnN0YW50cy4KCkNoYW5nZXMgaW4gMC40OgotIGF2b2lkICJ6aXAiIGV2ZXJ5d2hlcmUsIHVzZSB6bGliIGluc3RlYWQgb2YgemlwbGliLgotIHN1cHByZXNzIFpfQkxPQ0tfRkxVU0gsIGludGVycHJldCBaX1BBUlRJQUxfRkxVU0ggYXMgYmxvY2sgZmx1c2gKICBpZiBjb21wcmVzc2lvbiBtZXRob2QgPT0gOC4KLSBhZGRlZCBhZGxlcjMyIGFuZCBjcmMzMgotIHJlbmFtZWQgZGVmbGF0ZU9wdGlvbnMgYXMgZGVmbGF0ZUluaXQyLCBjYWxsIG9uZSBvciB0aGUgb3RoZXIgYnV0IG5vdCBib3RoCi0gYWRkZWQgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0Mi4KLSBhZGRlZCBpbmZsYXRlSW5pdDIKLSBzaW1wbGllZCBjb25zaWRlcmFibHkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGJ5IG5vdCBzdXBwb3J0aW5nCiAgdXNlci1wcm92aWRlZCBoaXN0b3J5IGJ1ZmZlci4gVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBpbiBkZWZsYXRlSW5pdDIKICBhbmQgaW5mbGF0ZUluaXQyLgoKQ2hhbmdlcyBpbiAwLjM6Ci0gcHJlZml4IGFsbCBtYWNybyBuYW1lcyB3aXRoIFpfCi0gdXNlIFpfRklOSVNIIGluc3RlYWQgb2YgZGVmbGF0ZUVuZCB0byBmaW5pc2ggY29tcHJlc3Npb24uCi0gYWRkZWQgWl9IVUZGTUFOX09OTFkKLSBhZGRlZCBnemVycm9yKCkK