ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpEYW5pZWwgKDQgRGVjZW1iZXIgMjAwMSkKLSBJbmNvcnBvcmF0ZWQgbW9yZSBtYWNvcyBmaXhlcyBhbmQgYWRkZWQgZm91ciBzcGVjaWZpYyBmaWxlcyBpbiBhIG5ldwogIHN1YmRpcmVjdG9yeSBiZWxvdyBzcmMuCgpEYW5pZWwgKDMgRGVjZW1iZXIgMjAwMSkKLSBFcmljIExhdmlnbmUgcmVwb3J0ZWQgdHdvIHByb2JsZW1zOgoKICBGaXJzdCBvbmUgaW4gdGhlIGN1cmxfc3RybmVxdWFsKCkgZnVuY3Rpb24uIEkgdGhpbmsgdGhpcyBwcm9ibGVtIGlzIHJhdGhlcgogIG1hY29zIDkgc3BlY2lmaWMsIGFzIG1vc3QgcGxhdGZvcm0gcHJvdmlkZXMgYSBmdW5jdGlvbiB0byB1c2UgaW5zdGVhZCBvZiB0aGUKICBvbmUgcHJvdmlkZWQgYnkgbGliY3VybC4KCiAgQSBzZWNvbmQsIG1vcmUgaW1wb3J0YW50LCB3YXMgaW4gdGhlIHdheSB3ZSB0YWtlIGNhcmUgb2YgRlRQIHJlc3BvbnNlcy4gVGhlCiAgY29kZSB3b3VsZCByZWFkIGEgbGFyZ2UgY2h1bmsgb2YgZGF0YSBhbmQgc2VhcmNoIGZvciB0aGUgZW5kLW9mLXJlc3BvbnNlCiAgbGluZSB3aXRoaW4gdGhhdCBjaHVuay4gV2hlbiBmb3VuZCwgaXQgd291bGQganVzdCBza2lwIHRoZSByZXN0IG9mIHRoZQogIGRhdGEuIEhvd2V2ZXIsIHdoZW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbnMgYXJlIHNwZWNpYWwsIG9yIHBlcmhhcHMgdGhlCiAgc2VydmVyIGlzLCB3ZSBjb3VsZCBhY3R1YWxseSBnZXQgbW9yZSB0aGFuIG9uZSByZXNwb25zZSBpbiB0aGF0IGNodW5rIG9mCiAgZGF0YSBzbyB0aGF0IHdoZW4gdGhlIG5leHQgaW52b2tlIHRvIHRoaXMgZnVuY3Rpb24gd2FzIGRvbmUsIHRoZSByZXNwb25zZQogIGhhZCBhbHJlYWR5IGJlZW4gcmVhZCBhbmQgdGhyb3duIGF3YXkuIE5vdywgd2UgY2FjaGUgdGhlIGRhdGEgbm90IHVzZWQgaW4KICBvbmUgY2FsbCwgYXMgaXQgY291bGQgYmUgdXNlZnVsIGluIHRoZSBzdWJzZXF1ZW50IGNhbGwuIFRlc3QgY2FzZSAxMjYgd2FzCiAgYWRkZWQgYW5kIHRoZSB0ZXN0IGZ0cCBzZXJ2ZXIgbW9kaWZpZWQsIHRvIGV4ZXJjaXNlIHRoaXMgcGFydGljdWxhciBjYXNlLgoKVmVyc2lvbiA3LjkuMi1wcmU4CgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwMSkKLSBCdWcgcmVwb3J0ICM0ODc4MjUgY29ycmVjdGx5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQKICBmb2xsb3dpbmcgYSByZWRpcmVjdGlvbiBmcm9tIEhUVFAgdG8gSFRUUFMuIGxpYmN1cmwgdGhlbiByZS11c2VkIHRoZSBzYW1lCiAgcHJveHkgY29ubmVjdGlvbiBidXQgd2l0aG91dCBkb2luZyBhIHByb3BlciBIVFRQUyByZXF1ZXN0LgoKLSBGaXhlZCB3aW4zMiBjb21waWxpbmcgcXVpcmtzLgoKVmVyc2lvbiA3LjkuMi1wcmU3CgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDEpCi0gRG9jdW1lbnRlZCAtLWRpc2FibGUtZXBzdiBhbmQgQ1VSTE9QVF9GVFBfVVNFX0VQU1YuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDEpCi0gQWRkZWQgLS1kaXNhYmxlLWVwc3YgYXMgYW4gb3B0aW9uLiBXaGVuIHVzZWQsIGN1cmwgd29uJ3QgYXR0ZW1wdCB0byB1c2UgdGhlCiAgRVBTViBjb21tYW5kIHdoZW4gZG9pbmcgcGFzc2l2ZSBGVFAgZG93bmxvYWRzLiBXcm90ZSBhIHRlc3QgY2FzZSBmb3IgaXQuCgotIEVyaWMgcHJvdmlkZWQgYSBmZXcgbW9yZSBmaXhlcyBmb3IgYnVpbGRpbmcgb24gTWFjcy4gSGUgYWxzbyBwb2ludGVkIG91dAogIGEgZmxhdyBpbiB0aGUgc2lnbmFsIGhhbmRsZXIgcmVzdG9yYXRpb24gY29kZS4KCkRhbmllbCAoMjggTm92ZW1iZXIgMjAwMSkKLSBGaWRkbGVkIHdpdGggc29tZSBUcnU2NCBwcm9ibGVtcyByZXBvcnRlZCBieSBEaW1pdHJpcyBTYXJyaXMuIFRoZXkgYXBwZWFyZWQKICBvbmx5IHdoZW4gdXNpbmcgVkVSQk9TRSBmdHAgdHJhbnNmZXJzLiBEbyB3ZSB1c2UgYSB0b28gc21hbGwgYnVmZmVyIGZvcgogIGdldGhvc3RieWFkZHJfcigpLCB3YXMgdGhlIGxhY2sgb2YgdXNpbmcgaW5fYWRkcl90IHdyb25nIG9yIGlzIGl0IHRoYXQgdGhlCiAgaG9zdGVudCBzdHJ1Y3QgbXVzdCBiZSBibGFua2VkIGJlZm9yZSB1c2U/IFdpdGggRGltaXRyaXMgaGVscCBhbmQgdGhlc2UKICBwYXRjaGVzLCB0aGUgcHJvYmxlbXMgc2VlbSB0byBiZSBoaXN0b3J5LgoKLSBDVVJMT1BUX0ZUUF9VU0VfRVBTViB3YXMgYWRkZWQgYW5kIGNhbiBiZSBzZXQgdG8gRkFMU0UgdG8gcHJldmVudCBsaWJjdXJsCiAgZnJvbSB1c2luZyB0aGUgRVBTViBjb21tYW5kIGJlZm9yZSB0cnlpbmcgdGhlIG5vcm1hbCBQQVNWLiBIZWlra2kgS29ycGVsYQogIHBvaW50ZWQgb3V0IHRoYXQgc29tZSBmaXJld2FsbHMgYW5kIHNpbWlsYXIgZG9uJ3QgbGlrZSB0aGUgRVBTViBzbyB3ZSBtdXN0CiAgYmUgYWJsZSB0byBzaHV0IGlmIG9mZiB0byB3b3JrIGV2ZXJ5d2hlcmUuCgotIEkgYWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yICdpbl9hZGRyX3QnIGFuZCBtYWRlIHRoZSBmdHAgY29kZSB1c2UgdGhhdCB0bwogIHJlY2VpdmUgdGhlIGluZXRfYWRkcigpIHJldHVybiBjb2RlIGluLiBXb3JrcyBvbiBTb2xhcmlzIGFuZCBMaW51eCBhdAogIGxlYXN0LiBUaGUgTGludXggbWFuIHBhZ2UgZm9yIGluZXRfYWRkcigpIGRvZXNuJ3QgZXZlbiBtZW50aW9uIGluX2FkZHJfdC4uLgoKLSBBZGp1c3RlZCAoYWxtb3N0KSBhbGwgRlRQIHRlc3RzIHRvIHRoZSBuZXcgY29tbWFuZCBzZXF1ZW5jZS4KCi0gRlRQIGNvbW1hbmQgc2VxdWVuY2UgY2hhbmdlczoKCiAgRVBTViBpcyBub3cgYWx3YXlzIGF0dGVtcHRlZCBiZWZvcmUgUEFTVi4gSXQgaXMgdGhlIGZpbmFsIHRvdWNoIHRvIG1ha2UgSVB2NgogIHBhc3NpdmUgRlRQIGRvd25sb2FkcyB0byB3b3JrLCBidXQgRVBTViBpcyBub3QgcmVzdHJpY3RlZCB0byBJUHY2IGJ1dCB3b3JrcwogIGZpbmUgd2l0aCBJUHY0IHRvbyBvbiB0aGUgc2VydmVycyB0aGF0IHN1cHBvcnQgaXQuCgogIFNJWkUgaXMgbm93IGFsd2F5cyBpc3N1ZWQgYmVmb3JlIFJFVFIuIEl0IG1ha2VzIGN1cmwga25vdyB0aGUgYWN0dWFsCiAgZG93bmxvYWQgc2l6ZSBiZWZvcmUgdGhlIGRvd25sb2FkIHRha2VzIHBsYWNlLCBhcyBpdCBtYWtlcyBpdCBsZXNzIGltcG9ydGFudAogIHRvIGZpbmQgdGhlIHNpemUgc2VudCBpbiBSRVRSIHJlc3BvbnNlcy4gTWFueSBzaXRlcyBkb24ndCBpbmNsdWRlIHRoZSBzaXplCiAgaW4gdGhlcmUuCgogIEJvdGggdGhlc2UgY2hhbmdlcyBtYWRlIGl0IG5lY2Vzc2FyeSB0byBjaGFuZ2UgdGhlIHRlc3Qgc3VpdGUncyBmdHAgc2VydmVyCiAgY29kZSwgYW5kIGFsbCBGVFAgdGVzdCBjYXNlcyBuZWVkIHRvIGJlIGNoZWNrZWQgYW5kIGFkanVzdGVkIQoKRGFuaWVsICgyNyBOb3ZlbWJlciAyMDAxKQotIEhhbnMgU3RlZWdlcnMgcG9pbnRlZCBvdXQgdGhhdCB0aGUgdGVsbmV0IGNvZGUgcmVhZCBmcm9tIHN0ZG91dCwgbm90IHN0ZGluCiAgYXMgaXQgaXMgc3VwcG9zZWQgdG8gZG8hCgpWZXJzaW9uIDcuOS4yLXByZTYKCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMSkKLSBFcmljIExhdmlnbmUncyBtaW5vciBjaGFuZ2VzIHRvIGJ1aWxkIG9uIE1hY09TIGJlZm9yZSBPUyBYIHdlcmUgYXBwbGllZC4KCi0gZ3JlZXAgYXQgbWluZHNwcmluZy5jb20gcHJvdmlkZWQgYSBtYWluIGluZGV4Lmh0bWwgcGFnZSBmb3Igb3VyIHJlbGVhc2UKICBhcmNoaXZlIGRvY3MgZGlyZWN0b3J5LiBJdCBqdXN0IGxpbmtzIHRvIGFsbCB0aGUgZXhpc3RpbmcgSFRNTCBmaWxlcywgYnV0CiAgSSB0aGluayBpdCBtYXkgY29tZSB1c2VmdWwgdG8gcGVvcGxlLgoKLSBUaGVyZSdzIG5vdyBzb21lIGluaXRpYWwgY29kZSB0byBzdXBwb3J0IHRoZSBFUFNWIEZUUCBjb21tYW5kLiBUaGF0IHNob3VsZAogIGJlIHVzZWQgdG8gZG8gcGFzc2l2ZSB0cmFuc2ZlcnMgSVB2Ni1zdHlsZS4gVGhlIGNvZGUgaXMgc3RpbGwgI2lmIDAnZWQgaW4KICBsaWIvZnRwLmMgYXMgSSBoYXZlIG5vIElQdjYgZnRwIHNlcnZlciB0byB0ZXN0IHRoaXMgd2l0aC4KCkRhbmllbCAoMjYgTm92ZW1iZXIgMjAwMSkKLSBSb2JlcnQgU2NobGFiYmFjaCBoYWQgcHJvYmxlbXMgdG8gdW5kZXJzdGFuZCBob3cgdG8gZG8gcmVzdW1lZCB0cmFuc2ZlcnMsCiAgYW5kIEkgY2xhcmlmaWVkIHRoZSBtYW4gcGFnZSAtQyBzZWN0aW9uIHNvbWV3aGF0LgoKVmVyc2lvbiA3LjkuMi1wcmU1CgpEYW5pZWwgKDIyIE5vdmVtYmVyIDIwMDEpCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgb3V0IHRvIHRyYWNrIGRvd24gdGhlIHJvb3RzIG9mIGJ1ZyByZXBvcnQgIzQ3OTUzNywKICB3aGljaCB3YXMgY29uY2VybmluZyBjdXJsIHJldHVybmluZyB0aGUgd3JvbmcgZXJyb3IgY29kZSB3aGVuIGZhaWxpbmcgdG8KICBjb25uZWN0LiBUaGlzIGRpZG4ndCBoYXBwZW4gb24gYWxsIHN5c3RlbXMsIGFuZCBtb3JlIHNwZWNpZmljbHkgSSd2ZSBzbyBmYXIKICBvbmx5IHNlZW4gdGhpcyBoYXBwZW4gb24gSVB2NC1vbmx5IExpbnV4IGhvc3RzLgoKLSBJIGFwcGxpZWQgdGhlIGZpeGVzIGZvciB0aGUgdHdvIGJ1Z3MgRXJpYyBMYXZpZ25lIGZvdW5kIHdoZW4gZG9pbmcgaGlzIE1hY09TCiAgcG9ydC4gQSBtaXNzaW5nIGNvbW1hIGluIGFycGFfdGVsbmV0LmggYW5kIGEgcHJldHR5IHdpbGQgd3JpdGUgaW4gdGhlIEZUUAogIHJlc3BvbnNlIHJlYWRlciBmdW5jdGlvbi4gVGhlIGxhdHRlciB3cml0ZSBpcyBob3dldmVyIGxpa2VseSB0byBvY2N1ciBpbiBvdXIKICBvd24gYnVmZmVyIHVubGVzcyB2ZXJ5IGJpZyBGVFAgc2VydmVyIHJlcGxpZXMgKD4yNUspIGFyZSByZWFkLiBJJ3ZlIG5ldmVyCiAgc2VlbiBzdWNoIGEgcmVwbHkgZXZlciwgc28gSSB0aGluayB0aGlzIGlzIGEgcmVsYXRpdmVseSBtaW5vciByaXNrLgoKRGFuaWVsICgyMSBOb3ZlbWJlciAyMDAxKQotIE1vb25lc2FteSBwcm92aWRlZCBjb2RlIHRvIHByZXZlbnQganVuayBmcm9tIGJlaW5nIG91dHB1dCB3aGVuIGxpYmN1cmwKICByZXR1cm5zIGFuIGVycm9yIGNvZGUgYnV0IG5vIGVycm9yIGRlc2NyaXB0aW9uIGFuZCB0aGF0IGNvcnJlY3RzIGhvdyBtYWtlIGlzCiAgcnVuIGluIHRoZSBNYWtlZmlsZS5kaXN0IGZpbGUgKHRoYXQgYXBwZWFycyBhcyByb290IE1ha2VmaWxlIGluIHJlbGVhc2UKICBhcmNoaXZlcykuCgotIEVyaWMgTGF2aWduZSBtYWlsZWQgbWUgYnVnZml4ZXMgYW5kIHBhdGNoZXMgZm9yIGJ1aWxkaW5nIGxpYmN1cmwgb24gTWFjT1MKICAobm9uLVgpLgoKLSBLZXZpbiBSb3RoIG1vZGlmaWVkIHRoZSBjeWd3aW4gZmlsZXMgb25jZSBhZ2Fpbiwgbm93IHRvIGJ1aWxkIGFnYWluc3QgdGhlCiAgc2hhcmVkIE9wZW5TU0wgRExMcy4KClZlcnNpb24gNy45LjItcHJlNAoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAxKQotIEdlb3JnIEhvcm4gYnJvdWdodCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlZCBDVVJMSU5GT19TVEFSVFRSQU5TRkVSX1RJTUUsCiAgY29tcGxldGUgd2l0aCBtYW4gcGFnZSB1cGRhdGVzIQoKRGFuaWVsICgxOSBOb3ZlbWJlciAyMDAxKQotIE1pa2xvcyBOZW1ldGggcHJvdmlkZWQgZGV0YWlscyBlbm91Z2ggdG8gdXBkYXRlIHRoZSBCb3JsYW5kIG1ha2VmaWxlCiAgcHJvcGVybHkuCgotIExhcnMgTSBHdXN0YWZzc29uIGZvdW5kIGEgY2FzZSB3aXRoIGEgYmFkIGZyZWUoKS4gSW4gZmFjdCwgaXQgd2FzIHNvIGJhZCBJJ20KICBhbWF6ZWQgd2UgbmV2ZXIgc2F3IHRoaXMgYmVmb3JlIQoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBNYWtmaWxlLgoKRGFuaWVsICgxNiBOb3ZlbWJlciAyMDAxKQotIEtsZXZ0c292IFZhZGltIGZpeGVkIGEgYnVnIGluIGhvdyB0aW1lLWNvbmRpdGlvbmFscyB3ZXJlIHNlbnQgd2hlbiBkb2luZwogIEhUVFAuCgpWZXJzaW9uIDcuOS4yLXByZTMKCkRhbmllbCAoMTQgTm92ZW1iZXIgMjAwMSkKLSBTYW11ZWwgTGlzdG9wYWQgcGF0Y2hlZCBhd2F5IHRoZSBwcm9ibGVtIHdpdGggU1NMIHdlIGdvdCB3aGVuIHNvbWVvbmUgY2FsbAogIGN1cmxfZ2xvYmFsX2luaXQoKSA9PiBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgPT4gY3VybF9nbG9iYWxfaW5pdCgpLiBUaGUKICBzZWNvbmQgaW5pdCB3b3VsZCBub3QgInRha2UiIGFuZCBTU0wgd291bGQgYmUgdW51c2FibGUgd2l0aCBjdXJsIGZyb20gdGhhdAogIHBvaW50LiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBmYWN0IHRoYXQgY2FsbGluZyB0aGUgZnVuY3Rpb25zIHRoYXQgd2F5IGlzCiAgd3JvbmcuIGN1cmxfZ2xvYmFsX2luaXQoKSBzaG91bGQgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBhbmQgbm90IG1vcmUuCgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDEpCi0gRml4ZWQgc29tZSBtaW5vciB2YXJpYWJsZSB0eXBlIG1peHVwcyBpbiBmdHAuYyB0aGF0IGNhdXNlZCBjb21waWxlciB3YXJuaW5ncwogIG9uIEhQLVVYIDExLjAwLgoKLSBUaGUgRlRQIGZpeCBJIGRpZCB5ZXN0ZXJkYXkgdXNlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHRoYXQgY2F1c2VkCiAgc3B1cmlvdXMgZXJyb3JzIHdoZW4gZG9pbmcgRlRQLgoKVmVyc2lvbiA3LjkuMi1wcmUyCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDEpCi0gUmljYXJkbyBDYWRpbWUgZmVsbCBvdmVyIGEgbXVsdGlwbGUtcmVxdWVzdHMgcHJvYmxlbSB3aGVuIGZpcnN0IGEgRlRQCiAgZGlyZWN0b3J5IGZldGNoIGZhaWxlZCBhbmQgdGhlbiBhIHNlY29uZCByZXF1ZXN0IGlzIG1hZGUgYWZ0ZXIgdGhhdC4gVGhlCiAgc2Vjb25kIHJlcXVlc3QgaGFwcGVuZWQgdG8gZ2V0IHRoZSBGVFAgc2VydmVyIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUKICBwcmV2aW91cyByZXF1ZXN0LCB3aGVuIGl0IGRpZCBpdHMgaW5pdGlhbCBDV0QgY29tbWFuZC4KCi0gQmpvcm4gUmVlc2UgcG9pbnRlZCBvdXQgdGhhdCB3ZSBjb3VsZCBpbXByb3ZlIHRoZSB0aW1lIGRpZmYgZnVuY3Rpb24gdG8KICBwcmV2ZW50IHRydW5jYXRpb24gYSBiaXQuCgotIEthaS1Vd2UgUm9tbWVsIG1hZGUgbWUgYXdhcmUgdGhhdCAtcCAoaHR0cCBwcm94eSB0dW5uZWwpIHNpbGx5IGVub3VnaCBkaWRuJ3QKICB3b3JrIGZvciBwbGFpbiBIVFRQIHJlcXVlc3RzISBTbyBJIG1hZGUgdGhhdCB3b3JrLgoKVmVyc2lvbiA3LjkuMi1wcmUxCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDEpCi0gUmV3cm90ZSB0aGUgQ3VybF9Db25uZWN0SFRUUFByb3h5VHVubmVsKCkuIEl0IHNob3VsZCBub3cgbm90IG9ubHkgd29yayBhIGxvdAogIGZhc3RlciwgaXQgc2hvdWxkIGFsc28gc3VwcG9ydCBzdWNoICgiYnJva2VuIikgcHJveGllcyB0aGF0IEpvaG4gTGFzawogIHByZXZpb3VzbHkgaGF2ZSByZXBvcnRlZCBwcm9ibGVtcyB3aXRoLiBIaXMgcHJveHkgc2VuZHMgYSB0cmFpbGluZyB6ZXJvIGJ5dGUKICBhZnRlciB0aGUgZW5kIG9mIHRoZSAocHJveHktKSBoZWFkZXJzLiBJJ3ZlIHRlc3RlZCB0aGlzIG15c2VsZiBhbmQgaXQgc2VlbXMKICB0byB3b3JrIG9uIGEgcHJveHkgdGhlIHByZXZpb3VzIHZlcnNpb24gYWxzbyB3b3JrZWQgd2l0aC4uLiEgVGhpcyByZXdyaXRlIGlzCiAgZHVlIHRvIHRoZSBwcm9ibGVtcyBKb2huIExhc2sgcHJldmlvdXNseSBleHBlcmllbmNlZC4KCi0gQW5kculzIEdhcmPtYSBmb3VuZCBvdXQgd2h5IHRoZSAiY3VycmVudCBzcGVlZCIgbWV0ZXIgc29tZXRpbWVzIHNob3dlZCAyMDQ4SwogIGZvciB2ZXJ5IHF1aWNrIHRyYW5zZmVycy4gSXQgdHVybmVkIG91dCB0aGUgInRpbWUgZGlmZiItZnVuY3Rpb24gcmV0dXJuZWQgYQogIHplcm8gbWlsbGlzZWNvbmQgZGlmZi4gV2Ugbm93IGFsd2F5cyBzYXkgaXQgaXMgYXQgbGVhc3Qgb25lIG1pbGxpc2Vjb25kISBJbgogIHJlYWxpdHksIHRoZXNlIHRpbWVycyB2ZXJ5IHJhcmVseSBoYXZlIHRoYXQgZ29vZCByZXNvbHV0aW9uIHNvIGV2ZW4gdGhvdWdoCiAgdGhlIHRpbWUgZGlmZiB3YXMgbG9uZ2VyIHRoYW4gMSBtaWxsaXNlY29uZCwgaXQgd2FzIHJlcG9ydGVkIGFzIG5vIGRpZmYuCgotIEkgYWxzbyBtb2RpZmllZCB0aGUgZ2V0aW5mbygpIGFnYWluIHdoZW4gcmV0dXJuaW5nIHRpbWVzLCBhcyBQYXVsIEhhcnJpbmd0b24KICByZXBvcnRzIHRoYXQgNy45LjEgb25seSByZXR1cm5zIHRpbWVzIHdpdGggMSBzZWNvbmQgYWNjdXJhY3ksIHdoaWNoIGluZGVlZAogIGlzIHdyb25nLgoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDEpCi0gTWFyY3VzIFdlYnN0ZXIgZm91bmQgb3V0IHRoYXQgY3VybF9mb3JtYWRkKCkgY291bGQgcmVhZCBvbmUgYnl0ZSBvdXRzaWRlIGEKICBidWZmZXIgYm91bmRhcnksIHdoaWNoIHRoZW4gb2YgY291cnNlIGNvdWxkIGxlYWQgdG8gYSBjcmFzaC4gTWFyY3VzIGFsc28KICBncmFjZWZ1bGx5IHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHRoaXMgdGhpcy4KCi0gR2xlbiBTY290dCByYW4gY29uZmlndXJlIG9uIGhpcyBDb2JhbHQgUXViZSBhbmQgaXQgZGlkbid0IGZpZ3VyZSBvdXQgdGhlCiAgY29ycmVjdCB3YXkgb2YgY2FsbGluZyBnZXRob3N0YnluYW1lX3IoKSBhbmQgdGh1cyBmYWlsZWQgdG8gcmVzb2x2ZSBob3N0cy4KICBUaGlzIGlzIHR3byBlcnJvcnM6IGl0IHNob3VsZG4ndCBjb250aW51ZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpZiBpdCBmaW5kcwogIGdldGhvc3RieW5hbWVfcigpIGJ1dCBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0byB1c2UgaXQsIGFuZCBpdCBzaG91bGQgcmVhbGx5CiAgZmlndXJlIG91dCBob3cgdG8gdXNlIGl0IGFzIGl0IHdhcyBydW5uaW5nIExpbnV4IGFuZCB3ZSBrbm93IGhvdyB0aGF0CiAgd29ya3MuLi4KIApEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMSkKLSBkb2NzL1ZFUlNJT05TIGlzIGEgbmV3IGZpbGUgaW4gdGhlIGFyY2hpdmUgdGhhdCBleHBsYWlucyB0aGUgdmVyc2lvbiBudW1iZXIKICBzeXN0ZW0gd2UgdXNlIGluIHRoZSBjdXJsIHByb2plY3QuCgotIERpZCBzb21lIG1vcmUgZml4ZXMgdGhhdCBub3cgbWFrZXMgbGliY3VybCBvbmx5IGlnbm9yZSBzaWduYWxzIGFzIGxvbmcgYXMKICBpdCBuZWVkcyB0bywgYW5kIHRoZW4gcmVzdG9yZSAoaWYgYW55KSBwcmV2aW91cyBzaWduYWwgaGFuZGxlciBhZ2Fpbi4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAxKQotIEVucmlrIEJlcmtoYW4gcG9zdGVkIGJ1ZyByZXBvcnQgIzQ3ODc4MCwgaW4gd2hpY2ggaGUgdmVyeSBjb3JyZWN0bHkgcG9pbnRlZAogIG91dCB0d28gYmFkIHRpbWVvdXQgbWF0dGVycyBpbiBsaWJjdXJsOiB3ZSBkaWRuJ3QgcmVzdG9yZSB0aGUgc2lnYWN0aW9uCiAgc3RydWN0ICh0aGUgYWxhcm0gaGFuZGxlciBmb3IgU0lHQUxSTSkgbm9yIGRpZCB3ZSByZXN0b3JlIHRoZSBwcmV2aW91cwogIGFsYXJtKCkgdGltZW91dCB0aGF0IGNvdWxkJ3ZlIGJlZW4gc2V0IGJ5IGEgInBhcmVudCIgcHJvY2VzcyBvciBzaW1pbGFyLgoKLSBLZXZpbiBSb3RoIG1hZGUgdGhlIGN5Z3dpbiBiaW5hcnkgZ2V0IHN0cmlwcGVkIGJlZm9yZSBpbnN0YWxsLgoKRGFuaWVsICg1IE5vdmVtYmVyIDIwMDEpCi0gRGV0bGVmIFNjaG1pZXIgcmVwb3J0ZWQgdGhhdCBjdXJsIGRpZG4ndCBjb21waWxlIHVzaW5nIFNvbGFyaXMgOCB3aXRoIHRoZQogIG5hdGl2ZSBjYyBjb21waWxlci4gSXQgd2FzIGR1ZSB0byBhIGJhZCBmdW5jdGlvbiBwcm90b3R5cGUuIEZpeGVkIG5vdy4KICBVbmZvcnR1bmF0ZWx5LCBJIGNhbid0IGVuYWJsZSB0aGUgLVdzdHJpY3QtcHJvdG90eXBlcyBpbiBteSBkZWJ1ZyBidWlsZHMKICB0aG91Z2gsIGFzIGdjYyB0aGVuIGNvbXBsYWlucyBsaWtlIGNyYXp5IG9uIE9wZW5TU0wgaW5jbHVkZSBmaWxlcy4uLiA6LSgKCi0gSm9obiBMYXNrIHByb3ZpZGVkIFNTTCBvdmVyIEhUVFAgcHJveHkgZml4ZXMuIFRoZXknbGwgbmVlZCBzb21lIHR3ZWFraW5nCiAgdG8gd29yayBvbiBhbGwgcGxhdGZvcm1zLgoKLSBKb2huIExhc2sgYWRkZWQgdGhlIC0xLy0tVExTdjEgb3B0aW9ucyB0aGF0IGZvcmNlcyBTU0wgaW50byB1c2luZyBUTFMKICB2ZXJzaW9uIDEgd2hlbiBzcGVha2luZyBIVFRQUy4KCi0gSm9obiBMYXNrIGJyb3VnaHQgYSBicmFuZCBuZXcgVkMrKyBtYWtlZmlsZSBmb3IgdGhlIGxpYiBkaXJlY3RvcnksIHRoYXQKICB3b3JrcyBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMhCgotIFJhbWFuYSBNb2trYXBhdGkgYnJvdWdodCBzb21lIGNsZXZlciBpbnNpZ2h0cyBvbiB0aGUgTERBUCBmYWlsdXJlcyAoYnVnCiAgcmVwb3J0ICM0NzU0MDcpLCBhbmQgaGlzIHN1Z2dlc3RlZCBjaGFuZ2VzIGFyZSBub3cgYXBwbGllZC4KClZlcnNpb24gNy45LjEKCkRhbmllbCAoNCBOb3ZlbWJlciAyMDAxKQotIEkndmUgYWRkZWQgYSBudW1iZXIgb2YgbmV3IHRlc3QgY2FzZXMgdGhlIGxhc3QgZmV3IGRheXMuIEEgZmV3IG9mIHRoZW0gc2luY2UKICBJIGdvdCByZXBvcnRzIHRoYXQgaGludGVkIG9uIHByb2JsZW1zIG9uIHRpbWVvdXRzLCBzbyBJIGFkZGVkIGZvdXIgdGVzdHMKICB3aXRoIHRpbWVvdXRzIGZvciBhbGwgc29ydHMgb2YgcHJvdG9jb2xzIGFuZCBzdHVmZi4gSSBhbHNvIGNhbWUgdG8gdGhpbmsgb2YKICBhIGZldyBvdGhlciBlcnJvciBzY2VuYXJpb3MgdGhhdCB3ZSBjdXJyZW50bHkgZGlkbid0IHRlc3QgcHJvcGVybHksIHNvIEkKICB3cm90ZSB1cCB0ZXN0cyBmb3IgYSBmZXcgb2YgdGhvc2UgdG9vLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDEpCi0gUmVwbGFjZWQgcmVhZCgpIGFuZCB3cml0ZSgpIHdpdGggcmVjdigpIGFuZCBzZW5kKCkgZm9yIHNvY2tldCBvcGVyYXRpb25zCiAgZXZlbiB1bmRlciBub3JtYWwgdW5peGVzLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgd2FzIGFib3J0ZWQgZHVlIHRvIGEgdGltZW91dCwgaXQgd2Fzbid0IHJlYWxseSBhd2FyZSBvZgogIGhvdyBtYW55IGJ5dGVzIHRoYXQgaGFkIGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSBlcnJvciB0ZXh0IGFsd2F5cyBzYWlkIDAKICBieXRlcy4gSSBtb2RpZmllZCB0aGlzIHRvIG91dHB1dCB0aGUgYWN0dWFsbHkgdHJhbnNmZXJyZWQgYW1vdW50ISA6LSkKCi0gVGhlIEZUUCBmaXhlcyBpbiBwcmU3IGRpZG4ndCBjb21waWxlIG9uIElQdjYgZW5hYmxlZCBob3N0cy4gRG9lcyBub3cuIEkgYWxzbwogIGFkZGVkIG1vcmUgY29tbWVudHMgaW4gdGhlIGxpYi9mdHAuYyBzb3VyY2UgZmlsZS4KCi0gTWlub3IgdXBkYXRlcyB0byB0aGUgRkFRLCBhZGRlZCBhIGJyYW5kIG5ldyBzZWN0aW9uIHRvIHRoZSB3ZWIgc2l0ZSBhYm91dAogIHRoZSBuYW1lIGlzc3VlICh3aG8gb3ducyAiY3VybCI/IHdpbGwgc29tZW9uZSBzdWUgdXM/IGV0YyBldGMpOgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbGVnYWwvdGhlbmFtZS5odG1sCgpWZXJzaW9uIDcuOS4xLXByZTcKCkRhbmllbCAoMzEgT2N0b2JlciAyMDAxKQotIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRpbWVycyBhY2NpZGVudGFsbHkgbG9zdCB0aGVpciBzdWJzZWNvbmQgYWNjdXJhY3kgYXMKICB0aGUgY2FsY3VsYXRpb25zIHVzZWQgbG9uZ3MgaW5zdGVhZCBvZiBkb3VibGVzISBQYXVsIEhhcnJpbmd0b24gcmVwb3J0ZWQuCgotIFRoZSBTU0wgU29ja2V0SXNEZWFkKCkgY2hlY2tzIHdlcmVuJ3QgZ29vZCBlbm91Z2ggKGFzIGV4cGVjdGVkIHJlYWxseSksIHNvIEkKICBoYWQgdG8gYWRkIGEgZ2VuZXJpYyBpbnRlcm5hbCB0cnktaXQtb3V0IHN5c3RlbS4gSWYgdGhlIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgY29ubmVjdGlvbiBzZWVtcyB0byBmYWlsLCB0aGVuIHdlIGdvIGJhY2sgYW5kIGdldCBhIG5ldyAoZnJlc2gpIGNvbm5lY3Rpb24KICBhbmQgcmUtdHJpZXMgdGhlIHJlcXVlc3Qgb24gdGhhdCBpbnN0ZWFkLiBJdCBraW5kIG9mIG1ha2VzIHRoZQogIFNvY2tldElzRGVhZCgpIGNoZWNrIG9ic29sZXRlLCBidXQgSSB0aGluayBpdCBpcyBhIHF1aWNrZXIgd2F5IGZvciB0aG9zZQogIGNhc2VzIHdoZXJlIGl0IGFjdHVhbGx5IGRpc2NvdmVycyB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGRlYWQuCgotIFdoZW4gZml4aW5nIHRoZSBhYm92ZSwgSSBub3RpY2VkIHRoYXQgd2UgZGlkIHF1aXRlIGEgZmV3IHdyaXRlcyB0byBzb2NrZXRzCiAgaW4gbGliY3VybCB3aGVyZSB3ZSBkaWRuJ3QgY2hlY2sgdGhlIHJldHVybiBjb2RlICh0aGF0IGl0IGFjdHVhbGx5IHdvcmtlZCB0bwogIHNlbmQgdGhlIGRhdGEpLiBXaXRoIHRoZSBuZXcgImF0dGVtcHRlZCByZXF1ZXN0IiBzeXN0ZW0gd2UgbXVzdCBkZXRlY3QgdGhvc2UKICBzaXR1YXRpb25zIHNvIEkgd2VudCBvdmVyIGEgYnVuY2ggb2YgZnVuY3Rpb25zLCBjaGFuZ2VkIHJldHVybiB0eXBlcyBhbmQKICBhZGRlZCBjaGVja3MgZm9yIHdoYXQgdGhleSBhY3R1YWxseSByZXR1cm4uCgpWZXJzaW9uIDcuOS4xLXByZTYKCkRhbmllbCAoMzEgT2N0b2JlciAyMDAxKQotIFBhdWwgSGFycmluZ3RvbiBkZXRlY3RlZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0YW50IFNTTCBjb25uZWN0aW9ucy4gT3IgdG8gYmUKICBtb3JlIGV4YWN0LCB3ZSBkaWRuJ3QgcHJvcGVybHkgZGV0ZWN0IHRoYXQgdGhlIGNvbm5lY3Rpb24gd2FzIGRlYWQgYW5kIHRoZW4KICBhIHNlY29uZCBjb25uZWN0aW9uIHdvdWxkIHRyeSB0byByZS11c2UgaXQgd3JvbmdseS4gVGhlIHNvbHV0aW9uIHRvIHRoaXMKICBwcm9ibGVtIGlzIHN0aWxsIG5vdCB2ZXJ5IGNsZWFyIGFuZCBJJ20gd29ya2luZyBvbiBpdC4gT25lIE9wZW5TU0wgaW5zaWRlcgogIHNhaWQgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaWYgdGhlIFNTTCBjb25uZWN0aW9uIGlzIGFsaXZlIG9yIG5vdCB3aXRob3V0CiAgYWN0dWFsbHkgdHJ5aW5nIGFuIG9wZXJhdGlvbi4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAxKQotIElmIGEgY29va2llIHdhcyByZWFkIGZyb20gYSBmaWxlLCBpdCBjb3VsZCBhY2NpZGVudGFsbHkgc3RyZHVwKCkgYSBOVUxMCiAgcG9pbnRlci4gUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvb2tpZS5jLmRpZmY/cjE9MS4yNSZyMj0xLjI2XQoKLSBUaGUgTUFOVUFMIGZpbGUgbm93IGRvY3VtZW50cyAtdCBjb3JyZWN0bHkuIEkgYWxzbyBmaXhlZCB0aGUgLVQgZGVzY3JpcHRpb24KICBpbiB0aGUgY3VybC4xIG1hbiBwYWdlLgoKRGFuaWVsICgyOSBPY3RvYmVyIDIwMDEpCi0gSm9obiBKYW5zc2VuIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCB3YXMgbWlzc2luZyBpbiB0aGUgbGliY3VybC5kZWYgZmlsZQogIGFuZCB0aGF0IHRoZSBkb2NzIHN0YXRlZCB0aGUgd3JvbmcgcmV0dXJuIHR5cGUgZm9yIHRoZSBmdW5jdGlvbi4KCi0gQW5kculzIEdhcmPtYSBmb3VuZCBhIGJ1ZyB3aXRoIG11bHRpcGxlIGZpbGVzIGluIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbiwKICB0aGF0IEkgcmVtb3ZlZCB3aXRoIHRoaXMgcGF0Y2ggW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9mb3JtZGF0YS5jLmRpZmY/cjE9MS4yNSZyMj0xLjI2XS4KCi0gS2V2aW4gUm90aCBicm91Z2h0IGFub3RoZXIgcGF0Y2ggdGhhdCBtb3ZlZCB0aGUgY3lnd2luIHBhY2thZ2UgZmlsZXMgdG8gdGhlCiAgcGFja2FnZXMvV2luMzIvY3lnd2luIGRpcmVjdG9yeS4KCi0gQSBidWcgaW4gdGhlIGNvbm5lY3Rpb24gcmUtdXNlIGxvZ2ljIG1hZGUgcmVwZWF0ZWQgcmVxdWVzdHMgdG8gdGhlIHNhbWUgRlRQCiAgc2VydmVyICh3aGVuIHVzaW5nIG5hbWUrcGFzd29yZCBpbiB0aGUgVVJMKSBzb21ldGltZXMgdXNlIG1vcmUgdGhhbiBvbmUKICBjb25uZWN0aW9uLiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3VybC5jLmRpZmY/cjE9MS4xNjYmcjI9MS4xNjddCgotIE1vb25lc2FteSB0cmFja2VkIGRvd24gYW5kIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBuZXcgNy45LjEgY29ubmVjdAogIGNvZGUuIFRoaXMgY29ycmVjdGVkIHRoZSBlcnJvciBLZXZpbiBSb3RoIHJlcG9ydGVkIG9uIHRoZSA3LjkuMS1wcmU1IHJlbGVhc2UKICAodGVzdCAxOSkuLi4KICBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL2Nvbm5lY3QuYy5kaWZmP3IxPTEuMTMmcjI9MS4xNF0KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAxKQotIEFkZGVkIHRlc3QyOCB3aGljaCB2ZXJpZmllcyB0aGF0ICJMb2NhdGlvbjoiLWZvbGxvd2luZyB3b3JrcyBldmVuIGlmIHRoZQogIGNvbnRlbnRzIGlzIHNlcGFyYXRlZCB3aXRoIG1vcmUgdGhhbiBvbmUgc3BhY2UuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwMSkKLSBSYW1hbmEgTW9ra2FwYXRpIHBvaW50ZWQgb3V0IHRoYXQgTERBUCB0cmFuc2ZlcnMgd291bGQgJ2hhbmcnIGFmdGVyIHRoZQogIGNvcnJlY3QgZGF0YSBoYXMgYmVlbiBvdXRwdXQuCgpWZXJzaW9uIDcuOS4xLXByZTUKCkRhbmllbCAoMjQgT2N0b2JlciAyMDAxKQotIFQuIEJoYXJhdGggZm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgY29va2llIGVuZ2luZS4gV2hlbiB3ZSB1cGRhdGUgYSBjb29raWUKICB0aGF0IHdlIGFscmVhZHkga25ldyBhYm91dCwgd2UgbG9zdCBhIGNodW5rIG9mIG1lbW9yeSBpbiB0aGUgcHJvZ3Jlc3MuLi4gVGhlCiAgYnJhbmQgbmV3IHRlc3QgY2FzZSAyNyBub3cgdGVzdHMgZm9yIHRoaXMgb2NjdXJyZW5jZS4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjQmcjI9MS4yNV0KCkRhbmllbCAoMjMgT2N0b2JlciAyMDAxKQotIHBhY2tfaG9zdGVudCgpIGRpZG4ndCBwcm9wZXJseSBhbGlnbiBzb21lIHBvaW50ZXJzLCBzbyBhdCBsZWFzdCBTUEFSQyBDUFVzCiAgd291bGQgY29yZS4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9ob3N0aXAuYy5kaWZmP3IxPTEuMzQmcjI9MS4zNV0KCkRhbmllbCAoMjIgT2N0b2JlciAyMDAxKQotIFRvbSBCZW5vaXN0IHJlcG9ydGVkIHRoYXQgdGhpcyBTR0kgSVJJWCBjb21waWxlciBkaWRuJ3QgaGFuZGxlIGluZGVudGVkCiAgcHJlcHJvY2Vzc29yIGluc3RydWN0aW9ucywgc28gdGhleSdyZSBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlIQoKLSBBcHBsaWVkIEtldmluIFJvdGgncyBwYXRjaGVzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIGN5Z3dpbiBwYWNrYWdlcyBmcm9tCiAgdGhlIG91dC1vZi10aGUtYm94IGN1cmwgcmVsZWFzZSBhcmNoaXZlcy4KCi0gSSBmb3Jnb3QgdG8gbWVudGlvbiBpdCBiZWxvdywgYnV0IGxpYmN1cmwgbm93IGNsb3NlcyBjb25uZWN0aW9ucyB0aGF0IHJlcG9ydAogIHRyYW5zZmVyIGZhaWx1cmVzLiBVbmNvbmRpdGlvbmFsbHkuIFRoaXMgY291bGQgYmUgbWFkZSBtb3JlIG5pY2VseSBpbiB0aGUKICBmdXR1cmUgaWYgd2Ugc2V0IGEgZmxhZyBvciBzb21ldGhpbmcgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBnb29kIHRvIGJlCiAgdXNlZCBmb3IgdGhlIGVycm9ycyB0aGF0IGtub3cgdGhhdCBmb3IgYSBmYWN0LiBXZSBoYXZlIHRvIGNsb3NlIHRoZQogIGNvbm5lY3Rpb24gZm9yIHRoZSBjYXNlcyB3aGVyZSB3ZSBhYm9ydCBmb3IgZXhhbXBsZSBhIEhUVFAgdHJhbnNmZXIgaW4gdGhlCiAgbWlkZGxlLCBvciBvdGhlcndpc2Ugd2UgbWlnaHQgcmUtdXNlIHRoYXQgY29ubmVjdGlvbiBsYXRlciB3aXRoIGxvdHMgb2YgZGF0YQogIHN0aWxsIGJlaW5nIHNlbnQgdG8gdXMgb24gaXQuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjMmcjI9MS42NF0KCkRhbmllbCAoMTkgT2N0b2JlciAyMDAxKQotIENVUkxFX0dPVF9OT1RISU5HIGlzIG5vdyByZXR1cm5lZCB3aGVuIGEgSFRUUCBzZXJ2ZXIgZG9lc24ndCByZXR1cm4KICBhbnl0aGluZywgbm90IGV2ZW4gYSBoZWFkZXIuIHRlc3QgY2FzZSAzNyB3YXMgYWRkZWQgdG8gdGVzdCBmb3IgdGhpcy4KCi0gVC4gQmhhcmF0aCBtYWRlIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBwcm9wZXJseSBjbG9uZSB0aGUgY29va2llIHN0YXR1cyBhcwogIHdlbGwuCgpWZXJzaW9uIDcuOS4xLXByZTQKCkRhbmllbCAoMTggT2N0b2JlciAyMDAxKQotIENVUkxPUFRfRkFJTE9ORVJST1IsIHNldCB3aXRoICJjdXJsIC0tZmFpbCIgbm8gbG9uZ2VyIHJldHVybnMgYW4gZXJyb3IgaWYKICB0aGUgSFRUUCByZXR1cm4gY29kZSBpcyBiZWxvdyA0MDAuCgpEYW5pZWwgKDE3IE9jdG9iZXIgMjAwMSkKLSBUaGUgdGVzdCBzdWl0ZSBub3cga2lsbHMgYW55IHJ1bm5pbmcgdGVzdCBodHRwIHNlcnZlciB3aGVuIHlvdSByZS1zdGFydCB0aGUKICB0ZXN0cy4KCi0gV2UgaGFkIHRvIHJlbW92ZSAndXNlIHN0cmljdCcgZnJvbSB0d28gcGVybCBzY3JpcHRzLCBhcyB0aGUgY3lnd2luCiAgYWRqdXN0bWVudHMgZGlkbid0IHBsYXkgbmljZWx5IG90aGVyd2lzZSBmb3Igc29tZSByZWFzb24uIEFueSBwZXJsIHdpemFyZAogIG91dCB0aGVyZSB3aG8gY2FuIHB1dCB0aGUgc2NyaWN0IGJhY2sgYW5kIHN0aWxsIG1ha2UgaXQgcnVuIGdvb2Qgb24gdW5peCBhbmQKICBjeWd3aW4/CgotIEEgcG90ZW50aWFsIG1lbW9yeSBsZWFrIHBvaW50ZWQgb3V0IHRvIHVzIGJ5IFlhbmljayBQZWxsZXRpZXIgd2FzIHJlbW92ZWQuCiAgSXQgd291bGQgb2NjdXIgd2hlbiBhIGh0dHAgZmlsZSB0cmFuc2ZlciBmYWlscy4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi90cmFuc2Zlci5jLmRpZmY/cjE9MS42MCZyMj0xLjYxXQoKLSBUaGUgbWVtb3J5IGRlYnVnZ2luZyBzeXN0ZW0gc2hvdWxkIG5vIGxvbmdlciBkaXNwbGF5IGFueXRoaW5nIHRvIHN0ZGVycgogIGlmIHRoZSBjdXJsX21lbWRlYnVnKCkgaGFzbid0IGJlZW4gdXNlZCB0byBleHBsaWNpdGx5IHNheSBzby4gVGhpcyBtYWtlcyBpdAogIGVhc2llciB0byB1c2UgdGhlIG1lbW9yeSBkZWJ1ZyBzeXN0ZW0gYW5kIHN3aXRjaCB0aGUgbG9nZ2luZyBvbi9vZmYuCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIGZpeGVzIGZvciBidWlsZGluZyBjdXJsIG5pY2VyIGluIGN5Z3dpbiBlbnZpcm9ubWVudHMuCgpEYW5pZWwgKDEyIE9jdG9iZXIgMjAwMSkKLSBDbGVhbmluZyB1cCB0aGUgcHJvZ3Jlc3MgbWV0ZXIvaW5mbyBjb2RlLiBUaGUgImN1cnJlbnQgc3BlZWQiIGlzIG5vdyBtb3JlCiAgYWNjdXJhdGUgdGhhbiBiZWZvcmUgYXMgd2Ugbm93IHVzZSB0aGUgdHJ1ZSB0aW1lIHNwZW50IGJldHdlZW4gdGhlIG1lYXN1cmVzLAogIGFuZCBub3QganVzdCAiYXNzdW1pbmciIGV2ZXJ5LXNlY29uZC11cGRhdGUgbGlrZSBiZWZvcmUuIFRoZSBvdXRwdXQgc2hvdWxkCiAgbm93IGFsc28gYmUgb2YgdGhlIHNhbWUgd2lkdGggYXQgYWxsIHRpbWVzLCBuZXZlciB0byBzaG93ICJleHRyYSIgemVyb2VzIG9uCiAgdGhlIHJpZ2h0IGVkZ2UuCgotIEFmdGVyIHRhbGtpbmcgYWJvdXQgcG9zc2libGUgTG9jYXRpb246IGJ1Z3Mgb24gdGhlIG1haWxpbmcgbGlzdCwgSSBtb2RpZmllZAogIHRoZSAiYWJzb2x1dGUgVVJMIiBjaGVja2VyIGluIGxpYi90cmFuc2Zlci5jIHRvIGJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcKICBpZiB0aGUgcmVkaXJlY3RlZCBVUkwgaXMgYWJzb2x1dGUuCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIHBhdGNoZXMgdGhhdCBtYWtlIHRoZSB0ZXN0IHN1aXRlIHJ1biBmaW5lIG9uIFdpbmRvd3MKICAyMDAwIHJ1bm5pbmcgY3lnd2luLgoKRGFuaWVsICgxMCBPY3RvYmVyIDIwMDEpCi0gU2V0dGluZyB0aGUgLWMgb3IgdGhlIENVUkxPUFRfQ09PS0lFSkFSIG9wdGlvbiBub3cgZW5hYmxlcyB0aGUgY29va2llIHBhcnNlci4KICBQcmV2aW91c2x5IC1iIG9yIENVUkxPUFRfQ09PS0lFRklMRSB3YXMgYWxzbyByZXF1aXJlZCBmb3IgdGhlIGphciB0byB3b3JrLgoKVmVyc2lvbiA3LjkuMS1wcmUzCgpEYW5pZWwgKDkgT2N0b2JlciAyMDAxKQotIEFkZGVkIGEgbmV3IG9wdGlvbiB0byB0aGUgY29tbWFuZCBsaW5lIGNsaWVudDogLTAvLS1odHRwMS4wLiBJdCB1c2VzIHRoZSBuZXcKICBsaWJjdXJsIG9wdGlvbiBDVVJMT1BUX0hUVFBfVkVSU0lPTiB0byByZXF1ZXN0IHRoYXQgbGliY3VybCB1c2VzIEhUVFAgMS4wCiAgcmVxdWVzdHMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB2ZXJzaW9uICgxLjEpLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdQogIHJlYWxseSBNVVNUIGRvIHRoYXQgYmVjYXVzZSBvZiBhIHNpbGx5IHJlbW90ZSBzZXJ2ZXIuCgotIFJlbmFtZWQgdGhlICdUaW1lQ29uZCcgdHlwZWRlZiBpbiBjdXJsL2N1cmwuaCB0byB1c2UgYSAnY3VybF8nIHByZWZpeCBhcwogIGFsbCBwdWJsaWMgY3VybC1zeW1ib2xzIHNob3VsZC4KCi0gbGliY3VybCBub3cgZXhwbGljaXRseSBpZ25vcmVzIHRoZSBTSUdQSVBFIHNpZ25hbC4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCdzIGNoYW5nZSB0byB0aGUgY29va2llLWphciBjb21tZW50IChpbiB0aGUgc3RvcmVkIGZpbGUpIHdhcwogIGFwcGxpZWQuCgotIEx1Y2FzIEFkYW1za2kncyBtaW5vciBidWcgaW4gdGhlIGJpbmQgZXJyb3IgY29kZSBmYWlsZigpIHdhcyBmaXhlZC4KCkRhbmllbCAoNSBPY3RvYmVyIDIwMDEpCi0gTW9vbmVzYW15IGZpeGVkIHRoZSBDdXJsX2Nvbm5lY3Rob3N0KCkgZnVuY3Rpb24gdG8gbm90IGdpdmUgY29tcGlsZXIgZXJyb3JzCiAgb24gYSBidW5jaCBvZiBjb21waWxlcnMsIGR1ZSB0byB0aGUgYXJndW1lbnQgbmFtZWQgJ3NvY2tldCcuCgotIE1vb25lc2FteSBhbHNvIHByb3ZpZGVkIHVwZGF0ZWQgVkMrKyBtYWtlZmlsZXMgYW5kIHByb2plY3QgZmlsZXMuCgpWZXJzaW9uIDcuOS4xLXByZTIKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDEpCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgc2NyaXB0IGRldGVjdCBwcm9wZXIKICBnZXRob3N0YnluYW1lX3IoKSBtZXRob2Qgd2l0aG91dCBhY3R1YWxseSBydW5uaW5nIGFueSBjb2RlLCBvbmx5IGNvbXBpbGluZwogIGlzIG5lY2Vzc2FyeS4gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5lZWQgb2YgaGF2aW5nIGEgcmVzb2x2aW5nICdsb2NhbGhvc3QnCiAgbmFtZS4KCi0gRm91bmQgYW5kIHJlbW92ZWQgbWVtb3J5IGxlYWthZ2UgKG5hbWUgcmVzb2x2ZSBkYXRhKSBpbiBsaWJjdXJsIG9uCiAgSVB2Ni1lbmFibGVkIGhvc3RzLiBUaGVzZSBjb3VsZCBzbmVhayB0aHJvdWdoIGJlY2F1c2Ugd2UgZGlkbid0IGhhdmUgYW55CiAgcmVzb3VyY2UgdHJhY2luZyBvbiB0aGUgSVB2Ni1yZWxhdGVkIGZ1bmN0aW9ucy4gV2UgZG8gbm93LgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMSkKLSBLZWl0aCBNY0d1aWdhbiBwYXRjaGVkIGF3YXkgYSAobWFpbmx5IFdpbmRvd3MtKSBwcm9ibGVtIHdpdGggdGhlIG5hbWUKICByZXNvbHZlciBkYXRhIGJlaW5nIGtlcHQgaW4gdGhlIHN0YXRpYyBtZW1vcnkgYXJlYSwgd2hpY2ggaXMgcmVtb3ZlZCB3aGVuIGEKICB0aHJlYWQgaXMga2lsbGVkLiBUaGUgY3VybCBoYW5kbGUgaXRzZWxmIHRob3VnaCBwZXJmZWN0bHkgaGFuZGxlcyBiZWluZwogIHBhc3NlZCBiZXR3ZWVuIHRocmVhZHMuCgotIERpcmsgRWRkZWxidWV0dGVsIHJlcG9ydGVkIGFuIG9kZCBidWcgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIGhpcyBwcm94eSB0aGF0CiAgcmVxdWlyZWQgYW4gQXV0aG9yaXphdGlvbjogaGVhZGVyLiBOb3csIHByb3hpZXMgYXJlIG5vdCBzdXBwb3NlZCB0byByZXF1aXJlCiAgdGhhdCBoZWFkZXIsIHRoYXQgaXMgZm9yIHRydWUgc2VydmVycy4uLgoKLSBJIGFjY2lkZW50YWxseSBydWluZWQgR2VvcmcncyBjdXJsX2Zvcm1hZGQoKS4gVWgsIGJhZCBtZS4gQ29ycmVjdGVkIG5vdy4KClZlcnNpb24gNy45LjEtcHJlMQoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMSkKLSBHZW9yZyBIdWV0dGVuZWdnZXIgb25jZSBhZ2FpbiBtYWRlIGFuIGVmZm9ydCBiZXlvbmQgdGhlIGNhbGwgb2YgZHV0eSBhbmQgbm90CiAgb25seSBpbXByb3ZlZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sIGJ1dCBhbHNvIHRvb2sgY2FyZSBvZiBhZGp1c3RpbmcKICB0aGUgY3VybCBjb21tYW5kIGxpbmUgY2xpZW50IHRvIHVzZSB0aGlzIG5ldyBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZQogIG9ic29sZXRlZCBjdXJsX2Zvcm1wYXJzZS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDEpCi0gTWFqb3IgZml4IGluIGhvdyBsaWJjdXJsIGRvZXMgVENQIGNvbm5lY3RzLiBJdCBub3cgZG9lcyBub24tYmxvY2tpbmcKICBjb25uZWN0cyB0byBlbmFibGUgZ29vZCB0aW1lb3V0cyB3aXRob3V0IHNpZ25hbHMsIGFuZCBpdCBub3cgdHJpZXMgYWxsIElQCiAgYWRkcmVzc2VzIGZvciBhbnkgZ2l2ZW4gaG9zdCAoaWYgaXQgcmVzb2x2ZXMgbW9yZSB0aGFuIG9uZSBhbmQgdGhlIGZpcnN0CiAgb25lKHMpIGRvbid0IGNvbm5lY3QpLiBBZGRlZCBhIG5ldyBzb3VyY2UgZmlsZSAnY29ubmVjdC5jJyB0byBkZWFsIHdpdGggYWxsCiAgdGhlIFRDUCBjb25uZWN0IHN0dWZmLgoKLSBXZSBub3cgc3VwcG9ydCBJUHY0LXN0eWxlIElQLWFkZHJlc3NlcyBpbiByZmMyNzMyLWZvcm1hdCwgdG8gYmV0dGVyIHN1cHBvcnQKICBwZW9wbGUgd3JpdGluZyBzY3JpcHRzIHdpdGhvdXQga25vd2luZyB3aGF0IGFkZHJlc3MgdGhlcmUgaXMuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAxKQotIENsZWFudXBzIGluIHRoZSBGVFAgc291cmNlIGNvZGUuIERpdmlkZWQgdGhlIGNvZGUgaW50byBldmVuIG1vcmUgc21hbGxlcgogIGZ1bmN0aW9ucyBhbmQgZ2VuZXJhbGx5IHRyaWVkIHRvIG1ha2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSVB2NCBhbmQgSVB2NgogIGdldCBsZXNzIG5vdGljYWJsZSBpbiB0aGUgc291cmNlcy4KCi0gSWYgdGhlIHJlbW90ZSBmaWxlIHRpbWUgaXMgbm90IHJlYWRhYmxlL2FjY2Vzc2FibGUvdW5kZXJzdG9vZCBieSBsaWJjdXJsLAogIGxpYmN1cmwgbm93IHJldHVybnMgLTEgaW4gdGhlIENVUkxJTkZPX0ZJTEVUSU1FIGRhdGEsIG5vdCAwIGFzIGl0IHByZXZpb3VzbHkKICBkaWQuIFRoaXMgc2hvdWxkIG1ha2UgY3VybCBub3QgdG91Y2ggdGhlIGZpbGUgZGF0YSB1bmxlc3MgdGhlcmUgd2FzIGEga25vd24KICByZW1vdGUgZGF0ZSB3aGVuIC1SIGlzIHVzZWQuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDAxKQotIFdvcmtpbmcgb24gZ2V0dGluZyBub24tYmxvY2tpbmcgY29ubmVjdHMgd29ya2luZyBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gV2UKICB3aWxsIGFsc28gbWFrZSBjdXJsIHRyeSBhbGwgSVBzIGZvciBhIGdpdmVuIGhvc3QgaWYgdGhlIGZpcnN0IG9uZSBzaG91bGQKICBmYWlsLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMSkKLSBLZXZpbiBSb3RoIHByb3ZpZGVkIGEgY29va2llIGV4YW1wbGUgdGhhdCBwcm92ZWQgdGhlIGNvb2tpZSBqYXIKICBmdW5jdGlvbmFsaXR5IHdhc24ndCB3b3JraW5nIHByb3Blcmx5LiBJIGFkZGVkIHRlc3QgY2FzZSA0NiBhbmQgbWFkZSBpdAogIHdvcmsuCgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDAxKQotIEr2cm4gSGFydHJvdGggdXBkYXRlZCB0aGUgbWluZ3czMiBtYWtlZmlsZXMuCgpWZXJzaW9uIDcuOQoKRGFuaWVsICgyMyBTZXB0ZW1iZXIgMjAwMSkKLSBGb3VuZCBhbmQgcmVtb3ZlZCBhICdzb2NrZXQgbGVhaycgdGhhdCB3b3VsZCBvY2N1ciBvbiBJUHY2IGVuYWJsZWQgaG9zdHMKICB3aGVuIEZUUCBSRVRSIGZhaWxlZC4KCi0gTWFkZSB0aGUgRlRQIHVwbG9hZCB0ZXN0cyBydW4gZmluZSBvbiBtYWNoaW5lcyB3aXRoIElQdjYgZW5hYmxlZC4KClZlcnNpb24gNy45LXByZTgKCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDEpCi0gVm9qdGVjaCBNaW5hcmlrIHNldCB1cCBhIHNwZWNpYWwtcHVycG9zZSB0ZXN0IHNlcnZlciBhbmQgcHJvdmlkZWQgbWUgd2l0aAogIHRlc3QgY2VydGlmaWNhdGVzIGluIG9yZGVyIGZvciBtZSB0byByZXBlYXQgdGhlIGJ1ZyByZXBvcnRzICM0NDAwNjggYW5kCiAgIzQ0MDM3My4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgY2hlY2sgYWxsIHRoZSBlcnJvciBjb2RlcyBwcm9wZXJseS4gV2UgZG8KICBub3csIGFuZCBjb25uZWN0aW5nIHdpdGggYSB1bmFjY2VwdGFibGUgY2VydGlmaWNhdGUgd2lsbCBtYWtlIGxpYmN1cmwgZmFpbAogIHRvIGNvbm5lY3Qgd2l0aCBhbiBlcnJvciBjb2RlIHJldHVybmVkLgoKLSBSYW1hbmEgTW9ra2FwYXRpIGZvdW5kIGEgY2FzZSB3aGVuIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgZGlkIHdyb25nLgogIEkgd3JvdGUgYSB0ZXN0IGNhc2UgZm9yIHRoaXMgKDQ1KS4KClZlcnNpb24gNy45LXByZTcKCkRhbmllbCAoMTcgU2VwdGVtYmVyIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBmaXhlZCB0ZWxuZXQgZm9yIHdpbjMyLiBJdCBtYWtlcyBsaWJjdXJsIHJlcXVpcmUKICB3aW5zb2NrIDIuMC4KClZlcnNpb24gNy45LXByZTYKCi0gbGlidG9vbCAxLjQuMiBpcyBub3cgaW4gdXNlIQoKVmVyc2lvbiA3LjktcHJlNQoKRGFuaWVsICgxNCBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCBhbm90aGVyIDE0IGZ0cCB0ZXN0cy4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHRvIHRoZSBlYXN5LmggaGVhZGVyIGZpbGUuIEl0IGhhcyBub3cgYmVlbgogIHRlc3RlZCBhbmQgcHJvdmVkIHRvIHdvcmsgaW4gYSByZWFsLXdvcmxkIHRlc3RzIGJ5IFQgQmhhcmF0aC4gV2Ugc3RpbGwgbmVlZAogIHRvIHdyaXRlIHVwIHNvbWUgZG9jcyBmb3IgdGhpcyBmdW5jdGlvbi4KCi0gQWRkZWQgZm91ciBtb3JlIGZ0cCB0ZXN0cyB0byB0aGUgdGVzdCBzdWl0ZS4KCkRhbmllbCAoMTIgU2VwdGVtYmVyIDIwMDEpCi0gQ1VSTE9QVF9TU0xfQ0lQSEVSX0xJU1Qgd2FzIGFkZGVkLCBhbmQgdGhlIGN1cmwgdG9vbCBvcHRpb24gaXMgbmFtZWQKICAtLWNpcGhlcnMuIFVzZSB0aGVtIHRvIHNwZWNpZnkgYSBsaXN0IG9mIGNpcGhlcnMgdG8gdXNlIGluIHRoZSBTU0wKICBjb25uZWN0aW9uLgoKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gbGliY3VybCdzIHdpbmRvd3MgdmVyc2lvbi4gSXQgdHVybmVkIG91dAogIHRvIGJlIHRoZSBuZXcgZHVwaGFuZGxlKCkgdGhhdCBkaWRuJ3QgcXVpdGUgd29yayB5ZXQuCgpWZXJzaW9uIDcuOS1wcmU0CgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIHZlcmJvc2Ugb3V0cHV0IGZvciBTU0wgY29ubmVjdGlvbnMgdGhhdCBvdXRwdXQgdGhlIHNlcnZlcgogIGNlcnRpZmljYXRlJ3Mgc3RhcnQgYW5kIGV4cGlyZSBkYXRlcy4gQXMgc3VnZ2VzdGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCi0gSGVpa2tpIEtvcnBlbGEgZm91bmQgcHJvYmxlbXMgaW4gdGhlIHBlcmwgZnRwIHNlcnZlciB1c2VkIGZvciB0aGUgdGVzdAogIHN1aXRlLCB3aGVuIGhlIHJ1bnMgb24gb24gT3BlbkJTRCB3aXRoIHBlcmwgNS42LiBTb21lIGNoYW5nZXMgaGF2ZSBiZWVuCiAgbWFkZSwgYnV0IG5vdGhpbmcgcmVhbGx5IGNlcnRhaW4uCgotIFQuIEJoYXJhdGggaGFzIGV4cGVyaWVuY2VkIHByb2JsZW1zIHdpdGggbGliY3VybCdzIHN0YWNrIHVzYWdlIG9uIHdpbmRvd3MKICBhbmQgd29ya3Mgb24gcmVkdWNpbmcgaXQuCgpEYW5pZWwgKDEwIFNlcHRlbWJlciAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgcGVybCBpbnRlcmZhY2UuIEl0IHN0b3BwZWQgd29ya2luZyBzaW5jZSB0aGUgY2hhbmdlZAogIGJlaGF2aW9yIHdpdGggV1JJVEVIRUFERVIgYW5kIE5VTEwgcG9pbnRlcnMuCgotIFRoZSAib3V0cHV0IGNvb2tpZXMiIGZ1bmN0aW9uIGNvdWxkIGR1bXAgY29yZSBpZiBubyBjb29raWVzIHdlcmUgZW5hYmxlZC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMSkKLSBTTSBwb2ludGVkIG91dCB0aGF0IHRoZSBTU0wgY29kZSBkaWRuJ3QgY29tcGlsZSBhbnkgbG9uZ2VyIGlmIFNTTCB3YXMKICBkaXNhYmxlZC4uLiBBbHNvLCB3ZSBuZWVkZWQgdG8gY29ycmVjdCB0aGUgI2luY2x1ZGUgZm9yIHRoZSB1dGltZSBzdHVmZiBvbgogIHdpbmRvd3MuCgpEYW5pZWwgKDYgU2VwdGVtYmVyIDIwMDEpCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlIFNTTCBzZXNzaW9uIGNhY2hlIGNvZGUgdGhhdCBtYWRlIGl0CiAgc29tZXRpbWVzIHJlYWQgZnJvbSBhIE5VTEwgcG9pbnRlci4KClZlcnNpb24gNy45LXByZTMKCkRhbmllbCAoMyBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB0aGUgLVIvLS1yZW1vdGUtdGltZSBvcHRpb24sIHRoYXQgdXNlcyB0aGUgcmVtb3RlIGZpbGUncyBkYXRlc3RhbXAgdG8KICBzZXQgdGhlIGxvY2FsIGZpbGUncyBkYXRlc3RhbXAuIFRodXMsIHdoZW4geW91IGdldCBhIHJlbW90ZSBmaWxlIHlvdXIgbG9jYWwKICBmaWxlIHdpbGwgZ2V0IHRoZSBzYW1lIHRpbWUgYW5kIGRhdGUuIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgd2hlbiB5b3UgdXNlCiAgLW8gb3IgLU8uCgotIEluc3RhbGxlZCBsaWJ0b29sIDEuNC4xLCBsaWJ0b29saXplZCBhbmQgZXZlcnl0aGluZy4KCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb2ludGVkIG91dCB0aGF0IEkgZGlkIG5vdCBzaGlwIHRoZSBwcm9wZXIgbGlidG9vbCBzdHVmZiBpbiAKICB0aGUgcHJlLXJlbGVhc2VzLCBldmVuIHRob3VnaCB0aGF0IHdhcyBteSBpbnRlbnRpb24uIGxpYnRvb2xpemUgaGFzIG5vdwogIGJlZW4gcmUtcnVuLgoKLSBIZWlra2kgYWxzbyBwYXRjaGVkIGF3YXkgdGhlIGJhZCB1c2Ugb2YgJ21ha2UgLUMnIGluIHRoZSB0ZXN0IHN1aXRlCiAgbWFrZWZpbGUuIG1ha2UgLUMgaXMgbm90IHZlcnkgcG9ydGFibGUgYW5kIGlzIG5vdyBiYW5uZWQgZnJvbSBoZXJlLgoKVmVyc2lvbiA3LjktcHJlMgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwMSkKLSBJIGp1c3QgbWFkZSBhIGh1Z2UgaW50ZXJuYWwgc3RydWN0IHJlaGF1bCwgYW5kIGFsbCB0aGUgYmlnIGludGVybmFsbHkgdXNlZAogIHN0cnVjdHMgaGF2ZSBiZWVuIHJlbmFtZWQsIHJlZGVzaWduZWQgYW5kIHN0dWZmIGhhdmUgYmVlbiBtb3ZlZCBhcm91bmQgYSBiaXQKICB0byBtYWtlIHRoZSBzb3VyY2UgZWFzaWVyIHRvIGZvbGxvdywgbW9yZSBsb2dpY2FsbHkgZ3JvdXBlZCBhbmQgdG8gaG9wZWZ1bGx5CiAgZGVjcmVhc2UgZnV0dXJlIGJ1Z3MuIEkgYWxzbyBob3BlIHRoYXQgdGhpcyB3aWxsIG1ha2UgbmV3IGZ1bmN0aW9ucyB0byBnZXQKICBlYXNpZXIgdG8gYWRkLCBhbmQgbWFrZSBpdCBsZXNzIGxpa2VseSB0aGF0IHdlIGhhdmUgYnVncyBsZWZ0IGxpa2UgdGhlIFVSTC0KICBmcmVlIGJ1ZyBmcm9tIEF1Z3VzdCAyMy4KClZlcnNpb24gNy45LXByZTEKCkRhbmllbCAoMjkgQXVndXN0IDIwMDEpCi0gVGhlIG5ldyBjb29raWUgY29kZSBoYXZlIGVuYWJsZWQgdGhlIGJyYW5kIG5ldyAnLWMvLS1jb29raWUtamFyJyBvcHRpb24uIFVzZQogIHRoYXQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIGluIHdoaWNoIHlvdSB3YW50IHRvIGhhdmUgYWxsIGNvb2tpZXMgY3VybAogIGtub3dzIG9mLCBkdW1wZWQgdG8uIEl0J2xsIGJlIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldHNjYXBlIGNvb2tpZSBmb3JtYXQuCgogIFRoaXMgaXMgaW50ZXJuYWxseSBkb25lIHdpdGggdGhlIG5ldyBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gdG8gbGliY3VybCwKICB3aGljaCBpbiB0dXJuIGR1bXBzIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBjdXJsX2Vhc3lfY2xlYW51cCgpIGlzIGludm9rZWQuCiAgVGhlcmUgbWlnaHQgYmUgcmVhc29ucyB0byByZS1jb25zaWRlciBteSBjaG9pY2Ugb2YgcHV0dGluZyBpdCB0aGVyZS4gUGVyaGFwcwogIGl0IGlzIGJldHRlciBwbGFjZWQgdG8gZ2V0IGRvbmUganVzdCBiZWZvcmUgKl9wZXJmb3JtKCkgaXMgZG9uZS4gSXQgaXMgYWxsCiAgb2YgY291cnNlIGRlcGVuZGluZyBvbiBob3cgeW91IGd1eXMgd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlLi4uCgotIEFkZGVkIGZ0cHVwbG9hZC5jIGluIHRoZSBzb3VyY2UgZXhhbXBsZXMgc2VjdGlvbiwgYmFzZWQgb24gc291cmNlIGNvZGUgcG9zdGVkCiAgYnkgRXJpY2sgTnV3ZW5kYW0uCgpEYW5pZWwgKDI4IEF1Z3VzdCAyMDAxKQotIE5vdyBydW5uaW5nIGxpYnRvb2wgQ1ZTIGJyYW5jaC0xLTQgdG8gZ2VuZXJhdGUgc3R1ZmYuIFNob3VsZCBmaXggcHJvYmxlbXMKICBvbiBPcGVuQlNEIGFuZCBob3BlZnVsbHkgb24gRnJlZUJTRCBhcyB3ZWxsIQoKLSBHZW9yZyBIdWV0dGVuZWdnZXIgbW9kaWZpZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uYWxpdHkgc2xpZ2h0bHksIGFuZAogIGFkZGVkIHN1cHBvcnQgZm9yIGVycm9yIGNvZGUgNDE3IHdoZW4gZG9pbmcgZm9ybSBwb3N0IGFuZCB1c2luZyB0aGUgRXhwZWN0OgogIGhlYWRlci4gR3JlYXQgd29yayEKCi0gTWFkZSBzb21lIHRlc3RzIHdpdGggY2FjaGVkIFNTTCBzZXNzaW9uIElEcywgYW5kIHRoZXkgc2VlbSB0byB3b3JrLiBUaGVyZQogIHNob3VsZCBiZSBhIHNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50IGluIHRoZSBTU0wgY29ubmVjdGlvbiBwaGFzZSwgYnV0CiAgaW4gbXkgdGlueSB0ZXN0cyBpdCBqdXN0IGlzbid0IHBvc3NpYmxlIHRvIG5vdGljZSBhbnkgZGlmZmVyZW5jZS4gTGlrZSBvdGhlcgogIGNhY2hpbmcgaW4gbGliY3VybCwgeW91IG11c3QgcmV1c2UgdGhlIHNhbWUgaGFuZGxlIGZvciB0aGUgY2FjaGluZyB0byB0YWtlCiAgZWZmZWN0LiBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGlzIGRvbmUgb24gYSBwZXIgaG9zdC1uYW1lIGFuZCBkZXN0aW5hdGlvbgogIHBvcnQgbnVtYmVyIGJhc2lzLgoKICBTZXQgdmVyYm9zZSwgYW5kIHlvdSdsbCBnZXQgaW5mb3JtYXRpb25hbCB0ZXN0cyB3aGVuIGxpYmN1cmwgZGV0ZWN0cyBhbmQKICB1c2VzIGEgcHJldmlvdXMgU1NMIHNlc3Npb24gSUQuCgotIFVwZ3JhZGVkIHRvIGF1dG9tYWtlIDEuNSBvbiBteSBkZXZlbG9wbWVudC9yZWxlYXNlIG1hY2hpbmUuCgpEYW5pZWwgKDI3IEF1Z3VzdCAyMDAxKQotIFNsb3dseSBzdGFydGVkIHdyaXRpbmcgU1NMIHNlc3Npb24gSUQgY2FjaGluZyBjb2RlCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggcmVtb3ZlZCBjb21waWxlciB3YXJuaW5ncyBvbiB3aW5kb3dzIGFuZCB1cGRhdGVkIHRoZSBNUyBwcm9qZWN0CiAgZmlsZXMuCgotIEtldmluIFJvdGggcmVwb3J0ZWQgdHdvIGtpbmRzIG9mIGNvbW1hbmQgbGluZSBjb25zdHJ1Y3RzIHdpdGggdGhlIG5ldyAtRyB0aGF0CiAgY3VybCBkaWRuJ3QgcmVhbGx5IGRlYWwgd2l0aCB0aGUgd2F5IG9uZSB3b3VsZCBsaWtlLgoKLSBUaW0gQ29zdGVsbG8gcGF0Y2hlZCBhd2F5IGEgdXNlIG9mIHN0cmNhc2VjbXAoKSBpbiB0aGUgU1NMIGNvZGUuIFdlIGhhdmUgb3VyCiAgb3duIHBvcnRhYmxlIHZlcnNpb24gbmFtZWQgc3RyZXF1YWwoKSB0aGF0IHNob3VsZCBiZSB1c2VkIQoKLSBUaW0gYWxzbyBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIGxpYi9NYWtlZmlsZS52YzYgZmlsZSB0aGF0IG1hZGUgaXQgbWl4CiAgZGVidWcgb2JqZWN0IG1vZHVsZXMgY2F1c2luZyBjb25mdXNpb25zLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIGFjY3VyYXRlbHkgZm91bmQgYSBsaWJjdXJsIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIGRvaW5nIGEKICBzZWNvbmQgaW52b2tlIG9mIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aCBhIG5ldyBVUkwgd2hlbiB0aGUgcHJldmlvdXMgaW52b2tlCiAgZm9sbG93ZWQgYSBMb2NhdGlvbjogaGVhZGVyLgoKLSBTdGFydGVkIHRoZSBpbXByb3ZlbWVudCB3b3JrIG9uIHRoZSBjb29raWUgZW5naW5lOgogIC0gTm93IGtlZXBzIGNvb2tpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNvb2tpZSBmaWxlCiAgLSBBIHdyaXRlIHRvIHRoZSBwb3NzaWJseSBzdGF0aWMgc3RyaW5nIHdhcyByZW1vdmVkCiAgLSBBZGRlZCBhIGZ1bmN0aW9uIHRoYXQgY2FuIG91dHB1dCBhbGwgY29va2llcwogIC0gTm93IHN1cHBvcnRzIHJlYWRpbmcgbXVsdGlwbGUgY29va2llIGZpbGVzCgotIFN0ZXZlIExob21tZSBjb3JyZWN0ZWQgYSBETEwgbmFtaW5nIGlzc3VlIGluIHRoZSBNU1ZDKysgcHJvamVjdCBmaWxlLgoKLSBTcGxpdCB1cCB0aGUgbW9uc3RlciBmdW5jdGlvbiBpbiBsaWIvZnRwLmMgdG8gdXNlIG1vcmUgc21hbGxpc2ggZnVuY3Rpb25zIHRvCiAgaW5jcmVhc2UgcmVhZGFiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eS4KCkRhbmllbCAoMjEgQXVndXN0IDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyJ3MgYmlnIHBhdGNoIHdhcyBhcHBsaWVkLiBOb3cgd2UgaGF2ZToKICBvICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgc3VwcG9ydC4gV2Ugd2lsbCBmcm9tIG5vdyBvbiBzZW5kIHRoYXQgaGVhZGVyIGluCiAgICBhbGwgcmZjMTg2Ny1wb3N0cywgYXMgdGhhdCBtYWtlcyB1cyBhYm9ydCBtdWNoIGZhc3RlciB3aGVuIHRoZSBzZXJ2ZXIKICAgIHJlamVjdHMgb3VyIFBPU1QuIFBvc3Rpbmcgd2l0aG91dCB0aGUgRXhwZWN0OiBoZWFkZXIgaXMgc3RpbGwgcG9zc2libGUgaW4KICAgIHRoZSBzdGFuZGFyZCByZXBsYWNlLWludGVybmFsLWhlYWRlciBzdHlsZS4KICBvIGN1cmxfZm9ybWFkZCgpIGlzIGEgbmV3IGZvcm1wb3N0IGJ1aWxkaW5nIGZ1bmN0aW9uIHRoYXQgaXMgaW50cm9kdWNlZCB0bwogICAgcmVwbGFjZSB0aGUgbm93IGRlcHJlY2F0ZWQgY3VybF9mb3JtcGFyc2UoKSBmdW5jdGlvbi4gVGhlIGxhdHRlciBmdW5jdGlvbgogICAgd2lsbCBzdGlsbCBoYW5nIGFyb3VuZCBmb3IgYSB3aGlsZSwgYnV0IHRoZSBjdXJsX2Zvcm1hZGQoKSBpcyB0aGUgbmV3IHdheQogICAgYW5kIGNvcnJlY3Qgd2F5IHRvIGJ1aWxkIGZvcm0gcG9zdHMuCiAgbyBEb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGVzZSBjaGFuZ2VzCgogIFRoZXNlIGNoYW5nZXMgYXJlIHJlYXNvbiBlbm91Z2ggdG8gbmFtZSB0aGUgbmV4dCBjdXJsIHJlbGVhc2UgNy45Li4uCgotIFdlIG5vdyBjb252ZXJ0IG1hbiBwYWdlcyB0byBIVE1MIHBhZ2VzIGFuZCBpbmNsdWRlIHRoZW0gaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlLiBGb3IgdGhlIHBsZWFzdXJlIG9mIGV2ZXJ5b25lIHdpdGhvdXQgbnJvZmYgd2l0aGluIHJlYWNoLgoKLSBBbmRy6XMgR2FyY+1hJ3Mgc3VnZ2VzdGVkIGZsdXNoaW5nIG9mIHRoZSBwcm9ncmVzcyBtZXRlciBvdXRwdXQgc3RyZWFtIHdhcwogIGFkZGVkLiBJdCBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgbG9vayBiZXR0ZXIgb24gV2luZG93cy4KCi0gVHJveSBFbmdlbCBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwKICBvbiBtYW55IFJlZCBIYXQgYm94ZXMhCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIFdlIG5lZWQgYW4gdXBkYXRlZCBsaWJ0b29sIHRvIG1ha2UgYSBiZXR0ZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIE9wZW5CU0QKICBhcyB3ZWxsIGFzIEZyZWVCU0QKClZlcnNpb24gNy44LjEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gQnJhZCBwb2ludGVkIG91dCB0aGF0IHdlIHNoaXAgdHdvIGV4dHJhIGxpYnRvb2wgZmlsZXMgaW4gdGhlIHRhcmJhbGxzIHRoYXQKICB3ZSByZWFsbHkgZG9uJ3QgbmVlZCB0byEgUmVtb3ZpbmcgdGhlbSBtYWtlcyB0aGUgZ3otYXJjaGl2ZSBhYm91dCA2MEsKICBzbWFsbGVyIQoKLSBBbGJlcnQgQ2hpbiBicm91Z2h0IGZpeGVzIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBkZXRlY3Qgc29ja2xlbl90CiAgcHJvcGVybHkgYXMgd2VsbCBhcyBtb3ZpbmcgbG90cyBvZiBvdXIgY3VzdG9tIGF1dG9jb25mIG1hY3JvcyB0bwogIGFjaW5jbHVkZS5tNC4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDEpCi0gTW9vbmVzYW15IGltcHJvdmVkIGhpcyAtRyBmZWF0dXJlIGZvciBob3N0IG5hbWVzIG9ubHkgVVJMcy4uLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMSkKLSBGaW5hbGx5IGNsZWFuZWQgdXAgdGhlIGtlcmJlcm9zIGNvZGUgdG8gdXNlIEN1cmxfIHByZWZpeGVzIG9uIGFsbCBnbG9iYWwKICBzeW1ib2xzIGFuZCB0byBub3QgdXNlIGdsb2JhbCB2YXJpYWJsZXMuCgpWZXJzaW9uIDcuOC4xLXByZTYKCkRhbmllbCAoMTYgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGFkZGVkIHRoZSAtRyBvcHRpb24gdG8gY3VybCwgdGhhdCBjb252ZXJ0cyB0aGUgZGF0YSBzcGVjaWZpZWQKICB3aXRoIC1kIHRvIGEgR0VUIHJlcXVlc3QuIERlZmF1bHQgYWN0aW9uIHdoZW4gdXNpbmcgLWQgaXMgUE9TVC4gV2hlbiAtRyBpcwogIHVzZWQsIHRoZSAtZCBzcGVjaWZpZWQgZGF0YSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBVUkwgd2l0aCBhICc/JwogIHNlcGFyYXRvci4gQXMgc3VnZ2VzdGVkIHByZXZpb3VzbHkgYnkgS2V2aW4gUm90aC4KCi0gY3VybC1jb25maWcgLS1saWJzIHNob3VsZCBub3cgZGlzcGxheSBhbGwgbGlua2VyIG9wdGlvbnMgcmVxdWlyZWQgdG8gbGluawogIHdpdGggbGliY3VybC4gSXQgaW5jbHVkZXMgdGhlIHBhdGggYW5kIG9wdGlvbnMgZm9yIGxpYmN1cmwgaXRzZWxmLgogIGN1cmwtY29uZmlnIC0tY2ZsYWdzIGRpc3BsYXlzIHRoZSBjb21waWxlciBvcHRpb24ocykgbmVlZGVkIHRvIGNvbXBpbGUKICBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgbGliY3VybCBmdW5jdGlvbnMuIEJhc2ljYWxseSwgdGhhdCBzZXRzIHRoZSBpbmNsdWRlCiAgcGF0aCBjb3JyZWN0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwMSkKLSBBcmthZGl1c3ogTWlza2lld2ljeiBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gaG93IElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzCiAgd2VyZSBwYXJzZWQgYW5kIHVzZWQuIChSRkMyNzMyLWZvcm1hdCkKCi0gQnVnICMxMjczMyBvdmVyIG9uIHBocC5uZXQgaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gbGliY3VybCB0aGF0IG1hZGUgaXQgY29yZQogIGR1bXAgaWYgeW91IHVzZWQgQ1VSTE9QVF9QT1NUIHdpdGhvdXQgc2V0dGluZyBhbnkgZGF0YSB0byBwb3N0IHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMhIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiBOb3QgdXNpbmcgQ1VSTE9QVF9QT1NURklFTERTCiAgbm93IGVxdWFscyBzZXR0aW5nIGl0IHRvIG5vIGRhdGEgYXQgYWxsLgoKLSBSYW1hbmEgTW9ra2FwYXRpIHJlcG9ydGVkIHRoYXQgY3VybCB3aXRoICctdyAle2h0dHBfY29kZX0nIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgd2hlbiB1c2VkIGZvciBtdWx0aXBsZSBVUkxzIG9uIGEgc2luZ2xlIGNvbW1hbmQgbGluZS4gSW5kZWVkLCB0aGUKICB2YXJpYWJsZSB3YXMgbm90IHJlc2V0IGJldHdlZW4gdGhlIHJlcXVlc3RzLiBUaGlzIGlzIG5vdyBmaXhlZC4KCi0gRGF2aWQgSmFtZXMgZml4ZWQgdGhlIEJvcmxhbmQgbWFrZWZpbGUgc28gdGhhdCBsaWJjdXJsIHN0aWxsIGNvbXBpbGVzIGFuZAogIGJ1aWxkcyB3aXRoIHRoYXQgY29tcGlsZXIuCgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE9vcHMuIEkgcnVpbmVkIE5pY28ncyBzb2NrbGVuX3QgZGVmaW5lIGluIGNvbmZpZy12bXMuaCwgY29ycmVjdGVkIGl0IG5vdy4KCi0gQW4gb2xkZXIgaXRlbSBub3QgbWVudGlvbmVkIGhlcmUgYmVmb3JlOiBDVVJMX0dMT0JBTF9XSU4zMiBpcyBhIGRlZmluZSBmb3IKICB3aW5kb3dzIHVzZXJzIHRvIGN1cmxfZ2xvYmFsX2luaXQoKSwgdGhhdCBtYWtlcyBsaWJjdXJsIGluaXQgdGhlIHdpbnNvY2sKICBzdHVmZi4gSWYgbGliY3VybCBpcyBhbGwgc29ja2V0IHN0dWZmIHlvdSBkbywgdGhlbiBhbGxvd2luZyBpdCB0byBmaWRkbGUKICB3aXRoIHRoaXMgaXMgYSBjb21mb3J0YWJsZSBzaG9ydGN1dCB0byBmYW1lLgoKVmVyc2lvbiA3LjguMS1wcmU1CgpEYW5pZWwgKDE0IEF1Z3VzdCAyMDAxKQotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIG1vcmUgZmVlZGJhY2sgZnJvbSBoaXMgVk1TIHBvcnRpbmcgZWZmb3J0cyBhbmQgYSBmZXcKICBtaW5vciBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5LgoKLSBJIG1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBzbyB0aGF0IC0tZW5hYmxlLWRlYnVnIHNldHMgbW9yZSBwaWNreSBnY2Mgb3B0aW9ucy4KICBJIHRoZW4gcmVtb3ZlZCBhbG1vc3QgYWxsIHRoZSBuZXcgd2FybmluZ3MgdGhhdCBhcHBlYXJlZCwgYW5kIGJ5IGRvaW5nIHNvIEkKICBjb3JyZWN0ZWQgdGhlIHNpemVfdC10cmVhdGVkLWFzLXNpZ25lZCBwcm9ibGVtIHRoYXQgaGFzIGJlZW4gZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdCBwcmV2aW91c2x5LiBJIGFsc28gcmVtb3ZlZCBhIGJ1bmNoIG9mIHRoZSBqdXN0IHJlY2VudGx5CiAgYWRkZWQgI2lmZGVmIFZNUyBsaW5lcy4KCi0gSSByZW1vdmVkIHRoZSB1c2Ugb2YgYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIFNTTCBjb2RlLiBJdCB3YXMgb25jZQogIG5lY2Vzc2FyeSBidXQgaGFzbid0IGJlZW4gbmVlZGVkIHNpbmNlIE9wZW5TU0wgMC45LjQuIFRoZSBvbGQgY29kZSBzaG91bGQKICAoaG9wZWZ1bGx5KSBzdGlsbCB3b3JrIGlmIGxpYmN1cmwgaXMgYnVpbHQgYWdhaW5zdCBhbiBhbmNpZW50IHZlcnNpb24gb2YKICBPcGVuU1NMLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwMSkKLSBQZXRlciBUb2RkIHBvc3RlZCBhIHBhdGNoIHRoYXQgbm93IGFsbG93cyBub24tZmlsZSByYzE4Njctc3R5bGUgZm9ybSBwb3N0cwogIHRvIGJlIGxhcmdlciB0aGFuIDRLLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgZml4ZWQgYnVncyBmb3IgYnVpbGRpbmcgZGVidWcgYW5kIFNTTCBsaWIgaW4gVkMgbWFrZWZpbGUKCkRhbmllbCAoOSBBdWd1c3QgMjAwMSkKLSBUaGUgcmVkaXJlY3RlZCBlcnJvciBzdHJlYW0gd2FzIGNsb3NlZCBiZWZvcmUgdGhlIGN1cmxfZWFzeV9jbGVhbnVwKCkgY2FsbAogIHdhcyBtYWRlLCBhbmQgd2hlbiBWRVJCT1NFIHdhcyBlbmFibGVkLCB0aGUgY2xlYW51cCBmdW5jdGlvbiB0cmllZCB0byB1c2UKICB0aGUgc3RyZWFtLiBJdCBjb3VsZCBsZWFkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0LiBBbHNvLCB0aGUgc3RyZWFtIHdhcwogIGNsb3NlZCBldmVuIGlmIHdlIGxvb3BlZCB0byBnZXQgbW9yZSBmaWxlcy4gIENvcnJlY3RzIER1c3RpbiBCb3N3ZWxsJ3MgYnVnCiAgcmVwb3J0ICM0NDE2MTAKCi0gTm93IGdlbmVyYXRlcyB0aGUgcmVsZWFzZSBjb25maWd1cmUgc2NyaXB0IHdpdGggYXV0b2NvbmYgMi41MgoKVmVyc2lvbiA3LjguMS1wcmU0CgpEYW5pZWwgKDggQXVndXN0IDIwMDEpCi0gY3VybCAtRSB1c2VzIGEgY29sb24gdG8gc2VwYXJhdGUgYSBmaWxlIG5hbWUgZnJvbSBhIHBhc3NwaHJhc2UuIFRoaXMgdHVybmVkCiAgb3V0IHJlYWxseSBiYWQgZm9yIHRoZSB3aW5kb3dzIHBlb3BsZSB3aG8gd2FudHMgdG8gaW5jbHVkZSBhIGRyaXZlIGxldHRlciBpbgogIHRoZSBmaWxlIG5hbWUgbGlrZSAiYzpcY2VydC5wZW0iLiBUaGVyZSdzIG5vdyBhIHdpbjMyIHdvcmstYXJvdW5kCiAgaW1wbGVtZW50ZWQgdGhhdCB0cmllcyB3b3JrIGFyb3VuZCB0aGF0LCB3aGVuIHRoZSBjb2xvbiBzZWVtcyB0byBiZSB1c2VkIGZvcgogIHRoaXMga2luZCBvZiBjb25zdHJ1Y3QuCgotIFBhdHJpY2sgQmloYW4tRmFvdSBpbnRyb2R1Y2VkIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIHdoaWNoIG1ha2VzIGN1cmwKICB2ZXJpZnkgdGhlIHNlcnZlcidzIENOIGZpZWxkIHdoZW4gdGFsa2luZyBodHRwczovLy4gSWYgLS1jYWNlcnQgaXMgbm90IHVzZWQsCiAgYW55IGZhaWx1cmVzIGluIG1hdGNoaW5nIGlzIG9ubHkgZGlzcGxheWVkIGFzIGluZm9ybWF0aW9uICgtdikuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDEpCi0gV3JvdGUgdXAgbmluZSBtb3JlIHRlc3QgY2FzZXMsIG1vcmUgb3IgbGVzcyBjb252ZXJ0ZWQgZnJvbSB0aGUgZm9ybWVyIHRlc3QKICBzdWl0ZS4KCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBIZWlra2kgS29ycGVsYSBwb3N0ZWQgYSBwYXRjaCB0aGF0IG1ha2VzICdjdXJsLWNvbmZpZyAtLWxpYnMnIGluY2x1ZGUgdGhlCiAgZGlyZWN0b3J5IGluIHdoaWNoIGxpYmN1cmwgaXRzZWxmIGlzIGluc3RhbGxlZCBpbi4gV2hpbGUgdGhpcyB3YXNuJ3QgbXkKICBpbml0aWFsIGludGVudGlvbiB3aXRoIHRoaXMgb3B0aW9uLCBpdCBtYWtlcyBzZW5zZSBhbmQgbWFrZXMgbGlua2luZyB3aXRoCiAgbGliY3VybCBlYXNpZXIuCgotIFN0ZWZhbiBVbHJpY2ggcG9pbnRlZCBvdXQgdG8gdXMgdGhhdCBvdGhlciB0b29scyBhbmQgbGlicmFyaWVzIHRyZWF0IGZpbGU6Ly8KICBVUkxzIHdpdGggb25seSBvbmUgc2xhc2ggYWZ0ZXIgdGhlIGhvc3QgbmFtZSBzbGlnaGx5IGRpZmZlcmVudCB0aGFuIGxpYmN1cmwKICBkb2VzLiBTaW5jZSBhbGwgdGhlIG90aGVycyBzZWVtIHRvIGFncmVlLCB3ZSBiZXR0ZXIgZm9sbG93IHRoZW0uCgotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIHVzIHdpdGggYSBodWdlIHNldCBvZiBmaXhlcyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQKICBidWlsZCB1bmRlciBPcGVuVk1TLgoKVmVyc2lvbiA3LjguMS1wcmUzCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSm9uYXRoYW4gSHNldSBub3RpY2VkIHRoYXQgeW91IGNvdWxkbid0IGdldCBhIGhlYWRlciBjYWxsYmFjayB1bmxlc3MgeW91CiAgc2V0IENVUkxPUFRfV1JJVEVIRUFERVIgdG8gbm9uLU5VTEwsIGV2ZW4gaWYgeW91IGRpZG4ndCBjYXJlIGFib3V0IHRoYXQKICBkYXRhLiBUaGlzIGlzIG5vdyBmaXhlZC4KCkRhbmllbCAoNSBBdWd1c3QgMjAwMSkKLSBTZXJnaW8gQmFsbGVzdHJlcm8gcHJvdmlkZWQgYSBwYXRjaCBmb3IgcmVhZGluZyByZXNwb25zZXMgZnJvbSBOQ1NBIGh0dHBkCiAgMS41Lnggc2VydmVycywgYXMgdGhleSByZXR1cm4gcmVhbGx5IHNjcmV3ZWQgdXAgcmVzcG9uc2UgaGVhZGVycyB3aGVuIGFza2VkCiAgZm9yIHdpdGggSFRUUCAxLjEuCgotIGN1cmxfZXNjYXBlKCkgbm8gbG9uZ2VyIHRyZWF0cyBhbHJlYWR5IGVuY29kZWQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQKICBzdHJpbmcgZXNwZWNpYWxseS4KCkRhbmllbCAoMyBBdWd1c3QgMjAwMSkKLSBJIHJlcGxhY2VkIHRoZSBmb3JtZXIgbGliL2FycGFfdGVsbmV0LmggZmlsZSB3aXRoIG9uZSBJIHdyb3RlIG15c2VsZiwgdG8KICBhdm9pZCB0aGUgQlNEIGFubm91Y2VtZW50IGNsYXVzZSBvZiB0aGUgbGljZW5zZSBpbiB0aGUgZm9ybWVyIGZpbGUuCgotIEFuZHJldyBGcmFuY2lzIHByb3ZpZGVkIGEgbmV3IHZlcnNpb24gb2YgYmFzZTY0LmMgdG8gd29yayBhcm91bmQgdGhlIGxpY2Vuc2UKICBib2lsZXIgcGxhdGUgdGhhdCBjYW1lIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gSSBwYXRjaGVkIGl0LCBidXQgdGhlIGdsb3J5CiAgc2hvdWxkIGdvIHRvIEFuZHJldyBmb3IgaGlzIGhlYWRzIHVwLgoKLSBUb21hc3ogTGFja2kgbm90aWNlZCB0aGF0IHdoZW4geW91IGRvIHJlcGVhdGVkIHRyYW5zZmVycyB3aXRoIGxpYmN1cmwgeW91CiAgY291bGRuJ3QgYWx3YXlzIHJlbGlhYmx5IGNoYW5nZSBIVFRQIHJlcXVlc3QuIFRoaXMgaGFzIG5vdyBiZWVuIGZpeGVkIGFuZCBhCiAgbmV3IGxpYmN1cmwgb3B0aW9uIHdhcyBhZGRlZDogQ1VSTE9QVF9IVFRQR0VULCB0aGF0IGNhbiBmb3JjZSB0aGUgSFRUUAogIHJlcXVlc3RyIChiYWNrKSB0byBHRVQuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcG9pbnRlZCBvdXQgdGhhdCBodHRwc3NlcnZlci5wbCB3YXNuJ3QgaW5jbHVkZWQgaW4KICByZWxlYXNlIGFyY2hpdmVzLiBJdCBzaG91bGQgYmUgbm93LgoKRGFuaWVsICgyIEF1Z3VzdCAyMDAxKQotIEZyYW5rIEtlZW5leSBwb2ludGVkIG91dCBhIG1hbnVhbCBtaXN0YWtlIGZvciBjZXJ0aWZpY2F0ZSBjb252ZXJ0aW9ucy4KCi0gVG9tYXN6IExhY2tpIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgdHJhbnNmZXIgbG9vcCB0aGF0IGNvdWxkIG1ha2UgdGhlCiAgc2VsZWN0KCkgbG9vcCB1c2UgZmFyIHRvbyBtdWNoIENQVS4KCi0gUGF3ZWwgQS4gR2FqZGEgcG9pbnRlZCBvdXQgYW4gb3V0cHV0IG1pc3Rha2UgZG9uZSB3aGVuIHVzaW5nIGxpYmN1cmwncwogIHByb2dyZXNzIGNhbGxiYWNrLgoKRGFuaWVsICgyOSBKdW5lIDIwMDEpCi0gTmF2ZWVuIE5vZWwgbm90aWNlZCB0aGF0IHRoZSBCb3JsYW5kIGxpYnJhcnkgbWFrZWZpbGUgd2Fzbid0IHVwZGF0ZWQuCgotIE5pYyBSb2V0cyBicm91Z2h0IGEgZml4IGZvciB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdoZW4gdXNpbmcgU1NMLgoKRGFuaWVsICgyNyBKdW5lIDIwMDEpCi0gTWFkZSB0aGUgRlRQIHRlc3RzIHJ1biBPSyBldmVuIG9uIG1hY2hpbmVzIHJ1bm5pbmcgY3VybCBJUHY2LWVuYWJsZWQuCgotIFRyb3kgRW5nZWwgY29ycmVjdGVkIHNvbWUgUlBNIHBhY2thZ2UgZGV0YWlscy4KClZlcnNpb24gNy44LjEtcHJlMgoKRGFuaWVsICgyNSBKdW5lIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgY29ycmVjdGx5IGlkZW50aWZpZWQgYSBwcm9ibGVtIHRoYXQgb2NjdXJyZWQgd2hlbiBkb3dubG9hZGluZwogIHNldmVyYWwgZmlsZXMgd2l0aCBjdXJsLCBhbmQgdXNpbmcgcmVzdW1lLiBUaGUgZmlyc3QgZmlsZSdzIHJlc3VtZSBpbmRleCB3YXMKICB0aGVuIHVzZWQgZm9yIGFsbCBmaWxlcywgcmVzdWx0aW5nIGluIHdlaXJkIHJlc3VsdHMuLi4KCi0gQW50b24gS2FsbXlrb3YgcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBjdXJsIHdvcmsgd2l0aCBmb3JtIGZpZWxkIG5hbWVzCiAgd2l0aCBzcGFjZXMgbGlrZSB3aGVuIC1GIGlzIHVzZWQuCgpWZXJzaW9uIDcuOC4xLXByZTEKCkRhbmllbCAoMjAgSnVuZSAyMDAxKQotIE1pa2UgQnl0bmFyIHByb3ZpZGVkIGEgZmluZSByZXBvcnQgdGhhdCBwcm92ZWQgdGhhdCB0aGUgLS13aXRoLXNzbCBvcHRpb24KICBmb3IgY29uZmlndXJlIG5lZWRlZCB0d2Vha2luZy4gSXQgbm8gbG9uZ2VyIHNlYXJjaGVzIHRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzCiAgZm9yIE9wZW5TU0wgbGlicyBvciBkaXJlY3RvcmllcyB3aGVuIGEgc3BlY2lmaWVkIHBhdGggaXMgZ2l2ZW4uCgpEYW5pZWwgKDE5IEp1bmUgMjAwMSkKLSBXaGVuIGFuIEZUUCB0cmFuc2ZlciBpcyBjdXQgb2ZmIGR1cmluZyB0cmFuc2ZlciwgY3VybCBjb3VsZCBwcmVzZW50IGEgdHJ1bHkKICBnYXJiYWdlZCBlcnJvciBtZXNzYWdlIGFuZCBpbiB3b3JzdCBjYXNlIGR1bXAgY29yZS4gVGhhbmtzIHRvIGRldGFpbGVkCiAgcmVwb3J0cyBmcm9tIFNoYXduIFBvdWxzb24gd2UgbmFpbGVkIHRoaXMuCgpEYW5pZWwgKDEyIEp1bmUgMjAwMSkKLSBTYWx2YWRvciBE4XZpbGEgcHJvdmlkZWQgYSBmaXggZm9yIEZUUCByYW5nZSBkb3dubG9hZHMuCgotIEFkZGVkIGEgZmV3IG1vcmUgdGVzdCBjYXNlcyBmcm9tIHRoZSBmb3JtZXIgdGVzdCBzdWl0ZSB0byB0aGUgbmV3IGZpbGUKICBmb3JtYXQuIFdlJ3JlIG5vdyBhdCBhIHRvdGFsIG9mIDI2IHRlc3RzLgoKRGFuaWVsICgxMSBKdW5lIDIwMDEpCi0gbGliY3VybCdzIHZlcnNpb24taW5mbyB3YXMgd3JvbmcsIGFzIG5vdGVkIGJ5IGJvdGggRG9tZW5pY28gQW5kcmVvbGkgYW5kCiAgRGF2aWQgT2Rpbi4KCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gSvZybiBmaXhlZCB0aGUgY3VybF91bmVzY2FwZSBkdXBsaWNhdGUgZW50cnkgaW4gbGliL2xpYmN1cmwuZGVmCgotIEkgbWFkZSBTU0wgY2VydGlmaWNhdGUgZmFpbHVyZSBtZXNzYWdlcyB0byBiZSBtb3JlIGRldGFpbGVkLgoKVmVyc2lvbiA3LjgKCkRhbmllbCAoNyBKdW5lIDIwMDEpCi0gU0RhdmlsYSBwcm92aWRlZCBhIHJlc3VtZWQgZG93bmxvYWQgZml4LgoKVmVyc2lvbiA3LjgtcHJlNAoKRGFuaWVsICgxIEp1bmUgMjAwMSkKLSBTdGVybGluZyBwcm92aWRlZCBzb21lIG5ldyBQSFAgZXhhbXBsZXMuCgotIENoYW5nZWQgdGhlIENWUyBoaWVyYXJjaHkgYW5kIHRoZSBvbGRlciBjaGVja291dCBpbnN0cnVjdGlvbiBkb2VzIG5vIGxvbmdlcgogIHdvcmsuIFdlIG1vdmVkIHRoZSBlbnRpcmUgc291cmNlIGNvZGUgaW50byBhIENWUyBtb2R1bGUgbmFtZWQgJ2N1cmwnLgoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBDVVJMT1BUX01VVEUgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSXQgaXMgc3RpbGwgcHJlc2VudCBpbiB0aGUgaW5jbHVkZSBmaWxlCiAgdG8gbm90IGNhdXNlIGNvbXBpbGVyIGVycm9ycyBmb3IgYXBwbGljYXRpb25zIHVzaW5nIGl0LCBidXQgaXQgaXNuJ3QgdXNlZAogIGFueXdoZXJlIGluIHRoZSBsaWJyYXJ5LgoKVmVyc2lvbiA3LjgtcHJlMwoKRGFuaWVsICgzMSBNYXkgMjAwMSkKLSBPbmNlIGFuZCBmb3IgYWxsIGZpeGVkIHRoZSBfUkVFTlRSQU5UIG1lc3MgZm9yIFNvbGFyaXMgY29tcGlsZXMgdG8gcHJlc2VudAogIGxlc3Mgd2FybmluZ3MuCgotIFN0ZXJsaW5nIEh1Z2hlcyB0aXJlbGVzc2x5IHBvaW50cyBvdXQgYW5kIGNvcnJlY3RzIG15IG1pc3Rha2VzLi4uISBTbywKICBjdXJsX2dsb2JhbF9pbml0KCkgbm93IGxldHMgdGhlIGFyZ3VtZW50IGZsYWdzICpTRVQqIHdoYXQgcGFydHMgdG8KICBpbml0LiBDVVJMX0dMT0JBTF9ERUZBVUxUIG1ha2VzIGEgbmljZSBkZWZhdWx0LCBDVVJMX0dMT0JBTF9BTEwgaW5pdHMgYWxsCiAga25vd24gc3Vic3lzdGVtcyBhbmQgQ1VSTF9HTE9CQUxfTk9ORSBpbml0cyBub3RoaW5nIG1vcmUgdGhhbiBhYnNvbHV0ZWx5CiAgbmVjZXNzYXJ5LiBNYW4gcGFnZSB1cGRhdGVkIGFjY29yZGluZ2x5LgoKLSBGaXhlZCB0aGUgc3RydG9rLmggaW5jbHVkZSBmaWxlIGFzIGl0IHdvdWxkbid0IGNvbXBpbGUgb24gYWxsIHBsYXRmb3JtcyEKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gTWFkZSBsaWJjdXJsIGJ5IGRlZmF1bHQgYWN0IGFzIGlmIENVUkxPUFRfTVVURSBhbmQgQ1VSTE9QVF9OT1BST0dSRVNTIHdlcmUKICBzZXQgVFJVRS4gU2V0IHRoZW0gdG8gRkFMU0UgdG8gbWFrZSBsaWJjdXJsIG1vcmUgdGFsa2F0aXZlLiBUaGUgKl9NVVRFCiAgb3B0aW9uIGlzIHN1YmplY3QgZm9yIGNvbXBsZXRlIHJlbW92YWwuLi4KClZlcnNpb24gNy44LXByZTIKCkRhbmllbCAoMzAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIHdyb3RlIGEgbWFrZWZpbGUgZm9yIGJ1aWxkaW5nIFNvbGFyaXMgcGFja2FnZXMuCgotIFN0ZXJsaW5nIEh1Z2hlcyBicm91Z2h0IGZpeGVzIGZvciAnYnVpbGRjb25mJyAodGhlIGJ1aWxkLWZyb20tQ1ZTIHRvb2wpIGFuZAogIHdlIGRpc2N1c3NlZCBhbmQgYWRkZWQgYSBmZXcgQ1VSTF9HTE9CQUxfKiBmbGFncyBpbiBpbmNsdWRlL2N1cmwuaAoKLSBLamV0aWwgSmFjb2JzZW4gcHJpdmF0ZWx5IGFubm91bmNlZCBoaXMgcHl0aG9uIGludGVyZmFjZSB0byBsaWJjdXJsLAogIGF2YWlsYWJsZSBhdCBodHRwOi8vcHljdXJsLnNvdXJjZWZvcmdlLm5ldC8KCkRhbmllbCAoMjkgTWF5IDIwMDEpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgc3RydG9rKCkgcHJvYmxlbSBpbiBsaWJjdXJsLiBJdCBpcyBub3QgYSB0aHJlYWQtCiAgc2FmZSBmdW5jdGlvbi4gTm93IGNvbmZpZ3VyZSBjaGVja3MgZm9yIGEgdGhyZWFkLXNhZmUgdmVyc2lvbiwgYW5kCiAgbGliL3N0cnRvay5jIG9mZmVycyBvbmUgZm9yIHRoZSBzeXN0ZW1zIHRoYXQgZG9uJ3QgY29tZSB3aXRoIG9uZSBpbmNsdWRlZCEKCi0gTWV0dGd1dCBKYW1hbGxhIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtIyBwcm9ncmVzcyBiYXIgd2FzIHdyaXR0ZW4KICB0byBzdGRlcnIgZXZlbiB0aG91Z2ggLS1zdGRlcnIgcmVkaXJlY3Rpb24gd2FzIHVzZWQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSSBtb3ZlZCBvdXQgdGhlIGxpc3Qgb2YgY29udHJpYnV0b3JzIGZyb20gdGhlIGN1cmwuMSBtYW4gcGFnZSBhbmQgbWFkZSBhCiAgc2VwYXJhdGUgZG9jcy9USEFOS1MgZmlsZS4gSXQgbWFrZXMgdGhlIGxpc3QgZWFzaWVyIHRvIGZpbmQsIGFuZCBtYWRlIGl0CiAgZWFzaWVyIGZvciBtZSB0byBtYWtlIGEgc2VwYXJhdGUgd2ViIHBhZ2Ugd2l0aCB0aGF0IHNhbWUgaW5mb3JtYXRpb24uCgogIEkgcmVhbGx5IGRvIHdhbnQgYWxsIHlvdSBndXlzIG1lbnRpb25lZCBpbiB0aGVyZSB0byBmZWVsIHlvdSBnZXQgdGhlIGNyZWRpdAogIHlvdSBkZXNlcnZlLgoKLSBsaWIvZWFzeS5jIGRpZG4ndCBjb21waWxlIHByb3Blcmx5IGluIHRoZSA3LjgtcHJlMSBkdWUgdG8gYSBzaWxseSBtaXN0YWtlCgpWZXJzaW9uIDcuOC1wcmUxCgpEYW5pZWwgKDI4IE1heSAyMDAxKQotIGN1cmwtY29uZmlnIG5vdyBzdXBwb3J0cyAnLS12ZXJudW0nIHRoYXQgb3V0cHV0cyBhIHBsYWluIGhleGFkZWNpbWFsIHZlcnNpb24KICBvZiB0aGUgbGliY3VybCB2ZXJzaW9uIG51bWJlciAodXNpbmcgOCBiaXRzIGZvciBlYWNoIDMgbnVtYmVycykuIFZlcnNpb24KICA3LjcuNCBhcHBlYXJzIGFzIDA3MDcwNAoKLSBXcm90ZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2xvYmFsX2luaXQgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAuLi4KCi0gVC4gQmhhcmF0aCBicm91Z2h0IG5ld3MgYWJvdXQgdGhlIHVzYWdlIG9mIHRoZSBPcGVuU1NMIGludGVyZmFjZSB0aGF0IHdhcwogIG5vdCBwcmV2aW91c2x5IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiBhbmQgdGh1cyBjYXVzZWQgbGliY3VybCB0byBsZWFrCiAgbWVtb3J5LiAgVGhlIG9ubHkgc29tZXdoYXQgc2FuZSBhcHByb2FjaCB0byBmaXggdGhpcyBkaWxlbW1hLCBpcyBhZGRpbmcgdHdvCiAgdHdvIG5ldyBmdW5jdGlvbnMgY3VybF9nbG9iYWxfaW5pdCgpIGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwKCkgdGhhdCBzaG91bGQKICBiZSBjYWxsZWQgKk9OQ0UqIGJ5IHRoZSBhcHBsaWNhdGlvbiB1c2luZyBsaWJjdXJsLiBUaGUgaW5pdCBzaG91bGQgYmUgZG9uZQogIG9ubHkgYXQgc3RhcnR1cCwgbm8gbWF0dGVyIGhvdyBtYW55IHRocmVhZHMgdGhlIGFwcGxpY2F0aW9uIGlzIGdvbm5hIHVzZSwKICBhbmQgdGhlIGNsZWFudXAgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgZmluaXNoZWQgdXNpbmcKICBsaWJjdXJsIGNvbXBsZXRlbHkuCgogICoqKiBVUEdSQURFIE5PVElDRSAqKioKCiAgSWYgeW91IHdyaXRlIGFwcGxpY2F0aW9ucyB1c2luZyBsaWJjdXJsLCB5b3UgcmVhbGx5IHdhbnQgdG8gdXNlIHRoZSB0d28KICBmdW5jdGlvbnMgbWVudGlvbmVkIGFib3ZlICEhIQoKICBJIGNhbid0IHNheSBJIHRoaW5rIHRoaXMgaXMgYSB2ZXJ5IGJlYXV0aWZ1bCBzb2x1dGlvbiwgYnV0IGFzIE9wZW5TU0wKICBpbnNpc3RzIG9uIG1ha2luZyBsb3RzIG9mIHN0dWZmIG9uIGEgImdsb2JhbCIgc2NvcGUsIHdlJ3JlIGZvcmNlZCB0byB3YWxrCiAgdGhlIHBhdGggdGhleSBwb2ludCB1cyB0by4KCi0gTW92aW5nIG1vcmUgdGVzdCBjYXNlcyBpbnRvIHRoZSBuZXcgZmlsZSBmb3JtYXQuCgpWZXJzaW9uIDcuNy40LXByZTMKCkRhbmllbCAoMjMgTWF5IDIwMDEpCi0gSW50cm9kdWNlZCBhIG5ldyBmaWxlIGZvcm1hdCBmb3Igc3RvcmluZyB0ZXN0IGNhc2VzLCBhbmQgdGh1cyBJIGhhZCB0bwogIG1vZGlmeSBhbGwgdGhlIHBlcmwgdGVzdCBzY3JpcHRzIGFuZCBtb3JlIChJIGFkZGVkIGEgbmV3IG9uZSkuIEkgaGF2ZSBub3QKICAicG9ydGVkIiBhbGwgdGhlIG9sZCB0ZXN0IGNhc2VzIHRvIHRoZSBuZXcgZm9ybWF0IHlldCwgYnV0IGl0J2xsIGNvbWUuCgogIFRoZSBtYWluIGFkdmFudGFnZSBvZiB0aGlzIG5ldyBmb3JtYXQgaXMgdGhhdCBhbGwgdGVzdCBkYXRhIGZvciBlYWNoIHRlc3QKICBjYXNlIGlzIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlLiBJdCBnaXZlcyBhIGJldHRlciBvdmVydmlldyBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBhbmQgYSBsb3QgbGVzcyBmaWxlcy4KCi0gQW5kculzIEdhcmPtYSBicm91Z2h0IGEgZml4IGZvciB0aGUgbmV0c2NhcGUvbW96aWxsYSBjb29raWUgZmlsZSBwYXJzaW5nCiAgZnVuY3Rpb24sIGFzIGl0IHR1cm5zIG91dCBpdCBkb2Vzbid0IGFsd2F5cyBzdG9yZSB0aGUgcGF0aCEKCkRhbmllbCAoMjIgTWF5IDIwMDEpCi0gQXMgd2FzIHJlcG9ydGVkIGFub255bW91c2x5LCB3aGVuIEZBSUxPTkVSUk9SIHdhcyB1c2VkLCB0aGUgaHR0cGNvZGUgd2FzCiAgbm90IHN0b3JlZCBwcm9wZXJseSBhbmQgdGh1cyB3YXNuJ3QgcG9zc2libHkgdG8gcmVhZCBhZnRlciBhIHRyYW5zZmVyIHdpdGgKICB0aGUgY3VybF9lYXN5X2dldGluZm8oKSBmdW5jdGlvbi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJbnN0YWxsZWQgYW5kIG1hZGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgdG9vbCB2ZXJzaW9uczoKICAgIGF1dG9jb25mIDIuNTAKICAgIGxpYnRvb2wgMS40CiAgICBhdXRvbWFrZSAxLjQtcDEKCiAgSSB3b3VsZG4ndCByZWNvbW1lbmQgYW55IGRldmVsb3BlciB0byB0cnkgdG8gZ2VuZXJhdGUgdGhpbmdzIHdpdGggb2xkZXIKICB2ZXJzaW9ucyB0aGFuIHRoZXNlLiBCdWlsZGluZyBmcm9tIENWUyB3aWxsIHByb2JhYmx5IG1vcmUgb3IgbGVzcyByZXF1aXJlCiAgYXQgbGVhc3QgdGhlc2UgdmVyc2lvbnMuCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IGdyZXcgdG8gbW9yZSB0aGFuIGRvdWJsZSBpdHMKICBwcmV2aW91cyBzaXplIQoKICBBcmthZGl1c3ogTWlza2lld2ljeiBoZWxwZWQgbWUgYnkgcG9pbnRpbmcgb3V0IEkgaGFkIHRvIHJlbW92ZSBteQogIGFjaW5jbHVkZS5tNCBmaWxlIGJlZm9yZSBJIGNvdWxkIGdldCBpdCB3b3JraW5nIQoKRGFuaWVsICgyMSBNYXkgMjAwMSkKLSBJIG1hZGUgZnRwczovLyB3b3JrLiBBZGRlZCB0ZXN0IGNhc2UgNDAwIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUsIGFzIHRoZQogIGZpcnN0IGZ0cHM6Ly8gdGVzdCBjYXNlLiBSZXF1aXJlcyBzdHVubmVsLgoKLSBBbHNvIG1hZGUgdGhlIHRlc3QgY2FzZXMgdGhhdCBydW5zIHNzbCB0ZXN0cyBub3QgcnVuIGlmIGxpYmN1cmwgaXNuJ3QgYnVpbHQKICB3aXRoIHNzbCBzdXBwb3J0LgoKRGFuaWVsICgxOSBNYXkgMjAwMSkKLSBNYWRlIHRoZSBjb25maWd1cmUgbm90IGFkZCBhbnkgZXh0cmEgLUwgTERGTEFHUyBvciAtSSBDUFBGTEFHUyB1bmxlc3MgdGhleQogIGFyZSBhY3R1YWxseSBuZWVkZWQuIEFsYmVydCBDaGluJ3MgYW5kIERvbWVuaWNvIEFuZHJlb2xpJ3Mgc3VnZ2VzdGlvbnMKICBoZWxwZWQgb3V0LgoKVmVyc2lvbiA3LjcuNC1wcmUyCgpEYW5pZWwgKDE4IE1heSAyMDAxKQotIE5pY2VyIGNvbmZpZ3VyZS1jaGVjayBmb3IgdGhlIE9wZW5TU0wgaGVhZGVycywgd2hpY2ggdGhlbiBzZXRzIHRoZSBwcm9wZXIKICB2YXJpYWJsZSB0byBoYXZlIGN1cmwtY29uZmlnIGJlIGdvb2QuIChBbGJlcnQgQ2hpbiBwcm92aWRlZCB0aGUgZml4KQoKLSBGb3Igc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhlaXcgb3duICdzdHJsY2F0KCknIGxpYmN1cmwgcHJvdmlkZXMgaXRzIG93bi4KICBJdCB3YXMgbm93IHJlbmFtZWQgdG8gcHJldmVudCBjb2xsaWRlcyB3aXRoIG90aGVyIGxpYnMuIChBZnRlciBkaXNjdXNzaW9ucwogIHdpdGggU3RlcmxpbmcgSHVnaGVzIGFuZCB0aGUgaW1wbGljYXRpb25zIHRoaXMgaGFkIG9uIFBIUCBidWlsZHMuKQoKRGFuaWVsICgxNyBNYXkgMjAwMSkKLSBDb2xtIEJ1Y2tsZXkgcG9zdGVkIGEgZGV0YWlsZWQgYnVnIHJlcG9ydCBvbiAodGhlIGRlYmlhbml6ZWQpIDcuNy4zLCB0aGF0CiAgdHVybmVkIG91dCB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGUgZGViaWFuLWJ1aWx0IDcuNy4zLXBhY2thZ2UgdGhhdAogIGNvbnRhaW5lZCBmaWxlcyBmcm9tIHRoZSA3LjcuMiByZWxlYXNlIQoKLSBJIGFkZGVkIHRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGFnYWluLCBidXQgd2l0aCBhIGZha2UgdmFsdWUsIGp1c3QgdG8KICBtYWtlIHByb2dyYW1zIHRoYXQgdXNlIGl0LCBub3QgZmFpbCB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IHRoaXMgdmVyc2lvbiBvZgogIGxpYmN1cmwuCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIFBhd2VsIEEuIEdhamRhIGZpeGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgdHJhbnNmZXJzIG9uIHJlLXVzZWQgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zLgoKVmVyc2lvbiA3LjcuNC1wcmUxCgpEYW5pZWwgKDE0IE1heSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBmaXhlZCBGVFAgUE9SVCBmb3IgSVB2Ni1lbmFibGVkIGxpYmN1cmwuCgotIEFkZGVkIHRoZSBmaXJzdCBIVFRQUyB0ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDEyIE1heSAyMDAxKQotIEp1a2thIFBpaGwgc3VnZ2VzdGVkIHRoYXQgaWYgKGxpYiljdXJsIGlzIHRvbGQgdG8gdmVyaWZ5IHRoZSBwZWVyJ3MKICBjZXJ0aWZpY2F0ZSBhbmQgdGhlIHBlZXIgY2FuJ3QgYmUgdmVyaWZpZWQsIGl0IHNob3VsZCBmYWlsIGFuZCByZXR1cm4gYQogIHByb3BlciBlcnJvciBjb2RlLiBJIGFkZGVkIGEgYnJhbmQgbmV3IGVycm9yIGNvZGUgbmFtZWQKICBDVVJMRV9TU0xfUEVFUl9DRVJUSUZJQ0FURSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMSBNYXkgMjAwMSkKLSBBcyB3YXMgZGlzY3Vzc2VkIHdpdGggRnJlZGVyaWMgTGVwaWVkIGEgd2hpbGUgYWdvLCBJIG5vdyBtYWRlIGxpYmN1cmwgbm90CiAgcmV0dXJuIGVycm9yIGV2ZW4gdGhvdWdoIG5vIGRhdGEgd2FzIHRyYW5zZmVyZWQgb24gdXBsb2FkL2Rvd25sb2FkIHJlc3VtZQogIHdoZW4gdGhlIG5vIHRyYW5zZmVyIGlzIG5lZWRlZC4gVGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgZXJyb3Igd2FzIHJlbW92ZWQKICBmcm9tIHRoZSBoZWFkZXIgZmlsZSB0byBtYWtlIGFueSBpbXBsZW1lbmF0b3IgdGhhdCB1c2VzIHRoYXQgdG8gYmUgYXdhcmUgb2YKICB0aGUgZmFjdCB0aGF0IGl0IGNhbid0IGJlIHJldHVybmVkIGFueW1vcmUhCgotIEltcHJvdmVkIGdlbmVyYWwgaGVhZGVyLXBhcnNpbmcgdG8gYmV0dGVyIGFsbG93IHdoaXRlIHNwYWNlcyBhbmQgbW9yZS4KCi0gUm9kbmV5IFNpbW1vbnMgcHJvdmVkIHRoZSBmaXggSSBkaWQgeWVzdGVyZGF5IHdhcyBiYWQgYW5kIEkgaGFkIHRvIHBvc3QKICBhbm90aGVyIG9uZS4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IHR3byByZWRpcmVjdCBwcm9ibGVtcyBtb3JlIQogIApEYW5pZWwgKDEwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBjb3JyZWN0bHkgbm90ZWQgdGhhdCB0aGUgc3BhY2UtYWZ0ZXItaGVhZGVyIHByb2JsZW0gd2l0aAogIExvY2F0aW9uOiBpcyBwcmVzZW50IG9uIHNldmVyYWwgb3RoZXIgcGxhY2VzIGluIHRoZSBsaWJjdXJsIHNvdXJjZXMuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBmb2xsb3dpbmcgTG9jYXRpb246CiAgaGVhZGVycyB3aXRoIGFuIGV4dHJhIHNwYWNlIGFmdGVyIHRoZSBjb2xvbi4KCi0gUm9kbmV5IFNpbW1vbnMgZm91bmQgb3V0IHRoYXQgbXVsdGlwbGUgRlRQIHRyYW5zZmVycyBkaWQgbm90IHRyZWF0IHJlbGF0aXZlCiAgZGlyZWN0b3JpZXMgY29ycmVjdGx5LgoKRGFuaWVsICg5IE1heSAyMDAxKQotIEdldHRpbmcgYW4gRlRQIGZpbGUgd2l0aCBDVVJMT1BUX05PQk9EWSBzZXQgKG9yIC1JIGZyb20gdGhlIGNvbW1hbmQgbGluZSksCiAgbWFrZXMgY3VybCB1c2UgdGhlIG5vbi1zdGFuZGFyZCBmdHAgY29tbWFuZCAiU0laRSIuIElmIGl0IGZhaWxlZCwgbGliY3VybAogIHJldHVybmVkIGVycm9yLiBTdGFydGluZyBub3csIGl0IGp1c3QgZG9uJ3Qgb3V0cHV0IHRoZSBmaWxlIHNpemUgaW5zdGVhZC4KICBBbm9ueW1vdXMgYnVnIHJlcG9ydC4KCi0gc3R1bm5lbC5wbSB3YXMgYWNjaWRlbnRhbGx5IGxlZnQgb3V0IGZyb20gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgaXQgaXMgbm93CiAgYWRkZWQgKHN0dW5uZWwgaXMgbmVlZGVkIHRvIHJ1biB0aGUgaHR0cHMtdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUpCiAgCkRhbmllbCAoNyBNYXkgMjAwMSkKLSBDb3JyZWN0ZWQgdHdvIG1pbm9yIGNvbXBpbGVyIHdhcm5pbmdzIGR1ZSB0byB0aGUgRklMRSAqIHRvIHZvaWQgKiBjb252ZXJzaW9uCiAgdGhhdCBJIG1pc3NlZCBhdCB0d28gcGxhY2VzLiBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgcGF0Y2hlcy4gU2FuZGVyIEdhdGVzCiAgZmlsZWQgYSBidWcgcmVwb3J0IG9uIHRoaXMuCgpWZXJzaW9uIDcuNy4zCgpEYW5pZWwgKDQgTWF5IDIwMDEpCi0gQWxsIGNhbGxiYWNrIGZ1bmN0aW9ucyBub3cgdGFrZSAndm9pZCAqJyBpbnN0ZWFkIG9mICdGSUxFIConLiBUaGlzIGlzIG1hZGUKICB0aGlzIHdheSB0byBtYWtlIGl0IG1vcmUgb2J2aW91cyB0byBwZW9wbGUgdGhhdCBhbnl0aGluZyBjYW4gYmUgcGFzc2VkIHRvCiAgdGhlbSAoYnkgdXNpbmcgdGhlIGFwcm9wcmlhdGUgb3B0aW9uKS4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBTdGVybGluZwogIEh1Z2hlcy4KCkRhbmllbCAoMyBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiB0aGF0IG1hZGUgbGliY3VybCBmYWlsIGlmIHRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gdXNlZCBtaXhlZAogIGNodW5rZWQgYW5kIG5vbi1jaHVua2VkIHRyYW5zZmVycy4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgYmFkIHRyZWF0bWVudCBvZiAzMDQtcmVwbGllcywgYXMgdGhleSB3b3VsZCBub3QgYmUKICB0cmVhdGVkIGFzIGNvbnRlbnQtbGVuZ3RoIDAgcmVwbGllcyBidXQgd291bGQgY2F1c2UgYSAiaGFuZyIgdW50aWwgdGhlCiAgc2VydmVyIHRpbWVkLW91dCBhbmQgY2xvc2VkIHRoZSBjb25uZWN0aW9uLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBkb2NzL2V4YW1wbGVzL01ha2VmaWxlLmFtCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDEpCi0gVXBkYXRlZCB0aGUgSU5URVJBTFMgZG9jdW1lbnQgYWdhaW4uIEl0IHdhcyBsYWdnaW5nIGEgYml0LiBJIHRoaW5rIEkgbWFkZSBpdAogIG1vcmUgZWFzeSB0byBmb2xsb3cgbm93IGFzIHdlbGwuCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHdoZW4gY3VybCByZWNlaXZlZAogIGEgIkNvbnRlbnQtTGVuZ3RoOiAwIiBoZWFkZXIuCgotIEdpdXNlcHBlIEQnQW1icm9zaW8gd2FzIGZpcnN0IG91dCB0byByZXBvcnQgdGhhdCBURUxORVQgZG9lc24ndCB3b3JrIGluIGN1cmwKICBjb21waWxlZC9idWlsdCBvbiB3aW4zMi4gSXQgc2VlbXMgdG8gd29yayBmb3IgdW5peGVzIHRob3VnaCEKCi0gRGF2ZSBIYW1pbHRvbiByZXBvcnRlZCB3ZWlyZCBwcm9ibGVtcyB3aXRoIENVUkwvUEhQIHRoYXQgSSByZWFsbHkgY2FuJ3QKICBleHBsYWluIGF0IHRoZSBtb21lbnQuIEknbSBob3Bpbmcgb24gc29tZSBoZWxwIGZyb20gdGhlIFBIUCBjcmV3LgoKRGFuaWVsICgyNiBBcHJpbCAyMDAxKQotIEkgcmV3cm90ZSB0aGUgRlRQIGNvbW1hbmQgcmVzcG9uc2UgZnVuY3Rpb24uIEkgaGFkIHRvIGRvIGl0IHRvIG1ha2UgZnRwcwogIHdvcmssIGFzIHRoZSBPcGVuU1NMIHJlYWQoKS1mdW5jdGlvbiBkaWRuJ3Qgd29yayB0aGUgc2FtZSB3YXkgdGhlIG5vcm1hbAogIHVuaXggcmVhZCgpIGRvZXMsIGJ1dCBpdCB3YXMgYWxzbyBhIGh1Z2UgcGVyZm9ybWFuY2UgYm9vc3QuIFByZXZpb3VzbHkgdGhlCiAgZnVuY3Rpb24gcmVhZCBvbmUgYnl0ZSBhdCBhIHRpbWUsIG5vdyBpdCByZWFkcyB2ZXJ5IGxhcmdlIGNodW5rcywgYW5kIGl0CiAgbWFrZXMgYSBub3RhYmxlIHNwZWVkIGRpZmZlcmVuY2UuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDEpCi0gQ29ubmVjdGlvbiByZS11c2Ugd2hlbiBub3QgdXNpbmcgYSBwcm94eSBkaWRuJ3Qgd29yayBwcm9wZXJseSBmb3IKICBub24tZGVmYXVsdCBwb3J0IG51bWJlcnMuCgpEYW5pZWwgKDI0IEFwcmlsIDIwMDEpCi0gSSd2ZSBub3RpY2VkIHRoYXQgRlRQUyBkb2Vzbid0IHdvcmsuIFdlIGF0dGVtcHQgdG8gdXNlIHNzbCBldmVuIGZvciB0aGUKICBkYXRhIHRyYW5zZmVyLCB3aGljaCBjYXVzZXMgdGhlIHRyYW5zZmVyIHRvICdoYW5nJy4uLiBXZSBuZWVkIHRvIGZpeCB0aGlzLgoKLSBJbXByb3ZlZCB0aGUgdGVzdCBzdWl0ZSB0byB1c2UgJ3N0dW5uZWwnIHRvIGRvIEhUVFBTIGFuZCBGVFBTIHRlc3Rpbmcgb24KICB0aGUgYWxyZWR5IHdyaXR0ZW4gcGVybCBzZXJ2ZXJzIGVhc2lseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwMSkKLSBUaGUgT3BlblNTTCB2ZXJzaW9uIHN0cmluZyByZWNlbnRseSBtb2RpZmllZCBkaWRuJ3QgemVybyB0ZXJtaW5hdGUgb25lCiAgb2YgdGhlIGdlbmVyYXRlZCBzdHJpbmdzIHByb3Blcmx5LCB3aGljaCBjb3VsZCBsZWFkIHRvIGEgY3Jhc2ggb3Igc2ltcGx5CiAgd2VpcmQgdmVyc2lvbiBzdHJpbmcgb3V0cHV0IQoKVmVyc2lvbiA3LjcuMgoKRGFuaWVsICgyMiBBcHJpbCAyMDAxKQotIFJvc2ltaWxkbyBkYSBTaWx2YSB1cGRhdGVkIHRoZSBNYWtlZmlsZXMgZm9yIEJvcmxhbmQvV2luZG93cy4KCi0gRXJpYyBSYXV0bWFuIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgdGhhdCB3b3VsZAogIGxlYWQgdG8gYnJva2VuIEhvc3Q6IGhlYWRlcnMgaW4gdGhlIHNlY29uZCBIVFRQIHJlcXVlc3QuCgpEYW5pZWwgKDIwIEFwcmlsIDIwMDEpCi0gQWRkZWQgbWFuIHBhZ2VzIGZvciB0aGUgY3VybF9zdHJlcXVhbCgpIGFuZCBjdXJsX21wcmludGYoKSBmYW1pbGllcy4gV3JvdGUKICBhICdsaWJjdXJsIG92ZXJ2aWV3JyBtYW4gcGFnZS4KCi0gU3BlbGwtZml4ZWQgc29tZSBkb2N1bWVudHMuCgotIFMuIE1vb25lc2FteSBjb3JyZWN0ZWQgbWlzdGFrZXMgaW4gdGhlIG1hbiBwYWdlLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIGN1cmxfc2xpc3RzIG9wdGlvbnMgaW4gdGhlIHBlcmwgaW50ZXJmYWNlLCBwcmVzZW50CiAgc2VwYXJhdGVseSBpbiB0aGUgQ3VybDo6ZWFzeSAxLjEuNCBwYWNrYWdlLgoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcmVtb3ZlZCB0aGUgZGVjaW1hbHMgZnJvbSB0aGUgc2l6ZSB2YXJpYWJsZXMgaW4gdGhlCiAgLS13cml0ZS1vdXQgb3V0cHV0LiBXZSBoYXJkbHkgZXZlciBnZXQgZnJhY3Rpb24gb2YgYnl0ZXMhIDotKQoKVmVyc2lvbiA3LjcuMi1wcmUxCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCgotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoIGZvciB0aGUgQUNfU1lTX0xBUkdFRklMRSBtYWNyby4KCkRhbmllbCAoMTggQXByaWwgMjAwMSkKLSBJbnB1dCBmcm9tIE1pY2hhZWwgTWVhbGxpbmcgbWFkZSBtZSBhZGQgLS1mZWF0dXJlIHRvIGN1cmwtY29uZmlnLiBJdAogIGRpc3BsYXlzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IGhhdmUgYmVlbiBidWlsdC1pbiBpbiB0aGUgY3VycmVudAogIGxpYmN1cmwuIFRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGZlYXR1cmVzIHRoYXQgY2FuIGJlIGxpc3RlZCBhcmU6IFNTTCwgS1JCNAogIGFuZCBJUHY2LgoKLSBJIGNvbW1pdHRlZCBDcmlzIGFuZCBHZW9yZydzIHBlcmwgaW50ZXJmYWNlIHdvcmsuIFRoZXkndmUgZ290IGNhbGxiYWNrcwogIHdvcmtpbmcgYW5kIG9wdGlvbnMgdGhhdCByZWNlaXZlcyB0aG9zZSBzbGlzdCBwb2ludGVycy4KCi0gUHVuZWV0IFBhd2FpYSBkZXRlY3RlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIGRvd25sb2FkcyB0aGF0IHVzZSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMgYW5kIEkgbWFkZSBhIHJhdGhlciBsYXJnZSB3cml0ZXVwIHRvIGNvcnJlY3QgdGhpcy4gSXQgaXMKICBpbXBvcnRhbnQgdGhhdCBhbGwgc2Vzc2lvbi1kYXRhIGlzIHN0b3JlZCBpbiB0aGUgY29ubmVjdGRhdGEgc3RydWN0IGFuZCBub3QKICBpbiB0aGUgbWFpbiBzdHJ1Y3QgYXMgdGhpcyBwcmV2aW91c2x5IGRpZC4KCkRhbmllbCAoMTcgQXByaWwgMjAwMSkKLSBGcmVkZXJpYyBMZXBpZWQgZml4ZWQgYSBmdHAgcmVzdW1lZCBkb3dubG9hZCBwcm9ibGVtIGFuZCBpbnRyb2R1Y2VkIGEgbmV3CiAgZXJyb3IgY29kZSB0aGF0IGxldHMgYXBwbGljYXRpb25zIGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4gYSByZXN1bWVkIGRvd25sb2FkCiAgYWN0dWFsbHkgZGlkbid0IGRvd25sb2FkIGFueXRoaW5nIHNpbmNlIHRoZSB3aG9sZSBmaWxlIGlzIGFscmVhZHkgcHJlc2VudC4KICBTaG91bGQgdGhpcyByZXR1cm4gT0sgaW5zdGVhZD8KCi0gSSBhZGRlZCAnY3VybC1jb25maWcuaW4nIHRvIHRoZSByb290IGRpciBhbmQgY29uZmlndXJlIHNjcmlwdC4gTm93LCBhCiAgY3VybC1jb25maWcgc2NyaXB0IGlzIG1hZGUgd2hlbiBjdXJsIGlzIGJ1aWx0LiBUaGUgc2NyaXB0IGNhbiBiZSB1c2VkIHRvCiAgZmlndXJlIG91dCBjb21waWxlIHRpbWUgb3B0aW9ucyB1c2VkIHdoZW4gbGliY3VybCB3YXMgYnVpbHQsIHdoaWNoIGluIHR1cm4KICBzaG91bGQgYmUgb3B0aW9ucyBZT1Ugc2hvdWxkIHVzZSB0byBidWlsZCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgbGliY3VybC4KCiAgVGhpcyAqLWNvbmZpZyBzdHlsZSBpcyBub3QgYSBuZXcgaWRlYSwgYnV0IHNvbWV0aGluZyB0aGF0IGhhcyBiZWVuIHVzZWQKICBzdWNjZXNzZnVsbHkgaW4gb3RoZXIgKGxpYnJhcnkgYmFzZWQpIHByb2plY3RzLgoKLSBQaGlsIEthcm4gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHdyb25nbHkgZGlkIG5vdCBhbHdheXMgdXNlIEdNVCB0aW1lIHpvbmUKICBmb3IgdGhlIElmLU1vZGlmaWVkLVNpbmNlIHN0eWxlIGhlYWRlcnMuCgotIEdlb3JnIFNjaHdhcnogcG9pbnRlZCBvdXQgYW4gZXh0cmEgbmVlZGVkICNpbmNsdWRlIGZpbGUgbmVlZGVkIGluIHNyYy9tYWluLmMKICBmb3IgY3VybCB0byBidWlsZCBvbiBVbHRyaXguCgpEYW5pZWwgKDExIEFwcmlsIDIwMDEpCi0gQ3JpcyBCYWlsaWZmIHBvaW50ZWQgb3V0IHR3byBwcm9ibGVtcyB0aGF0IEkgY29ycmVjdGVkLiBGaXJzdCwgbGliY3VybCdzIHVzZQogIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIVFRQX1BST1hZIGluIHVwcGVyY2FzZSBtYXkgYmVjb21lIGEgc2VjdXJpdHkKICBoYXphcmQgd2hlbiBwZW9wbGUgdXNlIGxpYmN1cmwgaW4gYSBzZXJ2ZXIvY2dpIHNpdHVhdGlvbiB3aGVyZSB0aGUgc2VydmVyCiAgc2V0cyB0aGUgSFRUUF8qLXZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gaW5jb21pbmcgaGVhZGVycyBpbiB0aGUgSFRUUAogIHJlcXVlc3QuIFRodXMsIGEgIlByb3h5OiItaGVhZGVyIHdvdWxkIHNldCB0aGF0IGVudmlyb25tZW50IHZhcmlhYmxlIQoKICBUaGVuLCBpbnZva2luZyBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpdGhvdXQgaGF2aW5nIGFuIFVSTCBzZXQgY2F1c2VkIGEgY3Jhc2guCgotIFMuIE1vb25lc2FteSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlIGN1cmwgdXNlIG5vbi1ibG9ja2luZyBjb25uZWN0cyBvbgogIHdpbmRvd3Mgd2hlbiBjb25uZWN0aW9uIHRpbWVvdXQgaXMgc2V0LCBhcyBpdCBhbGxvd3Mgd2luZG93cyB1c2VycyB0byBzZXQKICB0aGF0IHRpbWVvdXQhCgotIEhpcm90YWthIE1hdHN1eXVraSB3cm90ZSBhIFJ1YnkgaW50ZXJmYWNlIHRvIGxpYmN1cmwhCgotIENyaXMgQmFpbGlmZiwgRm9ycmVzdCBDYWhvb24gYW5kIEdlb3JnIEhvcm4gd29yayBvbiB0aGUgUGVybCBpbnRlcmZhY2UuCgotIEkndmUgd3JpdHRlbiBhIGZpcnN0IHNob3QgYXQgYSBKYXZhIGludGVyZmFjZSB0byBsaWJjdXJsLiBNYW55IHRoYW5rcyB0bwogIERhbmllbCBNYXJlbGwgZm9yIHRpcmVsZXNzbHkgYW5zd2VyaW5nIHRvIGFsbCBteSBiYXNpYyBKYXZhIHF1ZXN0aW9ucy4gSXQKICB3b3JrcywgYnV0IGl0IGlzIHN0aWxsIHZlcnkgYmFzaWMuCgpEYW5pZWwgKDEwIEFwcmlsIDIwMDEpCi0gVGhlIHByb2dyZXNzIGRpc3BsYXkgY291bGQgZ2V0IHNpbGx5IHdoZW4gZG9pbmcgbXVsdGlwbGUgZmlsZSB0cmFuc2ZlcnMsIGFzCiAgaXQgd2Fzbid0IHByb3Blcmx5IHJlc2V0IGJldHdlZW4gdHJhbnNmZXJzIQoKLSBEaXNjdXNzaW9ucyB3aXRoIENyaXMgQmFpbGlmZiB3aG8gd3JpdGVzIGEgUGVybCBpbnRlcmZhY2UgdG8gbGliY3VybCwgbWFkZQogIG1lIGFkZCBDVVJMT1BUX0hFQURFUkZVTkNUSU9OLiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgYSBzZXBhcmF0ZSBjYWxsYmFjawogIGZ1bmN0aW9uIGZvciB3cml0aW5nIGhlYWRlcnMuIFByZXZpb3VzbHkgeW91IGNvdWxkIG9ubHkgc2V0IGEgZGlmZmVyZW50IEZJTEUKICAqIHdoZW4gaGVhZGVycyBhcmUgd3JpdHRlbiBmcm9tIHdpdGhpbiBsaWJjdXJsLgoKRGFuaWVsICg3IEFwcmlsIDIwMDEpCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIHByb2JsZW0gaW4gY3VybF9lc2NhcGUoKSBhbmQgcG9pbnRlZCBvdXQgYSBmbGF3IGluCiAgdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UuCgpEYW5pZWwgKDYgQXByaWwgMjAwMSkKLSBBZGp1c3RlZCB0aGUgdmVyc2lvbiBjb2RlIHRvIHByb3Blcmx5IGRpc3BsYXkgT3BlblNTTCAwLjkuNmEuIFRoZXkgc3VyZQogIGNoYW5nZSB0aGVpciB2ZXJzaW9uIGRlZmluZSBmb3JtYXQgb2Z0ZW4uLi4KCi0gY3VybF9mb3JtZnJlZSgpIG5vdyBhY2NlcHRzIGEgTlVMTCBwb2ludGVyIHdpdGhvdXQgY3Jhc2hpbmchCgpWZXJzaW9uIDcuNy4xCgpEYW5pZWwgKDMgQXByaWwgMjAwMSkKLSBQdW5lZXQgUGF3YWlhIHBvaW50ZWQgb3V0IHR3byBzZXJpb3VzIHByb2JsZW1zLiBMaWJjdXJsIHdvdWxkIGF0dGVtcHQgdG8KICByZWFkIGJhZCBtZW1vcnkgZHVyaW5nIHNpdHVhdGlvbnMgd2hlbiBhbiAoZnRwKSBjb25uZWN0aW9uIGF0dGVtcHQgZmFpbGVkLgogIEFsc28sIHRoZSBsaWIvTWFrZWZpbGUudmM2IHdhcyBjb3JyZWN0ZWQuCgotIE1vcmUgaW52ZXN0aWdhdGlvbnMgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgY29kZSBtYWRlIG1lIHJlYWxpemUgdGhhdAogIGl0IHdhcyBub3QgY2xlYW4gZW5vdWdoIHRvIHdvcmsgdHJhbnNwYXJhbnRseSB3aXRoIHBlcnNpc3RlbnQgYW5kIG5vbi0KICBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBJIHRoaW5rIEkndmUgZml4ZWQgaXQgbm93LgoKRGFuaWVsICgyOSBNYXJjaCAyMDAxKQotIEdlb3JnIEhvcm4gbWFpbGVkIG1lIHNvbWUgY29ycmVjdGlvbnMgZm9yIHRoZSBDdXJsOjplYXN5IHBlcmwgaW50ZXJmYWNlLgoKLSBFeHBlcmltZW50YWwgZnRwczovLyBzdXBwb3J0IGFkZGVkLiBJdCBpcyBiYXNpY2FsbHkgRlRQIG92ZXIgU1NMIGZvciB0aGUKICBjb250cm9sIGNvbm5lY3Rpb24uIEl0IHN0aWxsIG1ha2VzIGFsbCBkYXRhIHRyYW5zZmVycyBnb2luZyBvdmVyIHVuZW5jcnlwdGVkCiAgY29ubmVjdGlvbnMuIFJhaW5lciBXZWlrdXNhdCdzIGZ0cGQtc3NsIHNlcnZlciBoYWNrIHN1cHBvcnRzIHRoaXMgYW5kIEkgdXNlZAogIHRoYXQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyNyBNYXJjaCAyMDAxKQotIEd1ZW5vbGUgQmVzY29uIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3Ugc2V0IGEgQ1VSTE9QVF9USU1FT1VUIGFuZCB0aGVuIHRyaWVkCiAgdG8gZ2V0IGEgZmlsZSBmcm9tIGEgc2l0ZSBhbmQgaXQgZmFpbHMsIHRoZSBTSUdBTFJNIHdvdWxkIHN0aWxsIGJlIHNlbnQKICBhZnRlciB0aGUgdGltZW91dC10aW1lLCBxdWl0ZSBpbmV4cGVjdGVkbHkhCgotIEkgYWRkZWQgYW4gZnRwIHRyYW5zZmVyIGV4YW1wbGUgdG8gZG9jcy9leGFtcGxlcy8gYW5kIEkgYWxzbyB3cm90ZSBhIHRpbnkKICBleGFtcGxlIG1ha2VmaWxlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBzdGFydCB3aGVuIGJ1aWxkaW5nIG9uZSBvZiB0aGUKICBleGFtcGxlcy4KClZlcnNpb24gNy43LjEtYmV0YTEKCkRhbmllbCAoMjYgTWFyY2ggMjAwMSkKLSBNb2hhbWVkIExyaGF6aSByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIDcuNi4xIGFuZCBwZXJzaXN0ZW50IEhUVFAvMS4wCiAgY29ubmVjdGlvbnMgKHdoZW4gdGhlIHNlcnZlciByZXBsaWVkIGEgQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSkgYW5kIHRoaXMKICBwcm9ibGVtIHdhcyBub3QgcHJvcGVybHkgZGVhbHQgd2l0aCBpbiA3LjcgZWl0aGVyLiBBIHBhdGNoIHdhcyBwb3N0ZWQgdG8gdGhlCiAgY3VybC1hbmQtcGhwIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoMjQgTWFyY2ggMjAwMSkKLSBDb2xpbiBXYXRzb24gcmVwb3J0ZWQgYWJvdXQgYSBwcm9ibGVtIGFuZCBicm91Z2h0IGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQsCiAgd2hpY2ggd2FzIGFib3V0IHRoZSBtYW4gcGFnZSBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCBhIHNpbmdsZSBxdW90ZSAoJykgaW4gYQogIHdheSB0aGF0IGducm9mZiBkb2Vzbid0IGxpa2UuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDEpCi0gUGV0ZXIgQnJheSByZXBvcnRlZCBjb3JyZWN0bHkgdGhhdCB0aGUgcm9vdCBtYWtlZmlsZSB1c2VkIG1ha2UgaW5zdGVhZCBvZgogICQoTUFLRSkgZm9yIHRoZSB0ZXN0IHRhcmdldC4KCi0gQ29ycmVjdGVkIHRoZSBDdXJsOjplYXN5IHBlcmwgaW50ZXJmYWNlIHRvIHVzZSBjdXJsX2Vhc3lfc2V0b3B0KCkgYW5kIG5vdAogIGN1cmxfc2V0b3B0KCkgd2hpY2ggd2FzIHJlbW92ZWQgaW4gNy43IQoKLSBTLiBNb29uZXNhbXkgcHJvdmlkZWQgdXBkYXRlcyBvbiB0aHJlZSBkb2N1bWVudHMgKE1BTlVBTCwgSU5TVEFMTCBhbmQgRkFRKS4KCi0gV2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjosIGxpYmN1cmwgd291bGQgc29tZXRpbWVzIHdyaXRlIHRvIHRoZSBVUkwgc3RyaW5nCiAgaW4gYSB3YXkgaXQgc2hvdWxkbid0LiBBcyB0aGUgcG9pbnRlciBpcyBwYXNzZWQtaW4gdG8gbGliY3VybCBmcm9tIGFuCiAgYXBwbGljYXRpb24sIHdlIGNhbid0IGJlIGFsbG93ZWQgdG8gd3JpdGUgdG8gaXQuIFRoZSBwYXJ0aWN1bGFyIGJ1ZyByZXBvcnQKICBmcm9tICduaycgdGhhdCBicm91Z2h0IHRoaXMgdXAgd2FzIGJlY2F1c2UgaGUgaGFkIGEgcmVhZC1vbmx5IFVSTCB0aGF0IHRoZW4KICBjYXVzZWQgYSBsaWJjdXJsIGNyYXNoIQoKLSBObyBsb25nZXIgcmVhZHMgSEVBRCByZXNwb25zZXMgbG9uZ2VyIHRoYW4gdG8gdGhlIGxhc3QgaGVhZGVyLiBQcmV2aW91c2x5LAogIGN1cmwgd291bGQgcmVhZCB0aGUgZnVsbCByZXBseSBpZiB0aGUgY29ubmVjdGlvbiB3YXMgYSAiY2xvc2UiIG9uZS4KCi0gbGliY3VybCBkaWQgcmUtdXNlIGNvbm5lY3Rpb25zIHdheSB0b28gbXVjaC4gRG9pbmcgImN1cmwKICBodHRwOi8vd3d3LnttaWNyb3NvZnQsaWJtfS5jb20iIHdvdWxkIG1ha2UgaXQgcmUtdXNlIHRoZSBjb25uZWN0aW9uIHdoaWNoCiAgbWFkZSB0aGUgc2Vjb25kIHJlcXVlc3QgcmV0dXJuIHZlcnkgb2RkIHJlc3VsdHMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gRWRpbiBLYWRyaWJhc2ljIG1hZGUgbWUgYXdhcmUgdGhhdCBjdXJsIHNob3VsZCBub3QgcmUtc2VuZCBQT1NUIHJlcXVlc3RzCiAgd2hlbiBmb2xsb3dpbmcgMzAyLXJlZGlyZWN0cy4gSSBtYWRlIDMwMiB3b3JrIGxpa2UgMzAzIHdoaWNoIG1lYW5zIGN1cmwgdXNlcwogIEdFVCBpbiB0aGUgZm9sbG93aW5nIHJlcXVlc3QocykuCgotIGxpYmN1cmwgbm93IHJlc2V0IHRoZSAiZm9sbG93ZWQtbG9jYXRpb24iIGNvdW50ZXIgb24gZWFjaCBpbnZva2Ugb2YKICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGFzIGl0IG90aGVyd2lzZSB3b3VsZCBzdW0gdXAgYWxsIHJlZGlyZWN0cyBvbiB0aGUgc2FtZQogIGNvbm5lY3Rpb24gYW5kIHRodXMgY291bGQgcmVhY2ggdGhlIG1heHJlZGlycyBjb3VudGVyIHdyb25nbHkuCgotIEppbSBEcmFzaCBzdWdnZXN0ZWQgY3VybF9lc2NhcGUoKSBzaG91bGQgbm90IHJlLWVuY29kZSB3aGF0IGFscmVhZHkgbG9va3MKICBsaWtlIGFuIGVuY29kZWQgc2VxdWVuY2UgYW5kIEkgdGhpbmsgdGhhdCdzIGEgZmFpciBzdWdnZXN0aW9uLgoKVmVyc2lvbiA3LjcKCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgZmFpbHMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIGdldGhvc3RieW5hbWVfcigpIGlzCiAgZGV0ZWN0ZWQgYnV0IGl0IGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIGludm9rZSBpdCAod2hhdCBhbW91bnQgb2YKICBhcmd1bWVudHMgaXQgaXMgc3VwcG9zZWQgdG8gZ2V0KS4gUmVwb3J0cyBmcm9tIEFuZHLpcyBHYXJj7WEgbWFkZSBtZSBhd2FyZQogIG9mIHRoaXMgbmVlZC4KCi0gVGFsa2luZyB3aXRoIEppbSBEcmFzaCBtYWRlIG1lIGZpbmFsbHkgcHV0IHRoZSBjdXJsX2VzY2FwZSBhbmQgY3VybF91bmVzY2FwZQogIGZ1bmN0aW9ucyBpbiB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSBhbmQgd3JpdGUgbWFuIHBhZ2VzIGZvciB0aGVtLiBUaGUKICBlc2NhcGUgZnVuY3Rpb24gd2FzIG1vZGlmaWVkIHRvIHVzZSB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIHVuZXNjYXBlIG9uZQogIGhhZC4KCi0gTm8gYnVnIHJlcG9ydHMgYXQgYWxsIG9uIHRoZSBsYXRlc3QgYmV0YXMuIFJlbGVhc2UgdGltZSBjb21pbmcgdXAuCgpWZXJzaW9uIDcuNy1iZXRhNQoKRGFuaWVsICgxOSBNYXJjaCAyMDAxKQotIEdlb3JnIE90dGluZ2VyIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggdXNpbmcgLUMgdG9nZXRoZXIgd2l0aCAtTCBpbiB0aGUgc2Vuc2UKICB0aGF0IHRoZSAtQyBpbmZvIGdvdCBsb3N0IHdoZW4gaXQgd2FzIHJlZGlyZWN0ZWQuIEkgY291bGQgbm90IHJlcGVhdCB0aGlzCiAgcHJvYmxlbSBvbiB0aGUgNy43IGJyYW5jaCB3aHkgSSBsZWF2ZSB0aGlzIGZvciB0aGUgbW9tZW50LiBUZXN0IGNhc2UgMzkgd2FzCiAgYWRkZWQgdG8gZG8gZXhhY3RseSB0aGlzLCBhbmQgaXQgc2VlbXMgdG8gZG8gcmlnaHQuCgotIENocmlzdGlhbiBSb2JvdHRvbSBSZWlzIHJlcG9ydGVkIGhvdyBoaXMgNy43IGJldGEgZGlkbid0IHN1Y2Nlc3NmdWxseSBkbwogIGZvcm0gcG9zdHMgYXMgZWxlZ2FudGx5IGFzIDcuNi4xIGRpZC4gSW5kZWVkLCB0aGlzIHdhcyBhIGZsYXcgaW4gdGhlIGhlYWRlcgogIGVuZ2luZSwgYXMgSFRUUCAxLjEgaGFzIGludHJvZHVjZWQgYSBuZXcgMTAwICJ0cmFuc2llbnQiIHJldHVybiBjb2RlIGZvciBQVVQKICBhbmQgUE9TVCBvcGVyYXRpb25zIHRoYXQgSSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvci4gU2VjdGlvbiA4LjIuMyBpbiBSRkMyNjE2CiAgaGFzIGFsbCB0aGUgZGV0YWlscy4gU2VlbXMgdG8gd29yayBub3chCgpEYW5pZWwgKDE2IE1hcmNoIDIwMDEpCi0gQWZ0ZXIgaGF2aW5nIGV4cGVyaWVuY2VkIGFub3RoZXIgbWFjaGluZSBicmVhay1kb3duLCB3ZSdyZSBiYWNrLgoKLSBHZW9yZyBIb3JuJ3MgcGVybCBpbnRlcmZhY2UgQ3VybDo6ZWFzeSBpcyBub3cgaW5jbHVkZWQgaW4gdGhlIGN1cmwgcmVsZWFzZQogIGFyY2hpdmUuIFRoZSBwZXJsLyBkaXJlY3RvcnkgaXMgbm93IHByZXNlbnQuIFBsZWFzZSBoZWxwIG1lIHdpdGggZG9jcywKICBleGFtcGxlcyBhbmQgdXBkYXRlcyB5b3UgdGhpbmsgZml0LgoKLSBNYWRlIGEgbmV3IHBocC8gZGlyZWN0b3J5IGluIHRoZSByZWxlYXNlIGFyY2hpdmUgYW5kIG1vdmVkIHRoZSBQSFAgZXhhbXBsZXMKICBpbnRvIGEgc3ViZGlyZWN0b3J5IGluIHRoZXJlLiBOb3QgbXVjaCBQSFAgaW5mbyB5ZXQsIGJ1dCBJIHBsYW4gdG8uIFBsZWFzZQogIGhlbHAgbWUgaGVyZSBhcyB3ZWxsIQoKLSBNYWRlIGxpYmN1cmwgcmV0dXJuIGVycm9yIGlmIGEgdHJhbnNmZXIgaXMgYWJvcnRlZCBpbiB0aGUgbWlkZGxlIG9mIGEKICAiY2h1bmsiLiBJdCBhY3R1YWxseSBlbmFibGVzIGxpYmN1cmwgdG8gZGlzY292ZXIgcHJlbWF0dXJlIHRyYW5zZmVyIGFib3J0cwogIGV2ZW4gaWYgdGhlIENvbnRlbnQtTGVuZ3RoOiBzaXplIGlzIHVua25vd24uCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDEpCi0gQWRkZWQgLS1jb25uZWN0LXRpbWVvdXQgdG8gY3VybCwgd2hpY2ggc2V0cyB0aGUgbmV3IENVUkxPUFRfQ09OTkVDVFRJTUVPVVQKICBvcHRpb24gaW4gbGliY3VybC4gSXQgbGltaXRzIHRoZSB0aW1lIGN1cmwgaXMgYWxsb3dlZCB0byBzcGVuZCBpbiB0aGUKICBjb25uZWN0aW9uIHBoYXNlLiBUaGlzIGRpZmZlcnMgZnJvbSAtbS8tLW1heC10aW1lIHRoYXQgbGltaXRzIHRoZSBlbnRpcmUKICBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbi4gUmVxdWVzdGVkIGJ5IExhcnJ5IEZhaG5vZSBhbmQgb3RoZXJzLgoKICBJIGFsc28gdXBkYXRlZCB0aGUgY3VybC4xIGFuZCBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2VzIGFuZCByZW1vdmVkIHRoZQogIGl0ZW0gZnJvbSB0aGUgVE9ETy4KClZlcnNpb24gNy43LWJldGE0CgpEYW5pZWwgKDE0IE1hcmNoIDIwMDEpCi0gTWFkZSBjdXJsIGdyb2sgSVB2NiB3aXRoIEhUVFAgcHJveGllcyBhbmQgZ290IGV2ZXJ5dGhpbmcgdG8gY29tcGlsZSBuaWNlbHkKICBhZ2FpbiB3aGVuIEVOQUJMRV9JUFY2IGlzIHNldC4KCiAgSSBuZWVkIHRvIHJlbWFrZSB0aGluZ3MgaW4gdGhlIHRlc3Qgc3VpdGUuIEkgY2FuJ3QgdGVzdCB0aGUgRlRQIHBhcnRzIHdpdGgKICBjdXJsIGJ1aWx0IGZvciBJUHY2IGFzIGl0IHVzZXMgYSBkaWZmZXJlbnQgc2V0IG9mIEZUUCBjb21tYW5kcyB0aGVuIQoKLSBJIGZlbGwgb250byBhIGJ1ZyByZXBvcnQgb24gcGhwLm5ldCAocG9zdGVkIGJ5IExhcnMgVG9yYmVuIFdpbHNvbikgdGhhdCB3YXMKICBhIHJlcG9ydCBtZWFudCBmb3Igb3VyIHByb2plY3QuIEFueXdheSwgaXQgc2FpZCB0aGUgLm5ldHJjIHBhcnNpbmcgZGlkbid0CiAgd29yayBhcyBzdXBwb3NlZCwgYW5kIGFzIEkgYWdyZWVkIHdpdGggTGFycywgSSBtYWRlIHRoZSBuZXRyYyBwYXJzZXIgdXNlCiAgZ2V0cHd1aWQoKSB0byBmaWd1cmUgb3V0IHRoZSBob21lIGRpcmVjdG9yeSBvZiB0aGUgZWZmZWN0aXZlIHVzZXIgYW5kIHRyeQogIHRoYXQgbmV0cmMuIEl0IHN0aWxsIHVzZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhPTUUgZm9yIHRob3NlIHRoYXQgZG9uJ3QKICBoYXZlIHRoYXQgZnVuY3Rpb24gb3IgaWYgdGhlIHVzZXIgZG9lc24ndCByZXR1cm4gdmFsaWQgcHdkIGluZm8uCgotIEVkaW4gS2FkcmliYWljIHBvc3RlZCBhIGJ1ZyByZXBvcnQgd2hlcmUgaGUgZ290IGEgY3Jhc2ggd2hlbiBhIGZldGNoIHdpdGgKICB1c2VyK3Bhc3N3b3JkIGluIHRoZSBVUkwgZm9sbG93ZWQgYSBMb2NhdGlvbjogdG8gYSBzZWNvbmQgVVJMIChhYnNvbHV0ZSwKICB3aXRob3V0IG5hbWUrcGFzc3dvcmQpLiBUaGlzIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIGEgbG9uZyB3aGlsZSBhbmQKICBjcmFzaGVzIGR1ZSB0byBhIHJlYWQgYXQgYWRkcmVzcyB6ZXJvLiBGaXhlZCBub3cuIFdyb3RlIHRlc3QgY2FzZSAzOCwgdGhhdAogIHRlc3RzIHRoaXMuCgotIE1vZGlmaWVkIHRoZSB0ZXN0IHN1aXRlJ3MgaHR0cHNlcnZlciBzbGlnaHRseSB0byBhcHBlbmQgYWxsIGNsaWVudCByZXF1ZXN0CiAgZGF0YSB0byBpdHMgbG9nIGZpbGUgc28gdGhhdCB0aGUgdGVzdCBzY3JpcHQgbm93IGJldHRlciBjYW4gdmVyaWZ5IGEgcmFuZ2UKICBvZiByZXF1ZXN0cyBhbmQgbm90IG9ubHkgdGhlIGxhc3Qgb25lLCBhcyBpdCBkaWQgcHJldmlvdXNseS4KCi0gVXBkYXRlZCB0aGUgY3VybCBtYW4gcGFnZSB3aXRoIC0tcmFuZG9tLWZpbGUgYW5kIC0tZWdkLWZpbGUgZGV0YWlscy4KClZlcnNpb24gNy43LWJldGEzCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgcHJvdmlkZWQgc2ltaWxhciBmaXhlcyBhcyBK9nJuIGRpZCBhbmQgc29tZSBhZGRpdGlvbmFsIHBhdGNoZXMKICBmb3Igbm9uLVNTTCBjb21waWxlcy4KCi0gSSBpbmNyZWFzZWQgdGhlIGludGVyZmFjZSBudW1iZXIgZm9yIGxpYmN1cmwgYXMgSSd2ZSByZW1vdmVkIHRoZSBsb3cgbGV2ZWwKICBmdW5jdGlvbnMgZnJvbSB0aGUgaW50ZXJmYWNlLiBJIGFsc28gdG9vayB0aGlzIG9wcG9ydHVuaXR5IHRvIHJlbmFtZSB0aGUKICBDdXJsX3N0cmVxdWFsIGZ1bmN0aW9uIHRvIGN1cmxfc3RyZXF1YWwgYW5kIEN1cmxfc3RybmVxdWFsIHRvCiAgY3VybF9zdHJuZXF1YWwsIGFzIHRoZXkncmUgcHVibGljIGxpYmN1cmwgZnVuY3Rpb25zIChldmVuIGlmIHRoZXkncmUgc3RpbGwKICB1bmRvY3VtZW50ZWQpLgoKICBUaGlzIHdpbGwgbWFrZSBvbGRlciBwcm9ncmFtcyBub3QgY2FwYWJsZSBvZiB1c2luZyB0aGUgbmV3IGxpYmN1cmwgd2l0aAogIGp1c3QgYSBkcm9wLWluIHJlcGxhY2VtZW50LgoKLSBK9nJuIEhhcnRyb3RoIHVwZGF0ZWQgc3R1ZmYgZm9yIHdpbjMyIGNvbXBpbGVzOgogIG8gY29uZmlnLXdpbjMyLmggd2FzIGZpeGVkIGZvciBzb2NrbGVuX3QKICBvIGxpYi9zc2x1c2UuYyBoYWQgYSBiYWQgI2VuZGlmIHBsYWNlbWVudAogIG8gbGliL2ZpbGUuYyB3YXMgbWFkZSB0byBjb21waWxlIG9uIHdpbjMyIGFnYWluCiAgbyBsaWIvTWFrZWZpbGUubTMyIHdhcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBmaWxlcwogIG8gbGliL2xpYmN1cmwuZGVmIG1hdGNoZXMgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIHN0YXRlCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gSXQgb25seSB0b29rIGFuIGhvdXIgb3Igc28gYmVmb3JlIEr2cm4gSGFydHJvdGggZm91bmQgYSBwcm9ibGVtIGluIHRoZQogIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuIEdpdmVuIGhpcyBmaW5lIGV4YW1wbGUtc2l0ZSwgSSBjb3VsZCBlYXNpbHkgc3BvdAogIHRoZSBwcm9ibGVtIGFuZCB3aGVuIEkgcmUtcmVhZCB0aGUgc3BlYyAodGhlIHBhcnQgSSBoYXZlIHBhc3RlZCBpbiB0aGUgdG9wCiAgb2YgdGhlIGh0dHBfY2h1bmtzLmggZmlsZSksIEkgcmVhbGl6ZWQgSSBoYWQgbWFkZSBteSBzdGF0ZS1tYWNoaW5lIHNsaWdodGx5CiAgd3JvbmcgYW5kIGRpZG4ndCBleHBlY3QvaGFuZGxlIHRoZSB0cmFpbGluZyBDUkxGIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIGRhdGEKICBpbiBlYWNoIGNodW5rIChhbmQgdGhvc2UgZXh0cmEgdHdvIGJ5dGVzIHN1cmUgZmVlbCB3YXN0ZWQpLgoKICBIYWQgdG8gbW9kaWZ5IHRlc3QgY2FzZSAzNCB0byBtYXRjaCB0aGlzIGFzIHdlbGwuCgpWZXJzaW9uIDcuNy1iZXRhMgoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEFkZGVkIHRoZSBwb2xpY3kgc3R1ZmYgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgZm9yIHRoZSB0d28gc3VwcG9ydGVkCiAgcG9saWNpZXMuCgotIEltcGxlbWVudGVkIHNvbWUgc3VwcG9ydCBmb3IgdGhlIENVUkxPUFRfQ0xPU0VQT0xJQ1kgb3B0aW9uLiBUaGUgcG9saWNpZXMKICBDVVJMQ0xPU0VQT0xJQ1lfTEVBU1RfUkVDRU5UTFlfVVNFRCBhbmQgQ1VSTENMT1NFUE9MSUNZX09MREVTVCBhcmUgbm93CiAgc3VwcG9ydGVkLCBhbmQgdGhlICJsZWFzdCByZWNlbnRseSB1c2VkIiBpcyB1c2VkIGFzIGRlZmF1bHQgaWYgbm8gcG9saWN5CiAgaXMgY2hvc2VuLgoKRGFuaWVsICgxMiBNYXJjaCAyMDAxKQotIEFkZGVkIENVUkxPUFRfUkFORE9NX0ZJTEUgYW5kIENVUkxPUFRfRUdEU09DS0VUIHRvIGxpYmN1cmwgZm9yIHNlZWRpbmcgdGhlCiAgU1NMIHJhbmRvbSBlbmdpbmUuIFRoZSByYW5kb20gc2VlZGluZyBzdXBwb3J0IHdhcyBhbHNvIGJyb3VnaHQgdG8gdGhlIGN1cmwKICBjbGllbnQgd2l0aCB0aGUgbmV3IG9wdGlvbnMgLS1yYW5kb20tZmlsZSA8ZmlsZT4gYW5kIC0tZWdkLWZpbGUgPGZpbGU+LiBJCiAgbmVlZCBzb21lIHBlb3BsZSB0byByZWFsbHkgdGVzdCB0aGlzIHRvIGtub3cgdGhleSB3b3JrIGFzIHN1cHBvc2VkLiBSZW1lbWJlcgogIHRoYXQgbGliY3VybCBub3cgaW5mb3JtcyAoaWYgdmVyYm9zZSBpcyBvbikgaWYgdGhlIHJhbmRvbSBzZWVkIGlzIGNvbnNpZGVyZWQKICB3ZWFrIChIVFRQUyBjb25uZWN0aW9ucykuCgotIE1hZGUgdGhlIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgZW5naW5lIGRldGVjdGVkIGJhZCBmb3JtYXR0ZWQgZGF0YSBsZW5ndGgKICBhbmQgcmV0dXJuIGVycm9yIGlmIHNvICh3ZSBjYW4ndCBwb3NzaWJseSBleHRyYWN0IHNlbnNpYmxlIGRhdGEgaWYgdGhpcyBpcwogIHRoZSBjYXNlKS4gQWRkZWQgYSB0ZXN0IGNhc2UgdGhhdCBkZXRlY3RzIHRoaXMuIE51bWJlciAzNi4gTm93IHRoZXJlIGFyZSA2MAogIHRlc3QgY2FzZXMuCgotIEFkZGVkIDUgbmV3IGxpYmN1cmwgb3B0aW9ucyB0byBjdXJsL2N1cmwuaCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uIHN1cHBvcnQgaW4gbGliY3VybC4gVGhleSdyZSBhbHNvIGRvY3VtZW50ZWQgKGZhaXJseQogIHRob3JvdWdobHkpIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuIFRocmVlIG9mIHRoZW0gYXJlIG5vdwogIGltcGxlbWVudGVkLCBhbHRob3VnaCBub3QgcmVhbGx5IHRlc3RlZCBhdCB0aGlzIHBvaW50Li4uIEFueXdheSwgdGhlIG5ldwogIGltcGxlbWVudGVkIG9wdGlvbnMgYXJlIG5hbWVkIENVUkxPUFRfTUFYQ09OTkVDVFMsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwKICBDVVJMT1BUX0ZPUkJJRF9SRVVTRS4gVGhlIG9uZXMgc3RpbGwgbGVmdCB0byB3cml0ZSBjb2RlIGZvciBhcmU6CiAgQ1VSTE9QVF9DTE9TRVBPTElDWSBhbmQgaXRzIHJlbGF0ZWQgb3B0aW9uIENVUkxPUFRfQ0xPU0VGVU5DVElPTi4KCi0gTWFkZSBjdXJsICh0aGUgYWN0dWFsIGNvbW1hbmQgbGluZSB0b29sKSB1c2UgdGhlIG5ldyBsaWJjdXJsIDcuNyBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiBzdXBwb3J0IGJ5IHJlLXVzaW5nIHRoZSBzYW1lIGN1cmwgaGFuZGxlIGZvciBldmVyeSBzcGVjaWZpZWQgZmlsZQogIHRyYW5zZmVyIGFuZCBhZnRlciBzb21lIG1vcmUgdGVzdCBjYXNlIHR3ZWFraW5nIHdlIGhhdmUgMTAwJSB0ZXN0IGNhc2UgT0suCiAgSSBtYWRlIHNvbWUgdGVzdCBjYXNlcyByZXR1cm4gSFRUUC8xLjAgbm93IHRvIG1ha2Ugc3VyZSB0aGF0IHdvcmtzIGFzIHdlbGwuCgotIEhhZCB0byBhZGQgJ0Nvbm5lY3Rpb246IGNsb3NlJyB0byB0aGUgaGVhZGVycyBvZiBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgc28KICB0aGF0IGN1cmwgYmVoYXZlcyAib2xkLXN0eWxlIiBzaW5jZSB0aGUgdGVzdCBodHRwIHNlcnZlciBkb2Vzbid0IGRvIG11bHRpcGxlCiAgY29ubmVjdGlvbnMuLi4gTm93IEkgZ2V0IDEwMCUgdGVzdCBjYXNlIE9LLgoKLSBUaGUgY3VybC5oYXh4LnNlIHNpdGUsIHRoZSBtYWluIGN1cmwgbWFpbGluZyBsaXN0IGFuZCBteSBwZXJzb25hbCBlbWFpbCBhcmUKICBhbGwgZGVhZCB0b2RheSBkdWUgdG8gcG93ZXIgYmxhY2tvdXQgaW4gdGhlIGFyZWEgd2hlcmUgdGhlIG1haW4gc2VydmVycyBhcmUKICBsb2NhdGVkLiBIb3JyaWJsZS4KCi0gSSd2ZSBtYWRlIHBlcnNpc3RhbmNlIHdvcmsgb3ZlciBhIHNxdWlkIEhUVFAgcHJveHkuIEkgZmluZCBpdCBkaXN0dXJiaW5nCiAgdGhhdCBpdCB1c2VzIGhlYWRlcnMgdGhhdCBhcmVuJ3QgcHJlc2VudCBpbiBhbnkgSFRUUCBzdGFuZGFyZCB0aG91Z2gKICAoUHJveHktQ29ubmVjdGlvbjopIGFuZCB0aGF0IG1ha2VzIG1lIGZlZWwgdGhhdCBJJ20gbm93IG9uIHRoZSBlZGdlIG9mIHdoYXQKICB0aGUgc3RhbmRhcmQgYWN0dWFsbHkgZGVmaW5lcy4gSSBuZWVkIHRvIGdldCB0aGlzIGNvZGUgZXhjZXJjaXNlZCBvbiBhIGxvdAogIG9mIGRpZmZlcmVudCBIVFRQIHByb3hpZXMgYmVmb3JlIEkgZmVlbCBzYWZlLgoKICBOb3cgSSdtIGZhY2luZyB0aGUgcHJvYmxlbSB3aXRoIG15IHRlc3Qgc3VpdGUgc2VydmVycyAoYm90aCBGVFAgYW5kIEhUVFApCiAgbm90IHN1cHBvcnRpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgbGliY3VybCBpcyBkb2luZyB0aGVtIG5vdy4gSSBoYXZlCiAgdG8gZml4IHRoZSB0ZXN0IHNlcnZlcnMgdG8gZ2V0IGFsbCB0aGUgdGVzdCBjYXNlcyBkbyBPSy4KCkRhbmllbCAoOCBNYXJjaCAyMDAxKQotIEd1ZW5vbGUgQmVzY29uIHJlcG9ydGVkIHRoYXQgbGliY3VybCBkaWQgb3V0cHV0IGVycm9ycyB0byBzdGRlcnIgZXZlbiBpZgogIE1VVEUgYW5kIE5PUFJPR1JFU1Mgd2FzIHNldC4gSXQgdHVybmVkIG91dCB0byBiZSBhIGJ1ZyBhbmQgaGFwcGVucyBpZgogIHRoZXJlJ3MgYW4gZXJyb3IgYW5kIG5vIEVSUk9SQlVGRkVSIGlzIHNldC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKVmVyc2lvbiA3LjctYmV0YTEKCkRhbmllbCAoOCBNYXJjaCAyMDAxKQotICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgaXMgbm8gbG9uZ2VyIGFueSB0cm91YmxlIGZvciBsaWJjdXJsLiBJJ3ZlCiAgYWRkZWQgdHdvIHNvdXJjZSBmaWxlcyBhbmQgSSd2ZSBydW4gc29tZSB0ZXN0IGRvd25sb2FkcyB0aGF0IGxvb2sgZmluZS4KCi0gSFRUUCBIRUFEIHdvcmtzIHRvbywgZXZlbiBvbiAxLjEgc2VydmVycy4KCkRhbmllbCAoNSBNYXJjaCAyMDAxKQotIFRoZSBjdXJyZW50IDU3IHRlc3QgY2FzZXMgbm93IHBhc3MgT0suIEl0IHdvdWxkIHN1Z2dlc3QgdGhhdCBsaWJjdXJsIHdvcmtzCiAgdXNpbmcgdGhlIG9sZC1zdHlsZSB3aXRoIG9uZSBjb25uZWN0aW9uIHBlciBoYW5kbGUuIFRoZSB0ZXN0IHN1aXRlIGRvZXNuJ3QKICBoYW5kbGUgbXVsdGlwbGUgY29ubmVjdGlvbnMgeWV0IHNvIHRoZXJlIGFyZSBubyB0ZXN0IGNhc2VzIGZvciB0aGlzLgoKLSBJIHBhdGNoZWQgdGhlIHRlbG5ldC5jIGhlYXZpbHkgdG8gbm90IHVzZSBhbnkgZ2xvYmFsIHZhcmlhYmxlcyBhbnltb3JlLiBJdAogIHNob3VsZCBtYWtlIGl0IGEgbG90IG5pY2VyIGxpYnJhcnktd2lzZS4KCi0gVGhlIGZpbGU6Ly8gc3VwcG9ydCB3YXMgbW9kaWZpZWQgc2xpZ2h0bHkgdG8gdXNlIHRoZSBpbnRlcm5hbCBjb25uZWN0LWZpcnN0LQogIHRoZW4tZG8gYXBwcm9hY2guCgpEYW5pZWwgKDQgTWFyY2ggMjAwMSkKLSBNb3JlIGJ1Z3MgZXJhc2VkLgoKVmVyc2lvbiA3LjctYWxwaGEyCgpEYW5pZWwgKDQgTWFyY2ggMjAwMSkKLSBOb3csIHRoZXJlJ3MgZXZlbiBhIGJhc2ljIGNoZWNrIHRoYXQgYSByZS11c2VkIGNvbm5lY3Rpb24gaXMgc3RpbGwgYWxpdmUKICBiZWZvcmUgaXQgaXMgYXNzdW1lZCBzby4gQSBmZXcgZmlyc3QgdGVzdHMgaGF2ZSBwcm92ZW4gdGhhdCBsaWJjdXJsIHdpbGwKICB0aGVuIHJlLWNvbm5lY3QgaW5zdGVhZCBvZiByZS11c2UgdGhlIGRlYWQgY29ubmVjdGlvbiEKCkRhbmllbCAoMiBNYXJjaCAyMDAxKQotIE5vdyB0aGV5IHdvcmsgaW50ZXJtaXhlZCBhcyB3ZWxsLiBNYWpvciBjb29sbmVzcyEKCi0gTW9yZSBmaWRkbGluZyBhcm91bmQsIG15ICd0aW55JyBjbGllbnQgSSBoYXZlIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG5vdyBoYXMKICBwcm92ZWQgdG8gZG93bmxvYWQgYm90aCBGVFAgYW5kIEhUVFAgd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLiBUaGV5IGRvCiAgbm90IHdvcmsgaW50ZXJtaXhlZCB5ZXQgdGhvdWdoLgoKRGFuaWVsICgxIE1hcmNoIDIwMDEpCi0gV2lsZnJlZG8gU2FuY2hleiBwb2ludGVkIG91dCBhIG1pbm9yIHNwZWxsaW5nIG1pc3Rha2UgaW4gYSBtYW4gcGFnZSBhbmQgdGhhdAogIGN1cmxfc2xpc3RfYXBwZW5kKCkgc2hvdWxkIHRha2UgYSBjb25zdCBjaGFyICogYXMgc2Vjb25kIGFyZ3VtZW50LiBJdCBkb2VzCiAgbm93LgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDAxKQotIFRoZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHN0YXJ0IHRvIGxvb2sgZ29vZCBmb3IgSFRUUC4gT24gYSBzdWJzZXF1ZW50CiAgcmVxdWVzdCwgaXQgc2VlbXMgdGhhdCBsaWJjdXJsIG5vdyBjYW4gcGljayBhbiBhbHJlYWR5IGV4aXN0aW5nIGNvbm5lY3Rpb24KICBpZiBhIHN1aXRhYmxlIG9uZSBleGlzdHMsIG9yIGl0IG9wZW5zIGEgbmV3IG9uZS4KCi0gRG91Z2xhcyBSLiBIb3JuZXIgbWFpbGVkIG1lIGNvcnJlY3Rpb25zIHRvIHRoZSBjdXJsX2Zvcm1wYXJzZSgpIG1hbiBwYWdlCiAgdGhhdCBJIGFwcGxpZWQuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDEpCi0gQWRkZWQgdGhlIGRvY3MvZXhhbXBsZXMvd2luMzJzb2NrZXRzLmMgZmlsZSBmb3Igb3VyIHdpbmRvd3MgZnJpZW5kcy4KCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBwcm92aWRlZCBicmFuZCBuZXcgVEVMTkVUIGZ1bmN0aW9uYWxpdHkgYW5kCiAgaW1wcm92ZW1lbnRzOgoKICAqIE5lZ290aWF0aW9uIGlzIG5vdyBwYXNzaXZlLiBDdXJsIGRvZXMgbm90IG5lZ290aWF0ZSB1bnRpbCB0aGUgcGVlciBkb2VzLgogICogUG9zc2liaWxpdHkgdG8gc2V0IG5lZ290aWF0aW9uIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSwgY3VycmVudGx5IG9ubHkKICAgIFhESVNQTE9DLCBUVFlQRSBhbmQgTkVXX0VOVklST04gKGNhbGxlZCBORVdfRU5WKS4KICAqIE5vdyBzZW5kcyB0aGUgVVNFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB0aGUgLXUgc3dpdGNoIGlzIHVzZWQuCiAgKiBVc2UgLXQgdG8gc2V0IHRlbG5ldCBvcHRpb25zIChMaW51cyBldmVuIHVwZGF0ZWQgdGhlIG1hbiBwYWdlLCBhd2Vzb21lISkKCi0gSGF2ZW4ndCBkb25lIHRoaXMgYmlnIGNoYW5nZXMgdG8gY3VybCBmb3IgYSB3aGlsZS4gTW92ZWQgYXJvdW5kIGEgbG90IG9mCiAgc3RydWN0IGZpZWxkcyBhbmQgc3R1ZmYgdG8gbWFrZSBtdWx0aXBsZSBjb25uZWN0aW9ucyBnZXQgY29ubmVjdGlvbiBzcGVjaWZpYwogIGRhdGEgaW4gc2VwYXJhdGUgc3RydWN0cyBzbyB0aGF0IHRoZXkgY2FuIGNvLWV4aXN0IGluIGEgbmljZSB3YXkuIFNlZSB0aGUKICBtYWlsaW5nIGxpc3RzIGZvciBkaXNjdXNzaW9ucyBhcm91bmQgaG93IHRoaXMgaXMgZ29ubmEgYmUgaW1wbGVtZW50ZWQuIERvY3MKICBhbmQgbW9yZSB3aWxsIGZvbGxvdy4KCiAgU3R1ZGllZCB0aGUgSFRUUCBSRkMgdG8gZmluZCBvdXQgYmV0dGVyIGhvdyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHNob3VsZAogIHdvcmsuIFNlZW1zIGNvb2wgZW5vdWdoLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDAxKQotIEJvYiBTY2hhZGVyIGJyb3VnaHQgbWUgdHdvIGZpbGVzIHRoYXQgaGVscCBzZXQgdXAgYSBNUyBWQysrIGxpYmN1cmwgcHJvamVjdAogIGVhc2llci4gSGUgYWxzbyBwcm92aWRlZCBtZSB3aXRoIGFuIHVwLXRvLWRhdGUgbGliY3VybC5kZWYgZmlsZS4KCi0gSSBtb3ZlZCBhIGJ1bmNoIG9mIHByb3RvdHlwZXMgZnJvbSB0aGUgcHVibGljIDxjdXJsL2N1cmwuaD4gZmlsZSB0byB0aGUKICBsaWJyYXJ5IHByaXZhdGUgdXJsZGF0YS5oLiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHVwY29taW5nIGNoYW5nZXMuIFRoZQogIGxvdyBsZXZlbCBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIGJlaW5nIHBsYW5uZWQgdG8gYmVjb21lIHJlYWxpdHkuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDEpCi0gQ1VSTE9QVF9QT1NUIGlzIG5vdCByZXF1aXJlZCBhbnltb3JlLiBKdXN0IHNldHRpbmcgdGhlIFBPU1Qgc3RyaW5nIHdpdGgKICBDVVJMT1BUX1BPU1RGSUVMRFMgd2lsbCBzd2l0Y2ggb24gdGhlIEhUVFAgUE9TVC4gTW9zdCBvdGhlciB0aGluZ3MgaW4KICBsaWJjdXJsIGFscmVhZHkgd29ya3MgdGhpcyB3YXksIGkuZSB0aGV5IHJlcXVpcmUgb25seSB0aGUgcGFyYW1ldGVyIHRvCiAgc3dpdGNoIG9uIGEgZmVhdHVyZSBzbyBJIHRoaW5rIHRoaXMgd29ya3Mgd2VsbCB3aXRoIHRoZSByZXN0LiBTZXR0aW5nIGEgTlVMTAogIHN0cmluZyBzd2l0Y2hlcyBvZmYgdGhlIFBPU1QgYWdhaW4uCgotIEV4Y2VsbGVudCBzdWdnZXN0aW9ucyBmcm9tIFJpY2ggR3JheSwgUmljayBKb25lcywgSm9oYW4gTmlsc3NvbiBhbmQgQmpvcm4KICBSZWVzZSBoZWxwZWQgbWUgZGVmaW5lIGEgd2F5IGhvdyB0byBpbmNvcnBvcmF0ZSBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGludG8KICBsaWJjdXJsIGluIGEgdmVyeSBzbW9vdGggd2F5LiBJZiBkb25lIHJpZ2h0LCBubyBjaGFuZ2UgbWF5IGhhdmUgdG8gYmUgbWFkZQogIHRvIG9sZGVyIHByb2dyYW1zIGFuZCB0aGV5IHdpbGwganVzdCBzdGFydCB1c2luZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHdoZW4KICBhcHBsaWNhYmxlIQoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDAxKQotIENoYW5nZWQgdGhlIHdvcmQgJ3RpbWVvdXRlZCcgdG8gJ3RpbWVkIG91dCcgaW4gdHdvIGRpZmZlcmVudCBlcnJvciBtZXNzYWdlcy4KICBTdWdnZXN0ZWQgYnkgTGFycnkgRmFobm9lLgoKVmVyc2lvbiA3LjYuMQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDEpCi0gRnJhbmsgUmVpZCBhbmQgQ2FpbiBIb3B3b29kIHByb3ZpZGVkIGluZm9ybWF0aW9uIGFuZCByZXNlYXJjaCBhcm91bmQgYSBIVFRQUwogIFBVVC91cGxvYWQgcHJvYmxlbSB3ZSBzZWVtIHRvIGhhdmUuIE5vIHNvbHV0aW9uIGZvdW5kIHlldC4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAxKQotIEFuIGludGVyZXN0aW5nIGRpc2N1c3Npb24gaXMgaG93IHRvIHNwZWNpZnkgYW4gZW1wdHkgcGFzc3dvcmQgd2l0aG91dCBoYXZpbmcKICBjdXJsIGFzayBmb3IgaXQgaW50ZXJhY3RpdmVseT8gVGhlIGN1cnJlbnQgaW1wbG1lbnRhdGlvbiB0YWtlcyBhbiBlbXB0eQogIHBhc3N3b3JkIGFzIGEgcmVxdWVzdCBmb3IgYSBwYXNzd29yZCBwcm9tcHQuIEhvd2V2ZXIsIEkgc3RpbGwgd2FudCB0bwogIHN1cHBvcnQgYSBibGFuayB1c2VyIGZpZWxkLiBUaHVzLCB0b2RheSBpZiB5b3UgZW50ZXIgIi11IDoiICh3aXRob3V0IHVzZXIKICBhbmQgcGFzc3dvcmQpIGN1cmwgd2lsbCBwcm9tcHQgZm9yIHRoZSBwYXNzd29yZC4gVHJpY2t5LiBIb3cgd291bGQgeW91CiAgc3BlY2lmeSB5b3Ugd2FudCB0aGUgcHJvbXB0IG90aGVyd2lzZT8KCi0gTWFkZSB0aGUgbmV0cmMgcGFyc2UgcmVzdWx0IHBvc3NpYmxlIHRvIHVzZSBmb3Igb3RoZXIgcHJvdG9jb2xzIHRoYW4gRlRQIGFuZAogIEhUVFAgKHN1Y2ggYXMgdGhlIHVwY29taW5nIFRFTE5FVCBmaXhlcykuCgotIFRoZSBwcmV2aW91c2x5IG1lbnRpb25lZCAiTVNWQysrIHByb2JsZW1zIiB0dXJuZWQgb3V0IHRvIGJlIGEgbm9uLWlzc3VlLgoKLSBBZGRlZCBhIEhUVFAgZmlsZSB1cGxvYWQgY29kZSBleGFtcGxlIGluIHRoZSBkb2NzL2V4YW1wbGVzLyBzZWN0aW9uIG9uCiAgcmVxdWVzdC4KCi0gQWRqdXN0ZWQgdGhlIEZUUCByZXNwb25zZSBmaXggc2xpZ2h0bHkuCgpWZXJzaW9uIDcuNi4xLXByZTMKCkRhbmllbCAoNyBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBmb3VuZCBhIGZsYXcgaW4gdGhlIHJlc3BvbnNlIHJlYWRpbmcgZnVuY3Rpb24gZm9yIEZUUCB0aGF0CiAgY291bGQgbWFrZSBsaWJjdXJsIG5vdCBnZXQgb3V0IG9mIHRoZSBsb29wIHByb3Blcmx5IHdoZW4gaXQgc2hvdWxkLCBpZgogIGxpYmN1cmwgZ290IC0xIHJldHVybmVkIHdoZW4gcmVhZGluZyB0aGUgc29ja2V0LgoKLSBJIGZvdW5kIGEgc2ltaWxhciBtaXN0YWtlIGluIGh0dHAuYyB3aGVuIHVzaW5nIGEgcHJveHkgYW5kIHJlYWRpbmcgdGhlCiAgcmVzdWx0cyBmcm9tIHRoZSBwcm94eSBjb25uZWN0aW9uLgoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IHBvaW50ZWQgb3V0IHRoYXQgdGhlIFZDIG1ha2VmaWxlIGluIHNyYy8gbmVlZGVkIHRoZSBsaWJwYXRoIHNldAogIGZvciB0aGUgZGVidWcgYnVpbGQgdG8gd29yay4KCi0gRGFuaWVsIEdlaHJpZ2VyIHN0ZXBwZWQgaW4gdG8gYXNzaXN0IHdpdGggdGhlIFZDKysgc3R1ZmYgUm9iZXJ0IFdlYXZlcgogIGJyb3VnaHQgdXAgeWVzdGVyZGF5LgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDEpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGJyb3VnaHQgYSBiaWcgcGF0Y2ggdGhhdCBicmluZ3MgSVB2Ni1hd2FyZW5lc3MgdG8KICBhIGJ1bmNoIG9mIGRpZmZlcmVudCBhcmVhcyB3aXRoaW4gbGliY3VybC4KCi0gUm9iZXJ0IFdlYXZlciB0b2xkIG1lIGFib3V0IHRoZSBwcm9ibGVtcyB0aGUgTVMgVkMrKyA2LjAgY29tcGlsZXIgaGFzIHdpdGgKICB0aGUgJ3N0YXRpYycga2V5d29yZCBvbiBhIG51bWJlciBvZiBsaWJjdXJsIGZ1bmN0aW9ucy4gSSBtaWdodCBuZWVkIHRvIGFkZCBhCiAgcGF0Y2ggdGhhdCByZWRlZmluZXMgc3RhdGljIHdoZW4gbGliY3VybCBpcyBjb21waWxlZCB3aXRoIHRoYXQgY29tcGlsZXIuCiAgSG93IGRvIEkga25vdyB3aGVuIFZDKysgY29tcGlsZXMsIGFueW9uZT8KCkRhbmllbCAoNCBGZWJydWFyeSAyMDAxKQotIGN1cmxfZ2V0aW5mbygpIHdhcyBleHRlbmRlZCB3aXRoIHR3byBuZXcgb3B0aW9uczoKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBhbmQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfVVBMT0FELiBUaGV5CiAgcmV0dXJuIHRoZSBmdWxsIGFzc3VtZWQgY29udGVudCBsZW5ndGggb2YgdGhlIHRyYW5zZmVyIGluIHRoZSBnaXZlbgogIGRpcmVjdGlvbi4gVGhlIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIHdpbGwgYmUgdGhlIENvbnRlbnQtTGVuZ3RoOgogIHNpemUgb2YgYSBIVFRQIGRvd25sb2FkLiBBZGRlZCBkZXNjcmlwdGlvbnMgdG8gdGhlIG1hbiBwYWdlIGFzIHdlbGwuIFRoaXMKICB3YXMgZG9uZSBhZnRlciBkaXNjdXNzaW9ucyB3aXRoIEJvYiBTY2hhZGVyLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDEpCi0gSW5nbyBSYWxmIEJsdW0gcHJvdmlkZWQgYW5vdGhlciBmaXggdGhhdCBtYWtlcyBjdXJsIGJ1aWxkIHVuZGVyIHRoZSBtb3JlCiAgcmVjZW50IGN5Z3dpbiBpbnN0YWxsYXRpb25zLiBJdCBzZWVtcyB0aGV5J3ZlIGNoYW5nZWQgdGhlIHByZXNldCBkZWZpbmVzIHRvCiAgbm90IGluY2x1ZGUgV0lOMzIgYW55bW9yZS4KClZlcnNpb24gNy42LjEtcHJlMgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDEpCi0gQ3VybF9yZWFkKCkgYW5kIGN1cmxfcmVhZCgpIG5vdyByZXR1cm4gYSBzc2l6ZV90IGZvciB0aGUgc2l6ZSwgYXMgaXQgaGFkIHRvCiAgYmUgYWJsZSB0byByZXR1cm4gLTEuIFRoZSB0ZWxuZXQgc3VwcG9ydCBjcmFzaGVkIGR1ZSB0byB0aGlzIGFuZCB0aGVyZSB3YXMgYQogIHBvc3NpYmlsaXR5IHRvIHdlaXJkIGJlaGF2aW9yIGFsbCBvdmVyLiBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGhlbHBlZCBtZQogIGZpbmQgdGhpcy4KCi0gQWRkZWQgYSBjb25maWd1cmUuaW4gY2hlY2sgZm9yIGEgd29ya2luZyBnZXRhZGRyaW5mbygpIGlmIElQdjYgaXMgcmVxdWVzdGVkLgogIEkgYWxzbyBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZlYXR1cmUgLS1lbmFibGUtZGVidWcgd2hpY2ggc2V0cyBhIGNvdXBsZQogIG9mIGNvbXBpbGVyIG9wdGlvbnMgd2hlbiB1c2VkLiBJdCBhc3N1bWVzIGdjYy4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDAxKQotIEkgZmluYWxseSB0b29rIGEgc3RhYiBhdCB0aGUgbG9uZy10ZXJtIEZJWE1FIGl0ZW0gSSd2ZSBoYWQgb24gbXlzZWxmLCBhbmQKICBub3cgbGliY3VybCB3aWxsIHByb3Blcmx5IHdvcmsgd2hlbiBkb2luZyBhIEhUVFAgcmFuZ2UtcmVxdWVzdCB0aGF0IGZvbGxvd3MKICBhIExvY2F0aW9uOi4gUHJldmlvdXNseSB0aGF0IHdvdWxkIG1ha2UgbGliY3VybCBmYWlsIHNheWluZyB0aGF0IHRoZSBzZXJ2ZXIKICBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCByYW5nZSByZXF1ZXN0cy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yIHRoZSBIVFRQIFBVVCByZXN1bWUgdGhpbmcgKHRlc3QgY2FzZSAzMykuCgpWZXJzaW9uIDcuNi4xLXByZTEKCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIFlldCBhbm90aGVyIENvbnRlbnQtUmFuZ2UgY2hhbmdlLiBPayBub3c/IEJvYiBTY2hhZGVyIGNoZWNrcyBmcm9tIGhpcyBlbmQgCiAgYW5kIGl0IHdvcmtzIGZvciBoaW0uCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwMSkKLSBTbyB0aGUgSFRUUCBQVVQgcmVzdW1lIGZpeCB3YXNuJ3QgZ29vZC4gVGhlcmUgc2hvdWxkIGFwcGVhcmFudGx5IGJlIGEKICBDb250ZW50LVJhbmdlIGhlYWRlciB3aGVuIHJlc3VtaW5nIGEgUFVULgoKLSBJIG5vdGljZWQgSSBicm9rZSB0aGUgZG93bmxvYWQtY2hlY2sgdGhhdCB2ZXJpZmllcyB0aGF0IGEgcmVzdW1lZCBIVFRQCiAgZG93bmxvYWQgaXMgYWN0dWFsbHkgcmVzdW1lZC4gSXQgZ290IGJyb2tlIGJlY2F1c2UgbXkgbmV3ICdodHRwcmVxJyBmaWVsZAogIGluIHRoZSBtYWluIGN1cmwgc3RydWN0LiBJIHNob3VsZCBnZXQgc2xhcHBlZC4gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IKICB0aGlzIG5vdywgc28gSSB3b24ndCBiZSBhYmxlIHRvIHJ1aW4gdGhpcyBhZ2FpbiB3aXRob3V0IG5vdGljaW5nLgoKLSBBZGRlZCBhIHRlc3QgY2FzZSBmb3IgY29udGVudC1sZW5ndGggdmVyaWZ5aW5nIHdoZW4gZG93bmxvYWRpbmcgSFRUUC4KCi0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdGl0bGUgc2F5IGlmIHRoZSB0cmFuc2ZlciBpcyBiZWluZyB0cmFuc2ZlcmVkLiBJdAogIG1ha2VzIHRoZSBvdXRwdXQgc2xpZ2h0bHkgYmV0dGVyIGZvciByZXN1bWVzLgoKLSBXaGVuIGRlYWxpbmcgd2l0aCBMb2NhdGlvbjogYW5kIEhUVFAgcmV0dXJuIGNvZGVzLCBsaWJjdXJsIHdpbGwgbm90IGF0dGVtcHQKICB0byBmb2xsb3cgdGhlIHNwaXJpdCBvZiBSRkMyNjE2IGJldHRlci4gSXQgbWVhbnMgdGhhdCB3aGVuIFBPU1RpbmcgdG8gYQogIFVSTCB0aGF0IGlzIGJlaW5nIGZvbGxvd2luZyB0byBhIHNlY29uZCBwbGFjZSwgdGhlIHN0YW5kYXJkIHdpbGwganVkZ2Ugb24KICB3aGF0IHRvIGRvLiBBbGwgSFRUUCBjb2RlcyBleGNlcHQgMzAzIGFuZCAzMDUgd2lsbCBjYXVzZSBjdXJsIHRvIG1ha2UgYQogIHNlY29uZCBQT1NUIG9wZXJhdGlvbi4gMzAzIHdpbGwgbWFrZSBhIEdFVCBhbmQgMzA1IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgoKICBJIGFsc28gd3JvdGUgdHdvIHRlc3QgY2FzZXMgZm9yIHRoaXMgUE9TVC9HRVQvTG9jYXRpb24gc3R1ZmYuCgpWZXJzaW9uIDcuNgoKRGFuaWVsICgyNiBKYW51YXJ5IDIwMDEpCi0gTG90cyBvZiBtYWlscyBiYWNrIGFuZCBmb3J0aCB3aXRoIEJvYiBTY2hhZGVyIGZpbmFsbHkgbWFkZSBtZSBhZGQgYSBzbWFsbAogIHBpZWNlIG9mIGNvZGUgaW4gdGhlIEhUVFAgZW5naW5lIHNvIHRoYXQgSFRUUCB1cGxvYWQgcmVzdW1lIHdvcmtzLiBZb3UgY2FuCiAgbm93IGRvIGFuIG9wZXJhdGlvbiBsaWtlICdjdXJsIC1UIGZpbGUgLUMgPG9mZnNldD4gPFVSTD4nIGFuZCBjdXJsIHdpbGwgUFVUCiAgdGhlIGVuZGluZyBwYXJ0IG9mIHRoZSBmaWxlIHN0YXJ0aW5nIGF0IGdpdmVuIG9mZmV0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgoKVmVyc2lvbiA3LjYtcHJlNAoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDEpCi0gSSB0b29rIGhvbGQgb2YgUmljayBKb25lcycgcXVlc3Rpb24gd2h5IHdlIGRvbid0IHVzZSByZWN2KCkgYW5kIHNlbmQoKSBmb3IKICByZWFkaW5nL3dyaXRpbmcgdG8gdGhlIHNvY2tldHMgYW5kIEkndmUgbm93IG1vZGlmaWVkIHRoZSBzcmVhZCgpIGFuZAogIHN3cml0ZSgpIG1hY3JvcyB0byB1c2UgdGhlbSBpbnN0ZWFkLiBJZiBub3RoaW5nIGVsc2UsIHRoZXkgY291bGQgYmUgdGVzdGVkCiAgaW4gdGhlIG5leHQgYmV0YS1yb3VuZCBjb21pbmcgcmlnaHQgdXAuCgotIEplZmYgTW9ycm93IGZvdW5kIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2FnZSBvZiBTU0xfcmVhZCgpIGFuZCBzdXBwbGllZAogIGhpcyByZXNlYXJjaCByZXN1bHRzIGluIGhvdyB0byBmaXggdGhpcy4gSXQgdHVybnMgb3V0IHdlIGhhdmUgdG8gaW52b2tlIHRoZQogIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMgaW4gc29tZSBjYXNlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGhlIFNTTF93cml0ZSgpLgoKICBJIG1hZGUgc29tZSByYXRoZXIgZHJhc3RpYyBjaGFuZ2VzIGFsbCBvdmVyIGxpYmN1cmwgdG8gbWFrZSBhbGwgd3JpdGVzIGFuZAogIHJlYWRzIGdldCBkb25lIG9uIG9uZSBzaW5nbGUgcGxhY2Ugc28gdGhhdCB0aGlzIHJlcGVhdGVkLWF0dGVtcHRzIHRoaW5nCiAgd291bGQgb25seSBoYXZlIHRvIGJlIGltcGxlbWVudGVkIGF0IG9uZSBwb2ludC4KCi0gUmljayBKb25lcyBzcG90dGVkIHRoYXQgdGhlICd0b3RhbCB0aW1lJyBjb3VudGVyIHJlYWxseSBkaWRuJ3QgbWVhc3VyZSB0aGUKICB0b3RhbCB0aW1lIHZlcnkgYWNjdXJhdGUgb24gc3Vic2Vjb25kIGxldmVscy4KCi0gSm9oYW4gTmlsc3NvbiBwb2ludGVkIG91dCB0aGUgbmVlZCB0byBtb3JlIGNsZWFybHkgc3BlY2lmeSB0aGF0IHRoZSB0aW1lb3V0CiAgdmFsdWUgeW91IHNldCBmb3IgYSBkb3dubG9hZCBpcyBmb3IgdGhlICplbnRpcmUqIGRvd25sb2FkLiBUaGVyZSdzIGN1cnJlbnRseQogIG5vIG9wdGlvbiBhdmFpbGFibGUgdGhhdCBzZXRzIGEgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2Ugb25seS4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHN1Ym1pdHRlZCBhIHNlcmllcyBvZiBwYXRjaGVzIHJlcXVpcmVkIHRvIGdldCBjdXJsIHRvIGNvbXBpbGUKICBwcm9wZXJseSB3aXRoIGN5Z3dpbi4KCi0gUm9iZXJ0IFdlYXZlciBwb3N0ZWQgYSBmaXggZm9yIHRoZSB3aW4zMiBzZWN0aW9uIG9mIHRoZSBjdXJsX2dldGVudigpIGNvZGUKICB0aGF0IGNvcnJlY3RlZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KCi0gQWRkZWQgY29tbWVudHMgaW4gYSBmZXcgZmlsZXMgaW4gYSBzdWRkZW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBzb3VyY2VzIG1vcmUKICBlYXN5IHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQhCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMSkKLSBBZGRlZCBzaW1wbGUgSVB2NiBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG1hZGUgdGhlIHZlcnNpb24KICBzdHJpbmcgYWRkICdpcHY2JyB0byB0aGUgZW5hYmxlIHNlY3Rpb24gaW4gdGhhdCBjYXNlLiBFTkFCTEVfSVBWNiB3aWxsIGJlCiAgc2V0IGlmIGN1cmwgaXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQgZW5hYmxlZC4KCi0gQWRkZWQgYSBwYXJzZXIgZm9yIElQdjYtc3R5bGUgc3BlY2lmaWVkIElQLWFkZHJlc3NlcyBpbiBhIFVSTC4gVGh1cywgd2hlbgogIElQdjYgZ2V0cyBlbmFibGVkIHNvb24sIHdlIGNhbiB1c2UgVVJMcyBsaWtlICdbMDo6MV06ODAnLi4uCgotIE1hZGUgdGhlIFVSTCBnbG9iYmluZyBpbiB0aGUgY2xpZW50IHBvc3NpYmxlIHRvIGZhaWwgc2lsZW50bHkgaWYgdGhlcmUncyBhbgogIGVycm9yIGluIHRoZSBnbG9iYmluZy4gSXQgbWFrZXMgaXQgYWxtb3N0IGludHVpdGl2ZSwgc28gd2hlbiB5b3UgZG9uJ3QKICBmb2xsb3cgdGhlIHN5bnRheCBydWxlcywgZ2xvYmJpbmcgaXMgc2ltcGx5IHN3aXRjaGVkIG9mZiBhbmQgdGhlIHJhdyBzdHJpbmcKICBpcyB1c2VkIGluc3RlYWQuCgogIEkgc3RpbGwgdGhpbmsgd2UnbGwgZ2V0IHByb2JsZW1zIHdpdGggSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMgd2hlbiB3ZSAqd2FudCoKICBnbG9iYmluZyBvbiBwYXJ0cyBvZiB0aGUgVVJMIGFzIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIFVSTCB3aWxsIGZvciBzdXJlCiAgc2VyaW91c2x5IGNvbmZ1c2UgdGhlIGdsb2JiZXIuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHByb2dyZXNzIG1ldGVyIHBhdGNoIHRoYXQgbWFrZXMgaXQgbG9vayBiZXR0ZXIgZXZlbgogIGR1cmluZyBzbG93IHN0YXJ0cy4gUHJldmlvdXNseSBpdCBtYWRlIHNvbWUgc2lsbHkgYXNzdW1wdGlvbnMuLi4KCi0gQWRkZWQgdHdvIEZUUCB0ZXN0cyBmb3IgLVEgYW5kIC1RIC0gc3R1ZmYgc2luY2UgaXQgd2FzIGJlaW5nIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QuIEhhZCB0byBjb3JyZWN0IHRoZSBmdHBzZXJ2ZXIucGwgdG9vIGFzIGl0IGJ1Z2dlZCBzbGlnaHRseS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIExvY2F0aW9uOiBwYXJzZXJzIGRlYWwgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRodXMgSSByZW1vdmVkIHRoZSBsYXN0CiAgY29kZSB0aGF0IHJlc3RyaWN0cyB0aGUgbGVuZ3RoIG9mIFVSTHMgdGhhdCBjdXJsIHN1cHBvcnRzLgoKLSBBZGRlZCBhIC0tZ2xvYm9mZiB0ZXN0IGNhc2UgKCMyOCkgYW5kIGl0IHF1aWNrbHkgaWRlbnRpZmllZCBhIG1lbW9yeSBwcm9ibGVtCiAgaW4gc3JjL21haW4uYyB0aGF0IEkgdG9vayBjYXJlIG9mLgoKVmVyc2lvbiA3LjYtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgdHdvIGZvcm1lciBmaWxlcyBsaWIvZG93bmxvYWQuYyBhbmQgbGliL2hpZ2hsZXZlbC5jIGJlY29tZSB0aGUgbmV3CiAgbGliL3RyYW5zZmVyLmMgd2hpY2ggbWFrZXMgbW9yZSBzZW5zZS4gSSBhbHNvIGRpZCB0aGUgcmVuYW1lIGZyb20gVHJhbnNmZXIoKQogIHRvIEN1cmxfVHJhbnNmZXIoKSBpbiB0aGUgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgdXNlIHRoZSB0cmFuc2ZlciBmdW5jdGlvbgogIGluIHRoZSBzcGlyaXQgb2YgdXNpbmcgQ3VybF8gcHJlZml4IGZvciBsaWJyYXJ5LXNjb3BlZCBnbG9iYWwgc3ltYm9scy4KCkRhbmllbCAoMTEgSmFudWFyeSAyMDAxKQotIEFkZGVkIC1nLy0tZ2xvYm9mZiB0aGF0IHN3aXRjaGVzIE9GRiB0aGUgVVJMIGdsb2JiaW5nIGFuZCB0aHVzIGVuYWJsZXMge31bXQogIGxldHRlcnMgdG8gYmUgcGFydCBvZiB0aGUgVVJMLiBEbyBub3RlIHRoYXQgUkZDMjM5NiBzZWN0aW9uIDIuNC4zIGV4cGxpY2l0bHkKICBtZW50aW9uIHRoZXNlIGxldHRlcnMgdG8gYmUgZXNjYXBlZC4gVGhpcyB3YXMgcG9zdGVkIGFzIGEgZmVhdHVyZSByZXF1ZXN0IGJ5CiAgSm9yZ2UgR3V0aWVycmV6IGFuZCBhcyBhIGJ1ZyBieSBUZXJyeS4KCi0gU2hvcnQgb3B0aW9ucyB0byBjdXJsIHRoYXQgcmVxdWlyZXMgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRob3V0CiAgaGF2aW5nIHRoZSBvcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgc3BhY2Ugc2VwYXJhdGVkLiAtb2ZpbGUgd29ya3MgYXMgZ29vZCBhcwogIC1vIGZpbGUuIC1tMjAgaXMgZXF1YWwgdG8gLW0gMjAuIERvIG5vdGUgdGhhdCB0aGlzIGdvZXMgZm9yIHNpbmdsZS1sZXR0ZXIKICBvcHRpb25zIG9ubHksIHZlcmJvc2UgLS1sb25nLXN0eWxlIG9wdGlvbnMgc3RpbGwgbXVzdCBiZSBzZXBhcmF0ZWQgd2l0aAogIHNwYWNlIGZyb20gdGhlaXIgcGFyYW1ldGVycy4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDEpCi0gRnJhbmNpcyBEYWdlbmFpcyByZXBvcnRlZCB0aGF0IHRoZSBTQ08gY29tcGlsZXIgc3RpbGwgZmFpbHMgd2hlbiBjb21waWxpbmcKICBjdXJsIGR1ZSB0byB0aGF0IGdldHBhc3NfcigpIHByb3RvdHlwZS4gSSd2ZSBub3cgcHV0IGl0IGFyb3VuZCAjaWZuZGVmCiAgSEFWRV9HRVRQQVNTX1IgaW4gYW4gYXR0ZW1wdCB0byBwbGVhc2UgdGhlIFNDTyBzeXN0ZW1zLgoKLSBNYWRlIHNvbWUgbWlub3IgY29ycmVjdGlvbnMgdG8gZ2V0IHRoZSBjbGllbnQgdG8gY2xlYW51cCBwcm9wZXJseSBhbmQgSSBtYWRlCiAgdGhlIHNlcGFyYXRvciB3b3JrIGFnYWluIHdoZW4gZ2V0dGluZyBtdWx0aXBsZSBnbG9iYmVkIFVSTHMgdG8gc3Rkb3V0LgoKLSBXb3JrZWQgd2l0aCBMb2ljIERhY2hhcnkgdG8gZ2V0IHRoZSBtYWtlIGRpc3QgYW5kIG1ha2UgZGlzdGNoZWNrIHdvcmsKICBjb3JyZWN0bHkuIFRoZSAnbWFrZXRneicgc2NyaXB0IGlzIG5vdyB1c2luZyB0aGUgYXV0b21ha2UgZ2VuZXJhdGVkICdtYWtlCiAgZGlzdCcgd2hlbiBjcmVhdGluZyByZWxlYXNlIGFyY2hpdmVzLiBMb2ljIHN1Y2Nlc3NmdWxseSBtYWRlICdtYWtlIHJwbXMnCiAgYXV0b21hdGljYWxseSBidWlsZCBSUE1zIQoKTG9pYyBEYWNoYXJ5ICg2IEphbnVhcnkgMjAwMSkKLSBBdXRvbWF0ZWQgZ2VuZXJhdGlvbiBvZiBycG0gcGFja2FnZXMsIG5vIG5lZWQgdG8gYmUgcm9vdC4KCi0gbWFrZSBkaXN0Y2hlY2sgZ2VuZXJhdGVzIGEgcHJvcGVyIGRpc3RyaWJ1dGlvbiAoRVhUUkFfRElTVAogIGluIGFsbCBNYWtlZmlsZS5hbSBtb2RpZmllZCB0byBtYXRjaCBGSUxFUykuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDAxKQotIEh1Z2UgY2xpZW50LXNpZGUgaGFjazogbm93IG11bHRpcGxlIFVSTHMgYXJlIHN1cHBvcnRlZC4gQW55IG51bWJlciBvZiBVUkxzCiAgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhleSdsbCBhbGwgYmUgZG93bmxvYWRlZC4gVGhlcmUKICBtdXN0IGJlIGEgY29ycmVzcG9uZGluZyAtbyBvciAtTyBmb3IgZWFjaCBVUkwgb3IgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvCiAgc3Rkb3V0LiBUaGlzIG5lZWRzIG1vcmUgdGVzdGluZywgdGltZSB0byByZWxlYXNlIGEgNy42LXByZSBwYWNrYWdlLgoKLSBUaGUga3JiNCBzdXBwb3J0IHdhcyBicm9rZW4gaW4gdGhlIHJlbGVhc2UuIEZpeGVkIG5vdy4KCi0gSHVnZSBpbnRlcm5hbCBzeW1ib2wgcmVuYW1lIG9wZXJhdGlvbi4gQWxsIG5vbi1zdGF0aWMgYnV0IHN0aWxsIGxpYi1pbnRlcm5hbAogIHN5bWJvbHMgc2hvdWxkIG5vdyBiZSBwcmVmaXhlZCB3aXRoICdDdXJsXycgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggb3RoZXIKICBsaWJzLiBBbGwgcHVibGljIHN5bWJvbHMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggJ2N1cmxfJyBhbmQgdGhlIHJlc3Qgc2hvdWxkCiAgYmUgc3RhdGljIGFuZCB0aHVzIGludmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSSB1cGRhdGVkIHRoZSBJTlRFUk5BTFMKICBkb2N1bWVudCB0byBzYXkgdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjUuMgoKRGFuaWVsICg0IEphbnVhcnkgMjAwMSkKLSBBcyBLZXZpbiBQIFJvdGggc3VnZ2VzdGVkLCBJJ3ZlIGFkZGVkIHRleHQgdG8gdGhlIG1hbiBwYWdlIGZvciBldmVyeSBjb21tYW5kCiAgbGluZSBvcHRpb24gYW5kIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBzcGVjaWZ5IHRoYXQgb3B0aW9uIG1vcmUgdGhhbgogIG9uY2UuIFRoYXQgaGFzbid0IGJlZW4gZXhhY3RseSBjcnlzdGFsIGNsZWFyIGJlZm9yZS4KCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBwb3NzaWJsZSB0byBydW4gZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4gRm9yCiAgb2RkIHJlYXNvbnMgSSBjYW4ndCBidWlsZCBjdXJsIHByb3Blcmx5IG91dHNpZGUgdGhvdWdoLiBJdCBoYXMgdG8gZG8gd2l0aAogIGN1cmwncyBkZXBlbmRlbmNpZXMgb24gbGliY3VybC4uLgoKLSBDdXQgb2ZmIGFsbCBvbGRlciAoZGF0ZWQgMTk5OSBhbmQgZWFybGllcikgQ0hBTkdFUyBlbnRyaWVzIGZyb20gdGhpcyBmaWxlLgogIFRoZSBvbGRlciBwaWVjZSBpcyBuYW1lZCBDSEFOR0VTLjAgYW5kIGlzIGFkZGVkIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSBpbgogIGNhc2UgYW55b25lIHdvdWxkIG5lZWQgaXQuCgotIEkgYWRkZWQgYW5vdGhlciBmaWxlICdDVlMtSU5GTycgdG8gdGhlIENWUy4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKICBmaWxlcyBpbiB0aGUgQ1ZTIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHJlbGVhc2UgYXJjaGl2ZXMgYW5kIGhvdyB0byBidWlsZAogIGN1cmwgd2hlbiB5b3UgZ2V0IHRoZSBzb3VyY2VzIG9mZiBDVlMuCgotIFVwZGF0ZWQgQ09OVFJJQlVURSBhbmQgRkFRIGR1ZSB0byB0aGUgbmV3IGxpY2Vuc2UuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDAxKQotIFJlbmFtZWQgUkVBRE1FLmxpYmN1cmwgdG8gTElCQ1VSTAoKLSBDaGFuZ2VkIGhlYWRlcnMgaW4gYWxsIHNvdXJjZXMgZmlsZXMgdG8gdGhlIG5ldyBkdWFsIGxpY2Vuc2UgY29uY2VwdCBvZgogIGN1cmw6IHVzZSB0aGUgTUlUL1ggZGVyaXZhdGUgbGljZW5zZSAqb3IqIE1QTC4gVGhlIExFR0FMIGZpbGUgd2FzIHVwZGF0ZWQKICBhY2NvcmRpbmdseSBhbmQgdGhlIE1QTCAxLjEgYW5kIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2VzIGFyZSBub3cgcGFydCBvZiB0aGUKICByZWxlYXNlIGFyY2hpdmUuCg==