ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlbG9nCgpWZXJzaW9uIDcuMTAuNiAoMjggSnVseSAyMDAzKQoKRGFuaWVsICgyOCBKdWx5KQotIEZyYW7nb2lzIFBvbnMgYnJvdWdodCBhIHBhdGNoIHRoYXQgb25jZSBhZ2FpbiBtYWRlIGN1cmwgZGVhbCB3aXRoIGZ0cCBhbmQKICAiZG91YmxlIHNsYXNoIiBhcyBpbmRpY2F0aW5nIHRoZSByb290IGRpcmVjdG9yeS4gSW4gdGhlIFJGQzE3MzgtZml4IG9mIEFwcmlsCiAgMzAsIHRoYXQgYWJpbGl0eSB3YXMgcmVtb3ZlZCAoc2luY2UgaXQgaXMgbm90IHRoZSAicmlnaHQiIHdheSkuIFNvLCBzdGFydGluZwogIG5vdyB3ZSBjYW4gbGlzdCB0aGUgcm9vdCBkaXIgb2YgYW4gZnRwIHNlcnZlciBib3RoIHRoZXNlIHdheXM6CgogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLyUyZiAgYXMgd2VsbCBhcwogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLy8KCkRhbmllbCAoMjQgSnVseSkKLSBIZW5yeSBCbGFuZCBwb2ludGVkIG91dCB0aGF0IHdlIGluY2x1ZGVkIHN5cy9yZXNvdXJjZS5oIHdpdGhvdXQgZ29vZCByZWFzb24KICBpbiBzZXZlcmFsIHNvdXJjZSBmaWxlcy4gV2l0aG91dCBpdCBpbmNsdWRlZCwgUU5YIGJ1aWxkcyBiZXR0ZXIuLi4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgpEYW5pZWwgKDIzIEp1bHkpCi0gVHJhY3kgQm9laHJlciBleHBlcmllbmNlZCBETlMgY2FjaGUgcHJvYmxlbXMgYW5kIGRpZCBzb21lIG5pY2UgZGVidWdnaW5nCiAgYW5kIHRyYWNraW5nIHdoaWNoIG1hZGUgaXQgZWFzeSBmb3IgbWUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbSBhbmQgVHJhY3kKICBjb3VsZCB2ZXJpZnkgdGhhdCBpdCBkaWQgY3VyZSB0aGUgcHJvYmxlbSEgV2hlbiByZS11c2luZyBhIGNvbm5lY3Rpb24gd2UKICBub3cgbWFrZSBzdXJlIHdlIGRvbid0IHJlLXVzZSB0aGUgJ2Nvbm5lY3RfYWRkcicgc3RydWN0LgoKLSBEYW5pZWwgS291cmlsIGNvcnJlY3RlZCB0aGUgR1NTLU5lZ290aWF0ZSBjb2RlLgoKLSBKdWFuIEYuIENvZGFnbm9uZSBwcm92aWRlZCBmaXhlcyB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIGZpbmUgb24gV2luZG93cwogIGFnYWluLgoKRGFuaWVsICgyMiBKdWx5KQotIEVkaXRlZCB0aGUgY3VybC9jdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJ1aWxkIG9uIFdpbmRvd3MgcHJvcGVybHkuCgpEYW5pZWwgKDIxIEp1bHkpCi0gTW92ZWQgdGhlIHByb3h5IGNyZWRlbnRpYWxzIGZyb20gdGhlIFNlc3Npb25IYW5kbGUgc3RydWN0IHRvIHRoZSBjb25uZWN0ZGF0YQogIHN0cnVjdCwgdG8gbWFrZSBtdWx0aXBsZSBwcm94eSBjb25uZWN0aW9ucyB3aXRoIGRpZmZlcmVyZW50IHVzZXIgbmFtZXMgd29yay4KCi0gQWRqdXN0ZWQgdGhlIE5UTE0gY29kZSB0byBzdXBwb3J0IHByb3h5IGZ1bmN0aW9uYWxpdHkuCgotIE1hZGUgdGhlIGtyYjQgc3R1ZmYgY29tcGlsZSB3aXRoIHRoZSB1c2VyK3Bhc3N3b3JkIGZpZWxkcyBtb3ZlZC4KClZlcnNpb24gNy4xMC42LXByZTQgKDIxIEp1bHkgMjAwMykKCkRhbmllbCAoMjAgSnVseSkKLSBEYXZpZCBHYXJkbmVyIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgNzcwNzU1IHRoYXQgdXNpbmcgdGhlIEZUUCBjb21tYW5kCiAgQ1dEIHdpdGggYSBibGFuayBhcmd1bWVudCBpcyBhIGJhZCBpZGVhIGFuZCBJIG1hZGUgbGliY3VybCBza2lwIGVtcHR5IHBhdGgKICBzZWdtZW50cyBzdGFydGluZyBub3cuCgpEYW5pZWwgKDE4IEp1bHkpCi0gQ3JpcyBwb2ludGVkIG91dCB0aGF0IG15IGZpeCBvbiBKdWx5IDE2dGggZGlkbid0IHdvcmsgZnVsbHkuIEhpcyBwb2ludGluZwogIG91dCB0aGlzIChhbmQgaGlzIHBhdGNoKSBhbHNvIG1hZGUgbWUgcmVhbGl6ZSB0aGF0IHdlIGhhdmUgYSB2ZXJ5IHNpbWlsYXIKICBidWcgaW4gdGhlIEZUUCBjb25uZWN0aW9uIHJlLXVzZSBjb2RlLiBXZSBtdXN0IHN0b3JlIGEgc2VwYXJhdGUgdXNlciBhbmQKICBwYXNzd29yZCBmaWVsZCBmb3IgZWFjaCBjb25uZWN0aW9uIHdlIGtlZXAgKGF0IGxlYXN0IGZvciBGVFAgYW5kIEhUVFArTlRMTQogIGNvbm5lY3Rpb25zLCBzbyBJIG1hZGUgdXMgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkpLgoKLSBTaW5jZSBOVExNIGF1dGhlbnRpY2F0ZXMgY29ubmVjdGlvbnMgaW5zdGVhZCBvZiBzaW5nbGUgcmVxdWVzdHMsIEkgaGFkIHRvCiAgcmUtYXJyYW5nZSBob3cgd2Ugc3RvcmUgdGhlIE5UTE0gZGF0YSBhbmQgSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdCBzdWl0ZSB0bwogIGZpbmFsbHkgd29yayBwcm9wZXJseSB3aXRoIHBlcnNpc3RhbmN5IHRvIG1ha2UgdGhlIE5UTE0gdGVzdHMgcnVuIGZpbmUKICBhZ2Fpbi4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBoYXZlIHRvIHVwZGF0ZSBsb3RzIG9mIEhUVFAgdGVzdCBjYXNlcy4KCkRhbmllbCAoMTYgSnVseSkKLSBDcmlzIEJhaWxpZmYncyBidWcgcmVwb3J0IDc2ODI3NSBwb2ludGVkIG91dCB0aGF0IHVzaW5nIEJhc2ljIGF1dGggd2l0aAogIHdyb25nIHVzZXIrcGFzc3dvcmQgY2F1c2VkIGFuIGVuZGxlc3MgbG9vcC4gRml4ZWQgbm93LiBIZSBhbHNvIGZvdW5kIG91dCB0aGF0CiAgd2UgZGlkbid0IHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBjb25uZWN0aW9ucyB3aXRoIE5UTE0uIEZpeGVkIHRvby4KCi0gRGFuIFdpbnNoaXAgcHJvdmlkZWQgZml4ZXMgZm9yIHRoZSBOVExNIGNvZGUuCgpEYW5pZWwgKDUgSnVseSkKLSBEb3VnIEthdWZtYW4gcHJvdmlkZWQgYWRkaXRpb25hbCBmaXhlcyBmb3IgdGhlIERPUyBwb3J0LgoKRGFuaWVsICg0IEp1bHkpCi0gUmljayBSaWNoYXJkc29uIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcgc2V0dmJ1ZigpIHRvIGFjaGl2ZSBub24tYnVmZmVyaW5nCiAgb24gb3V0cHV0IGlzIG5vLWdvb2QgZm9yIFNDTyBYZW5peCBhbmQgb3RoZXIgdW5peGVzLiBXZSBzd2l0Y2hlZCBvdmVyIHRvCiAgdXNpbmcgcGxhaW4gZmZsdXNoKCkgaW5zdGVhZC4KCi0gRGFuIEdyYXlzb24gcG9pbnRlZCBvdXQgdGhhdCB3ZSBzZXQgdGhlIENVUkxfQ0FfQlVORExFIHZhcmlhYmxlIHdyb25nbHkgaW4KICB0aGUgY29uZmlndXJlIHNjcmlwdCwgYW5kIEkgaGFkIHRvIGNoYW5nZSBzb21lIGJ1aWxkIHN0dWZmIHRvIG1ha2UgdGhlIG5ldwogIHdheSB3b3JrLgoKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB3YXMgYXBwbGllZCB0aGF0IGludHJvZHVjZXMgdGhlIGZvbGxvd2luZzoKCiAgIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiB0byBzZXQgYSBjYWxsYmFjayB0aGF0IGdldHMgY2FsbGVkIHdpdGggdGhlCiAgIE9wZW5TU0wncyBzc2xfY3R4IHBvaW50ZXIgcGFzc2VkIGluIGFuZCBhbGxvdyBhIGNhbGxiYWNrIHRvIGFjdCBvbiBpdC4gSWYKICAgYW55dGhpbmcgYnV0IENVUkxFX09LIGlzIHJldHVybmVkLCB0aGF0IHdpbGwgYWxzbyBiZSByZXR1cm5lZCBieSBsaWJjdXJsCiAgIGFsbCB0aGUgd2F5IGJhY2suIElmIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgQ1VSTE9QVF9VUkwsIGxpYmN1cmwgd2lsbAogICBkZXRlY3QgdGhpcyBhbmQgaW5zdGVhZCBnbyB1c2UgdGhlIG5ldyBVUkwuCgogICBDVVJMT1BUX1NTTF9DVFhfREFUQSBpcyBhIHBvaW50ZXIgeW91IHNldCB0byBnZXQgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBzZXQKICAgd2l0aCBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04uCgpEYW5pZWwgKDEgSnVseSkKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzIGEgY2xpZW50IHRvIHF1aXQgdGhlIHRlc3Qgc3VpdGUncwogIEhUVFAgc2VydmVyLgoKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgcGF0Y2hlZCBhIGxpYiBoYW5kbGUgbGVhayBpbiB0aGUgbGRhcCBjb2RlLgoKRGFuaWVsICgyNSBKdW5lKQotIE1vcmUgTlRMTS1pbXByb3ZlbWVudHMuIExlc3MgY29kZS4gU21hbGxlciBwYWNrZXRzIGJhY2sgYW5kIGZvcnRoLgoKRGFuaWVsICgyMyBKdW5lKQotIEVyaWMgR2xhc3MgcHJvdmlkZWQgdXMgd2l0aCBhIGJldHRlciBkb2Mgb24gTlRMTSBkZXRhaWxzLCBhbmQgSSBhZGRlZCBtb3JlCiAgY29tbWVudHMgYW5kIGNsYXJpZmllZCB0aGUgY3VycmVudCBjb2RlIG1vcmUuIFVzaW5nIHRoZSBuZXcga25vd2xlZGdlLCB3ZQogIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgdGhlIE5UTE0gc3R1ZmYgd29yayBldmVuIGJldHRlci4KICBFcmljJ3Mgb3JpZ2luYWwgVVJMOiBodHRwOi8vZGF2ZW5wb3J0LnNvdXJjZWZvcmdlLm5ldC9udGxtLmh0bWwKICBWZXJzaW9uIHN0b3JlZCBhbmQgcHJvdmlkZWQgYXQgY3VybCBzaXRlOiBodHRwOi8vY3VybC5oYXh4LnNlL3JmYy9udGxtLmh0bWwKCi0gRml4ZWQgdGhlIG1pbm9yIGNvbXBpbGUgcHJvYmxlbXMgcHJlMyBoYWQgaWYgYnVpbHQgd2l0aG91dCBHU1NBUEkgYW5kL29yCiAgU1NMLgoKVmVyc2lvbiA3LjEwLjYtcHJlMyAoMTkgSnVuZSAyMDAzKQoKRGFuaWVsICgxOSBKdW5lKQotIE1hZGUgY3VybCB1c2UgY3VybF9mcmVlKCkgb24gbWVtb3J5IHJldHVybmVkIGJ5IGN1cmxfZ2V0ZW52KCksIGFzIHRoaXMKICBzaG91bGQgdGhlb3JldGljbHkgbWFrZSBpdCBwb3NzaWJseSB0byBidWlsZCBhbmQgcnVuIGN1cmwgYW5kIGxpYmN1cmwgd2l0aAogIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWVzIHdpdGggbm8gcHJvYmxlbXMuCgpEYW5pZWwgKDE4IEp1bmUpCi0gSW1wcm92ZWQgdGhlIG1raGVscC5wbCBhIGJpdCBmdXJ0aGVyIHRvIG1ha2UgYSBuaWNlciBodWdlaGVscCB0ZXh0IGFuZCB0bwogIGluY2x1ZGUgYSBiZXR0ZXIgY29tbWVudCBpbiB0aGUgdG9wIGZvciB0aGUgZ3ppcCBjb21wcmVzc2VkIHZlcnNpb24uCgpEYW5pZWwgKDE3IEp1bmUpCi0gQ1VSTE9QVF9IVFRQQVVUSCBpcyBub3cgYSBiaXRtYXNrLCBpbiB3aGljaCB5b3Ugc2V0IHdoaWNoIGF1dGhlbnRpY2F0aW9uCiAgdHlwZShzKSB5b3Ugd2FudCB0byB1c2UuIElmIG1vcmUgdGhhbiBvbmUgaXMgc2V0LCBsaWJjdXJsIHdpbGwgdXNlIG9uZSBvZgogIHRoZSBzZWxlY3RlZCBvbmUgYW5kIHRoZSBvbmUgaXQgY29uc2lkZXJzIGlzIG1vcmUgc2VjdXJlLiBUZXN0IGNhc2UgNjcgYW5kCiAgNjggKGZvciBOVExNKSB3ZXJlIGZpeGVkIGFuZCB3ZSd2ZSByZWR1Y2VkIGEgcm91bmQtdHJpcCBmb3Igc3BlY2lmaWMgLS1udGxtCiAgZmVhdGNoZXMsIGFuZCB0ZXN0IGNhc2UgNjkgYW5kIDcwIHdlcmUgYWRkZWQgZm9yIHRlc3RpbmcgYXV0aGVudGljYXRpb24KICAicGlja2luZyIuIC0tYW55YXV0aCBpcyB0aGUgbmV3IGNvbW1hbmQgbGluZSB0b29sIG9wdGlvbiwgYW5kIEkgYWxzbyBhZGRlZAogIC0tYmFzaWMgZm9yIGNvbXBsZXRlbmVzcyAodGhhdCdzIHRoZSBkZWZhdWx0IHR5cGUpLgoKLSBGaXhlZCB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIHVzZSB0aGUgaW5mbyBwcm92aWRlZCBieSB0aGUgbmV3IGN1cmwgLVYKICBvdXRwdXQuCgotIC0tZW5hYmxlLWRlYnVnIG5vdyBzZXRzIHRoZSBDVVJMREVCVUcgZGVmaW5lIGluc3RlYWQgb2YgTUFMTE9DREVCVUcsIGFzIGl0CiAgaXMgbWVhbnQgdG8gYmUgYSBnZW5lcmljIGRlYnVnIGNvbmRpdGlvbmFsLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIGNhbiBub3cgcmV0dXJuIENVUkxfVkVSU0lPTl9ERUJVRyBhcyBhIGZlYXR1cmUgYml0LCB0bwogIGluZGljYXRlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IHdpdGggQ1VSTERFQlVHIHNldC4KCi0gUmFscGggTWl0Y2hlbGwgZm91bmQgb3V0IHRoYXQgc29tZSB3ZWIgYXBwbGljYXRpb25zIHZlcnkgYmFkbHkgdXNlcyB3aGl0ZQogIHNwYWNlcyBpbiBMb2NhdGlvbjogcmVkaXJlY3RzLCBhbmQgYXBwYXJlbnRseSBJRSBpcyBhIGJyb3dzZXIgKHRoZSBvbmx5CiAgb25lPykgdGhhdCBzdXBwb3J0cyB0aGlzIGFib21pbmF0aW9uLiBCYXNlZCBvbiBSYWxwaCdzIHBhdGNoLCBJIGFkZGVkIGNvZGUKICB0aGF0IG5vdyBhdHRlbXB0cyB0byByZXBsYWNlIHdoaXRlIHNwYWNlcyB3aXRoIHRoZSBwcm9wZXIgIiUyMCIgb3IgIisiLgogIFRlc3QgY2FzZSA0MCBhbmQgNDIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgbXkgY2hhbmdlcy4KCi0gY3VybCAtViBub3cgYWxzbyBvdXRwdXRzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGUgYXZhaWxhYmxlIGxpYnJhcnkgb2ZmZXJzIChpZgogIGFueSkuCgotIFRoZSBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IGluY2x1ZGVzICJHU1MiIGlmIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHU1NBUEkKICBzdXBwb3J0LgoKLSBEYXZpZCBPcnJlbGwgcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIHN0aWxsIGNyYXNoZWQgd2hlbiBzZW5kaW5nIEhVR0UgcmVxdWVzdHMKICBvdmVyIEhUVFBTLi4uIEkgZml4ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmUyICgxNiBKdW5lIDIwMDMpCgpEYW5pZWwgKDE2IEp1bmUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBiaXRtYXNrZWQgaW5mb3JtYXRpb24gd2VhdGhlciBOVExNIGFuZAogIEdTU05FR09USUFURSBhcmUgc3VwcG9ydGVkLCBzaW5jZSBpdCBpcyBkb29tZWQgdG8gdmFyeSBvbiBkaWZmZXJlbnQKICBpbnN0YWxsYXRpaW9ucy4KCi0gSSByZW1hZGUgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBNRDUtY29kZSBwcm92aWRlZCBieSBPcGVuU1NMIGlmCiAgdGhhdCBpcyBwcmVzZW50LCBhbmQgb25seSB1c2Ugb3VyIG93biBNRDUtY29kZSBpZiBpdCBpc24ndC4KICAKRGFuaWVsICgxMyBKdW5lKQotIE1vcmUgTlRMTSBoZWxwLCBmaXhlcyBhbmQgcGF0Y2hlcyBmcm9tIENyaXMgQmFpbGlmZi4KCi0gTWFydHkgS3VocnQgYnJvdWdodCBpbmNsdWRlIGZpeGVzIGZvciBtYWtpbmcgVk1TIGJ1aWxkcyB3YXJuaW5nLWZyZWUuCgpEYW5pZWwgKDEyIEp1bmUpCi0gTlRMTSBhdXRoZW50aWNhdGlvbiB3b3JrcyBzb21ld2hhdCBhZ2FpbnN0IHRoZSB0ZXN0IHNlcnZlcnMgcHJvdmlkZWQgYnkKICBNYXRoaWFzIEF4ZWxzc29uIGFuZCBDcmlzIEJhaWxpZmYuIFVzZSBieSBzZXR0aW5nIENVUkxPUFRfSFRUUEFVVEggdG8KICBDVVJMQVVUSF9OVExNIHRvIGxpYmN1cmwsIG9yIC0tbnRsbSBmb3IgdGhlIGN1cmwgdG9vbC4gVGVzdCBjYXNlIDY3IGFuZCA2OAogIHdlcmUgYWRkZWQgZm9yIHRoaXMuIE5UTE0tc3VwcG9ydCByZXF1aXJlcyBPcGVuU1NMLgoKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBwYXRjaCwgdGhhdCBncmFudGVkIHRoYXQgZ3ppcCBhbmQgbGlieiBhcmUgYXZhaWxhYmxlCiAgYXQgYnVpbGQtdGltZSwgY29tcHJlc3NlcyB0aGUgaHVnZWhlbHAgdGV4dCBpbiB0aGUgY3VybCBjb21tYW5kIGxpbmUgYW5kCiAgdW5jb21wcmVzc2VzIGl0IGF0IHJlcXVlc3QuIFNhdmVzIHNvbWUgfjYwSyBpbiB0aGUgZmluYWwgb3V0cHV0IGV4ZWN1dGFibGUuCgpEYW5pZWwgKDExIEp1bmUpCi0gTG9uZyBkYXkgb2YgZmlnaHRpbmcgdGhlIE5UTE0gZGVtb25zLgoKRGFuaWVsICgxMCBKdW5lKQotIE1vZGlmaWVkIGhvdyB0byBzZXQgYXV0aCB0eXBlIHRvIGxpYmN1cmwuIE5vdyB1c2UgQ1VSTE9QVF9IVFRQQVVUSCBpbnN0ZWFkLAogIGFuZCBwaWNrIG1ldGhvZC4gU3VwcG9ydGVkIG9uZXMgY3VycmVudGx5IGFyZToKICBDVVJMQVVUSF9CQVNJQyAgICAgLSBkZWZhdWx0IHNlbGVjdGlvbgogIENVUkxBVVRIX0RJR0VTVCAgICAtIGZvcm1lcmx5IENVUkxPUFRfSFRUUERJR0VTVAogIENVUkxBVVRIX0dTU05FR09USUFURQoKLSBEYW5pZWwgS291cmlsIGFkZGVkIEhUVFAgR1NTLU5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0LCBhcyBkZWZpbmVkIGluCiAgdGhlIElFVEYgZHJhZnQgZHJhZnQtYnJlemFrLXNwbmVnby1odHRwLTA0LnR4dC4gSW4gdXNlIGFscmVhZHkgYnkgdmFyaW91cwogIE1pY3Jvc29mdCB3ZWIgYXBwbGljYXRpb25zLiAtLW5lZ290aWF0ZSBpcyB0aGUgbmV3IGZhbWlseSBtZW1iZXIuIFRvIHRha2UKICBhZHZhbnRhZ2Ugb2YgdGhpcywgeW91IG5lZWQgb25lIG9mIHRoZXNlIHBhY2thZ2VzOgoKICBvIEhlaW1kYWwgS2VyYmVyb3M1ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5wZGMua3RoLnNlL2hlaW1kYWwvaGVpbWRhbC5odG1sCiAgbyBHU1NBUEkgZnJvbSBHbG9idXMgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5nbG9idXMub3JnLwogIG8gR1NTQVBJIGxpYnJhcmllcyBmcm9tIE1JVCBLZXJiZXJvczUgIGh0dHA6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy93d3cvCgotIEEgbWlzc2luZyBlbmRpbmcgYnJhY2tldCAoJ10nKSB3aGlsZSBkb2luZyBVUkwgZ2xvYmJpbmcgY291bGQgbGVhZCB0byBhCiAgc2VnZmF1bHQuIFdoaWxlIGZpeGluZyB0aGlzLCBJIGFsc28gaW50cm9kdWNlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIHRoZQogIGdsb2JiaW5nIGNvZGUuIChBbGwgdGhpcyBpcyBhcHBsaWNhdGlvbiBjb2RlIG91dHNpZGUgbGliY3VybC4pCgpEYW5pZWwgKDYgSnVuZSkKLSBEYXZpZCBPcnJlbGwgZm91bmQgb3V0IHRoYXQgc2VuZGluZyBhIGh1Z2UgR0VUIHJlcXVlc3Qgb3ZlciBIVFRQUyBjb3VsZAogIG1ha2UgbGliY3VybCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZS4KCkRhbmllbCAoMiBKdW5lKQotIFJpY2hhcmQgQnJhbWFudGUgZm91bmQgb3V0IHRoYXQgIkNvbnRlbnQtTGVuZ3RoOiAwIiB3YXMgbm90IHByb3Blcmx5IHVzZWQgYnkKICBsaWJjdXJsIGlmIHRoZSByZXNwb25zZS1oZWFkZXJzIGluZGljYXRlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGJlCiAgY2xvc2VkLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBsaWVkLCB0aGF0IG1ha2VzIHRoZSAtLXByb2dyZXNzLWJhciB0YWtlIHRoZQogIGxvY2FsIHNpemUgaW50byBhY2NvdW50IHdoZW4gZG9pbmcgcmVzdW1lZCBkb3dubG9hZHMuCgotIEZlZWRiYWNrIGZyb20gU2VyZ2UgU2VtYXNoa28gbWFkZSBtZSBjaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgd2hlbgogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgaXMgcmV0dXJuZWQuCgotIEFub255bW91cyBpbiBidWcgcmVwb3J0ICM3NDUxMjIgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nCiAgU1NMX0NUWF9zZXRfb3B0aW9ucyguLi4gU1NMX09QX0FMTCkgdG8gd29yayBhcm91bmQgZmxhd3MgaW4gZXhpc3RpbmcgU1NMCiAgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyNyBNYXkpCi0gQW5kcmVhcyBMZXkgYW5kIFJpY2ggR3JheSBoZWxwZWQgbWUgcG9pbnQgb3V0IHRoYXQgbm8gdmVyc2lvbiBvZiBIUC1VWCBoYXMKICB0aGUgc3lzL3NlbGVjdC5oIGhlYWRlciBmaWxlIHNvIGluY2x1ZGluZyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gY3VybC9tdWx0aS5oCiAgaXMgbm90IGEgZ29vZCB0aGluZy4gTm93IHdlIGNoZWNrIGZvciBIUFVYIGFuZCBhdm9pZCB1c2luZyB0aGF0IGhlYWRlciBvbgogIHN1Y2ggc3lzdGVtcy4KCi0gUnVkeSBLb2VudG8gZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBjdXJsJ3MgcmVjZW50IGhhYml0IG9mIFBPU1RpbmcgZGF0YSBpbgogIHR3byBzZXBhcmF0ZSBzZW5kKCkgY2FsbHMsIGZpcnN0IHRoZSBoZWFkZXJzIGFuZCB0aGVuIHRoZSBkYXRhLiBJJ3ZlIG5vdwogIG1hZGUgYSBmaXggdGhhdCBmb3Igc3RhdGljIGFuZCBrbm93biBjb250ZW50IHRoYXQgaXMgbGVzcyB0aGFuIDEwMEsgaW4gc2l6ZSwKICBldmVyeXRoaW5nIGlzIG5vdyBzZW50IGluIG9uZSBzaW5nbGUgc3lzdGVtIGNhbGwgYWdhaW4uIFRoaXMgaXMgYWxzbyBiZXR0ZXIKICBmb3IgbmV0d29yayBwZXJmb3JtYW5jZSByZWFzb25zLgoKLSBJIG1vZGlmaWVkIHRoZSBtYWluIG1ha2VmaWxlIHRvIG5vdCBidWlsZCB0aGUgdGVzdCBzdWl0ZSBhbmQgYSBmZXcgb3RoZXIKICB1bm5lY2Vzc2FyeSB0aGluZ3MgYnkgZGVmYXVsdC4gTm93LCB0aGUgdGVzdCBzdWl0ZSBpcyBidWlsdCB3aGVuICdtYWtlIHRlc3QnCiAgaXMgcnVuLiAgVGhpcyByZWR1Y2VzIGJ1aWxkIHRpbWUgZm9yIHRob3NlIHdobyBkb24ndCBjYXJlIGZvciB0aGUgdGVzdAogIHN1aXRlLCBhbmQgaXQgYWxzbyByZWR1Y2VzIGNvbmZ1c2lvbiBmb3IgcGVvcGxlIHVzaW5nIHBsYXRmb3JtcyB3aGVyZSB0aGUKICB0ZXN0IHN1aXRlIGJ1aWxkIGZhaWxzIQoKRGFuaWVsICgyNiBNYXkpCi0gQ2hyaXMgTGV3aXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSAjaWZkZWZzIGluIGN1cmwvbXVsdGkuaCBmb3IgV2luZG93cywKICB3aGljaCBpcyBub3cgY29ycmVjdGVkLgoKLSBKaXMgSm95IGZvdW5kIGFub3RoZXIgZmxhdyBpbiB0aGUgU09DSzUgY29kZSwgYXMgbGliY3VybCB0cmVhdGVkIHRoZSBzb2NrczUKICBwcm94eSBhIGxpdHRsZSB0b28gbXVjaCBsaWtlIGFzIGlmIGl0IHdhcyBhIGh0dHAgcHJveHkuCgpEYW5pZWwgKDIzIE1heSkKLSBSaWNhcmRvIENhZGltZSBmb3VuZCBhIHNvY2tldCBsZWFrIHdoZW4gbGlzdGluZyBkaXJlY3RvcmllcyB3aXRob3V0CiAgY29udGVudHMuIFRlc3QgY2FzZXMgMTQ0IGFuZCAxNDUgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gUnVkeSBLb2VudG8gZm91bmQgeWV0IGFub3RoZXIgcHJvYmxlbSB3aGVuIGEgSFRUUCBzZXJ2ZXIgcmV0dXJucyBvbmx5IGEKICBzaW5nbGUtbGluZSBvZiBjb250ZW50cyB3aXRob3V0IGFueSBoZWFkZXJzIGF0IGFsbC4gbGliY3VybCB0aGVuIGZhaWxlZCB0bwogIGNvdW50IHRoZSBkYXRhLCB0aHVzIHJldHVybmluZyBlcnJvciA1MiAibm8gY29udGVudHMiLiBUZXN0IGNhc2UgNjYgd2FzCiAgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvIHJpZ2h0LgoKVmVyc2lvbiA3LjEwLjYtcHJlMSAoMjMgTWF5IDIwMDMpCgpEYW5pZWwgKDIzIE1heSkKLSBKaXMgaW4gYnVnIHJlcG9ydCAjNzQxODQxLCBmaXhlZCBhIGJ1ZyBpbiB0aGUgU09DS1M1IHByb3h5LXVzaW5nIGNvZGUuCgpEYW5pZWwgKDIyIE1heSkKLSBEYXZpZCBSZW1haGwgc2V0IHVwIGEgdGVzdC1zZXJ2ZXIgZm9yIG1lIHByb3ZpZGluZyBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYW5kIEkgd3JvdGUgdGhlIGZpcnN0IHdvcmtpbmcgY29kZSB0aGF0IHN1cHBvcnQgaXQuIFRoZSB0ZXN0IHN1aXRlIHdhcwogIG1vZGlmaWVkIHNsaWdodGx5IGFzIHdlbGwgdG8gd29yayBiZXR0ZXIgZm9yIGl0IGFuZCAtLWRpZ2VzdCB3YXMgYWRkZWQgdG8KICB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGFuZCBDVVJMT1BUX0hUVFBESUdFU1QgdG8gdGhlIGxpYnJhcnkpLi4uICBSRkMyNjE3CiAgaGFzIGFsbCB0aGUgZ29yeSBkZXRhaWxzLgoKRGFuaWVsICgyMSBNYXkpCi0gRGF2aWQgQmFsYXppYyBwb2ludGVkIG91dCB0aGF0IGN1cmxfdW5lc2NhcGUoKSBkaWRuJ3QgY2hlY2sgdGhhdCAlLWNvZGVzCiAgd2VyZSBjb3JyZWN0bHkgZm9sbG93ZWQgYnkgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyB3aGVuIGl0IHVuZXNjYXBlIHN0cmluZ3MuCiAgTm93LCB3ZSBkbyB0aGUgY2hlY2sgYW5kIG9ubHkgJVhYIGNvZGVzIGFyZSB1bmVzY2FwZWQgaWYgdGhlIFggbGV0dGVycyBhcmUKICBoZXhhZGVjaW1hbHMuCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCBidWlsZCB3aXRoIGRqZ3BwIG9uIERPUy4KCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgdGhlIG1raGVscC5wbCBzY3JpcHQgdG8gbWFrZSBhIG5pY2VyIG1hbnVhbCB0aGF0IGlzCiAgc2hvd24gd2l0aCBjdXJsIC1NLgoKRGFuaWVsICgyMCBNYXkpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIG1vcmUgY29uc2VydmF0aXZlLCBub3QKICBleHBlY3RpbmcgaF9hbGlhc2VzIG9mIHRoZSBob3N0ZW50IHN0cnVjdCB0byBhbHdheXMgYmUgbm9uLU5VTEwuCgpEYW5pZWwgKDE5IE1heSkKLSBBcyByZXF1ZXN0ZWQgYnkgTWFydGluIE1pY2hsbWF5ciBpbiBEZWJpYW4gYnVnIHJlcG9ydCAjMTkzNjMwLCBsaWJjdXJsIG5vdwogIHN1cHBvcnRzIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy4gQWRkZWQKICB0ZXN0IGNhc2UgNjMgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuMTAuNSAoMTkgTWF5IDIwMDMpCgpEYW5pZWwgKDE1IE1heSkKLSBDaGFuZ2VkIHRoZSBvcmRlciBmb3IgdGhlIGluX2FkZHJfdCB0ZXN0aW5nLCBhcyAndW5zaWduZWQgbG9uZycgc2VlbXMgdG8gYmUKICBhIHZlcnkgY29tbW9uIHR5cGUgaW5ldF9hZGRyKCkgcmV0dXJucy4KCkRhbmllbCAoMTQgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwcm92aWRlZCBhIGZpeCB0aGF0IGNhbGxzIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHdhaXRpbmcKICBmb3IgRlRQIGNvbW1hbmQgcmVzcG9uc2VzIHRha2UgPjEgc2Vjb25kLiBJdCdsbCBtYWtlIGFwcGxpY2F0aW9ucyBtb3JlCiAgInJlc3BvbnNpdmUiIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBzbG93IGZ0cCBzZXJ2ZXJzLgoKRGFuaWVsICgxMiBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB1cGxvYWRzIGhhZCB0d28gcXVpcmtzOgogICBvIHdoZW4gdXNpbmcgRlRQIFBPUlQgY29tbWFuZCwgaXQgdXNlZCBibG9ja2luZyBzb2NrZXRzIQogICBvIGl0IGNvdWxkIGxvb3AgYSBsb25nIHRpbWUgd2l0aG91dCBkb2luZyBwcm9ncmVzcyBtZXRlciB1cGRhdGVzCiAgQm90aCBpdGVtcyBhcmUgZml4ZWQgbm93LgoKRGFuaWVsICg5IE1heSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlZCBDVVJMT1BUX0VOQ09ESU5HIHRvIHNlbGVjdCBhbGwgc3VwcG9ydGVkIGVuY29kaW5ncyBpZgogIHNldCB0byAiIi4gIFRoaXMgZnJlZXMgdGhlIGFwcGxpY2F0aW9uIGZyb20gaGF2aW5nIHRvIGtub3cgd2hpY2ggZW5jb2RpbmdzCiAgdGhlIGxpYnJhcnkgc3VwcG9ydHMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCB3ZSBoYWQgdGhyZWUgdW5uZWNlc3NhcnkgZmlsZXMgaW4gQ1ZTIHRoYXQgaXMKICBnZW5lcmF0ZWQgd2l0aCBsaWJ0b29saXplLCBzbyB0aGV5J3JlIG5vdyByZW1vdmVkIGFuZCBsaWJ0b29saXplIGlzIGludm9rZWQKICBhY2NvcmRpbmdseSBpbiB0aGUgYnVpbGRjb25mIHNjcmlwdC4KCi0gQXZlcnkgRmF5IGZvdW5kIG91dCB0aGF0IHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3YXkgb2YgZmlyc3QgY2hlY2tpbmcgaWYgdGhlCiAgZ2l2ZW4gbmFtZSBpcyBhIG5ldHdvcmsgaW50ZXJmYWNlIGdhdmUgYSByZWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gTGludXgsCiAgc28gbm93IHdlIG1vcmUgYXBwcm9wcmlhdGVseSBmaXJzdCBjaGVjayBpZiBpdCBpcyBhbiBJUCBudW1iZXIgYW5kIGlmIHNvCiAgd2UgZG9uJ3QgY2hlY2sgZm9yIGEgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCB0aGF0IG5hbWUuCgotIENVUkxPUFRfRlRQX1VTRV9FUFJUIGFkZGVkLiBTZXQgdGhpcyB0byBGQUxTRSB0byBkaXNhYmxlIGxpYmN1cmwncyBhdHRlbXB0cwogIHRvIHVzZSBFUFJUIGFuZCBMUFJUIGJlZm9yZSB0aGUgdHJhZGl0aW9uYWwgUE9SVCBjb21tYW5kLiBUaGUgY29tbWFuZCBsaW5lCiAgdG9vbCBzZXRzIHRoaXMgb3B0aW9uIHdpdGggJy0tZGlzYWJsZS1lcHJ0Jy4KClZlcnNpb24gNy4xMC41LXByZTIgKDYgTWF5IDIwMDMpCgpEYW5pZWwgKDYgTWF5KQotIEtldmluIERlbGFmaWVsZCByZXBvcnRlZCBhbm90aGVyIGNhc2Ugd2hlcmUgd2UgZGlkbid0IGNvcnJlY3RseSBjaGVjayBmb3IKICBFQUdBSU4gYnV0IG9ubHkgRVdPVUxEQkxPQ0ssIHdoaWNoIGNhdXNlZCBiYWRuZXNzIG9uIEhQVVguCgpEYW5pZWwgKDQgTWF5KQotIEJlbiBHcmVlYXIgbm90aWNlZCB0aGF0IHRoZSBjaGVjayBmb3IgJ3dyaXRhYmxlIGFyZ3YnIGV4aXRlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHdoZW4gcnVuIGZvciBjcm9zcy1jb21waWxpbmcsIHdoaWNoIHdhc24ndCBuaWNlLiBOb3cgaXQnbGwgZGVmYXVsdCB0bwogIG5vIGFuZCBvdXRwdXQgYSB3YXJuaW5nIGFib3V0IHRoZSBmYWN0IHRoYXQgaXQgd2FzIG5vdCBjaGVja2VkIGZvci4KCkRhbmllbCAoMiBNYXkpCi0gQWRkZWQgdGVzdCBjYXNlIDYyIGFuZCBmaXhlZCBzb21lIG1vcmUgb24gdGhlIGNvb2tpZSBzZW5kaW5nIHdpdGggYSBjdXN0b20KICBIb3N0OiBoZWFkZXIgc2V0LgoKRGFuaWVsICgxIE1heSkKLSBBbmR5IENlZGlsbmlrIGZpeGVkIGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBNYWRlIHRoZSAiU1NMIHJlYWQgZXJyb3I6IDUiIGVycm9yIG1lc3NhZ2UgbW9yZSB2ZXJib3NlLCBieSBhZGRpbmcgY29kZSB0aGF0CiAgcXVlcmllcyB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGZpbGwgaW4gdGhlIGVycm9yIGJ1ZmZlci4KCkRhbmllbCAoMzAgQXByKQotIEFkZGVkIHN5cy9zZWxlY3QuaCBpbmNsdWRlIGluIHRoZSBjdXJsL211bHRpLmggZmlsZSwgYWZ0ZXIgaGF2aW5nIGJlZW4KICByZW1pbmRlZCBhYm91dCB0aGlzIGJ5IFJpY2ggR3JheS4KCi0gSSBtYWRlIGVhY2ggdGVzdCBzZXQgaXRzIG93biBzZXJ2ZXIgcmVxdWlyZW1lbnRzLCB0aHVzIGFiYW5kb25pbmcgdGhlCiAgcHJldmlvdXMgc3lzdGVtIHdoZXJlIHRoZSB0ZXN0IG51bWJlciBpbXBsaWVkIHdoYXQgc2VydmVyKHMpIHRvIHVzZSBmb3IgYQogIHNwZWNpZmljIHRlc3QuCgotIERhdmlkIEJhbGF6aWMgbWFkZSBjdXJsIG1vcmUgUkZDMTczOC1jb21wbGlhbnQgZm9yIEZUUCBVUkxzLCBieSBmaXhpbmcgc28KICB0aGF0IGxpYmN1cmwgbm93IHVzZXMgb25lIENXRCBjb21tYW5kIGZvciBlYWNoIHBhdGggcGFydC4gQSBidW5jaCBvZiB0ZXN0CiAgY2FzZXMgd2VyZSBmaXhlZCB0byB3b3JrIGFjY29yZGluZ2x5LgoKLSBDb29raWUgZml4ZXM6CgogIEEuIFNhdmUgZG9tYWlucyBpbiBqYXJzIGxpa2UgTW96aWxsYSBkb2VzLiBJdCBtZWFucyBhbGwgZG9tYWlucyBzZXQgaW4KICAgICBTZXQtQ29va2llOiBoZWFkZXJzIGFyZSBkb3QtcHJlZml4ZWQuCiAgQi4gU2F2ZSBhbmQgdXNlIHRoZSAndGFpbG1hdGNoJyBmaWVsZCBpbiB0aGUgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgamFycwogICAgICh0aGUgc2Vjb25kIGNvbHVtbikuCiAgQy4gUmVqZWN0IGNvb2tpZXMgdXNpbmcgaWxsZWdhbCBkb21haW5zIGluIHRoZSBTZXQtQ29va2llOiBsaW5lLiBDb25jZXJucwogICAgIGJvdGggZG9tYWlucyB3aXRoIHRvbyBmZXcgZG90cyBvciBkb21haW5zIHRoYXQgYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseQogICAgIG9wZXJhdGluZyBzZXJ2ZXIgaG9zdCdzIGRvbWFpbi4KICBELiBTZXQgdGhlIHBhdGggcGFydCBieSBkZWZhdWx0IHRvIHRoZSBvbmUgdXNlZCBpbiB0aGUgcmVxdWVzdCwgaWYgbm9uZSB3YXMKICAgICBzZXQgaW4gdGhlIFNldC1Db29raWUgbGluZS4KCiAgVG8gbWFrZSBpdGVtIEMgcmVhbGx5IGdvb2QsIEkgYWxzbyBtYWRlIGxpYmN1cmwgbm90aWNlIGN1c3RvbSBIb3N0OiBoZWFkZXJzCiAgYW5kIGV4dHJhY3QgdGhlIGhvc3QgbmFtZSBzZXQgaW4gdGhlcmUgYW5kIHVzZSB0aGF0IGFzIHRoZSBob3N0IG5hbWUgZm9yIHRoZQogIHNpdGUgd2UncmUgZ2V0dGluZyB0aGUgY29va2llcyBmcm9tLiBUaGlzIGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBzaXRlJ3MKICBJUC1hZGRyZXNzLCBidXQgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGFuZCBzZW5kIGl0cyBjb29raWVzIHByb3Blcmx5IGlmCiAgeW91IHByb3ZpZGUgYSB2YWxpZCBIb3N0OiBuYW1lIGZvciB0aGUgc2l0ZS4KCkRhbmllbCAoMjkgQXByKQotIFBldGVyIEtvdmFjcyBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENVUkxJTkZPX0NPTk5FQ1RfVElNRSB3b3JrIGZpbmUKICB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKHRvbykuCgpWZXJzaW9uIDcuMTAuNS1wcmUxICgyMyBBcHIgMjAwMykKCkRhbmllbCAoMjMgQXByKQotIFVwZ3JhZGVkIHRvIGxpYnRvb2wgMS41LgoKRGFuaWVsICgyMiBBcHIpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3NldG9wdCgpIHdpbGwgYWx3YXlzICh3cm9uZ2x5KQogIHJldHVybiBDVVJMRV9PSyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgc29tZSBnemlwIGRlY29tcHJlc3Npb24gYnVncyBhbmQgZmxhd3MuCgpEYW5pZWwgKDE2IEFwcikKLSBGaXhlZCBtaW5vciB0eXBvIGluIG1hbiBwYWdlLCByZXBvcnRlZCBpbiB0aGUgRGViaWFuIGJ1ZyB0cmFja2VyLgoKRGFuaWVsICgxNSBBcHIpCi0gRml4ZWQgc29tZSBGVFAgdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBmYWlsZWQgb24gbXkgU29sYXJpcyBob3N0LCBkdWUKICB0byB0aGUgY29uZmlnLmggbm90IGJlaW5nIGluY2x1ZGVkIGJlZm9yZSB0aGUgc3lzdGVtIGhlYWRlcnMuIFdoZW4gZG9uZSB0aGF0CiAgd2F5LCBpdCBkaWQgZ2V0IGEgbWl4ZWQgc2Vuc2Ugb2YgaWYgYmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgb3Igbm90IGFuZCB0aGVuCiAgc3RhdCgpIGFuZCBmc3RhdCgpIChhcyB1c2VkIGluIHRlc3QgY2FzZSA1MDUpIGdvdCBjb25mdXNlZCBhbmQgZmFpbGVkIHRvCiAgcmV0dXJuIGEgcHJvcGVyIGZpbGUgc2l6ZS4KCi0gRm9ybXBvc3RpbmcgYSBmaWxlIHVzaW5nIGEgLmh0bWwgc3VmZml4IGlzIG5vdyBwcm9wZXJseSBzZXQgdG8gQ29udGVudC1UeXBlOiAgICB0ZXh0L2h0bWwuCgpEYW5pZWwgKDE0IEFwcikKLSBGaXhlZCB0aGUgU1NMIGVycm9yIGhhbmRsaW5nIHRvIHJldHVybiBwcm9wZXIgU1NMIGVycm9yIG1lc3NhZ2VzIGFnYWluLCB0aGV5CiAgYnJva2UgaW4gNy4xMC40LiBJIGFsc28gYXR0ZW1wdCB0byB0cmFjayBkb3duIENBIGNlcnQgcHJvYmxlbXMgYW5kIHRoZW4KICByZXR1cm4gdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZS4KCi0gVGhlIGN1cmwgdG9vbCBub3cgaW50ZXJjZXB0cyB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlIGFuZCBkaXNwbGF5cwogIGEgZmFpcmx5IGJpZyBhbmQgZXhwbGFuYXRvcnkgZXJyb3IgbWVzc2FnZS4gS2V2aW4gUm90aCBoZWxwZWQgbWUgb3V0IHdpdGgKICB0aGUgd29yZGluZy4KCkRhbmllbCAoMTEgQXByKQotIE5pYyBIaW5lcyBwcm92aWRlZCBhIHNlY29uZCBwYXRjaCBmb3IgZ3ppcCBkZWNvbXByZXNzaW9uLCBhbmQgZml4ZWQgYSBidWcKICB3aGVuIGRlZmxhdGUgb3IgZ3ppcCBjb250ZW50cyB3ZXJlIGRvd25sb2FkZWQgdXNpbmcgY2h1bmtlZCBlbmNvZGluZy4KCi0gRGFuIEZhbmRyaWNoIG1hZGUgbGliY3VybCBzdXBwb3J0IGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uIG9mIGd6aXAgY29udGVudHMKICAoYXMgYW4gYWRkaXRpb24gdG8gdGhlIHByZXZpb3VzIGRlZmxhdGUgc3VwcG9ydCkuCgotIEkgbWFkZSB0aGUgQ1dEIGNvbW1hbmQgZHVyaW5nIEZUUCBzZXNzaW9uIGNvbnNpZGVyIGFsbCAyeHkgY29kZXMgdG8gYmUgT0sKICByZXNwb25zZXMuCgpEYW5pZWwgKDEwIEFwcikKLSBWbGFkIEtydXBpbiBmaXhlZCBhIFVSTCBwYXJzaW5nIGlzc3VlLiBVUkxzIHRoYXQgd2VyZSBub3QgdXNpbmcgYSBzbGFzaAogIGFmdGVyIHRoZSBob3N0IG5hbWUsIGJ1dCBzdGlsbCBoYWQgIj8iIGFuZCBwYXJhbWV0ZXJzIGFwcGVuZGVkLCBhcyBpbgogICJodHRwOi8vaG9zdG5hbWUuY29tP2Zvb2Jhcj1tb28iLCB3ZXJlIG5vdCBwcm9wZXJseSBwYXJzZWQgYnkgbGliY3VybC4KCkRhbmllbCAoOSBBcHIpCi0gTWFkZSBDVVJMT1BUX1RJTUVDT05ESVRJT04gd29yayBmb3IgRlRQIHRyYW5zZmVycywgdXNpbmcgdGhlIHNhbWUgc3ludGF4IGFzCiAgZm9yIEhUVFAuIFRoaXMgdGhlbiBtYWRlIC16IHdvcmsgZm9yIGZ0cCB0cmFuc2ZlcnMgdG9vLiBBZGRlZCB0ZXN0IGNhc2UgMTM5CiAgYW5kIDE0MCBmb3IgdmVyaWZ5aW5nIHRoaXMuCgotIEdldHRpbmcgdGhlIGZpbGUgZGF0ZSBvZiBhbiBmdHAgZmlsZSB1c2VkIHRoZSB3cm9uZyB0aW1lIHpvbmUgd2hlbgogIGRpc3BsYXllZC4gSXQgaXMgc3VwcG9zZWRseSBhbHdheXMgR01ULiBBZGRlZCB0ZXN0IGNhc2UgMTQxIGZvciB0aGlzLgoKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciBzdXBwb3J0IE1EVE0uCgotIFRoZSBkZWZhdWx0IERFQlVHRlVOQ1RJT04sIGFzIGVuYWJsZWQgd2l0aCBDVVJMT1BUX1ZFUkJPU0Ugbm93IG91dHB1dHMKICBDVVJMSU5GT19IRUFERVJfSU4gZGF0YSBhcyB3ZWxsLiBUaGUgbW9zdCBub3RhYmxlIGVmZmVjdCBmcm9tIHRoaXMgaXMgdGhhdAogIHVzaW5nIGN1cmwgLXYsIHlvdSBnZXQgdG8gc2VlIHRoZSBpbmNvbWluZyAiaGVhZGVycyIgYXMgd2VsbC4gVGhpcyBpcwogIHBlcmhhcHMgbW9zdCB1c2VmdWwgd2hlbiBkb2luZyBmdHAuCgpEYW5pZWwgKDggQXByKQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgZmxhdyBpbiB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gY29kZSwgd2hpY2ggbWlzc2VkCiAgdGhlIGZpcnN0IGxldHRlciBpZiBubyBzcGFjZSBmb2xsb3dlZCB0aGUgY29sb24uCgotIE1hZ251cyBOaWxzc29uIHBvaW50ZWQgb3V0IHRoYXQgc2hhcmUuYyB3YXMgbWlzc2luZyBpbiB0aGUgTVNWQyBwcm9qZWN0CiAgZmlsZS4KCkRhbmllbCAoNiBBcHIpCi0gUnlhbiBXZWF2ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDQSBjZXJ0IGJ1bmRsZSBub3QgZ2V0IGluc3RhbGxlZAogIGFueW1vcmUgd2hlbiAnY29uZmlndXJlIC0td2l0aG91dC1zc2wnIGhhcyBiZWVuIHVzZWQuCgpEYW5pZWwgKDQgQXByKQotIE1hcnRpam4gQnJvZW5sYW5kIGZvdW5kIGFub3RoZXIgY2FzZXMgd2hlcmUgYSBzZXJ2ZXIgYXBwbGljYXRpb24gZGlkbid0CiAgbGlrZSB0aGUgYm91bmRhcnkgc3RyaW5nIHVzZWQgYnkgY3VybCB3aGVuIGZvaW5nIGEgbXVsdGktcGFydC9mb3JtcG9zdC4gV2UKICBtb2RpZmllZCB0aGUgYm91bmRhcnkgc3RyaW5nIHRvIGxvb2sgbGlrZSB0aGUgb25lIElFIHVzZXMsIGFzIHRoaXMgaXMKICBwcm9iYWJseSBnb25uYSBtYWtlIGN1cmwgd29yayB3aXRoIG1vcmUgYXBwbGljYXRpb25zLgoKRGFuaWVsICgzIEFwcikKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgYSBidW5jaCBvZiB0ZXN0cyBmYWlscyBvbiBjeWd3aW4uIE9uZSBzZXQgZmFpbHMKICB3aGVuIHVzaW5nIHBlcmwgNS44IChhbmQgdGhleSBydW4gZmluZSB3aXRoIHBlcmwgNS42KSwgYW5kIGFub3RoZXIgc2V0CiAgZmFpbGVkIGJlY2F1c2Ugb2YgYW4gYXJ0aWZhY3QgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgSQogIGNvcnJlY3RlZC4gSXQgdHVybmVkIG91dCB0aGUgRlRQIHNlcnZlciBjb2RlIHdhcyBzdGlsbCBoYXZpbmcgYSBmaWxlIG9wZW5lZAogIHdoaWxlIHRoZSBtYWluIHRlc3Qgc2NyaXB0IHJlbW92ZWQgaXQgYW5kIGludm9rZWQgdGhlIEhUVFAgc2VydmVyIHRoYXQKICBhdHRlbXB0ZWQgdG8gY3JlYXRlIHRoZSBzYW1lIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgRlRQIHNlcnZlciBrZXB0IG9wZW4uCiAgVGhpcyBvcGVyYXRpb24gd29ya3MgZmluZSBvbiB1bml4LCBidXQgbm90IG9uIGN5Z3dpbi4KClZlcnNpb24gNy4xMC40ICgyIEFwciAyMDAzKQoKRGFuaWVsICgxIEFwcikKLSBBZGRlZCB0ZXN0IGNhc2UgNTA1IHRvIGV4ZXJjaXNlIEZUUCB1cGxvYWQgd2l0aCByZW5hbWUgZG9uZSB3aXRoIGxpYmN1cmwsCiAgYW5kIGZvciB0aGF0IEkgaGFkIHRvIGV4dGVuZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gZGVhbCB3aXRoIHRoZQogIFJORlIgYW5kIFJOVE8gY29tbWFuZHMuCgpEYW5pZWwgKDMxIE1hcikKLSBFdmVuIG1vcmUgU1NMIGNvbmZpZyBjaGVjayBtb2RpZmljYXRpb25zIGFmdGVyIFJpY2hhcmQncyB0ZXN0aW5nLgoKVmVyc2lvbiA3LjEwLjQtcHJlNiAoMzEgTWFyIDIwMDMpCgpEYW5pZWwgKDMxIE1hcikKLSBNb3JlIGZpeGVzIGZvciB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGUgY2hlY2tzIHdoZW4gU1NMIGNvbmZpZ3MgYXJlIGNoYW5nZWQKICBiZXR3ZWVuIGNvbm5lY3Rpb25zLiBCYXNlZCBvbiB0ZXN0cyBhbmQgdGFsa3Mgd2l0aCBSaWNoYXJkIEJyYW1hbnRlLgoKLSBHdWlsbGF1bWUgQ290dGVuY2VhdSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgQ1VSTE9QVF9VTlJFU1RSSUNURURfQVVUSC4KICBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgcHJldmVudCBsaWJjdXJsIGZyb20gbGltaXRpbmcgdG8gd2hpY2ggaG9zdCBpdCBzZW5kcwogIHVzZXIrcGFzc3dvcmQgdG8gd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLiBCeSBkZWZhdWx0LCBsaWJjdXJsIG9ubHkgc2VuZHMKICBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgaG9zdCB1c2VkIGluIHRoZSBmaXJzdCBVUkwsIGJ1dCB3aXRoIHRoaXMKICBvcHRpb24gc2V0IGl0IHdpbGwgc2VuZCB0aGUgYXV0aCBpbmZvIHRvIGFsbCBob3N0cyBpdCBmb2xsb3dzIGxvY2F0aW9uCiAgaGVhZGVycyB0by4gVGhlIG5ldyB0b29sIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoaXMgaXMgbmFtZWQKICAiLS1sb2NhdGlvbi10cnVzdGVkIi4KCi0gRnJhbmtpZSBGb25nIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgaWYgeW91IHJlLXVzZWQgYW4gZWFzeSBoYW5kbGUKICB3aXRoIGEgcHJveHksIGFuZCB5b3UgZmlyc3QgbWFkZSBhIGh0dHBzOi8vIGNvbm5jdGlvbiB0byBhIGhvc3QgYW5kIHRoZW4KICBzd2l0Y2hlZCB0byBhIGh0dHA6Ly8gb25lIHRvIHRoZSBzYW1lIGhvc3QuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHJlLXVzZQogIHRoZSBzYW1lIGNvbm5lY3Rpb24gZm9yIGl0IGFuZCBmYWlsIHRvIGdldCB0aGUgc2Vjb25kIFVSTCBwcm9wZXJseQoKRGFuaWVsICgyOSBNYXIpCi0gRGFuIFNoZWFyZXIncyBmaXggdGhhdCBtYWtlcyBjdXJsIGNvbXBsYWluIGlmIGludm9rZWQgd2l0aCBub3RoaW5nIGJ1dCAiY3VybAogIC1PIiB3YXMgYXBwbGllZC4KCkRhbmllbCAoMjYgTWFyKQotIEJyeWFuIEtlbXAgd2FzIGZyaWVuZGx5IGVub3VnaCB0byBsZW5kIG1lIGFuIGFjY291bnQgb24gaGlzIFJlZGhhdCA5IGJveCBhbmQKICBJIGNvdWxkIGZpeCB0aGUgY29uZmlndXJlIHByb2JsZW1zIG9uIHJlZGhhdCA4LjEgYW5kIDkgaW4gbm8gdGltZSB0aGFua3MgdG8KICB0aGlzLiBUaGFua3MgYSBidW5jaCBCcnlhbiEKCkRhbmllbCAoMjUgTWFyKQotIFJlbmFtZWQgY29uZmlndXJlLmluIHRvIGNvbmZpZ3VyZS5hYwoKVmVyc2lvbiA3LjEwLjQtcHJlNSAoMjUgTWFyIDIwMDMpCgpEYW5pZWwgKDI1IE1hcikKLSBSaWNoYXJkIEJyYW1hbnRlIHByb3ZpZGVkIGEgZml4IGZvciBhIGhhbmRsZSByZS11c2UgcHJvYmxlbSBzZWVuIHdoZW4geW91CiAgY2hhbmdlIG9wdGlvbnMgb24gYW4gU1NMLWVuYWJsZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcXVlc3RzLiBQcmV2aW91c2x5LAogIGNoYW5naW5nIHBlZXIgdmVyaWZpY2F0aW9uIG9yIGhvc3QgdmVyaWZpY2F0aW9uIGFuZCBzaW1pbGFyIHRoaW5ncyB3YXMgbm90CiAgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gYSBjb25uZWN0aW9uIHdlcmUgY2hlY2tlZCBmb3IgcmUtdXNlIGFuZCB0aHVzCiAgZW5hYmxpbmcgc3RyaWN0ZXIgY2hlY2sgYmV0d2VlbiByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiBtYWRlIG5vCiAgZGlmZmVyZW5jZSBhbmQgdGhlIGNvbm5lY3Rpb24gd291bGQgdGh1cyBiZSB1c2VkIGVycm9uZW91c2x5LgoKRGFuaWVsICgyNCBNYXIpCi0gR/Z0eiBCYWJpbi1FYmVsbCBwb2ludGVkIG91dCB0aGF0IHRoZSBjYS1idW5kbGUuY3J0IGZpbGUgY29udGFpbmVkIGEKICBjZXJ0aWZpY2F0ZSBmcm9tIFRydXN0Y2VudGVyIHRoYXQgd2FzIGEgZGVtbyBjZXJ0aWZpY2F0ZSBvbmx5IHRoYXQgd2FzIG5ldmVyCiAgaW5kZW5kZWQgdG8gYmUgcGFydCBvZiBhIENBIGJ1bmRsZS4KCkRhbmllbCAoMjEgTWFyKQotIExpZmUgaXMgYSBteXN0ZXJ5LiBXaXRoaW4gYSB0aW1lIHBlcmlvZCBvZiAxNyBob3VycywgVGltIFBvcGUgYW5kIE1pY2hhZWwKICBDaHVyY2hpbGwgZmlsZWQgb25lIGJ1ZyByZXBvcnQgZWFjaCwgYm90aCBpZGVudGlmeWluZyBwcm9ibGVtcyB3aXRoIGEgc2Vjb25kCiAgdHJhbnNmZXIgd2hlbiBkb2luZyBwZXJzaXN0YW50IHRyYW5zZmVycyByZS11c2luZyBhIGNvbm5lY3Rpb24uIFRpbSdzIG9uZSBpcwogICM3MDY2MjQsIGxhYmVsZWQgIk11bHRpcGxlIHVwbG9hZHMgcGVyIGhhbmRsZSBmYWlsIiBhbmQgTWljaGFlbCdzICM3MDcwMDMKICAiRG9lcyBub3Qgc2VuZCBBdXRob3JpemF0aW9uOiBoZWFkZXIgd2hlbiByZXVzaW5nIGNvbm5lY3Rpb24iLiBJIGNvdWxkIHRyYWNrCiAgYm90aCBkb3duIHRvIHRoZSBzYW1lIHBpZWNlIG9mIGxvZ2ljIGFuZCBpdCB0dXJuZWQgb3V0IGxpYmN1cmwgd2FzIG5vdCB1c2luZwogIG5ldyBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIHJlLXVzaW5nIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24uIFRoaXMgY29uY2VybmVkCiAgYm90aCB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIGFuZCBpbnZvbHZlZCBleGFjdGx5IHRob3NlIHBpZWNlcyB0aGVzZSB0d28KICByZXBvcnRzIGlkZW50aWZpZWQuIFRoaXMgY29kZSBoYXMgYmVlbiB0aGlzIGZhdWx0eSBzaW5jZSB0aGUgZGF5IEkKICBpbnRyb2R1Y2VkIHBlcnNpc3RhbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwsIG1vcmUgdGhhbiAyIHllYXJzIGFnby4KCkRhbmllbCAoMjAgTWFyIDIwMDMpCi0gRml2ZSB5ZWFyIGFubml2ZXJzYXJ5LiBUb2RheSBmaXZlIHllYXJzIGFnbywgdGhlIGZpcnN0IGV2ZXIgY3VybCByZWxlYXNlIHNhdwogIHRoZSBsaWdodCBvZiBkYXkuCgpEYW5pZWwgKDE3IE1hcikKLSBBbmR5IENlZGlsbmlrIGNvcnJlY3RlZCBmbGF3cyBpbiBzb21lIGxpYmN1cmwgZXhhbXBsZS11c2FnZSBzb3VyY2VzLgoKRGFuaWVsICgxNiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgcmVwb3J0ZWQgdGhhdCB0aGUgZml4IGZyb20gTWFyY2ggMm5kIHdhcyBpbmNvbXBsZXRlLgoKLSBBZGRlZCBjb2RlIHRvIHRoZSBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yIHNlbGVjdCgpIGFyZ3VtZW50IHR5cGVzLiBJJ3ZlCiAgbm90IG1hZGUgYW55IGNvZGUgdXNlIHRoZSByZXN1bHRzIGp1c3QgeWV0IHRob3VnaC4KCkRhbmllbCAoMTUgTWFyKQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIHR3byBwYXRjaGVzIHRvIGJ1aWxkIGJldHRlciBvbiBXaW5kb3dzLgoKLSBBZGp1c3RlZCB0aGUgdGVzdCBzdWl0ZSBjb2RlIHRvIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyKHMpIHJlcXVpcmVkCiAgZm9yIGEgc3BlY2lmaWMgdGVzdCBpcyBwcm9wZXJseSBzdGFydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGlzIGF0dGVtcHRlZC4KICBNYW55IHRlc3RzIG5vdyBydW4gYSBsb3QgZmFzdGVyIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgxNCBNYXIpCi0gQW5vdGhlciBjb25maWd1cmUuaW4gYWRqdXN0bWVudCBtYWRlIHRoZSBjb25maWd1cmUgZGV0ZWN0IGZ1bmN0aW9ucyBwcm9wZXJseQogIG9uIEhQVVggbm93LgoKRGFuaWVsICgxMyBNYXIpCi0gUGhpbGlwcGUgUmFvdWx0IGZpeGVkIHByZTQtY29tcGlsZSBxdWlya3MgZm9yIEZyZWVCU0QuCgpWZXJzaW9uIDcuMTAuNC1wcmU0ICgxMyBNYXIgMjAwMykKCkRhbmllbCAoMTMgTWFyKQotIEFkZGVkIGEgYmFja3VwLWNoZWNrIGZvciBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZm91bmQgYnkgQUNfQ0hFQ0tfRlVOQ1MoKQogIGFzIEkgYmVsaWV2ZSBzb21lIGNoZWNrcyBvbiBIUFVYIG5lZWQgdGhpcy4gQXQgbGVhc3Qgc29tZSBvZiB0aGUgaW5mbyBnaXZlbgogIHRvIHVzIGJ5IFJpY2sgSm9uZXMgc2VlbWVkIHRvIGluZGljYXRlIHRoaXMuCgpEYW5pZWwgKDEyIE1hcikKLSBUaG9tYXMgVG9uaW5vIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIHRoZSBjdXJsIHRvb2wgdG8gZG8gUFVUIG9wZXJhdGlvbnMKICBhcyBpbiAnY3VybCB3d3cuZm9vLmNvbS9kaXIvIC1UIGZpbGUnIGFuZCB0aGUgZmlsZSBuYW1lIGluY2x1ZGVkIGZvciBleGFtcGxlCiAgc3BhY2Ugb3Igb3RoZXIgY2hhcmFjdGVycyB0aGF0IGRvbid0IGJlbG9uZyBpbiBVUkxzLCBjdXJsIGRpZCBub3QgcHJvcGVybHkKICBVUkwgZW5jb2RlIHRoZW0gYmVmb3JlIHVzaW5nIHRoZW0gaW4gdGhlIFVSTC4KCi0gQWRkZWQgYW4gb3B0aW9uIHRvIGNvbmZpZ3VyZSBjYWxsZWQgLS1lbmFibGUtbGliZ2NjIHRoYXQgc2ltcGx5IGFkZHMgLWxnY2MKICB0byB0aGUgTElCUyB2YXJpYWJsZSwgYXMgdGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtLgoKLSBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUuaW4gZmlsZSwgc28gdGhhdCB0aGUgaGVhZGVycyBhcmUgbm93IGNoZWNrZWQgaW4gYW4KICBvcmRlciBvZiAidmlhbGl0eSIuIFdlIG11c3QgYWxzbyBtYWtlIHN1cmUgdG8gdXNlIHRoZSAiZGVmYXVsdCBoZWFkZXJzIgogIHBhcmFtZXRlciB0byBBQ19DSEVDS19IRUFERVJTKCkgc28gdGhhdCBoZWFkZXJzIGFyZSBjaGVja2VkIHdpdGggdGhlIHByb3BlcgogIHByZXJlcXVpc2l0ZXMgaW5jbHVkZWQgKGkuZSBhbGwgdGhlIG1ham9yIGFuZCBnZW5lcmFsbHkgaW1wb3J0YW50IGhlYWRlcgogIGZpbGVzIGFyZSBpbmNsdWRlZCB0aGVyZSBieSBkZWZhdWx0KS4gVGhpcyBtaWdodCBiZSB3aGF0IHdlIG5lZWQgZm9yIHZhcmlvdXMKICBTdW4sIEhQLCBBSVggYW5kIFRydTY0IHN5c3RlbXMgdG8gYmVoYXZlIGdvb2QgYWdhaW4gb24gdGhlIGhlYWRlciBjaGVjawogIGZyb250LgoKLSBSaWNrIEpvbmVzIHBvaW50ZWQgb3V0IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIG9uIEhQLVVYIHRoYXQgSSBhZGRyZXNzZWQuCgotIEkgbWFkZSB0aGUgY29uZmlndXJlIC0taGVscCBvdXRwdXQgbmljZXIgYnkgdXNpbmcgQUNfSEVMUF9TVFJJTkcoKSBhIGxvdAogIG1vcmUuCgpEYW5pZWwgKDExIE1hcikKLSBDaHJpc3RvcGhlIERlbW9yeSBmaXhlZCB0aGUgc29ja2V0IHNlbmRpbmcgY29kZSB0byB3b3JrIGJldHRlciBvbiBIUC1VWAogIHdoZW4gc2VuZGluZyBkYXRhIHRvIGEgc29ja2V0IHRoYXQgd291bGQgYmxvY2suIEl0IHRoZW4gcmV0dXJucyBFQUdBSU4sIG5vdAogIEVXT1VMREJMT0NLLgoKLSBSaWNoYXJkIEdvcnRvbiBpbXByb3ZlZCB0aGUgc2VlZGluZyBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGEgZ29vZAogIGFuZCByZWxpYWJsZSByYW5kb20gc291cmNlLgoKLSBSaWNoYXJkIEdvcnRvbiBmaXhlZCBhIGZldyB3YXJuaW5ncyB0aGF0IHBvcHBlZCB1cCB3aGVuIHlvdSBidWlsdCBjdXJsCiAgdXNpbmcgdGhlIFN1biBjb21waWxlciBvbiBhIDY0Yml0IFNQQVJDIHBsYXRmb3JtLgoKLSBNYXJ0aW4gQy4gTWFydGluIGZpeGVkIGEgY2FzZSB3aGVyZSBhIGNvbm5lY3QgZmFpbHVyZSB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgZGlkbid0IHByb2R1Y2UgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcuCgpEYW5pZWwgKDEwIE1hcikKLSBSZXZlcnRlZCBsdG1haW4uc2ggYmFjayB0byBsaWJ0b29sIDEuNC4yIHN0YXR1cyBhZ2FpbiwgYXMgdGhlIDEuNC4zIHZlcnNpb24KICBicm9rZSB0aGUgYnVpbGQgb24gbnVtZXJvdXMgcGxhdGZvcm1zLiBJdCBzZWVtcyB0aGF0IGxpYnRvb2wgMS40LjMgcHV0cyBzb21lCiAgcmVxdWlyZW1lbnRzIG9uIHdoYXQgdmVyc2lvbnMgb2YgdGhlIG90aGVyIHRvb2xzIChhdXRvY29uZiArIGF1dG9tYWtlKSB0aGF0CiAgSSBhbSBub3QgZmFtaWxpYXIgd2l0aCBhbmQgdGh1cyBJIGNvdWxkbid0IGZ1bGZpbGwgYXQgdGhpcyBwb2ludC4KCiAgWWVzLCB0aGlzIGlzIG1vcmUgdGhhbiBtaWxkbHkgZnJ1c3RyYXRpbmcuCgpEYW5pZWwgKDcgTWFyKQotIFJ1biBsaWJ0b29saXplIHZlcnNpb24gMS40LjMuCgpWZXJzaW9uIDcuMTAuNC1wcmUzICg0IE1hciAyMDAzKQoKRGFuaWVsICgzIE1hcikKLSBBZGRlZCBzaGFyZS5vYmogdG8gdGhlIFZDNiBhbmQgQm9ybGFuZCBsaWJjdXJsIG1ha2VmaWxlcy4KCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZvdW5kIGFuZCBpbnZlc3RpZ2F0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBvbiBBSVgsCiAgcHJlc3VtYWJseSBvbmx5IG9uIDQuMyBvciBsYXRlci4gZ2V0aG9zdGJ5bmFtZV9yKCkgaXMgbm90IHJldHVybmluZyBkYXRhCiAgdGhhdCBpcyBwb3NzaWJsZSB0byAia2VlcCIgYW5kIGNhY2hlIHRoZSB3YXkgbGliY3VybCBkb2VzLiBCdXQgaW5zdGVhZCB0aGVzZQogIHZlcnNpb25zIG9mIEFJWCB1c2VzIGEgZ2V0aG9zdGJ5bmFtZSgpIHRoYXQgd29ya3MgdGhyZWFkLXNhZmVseSB3ZSBjYW4KICBpbnN0ZWFkIHVzZSB0aGUgb3JkaW5hcnkgZ2V0aG9zdGJ5bmFtZSgpIGFuZCBvdXIgcGFja19ob3N0ZW50KCkgYXBwcm9hY2ggdG8KICBhY2hpZXZlIHdoYXQgd2Ugd2FudC4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGF0dGVtcHRzIHRvIGRldGVjdCBBSVggNC4zIG9yCiAgbGF0ZXIgdG8gYWRqdXN0IGZvciB0aGlzLgoKRGFuaWVsICgyIE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSBmb3VuZCBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjEwLjMgd2hlbiB5b3UgZmlyc3QgZGlkIGEKICBQT1NUIGFuZCB0aGVuIGJhY2sgdG8gYSBHRVQgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUuCgpEYW5pZWwgKDI4IEZlYikKLSBSZW1vdmVkIHRoZSBzdHJlcXVhbCBhbmQgc3RybmVxdWFsIGRlZmluZXMgZnJvbSBjdXJsL2N1cmwuaCBoZWFkZXIuIFRoZXkKICB3ZXJlIG5ldmVyIG1lYW50IGZvciB0aGUgcHVibGljIGhlYWRlciBhbnl3YXkuIFBoaWxpcHBlIFJhb3VsdCBicm91Z2h0IGl0CiAgdXAuCgotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBSSVNDIE9TIGJ1aWxkLgoKRGFuaWVsICgyNyBGZWIpCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoZSB2ZXJ5IG1pc2xlYWRpbmcgY3VybF9tdWx0aV9pbmZvX3JlYWQgbWFuIHBhZ2UsIGFuZAogIEkgdXBkYXRlZCBpdCB0byBiZWNvbWUgbW9yZSBhY2N1cmF0ZS4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkaW5nIHRoYXQgdHVybmVkIG91dCB0bwogIGJlIGhpcyBGVFAgc2VydmVyIHJldHVybmluZyBzaXplIHplcm8gKDAgYnl0ZXMpIHdoZW4gU0laRSB3YXMgdXNlZCBvbiBhIGZpbGUKICB3aGlsZSBiZWluZyBpbiBCSU5BUlkgbW9kZS4gV2Ugbm93IG1ha2UgYSBzZWNvbmQgY2hlY2sgZm9yIHRoZSBhY3R1YWwgc2l6ZQogIGJ5IHNjYW5uaW5nIHRoZSBSRVRSIHJlcGx5IGFueXdheSwgZXZlbiBpZiB0aGUgU0laRSBjb21tYW5kIHJldHVybmVkIDAuCgpEYW5pZWwgKDI2IEZlYikKLSBLeWxlIFNhbGxlZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgaGUgd291bGQgZG8gYSB0cmFuc2ZlciB0aGF0IGRpZG4ndCB1cGRhdGUKICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgcHJvcGVybHkuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBjYXNlIHdoZXJlIGxpYmN1cmwgd291bGQKICBsb29wIGEgbGl0dGxlIHRvbyBlYWdlcmx5IGluIHRoZSB0cmFuZmVyIGxvb3AsIHdoaWNoIGlzbid0IHJlYWxseSBnb29kIGZvcgogIHRoZSBBUElzLCBlc3BlY2lhbGx5IG5vdCB0aGUgbXVsdGkgQVBJLgoKVmVyc2lvbiA3LjEwLjQtcHJlMiAoMjQgRmViIDIwMDMpCgpEYW5pZWwgKDI0IEZlYikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgb3V0IHRoYXQgc2V0dGluZyBDVVJMT1BUX01BWENPTk5FQ1RTIHRvIGEgdmFsdWUgaGlnaGVyCiAgdGhhbiA1IGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQuCgotIEkgYmVsaWV2ZSBJIGZpeGVkIHRoZSAnRXhwZWN0OiAxMDAtY29udGludWUnIGJlaGF2aW9yIHRoYXQgaGFzIGJlZW4gYnJva2VuCiAgZm9yIGEgd2hpbGUgKEkgdGhpbmsgc2luY2UgbXkgY2hhbmdlIGRhdGVkIERlYyAxMCAyMDAyKS4gV2hlbiB0aGlzIGhlYWRlciBpcwogIHVzZWQsIGxpYmN1cmwgc2hvdWxkIHdhaXQgZm9yIGEgSFRUUCAxMDAgKG9yIHRpbWVvdXQpIGJlZm9yZSBzZW5kaW5nIHRoZQogIHBvc3QvcHV0IGRhdGEuCgpEYW5pZWwgKDE0IEZlYikKLSBNYXR0aGV3IENsYXJrZSBwcm92aWRlZCBzb21lIGluZm8gd2hhdCB0byBtb2RpZnkgdG8gbWFrZSBjdXJsIGJ1aWxkCiAgZmxhd2xlc3NseSBvbiBBSVggMy4yLjUuCgotIE1hcnRpbiBDLiBNYXJ0aW4gZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4KICBydW5uaW5nIG9uIFdpbmRvd3MgYW5kIHRyeWluZyB0byBjb25uZWN0IHRvIGEgcG9ydCB3aXRob3V0IGEgbGlzdGVuZXIuCgpEYW5pZWwgKDEzIEZlYikKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgQ3VybF9iYXNlNjRfZW5jb2RlKCkgdG8gZGVhbCB3aXRoIHplcm9lcyBpbiB0aGUKICBkYXRhIHRvIGVuY29kZS4KCkRhbmllbCAoNCBGZWIpCi0gSmVhbi1QaGlsaXBwZSBhZGRlZCB0aGUgZmlyc3QgY29kZSB0aGF0IGVuYWJsZXMgdGhlICdzaGFyZScgc3lzdGVtLiBUaGlzCiAgc2hvdWxkIG5vdyBlbmFibGUgc2hhcmluZyBvZiBETlMgZGF0YSBiZXR3ZWVuIHR3byBjdXJsIGVhc3kgaGFuZGxlcy4KCi0gSW5jb3Jwb3JhdGVkIE5pY28gQmFnZ3VzJyBmaXhlcyB0byBhZ2FpbiBjb21waWxlIGZsYXdsZXNzbHkgb24gVk1TLgoKLSBKYW1lcyBCdXJzYSBjb3JyZWN0ZWQgYSBiYWQgY29tbWVudCBpbiB0aGUgcHVibGljIGluY2x1ZGUgZmlsZSBjdXJsL211bHRpLmgKCi0gUGV0ZXIgRm9ycmV0IHJlcG9ydGVkIG9uZSBvZiB0aG9zZSBlcnJvcjowMDAwMDAwMCBjYXNlcyBpbiBsaWJjdXJsIGFnYWluCiAgd2hlbiBjb25uZWN0aW5nIHRvIGEgSFRUUFMgc2l0ZSwgYW5kIHRoaXMgdGltZSBJIGRpZCBkaXNjb3ZlciBzb21lIG9kZGl0aWVzCiAgaW4gaG93IGN1cmwgcmVwb3J0cyBTU0wgZXJyb3JzIGJhY2suIEl0IGNvdWxkIG1pc3Mgc2hvd2luZyB0aGUgYWN0dWFsIGVycm9yLgoKVmVyc2lvbiA3LjEwLjQtcHJlMSAoMyBGZWIgMjAwMykKCkRhbmllbCAoMyBGZWIpCi0gUmVtb3ZlZCB0aGluZ3MgaW4gdGhlIGRvY3Mgc2F5aW5nIGNhcGF0aCBkb2Vzbid0IHdvcmsgb24gV2luZG93cywgYXMgSnVsaWFuCiAgTm9ibGUgdG9sZCB1cyBpdCB3b3JrcyBmaW5lLgoKRGFuaWVsICgzMSBKYW4pCi0gS2V2aW4gUm90aCBmaXhlZCB0aGUgemxpYiBidWlsZCBzdHVmZiBpbiB0aGUgTWluZ3czMiBtYWtlZmlsZS4KCkRhbmllbCAoMzAgSmFuKQotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgY3VybCBvbiBXaW5kb3dzIGFsd2F5cyBjaGVja2VkIGZvciB0aGUgQ0EgY2VydAogIGJ1bmRsZSB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHRoZSBwYXRoIHNjYW4sIGV2ZW4gdGhvdWdoCiAgLWsvLS1pbnNlY3VyZSB3YXMgdXNlZC4KCi0gSGFtaXNoIE1hY2tlbnppZSBwb2ludGVkIG91dCB0aGF0IGN1cmwgb25seSBkaWQgc3RyaWN0IGhvc3QgbmFtZSB2ZXJpZnlpbmcKICBpZiBjYXBhdGggb3IgY2FpbmZvIHdhcyB1c2VkLiBOb3cgaXQnbGwgYWx3YXlzIGRvIGl0IHVubGVzcyAtayAvIC0taW5zZWN1cmUKICBpcyB1c2VkIQoKLSBQYXZlbCBDZW5layBwb2ludGVkIG91dCB0aGF0IHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiB3YXMgZG9uZSB3cm9uZ2x5CiAgYXMgdGhlIGZ1bGwgc3RyaW5nIHdhcyBub3QgZmV0Y2hlZC4gQWRkZWQgdGVzdCBjYXNlIDU3IHRvIHZlcmlmeSB0aGF0IGN1cmwKICBkb2VzIGl0IHJpZ2h0IG5vdy4KCkRhbmllbCAoMjkgSmFuKQotIEphbWllIFdpbGtpbnNvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGN1cmwgYXR0ZW1wdCB0byBjbGVhciBvdXQKICAic2Vuc2l0aXZlIiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBkb24ndCBhcHBlYXIgaW4gcHMgb3V0cHV0cwogIChvbmx5IG9uIHBsYXRmb3JtcyB0aGF0IGFsbG93IHdyaXRpbmcgdG8gYXJndltdKS4KCi0gSm9obiBNY0dvd2FuIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIGNvdWxkIGJlIGNhbGxlZCB3aXRoIGJhZAogIGFyZ3VtZW50cyBhbmQgdGh1cyBjYXVzZSB0aGUgLS10cmFjZSBvdXRwdXRzIHRvIGdvIHdyb25nLgoKLSBSZW1vdmVkIGFsbCB0aGUgZW1hY3MgbG9jYWwgdmFyaWFibGVzIGZyb20gYWxsIGZpbGVzLiBNYXRzIExpZGVsbCBwcm92aWRlZAogIHRoZSBuZXcgc2FtcGxlLmVtYWNzIGZpbGUgKGZvciBhIHNhbXBsZSBvZiB3aGF0IHRvIGluY2x1ZGUgaW4geW91ciAuZW1hY3MpCiAgYW5kIHRoZSBjdXJsLXN0eWxlLmVsIHRoYXQgc2V0cyBhIGJldHRlciBjLXN0eWxlIGZvciBlZGl0aW5nIGN1cmwgc291cmNlcy4KCi0gRGF2ZSBIYWxiYWtrZW4gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkcyB0aGF0IGNvdWxkIGFjY2lkZW50bHkKICByZXR1cm4gQ1VSTEVfUEFSVElBTF9GSUxFIHdoZW4gY3VybF9lYXN5X3BlcmZvcm0oKSB3YXMgY2FsbGVkIHdpdGggTk9CT0RZCiAgc2V0IFRSVUUuCgpEYW5pZWwgKDI3IEphbikKLSBUaGUgZm9wZW4uYyBleGFtcGxlIHdhcyBmbGF3ZWQgYXMgTmljayBIdW1mcmV5IG5vdGljZWQsIGFuZCBJIGZpeGVkIGl0IHRvCiAgd29yayBhZ2Fpbi4KCkRhbmllbCAoMjQgSmFuKQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrICh0aGUgY29udGVudC10eXBlIHN0cmluZykKICB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuCgpEYW5pZWwgKDIyIEphbiAyMDAzKQotIElhbiBXaWxrZXMgYW5kIExlZ29mZiBWaW5jZW50IGJvdGggaW5kZXBlbmRlbnRseSBwcm92aWRlZCBmaXhlcyBmb3IgbWFraW5nCiAgY3VybC9tdWx0aS5oIHdvcmsgcHJvcGVybHkgd2hlbiBjb21waWxlZCB3aXRoIGEgQysrIGNvbXBpbGVyLgoKRGFuaWVsICgyMCBKYW4gMjAwMykKLSBGaXhlZCAnYnVpbGRjb25mJyB0byBjaGVjayB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcmVxdWlyZWQgdG9vbHMgYmVmb3JlCiAgdGhleSdyZSBhY3R1YWxseSB1c2VkLgoKLSBXcm90ZSAndGVzdGN1cmwuc2gnLCBhIHNjcmlwdCB0YXJnZXRlZCBmb3IgYXV0b21hdGljIGFuZCBkaXN0cmlidXRlZCBjdXJsCiAgdGVzdHMgb24gdmFyaW91cyBwbGF0Zm9ybXMuCgotIERhdmlkIFRoaWVsIHBvaW50ZWQgb3V0IHRoYXQgdGhlIC5uZXRyYyBmaWxlIHdhcyBub3QgYmVpbmcgZGVhbHQgd2l0aAogIHByb3Blcmx5IGFueW1vcmUuIEkgYnJva2UgdGhpcyBpbiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nICJmaXgiLgoKLSBNYXJrdXMgRi5YLkouIE9iZXJodW1lciBwYXRjaGVkIGxpYmN1cmwgdG8gYWxsb2NhdGUgdGhlIHNjcmF0Y2ggYnVmZmVyIG9ubHkKICBvbiBkZW1hbmQgYW5kIHRodXMgd2Ugc2F2ZSAzMktCIGluIGVhY2ggY3VybCBoYW5kbGUgdGhhdCBkb24ndCB1c2UgdGhhdAogIGJ1ZmZlci4gVGhpcyBuZWVkIGFwcGVhcmVkIHdoZW4gc29tZSBwZW9wbGUgc3RhcnRlZCB1c2luZyB0aG91c2FuZHMgb2YKICBzaW11bHRhbmVvdXMgY3VybCBoYW5kbGVzLi4uIDotKQoKRGFuaWVsICgxNiBKYW4gMjAwMykKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIGN1cmwtY29uZmlnIC0tY2ZsYWdzIHdoZW4gdGhlIGluY2x1ZGVkaXIgd2FzIG5vdAogIC91c3IvaW5jbHVkZS4KCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBDVVJMSU5GT19QUklWQVRFIHRvIHByb3Blcmx5IHJldHVybiBOVUxMIGlmIGl0IHdhcwogIHNldCB0byBOVUxMIQoKVmVyc2lvbiA3LjEwLjMgKDE0IEphbiAyMDAzKQoKRGFuaWVsICgxMCBKYW4gMjAwMykKLSBTdGV2ZSBPbGlwaGFudCBwb2ludGVkIG91dCB0aGF0IHRlc3QgY2FzZSAxMDUgZGlkIG5vdCB3b3JrIGFueW1vcmUgYW5kIHRoaXMKICB3YXMgZHVlIHRvIGEgbWlzc2luZyBmaXggZm9yIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcuCgpWZXJzaW9uIDcuMTAuMy1wcmU2ICgxMCBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBCcnlhbiBLZW1wIHBvaW50ZWQgb3V0IHRoYXQgY3VybCAtdSBjb3VsZCBub3QgcHJvdmlkZSBhIGJsYW5rIHBhc3N3b3JkCiAgd2l0aG91dCBwcm9tcHRpbmcgdGhlIHVzZXIuIEl0IGNhbiBub3cuIC11IHVzZXJuYW1lOiBtYWtlcyB0aGUgcGFzc3dvcmQKICBlbXB0eSwgd2hpbGUgLXUgdXNlcm5hbWUgbWFrZXMgY3VybCBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQuCgotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBhIHJlbWFpbmluZyBjb25uZWN0IHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSBvbgogIGlwdjQgc3lzdGVtcyAoTGludXggb25seT8pLCB0aGF0IEkgZml4ZWQgYW5kIEtqZXRpbCB2ZXJpZmllZCB0aGF0IGl0IGZpeGVkCiAgaGlzIHByb2JsZW1zLgoKLSBtZW1hbmFseXplLnBsIG5vdyByZWFkcyBhIGZpbGUgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBubyBsb25nZXIKICB0YWtlcyB0aGUgZGF0YSBvbiBzdGRpbiBhcyBiZWZvcmUuCgpWZXJzaW9uIDcuMTAuMy1wcmU1ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEZpeGVkIHRlc3RzL21lbWFuYWx5emUucGwgdG8gd29yayB3aXRoIGZpbGUgbmFtZXMgdGhhdCBjb250YWluIGNvbG9ucyAoYXMgb24KICBXaW5kb3dzKS4KICAKLSBLamV0aWwgSmFjb2JzZW4gcXVpY2tseSBwb2ludGVkIG91dCB0aGF0IGxpYi9zaGFyZS5oIHdhcyBtaXNzaW5nLi4uCgpWZXJzaW9uIDcuMTAuMy1wcmU0ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIFVwZGF0ZWQgbGliL3NoYXJlLmMgcXVpdGUgYSBiaXQgdG8gbWF0Y2ggdGhlIGRlc2lnbiBkb2N1bWVudCBhdAogIGh0dHA6Ly9jdXJsLmhheHguc2UvZGV2L3NoYXJpbmcudHh0IGEgbG90IG1vcmUuCgogIEknbGwgdHJ5IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgc29vbmlzaC4gc2hhcmUuYyBpcyBzdGlsbCBub3QgYWN0dWFsbHkgdXNlZAogIGJ5IGxpYmN1cmwsIGJ1dCB0aGUgQVBJIGlzIHNsb3dseSBnZXR0aW5nIHRoZXJlIGFuZCB3ZSBjYW4gc3RhcnQKICBpbXBsZW1lbnRpbmcgY29kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGlzIHN5c3RlbS4KCkRhbmllbCAoOCBKYW4gMjAwMykKLSBVcGRhdGVkIHNoYXJlIHN0dWZmIGluIGN1cmwvY3VybC5oLCBpbmNsdWRpbmcgZGF0YSB0eXBlcywgc3RydWN0cyBhbmQKICBmdW5jdGlvbiBwcm90b3R5cGVzLiBUaGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiBsaWIvIHdlcmUgYWxzbyBtb2RpZmllZAogIG9mIGNvdXJzZSB0byByZW1haW4gY29tcGlsYWJsZS4gQmFzZWQgb24gaW5wdXQgZnJvbSBKZWFuLVBoaWxpcHBlIGFuZCBhbHNvCiAgdG8gbWFrZSBpdCBtb3JlIGluIGxpbmUgd2l0aCB0aGUgZGVzaWduIGRvY3VtZW50LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHBhdGNoZWQgYSB2ZXJ5IHRyaXZpYWwgbWVtb3J5IGxlYWsgaW4KICBjdXJsX2VzY2FwZSgpIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gcmVhbGxvYygpIHJldHVybnMgTlVMTC4uLgoKLSBNYXR0aGV3IEJsYWluIHByb3ZpZGVkIGZlZWRiYWNrIHRvIG1ha2UgdGhlIC0tY3JlYXRlLWRpcnMgc3R1ZmYgYnVpbGQKICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gdGVzdHMvbGlidGVzdC9maXJzdC5jIGFzIExlZ29mZiBWaW5jZW50IHBvaW50ZWQgb3V0LgoKRGFuaWVsICg3IEphbiAyMDAzKQotIFBoaWxpcHBlIFJhb3VsdCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgcHJvcGVybHkgc3VwcG9ydAogIHdpbGRjYXJkIGNoZWNrcyBmb3IgY2VydGlmaWNhdGUgbmFtZXMuCgotIFNpbW9uIExpdSBhZGRlZCBDVVJMT1BUX0hUVFAyMDBBTElBU0VTLCB0byBsZXQgYW4gYXBwbGljYXRpb24gc2V0IG90aGVyCiAgc3RyaW5ncyByZWNvZ25pemVkIGFzICJIVFRQIDIwMCIgdG8gYWxsb3cgaHR0cC1saWtlIHByb3RvY29scyB0byBnZXQKICBkb3dubG9hZGVkIGZpbmUgYnkgY3VybC4KCi0gTm93IHVzaW5nIGF1dG9jb25mIDIuNTcgYW5kIGF1dG9tYWtlIDEuNy4yCgotIERvaW5nICJjdXJsIC1JIGZ0cDovL2RvbWFpbi9ub24tZXhpc3RpbmctZmlsZSIgc3RpbGwgb3V0cHV0ZWQgYSBkYXRlIQogIFdheW5lIEhhaWdoIHJlcG9ydGVkLgoKLSBUaGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgd3JpdHRlbiBwcm9wZXJseSB3aXRoIGEgbmV3bGluZSBpbiB0aGUgLS10cmFjZQogIGZpbGUuCgpEYW5pZWwgKDYgSmFuIDIwMDMpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgcG9zc2libGUgYnVnOiBwcmV2aW91c2x5LCBpZiB5b3UgY2FsbGVkCiAgY3VybF9lYXN5X3BlcmZvcm0gYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgZG5zIGNhY2hlLCB0aGUgZ2xvYmFsIGNhY2hlCiAgd291bGRuJ3QgYmUgdXNlZC4gUG9pbnRlZCBvdXQgYnkgSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZS4KCi0gTWF0dGhldyBCbGFpbidzIGZpeGVkIHRoZSBWQzYgbGliY3VybCBtYWtlZmlsZSB0byBpbmNsdWRlIGJldHRlciBkZWJ1ZyBkYXRhCiAgb24gZGVidWcgYnVpbGRzLgo=