ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjEyLjEgKDEwIEF1Z3VzdCAyMDA0KQoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNCkKLSBJbiBPcGVuU1NMIDAuOS43ZCBhbmQgZWFybGllciwgQVNOMV9TVFJJTkdfdG9fVVRGOCBmYWlscyBpZiB0aGUgaW5wdXQgaXMKICBhbHJlYWR5IFVURi04IGVuY29kZWQuIFRoaXMgbWFkZSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWwgaWYgdGhlCiAgcmVtb3RlIHNlcnZlciB1c2VkIGEgY2VydGlmaWNhdGUgd2l0aCB0aGUgbmFtZSBVVEYtOCBlbmNvZGVkLgoKICBXb3JrLWFyb3VuZCBicm91Z2h0IGJ5IEFsZXhpcyBTLiBMLiBDYXJ2YWxoby4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNCkKLSBJIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBrcmI0IHRvIHVzZSAtbGNvbV9lcnIgYXMgd2VsbCwgYXMgSSBzdGFydGVkCiAgdG8gZ2V0IGxpbmsgcHJvYmxlbXMgd2l0aCBpdCB1bmxlc3MgSSBkaWQgdGhhdCBvbiBteSBTb2xhcmlzIDIuNyBib3guIEkKICBkb24ndCB1bmRlcnN0YW5kIHdoeSBJIHN0YXJ0ZWQgdG8gZ2V0IHByb2JsZW1zIHdpdGggdGhpcyBub3chCgpEYW5pZWwgKDUgQXVndXN0IDIwMDQpCi0gRW5yaWNvIFNjaG9seiBmaXhlZCB0aGUgSFRUUC1OZWdvdGlhdGUgc2VydmljZSBuYW1lIHRvIGJlIHVwcGVyY2FzZSBhcwogIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEwMDQxMDUKCkRhbmllbCAoNCBBdWd1c3QgMjAwNCkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3QKICB1c2luZyBtdWx0aXBsZSBJUCAoYmFkKSBhZGRyZXNzZXMuCgotIER5bGFuIFNhbGlzYnVyeSBtYWRlIGxpYmN1cmwgbm8gbG9uZ2VyIGFjY2VwdCBjb29raWVzIHNldCB0byBhIFRMRCBvbmx5IChpdAogIHByZXZpb3VzbHkgYWxsb3dlZCB0aGF0IG9uIHRoZSBzZXZlbiB0aHJlZS1sZXR0ZXIgZG9tYWlucykuCgpEYW5pZWwgKDMxIEp1bHkgMjAwNCkKLSBKb2VsIENoZW4gcmVwb3J0ZWQgdGhhdCB0aGUgZGlnZXN0IGNvZGUgYXNzdW1lZCBxdW90ZXMgYXJvdW5kIHRoZSBjb250ZW50cyBhCiAgYml0IHRvbyBtdWNoLgoKRGFuaWVsICgyOCBKdWx5IDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGhlIGhvc3QgbmFtZSB0byBnZXQgc2V0dXAgcHJvcGVybHkgZXZlbiB3aGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQsIHdoZW4gYSBwcm94eSBpcyBpbiB1c2UuIFByZXZpb3VzbHkgdGhlIHdyb25nIEhvc3Q6CiAgaGVhZGVyIGNvdWxkIGdldCBzZW50IHdoZW4gcmUtdXNpbmcgYSBwcm94eSBjb25uZWN0aW9uIHRvIGEgZGlmZmVyZW50IHRhcmdldAogIGhvc3QuCgotIEZpeGVkIEJyaWFuIEFraW5zJyByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIGR1cGxpY2F0ZSBIb3N0OiBoZWFkZXJzIG9uIHJlLXVzZWQKICBjb25uZWN0aW9ucy4gSWYgeW91IGF0dGVtcHRlZCB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgaW4gdGhlIHNlY29uZAogIHJlcXVlc3QsIHlvdSBnb3QgdHdvIHN1Y2ggaGVhZGVycyEKCi0gc3JjL01ha2VmaWxlLmFtIG5vdyBpbmNsdWRlcyB0aGUgTWFrZWZpbGUuaW5jIGZpbGUgdG8gZ2V0IGluZm8gYWJvdXQgZmlsZXMKCkRhbmllbCAoMjYgSnVseSAyMDA0KQotIE1hZGUgImN1cmwgW1VSTF0gLW8gbmFtZSMyIiB3b3JrIGFzIGV4cGVjdGVkLiBJZiB0aGVyZSdzIG5vIGdsb2JiaW5nIGZvciB0aGUKICAjLW51bWJlciwgaXQgd2lsbCBzaW1wbHkgYmUgdXNlZCBhcyAjMiBpbiB0aGUgZmlsZSBuYW1lLgoKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0ZXN0aW5nIHdpdGggdmFsZ3JpbmQgMi4xLnggYW5kIGFkZGVkIHR3byBtaXNzaW5nCiAgbmV3bGluZXMgaW4gdGhlIGNvb2tpZSBpbmZvcm1hdGlvbmFscy4KCkRhbmllbCAoMjQgSnVseSAyMDA0KQotIEkgZml4ZWQgdGhlIGF1dG9idWlsZHMgd2l0aCBhcmVzLCBzaW5jZSB0aGV5IG5vdyBuZWVkIHRvIGhhdmUgYnVpbGRjb25mIHJ1bgogIGluIHRoZSBhcmVzIGRpciBiZWZvcmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVuLgoKLSBBZGRlZCBDYXNleSBPJ0Rvbm5lbGwncyBjdXJsX2Vhc3lfcmVzZXQoKSBmdW5jdGlvbi4gSXQgaGFzIGEgcHJvdG8gaW4KICBjdXJsL2N1cmwuaCBidXQgd2UgaGF2ZSBubyBtYW4gcGFnZSB5ZXQuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNCkKLSBBZGRlZCBidWlsZGNvbmYgYW5kIGJ1aWxkY29uZi5iYXQgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZXMsIHNpbmNlIHRoZXkgYXJlCiAgaGFuZHkgZm9yIHJlYnVpbGRpbmcgY3VybCB3aGVuIHVzaW5nIGEgZGFpbHkgc25hcHNob3QgKGFuZCBub3QgYSBwdXJlIENWUwogIGNoZWNrb3V0KS4KCkRhbmllbCAoMTYgSnVseSAyMDA0KQotIEFzIHN1Z2dlc3RlZCBieSBUb2J5IFBldGVyc29uLCBsaWJjdXJsIG5vdyBpZ25vcmVzIENvbnRlbnQtTGVuZ3RoIGRhdGEgaWYgdGhlCiAgZ2l2ZW4gc2l6ZSBpcyBhIG5lZ2F0aXZlIG51bWJlci4gVGVzdCBjYXNlIDE3OCB2ZXJpZmllcyB0aGlzLgoKRGFuaWVsICgxNCBKdWx5IDIwMDQpCi0gR/xudGVyIEtuYXVmIGhhcyBtYWRlIHRoZSBOZXR3YXJlIGJ1aWxkcyBkbyB3aXRob3V0IHRoZSBjb25maWctbmV0d2FyZS5oCiAgZmlsZXMsIHNvIHRoZXkgYXJlIG5vdyByZW1vdmVkIGZyb20gdGhlIGRpc3QgcGFja2FnZXMuCgotIEf8bnRlciBLbmF1ZiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgYnVpbGQgd2l0aCBCb3JsYW5kIGFnYWluLgoKLSBBbmRyZXMgR2FyY2lhIGZpeGVkIHRoZSBjb21tb24gdGVzdCA1MDUgZmFpbHVyZXMgb24gd2luZG93cy4KCkRhbmllbCAoNiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBvdXQgd2h5IHRoZSB3aW5kb3dzIHRlc3RzIGZhaWxlZCBvbiBmaWxlOi8vICJ1cGxvYWRzIi4KCkRhbmllbCAoMiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSByZXBvcnRlZCBhIGN1cmxfc2hhcmVfY2xlYW51cCgpIGNyYXNoIHRoYXQgb2NjdXJzIHdoZW4gbm8KICBsb2NrL3VubG9jayBjYWxsYmFja3MgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIHNoYXJlIGlzIGNsZWFuZWQgdXAuCgpEYW5pZWwgKDEgSnVseSAyMDA0KQotIFdoZW4gdXNpbmcgY3VybCAtLXRyYWNlIG9yIC0tdHJhY2UtYXNjaWksIG5vIHRyYWNlIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50CiAgYnkgY3VybF9lYXN5X2NsZWFudXAoKSB3ZXJlIGluY2x1ZGVkIGluIHRoZSB0cmFjZSBmaWxlLiBUaGlzIG1hZGUgdGhlCiAgbWVzc2FnZSAiQ2xvc2luZyBjb25uZWN0aW9uICMwIiBuZXZlciBhcHBlYXIgaW4gdHJhY2UgZHVtcHMuCiAgCkRhbmllbCAoMzAgSnVuZSAyMDA0KQotIE5pZWxzIHZhbiBUb25nZXJlbiBmb3VuZCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gVFJVRSBkb2Vzbid0IGRpc2FibGUKICBhIHByZXZpb3VzbHkgc2V0IFBPU1QgcmVxdWVzdCwgbWFraW5nIGEgdmVyeSBvZGQgcmVxdWVzdCBnZXQgc2VudCAodW5sZXNzCiAgeW91IGRpc2FibGVkIHRoZSBQT1NUKSBhIEhFQUQgcmVxdWVzdCB3aXRoIGEgUE9TVCByZXF1ZXN0LWJvZHkuIEkndmUgbm93CiAgbWFkZSBDVVJMT1BUX05PQk9EWSBlbmZvcmNlIGEgcHJvcGVyIEhFQUQuIEFkZGVkIHRlc3QgY2FzZSA1MTQgZm9yIHRoaXMuCgpEYW5pZWwgKDI5IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgbWFkZSB0aGUgdGVzdGN1cmwucGwgc2NyaXB0IGNhcGFibGUgb2YgdXNpbmcgYSBjdXN0b20gc2V0dXAKICBmaWxlIHRvIGVhc2llciBydW4gbXVsdGlwbGUgYXV0b2J1aWxkcyBvbiB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KCi0gR2lzbGUgZml4ZWQgdGhlIGRqZ3BwIGJ1aWxkIGFuZCBmaXhlZCBhIG1lbW9yeSBwcm9ibGVtIGluIHNvbWUgb2YgdGhlCiAgcmVvcmdlZCBuYW1lIHJlc29sdmVkIGNvZGUuCgotIEZpeGVkIGNvZGUgdG8gYWxsb3cgY29ubmVjdHMgZG9uZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIGF0dGVtcHQgdGhlCiAgbmV4dCBJUCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgSVBzIGFuZCBhCiAgY29ubmVjdCBhdHRlbXB0IGZhaWxzLgogIApEYW5pZWwgKDI3IEp1bmUgMjAwNCkKLSBCYXNlZCBvbiBSb2IgU3RhbnplbCdzIGJ1ZyByZXBvcnQgIzk3OTQ4MCwgSSB3cm90ZSBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHBvbGwoKSBjYW4gYmUgdXNlZCB0byB3YWl0IG9uIE5VTEwgYXMgb3RoZXJ3aXNlIHNlbGVjdCgpIHNob3VsZCBiZQogIHVzZWQgdG8gZG8gaXQuIFRoZSBzZWxlY3QoKSB1c2FnZSB3YXMgYWxzbyBmaXhlZCBhY2NvcmRpbmcgdG8gaGlzIHJlcG9ydC4KCiAgTWFjIE9TIFggMTAuMyBzYXlzICJwb2xsKCkgZnVuY3Rpb25hbGl0eSBmb3IgTWFjIE9TIFggaXMgaW1wbGVtZW50ZWQgdmlhIGFuCiAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBzZWxlY3QoKSwgbm90IGluIHRoZSBrZXJuZWwgZGlyZWN0bHkuIEl0IGlzCiAgcmVjb21tZW5kZWQgdGhhdCBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIE9TIFggMTAuMyBwcmVmZXIgc2VsZWN0KCkgb3ZlcgogIHBvbGwoKS4gQ29uZmlndXJlIHNjcmlwdHMgc2hvdWxkIGxvb2sgZm9yIHRoZSBfUE9MTF9FTVVMX0hfIGRlZmluZSAoaW5zdGVhZAogIG9mIF9QT0xMX0hfIG9yIF9TWVNfUE9MTF9IXykgYW5kIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBwb2xsIGlzIG5vdAogIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwuIgoKICBZZXMsIHdlIGNhbiBwcm9iYWJseSB1c2Ugc2VsZWN0KCkgb24gbW9zdCBwbGF0Zm9ybXMgYnV0IHRvZGF5IEkgcHJlZmVyZWQgdG8KICBsZWF2ZSB0aGUgY29kZSB1bmFsdGVyZWQuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNCkKLSBUaGUgc3RhbmRhcmQgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBvbmx5IGluY2x1ZGVzIHZlcnNpb24gaW5mbyBhYm91dAogIGludm9sdmVkIGxpYnJhcmllcyBhbmQgbm90IGFib3V0IHBhcnRpY3VsYXIgZmVhdHVyZXMuIFRodXMgaXQgd2lsbCBubyBsb25nZXIKICBpbmNsdWRlIGluZm8gYWJvdXQgaXB2NiBub3IgR1NTLiBUaGF0IGluZm8gaXMgb2YgY291cnNlIHN0aWxsIGF2YWlsYWJsZSBpbgogIHRoZSBmZWF0dXJlIGJpdG1hc2sgY3VybF92ZXJzaW9uX2luZm8oKSBvZmZlcnMuCgotIFJlcGxhY2VkIGFsbCBvY2N1cmFuY2VzIG9mIHNwcmludGYoKSB3aXRoIHNucHJpbnRmKCkuIFRoaXMgaXMgbW9zdGx5IGJlY2F1c2UKICBpdCBpcyAiQSBHb29kIFRoaW5nIiByYXRoZXIgdGhhbiBhY3R1YWxseSBmaXhpbmcgYW55IGtub3duIHByb2JsZW0uIFRoaXMKICB3aWxsIGhlbHAgcHJldmVudGluZyBmdXR1cmUgcG9zc2libGUgbWlzdGFrZXMgdG8gY2F1c2UgYnVmZmVyIG92ZXJmbG93cy4KCi0gTWFqb3IgcmVvcmdhbml6YXRpb24gaW4gdGhlIGhvc3QgcmVzb2x2ZSBjb2RlIChhZ2FpbikuIFRoaXMgdGltZSwgSSd2ZQogIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdyBhbHdheXMgdXNlIGEgbGlua2VkIGxpc3Qgb2YgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzCiAgdG8gcmV0dXJuIHJlc29sdmVkIGluZm8gaW4sIG5vIG1hdHRlciB3aGF0IHJlc29sdmVyIG1ldGhvZCBvciBzdXBwb3J0IHRoYXQKICBpcyBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLiBJdCBtYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gd3JpdGUgY29kZSB0aGF0CiAgdXNlcyBvciBkZXBlbmRzIG9uIHJlc29sdmVkIGRhdGEuCgogIEludGVybmFsbHksIHRoaXMgbWVhbnMgYW1vbmdzdCBvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4gc3RvcCBkb2luZyB0aGUgd2VpcmQKICAiaW5jcmVhc2UgYnVmZmVyIHNpemUgdW50aWwgaXQgd29ya3MiIHRyaWNrIHdoZW4gcmVzb2x2aW5nIGhvc3RzIG9uCiAgaXB2NC1vbmx5IHdpdGggZ2V0aG9zdGJ5bmFtZV9yKCksIHdlIHN1cHBvcnQgc29ja3MgZXZlbiBvbiBsaWJjdXJscyBidWlsdAogIHdpdGggaXB2NiBlbmFibGVkIChidXQgb25seSB0byBzb2NrcyBzZXJ2ZXJzIHRoYXQgcmVzb2x2ZSB0byBhbiBpcHY0CiAgYWRkcmVzcykgYW5kIHdlIG5vIGxvbmdlciBkZWVwLWNvcHkgb3IgcmVsb2NhdGUgaG9zdGVudCBzdHJ1Y3RzICh3ZSBjcmVhdGUKICBDdXJsX2FkZHJpbmZvIGNoYWlucyBpbnN0ZWFkKS4KCiAgVGhlIG5ldyAiaG9zdGVudCB0byBDdXJsX2FkZHJpbmZvIiBjb252ZXJ0ZXIgZnVuY3Rpb24gaXMgbmFtZWQgQ3VybF9oZTJhaSgpCiAgYW5kIGlzIHNsaWdodGx5IG5haXZlIGFuZCBzaW1wbGUsIHlldCBJIGJlbGlldmUgaXQgaXMgZnVuY3Rpb25hbCBlbm91Z2ggdG8KICB3b3JrIGZvciBsaWJjdXJsLgoKRGFuaWVsICgyMiBKdW5lIDIwMDQpCi0gRGF2aWQgQ29oZW4gcG9pbnRlZCBvdXQgdGhhdCBSRkMyMTA5IHNheXMgY2xpZW50cyBzaG91bGQgYWxsb3cgY29va2llcyB0bwogIGNvbnRhaW4gbGVhc3QgNDA5NiBieXRlcyB3aGlsZSBsaWJjdXJsIG9ubHkgYWxsb3dlZCAyMDQ3LiBJIHJhaXNlZCB0aGUgbGltaXQKICB0byA0OTk5IG5vdyBhbmQgbWFkZSB0aGUgdXNlZCBidWZmZXIgZ2V0IG1hbGxvYygpZWQgaW5zdGVhZCBvZiBzaW1wbHkKICBhbGxvY2F0ZWQgb24gc3RhY2sgYXMgYmVmb3JlLiBFeHRlbmRlZCB0ZXN0IGNhc2UgNDYgdG8gaW5jbHVkZSBhIGNvb2tpZSB3aXRoCiAgdmVyeSBodWdlIGNvbnRlbnQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBnZXRkYXRlLnkgdG8gcmVtb3ZlIGEgZmV3IHdhcm5pbmdzLiBJIHJlbW92ZWQgdGhlCiAgaWZkZWYnZWQgdGVzdCB3ZSBuZXZlciBldmVyIHVzZSBhbnl3YXkuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxkY2FyZCBjaGVja3MgdG8gc3VwcG9ydCBhICcqJy1sZXR0ZXIKICBhbnl3aGVyZSBpbiB0aGUgd2lsZGNhcmQgc3RyaW5nLCBzdXBwb3J0IG11bHRpcGxlICcqJy1sZXR0ZXJzIGluIHRoZQogIHdpbGRjYXJkIGFuZCB0byBhbGxvdyB0aGUgJyonLWxldHRlciB0byBtYXRjaCBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGEgZG90LgoKRGFuaWVsICgyMSBKdW5lIDIwMDQpCi0gdGVzdGN1cmwuc2ggaXMgbm93IHJlbW92ZWQgY29tcGxldGVseSwgdGVzdHMvdGVzdGN1cmwucGwgaXMgdGhlIHNjcmlwdCB0bwogIHVzZSB3aGVuIGF1dG9idWlsZGluZyBjdXJsIQoKLSBLamV0aWwgSmFjb2JzZW4gYnJvdWdodCBteSBhdHRlbnRpb24gdG8gdGhlIGZhY3QgdGhhdCB5b3UgY2Fubm90IHByb3Blcmx5CiAgYWJvcnQgYW4gdXBsb2FkIHdpdGggdGhlIHJlYWRmdW5jdGlvbiBjYWxsYmFjaywgc2luY2UgcmV0dXJuaW5nIDAgb3IgLTEgb25seQogIHN0b3BzIHRoZSB1cGxvYWQgYW5kIGxpYmN1cmwgd2lsbCBjb250aW51ZSB3YWl0aW5nIGZvciBkb3dubG9hZGVkIGRhdGEgYW5kCiAgdGhlIHNlcnZlciBvZnRlbiB3YWl0cyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVwbG9hZCBkYXRhIHRvIGFycml2ZS4KCiAgVGh1cywgSSd2ZSBub3cgYWRkZWQgdGhlIGFiaWxpdHkgZm9yIHJlYWQgY2FsbGJhY2tzIHRvIHJldHVybgogIENVUkxfUkVBREZVTkNfQUJPUlQgdG8gYWJvcnQgYW4gdXBsb2FkIGZyb20gYSByZWFkIGNhbGxiYWNrLiBUaGlzIHdpbGwgc3RvcAogIHRoZSB0cmFuc2ZlciBpbW1lZGlhdGVseSB3aXRoIGEgQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSyByZXR1cm4gY29kZS4KCiAgVGVzdCBjYXNlIDUxMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgaXQgd29ya3MuIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3QKICBIVFRQIHNlcnZlciB0b28gdG8gZHVtcCB0aGUgcmVxdWVzdCB0byBhIGZpbGUgZXZlbiB3aGVuIHRoZSBjbGllbnQKICBkaXNjb25uZWN0cyBwcmVtYXR1cmVseS4KICAKRGFuaWVsICgxOSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcHJvdmlkZWQgYSB0ZXN0IGNhc2Ugd2l0aCBhIGZhaWxpbmcgY3VybCBvcGVyYXRpb246IHdoZW4gd2UgUE9TVAogIHRvIGEgc2l0ZSB3aXRoIC0tZGlnZXN0IChvciBzaW1pbGFyKSBzZXQsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgMzAyCiAgTG9jYXRpb246IHRvIHRoZSAiYXV0aHByb2JlIiByZXF1ZXN0LCBpdCB3YXMgbm90IHRyZWF0ZWQgY29ycmVjdGx5LiBXZSBzdGlsbAogIHdpbGwgYmVoYXZlIGJhZGx5IGlmIEZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQgZm9yIHRoaXMgY2FzZSwgYnV0IEknbSBub3QKICBpbiB0aGUgbW9vZCB0byBkaXZlIGludG8gdGhpcyByaWdodCBub3cgYW5kIHdpbGwgbGVhdmUgaXQgYXMtaXMgZm9yIG5vdy4KICBWZXJpZmllZCBteSBmaXggd2l0aCB0ZXN0IGNhc2UgMTc3LgoKRGFuaWVsICgxOCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IHByb3ZpZGVzIG1vcmUgZGV0YWlscyBmcm9tIHRoZSBTU0wgbGF5ZXJzIChpZiB5b3UKICB1c2UgYW4gT3BlblNTTCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXQpLiBJdCBhbHNvIGludHJvZHVjZXMgdHdvIG5ldyB0eXBlcwogIG9mIGRhdGEgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgZGVidWcgY2FsbGJhY2s6IENVUkxJTkZPX1NTTF9EQVRBX0lOIGFuZAogIENVUkxJTkZPX1NTTF9EQVRBX09VVC4KCi0gV2l0aCBEYXZpZCBCeXJvbidzIHRlc3Qgc2VydmVyIEkgY291bGQgcmVwZWF0IGhpcyBwcm9ibGVtIGFuZCBtYWtlIHN1cmUgdGhhdAogIFBPU1Rpbmcgb3ZlciBIVFRQUzovLyB3aXRoIE5UTE0gd29ya3MgZmluZSBub3cuIFRoZXJlIHdhcyBhIGdlbmVyYWwgcHJvYmxlbQogIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiB3aXRoIG5vbi1HRVQgb3BlcmF0aW9ucyB3aXRoIENPTk5FQ1QuCgpEYW5pZWwgKDE2IEp1bmUgMjAwNCkKLSBNb2RpZmllZCB0byBrZWVwIHRoZSB1cGxvYWQgYnl0ZSBjb3VudGVyIGluIGFuIGN1cmxfb2ZmX3QsIG5vdCBhbiBpbnQgYXMKICBiZWZvcmUuIDMyYml0cyBpcyBub3QgZW5vdWdoLiBUaGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBidWcgSmVhbi1Mb3VpcyBMZW1haXJlCiAgcmVwb3J0ZWQgdGhhdCBtYWtlcyAyR0IgRlRQIHVwbG9hZHMgdG8gcmVwb3J0IGVycm9yICgidW5hbGlnbmVkIGZpbGUgc2l6ZXMiKQogIHdoZW4gY29tcGxldGVkLgoKRGFuaWVsICgxNSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcmVwb3J0ZWQgYSBwcm9ibGVtIHRoYXQgSSBmaXhlZDogaWYgeW91IGRpZCBhIFBPU1Qgd2l0aAogIENVUkxBVVRIX0RJR0VTVCBzZXQgYnV0IHRoZSBzZXJ2ZXIgZGlkbid0IHJlcXVpcmUgYW55IGF1dGhlbnRpY2F0aW9uLAogIGxpYmN1cmwgd291bGQgcmVwZWF0ZWRseSBzZW5kIEhFQUQgbG90cyBvZiB0aW1lcyB1bnRpbCBpdCBnaXZlcyB1cC4gVGhpcyB3YXMKICBhY3R1YWxseSB0aGUgY2FzZSBmb3IgYWxsIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb25zLiBBZGRlZCB0ZXN0IGNhc2UgMTc0LAogIDE3NSBhbmQgMTc2IHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxNCBKdW5lIDIwMDQpCi0gTXVsdGlwYXJ0IGZvcm1wb3N0cyB1cGxvYWRpbmcgZmlsZXMgbm8gbG9uZ2VyIGluc2VydHMgdGhlIGZpbGVzIHRoZW1zZWx2ZXMKICBpbnRvIHRoZSBodWdlIHByZWJ1aWx0IGNodW5rLiBUaGlzIGVuYWJsZXMgbGliY3VybCB0byBmb3JtcG9zdCBmaWxlcyB0aGF0IGlzCiAgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBzeXN0ZW0gbWVtb3J5LiBXaGVuIHRoZSBmaWxlIGdpdmVuIGlzIHBhc3NlZCBvbgogIHN0ZGluLCBsaWJjdXJsIHN0aWxsIHVzZXMgdGhlIG9sZCBtZXRob2Qgb2YgcmVhZGluZyB0aGUgZnVsbCBmaWxsIGJlZm9yZSB0aGUKICB1cGxvYWQgdGFrZXMgcGxhY2UuIFRoaXMgYXBwcm9hY2ggd2FzIHNlbGVjdGVkIGluIG9yZGVyIHRvIG5vdCBhbHRlciB0aGUKICBiZWhhdmlvciBmb3IgZXhpc3RpbmcgYXBwbGljYXRpb25zLCBhcyB3aGVuIHVzaW5nIHN0ZGluIGxpYmN1cmwgY2FuJ3Qga25vdwogIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgY2FuIG9ubHkgYmUgdXNlZCBvbgogIEhUVFAgMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNCkKLSBHaXNsZSBmb3VuZCBvdXQgdGhhdCB3ZSBkaWQgd2lsZGNhcmQgY2VydCBuYW1lIGNoZWNrcyB3cm9uZywgc28gdGhhdCBwYXJ0cwogIG9mIHRoZSBjaGVjayB3cm9uZ2x5IHdhcyBjYXNlIHNlbnNpdGl2ZS4KCkRhbmllbCAoMTEgSnVuZSAyMDA0KQotIFRpbSBTbmVkZG9uIGJyb3VnaHQgYSBtaW5vciBWTVMgZml4IHRvIG1ha2UgY3VybCBidWlsZCBwcm9wZXJseSBvbiBoaXMgVk1TCiAgbWFjaGluZS4gSGUgYWxzbyBoYWQgc29tZSBpbnRlcmVzdGluZyBsaWJjdXJsIHBhdGNoZXMuLi4gdGhleSBtaWdodCBiZSBhYmxlCiAgdG8gZG8gaW4gYSBzbGlnaHRseSBuaWNlciB3YXkuIERpc2N1c3Npb25zIGFyZSBpbiBwcm9ncmVzcy4KCkRhbmllbCAoMTAgSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY29kZSBjbGVhbnVwc20gYmV0dGVyIHZlcmJvc2Ugb3V0cHV0IGFuZCBiZXR0ZXIgY29ubmVjdAogIHRpbWVvdXQgaGFuZGxpbmcgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8KICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMuCgotIFN0ZXZlbiBCYXp5bCBhbmQgU2VzaHViYWJ1IFBhc2FtIHBvaW50ZWQgb3V0IGEgYnVnIG9uIHdpbjMyIHdoZW4gZnJlZWluZyB0aGUKICBwYXRoIGFmdGVyIGEgZmlsZTovLyB0cmFuc2Zlci4KCkRhbmllbCAoOSBKdW5lIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSAnY29uZmlndXJlIC0tZGlzYWJsZS1odHRwJyB3b3JrIHRvIGJ1aWxkIGxpYmN1cmwKICB3aXRob3V0IEhUVFAgc3VwcG9ydC4gSSBhZGRlZCBhIG5ldyByZXR1cm4gY29kZSBmb3IgY3VybF9mb3JtYWRkKCkgaW4gY2FzZQogIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGU6IENVUkxfRk9STUFERF9ESVNBQkxFRC4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZpbGUgaW4gdGhlIGdlbmVyYXRlZAogIGN1cmxsaWIuZHNwIGZpbGUsIGFuZCBub3cgcGVvcGxlIGJ1aWxkaW5nIHdpdGggdGhpcyBzaG91bGQgZ2V0IGEgbGliY3VybC5saWIKICBmaWxlIGdlbmVyYXRlZCBhcyBpdCB1c2VkIHRvIGRvIGJlZm9yZSB3ZSBnZW5lcmF0ZWQgdGhpcyBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwNCkKLSBNYXJ0eSBLdWhydCBmaXhlZCBhIG1pbm9yIGJ1aWxkIHByb2JsZW0gZm9yIFZNUy4KCkRhbmllbCAoNyBKdW5lIDIwMDQpCi0gUmV2ZXJ0ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmcm9tIHRoZSA0dGggc2luY2UgaXQgb2J2aW91c2x5IGRpZG4ndCB3b3JrLgogIFJlbWFkZSBpdCBpbiBhIGRpZmZlcmVudCBtYW5uZXIgdGhhdCBob3BlZnVsbHkgd29ya3MgYmV0dGVyLgoKRGFuaWVsICg0IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE5ldFdhcmUgYWdhaW4uCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBjaGVja3MgZm9yIHN0cmVycm9yX3IoKSBub3QgZXhpdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdoZW4gYnVpbHQgZm9yIGNyb3NzLWNvbXBpbGluZy4KCkRhbmllbCAoMyBKdW5lIDIwMDQpCi0gQ2hyaXMgR2F1a3JvZ2VyIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgdGVzdCcgYXR0ZW1wdHMgdG8gcnVuIHRoZSB0ZXN0cyBldmVuCiAgaWYgY3VybCBpcyBidWlsdCBjcm9zcy1jb21waWxlZC4gSSd2ZSBub3cgbWFkZSBpdCBvdXRwdXQgYSBzaG9ydCBtZXNzYWdlCiAgaW5zdGVhZCwgc2F5aW5nIGl0IGlzbid0IHBvc3NpYmxlIHRvIGRvLgogIAotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IGJyb3VnaHQgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlciBzdXBwb3J0IHRvIGxpYmN1cmwuCiAgWW91IGNhbiBub3cgdXNlIGxpYmN1cmwgdG8gdHJhbnNmZXIgZmlsZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIHVzaW5nCiAgRlRQLiBUaGVyZSBhcmUgYSBidW5jaCBvZiBuZXcgb3B0aW9ucyB0byBjb250cm9sIHRoaXMgd2l0aDoKICAgQ1VSTE9QVF9TT1VSQ0VfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9VU0VSUFdECiAgIENVUkxPUFRfU09VUkNFX1BBVEgKICAgQ1VSTE9QVF9TT1VSQ0VfUE9SVAogICBDVVJMT1BUX1BBU1ZfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9QUkVRVU9URQogICBDVVJMT1BUX1NPVVJDRV9QT1NUUVVPVEUKCiAgKFRoZXkgc3RpbGwgcmVtYWluIHRvIGJlIGRvY3VtZW50ZWQgcHJvcGVybHkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuCiAgcGFnZS4pCgogIFdoZW4gdXNpbmcgdGhpcywgdGhlIG9yZGluYXJ5IENVUkxPUFRfVVJMIHNwZWNpZmllcyB0aGUgdGFyZ2V0IFVSTCwgYW5kIHlvdQogIHNwZWNpZnkgdGhlIHNvdXJjZSBkYXRhIHdpdGggdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zLiBmdHAzcmRwYXJ0eS5jIGlzIGEKICBuZXcgZXhhbXBsZSBzb3VyY2UgY29kZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcy4KCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgcHJveHkgdXNlciBuYW1lIGFuZAogIHBhc3N3b3JkIHdoZW4gZG9pbmcgcHJveHkgYXV0aGVudGljYXRpb24sIGl0IHByZXZpb3VzbHkgYWx3YXlzIHVzZWQgdGhlIGhvc3QKICB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIQoKRGFuaWVsICgyIEp1bmUgMjAwNCkKLSBDVVJMT1BUX1VQTE9BRCBhbmQgQ1VSTE9QVF9QVVQgbm93IGRvIHRoZSBleGFjdCBzYW1lIHRoaW5nIGludGVybmFsbHksIHdoaWNoCiAgZml4ZXMgc29tZSBvbGQgY29uZnVzaW9ucyBvbiB3aGVuIHdoaWNoIG9mIHRoZXNlIHNob3VsZCBiZSB1c2VkIGFuZCB3aGF0IHRoZQogIGRpZmZlcmVuY2VzIGFyZS4KCi0gQXBwbGllZCBHaXNsZSdzIGZpeGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIHdpdGggbGNjLXdpbjMyCgpWZXJzaW9uIDcuMTIuMCAoMiBKdW5lIDIwMDQpCgpEYW5pZWwgKDEgSnVuZSAyMDA0KQotIEkgY2xhcmlmaWVkIHRoZSAtLWNyZWF0ZS1kaXJzIG9wdGlvbiBzb21ld2hhdCBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCi0gUmVuYXVkIER1aGF1dCBjb3JyZWN0ZWQgdGhlIGN1cmxfdW5lc2NhcGUgbWFuIHBhZ2UuCgotIERhdmlkIEJ5cm9uIG1vZGlmaWVkIG9uZSBvZiBNYXNzaW1pbGlhbm8gWmljY2FyZGkncyByZWNlbnQgTVNWQyBtYWtlZmlsZQogIGNoYW5nZXMgdG8gbm93IGFnYWluIHVzZSB0aGUgbW0gbGliIGJ5IGRlZmF1bHQuCgpEYW5pZWwgKDI2IE1heSAyMDA0KQotIE1vaHVuIEJpc3dhcyBhZGRlZCByZWxlYXNlLXpsaWIgYW5kIGRlYnVnLXpsaWIgdGFyZ2V0cyB0byB0aGUgTVNWQyBsaWJjdXJsCiAgTWFrZWZpbGUKCi0gRGF2aWQgQnlyb24gcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBkb2luZyBDT05ORUNULAogIGxpa2Ugd2hlbiBhY2Nlc3NpbmcgSFRUUFMgc2l0ZXMgd2lodCBhIHByb3h5LiBUaGlzIHByb2JhYmx5IGJyb2tlIHdoZW4gSQogIHJld3JvdGUgdGhlIGF1dGggc3R1ZmYgcmVjZW50bHkuCgotIEkgYWRkZWQgZmlsZXVwbG9hZC5jIGluIHRoZSBleGFtcGxlcyBkaXJlY3RvcnksIHNob3dpbmcgaG93IGFuIHVwbG9hZCB0byBhCiAgZmlsZTovLyBVUkwgaXMgbWFkZS4KCkRhbmllbCAoMjUgTWF5IDIwMDQpCi0gTWFzc2ltaWxpYW5vIFppY2NhcmRpIHVwZGF0ZWQgdGhlIE1TVkMgbWFrZWZpbGVzLgoKRGFuaWVsICgyNCBNYXkgMjAwNCkKLSBsaWJjdXJsIG5vdyBzdXBwb3J0cyAidXBsb2FkaW5nIiB0byBmaWxlOi8vIFVSTHMuIFRlc3QgMjA0IGFuZCAyMDUgd2VyZQogIGFkZGVkIHRvIHZlcmlmeS4KCi0gU2ltb24gSm9zZWZzc29uIGFkZGVkIGEgaWRuX2ZyZWUoKSBmdW5jdGlvbiBpbiBsaWJpZG4gMC40LjUgYXMgYSByZWFjdGlvbiB0bwogIEdpc2xlJ3MgcHJldmlvdXMgbWFpbC4gV2Ugbm93IHVzZSB0aGlzIGZ1bmN0aW9uLCBhbmQgdGh1cyB3ZSByZXF1aXJlIGxpYmlkbgogIDAuNC41IG9yIGxhdGVyLiBObyBlYXJsaWVyIHZlcnNpb24gd2lsbCBkby4KCi0gUm9iZXJ0IEQuIFlvdW5nIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DT09LSUVGSUxFIGFuZCBDVVJMT1BUX0NPT0tJRSBjb3VsZAogIG5vdCBiZSB1c2VkIGJvdGggaW4gb25lIHJlcXVlc3QuIEZpeGVkIGl0IGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTcyIHRvIHZlcmlmeS4KCkRhbmllbCAoMjEgTWF5IDIwMDQpCi0gV2hpbGUgdGFsa2luZyB0byBob3N0IGEuYi5jLCBsaWJjdXJsIGRpZCB3cm9uZ2x5IG5vdCBhY2NlcHQgY29va2llcyB0aGF0CiAgd2VyZSBzZXQgdG8gdGhlIGRvbWFpbiAuYS5iLmMgKHRoYXQgaXMgd2l0aCBhIGRvdCBwcmVmaXgpLiBUaGlzIGlzIG5vdyBmaXhlZAogIGFuZCB0ZXN0IGNhc2UgMTcxIHZlcmlmaWVzIGl0LgoKRGFuaWVsICgyMCBNYXkgMjAwNCkKLSBKZXNzZSBOb2xsZXIgcmVwb3J0ZWQgdGhhdCB0aGUgdXBsb2FkIHNwZWVkIGluZm8gcmVwb3J0ZWQgYnkgbGliY3VybCB3YXMKICB3cm9uZy4gVGhlIHNhbWUgd2FzIHRydWUgZm9yIHRoZSBkb3dubG9hZCBzcGVlZC4gRml4ZWQgbm93LgoKRGFuaWVsICgxOSBNYXkgMjAwNCkKLSBEYXZpZCBCeXJvbiBhZGRlZCB0ZXN0IGNhc2UgMTcwIC0gdGhpcyB1c2VkIHRvIGNyYXNoIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIAogIGN1cmwuCgpEYW5pZWwgKDE3IE1heSAyMDA0KQotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHRoYXQgYWRkcmVzc2VzIHR3byBmbGF3cyBpbiB0aGUgcGVlciBjZXJ0aWZpY2F0ZQogIG5hbWUgdmVyaWZpY2F0aW9uOgogIG8gd2hlbiBtdWx0aXBsZSBjb21tb24gbmFtZXMgYXJlIHVzZWQgKGFzIGluIHRoZSBjdXJsIHRlc3RzKSwgdGhlIGxhc3QgbmFtZQogICAgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCiAgbyBhbGxvdyBjb21wYXJpbmcgd2l0aCBlbmNvZGVkIHZhbHVlcywgYXQgbGVhc3Qgd2l0aCBCTVAgYW5kIElTTyBsYXRpbjEKICAgIGVuY29kZWQgVDYxc3RyaW5ncy4KCi0gQWxsIDE5MSB0ZXN0IGNhc2VzIHJ1biB0aHJvdWdoIHRoZSB0b3J0dXJlIHRlc3QgT0shICdtYWtlIHRlc3QtdG9ydHVyZScgaXMKICBub3cgYXZhaWxhYmxlIGluIHRoZSByb290IG1ha2VmaWxlIChvbiBjb25maWd1cmUtYmFzZWQgZW52aXJvbm1lbnRzKS4KCkRhbmllbCAoMTQgTWF5IDIwMDQpCi0gV2l0aCBhIHNsaWdodGx5IG1vZGlmaWVkIGZ0cHNlcnZlci5wbCBJJ3ZlIG5vdyBydW4gYWxtb3N0IGFsbCB0ZXN0cyB0aHJvdWdoCiAgd2l0aCBydW50ZXN0cy5wbCAtdC4gVGhpcyBpcyBnb29kbmVzcyEKCi0gU2luY2UgSSBoYXZlIGJlZW4gdW5hYmxlIHRvIGNvbnRhY3QgdGhlIENWUyBhZG1pbnMgZm9yIHNldmVyYWwgbW9udGhzLCBJJ3ZlCiAgZGVjaWRlZCB0aGF0IHRoZSBjdXJyZW50IENWUyBob3N0aW5nIHdhcyBub3QgZ29vZCBlbm91Z2guIEkndmUgbm93IG1vdmVkIHRoZQogIENWUyByZXBvIG9uY2UgYWdhaW4sIHNlZSBSRUFETUUgZm9yIHVwZGF0ZWQgY3ZzIGNoZWNrb3V0IGluc3RydWN0aW9ucy4KCkRhbmllbCAoMTMgTWF5IDIwMDQpCi0gcnVudGVzdHMucGwgLXQgbm93IHJ1bnMgZmluZSBhbGwgdGhlIHdheSB0byB0ZXN0IDEwMC4gSSBiZWxpZXZlIHRlc3QgY2FzZQogIDEwMCBmYWlscyBiZWNhdXNlIG9mIGFuIEZUUCBzZXJ2ZXIgcHJvYmxlbS4KCkRhbmllbCAoMTIgTWF5IDIwMDQpCi0gR2VuZXJhbCBjbGVhbnVwcyBhbGwgb3ZlciB0byBtYWtlIGxpYmN1cmwgc3Vydml2ZSBhbmQgZG8gd2VsbCB3aGVuIGEgbWVtb3J5CiAgZnVuY3Rpb24gcmV0dXJucyBOVUxMLiBydW50ZXN0cy5wbCAtdCBub3cgd29ya3MgZmluZSBmb3IgdGhlIGZpcnN0IDI2IHRlc3QKICBjYXNlcy4KCkRhbmllbCAoMTEgTWF5IDIwMDQpCi0gU2VzaHViYWJ1IFBhc2FtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGN1cmxfZ2xvYmFsX2luaXRfbWVtKCkgLQogIGxpa2Ugbm9ybWFsIGN1cmxfZ2xvYmFsX2luaXQoKSBidXQgYWxsb3dzIHRoZSBhcHAgdG8gcmVwbGFjZSBhbGwgbWVtb3J5CiAgZnVuY3Rpb25zIHdpdGggaXRzIG93biBzZXQuIEkgbW9kaWZpZWQgaXQgc2xpZ2h0bHkuCgotIEJhc2VkIG9uIEx1Y2EgQWx0ZWFzJyBjb21tZW50cywgSSBtb2RpZmllZCB0aGUgY3VybGxpYi5kc3AgZ2VuZXJhdGlvbiBjb2RlLgoKRGFuaWVsICgxMCBNYXkgMjAwNCkKLSBHaXNsZSBtYWlsZWQgU2ltb24gSm9zZWZzc29uIChvZiBsaWJpZG4gZmFtZSkgYWJvdXQgdGhlIGJlbmVmaXRzIG9mIGEKICBzZXBhcmF0ZSBmcmVlKCktZnVuY3Rpb24gYnkgdGhhdCBsaWIgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgaXMgZnJlZWQgYnkgdGhlCiAgc2FtZSBtZW1vcnkgc3Vic3lzdGVtIHRoYXQgYWxsb2NhdGVkIGl0LiBIZSByZXNwb25kZWQgcG9zaXRpdmVseSBhbmQgdGhpcwogIHdpbGwgbGlrZWx5IGNhdXNlIHVzIHRvIHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYmlkbiBhcyBzb29uIGFzIFNpbW9uCiAgcmVsZWFzZXMgb25lIHdpdGggc3VjaCBhIGxpYmlkbl9mcmVlKCkgZnVuY3Rpb24uCgotIEphbWVzIEJ1cnNhIG1hZGUgcnVudGVzdHMucGwncyAtdCBvcHRpb24gd29yayBmb3IgYW55IGdpdmVuIHRlc3QgY2FzZSwgYW5kIEkKICBlZGl0ZWQgdG8gYWxsb3cgLWcgdG9vLiBOb3QgZXZlbiB0ZXN0IGNhc2UgMSB3b3JrZWQuLi4KCi0gTHVjYSBBbHRlYSBtYWRlIHRoZSBuYz0gZmllbGQgbm90IHVzZSBxdW90ZXMgaW4gb3V0Z29pbmcgSFRUUCBEaWdlc3QgaGVhZGVycy4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIHRlc3Qgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsIHRvCiAgcmVjb2duaXplIG91ciBvd24gcnVubmluZyBIVFRQIHNlcnZlci4KCkRhbmllbCAoNyBNYXkgMjAwNCkKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgbWVtYW5hbHl6ZS5wbCBzY3JpcHQgdG8gY29uZGVyIG1hbGxvYygwKSBhcmVhcyBPSyB0bwogIGZyZWUoKSBhbmQgaGUgbWFkZSB0d28gZmFpbGVkLXJlc29sdmUgZXJyb3IgbWVzc2FnZXMgdXNlIHRoZSBuZXcgZGlzcGxheS0KICBuYW1lIGluc3RlYWQgb2YgdGhlIGludGVybmFsbHktdXNlZCBuYW1lLgoKLSBHaXNsZSBWYW5lbSB0cmllZCBjdXJsIHdpdGgKICB3d3cuZXRkb21lbmVuYXZua2FubWFrc2ltYWx0aW5uZWhvbGRlc2Vrc3RpdHJlYm9rc3RhdmVyc2xpa3NvbWRldHRlLmNvbQogIHdoaWNoIGNhdXNlZCBwcm9ibGVtcywgYW5kIEkgZml4ZWQgdGhlIHNpbmdsZSB6ZXJvIGJ5dGUgYnVmZmVyIG92ZXJ3cml0ZQogIHRoYXQgb2NjdXJyZWQgKGR1ZSB0byBhIHN0dXBpZCBwcm90b2NvbCBidWZmZXIgc2l6ZSBhbmQgcGFyc2VyKS4KCi0gTWFkZSB0aGUgbGliL2N1cmxsaWIuZHNwIGZpbGUgZ2V0IGdlbmVyYXRlZCBhdXRvbWF0aWNseSB3aGVuIGEgZGlzdHJpYnV0aW9uCiAgcGFja2FnZSBpcyBtYWRlLCB3aXRoIHRoZSBtc3ZjcHJvai4qIGZpbGVzIGFzIHRlbXBsYXRlcyBhbmQgYWxsCiAgd2luMzItc291cmNlcyBhZGRlZC4gSSB0aGluayB0aGlzIGNhbiBiZSBtYWRlIHRvIHdvcmsgYmV0dGVyIHRoYW4gdGhlIGFsd2F5cwogIGxhZ2dpbmctYmVoaW5kIHByZXZpb3VzIGFwcHJvYWNoLiBJJ20gbm90IHN1cmUgdGhpcyBidWlsZHMgYSB3b3JraW5nIHByb2plY3QKICBmaWxlIHJpZ2h0IG5vdyB0aG91Z2ghCgpEYW5pZWwgKDYgTWF5IDIwMDQpCi0gTWljaGFlbCBCZW5lZGljdCBicm91Z2h0IGEgZml4IHRoYXQgZmlsbHMgaW4gdGhlIGVycm9yYnVmZmVyIHByb3Blcmx5IHdoZW4KICBhcmVzIGZhaWxzIHRvIHJlc29sdmUgYSBuYW1lIGZvciBhIGNhc2Ugbm90IHByZXZpb3VzbHkgZGVhbHQgd2l0aCBsaWtlIHRoaXMuCgpEYW5pZWwgKDUgTWF5IDIwMDQpCi0gSm9lIEhhbHBpbiBmaXhlZCB0aGUgYW5ub3lpbmcgdHlwZWNhc3Qgd2FybmluZyBpbiBsaWIvbGRhcC5jCgotIEdpc2xlIFZhbmVtIGZpeGVzOgogIG8gbWVtZGVidWcgdG8gbm90IGFjY2VzcyBOVUxMIG9uIHNldmVyYWwgcGxhY2VzCiAgbyBsaWJjdXJsLmRlZjsgY3VybF9mb3JtcGFyc2UgaXMgZ29uZS4KICBvIHByb2dyZXNzLmM7IGZpeGVkIHRoZSBwZXJjZW50IHZhbHVlcyBiZWluZyB0cnVuY2VkIHRvIDAuCiAgbyBpZjJpcC4qOyBjb25zdGlmaWVkIHRoZSAnaW50ZXJmYWNlJyBhcmd1bWVudC4KCi0gVG9yIEFybnRzZW4gcmVwb3J0ZWQgdGhhdCBtYW55IG9mIGhpcyBhdXRvYnVpbGRzIGZyb3plIGFuZCBJIGZvdW5kIGFuZCBmaXhlZAogIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIHdpdGggdGhlIEhUVFAgYXV0aCBvdmVyaGF1bCB0aGF0IGNvdWxkIGxlYWQgdG8gYQogIG5ldmVyLWVuZGluZyBpbnRlcm5hbCByZXF1ZXN0LWxvb3AgZHVlIHRvIHVuLWluaXRpYWxpemVkIHZhcmlhYmxlcyEKCi0gUmVtb3ZlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHZhcmlvdXMgY29tcGlsZXJzL3BsYXRmb3Jtcy4KCkRhbmllbCAoNCBNYXkgMjAwNCkKLSBjdXJsX2Zvcm1wYXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlicmFyeS4gSXQgaGFzIGJlZW4gbWFya2VkIGFuZAogIG1lbnRpb25lZCBhcyBkZXByZWNhdGVkIGZvciBzZXZlcmFsIHllYXJzLgoKRGFuaWVsICgzIE1heSAyMDA0KQotIFJld3JpdHRlbiBIVFRQIGF1dGhlbnRpY2F0aW9uIGNvZGUuIFRoZSBwcmV2aW91cyBjb2RlIGNvdWxkIG5vdCBwcm9wZXJseQogIGRlYWwgd2l0aCB0aGUgYWRkZWQgdGVzdCBjYXNlcyAxNjcsIDE2OCBhbmQgMTY5LiBJJ3ZlIG5vdyByZXdyaXR0ZW4gdGhlIGNvZGUKICB0byBiZXR0ZXIgc2VwYXJhdGUgaG9zdCBhbmQgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIG5vdCByZS11c2UgdGhlIHNhbWUKICB2YXJpYWJsZXMgYXMgbXVjaCBhcyBiZWZvcmUgYXMgaXQgcHJvdmVkIG5vbiB3b3JraW5nIGluIHRoZSBtb3JlIGludm9sdmVkCiAgY2FzZXMuIEFsbCB0aGUgY3VycmVudCB0ZXN0cyBydW4gT0sgbm93LCBhbmQgc28gZG8gdGhlIG5ldyBvbmVzLiBUaGUgY3VybAogIHRvb2wgZ290IGEgbmV3IG9wdGlvbiBuYW1lZCAtLXByb3h5LWRpZ2VzdCB0byBlbmFibGUgSFRUUCBEaWdlc3QKICBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBwcm94eS4gSSBhbHNvIG1hZGUgdGhlIGxpYnJhcnkgc3VwcG9ydCBpdC4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgTERBUCBjb2RlIHdvcmsgd2l0aCB3bGRhcDMyLmRsbCBhcyBzdXBwbGllZCB3aXRoCiAgV2luLTk4L01FLzIwMDAvWFAsIHNvIG5vIGV4dHJhIC5kbGxzIGFyZSByZXF1aXJlZCB3aGVuIGN1cmwvbGliY3VybCBpcyB1c2VkCiAgb24gdGhlc2UgV2luZG93cyB2ZXJzaW9ucy4KCkRhbmllbCAoMzAgQXByaWwgMjAwNCkKLSBydW50ZXN0cy5wbCBub3cgc2NhbnMgdGhlIHZhbGdyaW5kIGxvZyBmb3IgdmFsZ3JpbmQtZGV0ZWN0ZWQgbWVtb3J5IGxlYWtzCiAgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgaWYgdmFsZ3JpbmQgd2FzIGZvdW5kIGFuZCB1c2VkLgoKLSBJIG1vZGlmaWVkIHRoZSBhcHAtY29kZSBpbiBjdXJsIHRvIGluY2x1ZGUgdGhlIG5ldyBsaWIvY3VybHguaCBhbmQgb25seQogIGFjY2VzcyB0aG9zZSBmdW5jdGlvbnMgdXNpbmcgdGhlIGN1cmx4Xy1wcmVmaXggaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBmdXR1cmUKICByZW1vdmFsIG9mIHNldmVyYWwgY3VybF8tZnVuY3Rpb25zIGZyb20gdGhlIHB1YmxpYyBsaWJjdXJsIEFQSS4KCi0gSW50cm9kdWNlZCBsaWIvY3VybHguaCBhcyBhIHNpbmdsZSBoZWFkZXIgdG8gcHJvdmlkZSB0aGUgY3VybHhfLWZ1bmN0aW9ucwogIHRvIGFwcHMuCgotIEFkZGVkIG5vdGljZXMgaW4gdGhlIG1hbiBwYWdlcyBmb3IgY3VybF9nZXRlbnYsIGN1cmxfbXByaW50ZiwgY3VybF9zdHJlcXVhbAogIGFuZCBjdXJsX3N0cm5lcXVhbCB0aGF0IHRoZXkgYXJlIHN1YmplY3QgZm9yIHJlbW92YWwgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICBTVE9QIFVTSU5HIFRIRVNFIEZVTkNUSU9OUy4KCi0gTWloYWkgSW9uZXNjdSBub3RpY2VkIGhlIGNvdWxkbid0IGRvIGZvcm1wb3N0cyB3aXRoIHdoaXRlc3BhY2UgaW4gdGhlIGZpbGUKICBuYW1lcyBhbmQgeWVzLCBJIGJyb2tlIHRoYXQgb24gQXByaWwgMjMuIFNpZ2guIEkgZml4ZWQgaXQgbm93IGFuZCBhZGRlZAogIHRlc3QgY2FzZSAxNjYgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBsZWZ0IGZyb20gdGhlIERpZ2VzdCBwYXRjaCBvZiB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDI5IEFwcmlsIDIwMDQpCi0gTWFkZSBJRE4gZG9tYWlucyB3b3JrIHdoZW4gc2VuZGluZyByZXF1c3RzIG92ZXIgSFRUUCBwcm94eSBhcyB3ZWxsLiBBZGRlZAogIHRlc3QgY2FzZSAxNjUgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgbmV3IGludGVybmFsIGhvc3QgbmFtZSBzZXR1cCB3aGVuIHJlLXVzaW5nIGNvbm5lY3Rpb25zLgoKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgd2l0aCBhcmVzLWJ1aWx0IGxpYmN1cmwKICBjcmVhdGVkIGEgYmFkIGhhbmRsZSB0aGF0IHdvdWxkIGNyYXNoIGluIHRoZSBmaXJzdCBuYW1lIHJlc29sdmUgYXR0ZW1wdC4gVGhpcwogIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDUxMiB3YXMgYWRkZWQgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHByb3ZpZGVkIGEgbWFqb3IgSFRUUCBEaWdlc3QgY29kZSBmaXggYW5kIGNsZWFudXAuIFdlIG5vdyBmb2xsb3cKICB0aGUgRGlnZXN0IFJGQyBhIGxvdCBiZXR0ZXIuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIFNTTCBjb2RlIHVzZSBFUlJfZXJyb3Jfc3RyaW5nX24oKSB3aGVyZSBhcHBsaWNhYmxlLgoKRGFuaWVsICgyNyBBcHJpbCAyMDA0KQotIEkgcmVtb2RlbGVkIEdpc2xlJ3MgSUROIGNvZGUgc2xpZ2h0bHkgYW5kIG5vdyB3ZSBjb252ZXJ0IGJvdGggdGhlIGhvc3QgbmFtZQogIGFuZCBwcm94eSBuYW1lIHRvIHRoZSBBQ0UgZW5jb2RlZCB2ZXJzaW9uIHRvIHVzZSBpbnRlcm5hbGx5IGZvciByZXNvbHZlcyBhbmQKICBjb29raWVzIGV0Yy4gVGhleSBhcmUgbm93IHVzaW5nIG9uZSAnc3RydWN0IGhvc3RuYW1lJyBlYWNoIHRoYXQga2VlcCBib3RoCiAgdGhlIG9yaWdpbmFsIG5hbWUgYW5kIHRoZSBwb3NzaWJseSBlbmNvZGVkIG5hbWUuIElETiByZXNvbHZlcyB3b3JrIGZvciBtZQogIG5vdyB1c2luZyBpcHY2LCBpcHY0IGFuZCBhcmVzIHJlc29sdmluZy4gRXZlbiBjb29raWVzIG9uIElETiBzaXRlcyBzZWVtIHRvCiAgZG8gcmlnaHQuIEkgZ290IHNvbWUgZmFpbHVyZXMgYXQgZmlyc3Qgd2hlbiBDSEFSU0VUIHdhc24ndCBzZXQgYXQgYWxsIHdoaWNoCiAgY29uZnVzZWQgbGliaWRuIGNvbXBsZXRlbHkgYW5kIGl0IGRlY2lkZWQgYnkgZW5jb2Rpbmcgb2YgY2hvaWNlIHdhcwogICdBTlNJX1gzLjQtMTk2OCcuLi4KCi0gbWFkZSAnY29uZmlndXJlIC0td2l0aG91dC1saWJpZG4nIHdvcmsKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBGaXhlZCB0aGUgc3JjL2h1Z2VoZWxwLmMgZmlsZSB0byBpbmNsdWRlICJzZXR1cC5oIiBpbnN0ZWFkIG9mICJjb25maWcuaCIgdG8KICBtYWtlIHRoZSBwcm9ibGVtcyB3aXRoIFVTRV9NQU5VQUwgb24gd2luZG93cyBnbyBhd2F5LgoKLSBjb25maWd1cmUgLS13aXRob3V0LXNzbCBjb3VsZCBzdGlsbCB3cm9uZ2x5IGluY2x1ZGUgc29tZSBPcGVuU1NMIGluZm8gaW4gdGhlCiAgTWFrZWZpbGVzIGlmIHBrZy1jb25maWcgaGFkIGluZm8gYWJvdXQgT3BlblNTTC4gQnVnICM5NDE3NjIgcmVwb3J0ZWQgYnkKICBNYXJ0aW4uCgotIFNpbmNlIHdlIGNhbiBub3cgYnVpbGQgYW5kIHVzZSBxdWl0ZSBhIGxhcmdlIHNldCBvZiAzcmQgcGFydHkgbGlicmFyaWVzLCBJCiAgZGVjaWRlZCBJIHdvdWxkIG1ha2UgY29uZmlndXJlIHByb2R1Y2UgYSBzdW1tYXJ5IGF0IHRoZSBlbmQgc2hvd2luZyB3aGF0CiAgbGlicmFyaWVzIGl0IHVzZXMgYW5kIGlmIG5vdCwgd2hhdCBvcHRpb24gdG8gdXNlIHRvIG1ha2UgaXQgdXNlIHRoYXQuIEkgYWxzbwogIGFkZGVkIHNvbWUgb3RoZXIgcmFuZG9tIGluZm8gdGhhdCBpcyBuaWNlIGluIGEgImNvbmZpZ3VyZSBzdW1tYXJ5IiBvdXRwdXQuCgotIEFwcGxpZWQgVG9tbXlUYW0ncyBwYXRjaCB0aGF0IG5vdyBtYWtlIGN1cmwgd29yayB3aXRoIHRlbG5ldCBhbmQgc3RkaW4KICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBUaGUgY2hhbmdlcyBmb3IgdG9kYXkgYmVsb3cgd2VyZSBtYWRlIGJ5IG1lIGFuZCBHaXNsZSBWYW5lbS4KCiAgVGhlIGZpbGUgcHJldmlvdXNseSBrbm93biBhcyBob3N0aXAuYyBoYXMgbm93IHVuZGVyZ29uZSBhIGh1Z2UgY2xlYW51cCBhbmQKICBzcGxpdDoKCiAgaG9zdGlwLmMgZXhwbGFpbmVkCiAgPT09PT09PT09PT09PT09PT09CgogIFRoZSBtYWluIENPTVBJTEUtVElNRSBERUZJTkVTIHRvIGtlZXAgaW4gbWluZCB3aGVuIHJlYWRpbmcgdGhlIGhvc3QqLmMKICBzb3VyY2UgZmlsZSBhcmUgdGhlc2U6CgogIENVUkxSRVNfSVBWNiAtIHRoaXMgaG9zdCBoYXMgZ2V0YWRkcmluZm8oKSBhbmQgZmFtaWx5LCBhbmQgdGh1cyB3ZSB1c2UKICB0aGF0LiBUaGUgaG9zdCBtYXkgbm90IGJlIGFibGUgdG8gcmVzb2x2ZSBJUHY2LCBidXQgd2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8KICB0YWtlIHRoYXQgaW50byBhY2NvdW50LiBIb3N0cyB0aGF0IGFyZW4ndCBJUHY2LWVuYWJsZWQgaGF2ZSBDVVJMUkVTX0lQVjQKICBkZWZpbmVkLgoKICBDVVJMUkVTX0FSRVMgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gdXNlIGMtYXJlcyBmb3IgYXN5bmNocm9ub3VzCiAgbmFtZSByZXNvbHZlcy4gSXQgY2Fubm90IGhhdmUgRU5BQkxFX0lQVjYgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLCBhcwogIGMtYXJlcyBoYXMgbm8gaXB2NiBzdXBwb3J0LiBUaGlzIGNhbiBiZSBXaW5kb3dzIG9yICpuaXguCgogIENVUkxSRVNfVEhSRUFERUQgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gcnVuIHVuZGVyIChuYXRpdmUpCiAgV2luZG93cywgYW5kIHRoZW4gdGhlIG5hbWUgcmVzb2x2ZSB3aWxsIGJlIGRvbmUgaW4gYSBuZXcgdGhyZWFkLCBhbmQgdGhlCiAgc3VwcG9ydGVkIGFzeW5jaCBBUEkgd2lsbCBiZSB0aGUgc2FtZSBhcyBmb3IgYXJlcy1idWlsZHMuCgogIElmIGFueSBvZiB0aGUgdHdvIHByZXZpb3VzIGFyZSBkZWZpbmVkLCBDVVJMUkVTX0FTWU5DSCBpcyBkZWZpbmVkIHRvby4gSWYKICBsaWJjdXJsIGlzIG5vdCBidWlsdCB0byB1c2UgYW4gYXN5bmNocm9ub3VzIHJlc29sdmVyLCBDVVJMUkVTX1NZTkNIIGlzCiAgZGVmaW5lZC4KCiAgVGhlIGhvc3QqLmMgc291cmNlcyBmaWxlcyBhcmUgc3BsaXQgdXAgbGlrZSB0aGlzOgoKICBob3N0aXAuYyAgIC0gbWV0aG9kLWluZGVwZW5kZW50IHJlc29sdmVyIGZ1bmN0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMKICBob3N0YXN5bi5jIC0gZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RzeW4uYyAgLSBmdW5jdGlvbnMgZm9yIHN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0YXJlcy5jIC0gZnVuY3Rpb25zIGZvciBhcmVzLXVzaW5nIG5hbWUgcmVzb2x2ZXMKICBob3N0dGhyZS5jIC0gZnVuY3Rpb25zIGZvciB0aHJlYWRlZCBuYW1lIHJlc29sdmVzCiAgaG9zdGlwNC5jICAtIGlwdjQtc3BlY2lmaWMgZnVuY3Rpb25zCiAgaG9zdGlwNi5jICAtIGlwdjYtc3BlY2lmaWMgZnVuY3Rpb25zCgogIFRoZSBob3N0aXAuaCBpcyB0aGUgc2luZ2xlIHVuaXRlZCBoZWFkZXIgZmlsZSBmb3IgYWxsIHRoaXMuIEl0IGRlZmluZXMgdGhlCiAgQ1VSTFJFU18qIGRlZmluZXMgYmFzZWQgb24gdGhlIGNvbmZpZyouaCBhbmQgc2V0dXAuaCBkZWZpbmVzLgoKLSBBZGRlZCBmdW5jdGlvbiBoZWFkZXIgY29tbWVudHMgdG8gbWFueSBmdW5jdGlvbnMgaW4gYW4gYXR0ZW1wdCB0byBiZXR0ZXIKICBleHBsYWluIHRoZSBwdXJwb3NlIG9mIHRoZW0gYWxsLgoKLSBjb25maWd1cmUgLS13aXRoLWxpYmlkbiBpcyBub3cgc3VwcG9ydGVkLiBJdCBtYWtlcyB0aGUgY29uZmlndXJlIHNjcmlwdAogIGNoZWNrIGZvciBsaWJpZG4gbGlicyBhbmQgaW5jbHVkZSBmaWxlcyBpbiB0aGUgcHJlZml4IHBhdGggZ2l2ZW4uIElmIHlvdQogIHNheSAtLXdpdGgtbGliaWRuPS91c3IvbG9jYWwsIGl0IHdpbGwgY2hlY2sgZm9yIHRoZSBsaWIgaW4gL3Vzci9sb2NhbC9saWIKICBhbmQgdGhlIGluY2x1ZGVzIGluIC91c3IvbG9jYWwvaW5jbHVkZSBldGMuCgotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBzdHJ1Y3QgYWdlZCBDVVJMVkVSU0lPTl9USElSRCBpbmNsdWRpbmcKICBsaWJpZG4gdmVyc2lvbiBpbmZvLiBUaGUgc3RyaW5nIGN1cmxfdmVyc2lvbigpIHJldHVybnMgYWxzbyBpbmNsdWRlcyBsaWJpZG4KICB2ZXJzaW9uIGluZm8sIGlmIGF2YWlsYWJsZS4KClZlcnNpb24gNy4xMS4yICgyNiBBcHJpbCAyMDA0KQoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEVyd2luIEF1dGhyaWVkIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwgZGlkbid0IGRvIHJpZ2h0CiAgaWYgeW91IGFscmVhZHkgaGFkIGEgc3JjL2h1Z2VoZWxwLmMgc291cmNlIGZpbGUgcHJlc2VudCAod2hpY2ggbW9zdCBwZW9wbGUKICBkbyBJIGd1ZXNzKS4gSXQgbm93IHVzZXMgdGhlIFVTRV9NQU5VQUwgZGVmaW5lIHByb3Blcmx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gZG9pbmcgKGZhaWxpbmcpIFdpbmRvd3MKICB0aHJlYWRlZCBuYW1lIHJlc29sdmVzLgoKLSBJIGFsc28gYWRkZWQgdGVzdCBjYXNlIDE2MyBqdXN0IHRvIG1ha2Ugc3VyZSAtRiAidmFyPTxmaWxlIiB3b3JrcyBmaW5lIGFuZAogIGNhbiBwYXNzIG9uIGNoYXJhY3RlcnMgc3VjaCBhcyBuZXdsaW5lcywgY2FycmlhZ2UtcmV0dXJuIGFuZCB0YWJzLgoKLSBXaGVuIHdlIGFkZGVkIHRlc3QgY2FzZSAxNjIgd2l0aG91dCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSByZXF1aXJlbWVudCBmaWVsZAogIGluIHRoZSB0ZXN0IG1ldGEgZGF0YSB3ZSBjb3VsZCBzZWUgdGhhdCBjdXJsIGRpZG4ndCBjb21wbGFpbiBpZiB5b3UgdXNlZAogIC0tcHJveHktbnRsbSBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIGxpYmN1cmwgaXQgdXNlcyBoYXMgbm8gTlRMTSBzdXBwb3J0ISBJCiAgbm93IG1hZGUgaXQgY2hlY2sgdGhpcyBmaXJzdCwgYW5kIGl0IG5vdyBleGlzdHMgd2l0aCBhICJ0aGUgaW5zdGFsbGVkCiAgbGliY3VybCB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIiBtZXNzYWdlIGlmIGl0IGhhcHBlbnMgYWdhaW4uCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDQpCi0gRGF2aWQgQnlyb24gZm91bmQgYW5kIGZpeGVkIGEgc21hbGwgYnVnIHdpdGggdGhlIC0tZmFpbCBhbmQgYXV0aGVudGljYXRpb24KICBzdHVmZiBhZGRlZCBhIGZldyB3ZWVrcyBhZ28uICBUdXJucyBvdXQgdGhhdCBpZiB5b3Ugc3BlY2lmeSAtLXByb3h5LW50bG0gYW5kCiAgY29tbXVuaWNhdGUgd2l0aCBhIHByb3h5IHRoYXQgcmVxdWlyZXMgYmFzaWMgYXV0aGVudGljYXRpb24sIHRoZSBwcm94eQogIHByb3Blcmx5IHJldHVybnMgYSA0MDcsIGJ1dCB0aGUgZmFpbHVyZSBkZXRlY3Rpb24gY29kZSBkb2Vzbid0IHJlYWxpemUgaXQKICBzaG91bGQgZ2l2ZSB1cCwgc28gY3VybCByZXR1cm5zIHdpdGggZXhpdCBjb2RlIDAuIFRlc3QgY2FzZSAxNjIgYWRkZWQgdG8KICB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIGFsbG93IG5ld2xpbmVzIGluIHRoZSBjb250ZW50cyB3aGVuIGRvaW5nIC1GICJ2YXI9W2NvbnRlbnRzXSIKICBSb2JlcnQgTWFybG93IHJlcG9ydGVkLgoKLSBJZiBhIHRyYW5zZmVyIGlzIGZvdW5kIG91dCB0byBiZSBvbmx5IHBhcnRpYWwsIGxpYmN1cmwgd2lsbCBub3cgdHJlYXQgdGhhdAogIGFzIGEgcHJvYmxlbSBzZXJpb3VzIGVub3VnaCB0byBza2lwIHRoZSBmaW5hbCBRVUlUIGNvbW1hbmQgYmVmb3JlIGNsb3NpbmcKICB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBUbyBhdm9pZCB0aGUgcmlzayB0aGF0IGl0IHdpbGwgImhhbmciIHdhaXRpbmcgZm9yCiAgdGhlIFFVSVQgcmVzcG9uc2UuIEFkZGVkIHRlc3QgY2FzZSAxNjEgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgdGhlIGhldXJpc3RpY3MgZm9yIGRlYWxpbmcgd2l0aCB0aGUgdGVzdCAxNjAgc2NlbmFyaW8uIFdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCBhbmQgbm90aGluZyBhdCBhbGwgaXMgcmVjZWl2ZWQgZnJvbSBpdCAoYmVjYXVzZSB0aGUKICBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uKSwgd2Ugd2lsbCBub3cgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYSBmcmVzaCBuZXcKICBjb25uZWN0aW9uLiBUaGUgcHJldmlvdXMgRUNPTk5SRVNFVCBzdHVmZiBmcm9tIEphbnVhcnkgMzAgd2FzIHJlbW92ZWQgYWdhaW4KICBhcyBpdCBkaWRuJ3QgZGV0ZWN0IHRoZSBzaXR1YXRpb24gZ29vZCBlbm91Z2guCgpEYW5pZWwgKDIwIEFwcmlsIDIwMDQpCi0gQWRkZWQgdGVzdCBjYXNlIDE2MCB0byB2ZXJpZnkgdGhhdCBjdXJsIHdvcmtzIGNvcnJlY3RseSB3aGVuIGl0IGdldHMgYQogIGNvbm5lY3Rpb24gcmVzZXQgd2hlbiB0cnlpbmcgdG8gcmUtdXNlIGEgY29ubmVjdGlvbi4gSXQgc2hvdWxkIHRoZW4gc2ltcGx5CiAgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHJlc2VuZCB0aGUgcmVxdWVzdC4KCkRhbmllbCAoMTkgQXByaWwgMjAwNCkKLSBObyBtb3JlIDUxMiBieXRlIGxpbWl0IGZvciBob3N0IG5hbWUgKGluY2x1c2luZyBuYW1lICsgcGFzc3dvcmQpIGluIGxpYmN1cmwuCiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkgZm9yIHRoZSB0eXBpY2FsIChzaG9ydGVyIFVSTCkKICBjYXNlLgoKLSBDbGVhbmVkIHVwIHRoZSBzb3VyY2VzIHRvIGJldHRlciB1c2UgdGhlIHRlcm1zICdob3N0bmFtZScgYW5kICdwYXRoJwogIGludGVybmFsbHkgd2hlbiByZWZlcnJpbmcgdG8gdGhhdCBkYXRhLiBUaGUgYnVmZmVycyB1c2VkIGZvciBrZWVwIHRoYXQgaW5mbwogIGlzIGNhbGxlZCAnbmFtZWJ1ZmZlcicgYW5kICdwYXRoYnVmZmVyJy4gTXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZAogIHRoYW4gdGhlIHByZXZpb3VzIG1lc3MuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgcnVudGVzdHMucGwgYWdhaW4gdG8gcmVtb3ZlIGFsbCBsb2cgZmlsZXMgaW4gdGhlIGxvZy8gZGlyIGJldHdlZW4KICBlYWNoIHRlc3QsIGFuZCB0aGVuIG1hZGUgLXAgZGlzcGxheSBhbGwgbm9uLXplcm8gYnl0ZSBmaWxlcyBpbiB0aGUgbG9nIGRpci4KICBJdCBzaG91bGQgbWFrZSB0aGF0IGRhdGEgbW9yZSB1c2FibGUgYW5kIGNvbnRhaW4gbGVzcyBydWJiaXNoLgoKLSBmdHBzZXJ2ZXIucGwgbm93IHByb2R1Y2VzIGxvZyBmaWxlcyBtb3JlIHNpbWlsYXIgdG8gaG93IHRoZSBzd3Mgb25lcyBsb29rCiAgYW5kIHRoZXkgbm93IGFsc28gY29udGFpbnMgYSBiaXQgbW9yZSBkZXRhaWxzIHRvIGhlbHAgZGVidWdnaW5nIGZ0cAogIHByb2JsZW1zLgoKLSBSZW1vdmVkIHRoZSBmaXhlZCBtYXhpbXVtIGFtb3VudCBvZiBkaXIgbGV2ZWxzIHRoZSBGVFAgY29kZSBzdXBwb3J0ZWQuCiAgUHJldmlvdXNseSB3ZSBoYWQgYSBmaXhlZCBhcnJheSBmb3IgMTAwIGxldmVscywgbm93IHdlIHNhdmUgc3BhY2UgaW4gZWFjaAogIGhhbmRsZSBieSBhbGxvY2F0aW5nIG9ubHkgZm9yIGEgZmV3IGxldmVsIGJ5IGRlZmF1bHQgYW5kIHRoZW4gZW5sYXJnaW5nIHRoYXQKICBpbiBjYXNlIG9mIG5lZWQgKHdpdGggbm8gbWF4aW11bSBkZXB0aCkuIEFkanVzdGVkIHRlc3QgY2FzZSAxNDIgdG8gdmVyaWZ5CiAgdGhhdCAxNTAgZGlyIGxldmVscyB3b3JrIGZpbmUuICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeQogIGZvciB0aGUgdHlwaWNhbCAobm90IHZlcnkgZGVlcCkgY2FzZS4KCkRhbmllbCAoMTQgQXByaWwgMjAwNCkKLSBBc2tpbmcgZm9yIENVUkxfSVBSRVNPTFZFX1Y2IHdoZW4gaXB2NiBhZGRyZXNzZXMgY2FuJ3QgYmUgcmVzb2x2ZWQgd2lsbAogIG5vdyBjYXVzZSB0aGUgcmVzb2x2ZSBmdW5jdGlvbiB0byByZXR1cm4gTlVMTCBpbW1lZGlhdGVseS4gVGhpcyBmbGF3IHdhcwogIHBvaW50ZWQgb3V0IGJ5IEdpc2xlIFZhbmVtLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgLTQvLTYgYWN0dWFsbHkgc2V0IHRoZSBkZXNpcmVkIG9wdGlvbiB0byBsaWJjdXJsLgoKLSBydW50ZXN0cy5wbCBub3cgaGFzIGEgbmV3IG9wdGlvbiAoLXApIHRoYXQgd2lsbCBkaXNwbGF5ICJpbnRlcmVzdGluZyIgbG9nCiAgZmlsZXMgdG8gc3Rkb3V0IGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuIFRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlCiAgdXNlZCBpbiB0aGUgJ2Z1bGwtdGVzdCcgbWFrZSB0YXJnZXQgdGhhdCBpcyB1c2VkIGJ5IHRoZSBhdXRvYnVpbGQgdGVzdHMsIGFzCiAgd2UgdGhlbiBnZXQgYSBtdWNoIGJldHRlciBjaGFuY2UgdG8gdW5kZXJzdGFuZCAocmVtb3RlKSB0ZXN0IGZhaWx1cmVzIGJhc2VkCiAgb24gYXV0b2J1aWxkIGxvZ3MgYWxvbmUuCgpEYW5pZWwgKDEzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbXVsdGkgaW50ZXJmYWNlIHdvcmsgYWdhaW4gb24gV2luZG93cyBldmVuIHdoZW4gYnVpbHQKICB3aXRob3V0IGFyZXMuIEJlZm9yZSB0aGlzLCBzZWxlY3QoKSB3b3VsZCByZXR1cm4gLTEgZHVyaW5nIHRoZSBuYW1lIHJlc29sdmUKICBwaGFzZSBzaW5jZSBjdXJsX211bHRpX2Zkc2V0KCkgZGlkbid0IHJldHVybiBhbnkgZmRfc2V0IGF0IGFsbCB3aGljaCB3YXNuJ3QKICBhcHByZWNpYXRlZCEKCi0gY3VybF9lYXN5X2R1cGhhbmRsZSgpIG5vdyBkdXBsaWNhdGVzIHRoZSB0Y3Bfbm9kZWxheSBpbmZvIGFzIHdlbGwuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDQpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIHBhdGNoIGZvciB0aGUgTVNWQyBsaWJjdXJsIG1ha2VmaWxlIGZvciBidWlsZHMgd2l0aAogIHpsaWIuCgpEYW5pZWwgKDkgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBpbXByb3ZlZCB0aGUgdGltZXIgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fKl9USU1FLCBpdCBjYW4gbm93CiAgYmUgZG93biB0byB1c2VjIGlmIHRoZSBzeXN0ZW0gc3lwcG9ydHMgaXQuCgpEYW5pZWwgKDcgQXByaWwgMjAwNCkKLSBBIHJlcXVlc3QgdGhhdCBzZW5kcyAiRXhwZWN0OiAxMDAtY29udGludWUiIGFuZCBnZXRzIG5vdGhpbmcgYnV0IGEgc2luZ2xlCiAgMTAwIHJlc3BvbnNlIGJhY2sgd2lsbCBub3cgcmV0dXJuIGEgQ1VSTEVfR09UX05PVEhJTkcuIFRlc3QgMTU4IHZlcmlmaWVzLgoKLSBUaGUgc3RydG9vZmZ0KCkgbWFjcm8gaXMgbm93IG5hbWVkIGN1cmx4X3N0cnRvb2ZmdCgpIHRvIHVzZSB0aGUgY3VybHhfKgogIGFwcHJvYWNoIGZ1bGx5LgoKRGFuaWVsICg2IEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXhlZCBidWcgIzkyNzk3OSByZXBvcnRlZCBieSBOYXRoYW4gTydTdWxsaXZhbi4gVGhlIHByb2JsZW0KICBtYWRlIGxpYmN1cmwgb24gV2luZG93cyBsZWFrIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSBpbiBlYWNoIG5hbWUgcmVzb2x2ZQogIHdoZW4gbm90IHVzZWQgYXMgYSBETEwuCgotIE5ldyBhdXRoZW50aWNhdGlvbiBjb2RlIGFkZGVkLCBwYXJ0aWN1bGFybHkgbm90aWNhYmxlIHdoZW4gZG9pbmcgUE9TVCBvciBQVVQKICB3aXRoIERpZ2VzdCBvciBOVExNLiBsaWJjdXJsIHdpbGwgbm93IHVzZSBIRUFEIHRvIG5lZ290aWF0ZSB0aGUKICBhdXRoZW50aWNhdGlvbiBhbmQgd2hlbiBkb25lIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBQT1NULiBQcmV2aW91c2x5IGxpYmN1cmwKICBzZW50IFBPU1QgaW1tZWRpYXRlbHkgYW5kIGV4cGVjdGVkIHRoZSBzZXJ2ZXIgdG8gcmVwbHkgYSBmaW5hbCBzdGF0dXMgY29kZQogIHdpdGggYW4gZXJyb3IgYW5kIHRoZW4gbGliY3VybCB3b3VsZCBub3Qgc2VuZCB0aGUgcmVxdWVzdC1ib2R5IGJ1dCBpbnN0ZWFkCiAgc2VuZCB0aGVuIG5leHQgcmVxdWVzdCBpbiB0aGUgc2VxdWVuY2UuCgogIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIGR1ZSB0byBJSVM2IGJhcmZpbmcgb24gbGliY3VybCB3aGVuIHdlIGF0dGVtcHQKICB0byBQT1NUIHdpdGggTlRMTSBhdXRoZW50aWNhdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhlIHByb2JsZW1zIGlzIGZvdW5kIGluCiAgUkZDMjYxNiBzZWN0aW9uIDguMi4zIHJlZ2FyZGluZyBob3cgc2VydmVycyBzaG91bGQgZGVhbCB3aXRoIHRoZSAxMDAKICBjb250aW51ZSByZXF1ZXN0LWhlYWRlcjoKCiAgICAgICAgSWYgaXQgcmVzcG9uZHMgd2l0aCBhIGZpbmFsIHN0YXR1cyBjb2RlLCBpdCBNQVkgY2xvc2UgdGhlIHRyYW5zcG9ydAogICAgICAgIGNvbm5lY3Rpb24gb3IgaXQgTUFZIGNvbnRpbnVlIHRvIHJlYWQgYW5kIGRpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlCiAgICAgICAgcmVxdWVzdC4KCiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgSUlTIGNsZWFybHkgZGlkIGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIHRoaXMgY2FzZSwKICB3aGlsZSB0aGlzIG5ld2VyIHZlcnNpb24gZGVjaWRlZCBpdCBzaG91bGQgInJlYWQgYW5kIGRpc2NhcmQiLiBUaGF0IHdvdWxkJ3ZlCiAgZm9yY2VkIHVzIHRvIHNlbmQgdGhlIHdob2xlIFBPU1QgKG9yIFBVVCkgZGF0YSBvbmx5IHRvIGhhdmUgaXQgZGlzY2FyZGVkIGFuZAogIHRoZW4gYmUgZm9yY2VkIHRvIHNlbmQgaXQgYWdhaW4uIFRvIGF2b2lkIHRoYXQgaHVnZSBwZW5hbGl0eSwgd2Ugc3dpdGNoIHRvCiAgdXNpbmcgSEVBRCB1bnRpbCB3ZSBhcmUgYXV0aGVudGljYXRlZCBhbmQgdGhlbiBzZW5kIHRoZSBQT1NULgoKICBUaGUgb25seSBhY3R1YWwgZHJhd2JhY2sgSSBjYW4gdGhpbmsgb2YgKGV4Y2VwdCBmb3IgdGhlIG9kZCBzaXRlcyB0aGF0IG1pZ2h0CiAgdHJlYXQgSEVBRCBkaWZmZXJlbnRseSB0aGFuIHRoZXkgd291bGQgdHJlYXQgUE9TVC9QVVQgd2hlbiBnaXZlbiB0aGUgc2FtZQogIFVSTCkgaXMgdGhhdCBpZiB5b3UgZG8gUE9TVCB3aXRoIENVUkxBVVRIX0FOWSBzZXQgYW5kIHRoZSBzaXRlIHJlcXVpcmVzIE5PCiAgYXV0aGVudGljYXRpb24sIGxpYmN1cmwgd2lsbCBzdGlsbCB1c2UgYSBIRUFEIGluIGEgZmlyc3Qgcm91bmQgYW5kIHRoZW4gZG8gYQogIFBPU1QuCgogIElmIHlvdSBkbyBhIEhFQUQgb3IgYSBHRVQgb24gYSBzaXRlIHVzaW5nIENVUkxBVVRIX0FOWSwgbGliY3VybCB3aWxsIHNlbmQKICBhbiB1bi1hdXRoZW50aWNhdGVkIHJlcXVlc3QgYXQgb25jZSwgd2hpY2ggdGhlbiBpcyB0aGUgb25seSByZXF1ZXN0IGlmIHRoZQogIHNpdGUgcmVxdWlyZXMgbm8gYXV0aC4KCiAgQWxhbiBQaW5zdGVpbiBoZWxwZWQgbWUgd29yayBvdXQgdGhlIHByb3RvY29sIGRldGFpbHMgYnkgZmlndXJpbmcgb3V0IHdoeQogIGxpYmN1cmwgZmFpbGVkIGFuZCB3aGF0IElJUzYgZXhwZWN0cy4KCi0gVGhlIC0tbGltaXQtcmF0ZSBsb2dpYyB3YXMgY29ycmVjdGVkIGFuZCBub3cgaXQgd29ya3MgYSBsb3QgYmV0dGVyIGZvcgogIGhpZ2hlciBzcGVlZHMsIHN1Y2ggYXMgJzEwbScgb3Igc2ltaWxhci4gUmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjOTMwMjQ5LgoKLSBJbnRyb2R1Y2luZyBjdXJseF90dm5vdygpIGFuZCBjdXJseF90dmRpZmYoKSB1c2luZyB0aGUgbmV3IGN1cmx4XyogZmFzaGlvbi4KICAjaW5jbHVkZSAidGltZXZhbC5oIiBmcm9tIHRoZSBsaWIgZGlyIHRvIGdldCB0aGUgcHJvdG9zIGV0Yy4gIE5vdGUgdGhhdAogIHRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgbGliY3VybCBBUEkuIFRoZSBjdXJsIGFwcCBzaW1wbHkgdXNlcyB0aGUgc2FtZQogIHNvdXJjZSBmaWxlcyBhcyB0aGUgbGlicmFyeSBkb2VzIGFuZCB0aGVyZWZvcmUgdGhlIGZpbGUgbmVlZHMgdG8gYmUgY29tcGlsZWQKICBhbmQgbGlua2VkIHdpdGggY3VybCB0b28sIG5vdCBqdXN0IHdoZW4gY3JlYXRpbmcgbGliY3VybC4KCi0gbGliL3N0cmVycm9yLmMgbm8gbG9uZ2VyIHVzZXMgc3lzX25lcnIgb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zIHNpbmNlIGl0CiAgaXNuJ3QgcG9ydGFibGUgZW5vdWdoCgpEYW5pZWwgKDIgQXByaWwgMjAwNCkKLSBJbiB0aGUgY3VybF9zdHJucXVhbC4zIG1hbiBwYWdlLCB3ZSBub3cgcHJlcGVuZCB0aGUgbWFuMyBkaXIgdG8gdGhlIGZpbGUKICBuYW1lIHRvIHdvcmsgYmV0dGVyLiBBcyBwb2ludGVkIG91dCBieSBSb2JpbiBLYXkuCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIHByb2JsZW0gSSByZWNlbnRseSBhZGRlZCBpbiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgY29kZSB0aGF0CiAgYnJva2Ugc3Vic2Vjb25kIHJlc29sdXRpb24gZm9yIENVUkxJTkZPX1RPVEFMX1RJTUUuIEhlIGFsc28gcG9pbnRlZCBvdXQgYQogIG1pc3Rha2UgaW4gdGhlIGNvZGUgdGhhdCBwcm9kdWNlcyB0aGUgZmluYWwgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlcgogIHRoYXQgd291bGQgb2Z0ZW4gcHJldmVudCBpdCBmcm9tIGFjdHVhbGx5IGJlaW5nIHVwZGF0ZWQgdGhhdCBmaW5hbCB0aW1lLgoKRGFuaWVsICgxIEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gd2UgdXNlIGFyZXMgZm9yIG5hbWUKICByZXNvbHZlcyBhbmQgZGVjaWRlcyB0byB0aW1lLW91dCBiZWZvcmUgYXJlcyBkb2VzIGl0LiBUaGlzIGZpeCB1c2VzIHRoZQogIGJyYW5kIG5ldyBhcmVzX2NhbmNlbCgpIGZ1bmN0aW9uIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIGMtYXJlcyAxLjEuMC4KCiAgV2hlbiB0b2xkIHRvIGVuYWJsZSBhcmVzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGZvciBwcmVzZW5jZSBvZgogIHRoZSBhcmVzX2NhbmNlbCBmdW5jdGlvbiB0byBhbGVydCB1c2VycyBpZiB0aGV5IGF0dGVtcHQgdG8gdXNlIGEgdG9vIG9sZAogIGMtYXJlcyBsaWJyYXJ5LgoKRGFuaWVsICgzMSBNYXJjaCAyMDA0KQotIFJveSBTaGFuIGZpeGVkIGEgZmxhdyB0aGF0IHByZXZlbnRlZCBhcmVzIG5hbWUgcmVzb2x2ZSB0aW1lb3V0cyB0byBvY2N1ciEKCi0gRGlyayBNYW5za2UgZm91bmQgb3V0IHRoYXQgbGliY3VybCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzb2x2ZXMgZmFyIHRvbwogIGVhc3kgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB0byB1c2UgKGMtKWFyZXMgZm9yIG5hbWUgcmVzb2x2aW5nLgoKLSBGdXJ0aGVyIERpZ2VzdCBmaXhpbmcgYW5kIGEgc3VjY2Vzc2Z1bCB0ZXN0IGNhc2UgMTUzIG5vdyBtYWtlcyBtZSBiZWxpZXZlCiAgTWl0eiBXYXJrJ3MgcHJvYmxlbXMgYXJlIGZpeGVkLgoKLSBBbmRyZXMgR2FyY2lhIGZpZ3VyZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDYzLCB3aGlsZSB3b3JraW5nLCBvbmx5IHByb3ZlZCBhCiAgZmxhdyBpbiBsaWJjdXJsJ3MgJ2h0dHBfcHJveHknIHBhcnNlciB3aGVuIGEgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpcwogIHByb3ZpZGVkLiBUaGUgdXNlciBuYW1lIHdhcyBub3QgZXh0cmFjdGVkIHByb3Blcmx5IChhbmQgJ2h0dHAnIHdhcyBhbHdheXMKICB1c2VkIGFzIHVzZXIgbmFtZSkuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gb3VyIGlvY3Rsc29ja2V0KCkgdXNhZ2UuCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDQpCi0gSm9lIEhhbHBpbiBmYWNlZCBwcm9ibGVtcyB3aXRoIHRoZSBnZXRuYW1laW5mbygpIGFyZ3VtZW50IGFpX2ZsYWdzIGFuZCB0aGUKICBwYXJ0aWN1bGFyIGJpdCBuYW1lZCAnTklfV0lUSFNDT1BFSUQnIG9uIFNvbGFyaXMgOSBmb3IgSW50ZWwuICBJJ3ZlIG5vdwogIHdyaXR0ZW4gYSBjb25maWd1cmUgdGVzdCB0aGF0IGNoZWNrcyBmb3IgYSB3b3JraW5nIE5JX1dJVEhTQ09QRUlECiAgaW1wbGVtZW5hdGlvbi4gTm8gY29kZSB1c2VzIHRoZSByZXN1bHQgZnJvbSB0aGlzIHRlc3QgeWV0LCBpdCBpcyBzdGlsbAogIGV4cGVyaW1lbnRhbC4gSmFtZXMgQ2FybHNvbiB3cm90ZSBpbiBjb21wLnVuaXguc29sYXJpczogIkl0J3MgYSBidWcKICAoNTAwNjYyMykgLS0gaXQncyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGRuJ3QgYmUgaW4gdGhlIGhlYWRlciBmaWxlLiIKCi0gSSBwcm92aWRlZCBNaXR6IFdhcmsgd2l0aCBhIGZpcnN0IHBhdGNoIGluIG9yZGVyIHRvIGZpeCBsaWJjdXJsJ3MgcHJvYmxlbXMKICB0byByZS1uZWdvdGlhdGUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uICh3aGVuICdzdGFsZT10cnVlJyBpcyBpbmNsdWRlZCBpbiB0aGUKICByZXNwb25zZSBoZWFkZXIpLgoKLSBSb3kgU2hhbiBkaXNjb3ZlcmVkIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZSBkaWRuJ3QgcHJvcGVybHkgdGltZW91dCBuYW1lCiAgbG9va3VwcyB3aGljaCBjb3VsZCBtYWtlIGhhbmRsZXMgZ2V0IHN0dWNrIGluIHRoYXQgc3RhdGUgYW5kIHRodXMgbmV2ZXIgZ2V0CiAgY29tcGxldGVkLiBJJ3ZlIHByb2R1Y2VkIGEgZmlyc3QgdGVzdCBwYXRjaCB0aGF0IGF0dGVtcHRzIHRvIGNvcnJlY3QgdGhpcy4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwcGxpZWQgdG8gbWFrZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIHdvcmsgbmljZWx5CiAgZXZlbiB3aXRoIGF1dGhlbnRjYXRpb25zIHN1Y2ggYXMgTlRMTSBvciBEaWdlc3QgZW5hYmxlZC4gVGVzdCBjYXNlcyAxNTAsIDE1MQogIGFuZCAxNTIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCBmaWxlcyBmb3IgdGhlIGRqZ3BwL01TLURPUyBidWlsZC4KCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgd29yayBvdXQgYSBmaXggZm9yIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gbWFrZQogIHRoZSBmaWxlOi8vIHRlc3RzIHJ1biBmaW5lIHdoZW4gdGVzdGVkIHdpdGggdGhlIG1pbmd3LWJ1aWx0IHZlcnNpb24gb2YgY3VybC4KCi0gRml4ZWQgYW4gaW5jbHVkZSBpc3N1ZSB3aXRoIG5ldGluZXQvdGNwLmggb24gQUlYLCBiYXNlZCBvbiBpbnB1dCBieSBUb3IuCiAgVGhpcyBhbHNvIHJlcXVpcmVkIGEgbWlub3IgZml4IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBUaGUgcG9zdGl0Mi5jIHNvdXJjZSBleGFtcGxlIHVzZWQgdGhlIHdyb25nIHN0cnVjdCBuYW1lIGZvciB0aGUgcG9zdCBkYXRhLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGlwdjYgc3VwcG9ydCBvbiB3aW5kb3dzIGJ5IG1ha2luZyB0aGUgY3VybCBidWlsZCB0byB1c2UKICB0aGUgY29ycmVjdCBnZXRhZGRyaW5mbygpIGZ1bmN0aW9uLgoKRGFuaWVsICgyNSBNYXJjaCAyMDA0KQotIEl0IHR1cm5lZCBvdXQgdGhhdCBBSVgsIGRlc3BpdGUgaGF2aW5nIGEgInRocmVhZC1zYWZlIGxpYmMiLCBkb2Vzbid0IG9mZmVyCiAgYWxsIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucyB0aHJlYWQtc2FmZS4gVGhpcyBVUkwgaXMgaW5mb3JtYXRpdmUgb24gdGhpcwogIHN1YmplY3Q6CgogICAgaHR0cDovL3B1YmxpYm4uYm91bGRlci5pYm0uY29tL2RvY19saW5rL2VuX1VTL2FfZG9jX2xpYi9haXhwcmdnZC8gXAogICAgZ2VucHJvZ2MvdGhyZWFkX3F1aWNrX3JlZi5odG0KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgd2Ugbm93IGNoZWNrIGZvciB0aHJlZSAqX3IoKSBmdW5jdGlvbnMgb24gcmVjZW50IEFJWAogIHZlcnNpb25zIGFzIHdlbGwgdGhhdCB0aGUgVVJMIG1lbnRpb25zIGFyZW4ndCB0aHJlYWQtc2FmZSBpbiBBSVggNS4xLgoKLSByZW5hbWVkIGN1cmxfc3RyZXJyb3IuW2NoXSB0byBzdHJlcnJvci5bY2hdCgotIEpvZSBIYWxwaW4gYWRkZWQgQ1VSTE9QVF9UQ1BfTk9ERUxBWSBhbmQgLS10Y3Atbm9kZWxheSB0byBtYWtlIGl0IHBvc3NpYmxlCiAgZm9yIHVzZXJzIHRvIGRpc2FibGUgdGhlIE5hZ2xlIGFsZ29ydGhpbS11c2FnZS4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgc29tZSBpbnRlcmVzdGluZyBzdHJlcnJvcl9yKCkga25vd2xlZGdlLiBnbGliYyBoYXMgaXRzCiAgb3duIEFQSSB3aGljaCBkaWZmZXJzIGZyb20gdGhlIFBPU0lYIG9uZS4gRGFuaWVsIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gZGV0ZWN0IHRoZSB2ZXJzaW9uIGluIHVzZSwgYW5kIHRoZSBjb2RlIG5vdyB1c2VzIHRoZSBuZXcgZGVmaW5lcwogIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBzb21lIGJ1aWxkIGZsYXdzIHdpdGggdGhlIG5ldyBsaWIvY3VybF9zdHJlcnJvci5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyNCBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4IHRvIHJlcGxhY2UgdGhlIGJhZCB1c2Ugb2Ygc3RyZXJyb3IoKS4gVGhpcyBpbnRyb2R1Y2VzCiAgQ3VybF9zdHJlcnJvcigpIHRoYXQgYXR0ZW1wdHMgdG8gYmUgdGhyZWFkLXNhZmUgX2FuZF8gd29ya3Mgb24gV2luZG93cyB0b28hCgotIFRvciBBcm50c2VuIHNwZWxsLWZpeGVkIGxvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMuCgotIFRvciBBcm50c2VuIG1hZGUgdGVzdGN1cmwucGwgd29yayB3aXRoIG9sZGVyIHBlcmwgNSB2ZXJzaW9ucywgYW5kIERhbmllbAogIG1hZGUgaXQgbm90IHVzZSBjaGRpciAuLiB0byBnbyBiYWNrLCBhcyB0aGF0IGlzbid0IHZlcnkgZ29vZCB3aGVuIHlvdSd2ZQogIHNldHVwIGEgdGVzdGRpciBjb250YWluaW5nIHN5bWxpbmtzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDQpCi0gQWRkZWQgR3JlZyBIZXdnaWxsJ3MgdGVzdGN1cmwucGwgc2NyaXB0IHRvIENWUy4gV2UgaGF2ZSBub3QgbW92ZWQgb3ZlciB0bwogIHVzZSB0aGlzIHNjcmlwdCBmb3IgdGhlIHJlYWwgZGlzdHJpYnV0ZWQgdGVzdGluZyBqdXN0IHlldCwgYnV0IGl0IGlzIG9ubHkKICBhIG1hdHRlciBvZiB0aW1lLgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgbWFrZXMgY3VybCByZXBvcnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogIGlmIC0taW50ZXJmYWNlIGZhaWxzIG9uIHdpbmRvd3MuCgotIFRoZSByZWd1bGFyIHByb2dyZXNzIG1ldGVyIGlzIG5vdyBmaXhlZCB0byBuZXZlciB3cmFwIGR1ZSB0byBsb25nIGxpbmVzLiBBbGwKICBmaWVsZHMgYXJlIG5vdyBzdGF0aWMgc2l6ZWQuIElmIHRoZSB0aW1lIGluIHRoZSB0aW1lIGZpZWxkcyBnZXQgYSB0aW1lIHZhbHVlCiAgdGhhdCB3b3VsZCByZXByZXNlbnQgYSB0aW1lIHRoYXQgaXMgMTAwIGhvdXJzIG9yIG1vcmUgKGlmIG5vdCwgaXQgcmVtYWlucwogIHVzaW5nIGEgSEg6TU06U1MgZGlzcGxheSksIGl0IHN3aXRjaGVzIGZpcnN0IHRvIGEgIk5OTmQgTk5oIiBkaXNwbGF5IChmb3IKICBkYXlzIGFuZCBob3VycykgYW5kIGlmIHRoYXQgaXNuJ3QgZW5vdWdoIGl0IHN3aXRjaGVzIHRvIGEgIk5OTmQiIGRpc3BsYXkgaWYKICBpdCBpcyBtb3JlIHRoYW4gOTk5IGRheXMuCgogIFNldmVyYWwgb2YgdGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGFsc28gbW92ZWQgdG8gZml4ZWQtcG9pbnQgbWF0aCBpbnN0ZWFkIG9mCiAgdXNpbmcgZG91Ymxlcy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwNCkKLSBHbGVuIE5ha2FtdXJhIG5vdGljZWQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgZGlkbid0IHdvcmsgYXMgaXQKICB1c2VkIHRvIGRvIGlmIENVUkxPUFRfTk9CT0RZIGlzIHNldCBUUlVFLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIG1ha2VmaWxlIGFuZCBSRUFETUUgdG8gYWRqdXN0IHRvCiAgbmV3IGN5Z3dpbiBwYWNrYWdpbmcgZ3VpZGVsaW5lcy4KCi0gRW5hYmxlZCAiTlQgcmVzcG9uc2VzIiBpbiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbi4gRG9pbmcgdGhpcyBzaW1wbHkgbWVhbnMKICB0aGF0IHdlIHByb3ZpZGUgYW4gZXh0cmEgY2h1bmsgb2YgZGF0YSBpbiBlYWNoICJ0eXBlLTMgbWVzc2FnZSIuIFRoZSBvbmx5CiAgcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXQgaXQgc2VlbXMgdGhhdCB1c2luZyBvbmx5IHRoZSAiTGFubWFuYWdlciBoYXNoIgogIChhcyB3ZSd2ZSBiZWVuIGRvaW5nIHVudGlsIG5vdykgZG9lc24ndCBzdXBwb3J0IHBhc3N3b3JkcyBsb25nZXIgdGhhbiAxNAogIGNoYXJhY3RlcnMgYW5kIGl0IHR1cm5zIG91dCB0aGVyZSBhcmUgdXNlcnMgb3V0IHRoZXJlIHdobyB3YW50IHRvIHVzZQogIGxpYmN1cmwgYW5kIE5UTE0gd2l0aCBzdWNoIHBhc3N3b3JkcyEgOy0pIFNldmVuIE5UTE0tcmVsYXRlZCB0ZXN0IGNhc2VzIHdlcmUKICB1cGRhdGVkIGFjY29yZGluZ2x5LiBNZW50aW9uZWQgYXMgaXNzdWUgMjkgaW4gVE9ETy1SRUxFQVNFLCBidWcgcmVwb3J0CiAgIzkxNTYwOQoKLSBNb3ZlZCB0aGUgZ2VuZXJhdGVkIGxpYmN1cmwgdmVyc2lvbiBpbmZvIHRvIGEgbmV3IGhlYWRlciBmaWxlLCBuYW1lZAogIGN1cmwvY3VybHZlci5oLiBOb3cgaW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiBpbmNsdWRlIE9OTFkgdmVyc2lvbiBpbmZvLCBzaG91bGQKICBhbnlvbmUgd2FudCB0aGF0IChhbmQgaXQgc2VlbXMgYXQgbGVhc3Qgc29tZSB3aW5kb3dzIHJlc291cmNlIGZpbGVzIHdvdWxkKS4KICBNZW50aW9uZWQgYXMgaXNzdWUgMjcgaW4gVE9ETy1SRUxFQVNFLgoKRGFuaWVsICgyMSBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSByb290IE1ha2VmaWxlIHRvIHVzZSB0YWJzIGZvciB0aGUgbmV0d2FyZSB0YXJnZXQuIEf8bnRlciBLbmF1ZgogIHBvaW50ZWQgdGhpcyBvdXQuCgotIE1hcnR5IEt1aHJ0J3MgVk1TIGNsZWFudXAKCi0gVGhvbWFzIFNjaHdpbmdlIG1hZGUgYnVpbGRjb25mIHJlY29nbml6ZSBBQ0xPQ0FMX0ZMQUdTIHRvIGludm9rZSBhY2xvY2FsCiAgd2l0aCBwYXJ0aWN1bGFyIHByZS1kZXRlcm1pbmVkIG9wdGlvbnMuCgpWZXJzaW9uIDcuMTEuMSAoMTkgTWFyY2ggMjAwNCkKCkRhbmllbCAoMTggTWFyY2ggMjAwNCkKLSBUb3IgQXJudHNlbiBicm91Z2h0IHNvbWUgaW5mbyBhYm91dCBTR0kgSVJJWDoKCiAgSVJJWCBzdXBwb3J0cyAzIGRpZmZlcmVudCBleGVjdXRhYmxlL29iamVjdCBmb3JtYXRzLCAtMzIsIC1uMzIgYW5kIC02NC4KICAtbjMyIGlzIGRlZmF1bHQgMzItYml0IGZvcm1hdCwgLTMyIGlzIHRoZSAib2xkIiAzMi1iaXQgZm9ybWF0LCBhbmQgLTY0IGlzCiAgdGhlIDY0LWJpdCBmb3JtYXQuICBMaWJyYXJpZXMgZm9yIHRoZSBkaWZmZXJlbnQgZm9ybWF0cyBhcmUgaW4gbGliLCBsaWIzMgogIGFuZCBsaWI2NCByZXNwZWN0aXZlbHkuCgogIFdlJ3ZlIG5vdyBhZGp1c3RlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhZGFwdCB0byB0aGlzIHdoZW4gc2Nhbm5pbmcgZm9yCiAgM3JkIHBhcnR5IGxpYnMsIHN1Y2ggYXMgT3BlblNTTC4KCkRhbmllbCAoMTcgTWFyY2ggMjAwNCkKLSBXYXR6IHBvaW50ZWQgb3V0IGEgZmV3IG1pc3NpbmcgZmlsZXMgaW4gdGhlIE1TVkMgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlLgoKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzLCBjb2RlIGFuZCBtYWtlZmlsZXMgdG8gYnVpbGQgY3VybCBvbiBOb3ZlbGwKICBOZXRXYXJlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA0KQotIExvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMgd2VyZSB1cGRhdGVkIHRvIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBtYW4KICBwYWdlcyB0aGUgcmVjb2duaXplZCB3YXkgc28gdGhhdCB0aGV5IGFwcGVhciBhcyBuaWNlIGh5cGVybGlua3MgaW4gdGhlIEhUTUwKICB2ZXJzaW9ucy4KCi0gYnVpbGRjb25mIG5vdyBjaGVja3MgdGhlIG00IHZlcnNpb24gdG9vLCBzaW5jZSBhdXRvY29uZiByZXF1aXJlcyBhIEdOVSBtNAogIHZlcnNpb24gdG8gYnVpbGQgcHJvcGVyIGNvbmZpZ3VyZSBzY3JpcHRzLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxPUFRfUE9TVEZJRUxEU0laRV9MQVJHRSwgdGhlIGxhcmdlIGZpbGUgdmVyc2lvbiBvZgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byBhbGxvdyBQT1NUcyBsYXJnZXIgdGhhbiAyR0IuCgotIERhdmlkIEJ5cm9uIGZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2FzZS9jcmFzaC4KCkRhbmllbCAoMTAgTWFyY2ggMjAwNCkKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgU1NMIGNvbm5lY3Rpb24gdG8gZGVhbCB3aXRoIHJlY2VpdmVkIHNpZ25hbHMgZHVyaW5nIHRoZQogIGNvbm5lY3QuCgotIENoYW5nZWQgdGhlIE9TIHN0cmluZyBmb3Igd2luMzIgdG8gYmVjb21lICJpMzg2LXBjLXdpbjMyIi4KCkRhbmllbCAoOSBNYXJjaCAyMDA0KQotIENoYW5nZWQgdGhlIGludGVybmFscyB0byB1c2UgY3VybF9zb2NrZXRfdCBmb3Igc29ja2V0IHZhcmlhYmxlIHR5cGUuIFRoaXMKICBzaG91bGQgZW5hYmxlIHVzIHRvIGJ1aWxkIHdpdGggbGVzcyB3YXJuaW5ncyBvbiBXaW5kb3dzLCB3aGVyZSBTT0NLRVQgaXMKICB1c2VkIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGludCwgd2hpbGUgbW9zdCBvdGhlciBwbGF0Zm9ybXMgdXNlIGEgbWVyZSBpbnQuCgotIE1vZGlmaWVkIGxpYi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIG9uIE1TVkMgYWdhaW4uCgpWZXJzaW9uIDcuMTEuMS1wcmUxICg4IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDggTWFyY2ggMjAwNCkKLSBNaW5vciBmaXggdG8gbWFrZSBjdXJsIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgaXMgb25seSBzZXQgaWYgY3VybF9vZmZfdCBpcwogIGxhcmdlciB0aGFuIDQgYnl0ZXMuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJbXByb3ZlZCBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uLCB0aGUgc28gY2FsbGVkIGlzc3VlIDEyLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBIVFRQIHNlcnZlciBhIGxvdCB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIGNoYW5nZXMgZm9yCiAgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiAobGlrZSB0ZXN0IGNhc2UgODgpLiBBZGRlZCBBbmRy6XMKICBHYXJj7WEncyB3aW4zMi1jaGFuZ2VzLiBJbXByb3ZlZCB0aGUgbG9nZ2luZy4KCi0gRml4ZWQgdGhlIGZpbGU6LXJlbGF0ZWQgcHJvZ3Jlc3MvZ2V0aW5mbyBzdHVmZiBhIGJpdCBtb3JlLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSSBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOgogIGhlYWRlciBvciB3aGVuIGRvaW5nIG11bHRpcGxlLXJlcXVlc3QgYXV0aGVudGljYXRpb25zLiBBIHN1YnNlcXVlbnQgcmVxdWVzdAogIGNvdWxkIGVycm9uZW91c2x5IHJlLXVzZSBhIHByZXZpb3VzIGNvbm5lY3Rpb24gdGhhdCB3YXMgc2VudCB3aXRoCiAgQ29ubmVjdGlvbjogY2xvc2UuIENocmlzdG9waGVyIFIuIFBhbG1lciByZXBvcnRlZC4KCi0gQW5kculzIEdhcmPtYSBwYXRjaGVkIGN1cmwgdG8gcHJldmVudCB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcgd2l0aCBtaW5ndywKICBtYWlubHkgYmVjYXVzZSBpdCBpcyBub3cgcG9zc2libGUgdG8gaGF2ZSBib3RoIFdJTjMyIGFuZCBIQVZFX0NPTkZJR19ICiAgZGVmaW5lZC4KCi0gV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgZnJvbSBhIGZpbGU6IFVSTCwgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBvdGhlcgogIHRyYW5zZmVyIG1ldHJpY3Mgd2VyZSBub3QgdXBkYXRlZCBwcm9wZXJseS4KCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSAidmVyc2lvbiByZXNvdXJjZSIgZmlsZSB0byB0aGUgY3VybCBleGVjdXRhYmxlIGZvcgogIHRoZSB3aW5kb3dzIGJ1aWxkcy4KCkRhbmllbCAoMyBNYXJjaCAyMDA0KQotIERhdmlkIEJ5cm9uJ3Mgd29yayBvbiBtYWtpbmcgbGliY3VybCBvbmx5IHJlcXVpcmUgd2luc29jayAxLjEgb24gV2luZG93cwogIG1hY2hpbmVzLgoKLSBNb3JlIHZhcmlhYmxlIGNsZWFudXBzIGJhc2VkIG9uIGNvbXBpbGVyIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBUb3IgQXJudHNlbidzCiAgYXV0b2J1aWxkcyB3aXRoIE1JUFNQcm8uCgotIEpvZSBIYWxwaW4gaGVscGVkIHVzIGZpeCBzb21lIHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzIG9uIEZyZWVCU0QuCgotIEFwcGxpZWQgVG9tIEJhdGVzJyBwYXRjaCB0byBidWlsZCBvbiBuc3ItdGFuZGVtLW5zay4KCi0gRGFuIEZhbmRyaWNoIGNvcnJlY3RlZCBzb21lIGZsYXdzIGluIHRoZSBjb25maWd1cmUgR1NTIGRldGVjdGlvbi4KCkRhbmllbCAoMiBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSBsaWJjdXJsIGNvZGUgdG8gdXNlIEZPUk1BVF9PRkZfVCBmb3IgcHJpbnRmKCkgZm9ybWF0dGluZwogIGN1cmxfb2ZmX3QgdHlwZXMgaW50ZXJuYWxseS4KCkRhbmllbCAoMSBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgYXMgYSBmZWF0dXJlLWJpdCBpbiB0aGUgY3VybF92ZXJzaW9uX2luZm8oKQogIHJlc3BvbnNlLCB0aGF0IHNpZ25hbHMgaWYgdGhpcyBsaWJjdXJsIHN1cHBvcnRzID4yR0IgZmlsZXMuIGN1cmwgLVYgbm93CiAgb3V0cHV0cyAnTGFyZ2VmaWxlJyBpbiB0aGUgRmVhdHVyZXM6IGZpZWxkIGlmIHRoaXMgaXMgdGhlIGNhc2UuIE1vc3Qgc3lzdGVtcwogIGFyZSBsaWtlbHkgdG8gc3VwcG9ydCB0aGlzLgoKLSBXZSBvZmZlciBhIENVUkxfRk9STUFUX09GRl9UIGRlZmluZSBpbiB0aGUgcHVibGljIGhlYWRlciwgd2hpY2ggY2FuIGJlIHVzZWQKICB0byBwcmludGYoKSBjdXJsX29mZl90IHZhcmlhYmxlcy4gV2UgYWxzbyBtb2RpZmllZCB0aGUgbGliY3VybCBzb3VyY2VzIHRvCiAgdXNlIHRoaXMgZGVmaW5lIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICVPZCBhcHByb2FjaCAoYWx0aG91Z2ggSSd2ZSBsZWZ0IHRoZQogIE8tZmxhZyBmdW5jdGlvbmFsIGluIHRoZSBjb2RlKS4gVGhpcyBzaG91bGQgYWxzbyBwcmV2ZW50IGNvbXBpbGVycyB0byB3YXJuCiAgb24gdGhlIGhvbWUtZ3Jvd24gb3B0aW9uLgoKLSBGaXhlZCB0aGUgcmVzdW1lLWNoZWNrIGNvZGUgdG8gdGVzdCBmb3IgYSB3b3JraW5nIHJlc3VtZSBhdCB0aGUgZW5kIG9mIHRoZQogIGhlYWRlcnMgYW5kIG5vdCBhdCB0aGUgZmlyc3QgYm9keS1ieXRlLgoKLSBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiBTdG9wIHVzaW5nIGl0LiBJZgogIHlvdSBuZWVkIGEgZ2xvYmFsIEROUyBjYWNoZSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB1c2UgdGhlIHNoYXJlIGludGVyZmFjZSBhbmQKICB5b3UnbGwgZ2V0IGEgZ2xvYmFsIGNhY2hlIHRoYXQgd29ya3MgdGhlIHdheSBpdCBzaG91bGQgd29yay4gWW91IGNhbiBldmVuCiAgaGF2ZSBhbnkgbnVtYmVyIG9mIGdsb2JhbCBjYWNoZXMsIGFsbCBhdCB5b3VyIGNvbW1hbmQuIFRoaXMgaXMgbm93IGFsc28KICBtZW50aW9uZWQgaW4gdGhlIGRvY3MuCgotIE1hZGUgdGhlICpwcmludGYgY29kZSBzdXBwb3J0IHRoZSB6LWZsYWcgdG8gZW5hYmxlIHNpemVfdCBwcmludGYoKSBpbiBhCiAgbWFubmVyIHNpbWlsYXIgdG8gaG93IGdsaWJjIGFsbG93cyBpdC4gVG8gbWFrZSBwcmludGZpbmcgb2YgdGhpcyB3b3JrIG9uCiAgcGxhdGZvcm1zIHdpdGggNjRiaXQgc2l6ZV90IGFuZCAzMmJpdCBpbnRzLiBJZiB0aGVyZSBldmVuIGFyZSBhbnkhIDstKQoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QgYW5kCiAgQ1VSTEFVVEhfTlRMTSAob3IgQ1VSTEFVVEhfQU5ZIGFuZCBsaWJjdXJsIHRoZW4gcGlja2VkIE5UTE0pLCBsaWJjdXJsIHdvdWxkCiAgbG9vcCB3aXRob3V0IHN1Y2NlZWRpbmcgdG8gYXV0aGVudGljYXRlIGR1ZSB0byB0aGUgbmV3IGNvbm5lY3Rpb24gdGhhdCB3YXMKICBtYWRlIGZvciBhbGwgcm91bmQtdHJpcHMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uLiBOb3csIHRoZSBGUkVTSF9DT05ORUNUIGlzCiAgcmVtYWRlIHRvIG9ubHkgbWF0dGVyIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvbiBtYWRlIHdpdGggY3VybF9lYXN5X3BlcmZvcm0oKQogIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBtaWdodCBmb2xsb3cgZHVlIHRvIEZPTExPV0xPQ0FUSU9OIG9yIEhUVFAKICBhdXRoZW50aWNhdGlvbiBhcmUgbm93IGlnbm9yaW5nIHRoYXQgb3B0aW9uLgoKLSBBZGp1c3RlZCB0aGUgUVVJVCBjb2RlIHNsaWdodGx5IHNpbmNlIGl0IGNvdWxkIGNvcmUtZHVtcC4KCi0gQ29ycmVjdGVkIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBwcm92aWRlIGEgY29ycmVjdCBzaXplIHRvIHRoZQogICd2ZXJpZmllZHNlcnZlcicgcmVxdWVzdC4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNCkKLSBKb2UgSGFscGluIG1hZGUgdGhlIEZUUCBjb2RlIHNlbmQgUVVJVCBvbiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGJlZm9yZQogIGRpc2Nvbm5lY3RpbmcgdGhlIFRDUCBjb25uZWN0aW9uLiBUaGlzIGlzIHdoYXQgZ29vZC1iZWhhdmluZyBmdHAgY2xpZW50cwogIHNob3VsZCBkby4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiB1cGRhdGVkIHNldmVyYWwgZmlsZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTVNWQyA2LiBIZQogIGFsc28gYWRkZWQgdGhlICdidWlsZGNvbmYuYmF0JyB0aGF0IHdvcmtzIGxpa2UgdGhlICdidWlsZGNvbmYgKyBjb25maWd1cmUnCiAgY29tYm8gZG9lcyBvbiB1bml4ZXMuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG1lbWRlYnVnIHN0dWZmIHN1cHBvcnQgY2FsbG9jKCkgYXMgd2VsbC4KCi0gVG9yIEFybnRzZW4gcG9pbnRlZCBvdXQgdGhhdCB0ZXN0Y3VybC5zaCBuZWVkZWQgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQKICBmaWxlcyBpbiBvcmRlciB0byBoYXZlIHRoZW0gcmUtZ2VuZXJhdGVkIGluIGVhY2ggYnVpbGQuCgotIEFuZHkgU2VycGEgZm91bmQgb3V0IHRoYXQgdGhlIHNoYXJlIGludGVyZmFjZSBkaWQgbm90IGVuam95IGxpZmUgd2hlbiBub3QKICBoYXZpbmcgdGhlIGxvY2sgYW5kIHVubG9jayBjYWxsYmFja3Mgc2V0LCBldmVuIHRob3VnaCBkb2N1bWVudGVkIHRvIGJlCiAgT0suIEl0IHN0aWxsIGlzIE9LLCBhbmQgbm93IHRoZSBjb2RlIHdvbid0IHNlZ2ZhdWx0IGFueW1vcmUhCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHcmVnIEhld2dpbGwgSSBtb2RpZmllZCBob3cgbG9uZyBsb25nIGlzIHVzZWQgaW4gdGhlCiAgbXByaW50ZiBjb2RlLCBhcyB3ZSBjYW4gdXNlIGEgNjRiaXQgdHlwZSB3aXRoIE1TVkMgdGhhdCBpcyBhIGxvbmcgbG9uZwogIGVxdWl2YWxlbnQuIFRoaXMgY29ycmVjdHMgc29tZSB3ZWlyZCBsYXJnZSBmaWxlIGJlaGF2aW9ycyBvbiB3aW5kb3dzLgoKLSBUb3IgQXJudHNlbiBoZWxwZWQgbWUgd29yayBvdXQgLS1lbmFibGUtZGVidWcgdG8gd29yayBiZXR0ZXIgd2l0aCBkaWZmZXJlbnQKICB2ZXJzaW9ucyBvZiB0aGUgZ2NjIGFuZCBpY2MgY29tcGlsZXJzLgoKLSBBZGRlZCBDVVJMT1BUX1NIQVJFIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDQpCi0gQXBwbGllZCB0aGUgZmluYWwgcGllY2VzIG9mIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBicmluZ3MgYSB3b3JraW5nIG5hbWUKICByZXNvbHZlIHRpbWVvdXQgdG8gdGhlIHdpbmRvd3MgdmVyc2lvbnMgb2YgY3VybCEKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbidzIGZpeCB0byBhbGxvdyB0aGUgc3BlZWQtbGltaXQgbG9naWMgd29yayBldmVuIGlmIHlvdSBzZXQKICBsaW1pdC1yYXRlLiBJdCBkb2VzIHdvcmsgb24gdGhlIGV4cGVuc2Ugb2YgdGhlIHJhdGUgbGltaXRlci4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNCkKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgd2l0aCBnY2Mgbm93IGFsc28gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpY2MgY29tcGlsZXIKICAod2hpY2ggc29tZWhvdyBnZXRzIHRyZWF0ZWQgYXMgaWYgaXQgaXMgYSBnY2MpIHRvIHN0b3AgdXNpbmcgYWxsIHRoZSBnY2MKICBvcHRpb25zIHdpdGggaXQsIGFuZCB3ZSBhbHNvIHByb3ZpZGUgLWlzeXN0ZW0gb3B0aW9ucyBmb3IgZWFjaCBleHRyYSAtSQogIG9wdGlvbiB0aGUgY29uZmlndXJlIHNjcmlwdCBoYXMgZmlndXJlZCBvdXQgKGZvciBPcGVuU1NMLCBrZXJiZXJvcywgemxpYiwKICBIZWltZGFsIGV0YykuIFRoaXMgb2YgY291cnNlIHRvIHByZXZlbnQgd2FybmluZ3Mgb24gaGVhZGVycyB3ZSBkb24ndCBoYXZlCiAgY29udHJvbCBvZi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNCkKLSBEb3VnIFBvcnRlciBtYWRlIGxpYmN1cmwgdXNlIHRoZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSB0aGUKICBnZXRwd3VpZCByZXN1bHRzIHdoZW4gbG9va2luZyBmb3IgLm5ldHJjIGZpbGVzLgoKLSBJZiAnY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnJyBpcyB1c2VkIHdpdGggZ2NjLCBpdCBub3cgY2hlY2tzIHdoaWNoIGdjYwogIHZlcnNpb24gaXQgaXMgYW5kIHVzZXMgYXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBhcyBwb3NzaWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciB2ZXJzaW9uLgoKLSBDb2RlIHRoYXQgY2FuIGJlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCBpbiB0aGUgY3VybCBhcHAgaXMgbm93IG1hZGUgdG8gdXNlCiAgdGhlIGN1cmx4XyBwcmVmaXguIFRoZSBmaXJzdCBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUgbGlrZSB0aGlzIGlzIHRoZQogIGN1cmx4X3N0cnRvbGwoKSBmdW5jdGlvbi4gVGhpcyBpcyBtYWRlIHRvIGFsbG93IHRoZSBhcHAgdG8gdXNlIGV4aXN0aW5nIGNvZGUsCiAgYnV0IHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBsaWJjdXJsIEFQSS4gRnVydGhlciBleHBsYW5hdGlvbnMgcG9zdGVkIGhlcmU6CgogICAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA0LTAyLzAyMTUuaHRtbAoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGJ1aWxkY29uZiB0byBub3QgdXNlICJ3aGljaCIgYXMgQUlYIGFuZCBUcnU2NCBoYXZlIHdoYXQgaGF2ZSBiZWVuCiAgcmVmZXJyZWQgdG8gYXMgImhvcnJpYmx5IGJyb2tlbiAnd2hpY2gnIHByb2dyYW1zIi4KCi0gTWFkZSBzdXJlIGRucyBjYWNoZSB0aW1lb3V0IHNldCB0byAtMSByZWFsbHkgbWVhbnMgY2FjaGluZyBmb3JldmVyLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA0KQotIE1hZGUgaXQgcG9zc2libHkgdG8gYnVpbGQgYy1hcmVzIHdpdGggdGhlIGxpYmN1cmwgbWVtZGVidWcgc3lzdGVtIHRvIGJldHRlcgogIHRyYWNrIG1lbW9yeS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNCkKLSBXaGVuIHVzaW5nIGFyZXMsIHdlIG5vdyBpbml0aWFsaXplIHRoZSBhcmVzICdjaGFubmVsJyBpbiBjdXJsX2Vhc3lfaW5pdCgpCiAgYW5kIHJlLXVzZSB0aGF0IHNhbWUgaGFuZGxlIGR1cmluZyB0aGUgZW50aXJlIGN1cmwgaGFuZGxlJ3MgbGlmZS10aW1lLiBJdAogIGltcHJvdmVzIHBlcmZvcm1hbmNlLgoKLSBGaXhlZCBhIHByb2JsZW0gd2hlbiBkaXNwbGF5aW5nIHZlcmJvc2UgZm9yIGlwdjYtZW5hYmxlZCBsaWJjdXJscyBhbmQKICByZS11c2VkIGNvbm5lY3Rpb25zLiBQcm9ibGVtIHJlcG9ydGVkIGFuZCBmaXggdmVyaWZpZWQgYnkgR3JpZ29yeSBFbnRpbi4KCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIHZlcnNpb24tY2hlY2sgaW4gdGhlIFNPQ0tTNSBjb2RlLgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGEgY2FzZSB3aGVyZSBhIGhvc3QgY2FjaGUgZW50cnkgd2FzIG5vdCBmbGFnZ2VkIGluLXVzZSBwcm9wZXJseSB3aGVuIGEKICBjYWNoZWQgZW50cnkgd2FzIHVzZWQuCgotIEFuZHLpcyBHYXJj7WEncyBwYXRjaCB0aGF0IGNoZWNrcyBmb3Igd2lubW0gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzCiAgYXBwbGllZC4KCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNCkKLSBCZW4gR3JlZWFyJ3MgU09fQklORFRPREVWSUNFIHBhdGNoIGZvciB0aGUgYmluZGluZyBvZiB0aGUgbG9jYWwgZW5kIHRvIGEKICBzcGVjaWZpYyBuZXR3b3JrIGludGVyZmFjZS4KCi0gR3JlZyBIZXdnaWxsIGZvdW5kIG91dCB0aGF0IHRoZSB2YXJpYWJsZSBob2xkaW5nICdjb250ZW50bGVuZ3RoJyB3YXNuJ3QgYmlnCiAgZW5vdWdoIHRvIGhvbGQgYSBsYXJnZSBmaWxlIQoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIDY0Yml0LXJlbGF0ZWQgcHJvYmxlbSBpbiBkYXRlLXJlbGF0ZWQgY29kZSBpbiB0aGUgZnRwCiAgZGVwYXJ0bWVudCwgYW5kIHRoZXJlIHdhcyBhbm90aGVyIHBvdGVudGlhbCBwcm9ibGVtIGluIHRoZSBuYW1lIHJlc29sdmUgY29kZQogIHRvby4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNCkKLSBSZW1vdmVkIGEgZmV3IHZhcmlhYmxlcyB0aGF0IHdlcmUgb25seSBzZXQgYnV0IG5ldmVyIHVzZWQsIGFzIHNvbWUgY29tcGlsZXJzCiAgd2FybiBhYm91dCB0aGF0IGFuZCB3ZSBkbyBub3QgbGlrZSBjb21waWxlciB3YXJuaW5ncyEKCi0gUmVtb3ZlZCB0aGUgbmVlZCBmb3Igc3ltbGlua3MgaW4gdGhlIHRlc3RzL2RhdGEgZGlyZWN0b3J5IGlmIGN1cmwgaXMgYnVpbHQKICBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGUgJ21ha2UgdGVzdCcgaXMgdXNlZC4gVGhpcyB3YXMgZG9uZQogIGJ5IHByb3ZpZGluZyBhICJzb3VyY2UgZGlyIHBhdGgiIHRvIHRoZSBzY3JpcHRzL3NlcnZlcnMuCgotIE5vdywgaWYgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgZmluZCBhbiBucm9mZiB0b29sIG9yIGFuIG9wdGlvbiB0byBucm9mZgogIHRvIHVzZSB0byBjb252ZXJ0IG1hbiBwYWdlcyB3aXRoLCBpdCB3aWxsIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgYnVpbHQtaW4KICBtYW51YWwuCgotICdjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCcgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgYnVpbHQtaW4gbWFudWFsIGZyb20KICB0aGUgY3VybCBjb21tYW5kIHRvb2wuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgbWlub3Igc291cmNlIGVkaXQsIGFuZCBub3cKICBoZSBoYXMgbWFuYWdlZCB0byBnZXQgbXN5cy9taW5ndyB0byBydW4gY29uZmlndXJlIGFuZCB0aGVuIGJ1aWxkIQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGRlZmF1bHQgSFRUUCBBY2NlcHQ6IGhlYWRlciB3YXMgbW9kaWZpZWQgdG8gdGhlIG11Y2ggc2ltcGxlcgogICJBY2NlcHQ6ICovKiIuCgotIFAgUiBTY2hhZmZuZXIgdXBkYXRlZCB0aGUgY3VybC1zc2wgc3BlYyBmaWxlIGZvciBSUE1zLgoKLSBEb21pbmljayBNZWdsaW8gYnJvdWdodCBsb3RzIG9mIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzaGFyZSBpbnRlcmZhY2UncyBtYW4KICBwYWdlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBtaXNzaW5nLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCB3b3JrLWFyb3VuZCBhIGJ1ZyBpbiB0aGUKICBBSVg1IGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvKCkuIFRoaXMgbWFrZXMgdGhlIEZUUCBQT1JUIHN0dWZmIHdvcmsgb24KICBpcHY2LWVuYWJsZWQgQUlYIGJ1aWxkcy4KCi0gS2VuIFJhc3RhdHRlciBwcm92aWRlZCBwb3J0YWJpbGl0eSBmaXhlcyBmb3IgdGhlIGN1cmxndGsuYyBleGFtcGxlLCBhbmQgbm93CiAgaXQgcnVucyBvbiB3aW5kb3dzIHdpdGggR1RLIGFzIHdlbGwhCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBnZXRob3N0YnluYW1lKCkgZmluZSB3aGVuIHJ1bgogIHdpdGggbWluZ3cgb24gd2luZG93cy4KCi0gTW9kaWZpZWQgdGhlIGxkYXAgY29kZSB0byB1c2UgcHJvcGVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFsbCBvdmVyIChpbnN0ZWFkIG9mCiAgbWl4ZWQgZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMpIHRvIHdvcmstYXJvdW5kIHRoZSBwaWNreSBNSVBTUHJvIGNvbXBpbGVyCiAgd2FybmluZ3MuCgotIEEgY3VzdG9tIEhvc3Q6IGhlYWRlciBpcyBvbmx5IGNvbnNpZGVyZWQgaWYgdGhlIHJlcXVlc3QgaXMgbm90IG1hZGUgYnkKICBmb2xsb3dpbmcgYSBsb2NhdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBUaW0gQmFrZXIuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNCkKLSBUaGUgbGlieiBwYXJ0IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBvbmx5IHNldCB0aGUgdHdvIGxpYnotcmVsYXRlZAogIGRlZmluZSBIQVZFX1pMSUJfSCBhbmQgSEFWRV9MSUJaIGlmIGJvdGggdGhlIGxpYiBhbmQgdGhlIGhlYWRlciBpcyBmb3VuZC4KICBJZiBvbmUgaXMgbWlzc2luZywgbm9uZSBvZiB0aGUgZGVmaW5lcyBpcyBzZXQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIE1pbmd3IG1ha2VmaWxlcy4KCi0gTGVuIEtyYXVzZSByZXBvcnRlZCB0aGF0IGN1cmwgNy45LlggY291bGQgZG8gdXBsb2FkaW5nIGZyb20gc3RkaW4gd2l0aG91dAogIGRvaW5nIGNodW5rZWQgZW5jb2RpbmcsIHdoaWNoIGN1cnJlbnQgY3VybCBjYW5ub3QgZG8gZXZlbiBpZiB5b3UgZGlzYWJsZQogIHRoZSB0cmFuc2Zlci1lbmNvZGluZyBjaHVua2VkIGhlYWRlci4gTm93IGl0IGNhbiBhZ2FpbiwgYW5kIHRlc3QgY2FzZSA5OAogIHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVG9yIEFybnRzZW4gZml4ZWQgYSB3ZWlyZCBnZXRhZGRyaW5mbygpIHVzYWdlIGluIHRoZSBGVFAgY29kZSwgcHJldmVudGluZwogIHRoZSBpcHY2LWNvZGUgZm9yIFBPUlQgd29yayBvbiBBSVggNS4yLiBXZSBub3cgYWxzbyBwcm92aWRlIChiZXR0ZXIpIGVycm9yCiAgbWVzc2FnZXMgd2hlbiBiYWlsaW5nIG91dCBpbiB0aGUgdGhhdCBmdW5jdGlvbi4KCi0gVG9yIEFybnRzZW4gbm93IHByb3ZpZGVzIEFJWCBhbmQgSVJJWCAodXNpbmcgZ2NjLCB4bGMgYW5kIHRoZSBNSVBTUHJvCiAgY29tcGlsZXJzKSBhdXRvbWF0ZWQgYnVpbGQgbG9ncyAoaHR0cDovL2N1cmwuaGF4eC5zZS9hdXRvLykgYW5kIHdlJ3ZlIGZpeGVkCiAgbnVtZXJvdXMgbWlub3IgcXVpcmtzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyBhcHBlYXIuCgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpbGFkLCB3ZSBub3cgdXNlIHRoZSBjdXN0b20gdGltZW91dHMgd2hlbiB3YWl0aW5nIGZvciBhCiAgc2VydmVyIHRvIGNvbm5lY3Qgd2hlbiB1c2luZyBGVFAgUE9SVC4gUHJldmlvdXNseSB3ZSBhbHdheXMgd2FpdGVkIDEwCiAgc2Vjb25kcywgbm8gbW9yZSBubyBsZXNzLiBXZSBub3cgYWxzbyBjaGFuZ2VkIHRoZSBkZWZhdWx0IChpZiBubyB0aW1lb3V0IGlzCiAgc2V0KSB0byB3YWl0IDYwIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0IGJlZm9yZSB3ZSBmYWlsLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDQpCi0gTW9kaWZpZWQgdG8gbGluayB3aXRoIGMtYXJlcyBpbnN0ZWFkIG9mIGFyZXMuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSB0ZXN0IHRvIGNoZWNrIGZvciB3aGljaCBvcHRpb24gdGhlIChnKW5yb2ZmIHRvb2wgd2FudHMKICB0byBleHRyYWN0IHBsYWluIHRleHQgZnJvbSB0aGUgbWFuIHBhZ2VzLiBUb3IgQXJudHNlbiB0b2xkIHVzIHRoZSBBSVgKICB2ZXJzaW9uIG9mIEdOVSBnbnJvZmYgZG9lc24ndCBzdXBwb3J0IC1tYW4hCgotIEFkZGVkIGFuIHVuZGVmIG9mIGFjY2VwdCBpbiBtZW1kZWJ1Zy5oIHRvIG1ha2UgY3VybCBidWlsZCB3aXRoIC0tZW5hYmxlLWRlYnVnCiAgb24gQUlYIDUuMiB3aGljaCBzZWVtcyB0byBoYXZlIGFjY2VwdCBkZWZpbmVkLiBSZXBvcnRlZCBieSBUb3IgQXJudHNlbi4KCi0gY3VybF92ZXJzaW9uKCkgbm93IGluY2x1ZGVzIGMtYXJlcyB2ZXJzaW9uIGluZm8sIGFuZCBjdXJsX3ZlcnNpb25faW5mbygpIG5vdwogIHJldHVybnMgYSBzdHJ1Y3Qgd2l0aCB2ZXJzaW9uIFNFQ09ORCB0aGF0IGFsc28gaW5jbHVkZXMgdGhhdCBpbmZvLgoKLSBXZSBhcmUgbm93IG9mZmljaWFsbHkgdXNpbmcgYy1hcmVzIGZvciBhc3luY2ggbmFtZSByZXNvbHZlcy4gYy1hcmVzIGlzIHRoZQogIG5ldyBsaWJyYXJ5LCBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgYXJlcyBidXQgd2l0aCBhbiBleHRlbmRlZCBhbmQgc2xpZ2h0bHkKICBtb2RpZmllZCBBUEkuCgotIERpcmsgaW1wcm92ZWQgdGhlIGFyZXMgdGltZW91dCBjb2RlLCBhbmQgbm93IHdlIGFsc28gaW5jbHVkZSB0aGUgYXJlcyBlcnJvcgogIHN0cmluZyB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSBhIG5hbWUuCgotIEFub3RoZXIgdHdlYWsgdG8gbWFrZSB0ZXN0IGNhc2UgOTEgcnVuIGZpbmUuIE5vdyB3ZSBoYXZlIGFub3RoZXIgYml0IG9uIGEKICBjb25uZWN0aW9uIHRoYXQgaXMgc2V0IHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGZvciAncmV0cnknLiBUaGF0CiAgbWFrZXMgdGhlIGNvbm5lY3Rpb24gZ2V0IGNsb3NlZCBhbmQgcmUtb3BlbmVkIGFuZCB0aGUgSFRUUC1kb25lIGNvZGUgbXVzdAogIG5vdCBjb21wbGFpbiBvbiB0aGUgZmFjdCB0aGF0IG5vIGRhdGEgd2FzIHJlY2VpdmVkLgoKLSBCYXNlZCBvbiBEaXJrIE1hbnNrZSdzIHBhdGNoLCBJIG1vZGlmaWVkIHRoZSBuYW1lIHJlc29sdmluZyB3aXRoIGFyZXMgdG8KICBmZWF0dXJlIGEgdGltZW91dCBmb3IgcmVhbGx5IHNsb3cgbG9va3Vwcy4gSXQgbm93IGRlZmF1bHRzIHRvIDMwMCBzZWNvbmRzLAogIGJ1dCBpcyBub3cgYWRqdXN0ZWQgdG8gdGhlIENPTk5FQ1RUSU1FT1VUL1RJTU9VRSB0aW1lb3V0cyBpZiBvbmUgb2YgdGhlbQogIGlzIHNldC4KCi0gRml4ZWQgdGhlIGluY2x1c2lvbiBvZiBjYS1idW5kbGUuaCB0byByZWFsbHkgdXNlIHRoZSBvbmUgaW4gdGhlIGJ1aWxkIGRpcgogIGJlZm9yZSB0aGUgb25lIGluIHRoZSBzb3VyY2UgZGlyLiBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkLgoKLSBBZGRlZCB0ZXN0IGNhc2UgOTcsIGEgc2ltcGxlIFBPU1Qgd2l0aCBhIGN1c3RvbSBDb250ZW50LVR5cGUgaGVhZGVyCiAgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb25lLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDQpCi0gQWRkZWQgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGZpeCB0aGUgdGVzdCA5MSBmYWlsdXJlLiBBcyBoYXMgYmVlbiBmaWd1cmVkIG91dAogIGJ5IFBhdHJpY2sgU21pdGgsIHRoZSBlcnJvciBoYXBwZW5zIGJlY2F1c2Ugd2UgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHRoZQogIHNlcnZlciBpcyBqdXN0IGFib3V0IHRvIGNsb3NlIGFuZCB3ZSBldmVuIG1hbmFnZSB0byBzZW5kIGF3YXkgdGhlIHJlcXVlc3QKICB3aXRob3V0IHNlZWluZyBhbiBlcnJvci4gT24gdGhlIGZpcnN0IHJlYWQgYXR0ZW1wdCB3ZSBnZXQgYSBFQ09OTlJFU0VULgogIFN0YXJ0aW5nIG5vdywgd2UgYXR0ZW1wdCB0byBkZXRlY3QgdGhpcyBhbmQgaWYgc28sIHdlIHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEKICBmcmVzaCBjb25uZWN0aW9uLgoKLSBJIGFkZGVkIHRlc3QgY2FzZSA1MTAgd2hpY2ggaXMgYSBjdXN0b20gcHJvZ3JhbSB0aGF0IGRvZXMgYSBQT1NUIHVzaW5nIGEKICByZWFkIGNhbGxiYWNrLCB3aXRoIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuCgotIEFkanVzdGVkIG9uZSBvZiB0aGUgTVBFL2lYIGNoYW5nZXMgYXMgaXQgbWFkZSB0ZXN0IGNhc2UgNTA0IGZhaWwgYWxsIG92ZXIuCgotIEFkZGVkIC0tc29ja3MgYXMgYSByZWNvZ25pemVkIG9wdGlvbi4gSXQgd29ya3MganVzdCBsaWtlIC0tcHJveHkgYnV0IHNldHMgYQogIFNPQ0tTNSBwcm94eSB0byB1c2UuIFNPQ0tTNSBzdXBwb3J0IGhhcyBiZWVuIGF2YWlsYWJsZSBpbiBsaWJjdXJsIGZvciBhCiAgd2hpbGUsIGp1c3Qgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJsIHRvb2wuIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgZm9yCiAgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDQpCi0gU3RhZGxlciBTdGVwaGFuIHBvaW50ZWQgb3V0IHRoYXQgc3JjL2h1Z2VoZWxwLmMgaW5jbHVkZWQgY29uZmlnLmggd2l0aG91dAogIGNoZWNraW5nIHRoZSBkZWZpbmUgaWYgaXRzIHByZXNlbnQuLi4KCi0gS2VuIEhpcnNjaCBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIHRoZSBNUEUvaVggb3BlcmF0aW5nCiAgc3lzdGVtLgoKLSBEYW4gRmFuZHJpY2ggY29tcGlsZWQgY3VybCB3aXRoIGxvdHMgb2YgYWdncmVzc2l2ZWx5IHBlZGFudGljIGNvbXBpbGVyCiAgb3B0aW9ucyBhbmQgdGh1cyBmb3VuZCBhIGZldyBtaW5vciBlcnJvcnMgYW5kIGRpZCBzb21lIGdlbmVyYWwgY2xlYW51cHMgdG8KICBhdm9pZCB0aGVtLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIGZsYXcgaW4gYXJlcyB0aGF0IHByZXZlbnRlZCBpdCB0byB1c2Ugbm9uLWJsb2NraW5nCiAgc29ja2V0cyBwcm9wZXJseS4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA0KQotIFJpY2hhcmQgQnJhbWFudGUgZml4ZWQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGVkICJ1cGxvYWRzIiB0byBzZW5kIGEgZmluYWwKICBDUkxGIGNvbWJvIHByb3Blcmx5LgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDQpCi0gTWFkZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBkdXJpbmcgYSBDT05ORUNUIHJlcXVlc3QgdG8gYSBwcm94eSBnZXQgcGFzc2VkIG9uCiAgYXMgcmVndWxhciBoZWFkZXJzLCBzbyB0aGV5IGFwcGVhciB3aXRoIC1pLy1JIG9wdGlvbnMgYW5kIHNpbWlsYXIuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lzbGUgVmFuZW0sIEkndmUgbWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheQogIHByb3Blcmx5IHN3aXRjaCB0byBhIEdCLWRpc3BsYXkgd2hlbiBtb3JlIHRoYW4gOTk5OU1CIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gcG9pbnRlZCBvdXQgYSBjdXJscmMgcGFyc2VyIHByb2JsZW0vY3Jhc2ggd2hlbiBhbiBvcHRpb24gd2l0aCBhCiAgcmVxdWlyZWQgZGlkbid0IGhhdmUgb25lIGFuZCB3YXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUuCgotIE1vcmUgV2luZG93cyBmaXhlcyBmb3IgbGFyZ2UgZmlsZXMuIFdlIG5vdyBidWlsZCBhbmQgbGluayB3aXRoCiAgLi4vbGliL3N0cnRvb2ZmdC5jIGluIHRoZSBhcHAgY29kZSBzaW5jZSBDdXJsX3N0cnRvbGwoKSBpcyBub3QgYSBwcm92aWRlZAogIGxpYmN1cmwgZnVuY3Rpb24uLi4gUGVyaGFwcyB3ZSBzaG91bGQgY29uc2lkZXIgYSAnY29tbW9uJyBkaXIgb3Igc2ltaWxhcgogIHdoZXJlIHdlIHB1dCBzb3VyY2UgY29kZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgdGhlIGNsaWVudC4gT3IgcGVyaGFwcwogIHdlJ2xsIGp1c3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeS4uLgoKLSBWaW5jZW50IEJyb25uZXIgZm91bmQgb3V0IHRoZSBzb2NrczUgY29kZSBjcmFzaGVkIHdoZW4gbm8gdXNlcm5hbWUgd2FzCiAgc2V0LgoKLSBWaW5jZW50IEJyb25uZXIgc3BvdHRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSB1c2VybmFtZS9wYXNzd29yZCB3aGVuIHJlLXVzaW5nCiAgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCgotIEZpeGVkIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5IGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzLiBHaXNsZQogIFZhbmVtIHJlcG9ydGVkLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSBzdHJ0b2xsKCkgZ2V0IHVzZWQgd2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggdGhlIG1pbmd3CiAgY29tcGlsZXIuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjb21wcmVzc2VkIGhlbHAgdGV4dCBjb2RlIHRvIGRpc3BsYXkgcHJvcGVybHkuCgotIFJlbW92ZWQgdGhlICcjZGVmaW5lIEh0dHBQb3N0JyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIGFzIGN1cmxfaHR0cHBvc3QKICBpcyB0aGUgcHJvcGVyIG5hbWUgYW5kIGl0IGhhcyBiZWVuIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LiBGaXhlcyBhbm90aGVyCiAgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgotIEFkZGVkICdjdXJsX29mZl90JyB0eXBlZGVmIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIHRvIGJlIHVzZWQgdG8gcHJvdmlkZQogIGxhcmdlIGZpbGUgc2l6ZXMgdG8gdGhlICpfTEFSR0Ugb3B0aW9ucy4gQWRqdXN0ZWQgdGhlIGNvZGUgYWxsIG92ZXIgdG8gdXNlCiAgdGhpcyB2YXJpYWJsZSB0eXBlIGluc3RlYWQgb2YgJ29mZl90Jy4gVGhpcyBpcyBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxhcmdlCiAgZmlsZSBzdXBwb3J0IHdvcmsgb24gbW9yZSBwbGF0Zm9ybXMuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgdGhlCiAgc2l6ZSBvZiB0aGUgY3VybF9vZmZfdCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBvZmZfdC4KClZlcnNpb24gNy4xMS4wICgyMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNCkKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgd2l0aCBUSU1FQ09ORF8gcHJlZml4ZXMuIFRoZXkKICBoYXZlIGJlZW4gb2Jzb2xldGUgc2luY2UgQXByaWwgMjJuZCAyMDAyLCBhbmQgaWYgdGhpcyBjYXVzZXMgYW55b25lIGFueQogIHByb2JsZW1zIG5vdyBpdCBpcyB2ZXJ5IGVhc3kgdG8ganVzdCBhZGQgQ1VSTF8gdG8gdGhlIG5hbWVzLiBUaGlzIGNvcnJlY3RzCiAgdGhpcyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIGNsZWFuZWQgdXAgaG93IC0tdHJhY2Ugd2l0aCBubyBvcHRpb24gd2FzIHRyZWF0ZWQsIGFuZCBhbHNvCiAgYXJndW1lbnRzIGluIGEgY29uZmlnIGZpbGUgd2l0aG91dCBhIHJlcXVpcmVkIHBhcmFtZXRlciEKCkRhbmllbCAoMTYgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgZmV3IGlzc3VlcyB3aGVyZSBjb21waWxlcnMgd2FybmVkIGFib3V0IHZhcmlhYmxlcwogIHBvc3NpYmx5IGJlaW5nIHVzZWQgdW5hc3NpZ25lZC4KCi0gTWlub3IgSW50ZXJpeCBidWlsZCBwcm9ibGVtIGZpeGVkLgoKRGFuaWVsICgxNSBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHNvbWUgbmVjZXNzYXJ5IGVzY2FwaW5nIG5lZWRlZCBpbiB0aGUKICBhY2luY2x1ZGUubTQgZmlsZSB3aGVuIGF1dG9tYWtlIDEuOCBvciBsYXRlciBpcyB1c2VkLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDQpCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBDdXJsX3Jlc29sdigpIHJldHVybiBjb2RlLiBUaGlzIGV4dGVuZHMgdGhlIGZpeAogIFN0ZXZlIEdyZWVuIHByb3ZpZGVkIG9uIGRlY2VtYmVyIDMuLi4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA0KQotIEx1a2UgQ2FsbCBtYWRlIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgZnVuY3Rpb24gc3VwcG9ydAogIGJhY2tzcGFjZS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBodWdlaGVscCBzb3VyY2UgZmlsZSB0byBjb250YWluIGJvdGggYSBjb21wcmVzc2VkIGFuZAogIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIGluIHRoZSBkaXN0cmlidXRpb24sIHNvIHRoYXQgbW9yZSBwZW9wbGUgZWFzaWVyIGNhbgogIGJ1aWxkIGN1cmwgd2l0aCB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uLgoKLSBEaWVnbyBDYXNvcnJhbiBicm91Z2h0IGFub3RoZXIgQW1pZ2FPUyBidWlsZCBwYXRjaCBmb3IgbmF0aXZlIEFtaWdhIGJ1aWxkcy4KCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBNYWMgT1MgWCBmcmFtZXdvcmsgZmlsZXMuCgotIEJyaWFuIFIgRHVmZnkgYnJvdWdodCBhIHNlY3Rpb24gdG8gdGhlIElOU1RBTEwgZmlsZSBvbiBob3cgdG8gYnVpbGQgYQogIFNTTC1lbmFibGVkIGN1cmwgdXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tcGlsZXIuIEhlIGFsc28gdXBkYXRlZCB0aGUKICBCb3JsYW5kIGxpYi9NYWtlZmlsZS5iMzIuCgotIEkgZml4ZWQgdGhlIHRlc3QgY2FzZSA1MDkgd2hpY2ggSSBicm9rZSB5ZXN0ZXJkYXkuIE5vdyB0aGUgbGlidGVzdCBhcmUKICBjb21waWxlZCB3aXRoIGFuIGluY2x1ZGUgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgbGlicmFyeSdzIHNvdXJjZSBkaXIsIHNvCiAgdGhhdCB0aGUgbGlidGVzdHMgY2FuIGluY2x1ZGUgZmlsZXMgZnJvbSB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIG1hZGUgdG8KICBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgVVNFX1NTTEVBWSBkZWZpbmUgaW4gdGhlIGxpYnJhcnkgdGVzdCBmaWxlcy4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBicm91Z2h0IGNvZGUgdGhhdCBub3cgYWxsb3dzIGEgY2FsbGJhY2sgdG8gbW9kaWZpZWQgdGhlIFVSTAogIGV2ZW4gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBzaW11bGF0ZSBhCiAgImZvbGxvdyBsb2NhdGlvbiIgdG8gdGhhdCBuZXcgVVJMLiBUZXN0IDUwOSB3YXMgYWRkZWQgdG8gdGVzdCB0aGlzIGZlYXR1cmUuCgotIEV4dGVuZGVkIHRoZSB0aW1lIHdlIHJldHJ5IHNlcnZlcnMgaW4gdGhlIHRlc3Qgc2NyaXB0LCBhbmQgSSBhbHNvIG1hZGUgaXQKICByZXRyeSB0aGUgaHR0cHMgYW5kIGZ0cHMgc2VydmVycyBiZWZvcmUgdGhleSBhcmUgY29uc2lkZXJlZCBiYWQuIEkgYmVsaWV2ZQogIHRoZSBwcmV2aW91cyBhcHByb2FjaCBjb3VsZCB0dXJuIHByb2JsZW1hdGljIG9uIHJlYWxseSBzbG93IGhvc3RzLgoKVmVyc2lvbiA3LjExLjAtcHJlMSAoMTIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDQpCi0gRG9taW5pY2sgTWVnbGlvIHBvaW50ZWQgb3V0IEZUUFMgc2hvdWxkIHVzZSBkZWZhdWx0IHBvcnQgOTkwIGFjY29yZGluZyB0bwogIElBTkEuCgpEYW5pZWwgKDggSmFudWFyeSAyMDA0KQotIEZpeGVkIHRoZSBTUE5FR08gY29uZmlndXJlIGNoZWNrIHRvIG5vdCB1c2UgLVIgb3Igb3RoZXIgbm9uLXBvcnRhYmxlIG9wdGlvbnMKICBpbiB0aGUgTERGTEFHUy4gUmVwb3J0ZWQgYnkgUGllcnJlIGluIGJ1ZyByZXBvcnQgIzg3MjkzMC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDQpCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgZml4IG9uIG91ciB6bGliIHVzYWdlLgoKLSBEYXZpZCBKIE1leWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2UgbGFyZ2UgZmlsZSBzdXBwb3J0IHRvIGxpYmN1cmwgd2FzCiAgYXBwbGllZC4gTmV3IGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyB0aGF0IGFjY2VwdCAnb2ZmX3QnIGFyZ3VtZW50cyBhcmU6CgogIElORklMRVNJWkVfTEFSR0UKICBSRVNVTUVfRlJPTV9MQVJHRQogIE1BWEZJTEVTSVpFX0xBUkdFCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA0KQotIEJhc2VkIG9uIERvbWluaWNrIE1lZ2xpbydzIGNvbW1lbnRzLCBJIG1hZGUgb3VyIHByaXZhdGUgdmVyc2lvbiBvZgogIGdldHRpbWVvZmRheSgpIGRlY2xhcmVkIHN0YXRpYy4gVGhpcyB3b3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIHRoZSBzYW1lCiAgZnVuY3Rpb24gaW4gb3RoZXIgbGlicyAobGlrZSBhcmVzIGZvciBleGFtcGxlKS4KCi0gQWRkZWQgRG9taW5pY2sgTWVnbGlvJ3MgZGVzY3JpcHRpb24gb24gaG93IHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBhcmVzCiAgb24gd2luMzIuCg==