ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKRGFuaWVsICgxNiBNYXJjaCAyMDA2KQotIFRvciBBcm50c2VuIHByb3ZpZGVkIGEgUlBNIHNwZWMgZmlsZSBmb3IgQUlYIFRvb2xib3gsIHRoYXQgbm93IGlzIGluY2x1ZGVkCiAgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMTQgTWFyY2ggMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZDoKCiAgYSBiYWQgU1NMIGVycm9yIG1lc3NhZ2Ugd2hlbiBPcGVuU1NMIGNlcnRpZmljYXRlcyBhcmUgdmVyaWZpZWQgZmluZS4KCiAgYSBtaXNzaW5nIHJldHVybiBjb2RlIGFzc2lnbm1lbnQgaW4gdGhlIEZUUCBjb2RlCgpEYW5pZWwgKDcgTWFyY2ggMjAwNikKLSBNYXJrdXMgS29ldHRlciBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjMzU1NzE1IHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBtdWx0aS1wYXJ0IGZvcm1wb3N0cy4gVGhlIGZpeCBmcm9tIEZlYnJ1YXJ5CiAgMjJuZCBjb3VsZCBtYWtlIHRoZSBDdXJsX2RvbmUoKSBmdW5jdGlvbiBnZXQgY2FsbGVkIHR3aWNlIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgaXQgd2FzIG5vdCBkZXNpZ25lZCBmb3IgdGhhdCBhbmQgdGh1cyB0cmllZCB0byBjYWxsIGZyZWUoKSBvbgogIGFuIGFscmVhZHkgZnJlZWQgbWVtb3J5IGFyZWEhCgotIFBldGVyIEhldWNoZXJ0IG1hZGUgc3VyZSB0aGUgQ1VSTEZUUFNTTF9DT05UUk9MIHNldHRpbmcgZm9yIENVUkxPUFRfRlRQX1NTTAogIGlzIHVzZWQgcHJvcGVybHkuCgpEYW5pZWwgKDYgTWFyY2ggMjAwNikKLSBMb3RzIG9mIHVzZXJzIG9uIFdpbmRvd3MgaGF2ZSByZXBvcnRlZCBnZXR0aW5nIHRoZSAiU1NMOiBjb3VsZG4ndCBzZXQKICBjYWxsYmFjayIgZXJyb3IgbWVzc2FnZSBzbyBJJ3ZlIG5vdyBtYWRlIHRoZSBzZXR0aW5nIG9mIHRoYXQgY2FsbGJhY2sgbm90IGJlCiAgYXMgY3JpdGljYWwgYXMgYmVmb3JlLiBUaGUgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBhZGRpdGlvbmFsIGxvZ2dnaW5nLwogIHRyYWNlIGFueXdheSBzbyBhIGZhaWx1cmUganVzdCBtZWFucyBzbGlnaHRseSBsZXNzIGRhdGEuIEl0IHNob3VsZCBzdGlsbCBiZQogIGFibGUgdG8gcHJvY2VlZCBhbmQgY29ubmVjdCBmaW5lIHRvIHRoZSBzZXJ2ZXIuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNikKLSBUaG9tYXMgS2xhdXNuZXIgcHJvdmlkZWQgYSBwYXRjaCB3cml0dGVuIGJ5IFRvZGQgVmllcmxpbmcgaW4gYnVnIHJlcG9ydAogICMxNDQyNDcxIHRoYXQgZml4ZXMgYSBidWlsZCBwcm9ibGVtIG9uIEludGVyaXguCgpEYW5pZWwgKDIgTWFyY2ggMjAwNikKLSBGVFAgdXBsb2FkIHdpdGhvdXQgYSBmaWxlIG5hbWUgcGFydCBpbiB0aGUgVVJMIG5vdyBjYXVzZXMKICBjdXJsX2Vhc3lfcGVyZm9ybSgpIHRvIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFULiBQcmV2aW91c2x5IGl0IGFsbG93ZWQgdGhlCiAgdXBsb2FkIGJ1dCBuYW1lZCB0aGUgZmlsZSAiKG5pbCkiICh3aXRob3V0IHRoZSBxdW90ZXMpLiBUZXN0IGNhc2UgNTI0CiAgdmVyaWZpZXMuCgotIEFkZGVkIGEgY2hlY2sgZm9yIGdldHByb3RvYnluYW1lIGluIGNvbmZpZ3VyZSBzbyB0aGF0IGl0J2xsIGJlIHVzZWQsIHRoYW5rcwogIHRvIEdpc2xlIFZhbmVtJ3MgY2hhbmdlIHRoZSBvdGhlciBkYXkuCgpEYW5pZWwgKDI4IEZlYnJ1YXJ5IDIwMDYpCi0gRGFuIEZhbmRyaWNoIHByZXZlbnRlZCBjdXJsIGZyb20gZ2V0dGluZyBzdHVjayBpbiBhbiBlbmRsZXNzIGxvb3AgaW4gY2FzZSB3ZQogIGFyZSBvdXQgb2YgZmlsZSBoYW5kbGVzIHZlcnkgZWFybHkgaW4gY3VybCdzIGNvZGUgd2hlcmUgaXQgbWFrZXMgc3VyZSB0aGF0CiAgMCwgMSBhbmQgMiBhcmVuJ3QgZ29ubmEgYmUgdXNlZCBieSB0aGUgbGliIGZvciB0cmFuc2ZlcnMuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDYpCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgdGhhdCB0aGVyZSB3ZXJlIHR3byBWTVMtc3BlY2lmaWMgZmlsZXMgbWlzc2luZyBpbgogIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpWZXJzaW9uIDcuMTUuMiAoMjcgRmVicnVhcnkgMjAwNikKCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNikKLSBMb3RzIG9mIHdvcmsgYW5kIGFuYWx5c2lzIGJ5ICJ4YnhfX18iIGluIGJ1ZyAjMTQzMTc1MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNDMxNzUwKSBoZWxwZWQgbWUgaWRlbnRpZnkgYW5kIGZpeCB0d28KICBkaWZmZXJlbnQgYnV0IHJlbGF0ZWQgYnVnczoKCiAgMSkgUmVtb3ZpbmcgYW4gZWFzeSBoYW5kbGUgZnJvbSBhIG11bHRpIGhhbmRsZSBiZWZvcmUgdGhlIHRyYW5zZmVyIGlzIGRvbmUKICAgICBjb3VsZCBsZWF2ZSBhIGNvbm5lY3Rpb24gaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUgZm9yIHRoYXQgaGFuZGxlIHRoYXQgaXMKICAgICBpbiBhIHN0YXRlIHRoYXQgaXNuJ3Qgc3VpdGFibGUgZm9yIHJlLXVzZS4gQSBzdWJzZXF1ZW50IHJlLXVzZSBjb3VsZCB0aGVuCiAgICAgcmVhZCBmcm9tIGEgTlVMTCBwb2ludGVyIGFuZCBzZWdmYXVsdC4KCiAgMikgV2hlbiBhbiBlYXN5IGhhbmRsZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtdWx0aSBoYW5kbGUsIHRoZXJlIGNvdWxkIGJlIGFuCiAgICAgb3V0c3RhbmRpbmcgYy1hcmVzIEROUyBuYW1lIHJlc29sdmUgcmVxdWVzdC4gV2hlbiB0aGUgcmVzcG9uc2UgYXJyaXZlZCwKICAgICBpdCBjYXVzZWQgaGF2b2Mgc2luY2UgdGhlIGNvbm5lY3Rpb24gc3RydWN0IGl0ICJiZWxvbmdlZCIgdG8gY291bGQndmUKICAgICBiZWVuIGZyZWVkIGFscmVhZHkuCgogIE5vdyBDdXJsX2RvbmUoKSBpcyBjYWxsZWQgd2hlbiBhbiBlYXN5IGhhbmRsZSBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUKICBwcmUtbWF0dXJlbHkgKHRoYXQgaXMsIGJlZm9yZSB0aGUgdHJhbnNmZXIgd2FzIGNvbXBsdGV0ZWQpLiBDdXJsX2RvbmUoKSBhbHNvCiAgbWFrZXMgc3VyZSB0byBjYW5jZWwgYWxsIChpZiBhbnkpIG91dHN0YW5kaW5nIGMtYXJlcyByZXF1ZXN0cy4KCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNikKLSBQZXRlciBTdSBhZGRlZCBzdXBwb3J0IGZvciBTT0NLUzQgcHJveGllcy4gRW5hYmxlIHRoaXMgYnkgc2V0dGluZyB0aGUgcHJveHkKICB0eXBlIHRvIHRoZSBhbHJlYWR5IHByb3ZpZGVkIHR5cGUgQ1VSTFBST1hZX1NPQ0tTNC4KCiAgSSBhZGRlZCBhIC0tc29ja3M0IG9wdGlvbiB0aGF0IHdvcmtzIGxpa2UgdGhlIGN1cnJlbnQgLS1zb2NrczUgb3B0aW9uIGJ1dAogIGluc3RlYWQgdXNlIHRoZSBzb2NrczQgcHJvdG9jb2wuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDYpCi0gU2htdWxpayBSZWdldiBmaXhlZCBhbiBpc3N1ZSB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gYW5kIGNvbXByZXNzZWQKICBjb250ZW50IHdoZW4gbGliY3VybCBkaWRuJ3QgaG9ub3IgdGhlIGludGVybmFsIGlnbm9yZWJvZHkgZmxhZy4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNikKLSBVbGYgSORybmhhbW1hciBmaXhlZCBhIGZvcm1hdCBzdHJpbmcgKHByaW50ZiBzdHlsZSkgcHJvYmxlbSBpbiB0aGUgTmVnb3RpYXRlCiAgY29kZS4gSXQgc2hvdWxkIGhvd2V2ZXIgbm90IGJlIHRoZSBjYXVzZSBvZiBhbnkgdHJvdWJsZXMuIEhlIGFsc28gZml4ZWQgYQogIGZldyBzaW1pbGFyIHByb2JsZW1zIGluIHRoZSBIVFRQIHRlc3Qgc2VydmVyIGNvZGUuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDYpCi0gU2htdWxpayBSZWdldiBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIEROUyBjYWNoZSB3aGVuIHVzaW5nIHNob3J0IGxpZmUgdGltZXMsCiAgYXMgcHJldmlvdXNseSBpdCBjb3VsZCBiZSBob2xkaW5nIG9uIHRvIG9sZCBjYWNoZWQgZW50cmllcyBsb25nZXIgdGhhbgogIHJlcXVlc3RlZC4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNikKLSBLYXJsIE1vZXJkZXIgYWRkZWQgdGhlIENVUkxPUFRfQ09OTkVDVF9PTkxZIGFuZCBDVVJMSU5GT19MQVNUU09DS0VUIG9wdGlvbnMKICB0aGF0IGFuIGFwcCBjYW4gdXNlIHRvIGxldCBsaWJjdXJsIG9ubHkgY29ubmVjdCB0byBhIHJlbW90ZSBob3N0IGFuZCB0aGVuCiAgZXh0cmFjdCB0aGUgc29ja2V0IGZyb20gbGliY3VybC4gbGliY3VybCB3aWxsIHRoZW4gbm90IGF0dGVtcHQgdG8gZG8gYW55CiAgdHJhbnNmZXIgYXQgYWxsIGFmdGVyIHRoZSBjb25uZWN0IGlzIGRvbmUuCgotIEtlbnQgQm9vcnR6IGltcHJvdmVkIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIEdudVRMUyB0byBwcm9wZXJseSBzZXQgTElCUwogIGluc3RlYWQgb2YgTERGTEFHUy4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDA2KQotIFBoaWxpcHBlIFZhdWNoZXIgcHJvdmlkZWQgYSBicmlsbGlhbnQgcGllY2Ugb2YgdGVzdCBjb2RlIHRoYXQgc2hvdyBhIHByb2JsZW0KICB3aXRoIHJlLXVzZWQgRlRQIGNvbm5lY3Rpb25zLiBJZiB0aGUgc2Vjb25kIHJlcXVlc3Qgb24gdGhlIHNhbWUgY29ubmVjdGlvbgogIHdhcyBzZXQgbm90IHRvIGZldGNoIGEgImJvZHkiLCBsaWJjdXJsIGNvdWxkIGdldCBjb25mdXNlZCBhbmQgY29uc2lkZXIgaXQgYW4KICBhdHRlbXB0IHRvIHVzZSBhIGRlYWQgY29ubmVjdGlvbiBhbmQgd291bGQgZ28gYWN0aW5nIG1pZ2h0eSBzdHJhbmdlLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDYpCi0gTWFrZSAtLWxpbWl0LXJhdGUgW251bV0gbWVhbiBieXRlcy4gSXQgdXNlZCB0byBiZSB0aGF0IGJ1dCBpdCBicm9rZSBpbiBteQogIGNoYW5nZSBkb25lIGluIE5vdmVtYmVyIDIwMDUuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNikKLSBBZGRlZCBDVVJMT1BUX0xPQ0FMUE9SVCBhbmQgQ1VSTE9QVF9MT0NBTFBPUlRSQU5HRSB0byBsaWJjdXJsLiBTZXQgd2l0aCB0aGUKICBjdXJsIHRvb2wgd2l0aCAtLWxvY2FsLXBvcnQuIFBsYWluIGFuZCBzaW1wbHkgc2V0IHRoZSByYW5nZSBvZiBwb3J0cyB0byBiaW5kCiAgdGhlIGxvY2FsIGVuZCBvZiBjb25uZWN0aW9ucyB0by4gSW1wbGVtZW50ZWQgb24gdG8gcG9wdWxhciBkZW1hbmQuCgotIEJhc2VkIG9uIGFuIGVycm9yIHJlcG9ydCBieSBQaGlsaXBwZSBWYXVjaGVyLCB3ZSBubyBsb25nZXIgY291bnQgYSByZXRyaWVkCiAgY29ubmVjdGlvbiBzZXR1cCBhcyBhIGZvbGxvdy1yZWRpcmVjdC4gSXQgdHVybnMgb3V0IDEpIHRoaXMgZmFpbHMgd2hlbiBhIEZUUAogIGNvbm5lY3Rpb24gaXMgcmUtc2V0dXAgYW5kIDIpIGl0IGRvZXMgbWFrZSB0aGUgbWF4LXJlZGlycyBjb3VudGVyIGJlaGF2ZQogIHdyb25nLgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDYpCi0gTWljaGFsIE1hcmVrIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIEZUUCB0aGF0IG1ha2VzIGxpYmN1cmwgY29udGludWUgdG8gdHJ5CiAgUEFTViBldmVuIGFmdGVyIEVQU1YgcmV0dXJuZWQgYSBwb3NpdGl2ZSByZXNwb25zZSBjb2RlLCBpZiBsaWJjdXJsIGZhaWxlZCB0bwogIGNvbm5lY3QgdG8gdGhlIHBvcnQgbnVtYmVyIHRoZSBFUFNWIHJlc3BvbnNlIHNhaWQuIE9idmlvdXNseSBzb21lIHBlb3BsZSBhcmUKICBnb2luZyB0aHJvdWdoIHByb3RvY29sLXNlbnNpdGl2ZSBmaXJld2FsbHMgKG9yIHNpbWlsYXIpIHRoYXQgZG9uJ3QKICB1bmRlcnN0YW5kIEVQU1YgYW5kIHRoZW4gdGhleSBkb24ndCBhbGxvdyB0aGUgc2Vjb25kIGNvbm5lY3Rpb24gdW5sZXNzIFBBU1YKICB3YXMgdXNlZC4gVGhpcyBhbHNvIGNhbGxlZCBmb3IgYSBtaW5vciBmaXggb2YgdGVzdCBjYXNlIDIzOC4KCkRhbmllbCAoMjAgSmFudWFyeSAyMDA2KQotIER1YW5lIENhdGhleSB3YXMgb25lIG9mIG91ciBmcmllbmRzIHdobyByZXBvcnRlZCB0aGF0IGN1cmwgLVAgW0lQXQogIChDVVJMT1BUX0ZUUFBPUlQpIGRpZG4ndCB3b3JrIGZvciBpcHY2LWVuYWJlZCBjdXJscyBpZiB0aGUgSVAgd2Fzbid0IGEKICAibmF0aXZlIiBJUCB3aGlsZSBpdCB3b3JrcyBmaW5lIGZvciBpcHY2LWRpc2FibGVkIGJ1aWxkcyEKCiAgSW4gdGhlIHByb2Nlc3Mgb2YgZml4aW5nIHRoaXMsIEkgcmVtb3ZlZCB0aGUgc3VwcG9ydCBmb3IgTFBSVCBzaW5jZSBJIGNhbid0CiAgdGhpbmsgb2YgbWFueSByZWFzb25zIHRvIGtlZXAgZG9pbmcgaXQgYW5kIGFza2luZyBvbiB0aGUgbWFpbGluZyBsaXN0IGRpZG4ndAogIHJldmVhbCBhbnlvbmUgZWxzZSB0aGF0IGNvdWxkIGVpdGhlci4gVGhlIGNvZGUgdGhhdCBzZW5kcyBFUFJUIGFuZCBQT1JUIGlzCiAgbm93IGFsc28gYSBsb3Qgc2ltcGxlciB0aGFuIGJlZm9yZSAoSU1ITykuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNikKLSBKb24gVHVybmVyIHBvaW50ZWQgb3V0IHRoYXQgZG9pbmcgLVAgW2hvc3RuYW1lXSAoQ1VSTE9QVF9GVFBQT1JUKSB3aXRoIGN1cmwKICAoYnVpbHQgaXB2NC1vbmx5KSBkaWRuJ3Qgd29yay4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA2KQotIEFzIHJlcG9ydGVkIGluIGJ1ZyAjMTQwODc0MiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQwODc0MiksCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29tcGxhaW5lZCBhYm91dCBhIG1pc3NpbmcgIm1pc3NpbmciIHNjcmlwdCBpZiB5b3UgcmFuCiAgY29uZmlndXJlIHdpdGhpbiBhIHBhdGggd2hvc2UgbmFtZSBpbmNsdWRlZCBvbmUgb3IgbW9yZSBzcGFjZXMuIFRoaXMgaXMgZHVlCiAgdG8gYSBmbGF3IGluIGF1dG9tYWtlICgxLjkuNiBhbmQgZWFybGllcikuIEkndmUgbm93IHdvcmtlZCBhcm91bmQgaXQgYnkKICBpbmNsdWRpbmcgYW4gIm92ZXJsb2FkZWQiIHZlcnNpb24gb2YgdGhlIEFNX01JU1NJTkdfSEFTX1JVTiBzY3JpcHQgdGhhdCdsbAogIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgb25lIGF1dG9tYWtlIHNoaXBzIHdpdGguIFRoaXMga2x1ZGdlIG5lZWRzIHRvIGJlCiAgcmVtb3ZlZCBvbmNlIHdlIGdldCBhbiBhdXRvbWFrZSB2ZXJzaW9uIHdpdGggdGhpcyBwcm9ibGVtIGNvcnJlY3RlZC4KICBQb3NzaWJseSB3ZSdsbCB0aGVuIG5lZWQgdG8gY29udmVydCB0aGlzIGludG8gYSBrbHVkZ2UgZGVwZW5kaW5nIG9uIHdoYXQKICBhdXRvbWFrZSB2ZXJzaW9uIHRoYXQgaXMgdXNlZCBhbmQgdGhhdCBpcyBnb25uYSBiZSBwYWluZnVsIGFuZCBJIGRvbid0IGV2ZW4KICB3YW50IHRvIHRoaW5rIGFib3V0IHRoYXQgbm93Li4uIQoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDYpCi0gRGF2aWQgU2hhdzogSGVyZSBpcyB0aGUgbGF0ZXN0IGxpYmN1cmwubTQgYXV0b2NvbmYgdGVzdHMuIEl0IGlzIHVwZGF0ZWQgd2l0aAogIHRoZSBsYXRlc3QgZmVhdHVyZXMgYW5kIHByb3RvY29scyB0aGF0IGxpYmN1cmwgc3VwcG9ydHMgYW5kIGhhcyBhIG1pbm9yIGZpeAogIHRvIGJldHRlciBkZWFsIHdpdGggdGhlIG9ic2N1cmUgY2FzZSB3aGVyZSBzb21lb25lIGhhcyBtb3JlIHRoYW4gb25lIGxpYmN1cmwKICBpbnN0YWxsZWQgYXQgdGhlIHNhbWUgdGltZS4KCkRhbmllbCAoMTYgSmFudWFyeSAyMDA2KQotIERhdmlkIFNoYXcgZmluYWxseSByZW1vdmVkIGFsbCB0cmFjZXMgb2YgR29waGVyIGFuZCB3ZSBhcmUgbm93IG9mZmljaWFsbHkKICBub3Qgc3VwcG9ydGluZyBpdC4gSXQgaGFzbid0IGJlZW4gZnVuY3Rpb25pbmcgZm9yIHllYXJzIGFueXdheSwgc28gdGhpcyBpcwogIGp1c3QgZmluYWxseSBzdGF0aW5nIHdoYXQgYWxyZWFkeSB3YXMgdHJ1ZS4gQW5kIGEgY2xlYW51cCBhdCB0aGUgc2FtZSB0aW1lLgoKLSBCcnlhbiBIZW5kZXJzb24gdHVybmVkIHRoZSAnaW5pdGlhbGl6ZWQnIHZhcmlhYmxlIGZvciBjdXJsX2dsb2JhbF9pbml0KCkKICBpbnRvIGEgY291bnRlciwgYW5kIHRodXMgeW91IGNhbiBub3cgZG8gbXVsdGlwbGUgY3VybF9nbG9iYWxfaW5pdCgpIGFuZCB5b3UKICBhcmUgdGhlbiBzdXBwb3NlZCB0byBkbyB0aGUgc2FtZSBhbW91bnQgb2YgY2FsbHMgdG8gY3VybF9nbG9iYWxfY2xlYW51cCgpLgogIEJyeWFuIGhhcyBhbHNvIHVwZGF0ZWQgdGhlIGRvY3MgYWNjb3JkaW5nbHkuCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNikKLSBBbmRyZXcgQmVuaGFtIGZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBjb3VsZCBjYXVzZSB0aGUKICB0ZXN0IHNjcmlwdCB0byBraWxsIGFsbCBwcm9jZXNzZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2VzcyBncm91cCEKCkRhbmllbCAoMTIgSmFudWFyeSAyMDA2KQotIE1pY2hhZWwgSmFobjoKCiAgRml4ZWQgRlRQX1NLSVBfUEFTVl9JUCBhbmQgRlRQX1VTRV9FUFNWIHRvICJkbyByaWdodCIgd2hlbiB1c2VkIG9uIEZUUCB0aHJ1CiAgSFRUUCBwcm94eS4KCiAgRml4ZWQgUFJPWFlUVU5ORUwgdG8gd29yayBmaW5lIHdoZW4geW91IGRvIGZ0cCB0aHJvdWdoIGEgcHJveHkuICBJdCB3b3VsZAogIHByZXZpb3VzbHkgb3ZlcndyaXRlIGludGVybmFsIG1lbW9yeSBhbmQgY2F1c2UgdW5wcmVkaWN0ZWQgYmVoYXZpb3VyIQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDYpCi0gSSBkZWNpZGVkIHRvIGRvY3VtZW50IHRoZSAic2VjcmV0IG9wdGlvbiIgaGVyZSBub3csIGFzIEkndmUgcmVjZWl2ZWQgKk5PKgogIGZlZWRiYWNrIGF0IGFsbCBvbiBteSBtYWlsaW5nIGxpc3QgcmVxdWVzdHMgZnJvbSBOb3ZlbWJlciAyMDA1OgoKICBJJ20gbG9va2luZyBmb3IgZmVlZGJhY2sgYW5kIGNvbW1lbnRzLiBJIGFkZGVkIHNvbWUgZXhwZXJpbWVudGFsIGNvZGUgdGhlCiAgb3RoZXIgZGF5LCB0aGF0IGFsbG93cyBhIGxpYmN1cmwgdXNlciB0byBzZWxlY3Qgd2hhdCBtZXRob2QgbGliY3VybCBzaG91bGQKICB1c2UgdG8gcmVhY2ggYSBmaWxlIG9uIGEgRlRQKFMpIHNlcnZlci4KCiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiBDVlMgY29kZSBhbmQgaW4gcmVjZW50IGRhaWx5IHNuYXBzaG90cy4KCiAgTGV0IG1lIGV4cGxhaW4uLi4KCiAgVGhlIGN1cnJlbnQgbmFtZSBmb3IgdGhlIG9wdGlvbiBpcyBDVVJMT1BUX0ZUUF9GSUxFTUVUSE9EICgtLWZ0cC1tZXRob2QgZm9yCiAgdGhlIGNvbW1hbmQgbGluZSB0b29sKSBhbmQgeW91IHNldCBpdCB0byBhIGxvbmcgKHRoZXJlIGFyZSBjdXJyZW5seSBubwogIGRlZmluZXMgZm9yIHRoZSBhcmd1bWVudCB2YWx1ZXMsIGp1c3QgcGxhaW4gbnVtZXJpY2FscykuIFlvdSBjYW4gc2V0IHRocmVlCiAgZGlmZmVyZW50ICJtZXRob2RzIiB0aGF0IGRvIHRoaXM6CgogIDEgbXVsdGljd2QgLSBsaWtlIHRvZGF5LCBjdXJsIHdpbGwgZG8gYSBzaW5nbGUgQ1dEIG9wZXJhdGlvbiBmb3IgZWFjaCBwYXRoCiAgICAgICAgICAgcGFydCBpbiB0aGUgZ2l2ZW4gVVJMLiBGb3IgZGVlcCBoaWVyYXJjaGllcyB0aGlzIG1lYW5zIHZlcnkgbWFueQogICAgICAgICAgIGNvbW1hbmRzLiBUaGlzIGlzIGhvdyBSRkMxNzM4IHNheXMgaXQgc2hvdWxkIGJlIGRvbmUuIFRoaXMgaXMgdGhlCiAgICAgICAgICAgZGVmYXVsdC4KCiAgMiBub2N3ZCAtIG5vIENXRCBhdCBhbGwgaXMgZG9uZSwgY3VybCB3aWxsIGRvIFNJWkUsIFJFVFIsIFNUT1IgZXRjIGFuZCBnaXZlCiAgICAgICAgICAgYSBmdWxsIHBhdGggdG8gdGhlIHNlcnZlci4KCiAgMyBzaW5nbGVjd2QgLSBtYWtlIG9uZSBDV0Qgd2l0aCB0aGUgZnVsbCB0YXJnZXQgZGlyZWN0b3J5IGFuZCB0aGVuIG9wZXJhdGUKICAgICAgICAgICAgb24gdGhlIGZpbGUgIm5vcm1hbGx5Ii4KCiAgKFdpdGggdGhlIGNvbW1hbmQgbGluZSB0b29sIHlvdSBkbyAtLWZ0cC1tZXRob2QgW01FVEhPRF0sIHdoZXJlIFtNRVRIT0RdIGlzCiAgb25lIG9mICJtdWx0aWN3ZCIsICJub2N3ZCIgb3IgInNpbmdsZWN3ZCIuKQoKICBXaGF0IGZlZWRiYWNrIEknbSBpbnRlcmVzdGVkIGluOgoKICAxIC0gRG8gdGhleSB3b3JrIGF0IGFsbD8gRG8geW91IGZpbmQgc2VydmVycyB3aGVyZSBvbmUgb2YgdGhlc2UgZG9uJ3Qgd29yaz8KCiAgMiAtIFdoYXQgd291bGQgcHJvcGVyIG5hbWVzIGZvciB0aGUgb3B0aW9uIGFuZCBpdHMgYXJndW1lbnRzIGJlLCBpZiB3ZQogICAgICBjb25zaWRlciB0aGlzIGZlYXR1cmUgZ29vZCBlbm91Z2ggdG8gZ2V0IGluY2x1ZGVkIGFuZCBkb2N1bWVudGVkIGluCiAgICAgIHVwY29taW5nIHJlbGVhc2VzPwoKICAzIC0gU2hvdWxkIHdlIG1ha2UgbGliY3VybCBhYmxlIHRvICJ3YWxrIHRocm91Z2giIHRoZXNlIG9wdGlvbnMgaW4gY2FzZSBvZgogICAgICAocGF0aCByZWxhdGVkKSBmYWlsdXJlcywgb3Igc2hvdWxkIGl0IGZhaWwgYW5kIGxldCB0aGUgdXNlciByZWRvIGFueQogICAgICBwb3NzaWJsZSByZXRyaWVzPwoKICAoVGhpcyBvcHRpb24gaXMgbm90IGRvY3VtZW50ZWQgaW4gYW55IG1hbiBwYWdlIGp1c3QgeWV0IHNpbmNlIEknbSBub3Qgc3VyZQogIHRoZXNlIG5hbWVzIHdpbGwgYmUgdXNlZCBvciBpZiB0aGUgZnVuY3Rpb25hbGl0eSB3aWxsIGVuZCB1cCBleGFjdGx5IGxpa2UKICB0aGlzLiAgQW5kIGZvciB0aGUgc2FtZSByZWFzb25zIHdlIGhhdmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhlc2UgeWV0LikKCkRhbmllbCAoMTAgSmFudWFyeSAyMDA2KQotIFdoZW4gdXNpbmcgYSBiYWQgcGF0aCBvdmVyIEZUUCwgYXMgaW4gd2hlbiBsaWJjdXJsIGNvdWxkbid0IENXRCBpbnRvIGFsbAogIGdpdmVuIHN1YmRpcnMsIGxpYmN1cmwgd291bGQgc3RpbGwgInJlbWVtYmVyIiB0aGUgZnVsbCBwYXRoIGFzIGlmIGl0IGlzIHRoZQogIGN1cnJlbnQgZGlyZWN0b3J5IGxpYmN1cmwgaXMgaW4gc28gdGhhdCB0aGUgbmV4dCBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdvdWxkCiAgZ2V0IHJlYWxseSBjb25mdXNlZCBpZiBpdCB0cmllZCB0aGUgc2FtZSBwYXRoIGFnYWluIC0gYXMgaXQgd291bGQgbm90IGlzc3VlCiAgYW55IENXRCBjb21tYW5kcyBhdCBhbGwsIGFzc3VtaW5nIGl0IGlzIGFscmVhZHkgaW4gdGhlICJwcm9wZXIiIGRpci4KCiAgU3RhcnRpbmcgbm93LCBhIGZhaWxlZCBDV0QgY29tbWFuZCBzZXRzIGEgZmxhZyB0aGF0IHByZXZlbnRzIHRoZSBwYXRoIHRvIGJlCiAgInJlbWVtYmVyZWQiIGFmdGVyIHJldHVybmluZy4KCkRhbmllbCAoNyBKYW51YXJ5IDIwMDYpCi0gTWljaGFlbCBKYWhuIGZpeGVkIHNvIHRoYXQgdGhlIHNlY29uZCBDT05ORUNUIHdoZW4gZG9pbmcgRlRQIG92ZXIgYSBIVFRQCiAgcHJveHkgYWN0dWFsbHkgdXNlZCBhIG5ldyBjb25uZWN0aW9uIGFuZCBub3Qgc2VudCB0aGUgc2Vjb25kIHJlcXVlc3Qgb24gdGhlCiAgZmlyc3Qgc29ja2V0IQoKRGFuaWVsICg2IEphbnVhcnkgMjAwNikKLSBBbGV4YW5kZXIgTGF6aWMgbWFkZSB0aGUgYnVpbGRjb25mIHJ1biB0aGUgYnVpbGRjb25mIGluIHRoZSBhcmVzIGRpciBpZiB0aGF0CiAgaXMgcHJlc2VudCBpbnN0ZWFkIG9mIHRyeWluZyB0byBtaW1pYyB0aGF0IHNjcmlwdCBpbiBjdXJsJ3MgYnVpbGRjb25mCiAgc2NyaXB0LgoKRGFuaWVsICgzIEphbnVhcnkgMjAwNikKLSBBbmRyZXMgR2FyY2lhIG1hZGUgdGhlIFRGVFAgdGVzdCBzZXJ2ZXIgYnVpbGQgd2l0aCBtaW5ndy4KCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNSkKLSBKZWFuIEphY3F1ZXMgRHJvdWluIHBvaW50ZWQgb3V0IHRoYXQgeW91IGNvdWxkIG9ubHkgaGF2ZSBhIHVzZXIgbmFtZSBvcgogIHBhc3N3b3JkIG9mIDEyNyBieXRlcyBvciBsZXNzIGVtYmVkZGVkIGluIGEgVVJMLCB3aGVyZSBhY3R1YWxseSB0aGUgY29kZQogIHVzZXMgYSAyNTUgYnl0ZSBidWZmZXIgZm9yIGl0ISBNb2RpZmllZCBub3cgdG8gdXNlIHRoZSBmdWxsIGJ1ZmZlciBzaXplLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDA1KQotIERvdiBNdXJpayBjb3JyZWN0ZWQgdGhlIEhUVFBfT05MWSBkZWZpbmUgdG8gZGlzYWJsZSB0aGUgVEZUUCBzdXBwb3J0IHByb3Blcmx5CgpWZXJzaW9uIDcuMTUuMSAoNyBEZWNlbWJlciAyMDA1KQoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDUpCi0gRnVsbCB0ZXh0IGhlcmU6IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9hZHZfMjAwNTEyMDcuaHRtbCBQb2ludGVkIG91dCBieQogIFN0ZWZhbiBFc3Nlci4KCiAgVlVMTkVSQUJJTElUWQoKICBsaWJjdXJsJ3MgVVJMIHBhcnNlciBmdW5jdGlvbiBjYW4gb3ZlcmZsb3cgYSBtYWxsb2NlZCBidWZmZXIgaW4gdHdvIHdheXMsIGlmCiAgZ2l2ZW4gYSB0b28gbG9uZyBVUkwuCgogIFRoZXNlIG92ZXJmbG93cyBoYXBwZW4gaWYgeW91CiAKICAxIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG5vIHByb3RvY29sIChsaWtlICJodHRwOi8vIikgcHJlZml4LCB1c2luZyBubyBzbGFzaAogICAgICBhbmQgdGhlIHN0cmluZyBpcyAyNTYgYnl0ZXMgb3IgbG9uZ2VyLiBUaGlzIGxlYWRzIHRvIGEgc2luZ2xlIHplcm8gYnl0ZQogICAgICBvdmVyZmxvdyBvZiB0aGUgbWFsbG9jZWQgYnVmZmVyLgoKICAyIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG9ubHkgYSBxdWVzdGlvbiBtYXJrIGFzIHNlcGFyYXRvciAobm8gc2xhc2gpIGJldHdlZW4KICAgICAgdGhlIGhvc3QgYW5kIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIEJvdGggb3ZlcmZsb3dzIGNhbiBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaW5wdXQgc3RyaW5nLCBsZWFkaW5nIHRvIHR3byBzaW5nbGUKICB6ZXJvIGJ5dGUgb3ZlcndyaXRlcy4KCiAgVGhlIGFmZmVjdGVkIGZsYXcgY2Fubm90IGJlIHRyaWdnZXJlZCBieSBhIHJlZGlyZWN0LCBidXQgdGhlIGxvbmcgVVJMIG11c3QKICBiZSBwYXNzZWQgaW4gImRpcmVjdGx5IiB0byBsaWJjdXJsLiBJdCBtYWtlcyB0aGlzIGEgImxvY2FsIiBwcm9ibGVtLiBPZgogIGNvdXJzZSwgbG90cyBvZiBwcm9ncmFtcyBtYXkgc3RpbGwgcGFzcyBpbiB1c2VyLXByb3ZpZGVkIFVSTHMgdG8gbGliY3VybAogIHdpdGhvdXQgZG9pbmcgbXVjaCBzeW50YXggY2hlY2tpbmcgb2YgdGhlaXIgb3duLCBhbGxvd2luZyBhIHVzZXIgdG8gZXhwbG9pdAogIHRoaXMgdnVsbmVyYWJpbGl0eS4KCiAgVGhlcmUgaXMgbm8ga25vd24gZXhwbG9pdCBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDUpCi0gSmFtaWUgTmV3dG9uIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGZpbGU6Ly8gY29kZSB3b3VsZCBjbG9zZSgpIGEgemVybwogIGZpbGUgZGVzY3JpcHRvciBpZiBnaXZlbiBhIG5vbi1leGlzdGluZyBmaWxlLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA1KQotIERvdWcgS2F1Zm1hbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIERKR1BQCiAgYWdhaW4gdXNpbmcgY29uZmlndXJlLgoKLSBZYW5nIFRzZSBwcm92aWRlZCBhIHdob2xlIHNlcmllcyBvZiBwYXRjaGVzIHRvIGNsZWFyIHVwIGNvbXBpbGVyIHdhcm5pbmdzIG9uCiAgTVNWQyA2LgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDA1KQotIEkgZXh0ZW5kZWQgYSBwYXRjaCBmcm9tIERhdmlkIFNoYXcgdG8gbWFrZSBsaWJjdXJsIF9hbHdheXNfIHByb3ZpZGUgYW4gZXJyb3IKICBzdHJpbmcgaW4gdGhlIGdpdmVuIGVycm9yIGJ1ZmZlciB0byBhZGRyZXNzIHRoZSBmbGF3IG1lbnRpb24gb24gMjEgc2VwIDIwMDUuCgpEYW5pZWwgKDE2IE5vdmVtYmVyIDIwMDUpCi0gQXBwbGllZCBBbGJlcnQgQ2hpbidzIHBhdGNoIHRoYXQgbWFrZXMgdGhlIGxpYmN1cmwucGMgcGtnY29uZmlnIGZpbGUgZ2V0CiAgaW5zdGFsbGVkIG9uICdtYWtlIGluc3RhbGwnIHRpbWUuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDUpCi0gUXVhZ21pcmUgcmVwb3J0ZWQgdGhhdCBoZSBuZWVkZWQgdG8gcmFpc2UgYSBOVExNIGJ1ZmZlciBmb3IgU1NQSSB0byB3b3JrCiAgcHJvcGVybHkgZm9yIGEgY2FzZSwgYW5kIHNvIHdlIGRpZC4gV2UgcmFpc2VkIGl0IGV2ZW4gZm9yIG5vbi1TU1BJIGJ1aWxkcwogIGJ1dCBpdCBzaG91bGQgbm90IGRvIGFueSBoYXJtLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzU2NzE1CgotIEphbiBLdW5kZXIncyBkZWJpYW4gYnVnIHJlcG9ydAogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMzg2ODAgaWRlbnRpZmllZCBhIHdlaXJkCiAgZXJyb3IgbWVzc2FnZSBmb3Igd2hlbiB5b3UgdHJ5IHRvIHVwbG9hZCBhIGZpbGUgYW5kIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5CiAgZG9lc24ndCBleGlzdCBvbiB0aGUgdGFyZ2V0IHNlcnZlci4KCi0gWWFuZyBUc2UgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gbGliL3NzbHVzZS5jIHdpdGggT3BlblNTTCAwLjkuOCBhbmQgaW4KICBsaWIvbWVtZGVidWcuaCB0aGF0IHNob3dlZCB1cCBpbiBoaXMgbXN2YyBidWlsZHMuCgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDUpCi0gRGViaWFuIGJ1ZyByZXBvcnQgMzM4NjgxIGJ5IEphbiBLdW5kZXI6IG1ha2UgY3VybCBiZXR0ZXIgZGV0ZWN0IGFuZCByZXBvcnQKICBiYWQgbGltaXQtcmF0ZSB1bml0czoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzM4NjgxIE5vdyBjdXJsIHdpbGwgcmV0dXJuCiAgZXJyb3IgaWYgYSBiYWQgdW5pdCBpcyB1c2VkLgoKLSBUaGFua3MgdG8gdGhpcyBuaWNlIHN1bW1hcnkgb2YgcG9sbCgpIGltcGxlbWVudGF0aW9uczoKICBodHRwOi8vd3d3LmdyZWVuZW5kLm9yZy51ay9yamsvMjAwMS8wNi9wb2xsLmh0bWwgYW5kIGZ1cnRoZXIgdGVzdHMgYnkgRXVnZW5lCiAgS290bHlhcm92LCB3ZSBub3cga25vdyB0aGF0IGN5Z3dpbidzIHBvbGwgcmV0dXJucyBvbmx5IFBPTExIVVAgb24gcmVtb3RlCiAgY29ubmVjdGluIGNsb3N1cmUgc28gd2UgY2hlY2sgZm9yIHRoYXQgY2FzZSAodG9vKSBhbmQgcmUtZW5hYmxlIHBvbGwgZm9yCiAgY3lnd2luIGJ1aWxkcy4KCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwNSkKLSBFdWdlbmUgS290bHlhcm92IGZvdW5kIG91dCB0aGF0IGN5Z3dpbidzIHBvbGwoKSBmdW5jdGlvbiBpc24ndCBkb2luZyB0aGluZ3MKICByaWdodDogaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwNS0xMS8wMDQ1Lmh0bWwgc28gd2Ugbm93IGRpc2FibGUKICBwb2xsKCkgYW5kIHVzZSBzZWxlY3QoKSBvbiBjeWd3aW4gdG9vICh3ZSBhbHJlYWR5IGRvIHRoZSBzYW1lIGNob2ljZSBvbiBNYWMKICBPUyBYKQoKLSBEaW1hIEJhcnNreSBwYXRjaGVkIHByb2JsZW0gIzEzNDg5MzA6IHRoZSBHbnVUTFMgY29kZSBjb21wbGV0ZWx5IGlnbm9yZWQKICBjbGllbnQgY2VydGlmaWNhdGVzISAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTM0ODkzMCkuCgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDUpCi0gRGF2aWQgTGFuZyBmaXhlZCBJUHY2IHN1cHBvcnQgZm9yIFRGVFAhCgotIEludHJvZHVjaW5nIHJhbmdlIHN0ZXBwaW5nIHRvIHRoZSBjdXJsIGdsb2JiaW5nIHN1cHBvcnQuIE5vdyB5b3UgY2FuIHNwZWNpZnkKICBzdGVwIGNvdW50ZXIgYnkgYWRkaW5nIDpbbnVtXSB3aXRoaW4gdGhlIGJyYWNrZXRzIHdoZW4gc3BlY2lmeWluZyBhIHJhbmdlOgoKICAgWzEtMTAwOjEwXQogICBbYS16OjJdCgogIElmIG5vIHN0ZXAgY291bnRlciBpcyBzZXQsIGl0IGRlZmF1bHRzIHRvIDEgYXMgYmVmb3JlOgoKICAgWzEtMTAwXQogICBbZC1oXQoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDUpCi0gUmVtb3ZlZCB0aGUgdXNlIG9mIEFJX0NBTk9OTkFNRSBpbiB0aGUgSVB2Ni1lbmFibGVkIHJlc29sdmVyIGZ1bmN0aW9ucyBzaW5jZQogIHdlIHJlYWxseSBoYXZlIG5vIHVzZSBmb3IgcmV2ZXJzZSBsb29rdXBzIG9mIHRoZSBhZGRyZXNzLgoKICBJIHRydWx5IGhvcGUgdGhlc2UgYXJlIHRoZSBsYXN0IHJldmVyc2UgbG9va3VwcyB3ZSBoYWQgbGluZ2VyaW5nIGluIHRoZQogIGNvZGUhCgotIERtaXRyeSBCYXJ0c2V2aWNoIGRpc2NvdmVyZWQgc29tZSBpc3N1ZXMgaW4gY29tcGF0aWJpbHR5IG9mIFNTUEktZW5hYmxlZAogIHZlcnNpb24gb2YgbGliY3VybCB3aXRoIGRpZmZlcmVudCBXaW5kb3dzIHZlcnNpb25zLiBDdXJyZW50IHZlcnNpb24gb2YKICBsaWJjdXJsIGltcG9ydHMgU1NQSSBmdW5jdGlvbnMgZnJvbSBzZWN1cjMyLmRsbC4gSG93ZXZlciwgdW5kZXIgV2luZG93cyBOVAogIDQuMCB0aGVzZSBmdW5jdGlvbnMgYXJlIGxvY2F0ZWQgaW4gc2VjdXJpdHkuZGxsLCB1bmRlciBXaW5kb3dzIDl4IC0gaW4KICBzZWN1cjMyLmRsbCBhbmQgV2luZG93cyAyMDAwIGFuZCBYUCBjb250YWlucyBib3RoIHRoZXNlIERMTHMgKHNlY3VyaXR5LmRsbAogIGp1c3QgZm9yd2FyZHMgY2FsbHMgdG8gc2VjdXIzMi5kbGwpLgoKICBEbWl0cnkncyBwYXRjaCBsb2FkcyBwcm9wZXIgbGlicmFyeSBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gV2luZG93cwogIHZlcnNpb24uIEZ1bmN0aW9uIEluaXRTZWN1cml0eUludGVyZmFjZSgpIGlzIHVzZWQgdG8gb2J0YWluIHBvaW50ZXJzIHRvIGFsbAogIG9mIFNTUEkgZnVuY3Rpb24gaW4gb25lIHN0cnVjdHVyZS4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDA1KQotIFZpbG1vcyBOZWJlaGFqIGltcHJvdmVkIGxpYmN1cmwncyBMREFQIGFiaWxpdGllczoKCiAgVGhlIExEQVAgY29kZSBpbiBsaWJjdXJsIGNhbid0IGhhbmRsZSBMREFQIHNlcnZlcnMgb2YgTERBUHYzIG5vciBiaW5hcnkKICBhdHRyaWJ1dGVzIGluIExEQVAgb2JqZWN0cy4gU28sIEkgbWFkZSBhIHF1aWNrIHBhdGNoIHRvIGFkZHJlc3MgdGhlc2UKICBwcm9ibGVtcy4KCiAgVGhlIHNvbHV0aW9uIGlzIHNpbXBsZTogaWYgd2UgY29ubmVjdCB0byBhbiBMREFQIHNlcnZlciwgZmlyc3QgdHJ5IExEQVB2MwogICh3aGljaCBpcyB0aGUgcHJlZmVycmVkIHByb3RvY29sIGFzIG9mIG5vdykgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIExEQVB2Mi4KICBJbiBjYXNlIG9mIGJpbmFyeSBhdHRyaWJ1dGVzLCB3ZSBmaXJzdCBjb252ZXJ0IHRoZW0gdG8gYmFzZTY0LCBqdXN0IGxpa2UgdGhlCiAgb3BlbmxkYXAgY2xpZW50IGRvZXMuIEl0IHVzZXMgbGRhcF9nZXRfdmFsdWVzX2xlbigpIGluc3RlYWQgb2YKICBsZGFwX2dldF92YWx1ZXMoKSB0byBiZSBhYmxlIHRvIHJldHJpZXZlIGJpbmFyeSBhdHRyaWJ1dGVzIGNvcnJlY3RseS4gSQogIGRlZmluZWQgdGhlIG5lY2Vzc2FyeSBMREFQIG1hY3JvcyBpbiBsaWIvbGRhcC5jIHRvIGJlIGFibGUgdG8gY29tcGlsZQogIGxpYmN1cmwgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2YgbGlibGRhcAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDUpCi0gTmlzIEpvcmdlbnNlbiBmaWxlZCBidWcgcmVwb3J0ICMxMzM4NjQ4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzg2NDgpIHdoaWNoIHJlYWxseSBpcyBtb3JlIG9mIGEKICBmZWF0dXJlIHJlcXVlc3QsIGJ1dCBhbnl3YXkuIEl0IHBvaW50ZWQgb3V0IHRoYXQgLS1tYXgtcmVkaXJzIGRpZCBub3QgYWxsb3cKICBpdCB0byBiZSBzZXQgdG8gMCwgd2hpY2ggdGhlbiB3b3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvbiB0aGUgZmlyc3QKICBMb2NhdGlvbjogZm91bmQuIEJhc2VkIG9uIE5pcycgcGF0Y2gsIG5vdyBsaWJjdXJsIHN1cHBvcnRzIENVUkxPUFRfTUFYUkVESVJTCiAgc2V0IHRvIDAsIG9yIC0xIGZvciBpbmZpbml0eS4gQWRkZWQgdGVzdCBjYXNlIDI3NCB0byB2ZXJpZnkuCgotIHRvbW1pbmtbYXRdcG9zdC5wbCByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMzM3NzIzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzc3MjMpIHRoYXQgY3VybCBjb3VsZCBub3QgdXBsb2FkCiAgYmluYXJ5IGRhdGEgZnJvbSBzdGRpbiBvbiBXaW5kb3dzIGlmIHRoZSBkYXRhIGNvbnRhaW5lZCBjb250cm9sLVogKGhleCAxYSkKICBzaW5jZSB0aGF0IGlzIHRyZWF0ZWQgYXMgZW5kLW9mLWZpbGUgd2hlbiByZWFkIGluIHRleHQgbW9kZS4gR2lzbGUgVmFuZW0KICBwb2ludGVkIG91dCB0aGUgZml4LCBhbmQgSSBtYWRlIGJvdGggLVQgYW5kIC0tZGF0YS1iaW5hcnkgdGFrZSBhZHZhbnRhZ2Ugb2YKICBpdC4KCi0gSmF6IEZyZXNoIHBvaW50ZWQgb3V0IHRoYXQgaWYgeW91IHVzZWQgIi1yIFtudW1iZXJdIiBhcyB3YXMgd3JvbmdseSBkZXNjcmliZWQKICBpbiB0aGUgbWFuIHBhZ2UsIGN1cmwgd291bGQgc2VuZCBhbiBpbnZhbGlkIEhUVFAgUmFuZ2U6IGhlYWRlci4gVGhlIGNvcnJlY3QKICB3YXkgd291bGQgYmUgdG8gdXNlICItciBbbnVtYmVyXS0iIG9yIGV2ZW4gIi1yIC1bbnVtYmVyXSIuIFN0YXJ0aW5nIG5vdywKICBjdXJsIHdpbGwgd2FybiBpZiB0aGlzIGlzIGRpc2NvdmVyZWQsIGFuZCBhdXRvbWF0aWNhbGx5IGFwcGVuZCBhIGRhc2ggdG8gdGhlCiAgcmFuZ2UgYmVmb3JlIHBhc3NpbmcgaXQgdG8gbGliY3VybC4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA1KQotIEFtb2wgUGF0dGVrYXIgcmVwb3J0ZWQgYSBidWcgd2l0aCBncmVhdCBkZXRhaWwgYW5kIGEgZmluZSBleGFtcGxlIGluIGJ1ZwogICMxMzI2MzA2IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2MzA2KS4gV2hlbiB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0IHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCBhbmQgb25lIG9mCiAgdGhlIGFkZHJlc3NlcyBmYWlscyB0byBjb25uZWN0ICh0aGUgc2VydmVyIG11c3QgZXhpc3QgYW5kIHJlc3BvbmQsIGp1c3Qgbm90CiAgYWNjZXB0IGNvbm5lY3Rpb25zKSBsaWJjdXJsIGxlYWtzIGEgc29ja2V0IGRlc2NyaXB0b3IuIFRoYW5rcyB0byB0aGUgZmluZQogIHJlcG9ydCwgSSBjb3VsZCBmaW5kIGFuZCBmaXggdGhpcy4KCkRhbmllbCAoMjIgT2N0b2JlciAyMDA1KQotIERpbWEgQmFyc2t5IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEdudVRMUy1lbmFibGVkIGxpYmN1cmwgaW4gYnVnIHJlcG9ydAogICMxMzM0MzM4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM0MzM4KS4gV2hlbiByZWFkaW5nIGFuIFNTTAogIHN0cmVhbSBmcm9tIGEgc2VydmVyIGFuZCB0aGUgc2VydmVyIHJlcXVlc3RzIGEgInJlaGFuZHNoYWtlIiwgdGhlIGN1cnJlbnQKICBjb2RlIHNpbXBseSByZXR1cm5zIHRoaXMgYXMgYW4gZXJyb3IuIEkgaGF2ZSBubyBnb29kIHdheSB0byB0ZXN0IHRoaXMsIGJ1dAogIEkndmUgYWRkZWQgYSBjcnVkZSBhdHRlbXB0IG9mIGRlYWxpbmcgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgLQogIGl0IG1ha2VzIGEgYmxvY2tpbmcgaGFuZHNoYWtlIGlmIHRoaXMgaGFwcGVucy4gRG9uZSBsaWtlIHRoaXMgYmVjYXVzZSBmaXhpbmcKICB0aGlzIHRoZSAicHJvcGVyIiB3YXkgKHRoYXQgd291bGQgaGFuZHNoYWtlIGFzeW5jaHJvbm91c2x5KSB3aWxsIHJlcXVpcmUKICBxdWl0ZSBzb21lIHdvcmsgYW5kIEkgcmVhbGx5IG5lZWQgYSBnb29kIHdheSB0byB0ZXN0IHRoaXMgdG8gZG8gc3VjaCBhCiAgY2hhbmdlLgoKRGFuaWVsICgyMSBPY3RvYmVyIDIwMDUpCi0gIk9mZXIiIHJlcG9ydGVkIGEgcHJvYmxlbSB3aGVuIGxpYmN1cmwgcmUtdXNlZCBhIGNvbm5lY3Rpb24gYW5kIGZhaWxlZCB0byBkbwogIGl0LCBpdCBjb3VsZCB0aGVuIGFjY2lkZW50YWxseSBhY3R1YWxseSBjcmFzaC4gUHJlc3VtYWJseSwgdGhpcyBjb25jZXJucyBGVFAKICBjb25uZWN0aW9ucy4gIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzAzMTAKCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlIHNvIHRoYXQgdGhlIHN0YXRpYyBkZWJ1ZyBTU0wgbGlicyBhcmUKICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYW5kIG5vdCB0byB0aGUgbGliY3VybGQubGliCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMyNjY3NgoKLSBCcmFkZm9yZCBCcnVjZSBtYWRlIHRoZSB3aW5kb3dzIHJlc29sdmVyIGNvZGUgcHJvcGVybHkgcmV0dXJuCiAgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX1BST1hZIGFuZCBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBvbiByZXNvbHZpbmcKICBlcnJvcnMgKGFzIGRvY3VtZW50ZWQpLgoKRGFuaWVsICgyMCBPY3RvYmVyIDIwMDUpCi0gRGF2ZSBEcmliaW4gbWFkZSBsaWJjdXJsIHVuZGVyc3RhbmQgYW5kIGhhbmRsZSBjYXNlcyB3aGVuIHRoZSBzZXJ2ZXIKICAod3JvbmdseSkgc2VuZHMgKnR3byogV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXJzIGZvciBEaWdlc3QuIFdoaWxlIHRoaXMgc2hvdWxkCiAgbmV2ZXIgaGFwcGVuIGluIGEgc2FuZSB3b3JsZCwgbGliY3VybCBwcmV2aW91c2x5IGdvdCBpbnRvIGFuIGluZmluaXRlIGxvb3AKICB3aGVuIHRoaXMgb2NjdXJyZWQuIERhdmUgYWRkZWQgdGVzdCAyNzMgdG8gdmVyaWZ5IHRoaXMuCgotIFRlbXByaW11cyBpbXByb3ZlZCB0aGUgTVNWQyBtYWtlZmlsZTogIm1ha2VzIGEgYnVpbGQgb3B0aW9uIGF2YWlsYWJsZSBzbyBpZgogIHlvdSBzZXQgcnRsaWJjZmc9c3RhdGljIGZvciB0aGUgbWFrZSwgdGhlbiBpdCB3b3VsZCBidWlsZCB3aXRoIC9NVC4gVGhlCiAgZGVmYXVsdCBiZWhhdmlvdXIgaXMgL01EICh0aGUgb3JpZ2luYWwpLiIKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2NjY1CgpEYW5pZWwgKDE0IE9jdG9iZXIgMjAwNSkKLSBSZXZlcnRlZCB0aGUgTElCQ1VSTF9WRVJTSU9OX05VTSBjaGFuZ2UgZnJvbSBPY3RvYmVyIDYuIEFzIERhdmUgRHJpYmluCiAgcmVwb3J0ZWQsIHRoZSBkZWZpbmUgaXMgdXNlZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgaXMgYXNzdW1lZCB0byB1c2UKICB0aGUgMHhZWVhYWlogZm9ybWF0LiBUaGlzIG1hZGUgImN1cmwtY29uZmlnIC0tdmVybnVtIiBmYWlsIGluIHRoZSA3LjE1LjAKICByZWxlYXNlIHZlcnNpb24uCgpWZXJzaW9uIDcuMTUuMCAoMTMgT2N0b2JlciAyMDA1KQoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDUpCi0gTWljaGFlbCBTdXR0b24gb2YgaURFRkVOU0UgcmVwb3J0ZWQgYW5kIEkgZml4ZWQgYSBzZWN1cml0ZnkgZmxhdyBpbiB0aGUgTlRMTQogIGNvZGUgdGhhdCB3b3VsZCBvdmVyZmxvdyBhIGJ1ZmZlciBpZiBnaXZlbiBhIHRvbyBsb25nIHVzZXIgbmFtZSBvciBkb21haW4KICBuYW1lLiBUaGlzIHdvdWxkIGhhcHBlbiBpZiB5b3UgZW5hYmxlIE5UTE0gYXV0aGVudGljYXRpb24gYW5kIGVpdGhlcgoKICBBIC0gcGFzcyBpbiBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdG8gbGliY3VybCB0aGF0IHRvZ2V0aGVyIGFyZSBsb25nZXIKICAgICAgdGhhbiAxOTIgYnl0ZXMKCiAgQiAtIGFsbG93IChsaWIpY3VybCB0byBmb2xsb3cgSFRUUCAicmVkaXJlY3RzIiAoTG9jYXRpb246IGFuZCB0aGUKICAgICAgYXBwcm9wcmlhdGUgSFRUUCAzMHggcmVzcG9uc2UgY29kZSkgYW5kIHRoZSBuZXcgVVJMIGNvbnRhaW5zIGEgVVJMIHdpdGgKICAgICAgYSB1c2VyIG5hbWUgYW5kIGRvbWFpbiBuYW1lIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlciB0aGFuIDE5MiBieXRlcwoKICBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL3NlY3VyaXR5Lmh0bWwgZm9yIGZ1cnRoZXIgZGV0YWlscyBhbmQgdXBkYXRlcwoKRGFuaWVsICg1IE9jdG9iZXIgMjAwNSkKLSBEYXJyeWwgSG91c2UgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggdXNpbmcgLXogdG8gZG93bmxvYWQgZmlsZXMgZnJvbSBGVFAuCiAgSXQgdHVybmVkIG91dCB0aGF0IGlmIHRoZSBnaXZlbiB0aW1lIHN0YW1wIHdhcyBleGFjdCB0aGUgc2FtZSBhcyB0aGUgcmVtb3RlCiAgdGltZSBzdGFtcCwgdGhlIGZpbGUgd291bGQgc3RpbGwgd3JvbmdseSBiZSBkb3dubG9hZGVkLiBBZGRlZCB0ZXN0IGNhc2UgMjcyCiAgdG8gdmVyaWZ5LgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNSkKLSBEb21lbmljbyBBbmRyZW9saSBmaXhlZCBhIG1hbiBwYWdlIG1hbGZvcm1hdCBhbmQgcmVtb3ZlZCBvZGQgKDB4YTApIGJ5dGVzCiAgZnJvbSB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gTWljaGFlbCBXYWxsbmVyIHJlcG9ydGVkIHRoYXQgdGhlIGRhdGUgcGFyc2VyIGhhZCB3cm9uZyBvZmZzZXQgc3RvcmVkIGZvcgogIHRoZSBNRVNUIGFuZCBDRVNUIHRpbWUgem9uZXMuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA1KQotIERhdmlkIFlhbiBmaWxlZCBidWcgIzEyOTkxODEgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyOTkxODEpCiAgdGhhdCBpZGVudGlmaWVkIGEgc2lsbHkgcHJvYmxlbSB3aXRoIENvbnRlbnQtUmFuZ2U6IGhlYWRlcnMgd2l0aCB0aGUgJ2J5dGVzJwogIGtleXdvcmQgd3JpdHRlbiBpbiBhIGRpZmZlcmVudCBjYXNlIHRoYW4gYWxsIGxvd2VyY2FzZSEgSXQgd291bGQgY2F1c2UgYQogIHNlZ2ZhdWx0IQoKLSBUSiBTYXVuZGVycyBvZiB0aGUgcHJvZnRwZCBwcm9qZWN0IGlkZW50aWZpZWQgYW5kIHBvaW50ZWQgb3V0IHByb2JsZW1zIHdpdGgKICB0aGUgbW9kaWZpZWQgRlRQUyBuZWdvdGlhdGlvbiBjaGFuZ2Ugb2YgQXVndXN0IDE5IDIwMDUuIFRodXMsIHdlIHJldmVydCB0aGUKICBjaGFuZ2UgYmFjayB0byBwcmUtNy4xNC4xIHN0YXR1cy4KCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDUpCi0gRml4ZWQgImN1dCBvZmYiIHNlbnRlbmNlIGluIHRoZSBsaWJjdXJsLXR1dG9yaWFsIG1hbiBwYWdlOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMDUKCi0gQ2xhcmlmaWVkIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHdoYXQgdGhlIGRlZmF1bHQKICBDVVJMT1BUX1dSSVRFRlVOQ1RJT04gYW5kIENVUkxPUFRfV1JJVEVEQVRBIG1lYW46CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMQoKLSBDbGFyaWZpZWQgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdGhhdCBDVVJMT1BUX0VSUk9SQlVGRkVSCiAgc29tZXRpbWVzIGRvZXNuJ3QgZmlsbCBpbiB0aGUgYnVmZmVyIGV2ZW4gdGhvdWdoIGl0IGlzIHN1cHBvc2VkIHRvOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMTMKCi0gV2hlbiBDVVJMRV9VUkxfTUFMRk9STUFUIGlzIHJldHVybmVkIGR1ZSB0byBhIG1pc3NpbmcgVVJMLCBpdCBub3cgaGFzIGFuCiAgZXJyb3Igc3RyaW5nIHNldC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDUpCi0gRG1pdHJ5IEJhcnRzZXZpY2ggbWFkZSB0aGUgU1NQSSBzdXBwb3J0IHdvcmsgb24gV2luZG93cyA5eCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwNSkKLSBBZGRlZCBhIFRGVFAgc2VydmVyIHRvIHRoZSB0ZXN0IHN1aXRlIGFuZCBtYWRlIHRoZSB0ZXN0IHN1aXRlIGNhcGFibGUgb2YKICB1c2luZyBpdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwNSkKLSBCZW4gTWFkc2VuJ3MgZGV0YWlsZWQgcmVwb3J0cyB0aGF0IGZ1bm5pbHkgZW5vdWdoIG9ubHkgb2NjdXJyZWQgd2l0aCBjZXJ0YWluCiAgZ2xpYmMgdmVyc2lvbnMgdHVybmVkIG91dCB0byBiZSBjdXJsIHVzaW5nIGFuIGFscmVhZHkgY2xvc2VkIGZpbGUgaGFuZGxlCiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucyAobGlrZSB3aGVuIHNhdmluZyBGVFAgc2VydmVyICJoZWFkZXJzIikuCgotIFNjb3R0IERhdmlzIGhlbHBlZCBtZSB0cmFjayBkb3duIGEgcHJvYmxlbSBpbiB0aGUgdGVzdCBIVFRQIHNlcnZlciB0aGF0IG1hZGUKICB0ZXN0IGNhc2UgNTYgd3JvbmdseSBmYWlsIGF0IHRpbWVzLiBJdCB0dXJuZWQgb3V0IGl0IHdhcyBkdWUgdG8gdGhlIHNlcnZlcgogIGZpbmRpbmcgdGhlIGVuZCBvZiBhIGNodW5rZWQtZW5jb2RlZCBQT1NUIHRvbyBlYXJseS4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwNSkKLSBOb3cgY3VybCB3YXJucyBpZiBhbiB1bmtub3duIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIC13Ly0td3JpdGVvdXQgYXJndW1lbnQuCgpEYW5pZWwgKDQgU2VwdGVtYmVyIDIwMDUpCi0gSSBhcHBsaWVkIE5pY29sYXMgRnJhbudvaXMnIG1hbiBwYWdlIHBhdGNoIGhlIHBvc3RlZCB0byB0aGUgRGViaWFuIGJ1ZwogIHRyYWNrZXIuIEl0IGNvcnJlY3RlZCB0d28gbGluZXMgdGhhdCBzdGFydGVkIHdpdGggYXBvc3Ryb3BoZXMsIHdoaWNoIGlzbid0CiAgbGVnYWwgbnJvZmYgZm9ybWF0LiBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI2NTExCgotIEFkZGVkIC0tZnRwLXNraXAtcGFzdi1pcCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wsIHRoYXQgc2V0cyB0aGUgbmV3CiAgQ1VSTE9QVF9GVFBfU0tJUF9QQVNWX0lQIG9wdGlvbi4gSXQgbWFrZXMgbGliY3VybCByZS11c2UgdGhlIGNvbnRyb2wKICBjb25uZWN0aW9uJ3MgSVAgYWRkcmVzcyB3aGVuIHNldHRpbmcgdXAgdGhlIGRhdGEgY29ubmVjdGlvbiBpbnN0ZWFkIG9mCiAgZXh0cmFjdHRpbmcgdGhlIElQIGFkZHJlc3MgZnJvbSB0aGUgUEFTViByZXNwb25zZS4gSXQgaGFzIHR1cm5lZCBvdXQgdGhpcwogIGZlYXR1cmUgaXMgZnJlcXVlbnRseSBuZWVkZWQgYnkgcGVvcGxlIHRvIGNpcmN1bXZlbnQgc2lsbHkgc2VydmVycyBhbmQgc2lsbHkKICBmaXJld2FsbHMsIGVzcGVjaWFsbHkgd2hlbiBGVFBTIGlzIHVzZWQgYW5kIHRoZSBQQVNWIGNvbW1hbmQtcmVzcG9uc2UgaXMKICBzZW50IGVuY3J0eXBlZC4KCiAgU3BvbnNvcmVkIGJ5IENVKkFuc3dlcnMKCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwNSkKLSBKb2huIEtlbGx5IGFkZGVkIFRGVFAgc3VwcG9ydCB0byBsaWJjdXJsLiBBIGJ1bmNoIG9mIG5ldyBlcnJvciBjb2RlcyB3YXMKICBhZGRlZC4gVE9ETzogYWRkIHRoZW0gdG8gZG9jcy4gYWRkIFRGVFAgc2VydmVyIHRvIHRlc3Qgc3VpdGUuIGFkZCBURlRQIHRvCiAgbGlzdCBvZiBwcm90b2NvbHMgd2hlcmVldmVyIHRob3NlIGFyZSBtZW50aW9uZWQuCgpWZXJzaW9uIDcuMTQuMSAoMSBTZXB0ZW1iZXIgMjAwNSkKCkRhbmllbCAoMjkgQXVndXN0IDIwMDUpCi0gS2V2aW4gTHVzc2llciBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsbGliLmRzcCBhbmQgaG93IHRvIGZpeCBpdC4KCi0gSWdvciBQb2x5YWtvdiBmaXhlZCBhIHJhdGhlciBuYXN0eSBwcm9ibGVtIHdpdGggdGhlIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIKICBmb3IgV2luZG93cywgdGhhdCBjb3VsZCBsZWFkIHRvIGFuIEFjY2VzcyBWaW9sYXRpb24gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgd2FzIHVzZWQgZHVlIHRvIGFuIGlzc3VlIHdpdGggaG93IHRoZSByZXNvbHZlciB0aHJlYWQgd2FzIGFuZCB3YXMgbm90CiAgdGVybWluYXRlZC4KCi0gU2ltb24gSm9zZWZzc29uIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFsbG93cyBjdXJsIHRvIGdldCBidWlsdCB0byB1c2UgR05VIEdTUwogIGluc3RlYWQgb2YgTUlUL0hlaW1kYWwgZm9yIEdTUyBjYXBhYmlsaXRpZXMuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA1KQotIFRvYnkgUGV0ZXJzb24gYWRkZWQgQ1VSTE9QVF9JR05PUkVfQ09OVEVOVF9MRU5HVEggdG8gdGhlIGxpYnJhcnksIGFjY2Vzc2libGUKICBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB3aXRoIC0taWdub3JlLWNvbnRlbnQtbGVuZ3RoLiBUaGlzIHdpbGwgbWFrZSBpdAogIGVhc2llciB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEFwYWNoZSAxLnggKGFuZCBzaW1pbGFyKSBzZXJ2ZXJzIHRoYXQgYXJlCiAgc3RpbGwgaGF2aW5nIHByb2JsZW1zIHNlcnZpbmcgZmlsZXMgbGFyZ2VyIHRoYW4gMiBvciA0IEdCLiBXaGVuIHRoaXMgb3B0aW9uCiAgaXMgZW5hYmxlZCwgY3VybCB3aWxsIHNpbXBseSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlCiAgY29ubmVjdGlvbiB0byBzaWduYWwgZW5kIG9mIHRyYW5zZmVyLiBJIHdyb3RlIHRlc3QgY2FzZSAyNjkgdGhhdCBydW5zIGEKICBzaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdvcmtzLgoKLSAoVHJ5aW5nIGhhcmQgdG8gZXhjbHVkZSBlbW90aW9ucyBub3cuKSB2YWxncmluZCB2ZXJzaW9uIDMgc3VkZGVubHkgcmVuYW1lZAogIHRoZSAtLWxvZ2ZpbGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byAtLWxvZy1maWxlLCBhbmQgdGh1cyB0aGUgdGVzdCBzY3JpcHQKICB2YWxncmluZCBhdXRvZGV0ZWN0aW9uIG5vdyBoYXMgeWV0IGFub3RoZXIgdmVyc2lvbiBjaGVjayB0byBkbyBhbmQgdGhlbiBpdAogIGFsdGVycyB0aGUgdmFsZ3JpbmQgY29tbWFuZCBsaW5lIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBDQSBjZXJ0IHZlcmlmaWNhdGlvbiB1c2luZyBHbnVUTFMgd2l0aCB0aGUgZGVmYXVsdCBidW5kbGUsIHdoaWNoCiAgcHJldmlvdXNseSBmYWlsZWQgZHVlIHRvIEdudVRMUyBub3QgYWxsb3dpbmcgeDUwOSB2MSBDQSBjZXJ0cyBieSBkZWZhdWx0LgogIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkLgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwNSkKLSBOb3JiZXJ0IE5vdm90bnkgaGFkIHByb2JsZW1zIHdpdGggRlRQUyBhbmQgaGUgaGVscGVkIG1lIHdvcmsgb3V0IGEgcGF0Y2gKICB0aGF0IG1hZGUgY3VybCBydW4gZmluZSBpbiBoaXMgZW5kLiBUaGUga2V5IHdhcyB0byBtYWtlIHN1cmUgd2UgZG8gdGhlCiAgU1NML1RMUyBuZWdvdGlhdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgVENQIGNvbm5lY3QgaXMgZG9uZSBhbmQgbm90IGFmdGVyCiAgYSBmZXcgb3RoZXIgY29tbWFuZHMgaGF2ZSBiZWVuIHNlbnQgbGlrZSB3ZSBkaWQgcHJldmlvdXNseS4gSSBkb24ndCBjb25zaWRlcgogIHRoaXMgY2hhbmdlIG5lY2Vzc2FyeSB0byBvYmV5IHRoZSBzdGFuZGFyZHMsIEkgdGhpbmsgdGhpcyBzZXJ2ZXIgaXMgcGlja2llcgogIHRoYW4gd2hhdCB0aGUgc3BlY3MgYWxsb3cgaXQgdG8gYmUsIGJ1dCBJIGNhbid0IHNlZSBob3cgdGhpcyBtb2RpZmllZAogIGxpYmN1cmwgY29kZSBjYW4gYWRkIGFueSBwcm9ibGVtcyB0byB0aG9zZSB3aG8gYXJlIGludGVycHJldGluZyB0aGUKICBzdGFuZGFyZHMgbW9yZSBsaWJlcmFsbHkuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA1KQotIEplZmYgUG9obG1leWVyIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBhc2sgbGliY3VybCB0byBsb2FkIGEgY29va2llZmlsZSAod2l0aAogIENVUkxPUFRfQ09PS0lFRklMRSksIGFkZCBhIGNvb2tpZSAod2l0aCBDVVJMT1BUX0NPT0tJRUxJU1QpLCB0ZWxsIGl0IHRvCiAgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGdpdmVuIGNvb2tpZSBqYXIgYW5kIHRoZW4gbmV2ZXIgYWN0dWFsbHkgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkgLSB0aGUgZ2l2ZW4gZmlsZShzKSB0byByZWFkIHdhcyBuZXZlciByZWFkIGJ1dCB0aGUKICBvdXRwdXQgZmlsZSB3YXMgd3JpdHRlbiBhbmQgdGh1cyBpdCBjYXVzZWQgYSAiZnVubnkiIHJlc3VsdC4KCi0gV2hpbGUgZG9pbmcgc29tZSB0ZXN0cyBmb3IgdGhlIGJ1ZyBhYm92ZSwgSSBub3RpY2VkIHRoYXQgRmlyZWZveCBnZW5lcmF0ZXMKICBsYXJnZSBudW1iZXJzIChmb3IgdGhlIGV4cGlyZSB0aW1lKSBpbiB0aGUgY29va2llcy50eHQgZmlsZSBhbmQgbGliY3VybAogIGRpZG4ndCB0cmVhdCB0aGVtIHByb3Blcmx5LiBOb3cgaXQgZG9lcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDUpCi0gQWRkZWQgbW9yZSB2ZXJib3NlICJ3YXJuaW5nIiBtZXNzYWdlcyB0byB0aGUgY3VybCBjbGllbnQgZm9yIGNhc2VzIHdoZXJlIGl0CiAgZmFpbHMgdG8gb3Blbi9yZWFkIGZpbGVzIGV0YyB0byBoZWxwIHVzZXJzIGRpYWdub3NlIHdoeSBpdCBkb2Vzbid0IGRvIHdoYXQKICB5b3UnZCBleHBlY3QgaXQgdG8uIENvbnZlcnRlZCBsb3RzIG9mIG9sZCBtZXNzYWdlcyB0byB1c2UgdGhlIG5ldyBnZW5lcmljCiAgZnVuY3Rpb24gSSB3cm90ZSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwNSkKLSBKYW1lcyBCdXJzYSBpZGVudGlmaWVkIGEgbGliY3VybCBIVFRQIGJ1ZyBhbmQgYSBnb29kIHdheSB0byByZXBlYXQgaXQuIElmIGEKICBzaXRlIHJlc3BvbmRzIHdpdGggYmFkIEhUVFAgcmVzcG9uc2UgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IGhlYWRlciBhdCBhbGwsCiAgb25seSBhIHJlc3BvbnNlIGJvZHksIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2sgcmV0dXJucyAwIHRvIGFib3J0IHRoZQogIHRyYW5zZmVyLCBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVhbCBlZmZlY3QgYnV0IHRoZSB3cml0ZSBjYWxsYmFjayB3b3VsZCBiZQogIGNhbGxlZCBvbmNlIG1vcmUgYW55d2F5LgoKRGFuaWVsICgxMiBBdWd1c3QgMjAwNSkKLSBCYXNlZCBvbiBSaWNoYXJkIENsYXl0b24ncyByZXBvcnRzLCBJIGZvdW5kIG91dCB0aGF0IHVzaW5nIGN1cmwgLWQgQGZpbGVuYW1lCiAgd2hlbiAnZmlsZW5hbWUnIHdhcyBub3QgcG9zc2libGUgdG8gYWNjZXNzIG1hZGUgY3VybCB1c2UgYSBHRVQgcmVxdWVzdAogIGluc3RlYWQuCgotIFRoZSB0aW1lIGNvbmRpdGlvbiBpbGxlZ2FsIHN5bnRheCB3YXJuaW5nIGlzIG5vdyBpbmhpYml0ZWQgaWYgLXMgaXMgdXNlZC4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDUpCi0gTWFyaW8gU2Nocm9lZGVyIGZvdW5kIG91dCB0aGF0IG9uZSBvZiB0aGUgZGVidWcgY2FsbGJhY2tzIGNhbGxzIHRoYXQgcmVnYXJkcwogIFNTTCBkYXRhIHdpdGggdGhlIENVUkxJTkZPX1RFWFQgdHlwZSBjbGFpbWVkIHRoYXQgdGhlIGRhdGEgd2FzIG9uZSBieXRlCiAgbGFyZ2VyIHRoYW4gaXQgYWN0dWFsbHkgaXMsIHRodXMgZmFsc2VseSB0ZWxsaW5nIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQogIHRlcm1pbmF0aW5nIHplcm8gd2FzIHBhcnQgb2YgdGhlIGRhdGEuCgpEYW5pZWwgKDkgQXVndXN0IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIHRoZSBvZmZzZXRzIHVzZWQgZm9yIGRhdGUgcGFyc2luZ3Mgd2hlbiB0aGUgdGltZQogIHpvbmUgbmFtZSBvZiBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB3YXMgdXNlZC4gRm9yIGV4YW1wbGUsIFBEVCB2cyBQRFMuIFRoaXMKICBmbGF3IHdhcyBpbnRyb2R1Y2VkIHdpdGggdGhlIG5ldyBkYXRlIHBhcnNlciAoMTEgc2VwIDIwMDQgLSA3LjEyLjIpLgogIEZvcnR1bmF0ZWx5LCBubyB3ZWIgc2VydmVyIG9yIGNvb2tpZSBzdHJpbmcgZXRjIHNob3VsZCBiZSB1c2luZyBzdWNoIHRpbWUKICB6b25lIG5hbWVzIHRodXMgbGltaXRpbmcgdGhlIGVmZmVjdCBvZiB0aGlzIGJ1Zy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNSkKLSBKb24gR3J1YmJzIGZpbGVkIGJ1ZyByZXBvcnQgIzEyNDk5NjIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI0OTk2Mikgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIE5UTE0gb24gYSBIVFRQIHByb3h5IGlmIGFuIEZUUCBVUkwgd2FzIGdpdmVuLiBsaWJjdXJsIG5vdyBwcm9wZXJseQogIHN3aXRjaGVzIHRvIHB1cmUgSFRUUCBpbnRlcm5hbGx5IHdoZW4gYW4gSFRUUCBwcm94eSBpcyB1c2VkLCBldmVuIGZvciBGVFAKICBVUkxzLiBUaGUgcHJvYmxlbSB3b3VsZCBhbHNvIG9jY3VyIHdpdGggb3RoZXIgbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDUpCi0gV2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTLCBjdXJsLWNvbmZpZyBkaWRuJ3QgaW5jbHVkZSAiU1NMIiB3aGVuCiAgLS1mZWF0dXJlcyB3YXMgdXNlZC4KCkRhbmllbCAoMjggSnVseSAyMDA1KQotIElmIGFueSBvZiB0aGUgb3B0aW9ucyBDVVJMT1BUX0hUVFBHRVQsIENVUkxPUFRfUE9TVCBhbmQgQ1VSTE9QVF9IVFRQUE9TVCBpcwogIHNldCB0byAxLCBDVVJMT1BUX05PQk9EWSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byAwLgoKRGFuaWVsICgyNyBKdWx5IDIwMDUpCi0gRGFuIEZhbmRyaWNoIGNoYW5nZXMgb3ZlciB0aGUgbGFzdCB3ZWVrOiBmaXhlZCBudW1lcm91cyBtaW5vciBjb25maWd1cmUKICBvcHRpb24gcGFyc2luZyBmbGF3czogLS13aXRob3V0LWdudXRscywgLS13aXRob3V0LXNwbmVnbyAtLXdpdGhvdXQtZ3NzYXBpCiAgYW5kIC0td2l0aG91dC1rcmI0LiBTcGVsbGZpeGVkIHNldmVyYWwgZXJyb3IgbWVzc2FnZXMuCgotIFBldGVyaXMgS3J1bWlucyBhZGRlZCBDVVJMT1BUX0NPT0tJRUxJU1QgYW5kIENVUkxJTkZPX0NPT0tJRUxJU1QsIHdoaWNoIGlzIGEKICBzaW1wbGUgaW50ZXJmYWNlIHRvIGV4dHJhY3RpbmcgYW5kIHNldHRpbmcgY29va2llcyBpbiBsaWJjdXJsJ3MgaW50ZXJuYWwKICAiY29va2llIGphciIuIFNlZSB0aGUgbmV3IGNvb2tpZV9pbnRlcmZhY2UuYyBleGFtcGxlIGNvZGUuCgpEYW5pZWwgKDEzIEp1bHkgMjAwNSkKLSBEaWVnbyBDYXNvcnJhbiBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIEFtaWdhIGFnYWluLgoKRGFuaWVsICgxMiBKdWx5IDIwMDUpCi0gQWRyaWFuIFNjaHV1ciBhZGRlZCB0cmFpbGVyIHN1cHBvcnQgaW4gdGhlIGNodW5rZWQgZW5jb2Rpbmcgc3RyZWFtLiBUaGUKICB0cmFpbGVyIGlzIHRoZW4gc2VudCB0byB0aGUgbm9ybWFsIGhlYWRlciBjYWxsYmFjay9zdHJlYW0uIEkgd3JvdGUgdXAgdGVzdAogIGNhc2UgMjY2IHRvIHZlcmlmeSB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eS4gRG8gbm90ZSB0aGF0IHRlc3QgY2FzZSAzNAogIGNvbnRhaW5zIGEgZmxhd2VkIGNodW5rZWQgZW5jb2Rpbmcgc3RyZWFtIHRoYXQgc3RpbGwgd29ya3MgdGhlIHNhbWUuCgpEYW5pZWwgKDUgSnVseSAyMDA1KQotIEdpc2xlIFZhbmVtIGNhbWUgdXAgd2l0aCBhIG5pY2UgbGl0dGxlIHdvcmstYXJvdW5kIGZvciBidWcgIzEyMzAxMTgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIzMDExOCkuIEl0IHNlZW1zIHRoZSBXaW5kb3dzIChNU1ZDKQogIGxpYmMgdGltZSBmdW5jdGlvbnMgbWF5IHJldHVybiBkYXRhIG9uZSBob3VyIG9mZiBpZiBUWiBpcyBub3Qgc2V0IGFuZAogIGF1dG9tYXRpYyBEU1QgYWRqdXN0bWVudCBpcyBlbmFibGVkLiBUaGlzIG1hZGUgY3VybF9nZXRkYXRlKCkgcmV0dXJuIHdyb25nCiAgdmFsdWUsIGFuZCBpdCBhbHNvIGNvbmNlcm5lZCBpbnRlcm5hbCBjb29raWUgZXhwaXJhdGlvbnMgZXRjLgoKRGFuaWVsICg0IEp1bHkgMjAwNSkKLSBBbmRyZXcgQnVzaG5lbGwgcHJvdmlkZWQgZW5vdWdoIGluZm8gZm9yIG1lIHRvIHRlbGwgdGhhdCB3ZSBiYWRseSBuZWVkZWQgdG8KICBmaXggdGhlIENPTk5FQ1QgYXV0aGVudGljYXRpb24gY29kZSB3aXRoIG11bHRpLXBhc3MgYXV0aCBtZXRob2RzIChzdWNoIGFzCiAgTlRMTSkgYXMgaXQgZGlkbid0IHByZXZpb3VzbHkgcHJvcGVybHkgaWdub3JlIHJlc3BvbnNlLWJvZGllcyAtIGluIGZhY3QgaXQKICBzdG9wcGVkIHJlYWRpbmcgYWZ0ZXIgYWxsIHJlc3BvbnNlIGhlYWRlcnMgaGFkIGJlZW4gcmVjZWl2ZWQuIFRoaXMgY291bGQKICBsZWFkIHRvIGxpYmN1cmwgc2VuZGluZyB0aGUgbmV4dCByZXF1ZXN0IGFuZCByZWFkaW5nIHRoZSBib2R5IGZyb20gdGhlIGZpcnN0CiAgcmVxdWVzdCBhcyByZXNwb25zZSB0byB0aGUgc2Vjb25kIHJlcXVlc3QuIChJIGFsc28gcmVuYW1lZCB0aGUgZnVuY3Rpb24sCiAgd2hpY2ggd2Fzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSBidXQuLi4pCgogIFRoZSBiZXN0IGZpeCB3b3VsZCB0byBvbmNlIGFuZCBmb3IgYWxsIG1ha2UgdGhlIENPTk5FQ1QgY29kZSB1c2UgdGhlCiAgb3JkaW5hcnkgcmVxdWVzdCBzZW5kaW5nL3JlY2VpdmluZyBjb2RlLCB0cmVhdGluZyBpdCBhcyBhbnkgb3JkaW5hcnkgcmVxdWVzdAogIGluc3RlYWQgb2YgdGhlIHNwZWNpYWwtcHVycG9zZSBmdW5jdGlvbiB3ZSBoYXZlIG5vdy4gSXQgc2hvdWxkIG1ha2UgaXQKICBiZXR0ZXIgZm9yIG11bHRpLWludGVyZmFjZSB0b28uIEFuZCBwb3NzaWJseSBsZWFkIHRvIGxlc3MgY29kZS4uLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjY1IGZvciB0aGlzLiBJdCBkb2Vzbid0IHdvcmsgYXMgYSBfcmVhbGx5XyBnb29kIHRlc3QgY2FzZQogIHNpbmNlIHRoZSB0ZXN0IHByb3h5IGlzIHRvbyBzdHVwaWQsIGJ1dCB0aGUgdGVzdCBjYXNlIGhlbHBzIHdoZW4gcnVubmluZyB0aGUKICBkZWJ1Z2dlciB0byB2ZXJpZnkuCgpEYW5pZWwgKDMwIEp1bmUgMjAwNSkKLSBEYW4gRmFuZHJpY2ggaW1wcm92ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQncyBhYmlsaXR5IHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kCiAgb2Ygc3RyZXJyb3JfcigpIEFQSSB0aGF0IGlzIHVzZWQgd2hlbiBjcm9zcy1jb21waWxpbmcuIElmIF9fR0xJQl9fIGlzCiAgZGVmaW5lZCwgaXQgYXNzdW1lcyB0aGUgZ2xpYmMgQVBJLiBJZiBub3QsIGl0IGlzc3VlcyBhIG5vdGljZSBhcyBiZWZvcmUgdGhhdAogIHRoZSB1c2VyIG5lZWRzIHRvIG1hbnVhbGx5IGVkaXQgbGliL2NvbmZpZy5oIGZvciB0aGlzLgoKRGFuaWVsICgyMyBKdW5lIDIwMDUpCi0gRGF2aWQgU2hhdydzIGZpeCB0aGF0IHVuaWZpZXMgcHJveHkgc3RyaW5nIHRyZWF0bWVudCBzbyB0aGF0IGEgcHJveHkgZ2l2ZW4KICB3aXRoIENVUkxPUFRfUFJPWFkgY2FuIHVzZSBhIGh0dHA6Ly8gcHJlZml4IGFuZCB1c2VyICsgcGFzc3dvcmQuIFRoZSB1c2VyCiAgYW5kIHBhc3N3b3JkIGZpZWxkcyBhcmUgbm93IGFsc28gVVJMIGRlY29kZWQgcHJvcGVybHkuIFRlc3QgY2FzZSAyNjQgYWRkZWQKICB0byB2ZXJpZnkuCgpEYW5pZWwgKDIyIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3IHVwZGF0ZWQgbGliY3VybC5tNAoKRGFuaWVsICgxNCBKdW5lIDIwMDUpCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBwb3RlbnRpYWwgdGhyZWFkIGhhbmRsZSBsZWFrLiBCdWcgcmVwb3J0ICMxMjE2NTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTY1MDApLiAgQ29tbWVudCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNi8wMDU5Lmh0bWwKCkRhbmllbCAoMTMgSnVuZSAyMDA1KQotIE1hZGUgYnVpbGRjb25mIHJ1biBsaWJ0b29saXplIGluIHRoZSBhcmVzIGRpciB0b28gKGluc3BpcmVkIGJ5IFR1cG9uZSdzCiAgcmV2ZXJ0ZWQgcGF0Y2gpLgoKRGFuaWVsICg5IEp1bmUgMjAwNSkKLSBJbmNvcnBvcmF0ZWQgVHVwb25lJ3MgZmluZHRvb2wgZml4IGluIGJ1aWxkY29uZiAoc2xpZ2h0bHkgZWRpdGVkKQoKLSBJbmNvcnBvcmF0ZWQgVHVwb25lJ3MgaGVhZCAtbiBmaXggaW4gYnVpbGRjb25mLgoKRGFuaWVsICg4IEp1bmUgMjAwNSkKLSBSZXZlcnRlZCBUdXBvbmUncyBwYXRjaCBhZ2FpbiwgaXQgYnJva2UgbnVtZXJvdXMgYXV0b2J1aWxkcy4gTGV0J3MgYXBwbHkgaXQKICBpbiBwaWVjZXMsIG9uZSBieSBvbmUgYW5kIHNlZSB3aGF0IHdlIG5lZWQgdG8gYWRqdXN0IHRvIHdvcmsgYWxsIG92ZXIuCgpEYW5pZWwgKDYgSnVuZSAyMDA1KQotIFR1cG9uZSBBbGZyZWRvIGZpeGVkIHRocmVlIHByb2JsZW1zIGluIGJ1aWxkY29uZjoKCiAgMSkgZmluZHRvb2wgZG9lcyBsb29rIHBlciB0b29sIGluIFBBVEggYW5kIHRoaW5rIC4vcGVybCBpcyB0aGUgcGVybAogIGV4ZWN1dGFibGUsIHdoaWxlIGlzIGp1c3QgYSBsb2NhbCBkaXJlY3RvcnkgKEkgaGF2ZSAuIGluIHRoZSBQQVRIKQoKICAyKSBJIGdvdCBzZXZlcmFsIHdhcm5pbmcgZm9yIGhlYWQgLTEgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaGVhZCAtbiAxCiAKICAzKSBhcmVzIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHNvbWUgZmlsZSAobWlzc2luZyBpcyBtaXNzaW5nIDotKSApIGJlY2F1c2UKICBhdXRvbWFrZSBhbmQgZnJpZW5kcyBpcyBub3QgcnVuLgoKRGFuaWVsICgzIEp1bmUgMjAwNSkKLSBBZGRlZCBkb2NzL2xpYmN1cmwvZ2V0aW5mby10aW1lcywgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSAnRWRpJzoKICBodHRwOi8vY3VybC5oYXh4LnNlL2ZlZWRiYWNrL2Rpc3BsYXkuY2dpP2lkPTExMTc4MzI1Nzk4Mjk5JnN1cHBvcnQ9eWVzCgotIEFuZHJlcyBHYXJjaWEgcHJvdmlkZWQgeWV0IGFub3RoZXIgdGV4dCBtb2RlIHBhdGNoIGZvciBzZXZlcmFsIHRlc3QgY2FzZXMgc28KICB0aGF0IHRoZXkgZG8gdGV4dCBjb21wYXJpc2lvbnMgYmV0dGVyIG9uIFdpbmRvd3MgKG5ld2xpbmUtd2lzZSkuCgpEYW5pZWwgKDEgSnVuZSAyMDA1KQotIFRoZSBjb25maWd1cmUgY2hlY2sgZm9yIGMtYXJlcyBub3cgYWRkcyB0aGUgY2FyZXMgbGliIGJlZm9yZSB0aGUgb3RoZXIgbGlicywKICB0byBtYWtlIGl0IGJ1aWxkIGZpbmUgd2l0aCBtaW5ndy4gSW5zcGlyZWQgYnkgVHVwb25lIEFsZnJlZG8ncyBidWcgcmVwb3J0CiAgYW5kIHBhdGNoOiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjEyOTQwCgpEYW5pZWwgKDMxIE1heSAyMDA1KQotIFRvZGQgS3VsZXN6YSByZXBvcnRlZCBhIGZsYXcgaW4gdGhlIHByb3h5IG9wdGlvbiwgc2luY2UgYSBudW1lcmljYWwgSVB2NgogIGFkZHJlc3Mgd2FzIG5vdCBwb3NzaWJsZSB0byB1c2UuIEl0IGlzIG5vdywgYnV0IHJlcXVpcmVzIGl0IHdyaXR0ZW4KICBSRkMyNzMyLXN0eWxlLCB3aXRoaW4gYnJhY2tldHMgLSB3aGljaCBpbmNpZGVudGx5IGlzIGhvdyB5b3UgZW50ZXIgbnVtZXJpY2FsCiAgSVB2NiBhZGRyZXNzZXMgaW4gVVJMcy4gVGVzdCBjYXNlIDI2MyBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDMwIE1heSAyMDA1KQotIEVyaWMgQ29vcGVyIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSB3aXRoIEhUVFAgc2VydmVycyB0aGF0IHJlc3BvbmRzIHdpdGgKICBiaW5hcnkgemVyb2VzIHdpdGhpbiB0aGUgaGVhZGVycy4gVGhleSBjb25mdXNlZCBsaWJjdXJsIHRvIGRvIHdyb25nIHNvIHRoZQogIGRvd25sb2FkZWQgaGVhZGVycyBiZWNvbWUgaW5jb21wbGV0ZS4gVGhlIGZpeCBpcyBub3cgdmVyaWZpZWQgd2l0aCB0ZXN0IGNhc2UKICAyNjIuIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMTA5NDgKCkRhbmllbCAoMjUgTWF5IDIwMDUpCi0gRml4ZWQgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdCBzdWl0ZSwgYW5kIGluIHBhcnRpY3VsYXIgdGhlIEZUUCB0ZXN0IGNhc2VzCiAgc2luY2UgaXQgcHJldmlvdXNseSB3YXMgZmFpbGluZyBldmVyeSBub3cgYW5kIHRoZW4gaW4gYSBub25zZW5zZSBtYW5uZXIuCgotIC0tdHJhY2UtdGltZSBub3cgb3V0cHV0cyB0aGUgZnVsbCBtaWNyb3NlY29uZCwgYWxsIDYgZGlnaXRzLgoKRGFuaWVsICgyNCBNYXkgMjAwNSkKLSBBbmRyZXMgR2FyY2lhIHByb3ZpZGVkIGEgdGV4dCBtb2RlIHBhdGNoIGZvciBzZXZlcmFsIHRlc3QgY2FzZXMgc28gdGhhdCB0aGV5CiAgZG8gdGV4dCBjb21wYXJpc2lvbnMgYmV0dGVyIG9uIFdpbmRvd3MgKG5ld2xpbmUtd2lzZSkuCgotIEFueSAyeHggcmVzcG9uc2UgKGFuZCBub3QganVzdCAyMDApIGlzIG5vdyBjb25zaWRlcmVkIGEgZmluZSByZXNwb25zZSB0bwogIFRZUEUsIGFzIHNvbWUgc2VydmVycyBvYnZpb3VzbHkgc2VuZHMgYSAyMjYgdGhlcmUuIEFkZGVkIHRlc3QgY2FzZSAyNjEgdG8KICB2ZXJpZnkuIEJhc2VkIG9uIGEgcXVlc3Rpb24vcmVwb3J0IGJ5IEdlb3JnIFdpY2hlcnNraS4KCkRhbmllbCAoMjAgTWF5IDIwMDUpCi0gSW1wcm92ZWQgcnVudGVzdHMucGwgdG8gYWxsb3cgc3Rkb3V0IHRlc3RzIHRvIGJlIG1vZGU9dGV4dCBhcyB3ZWxsLCBqdXN0CiAgYXMgZmlsZSBjb21wYXJpc29ucyBhbHJlYWR5IHN1cHBvcnRzLiBBZGRlZCB0aGlzIGluZm8gdG8gdGhlIEZJTEVGT1JNQVQKICBkb2NzLgoKRGFuaWVsICgxOCBNYXkgMjAwNSkKLSBKb2huIE1jR293YW4gaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMTIwNDQzNQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjA0NDM1KSB3aXRoIG1hbGZvcm1lZCBVUkxzIGxpa2UKICAiaHR0cDovL3NvbWVob3N0P2RhdGEiIGFzIGl0IGFkZGVkIGEgc2xhc2ggdG9vIG11Y2ggaW4gdGhlIHJlcXVlc3QgKCJHRVQKICAvP2RhdGEvIi4uLikuIEFkZGVkIHRlc3QgY2FzZSAyNjAgdG8gdmVyaWZ5LgoKLSBUaGUgY29uZmlndXJlIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgZmFpbGVkIHRvIGRldGVjdCB0aGUgcHJvcGVyIEFQSSBhdAogIHRpbWVzLCBsaWtlIG9uIEhQLVVYIDEwLjIwLiBUaGVuIGxpYi9zdHJlcnJvci5jIGJhZGx5IGFzc3VtZWQgdGhlIGdsaWJjCiAgdmVyc2lvbiBpZiB0aGUgcG9zaXggZGVmaW5lIHdhc24ndCBzZXQgKHNpbmNlIGl0IF9oYWRfIGZvdW5kIGEgc3RyZXJyb3JfcikuCgpEYW5pZWwgKDE2IE1heSAyMDA1KQotIFRoZSBnbXRpbWVfcigpIGZ1bmN0aW9uIGluIEhQLVVYIDEwLjIwIGlzIGJyb2tlbi4gQWJvdXQgMTMgdGVzdCBjYXNlcyBmYWlsCiAgZHVlIHRvIHRoaXMuIFRoZXJlJ3Mgbm93IGEgY29uZmlndXJlIGNoZWNrIHRoYXQgYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoZSBiYWQKICBmdW5jdGlvbiBhbmQgbm90IHVzZSBpdCBvbiBzdWNoIHN5c3RlbXMuCgpWZXJzaW9uIDcuMTQuMCAoMTYgTWF5IDIwMDUpCgpEYW5pZWwgKDEzIE1heSAyMDA1KQotIEdyaWdvcnkgRW50aW4gcmVwb3J0ZWQgdGhhdCBjdXJsJ3MgY29uZmlndXJlIGRldGVjdHMgYSBmaW5lIHBvbGwoKSBmb3IgTWFjCiAgT1MgWCAxMC40ICh3aGlsZSAxMC4zIG9yIGxhdGVyIGRldGVjdGVkIGEgImJhZCIgb25lKSwgYnV0IHRoZSBleGVjdXRhYmxlCiAgZG9lc24ndCB3b3JrIGFzIGdvb2QgYXMgaWYgYnVpbHQgd2l0aG91dCBwb2xsKCkuIEkndmUgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZQogIHRvIGFsd2F5cyBza2lwIHRoZSBmaW5lLXBvbGwoKSB0ZXN0IG9uIE1hYyBPUyBYIChkYXJ3aW4pLgoKRGFuaWVsICgxMiBNYXkgMjAwNSkKLSBXaGVuIGRvaW5nIGEgc2Vjb25kIHJlcXVlc3QgKGFmdGVyIGEgZGlzY29ubmVjdCkgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUsCiAgb3ZlciBhIHByb3h5IHRoYXQgdXNlcyBOVExNIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIGZhaWxlZCB0byB1c2UgTlRMTSBhZ2FpbgogIHByb3Blcmx5ICh0aGUgYXV0aCBtZXRob2Qgd2FzIGFjY2lkZW50YWxseSByZXNldCB0byB0aGUgc2FtZSBhcyBoYWQgYmVlbiBzZXQKICBmb3IgaG9zdCBhdXRoLCB3aGljaCBkZWZhdWx0cyB0byBCYXNpYykuIEJ1ZyByZXBvcnQgIzEyMDA2NjEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIwMDY2MSkgaWRlbnRpZmllZCB0aGUgdGhlIHByb2JsZW0gYW5kCiAgdGhlIGZpeC4KCi0gSWYgLXovLS10aW1lLWNvbmQgaXMgdXNlZCB3aXRoIGFuIGludmFsaWQgZGF0ZSBzeW50YXgsIHRoaXMgaXMgbm8gbG9uZ2VyCiAgc2lsZW50bHkgZGlzY2FyZGVkLiBJbnN0ZWFkIGEgcHJvcGVyIHdhcm5pbmcgbWVzc2FnZSBpcyBkaXBsYXllZCB0aGF0CiAgaW5mb3JtcyBhYm91dCBpdC4gQnV0IGl0IHN0aWxsIGNvbnRpbnVlcyB3aXRob3V0IHRoZSBjb25kaXRpb24uCgpWZXJzaW9uIDcuMTQuMC1wcmUyICgxMSBNYXkgMjAwNSkKCkRhbmllbCAoMTEgTWF5IDIwMDUpCi0gU3RhcnRpbmcgbm93LCBsaWJjdXJsIHNlbmRzIGEgbGl0dGxlIGRpZmZlcmVudCBzZXQgb2YgaGVhZGVycyBpbiBpdHMgZGVmYXVsdAogIEhUVFAgcmVxdWVzdHM6CiAgCiAgQSkgTm9ybWFsIG5vbi1wcm94eSBIVFRQOgogICAgLSBubyBtb3JlICJQcmFnbWE6IG5vLWNhY2hlIiAodGhpcyBvbmx5IG1ha2VzIHNlbnNlIHRvIHByb3hpZXMpCgogIEIpIE5vbi1DT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiUHJhZ21hOiBuby1jYWNoZSIgaXMgdXNlZCAobGlrZSBiZWZvcmUpCiAgICAtICJQcm94eS1Db25uZWN0aW9uOiBLZWVwLWFsaXZlIiAoZm9yIG9sZGVyIHN0eWxlIDEuMC1wcm94aWVzKQoKICBDKSBDT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiSG9zdDogW25hbWVdOltwb3J0XSIKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiCgogIFRoZSBBKSBjYXNlIGlzIG1vc3RseSB0byByZWR1Y2UgdGhlIGRlZmF1bHQgaGVhZGVyIHNpemUgYW5kIHJlbW92ZSBhCiAgcG9pbnRsZXNzIGhlYWRlci4KCiAgVGhlIEIpIGlzIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggSFRUUCAxLjAgcHJveGllcwoKICBUaGUgQykgaGVhZGVycyBhcmUgYm90aCB0byBhZGRyZXNzIChyYXJlKSBwcm9ibGVtcyB3aXRoIHNvbWUgcHJveGllcy4gVGhlCiAgY29kZSBpbiBsaWJjdXJsIHRoYXQgZGVhbHMgd2l0aCBDT05ORUNUIHJlcXVlc3RzIG5lZWQgYSByZXdyaXRlLCBidXQgaXQKICBmZWVscyBsaWtlIGEgdG9vIGJpZyBhIGpvYiBmb3IgbWUgdG8gZG8gbm93LiBEZXRhaWxzIGFyZSBhZGRlZCBpbiB0aGUgY29kZQogIGNvbW1lbnRzIGZvciBub3cuCgogIFVwZGF0ZWQgYSBsYXJnZSBhbW91bnQgb2YgdGVzdCBjYXNlcyB0byByZWZsZWN0IHRoZSBuZXdzLgoKRGFuaWVsICgxMCBNYXkgMjAwNSkKLSBIYWxmLWJha2VkIGF0dGVtcHQgdG8gYmFpbCBvdXQgaWYgc2VsZWN0KCkgcmV0dXJucyBfb25seV8gZXJyb3JmZHMgd2hlbiB0aGUKICB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4gQW4gYXR0ZW1wdCB0byBmaXggQWxsYW4ncyBwcm9ibGVtLiBTZWUKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDUvMDA3My5odG1sIGFuZCB0aGUgcmVzdCBvZiB0aGF0IHRocmVhZAogIGZvciBkZXRhaWxzLgoKICBJJ20gc3RpbGwgbm90IHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgZml4LCBidXQuLi4KClZlcnNpb24gNy4xNC4wLXByZTEgKDkgTWF5IDIwMDUpCgpEYW5pZWwgKDIgTWF5IDIwMDUpCi0gU29ydCBvZiAiZml4ZWQiIEtOT1dOX0JVR1MgIzQ6IGN1cmwgbm93IGJ1aWxkcyBJUHY2IGVuYWJsZWQgb24gQUlYIDQuMy4gQXQKICBsZWFzdCBpdCBzaG91bGQgbm8gbG9uZ2VyIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGhhdmUKICBBSV9OVU1FUklDSE9TVCBzbyB3ZSBjYW5ub3QgZ2V0YWRkcmluZm8oKSBhbnkgbnVtZXJpY2FsIGFkZHJlc3NlcyB3aXRoIGl0CiAgKHdlIHVzZSB0aGF0IGZvciBGVFAgUE9SVC9FUFJUKSEgU28sIEkgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHRoZSBnZXRhZGRyaW5mbygpIGlzIHdvcmtpbmcsIHRvIHVzZSBBSV9OVU1FUklDSE9TVCBzaW5jZSB0aGVuCiAgaXQnbGwgZmFpbCBvbiBBSVggNC4zIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQKICBkaXNhYmxlZC4KCi0gQWRkZWQgLS10cmFjZS10aW1lIHRoYXQgd2hlbiB1c2VkIGFkZHMgYSB0aW1lIHN0YW1wIHRvIGVhY2ggdHJhY2UgbGluZSB0aGF0CiAgLS10cmFjZSwgLS10cmFjZS1hc2NpaSBhbmQgLS12ZXJib3NlIG91dHB1dC4gSSBhbHNvIG1hZGUgdGhlICc+JyBkaXNwbGF5CiAgc2VwYXJhdGUgZWFjaCBsaW5lIG9uIHRoZSBsaW5lZmVlZCBzbyB0aGF0IEhUVFAgcmVxdWVzdHMgZXRjIGxvb2sgbmljZXIgaW4KICB0aGUgLXYgb3V0cHV0LgoKLSBNYWRlIGN1cmwgcmVjb2duaXplIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgTHlueCAoYW5kIG90aGVycz8pIHN1cHBvcnQgZm9yCiAgcG9pbnRpbmcgb3V0IHRoZSBDQSBjZXJ0IHBhdGgvZmlsZTogU1NMX0NFUlRfRElSIGFuZCBTU0xfQ0VSVF9GSUxFLiBJZgogIENVUkxfQ0FfQlVORExFIGlzIG5vdCBzZXQsIHRoZXkgYXJlIGNoZWNrZWQgYWZ0ZXJ3YXJkcy4KCiAgTGlrZSBiZWZvcmU6IG9uIHdpbmRvd3MgaWYgbm9uZSBvZiB0aGVzZSBhcmUgc2V0LCBpdCBjaGVja3MgZm9yIHRoZSBjYSBjZXJ0CiAgZmlsZSBsaWtlIHRoaXM6CgogIDEuIGFwcGxpY2F0aW9uJ3MgZGlyZWN0b3J5CiAgMi4gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogIDMuIFdpbmRvd3MgU3lzdGVtIGRpcmVjdG9yeSAoZS5nLiBDOlx3aW5kb3dzXHN5c3RlbTMyKQogIDQuIFdpbmRvd3MgRGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3MpCiAgNS4gYWxsIGRpcmVjdG9yaWVzIGFsb25nICVQQVRIJQoKRGFuaWVsICgxIE1heSAyMDA1KQotIFRoZSBydW50ZXN0cy5wbCBzY3JpcHQgbm93IHN0YXJ0cyB0ZXN0IHNlcnZlcnMgYnkgZG9pbmcgZm9yaygpIGFuZCBleGVjKCkKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBhcHByb2FjaC4gVGhpcyBpcyBsZXNzIGNvbXBsaWNhdGVkIGFuZCBzaG91bGQKICBob3BlZnVsbHkgbGVhZCB0byBsZXNzICJsZWFrZWQiIHNlcnZlcnMgKHNlcnZlcnMgdGhhdCBhcmVuJ3Qgc3RvcHBlZAogIHByb3Blcmx5IHdoZW4gdGhlIHRlc3RzIGFyZSBzdG9wcGVkKS4KCi0gQWxleGFuZGVyIFpodXJhdmxldiBmb3VuZCBhIGNhc2Ugd2hlbiB5b3UgZGlkICJjdXJsIC1JIFtVUkxdIiBhbmQgaXQKICBjb21wbGFpbmVkIG9uIHRoZSBjaHVua2VkIGVuY29kaW5nLCBldmVuIHRob3VnaCBhIEhFQUQgc2hvdWxkIG5ldmVyIHJldHVybiBhCiAgYm9keSBhbmQgdGh1cyBpdCBjYW5ub3QgYmUgYSBjaHVua2VkLWVuY29kaW5nIHByb2JsZW0hCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDUpCi0gQWxleGFuZGVyIFpodXJhdmxldiBmb3VuZCBvdXQgdGhhdCAobGliKWN1cmwgU0lHU0VHVmVkIHdoZW4gdXNpbmcKICAtLWludGVyZmFjZSBvbiBhbiBhZGRyZXNzIHRoYXQgY2FuJ3QgYmUgYm91bmQuCgpEYW5pZWwgKDI4IEFwcmlsIDIwMDUpCi0gV29ya2luZyBvbiBmaXhpbmcgdXAgdGVzdCBjYXNlcyB0byBtYXJrIHNlY3Rpb25zIGFzICdtb2RlPXRleHQnIGZvciB0aGluZ3MKICB0aGF0IGN1cmwgd3JpdGVzIGFzIHRleHQgZmlsZXMsIHNpbmNlIHRoZW4gdGhleSBjYW4gZ2V0IGRpZmZlcmVudCBsaW5lCiAgZW5kaW5ncyBkZXBlbmRpbmcgb24gT1MuIEFuZHLpcyBHYXJj7WEgaGVscHMgbWUgd29yayB0aGlzIG91dC4KCiAgRGlkIGxvdHMgb2Ygb3RoZXIgbWlub3IgdHdlYWtzIG9uIHRoZSB0ZXN0IHNjcmlwdHMgdG8gd29yayBiZXR0ZXIgYW5kIG1vcmUKICByZWxpYWJseSBmaW5kIHRlc3Qgc2VydmVycyBhbmQgYWxzbyBraWxsIHRlc3Qgc2VydmVycy4KCi0gRGFuIEZhbmRyaWNoIHBvaW50ZWQgb3V0IGhvdyB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGtpbGxlZCB0aGUgSFRUUCBzZXJ2ZXIKICBpbnN0ZWFkIG9mIHRoZSBIVFRQUyBzZXJ2ZXIgd2hlbiBjbG9zaW5nIGl0IGRvd24uCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDUpCi0gUGF1bCBNb29yZSBtYWRlIGN1cmwgY2hlY2sgZm9yIHRoZSAuY3VybHJjIGZpbGUgKF9jdXJscmMgb24gd2luZG93cykgb24gdHdvCiAgbW9yZSBwbGFjZXMuIEZpcnN0LCBDVVJMX0hPTUUgaXMgYSBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdCBpcyB1c2VkCiAgaW5zdGVhZCBvZiBIT01FIGlmIGl0IGlzIHNldCwgdG8gcG9pbnQgb3V0IHdoZXJlIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlCiAgbGl2ZXMuIElmIHRoZXJlJ3Mgbm8gY29uZmlnIGZpbGUgaW4gdGhlIGRpciBwb2ludGVkIG91dCBieSBvbmUgb2YgdGhlCiAgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGUgV2luZG93cyB2ZXJzaW9uIHdpbGwgaW5zdGVhZCBjaGVjayB0aGUgc2FtZQogIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBjdXJsIGlzIGxvY2F0ZWQgaW4uCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDUpCi0gQ29yeSBOZWxzb24ncyB3b3JrIG9uIG51a2luZyBjb21waWxlciB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIG9uIHg2NCB3aXRoCiAgVlMyMDA1LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA1KQotIEZyZWQgTmV3IHJlcG9ydGVkIGEgYnVnIHdoZXJlIHdlIHVzZWQgQmFzaWMgYXV0aCBhbmQgdXNlciBuYW1lIGFuZCBwYXNzd29yZAogIGluIC5uZXRyYywgYW5kIHdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246IHRoZSBzdWJzZXF1ZW50IHJlcXVlc3RzIGRpZG4ndAogIHByb3Blcmx5IHVzZSB0aGUgYXV0aCBhcyBmb3VuZCBpbiB0aGUgbmV0cmMgZmlsZS4gQWRkZWQgdGVzdCBjYXNlIDI1NyB0bwogIHZlcmlmeSBteSBmaXguCgotIEJhc2VkIG9uIGZlZWRiYWNrIGZyb20gQ29yeSBOZWxzb24sIEkgYWRkZWQgc29tZSBwcmVwcm9jZXNzb3IgbWFnaWMgaW4KICAqL3NldHVwLmggYW5kICovY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSB3aXRoIFZTMjAwNSBvbiB4NjQuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDUpCi0gQWxleCBTdXlrb3YgbWFkZSB0aGUgY3VybCB0b29sIG5vdyBhc3N1bWUgdGhhdCB1cGxvYWRzIHVzaW5nIEhUVFA6Ly8gb3IKICBIVFRQUzovLyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHNob3cgb3V0cHV0IGFuZCB0aHVzIG1vdGl2YXRlcyBhIHN3aXRjaGVkCiAgb2ZmIHByb2dyZXNzIG1ldGVyIGlmIHRoZSBvdXRwdXQgaXMgc2VudCB0byB0aGUgdGVybWluYWwuIFRoaXMgbWFrZXMgRlRQCiAgdXBsb2FkcyB3aXRob3V0ICc+JywgLW8gb3IgLU8gc2hvdyB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDUpCi0gRGF2ZSBEcmliaW4ncyBNU1ZDIG1ha2VmaWxlIGZpeDogc2V0IENVUkxfU1RBVElDTElCIHdoZW4gaXQgYnVpbGRzIHN0YXRpYwogIGxpYnJhcnkgdmFyaWFudHMuCgotIEFuZHJlcyBHYXJjaWEgZml4ZWQgY29uZmlndXJlIHRvIHNldCB0aGUgcHJvcGVyIGRlZmluZSB3aGVuIGJ1aWxkaW5nIHN0YXRpYwogIGxpYmN1cmwgb24gd2luZG93cy4KCi0gLS1yZXRyeS1kZWxheSBkaWRuJ3Qgd29yay4KCkRhbmllbCAoMTggQXByaWwgMjAwNSkKLSBPbGl2aWVyIHJlcG9ydGVkIHRoYXQgZXZlbiB0aG91Z2ggaGUgdXNlZCBDVVJMT1BUX1BPUlQsIGxpYmN1cmwgY2xlYXJseQogIHN0aWxsIHVzZWQgdGhlIGRlZmF1bHQgcG9ydC4gSGUgd2FzIHJpZ2h0LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZCB0aGUKICB0ZXN0IGNhc2VzIDUyMSwgNTIyIGFuZCA1MjMgdG8gdmVyaWZ5IHRoZSBmaXguCgotIFRvc2hpeXVraSBNYWV6YXdhIHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIFBPU1Qgd2l0aCBhIHJlYWQgY2FsbGJhY2ssCiAgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgc2VuZCBhbiBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIuIEl0IGRvZXMgbm93LgoKLSBJIGNvbW1pdHRlZCBieSBtaWcgY2hhbmdlIGluIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0aGF0IG1vdmVzIG91dCBhbGwKICBzb2NrZXQvVENQIGNvZGUgdG8gYSBzZXBhcmF0ZSBDIHByb2dyYW0gbmFtZWQgc29ja2ZpbHQuIEFuZCBhZGRlZCA0IG5ldwogIHRlc3QgY2FzZXMgZm9yIEZUUCBvdmVyIElQdjYuCgpEYW5pZWwgKDggQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBhIEhUVFAgc2VydmVyIHRoYXQgcmVzcG9uZGVkIHdpdGggYSAzMDQKICByZXNwb25zZSBjb250YWluaW5nIGFuICJpbGxlZ2FsIiBDb250ZW50LUxlbmd0aDogaGVhZGVyLCB3aGljaCB3YXMgbm90CiAgcHJvcGVybHkgaWdub3JlZCBieSBsaWJjdXJsLiBOb3cgaXQgaXMuIFRlc3QgY2FzZSAyNDkgdmVyaWZpZXMuCgpEYW5pZWwgKDcgQXByaWwgMjAwNSkKLSBBZGRlZCBhYmlsaXR5IHRvIGJ1aWxkIGFuZCBydW4gd2l0aCBHbnVUTFMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gT3BlblNTTCBmb3IKICB0aGUgc2VjdXJlIGxheWVyLiBjb25maWd1cmUgLS13aXRoLWdudXRscyBlbmFibGVzIHdpdGguIE5vdGUgdGhhdCB0aGUKICBwcmV2aW91cyBPcGVuU1NMIGNoZWNrIHN0aWxsIGhhcyBwcmVmZXJlbmNlIGFuZCBpZiBpdCBmaXJzdCBkZXRlY3RzIE9wZW5TU0wsCiAgaXQgd2lsbCBub3QgY2hlY2sgZm9yIEdudVRMUy4gWW91IG1heSBuZWVkIHRvIGV4cGxpY3RseSBkaWFibGUgT3BlblNTTCB3aXRoCiAgLS13aXRob3V0LXNzbC4KCiAgVGhpcyB3b3JrIGhhcyBiZWVuIHNwb25zb3JlZCBieSBUaGUgV3JpdHRlbiBXb3JkLgoKRGFuaWVsICg1IEFwcmlsIDIwMDUpCi0gQ2hyaXN0b3BoZSBMZWdyeSBmaXhlZCB0aGUgcG9zdC11cGxvYWQgY2hlY2sgZm9yIEZUUCB0byBub3QgY29tcGxhaW4gaWYgdGhlCiAgdXBsb2FkIHdhcyBza2lwcGVkIGR1ZSB0byBhIHRpbWUtY29uZGl0aW9uIGFzIHNldCB3aXRoCiAgQ1VSTE9QVF9USU1FQ09ORElUSU9OLiBJIGFkZGVkIHRlc3QgY2FzZSAyNDcgYW5kIDI0OCB0byB2ZXJpZnkuCgpWZXJzaW9uIDcuMTMuMiAoNSBBcHJpbCAyMDA1KQoKRGFuaWVsICg0IEFwcmlsIDIwMDUpCi0gTWFyY2VsbyBKdWNoZW0gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGUgZm9yIGxpYmN1cmwKCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBjcmFzaCBpbiBsaWJjdXJsLCB0aGF0IGNvdWxkIGhhcHBlbiBpZiB0aGUgZWFzeSBoYW5kbGUKICB3YXMga2lsbGVkIGJlZm9yZSB0aGUgdGhyZWFkaW5nIHJlc29sdmVyICh3aW5kb3dzIG9ubHkpIHN0aWxsIGhhZG4ndAogIGNvbXBsZXRlZC4KCi0gSGFyZGVlcCBTaW5naCByZXBvcnRlZCBhIHByb2JsZW0gZG9pbmcgSFRUUCBQT1NUIHdpdGggRGlnZXN0LiAoSXQgd2FzCiAgYWN0dWFsbHkgYWxzbyBhZmZlY3RpbmcgTlRMTSBhbmQgTmVnb3RpYXRlLikgSXQgdHVybmVkIG91dCB0aGF0IGlmIHRoZQogIHNlcnZlciByZXNwb25kZWQgd2l0aCAxMDAgQ29udGludWUgYmVmb3JlIHRoZSBpbml0aWFsIDQwMSByZXNwb25zZSwgbGliY3VybAogIGRpZG4ndCB0YWtlIGNhcmUgb2YgdGhlIHJlc3BvbnNlIHByb3Blcmx5LiBUZXN0IGNhc2UgMjQ1IGFuZCAyNDYgYWRkZWQgdG8KICB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMzAgTWFyY2ggMjAwNSkKLSBBbmRyZXMgR2FyY2lhIG1vZGlmaWVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciBsaWJnZGkzMiBiZWZvcmUKICBsaWJjcnlwdG8sIHRvIG1ha2UgdGhlIFNTTCBjaGVjayB3b3JrIGZpbmUgb24gbXN5cy9taW5ndy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwNSkKLSBUb20gTW9lcnMgaWRlbnRpZmllZCBhIGZsYXcgd2hlbiB5b3Ugc2VudCBhIFBPU1Qgd2l0aCBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYXMgaW4gdGhlIGZpcnN0IHJlcXVlc3Qgd2hlbiBjdXJsIHNlbmRzIGEgUE9TVCB3aXRoIENvbnRlbnQtTGVuZ3RoOiAwLCBpdAogIHN0aWxsIGZvcmNpYmx5IGNsb3NlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgZG9pbmcgdGhlIG5leHQgc3RlcCBpbiB0aGUgYXV0aAogIG5lZ290aWF0aW9uLgoKLSBKZXNwZXIgSmVuc2VuIGZvdW5kIG91dCB0aGF0IEZUUC1TU0wgZGlkbid0IHdvcmsgc2luY2UgbXkgRlRQCiAgcmV3cml0ZS4gRml4aW5nIHRoYXQgd2FzIGVhc3ksIGJ1dCBpdCBhbHNvIHJldmVhbGVkIGEgbXVjaCB3b3JzZSBwcm9ibGVtOgogIHRoZSBGVFAgc2VydmVyIHJlc3BvbnNlIHJlYWRlciBmdW5jdGlvbiBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIHJlYWRpbmcKICByZXNwb25zZXMgaW4gbXVsdGlwbGUgdGlueSBjaHVua3MgcHJvcGVybHkhIEkgbW9kaWZpZWQgdGhlIEZUUCBzZXJ2ZXIgdG8KICBhbGxvdyBpdCB0byBwcm9kdWNlIHN1Y2ggc3BsaXQtdXAgcmVzcG9uc2VzIHRvIG1ha2Ugc3VyZSBjdXJsIGRlYWxzIHdpdGgKICB0aGVtIGFzIGl0IHNob3VsZC4KCi0gQmFzZWQgb24gQXVndXN0dXMgU2F1bmRlcnMnIGNvbW1lbnRzIGFuZCBmaW5kaW5ncywgdGhlIEhUVFAgb3V0cHV0IGF1dGgKICBmdW5jdGlvbiB3YXMgZml4ZWQgdG8gdXNlIHRoZSBwcm9wZXIgcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBtdWx0aXBsZSBvbmVzCiAgYXJlIGFjY2VwdGVkLiB0ZXN0IDIzOSBhbmQgdGVzdCAyNDMgd2VyZSBhZGRlZCB0byByZXBlYXQgdGhlIHByb2JsZW1zIGFuZAogIHZlcmlmeSB0aGUgZml4ZXMuCgogIC0tcHJveHktYW55YXV0aCB3YXMgYWRkZWQgdG8gdGhlIGN1cmwgdG9vbAoKRGFuaWVsICgxNiBNYXJjaCAyMDA1KQotIFRydTY0IGFuZCBzb21lIElSSVggYm94ZXMgc2VlbSB0byBub3QgbGlrZSB0ZXN0IDIzNyBhcyBpdCBpcy4gVGhlaXIKICBpbmV0X2FkZHIoKSBmdW5jdGlvbnMgc2VlbXMgdG8gdXNlICYyNTUgb24gYWxsIG51bWVyaWNhbHMgaW4gYSBpcHY0IGRvdHRlZAogIGFkZHJlc3Mgd2hpY2ggbWFrZXMgYSBkaWZmZXJlbnQgZmFpbHVyZS4uLiBOb3cgSSd2ZSBtb2RpZmllZCB0aGUgaXB2NAogIHJlc29sdmUgY29kZSB0byB1c2UgaW5ldF9wdG9uKCkgaW5zdGVhZCBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlc2Ugc3lzdGVtcwogIGJldHRlciBkZXRlY3QgdGhpcyBhcyBhIGJhZCBJUCBhZGRyZXNzIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgdG9hbGx5IGJvZ3VzCiAgYWRkcmVzcyB0aGF0IGlzIHRoZW4gcGFzc2VkIG9uIGFuZCB1c2VkLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBtYWRlIHRoZSBjb2RlIHByb3Blcmx5IHVzZSB0aGUgdUNsaWJjJ3MgdmVyc2lvbiBvZgogIGluZXRfbnRvYV9yKCkgd2hlbiBidWlsdCB3aXRoIGl0LgoKLSBBZGRlZCB0ZXN0IDIzNyBhbmQgMjM4OiB0ZXN0IEVQU1YgYW5kIFBBU1YgcmVzcG9uc2UgaGFuZGxpbmcgd2hlbiB0aGV5IGdldAogIHdlbGwtIGZvcm1hdGVkIGRhdGEgYmFjayBidXQgdXNpbmcgaWxsZWdhbCB2YWx1ZXMuIEluIDIzNyBQQVNWIGdldHMgYW4gSVAKICBhZGRyZXNzIHRoYXQgaXMgd2F5IGJhZC4gSW4gMjM4IEVQU1YgZ2V0cyBhIHBvcnQgdGhhdCBpcyB3YXkgb3V0IG9mIHJhbmdlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA1KQotIEFkZGVkIGEgZmV3IG1pc3NpbmcgZmVhdHVyZXMgdG8gdGhlIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgbGlzdAoKLSBNb2RpZmllZCB0ZXN0Y3VybC5wbCB0byBub3cgb2ZmZXIKICAxIC0gY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGFsbCBpbmZvIGl0IHByZXZpb3VzbHkgb25seSByZWFkIGZyb20KICAgICAgZmlsZTogLS1uYW1lLCAtLWVtYWlsLCAtLWRlc2MgYW5kIC0tY29uZmlndXJlCiAgMiAtIC0tbm9jdnN1cCBtYWtlcyBpdCBub3QgYXR0ZW1wdCB0byBkbyBjdnMgdXBkYXRlCiAgMyAtIC0tY3Jvc3Njb21waWxlIGluZm9ybXMgaXQgYW5kIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRoaW5ncyBpdCBjYW4ndCBkbwoKLSBGaXhlZCBudW1lcm91cyB3aW4zMiBjb21waWxlciB3YXJuaW5ncy4KCi0gUmVtb3ZlZCB0aGUgbGliL3NlY3VyaXR5LmggZmlsZSBzaW5jZSBpdCBzaGFkb3dlZCB0aGUgbWluZ3cvd2luMzIgaGVhZGVyCiAgd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGlzIG5lZWRlZCBmb3IgU1NQSSBidWlsZHMuIFRoZSBjb250ZW50cyBvZiB0aGUKICBmb3JtZXIgc2VjdXJpdHkuaCBpcyBub3cgaSBrcmI0LmgKCi0gY29uZmlndXJlIC0tZW5hYmxlLXNzcGkgbm93IGVuYWJsZXMgU1NQSSBpbiB0aGUgYnVpbGQuIEl0IG9ubHkgd29ya3MgZm9yCiAgd2luZG93cyBidWlsZHMgKGluY2x1ZGluZyBjcm9zcy1jb21waWxlcyBmb3Igd2luZG93cykuCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDUpCi0gRGF2aWQgSG91bGRlciBhZGRlZCAtLWZvcm0tc3RyaW5nIHRoYXQgYWRkcyB0aGF0IHN0cmluZyB0byBhIG11bHRpcGFydAogIGZvcm1wb3N0IHBhcnQsIHdpdGhvdXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGhhdmluZyBzcGVjaWFsIG1lYW5pbmdzIGV0YyBsaWtlCiAgLS1mb3JtIGZlYXR1cmVzLgoKRGFuaWVsICgxMSBNYXJjaCAyMDA1KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgcmV0dXJucyB0aGUgZmVhdHVyZSBiaXQgQ1VSTF9WRVJTSU9OX1NTUEkgaWYgaXQgd2FzCiAgYnVpbHQgd2l0aCBTU1BJIHN1cHBvcnQuCgotIENocmlzdG9waGVyIFIuIFBhbG1lciBtYWRlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCB0aGUKICBVU0VfV0lORE9XU19TU1BJIG9uIFdpbmRvd3MsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBiZSBidWlsdCB0byB1c2UgdGhlCiAgbmF0aXZlIHdheSB0byBkbyBOVExNLiBTU1BJIGFsc28gYWxsb3dzIGxpYmN1cmwgdG8gcGFzcyBvbiB0aGUgY3VycmVudCB1c2VyCiAgYW5kIGl0cyBwYXNzd29yZCBpbiB0aGUgcmVxdWVzdC4KCkRhbmllbCAoOSBNYXJjaCAyMDA1KQotIERhbiBGIGltcHJvdmVkIHRoZSBTU0wgbGliIHNldHVwIGluIGNvbmZpZ3VyZS4KCi0gTm9kYWsgU29kYWsgcmVwb3J0ZWQgYSBjcmFzaCB3aGVuIHVzaW5nIGEgU09DS1M0IHByb3h5LgoKLSBKZWFuLU1hcmMgUmFuZ2VyIHBvaW50ZWQgb3V0IGFuIGVtYmFyYXNzaW5nIGRlYnVnIHByaW50ZigpIGxlZnRvdmVyIGluIHRoZQogIG11bHRpIGludGVyZmFjZSBjb2RlLgoKLSBBZGp1c3RlZCB0aGUgbWFuIHBhZ2UgZm9yIHRoZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gdmFsdWUgZm9yIGRhdGVzIGFmdGVyCiAgeWVhciAyMDM4LiBGb3IgMzIgYml0IHRpbWVfdCBpdCByZXR1cm5zIDB4N2ZmZmZmZmYgYnV0IGZvciA2NGJpdCB0aW1lX3QgaXQKICByZXR1cm5zIGVpdGhlciB0aGUgY29ycmVjdCB2YWx1ZSBvciBldmVuIC0xIG9uIHNvbWUgc3lzdGVtcyB0aGF0IHN0aWxsIHNlZW0KICB0byBub3QgZGVhbCB3aXRoIHRoaXMgcHJvcGVybHkuIFRvciBBcm50c2VuIGZvdW5kIGEgNjRiaXQgQUlYIHN5c3RlbSBmb3IgdXMKICB0aGF0IGRpZCB0aGUgbGF0dGVyLiBHd2Vub2xlIEJlYXVjaGVzbmUncyBNYW5kcmFrZSBwYXRjaCBwdXQgdGhlIGxpZ2h0cyBvbgogIHRoaXMgcHJvYmxlbSBpbiB0aGUgZmlyc3QgcGxhY2UuCgpEYW5pZWwgKDggTWFyY2ggMjAwNSkKLSBEb21pbmljayBNZWdsaW8gcmVwb3J0ZWQgdGhhdCB1c2luZyBDVVJMT1BUX0ZJTEVUSU1FIHdoZW4gdHJhbnNmZXJyaW5nIGEgRlRQCiAgZmlsZSBnb3QgYSBMYXN0LU1vZGlmaWVkOiBoZWFkZXIgd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0sIGNvcnJ1cHRpbmcgdGhlCiAgYWN0dWFsIGRhdGEuIFRoaXMgd2FzIGJlY2F1c2Ugc29tZSBjb25kaXRpb25zIGZyb20gdGhlIHByZXZpb3VzIEZUUCBjb2RlIHdhcwogIG5vdCBwcm9wZXJseSBicm91Z2h0IGludG8gdGhlIG5ldyBGVFAgY29kZS4gSSBmaXhlZCBhbmQgSSBhZGRlZCB0ZXN0IGNhc2UKICA1MjAgdG8gdmVyaWZ5LiAoVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gNy4xMy4xKQoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLXdpdGgtemxpYiBvcHRpb24gdG8gYWx3YXlzIGNvbnNpZGVyIHRoZQogIGdpdmVuIHBhdGggYmVmb3JlIGFueSBzdGFuZGFyZCBwYXRocy4KCkRhbmllbCAoNiBNYXJjaCAyMDA1KQotIFJhbmR5IE1jTXVyY2h5IHdhcyB0aGUgZmlyc3QgdG8gcmVwb3J0IHRoYXQgdmFsZ3JpbmQucG0gd2FzIG1pc3NpbmcgZnJvbSB0aGUKICByZWxlYXNlIGFyY2hpdmUgYW5kIHRodXMgJ21ha2UgdGVzdCcgZmFpbHMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwNSkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgSEFWRV9GVFJVTkNBVEUgdG8gc2V2ZXJhbCBjb25maWctKi5oIGZpbGVzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMjM1IHRoYXQgbWFrZXMgYSByZXN1bWVkIHVwbG9hZCBvZiBhIGZpbGUgdGhhdCBpc24ndCBwcmVzZW50CiAgb24gdGhlIHJlbW90ZSBzaWRlLiBUaGlzIHRoZW4gY29udmVydHMgdGhlIG9wZXJhdGlvbiB0byBhbiBvcmRpbmFyeSBTVE9SCiAgdXBsb2FkLiBUaGlzIHdhcyByZXF1ZXN0ZWQvcG9pbnRlZCBvdXQgYnkgSWduYWNpbyBWYXpxdWV6LUFicmFtcy4KCiAgSXQgYWxzbyBwcm92ZWQgKGFuZCBJIGZpeGVkKSBhIGJ1ZyBpbiB0aGUgbmV3bHkgcmV3cml0dGVuIGZ0cCBjb2RlIChhbmQKICBwcmVzZW50IGluIHRoZSA3LjEzLjEgcmVsZWFzZSkgd2hlbiB0cnlpbmcgdG8gcmVzdW1lIGFuIHVwbG9hZCBhbmQgdGhlCiAgc2VydmVycyByZXR1cm5zIGFuIGVycm9yIHRvIHRoZSBTSVpFIGNvbW1hbmQuIGxpYmN1cmwgdGhlbiBsb29wcyBhbmQgc2VuZHMKICBTSVpFIGNvbW1hbmRzIGluZmluaXRlbHkuCgotIERhbiBGYW5kcmljaCBmaXhlZCBhIFNTTCBwcm9ibGVtIGludHJvZHVjZWQgb24gRmVicnVhcnkgOXRoIHRoYXQgbWFkZQogIGxpYmN1cmwgYXR0ZW1wdCB0byBsb2FkIHRoZSB3aG9sZSByYW5kb20gZmlsZSB0byBzZWVkIHRoZSBQUk5HLiBUaGlzIGlzCiAgcmVhbGx5IGJhZCBzaW5jZSB0aGlzIHR1cm5zIG91dCB0byBiZSB1c2luZyAvZGV2L3VyYW5kb20gYXQgdGltZXMuLi4KClZlcnNpb24gNy4xMy4xICg0IE1hcmNoIDIwMDUpCgpEYW5pZWwgKDQgTWFyY2ggMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGl0IHBvc3NpYmxlIHRvIHNldCBDVVJMT1BUX0NPT0tJRUZJTEUgdG8gIiIgdG8gYWN0aXZhdGUKICB0aGUgY29va2llICJlbmdpbmUiIHdpdGhvdXQgaGF2aW5nIHRvIHByb3ZpZGUgYW4gZW1wdHkgb3Igbm9uLWV4aXN0aW5nIGZpbGUuCgotIFJlbmUgUmViZSBmaXhlZCBhIC0jIGNyYXNoIHdoZW4gbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgd2FzIHJldHJpZXZlZC4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNSkKLSBOVExNIGFuZCBmdHAta3JiNCBidWZmZXIgb3ZlcmZsb3cgZml4ZWQsIGFzIHJlcG9ydGVkIGhlcmU6CiAgaHR0cDovL3d3dy5zZWN1cml0eWZvY3VzLmNvbS9hcmNoaXZlLzEvMzkxMDQyIGFuZCB0aGUgQ0FOIHJlcG9ydCBoZXJlOgogIGh0dHA6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT1DQU4tMjAwNS0wNDkwCgogIElmIHRoZXNlIHNlY3VyaXR5IGd1eXMgd2VyZSBzZXJpb3VzLCB3ZSdkIGJlZW4gbm90aWZpZWQgaW4gYWR2YW5jZSBhbmQgd2UKICBjb3VsZCd2ZSBzYXZlZCBhIGZldyBvZiB5b3UgYSBsaXR0bGUgc3VycHJpc2UsIGJ1dCBub3cgd2Ugd2VyZW4ndC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNSkKLSBSYWxwaCBNaXRjaGVsbCByZXBvcnRlZCBhIGZsYXcgd2hlbiB5b3UgdXNlZCBhIHByb3h5IHdpdGggYXV0aCwgYW5kIHlvdQogIHJlcXVlc3RlZCBkYXRhIGZyb20gYSBob3N0IGFuZCB0aGVuIGZvbGxvd2VkIGEgcmVkaXJlY3QgdG8gYW5vdGhlcgogIGhvc3QuIGxpYmN1cmwgdGhlbiBkaWRuJ3QgdXNlIHRoZSBwcm94eS1hdXRoIHByb3Blcmx5IGluIHRoZSBzZWNvbmQgcmVxdWVzdCwKICBkdWUgdG8gdGhlIGhvc3Qtb25seSBjaGVjayBmb3Igb3JpZ2luYWwgaG9zdCBuYW1lIHdyb25nbHkgYmVpbmcgZXh0ZW5kZWQgdG8KICB0aGUgcHJveHkgYXV0aCBhcyB3ZWxsLiBBZGRlZCB0ZXN0IGNhc2UgMjMzIHRvIHZlcmlmeSB0aGUgZmxhdyBhbmQgdGhhdCB0aGUKICBmaXggcmVtb3ZlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNSkKLSBNaWtlIERvYmJzIHJlcG9ydGVkIGEgbWluZ3cgYnVpbGQgZmFpbHVyZSBkdWUgdG8gdGhlIGxhY2sgb2YKICBCVUlMRElOR19MSUJDVVJMIGJlaW5nIGRlZmluZWQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0LiBOb3cgdGhpcyBpcyBkZWZpbmVkIGJ5CiAgY29uZmlndXJlIHdoZW4gbWluZ3cgaXMgdXNlZC4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBpbiBidWcgcmVwb3J0ICMxMTI0NTg4IGZvdW5kIGFuZCBmaXhlZCBhIHNvY2tldCBsZWFrIHdoZW4gbGliY3VybAogIGRpZG4ndCBjbG9zZSB0aGUgc29ja2V0IHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIGVycm9yIGR1ZSB0byBmYWlsaW5nCiAgbG9jYWxiaW5kCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAtUE9TVGluZyB1c2luZyAiYW55YXV0aCIKICB0aGF0IHBpY2tzIE5UTE0uIFRoYW5rcyB0byBEYXZpZCBCeXJvbiBsZXR0aW5nIG1lIHRlc3QgTlRMTSBhZ2FpbnN0IGhpcwogIHNlcnZlcnMsIEkgY291bGQgcXVpY2tseSByZXBlYXQgYW5kIGZpeCB0aGUgcHJvYmxlbS4gSXQgdHVybmVkIG91dCB0byBiZToKCiAgV2hlbiBsaWJjdXJsIFBPU1RzIHdpdGhvdXQga25vd2luZy91c2luZyBhbiBhdXRoZW50aWNhdGlvbiBhbmQgaXQgZ2V0cyBiYWNrCiAgYSBsaXN0IG9mIHR5cGVzIGZyb20gd2hpY2ggaXQgcGlja3MgTlRMTSwgaXQgbmVlZHMgdG8gZWl0aGVyIGNvbnRpbnVlCiAgc2VuZGluZyBpdHMgZGF0YSBpZiBpdCBrZWVwcyB0aGUgY29ubmVjdGlvbiBhbGl2ZSwgb3Igbm90IHNlbmQgdGhlIGRhdGEgYnV0CiAgY2xvc2UgdGhlIGNvbm5lY3Rpb24uIFRoZW4gZG8gdGhlIGZpcnN0IHN0ZXAgaW4gdGhlIE5UTE0gYXV0aC4gbGliY3VybAogIGRpZG4ndCBzZW5kIHRoZSBkYXRhIG5vciBjbG9zZSB0aGUgY29ubmVjdGlvbiBidXQgc2ltcGx5IHJlYWQgdGhlCiAgcmVzcG9uc2UtYm9keSBhbmQgdGhlbiBzZW50IHRoZSBmaXJzdCBuZWdvdGlhdGlvbiBzdGVwLiBXaGljaCB0aGVuIGZhaWxlZAogIG1pc2VyYWJseSBvZiBjb3Vyc2UuIFRoZSBmaXhlZCB2ZXJzaW9uIGZvcmNlcyBhIGNvbm5lY3Rpb24gaWYgdGhlcmUgaXMgbW9yZQogIHRoYW4gMjAwMCBieXRlcyBsZWZ0IHRvIHNlbmQuCgpEYW5pZWwgKDE0IEZlYnJ1YXJ5IDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKSBzbyBpdAogIHdhcyBuZXZlciB1c2VkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA1KQotIFJlbW92ZWQgYWxsIHVzZXMgb2Ygc3RyZnRpbWUoKSBzaW5jZSBpdCB1c2VzIHRoZSBsb2NhbGlzZWQgdmVyc2lvbiBvZiB0aGUKICB3ZWVrIGRheSBuYW1lcyBhbmQgbW9udGggbmFtZXMgYW5kIHNlcnZlcnMgZG9uJ3QgbGlrZSB0aGF0LgoKRGFuaWVsICgxMCBGZWJydWFyeSAyMDA1KQotIE5vdyB0aGUgdGVzdCBzY3JpcHQgZGlzYWJsZXMgdmFsZ3JpbmQtdGVzdGluZyB3aGVuIHRoZSB0ZXN0IHN1aXRlIHJ1bnMgaWYKICBsaWJjdXJsIGlzIGJ1aWx0IHNoYXJlZC4gT3RoZXJ3aXNlIHZhbGdyaW5kIG9ubHkgdGVzdHMgdGhlIHNoZWxsIHRoYXQgcnVucwogIHRoZSB3cmFwcGVyLXNjcmlwdCBuYW1lZCAnY3VybCcgdGhhdCBpcyBhIGZyb250LWVuZCB0byBjdXJsIGluIHRoaXMgY2FzZS4KICBUaGlzIHNob3VsZCBhbHNvIGZpeCB0aGUgaHVnZSBhbW91bnQgb2YgcmVwb3J0cyBvZiBmYWxzZSBwb3NpdGl2ZXMgd2hlbgogIHZhbGdyaW5kIGhhcyBpZGVudGlmaWVkIGxlYWtzIGluIChiYSlzaCBhbmQgbm90IGluIGN1cmwgYW5kIHBlb3BsZSByZXBvcnQKICB0aGF0IGFzIGN1cmwgYnVncy4gQnVnIHJlcG9ydCAjMTExNjY3MiBpcyBvbmUgZXhhbXBsZS4KCiAgQWxzbywgdGhlIHZhbGdyaW5kIHJlcG9ydCBwYXJzZXIgaGFzIGJlZW4gYWRhcHRlZCB0byBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZQogIG9mIHRoZSBzb3VyY2VzIGluIGEgc3RhY2sgc3RyYWNlIGlzIG9uZSBvZiAobGliKWN1cmwncyBzb3VyY2UgZmlsZXMgb3IKICBvdGhlcndpc2UgaXQgd2lsbCBub3QgY29uc2lkZXIgdGhlIHByb2JsZW0gdG8gY29uY2VybiAobGliKWN1cmwuCgotIE1hcnR5IEt1aHJ0IHN0cmVhbWxpbmVkIHRoZSBWTVMgYnVpbGQuCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBCeXJvbiBmaXhlZCBoaXMgU1NMIHByb2JsZW1zLCBpbml0aWFsbHkgbWVudGlvbmVkIGhlcmU6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTAxLzAyNDAuaHRtbC4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgdXNlCiAgU1NMX3BlbmRpbmcoKSBhcyB3ZSBzaG91bGQuCgotIENvbnZlcnRlZCBsb3RzIG9mIEZUUCBjb2RlIHRvIGEgc3RhdGVtYWNoaW5lLCBzbyB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UKICBkb2Vzbid0IGJsb2NrIHdoaWxlIGNvbW11bmljYXRpbmcgY29tbWFuZHMtcmVzcG9uc2VzIHdpdGggYW4gRlRQIHNlcnZlci4KCiAgSSd2ZSBhZGRlZCBhIGNvbW1lbnQgbGlrZSBCTE9DS0lORyBpbiB0aGUgY29kZSBvbiBhbGwgc3BvdHMgSSBjb3VsZCBmaW5kCiAgd2hlcmUgd2Ugc3RpbGwgaGF2ZSBibG9ja2luZyBvcGVyYXRpb25zLiBXaGVuIHdlIGNoYW5nZSBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgdG8gdXNlIHRoZSBtdWx0aSBpbnRlcmZhY2UsIHdlJ2xsIGFsc28gYmUgYWJsZSB0byBzaW1wbGlmeSB0aGUgY29kZSBzaW5jZQogIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgImludGVybmFsIGludGVyZmFjZSIuCgogIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IG1hZGUgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgc2VwYXJhdGUgZnJvbSB0aGUKICBuZXcgQ1VSTEVfTE9HSU5fREVOSUVELiBUaGUgZmlyc3Qgb25lIGlzIG5vdyBhY2Nlc3MgZGVuaWVkIHRvIGEgZnVuY3Rpb24sCiAgbGlrZSBjaGFuZ2luZyBkaXJlY3Rvcnkgb3IgcmV0cmlldmluZyBhIGZpbGUsIHdoaWxlIHRoZSBzZWNvbmQgbWVhbnMgdGhhdCB3ZQogIHdlcmUgZGVuaWVkIGxvZ2luLgoKICBUaGUgQ1ZTIHRhZyAnYmVmb3JlX2Z0cF9zdGF0ZW1hY2hpbmUnIHdhcyBzZXQganVzdCBiZWZvcmUgdGhpcyB3ZW50IGluLCBpbgogIGNhc2Ugb2YgZnV0dXJlIG5lZWQuCgotIEdpc2xlIG1hZGUgdGhlIERJQ1QgY29kZSBzZW5kIENSTEYgYW5kIG5vdCBqdXN0IExGIGFzIHRoZSBzcGVjIHNheXMgc28uCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNSkKLSBHaXNsZSBmaXhlZCBwcm9ibGVtcyB3aGVuIGxpYmN1cmwgcnVucyBvdXQgb2YgbWVtb3J5LCBhbmQgd29ya2VkIG9uIG1ha2luZwogIHN1cmUgdGhlIHByb3BlciBlcnJvciBjb2RlIGlzIHJldHVybmVkIGZvciB0aG9zZSBvY2NhdGlvbnMuCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwNSkKLSBNYXJ1a28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggaW5mbGF0ZSBkZWNvbXByZXNzaW5nIGV4YWN0bHkgNjRLCiAgY29udGVudHMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNSkKLSBFcmljIFZlcmduYXVkIGZvdW5kIGEgdXNlIG9mIGFuIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gdGhlIGZ0cCB3aGVuIGRvaW5nCiAgUE9SVCBvbiBpcHY2LWVuYWJsZWQgaG9zdHMuCgotIERhdmlkIEJ5cm9uIHBvaW50ZWQgb3V0IHdlIGNvdWxkIHVzZSBCVUZTSVpFIHRvIHJlYWQgZGF0YSAoaW4KICBsaWIvdHJhbnNmZXIuYykgaW5zdGVhZCBvZiB1c2luZyBCVUZTSVpFIC0xLgoKVmVyc2lvbiA3LjEzLjAgKDEgRmVicnVhcnkgMjAwNSkKCkRhbmllbCAoMzEgSmFudWFyeSAyMDA1KQotIEFkZGVkIExhcnMgTmlsc3NvbidzIGh0bWx0aXRsZS5jYyBleGFtcGxlCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNSkKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIERPIG9wZXJhdGlvbgogIGZhaWxlZCAoYXMgaW4gdGVzdCBjYXNlIDIwNSkuCgotIEZpeGVkIGEgdmFsZ3JpbmQgd2FybmluZyBmb3IgZmlsZTovLyBvcGVyYXRpb25zLgoKLSBGaXhlZCBhIHZhbGdyaW5kIHJlcG9ydCBpbiB0aGUgdXJsIGdsb2JiaW5nIGNvZGUgZm9yIHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wuCgotIEJ1Z2ZpeGVkIHRoZSBwYXJzZXIgdGhhdCBzY2FucyB0aGUgdmFsZ3JpbmQgcmVwb3J0IG91dHB1dHMgKGluIHJ1bnRlc3RzLnBsKS4KICBJIG5vdGljZWQgdGhhdCBpdCBwcmV2aW91c2x5IGRpZG4ndCBkZXRlY3QgYW5kIHJlcG9ydCB0aGUgIkNvbmRpdGlvbmFsIGp1bXAKICBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZShzKSIgZXJyb3IuIFdoZW4gSSBmaXhlZCB0aGlzLCBJCiAgY2F1Z2h0IGEgZmV3IGN1cmwgYnVncyB3aXRoIGl0LiBBbmQgdGhlbiBJIGhhZCB0byBzcGVuZCB0aW1lIHRvIG1ha2UgdGhlCiAgdGVzdCBzdWl0ZSBJR05PUkUgdGhlc2UgZXJyb3JzIHdoZW4gT3BlblNTTCBpcyB1c2VkIHNpbmNlIGl0IHByb2R1Y2UgbWFzc2l2ZQogIGFtb3VudHMgb2YgdmFsZ3JpbmQgd2FybmluZ3MgKGJ1dCBvbmx5IG9mIHRoZSAiQ29uZGl0aW9uYWwuLi4iIGtpbmQgaXQKICBzZWVtcykuIFNvLCBpZiBhIHRlc3QgdGhhdCByZXF1aXJlcyBTU0wgaXMgcnVuLCBpdCBpZ25vcmVzIHRoZQogICJDb25kaXRpb25hbC4uLiIgZXJyb3JzLCBhbmQgeW91J2xsIGdldCBhICJ2YWxncmluZCBQQVJUSUFMIiBvdXRwdXQgaW5zdGVhZAogIG9mICJ2YWxncmluZCBPSyIuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNSkKLSBVc2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLCBhbmQgZG9pbmcgYSByZXF1c3RlZCBhIHJlLXVzZWQgY29ubmVjdGlvbiB0aGF0CiAgZ2V0cyBjbG9zZWQganVzdCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IGZhaWxlZCBhbmQgZGlkIG5vdCByZS1pc3N1ZQogIGEgcmVxdWVzdCBvbiBhIGZyZXNoIHJlY29ubmVjdCBsaWtlIHRoZSBlYXN5IGludGVyZmFjZSBkaWQuIE5vdyBpdCBkb2VzIQoKLSBEZWZpbmUgQ1VSTF9NVUxUSUVBU1kgd2hlbiBidWlsZGluZyBsaWJjdXJsIChsaWIvZWFzeS5jIHRvIGJlIGV4YWN0KSwgdG8gdXNlCiAgbXkgbmV3IGN1cmxfZWFzeV9wZXJmb3JtKCkgdGhhdCB1c2VzIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gcnVuIHRoZQogIHJlcXVlc3QuIEl0IGlzIGEgZ3JlYXQgdGVzdGJlZCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgSSBiZWxpZXZlIHdlCiAgc2hhbGwgZG8gaXQgdGhpcyB3YXkgZm9yIHJlYWwgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGhhdmUgYSBzdWNjZXNzb3IgdG8KICBjdXJsX211bHRpX2Zkc2V0KCkuIEkndmUgdXNlZCB0aGlzIGFwcHJvYWNoIHRvIGRldGVjdCBhbmQgZml4IHNldmVyYWwgb2YgdGhlCiAgcmVjZW50IG11bHRpLWludGVyZmFjZXMgaXNzdWVzLgoKLSBBZGp1c3RlZCB0aGUgS05PV05fQlVHUyAjMTcgZml4IGEgYml0IG1vcmUgc2luY2UgdGhlIEZUUCBjb2RlIGFsc28gZGlkIHNvbWUKICBiYWQgYXNzdW1wdGlvbnMuCgotIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHJlcXVlc3QgaXMgZGVuaWVkIGR1ZSB0byAiTWF4aW11bSByZWRpcmVjdHMKICBmb2xsb3dlZCIgbGliY3VybCBsZWFrZWQgdGhlIGxhc3QgTG9jYXRpb246IFVSTC4KCi0gQ29ubmVjdCBmYWlsdXJlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIG9mdGVuIHJldHVybmVkIGFzICJjb25uZWN0KCkKICB0aW1lZCBvdXQiIGV2ZW4gdGhvdWdoIHRoZSByZWFzb24gd2FzIGRpZmZlcmVudC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA1KQotIEtOT1dOX0JVR1MgIzE3IGZpeGVkLiBBIEROUyBjYWNoZSBlbnRyeSBtYXkgbm90IHJlbWFpbiBsb2NrZWQgYmV0d2VlbiB0d28KICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGludm9rZXMuIEl0IHdhcyBwcmV2aW91c2x5IHVubG9ja2VkIGF0IGRpc2Nvbm5lY3QsIHdoaWNoCiAgY291bGQgbWVhbiB0aGF0IGl0IHJlbWFpbmVkIGxvY2tlZCBiZXR3ZWVuIG11bHRpcGxlIHRyYW5zZmVycy4gVGhlIEROUyBjYWNoZQogIG1heSBub3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGNhY2hlIGRvZXMsIGFzIHRoZXkgYXJlIHNlcGFyYXRlLgoKICBUbyBkZWFsIHdpdGggdGhlIGxhY2sgb2YgRE5TIChob3N0IGFkZHJlc3MpIGRhdGEgYXZhaWxhYmlsaXR5IGluIHJlLXVzZWQKICBjb25uZWN0aW9ucywgbGliY3VybCBub3cga2VlcHMgYSBjb3B5IG9mIHRoZSBJUCBhZHJlc3MgYXMgYSBzdHJpbmcsIHRvIGJlCiAgYWJsZSB0byBzaG93IGl0IGV2ZW4gb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgoKICBUaGUgcHJvYmxlbSBjb3VsZCBiZSBtYWRlIHRvIGFwcGVhciB3aXRoIHRoaXMgc3R1bnQ6CgogIDEuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDIuIGFkZCBhbiBlYXN5IGhhbmRsZQogIDMuIGZldGNoIGEgVVJMIHRoYXQgaXMgcGVyc2lzdGVudCAobGVhdmVzIHRoZSBjb25uZWN0aW9uIGFsaXZlKQogIDQuIHJlbW92ZSB0aGUgZWFzeSBoYW5kbGUgZnJvbSB0aGUgbXVsdGkKICA1LiBraWxsIHRoZSBtdWx0aSBoYW5kbGUKICA2LiBjcmVhdGUgYSBtdWx0aSBoYW5kbGUKICA3LiBhZGQgdGhlIHNhbWUgZWFzeSBoYW5kbGUgdG8gdGhlIG5ldyBtdWx0aSBoYW5kbGUKICA4LiBmZXRjaCBhIFVSTCBmcm9tIHRoZSBzYW1lIHNlcnZlciBhcyBiZWZvcmUgKHJlLXVzaW5nIHRoZSBjb25uZWN0aW9uKQoKLSBTdGVwaGVuIE1vcmUgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0ZUUFBPUlQgYW5kIHRoZSAtUCBvcHRpb24gZGlkbid0IHdvcmsKICB3aGVuIGJ1aWx0IGlwdjYtZW5hYmxlZC4gSSd2ZSBub3cgbWFkZSBhIGZpeCBmb3IgaXQuIFdyaXRpbmcgdGVzdCBjYXNlcyBmb3IKICBjdXN0b20gcG9ydCBob3N0cyB0dXJuZWQgdG9vIHRyaWNreSBzbyB1bmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm9uZS4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA1KQotIElhbiBGb3JkIGFza2VkIGFib3V0IHN1cHBvcnQgZm9yIHRoZSBGVFAgY29tbWFuZCBBQ0NULCBhbmQgSSBkaXNjb3ZlcmVkIGl0CiAgaXMgcHJlc2VudCBpbiBSRkM5NTkuLi4gc28gbm93IChsaWIpY3VybCBzdXBwb3J0cyBpdCBhcyB3ZWxsLiAtLWZ0cC1hY2NvdW50CiAgYW5kIENVUkxPUFRfRlRQX0FDQ09VTlQgc2V0IHRoZSBhY2NvdW50IHN0cmluZy4gKFRoZSBzZXJ2ZXIgbWF5IGFzayBmb3IgYW4KICBhY2NvdW50IHN0cmluZyBhZnRlciBQQVNTIGhhdmUgYmVlbiBzZW50IGF3YXkuIFRoZSBjbGllbnQgcmVzcG9uZHMKICB3aXRoICJBQ0NUIFthY2NvdW50IHN0cmluZ10iLikgQWRkZWQgdGVzdCBjYXNlIDIyOCBhbmQgMjI5IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LiBVcGRhdGVkIHRoZSB0ZXN0IEZUUCBzZXJ2ZXIgdG8gc3VwcG9ydCBBQ0NUIHNvbWV3aGF0LgoKLSBEYXZpZCBTaGF3IGNvbnRyaWJ1dGVkIGEgZmFpcmx5IGNvbXBsZXRlIGFuZCBkZXRhaWxlZCBhdXRvY29uZiB0ZXN0IHlvdSBjYW4KICB1c2UgdG8gZGV0ZWN0IGxpYmN1cmwgYW5kIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHByb3RvY29scyB0aGUgaW5zdGFsbGVkCiAgbGliY3VybCBzdXBwb3J0czogZG9jcy9saWJjdXJsL2xpYmN1cmwubTQKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA1KQotIE1ham9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlciBvdmVyaGF1bC4KCiAgVGhlc2UgZm91ciBvcHRpb25zIGFyZSBub3cgb2Jzb2xldGU6IENVUkxPUFRfU09VUkNFX0hPU1QsCiAgQ1VSTE9QVF9TT1VSQ0VfUEFUSCwgQ1VSTE9QVF9TT1VSQ0VfUE9SVCAodGhpcyBvcHRpb24gZGlkbid0IHdvcmsgYmVmb3JlKQogIGFuZCBDVVJMT1BUX1BBU1ZfSE9TVC4KCiAgVGhlc2UgdHdvIG9wdGlvbnMgYXJlIGFkZGVkOiBDVVJMT1BUX1NPVVJDRV9VUkwgYW5kIENVUkxPUFRfU09VUkNFX1FVT1RFLgoKICBUaGUgdGFyZ2V0LXNpZGUgZGlkbid0IHVzZSB0aGUgcHJvcGVyIHBhdGggd2l0aCBSRVRSLCBhbmQgdGh1cyB0aGlzIG9ubHkKICB3b3JrZWQgY29ycmVjdGx5IGluIHRoZSBsb2dpbiBwYXRoIChpLmUgd2l0aG91dCBkb2luZyBhbnkgQ1dEKS4gVGhlIHNvdXJjZS0KICBzaWRlIHN0aWxsIHVzZXMgYSB3cm9uZyBwYXRoLCBidXQgdGhlIGZpeCBmb3IgdGhpcyB3aWxsIG5lZWQgdG8gd2FpdC4gVmVyaWZ5CiAgdGhlIGZsYXcgYnkgdXNpbmcgYSBzb3VyY2UgVVJMIHdpdGggaW5jbHVkZWQgJVhYLWNvZGVzLgoKICBNYWRlIENVUkxPUFRfRlRQUE9SVCBjb250cm9sIHdlYXRoZXIgdGhlIHRhcmdldCBvcGVyYXRpb24gc2hvdWxkIHVzZSBQT1JUCiAgKG9yIG5vdCkuIFRoZSBvdGhlciBzaWRlIHRodXMgdXNlcyBwYXNzaXZlIChQQVNWKSBtb2RlLgoKICBVcGRhdGVkIHRoZSBmdHAzcmRwYXJ0eS5jIGV4YW1wbGUgc291cmNlIHRvIHVzZSB0aGUgdXBkYXRlZCBvcHRpb25zLgoKICBBZGRlZCBzdXBwb3J0IGZvciBhIHNlY29uZCBGVFAgc2VydmVyIGluIHRoZSB0ZXN0IHN1aXRlLiBOYW1lZC4uLiBmdHAyLgogIEFkZGVkIHRlc3QgY2FzZXMgMjMwLCAyMzEgYW5kIDIzMiBhcyBhIGZldyBmaXJzdCBiYXNpYyB0ZXN0cyBvZiB2ZXJ5IHNpbXBsZQogIDNyZCBwYXJ0eSB0cmFuc2ZlcnMuCgogIENoYW5nZWQgdGhlIGRlYnVnIG91dHB1dCB0byBpbmNsdWRlICd0YXJnZXQnIGFuZCAnc291cmNlJyB3aGVuIGEgM3JkIHBhcnR5CiAgaXMgYmVpbmcgbWFkZSwgdG8gbWFrZSBpdCBjbGVhcmVyIHdoYXQgY29tbWFuZHMvcmVzcG9uc2VzIGNhbWUgb24gd2hhdAogIGNvbm5lY3Rpb24uCgogIEFkZGVkIHRocmVlIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS0zcC11cmwsIC0tM3AtdXNlciBhbmQgLS0zcC1xdW90ZS4KCiAgRG9jdW1lbnRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgcmVsYXRlZAogIHRvIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCiAgKFRlbXBvcmFyaWx5KSBkaXNhYmxlZCB0aGUgYWJpbGl0eSB0byByZS11c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3IgdGhlCiAgc291cmNlIGNvbm5lY3Rpb24uIFRoaXMgaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBmb3JjZSBhIG5ldyBpbiBjYXNlIHRoZQogIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIHRoZSBzYW1lIGhvc3QsIGFuZCB0aGUgaG9zdCBuYW1lIGNoZWNrIGlzIHRyaWNraWVyIG5vdwogIHdoZW4gdGhlIHNvdXJjZSBpcyBpZGVudGlmaWVkIHdpdGggYSBmdWxsIFVSTCBpbnN0ZWFkIG9mIGEgcGxhaW4gaG9zdCBuYW1lCiAgbGlrZSBiZWZvcmUuCgogIFRPRE8gKHNob3J0LXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBxdW90ZSBzdXBwb3J0LiBUaGUgb3B0aW9ucyBhcmUKICB0aGVyZSwgd2UgbmVlZCB0byBhZGQgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlaXIgZnVuY3Rpb25hbGl0eS4KCiAgVE9ETyAobG9uZy10ZXJtKSBmb3IgM3JkIHBhcnR5IHRyYW5zZmVyczogSVB2NiBzdXBwb3J0IChFUFJUIGFuZCBFUFNWIGV0YykKICBhbmQgU1NML1RTTCBzdXBwb3J0LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDUpCi0gUGhpbGlwcGUgSGFtZWF1IGZvdW5kIG91dCB0aGF0IC1RICIrW2NvbW1hbmRdIiBkaWRuJ3Qgd29yaywgYWx0aG91Z2ggc29tZQogIGNvZGUgd2FzIHdyaXR0ZW4gZm9yIGl0LiBJIGZpeGVkIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMjI3IHRvIHZlcmlmeSBpdC4KICBUaGUgY3VybC4xIG1hbiBwYWdlIGRpZG4ndCBtZW50aW9uIHRoZSAnKycgc28gSSBhZGRlZCBpdC4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA1KQotIFN0ZXBoYW4gQmVyZ21hbm4gbWFkZSBsaWJjdXJsIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUIGlmIGFuIEZUUCBVUkwKICBjb250YWlucyAlMGEgb3IgJTBkIGluIHRoZSB1c2VyLCBwYXNzd29yZCBvciBDV0QgcGFydHMuIChBIGZ1dHVyZSBmaXggd291bGQKICBpbmNsdWRlIGRvaW5nIGl0IGZvciAlMDAgYXMgd2VsbCAtIHNlZSBLTk9XTl9CVUdTIGZvciBkZXRhaWxzLikgVGVzdCBjYXNlCiAgMjI1IGFuZCAyMjYgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhpcwoKLSBTdGVwaGFuIEJlcmdtYW5uIHBvaW50ZWQgb3V0IHR3byBmbGF3cyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlZDoKCiAgMSkgdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3RpbGwgcmVhZCBhbmQgdXNlZCB0byBzZXQgSFRUUCBwcm94eQoKICAyKSB5b3UgY291bGRuJ3QgZGlzYWJsZSBodHRwIHByb3h5IHdpdGggQ1VSTE9QVF9QUk9YWSAoc2luY2UgdGhlIG9wdGlvbiB3YXMKICAgICBkaXNhYmxlZCkuIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIGFwcHMgbWF5IHdhbnQgdG8gZGlzYWJsZSBIVFRQIHByb3h5CiAgICAgd2l0aG91dCBhY3R1YWxseSBrbm93aW5nIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIGRpc2FibGUgSFRUUCBvciBub3QuCgogIEJhc2VkIG9uIFN0ZXBoYW4ncyBwYXRjaCwgYm90aCB0aGVzZSBpc3N1ZXMgc2hvdWxkIG5vdyBiZSBmaXhlZC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA1KQotIENvZHkgSm9uZXMnIGVuaGFuY2VkIHZlcnNpb24gb2YgU2FtdWVsIETtYXogR2FyY+1hJ3MgTVNWQyBtYWtlZmlsZSBwYXRjaCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDUpCi0gQWxleCBha2EgV2luZEVhZ2xlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBkb2luZyAiY3VybCAtdiBkaWN0aW9uYXJ5LmNvbSIsIGN1cmwKICBhc3N1bWVkIHRoaXMgdXNlZCB0aGUgRElDVCBwcm90b2NvbC4gV2hpbGUgZ3Vlc3NpbmcgcHJvdG9jb2xzIHdpbGwgcmVtYWluCiAgZnV6enksIEkndmUgbm93IG1hZGUgc3VyZSB0aGF0IHRoZSBob3N0IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAiW3Byb3RvY29sXS4iCiAgZm9yIHRoZW0gdG8gYmUgYSB2YWxpZCBndWVzc2FibGUgbmFtZS4gSSBhbHNvIHJlbW92ZWQgImh0dHBzIiBhcyBhIHByZWZpeAogIHRoYXQgaW5kaWNhdGVzIEhUVFBTLCBzaW5jZSB3ZSBoYXJkbHkgZXZlciBzZWUgYW55IGhvc3QgbmFtZXMgdXNpbmcgdGhhdC4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA1KQotIEluc3BpcmVkIGJ5IE1hcnRpam4gS29zdGVyJ3MgcGF0Y2ggYW5kIGV4YW1wbGUgc291cmNlIGF0CiAgaHR0cDovL3d3dy5ncmVlbmhpbGxzLmNvLnVrL21hay9nZW50b28vY3VybC1laW50ci1idWcuYywgSSBub3cgbWFkZSB0aGUKICBzZWxlY3QoKSBhbmQgcG9sbCgpIGNhbGxzIHByb3Blcmx5IGxvb3AgaWYgdGhleSByZXR1cm4gLTEgYW5kIGVycm5vIGlzCiAgRUlOVFIuIGdsaWJjIGRvY3MgZm9yIHRoaXMgaXMgZm91bmQgaGVyZToKICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliYy9tYW51YWwvaHRtbF9ub2RlL0ludGVycnVwdGVkLVByaW1pdGl2ZXMuaHRtbAoKICBUaGlzIGxhc3QgbGluayBzYXlzIEJTRCBkb2Vzbid0IGhhdmUgdGhpcyAiZWZmZWN0Ii4gV2lsbCB0aGVyZSBiZSBhIHByb2JsZW0KICBpZiB3ZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8KCkRhbmllbCAoMTEgSmFudWFyeSAyMDA1KQotIERhbiBUb3JvcCBjbGVhbmVkIHVwIGEgZmV3IG5vIGxvbmdlciB1c2VkIHZhcmlhYmxlcyBmcm9tIERhdmlkIFBoaWxsaXBzJwogIHNlbGVjdCgpIG92ZXJoYXVsIGZpeC4KCi0gQ3lyaWxsIE9zdGVyd2FsZGVyIHBvc3RlZCBhIGRldGFpbGVkIGFuYWx5c2lzIGFib3V0IGEgYnVnIHRoYXQgb2NjdXJzIHdoZW4KICB1c2luZyBhIGN1c3RvbSBIb3N0OiBoZWFkZXIgYW5kIGN1cmwgZmFpbHMgdG8gc2VuZCBhIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCB0aHVzIGNyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kcyBpdC4gSXQKICB0aGVuIHNlbnQgdHdvIEhvc3Q6IGhlYWRlcnMuIEN5cmlsbCdzIGFuYWx5c2lzIHdhcyBwb3N0ZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTAxLzAwMjIuaHRtbAoKLSBCcnVjZSBNaXRjaGVuZXIgaWRlbnRpZmllZCAoYnVnIHJlcG9ydCAjMTA5OTY0MCkgdGhlIG5ldmVyLWVuZGluZyBTT0NLUzUKICBwcm9ibGVtIHdpdGggdGhlIHZlcnNpb24gYnl0ZSBhbmQgdGhlIGNoZWNrIGZvciBiYWQgdmVyc2lvbnMuIEJydWNlIGhhcyBsb3RzCiAgb2YgY2x1ZXMgb24gdGhpcywgYW5kIGJhc2VkIG9uIGhpcyBzdWdnZXN0aW9uIEkndmUgbm93IHJlbW92ZWQgdGhlIGNoZWNrIG9mCiAgdGhhdCBieXRlIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY29udGFpbiAxIG9yIDUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNSkKLSBQYXZlbCBPcmVob3YgcmVwb3J0ZWQgbWVtb3J5IHByb2JsZW1zIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBpbiBidWcgcmVwb3J0CiAgIzEwOTg4NDMuIEluIHNob3J0LCBhIHNoYXJlZCBETlMgY2FjaGUgd2FzIHNldHVwIGZvciBhIG11bHRpIGhhbmRsZSBhbmQgd2hlbgogIHRoZSBzaGFyZWQgY2FjaGUgd2FzIGRlbGV0ZWQgYmVmb3JlIHRoZSBpbmRpdmlkdWFsIGVhc3kgaGFuZGxlcywgdGhlIGxhdHRlcgogIGNsZWFudXBzIGNhdXNlZCByZWFkL3dyaXRlcyB0byBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCi0gSHpoaWp1biByZXBvcnRlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBTU0wgY2VydGlmaWNhdGUgY29kZSwgdGhhdCBsZWFrZWQgdGhlCiAgcmVtb3RlIGNlcnRpZmljYXRlIG5hbWUgd2hlbiBpdCBkaWRuJ3QgbWF0Y2ggdGhlIHVzZWQgaG9zdCBuYW1lLgoKR2lzbGUgKDggSmFudWFyeSAyMDA1KQotIEFkZGVkIE1ha2VmaWxlLldhdGNvbSBmaWxlcyAoc3JjL2xpYikuIFVwZGF0ZWQgTWFrZWZpbGUuZGlzdC4KCkRhbmllbCAoNyBKYW51YXJ5IDIwMDUpCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc2NyaXB0J3MgdmFsZ3JpbmQgbG9nIHBhcnNlciB0byBhY3R1YWxseSB3b3JrISBBbHNvIGFkZGVkCiAgdGhlIGFiaWxpdHkgdG8gZGlzYWJsZSB0aGUgbG9nIHNjYW5uZXIgZm9yIHNwZWNpZmljIHRlc3QgY2FzZXMuIFRlc3QgY2FzZQogIDUwOSByZXN1bHRzIGluIG51bWVyb3VzIHByb2JsZW1zIGFuZCBsZWFrcyBpbiBPcGVuU1NMIGFuZCBoYXMgdG8gZ2V0IGl0CiAgZGlzYWJsZWQuCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgc2luZ2xlLWJ5dGUgcmVhZCBvdXQgb2YgYm91bmRzIGluIHRlc3QgY2FzZSAzOSBpbiB0aGUgY3VybCB0b29sIGNvZGUKICAoaS5lIG5vdCBpbiB0aGUgbGlicmFyeSkuCgotIEJ1ZyByZXBvcnQgIzEwOTcwMTkgaWRlbnRpZmllZCBhIHByb2JsZW0gd2hlbiBkb2luZyAtZCAiZGF0YSIgd2l0aCAtRyBhbmQKICBzZW5kaW5nIGl0IHRvIHR3byBVUkxzIHdpdGgge30uIEFkZGVkIHRlc3QgMTk5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICg0IEphbnVhcnkgMjAwNSkKLSBNYXJ0eSBLdWhydCBhZGp1c3RlZCBhIFZNUyBidWlsZCBzY3JpcHQgc2xpZ2h0bHkKCi0gS2FpIFNvbW1lcmZlbGQgYW5kIEdpc2xlIFZhbmVtIGZpeGVkIGxpYmN1cmwgdG8gYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQgb24KICBXaW4yMDAwLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwNSkKLSBBbGV4IE5lYmxldHQgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMgc2xpZ2h0bHkuCg==