ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDEpCi0gQ3VybF9yZWFkKCkgYW5kIGN1cmxfcmVhZCgpIG5vdyByZXR1cm4gYSBzc2l6ZV90IGZvciB0aGUgc2l6ZSwgYXMgaXQgaGFkIHRvCiAgYmUgYWJsZSB0byByZXR1cm4gLTEuIFRoZSB0ZWxuZXQgc3VwcG9ydCBjcmFzaGVkIGR1ZSB0byB0aGlzIGFuZCB0aGVyZSB3YXMKICBhIHBvc3NpYmlsaXR5IHRvIHdlaXJkIGJlaGF2aW91ciBhbGwgb3Zlci4KCi0gQWRkZWQgYSBjb25maWd1cmUuaW4gY2hlY2sgZm9yIGEgd29ya2luZyBnZXRhZGRyaW5mbygpIGlmIElQdjYgaXMgcmVxdWVzdGVkLgogIEkgYWxzbyBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZlYXR1cmUgLS1lbmFibGUtZGVidWcgd2hpY2ggc2V0cyBhIGNvdXBsZQogIG9mIGNvbXBpbGVyIG9wdGlvbnMgd2hlbiB1c2VkLiBJdCBhc3N1bWVzIGdjYy4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDAxKQotIEkgZmluYWxseSB0b29rIGEgc3RhYiBhdCB0aGUgbG9uZy10ZXJtIEZJWE1FIGl0ZW0gSSd2ZSBoYWQgb24gbXlzZWxmLCBhbmQKICBub3cgbGliY3VybCB3aWxsIHByb3Blcmx5IHdvcmsgd2hlbiBkb2luZyBhIEhUVFAgcmFuZ2UtcmVxdWVzdCB0aGF0IGZvbGxvd3MKICBhIExvY2F0aW9uOi4gUHJldmlvdXNseSB0aGF0IHdvdWxkIG1ha2UgbGliY3VybCBmYWlsIHNheWluZyB0aGF0IHRoZSBzZXJ2ZXIKICBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCByYW5nZSByZXF1ZXN0cy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yIHRoZSBIVFRQIFBVVCByZXN1bWUgdGhpbmcgKHRlc3QgY2FzZSAzMykuCgpWZXJzaW9uIDcuNi4xLXByZTEKCkRhbmllbCAoMjkgSmFudWFyeSAyMDAxKQotIFlldCBhbm90aGVyIENvbnRlbnQtUmFuZ2UgY2hhbmdlLiBPayBub3c/IEJvYiBTY2hhZGVyIGNoZWNrcyBmcm9tIGhpcyBlbmQgCiAgYW5kIGl0IHdvcmtzIGZvciBoaW0uCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwMSkKLSBTbyB0aGUgSFRUUCBQVVQgcmVzdW1lIGZpeCB3YXNuJ3QgZ29vZC4gVGhlcmUgc2hvdWxkIGFwcGVhcmFudGx5IGJlIGEKICBDb250ZW50LVJhbmdlIGhlYWRlciB3aGVuIHJlc3VtaW5nIGEgUFVULgoKLSBJIG5vdGljZWQgSSBicm9rZSB0aGUgZG93bmxvYWQtY2hlY2sgdGhhdCB2ZXJpZmllcyB0aGF0IGEgcmVzdW1lZCBIVFRQCiAgZG93bmxvYWQgaXMgYWN0dWFsbHkgcmVzdW1lZC4gSXQgZ290IGJyb2tlIGJlY2F1c2UgbXkgbmV3ICdodHRwcmVxJyBmaWVsZAogIGluIHRoZSBtYWluIGN1cmwgc3RydWN0LiBJIHNob3VsZCBnZXQgc2xhcHBlZC4gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IKICB0aGlzIG5vdywgc28gSSB3b24ndCBiZSBhYmxlIHRvIHJ1aW4gdGhpcyBhZ2FpbiB3aXRob3V0IG5vdGljaW5nLgoKLSBBZGRlZCBhIHRlc3QgY2FzZSBmb3IgY29udGVudC1sZW5ndGggdmVyaWZ5aW5nIHdoZW4gZG93bmxvYWRpbmcgSFRUUC4KCi0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdGl0bGUgc2F5IGlmIHRoZSB0cmFuc2ZlciBpcyBiZWluZyB0cmFuc2ZlcmVkLiBJdAogIG1ha2VzIHRoZSBvdXRwdXQgc2xpZ2h0bHkgYmV0dGVyIGZvciByZXN1bWVzLgoKLSBXaGVuIGRlYWxpbmcgd2l0aCBMb2NhdGlvbjogYW5kIEhUVFAgcmV0dXJuIGNvZGVzLCBsaWJjdXJsIHdpbGwgbm90IGF0dGVtcHQKICB0byBmb2xsb3cgdGhlIHNwaXJpdCBvZiBSRkMyNjE2IGJldHRlci4gSXQgbWVhbnMgdGhhdCB3aGVuIFBPU1RpbmcgdG8gYQogIFVSTCB0aGF0IGlzIGJlaW5nIGZvbGxvd2luZyB0byBhIHNlY29uZCBwbGFjZSwgdGhlIHN0YW5kYXJkIHdpbGwganVkZ2Ugb24KICB3aGF0IHRvIGRvLiBBbGwgSFRUUCBjb2RlcyBleGNlcHQgMzAzIGFuZCAzMDUgd2lsbCBjYXVzZSBjdXJsIHRvIG1ha2UgYQogIHNlY29uZCBQT1NUIG9wZXJhdGlvbi4gMzAzIHdpbGwgbWFrZSBhIEdFVCBhbmQgMzA1IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgoKICBJIGFsc28gd3JvdGUgdHdvIHRlc3QgY2FzZXMgZm9yIHRoaXMgUE9TVC9HRVQvTG9jYXRpb24gc3R1ZmYuCgpWZXJzaW9uIDcuNgoKRGFuaWVsICgyNiBKYW51YXJ5IDIwMDEpCi0gTG90cyBvZiBtYWlscyBiYWNrIGFuZCBmb3J0aCB3aXRoIEJvYiBTY2hhZGVyIGZpbmFsbHkgbWFkZSBtZSBhZGQgYSBzbWFsbAogIHBpZWNlIG9mIGNvZGUgaW4gdGhlIEhUVFAgZW5naW5lIHNvIHRoYXQgSFRUUCB1cGxvYWQgcmVzdW1lIHdvcmtzLiBZb3UgY2FuCiAgbm93IGRvIGFuIG9wZXJhdGlvbiBsaWtlICdjdXJsIC1UIGZpbGUgLUMgPG9mZnNldD4gPFVSTD4nIGFuZCBjdXJsIHdpbGwgUFVUCiAgdGhlIGVuZGluZyBwYXJ0IG9mIHRoZSBmaWxlIHN0YXJ0aW5nIGF0IGdpdmVuIG9mZmV0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgoKVmVyc2lvbiA3LjYtcHJlNAoKRGFuaWVsICgyNSBKYW51YXJ5IDIwMDEpCi0gSSB0b29rIGhvbGQgb2YgUmljayBKb25lcycgcXVlc3Rpb24gd2h5IHdlIGRvbid0IHVzZSByZWN2KCkgYW5kIHNlbmQoKSBmb3IKICByZWFkaW5nL3dyaXRpbmcgdG8gdGhlIHNvY2tldHMgYW5kIEkndmUgbm93IG1vZGlmaWVkIHRoZSBzcmVhZCgpIGFuZAogIHN3cml0ZSgpIG1hY3JvcyB0byB1c2UgdGhlbSBpbnN0ZWFkLiBJZiBub3RoaW5nIGVsc2UsIHRoZXkgY291bGQgYmUgdGVzdGVkCiAgaW4gdGhlIG5leHQgYmV0YS1yb3VuZCBjb21pbmcgcmlnaHQgdXAuCgotIEplZmYgTW9ycm93IGZvdW5kIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwncyB1c2FnZSBvZiBTU0xfcmVhZCgpIGFuZCBzdXBwbGllZAogIGhpcyByZXNlYXJjaCByZXN1bHRzIGluIGhvdyB0byBmaXggdGhpcy4gSXQgdHVybnMgb3V0IHdlIGhhdmUgdG8gaW52b2tlIHRoZQogIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMgaW4gc29tZSBjYXNlcy4gVGhlIHNhbWUgZ29lcyBmb3IgdGhlIFNTTF93cml0ZSgpLgoKICBJIG1hZGUgc29tZSByYXRoZXIgZHJhc3RpYyBjaGFuZ2VzIGFsbCBvdmVyIGxpYmN1cmwgdG8gbWFrZSBhbGwgd3JpdGVzIGFuZAogIHJlYWRzIGdldCBkb25lIG9uIG9uZSBzaW5nbGUgcGxhY2Ugc28gdGhhdCB0aGlzIHJlcGVhdGVkLWF0dGVtcHRzIHRoaW5nCiAgd291bGQgb25seSBoYXZlIHRvIGJlIGltcGxlbWVudGVkIGF0IG9uZSBwb2ludC4KCi0gUmljayBKb25lcyBzcG90dGVkIHRoYXQgdGhlICd0b3RhbCB0aW1lJyBjb3VudGVyIHJlYWxseSBkaWRuJ3QgbWVhc3VyZSB0aGUKICB0b3RhbCB0aW1lIHZlcnkgYWNjdXJhdGUgb24gc3Vic2Vjb25kIGxldmVscy4KCi0gSm9oYW4gTmlsc3NvbiBwb2ludGVkIG91dCB0aGUgbmVlZCB0byBtb3JlIGNsZWFybHkgc3BlY2lmeSB0aGF0IHRoZSB0aW1lb3V0CiAgdmFsdWUgeW91IHNldCBmb3IgYSBkb3dubG9hZCBpcyBmb3IgdGhlICplbnRpcmUqIGRvd25sb2FkLiBUaGVyZSdzIGN1cnJlbnRseQogIG5vIG9wdGlvbiBhdmFpbGFibGUgdGhhdCBzZXRzIGEgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24gcGhhc2Ugb25seS4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHN1Ym1pdHRlZCBhIHNlcmllcyBvZiBwYXRjaGVzIHJlcXVpcmVkIHRvIGdldCBjdXJsIHRvIGNvbXBpbGUKICBwcm9wZXJseSB3aXRoIGN5Z3dpbi4KCi0gUm9iZXJ0IFdlYXZlciBwb3N0ZWQgYSBmaXggZm9yIHRoZSB3aW4zMiBzZWN0aW9uIG9mIHRoZSBjdXJsX2dldGVudigpIGNvZGUKICB0aGF0IGNvcnJlY3RlZCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhay4KCi0gQWRkZWQgY29tbWVudHMgaW4gYSBmZXcgZmlsZXMgaW4gYSBzdWRkZW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBzb3VyY2VzIG1vcmUKICBlYXN5IHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQhCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMSkKLSBBZGRlZCBzaW1wbGUgSVB2NiBkZXRlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIG1hZGUgdGhlIHZlcnNpb24KICBzdHJpbmcgYWRkICdpcHY2JyB0byB0aGUgZW5hYmxlIHNlY3Rpb24gaW4gdGhhdCBjYXNlLiBFTkFCTEVfSVBWNiB3aWxsIGJlCiAgc2V0IGlmIGN1cmwgaXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQgZW5hYmxlZC4KCi0gQWRkZWQgYSBwYXJzZXIgZm9yIElQdjYtc3R5bGUgc3BlY2lmaWVkIElQLWFkZHJlc3NlcyBpbiBhIFVSTC4gVGh1cywgd2hlbgogIElQdjYgZ2V0cyBlbmFibGVkIHNvb24sIHdlIGNhbiB1c2UgVVJMcyBsaWtlICdbMDo6MV06ODAnLi4uCgotIE1hZGUgdGhlIFVSTCBnbG9iYmluZyBpbiB0aGUgY2xpZW50IHBvc3NpYmxlIHRvIGZhaWwgc2lsZW50bHkgaWYgdGhlcmUncyBhbgogIGVycm9yIGluIHRoZSBnbG9iYmluZy4gSXQgbWFrZXMgaXQgYWxtb3N0IGludHVpdGl2ZSwgc28gd2hlbiB5b3UgZG9uJ3QKICBmb2xsb3cgdGhlIHN5bnRheCBydWxlcywgZ2xvYmJpbmcgaXMgc2ltcGx5IHN3aXRjaGVkIG9mZiBhbmQgdGhlIHJhdyBzdHJpbmcKICBpcyB1c2VkIGluc3RlYWQuCgogIEkgc3RpbGwgdGhpbmsgd2UnbGwgZ2V0IHByb2JsZW1zIHdpdGggSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMgd2hlbiB3ZSAqd2FudCoKICBnbG9iYmluZyBvbiBwYXJ0cyBvZiB0aGUgVVJMIGFzIHRoZSBpbml0aWFsIHBhcnQgb2YgdGhlIFVSTCB3aWxsIGZvciBzdXJlCiAgc2VyaW91c2x5IGNvbmZ1c2UgdGhlIGdsb2JiZXIuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBzdXBwbGllZCBhIHByb2dyZXNzIG1ldGVyIHBhdGNoIHRoYXQgbWFrZXMgaXQgbG9vayBiZXR0ZXIgZXZlbgogIGR1cmluZyBzbG93IHN0YXJ0cy4gUHJldmlvdXNseSBpdCBtYWRlIHNvbWUgc2lsbHkgYXNzdW1wdGlvbnMuLi4KCi0gQWRkZWQgdHdvIEZUUCB0ZXN0cyBmb3IgLVEgYW5kIC1RIC0gc3R1ZmYgc2luY2UgaXQgd2FzIGJlaW5nIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QuIEhhZCB0byBjb3JyZWN0IHRoZSBmdHBzZXJ2ZXIucGwgdG9vIGFzIGl0IGJ1Z2dlZCBzbGlnaHRseS4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIExvY2F0aW9uOiBwYXJzZXJzIGRlYWwgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRodXMgSSByZW1vdmVkIHRoZSBsYXN0CiAgY29kZSB0aGF0IHJlc3RyaWN0cyB0aGUgbGVuZ3RoIG9mIFVSTHMgdGhhdCBjdXJsIHN1cHBvcnRzLgoKLSBBZGRlZCBhIC0tZ2xvYm9mZiB0ZXN0IGNhc2UgKCMyOCkgYW5kIGl0IHF1aWNrbHkgaWRlbnRpZmllZCBhIG1lbW9yeSBwcm9ibGVtCiAgaW4gc3JjL21haW4uYyB0aGF0IEkgdG9vayBjYXJlIG9mLgoKVmVyc2lvbiA3LjYtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgdHdvIGZvcm1lciBmaWxlcyBsaWIvZG93bmxvYWQuYyBhbmQgbGliL2hpZ2hsZXZlbC5jIGJlY29tZSB0aGUgbmV3CiAgbGliL3RyYW5zZmVyLmMgd2hpY2ggbWFrZXMgbW9yZSBzZW5zZS4gSSBhbHNvIGRpZCB0aGUgcmVuYW1lIGZyb20gVHJhbnNmZXIoKQogIHRvIEN1cmxfVHJhbnNmZXIoKSBpbiB0aGUgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgdXNlIHRoZSB0cmFuc2ZlciBmdW5jdGlvbgogIGluIHRoZSBzcGlyaXQgb2YgdXNpbmcgQ3VybF8gcHJlZml4IGZvciBsaWJyYXJ5LXNjb3BlZCBnbG9iYWwgc3ltYm9scy4KCkRhbmllbCAoMTEgSmFudWFyeSAyMDAxKQotIEFkZGVkIC1nLy0tZ2xvYm9mZiB0aGF0IHN3aXRjaGVzIE9GRiB0aGUgVVJMIGdsb2JiaW5nIGFuZCB0aHVzIGVuYWJsZXMge31bXQogIGxldHRlcnMgdG8gYmUgcGFydCBvZiB0aGUgVVJMLiBEbyBub3RlIHRoYXQgUkZDMjM5NiBzZWN0aW9uIDIuNC4zIGV4cGxpY2l0bHkKICBtZW50aW9uIHRoZXNlIGxldHRlcnMgdG8gYmUgZXNjYXBlZC4gVGhpcyB3YXMgcG9zdGVkIGFzIGEgZmVhdHVyZSByZXF1ZXN0IGJ5CiAgSm9yZ2UgR3V0aWVycmV6IGFuZCBhcyBhIGJ1ZyBieSBUZXJyeS4KCi0gU2hvcnQgb3B0aW9ucyB0byBjdXJsIHRoYXQgcmVxdWlyZXMgcGFyYW1ldGVycyBjYW4gbm93IGJlIHNwZWNpZmllZCB3aXRob3V0CiAgaGF2aW5nIHRoZSBvcHRpb24gYW5kIGl0cyBwYXJhbWV0ZXIgc3BhY2Ugc2VwYXJhdGVkLiAtb2ZpbGUgd29ya3MgYXMgZ29vZCBhcwogIC1vIGZpbGUuIC1tMjAgaXMgZXF1YWwgdG8gLW0gMjAuIERvIG5vdGUgdGhhdCB0aGlzIGdvZXMgZm9yIHNpbmdsZS1sZXR0ZXIKICBvcHRpb25zIG9ubHksIHZlcmJvc2UgLS1sb25nLXN0eWxlIG9wdGlvbnMgc3RpbGwgbXVzdCBiZSBzZXBhcmF0ZWQgd2l0aAogIHNwYWNlIGZyb20gdGhlaXIgcGFyYW1ldGVycy4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDEpCi0gRnJhbmNpcyBEYWdlbmFpcyByZXBvcnRlZCB0aGF0IHRoZSBTQ08gY29tcGlsZXIgc3RpbGwgZmFpbHMgd2hlbiBjb21waWxpbmcKICBjdXJsIGR1ZSB0byB0aGF0IGdldHBhc3NfcigpIHByb3RvdHlwZS4gSSd2ZSBub3cgcHV0IGl0IGFyb3VuZCAjaWZuZGVmCiAgSEFWRV9HRVRQQVNTX1IgaW4gYW4gYXR0ZW1wdCB0byBwbGVhc2UgdGhlIFNDTyBzeXN0ZW1zLgoKLSBNYWRlIHNvbWUgbWlub3IgY29ycmVjdGlvbnMgdG8gZ2V0IHRoZSBjbGllbnQgdG8gY2xlYW51cCBwcm9wZXJseSBhbmQgSSBtYWRlCiAgdGhlIHNlcGFyYXRvciB3b3JrIGFnYWluIHdoZW4gZ2V0dGluZyBtdWx0aXBsZSBnbG9iYmVkIFVSTHMgdG8gc3Rkb3V0LgoKLSBXb3JrZWQgd2l0aCBMb2ljIERhY2hhcnkgdG8gZ2V0IHRoZSBtYWtlIGRpc3QgYW5kIG1ha2UgZGlzdGNoZWNrIHdvcmsKICBjb3JyZWN0bHkuIFRoZSAnbWFrZXRneicgc2NyaXB0IGlzIG5vdyB1c2luZyB0aGUgYXV0b21ha2UgZ2VuZXJhdGVkICdtYWtlCiAgZGlzdCcgd2hlbiBjcmVhdGluZyByZWxlYXNlIGFyY2hpdmVzLiBMb2ljIHN1Y2Nlc3NmdWxseSBtYWRlICdtYWtlIHJwbXMnCiAgYXV0b21hdGljYWxseSBidWlsZCBSUE1zIQoKTG9pYyBEYWNoYXJ5ICg2IEphbnVhcnkgMjAwMSkKLSBBdXRvbWF0ZWQgZ2VuZXJhdGlvbiBvZiBycG0gcGFja2FnZXMsIG5vIG5lZWQgdG8gYmUgcm9vdC4KCi0gbWFrZSBkaXN0Y2hlY2sgZ2VuZXJhdGVzIGEgcHJvcGVyIGRpc3RyaWJ1dGlvbiAoRVhUUkFfRElTVAogIGluIGFsbCBNYWtlZmlsZS5hbSBtb2RpZmllZCB0byBtYXRjaCBGSUxFUykuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDAxKQotIEh1Z2UgY2xpZW50LXNpZGUgaGFjazogbm93IG11bHRpcGxlIFVSTHMgYXJlIHN1cHBvcnRlZC4gQW55IG51bWJlciBvZiBVUkxzCiAgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhleSdsbCBhbGwgYmUgZG93bmxvYWRlZC4gVGhlcmUKICBtdXN0IGJlIGEgY29ycmVzcG9uZGluZyAtbyBvciAtTyBmb3IgZWFjaCBVUkwgb3IgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvCiAgc3Rkb3V0LiBUaGlzIG5lZWRzIG1vcmUgdGVzdGluZywgdGltZSB0byByZWxlYXNlIGEgNy42LXByZSBwYWNrYWdlLgoKLSBUaGUga3JiNCBzdXBwb3J0IHdhcyBicm9rZW4gaW4gdGhlIHJlbGVhc2UuIEZpeGVkIG5vdy4KCi0gSHVnZSBpbnRlcm5hbCBzeW1ib2wgcmVuYW1lIG9wZXJhdGlvbi4gQWxsIG5vbi1zdGF0aWMgYnV0IHN0aWxsIGxpYi1pbnRlcm5hbAogIHN5bWJvbHMgc2hvdWxkIG5vdyBiZSBwcmVmaXhlZCB3aXRoICdDdXJsXycgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGggb3RoZXIKICBsaWJzLiBBbGwgcHVibGljIHN5bWJvbHMgc2hvdWxkIGJlIHByZWZpeGVkIHdpdGggJ2N1cmxfJyBhbmQgdGhlIHJlc3Qgc2hvdWxkCiAgYmUgc3RhdGljIGFuZCB0aHVzIGludmlzaWJsZSB0byB0aGUgb3V0c2lkZSB3b3JsZC4gSSB1cGRhdGVkIHRoZSBJTlRFUk5BTFMKICBkb2N1bWVudCB0byBzYXkgdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjUuMgoKRGFuaWVsICg0IEphbnVhcnkgMjAwMSkKLSBBcyBLZXZpbiBQIFJvdGggc3VnZ2VzdGVkLCBJJ3ZlIGFkZGVkIHRleHQgdG8gdGhlIG1hbiBwYWdlIGZvciBldmVyeSBjb21tYW5kCiAgbGluZSBvcHRpb24gYW5kIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBzcGVjaWZ5IHRoYXQgb3B0aW9uIG1vcmUgdGhhbgogIG9uY2UuIFRoYXQgaGFzbid0IGJlZW4gZXhhY3RseSBjcnlzdGFsIGNsZWFyIGJlZm9yZS4KCi0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBwb3NzaWJsZSB0byBydW4gZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4gRm9yCiAgb2RkIHJlYXNvbnMgSSBjYW4ndCBidWlsZCBjdXJsIHByb3Blcmx5IG91dHNpZGUgdGhvdWdoLiBJdCBoYXMgdG8gZG8gd2l0aAogIGN1cmwncyBkZXBlbmRlbmNpZXMgb24gbGliY3VybC4uLgoKLSBDdXQgb2ZmIGFsbCBvbGRlciAoZGF0ZWQgMTk5OSBhbmQgZWFybGllcikgQ0hBTkdFUyBlbnRyaWVzIGZyb20gdGhpcyBmaWxlLgogIFRoZSBvbGRlciBwaWVjZSBpcyBuYW1lZCBDSEFOR0VTLjAgYW5kIGlzIGFkZGVkIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSBpbgogIGNhc2UgYW55b25lIHdvdWxkIG5lZWQgaXQuCgotIEkgYWRkZWQgYW5vdGhlciBmaWxlICdDVlMtSU5GTycgdG8gdGhlIENWUy4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKICBmaWxlcyBpbiB0aGUgQ1ZTIHRoYXQgYXJlbid0IGluY2x1ZGVkIGluIHJlbGVhc2UgYXJjaGl2ZXMgYW5kIGhvdyB0byBidWlsZAogIGN1cmwgd2hlbiB5b3UgZ2V0IHRoZSBzb3VyY2VzIG9mZiBDVlMuCgotIFVwZGF0ZWQgQ09OVFJJQlVURSBhbmQgRkFRIGR1ZSB0byB0aGUgbmV3IGxpY2Vuc2UuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDAxKQotIFJlbmFtZWQgUkVBRE1FLmxpYmN1cmwgdG8gTElCQ1VSTAoKLSBDaGFuZ2VkIGhlYWRlcnMgaW4gYWxsIHNvdXJjZXMgZmlsZXMgdG8gdGhlIG5ldyBkdWFsIGxpY2Vuc2UgY29uY2VwdCBvZgogIGN1cmw6IHVzZSB0aGUgTUlUL1ggZGVyaXZhdGUgbGljZW5zZSAqb3IqIE1QTC4gVGhlIExFR0FMIGZpbGUgd2FzIHVwZGF0ZWQKICBhY2NvcmRpbmdseSBhbmQgdGhlIE1QTCAxLjEgYW5kIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2VzIGFyZSBub3cgcGFydCBvZiB0aGUKICByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDMwIERlY2VtYmVyIDIwMDApCi0gTWFkZSBhbGwgRlRQIGNvbW1hbmRzIGdldCBzZW50IHdpdGggdGhlIHRyYWlsaW5nIENSTEYgaW4gb25lIHNpbmdsZSB3cml0ZSgpCiAgYXMgc3BsaXR0aW5nIHRoZW0gdXAgc2VlbXMgdG8gY29uZnVzZSBhdCBsZWFzdCBzb21lIGZpcmV3YWxscyAoRlctMSBiZWluZwogIG9uZSBtYWpvcikuCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDApCi0gQWRkZWQgZmlsZSBkZXNyY2lwdG9yIGFuZCBGSUxFIGhhbmRsZSBsZWFrIGRldGVjdGlvbiB0byB0aGUgbWVtZGVidWcgc3lzdGVtCiAgYW5kIHRodXMgSSBmb3VuZCBhbmQgcmVtb3ZlZCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrYWdlIGluIHRoZSBmdHAgcGFydHMKICB0aGF0IGhhcHBlbmVkIHdoZW4geW91IGRpZCBQT1JUZWQgZG93bmxvYWRzLgoKLSBBZGRlZCBhbiBpbmNsdWRlIDxzdGRpby5oPiBpbiA8Y3VybC9jdXJsLmg+IHNpbmNlIGl0IHVzZXMgRklMRSAqLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDAwKQotIE11bHRpcGxlIFVSTCBkb3dubG9hZHMgd2l0aCAtTyB3YXMgc3RpbGwgYnVnZ2luZy4gTm90IGFueW1vcmUgSSB0aGluayBvcgogIGhvcGUsIG9yIGF0IGxlYXN0IEkndmUgdHJpZWQuLi4gOi1PCgotIEZyYW5jb2lzIFBldGl0amVhbiBmaXhlZCBhbm90aGVyIC1PIHByb2JsZW0KClZlcnNpb24gNy41LjEKCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMCkKLSBDbGVhbmVkIHVwIGEgZmV3IG9mIHRoZSBtYWtlZmlsZXMgdG8gdXNlIHVuaXgtc3R5bGUgbmV3bGluZXMgb25seS4gQXMgS2V2aW4KICBQIFJvdGggZm91bmQgb3V0LCBhdCBsZWFzdCBvbmUgQ1ZTIGNsaWVudCBiZWhhdmVkIHdyb25nbHkgd2hlbiBpdCBmb3VuZAogIGRpZmZlcmVudCBuZXdsaW5lIGNvbnZlbnRpb25zIHdpdGhpbiB0aGUgc2FtZSBmaWxlLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGNvcnJlY3RlZCB0aGUgTERGTEFHUyB1c2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yCiAgdGhlIFNTTCBzdHVmZi4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDAwKQotIE1hc3NpbW8gU3F1aWxsYWNlIGNvcnJlY3RseSBkZXNjcmliZWQgaG93IGxpYmN1cmwgY291bGQgdXNlIHNlc3Npb24gaWRzIHdoZW4KICBkb2luZyBTU0wgY29ubmVjdGlvbnMuCgotIEphbWVzIEdyaWZmaXRocyBmb3VuZCBvdXQgdGhhdCBjdXJsIHdvdWxkIGNyYXNoIGlmIHRoZSBmaWxlIHlvdSBzcGVjaWZ5IHdpdGgKICAtbyBpcyBzaG9ydGVyIHRoYW4gdGhlIFVSTCEgVGhpcyB0b29rIHNvbWUgaG91cnMgdG8gZnVsbHkgaHVudCBkb3duLCBidXQgaXQKICBpcyBmaXhlZCBub3cuCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMCkKLSBKYWVwaWwgS2ltIHNlbnQgdXMgbWFrZWZpbGVzIHRoYXQgYnVpbGQgY3VybCB1c2luZyB0aGUgZnJlZSB3aW5kb3dzIGJvcmxhbmQKICBjb21waWxlci4gVGhlIHJvb3QgbWFrZWZpbGUgbm93IGFjY2VwdHMgJ21ha2UgYm9ybGFuZCcgdG8gYnVpbGQgY3VybCB3aXRoCiAgdGhhdCBjb21waWxlci4KCi0gU3RlZmFuIFJhZG1hbiBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZXN0IG1ha2VmaWxlcyBkaWRuJ3QgdXNlIHRoZSBQRVJMCiAgdmFyaWFibGUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdHMgZmlndXJlIG91dC4gQWN0dWFsbHksIHlvdSBzdGlsbCBuZWVkCiAgcGVybCBpbiB0aGUgcGF0aCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gcnVuIG9rLgoKLSBSaWNoIEdyYXkgZm91bmQgbnVtZXJvdXMgcG9ydGFiaWxpdHkgcHJvYmxlbXM6CiAgKiBUaGUgU0NPIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBvbiB0aGUgZ2V0cGFzc19yKCkgcHJvdG90eXBlIGluIGdldHBhc3MuaAogICAgc2luY2UgdGhlIGN1cmwgb25lIGRpZmZlcmVkIGZyb20gdGhlIFNDTyBvbmUKICAqIFRoZSBIUFVYIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBiZWNhdXNlIG9mIGhvdyBjdXJsIGRpZCB0aGUgc2lnYWN0aW9uCiAgICBzdHVmZiBhbmQgdXNlZCBhIGRlZmluZSBIUFVYIGRvZXNuJ3QgaGF2ZSAob3IgbmVlZCkuCiAgKiBBIGZldyBtb3JlIHByb2JsZW1zIHJlbWFpbiB0byBiZSByZXNlYXJjaGVkLgoKLSBQYXVsIEhhcnJpbmd0b24gZXhwZXJpZW5jZWQgYSBjb3JlIGR1bXAgdXNpbmcgaHR0cHMuIE5vdCBtdWNoIGRldGFpbHMgeWV0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDApCi0gSvZybiBIYXJ0cm90aCBmaXhlZCBhIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBVUkxzIGFuZCAtby8tTy4KClZlcnNpb24gNy41CgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwMCkKLSBDcmFpZyBEYXZpc29uIGdhdmUgdXMgaGlzIHVwZGF0ZXMgb24gdGhlIFZDKysgbWFrZWZpbGVzLCBzbyBub3cgY3VybCBzaG91bGQKICBidWlsZCBmaW5lIHdpdGggdGhlIE1pY3Jvc29mdCBjb21waWxlciBvbiB3aW5kb3dzIHRvby4KCi0gRml4ZWQgdGhlIGxpYmN1cmwgdmVyc2lvbmluZyBzbyB0aGF0IHdlIGRvbid0IHJ1aW4gb2xkIHByb2dyYW1zIHdoZW4KICByZWxlYXNpbmcgbmV3IHNoYXJlZCBsaWJyYXJ5IGludGVyZmFjZXMuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDApCi0gUmVuYW1lZCBkb2NzL1JFQURNRS5jdXJsIHRvIGRvY3MvTUFOVUFMIHRvIGJldHRlciByZWZsZWN0IHdoYXQgdGhlIGRvY3VtZW50CiAgYWN0dWFsbHkgY29udGFpbnMuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDApCi0gSSByZW1vdmVkIGEgYnVuY2ggb2YgJyNpZiAwJyBzZWN0aW9ucyBmcm9tIHRoZSBjb2RlLiBUaGV5IG9ubHkgbWFrZSB0aGluZ3MKICBoYXJkZXIgdG8gZm9sbG93LiBBZnRlciBhbGwsIHdlIGRvIGhhdmUgYWxsIG9sZGVyIHZlcnNpb25zIGluIHRoZSBDVlMuCgpWZXJzaW9uIDcuNS1wcmU1CgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDApCi0gSSBmaWxsZWQgaW4gbW9yZSBlcnJvciBjb2RlcyBpbiB0aGUgbWFuIHBhZ2UgZXJyb3IgY29kZSBsaXN0IHRoYXQgaGFkIGJlZW4KICBsYWdnaW5nLgoKLSBKYW1lcyBHcmlmZml0aHMgbWFpbGVkIG1lIGEgZmluZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIENVUkxPUFRfTUFYUkVESVJTCiAgbGliY3VybCBvcHRpb24uIFdoZW4gdXNlZCwgaXQnbGwgcHJldmVudCBsb2NhdGlvbiBmb2xsb3dpbmcgbW9yZSB0aGFuIHRoZQogIHNldCBudW1iZXIgb2YgdGltZXMuIEl0IGlzIHVzZWZ1bCB0byBicmVhayBvdXQgb2YgZW5kbGVzcyByZWRpcmVjdC1sb29wcy4KCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0d28gdGVzdCBjYXNlcyBmb3IgZmlsZTovLy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0aGUgbGliY3VybCBDVVJMT1BUX0ZJTEVUSU1FIHNldG9wdCwgd2hlbiBzZXQgaXQgdHJpZXMgdG8gZ2V0IHRoZQogIG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHNpbmNlIGl0CiAgaW52b2x2ZXMgYW4gZXh0cmEgc2V0IG9mIGNvbW1hbmRzIG9uIEZUUCBzZXJ2ZXJzLiAoVXNpbmcgdGhlIE1EVE0gY29tbWFuZAogIHdoaWNoIGlzIG5vdCBpbiB0aGUgUkZDOTU5KQoKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGdvdCBhIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fRklMRVRJTUUgdG8gZ2V0IHRoZSB0aW1lCiAgYWZ0ZXIgYSB0cmFuc2Zlci4gSXQnbGwgcmV0dXJuIGEgemVybyBpZiBDVVJMT1BUX0ZJTEVUSU1FIHdhc24ndCB1c2VkIG9yIGlmCiAgdGhlIHRpbWUgd2Fzbid0IHBvc3NpYmxlIHRvIGdldC4KCiAgLS1oZWFkLy1JIHVzZWQgb24gYSBGVFAgc2VydmVyIHdpbGwgbm93IHByZXNlbnQgYSAnTGFzdC1Nb2RpZmllZDonIGhlYWRlcgogIGlmIGN1cmwgY291bGQgZ2V0IHRoZSB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KCi0gQWRkZWQgdGhlIG9wdGlvbiAnLS1jYWNlcnQgW2ZpbGVdJyB0byBjdXJsLCB3aGljaCBhbGxvd3MgYSBzcGVjaWZpZWQgUEVNCiAgZmlsZSB0byBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcGVlcidzIGNlcnRpZmljYXRlIHdoZW4gZG9pbmcgSFRUUFMKICBjb25uZWN0aW9ucy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQsIHJhdGhlciByZWNlbnRseSBieSBIdWxrYSBCb2h1c2xhdiBidXQKICBvdGhlcnMgaGF2ZSBhc2tlZCBmb3IgaXQgYmVmb3JlIGFzIHdlbGwuCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDApCi0gTnVtZXJvdXMgZml4ZXMgdGhlIHRlc3Qgc3VpdGUgaGFzIGJyb3VnaHQgaW50byB0aGUgZGF5bGlnaHQ6CgogICAqIGN1cmxfdW5lc2NhcGUoKSBjb3VsZCByZXR1cm4gYSB0b28gbG9uZyBzdHJpbmcKICAgKiBvbiBmdHAgdHJhbnNmZXIgZmFpbHVyZXMsIHRoZXJlIGNvdWxkIGJlIG1lbW9yeSBsZWFrcwogICAqIGZ0cCBDV0QgY291bGQgdXNlIGJhZCBkaXJlY3RvcnkgbmFtZXMKICAgKiBtZW1kZWJ1ZyBub3cgdXNlcyB0aGUgbXByaW50ZigpIHJvdXRpbmVzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkKICAgKiBmcmVlKE5VTEwpIHJlbW92ZWQgd2hlbiBkb2luZyByZXN1bWVkIHRyYW5zZmVycwoKLSBBZGRlZCBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgZm9yIEZUUC4KCi0gR2VuZXJhbCBjbGVhbnVwcyB0byBtYWtlIGxlc3Mgd2FybmluZ3Mgd2l0aCBnY2MgLVdhbGwgLXBlZGFudGljLgoKLSBJIG1hZGUgdGhlIHRlc3RzL2Z0cHNlcnZlci5wbCB3b3JrIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdHAKICBvcGVyYXRpb25zLiBQT1JULCBQQVNWLCBSRVRSLCBTVE9SLCBMSVNULCBTSVpFLCBVU0VSLCBQQVNTIGFsbCB3b3JrIG5vdy4gTm93CiAgYWxsIEkgaGF2ZSB0byBkbyBpcyBpbnRlZ3JhdGUgdGhlIGZ0cCBzZXJ2ZXIgZG9pbmdzIGluIHRoZSBydW50ZXN0cy5wbAogIHNjcmlwdCBzbyB0aGF0IGZ0cCB0ZXN0cyBjYW4gYmUgcnVuIHRoZSBzYW1lIHdheSBodHRwIHRlc3RzIGFscmVhZHkgcnVuLgoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAwKQotIE1hZGUgbGliY3VybCBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRoZSBmb3JtZXIgbGltaXQgb2YKICA0MDk2IGJ5dGVzIHdhcyBhIGJpdCBhbm5veWluZyB3aGVuIHBlb3BsZSB3YW50ZWQgdG8gdXNlIGN1cmwgdG8gcmVhbGx5IG1ha2UKICBsaWZlIHRvdWdoIG9uIGEgd2ViIHNlcnZlci4gTm93LCB0aGUgY29tbWFuZCBsaW5lIGxpbWl0IGlzIHRoZSBtb3N0IGFubm95aW5nCiAgYnV0IHRoYXQgY2FuIGJlIGNpcmN1bXZlbnRlZCBieSB1c2luZyBhIGNvbmZpZyBmaWxlLgoKICBOT1RFOiB0aGVyZSBpcyBzdGlsbCBhIDQwOTYtYnl0ZSBsaW1pdCBvbiBVUkxzIGV4dHJhY3RlZCBmcm9tIExvY2F0aW9uOgogIGhlYWRlcnMuCgotIENvcnJlY3RlZCB0aGUgc3BlbGxpbmcgb2YgJ3Jlc29sdmUnIGluIHR3byBlcnJvciBtZXNzYWdlcy4KCi0gQWxleGFuZGVyIEtvdXJha29zIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYW5kIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQhIEl0CiAgdHVybmVkIG91dCB0aGF0IGx5bnggYW5kIHdnZXQgc3VwcG9ydCBsb3dlcmNhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKICB3aGVyZSBjdXJsIG9ubHkgbG9va2VkIGZvciB0aGUgdXBwZXJjYXNlIHZlcnNpb25zLiBOb3cgY3VybCB3aWxsIHVzZSB0aGUKICBsb3dlcmNhc2UgdmVyc2lvbnMgaWYgdGhleSBleGlzdCwgYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIHVzZSB0aGUgdXBwZXJjYXNlCiAgdmVyc2lvbnMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDApCi0gY3VybF9mb3JtZnJlZSgpIHdhcyBhZGRlZC4gSG93IGNvbWUgbm8gb25lIG1pc3NlZCB0aGF0IG9uZSBiZWZvcmU/IEkgcmFuIHRoZQogIHRlc3Qgc3VpdGUgd2l0aCB0aGUgbWFsbG9jIGRlYnVnIGVuYWJsZWQgYW5kIGdvdCBsb3RzIG9mICJuaWNlIiB3YXJuaW5ncyBvbgogIG1lbW9yeSBsZWFrcy4gVGhlIG1vc3Qgc2VyaW91cyBvbmUgd2FzIHRoaXMuIFRoZXJlIHdlcmUgYWxzbyBsZWFrcyBpbiB0aGUKICBjb29raWUgaGFuZGxpbmcsIGFuZCBhIGZldyBlcnJvcnMgd2hlbiBjdXJsIGZhaWxlZCB0byBjb25uZWN0IGFuZCBzaW1pbGFyCiAgdGhpbmdzLiBNb3JlIHRlc3RzIGNhc2VzIHdlcmUgYWRkZWQgdG8gY292ZXIgdXAgYW5kIHRvIHZlcmlmeSB0aGF0IHRoZXNlCiAgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlbW92ZWQuCgotIE11Y2hvIHVwZGF0ZWQgY29uZmlnIGZpbGUgcGFyc2VyIChJJ20gZGVhZCB0aXJlZCBvZiBhbGwgdGhlIGJ1ZyByZXBvcnRzIGFuZAogIHdlaXJkIGJlaGF2aW91ciBJIGdldCBvbiB0aGUgZm9ybWVyIG9uZSkuIEl0IHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IG5vdywKICBhbHRob3VnaCBJIGRvdWJ0IG1hbnkgcGVvcGxlIHdpbGwgbm90aWNlIHRoZSBkaWZmZXJlbmNlcy4gVGhlIG1haW4KICBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgaWYgeW91IHVzZSBvcHRpb25zIHRoYXQgcmVxdWlyZSBwYXJhbWV0ZXJzLCB0aGV5IG11c3QKICBib3RoIGJlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBsaW5lLiBXaXRoIHRoaXMgbmV3IHBhcnNlciwgeW91IGNhbiBhbHNvCiAgc3BlY2lmeSBsb25nIG9wdGlvbnMgd2l0aG91dCAnLS0nIGFuZCB5b3UgbWF5IHNlcGFyYXRlIG9wdGlvbnMgYW5kCiAgcGFyYW1ldGVycyB3aXRoIDogb3IgPS4gSXQgbWFrZXMgYSBjb25maWcgZmlsZSBsaW5lIGNvdWxkIGxvb2sgbGlrZToKCiAgICAgICAgdXNlci1hZ2VudCA9ICJmb29iYXIgYW5kIHNvbWV0aGluZyIKCiAgUGFyYW1ldGVycyB3aXRoaW4gcXVvdGVzIG1heSBjb250YWluIHNwYWNlcy4gV2l0aG91dCBxdW90ZXMsIHRoZXkncmUKICBleHBlY3RlZCB0byBiZSBhIHNpbmdsZSBub24tc3BhY2Ugd29yZC4KCiAgSGFkIHRvIHBhdGNoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2VyIGEgbGl0dGxlIHRvIG1ha2UgdGhpcyB3b3JrLgoKLSBBZGRlZCAtLXVybCBhcyBhbiBvcHRpb24gdG8gYWxsb3cgdGhlIFVSTCB0byBiZSBzcGVjaWZpZWQgdGhpcyB3YXkuIEl0IG1ha2VzCiAgd2F5IG5pY2VyIGNvbmZpZyBmaWxlcy4gVGhlIHByZXZpb3VzIHdheSBvZiBzcGVjaWZ5aW5nIFVSTHMgaW4gdGhlIGNvbmZpZwogIGZpbGUgZG9lc24ndCB3b3JrIGFueW1vcmUuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gVXNpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluIHVzZXJuYW1lcyBvciBwYXNzd29yZHMgZm9yIEhUVFAgYXV0aGVudGljYXRpb24KICBmYWlsZWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgbXByaW50ZigpIHRoYXQgaGFkIGEgc2lsbHkgY2hlY2sgZm9yIGxldHRlcnMsCiAgYW5kIGlmIHRoZXkgd2VyZW4ndCBpc3ByaW50KCkgdGhleSB3ZXJlbid0IG91dHB1dGVkICJhcy1pcyIuIFRoaXMgY2F1c2VkCiAgcGFzc3dvcmRzIGFuZCB1c2VybmFtZXMgdXNpbmcgJ6cnIChmb3IgZXhhbXBsZSkgdG8gZmFpbC4KClZlcnNpb24gNy40LjIKCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSAndGVzdHMvcnVudGVzdHMucGwnIG5vdyBzb3J0cyB0aGUgdGVzdCBjYXNlcyBwcm9wZXJseSB3aGVuICdhbGwnIGlzIHVzZWQuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDApCi0gSSBmZWxsIG92ZXIgdGhlIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTIudHh0IEludGVybmV0IERyYWZ0IHRpdGxlZAogICJFeHRlbnNpb25zIHRvIEZUUCIgdGhhdCBjb250YWlucyBhIGRlZmluZWQgd2F5IGhvdyB0aGUgZnRwIGNvbW1hbmQgU0laRQogIGNvdWxkIGJlIGFzc3VtZWQgdG8gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB1c2luZyAiLUMgLSIgYW5kIEZUUCB1cGxvYWRpbmcgYQogIGZpbGUgdGhhdCBpc24ndCBwcnNlbnQgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtaWdodCB0aGVuIHJldHVybiBhIDU1MCBhbmQKICBjdXJsIHdpbGwgZmFpbC4gU2hvdWxkIGl0IGluc3RlYWQgYXMgTGF1cmVudCBQYXBpZXIgc3VnZ2VzdHMsIHN0YXJ0CiAgdXBsb2FkaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhcyBhIG5vcm1hbCB1cGxvYWQ/CgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDApCi0gRml4ZWQgYSBjcmFzaCB3aXRoIHRoZSBmb2xsb3dsb2NhdGlvbiBjb3VudGVyLgoKLSBXaGlsZSB3cml0aW5nIHRlc3QgY2FzZXMgZm9yIHRoZSB0ZXN0IHN1aXRlLCBJIGRpc2NvdmVyZWQgYW4gb2xkIGxpbWl0YXRpb24KICB0aGF0IHByZXZlbnRlZCAtbyBhbmQgLVQgdG8gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLiBJIHJlbW92ZWQgdGhpcwogIGltbWVkaWF0ZWx5IGFzIHRoaXMgaGFzIG5vIHJlbGV2YW5jZSBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgogIAotIENocmlzIEZhaGVydHkgZml4ZWQgYSBmcmVlLXR3aWNlIHByb2JsZW0gaW4gbGliL2ZpbGUuYwoKLSBJIGZpeGVkIHRoZSBwZXJsIGh0dHAgc2VydmVyIHByb2JsZW0gaW4gdGhlIHRlc3Qgc3VpdGUuCgpWZXJzaW9uIDcuNC4yIHByZTQKCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwMCkKLSBJJ3ZlIChmaW5hbGx5KSBzdGFydGVkIHdvcmtpbmcgb24gdGhlIGN1cmwgdGVzdCBzdWl0ZS4gSXQgaXMgaW4gdGhlIG5ldwogIHRlc3RzLyBkaXJlY3RvcnkuIEl0IHJlcXVpcmVzIHNoIGFuZCBwZXJsLiBUaGVyZSdzIGEgVENQIHNlcnZlciBpbiBwZXJsIGFuZAogIG1vc3Qgb2YgdGhlIG90aGVyIHN0dWZmIHJ1bm5pbmcgYSBwcmV0dHkgc2ltcGxlIHNoZWxsIHNjcmlwdC4KCiAgSSd2ZSBvbmx5IG1hZGUgZm91ciB0ZXN0IGNhc2VzIHNvIGZhciwgYnV0IGl0IHByb3ZlcyB0aGUgc3lzdGVtIGNhbiB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBub3RpY2VkIHRoYXQgY3VybCBkaWRuJ3Qgc2V0IFRZUEUgd2hlbiBkb2luZyAtLWhlYWQgY2hlY2tzCiAgZm9yIHNpemVzIG9uIEZUUCBzZXJ2ZXJzLiBTb21lIHNlcnZlcnMgc2VlbSB0byByZXR1cm4gZGlmZmVyZW50IHNpemVzCiAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgQVNDSUkgb3IgQklOQVJZIGlzIHVzZWQhCgotIExhdXJlbnQgUGFwaWVyIGRldGVjdGVkIHRoYXQgaWYgeW91IGFwcGVuZGVkIGEgRlRQIHVwbG9hZCBhbmQgZXZlcnl0aGluZyB3YXMKICBhbHJlYWR5IHVwbG9hZGVkLCBjdXJsIHdvdWxkIGhhbmcuCgotIEFuZ3VzIE1hY2theSdzIGdldHBhc3NfcigpIGluIGxpYi9nZXRwYXNzLmMgaXMgbm93IGNvbXBsaWFudCB3aXRoIHRoZQogIGdldHBhc3NfcigpIGZ1bmN0aW9uIGl0IHNlZW1zIHNvbWUgc3lzdGVtcyBhY3R1YWxseSBoYXZlLgogIAotIFZlbmthdGFyYW1hbmEgTW9ra2FwYXRpIGRldGVjdGVkIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyIGFuZCBjb3JyZWN0ZWQKICBpdC4gIElmIHRoZSBjb29raWUgd2FzIHNldCBmb3IgdGhlIGZ1bGwgaG9zdCBuYW1lIChkb21haW49ZnVsbC5ob3N0LmNvbSksCiAgdGhlIGNvb2tpZSB3YXMgbmV2ZXIgc2VudCBiYWNrIGJlY2F1c2Ugb2YgYSBmYXVsdHkgbGVuZ3RoIGNvbXBhcmlzb24gYmV0d2VlbgogIHRoZSBzZXQgZG9tYWluIGxlbmd0aCBhbmQgdGhlIGN1cnJlbnQgaG9zdCBuYW1lLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxzb2NrZXQgKE9TLzIgc2VlbXMgdG8gbmVlZAogIGl0KS4gQWRkZWQgYSBjaGVjayBmb3IgUlNBZ2x1ZS9yc2FyZWYgZm9yIHRoZSBjYXNlcyB3aGVyZSBsaWJjcnlwdG8gaXMgZm91bmQKICBidXQgbGlic3NsIGlzbid0LiBJIGhhdmVuJ3QgdmVyaWZpZWQgdGhpcyBmaXggeWV0IHRob3VnaCwgYXMgSSBoYXZlIG5vCiAgc3lzdGVtIHRoYXQgcmVxdWlyZXMgdGhvc2UgbGlicyB0byBidWlsZC4KICAKVmVyc2lvbiA3LjQuMiBwcmUzCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHBlcnJvcigpIG91dHB1dHMgZnJvbSBnZXRwYXNzLmMuIEFuZ3VzIE1hY2theSBhbHNvIGFncmVlZCB0byBhCiAgc2xpZ2h0bHkgbW9kaWZpZWQgbGljZW5zZSBvZiB0aGUgZ2V0cGFzcy5jIGZpbGUgYXMgdGhlIHByb3RvdHlwZSB3YXMgY2hhbmdlZC4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHBvc3NpYmlsaXR5IHRvIHNldCBhIHBhc3N3b3JkIGNhbGxiYWNrIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbi4KICBUaGV5J3JlIGNvbnRyb2xlZCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSBvZiBjb3Vyc2UsIHRoZSB0YWdzIGFyZQogIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4KCi0gVXNlZCBULiBCaGFyYXRoJ3MgdGhpbmtpbmcgYW5kIGZpeGVkIHRoZSB0aW1lcnMgdGhhdCBzaG93ZWQgdGVycmlibHkgd3JvbmcKICB0aW1lcyB3aGVuIGxvY2F0aW9uOiBoZWFkZXJzIHdlcmUgZm9sbG93ZWQuCgotIEVtbWFudWVsIFR5Y2hvbiBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWRuJ3QgcmVhbGx5IGxpa2UgdXNlciBuYW1lcyBvbmx5IGluCiAgdGhlIFVSTC4gSSBjb3JyZWN0ZWQgdGhpcyBhbmQgSSBhbHNvIGZpeGVkIHRoZSBzaW5jZSBsb25nIGxpdmluZyBwcm9ibGVtCiAgd2l0aCBVUkwgZW5jb2RlZCB1c2VyIG5hbWVzIGFuZCBwYXNzd29yZHMgaW4gdGhlIFVSTHMuIFRoZXkgc2hvdWxkIHdvcmsgbm93LgogIApEYW5pZWwgKDIgTm92ZW1iZXIgMjAwMCkKLSBXaGVuIEkgYWRkZWQgLS1pbnRlcmZhY2UsIHRoZSBuZXcgZXJyb3IgY29kZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGl0IHdhcwogIGluc2VydGVkIGluIHRoZSB3cm9uZyBwbGFjZSBhbmQgdGh1cyBhbGwgZXJyb3IgY29kZXMgZnJvbSAzNSBhbmQgdXB3YXJkcyBnb3QKICBpbmNyZWFzZWQgb25lIHN0ZXAuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCwgd2UncmUgYmFjayBhdCB0aGUgcHJldmlvdXMKICBudW1iZXJzLiBBbGwgbmV3IGV4aXQgY29kZXMgc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSBlbmQuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNoZWNrIGZvciBzaWduYWwoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzbyB0aGF0IGlmIHNpZ2FjdGlvbigpCiAgaXNuJ3QgcHJlc2VudCwgd2UgY2FuIHVzZSBzaWduYWwoKSBpbnN0ZWFkLgoKLSBJJ20gaGF2aW5nIGEgbGljZW5zZSBkaXNjdXNzaW9uIGdvaW5nIG9uIHByaXZhdGVseS4gVGhlIGlzc3VlIGlzIHlldCBhZ2FpbgogIEdQTC1saWNlbnNlZCBwcm9ncmFtcyB0aGF0IGhhdmUgcHJvYmxlbXMgd2l0aCBNUEwuIEkgYW0gbGVhbmluZyB0b3dhcmRzCiAgbWFraW5nIGEga2luZCBvZiBkdWFsLWxpY2Vuc2UgdGhhdCB3aWxsIHNvbHZlIHRoaXMgb25jZSBhbmQgZm9yIGFsbC4uLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDApCi0gQWRkZWQgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuIEkgaW50ZW5kIHRvIGxldCB0aGlzIGNvbnRhaW4gc29tZSBkb2NzIGFuZAogIHRlbXBsYXRlcyBvbiBob3cgdG8gZ2VuZXJhdGUgY3VzdG9tLWZvcm1hdCBwYWNrYWdlcyBmb3IgdmFyaW91cyBwbGF0Zm9ybXMuCiAgSSd2ZSBub3cgcmVtb3ZlZCB0aGUgUlBNIHJlbGF0ZWQgY3VybC5zcGVjIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgcm9vdC4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAwKQotIFQuIEJoYXJhdGggYnJvdWdodCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgYnJpbmcgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGFuZCBjdXJsX2Vhc3lfc2V0b3B0KCkuIE5vdyB5b3UgY2FuIHJlcXVlc3QgcGVlcgogIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSAqc2V0b3B0KCkgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiBvcHRpb24KICBhbmQgdGhlbiB1c2UgdGhlIENVUkxPUFRfQ0FJTkZPIHRvIHNldCB0aGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHRoZSByZW1vdGUKICBwZWVyIGFnYWluc3QuIEFmdGVyIGFuIHN1Y2ggYW4gb3BlcmF0aW9uIHdpdGggYSB2ZXJpZmljYXRpb24gcmVxdWVzdCwgdGhlCiAgKl9nZXRpbmZvKCkgb3B0aW9uIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKICB3aGV0aGVyIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZGVkIG9yIG5vdC4gIAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBicm91Z2h0IHVzIGEgc3BsZW5kaWQgcGF0Y2ggdGhhdCBzb2x2ZXMgdGhlIGxvbmctc3RhbmRpbmcKICBhbm5veWluZyBwcm9ibGVtIHdpdGggdGltZW91dHMgdGhhdCBtYWRlIGN1cmwgZXhpdCB3aXRoIHNpbGx5IGV4aXQgY29kZXMKICAod2hpY2ggYXMgYmVlbiBjb21tZW50ZWQgb3V0IGxhdGVseSkuIFRoaXMgc29sdXRpb24gaXMgc2lnYWN0aW9uKCkgYmFzZWQgYW5kCiAgb2YgY291cnNlIHRoZW4gb25seSB3b3JrcyBmb3IgdW5peGVzIChhbmQgb25seSB0aG9zZSB1bml4ZXMgdGhhdCBhY3R1YWxseQogIGhhdmUgdGhlIHNpZ2FjdGlvbigpIGZ1bmN0aW9uKS4KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgZmxhdyBtZW50aW9uZWQgYnkgS2V2aW4gUm90aAogIHRoYXQgbWFkZSB0aGUgcGFzc3dvcmQgZ2V0IGVjaG9lZCB3aGVuIHByb21wdGVkIGZvciBpbnRlcmFjdGl2ZWx5LiBUaGUKICBnZXRwYXNzKCkgZnVuY3Rpb24gKG5vdyBrbm93biBhcyBteV9nZXRwYXNzKCkpIHdhcyBhbHNvIGZpeGVkIHRvIG5vdCB1c2UgYW55CiAgc3RhdGljIGJ1ZmZlcnMuIFRoaXMgYWxzbyBtZWFucyB3ZSBjYW5ub3QgdXNlIHRoZSAic3RhbmRhcmQiIGdldHBhc3MoKQogIGZ1bmN0aW9uIGV2ZW4gZm9yIHRob3NlIHN5c3RlbXMgdGhhdCBoYXZlIGl0LCBzaW5jZSBpdCBpc24ndCB0aHJlYWQtc2FmZS4KICAKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGlmIHlvdSdkIHdyaXRlIGEgY29uZmlnIGZpbGUgd2l0aCAnLXYgdXJsJywgdGhlCiAgdXJsIHdvdWxkIG5vdCBiZSB1c2VkIGFzICJkZWZhdWx0IFVSTCIgYXMgZG9jdW1lbnRlZCwgYWx0aG91Z2ggaWYgeW91IHdyb3RlCiAgaXQgJ3VybCAtdicgaXQgd29ya2VkISBUaGlzIGhhcyBiZWVuIGNvcnJlY3RlZCBub3cuCgotIEtldmluIFJvdGgncyBpZGVhIG9mIHVzaW5nIG11bHRpcGxlIC1kIG9wdGlvbnMgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIHdhcwogIGp1c3QgYnJpbGxpYW50LCBhbmQgSSBjb3VsZG4ndCByZWFsbHkgdGhpbmsgb2YgYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkbid0CiAgc3VwcG9ydCBpdCEgVGhlIGFwcGVuZCBmdW5jdGlvbiBhbHdheXMgYXBwZW5kICcmJyBhbmQgdGhlbiB0aGUgbmV3IC1kCiAgY2h1bmsuIFRoaXMgZW5hYmxlcyBjb25zdHJ1Y3RzIGxpa2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgY3VybCAtZCBuYW1lPWRhbmllbCAtZCBhZ2U9dW5rbm93biBmb29iYXJzaXRlLmNvbQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDApCi0gSSBmaXhlZCB0aGUgbGliL21lbWRlYnVnLmMgc291cmNlIHNvIHRoYXQgaXQgY29tcGlsZXMgb24gTGludXggYW5kIG90aGVyCiAgc3lzdGVtcy4gSXQgd2lsbCBiZSB1c2VmdWwgb25lIGRheSB3aGVuIHNvbWVvbmUgZWxzZSBidXQgbWUgd2FudHMgdG8gcnVuIHRoZQogIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDApCi0gSSBtb2RpZmllZCB0aGUgbWFrZXRneiBhbmQgY29uZmlndXJlIHNjcmlwdHMsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGZldGNoIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybC5oIGhlYWRlciBmaWxlcywgYW5kCiAgdGhlbiB0aGUgbWFrZXRneiBkb2Vzbid0IGhhdmUgdG8gcmVidWlsZCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIEkgYnVpbGQKICByZWxlYXNlLWFyY2hpdmVzLgoKLSBCavZybiBTdGVuYmVyZyBhbmQgTGludXMgTmllbHNlbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBzaWxseQogIGVub3VnaCB0byBub3QgYWxsb3cgQC1sZXR0ZXJzIGluIHBhc3N3b3JkcyB3aGVuIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2l0aCB0aGUKICAtdSBvciAtVSBmbGFncyAoQ1VSTE9QVF9VU0VSUFdEIGFuZCBDVVJMT1BUX1BST1hZVVNFUlBXRCkuIFRoaXMgYWxzbwogIHN1Z2dlc3RzIHRoYXQgY3VybCBwcm9iYWJseSBzaG91bGQgdXJsLWRlY29kZSB0aGUgcGFzc3dvcmQgcGllY2Ugb2YgYW4gVVJMCiAgc28gdGhhdCB5b3UgY291bGQgcGFzcyBhbiBlbmNvZGVkIEAtbGV0dGVyIHRoZXJlLi4uCiAgCkRhbmllbCAoMjAgT2N0b2JlciAyMDAwKQotIFlldCBhbm90aGVyIGh0dHAgc2VydmVyIGJhcmZlZCBvbiBjdXJsJ3MgcmVxdWVzdCB0aGF0IGluY2x1ZGUgdGhlIHBvcnQKICBudW1iZXIgaW4gdGhlIEhvc3Q6IGhlYWRlciBhbHdheXMuIEkgbm93IG9ubHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgaXQKICBpc24ndCB0aGUgZGVmYXVsdCAoODAgZm9yIEhUVFAsIDQ0MyBmb3IgSFRUUFMpLiB3d3cucGVybC5jb20gdHVybmVkIG91dCB0bwogIHJ1biBvbmUgb2YgdGhvc2UgbmFzdHkgc2VydmVycy4KCi0gVGhlIFBIUDQgbW9kdWxlIGZvciBjdXJsIGhhZCBwcm9ibGVtcyB3aXRoIHJlZmVyZXIgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4KICBjb3JyZWN0ZWQganVzdCB5ZXN0ZXJkYXkuIChTdGVybGluZyBIdWdoZXMgb2YgdGhlIFBIUCB0ZWFtIGNvbmZpcm1lZCB0aGlzKQoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDApCi0gVmxhZGltaXIgT2Jsb21vdiByZXBvcnRlZCB0aGF0IHRoZSAtWSBhbmQgLXkgb3B0aW9ucyBkaWRuJ3Qgd29yay4gVGhleQogIGRpZG4ndCB3b3JrIGZvciBtZSBlaXRoZXIuIFRoaXMgb25jZSBhZ2FpbiBwcm92ZXMgd2Ugc2hvdWxkIGhhdmUgdGhhdCB0ZXN0CiAgc3VpdGUuLi4KICAKLSBJIGZpbmFsbHkgY2hhbmdlZCB0aGUgZXJyb3IgbWVzc2FnZSBsaWJjdXJsIHJldHVybnMgaWYgeW91IHRyeSBhIGh0dHBzOi8vCiAgVVJMIHdoZW4gdGhlIGxpYnJhcnkgd2Fzbid0IGJ1aWxkIHdpdGggU1NMIGVuYWJsZWQuIEl0IHdpbGwgbm93IHJldHVybiB0aGlzCiAgZXJyb3I6CiAgICAgICAgImxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggU1NMIGRpc2FibGVkLCBodHRwczogbm90IHN1cHBvcnRlZCEiCgogIEkgcmVhbGx5IGhvcGUgaXQgd2lsbCBtYWtlIGl0IGEgYml0IGNsZWFyZXIgdG8gdXNlcnMgd2hlcmUgdGhlIGFjdHVhbAogIHByb2JsZW0gbGllcy4KClZlcnNpb24gNy40LjEKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIEkgZm9yZ290IHRvIHJlbW92ZSBzb21lIG9mIHRoZSBtYWxsb2MgZGVidWcgZGVmaW5lcyBmcm9tIHRoZSBtYWtlZmlsZXMgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlIChvZiBjb3Vyc2UpLgoKVmVyc2lvbiA3LjQKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIFRoZSBidWZmZXIgb3ZlcmZsb3cgbWVudGlvbmVkIGJlbG93IHdhcyBwb3N0ZWQgdG8gYnVndHJhcSBvbiBGcmlkYXkgMTN0aC4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDAwKQotIENvbGluIFJvYmVydCBQaGlwcHMgZWxlZ2FudGx5IGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdy4gSXQgY291bGQgYmUgdXNlZAogIGJ5IGFuIGV2aWwgZnRwIHNlcnZlciB0byBjcmFzaCBjdXJsLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IG9mIHJlcGxhY2luZyBhCiAgZmV3IG90aGVyIHNwcmludGYoKXMgaW50byBzbnByaW50ZigpcyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDApCi0gRm91bmQgc29tZSBtb3JlIG1lbW9yeSBsZWFrcy4gVGhpcyBuZXcgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dlciBoYXMgdHVybmVkIG91dAogIHJlYWxseSB1c2VmdWwhCgpWZXJzaW9uIDcuNCBwcmU2CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIEZsb3JpYW4gS29lbmlnIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGJvb2wgdHlwZWRlZiBpbiB0aGUgY3VybC9jdXJsLmggaW5jbHVkZQogIGZpbGUgd2FzIGJyZWFraW5nIFBIUCA0LjAuMyBjb21waWxpbmcuIFRoZSBib29sIHR5cGVkZWYgaXMgbm90IHVzZWQgaW4gdGhlCiAgcHVibGljIGludGVyZmFjZSBhbmQgd2FzIHdyb25nbHkgaW5zZXJ0ZWQgaW4gdGhhdCBoZWFkZXIgZmlsZS4KCi0gSvZyZyBIYXJ0cm90aCBjb3JyZWN0ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBpbiB0aGUgc3JjL3VybGdsb2IuYyBzdHVmZi4gSXQKICBkaWRuJ3QgaGFybSBhbnlvbmUgc2luY2UgdGhlIG1lbW9yeSBpcyBmcmVlKCllZCBvbiBleGl0IGFueXdheS4KCi0gQ29ycmVjdGVkIHRoZSBzcmMvbWFpbi5jLiBXZSB1c2UgdGhlIF9NUFJJTlRGX1JFUExBQ0UgI2RlZmluZSB0byB1c2Ugb3VyCiAgbGliY3VybC1wcmludGYoKSBmdW5jdGlvbnMuIFRoaXMgZ2l2ZXMgdXMgc25wcmludGYoKSBldCBhbCBvbiBhbGwKICBwbGF0Zm9ybXMuIEkgY29udmVydGVkIHRoZSBhbGxvY2F0ZWQgdXNlcmFnZW50IHN0cmluZyB0byBvbmUgdGhhdCB1c2VzIGEKICBsb2NhbCBidWZmZXIuCgotIEkndmUgc2V0IGFuICNpZiAwIHNlY3Rpb24gYXJvdW5kIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlcgogIGdlbmVyYXRlZCBpbiBsaWIvZm9ybWRhdGEuYy4gVGhpcyB3aWxsIGhvcGVmdWxseSBtYWtlIGN1cmwgZG8gbW9yZQogIFBIUC1mcmllbmRseSBtdWx0aS1wYXJ0IHBvc3RzLgoKVmVyc2lvbiA3LjQgcHJlNQoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBOaWNvIEJhZ2d1cyBmb3VuZCBvdXQgdGhhdCBjdXJsJ3MgYWJpbGl0eSB0byBmb3JjZSBhIEFTQ0lJIGRvd25sb2FkIHdoZW4KICB1c2luZyBGVFAgd2FzIG5vIGxvbmdlciB3b3JraW5nISBJIGNvcnJlY3RlZCB0aGlzLiBUaGlzIHByb2JsZW0gd2FzIHByb2JhYmx5CiAgaW50cm9kdWNlZCB3aGVuIEkgcmVkZXNpZ25lZCBsaWJjdXJsIGZvciB2ZXJzaW9uIDcuCgotIEdlb3JnIEhvcm4gcHJvdmlkZWQgYSBzb3VyY2UgZXhhbXBsZSB0aGF0IHByb3ZlZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwuCiAgSSBhZGRlZCBzaW1wbGUgbWVtb3J5IGRlYnVnZ2luZyBmYWNpbGl0aWVzIGFuZCBub3cgd2UgY2FuIG1ha2UgbGliY3VybCBsb2cKICBhbGwgbWVtb3J5IGZpZGRsaW5nIGZ1bmN0aW9ucy4gQW4gYWRkaXRpb25hbCBwZXJsIHNjcmlwdCBpcyB1c2VkIHRvIGFuYWx5emUKICB0aGUgb3V0cHV0IGxvZ2ZpbGUgYW5kIHRvIG1hdGNoIG1hbGxvYygpcyB3aXRoIGZyZWUoKXMgZXRjLiBUaGUgbWVtb3J5IGxlYWsKICBHZW9yZyBmb3VuZCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBtYWluIGNvb2tpZSBzdHJ1Y3QgdGhhdCBjb29raWVfY2xlYW51cCgpCiAgZGlkbid0IGZyZWUhIFRoZSBwZXJsIHNjcmlwdCBpcyBuYW1lZCBtZW1hbmFseXplLnBsIGFuZCBpdCBpcyBhdmFpbGFibGUgaW4KICB0aGUgQ1ZTIHJlc3Bvc2l0b3J5LCBub3QgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBmb3VuZCBhIEdldEhvc3QoKSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IGl0IG5ldmVyIGFzc2lnbmVkIHRoZQogIHBvaW50ZXIgaW4gdGhlIHRoaXJkIGFyZ3VtZW50IHByb3Blcmx5ISBUaGlzIGNvdWxkIG1ha2UgYSBjcmFzaCwgb3IgYXQgYmVzdAogIGEgbWVtb3J5IGxlYWshCgpWZXJzaW9uIDcuNCBwcmU0CgpEYW5pZWwgKDYgT2N0b2JlciAyMDAwKQotIElzIHRoZSAtRiBwb3N0IGZvbGxvd2luZyB0aGUgUkZDIDE4Njcgc3BlYz8gV2UgaGFkIHRoaXMgZGljdXNzaW9uIG9uIHRoZQogIG1haWxpbmcgbGlzdCBzaW5jZSBpdCBhcHBlYXJzIGN1cmwgY2FuJ3QgcG9zdCAtRiBmb3JtIHBvc3RzIHRvIGEgUEhQCiAgcmVjZWl2ZXIuLi4gSSd2ZSBiZWVuIGluIHRvdWNoIHdpdGggdGhlIFBIUCBkZXZlbG9wZXJzIGFib3V0IHRoaXMuCgotIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCB0aGF0IHRoZSBsb25nIG9wdGlvbiAnLS1wcm94eScgd2Fzbid0IHdvcmtpbmcKICBhbnltb3JlISBUaGUgb3B0aW9uIHBhcnNlciBnb3QgY29uZnVzZWQgd2hlbiBJIGFkZGVkIHRoZSAtLXByb3h5dHVubmVsIGZvcgogIDcuMy4gVGhpcyB3YXMgaW5kZWVkIGEgdmVyeSBvbGQgZmxhdyB0aGF0IGhhc24ndCB0dXJuZWQgdXAgdW50aWwgbm93Li4uCgotIEr2cm4gSGFydHJvdGggcHJvdmlkZWQgcGF0Y2hlcywgdXBkYXRlZCBtYWtlZmlsZXMgYW5kIHR3byBuZXcgZmlsZXMgZm9yIERMTAogIHN0dWZmIG9uIHdpbjMyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IHRoYXQgbGliIHNvdXJjZSBmaWxlcyB3ZXJlIGNvbXBpbGVkIHdpdGgKICAtSS4uL3NyYyB3aGljaCBpc24ndCBvbmx5IHdyb25nIGJ1dCBwbGFpbiBzdHVwaWQhCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmaXhlZCBhIHByb2JsZW0gd2l0aCBIVFRQIHJlc3VtZS4gQ3VybCBwcmV2aW91c2x5IHVzZWQKICBhIGxvY2FsIHZhcmlhYmxlIGJhZGx5LCB0aGF0IGNvdWxkIGxlYWQgdG8gY3Jhc2hlcy4KClZlcnNpb24gNy40IHByZTMKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDApCi0gTW9yZSBkb2NzIHdyaXR0ZW4uIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mby4zIG1hbiBwYWdlIGlzIG5vdyBwcmV0dHkgYWNjdXJhdGUsCiAgYXMgaXMgdGhlIC13IHNlY3Rpb24gaW4gY3VybC4xLiBJIGFkZGVkIHR3byBvcHRpb25zIHRvIGVuYWJsZSB0aGUgdXNlciB0bwogIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjZWl2ZWQgaGVhZGVycycgc2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIEhUVFAKICByZXF1ZXN0LiBULiBCaGFyYXRoIHJlcXVlc3RlZCB0aGVtLgogIApEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIENvcnJlY3RlZCBhIHNldmVyIGZyZWUoKSBiZWZvcmUgdXNlIGluIHRoZSBuZXcgYWRkX2J1ZmZlcl9zZW5kKCkhIDstKQoKVmVyc2lvbiA3LjQgcHJlMgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBKYXNvbiBTLiBQcmllYmUgc2VudCBtZSBwYXRjaGVzIHRoYXQgY2hhbmdlZCB0aGUgd2F5IGN1cmwgaXNzdWVzIEhUVFAKICByZXF1ZXN0cy4gVGhlIGVudGlyZSByZXF1ZXN0IGlzIG5vdyBpc3N1ZWQgaW4gb25lIHNpbmdsZSBzaG90LiBJdCBkaWRuJ3QgZG8KICB0aGlzIHByZXZpb3VzbHksIGFuZCBpdCBoYXMgdHVybmVkIG91dCB0aGF0IHNpbmNlIHRoZSBjb21tb24gYnJvd3NlcnMgZG8gaXQKICB0aGlzIHdheSwgc29tZSBzaXRlcyBoYXZlIHR1cm5lZCBvdXQgdG8gd29yayB3aXRoIGJyb3dzZXJzIGJ1dCBub3Qgd2l0aAogIGN1cmwhIEFsdGhvdWdoIHRoaXMgaXMgbm90IGEgY2xpZW50LXNpZGUgcHJvYmxlbSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgZnVsbHkgZW11bGF0ZSBicm93c2VycywgYW5kIHRodXMgd2UgaGF2ZSBub3cgYWRqdXN0ZWQgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKICB0byBzbGlnaHRseSBtb3JlIGFwcGVhciBhcyBhIGJyb3dzZXIuIEkgYWRqdXN0ZWQgSmFzb24ncyBwYXRjaCwgdGhlIGZhdWx0cwogIGFyZSBwcm9iYWJseSBtaW5lLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMCkKLSBBbnlvbmUgd2hvIGV2ZXIgdXBsb2FkZWQgZGF0YSB3aXRoIGN1cmwgb24gYSBzbG93IGxpbmsgaGFzIG5vdGljZWQgdGhhdCB0aGUKICBwcm9nZXNzIG1ldGVyIGlzIHVwZGF0ZWQgdmVyeSBpbmZyZXF1ZW50bHkuIFRoYXQgaXMgZHVlIHRvIHRoZSBsYXJnZSBidWZmZXIKICBzaXplIGN1cmwgaXMgdXNpbmcuIEl0IHJlYWRzIDUwS2IgYW5kIHNlbmRzIGl0LCB1cGRhdGVzIHRoZSBwcm9ncmVzcyBtZXRlcgogIGFuZCBsb29wcy4gNTBLYiBpcyB2ZXJ5IG11Y2ggb24gYSBzbG93IGxpbmssIGFsdGhvdWdoIGl0IGlzIHByZXR0eSBuZWF0IHRvCiAgdXNlIG9uIGEgZmFzdCBvbmUuCgogIEkndmUgbm93IG1hZGUgYW4gYWRqdXN0bWVudCB0aGF0IG1ha2VzIGN1cmwgdXNlIGEgMktiIGJ1ZmZlciBmb3IgdXBsb2FkcyB0bwogIHN0YXJ0IHdpdGguIElmIGN1cmwncyBhdmVyYWdlIHVwbG9hZCBzcGVlZCBpcyBmYXN0ZXIgdGhhbiBidWZmZXIgc2l6ZSBieXRlcwogIHBlciBzZWNvbmQsIGN1cmwgd2lsbCBpbmNyZWFzZSB0aGUgdXNlZCBidWZmZXIgc2l6ZSB1cCB0byBtYXggNTBLYi4gSXQKICBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd29yayBiZXR0ZXIuCiAgClZlcnNpb24gNy40IHByZTEKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDApCi0gUmlwcGVkIG91dCB0aGUgLXcgc3R1ZmYgZnJvbSB0aGUgbGlicmFyeSBhbmQgcHV0IGluIHRoZSBjdXJsIHRvb2wuIEl0IGdldHMKICBhbGwgdGhlIHJlbGV2YW50IGluZm8gZnJvbSB0aGUgbGlicmFyeSB1c2luZyB0aGUgbmV3IGN1cmxfZWFzeV9nZXRpbmZvKCkKICBmdW5jdGlvbi4KCi0gYnJhZCBhdCBvcGVuYnNkLm9yZyBtYWlsZWQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBteSBrZXJiZXJvcyBtaXN0YWtlIGFuZAogIHJlbW92ZWQgYSBjb21waWxlciB3YXJuaW5nIGZyb20gaG9zdGlwLmMgdGhhdCBPcGVuQlNEIHBlb3BsZSBnZXQuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIE9mIGNvdXJzZSAoSSBzaG91bGQgcHJvYmFibHkgZ2V0IHB1bmlzaGVkIHNvbWVob3cpIEkgZGlkbid0IHByb3Blcmx5IGNvcnJlY3QKICB0aGUgI2luY2x1ZGUgbGluZXMgZm9yIHRoZSBiYXNlNjQgc3R1ZmYgaW4gdGhlIGtlcmJlcm9zIHNvdXJjZXMgaW4gdGhlIGp1c3QKICByZWxlYXNlZCA3LjMgcGFja2FnZS4gVGhleSBzdGlsbCBpbmNsdWRlIHRoZSAqX2tyYi5oIGZpbGVzISBOb3csIHRoZSBlcnJvcgogIGlzIHNvb28gdmVyeSBlYXN5IHRvIHNwb3QgYW5kIGZpeCBzbyBJIHdvbid0IGJvdGhlciB3aXRoIGEgcXVpY2sgYnVnIGZpeAogIHJlbGVhc2UuIEknbGwgcG9zdCBhIHBhdGNoIHdoZW5ldmVyIG9uZSBpcyBuZWVkZWQgaW5zdGVhZC4gSXQnbGwgYmUKICBhdmFpbGFibGUgaW4gdGhlIENWUyBpbiBhIGZldyBtaW51dGVzIGFueXdheS4KClZlcnNpb24gNy4zCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIFJlbW92ZWQgdGhlIGJhc2U2NF9rcmIuW2NoXSBmaWxlcy4gVGhleSd2ZSBub3cgcmVwbGFjZWQgdGhlIGZvcm1lcgogIGJhc2U2NC5bY2hdIGZpbGVzLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIHNvbWUgZG9jcy4KCi0gSSBjaGFuZ2VkIHRoZSBPcGVuU1NMIGZpeCB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgYXMgd2VsbC4gVGhlIHBvc3RlZAogIHBhdGNoIHdhcyBvbmx5IHdvcmtpbmcgd2l0aCAwLjkuNiBhbmQgbm8gb2xkZXIgb25lcy4KICAKVmVyc2lvbiA3LjMtcHJlOAoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMCkKLSBFcmRtdXQgUGZlaWZlciBpbmZvcm1lZCB1cyB0aGF0IGN1cmwgZGlkbid0IGJ1aWxkIHdpdGggT3BlblNTTCAwLjkuNiBhbmQKICBzaG93ZWQgdXMgd2hhdCBuZWVkZWQgdG8gZ2V0IHBhdGNoZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBidWlsZCBwcm9wZXJseQogIGFnYWluLgoKLSBEaXJrIEtydXNjaGV3c2tpIGZvdW5kIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyLiBJIG1hZGUgYW4gYWx0ZXJuYXRpdmUKICBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gRGlyayBoaW1zZWxmIHN1Z2dlc3RlZC4gVGhlIGJ1ZyBtYWRlIGEgY29va2llCiAgaGVhZGVyIHRoYXQgZGlkbid0IGVuZCB3aXRoIGEgdHJhaWxpbmcgc2VtaWNvbG9uIHRvIG5vdCBnZXQgcGFyc2VkLgoKLSBJJ3ZlIG1hcmtlZCAtYyBhbmQgLXQgZGVwcmVjYXRlZCBub3cuIElmIHlvdSB1c2UgYW55IG9mIHRoZW0sIGN1cmwgd2lsbCB0ZWxsCiAgeW91IHRvIHVzZSAiLUMgLSIgb3IgIi1UIC0iIGluc3RlYWQuIEkgZG9uJ3QgdGhpbmsgb2NjdXB5aW5nIHR3byBsZXR0ZXJzIGZvcgogIG5lYXJseSBpZGVudGljYWwgZnVuY3Rpb25zIGlzIGdvb2QgdXNlLiBBbHNvLCAtVCAtIGtpbmQgb2YgZm9sbG93cyB0aGUgY3VybAogIHRyYWRpdGlvbiBvZiB1c2luZyAtIGZvciBzdGRpbiB3aGVyZSBhIGZpbGUgbmFtZSBpcyBleHBlY3RlZC4KCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBwcm92aWRlZCB0aGUgcGF0Y2ggdGhhdCBmaW5hbGx5IG1hZGUgdGhlIGtyYjQgZnRwIHVwbG9hZAogIHdvcmshCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvcyBjb2RlIGlzIG5vdCBxdWl0ZSB0aHJlYWQtc2FmZSB5ZXQuIFRoZXJlIGFyZSBhIGZldyBtb3JlIGdsb2JhbHMKICB0aGF0IG5lZWQgdG8gYmUgdGFrZSBjYXJlIG9mLiBMZXQncyBnZXQgdGhlIHVwbG9hZCB3b3JraW5nIGZpcnN0IQoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwMCkKLSBSaWNoYXJkIFByZXNjb3R0IHNvbHZlZCBhbm90aGVyIG5hbWUgbG9va3VwIGJ1ZmZlciBzaXplIHByb2JsZW0uIEkgdG9vayB0aGlzCiAgb3Bwb3J0dW5pdHkgdG8gcmV3cml0ZSB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uLiBXaXRoIHRoZXNlIGxhcmdlIGJ1ZmZlcgogIHNpemVzLCBJIHRoaW5rIGtlZXBpbmcgdGhlbSBhcyBsb2NhbCBhcnJheXMgcXVpY2tseSB0dXJuIHVnbHkuIEkgbm93IHVzZQogIG1hbGxvYygpIHRvIGdldCB0aGUgYnVmZmVyIG1lbW9yeS4gVGhhbmtzIHRvIHRoaXMsIEkgbm93IGNhbiByZWFsbG9jKCkgdG8gYQogIGxhcmdlIGJ1ZmZlciBpbiBjYXNlIG9mIGRlbWFuZCAoZXJybm8gPT0gRVJBTkdFKSBpbiBjYXNlIGEgc29sdXRpb24gbGlrZQogIHRoYXQgd291bGQgYmVjb21lIG5lY2Vzc2FyeS4gSSBzdGlsbCB3YW50IHRvIGF2b2lkIHRoYXQga2luZCBvZiBuYXN0aW5lc3MuCgotIFRyaWVkIHRvIGNvbXBpbGUgYW5kIHJ1biBjdXJsIG9uIExpbnV4IGZvciBhbHBoYSBhbmQgRnJlZUJTRCBmb3IgYWxwaGEuIFdlbnQKICBhcyBzbW9vdGggYXMgaXQgY291bGQuCgotIEFkZGVkIGEgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2l0aCB0d28gdGlueSBleGFtcGxlIHNvdXJjZXMgdGhhdCBzaG93IGhvdwogIHRvIHVzZSBsaWJjdXJsLiBJIGhvcGUgdXNlcnMgd2lsbCBzdXBwbHkgbWUgd2l0aCBtb3JlIHVzZWZ1bCBleGFtcGxlcwogIGZ1cnRoZXIgb24uCgotIEFwcGxpZWQgYSBwYXRjaCBieSBK9nJuIEhhcnRyb3RoIHRvIG5vIGxvbmdlciB1c2UgdGhlIHdvcmQgJ2ludGVmYWNlJyBpbiB0aGUKICBjb25maWcgc3RydWN0IGluIHRoZSBzcmMvbWFpbi5jIGZpbGUgc2luY2UgY2VydGFpbiBjb21waWxlcnMgaGF2ZSB0aGF0IHdvcmQKICAicmVzZXJ2ZXJlZCIuICBJIGZpZ3VyZSB0aGF0IGlzIHNvbWUga2luZCBvZiBDKysgZGVjZWFzZS4KCi0gVXBkYXRlZCB0aGUgY3VybC4xIG1hbiBwYWdlIHdpdGggLS1pbnRlcmZhY2UgYW5kIC0ta3JiNC4KCi0gTW9kaWZpZWQgdGhlIGJhc2U2NEVuY29kZSgpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSB0aGUga2VyYmVyb3Mgb25lLCBzbyB0aGF0CiAgSSBjb3VsZCByZW1vdmUgdGhlIHVzZSBvZiB0aGF0LiBUaGVyZSBpcyBubyBuZWVkIGZvciAqdHdvKiBiYXNlNjQgZW5jb2RpbmcKICBmdW5jdGlvbnMhIDstKQoKVmVyc2lvbiA3LjNwcmU1CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvczQtbGF5ZXIgc291cmNlIGNvZGUgdGhhdCBpcyBtdWNoICJpbmZsdWVuY2VkIiBieSB0aGUgb3JpZ2luYWwKICBrcmI0IHNvdXJjZSBjb2RlLCB0aHJvdWdoIHlhZmMgaW50byBjdXJsLCB3YXMgdXNpbmcgcXVpdGUgYSBsb3Qgb2YgZ2xvYmFsCiAgdmFyaWFibGVzLiBsaWJjdXJsIGNhbid0IHdvcmsgcHJvcGVybHkgd2l0aCBnbG9iYWxzIGxpa2UgdGhhdCB3aHkgSSBoYWQgdG8KICBjbGVhbiB1cCBhbG1vc3QgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIG5ldyBzZWN1cml0eS5jIHRvIG1ha2UgdGhlbSB1c2UKICBjb25uZWN0aW9uIHNwZWNpZmljIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHRoZSBnbG9iYWxzLiBJIGp1c3QgaG9wZSBJIGRpZG4ndAogIGRlc3Ryb3kgYW55dGhpbmcgbm93Li4uIDotKSBjb25maWd1cmUgdXBkYXRlZCwgdmVyc2lvbiBzdHJpbmcgbm93IHJlZmxlY3RzCiAga3JiNCBidWlsdC1pbi4gSXQgYWxtb3N0IHdvcmtzIG5vdy4gT25seSB1cGxvYWRzIGFyZSBzdGlsbCBiZWluZyBuYXVnaHR5LgoKVmVyc2lvbiA3LjNwcmUzCgpEYW5pZWwgKDE4IFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgc3VwcGxpZWQgYSBtYWpvciBwYXRjaCB0aGF0IGludHJvZHVjZXMga3JiNC1mdHAgc3VwcG9ydCB0bwogIGN1cmwuIE1hcnRpbiBpcyB0aGUgcHJpbWFyeSBhdXRob3Igb2YgdGhlIGZ0cCBjbGllbnQgbmFtZWQgeWFmYyBhbmQgaGUgZGlkCiAgbm90IGhlc2l0YXRlIHRvIGhlbHAgdXMgaW1wbGVtZW50IHRoaXMgd2hlbiBJIGFza2VkIGhpbS4gTWFueSBhbmQgc2luY2VyZQogIHRoYW5rcyB0byBhIHNwbGVuZGlkIGVmZm9ydC4gSXQgZGlkbid0IGV2ZW4gdGFrZSBtYW55IGhvdXJzIQoKLSBTdGVwaGVuIEtpY2sgc3VwcGxpZWQgYSBiaWcgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSAtLWludGVyZmFjZSBmbGFnIHRvCiAgdGhlIGN1cmwgdG9vbCBhbmQgQ1VSTE9QVF9JTlRFUkZBQ0UgZm9yIGxpYmN1cmwuIEl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbgogIG91dGdvaW5nIGludGVyZmFjZSB0byB1c2UgZm9yIHlvdXIgcmVxdWVzdC4gVGhpcyBtYXkgbm90IHdvcmsgb24gYWxsCiAgcGxhdGZvcm1zLiBUaGlzIG5lZWRzIHRlc3RpbmcuCgotIFJpY2hhcmQgUHJlc2NvdHQgbm90aWNlZCB0aGF0IGN1cmwgb24gVHJ1NjQgdW5peCBjb3VsZCBjb3JlIGR1bXBlZCBpZiB0aGUKICBuYW1lIGRpZG4ndCByZXNvbHZlIHByb3Blcmx5LiBUaGlzIHdhcyBkdWUgdG8gdGhlIEdldEhvc3QoKSBmdW5jdGlvbiBub3QKICByZXR1cm5pbmcgYW4gZXJyb3IgZXZlbiB0aG91Z2ggaXQgZmFpbGVkIG9uIHNvbWUgcGxhdGZvcm1zIQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIGFsbCBzb3J0cyBvZiBkb2N1bWVudHMgaW4gcmVnYXJkcyB0byB0aGUgbmV3IHByb3h5dHVubmVsIHN1cHBvcnQuCgpWZXJzaW9uIDcuM3ByZTIKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gS2FpLVV3ZSBSb21tZWwgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBodHRwcHJveHl0dW5uZWwgc3R1ZmYgZm9yIGZ0cC4KICBBZGp1c3RlZCBpdC4gQWRkZWQgYmV0dGVyIGluZm8gbWVzc2FnZSB3aGVuIHNldHRpbmcgdXAgdGhlIHR1bm5lbCBhbmQgdGhlCiAgcGFzdiBtZXNzYWdlIHdoZW4gZG9pbmcgdGhlIHNlY29uZCBjb25uZWN0LgogIApWZXJzaW9uIDcuM3ByZTEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gbGliY3VybCBub3cgYWxsb3dzICJodHRwcHJveHl0dW5uZWwiIHRvIGFuIGFyYml0cmFyeSBob3N0IGFuZCBwb3J0IG5hbWUuIFRoZQogIHNlY29uZCBjb25uZWN0aW9uIG9uIGZ0cCBuZWVkZWQgdGhhdC4KCi0gVGhlQXJ0T2ZIVFRQU2NyaXB0aW5nIHdhcyBjb3JyZWN0ZWQgYWxsIG92ZXIuIEkgYm90aCB0eXBlIGFuZCBzcGVsbCByZWFsbHkKICBiYWQgYXQgdGltZXMhCiAgCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDApCi0gLXAvLS1wcm94eXR1bm5lbCB3YXMgYWRkZWQgdG8gJ2N1cmwnLiBJdCB1c2VzIHRoZSBuZXcKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBsaWJjdXJsIG9wdGlvbiB0aGF0IGFsbG93cyAiYW55IiBwcm90b2NvbCB0byB0dW5uZWwKICB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaHR0cCBwcm94eS4gQXQgdGhlIG1vbWVudCwgdGhpcyBzaG91bGQgd29yayB3aXRoIGZ0cC4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDApCi0gSm9jaGVuIFNjaGFldWJsZSBmb3VuZCB0aGF0IGZpbGU6Ly8gZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQuIENvcnJlY3RlZCB0aGlzCiAgYW5kIG1haWxlZCB0aGUgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMCkKLSBJIGNoYW5nZWQgdGhlICNkZWZpbmUgVCgpIGluIGN1cmwuaCBzaW5jZSBpdCB0dXJuZWQgb3V0IGl0IHdhc24ndCByZWFsbHkKICBhIGdvb2Qgc3ltYm9sIHRvIHVzZSAod2hlbiB5b3UgY29tcGlsZWQgUEhQIHdpdGggY3VybCBhcyBhIG1vZHVsZSwgdGhhdAogIGRlZmluZSBjb2xsaWRlZCB3aXRoIHNvbWUgSU1BUCBkZWZpbmUgb3Igc29tZXRoaW5nKS4gVGhpcyB3YXMgcG9zdGVkIHRvIHRoZQogIFBIUCBidWcgdHJhY2tlci4KCi0gSSBhZGRlZCBleHRlcm4gIkMiIHN0dWZmIGluIHR3byBoZWFkZXIgZmlsZXMgdG8gYmV0dGVyIGFsbG93IGxpYmN1cmwgdXNhZ2UKICBpbiBDKysgc29yY2VzLiBEaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggRGFubnkgSG9yc3dlbGwgbGVhZCB0bwogIHRoaXMuCgpWZXJzaW9uIDcuMi4xCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKmFnYWluKiBhbmQgbm93IGl0IHNlZW1zIHRvCiAgZGV0ZWN0IExpbnV4IG5hbWUgcmVzb2x2aW5nIHByb3Blcmx5ISAoaGVhcmQgdGhhdCBiZWZvcmU/KQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gcG9pbnRlZCBvdXQgdGhhdCBkb3dubG9hZGluZyBhIGZpbGUgY29udGFpbmluZyB0aGUKICBsZXR0ZXIgJysnIGZyb20gYW4gZnRwIHNlcnZlciBkaWRuJ3Qgd29yay4gSXQgZGlkIHdvcmsgZnJvbSBIVFRQIHRob3VnaCBhbmQKICB0aGUgcmVhc29uIHdhcyBteSBsYW1lIFVSTCBkZWNvZGVyLgoKLSBJIGhhcHBlbmVkIHRvIG5vdGljZSB0aGF0IC1JIGRpZG4ndCBhdCBhbGwgd29yayBvbiBmdHAgYW55bW9yZS4gSSBjb3JyZWN0ZWQKICB0aGF0LgoKVmVyc2lvbiA3LjIKCkRhbmllbCAoMzAgQXVndXN0IDIwMDApCi0gVW5kZXJzdGFuZGluZyBBSVggaXMgYSBoYXJkIHRhc2suIEkgYmVsaWV2ZSBJJ2xsIG5ldmVyIGZpZ3VyZSBvdXQgd2h5IHRoZXkKICBzb2x2ZSB0aGluZ3Mgc28gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgdW5peGVzLiBOb3csIEknbSBsZWZ0IHdpdGggdGhlCiAgQUlYIDQuMyBydW4tdGltZSB3YXJuaW5ncyBhYm91dCBkdXBsaWNhdGUgc3ltYm9scyB0aGF0IGFjY29yZGluZyB0byB0aGlzCiAgYXJ0aWNsZSAoaHR0cDovL3d3dy5nZW9jcmF3bGVyLmNvbS9hcmNoaXZlcy8zLzQwNS8xOTk5LzkvMC8yNTkzNDI4LykgaXMgYQogIGxpYnRvb2wgZmxhdy4gSSB0cmllZCB0aGUgbWVudGlvbmVkIHBhdGNoLCBhbHRob3VnaCB0aGF0IHN0b3BzIHRoZSBsaW5raW5nCiAgY29tcGxldGVseS4KCiAgU28sIGlmIEkgc2VsZWN0IHRvIGlnbm9yZSB0aGUgbGQgd2FybmluZ3MgdGhlcmUgYXJlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKICBmaWxsIHRoZSBzY3JlZW4gcHJldHR5IGJhZCB3aGVuIGN1cmwgY29tcGlsZXMuIEl0IHR1cm5zIG91dCB0aGF0IGlmIEkgd2FudAogIHRvICcjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+JywgSSBjYW4gZ2V0IHRpZCBvZiB0aGUgd2FybmluZ3MgYnkgaW5jbHVkZSB0aGUKICBmb2xsb3dpbmcgdGhyZWUgaW5jbHVkZSBmaWxlcyBiZWZvcmUgdGhhdCBvbmU6CgogICAgICAgICNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KICAgICAgICAjaW5jbHVkZSA8c3lzL21idWYuaD4KICAgICAgICAjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgoKICBOb3csIGlzIGl0IHJlYWxseSBzYW5lIHRvIGFkZCB0aG9zZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSBhcnBhL2luZXQuaCBpbiBhbGwKICB0aGUgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBpdD8KCiAgVGhhbmtzIHRvIEFsYmVydCBDaGluLUEtWW91bmcgYXQgdGhld3JpdHRlbndvcmQuY29tIHdobyBnYXZlIG1lIHRoZSBBSVgKICBsb2dpbiB0byB0cnkgZXZlcnl0aGluZyBvbi4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDApCi0gSmFuIFNjaG1pZHQgc3VwcGxpZWQgdXMgYSBuZXcgVkM2IG1ha2VmaWxlIGZvciBXaW5kb3dzIGFzIHRoZSBwcmV2aW91cyBvbmUKICB3YXMgbm90IHVwIHRvIGRhdGUgYnV0IGxhY2tlZCBzZXZlcmFsIG9iamVjdCBmaWxlcy4KCi0gTW9yZSB3b3JrIG9uIHRoZSBuYW1pbmcuCgotIEFsYmVydCBDaGluLUEtWW91bmcgcHJvdmlkZWQgYSBjb25maWd1cmUtY2hlY2sgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCwgYXMKICBzb21lIHN5c3RlbXMgc2VlbSB0byBuZWVkIHRoYXQgZm9yIHRoZW0gdG8gd29yay4gSGFkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb24KICBmb3IgdGhlIGNvbmZpZy5oIGluY2x1ZGUgZmlsZSBpbiBldmVyeSAuYyBmaWxlIGluIHRoZSBsaWJjdXJsIGRpci4uLgoKLSBBcyBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCAoYnkgVHJveSBFbmdlbCksIEkgZGlkIHVzZSBhIC0tZGF0YS1iaW5hcnkKICBvcHRpb24gaW5zdGVhZCBvZiB0aGUgbWVzc3kgd2F5IEkndmUgbGVmdCBkZXNjcmliZWQgYmVsb3cuIEl0IHNlZW1zIHRvCiAgd29yay4gVGhlIGxpYmN1cmwgZml4IHJlbWFpbmVkIHRoZSBzYW1lIGFzIHllc3RlcmRheS4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDApCi0gQmFjayBvbiB0aGUgLWQgc3RyaXBwaW5nIG5ld2xpbmVzIHRoaW5nLiBUaGUgJ3BsYWluIHBvc3QnIHRoaW5nIHdhcyBhZGRlZAogIHdoZW4gSSBoYWQgbm8gdGhvdWdodCBvZiB0aGF0IG9uZSBjb3VsZCBhY3R1YWxseSBwb3N0IGJpbmFyeSBkYXRhIHdpdGgKICBpdC4gTm93LCBJIGhhdmUgdG8gYWRkIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIGdyYWNlZnVsIG1hbm5lciBhbmQgSSB0aGluawogIEkndmUgbWFuYWdlZCB0byBjb21lIHVwIHdpdGggYSB3YXk6ICctZCBAZmlsZTtiaW5hcnknIHdpbGwgdGh1cyBwb3N0IHRoZQogIGZpbGUgYmluYXJ5LCBleGFjdGx5IGFzIGl0cyBjb250ZW50cyBhcmUuIEl0IGlzIGltcGxlbWVudGVkIHdpdGggYSBuZXcKICAqc2V0b3B0KCkgb3B0aW9uIChDVVJMT1BUX1BPU1RGSUVMRFNJWkUpIHRvIHNldCB0aGUgcG9zdGZpZWxkIHNpemUsIHNpbmNlCiAgbGliY3VybCBjYW4ndCBzdHJsZW4oKSB0aGUgZGF0YSBpbiB0aGVzZSBjYXNlcy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWRlIHNvbWUgdmVyeSBzZXJpb3VzIGVmZm9ydHMgYW5kIGFsbCB0aGUgbmFtZQogIHJlc29sdmluZyBwcm9ibGVtcyBzZWVtIHRvIGhhdmUgYmVlbiBzb3J0ZWQgb3V0IG5vdyBvbiBhbGwgdGhlIHBsYXRmb3JtcwogIHRoYXQgcHJldmlvdXNseSBzaG93ZWQgdGhlbS4gSSdsbCBtYWtlIGFub3RoZXIgcmVsZWFzZSBub3cgYW55ZGF5IGJlY2F1c2Ugb2YKICB0aGlzLgoKLSBUaGUgRkFRIHdhcyBtdWNoIGVuaGFuY2VkIHdoZW4gaXQgY29tZXMgdG8gdGhlIGxpY2Vuc2luZyBpc3N1ZXMgdGhhbmtzIHRvCiAgQmpvcm4gUmVlc2UuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIFJpY2sgV2VseWtvY2h5IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHlvdSB1c2UgLWQgdG8gcG9zdCBhbmQgeW91IHdhbnQgdG8KICBrZWVwIHRoZSBuZXdsaW5lcywgYXMgY3VybCBzdHJpcHMgdGhlbSBvZmYgYXMgYSBib251cyBiZWZvcmUgcG9zdGluZy4uLgogIFRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgoKVmVyc2lvbiA3LjEuMQoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBHb3QgbW9yZSBwZW9wbGUgaW52b2x2ZWQgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIG1lc3MuIENhb2xhbiBNY05hbWFyYSBzZW50CiAgbWUgY29uZmlndXJlLWNvZGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHZlcnkgc2ltaWxhciB0byBteSBleGlzdGluZyB0ZXN0cwogIHdoaWNoIG9ubHkgbWFrZSBtZSBtb3JlIHN1cmUgSSdtIG9uIHRoZSByaWdodCBwYXRoLiBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mCiAgdGhlIHRlc3RzIHNsaWdodGx5LCBhcyBpdCBzZWVtcyB0aGF0IHNvbWUgY29tcGlsZXJzIGRvbid0IHllbGwgZXJyb3IgaWYgYQogIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCB0b28gbWFueSBwYXJhbWV0ZXJzLiBUaHVzLCB0aGUgZmlyc3QgdGVzdGVkIGZ1bmN0aW9uCiAgd2lsbCBzZWVtIG9rLi4uIExldCdzIGhvcGUgbW9yZSBjb21waWxlcnMgdGhpbmsgb2YgdG9vLWZldyBwYXJhbWV0ZXJzIGFzIGJhZAogIG1hbm5lcnMsIGFzIHdlJ3JlIG5vdyB0cnlpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG9yZGVyOyBmZXdlciBmaXJzdC4gSQogIHNob3VsZCBhbHNvIGFkZCB0aGF0IExhcnMgSGVja2luZyBtYWlsZWQgbWUgYW5kIHZvbHVudGVlcmVkIHRvIHJ1biB0ZXN0cyBvbgogIGEgZmV3IG9kZCBzeXN0ZW1zLiBDb2FsYW4gaXMga2VlcGluZyBoaXMgd29yayBvdmVyIGF0CiAgaHR0cDovL3d3dy5jc24udWwuaWUvfmNhb2xhbi9wdWJsaW5rL2dldGhvc3RieW5hbWVfci8uIE1pZ2h0IGJlIGhhbmR5IGluIHRoZQogIGZ1dHVyZSBhcyB3ZWxsLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwMCkKLSBJIG5vdGljZWQgSSBoYWRuJ3QgaW5jcmVhc2VkIHRoZSBuYW1lIGxvb2t1cCBidWZmZXIgaW4gbGliL2Z0cC5jLiBJIGRvbid0CiAgdGhpbmsgdGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgY29udGludWVkIHRyb3VibGUgdGhvdWdoLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMCkKLSBGcmVkIE5veiBjb3JyZWN0ZWQgbXkgc3R1cGlkIG1pc3Rha2VzIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBmbHVmZi4gSXQKICBzaG91bGQgYWZmZWN0IHNvbWUgQUlYLCBEaWdpdGFsIFVuaXggYW5kIEhQVVggMTAgc3lzdGVtcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDApCi0gTWF0aGlldSBMZWdhcmUgY29tcGlsZWQgYW5kIGJ1aWxkIDcuMSB3aXRob3V0IGVycm9ycyBvbiBib3RoIEFJWCA0LjIgYXMgd2VsbAogIGFzIEFJWCA0LjMuIE5vdyB3aHkgZGlkIHByb2JsZW1zIG9jY3VyIGJlZm9yZT8KCi0gRnJlZCBOb3ogcmVwb3J0ZWQgYSAtdy8tLXdyaXRlLW91dCBidWcgdGhhdCBjYXVzZWQgaXQgdG8gbWFsZnVuY3Rpb24gd2hlbgogIHVzZWQgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBVUkwgcmV0cmlldmFsZXMuIEFsbCBidXQgdGhlIGZpcnN0IGRpc3BsYXkgZ290CiAgc2NyZXdlZCB1cCEKCkRhbmllbCAoMTEgQXVndXN0IDIwMDApCi0gSmFzb24gUHJpZWJlIGFuZCBhbiBhbm9ueW1vdXMgZnJpZW5kIGZvdW5kIHNvbWUgaG9zdCBuYW1lcyB0aGUgTGludXggdmVyc2lvbgogIG9mIGN1cmwgY291bGQgbm90IHJlc29sdmUuIEl0IHR1cm5lZCBvdXQgdGhlIGJ1ZmZlciB1c2VkIHRvIHJldHJpZXZlIHRoYXQKICBpbmZvcm1hdGlvbiB3YXMgdG9vIHNtYWxsLiBGaXhlZC4gT25lIGNvdWxkIGFyZ3VlIGFib3V0IHRoZSB1c2VmdWxuZXNzIG9mCiAgbm90IGhhdmluZyB0aGUgc2xpZ2h0ZXN0IHRyYWNlIG9mIGEgbWFuIHBhZ2UgZm9yIGdldGhvc3RieW5hbWVfcigpIG9uIG15CiAgTGludXggUmVkaGF0IGluc3RhbGxhdGlvbi4uLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMCkKLSBCYWxhamkgUyBSYW8gd2FzIGZpcnN0IGluIGxpbmUgdG8gbm90ZSB0aGUgbWlzc2luZyBwb3NzaWJpbGl0eSB0byByZXBsYWNlCiAgdGhlIENvbnRlbnQtVHlwZTogYW5kIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzIHdoZW4gZG9pbmcgLWQgcG9zdHMuIEkgYWRkZWQKICB0aGUgcG9zc2liaWxpdHkganVzdCBub3cuIEl0IHNlZW1zIHNvbWUgcGVvcGxlIHdhbnRzIHRvIGRvIHN0YW5kYXJkIHBvc3RzCiAgdXNpbmcgY3VzdG9tIENvbnRlbnQtVHlwZXMuCgpEYW5pZWwgKDggQXVndXN0IDIwMDApCi0gTWlrZSBEb3dlbGwgY29ycmVjdGx5IGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZCBub3QgYXBwcm92ZSBvZiBVUkxzIHdpdGggbm8KICB1c2VyIG5hbWUgYnV0IHBhc3N3b3JkLiBBcyBpbiAnaHR0cDovLzpmb29AaGF4eC5zZScuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMQoKRGFuaWVsICg3IEF1Z3VzdCAyMDAwKQotIE15IEFJWCA0IGZpeCBkb2VzIG5vdCB3b3JrLiBJIG5lZWQgaGVscCBmcm9tIGEgQUlYIDQgaGFja2VyLgoKLSBJIGFkZGVkIG15IG5ldyBkb2N1bWVudCBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIEl0IGlzIGFpbWVkIHRvIGJlY29tZSBhIHNvcnQKICBvZiB0dXRvcmlhbCBvbiBob3cgdG8gZG8gSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICg0IEF1Z3VzdCAyMDAwKQotIFdvcmtpbmcgd2l0aCBSaWNoIEdyYXkgb24gY29tcGlsaW5nIGN1cmwgZm9yIGxvdHMgb2YgZGlmZmVyZW50IHBsYXRmb3Jtcy4KICBNeSBmaXggZm9yIEFJWCAzLjIgd2FzIG5vdCBnb29kIGVub3VnaCBhbmQgd2FzIHNsaWdodGx5IGNoYW5nZWQsIEkgaGFkIHRvCiAgbW92ZSBhbiBpbmNsdWRlIGZpbGUgYmVmb3JlIGFub3RoZXIsIGFzIGlzIG5vdyBkZXNjcmliZWQgaW4gdGhlIHNvdXJjZS4KCiAgQUlYIDQuMiAoNC5YPykgaGFzIGRpZmZlcmVudCBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkKICBmdW5jdGlvbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIGFuZCB0aHVzIHRoZSBjb21waWxlCiAgYnJva2Ugd2l0aCBhbiBlcnJvci4gSSBoYXZlIG5vdyBjaGFuZ2VkIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjaGVjayBpbiB0aGUKICBjb25maWd1cmUgZmlsZSB0byBzdXBwb3J0IGFsbCB0aHJlZSB2ZXJzaW9ucyBvZiBib3RoIHRoZXNlIGZ1bmN0aW9ucy4gTXkKICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEFJWC1zdHlsZSBpcyB0aG91Z2ggbm90IHlldCB2ZXJpZmllZCBhbmQgSSBtYXkKICBnZXQgcHJvYmxlbXMgdG8gZml4IGl0IGlmIGl0IHR1cm5zIG91dCB0byBidWcgc2luY2UgSSBkb24ndCBoYXZlIGFjY2VzcyB0bwogIGFueSBzeXN0ZW0gdXNpbmcgdGhhdC4KCiAgRm9yIHByb2JsZW1zIGxpa2UgdGhhdCwgSSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFsbG93IC0tZGlzYWJsZS10aHJlYWQKICB0byBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGNoZWNrIGZvciB0aHJlYWRzYWZlIHZlcnNpb25zIG9mIGEgZmV3CiAgZnVuY3Rpb25zIGFuZCB0aHVzIGdvIHdpdGggdGhlICJnb29kIG9sZCB2ZXJzaW9ucyIgdGhhdCB0ZW5kIHRvIHdvcmsKICBhbHRob3VnaCB3aWxsIGJyZWFrIHRocmVhZC1zYWZlbmVzcyBmb3IgbGliY3VybC4gTW9zdCBwZW9wbGUgd29uJ3QgdXNlCiAgbGliY3VybCBmb3Igb3RoZXIgdGhpbmdzIHRoYW4gY3VybCB0aG91Z2gsIGFuZCBjdXJsIGRvZXNuJ3QgbmVlZCBhCiAgdGhyZWFkLXNhZmUgbGliLgoKLSBXb3JraW5nIG9uIG15IGJpZyB0dXRvcmlhbCBhYm91dCBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gUmljaCBHcmF5IHNwb3R0ZWQgYSBwcm9ibGVtIGluIHNyYy9zZXR1cC5oIGNhdXNlZCBieSBhICNkZWZpbmUgc3RyZXF1YWwoKQogIHRoYXQgd2FzIGp1c3QgYSBsZWZ0LW92ZXIgZnJvbSBwYXNzZWQgdGltZXMuIFRoZSBzdHJlcXVhbCgpIGlzIG5vdyBhIHRydWUKICBmdW5jdGlvbiBzdXBwbGllZCBieSBsaWJjdXJsIGZvciBhIHBvcnRhYmxlIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyaXNvbi4gSSBhZGRlZCB0aGUgcHJvdG90eXBlcyBpbiBpbmNsdWRlL2N1cmwuaCBhbmQgcmVtb3ZlZCB0aGUKICBub3cgb2Jzb2xldGUgI2RlZmluZS4KCi0gSWdvciBLaHJpc3RvcGhvcm92IG1hZGUgYSBmaXggdG8gYWxsb3cgcmVzdW1lZCBkb3dubG9hZCBmcm9tIFN1bidzCiAgSmF2YVdlYlNlcnZlci8xLjEuMS4gSXQgc2VlbXMgdGhhdCB0aGVpciBzZXJ2ZXIgc2VuZHMgYmFkIENvbnRlbnQtUmFuZ2UKICBoZWFkZXJzLgoKLSBUaGUgbWFrZWZpbGVzIGZvcmNlZCBhIHN0YXRpYyBsaWJyYXJ5IGJ1aWxkLCB3aGljaCBpcyBiYWQgc2luY2Ugd2Ugbm93IHVzZQogIGxpYnRvb2wgYW5kIHRodXMgaGF2ZSBleGNlbGxlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCEgQWxiZXJ0IENoaW4tQS1Zb3VuZwogIGZvdW5kIG91dC4KClZlcnNpb24gNy4wLjExYmV0YQoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSBpbnN0YWxsJyBkaWQgbm90IHByb3Blcmx5IGNyZWF0ZQogIHRoZSBoZWFkZXIgaW5jbHVkZSBkaXJlY3RvcnksIHdoeSBpdCBmYWlsZWQgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGFzCiAgaXQgc2hvdWxkLiBBdXRvbWFrZSBpc24ndCByZWFsbHkgZXF1aXBwZWQgdG8gZGVhbCB3aXRoIHN1YmRpcmVjdG9yaWVzCiAgd2l0aG91dCBNYWtlZmlsZXMgaW4gYW55IG5pY2Ugd2F5LiBJIGhhZCB0byBydW4gYWhlYWQgYW5kIGFkZCBNYWtlZmlsZXMgaW4KICBib3RoIGluY2x1ZGUgYW5kIGluY2x1ZGUvY3VybCBiZWZvcmUgSSBtYW5hZ2VkIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbAogIG1ha2VmaWxlIHRoYXQgc3VjY2VlZHMgaW4gaW5zdGFsbCBldmVyeXRoaW5nIHByb3Blcmx5IQoKLSBPaywgbm8gbW9yZSAiZmVhdHVyZXMiIGFkZGVkIG5vdy4gTGV0J3MganVzdCB2ZXJpZnkgdGhhdCB0aGVyZSdzIG5vIG1ham9yCiAgZmxhd3MgYWRkZWQgbm93LgoKRGFuaWVsICgzMSBKdWx5IDIwMDApCi0gQm90aCBKZWZmIFNjaGFzbnkgYW5kIEtldGlsIEZyb3luIGFza2VkIG1lIGhvdyB0byB0ZWxsIGN1cmwgbm90IHRvIHNlbmQgb25lCiAgb2YgdGhvc2UgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycy4gVGhleSBkaWRuJ3Qgc2V0dGxlIHdpdGggdGhlIGJsYW5rCiAgb25lcyB5b3UgY291bGQgdGVsbCBjdXJsIHRvIHVzZS4gSSByZXdyb3RlIHRoZSBoZWFkZXItcmVwbGFjZSBzdHVmZiBhCiAgbGl0dGxlLiBOb3csIGlmIHlvdSByZXBsYWNlIGFuIGludGVybmFsIGhlYWRlciB3aXRoIHlvdXIgb3duIGFuZCB0aGF0IG5ldwogIG9uZSBpcyBhIGJsYW5rIGhlYWRlciB5b3Ugd2lsbCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgb25lIGFuZCBub3QgZ2V0IGFueQogIGJsYW5rLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYW55IGNhc2Ugd2hlbiB5b3Ugd2FudCB0aGF0IGJsYW5rIGhlYWRlci4KCkRhbmllbCAoMjkgSnVseSAyMDAwKQotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSBsaWIgdXNlZCBsb2NhbHRpbWUoKSB3aGljaCBpcyBub3QgdGhyZWFkLXNhZmUsIHNvIG5vdwogIEkgdXNlIGxvY2FsdGltZV9yKCkgaW4gdGhlIHN5c3RlbXMgdGhhdCBoYXMgaXQuCgotIEkgd2VudCB0aHJvdWdoIHRoaXMgZW50aXJlIGRvY3VtZW50IGFuZCByZW1vdmVkIGFsbCBlbWFpbCBhZGRyZXNzZXMgYW5kIGxlZnQKICBuYW1lcyBvbmx5LiBJJ3ZlIHJlYWxseSBtYWRlIGFuIGVmZm9ydCB0byBhbHdheXMgbm90ZSB3aG8gYnJvdWdodCBiZSBidWcKICByZXBvcnRzIG9yIGZpeGVzLCBidXQgbW9yZSBhbmQgbW9yZSBwZW9wbGUgYXNrIG1lIHRvIHJlbW92ZSB0aGUgZW1haWwKICBhZGRyZXNzZXMgc2luY2UgdGhleSBiZWNvbWUgdmljdGltcyBmb3Igc3BhbXMgdGhpcyB3YXkuIEdvcmRvbiBCZWF0b24gZ290IG1lCiAgd29ya2luZyBvbiB0aGlzLgoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBmb3VuZCBvdXQgdGhhdCB3aGVuIHlvdSBzcGVjaWZpZWQgYSBIVFRQIHByb3h5IGluIGFuCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHVzZWQgLUwsIGN1cmwgZmFpbGVkIGluIHRoZSBzZWNvbmQgZmV0Y2guIEkKICBjb3JyZWN0ZWQgdGhpcyBwcm9ibGVtIGFuZCBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbGlzdC4gTm8gbmVlZCBmb3IgYW4gZXh0cmEKICBiZXRhIHJlbGVhc2UganVzdCBmb3IgdGhpcy4KClZlcnNpb24gNy4wLjEwYmV0YQoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gU28sIGxpYnRvb2wgcmVwbGFjZWQgdHdvIG9mIG15IGZpbGVzIHdpdGggc3ltYm9saWMgbGlua3MgYW5kIEkgZm9yZ290IHRvIGFkZAogIHRoZSB0d28gbmV3IGxpYnRvb2wgZmlsZXMgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSAoYW5kIHRoZXkgd2VyZSBhZGRlZCBhcwogIHN5bWxpbmtzIGFzIHdlbGwhKSBUaGlzIG9mIGNvdXJzZSBsZWFkIHRvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkCiAgb24gNy4wLjkuLi4KClZlcnNpb24gNy4wLjliZXRhCgpEYW5pZWwgKDI1IEp1bHkgMjAwMCkKLSBLcmlzdGlhbiBL9mhudG9wcCA8a3JpcyBhdCBrb2VobnRvcHAuZGU+IGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsCiAgbGlidG9vbGlmaWVkLCBqdXN0IGFzIHdlJ3ZlIHdhbnRlZCBmb3IgYSB3aGlsZSBub3cuIEhlIGFsc28gbWFkZSB0aGUKICByZWNlbnRseSBhZGRlZCBtYW4gcGFnZXMgZ2V0IGluc3RhbGxlZCBwcm9wZXJseSBvbiAnbWFrZSBpbnN0YWxsJyBhbmQgc29tZQogIG90aGVyIG5pY2UgY2xlYW51cHMuCgotIEluIGEgZGlzY3Vzc2lvbiB3aXRoIEVldHUgT2phbmVuIGl0IHN0cnVjayBtZSB0aGF0IGlmIHdlIHVzZSBjdXJsIHRvIGdldCBhCiAgcGFnZSB1c2luZyBhIHBhc3N3b3JkLCBhbmQgdGhhdCBwYWdlIHRoZW4gc2VuZHMgYSBMb2NhdGlvbjogdG8gYW5vdGhlcgogIHNlcnZlciB0aGF0IGN1cmwgZm9sbG93cywgY3VybCB3aWxsIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhhdAogIHNlcnZlciBhcyB3ZWxsLgoKICBOb3csIEknbGwgbmV2ZXIgYmUgYWJsZSB0byBtYWtlIGN1cmwgZG8gTG9jYXRpb246IGZvbGxvd2luZyBhbGwgdGhhdCBwZXJmZWN0CiAgYW5kIHlvdSdyZSBhbGwgc29vbmVyIG9yIGxhdGVyIHJlcXVpcmVkIHRvIHdyaXRlIGEgc2NyaXB0IHRvIGRvIHNldmVyYWwKICBmZXRjaGVzIHdoZW4geW91J3JlIGRvaW5nIGFkdmFuY2VkIHN0dWZmLCBidXQgbm93IEkndmUgbW9kaWZpZWQgY3VybCB0byBhdAogIGxlYXN0ICpvbmx5KiBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuIFdoaWNoCiAgbWVhbnMgdGhhdCBpZiBnZXQgYSBwYWdlIGZyb20gc2VydmVyIEEgd2l0aCBhIHBhc3N3b3JkLCB0aGF0IGZvcndhcmRzIGN1cmwKICB0byBzZXJ2ZXIgQiwgY3VybCB3b24ndCB1c2UgdGhlIHBhc3N3b3JkIHRoZXJlLiBJZiBzZXJ2ZXIgQiB0aGVuIGZvcndhcmRzCiAgY3VybCBiYWNrIHRvIHNlcnZlciBBIGFnYWluLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIGFnYWluLgoKICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgaW1wbGVtZW50YXRpb24sIGFzIGluIGEgYnJvd3NlciBjYXNlIGl0IHdvdWxkIG9ubHkgdXNlCiAgdGhlIHBhc3N3b3JkIGlmIHRoZSBsZWZ0LXByZWZpeCBvZiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgc2FtZS4gSSBqdXN0IHRoaW5rCiAgdGhhdCB0aGlzIGZpeCBwcmV2ZW50cyBhIHNvbWV3aGF0IGx1cmt5ICJzZWN1cml0eSBob2xlIi4KCiAgQXMgYSBzaWRlLW5vdGUgaW4gdGhpcyBzdWJqZWN0OiBIVFRQIHBhc3N3b3JkcyBhcmUgc2VudCBpbiBjbGVhcnRleHQgYW5kCiAgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHRvIGJlIHNhZmUgb3Igc2VjdXJlLiBVc2UgSFRUUFMgZm9yIHRoYXQuCgotIEFzIGRpc2N1c3NlZCBvbiB0aGUgbWFpbGluZyBsaXN0LCBJIGNvbnZlcnRlZCB0aGUgRlRQIHJlc3BvbnNlIHJlYWRpbmcKICBmdW5jdGlvbiBpbnRvIHVzaW5nIHNlbGVjdCgpIHdoaWNoIHRoZW4gYWxsb3dzIHRpbWVvdXRzIChldmVuIHVuZGVyIHdpbjMyISkKICBpZiB0aGUgY29tbWFuZC1yZXBseSBzZXNzaW9uIGdldHMgdG9vIHNsb3cgb3IgZGllcyBjb21wbGV0ZWx5LiBJIG1hZGUgYQogIGRlZmF1bHQgdGltZW91dCBvbiAzNjAwIHNlY29uZHMgdW5sZXNzIGFueXRoaW5nIGVsc2UgaXMgc3BlY2lmaWVkLCBzaW5jZSBJCiAgZG9uJ3QgdGhpbmsgYW55b25lIHdhbnRzIHRvIHdhaXQgbW9yZSB0aGFuIHRoYXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciB0bwogIGdldCByZWNlaXZlZC4uLgoKLSBUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGF0IGdteC5uZXQ+IGJyb3VnaHQgYSBzZXQgb2YgZml4ZXMgZm9yCiAgdGhlIHJmYzE4NjcgZm9ybSBwb3N0cy4gSGUgaW50cm9kdWNlZCAnbmFtZT08ZmlsZScgd2hpY2ggYnJpbmdzIGEgbWVhbnMgdG8KICBzdXVwbHkgdmVyeSBsYXJnZSB0ZXh0IGNodW5rcyByZWFkIGZyb20gdGhlIGdpdmVuIGZpbGUgbmFtZS4gSXQgZGlmZmVycyBmcm9tCiAgJ25hbWU9QGZpbGUnIGluIHRoZSB3YXkgdGhhdCB0aGlzIGxhdHRlciB0aGluZyBpcyBtYXJrZWQgaW4gdGhlIHVwbG9hZGVkCiAgY29udGVudHMgYXMgYSBmaWxlIHVwbG9hZCwgd2hpbGUgdGhlIGZpcnN0IGlzIGp1c3QgdGV4dCAoYXMgaW4gYSBpbnB1dCBvcgogIHRleHRhcmVhIGZpZWxkKS4gVG9yc3RlbiBhbHNvIGNvcnJlY3RlZCBhIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiBpZiB5b3UgdXNlZAogICVzIG9yIHNpbWlsYXIgaW4gYSAtRiBmaWxlIG5hbWUuCgotIEFzIGRpc2NvdmVyZWQgYnkgTmljbyBCYWdndXMgPE5pY28uQmFnZ3VzIGF0IG1haWwuaW5nLm5sPiwgd2hlbiB0cmFuc2ZlcnJpbmcKICBmaWxlcyB0by9mcm9tIEZUUCB1c2luZyB0eXBlIEFTQ0lJIGN1cmwgc2hvdWxkIG5vdCBleHBlY3QgdGhlIHRyYW5zZmVyIHRvIGJlCiAgdGhlIGV4YWN0IHNpemUgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciBhcyB0aGUgZmlsZSBzaXplLiBTaW5jZSBBU0NJSSBtYXkgdmVyeQogIHdlbGwgbWVhbiB0aGF0IHRoZSBjb250ZW50IGlzIHRyYW5zbGF0ZWQgd2hpbGUgdHJhbnNmZXJlZCwgdGhlIGZpbmFsIHNpemUKICBtYXkgdmVyeSB3ZWxsIGRpZmZlci4gVGhlcmVmb3IsIGN1cmwgbm93IGlnbm9yZXMgdGhlIGZpbGUgc2l6ZSB3aGVuIGRvaW5nCiAgQVNDSUkgdHJhbnNmZXJzIGluIEZUUC4KCkRhbmllbCAoMjQgSnVseSAyMDAwKQotIEFkZGVkIENVUkxPUFRfUFJPWFlQT1JUIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgY2FsbCB0byBhbGxvdyB0aGUgcHJveHkKICBwb3J0IG51bWJlciB0byBiZSBzZXQgc2VwYXJhdGVseSBmcm9tIHRoZSBwcm94eSBob3N0IG5hbWUuCgotIEFuZHJldyA8YW5kcmV3IGF0IHVnaC5uZXQuYXU+IHBvaW50ZWQgb3V0IGEgbmV0cmMgbWFudWFsIGJ1Zy4KCi0gVGhlIEZUUCB0cmFuc2ZlciBjb2RlIG5vdyBhY2NlcHRzIGEgMjUwLWNvZGUgYXMgd2VsbCBhcyB0aGUgcHJldmlvdXNseQogIGFjY2VwdGVkIDIyNiwgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGUgdHJhbnNmZXIuIE1vaGFuIDxtbmFpciBhdAogIGV2ZXJncmVlbi1mdW5kcy5jb20+IHBvaW50ZWQgdGhpcyBvdXQuCgotIFRoZSBjaGVjayBmb3IgKmJvdGgqIG5zbCBhbmQgc29ja2V0IHdhcyBuZXZlciBhZGRlZCBpbiB0aGUgdjcgY29uZmlndXJlLmluCiAgd2hlbiBJIG1vdmVkIHRoZSBtYWluIGJyYW5jaC4gSSByZS1hZGRlZCB0aGF0IGNoZWNrIHRvIGNvbmZpZ3VyZS5pbi4gVGhpcyB3YXMKICBkaXNjb3ZlcmVkIGJ5IFJpY2ggR3JheS4KCi0gSG93YXJkLCBCbGFpc2UgPEJsYWlzZS5Ib3dhcmQgYXQgZmFjdGl2YS5jb20+IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmcmVlKCkgaW4KICBjdXJsX2Rpc2Nvbm5lY3QoKSB3aGljaCBvZiBjb3Vyc2UgbWVhbnQgbGliY3VybCBhdGUgbWVtb3J5LgoKLSBCcmlhbiBFLiBHYWxsZXcgbm90ZWQgdGhhdCB0aGUgSFRUUCAnSG9zdDonIGhlYWRlciBjdXJsIHNlbnQgZGlkIG5vdAogIHByb3Blcmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIG5vbi1kZWZhdWx0IHBvcnRzIHdlcmUgdXNlZC4gVGhpcyBzaG91bGQKICBub3cgaGF2ZSBiZWVuIGZpeGVkLgoKLSBIVFRQIGNvbm5lY3QgZXJyb3JzIG5vdyByZXR1cm4gZXJyb3JzIGVhcmxpZXIuIFRoaXMgd2FzIG1vc3Qgbm90YWJseSBjYXVzaW5nCiAgcHJvYmxlbXMgd2hlbiB0aGUgSFRUUFMgY2VydGlmaWNhdGUgaGFkIHByb2JsZW1zIGFuZCBsYXRlciBjYXVzZWQgYSBjcmFzaC4KICBNYW55IHRoYW5rcyB0byBHcmVnb3J5IE5pY2hvbGxzIDxnbmljaG9sbHMgYXQgbGV2ZWw4LmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgYW5kIHN1Z2dlc3RpbmcgYSBmaXguLi4KCkRhbmllbCAoMjEgSnVuZSAyMDAwKQotIEFmdGVyIGEgImJ1ZyByZXBvcnQiIEkgcmVjZWl2ZWQgd2hlcmUgdGhlIHVzZXIgd2FzIHVzaW5nIGJvdGggLUYgYW5kIC1JIGluIGEKICBIVFRQIHJlcXVlc3QgKGl0IHNldmVybHkgY29uZnVzZWQgdGhlIGxpYnJhcnkgSSBzaG91bGQgYWRkKSwgSSBhZGRlZCBzb21lCiAgY2hlY2tzIHRvIHNyYy9tYWluLmMgdGhhdCBwcmV2ZW50cyBzZXR0aW5nIG1vcmUgdGhhbiBvbmUgSFRUUCByZXF1ZXN0CiAgY29tbWFuZCwgbm8gbWF0dGVyIHdoYXQgdGhlIHVzZXIgd2FudHMhIDstKQoKVmVyc2lvbiA3LjAuOGJldGEKCkRhbmllbCAoMjAgSnVuZSAyMDAwKQotIEkgZGlkIGEgbWFqb3IgcmVwbGFjZSBpbiBtYW55IGZpbGVzIHRvIHVzZSB0aGUgbmV3IGN1cmwgZG9tYWluIGhheHguc2UKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBvbmUuCgotIEFzIEVldHUgT2phbmVuIHN1Z2dlc3RlZCwgSSBmaW5hbGx5IHRvb2sgdGhlIHN0ZXAgYW5kIG5vdyBsaWJjdXJsIG5vIGxvbmdlcgogIG1ha2VzIGEgUE9TVCBhZnRlciBpdCBoYXMgZm9sbG93ZWQgYSBsb2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBQT1NUIGhhcwogIGJlZW4gZG9uZSwgaXQnbGwgdHVybmVkIGludG8gYSBHRVQgZm9yIHRoZSBmdXJ0aGVyIHJlcXVlc3RzLiBUaGlzIGlzIG9ubHkKICBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIC1MLy0tbG9jYXRpb24gKmFuZCogZG9pbmcgYSBQT1NUIGF0IHRoZSBzYW1lIHRpbWUuCgogIFdoaWxlIG1lc3Npbmcgd2l0aCB0aGlzLCBJIGFkZGVkIGFub3RoZXIgd2VpcmQgZmVhdHVyZSBJIGNhbGwgJ2F1dG8KICByZWZlcmVyJy4gSWYgeW91IGFwcGVuZCAnO2F1dG8nIHRvIHRoZSByaWdodCBvZiBhIGdpdmVuIHJlZmVyZXIgc3RyaW5nIChvcgogIG9ubHkgdXNlIHRoYXQgc3RyaW5nIGFzIHJlZmVyZXIpLCBsaWJjdXJsIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlCiAgcHJldmlvdWQgVVJMIGFzIHJlZmVyZWQgd2hlbiBpdCBmb2xsb3dzIGEgTG9jYXRpb246IGFuZCBnZXRzIGEgc3VjY2VlZGluZwogIGRvY3VtZW50LgoKLSBNeSBoZXJvIFJpY2ggR3JheSBmb3VuZCB0aGUgdmVyeSBvYnNjdXJlIEZUUCBidWcgdGhhdCBoYXBwZW5lZCB0byBoaW0gb25seQogIHdoZW4gcGFzc2luZyB0aHJvdWdoIGEgcGFydGljdWxhciBmaXJld2FsbCBhbmQgdXNpbmcgdGhlIFBPUlQgY29tbWFuZC4gSXQKICB0dXJuZWQgb3V0IHRoYXQgUE9SVCB3YXMgdGhlIG9ubHkgY29tbWFuZCBpbiB0aGUgbGliL2Z0cC5jIHNvdXJjZSB0aGF0CiAgZGlkbid0IHNlbmQgYSBwcm9wZXIgXHJcbiBzZXF1ZW5jZSBidXQgaW5zdGVhZCB1c2VkIHRoZSBmYXVsdHkgXG4gd2hpY2ggYXMKICBpdCBzZWVtZWQgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbWFqb3IgZnRwIHNlcnZlcnMuLi4gOi1PCgpWZXJzaW9uIDcuMC43YmV0YQoKRGFuaWVsICgxNiBKdW5lIDIwMDApCi0gSSBoYWQgYXZvaWRlZCB0aGlzIGxvbmcgZW5vdWdoIG5vdywgc28gSSBtb3ZlZCB0aGUgYWx0ZXJuYXRpdmUgcHJvZ3Jlc3MgYmFyCiAgc3R1ZmYgZnJvbSB0aGUgbGliIGFuZCBhZGRlZCBpdCB0byB0aGUgY2xpZW50IGNvZGUuIFRoaXMgaXMgbm93IHVzaW5nIHRoZQogIHJlY2VudGx5IGFkZGVkIHByb2dyZXNzIGNhbGxiYWNrIGFuZCBpdCBzZWVtcyB0byB3b3JrIHByZXR0eSBtdWNoIGxpa2UKICBiZWZvcmUuIFNpbmNlIGl0IGlzIG9ubHkgb25lIHByb2dyZXNzIGJhciBhbmQgeW91IGFuZCBkb3dubG9hZCBhbmQgdXBsb2FkIGF0CiAgdGhlIHNhbWUgdGltZSwgdGhpcyBiYXIgc2hvd3MgdGhlIGNvbWJpbmVkIHByb2dyZXNzIG9mIGJvdGggZGlyZWN0aW9ucy4gVGhpcwogIGNvZGUgd2FzIGp1c3QgcG9ydGVkIGZyb20gdGhlIG9sZCBwbGFjZSB0byB0aGlzLCBMYXJzIGlzIHN0aWxsIG91ciBzYXZpb3VyIQogIDstKSBUaGlzIGFsc28gbWFkZSB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIGFjY3VyYXRlIHNpbmNlIEkgbmV2ZXIgcmVtb3ZlZAogIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgZG9jcyEgQWx0aG91Z2ggSSBub3cgcmVtb3ZlZCB0aGUgQ1VSTE9QVF9QUk9HUkVTU01PREUKICBmcm9tIHRoZSBsaWJyYXJ5IHNpbmNlIHRoZSBsaWIgaGFzIG9ubHkgb25lIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGFuZCBpdAogIHdpbGwgbmV2ZXIgZ2V0IGFub3RoZXIuIEl0IGlzIGFsdGhvdWdoIGxpa2VseSB0aGF0IHRoZSBpbnRlcm5hbCBvbmUgYWxzbwogIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNsaWVudCBjb2RlIGluIHRoZSBmdXR1cmUgKHdoZW4gSSBoYXZlIG90aGVyIG1lYW5zIG9mCiAgZ2V0dGluZyB0aGUgd3JpdGVvdXQgZGF0YSBhbmQgbW92ZSB0aGF0IHRvbyB0byB0aGUgY2xpZW50KS4KCi0gSSB0b29rIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnkgdGhhdCBzdGFuZGFyZCBwcm9ncmVzcyBtZXRlciB3b3JrcyBhbmQgSQogIGZvdW5kIG91dCBpdCBkaWRuJ3QgZ2V0IGluaXRlZCBwcm9wZXJseS4gR3Jyci4gSSBjb3JyZWN0ZWQgdGhhdCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBKdW5lIDIwMDApCi0gSSB0aG91Z2h0IEknZCBiZXR0ZXIgdmVyaWZ5IHRoYXQgdGhlIC1GIG9wdGlvbiBzdGlsbCB3b3JrcyBpbiB2NyBhbmQgb2YKICBjb3Vyc2UgaXQgZGlkbid0Li4uIDotLyBBbnl3YXksIEkgaGFkIHRoZSBwcm9ibGVtcyBJIGNvdWxkIGRpc2NvdmVyCiAgY29ycmVjdGVkLiBBYm91dCBvbmUgbW9udGggb2YgYmV0YSB0ZXN0aW5nIGFuZCBub3QgYSBzaW5nbGUgcGVyc29uIGhhcyB1c2VkCiAgdGhpcyBmZWF0dXJlIHdpdGggdjc/CgotIEJq9nJuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtLXByb2dyZXNzLWJhciBzdGlsbCBkb2Vzbid0IHdvcmsgaW4KICB2Ny4gSG0uCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBUaW0gVGFzc29uaXMgZGlzY292ZXJlZCB0aGF0IGN1cmwgNyBkaWRuJ3QgaGFuZGxlIG5vcm1hbCBodHRwIFBPU1QgYXMgaXQKICBzaG91bGQuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMC42YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgcG9pbnRlZCBvdXQgc2V2ZXJhbCBwcm9ibGVtcyAocmVsYXRlZCB0byB3aW4zMiBjb21waWxpbmcpOgogIGxpYi9zdHJlcXVhbC5jIGhhZCBhIGJhZCAjaWZkZWYgZm9yIG9uZSBvZiB0aGUgc3RyaW5nIGNvbXBhcmlzb25zICh3aW4zMikKICBzcmMvbWFpbi5jIGhhZCBzZXZlcmFsIG1pbm9yIHByb2JsZW1zCiAgbGliL21ha2VmaWxlLm0zMiBoYWQgZ2V0cGFzcy5bY29dIHR3aWNlCiAgc3JjL2NvbmZpZy13aW4zMi5oIGxhY2tlZCB0aGUgSEFWRV9GQ05UTF9IIGRlZmluZQogIGJvdGggY29uZmlnLXdpbjMyLmggZmlsZXMgbm93IG9ubHkgc2V0IHRoZSBIQVZFX1VOSVNURF9IIGRlZmluZSBpZiB0aGUKICBkZWZpbmUgTUlOR1czMiBpcyBzZXQsIGFuZCBJIG1vZGlmaWVkIHNyYy9tYWtlZmlsZS5tMzIgYW5kIGxpYi9tYWtlZmlsZS5tMzIKICB0byBzZXQgaXQuCgpWZXJzaW9uIDcuMC41YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQXBwbGllZCBMdW9uZyBEaW5oIER1bmcncyBjb21tZW50cyBhYm91dCBhIGZldyB3aW4zMiBjb21waWxlIHByb2JsZW1zLgoKLSBBcHBsaWVkIEJq9nJuIFN0ZW5iZXJnJ3Mgc3VnZ2VzdGVkIGZpeCB0aGF0IHR1cm5zIHRoZSB3aW4zMiBzdGRvdXQgdG8KICBiaW5hcnkuIEl0IHdvbid0IGRvIGl0IGlmIHRoZSAtQiAvIC0tdXNlLWFzY2lpIG9wdGlvbiBpcyB1c2VkLiBUaGF0IG9wdGlvbgogIGlzIG5vdyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyAtQiAvLS1mdHAtLWFzY2lpLiBUaGUgZmxhZyB3YXMKICBhbHJlYWR5IGluIHVzZSBiZSB0aGUgbGRhcCBhcyB3ZWxsIHNvIHRoZSBuZXcgbmFtZSBmaXRzIHByZXR0eSBnb29kLiBUaGUKICBsaWJjeXJsIENVUkxPUFRfVFJBTlNGRVJURVhUIHdhcyBhbHNvIGludHJvZHVjZWQgYXMgYW4gYWxpYXMgdG8gdGhlIG5vdwogIG9ic29sZXRlIENVUkxPUFRfRlRQQVNDSUkuIENhbid0IHZlcmlmeSB0aGlzIGZpeCBteXNlbGYgYXMgSSBoYXZlIG5vIHdpbjMyCiAgY29tcGlsZXIgYXJvdW5kLgoKRGFuaWVsICgxMyBKdW5lIDIwMDApCi0gTHVvbmcgRGluaCBEdW5nIDxkdW5nIGF0IHNjaC5ibWUuaHU+IGZvdW5kIGEgcHJvYmxlbSBpbiBjdXJsX2Vhc3lfY2xlYW51cCgpCiAgc2luY2UgaXQgZnJlZSgpZWQgdGhlIG1haW4gY3VybCBzdHJ1Y3QgKnR3aWNlKi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKRGFuaWVsICg5IEp1bmUgMjAwMCkKLSBVcGRhdGVkIHRoZSBSRVNPVVJDRVMgZmlsZSwgYWRkZWQgYSBSRUFETUUud2luMzIgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDApCi0gU28gSSBmaW5hbGx5IGFkZGVkIHRoZSBwcm9ncmVzcyBjYWxsYmFjayB0byB0aGUgKnNldG9wdCgpIG9wdGlvbnMgYW5kIGl0CiAgc2hvdWxkIHdvcmsgbm93LiBJIGRvbid0IGhhdmUgdGhlIGVuZXJneSB0byB3cml0ZSBhbnkgdGVzdCBwcm9ncmFtIGZvciBpdAogIHJpZ2h0IG5vdy4KLSBNYWRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlZGVmcyBwdWJsaWMgaW4gY3VybC9jdXJsLmggZm9yIGNvbWZvcnQuIEp1c3QKICBpbiBjYXNlIGFueW9uZSB3YW5uYSBmaWRkbGUgd2l0aCBzdWNoIHBvaW50ZXJzLgotIFVwZGF0ZWQgdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KClZlcnNpb24gNy4wLjRiZXRhCgpEYW5pZWwgKDIgSnVuZSAyMDAwKQotIEkgbm90aWNlZCB0aGF0IHdoZW4gZG9pbmcgTG9jYXRpb246IGZvbGxvd2luZywgd2UgbG9zdCBjdXN0b20gaGVhZGVycyBpbiBhbGwKICBidXQgdGhlIGZpcnN0IHJlcXVlc3QuCi0gUmVtb3ZlZCB0aGUgJ0h0dHBQb3N0JyBzdHJ1Y3QgYW5kIG1vdmVkIHRoZSBoZWFkZXIgc3R1ZmYgdG8gdGhlIG1vcmUgZ2VuZXJpYwogIGN1cmxfc2xpc3QuCi0gQWRkZWQgc29tZSBiZXR0ZXIgc2xpc3QtY2xlYW51cHMgaW4gc3JjL21haW4uYwoKVmVyc2lvbiA3LjAuM2JldGEKCkRhbmllbCAoMzEgTWF5IDIwMDApCi0gU28gSSBkaXNjb3ZlcmVkIHRoYXQgSSByZWxlYXNlZCB0aGUgNy4wLjJiZXRhIHdpdGhvdXQgaXQgYmVpbmcgYWJsZSB0bwogIGNvbXBpbGUgdW5kZXIgTGludXguIGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKSB0dXJuZWQgb3V0IHRvCiAgZmVhdHVyZSBhIGRpZmZlcmVudCBhbW91bnQgb2YgYXJndW1lbnRzIG9uIGRpZmZlcmVudCBzeXN0ZW1zIHNvIEkgaGFkIHRvIGFkZAogIGEgY29uZmlndXJlIGNoZWNrIGZvciB0aGlzIGFuZCBhZGp1c3QgdGhlIGNvZGUgc2xpZ2h0bHkuCgpWZXJzaW9uIDcuMC4yYmV0YQoKRGFuaWVsICgyOSBNYXkgMjAwMCkKLSBDb3JyZWN0ZWQgdGhlIGJpdHMuKiBhc3NpZ25tZW50cyB3aGVuIHVzaW5nIENVUkxPUFQgb3B0aW9ucyB0aGF0IG9ubHkKICB0b2dnbGVzIG9uZSBvZiB0aG9zZSBiaXRzLgoKLSBBcHBsaWVkIHRoZSBodWdlIHBhdGNoZXMgZnJvbSBEYXZpZCBMZUJsYW5jIDxkbGVibGFuYyBhdCBxbnguY29tPiB0aGF0IGFkZAogIHVzYWdlIG9mIHRoZSBnZXRob3N0YnluYW1lX3IoKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgaW4gY2FzZSB0aGV5J3JlIGFyb3VuZCwKICBzaW5jZSB0aGF0IG1ha2UgbGliY3VybCBtdWNoIGJldHRlciB0aHJlYWRzYWZlIGluIG1hbnkgc3lzdGVtcyAoc3VjaCBhcwogIHNvbGFyaXMpLiBJIGFkZGVkIHRoZSBjaGVja3MgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KCiAgSSBjYW4ndCBleHBsYWluIHdoeSwgYnV0IHRoZSBpbmV0X250b2FfcigpIGZ1bmN0aW9uIGRpZCBub3QgYXBwZWFyIGluIG15CiAgU29sYXJpcyBpbmNsdWRlIGZpbGVzLCBJIGhhZCB0byBhZGQgbXkgb3duIGluY2x1ZGUgZmlsZSBmb3IgdGhpcyBmb3Igbm93LgoKRGFuaWVsICgyMiBNYXkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgZml4ZXMgdG8gbWFrZSB0aGUgd2luMzIgdmVyc2lvbiBjb21waWxlIHByb3Blcmx5IGFzCiAgd2VsbCBhcyBhIHJlbmFtZSBvZiB0aGUgJ2ludGVyZmFjZScgZmllbGQgaW4gdGhlIHVybGRhdGEgc3RydWN0LCBhcyBpdCBzZWVtcwogIHRvIGJlIHJlc2VydmVkIGluIHNvbWUgZ2NjIHZlcnNpb25zIQoKLSBSaWNoIEdyYXkgc3RydWNrIGJhY2sgd2l0aCB5ZXQgc29tZSBwb3J0YWJpbGl0eSByZXBvcnRzLiBEYXRhIEdlbmVyYWwgREcvVVgKICBuZWVkZWQgYSBsaXR0bGUgZml4IGluIGxpYi9sZGFwLmMgc2luY2UgaXQgZG9lc24ndCBoYXZlIFJUTERfR0xPQkFMIGRlZmluZWQuCiAgTW9yZSBmaXhlcyBhcmUgZXhwZWN0ZWQgYXMgYSByZXN1bHQgb2YgUmljaGllcyB2ZXJ5IGhlbHBmdWwgd29yay4KClZlcnNpb24gNy4wLjFiZXRhCgpEYW5pZWwgKDIxIE1heSAyMDAwKQotIFVwZGF0ZWQgbG90cyBvZiAjZGVmaW5lcywgZW51bXMgYW5kIHZhcmlhYmxlIHR5cGUgbmFtZXMgaW4gdGhlIGxpYnJhcnkuIE5vCiAgbW9yZSB3ZWlyZCBVUkcgb3IgVVJMVEFHIHByZWZpeGVzLiBBbGwgdHlwZXMgYW5kIG5hbWVzIHNob3VsZCBiZSBjdXJsLQogIHByZWZpeGVkIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcy4gVGhlIEZMQUdTLXBhcmFtZXRlciB0byB0aGUgZm9ybWVyCiAgY3VybF91cmxnZXQoKSBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIGJ1bmNoIG9mIGZsYWdzIHRvIHVzZSBpbiBzZXBhcmF0ZQogIHNldG9wdCBjYWxscy4gSSdtIHN0aWxsIGZvY3VzaW5nIG9uIHRoZSBlYXN5LWludGVyZmFjZSwgYXMgdGhlIGN1cmwgdG9vbCBpcwogIG5vdyB1c2luZyB0aGF0LgoKLSBCam9ybiBSZWVzZSBoYXMgcHJvdmlkZWQgbWUgd2l0aCBhbiBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlciB0aGF0IEkgcGxhbgogIHRvIHVzZSBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBjdXJsIHRvIGJlIGFibGUgdG8gZ3JhY2VmdWxseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzLgoKVmVyc2lvbiA3LjBiZXRhCgpEYW5pZWwgKDE4IE1heSAyMDAwKQotIEludHJvZHVjZWQgTElCQ1VSTF9WRVJTSU9OX05VTSB0byB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSB0byBiZXR0ZXIgYWxsb3cKICBzb3VyY2UgY29kZXMgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSBsaWIgdmVyc2lvbi4gVGhpcyBkZWZpbmUgaXMgbm93IHNldCB0bwogIGEgZGV4YWRlY2ltYWwgbnVtYmVyLCB3aXRoIDggYml0cyBlYWNoIGZvciBtYWpvciBudW1iZXIsIG1pbm9yIG51bWJlciBhbmQKICBwYXRjaCBudW1iZXIuIEluIG90aGVyIHdvcmRzLCB2ZXJzaW9uIDEuMi4zIHdvdWxkIG1ha2UgaXQgMHgwMTAyMDMuIEl0IGFsc28KICBtYWtlcyBhIGxhcmdlciBudW1iZXIgYSBuZXdlciB2ZXJzaW9uLgoKRGFuaWVsICgxNyBNYXkgMjAwMCkKLSBNYXJ0aW4gS2FtbWVyaG9mZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHNldmVyYWwgZmxhd3MgaW4gdGhlIEZUUCByYW5nZQogIG9wdGlvbi4gSSBjb3JyZWN0ZWQgdGhlbS4KLSBSZW1vdmVkIHRoZSB3aW4zMiB3aW5zb2NrIGluaXQgY3JhcCBmcm9tIHRoZSBsaWIgdG8gdGhlIHNyYy9tYWluLmMgZmlsZQogIGluIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkLiBUaGV5IGNhbid0IGJlIGluIHRoZSBsaWIsIGVzcGVjaWFsbHkgbm90IGZvcgogIG11bHRpdGhyZWFkZWQgcHVycG9zZXMuCgpEYW5pZWwgKDE2IE1heSAyMDAwKQotIFJld3JvdGUgdGhlIHNyYy9tYWluLmMgc291cmNlIHRvIHVzZSB0aGUgbmV3IGVhc3ktaW50ZXJmYWNlIHRvIGxpYmN1cmwgNy4KICBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIGJ1dCB0aGUgZmlyc3Qgc3RlcCBpcyBub3cgdGFrZW4uCiAgPGN1cmwvZWFzeS5oPiBpcyB0aGUgaW5jbHVkZSBmaWxlIHRvIHVzZS4KCkRhbmllbCAoMTQgTWF5IDIwMDApCi0gRlRQIFVSTHMgYXJlIG5vdyB0cmVhdGVkIHNsaWdodGx5IGRpZmZlcmVudCwgbW9yZSBhY2NvcmRpbmcgdG8gUkZDIDE3MzguCi0gRlRQIHNlc3Npb25zIGFyZSBub3cgcGVyZm9ybWVkIGRpZmZlcmVudGx5LCB3aXRoIENXRCBjb21tYW5kcyB0byBjaGFuZ2UKICBkaXJlY3RvcnkgaW5zdGVhZCBvZiBSRVRSL1NUT1IvTElTVCB3aXRoIHRoZSBmdWxsIHBhdGguIERpc2N1c3Npb25zIHdpdGgKICBSaWNoIEdyYXkgbWFkZSBtZSBub3RpY2UgdGhlc2UgcHJvYmxlbXMuCi0gSmFubmUgSm9oYW5zc29uIGRpc2NvdmVyZWQgYW5kIGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUKICBzcmMvdXNyZ2xvYi5jIGZpbGUuCi0gSSBoYWQgdG8gYWRkIGEgbGliL3N0cmVxdWFsLmMgZmlsZSBmb3IgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJlcyBvbiBhbGwgcGxhdGZvcm1zLgoKRGFuaWVsICg4IE1heSAyMDAwKToKLSBCZWVuIHdvcmtpbmcgbG90cyBvbiB0aGUgbmV3IGxpYi4KLSBUb2dldGhlciB3aXRoIFJpY2ggR3JheSwgSSd2ZSB0cmllZCB0byBhZGp1c3QgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yawogIGJldHRlciBvbiB0aGUgTkNSIE1QLVJBUyBVbml4LgoKRGFuaWVsICgyIE1heSAyMDAwKToKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgSSBoYWQgYSBmZXcgdG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIGluCiAgY29uZmlndXJlLmluIHRoYXQgZGlkbid0IGRvIGFueSBnb29kLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAwKToKLSBBZGRlZCBhIG5ldyBwYXJhZ3JhcGggdG8gdGhlIEZBUSBhYm91dCB3aGF0IHRvIGRvIHdoZW4gY29uZmlndXJlIGNhbid0CiAgZmluZCBPcGVuU1NMIGV2ZW4gdGhvdWdoIGl0IGlzIGluc3RhbGxlZC4gU3VwcGxpZWQgYnkgQm9iIEFsbGlzb24KCkRhbmllbCAoMTIgQXByaWwgMjAwMCk6Ci0gU3RhcnRlZCBtZXNzaW5nIGFyb3VuZCBiaWctdGltZSB0byBjb252ZXJ0IHRoZSBvbGQgbGlicmFyeSBpbnRlcmZhY2UgdG8gYQogIGJldHRlciBvbmUuLi4KCkRhbmllbCAoOCBBcHJpbCAyMDAwKToKLSBNYWRlIHRoZSBwcm9ncmVzcyBiYXIgbG9vayBiZXR0ZXIgZm9yIGZpbGUgc2l6ZXMgYmV0d2VlbiA5OTk5IGtpbG9ieXRlcwogIGFuZCAxMDAgbWVnYWJ5dGVzLiBUaGV5J3JlIG5vdyBkaXNwbGF5ZWQgWFguWE0uCi0gSSBhbHNvIG5vdGljZWQgdGhhdCBmdHAgZmV0Y2hlcyB0aHJvdWdoIEhUVFAgcHJveGllcyBkaWRuJ3QgYWRkIHRoZSB1c2VyCiAgYWdlbnQgc3RyaW5nLiBJdCBkb2VzIG5vdy4KLSBIYWJpYmllIDxoYWJpYmllIGF0IE1haWxhbmROZXdzLmNvbT4gc3VwcGxpZWQgYSBwcmV0dHkgZ29vZCB3YXkgdG8gYnVpbGQgUlBNcwogIG9uIGEgTGludXggbWFjaGluZS4gSXQgc3RpbGwgYSkgcmVxdWlyZXMgbWUgdG8gYmUgcm9vdCB0byBkbyBpdCwgYikgbGVhdmVzCiAgdGhlIHJwbSBwYWNrYWdlcyBsYXlpbmcgYXQgc29tZSBvZGQgcGxhY2Ugb24gbXkgZGlzayBjKSBkb2Vzbid0IHdvcmsgdG8KICBidWlsZCB0aGUgc3NsIHZlcnNpb24gb2YgY3VybCBzaW5jZSBJIGRpZG4ndCBpbnN0YWxsIG9wZW5zc2wgZnJvbSBhbiBycG0KICBwYWNrYWdlIHNvIG5vdyB0aGUgcnBtIGNyYXAgdGhpbmtzIEkgZG9uJ3QgaGF2ZSBvcGVuc3NsIGFuZCByZWZ1c2VzIHRvIGJ1aWxkCiAgYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBzc2wuLi4gRGlkIEkgbWVudGlvbiBJIGRvbid0IGdldCBhbG9uZyB3aXRoIFJQTT8KLSBPbmNlIGFnYWluIEkgcmVjZWl2ZWQgYSBidWcgcmVwb3J0IGFib3V0IGF1dG9jb25mIG5vdCBzZXR0aW5nIC1MIHByaW9yIHRvIC1sCiAgb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNoZWNraW5nIGZvciBsaWJzLiBJbiB0aGlzIGNhc2UgaXQgbWFkZSB0aGUgbmF0aXZlCiAgY2MgY29tcGlsZXIgb24gU29sYXJpcyA3IHRvIGZhaWwgdGhlIE9wZW5TU0wgY2hlY2suIFRoaXMgaGFzIHByZXZpb3VzbHkgYmVlbgogIHJlcG9ydGVkIHRvIGNhdXNlIHByb2JsZW1zIG9uIEhQLVVYIGFuZCBpcyBhIGtub3duIGZsYXcgaW4gYXV0b2NvbmYgMi4xMy4gSXQKICBpcyBhIHBpdHkgdGhlcmUncyBubyBuZXdlciByZWxlYXNlIGFyb3VuZC4uLgoKRGFuaWVsICg0IEFwcmlsIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggdHdvIGZpeGVzIHRoYXQKICBhcHBlYXJhbnRseSBtYWtlcyB0aGUgT1MvMiBwb3J0IHdvcmsgYmV0dGVyIHdpdGggbXVsdGlwbGUgVVJMcy4KCkRhbmllbCAoMiBBcHJpbCAyMDAwKToKLSBBbm90aGVyIExvY2F0aW9uOiBmaXguIFRoaXMgdGltZSwgd2hlbiBjdXJsIGNvbm5lY3RlZCB0byBhIHBvcnQgYW5kIHRoZW4KICBmb2xsb3dlZCBhIGxvY2F0aW9uIHdpdGggYW4gYWJzb2x1dGUgVVJMIHRvIGFub3RoZXIgcG9ydCwgaXQgbWlzYmVoYXZlZC4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMCk6Ci0gSC4gRGFwaG5lIEx1b25nIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgd3JvbmdseQogIG1lc3NpbmcgdXAgdGhlIHByb3h5IHN0cmluZyB3aGVuIGZldGNoaW5nIGEgZG9jdW1lbnQgdGhyb3VnaCBhIGh0dHAgcHJveHksCiAgd2hpY2ggc2NyZXdlZCB1cCBtdWx0aXBsZSBmZXRjaGVzIHN1Y2ggYXMgaW4gbG9jYXRpb246IGZvbGxvd2luZ3MuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIGNvcnJlY3RlZCBteSBiYWRseSBhcHBsaWVkIHBhdGNoIGhlCiAgYWN0dWFsbHkgYWxyZWFkeSB0b2xkIG1lIGFib3V0IQoKLSBILiBEYXBobmUgTHVvbmcgYnJvdWdodCBtZSBhIGZpeCB0aGF0IG5vdyBtYWtlcyBjdXJsCiAgaWdub3JlIHNlbGVjdCgpIGVycm9ycyBpbiB0aGUgZG93bmxvYWQgaWYgZXJybm8gaXMgRUlOVFIsIHdoaWNoIHR1cm5zIG91dCB0bwogIGhhcHBlbiBldmVyeSBub3cgYW5kIHRoZW4gd2hlbiB1c2luZyBsaWJjdXJsIG11bHRpLXRocmVhZGVkLi4uCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIGNvdXBsZSBvZiB3aW4zMiBmaXhlcy4gSEFWRV9VTkFNRQogIHdhcyBhY2NpZGVudGFsbHkgI2RlZmluZWQgaW4gY29uZmlnLXdpbjMyLmgsIHdoaWNoIGl0IHNob3VsZG4ndCBoYXZlIGJlZW4uCiAgVGhlIEhBVkVfVU5JU1REX0ggaXMgbm90IGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aCB0aGUgTWFrZWZpbGUudmM2CiAgbWFrZWZpbGUgZm9yIE1TIFZDKysuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIEkgcmVtb3ZlZCB0aGUgQUNfUFJPR19JTlNUQUxMIG1hY3JvIGZyb20gY29uZmlndXJlLmluLCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBvbmUgb2YgdGhlIEFNXyogbWFjcm9zIHNlYXJjaGVzIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwgYWxyZWFkeS4gSmFubmUKICBKb2hhbnNzb24gbWFkZSBtZSBhd2FyZSBvZiB0aGlzLgoKVmVyc2lvbiA2LjUuMgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcXVpY2tseSBwb2ludGVkIG91dCB0byBtZSB0aGF0IDYuNS4xCiAgY3Jhc2hlcyBoYXJkLiBJIHVwbG9hZCA2LjUuMiBub3cgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSEgVGhlIHByb2JsZW0gd2FzCiAgdGhlIC1EIGFkanVzdG1lbnRzIGluIHNyYy9tYWluLmMuCgpWZXJzaW9uIDYuNS4xCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDApOgotIEFuIGFub255bW91cyBwb3N0IG9uIHNvdXJjZWZvcmdlIGNvcnJlY3RseSBwb2ludGVkIG91dCBhIHBvc3NpYmxlIGJ1ZmZlcgogIG92ZXJmbG93IGluIHRoZSBjdXJsX3VuZXNjYXBlKCkgZnVuY3Rpb24gZm9yIFVSTCBjb252ZXJzaW9ucy4gVGhlIG1haW4KICBwcm9ibGVtIHdpdGggdGhpcyBidWcgaXMgdGhhdCB0aGUgZnRwIGRvd25sb2FkIHVzZXMgdGhhdCBmdW5jdGlvbiBhbmQgdGhpcwogIHNpbmdsZS0gYnl0ZSBvdmVyZmxvdyBjb3VsZCBsZWFkIHRvIHZlcnkgb2RkIGJ1Z3MgKGFzIG9uZSByZXBvcnRlZCBieSBKYW5uZQogIEpvaGFuc3NvbikuCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggYSBzZXJpZXMgb2YgcGF0Y2hlcwogIHRoYXQgbm93IGFsbG93cyBjdXJsIHRvIGdldCBjb21waWxlZCBvbiBPUy8yLiBJdCBldmVuIGluY2x1ZGVzIGEgc2VjdGlvbiBpbgogIHRoZSBJTlNUQUxMIGZpbGUuIFZlcnkgbmljZSBqb2IhCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIHBhdGNoIGZvciB0aGUgbGliL01ha2VmaWxlLnZjNgogIGZpbGUuIFdlIHN0aWxsIG5lZWQgc29tZSBmaXhlcyBmb3IgdGhlIGNvbmZpZy13aW4zMi5oIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIFZDKysgYW5kIG1pbmd3MzIgaGF2ZSBkaWZmZXJlbnQgb3BpbmlvbnMgYWJvdXQgKGF0IGxlYXN0KSB1bmlzdGQuaCdzCiAgZXhpc3RlbmNlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAwKToKLSBJIG1vZGlmaWVkIHRoZSAtRC8tLWR1bXAtaGVhZGVyIHdvcmtpbmdzIHNvIHRoYXQgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZwogIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLiBUaGlzIHdheSwgeW91IGNhbiBhY3R1YWxseSB1c2UgLWIgYW5kIC1ECiAgb24gdGhlIHNhbWUgZmlsZSBpZiB5b3Ugd2FudCByZXBlYXRlZCBpbnZva2VzIHRvIHN0b3JlIGFuZCByZWFkIHRoZSBjb29raWVzCiAgaW4gdGhhdCBvbmUgc2luZ2xlIGZpbGUuCgotIFBva2VkIGFyb3VuZCBpbiBsb3RzIG9mIHRleHRzLiBBZGRlZCB0aGUgQlVHUyBmaWxlIGZvciBidWcgcmVwb3J0aW5nIHN0dWZmLgogIEFkZGVkIHRoZSBjbGFzc2ljIEhUVFAgUE9TVCBxdWVzdGlvbiB0byB0aGUgRkFRLCByZW1vdmVkIHNvbWUgI2lmZGVmIFdJTjMyCiAgc3R1ZmYgZnJvbSB0aGUgc291cmNlcyAodGhleSdyZSBjb3ZlcmVkIGJ5IHRoZSBjb25maWctd2luMzIuaCBub3cpLgoKLSBQYXNjYWwgR2F1ZGV0dGUgZml4ZWQgYSBtaXNzaW5nIGxkYXAuYyBwcm9ibGVtIGluIHRoZQogIE1ha2VmaWxlLnZjNiBmaWxlLiBIZSBhbHNvIGFkZHJlc3NlZCBhIHByb2JsZW0gaW4gc3JjL2NvbmZpZy13aW4zMi5oLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgJ2h0dHBfY29kZScgdmFyaWFibGUgaW4gdGhlIC13IG91dHB1dAogIHdhcyBuZXZlciB3cml0dGVuLiBJIGZpeGVkIGl0IG5vdy4KCi0gSmFubmUgSm9oYW5zc29uIHJlcG9ydGVkIHRoZSBjb21wbGFpbnRzIHRoYXQgT3BlbkJTRCBkb2VzCiAgd2hlbiBnZXRkYXRlLmMgI2luY2x1ZGVzIG1hbGxvYy5oLiBJdCBjbGFpbXMgc3RkbGliLmggc2hvdWxkIGJlIGluY2x1ZGVkCiAgaW5zdGVhZC4gSSBhZGRlZCAjaWZkZWYgSEFWRV9NQUxMT0NfSCBjb2RlIGluIGdldGRhdGUueSBhbmQgdHdvIGNoZWNrcyBpbgogIHRoZSBjb25maWd1cmUuaW4gZm9yIG1hbGxvYy5oIGFuZCBzdGRsaWIuaC4KClZlcnNpb24gNi41CgpEYW5pZWwgKDEzIE1hcmNoIDIwMDApOgotIDxjdXJsIGF0IHNwYW0ud29sdmVzYmFuZS5uZXQ+IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdheSBjdXJsIHNlbnQgY29va2llcyBpbiBhCiAgc2luZ2xlIGxpbmUgd2Fzbid0IGVuam95ZWQgYnkgSUlTNC4wIHNlcnZlcnMuIEluIG15IHZpZXcsIHRoYXQgaXMgbm90IHdoYXQKICB0aGUgc3RhbmRhcmRzIHNheSwgYnV0IEkgYWRkZWQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvCiAgcGVyaGFwcyBtYWtlIHRoZW0gd29yayBiZXR0ZXIuCgotIEFkZGVkIHRoZSBwZXJsIGNoZWNrIGJhY2sgaW4gdGhlIGNvbmZpZ3VyZS5pbiBhZ2FpbiBzaW5jZSB0aGUgbWtoZWxwLnBsCiAgc2NyaXB0IG5lZWRzIGl0IQoKLSBNYWRlIHNvbWUgYmVhdXRpZmljYXRpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIEr2cm4gaGVscGVkIG1lIHVwZGF0ZSB0aGUgY29uZmlnLXdpbjMyLmggZmlsZXMgd2l0aCBIQVZFX1NFVFZCVUYgYW5kCiAgSEFWRV9TVFJEVVAuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gVXBsb2FkZWQgdGhlIDYuNXByZTIgcGFja2FnZS4KCkRhbmllbCAoMiBNYXJjaCAyMDAwKToKLSBSZW1vdmVkIHRoZSBwZXJsLXByb2dyYW1zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiwgdGhleSBuZXZlciBtYWRlIG1hbnkgcGVvcGxlCiAgaGFwcHkgYW5kIEknbGwgc3RpbGwga2VlcCB0aGVtIGF2YWlsYWJsZSBvbiB0aGUgd2ViLgoKLSBBZGRlZCB0aGUgLXcgYW5kIC1OIHN0dWZmIHRvIHRoZSBtYW4gcGFnZS4gRG9jdW1lbnRlZCB0aGUgbmV3IHByb2dyZXNzIG1ldGVyCiAgZGlzcGxheSBpbiBSRUFETUUuY3VybC4KCi0gSvZybiBIYXJ0cm90aCwgQ2hyaXMgPGNiYXlsaXNzIGF0IGNzYy5jb21lPiBhbmQgVWxmCiAgTfZsbGVyIGZyb20gdGhlIG9wZW5zc2wgZGV2ZWxvcG1lbnQgdGVhbSBoZWxwZWQgYnJpbmdpbmcgbWUgdGhlIGRldGFpbHMgZm9yCiAgZml4aW5nIGFuIE9wZW5TU0wgdXNhZ2UgZmxhdy4gSXQgYmVjYW1lIGFwcGFyZW50IHdoZW4gdGhleSByZWxlYXNlZCBvcGVuc3NsCiAgMC45LjUgc2luY2UgdGhhdCBiYXJmZWQgb24gY3VybCdzIGJhZCBiZWhhdmlvciAobm90IHNlZWRpbmcgYSByYW5kb20gbnVtYmVyCiAgdGhpbmcpLgoKLSBZZXQgYW5vdGhlciBvcHRpb246IC1OLy0tbm8tYnVmZmVyIGRpc2FibGVzIGJ1ZmZlcmluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KICBQcm9iYWJseSBtb3N0IHVzZWZ1bCBmb3IgdmVyeSBzbG93IHRyYW5zZmVycyB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBnZXQKICBldmVyeSBieXRlIGN1cmwgcmVjZWl2ZXMgd2l0aGluIHNvbWUgcHJlZmVycmVkIHRpbWUuIEFuZHJldyA8dG1yIGF0IGdjaS5uZXQ+CiAgc3VnZ2VzdGVkIHRoaXMuCgotIERhbWllbiBBZGFudCBtYWlsZWQgbWUgaGlzIGZpeGVzIGZvciBtYWtpbmcgY3VybCBjb21waWxlIG9uIFVsdHJpeC4KCkRhbmllbCAoMjQgRmVicnVhcnkgMjAwMCk6Ci0gQXBwbGllZCBK9nJuIEhhcnRyb3RoJ3MgZml4ZXMgZm9yIGNvbmZpZy13aW4zMi5oIGFuZCBsaWIvTWFrZWZpbGUudzMyLgoKICBJIHNob3VsZCBhbHNvIG1ha2UgYSBub3RlIGhlcmUsIGlmIG5vdGhpbmcgZWxzZSB0byBteXNlbGYsIHRoYXQgd2hlbiB1c2luZwogIHRoZSAlLXN5bnRheCBmb3IgdmFyaWFibGVzIGluIERPUyBjb21tYW5kIHByb21wdHMsIHlvdSBtdXN0IHVzZSB0d28gJS0KICBsZXR0ZXJzIGZvciBlYWNoIG9uZSBzaW5jZSB0aGF0IGlzIGFuIGVzY2FwZSBsZXR0ZXIgdGhlcmUhIE1heWJlIEkgc2hvdWxkCiAgdXNlIGFub3RoZXIgbGV0dGVyIGluc3RlYWQhCgotIEFkZGVkIG1vcmUgdmFyaWFibGVzIHRvIC13OgoKICAnaHR0cF9jb2RlJwogICd0aW1lX25hbWVsb29rdXAnCiAgJ3RpbWVfY29ubmVjdCcKICAndGltZV9wcmV0cmFuc2ZlcicKICAndXJsX2VmZmVjdGl2ZScKCi0gTWFkZSAtd0BmaWxlbmFtZSByZWFkIHRoZSBzeW50YXggZnJvbSBhIGZpbGUgYW5kIC13QC0gcmVhZHMgdGhlIHN5bnRheCBmcm9tCiAgc3RkaW4gaW4gdGhlIGdvb2Qgb2xkICJzdGFuZGFyZCIgY3VybCB3YXkuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDApOgotIFJlbGVhc2VkIGEgNi41cHJlMSB2ZXJzaW9uIHRvIGdldCBzb21lIHRlc3QgYW5kIHVzZXIgZmVlZGJhY2suCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDApOgoKLSBJIGFkZGVkIHRoZSAtdy8tLXdyaXRlLW91dCBmbGFnIGFuZCBzb21lIHZhcmlhYmxlcyB0byBnbyB3aXRoIGl0LiAtdyBpcyBhCiAgc2luZ2xlIHN0cmluZywgd2hhdGV2ZXIgeW91IGVudGVyIHRoZXJlIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2hlbiBjdXJsIGhhcwogIGNvbXBsZXRlZCBhIHN1Y2Nlc3NmdWwgcmVxdWVzdC4gVGhlcmUgYXJlIHNvbWUgdmFyaWFibGUgc3Vic3RpdHV0aW9ucyBhbmQKICB0aGV5IGFyZSBzcGVjaWZpZWQgYXMgJyV7dmFyaWFibGV9JyAod2l0aG91dCB0aGUgcXVvdGVzKS4gVmFyaWFibGVzIHRoYXQKICBleGlzdCBhcyBvZiB0aGlzIG1vbWVudCBhcmU6CgogICAgICAgIHRvdGFsX3RpbWUgICAgIC0gdG90YWwgdHJhbnNmZXIgdGltZSBpbiBzZWNvbmRzICh3aXRoIDIgZGVjaW1hbHMpCiAgICAgICAgc2l6ZV9kb3dubG9hZCAgLSB0b3RhbCBkb3dubG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNpemVfdXBsb2FkICAgIC0gdG90YWwgdXBsb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc3BlZWRfZG93bmxvYWQgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIGRvd25sb2FkCiAgICAgICAgc3BlZWRfdXBsb2FkICAgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIHVwbG9hZAoKICBJIHdpbGwgb2YgY291cnNlIGFkZCBtb3JlIHZhcmlhYmxlcywgYnV0IEkgbmVlZCBpbnB1dCBvbiB0aGVzZSBhbmQgb3RoZXJzLgoKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgaGFyZCB0byBqdXN0IGFwcGx5IG9uIHRoZSBuZXcKICBwcm9ncmVzcyBiYXIgY29uY2VwdC4gSSBuZWVkIHNvbWUgZmVlZGJhY2sgb24gdGhpcyBiZWZvcmUgdGhhdCdsbCBnZXQgcmUtCiAgaW50cm9kdWNlZCEgOi0vCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDApOgotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBzb21lIGZpeGVzIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIEkgY29udGludWVkCiAgd29ya2luZyBvbiBpdC4gSXQgc2VlbXMgdG8gd29yayBmb3IgaHR0cCBkb3dubG9hZCwgaHR0cCBwb3N0LCBmdHAgZG93bmxvYWQKICBhbmQgZnRwIHVwbG9hZC4gSXQgc2hvdWxkIGJlIGEgcHJldHR5IGdvb2QgdGVzdCBpdCB3b3JrcyBnZW5lcmFsbHkgZ29vZC4KCi0gU3RpbGwgbmVlZCB0byBhZGQgdGhlIC0jIHByb2dyZXNzIGJhciBpbnRvIHRoZSBuZXcgc3R5bGUgcHJvZ3Jlc3MgaW50ZXJmYWNlLgoKLSBHb25uYSBoYXZlIGEgZ28gYXQgbXkgbmV3IG91dHB1dCBvcHRpb24gcGFyYW1ldGVyIG5leHQuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDApOgotIFRoZSBwcm9ncmVzcyBtZXRlciBzdHVmZiBpcyBzbG93bHkgdGFraW5nIHBsYWNlLiBUaGVyZSdzIG1vcmUgbGVmdCBiZWZvcmUgaXQKICBpcyB3b3JraW5nIG9rIGFuZCBldmVyeXRoaW5nIGlzIHRlc3RlZCwgYnV0IHdlJ3JlIHJlYWNoaW5nIHRoZXJlLiBTbG93bHkhCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDApOgotIFBhdWwgTWFycXVpcyBmaXhlZCB0aGUgY29uZmlnIGZpbGUgcGFyc2luZyBvZiBjdXJsIHRvCiAgZGVhbCB3aXRoIGFueS1sZW5ndGggbGluZXMsIHJlbW92aW5nIHRoZSBwcmV2aW91cyBsaW1pdCBvZiA0Sy4KCi0gRWV0dSBPamFuZW4ncyBzdWdnZXN0aW9uIG9mIHN1cHBvcnRpbmcgdGhlIEAtc3R5bGUgZm9yIC1iCiAgaXMgaW1wbGVtZW50ZWQuIE5vdyAtYkA8ZmlsZW5hbWU+IHdvcmtzIGFzIHdlbGwgYXMgdGhlIG9sZCBzdHlsZS4gLWJALSBhbHNvCiAgc2ltaWxhcmx5IHJlYWRzIHRoZSBjb29raWVzIGZyb20gc3RkaW4uCgotIFJlbWluZGVyOiAtRCBzaG91bGQgbm90IHdyaXRlIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLCBpbiB0aGUgc2FtZSB3YXkKICAtbyBkb2VzLiBUaGF0IHdvdWxkIGVuYWJsZSBjdXJsIHRvIHVzZSAtYiBhbmQgLUQgb24gdGhlIHNhbWUgZmlsZS4uLgoKLSBFbGxpcyBQcml0Y2hhcmQgbWFkZSBnZXRkYXRlLnkgd29yayBmb3IgTWFjT1MgWC4KCi0gUGF1bCBIYXJyaW5ndG9uIGhlbHBlZCBtZSBvdXQgZmluZGluZyB0aGUgY3Jhc2ggaW4gdGhlCiAgY29va2llIHBhcnNlci4gSGUgYWxzbyBwb2ludGVkIG91dCBjdXJsJ3MgaGFiaXQgb2Ygc2VuZGluZyBlbXB0eSBjb29raWVzIHRvCiAgdGhlIHNlcnZlci4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAwKToKIC0gUm9uIFphcHAgY29ycmVjdGVkIGEgcHJvYmxlbSBpbiBzcmMvdXJsZ2xvYi5jIHRoYXQKICAgcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIGNvbXBpbGVkIG9uIHN1bm9zIDQuIFRoZSBwcm9ibGVtIGhhZCB0byBkbwogICB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHNwcmludGYoKSByZXR1cm4gY29kZSB0eXBlcy4KCiAtIFRyYW5zZmVyKCkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvd25sb2FkIGFuZCB1cGxvYWQgc2ltdWx0YW5lb3VzbHkuIExldCdzCiAgIGRvIHNvbWUgcHJvZ3Jlc3MgbWV0ZXIgZml4ZXMgbGF0ZXIgdGhpcyB3ZWVrLgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDApOgogLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgYW5vdGhlciBjb3JlIGR1bXAgaW4gdGhlIGNvb2tpZQogICBwYXJzZXIuIEN1cmwgZG9lc24ndCBwcm9wZXJseSByZWNvZ25pemUgdGhlICd2ZXJzaW9uJyBrZXl3b3JkIGFuZCBJIHRoaW5rCiAgIHRoYXQgaXMgd2hhdCBjYXVzZWQgdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggc29tZSBzcGVjcyBvbiBjb29raWVzIGFuZCBzZWUKICAgd2hhdCBlbHNlIGN1cmwgbGFja3MgdG8gaW1wcm92ZSB0aGlzIGEgYml0IG1vcmUgb25jZSBhbmQgZm9yIGFsbC4KCiAgIFJGQyAyMTA5IGNsZWFybHkgc3BlY2lmaWVzIGhvdyBjb29raWVzIHNob3VsZCBiZSBkZWFsdCB3aXRoIHdoZW4gdGhleSBhcmUKICAgY29tcGxpYW50IHdpdGggdGhhdCBzcGVjLiBJIGRvbid0IHRoaW5rIG1hbnkgc2VydmVycyBhcmUgdGhvdWdoLi4uCgogLSBNYXJrIFcuIEVpY2hpbiBmb3VuZCB0aGF0IHdoaWxlIGN1cmwgaXMgdXBsb2FkaW5nIGEgZm9ybQogICB0byBhIHdlYiBzaXRlLCBpdCBkb2Vzbid0IHJlYWQgaW5jb21pbmcgZGF0YSB3aHkgaXQnbGwgaGFuZyBhZnRlciBhIHdoaWxlCiAgIHNpbmNlIHRoZSBzb2NrZXQgInBpcGUiIGJlY29tZXMgZnVsbC4KCiAgIEl0IHRvb2sgbWUgdHdvIGhvdXJzIHRvIHJld3JpdGUgRG93bmxvYWQoKSBhbmQgVXBsb2FkKCkgaW50byB0aGUgbmV3CiAgIHNpbmdsZSBmdW5jdGlvbiBUcmFuc2ZlcigpLiBJdCBldmVuIHNlZW1zIHRvIHdvcmshIE1vcmUgdGVzdGluZyBpcyByZXF1aXJlZAogICBvZiBjb3Vyc2UuLi4gSSBzaG91bGQgZ2V0IHRoZSBoZWFkZXItc2VuZGluZyB0b2dldGhlciBpbiBhIGtpbmQgb2YgcXVldWUKICAgYW5kIGxldCB0aGVtIGdldCAidXBsb2FkZWQiIGluIFRyYW5zZmVyKCkgYXMgd2VsbC4KCiAtIFpoaWJpYW8gV3UgcG9pbnRlZCBvdXQgYSBjdXJsIGJ1ZyBpbiB0aGUgbG9jYXRpb246IGFyZWEsCiAgIGFsdGhvdWdoIEkgZGlkIG5vdCBnZXQgYSByZXByb2R1Y2libGUgd2F5IHRvIGRvIHRoaXMgd2h5IEkgaGF2ZSB0byB3YWl0CiAgIHdpdGggZml4aW5nIGFueXRoaW5nLgoKIC0gQm9iIFNjaGFkZXIgc3VnZ2VzdGVkIEkgc2hvdWxkIGltcGxlbWVudCByZXN1bWUKICAgc3VwcG9ydCBmb3IgdGhlIEhUVFAgUFVUIG9wZXJhdGlvbiwgYW5kIGFzIEkgdGhpbmsgaXQgaXMgYSB2YWxpZCBzdWdnZXN0aW9uCiAgIEknbGwgd29yayBvbiBpdC4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDAwKToKIC0gTSBUcmF2aXMgT2JlbmhhdXMgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWl4dXAgd2l0aCAteSBhbmQgLVkgdGhhdCB3YXMKICAgY29ycmVjdGVkLgoKIC0gSmVucyBTY2hsZXVzZW5lciBwb2ludGVkIG91dCBhIHByb2JsZW0gdG8gY29tcGlsZQogICBjdXJsIG9uIEFJWCA0LjEuNCBhbmQgZ2F2ZSBtZSBhIHNvbHV0aW9uLiBUaGlzIHByb2JsZW0gd2FzIGFscmVhZHkgZml4ZWQKICAgYnkgSvZybidzIHJlY2VudCAjaW5jbHVkZSBtb2RpZmljYXRpb25zIQoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDApOgogLSBPc2thciBMaWxqZWJsYWQgcG9pbnRlZCBvdXQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0KICAgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgc3lzdGVtIHRoYXQgbWFkZSBjdXJsIGZvbGxvd2luZyBhIGxvY2F0aW9uOiB0byBhCiAgIGRpZmZlcmVudCBwcm90b2NvbCB0byBmYWlsLgoKICAgQXQgSmFudWFyeSAzMXN0IEkgcmUtY29uc2lkZXJlZCB0aGlzIGZpeCBhbmQgdGhlIHN1cnJvdW5kaW5nIHNvdXJjZSBjb2RlLiBJCiAgIGNvdWxkIG5vdCByZWFsbHkgc2VlIHRoYXQgdGhlIHBhdGNoIGRpZCBhbnkgZGlmZmVyZW5jZSwgd2h5IEkgcmVtb3ZlZCBpdAogICBhZ2FpbiBmb3IgZnVydGhlciByZXNlYXJjaCBhbmQgZGVidWdnaW5nLiAoSXQgZGlzYWJsZWQgbG9jYXRpb246IGZvbGxvd2luZwogICBvbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgb24gZGVmYXVsdCBwb3J0cy4pCgogLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgYSBmaXggdGhhdCBvbmNlIGFnYWluCiAgIG1hZGUgaXQgcG9zc2libGUgdG8gc2VsZWN0IHByb2dyZXNzIGJhci4KCiAtIEr2cm4gYWxzbyBmaXhlZCBhIGZldyBpbmNsdWRlIHByb2JsZW1zLgoKVmVyc2lvbiA2LjQKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAwKToKIC0gQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBCavZybiBTdGVuYmVyZywgSSBtYWRlIHRoZQogICBwcm9ncmVzcyBkZWFsIGJldHRlciB3aXRoIGxhcmdlciBmaWxlcyBhbmQgYWRkZWQgYSAiVGltZSIgZmllbGQgd2hpY2ggc2hvd3MKICAgdGhlIHRpbWUgc3BlbnQgb24gdGhlIGRvd25sb2FkIHNvIGZhci4KIC0gSSdtIG5vdyB1c2luZyB0aGUgQ1ZTIHJlcG9zaXRvcnkgb24gc291cmNlZm9yZ2UubmV0LCB3aGljaCBhbHNvIGFsbG93cyB3ZWIKICAgYnJvd3NpbmcuIFNlZSBodHRwOi8vY3VybC5oYXh4Lm51LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZXJlZm9yZSB5b3UgY2FuJ3QgbWFrZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGxpYnMhCgo=