V2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTA/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29yZQoKLSBUaGUgVVRGLTE2IGNvZGVjIHdhcyBtb2RpZmllZCB0byBiZSBtb3JlIFJGQyBjb21wbGlhbnQuIEl0IHdpbGwgbm93CiAgb25seSByZW1vdmUgQk9NIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgYW5kIHRoZW4KICBvbmx5IGlmIHJ1bm5pbmcgaW4gbmF0aXZlIG1vZGUgKFVURi0xNi1MRSBhbmQgLUJFIHdvbid0IHJlbW92ZSBhCiAgbGVhZGluZyBCTU8gY2hhcmFjdGVyKS4KCi0gU3RyaW5ncyBub3cgaGF2ZSBhIG5ldyBtZXRob2QgLmRlY29kZSgpIHRvIGNvbXBsZW1lbnQgdGhlIGFscmVhZHkKICBleGlzdGluZyAuZW5jb2RlKCkgbWV0aG9kLiBUaGVzZSB0d28gbWV0aG9kcyBwcm92aWRlIGRpcmVjdCBhY2Nlc3MKICB0byB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgb2YgdGhlIHJlZ2lzdGVyZWQgY29kZWNzLgoKICBUbyBlbmhhbmNlIHRoZSB1c2FiaWxpdHkgb2YgdGhlIC5lbmNvZGUoKSBtZXRob2QsIHRoZSBzcGVjaWFsCiAgY2FzaW5nIG9mIFVuaWNvZGUgb2JqZWN0IHJldHVybiB2YWx1ZXMgd2FzIGRyb3BwZWQgKFVuaWNvZGUgb2JqZWN0cwogIHdlcmUgYXV0by1tYWdpY2FsbHkgY29udmVydGVkIHRvIHN0cmluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCgogIEJvdGggbWV0aG9kcyB3aWxsIG5vdyByZXR1cm4gd2hhdGV2ZXIgdGhlIGNvZGVjIGluIGNoYXJnZSBvZiB0aGUKICByZXF1ZXN0ZWQgZW5jb2RpbmcgcmV0dXJucyBhcyBvYmplY3QsIGUuZy4gVW5pY29kZSBjb2RlY3Mgd2lsbAogIHJldHVybiBVbmljb2RlIG9iamVjdHMgd2hlbiBkZWNvZGluZyBpcyByZXF1ZXN0ZWQgKCLk9vwiLmRlY29kZSgibGF0aW4tMSIpCiAgd2lsbCByZXR1cm4gdSLk9vwiKS4gVGhpcyBlbmFibGVzIGNvZGVjIHdyaXRlciB0byBjcmVhdGUgY29kZWNzCiAgZm9yIHZhcmlvdXMgc2ltcGxlIHRvIHVzZSBjb252ZXJzaW9ucy4KCiAgTmV3IGNvZGVjcyB3ZXJlIGFkZGVkIHRvIGRlbW9uc3RyYXRlIHRoZXNlIG5ldyBmZWF0dXJlcyAodGhlIC5lbmNvZGUoKQogIGFuZCAuZGVjb2RlKCkgY29sdW1ucyBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0cyk6CgogIE5hbWUgICAgIHwgLmVuY29kZSgpIHwgLmRlY29kZSgpIHwgRGVzY3JpcHRpb24KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdXUgICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBVVSBjb2RlYyAoZS5nLiBmb3IgZW1haWwpCiAgYmFzZTY0ICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBiYXNlNjQgY29kZWMKICBxdW9wcmkgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHF1b3RlZC1wcmludGFibGUgY29kZWMKICB6bGliICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHpsaWIgY29tcHJlc3Npb24KICBoZXggICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IDItYnl0ZSBoZXggY29kZWMKICByb3QtMTMgICB8IHN0cmluZyAgICB8IFVuaWNvZGUgICB8IFJPVC0xMyBVbmljb2RlIGNoYXJtYXAgY29kZWMKCi0gU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBub3cgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBhIGRlZmF1bHQgVW5pY29kZQogIGVuY29kaW5nIGZvciBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLiAgTm90YWJseSwgV2luZG93cyBzdXBwb3J0cyAnbWJjcycKICBhcyB0aGUgZGVmYXVsdC4gIFRoZSBNYWNpbnRvc2ggd2lsbCBhbHNvIGFkb3B0IHRoaXMgY29uY2VwdCBpbiB0aGUgbWVkaXVtCiAgdGVybSwgYWx0aG91Z2ggdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoYXQgcGxhdGZvcm0gd2lsbCBiZSBvdGhlciB0aGFuCiAgJ21iY3MnLgoKICBPbiBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgc3VwcG9ydCBub24tQVNDSUkgZmlsZW5hbWVzLCBpdCBpcyBjb21tb24gZm9yCiAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZpbGVuYW1lcyAoc3VjaCBhcyBvcy5saXN0ZGlyKCkpIHRvIHJldHVybiBQeXRob24KICBzdHJpbmcgb2JqZWN0cyBwcmUtZW5jb2RlZCB1c2luZyB0aGUgZGVmYXVsdCBmaWxlIHN5c3RlbSBlbmNvZGluZyBmb3IKICB0aGUgcGxhdGZvcm0uICBBcyB0aGlzIGVuY29kaW5nIGlzIGxpa2VseSB0byBiZSBkaWZmZXJlbnQgZnJvbSBQeXRob24ncwogIGRlZmF1bHQgZW5jb2RpbmcsIGNvbnZlcnRpbmcgdGhpcyBuYW1lIHRvIGEgVW5pY29kZSBvYmplY3QgYmVmb3JlIHBhc3NpbmcKICBpdCBiYWNrIHRvIHRoZSBPcGVyYXRpbmcgU3lzdGVtIHdvdWxkIHJlc3VsdCBpbiBhIFVuaWNvZGUgZXJyb3IsIGFzIFB5dGhvbgogIHdvdWxkIGF0dGVtcHQgdG8gdXNlIGl0cyBkZWZhdWx0IGVuY29kaW5nIChnZW5lcmFsbHkgQVNDSUkpIHJhdGhlciB0aGFuCiAgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBmaWxlIHN5c3RlbS4KCiAgSW4gZ2VuZXJhbCwgdGhpcyBjaGFuZ2Ugc2ltcGx5IHJlbW92ZXMgc3VycHJpc2VzIHdoZW4gd29ya2luZyB3aXRoCiAgVW5pY29kZSBhbmQgdGhlIGZpbGUgc3lzdGVtLCBtYWtpbmcgdGhlc2Ugb3BlcmF0aW9ucyB3b3JrIGFzIHlvdSBleHBlY3QsCiAgaW5jcmVhc2luZyB0aGUgdHJhbnNwYXJlbmN5IG9mIFVuaWNvZGUgb2JqZWN0cyBpbiB0aGlzIGNvbnRleHQuCiAgU2VlIFs/Pz8/XSBmb3IgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgZXhhbXBsZXMuCgotIEZsb2F0IChhbmQgY29tcGxleCkgbGl0ZXJhbHMgaW4gc291cmNlIGNvZGUgd2VyZSBldmFsdWF0ZWQgdG8gZnVsbAogIHByZWNpc2lvbiBvbmx5IHdoZW4gcnVubmluZyBmcm9tIGEgLnB5IGZpbGU7IHRoZSBzYW1lIGNvZGUgbG9hZGVkIGZyb20gYQogIC5weWMgKG9yIC5weW8pIGZpbGUgY291bGQgc3VmZmVyIG51bWVyaWMgZGlmZmVyZW5jZXMgc3RhcnRpbmcgYXQgYWJvdXQgdGhlCiAgMTJ0aCBzaWduaWZpY2FudCBkZWNpbWFsIGRpZ2l0LiAgRm9yIGV4YW1wbGUsIG9uIGEgbWFjaGluZSB3aXRoIElFRUUtNzU0CiAgZmxvYXRpbmcgYXJpdGhtZXRpYywKCiAgICAgIHggPSA5MDA3MTk5MjU0NzQwOTkyLjAKICAgICAgcHJpbnQgbG9uZyh4KQoKICBwcmludGVkIDkwMDcxOTkyNTQ3NDA5OTIgaWYgcnVuIGRpcmVjdGx5IGZyb20gLnB5LCBidXQgOTAwNzE5OTI1NDc0MDAwMAogIGlmIGZyb20gYSBjb21waWxlZCAoLnB5YyBvciAucHlvKSBmaWxlLiAgVGhpcyB3YXMgZHVlIHRvIG1hcnNoYWwgdXNpbmcKICBzdHIoZmxvYXQpIGluc3RlYWQgb2YgcmVwcihmbG9hdCkgd2hlbiBidWlsZGluZyBjb2RlIG9iamVjdHMuICBtYXJzaGFsCiAgbm93IHVzZXMgcmVwcihmbG9hdCkgaW5zdGVhZCwgd2hpY2ggc2hvdWxkIHJlcHJvZHVjZSBmbG9hdHMgdG8gZnVsbAogIG1hY2hpbmUgcHJlY2lzaW9uIChhc3N1bWluZyB0aGUgcGxhdGZvcm0gQyBmbG9hdDwtPnN0cmluZyBJL08gY29udmVyc2lvbgogIGZ1bmN0aW9ucyBhcmUgb2YgZ29vZCBxdWFsaXR5KS4KCiAgVGhpcyBtYXkgY2F1c2UgZmxvYXRpbmctcG9pbnQgcmVzdWx0cyB0byBjaGFuZ2UgaW4gc29tZSBjYXNlcywgYW5kCiAgdXN1YWxseSBmb3IgdGhlIGJldHRlciwgYnV0IG1heSBhbHNvIGNhdXNlIG51bWVyaWNhbGx5IHVuc3RhYmxlCiAgYWxnb3JpdGhtcyB0byBicmVhay4KCi0gVGhlIGltcGxlbWVudGF0aW9uIG9mIGRpY3RzIHN1ZmZlcnMgZmV3ZXIgY29sbGlzaW9ucywgd2hpY2ggaGFzIHNwZWVkCiAgYmVuZWZpdHMuICBIb3dldmVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggZGljdCBlbnRyaWVzIGFwcGVhciBpbiBkaWN0LmtleXMoKSwKICBkaWN0LnZhbHVlcygpIGFuZCBkaWN0Lml0ZW1zKCkgbWF5IGRpZmZlciBmcm9tIHByZXZpb3VzIHJlbGVhc2VzIGZvciBhCiAgZ2l2ZW4gZGljdC4gIE5vdGhpbmcgaXMgZGVmaW5lZCBhYm91dCB0aGlzIG9yZGVyLCBzbyBubyBwcm9ncmFtIHNob3VsZAogIHJlbHkgb24gaXQuICBOZXZlcnRoZWxlc3MsIGl0J3MgZWFzeSB0byB3cml0ZSB0ZXN0IGNhc2VzIHRoYXQgcmVseSBvbiB0aGUKICBvcmRlciBieSBhY2NpZGVudCwgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgcHJpbnRpbmcgdGhlIHN0cigpIG9yIHJlcHIoKSBvZiBhCiAgZGljdCB0byBhbiAiZXhwZWN0ZWQgcmVzdWx0cyIgZmlsZS4gIFNlZSBMaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkncyBuZXcKICBzb3J0ZGljdChkaWN0KSBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgd2F5IHRvIGRpc3BsYXkgYSBkaWN0IGluIHNvcnRlZAogIG9yZGVyLgoKLSBEaWN0aW9uYXJ5IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlICJpbiIgb3BlcmF0b3I6ICJ4IGluIGRpY3QiIG1lYW5zCiAgdGhlIHNhbWUgYXMgZGljdC5oYXNfa2V5KHgpLgoKLSBJdGVyYXRvcnMgd2VyZSBhZGRlZDsgdGhpcyBpcyBhIGdlbmVyYWxpemVkIHdheSBvZiBwcm92aWRpbmcgdmFsdWVzCiAgdG8gYSBmb3IgbG9vcC4gIFNlZSBQRVAgMjM0LiAgVGhlcmUncyBhIG5ldyBidWlsdC1pbiBmdW5jdGlvbiBpdGVyKCkKICB0byByZXR1cm4gYW4gaXRlcmF0b3IuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCB0aGUgbmV4dCB2YWx1ZQogIGZyb20gYW4gaXRlcmF0b3IgdXNpbmcgdGhlIG5leHQoKSBtZXRob2QgKGluIFB5dGhvbikgb3IgdGhlCiAgdHBfaXRlcm5leHQgc2xvdCAoaW4gQykuICBUaGVyZSdzIGEgbmV3IHByb3RvY29sIHRvIGdldCBpdGVyYXRvcnMKICB1c2luZyB0aGUgX19pdGVyX18oKSBtZXRob2QgKGluIFB5dGhvbikgb3IgdGhlIHRwX2l0ZXIgc2xvdCAoaW4gQykuCiAgSXRlcmF0aW5nIChpLmUuIGEgZm9yIGxvb3ApIG92ZXIgYSBkaWN0aW9uYXJ5IGdlbmVyYXRlcyBpdHMga2V5cy4KICBJdGVyYXRpbmcgb3ZlciBhIGZpbGUgZ2VuZXJhdGVzIGl0cyBsaW5lcy4KCi0gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgd2VyZSBnZW5lcmFsaXplZCB0byB3b3JrIG5pY2VseSB3aXRoIGl0ZXJhdG9yCiAgYXJndW1lbnRzOgogICAgbWFwKCksIGZpbHRlcigpLCByZWR1Y2UoKSwgemlwKCkKICAgIGxpc3QoKSwgdHVwbGUoKSAoUHlTZXF1ZW5jZV9UdXBsZSgpIGFuZCBQeVNlcXVlbmNlX0Zhc3QoKSBpbiBDIEFQSSkKICAgIG1heCgpLCBtaW4oKQogICAgam9pbigpIG1ldGhvZCBvZiBzdHJpbmdzCiAgICBleHRlbmQoKSBtZXRob2Qgb2YgbGlzdHMKICAgICd4IGluIHknIGFuZCAneCBub3QgaW4geScgKFB5U2VxdWVuY2VfQ29udGFpbnMoKSBpbiBDIEFQSSkKICAgIG9wZXJhdG9yLmNvdW50T2YoKSAoUHlTZXF1ZW5jZV9Db3VudCgpIGluIEMgQVBJKQoKLSBBY2Nlc3NpbmcgbW9kdWxlIGF0dHJpYnV0ZXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgKGZvciBleGFtcGxlLAogIHJhbmRvbS5yYW5kb20gb3Igb3MucGF0aCBvciB5b3VyUHl0aG9uTW9kdWxlLnlvdXJBdHRyaWJ1dGUpLgoKLSBDb21wYXJpbmcgZGljdGlvbmFyeSBvYmplY3RzIHZpYSA9PSBhbmQgIT0gaXMgZmFzdGVyLCBhbmQgbm93IHdvcmtzIGV2ZW4KICBpZiB0aGUga2V5cyBhbmQgdmFsdWVzIGRvbid0IHN1cHBvcnQgY29tcGFyaXNvbnMgb3RoZXIgdGhhbiA9PS4KCi0gQ29tcGFyaW5nIGRpY3Rpb25hcmllcyBpbiB3YXlzIG90aGVyIHRoYW4gPT0gYW5kICE9IGlzIHNsb3dlcjogIHRoZXJlIHdlcmUKICBpbnNlY3VyaXRpZXMgaW4gdGhlIGRpY3QgY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvdWxkIGNhdXNlIFB5dGhvbgogIHRvIGNyYXNoIGlmIHRoZSBlbGVtZW50IGNvbXBhcmlzb24gcm91dGluZXMgZm9yIHRoZSBkaWN0IGtleXMgYW5kL29yCiAgdmFsdWVzIG11dGF0ZWQgdGhlIGRpY3RzLiAgTWFraW5nIHRoZSBjb2RlIGJ1bGxldHByb29mIHNsb3dlZCBpdCBkb3duLgoKLSBDb2xsaXNpb25zIGluIGRpY3RzIGFyZSByZXNvbHZlZCB2aWEgYSBuZXcgYXBwcm9hY2gsIHdoaWNoIGNhbiBoZWxwCiAgZHJhbWF0aWNhbGx5IGluIGJhZCBjYXNlcy4gIEZvciBleGFtcGxlLCBsb29raW5nIHVwIGV2ZXJ5IGtleSBpbiBhIGRpY3QKICBkIHdpdGggZC5rZXlzKCkgPSBbaSA8PCAxNiBmb3IgaSBpbiByYW5nZSgyMDAwMCldIGlzIGFwcHJveGltYXRlbHkgNTAweAogIGZhc3RlciBub3cuICBUaGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lciBmb3IgcG9pbnRpbmcgb3V0IHRoZSBjYXVzZSBhbmQKICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KCkxpYnJhcnkKCi0gQSBuZXcgZnVuY3Rpb24gZm5tYXRjaC5maWx0ZXIgdG8gZmlsdGVyIGxpc3RzIG9mIGZpbGUgbmFtZXMgd2FzIGFkZGVkLgoKLSBjYWxlbmRhci5weSB1c2VzIG1vbnRoIGFuZCBkYXkgbmFtZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgoKLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAogIGFuZCBpc3N1ZXMgRGVwcmVjYXRpb25XYXJuaW5nIHdoZW4gdXNlZCAoZXhjZXB0IGZvciB0aGUgZm91ciBpdGVtcwogIHRoYXQgYXJlIHN0aWxsIGltcG9ydGVkIGludG8gc3RyaW5nLnB5KS4KCi0gQ29va2llLnB5IG5vdyBzb3J0cyBrZXkrdmFsdWUgcGFpcnMgYnkga2V5IGluIG91dHB1dCBzdHJpbmdzLgoKLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgogIE5vdyBpdCBkb2VzLgoKLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgoKVGVzdHMKCi0gTmV3IHRlc3RfbXV0YW50cy5weSBydW5zIGRpY3QgY29tcGFyaXNvbnMgd2hlcmUgdGhlIGtleSBhbmQgdmFsdWUKICBjb21wYXJpc29uIG9wZXJhdG9ycyBtdXR1dGUgdGhlIGRpY3RzIHJhbmRvbWx5IGR1cmluZyBjb21wYXJpc29uLiAgVGhpcwogIHJhcGlkbHkgY2F1c2VzIFB5dGhvbiB0byBjcmFzaCB1bmRlciBlYXJsaWVyIHJlbGVhc2VzIChub3QgZm9yIHRoZSBmYWludAogIG9mIGhlYXJ0OiAgaXQgY2FuIGFsc28gY2F1c2UgV2luOXggdG8gZnJlZXplIG9yIHJlYm9vdCEpLgoKLSBOZXcgdGVzdF9wcHJpbnQucHkgdmVyZmllcyB0aGF0IHBwcmludC5pc3JlY3Vyc2l2ZSgpIGFuZAogIHBwcmludC5pc3JlYWRhYmxlKCkgcmV0dXJuIHNlbnNpYmxlIHJlc3VsdHMuICBBbHNvIHZlcmlmaWVzIHRoYXQgc2ltcGxlCiAgY2FzZXMgcHJvZHVjZSBjb3JyZWN0IG91dHB1dC4KCk5ldyBwbGF0Zm9ybXMKCi0gUHl0aG9uIHNob3VsZCBjb21waWxlIGFuZCBydW4gb3V0IG9mIHRoZSBib3ggdXNpbmcgdGhlIEJvcmxhbmQgQwogIGNvbXBpbGVyICh1bmRlciBXaW5kb3dzKSwgdGhhbmtzIHRvIFN0ZXBoZW4gSGFuc2VuLgoKQyBBUEkKCi0gUmVtb3ZlZCB0aGUgdW51c2VkIGxhc3RfaXNfc3RpY2t5IGFyZ3VtZW50IGZyb20gdGhlIGludGVybmFsCiAgX1B5VHVwbGVfUmVzaXplKCkuICBJZiB0aGlzIGFmZmVjdHMgeW91LCB5b3Ugd2VyZSBjaGVhdGluZy4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgKGZpbmFsKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXZSBvbmx5IGNoYW5nZWQgYSBmZXcgdGhpbmdzIHNpbmNlIHRoZSBsYXN0IHJlbGVhc2UgY2FuZGlkYXRlLCBhbGwgaW4KUHl0aG9uIGxpYnJhcnkgY29kZToKCi0gQSBidWcgaW4gdGhlIGxvY2FsZSBtb2R1bGUgd2FzIGZpeGVkIHRoYXQgYWZmZWN0ZWQgbG9jYWxlcyB3aGljaAogIGRlZmluZSBubyBncm91cGluZyBmb3IgbnVtZXJpYyBmb3JtYXR0aW5nLgoKLSBBIGZldyBidWdzIGluIHRoZSB3ZWFrcmVmIG1vZHVsZSdzIGltcGxlbWVudGF0aW9ucyBvZiB3ZWFrCiAgZGljdGlvbmFyaWVzIChXZWFrVmFsdWVEaWN0aW9uYXJ5IGFuZCBXZWFrS2V5RGljdGlvbmFyeSkgd2VyZSBmaXhlZCwKICBhbmQgdGhlIHRlc3Qgc3VpdGUgd2FzIHVwZGF0ZWQgdG8gY2hlY2sgZm9yIHRoZXNlIGJ1Z3MuCgotIEFuIG9sZCBidWcgaW4gdGhlIG9zLnBhdGgud2FsaygpIGZ1bmN0aW9uIChpbnRyb2R1Y2VkIGluIFB5dGhvbgogIDIuMCEpIHdhcyBmaXhlZDogYSBub24tZXhpc3RlbnQgZmlsZSB3b3VsZCBjYXVzZSBhbiBleGNlcHRpb24KICBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuCgotIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlIG5ldyBzeW10YWJsZSBtb2R1bGUgZm91bmQgYnkgTmVpbCBOb3J3aXR6J3MKICBQeUNoZWNrZXIuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xYzI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQSBmbHVycnkgb2Ygc21hbGwgY2hhbmdlcywgYW5kIG9uZSBzaG93c3RvcHBlciBmaXhlZCBpbiB0aGUgbmljayBvZgp0aW1lIG1hZGUgaXQgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgYW5vdGhlciByZWxlYXNlIGNhbmRpZGF0ZS4gIFRoZSBsaXN0CmhlcmUgaXMgdGhlICpjb21wbGV0ZSogbGlzdCBvZiBwYXRjaGVzIChleGNlcHQgdmVyc2lvbiB1cGRhdGVzKToKCkNvcmUKCi0gVGltIGRpc2NvdmVyZWQgYSBuYXN0eSBidWcgaW4gdGhlIGRpY3Rpb25hcnkgY29kZSwgY2F1c2VkIGJ5CiAgUHlEaWN0X05leHQoKSBjYWxsaW5nIGRpY3RfcmVzaXplKCksIGFuZCB0aGUgR0MgY29kZSdzIHVzZSBvZgogIFB5RGljdF9OZXh0KCkgdmlvbGF0aW5nIGFuIGFzc3VtcHRpb24gaW4gZGljdF9pdGVtcygpLiAgVGhpcyB3YXMKICBmaXhlZCB3aXRoIGNvbnNpZGVyYWJsZSBhbW91bnRzIG9mIGJhbmQtYWlkLCBidXQgdGhlIG5ldCBlZmZlY3QgaXMgYQogIHNhbmVyIGFuZCBtb3JlIHJvYnVzdCBpbXBsZW1lbnRhdGlvbi4KCi0gTWFkZSBhIGJ1bmNoIG9mIHN5bWJvbHMgc3RhdGljIHRoYXQgd2VyZSBhY2NpZGVudGFsbHkgZ2xvYmFsLgoKQnVpbGQgYW5kIFBvcnRzCgotIFRoZSBzZXR1cC5weSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiB6bGliCiAgKDEuMS4zIGlzIG5lZWRlZCkuICBOb3cgaXQgZG9lcy4KCi0gQ2hhbmdlZCAibWFrZSBjbGVhbiIgdGFyZ2V0IHRvIGFsc28gcmVtb3ZlIHNoYXJlZCBsaWJyYXJpZXMuCgotIEFkZGVkIGEgbW9yZSBnZW5lcmFsIHdhcm5pbmcgYWJvdXQgdGhlIFNHSSBJcml4IG9wdGltaXplciB0byBSRUFETUUuCgpMaWJyYXJ5CgotIEZpeCBhIGJ1ZyBpbiB1cmxsaWIuYmFzZWpvaW4oImh0dHA6Ly9ob3N0IiwgIi4uL2ZpbGUuaHRtbCIpIHdoaWNoCiAgb21pdHRlZCB0aGUgc2xhc2ggYmV0d2VlbiBob3N0IGFuZCBmaWxlLmh0bWwuCgotIFRoZSBtYWlsYm94IG1vZHVsZSdzIF9NYWlsYm94IGNsYXNzIGNvbnRhaW5lZCBhIGNvbXBsZXRlbHkgYnJva2VuCiAgYW5kIHVuZG9jdW1lbnRlZCBzZWVrKCkgbWV0aG9kLiAgUmlwcGVkIGl0IG91dC4KCi0gRml4ZWQgYSBidW5jaCBvZiB0eXBvcyBpbiB2YXJpb3VzIGxpYnJhcnkgbW9kdWxlcyAodXJsbGliMiwgc210cGQsCiAgc2dtbGxpYiwgbmV0cmMsIGNodW5rKSBmb3VuZCBieSBOZWlsIE5vcndpdHoncyBQeUNoZWNrZXIuCgotIEZpeGVkIGEgZmV3IGxhc3QtbWludXRlIGJ1Z3MgaW4gdW5pdHRlc3QuCgpFeHRlbnNpb25zCgotIFJldmVydGVkIHRoZSBwYXRjaCB0byB0aGUgT3BlblNTTCBjb2RlIGluIHNvY2tldG1vZHVsZS5jIHRvIHN1cHBvcnQKICBSQU5EX3N0YXR1cygpIGFuZCB0aGUgRUdELCBhbmQgdGhlIHN1YnNlcXVlbnQgcGF0Y2ggdGhhdCB0cmllZCB0bwogIGZpeCBpdCBmb3IgcHJlLTAuOS41IHZlcnNpb25zOyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBwYXRjaCBpcyB0aGF0IG9uCiAgc29tZSBzeXN0ZW1zIGl0IGlzc3VlcyBhIHdhcm5pbmcgd2hlbmV2ZXIgc29ja2V0IGlzIGltcG9ydGVkLCBhbmQKICB0aGF0J3MgdW5hY2NlcHRhYmxlLgoKVGVzdHMKCi0gRml4ZWQgdGhlIHBpY2tsZSB0ZXN0cyB0byB3b3JrIHdpdGggImltcG9ydCB0ZXN0LnRlc3RfcGlja2xlIi4KCi0gVHdlYWtlZCB0ZXN0X2xvY2FsZS5weSB0byBhY3R1YWxseSBydW4gdGhlIHRlc3QgV2luZG93cy4KCi0gSW4gZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weSwgY2FsbCB6aXBmaWxlLlppcEZpbGUoKSB3aXRoIG1vZGUgInciLAogIG5vdCAid2IiICh3aGljaCBpcyBub3QgYSB2YWxpZCBtb2RlIGF0IGFsbCkuCgotIEZpeCBwc3RhdHMgYnJvd3NlciBjcmFzaGVzLiAgSW1wb3J0IHJlYWRsaW5lIGlmIGl0IGV4aXN0cyB0byBtYWtlCiAgdGhlIHVzZXIgaW50ZXJmYWNlIG5pY2VyLgoKLSBBZGQgImltcG9ydCB0aHJlYWQiIHRvIHRoZSB0b3Agb2YgdGVzdCBtb2R1bGVzIHRoYXQgaW1wb3J0IHRoZQogIHRocmVhZGluZyBtb2R1bGUgKHRlc3RfYXN5bmNoYXQgYW5kIHRlc3RfdGhyZWFkZWR0ZW1wZmlsZSkuICBUaGlzCiAgcHJldmVudHMgdGVzdCBmYWlsdXJlcyBjYXVzZWQgYnkgYSBicm9rZW4gdGhyZWFkaW5nIG1vZHVsZSByZXN1bHRpbmcKICBmcm9tIGEgcHJldmlvdXNseSBjYXVnaHQgZmFpbGVkIGltcG9ydC4KCi0gQ2hhbmdlZCB0ZXN0X2FzeW5jaGF0LnB5IHRvIHNldCB0aGUgU09fUkVVU0VBRERSIG9wdGlvbjsgdGhpcyB3YXMKICBuZWVkZWQgb24gc29tZSBwbGF0Zm9ybXMgKGUuZy4gU29sYXJpcyA4KSB3aGVuIHRoZSB0ZXN0cyBhcmUgcnVuCiAgdHdpY2UgaW4gc3VjY2Vzc2lvbi4KCi0gU2tpcCByYXRoZXIgdGhhbiBmYWlsIHRlc3Rfc3VuYXVkaW9kZXYgaWYgbm8gYXVkaW8gZGV2aWNlIGlzIGZvdW5kLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMWMxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgbGlzdCB3YXMgc2lnbmlmaWNhbnRseSB1cGRhdGVkIHdoZW4gMi4xYzIgd2FzIHJlbGVhc2VkOyB0aGUgMi4xYzEKcmVsZWFzZSBkaWRuJ3QgbWVudGlvbiBtb3N0IGNoYW5nZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHBhcnQgb2YgMi4xYzE6CgpMZWdhbAoKLSBDb3B5cmlnaHQgd2FzIGFzc2lnbmVkIHRvIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiAoUFNGKSBhbmQgYQogIFBTRiBsaWNlbnNlICh2ZXJ5IHNpbWlsYXIgdG8gdGhlIENOUkkgbGljZW5zZSkgd2FzIGFkZGVkLgoKLSBUaGUgQ05SSSBjb3B5cmlnaHQgbm90aWNlIHdhcyB1cGRhdGVkIHRvIGluY2x1ZGUgMjAwMS4KCkNvcmUKCi0gQWZ0ZXIgYSBwdWJsaWMgb3V0Y3J5LCBhc3NpZ25tZW50IHRvIF9fZGVidWdfXyBpcyBubyBsb25nZXIgaWxsZWdhbDsKICBpbnN0ZWFkLCBhIHdhcm5pbmcgaXMgaXNzdWVkLiAgSXQgd2lsbCBiZWNvbWUgaWxsZWdhbCBpbiAyLjIuCgotIEZpeGVkIGEgY29yZSBkdW1wIHdpdGggIiUjeCIgJSAwLCBhbmQgY2hhbmdlZCB0aGUgc2VtYW50aWNzIHNvIHRoYXQKICAiJSN4IiBub3cgYWx3YXlzIHByZXBlbmRzICIweCIsIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIHplcm8uCgotIEZpeGVkIHNvbWUgbml0cyBpbiB0aGUgYnl0ZWNvZGUgY29tcGlsZXIuCgotIEZpeGVkIGNvcmUgZHVtcHMgd2hlbiBjYWxsaW5nIGNlcnRhaW4ga2luZHMgb2Ygbm9uLWZ1bmN0aW9ucy4KCi0gRml4ZWQgdmFyaW91cyBjb3JlIGR1bXBzIGNhdXNlZCBieSByZWZlcmVuY2UgY291bnQgYnVncy4KCkJ1aWxkIGFuZCBQb3J0cwoKLSBVc2UgSU5TVEFMTF9TQ1JJUFQgdG8gaW5zdGFsbCBzY3JpcHQgZmlsZXMuCgotIE5ldyBwb3J0OiBTQ08gVW5peHdhcmUgNywgYnkgQmlsbHkgRy4gQWxsaWUuCgotIFVwZGF0ZWQgUklTQ09TIHBvcnQuCgotIFVwZGF0ZWQgQmVPUyBwb3J0IGFuZCBub3Rlcy4KCi0gVmFyaW91cyBvdGhlciBwb3J0aW5nIHByb2JsZW1zIHJlc29sdmVkLgoKTGlicmFyeQoKLSBUaGUgVEVSTUlPUyBhbmQgU09DS0VUIG1vZHVsZXMgYXJlIG5vdyB0cnVseSBvYnNvbGV0ZSBhbmQKICB1bm5lY2Vzc2FyeS4gIFRoZWlyIHN5bWJvbHMgYXJlIGluY29ycG9yYXRlZCBpbiB0aGUgdGVybWlvcyBhbmQKICBzb2NrZXQgbW9kdWxlcy4KCi0gRml4ZWQgc29tZSA2NC1iaXQgYnVncyBpbiBwaWNrbGUsIGNQaWNrbGUsIGFuZCBzdHJ1Y3QsIGFuZCBhZGRlZAogIGJldHRlciB0ZXN0cyBmb3IgcGlja2xpbmcuCgotIHRocmVhZGluZzogbWFrZSBDb25kaXRpb24ud2FpdCgpIHJvYnVzdCBhZ2FpbnN0IEtleWJvYXJkSW50ZXJydXB0LgoKLSB6aXBmaWxlOiBhZGQgc3VwcG9ydCB0byB6aXBmaWxlIHRvIHN1cHBvcnQgb3BlbmluZyBhbiBhcmNoaXZlCiAgcmVwcmVzZW50ZWQgYnkgYW4gb3BlbiBmaWxlIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLiAgRml4IGJ1ZyB3aGVyZQogIHRoZSBhcmNoaXZlIHdhcyBub3QgcHJvcGVybHkgY2xvc2VkLiAgRml4ZWQgYSBidWcgaW4gdGhpcyBidWdmaXgKICB3aGVyZSBmbHVzaCgpIHdhcyBjYWxsZWQgZm9yIGEgcmVhZC1vbmx5IGZpbGUuCgotIGltcHV0aWw6IGFkZGVkIGFuIHVuaW5zdGFsbCgpIG1ldGhvZCB0byB0aGUgSW1wb3J0TWFuYWdlci4KCi0gQ2FudmFzOiBmaXhlZCBidWdzIGluIGxvd2VyKCkgYW5kIHRrcmFpc2UoKSBtZXRob2RzLgoKLSBTb2NrZXRTZXJ2ZXI6IEFQSSBjaGFuZ2UgKGFkZGVkIG92ZXJyaWRhYmxlIGNsb3NlX3JlcXVlc3QoKSBtZXRob2QpCiAgc28gdGhhdCB0aGUgVENQIHNlcnZlciBjYW4gZXhwbGljaXRseSBjbG9zZSB0aGUgcmVxdWVzdC4KCi0gcHN0YXRzOiBFcmljIFJheW1vbmQgYWRkZWQgYSBzaW1wbGUgaW50ZXJhY3RpdmUgc3RhdGlzdGljcyBicm93c2VyLAogIGludm9rZWQgd2hlbiB0aGUgbW9kdWxlIGlzIHJ1biBhcyBhIHNjcmlwdC4KCi0gbG9jYWxlOiBmaXhlZCBhIHByb2JsZW0gaW4gZm9ybWF0KCkuCgotIHdlYmJyb3dzZXI6IG1hZGUgaXQgd29yayB3aGVuIHRoZSBCUk9XU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGhhcyBhCiAgdmFsdWUgbGlrZSAiL3Vzci9iaW4vbmV0c2NhcGUiLiAgTWFkZSBpdCBhdXRvLWRldGVjdCBLb25xdWVyb3IgZm9yCiAgS0RFIDIuICBGaXhlZCBzb21lIG90aGVyIG5pdHMuCgotIHVuaXR0ZXN0OiBjaGFuZ2VzIHRvIGFsbG93IHVzaW5nIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0aGFuCiAgQXNzZXJ0aW9uRXJyb3IsIGFuZCBhZGRlZCBhIGZldyBtb3JlIGZ1bmN0aW9uIGFsaWFzZXMuICBTb21lIG90aGVyCiAgc21hbGwgY2hhbmdlcy4KCi0gdXJsbGliLCB1cmxsaWIyOiBmaXhlZCByZWRpcmVjdCBwcm9ibGVtcyBhbmQgYSBjb3VwbGVvZiBvdGhlciBuaXRzLgoKLSBhc3luY2hhdDogZml4ZWQgYSBjcml0aWNhbCBidWcgaW4gYXN5bmNoYXQgdGhhdCBzbGlwcGVkIHRocm91Z2ggdGhlCiAgMi4xYjIgcmVsZWFzZS4gIEZpeGVkIGFub3RoZXIgcmFyZSBidWcuCgotIEZpeCBzb21lIHVucXVhbGlmaWVkIGV4Y2VwdDogY2xhdXNlcyAoYWx3YXlzIGEgYmFkIGNvZGUgZXhhbXBsZSkuCgpYTUwKCi0gcHlleHBhdDogbmV3IEFQSSBnZXRfdmVyc2lvbl9zdHJpbmcoKS4KCi0gRml4ZWQgc29tZSBtaW5pZG9tIGJ1Z3MuCgpFeHRlbnNpb25zCgotIEZpeGVkIGEgY29yZSBkdW1wIGluIF93ZWFrcmVmLiAgUmVtb3ZlZCB0aGUgd2Vha3JlZi5tYXBwaW5nKCkKICBmdW5jdGlvbiAoaXQgYWRkcyBub3RoaW5nIHRvIHRoZSBBUEkpLgoKLSBSYXRpb25hbGl6ZWQgdGhlIHVzZSBvZiBoZWFkZXIgZmlsZXMgaW4gdGhlIHJlYWRsaW5lIG1vZHVsZSwgdG8gbWFrZQogIGl0IGNvbXBpbGUgKGFsYmVpdCB3aXRoIHNvbWUgd2FybmluZ3MpIHdpdGggdGhlIHZlcnkgcmVjZW50IHJlYWRsaW5lCiAgNC4yLCB3aXRob3V0IGJyZWFraW5nIGZvciBlYXJsaWVyIHZlcnNpb25zLgoKLSBIb3BlZnVsbHkgZml4ZWQgYSBidWZmZXJpbmcgcHJvYmxlbSBpbiBsaW51eGF1ZGlvZGV2LgoKLSBBdHRlbXB0ZWQgYSBmaXggdG8gbWFrZSB0aGUgT3BlblNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlCiAgd29yayBhZ2FpbiB3aXRoIHByZS0wLjkuNSB2ZXJzaW9ucyBvZiBPcGVuU1NMLgoKVGVzdHMKCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGFzeW5jaGF0IGFuZCBhc3luY29yZS4KCi0gUmVtb3ZlZCBjb3VwbGluZyBiZXR3ZWVuIHRlc3RzIHdoZXJlIG9uZSB0ZXN0IGZhaWxpbmcgY291bGQgYnJlYWsKICBhbm90aGVyLgoKVG9vbHMKCi0gUGluZyBhZGRlZCBhbiBpbnRlcmFjdGl2ZSBoZWxwIGJyb3dzZXIgdG8gcHlkb2MsIGZpeGVkIHNvbWUgbml0cwogIGluIHRoZSByZXN0IG9mIHRoZSBweWRvYyBjb2RlLCBhbmQgYWRkZWQgc29tZSBmZWF0dXJlcyB0byBoaXMKICBpbnNwZWN0IG1vZHVsZS4KCi0gQW4gdXBkYXRlZCBweXRob24tbW9kZS5lbCB2ZXJzaW9uIDQuMSB3aGljaCBpbnRlZ3JhdGVzIEtlbgogIE1hbmhlaW1lcidzIHBkYnRyYWNrLmVsLiAgVGhpcyBtYWtlcyBkZWJ1Z2dpbmcgUHl0aG9uIGNvZGUgdmlhIHBkYgogIG11Y2ggbmljZXIgaW4gWEVtYWNzIGFuZCBFbWFjcy4gIFdoZW4gc3RlcHBpbmcgdGhyb3VnaCB5b3VyIHByb2dyYW0KICB3aXRoIHBkYiwgaW4gZWl0aGVyIHRoZSBzaGVsbCB3aW5kb3cgb3IgdGhlICpQeXRob24qIHdpbmRvdywgdGhlCiAgc291cmNlIGZpbGUgYW5kIGxpbmUgd2lsbCBiZSB0cmFja2VkIGJ5IGFuIGFycm93LiAgVmVyeSBjb29sIQoKLSBJRExFOiBzeW50YXggd2FybmluZ3MgaW4gaW50ZXJhY3RpdmUgbW9kZSBhcmUgY2hhbmdlZCBpbnRvIGVycm9ycy4KCi0gU29tZSBpbXByb3ZlbWVudHMgdG8gVG9vbHMvd2ViY2hlY2tlciAoaWdub3JlIHNvbWUgbW9yZSBVUkwgdHlwZXMsCiAgZm9sbG93IHNvbWUgbW9yZSBsaW5rcykuCgotIEJyb3VnaHQgdGhlIFRvb2xzL2NvbXBpbGVyIHBhY2thZ2UgdXAgdG8gZGF0ZS4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYmV0YSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKFVubGlzdGVkIGFyZSBtYW55IGZpeGVkIGJ1Z3MsIG1vcmUgZG9jdW1lbnRhdGlvbiwgZXRjLikKCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gVGhlIG5lc3RlZCBzY29wZXMgd29yayAoZW5hYmxlZCBieSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydAogIG5lc3RlZF9zY29wZXMiKSBpcyBjb21wbGV0ZWQ7IGluIHBhcnRpY3VsYXIsIHRoZSBmdXR1cmUgbm93IGV4dGVuZHMKICBpbnRvIGNvZGUgZXhlY3V0ZWQgdGhyb3VnaCBleGVjLCBldmFsKCkgYW5kIGV4ZWNmaWxlKCksIGFuZCBpbnRvIHRoZQogIGludGVyYWN0aXZlIGludGVycHJldGVyLgoKLSBXaGVuIGNhbGxpbmcgYSBiYXNlIGNsYXNzIG1ldGhvZCAoZS5nLiBCYXNlQ2xhc3MuX19pbml0X18oc2VsZikpLAogIHRoaXMgaXMgbm93IGFsbG93ZWQgZXZlbiBpZiBzZWxmIGlzIG5vdCBzdHJpY3RseSBzcG9rZW4gYSBjbGFzcwogIGluc3RhbmNlIChlLmcuIHdoZW4gdXNpbmcgbWV0YWNsYXNzZXMgb3IgdGhlIERvbiBCZWF1ZHJ5IGhvb2spLgoKLSBTbGljZSBvYmplY3RzIGFyZSBub3cgY29tcGFyYWJsZSBidXQgbm90IGhhc2hhYmxlOyB0aGlzIHByZXZlbnRzCiAgZGljdFs6XSBmcm9tIGJlaW5nIGFjY2VwdGVkIGJ1dCBtZWFuaW5nbGVzcy4KCi0gQ29tcGxleCBkaXZpc2lvbiBpcyBub3cgY2FsY3VsYXRlZCB1c2luZyBsZXNzIGJyYWluZGVhZCBhbGdvcml0aG1zLgogIFRoaXMgZG9lc24ndCBjaGFuZ2Ugc2VtYW50aWNzIGV4Y2VwdCBpdCdzIG1vcmUgbGlrZWx5IHRvIGdpdmUgdXNlZnVsCiAgcmVzdWx0cyBpbiBleHRyZW1lIGNhc2VzLiAgQ29tcGxleCByZXByKCkgbm93IHVzZXMgZnVsbCBwcmVjaXNpb24KICBsaWtlIGZsb2F0IHJlcHIoKS4KCi0gc2dtbGxpYi5weSBub3cgY2FsbHMgaGFuZGxlX2RlY2woKSBmb3Igc2ltcGxlIDwhLi4uPiBkZWNsYXJhdGlvbnMuCgotIEl0IGlzIGlsbGVnYWwgdG8gYXNzaWduIHRvIHRoZSBuYW1lIF9fZGVidWdfXywgd2hpY2ggaXMgc2V0IHdoZW4gdGhlCiAgaW50ZXJwcmV0ZXIgc3RhcnRzLiAgSXQgaXMgZWZmZWN0aXZlbHkgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCgotIEEgd2FybmluZyB3aWxsIGJlIGlzc3VlZCBpZiBhIGdsb2JhbCBzdGF0ZW1lbnQgZm9yIGEgdmFyaWFibGUKICBmb2xsb3dzIGEgdXNlIG9yIGFzc2lnbm1lbnQgb2YgdGhhdCB2YXJpYWJsZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gdW5pdHRlc3QucHksIGEgdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBieSBTdGV2ZSBQdXJjZWxsIChQeVVOSVQsCiAgaW5zcGlyZWQgYnkgSlVuaXQpLCBpcyBub3cgcGFydCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeS4gIFlvdSBub3cKICBoYXZlIGEgY2hvaWNlIG9mIHR3byB0ZXN0aW5nIGZyYW1ld29ya3M6IHVuaXR0ZXN0IHJlcXVpcmVzIHlvdSB0bwogIHdyaXRlIHRlc3RjYXNlcyBhcyBzZXBhcmF0ZSBjb2RlLCBkb2N0ZXN0IGdhdGhlcnMgdGhlbSBmcm9tCiAgZG9jc3RyaW5ncy4gIEJvdGggYXBwcm9hY2hlcyBoYXZlIHRoZWlyIGFkdmFudGFnZXMgYW5kCiAgZGlzYWR2YW50YWdlcy4KCi0gQSBuZXcgbW9kdWxlIFRpeCB3YXMgYWRkZWQsIHdoaWNoIHdyYXBzIHRoZSBUaXggZXh0ZW5zaW9uIGxpYnJhcnkKICBmb3IgVGsuICBXaXRoIHRoYXQgbW9kdWxlLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHN0YXRpY2FsbHkgbGluawogIFRpeCB3aXRoIF90a2ludGVyLCBzaW5jZSBUaXggd2lsbCBiZSBsb2FkZWQgd2l0aCBUY2wncyAicGFja2FnZQogIHJlcXVpcmUiIGNvbW1hbmQuICBTZWUgRGVtby90aXgvLgoKLSB0enBhcnNlLnB5IGlzIG5vdyBvYnNvbGV0ZS4KCi0gSW4gZ3ppcC5weSwgdGhlIHNlZWsoKSBhbmQgdGVsbCgpIG1ldGhvZHMgYXJlIHJlbW92ZWQgLS0gdGhleSB3ZXJlCiAgbm9uLWZ1bmN0aW9uYWwgYW55d2F5LCBhbmQgaXQncyBiZXR0ZXIgaWYgY2FsbGVycyBjYW4gdGVzdCBmb3IgdGhlaXIKICBleGlzdGVuY2Ugd2l0aCBoYXNhdHRyKCkuCgpQeXRob24vQyBBUEkKCi0gUHlEaWN0X05leHQoKTogaXQgaXMgbm93IHNhZmUgdG8gY2FsbCBQeURpY3RfU2V0SXRlbSgpIHdpdGggYSBrZXkKICB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgZGljdGlvbmFyeSBkdXJpbmcgYSBQeURpY3RfTmV4dCgpIGl0ZXJhdGlvbi4KICBUaGlzIHVzZWQgdG8gZmFpbCBvY2Nhc2lvbmFsbHkgd2hlbiBhIGRpY3Rpb25hcnkgcmVzaXplIG9wZXJhdGlvbgogIGNvdWxkIGJlIHRyaWdnZXJlZCB0aGF0IHdvdWxkIHJlaGFzaCBhbGwgdGhlIGtleXMuICBBbGwgb3RoZXIKICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5IGFyZSBzdGlsbCBvZmYtbGltaXRzIGR1cmluZyBhCiAgUHlEaWN0X05leHQoKSBpdGVyYXRpb24hCgotIE5ldyBleHRlbmRlZCBBUElzIHJlbGF0ZWQgdG8gcGFzc2luZyBjb21waWxlciB2YXJpYWJsZXMgYXJvdW5kLgoKLSBOZXcgYWJzdHJhY3QgQVBJcyBQeU9iamVjdF9Jc0luc3RhbmNlKCksIFB5T2JqZWN0X0lzU3ViY2xhc3MoKQogIGltcGxlbWVudCBpc2luc3RhbmNlKCkgYW5kIGlzc3ViY2xhc3MoKS4KCi0gUHlfQnVpbGRWYWx1ZSgpIG5vdyBoYXMgYSAiRCIgY29udmVyc2lvbiB0byBjcmVhdGUgYSBQeXRob24gY29tcGxleAogIG51bWJlciBmcm9tIGEgUHlfY29tcGxleCBDIHZhbHVlLgoKLSBFeHRlbnNpb25zIHR5cGVzIHdoaWNoIHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIG11c3Qgbm93IHNldCB0aGUKICBmaWVsZCBhbGxvY2F0ZWQgZm9yIHRoZSB3ZWFrIHJlZmVyZW5jZSBtYWNoaW5lcnkgdG8gTlVMTCB0aGVtc2VsdmVzOwogIHRoaXMgaXMgZG9uZSB0byBhdm9pZCB0aGUgY29zdCBvZiBjaGVja2luZyBlYWNoIG9iamVjdCBmb3IgaGF2aW5nIGEKICB3ZWFrbHkgcmVmZXJlbmNhYmxlIHR5cGUgaW4gUHlPYmplY3RfSU5JVCgpLCBzaW5jZSBtb3N0IHR5cGVzIGFyZQogIG5vdCB3ZWFrbHkgcmVmZXJlbmNhYmxlLgoKLSBQeUZyYW1lX0Zhc3RUb0xvY2FscygpIGFuZCBQeUZyYW1lX0xvY2Fsc1RvRmFzdCgpIGNvcHkgYmluZGluZ3MgZm9yCiAgZnJlZSB2YXJpYWJsZXMgYW5kIGNlbGwgdmFyaWFibGVzIHRvIGFuZCBmcm9tIHRoZSBmcmFtZSdzIGZfbG9jYWxzLgoKLSBWYXJpYW50cyBvZiBzZXZlcmFsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHB5dGhvbnJ1bi5oIGhhdmUgYmVlbiBhZGRlZAogIHRvIHN1cHBvcnQgdGhlIG5lc3RlZF9zY29wZXMgZnV0dXJlIHN0YXRlbWVudC4gIFRoZSB2YXJpYW50cyBhbGwgZW5kCiAgaW4gRmxhZ3MgYW5kIHRha2UgYW4gZXh0cmEgYXJndW1lbnQsIGEgUHlDb21waWxlckZsYWdzICo7IGV4YW1wbGVzOgogIFB5UnVuX0FueUZpbGVFeEZsYWdzKCksIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKCkuICBUaGVzZQogIHZhcmlhbnRzIG1heSBiZSByZW1vdmVkIGluIFB5dGhvbiAyLjIsIHdoZW4gbmVzdGVkIHNjb3BlcyBhcmUKICBtYW5kYXRvcnkuCgpEaXN0dXRpbHMKCi0gdGhlIHNkaXN0IGNvbW1hbmQgbm93IHdyaXRlcyBhIFBLRy1JTkZPIGZpbGUsIGFzIGRlc2NyaWJlZCBpbiBQRVAgMjQxLAogIGludG8gdGhlIHJlbGVhc2UgdHJlZS4KCi0gc2V2ZXJhbCBlbmhhbmNlbWVudHMgdG8gdGhlIGJkaXN0X3dpbmluc3QgY29tbWFuZCBmcm9tIFRob21hcyBIZWxsZXIKICAoYW4gdW5pbnN0YWxsZXIsIG1vcmUgY3VzdG9taXphdGlvbiBvZiB0aGUgaW5zdGFsbGVyJ3MgZGlzcGxheSkKCi0gZnJvbSBKYWNrIEphbnNlbjogYWRkZWQgTWFjLXNwZWNpZmljIGNvZGUgdG8gZ2VuZXJhdGUgYSBkaWFsb2cgZm9yCiAgdXNlcnMgdG8gc3BlY2lmeSB0aGUgY29tbWFuZC1saW5lIChiZWNhdXNlIHByb3ZpZGluZyBhIGNvbW1hbmQtbGluZSB3aXRoCiAgTWFjUHl0aG9uIGlzIGF3a3dhcmQpLiAgSmFjayBhbHNvIG1hZGUgdmFyaW91cyBmaXhlcyBmb3IgdGhlIE1hYwogIGFuZCB0aGUgTWV0cm93ZXJrcyBjb21waWxlci4KCi0gYWRkZWQgJ3BsYXRmb3JtcycgYW5kICdrZXl3b3JkcycgdG8gdGhlIHNldCBvZiBtZXRhZGF0YSB0aGF0IGNhbiBiZQogIHNwZWNpZmllZCBmb3IgYSBkaXN0cmlidXRpb24uCgotIGFwcGxpZWQgcGF0Y2hlcyBmcm9tIEphc29uIFRpc2hsZXIgdG8gbWFrZSB0aGUgY29tcGlsZXIgY2xhc3Mgd29yayB3aXRoCiAgQ3lnd2luLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBiZXRhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEZvbGxvd2luZyBhbiBvdXRjcnkgZnJvbSB0aGUgY29tbXVuaXR5IGFib3V0IHRoZSBhbW91bnQgb2YgY29kZQogIGJyb2tlbiBieSB0aGUgbmVzdGVkIHNjb3BlcyBmZWF0dXJlIGludHJvZHVjZWQgaW4gMi4xYTIsIHdlIGRlY2lkZWQKICB0byBtYWtlIHRoaXMgZmVhdHVyZSBvcHRpb25hbCwgYW5kIHRvIHdhaXQgdW50aWwgUHl0aG9uIDIuMiAob3IgYXQKICBsZWFzdCA2IG1vbnRocykgdG8gbWFrZSBpdCBzdGFuZGFyZC4gIFRoZSBvcHRpb24gY2FuIGJlIGVuYWJsZWQgb24gYQogIHBlci1tb2R1bGUgYmFzaXMgYnkgYWRkaW5nICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMiIGF0CiAgdGhlIGJlZ2lubmluZyBvZiBhIG1vZHVsZSAoYmVmb3JlIGFueSBvdGhlciBzdGF0ZW1lbnRzLCBidXQgYWZ0ZXIKICBjb21tZW50cyBhbmQgYW4gb3B0aW9uYWwgZG9jc3RyaW5nKS4gIFNlZSBQRVAgMjM2IChCYWNrIHRvIHRoZQogIF9fZnV0dXJlX18pIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBfX2Z1dHVyZV9fIHN0YXRlbWVudC4gIFBFUCAyMjcKICAoU3RhdGljYWxseSBOZXN0ZWQgU2NvcGVzKSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhpcyBjaGFuZ2UsCiAgYW5kIHRvIGNsYXJpZnkgdGhlIHNlbWFudGljcyBpbiBhIG51bWJlciBvZiBlbmRjYXNlcy4KCi0gVGhlIG5lc3RlZCBzY29wZXMgY29kZSwgd2hlbiBlbmFibGVkLCBoYXMgYmVlbiBoYXJkZW5lZCwgYW5kIG1vc3QKICBidWdzIGFuZCBtZW1vcnkgbGVha3MgaW4gaXQgaGF2ZSBiZWVuIGZpeGVkLgoKLSBDb21waWxlLXRpbWUgd2FybmluZ3MgYXJlIG5vdyBnZW5lcmF0ZWQgZm9yIGEgbnVtYmVyIG9mIGNvbmRpdGlvbnMKICB0aGF0IHdpbGwgYnJlYWsgb3IgY2hhbmdlIGluIG1lYW5pbmcgd2hlbiBuZXN0ZWQgc2NvcGVzIGFyZSBlbmFibGVkOgoKICAtIFVzaW5nICJmcm9tLi4uaW1wb3J0ICoiIG9yICJleGVjIiB3aXRob3V0IGluLWNsYXVzZSBpbiBhIGZ1bmN0aW9uCiAgICBzY29wZSB0aGF0IGFsc28gZGVmaW5lcyBhIGxhbWJkYSBvciBuZXN0ZWQgZnVuY3Rpb24gd2l0aCBvbmUgb3IKICAgIG1vcmUgZnJlZSAobm9uLWxvY2FsKSB2YXJpYWJsZXMuICBUaGUgcHJlc2VuY2Ugb2YgdGhlIGltcG9ydCogb3IKICAgIGJhcmUgZXhlYyBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciB0aGUgY29tcGlsZXIgdG8gZGV0ZXJtaW5lIHRoZQogICAgZXhhY3Qgc2V0IG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIG1ha2VzIGl0CiAgICBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgYmluZGluZ3MgZm9yIGZyZWUgdmFyaWFibGVzIGluIHRoZQogICAgaW5uZXIgc2NvcGUuICBUbyBhdm9pZCB0aGUgd2FybmluZyBhYm91dCBpbXBvcnQgKiwgY2hhbmdlIGl0IGludG8KICAgIGFuIGltcG9ydCBvZiBleHBsaWNpdGx5IG5hbWUgb2JqZWN0LCBvciBtb3ZlIHRoZSBpbXBvcnQqIHN0YXRlbWVudAogICAgdG8gdGhlIGdsb2JhbCBzY29wZTsgdG8gYXZvaWQgdGhlIHdhcm5pbmcgYWJvdXQgYmFyZSBleGVjLCB1c2UKICAgIGV4ZWMuLi5pbi4uLiAoYSBnb29kIGlkZWEgYW55d2F5IC0tIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0aGF0CiAgICBiYXJlIGV4ZWMgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUpLgoKICAtIFVzZSBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiBhIG5lc3RlZCBzY29wZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYQogICAgbG9jYWwgdmFyaWFibGUgaW4gYSBzdXJyb3VuZGluZyBzY29wZS4gIFRoaXMgd2lsbCBjaGFuZ2UgaW4KICAgIG1lYW5pbmcgd2l0aCBuZXN0ZWQgc2NvcGVzOiB0aGUgbmFtZSBpbiB0aGUgaW5uZXIgc2NvcGUgd2lsbAogICAgcmVmZXJlbmNlIHRoZSB2YXJpYWJsZSBpbiB0aGUgb3V0ZXIgc2NvcGUgcmF0aGVyIHRoYW4gdGhlIGdsb2JhbAogICAgb2YgdGhlIHNhbWUgbmFtZS4gIFRvIGF2b2lkIHRoZSB3YXJuaW5nLCBlaXRoZXIgcmVuYW1lIHRoZSBvdXRlcgogICAgdmFyaWFibGUsIG9yIHVzZSBhIGdsb2JhbCBzdGF0ZW1lbnQgaW4gdGhlIGlubmVyIGZ1bmN0aW9uLgoKLSBBbiBvcHRpb25hbCBvYmplY3QgYWxsb2NhdG9yIGhhcyBiZWVuIGluY2x1ZGVkLiAgVGhpcyBhbGxvY2F0b3IgaXMKICBvcHRpbWl6ZWQgZm9yIFB5dGhvbiBvYmplY3RzIGFuZCBzaG91bGQgYmUgZmFzdGVyIGFuZCB1c2UgbGVzcyBtZW1vcnkKICB0aGFuIHRoZSBzdGFuZGFyZCBzeXN0ZW0gYWxsb2NhdG9yLiAgSXQgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdAogIGJlY2F1c2Ugb2YgcG9zc2libGUgdGhyZWFkIHNhZmV0eSBwcm9ibGVtcy4gIFRoZSBhbGxvY2F0b3IgaXMgb25seQogIHByb3RlY3RlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyIGxvY2sgYW5kIGl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZQogIGV4dGVuc2lvbiBtb2R1bGVzIHJlcXVpcmUgYSB0aHJlYWQgc2FmZSBhbGxvY2F0b3IuICBUaGUgb2JqZWN0CiAgYWxsb2NhdG9yIGNhbiBiZSBlbmFibGVkIGJ5IHByb3ZpZGluZyB0aGUgIi0td2l0aC1weW1hbGxvYyIgb3B0aW9uIHRvCiAgY29uZmlndXJlLgoKU3RhbmRhcmQgbGlicmFyeQoKLSBweWV4cGF0IG5vdyBkZXRlY3RzIHRoZSBleHBhdCB2ZXJzaW9uIGlmIGV4cGF0LmggZGVmaW5lcyBpdC4gQQogIG51bWJlciBvZiBhZGRpdGlvbmFsIGhhbmRsZXJzIGFyZSBwcm92aWRlZCwgd2hpY2ggYXJlIG9ubHkgYXZhaWxhYmxlCiAgc2luY2UgZXhwYXQgMS45NS4gSW4gYWRkaXRpb24sIHRoZSBtZXRob2RzIFNldFBhcmFtRW50aXR5UGFyc2luZyBhbmQKICBHZXRJbnB1dENvbnRleHQgb2YgUGFyc2VyIG9iamVjdHMgYXJlIGF2YWlsYWJsZSB3aXRoIDEuOTUueAogIG9ubHkuIFBhcnNlciBvYmplY3RzIG5vdyBwcm92aWRlIHRoZSBvcmRlcmVkX2F0dHJpYnV0ZXMgYW5kCiAgc3BlY2lmaWVkX2F0dHJpYnV0ZXMgYXR0cmlidXRlcy4gQSBuZXcgbW9kdWxlIGV4cGF0Lm1vZGVsIHdhcyBhZGRlZCwKICB3aGljaCBvZmZlcnMgYSBudW1iZXIgb2YgYWRkaXRpb25hbCBjb25zdGFudHMgaWYgMS45NS54IGlzIHVzZWQuCgotIHhtbC5kb20gb2ZmZXJzIHRoZSBuZXcgZnVuY3Rpb25zIHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24gYW5kCiAgZ2V0RE9NSW1wbGVtZW50YXRpb24uCgotIHhtbC5kb20ubWluaWRvbSBvZmZlcnMgYSB0b3ByZXR0eXhtbCBtZXRob2QuIEEgbnVtYmVyIG9mIERPTQogIGNvbmZvcm1hbmNlIGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQuIEluIHBhcnRpY3VsYXIsIEVsZW1lbnQgbm93CiAgaGFzIGFuIGhhc0F0dHJpYnV0ZXMgbWV0aG9kLCBhbmQgdGhlIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2FzCiAgaW1wcm92ZWQuCgotIEthLVBpbmcgWWVlIGNvbnRyaWJ1dGVkIHR3byBuZXcgbW9kdWxlczogaW5zcGVjdC5weSwgYSBtb2R1bGUgZm9yCiAgZ2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCBsaXZlIFB5dGhvbiBjb2RlLCBhbmQgcHlkb2MucHksIGEgbW9kdWxlCiAgZm9yIGludGVyYWN0aXZlbHkgY29udmVydGluZyBkb2NzdHJpbmdzIHRvIEhUTUwgb3IgdGV4dC4KICBUb29scy9zY3JpcHRzL3B5ZG9jLCB3aGljaCBpcyBub3cgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgaW50bwogIDxwcmVmaXg+L2JpbiwgdXNlcyBweWRvYy5weSB0byBkaXNwbGF5IGRvY3VtZW50YXRpb247IHRyeSBydW5uaW5nCiAgInB5ZG9jIC1oIiBmb3IgaW5zdHJ1Y3Rpb25zLiAgInB5ZG9jIC1nIiBwb3BzIHVwIGEgc21hbGwgR1VJIHRoYXQKICBsZXRzIHlvdSBicm93c2UgdGhlIG1vZHVsZSBkb2NzdHJpbmdzIHVzaW5nIGEgd2ViIGJyb3dzZXIuCgotIE5ldyBsaWJyYXJ5IG1vZHVsZSBkaWZmbGliLnB5LCBwcmltYXJpbHkgcGFja2FnaW5nIHRoZSBTZXF1ZW5jZU1hdGNoZXIKICBjbGFzcyBhdCB0aGUgaGVhcnQgb2YgdGhlIHBvcHVsYXIgbmRpZmYucHkgZmlsZS1jb21wYXJpc29uIHRvb2wuCgotIGRvY3Rlc3QucHkgKGEgZnJhbWV3b3JrIGZvciB2ZXJpZnlpbmcgUHl0aG9uIGNvZGUgZXhhbXBsZXMgaW4gZG9jc3RyaW5ncykKICBpcyBub3cgcGFydCBvZiB0aGUgc3RkIGxpYnJhcnkuCgpXaW5kb3dzIGNoYW5nZXMKCi0gQSBuZXcgZW50cnkgaW4gdGhlIFN0YXJ0IG1lbnUsICJNb2R1bGUgRG9jcyIsIHJ1bnMgInB5ZG9jIC1nIiAtLSBhCiAgc21hbGwgR1VJIHRoYXQgbGV0cyB5b3UgYnJvd3NlIHRoZSBtb2R1bGUgZG9jc3RyaW5ncyB1c2luZyB5b3VyCiAgZGVmYXVsdCB3ZWIgYnJvd3Nlci4KCi0gSW1wb3J0IGlzIG5vdyBjYXNlLXNlbnNpdGl2ZS4gIFBFUCAyMzUgKEltcG9ydCBvbiBDYXNlLUluc2Vuc2l0aXZlCiAgUGxhdGZvcm1zKSBpcyBpbXBsZW1lbnRlZC4gIFNlZQoKICAgICAgaHR0cDovL3B5dGhvbi5zb3VyY2Vmb3JnZS5uZXQvcGVwcy9wZXAtMDIzNS5odG1sCgogIGZvciBmdWxsIGRldGFpbHMsIGVzcGVjaWFsbHkgdGhlICJDdXJyZW50IExvd2VyLUxlZnQgU2VtYW50aWNzIiBzZWN0aW9uLgogIFRoZSBuZXcgV2luZG93cyBpbXBvcnQgcnVsZXMgYXJlIHNpbXBsZXIgdGhhbiBiZWZvcmU6CgogIEEuIElmIHRoZSBQWVRIT05DQVNFT0sgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzLCBzYW1lIGFzCiAgICAgYmVmb3JlOiAgc2lsZW50bHkgYWNjZXB0IHRoZSBmaXJzdCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIG9mIGFueQogICAgIGtpbmQ7IHJhaXNlIEltcG9ydEVycm9yIGlmIG5vbmUgZm91bmQuCgogIEIuIEVsc2Ugc2VhcmNoIHN5cy5wYXRoIGZvciB0aGUgZmlyc3QgY2FzZS1zZW5zaXRpdmUgbWF0Y2g7IHJhaXNlCiAgICAgSW1wb3J0RXJyb3IgaWYgbm9uZSBmb3VuZC4KCiAgVGhlIHNhbWUgcnVsZXMgaGF2ZSBiZWVuIGltcGxlbnRlZCBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjYXNlLQogIGluc2Vuc2l0aXZlIGJ1dCBjYXNlLXByZXNlcnZpbmcgZmlsZXN5c3RlbXMgdG9vIChpbmNsdWRpbmcgQ3lnd2luLCBhbmQKICBzZXZlcmFsIGZsYXZvcnMgb2YgTWFjaW50b3NoIG9wZXJhdGluZyBzeXN0ZW1zKS4KCi0gd2luc291bmQgbW9kdWxlOiAgVW5kZXIgV2luOXgsIHdpbnNvdW5kLkJlZXAoKSBub3cgYXR0ZW1wdHMgdG8gc2ltdWxhdGUKICB3aGF0IGl0J3Mgc3VwcG9zZWQgdG8gZG8gKGFuZCBkb2VzIGRvIHVuZGVyIE5UIGFuZCAyMDAwKSB2aWEgZGlyZWN0CiAgcG9ydCBtYW5pcHVsYXRpb24uICBJdCdzIHVua25vd24gd2hldGhlciB0aGlzIHdpbGwgd29yayBvbiBhbGwgc3lzdGVtcywKICBidXQgaXQgZG9lcyB3b3JrIG9uIG15IFdpbjk4U0Ugc3lzdGVtcyBub3cgYW5kIHdhcyBrbm93biB0byBiZSB1c2VsZXNzIG9uCiAgYWxsIFdpbjl4IHN5c3RlbXMgYmVmb3JlLgoKLSBCdWlsZDogIFN1YnByb2plY3QgX3Rlc3QgKGVmZmVjdGl2ZWx5KSByZW5hbWVkIHRvIF90ZXN0Y2FwaS4KCk5ldyBwbGF0Zm9ybXMKCi0gMi4xIHNob3VsZCBjb21waWxlIGFuZCBydW4gb3V0IG9mIHRoZSBib3ggdW5kZXIgTWFjT1MgWCwgZXZlbiB1c2luZyBIRlMrLgogIFRoYW5rcyB0byBTdGV2ZW4gTWFqZXdza2khCgotIDIuMSBzaG91bGQgY29tcGlsZSBhbmQgcnVuIG91dCBvZiB0aGUgYm94IG9uIEN5Z3dpbi4gIFRoYW5rcyB0byBKYXNvbgogIFRpc2hsZXIhCgotIDIuMSBjb250YWlucyBuZXcgZmlsZXMgYW5kIHBhdGNoZXMgZm9yIFJJU0NPUywgdGhhbmtzIHRvIERpZXRtYXIKICBTY2h3ZXJ0YmVyZ2VyISAgU2VlIFJJU0NPUy9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24gLS0gaXQgc2VlbXMKICB0aGF0IGJlY2F1c2Ugb2YgdGhlIGJpemFycmUgZmlsZW5hbWUgY29udmVudGlvbnMgb24gUklTQ09TLCBubyBwb3J0CiAgdG8gdGhhdCBwbGF0Zm9ybSBpcyBlYXN5LiAgTm90ZSB0aGF0IHRoZSBuZXcgdmFyaWFibGUgb3MuZW5kc2VwIGlzCiAgc2lsZW50bHkgc3VwcG9ydGVkIGluIG9yZGVyIHRvIG1ha2UgbGlmZSBlYXNpZXIgb24gdGhpcyBwbGF0Zm9ybSwKICBidXQgd2UgZG9uJ3QgYWR2ZXJ0aXNlIGl0IGJlY2F1c2UgaXQncyBub3Qgd29ydGggZm9yIG1vc3QgZm9sa3MgdG8KICBjYXJlIGFib3V0IFJJU0NPUyBwb3J0YWJpbGl0eS4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjEgYWxwaGEgMj8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIFNjb3BlcyBuZXN0LiAgSWYgYSBuYW1lIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcywgYnV0IGlzIG5vdAogIGxvY2FsLCB0aGUgZGVmaW5pdGlvbiBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUgd2lsbAogIGJlIHVzZWQuICBPbmUgY29uc2VxdWVuY2Ugb2YgdGhpcyBjaGFuZ2UgaXMgdGhhdCBsYW1iZGEgc3RhdGVtZW50cwogIGNvdWxkIHJlZmVyZW5jZSB2YXJpYWJsZXMgaW4gdGhlIG5hbWVzcGFjZXMgd2hlcmUgdGhlIGxhbWJkYSBpcwogIGRlZmluZWQuICBJbiBzb21lIHVudXN1YWwgY2FzZXMsIHRoaXMgY2hhbmdlIHdpbGwgYnJlYWsgY29kZS4KCiAgSW4gYWxsIHByZXZpb3VzIHZlcnNpb24gb2YgUHl0aG9uLCBuYW1lcyB3ZXJlIHJlc29sdmVkIGluIGV4YWN0bHkKICB0aHJlZSBuYW1lc3BhY2VzIC0tIHRoZSBsb2NhbCBuYW1lc3BhY2UsIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBhbmQKICB0aGUgYnVpbHRpbiBuYW1lc3BhY2UuICBBY2NvcmRpbmcgdG8gdGhpcyBvbGQgZGVmaW5pdGlvbiwgaWYgYQogIGZ1bmN0aW9uIEEgaXMgZGVmaW5lZCB3aXRoaW4gYSBmdW5jdGlvbiBCLCB0aGUgbmFtZXMgYm91bmQgaW4gQiBhcmUKICBub3QgdmlzaWJsZSBpbiBBLiAgVGhlIG5ldyBydWxlcyBtYWtlIG5hbWVzIGJvdW5kIGluIEIgdmlzaWJsZSBpbiBBLAogIHVubGVzcyBBIGNvbnRhaW5zIGEgbmFtZSBiaW5kaW5nIHRoYXQgaGlkZXMgdGhlIGJpbmRpbmcgaW4gQi4KCiAgU2VjdGlvbiA0LjEgb2YgdGhlIHJlZmVyZW5jZSBtYW51YWwgZGVzY3JpYmVzIHRoZSBuZXcgc2NvcGluZyBydWxlcwogIGluIGRldGFpbC4gIFRoZSB0ZXN0IHNjcmlwdCBpbiBMaWIvdGVzdC90ZXN0X3Njb3BlLnB5IGRlbW9uc3RyYXRlcwogIHNvbWUgb2YgdGhlIGVmZmVjdHMgb2YgdGhlIGNoYW5nZS4KCiAgVGhlIG5ldyBydWxlcyB3aWxsIGNhdXNlIGV4aXN0aW5nIGNvZGUgdG8gYnJlYWsgaWYgaXQgZGVmaW5lcyBuZXN0ZWQKICBmdW5jdGlvbnMgd2hlcmUgYW4gb3V0ZXIgZnVuY3Rpb24gaGFzIGxvY2FsIHZhcmlhYmxlcyB3aXRoIHRoZSBzYW1lCiAgbmFtZSBhcyBnbG9iYWxzIG9yIGJ1aWx0aW5zIHVzZWQgYnkgdGhlIGlubmVyIGZ1bmN0aW9uLiAgRXhhbXBsZToKCiAgICBkZWYgbXVuZ2Uoc3RyKToKICAgICAgICBkZWYgaGVscGVyKHgpOgogICAgICAgICAgICByZXR1cm4gc3RyKHgpCiAgICAgICAgaWYgdHlwZShzdHIpICE9IHR5cGUoJycpOgogICAgICAgICAgICBzdHIgPSBoZWxwZXIoc3RyKQogICAgICAgIHJldHVybiBzdHIuc3RyaXAoKQoKICBVbmRlciB0aGUgb2xkIHJ1bGVzLCB0aGUgbmFtZSBzdHIgaW4gaGVscGVyKCkgaXMgYm91bmQgdG8gdGhlCiAgYnVpbHRpbiBmdW5jdGlvbiBzdHIoKS4gIFVuZGVyIHRoZSBuZXcgcnVsZXMsIGl0IHdpbGwgYmUgYm91bmQgdG8KICB0aGUgYXJndW1lbnQgbmFtZWQgc3RyIGFuZCBhbiBlcnJvciB3aWxsIG9jY3VyIHdoZW4gaGVscGVyKCkgaXMKICBjYWxsZWQuCgotIFRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBhIFN5bnRheEVycm9yIGlmICJmcm9tIC4uLiBpbXBvcnQgKiIgb2NjdXJzCiAgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBzY29wZS4gIFRoZSBsYW5ndWFnZSByZWZlcmVuY2UgaGFzIGRvY3VtZW50ZWQKICB0aGF0IHRoaXMgY2FzZSBpcyBpbGxlZ2FsLCBidXQgdGhlIGNvbXBpbGVyIG5ldmVyIGNoZWNrZWQgZm9yIGl0LgogIFRoZSByZWNlbnQgaW50cm9kdWN0aW9uIG9mIG5lc3RlZCBzY29wZSBtYWtlcyB0aGUgbWVhbmluZyBvZiB0aGlzCiAgZm9ybSBvZiBuYW1lIGJpbmRpbmcgYW1iaWd1b3VzLiAgSW4gYSBmdXR1cmUgcmVsZWFzZSwgdGhlIGNvbXBpbGVyCiAgbWF5IGFsbG93IHRoaXMgZm9ybSB3aGVuIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IG9mIGFtYmlndWl0eS4KCi0gcmVwcihzdHJpbmcpIGlzIGVhc2llciB0byByZWFkLCBub3cgdXNpbmcgaGV4IGVzY2FwZXMgaW5zdGVhZCBvZiBvY3RhbCwKICBhbmQgdXNpbmcgXHQsIFxuIGFuZCBcciBpbnN0ZWFkIG9mIFwwMTEsIFwwMTIgYW5kIFwwMTUgKHJlc3BlY3RpdmVseSk6CgogID4+PiAiXHRleGFtcGxlIFxyXG4iICsgY2hyKDApICsgY2hyKDI1NSkKICAnXHRleGFtcGxlIFxyXG5ceDAwXHhmZicgICAgICAgICAjIGluIDIuMQogICdcMDExZXhhbXBsZSBcMDE1XDAxMlwwMDBcMzc3JyAgICMgaW4gMi4wCgotIEZ1bmN0aW9ucyBhcmUgbm93IGNvbXBhcmVkIGFuZCBoYXNoZWQgYnkgaWRlbnRpdHksIG5vdCBieSB2YWx1ZSwgc2luY2UKICB0aGUgZnVuY19jb2RlIGF0dHJpYnV0ZSBpcyB3cml0YWJsZS4KCi0gV2VhayByZWZlcmVuY2VzIChQRVAgMjA1KSBoYXZlIGJlZW4gYWRkZWQuICBUaGlzIGludm9sdmVzIGEgZmV3CiAgY2hhbmdlcyBpbiB0aGUgY29yZSwgYW4gZXh0ZW5zaW9uIG1vZHVsZSAoX3dlYWtyZWYpLCBhbmQgYSBQeXRob24KICBtb2R1bGUgKHdlYWtyZWYpLiAgVGhlIHdlYWtyZWYgbW9kdWxlIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiAgSXQKICBpbmNsdWRlcyBzdXBwb3J0IGZvciAiZXhwbGljaXQiIHdlYWsgcmVmZXJlbmNlcywgcHJveHkgb2JqZWN0cywgYW5kCiAgbWFwcGluZ3Mgd2l0aCB3ZWFrbHkgaGVsZCB2YWx1ZXMuCgotIEEgJ2NvbnRpbnVlJyBzdGF0ZW1lbnQgY2FuIG5vdyBhcHBlYXIgaW4gYSB0cnkgYmxvY2sgd2l0aGluIHRoZSBib2R5CiAgb2YgYSBsb29wLiAgSXQgaXMgc3RpbGwgbm90IHBvc3NpYmxlIHRvIHVzZSBjb250aW51ZSBpbiBhIGZpbmFsbHkKICBjbGF1c2UuCgpTdGFuZGFyZCBsaWJyYXJ5CgotIG1haWxib3gucHkgbm93IGhhcyBhIG5ldyBjbGFzcywgUG9ydGFibGVVbml4TWFpbGJveCB3aGljaCBpcwogIGlkZW50aWNhbCB0byBVbml4TWFpbGJveCBidXQgdXNlcyBhIG1vcmUgcG9ydGFibGUgc2NoZW1lIGZvcgogIGRldGVybWluaW5nIEZyb21fIHNlcGFyYXRvcnMuICBBbHNvLCB0aGUgY29uc3RydWN0b3JzIGZvciBhbGwgdGhlCiAgY2xhc3NlcyBpbiB0aGlzIG1vZHVsZSBoYXZlIGEgbmV3IG9wdGlvbmFsIGBmYWN0b3J5JyBhcmd1bWVudCwgd2hpY2gKICBpcyBhIGNhbGxhYmxlIHVzZWQgd2hlbiBuZXcgbWVzc2FnZSBjbGFzc2VzIG11c3QgYmUgaW5zdGFudGlhdGVkIGJ5CiAgdGhlIG5leHQoKSBtZXRob2QuCgotIHJhbmRvbS5weSBpcyBub3cgc2VsZi1jb250YWluZWQsIGFuZCBvZmZlcnMgYWxsIHRoZSBmdW5jdGlvbmFsaXR5IG9mCiAgdGhlIG5vdy1kZXByZWNhdGVkIHdocmFuZG9tLnB5LiAgU2VlIHRoZSBkb2NzIGZvciBkZXRhaWxzLiAgcmFuZG9tLnB5CiAgYWxzbyBzdXBwb3J0cyBuZXcgZnVuY3Rpb25zIGdldHN0YXRlKCkgYW5kIHNldHN0YXRlKCksIGZvciBzYXZpbmcKICBhbmQgcmVzdG9yaW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yOyBhbmQganVtcGFoZWFkKG4pLAogIGZvciBxdWlja2x5IGZvcmNpbmcgdGhlIGludGVybmFsIHN0YXRlIHRvIGJlIHRoZSBzYW1lIGFzIGlmIG4gY2FsbHMgdG8KICByYW5kb20oKSBoYWQgYmVlbiBtYWRlLiAgVGhlIGxhdHRlciBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBtdWx0aS0KICB0aHJlYWRlZCBwcm9ncmFtcywgY3JlYXRpbmcgb25lIGluc3RhbmNlIG9mIHRoZSByYW5kb20uUmFuZG9tKCkgY2xhc3MgZm9yCiAgZWFjaCB0aHJlYWQsIHRoZW4gdXNpbmcgLmp1bXBhaGVhZCgpIHRvIGZvcmNlIGVhY2ggaW5zdGFuY2UgdG8gdXNlIGEKICBub24tb3ZlcmxhcHBpbmcgc2VnbWVudCBvZiB0aGUgZnVsbCBwZXJpb2QuCgotIHJhbmRvbS5weSdzIHNlZWQoKSBmdW5jdGlvbiBpcyBuZXcuICBGb3IgYml0LWZvci1iaXQgY29tcGF0aWJpbGl0eSB3aXRoCiAgcHJpb3IgcmVsZWFzZXMsIHVzZSB0aGUgd2hzZWVkIGZ1bmN0aW9uIGluc3RlYWQuICBUaGUgbmV3IHNlZWQgZnVuY3Rpb24KICBhZGRyZXNzZXMgdHdvIHByb2JsZW1zOiAgKDEpIFRoZSBvbGQgZnVuY3Rpb24gY291bGRuJ3QgcHJvZHVjZSBtb3JlIHRoYW4KICBhYm91dCAyKioyNCBkaXN0aW5jdCBpbnRlcm5hbCBzdGF0ZXM7IHRoZSBuZXcgb25lIGFib3V0IDIqKjQ1ICh0aGUgYmVzdAogIHRoYXQgY2FuIGJlIGRvbmUgaW4gdGhlIFdpY2htYW5uLUhpbGwgZ2VuZXJhdG9yKS4gICgyKSBUaGUgb2xkIGZ1bmN0aW9uCiAgc29tZXRpbWVzIHByb2R1Y2VkIGlkZW50aWNhbCBpbnRlcm5hbCBzdGF0ZXMgd2hlbiBwYXNzZWQgZGlzdGluY3QKICBpbnRlZ2VycywgYW5kIHRoZXJlIHdhcyBubyBzaW1wbGUgd2F5IHRvIHByZWRpY3Qgd2hlbiB0aGF0IHdvdWxkIGhhcHBlbjsKICB0aGUgbmV3IG9uZSBndWFyYW50ZWVzIHRvIHByb2R1Y2UgZGlzdGluY3QgaW50ZXJuYWwgc3RhdGVzIGZvciBhbGwKICBhcmd1bWVudHMgaW4gWzAsIDI3ODE0NDMxNDg2NTc2TCkuCgotIFRoZSBzb2NrZXQgbW9kdWxlIG5vdyBzdXBwb3J0cyByYXcgcGFja2V0cyBvbiBMaW51eC4gIFRoZSBzb2NrZXQKICBmYW1pbHkgaXMgQUZfUEFDS0VULgoKLSB0ZXN0X2NhcGkucHkgaXMgYSBzdGFydCBhdCBydW5uaW5nIHRlc3RzIG9mIHRoZSBQeXRob24gQyBBUEkuICBUaGUgdGVzdHMKICBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlIG5ldyBNb2R1bGVzL190ZXN0bW9kdWxlLmMuCgotIEEgbmV3IGV4dGVuc2lvbiBtb2R1bGUsIF9zeW10YWJsZSwgcHJvdmlkZXMgcHJvdmlzaW9uYWwgYWNjZXNzIHRvIHRoZQogIGludGVybmFsIHN5bWJvbCB0YWJsZSB1c2VkIGJ5IHRoZSBQeXRob24gY29tcGlsZXIuICBBIGhpZ2hlci1sZXZlbAogIGludGVyZmFjZSB3aWxsIGJlIGFkZGVkIG9uIHRvcCBvZiBfc3ltdGFibGUgaW4gYSBmdXR1cmUgcmVsZWFzZS4KCi0gUmVtb3ZlZCB0aGUgb2Jzb2xldGUgc291bmRleCBtb2R1bGUuCgotIHhtbC5kb20ubWluaWRvbSBub3cgdXNlcyB0aGUgc3RhbmRhcmQgRE9NIGV4Y2VwdGlvbnMuIE5vZGUgc3VwcG9ydHMKICB0aGUgaXNTYW1lTm9kZSBtZXRob2Q7IE5hbWVkTm9kZU1hcCB0aGUgZ2V0IG1ldGhvZC4KCi0geG1sLnNheC5leHBhdHJlYWRlciBzdXBwb3J0cyB0aGUgbGV4aWNhbCBoYW5kbGVyIHByb3BlcnR5OyBpdAogIGdlbmVyYXRlcyBjb21tZW50LCBzdGFydENEQVRBLCBhbmQgZW5kQ0RBVEEgZXZlbnRzLgoKV2luZG93cyBjaGFuZ2VzCgotIEJ1aWxkIHByb2NlZHVyZTogIHRoZSB6bGliIHByb2plY3QgaXMgYnVpbHQgaW4gYSBkaWZmZXJlbnQgd2F5IHRoYXQKICBlbnN1cmVzIHRoZSB6bGliIGhlYWRlciBmaWxlcyB1c2VkIGNhbiBubyBsb25nZXIgZ2V0IG91dCBvZiBzeW5jaCB3aXRoCiAgdGhlIHpsaWIgYmluYXJ5IHVzZWQuICBTZWUgUENidWlsZFxyZWFkbWUudHh0IGZvciBkZXRhaWxzLiAgWW91ciBvbGQKICB6bGliLXJlbGF0ZWQgZGlyZWN0b3JpZXMgY2FuIGJlIGRlbGV0ZWQ7IHlvdSdsbCBuZWVkIHRvIGRvd25sb2FkIGZyZXNoCiAgc291cmNlIGZvciB6bGliIGFuZCB1bnBhY2sgaXQgaW50byBhIG5ldyBkaXJlY3RvcnkuCgotIEJ1aWxkOiAgTmV3IHN1YnByb2plY3QgX3Rlc3QgZm9yIHRoZSBiZW5lZml0IG9mIHRlc3RfY2FwaS5weSAoc2VlIGFib3ZlKS4KCi0gQnVpbGQ6ICBOZXcgc3VicHJvamVjdCBfc3ltdGFibGUsIGZvciBuZXcgRExMIF9zeW10YWJsZS5weWQgKGEgbmFzY2VudAogIGludGVyZmFjZSB0byBzb21lIFB5dGhvbiBjb21waWxlciBpbnRlcm5hbHMpLgoKLSBCdWlsZDogIFN1YnByb2plY3QgdWNuaGFzaCBpcyBnb25lLCBzaW5jZSB0aGUgY29kZSB3YXMgZm9sZGVkIGludG8gdGhlCiAgdW5pY29kZWRhdGEgc3VicHJvamVjdC4KCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMSBhbHBoYSAxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNvcmUgbGFuZ3VhZ2UsIGJ1aWx0aW5zLCBhbmQgaW50ZXJwcmV0ZXIKCi0gVGhlcmUgaXMgYSBuZXcgVW5pY29kZSBjb21wYW5pb24gdG8gdGhlIFB5T2JqZWN0X1N0cigpIEFQSQogIGNhbGxlZCBQeU9iamVjdF9Vbmljb2RlKCkuIEl0IGJlaGF2ZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZQogIGZvcm1lciwgYnV0IGFzc3VyZXMgdGhhdCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gVW5pY29kZSBvYmplY3QKICAoYXBwbHlpbmcgdGhlIHVzdWFsIGNvZXJjaW9uIGlmIG5lY2Vzc2FyeSkuCgotIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBzdXBwb3J0ICJyaWNoIGNvbXBhcmlzb24gb3ZlcmxvYWRpbmciIChQRVAKICAyMDcpLiAgQyBleHRlbnNpb24gdHlwZXMgY2FuIHByb3ZpZGUgYSByaWNoIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4KICB0aGUgbmV3IHRwX3JpY2hjb21wYXJlIHNsb3QgaW4gdGhlIHR5cGUgb2JqZWN0LiAgVGhlIGNtcCgpIGZ1bmN0aW9uCiAgYW5kIHRoZSBDIGZ1bmN0aW9uIFB5T2JqZWN0X0NvbXBhcmUoKSBmaXJzdCB0cnkgdGhlIG5ldyByaWNoCiAgY29tcGFyaXNvbiBvcGVyYXRvcnMgYmVmb3JlIHRyeWluZyB0aGUgb2xkIDMtd2F5IGNvbXBhcmlzb24uICBUaGVyZQogIGlzIGFsc28gYSBuZXcgQyBBUEkgUHlPYmplY3RfUmljaENvbXBhcmUoKSAod2hpY2ggYWxzbyBmYWxscyBiYWNrIG9uCiAgdGhlIG9sZCAzLXdheSBjb21wYXJpc29uLCBidXQgZG9lcyBub3QgY29uc3RyYWluIHRoZSBvdXRjb21lIG9mIHRoZQogIHJpY2ggY29tcGFyaXNvbiB0byBhIEJvb2xlYW4gcmVzdWx0KS4KCiAgVGhlIHJpY2ggY29tcGFyaXNvbiBmdW5jdGlvbiB0YWtlcyB0d28gb2JqZWN0cyAoYXQgbGVhc3Qgb25lIG9mCiAgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSB0eXBlIHRoYXQgcHJvdmlkZWQgdGhlIGZ1bmN0aW9uKSBhbmQKICBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG9wY29kZSwgd2hpY2ggY2FuIGJlIFB5X0xULCBQeV9MRSwgUHlfRVEsCiAgUHlfTkUsIFB5X0dULCBQeV9HRSAoZm9yIDwsIDw9LCA9PSwgIT0sID4sID49KSwgYW5kIHJldHVybnMgYSBQeXRob24KICBvYmplY3QsIHdoaWNoIG1heSBiZSBOb3RJbXBsZW1lbnRlZCAoaW4gd2hpY2ggY2FzZSB0aGUgdHBfY29tcGFyZQogIHNsb3QgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGZhbGxiYWNrLCBpZiBkZWZpbmVkKS4KCiAgQ2xhc3NlcyBjYW4gb3ZlcmxvYWQgaW5kaXZpZHVhbCBjb21wYXJpc29uIG9wZXJhdG9ycyBieSBkZWZpbmluZyBvbmUKICBvciBtb3JlIG9mIHRoZSBtZXRob2RzX19sdF9fLCBfX2xlX18sIF9fZXFfXywgX19uZV9fLCBfX2d0X18sCiAgX19nZV9fLiAgVGhlcmUgYXJlIG5vIGV4cGxpY2l0ICJyZWZsZWN0ZWQgYXJndW1lbnQiIHZlcnNpb25zIG9mCiAgdGhlc2U7IGluc3RlYWQsIF9fbHRfXyBhbmQgX19ndF9fIGFyZSBlYWNoIG90aGVyJ3MgcmVmbGVjdGlvbiwKICBsaWtld2lzZSBmb3JfX2xlX18gYW5kIF9fZ2VfXzsgX19lcV9fIGFuZCBfX25lX18gYXJlIHRoZWlyIG93bgogIHJlZmxlY3Rpb24gKHNpbWlsYXIgYXQgdGhlIEMgbGV2ZWwpLiAgTm8gb3RoZXIgaW1wbGljYXRpb25zIGFyZQogIG1hZGU7IGluIHBhcnRpY3VsYXIsIFB5dGhvbiBkb2VzIG5vdCBhc3N1bWUgdGhhdCA9PSBpcyB0aGUgQm9vbGVhbgogIGludmVyc2Ugb2YgIT0sIG9yIHRoYXQgPCBpcyB0aGUgQm9vbGVhbiBpbnZlcnNlIG9mID49LiAgVGhpcyBtYWtlcwogIGl0IHBvc3NpYmxlIHRvIGRlZmluZSB0eXBlcyB3aXRoIHBhcnRpYWwgb3JkZXJpbmdzLgoKICBDbGFzc2VzIG9yIHR5cGVzIHRoYXQgd2FudCB0byBpbXBsZW1lbnQgKGluKWVxdWFsaXR5IHRlc3RzIGJ1dCBub3QKICB0aGUgb3JkZXJpbmcgb3BlcmF0b3JzIChpLmUuIHVub3JkZXJlZCB0eXBlcykgc2hvdWxkIGltcGxlbWVudCA9PQogIGFuZCAhPSwgYW5kIHJhaXNlIGFuIGVycm9yIGZvciB0aGUgb3JkZXJpbmcgb3BlcmF0b3JzLgoKICBJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgdHlwZXMgd2hvc2UgcmljaCBjb21wYXJpc29uIHJlc3VsdHMgYXJlIG5vdAogIEJvb2xlYW47IGUuZy4gYSBtYXRyaXggdHlwZSBtaWdodCB3YW50IHRvIHJldHVybiBhIG1hdHJpeCBvZiBiaXRzCiAgZm9yIEEgPCBCLCBnaXZpbmcgZWxlbWVudHdpc2UgY29tcGFyaXNvbnMuICBTdWNoIHR5cGVzIHNob3VsZCBlbnN1cmUKICB0aGF0IGFueSBpbnRlcnByZXRhdGlvbiBvZiB0aGVpciB2YWx1ZSBpbiBhIEJvb2xlYW4gY29udGV4dCByYWlzZXMKICBhbiBleGNlcHRpb24sIGUuZy4gYnkgZGVmaW5pbmcgX19ub256ZXJvX18gKG9yIHRoZSB0cF9ub256ZXJvIHNsb3QKICBhdCB0aGUgQyBsZXZlbCkgdG8gYWx3YXlzIHJhaXNlIGFuIGV4Y2VwdGlvbi4KCi0gQ29tcGxleCBudW1iZXJzIHVzZSByaWNoIGNvbXBhcmlzb25zIHRvIGRlZmluZSA9PSBhbmQgIT0gYnV0IHJhaXNlCiAgYW4gZXhjZXB0aW9uIGZvciA8LCA8PSwgPiBhbmQgPj0uICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gbWVhbnMKICB0aGF0IGNtcCgpIG9mIHR3byBjb21wbGV4IG51bWJlcnMgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSB0d28KICBudW1iZXJzIGRpZmZlci4gIFNpbmNlIGl0IGlzIG5vdCBtYXRoZW1hdGljYWxseSBtZWFuaW5nZnVsIHRvIGNvbXBhcmUKICBjb21wbGV4IG51bWJlcnMgZXhjZXB0IGZvciBlcXVhbGl0eSwgSSBob3BlIHRoYXQgdGhpcyBkb2Vzbid0IGJyZWFrCiAgdG9vIG11Y2ggY29kZS4KCi0gVGhlIG91dGNvbWUgb2YgY29tcGFyaW5nIG5vbi1udW1lcmljIG9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzIGlzCiAgbm90IGRlZmluZWQgYnkgdGhlIGxhbmd1YWdlLCBvdGhlciB0aGFuIHRoYXQgaXQncyBhcmJpdHJhcnkgYnV0CiAgY29uc2lzdGVudCAoc2VlIHRoZSBSZWZlcmVuY2UgTWFudWFsKS4gIEFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBjaGFuZ2VkCiAgaW4gMi4xYTEgc3VjaCB0aGF0IE5vbmUgbm93IGNvbXBhcmVzIGxlc3MgdGhhbiBhbnkgb3RoZXIgb2JqZWN0LiAgQ29kZQogIHJlbHlpbmcgb24gdGhpcyBuZXcgYmVoYXZpb3IgKGxpa2UgY29kZSB0aGF0IHJlbGllZCBvbiB0aGUgcHJldmlvdXMKICBiZWhhdmlvcikgZG9lcyBzbyBhdCBpdHMgb3duIHJpc2suCgotIEZ1bmN0aW9ucyBhbmQgbWV0aG9kcyBub3cgc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyaWx5CiAgbmFtZWQgYXR0cmlidXRlcyAoUEVQIDIzMikuICBGdW5jdGlvbnMgaGF2ZSBhIG5ldyBfX2RpY3RfXwogIChhLmsuYS4gZnVuY19kaWN0KSB3aGljaCBob2xkIHRoZSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgTWV0aG9kcyBnZXQKICBhbmQgc2V0IGF0dHJpYnV0ZXMgb24gdGhlaXIgdW5kZXJseWluZyBpbV9mdW5jLiAgSXQgaXMgYSBUeXBlRXJyb3IKICB0byBzZXQgYW4gYXR0cmlidXRlIG9uIGEgYm91bmQgbWV0aG9kLgoKLSBUaGUgeHJhbmdlKCkgb2JqZWN0IGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkIHNvIHRoYXQKICB4cmFuZ2Uoc3lzLm1heGludCkgY2FuIGJlIHVzZWQgb24gNjQtYml0IHBsYXRmb3Jtcy4gIFRoZXJlJ3Mgc3RpbGwgYQogIGxpbWl0YXRpb24gdGhhdCBpbiB0aGlzIGNhc2UgbGVuKHhyYW5nZShzeXMubWF4aW50KSkgY2FuJ3QgYmUKICBjYWxjdWxhdGVkLCBidXQgdGhlIGNvbW1vbiBpZGlvbSAiZm9yIGkgaW4geHJhbmdlKHN5cy5tYXhpbnQpIiB3aWxsCiAgd29yayBmaW5lIGFzIGxvbmcgYXMgdGhlIGluZGV4IGkgZG9lc24ndCBhY3R1YWxseSByZWFjaCAyKiozMS4KICAoUHl0aG9uIHVzZXMgcmVndWxhciBpbnRzIGZvciBzZXF1ZW5jZSBhbmQgc3RyaW5nIGluZGljZXM7IGZpeGluZwogIHRoYXQgaXMgbXVjaCBtb3JlIHdvcmsuKQoKLSBUd28gY2hhbmdlcyB0byBmcm9tLi4uaW1wb3J0OgoKICAxKSAiZnJvbSBNIGltcG9ydCBYIiBub3cgd29ya3MgZXZlbiBpZiAoYWZ0ZXIgbG9hZGluZyBtb2R1bGUgTSkKICAgICBzeXMubW9kdWxlc1snTSddIGlzIG5vdCBhIHJlYWwgbW9kdWxlOyBpdCdzIGJhc2ljYWxseSBhIGdldGF0dHIoKQogICAgIG9wZXJhdGlvbiB3aXRoIEF0dHJpYnV0ZUVycm9yIGV4Y2VwdGlvbnMgY2hhbmdlZCBpbnRvIEltcG9ydEVycm9yLgoKICAyKSAiZnJvbSBNIGltcG9ydCAqIiBub3cgbG9va3MgZm9yIE0uX19hbGxfXyB0byBkZWNpZGUgd2hpY2ggbmFtZXMgdG8KICAgICBpbXBvcnQ7IGlmIE0uX19hbGxfXyBkb2Vzbid0IGV4aXN0LCBpdCB1c2VzIE0uX19kaWN0X18ua2V5cygpIGJ1dAogICAgIGZpbHRlcnMgb3V0IG5hbWVzIHN0YXJ0aW5nIHdpdGggJ18nIGFzIGJlZm9yZS4gIFdoZXRoZXIgb3Igbm90CiAgICAgX19hbGxfXyBleGlzdHMsIHRoZXJlJ3Mgbm8gcmVzdHJpY3Rpb24gb24gdGhlIHR5cGUgb2YgTS4KCi0gRmlsZSBvYmplY3RzIGhhdmUgYSBuZXcgbWV0aG9kLCB4cmVhZGxpbmVzKCkuICBUaGlzIGlzIHRoZSBmYXN0ZXN0CiAgd2F5IHRvIGl0ZXJhdGUgb3ZlciBhbGwgbGluZXMgaW4gYSBmaWxlOgoKICBmb3IgbGluZSBpbiBmaWxlLnhyZWFkbGluZXMoKToKICAgICAgLi4uZG8gc29tZXRoaW5nIHRvIGxpbmUuLi4KCiAgU2VlIHRoZSB4cmVhZGxpbmVzIG1vZHVsZSAobWVudGlvbmVkIGJlbG93KSBmb3IgaG93IHRvIGRvIHRoaXMgZm9yCiAgb3RoZXIgZmlsZS1saWtlIG9iamVjdHMuCgotIEV2ZW4gaWYgeW91IGRvbid0IHVzZSBmaWxlLnhyZWFkbGluZXMoKSwgeW91IG1heSBleHBlY3QgYSBzcGVlZHVwIG9uCiAgbGluZS1ieS1saW5lIGlucHV0LiAgVGhlIGZpbGUucmVhZGxpbmUoKSBtZXRob2QgaGFzIGJlZW4gb3B0aW1pemVkCiAgcXVpdGUgYSBiaXQgaW4gcGxhdGZvcm0tc3BlY2lmaWMgd2F5czogIG9uIHN5c3RlbXMgKGxpa2UgTGludXgpIHRoYXQKICBzdXBwb3J0IGZsb2NrZmlsZSgpLCBnZXRjX3VubG9ja2VkKCksIGFuZCBmdW5sb2NrZmlsZSgpLCB0aG9zZSBhcmUKICB1c2VkIGJ5IGRlZmF1bHQuICBPbiBzeXN0ZW1zIChsaWtlIFdpbmRvd3MpIHdpdGhvdXQgZ2V0Y191bmxvY2tlZCgpLAogIGEgY29tcGxpY2F0ZWQgKGJ1dCBzdGlsbCB0aHJlYWQtc2FmZSkgbWV0aG9kIHVzaW5nIGZnZXRzKCkgaXMgdXNlZCBieQogIGRlZmF1bHQuCgogIFlvdSBjYW4gZm9yY2UgdXNlIG9mIHRoZSBmZ2V0cygpIG1ldGhvZCBieSAjZGVmaW5lJ2luZwogIFVTRV9GR0VUU19JTl9HRVRMSU5FIGF0IGJ1aWxkIHRpbWUgKGl0IG1heSBiZSBmYXN0ZXIgdGhhbgogIGdldGNfdW5sb2NrZWQoKSkuCgogIFlvdSBjYW4gZm9yY2UgZmdldHMoKSBub3QgdG8gYmUgdXNlZCBieSAjZGVmaW5lJ2luZwogIERPTlRfVVNFX0ZHRVRTX0lOX0dFVExJTkUgKHRoaXMgaXMgdGhlIGZpcnN0IHRoaW5nIHRvIHRyeSBpZiBzdGQgdGVzdAogIHRlc3RfYnVmaW8ucHkgZmFpbHMgLS0gYW5kIGxldCB1cyBrbm93IGlmIGl0IGRvZXMhKS4KCi0gSW4gYWRkaXRpb24sIHRoZSBmaWxlaW5wdXQgbW9kdWxlLCB3aGlsZSBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgb3RoZXIKICBtZXRob2RzIG9uIG1vc3QgcGxhdGZvcm1zLCBoYXMgYmVlbiBzcGVkIHVwIHRvbywgYnkgdXNpbmcKICBmaWxlLnJlYWRsaW5lcyhzaXplaGludCkuCgotIFN1cHBvcnQgZm9yIHJ1bi10aW1lIHdhcm5pbmdzIGhhcyBiZWVuIGFkZGVkLCBpbmNsdWRpbmcgYSBuZXcKICBjb21tYW5kIGxpbmUgb3B0aW9uICgtVykgdG8gc3BlY2lmeSB0aGUgZGlzcG9zaXRpb24gb2Ygd2FybmluZ3MuCiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgd2FybmluZ3MgbW9kdWxlIGJlbG93LgoKLSBFeHRlbnNpdmUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgY29lcmNpb24gY29kZS4gIFRoaXMgbW9zdGx5CiAgYWZmZWN0cyBleHRlbnNpb24gbW9kdWxlcyAod2hpY2ggY2FuIG5vdyBpbXBsZW1lbnQgbWl4ZWQtdHlwZQogIG51bWVyaWNhbCBvcGVyYXRvcnMgd2l0aG91dCBoYXZpbmcgdG8gdXNlIGNvZXJjaW9uKSwgYnV0CiAgb2NjYXNpb25hbGx5LCBpbiBib3VuZGFyeSBjYXNlcyB0aGUgY29lcmNpb24gc2VtYW50aWNzIGhhdmUgY2hhbmdlZAogIHN1YnRseS4gIFNpbmNlIHRoaXMgd2FzIGEgdGVycmlibGUgZ3JheSBhcmVhIG9mIHRoZSBsYW5ndWFnZSwgdGhpcwogIGlzIGNvbnNpZGVyZWQgYW4gaW1wcm92ZW1lbnQuICBBbHNvIG5vdGUgdGhhdCBfX3JjbXBfXyBpcyBubyBsb25nZXIKICBzdXBwb3J0ZWQgLS0gaW5zdGVhZCBvZiBjYWxsaW5nIF9fcmNtcF9fLCBfX2NtcF9fIGlzIGNhbGxlZCB3aXRoCiAgcmVmbGVjdGVkIGFyZ3VtZW50cy4KCi0gSW4gY29ubmVjdGlvbiB3aXRoIHRoZSBjb2VyY2lvbiBjaGFuZ2VzLCBhIG5ldyBidWlsdC1pbiBzaW5nbGV0b24KICBvYmplY3QsIE5vdEltcGxlbWVudGVkIGlzIGRlZmluZWQuICBUaGlzIGNhbiBiZSByZXR1cm5lZCBmb3IKICBvcGVyYXRpb25zIHRoYXQgd2lzaCB0byBpbmRpY2F0ZSB0aGV5IGFyZSBub3QgaW1wbGVtZW50ZWQgZm9yIGEKICBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cy4gIEZyb20gQywgdGhpcyBpcwogIFB5X05vdEltcGxlbWVudGVkLgoKLSBUaGUgaW50ZXJwcmV0ZXIgYWNjZXB0cyBub3cgYnl0ZWNvZGUgZmlsZXMgb24gdGhlIGNvbW1hbmQgbGluZSBldmVuCiAgaWYgdGhleSBkbyBub3QgaGF2ZSBhIC5weWMgb3IgLnB5byBleHRlbnNpb24uIE9uIExpbnV4LCBhZnRlciBleGVjdXRpbmcKCmltcG9ydCBpbXAsc3lzLHN0cmluZwptYWdpYyA9IHN0cmluZy5qb2luKFsiXFx4JS4yeCIgJSBvcmQoYykgZm9yIGMgaW4gaW1wLmdldF9tYWdpYygpXSwiIikKcmVnID0gJzpweWM6TTo6JXM6OiVzOicgJSAobWFnaWMsIHN5cy5leGVjdXRhYmxlKQpvcGVuKCIvcHJvYy9zeXMvZnMvYmluZm10X21pc2MvcmVnaXN0ZXIiLCJ3YiIpLndyaXRlKHJlZykKCiAgYW55IGJ5dGUgY29kZSBmaWxlIGNhbiBiZSB1c2VkIGFzIGFuIGV4ZWN1dGFibGUgKGkuZS4gYXMgYW4gYXJndW1lbnQKICB0byBleGVjdmUoMikpLgoKLSAlW3hYb10gZm9ybWF0cyBvZiBuZWdhdGl2ZSBQeXRob24gbG9uZ3Mgbm93IHByb2R1Y2UgYSBzaWduCiAgY2hhcmFjdGVyLiAgSW4gMS42IGFuZCBlYXJsaWVyLCB0aGV5IG5ldmVyIHByb2R1Y2VkIGEgc2lnbiwKICBhbmQgcmFpc2VkIGFuIGVycm9yIGlmIHRoZSB2YWx1ZSBvZiB0aGUgbG9uZyB3YXMgdG9vIGxhcmdlCiAgdG8gZml0IGluIGEgUHl0aG9uIGludC4gIEluIDIuMCwgdGhleSBwcm9kdWNlZCBhIHNpZ24gaWYgYW5kCiAgb25seSBpZiB0b28gbGFyZ2UgdG8gZml0IGluIGFuIGludC4gIFRoaXMgd2FzIGluY29uc2lzdGVudAogIGFjcm9zcyBwbGF0Zm9ybXMgKGJlY2F1c2UgdGhlIHNpemUgb2YgYW4gaW50IHZhcmllcyBhY3Jvc3MKICBwbGF0Zm9ybXMpLCBhbmQgaW5jb25zaXN0ZW50IHdpdGggaGV4KCkgYW5kIG9jdCgpLiAgRXhhbXBsZToKCiAgPj4+ICIleCIgJSAtMHg0MkwKICAnLTQyJyAgICAgICMgaW4gMi4xCiAgJ2ZmZmZmZmJlJyAjIGluIDIuMCBhbmQgYmVmb3JlLCBvbiAzMi1iaXQgbWFjaGluZXMKICA+Pj4gaGV4KC0weDQyTCkKICAnLTB4NDJMJyAgICMgaW4gYWxsIHZlcnNpb25zIG9mIFB5dGhvbgoKICBUaGUgYmVoYXZpb3Igb2YgJWQgZm9ybWF0cyBmb3IgbmVnYXRpdmUgUHl0aG9uIGxvbmdzIHJlbWFpbnMKICB0aGUgc2FtZSBhcyBpbiAyLjAgKGFsdGhvdWdoIGluIDEuNiBhbmQgYmVmb3JlLCB0aGV5IHJhaXNlZAogIGFuIGVycm9yIGlmIHRoZSBsb25nIGRpZG4ndCBmaXQgaW4gYSBQeXRob24gaW50KS4KCiAgJXUgZm9ybWF0cyBkb24ndCBtYWtlIHNlbnNlIGZvciBQeXRob24gbG9uZ3MsIGJ1dCBhcmUgYWxsb3dlZAogIGFuZCB0cmVhdGVkIHRoZSBzYW1lIGFzICVkIGluIDIuMS4gIEluIDIuMCwgYSBuZWdhdGl2ZSBsb25nCiAgZm9ybWF0dGVkIHZpYSAldSBwcm9kdWNlZCBhIHNpZ24gaWYgYW5kIG9ubHkgaWYgdG9vIGxhcmdlIHRvCiAgZml0IGluIGFuIGludC4gIEluIDEuNiBhbmQgZWFybGllciwgYSBuZWdhdGl2ZSBsb25nIGZvcm1hdHRlZAogIHZpYSAldSByYWlzZWQgYW4gZXJyb3IgaWYgaXQgd2FzIHRvbyBiaWcgdG8gZml0IGluIGFuIGludC4KCi0gRGljdGlvbmFyeSBvYmplY3RzIGhhdmUgYW4gb2RkIG5ldyBtZXRob2QsIHBvcGl0ZW0oKS4gIFRoaXMgcmVtb3ZlcwogIGFuIGFyYml0cmFyeSBpdGVtIGZyb20gdGhlIGRpY3Rpb25hcnkgYW5kIHJldHVybnMgaXQgKGluIHRoZSBmb3JtIG9mCiAgYSAoa2V5LCB2YWx1ZSkgcGFpcikuICBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGFsZ29yaXRobXMgdGhhdCB1c2UgYQogIGRpY3Rpb25hcnkgYXMgYSBiYWcgb2YgInRvIGRvIiBpdGVtcyBhbmQgcmVwZWF0ZWRseSBuZWVkIHRvIHBpY2sgb25lCiAgaXRlbS4gIFN1Y2ggYWxnb3JpdGhtcyBub3JtYWxseSBlbmQgdXAgcnVubmluZyBpbiBxdWFkcmF0aWMgdGltZTsKICB1c2luZyBwb3BpdGVtKCkgdGhleSBjYW4gdXN1YWxseSBiZSBtYWRlIHRvIHJ1biBpbiBsaW5lYXIgdGltZS4KClN0YW5kYXJkIGxpYnJhcnkKCi0gSW4gdGhlIHRpbWUgbW9kdWxlLCB0aGUgdGltZSBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb25zIHN0cmZ0aW1lLAogIGxvY2FsdGltZSwgZ210aW1lLCBhc2N0aW1lIGFuZCBjdGltZSBpcyBub3cgb3B0aW9uYWwsIGRlZmF1bHRpbmcgdG8KICB0aGUgY3VycmVudCB0aW1lIChpbiB0aGUgbG9jYWwgdGltZXpvbmUpLgoKLSBUaGUgZnRwbGliIG1vZHVsZSBub3cgZGVmYXVsdHMgdG8gcGFzc2l2ZSBtb2RlLCB3aGljaCBpcyBkZWVtZWQgYQogIG1vcmUgdXNlZnVsIGRlZmF1bHQgZ2l2ZW4gdGhhdCBjbGllbnRzIGFyZSBvZnRlbiBpbnNpZGUgZmlyZXdhbGxzCiAgdGhlc2UgZGF5cy4gIE5vdGUgdGhhdCB0aGlzIGNvdWxkIGJyZWFrIGlmIGZ0cGxpYiBpcyB1c2VkIHRvIGNvbm5lY3QKICB0byBhICpzZXJ2ZXIqIHRoYXQgaXMgaW5zaWRlIGEgZmlyZXdhbGwsIGZyb20gb3V0c2lkZTsgdGhpcyBpcwogIGV4cGVjdGVkIHRvIGJlIGEgdmVyeSByYXJlIHNpdHVhdGlvbi4gIFRvIGZpeCB0aGF0LCB5b3UgY2FuIGNhbGwKICBmdHAuc2V0X3Bhc3YoMCkuCgotIFRoZSBtb2R1bGUgc2l0ZSBub3cgdHJlYXRzIC5wdGggZmlsZXMgbm90IG9ubHkgZm9yIHBhdGggY29uZmlndXJhdGlvbiwKICBidXQgYWxzbyBzdXBwb3J0cyBleHRlbnNpb25zIHRvIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlOiBMaW5lcyBzdGFydGluZwogIHdpdGggaW1wb3J0IGFyZSBleGVjdXRlZC4KCi0gVGhlcmUncyBhIG5ldyBtb2R1bGUsIHdhcm5pbmdzLCB3aGljaCBpbXBsZW1lbnRzIGEgbWVjaGFuaXNtIGZvcgogIGlzc3VpbmcgYW5kIGZpbHRlcmluZyB3YXJuaW5ncy4gIFRoZXJlIGFyZSBzb21lIG5ldyBidWlsdC1pbgogIGV4Y2VwdGlvbnMgdGhhdCBzZXJ2ZSBhcyB3YXJuaW5nIGNhdGVnb3JpZXMsIGFuZCBhIG5ldyBjb21tYW5kIGxpbmUKICBvcHRpb24sIC1XLCB0byBjb250cm9sIHdhcm5pbmdzIChlLmcuIC1XaSBpZ25vcmVzIGFsbCB3YXJuaW5ncywgLVdlCiAgdHVybnMgd2FybmluZ3MgaW50byBlcnJvcnMpLiAgd2FybmluZ3Mud2FybihtZXNzYWdlWywgY2F0ZWdvcnldKQogIGlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZTsgdGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQgZnJvbSBDIGFzCiAgUHlFcnJfV2FybihjYXRlZ29yeSwgbWVzc2FnZSkuCgotIEEgbmV3IG1vZHVsZSB4cmVhZGxpbmVzIHdhcyBhZGRlZC4gIFRoaXMgZXhwb3J0cyBhIHNpbmdsZSBmYWN0b3J5CiAgZnVuY3Rpb24sIHhyZWFkbGluZXMoKS4gIFRoZSBpbnRlbnRpb24gaXMgdGhhdCB0aGlzIGNvZGUgaXMgdGhlCiAgYWJzb2x1dGVseSBmYXN0ZXN0IHdheSB0byBpdGVyYXRlIG92ZXIgYWxsIGxpbmVzIGluIGFuIG9wZW4KICBmaWxlKC1saWtlKSBvYmplY3Q6CgogIGltcG9ydCB4cmVhZGxpbmVzCiAgZm9yIGxpbmUgaW4geHJlYWRsaW5lcy54cmVhZGxpbmVzKGZpbGUpOgogICAgICAuLi5kbyBzb21ldGhpbmcgdG8gbGluZS4uLgoKICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHByZXZpb3VzIHRoZSBzcGVlZCByZWNvcmQgaG9sZGVyIHVzaW5nCiAgZmlsZS5yZWFkbGluZXMoc2l6ZWhpbnQpLiAgTm90ZSB0aGF0IGlmIGZpbGUgaXMgYSByZWFsIGZpbGUgb2JqZWN0CiAgKGFzIG9wcG9zZWQgdG8gYSBmaWxlLWxpa2Ugb2JqZWN0KSwgdGhpcyBpcyBlcXVpdmFsZW50OgoKICBmb3IgbGluZSBpbiBmaWxlLnhyZWFkbGluZXMoKToKICAgICAgLi4uZG8gc29tZXRoaW5nIHRvIGxpbmUuLi4KCi0gVGhlIGJpc2VjdCBtb2R1bGUgaGFzIG5ldyBmdW5jdGlvbnMgYmlzZWN0X2xlZnQsIGluc29ydF9sZWZ0LAogIGJpc2VjdF9yaWdodCBhbmQgaW5zb3J0X3JpZ2h0LiAgVGhlIG9sZCBuYW1lcyBiaXNlY3QgYW5kIGluc29ydAogIGFyZSBub3cgYWxpYXNlcyBmb3IgYmlzZWN0X3JpZ2h0IGFuZCBpbnNvcnRfcmlnaHQuICBYWFhfcmlnaHQKICBhbmQgWFhYX2xlZnQgbWV0aG9kcyBkaWZmZXIgaW4gd2hhdCBoYXBwZW5zIHdoZW4gdGhlIG5ldyBlbGVtZW50CiAgY29tcGFyZXMgZXF1YWwgdG8gb25lIG9yIG1vcmUgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgbGlzdDogIHRoZQogIFhYWF9sZWZ0IG1ldGhvZHMgaW5zZXJ0IHRvIHRoZSBsZWZ0LCB0aGUgWFhYX3JpZ2h0IG1ldGhvZHMgdG8gdGhlCiAgcmlnaHQuICBDb2RlIHRoYXQgZG9lc24ndCBjYXJlIHdoZXJlIGVxdWFsIGVsZW1lbnRzIGVuZCB1cCBzaG91bGQKICBjb250aW51ZSB0byB1c2UgdGhlIG9sZCwgc2hvcnQgbmFtZXMgKCJiaXNlY3QiIGFuZCAiaW5zb3J0IikuCgotIFRoZSBuZXcgY3Vyc2VzLnBhbmVsIG1vZHVsZSB3cmFwcyB0aGUgcGFuZWwgbGlicmFyeSB0aGF0IGZvcm1zIHBhcnQKICBvZiBTWVNWIGN1cnNlcyBhbmQgbmN1cnNlcy4gIENvbnRyaWJ1dGVkIGJ5IFRob21hcyBHZWxsZWt1bS4KCi0gVGhlIFNvY2tldFNlcnZlciBtb2R1bGUgbm93IHNldHMgdGhlIGFsbG93X3JldXNlX2FkZHJlc3MgZmxhZyBieQogIGRlZmF1bHQgaW4gdGhlIFRDUFNlcnZlciBjbGFzcy4KCi0gQSBuZXcgZnVuY3Rpb24sIHN5cy5fZ2V0ZnJhbWUoKSwgcmV0dXJucyB0aGUgc3RhY2sgZnJhbWUgcG9pbnRlciBvZgogIHRoZSBjYWxsZXIuICBUaGlzIGlzIGludGVuZGVkIG9ubHkgYXMgYSBidWlsZGluZyBibG9jayBmb3IKICBoaWdoZXItbGV2ZWwgbWVjaGFuaXNtcyBzdWNoIGFzIHN0cmluZyBpbnRlcnBvbGF0aW9uLgoKLSBUaGUgcHlleHBhdCBtb2R1bGUgc3VwcG9ydHMgYSBudW1iZXIgb2YgbmV3IGhhbmRsZXJzLCB3aGljaCBhcmUKICBhdmFpbGFibGUgb25seSBpbiBleHBhdCAxLjIuIElmIGludm9jYXRpb24gb2YgYSBjYWxsYmFjayBmYWlscywgaXQKICB3aWxsIHJlcG9ydCBhbiBhZGRpdGlvbmFsIGZyYW1lIGluIHRoZSB0cmFjZWJhY2suIFBhcnNlciBvYmplY3RzCiAgcGFydGljaXBhdGUgbm93IGluIGdhcmJhZ2UgY29sbGVjdGlvbi4gSWYgZXhwYXQgcmVwb3J0cyBhbiB1bmtub3duCiAgZW5jb2RpbmcsIHB5ZXhwYXQgd2lsbCB0cnkgdG8gdXNlIGEgUHl0aG9uIGNvZGVjOyB0aGF0IHdvcmtzIG9ubHkKICBmb3Igc2luZ2xlLWJ5dGUgY2hhcnNldHMuIFRoZSBwYXJzZXIgdHlwZSBvYmplY3RzIGlzIGV4cG9zZWQgYXMKICBYTUxQYXJzZXJPYmplY3QuCgotIHhtbC5kb20gbm93IG9mZmVycyBzdGFuZGFyZCBkZWZpbml0aW9ucyBmb3Igc3ltYm9saWMgbm9kZSB0eXBlIGFuZAogIGV4Y2VwdGlvbiBjb2RlIGNvbnN0YW50cywgYW5kIGEgaGllcmFyY2h5IG9mIERPTSBleGNlcHRpb25zLiBtaW5pZG9tCiAgd2FzIGFkanVzdGVkIHRvIHVzZSB0aGVtLgoKLSBUaGUgY29uZm9ybWFuY2Ugb2YgeG1sLmRvbS5taW5pZG9tIHRvIHRoZSBET00gc3BlY2lmaWNhdGlvbiB3YXMKICBpbXByb3ZlZC4gSXQgZGV0ZWN0cyBhIG51bWJlciBvZiBhZGRpdGlvbmFsIGVycm9yIGNhc2VzOyB0aGUKICBwcmV2aW91cy9uZXh0IHJlbGF0aW9uc2hpcCB3b3JrcyBldmVuIHdoZW4gdGhlIHRyZWUgaXMgbW9kaWZpZWQ7CiAgTm9kZSBzdXBwb3J0cyB0aGUgbm9ybWFsaXplKCkgbWV0aG9kOyBOYW1lZE5vZGVNYXAsIERvY3VtZW50VHlwZSBhbmQKICBET01JbXBsZW1lbnRhdGlvbiBjbGFzc2VzIHdlcmUgYWRkZWQ7IEVsZW1lbnQgc3VwcG9ydHMgdGhlCiAgaGFzQXR0cmlidXRlIGFuZCBoYXNBdHRyaWJ1dGVOUyBtZXRob2RzOyBhbmQgVGV4dCBzdXBwb3J0cyB0aGUgc3BsaXRUZXh0CiAgbWV0aG9kLgoKQnVpbGQgaXNzdWVzCgotIEZvciBVbml4IChhbmQgVW5peC1jb21wYXRpYmxlKSBidWlsZHMsIGNvbmZpZ3VyYXRpb24gYW5kIGJ1aWxkaW5nIG9mCiAgZXh0ZW5zaW9uIG1vZHVsZXMgaXMgbm93IGdyZWF0bHkgYXV0b21hdGVkLiAgUmF0aGVyIHRoYW4gaGF2aW5nIHRvCiAgZWRpdCB0aGUgTW9kdWxlcy9TZXR1cCBmaWxlIHRvIGluZGljYXRlIHdoaWNoIG1vZHVsZXMgc2hvdWxkIGJlCiAgYnVpbHQgYW5kIHdoZXJlIHRoZWlyIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcmllcyBhcmUsIGEKICBkaXN0dXRpbHMtYmFzZWQgc2V0dXAucHkgc2NyaXB0IG5vdyB0YWtlcyBjYXJlIG9mIGJ1aWxkaW5nIG1vc3QKICBleHRlbnNpb24gbW9kdWxlcy4gIEFsbCBleHRlbnNpb24gbW9kdWxlcyBidWlsdCB0aGlzIHdheSBhcmUgYnVpbHQKICBhcyBzaGFyZWQgbGlicmFyaWVzLiAgT25seSBhIGZldyBtb2R1bGVzIHRoYXQgbXVzdCBiZSBsaW5rZWQKICBzdGF0aWNhbGx5IGFyZSBzdGlsbCBsaXN0ZWQgaW4gdGhlIFNldHVwIGZpbGU7IHlvdSB3b24ndCBuZWVkIHRvCiAgZWRpdCB0aGVpciBjb25maWd1cmF0aW9uLgoKLSBQeXRob24gc2hvdWxkIG5vdyBidWlsZCBvdXQgb2YgdGhlIGJveCBvbiBDeWd3aW4uICBJZiBpdCBkb2Vzbid0LAogIG1haWwgdG8gSmFzb24gVGlzaGxlciAoamx0NjMgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0KS4KCi0gUHl0aG9uIG5vdyBhbHdheXMgdXNlcyBpdHMgb3duIChyZW5hbWVkKSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRvcHQoKQogIC0tIHRoZXJlJ3MgdG9vIG11Y2ggdmFyaWF0aW9uIGFtb25nIEMgbGlicmFyeSBnZXRvcHQoKQogIGltcGxlbWVudGF0aW9ucy4KCi0gQysrIGNvbXBpbGVycyBhcmUgYmV0dGVyIHN1cHBvcnRlZDsgdGhlIENYWCBtYWNybyBpcyBhbHdheXMgc2V0IHRvIGEKICBDKysgY29tcGlsZXIgaWYgb25lIGlzIGZvdW5kLgoKV2luZG93cyBjaGFuZ2VzCgotIHNlbGVjdCBtb2R1bGU6ICBCeSBkZWZhdWx0IHVuZGVyIFdpbmRvd3MsIGEgc2VsZWN0KCkgY2FsbAogIGNhbiBzcGVjaWZ5IG5vIG1vcmUgdGhhbiA2NCBzb2NrZXRzLiAgUHl0aG9uIG5vdyBib29zdHMKICB0aGlzIE1pY3Jvc29mdCBkZWZhdWx0IHRvIDUxMi4gIElmIHlvdSBuZWVkIGV2ZW4gbW9yZSB0aGFuCiAgdGhhdCwgc2VlIHRoZSBNUyBkb2NzICh5b3UnbGwgbmVlZCB0byAjZGVmaW5lIEZEX1NFVFNJWkUKICBhbmQgcmVjb21waWxlIFB5dGhvbiBmcm9tIHNvdXJjZSkuCgotIFN1cHBvcnQgZm9yIFdpbmRvd3MgMy4xLCBET1MgYW5kIE9TLzIgaXMgZ29uZS4gIFRoZSBMaWIvZG9zLTh4MwogIHN1YmRpcmVjdG9yeSBpcyBubyBtb3JlIQoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMD8KPT09PT09PT09PT09PT09PT09PT09PT09PQoKQmVsb3cgaXMgYSBsaXN0IG9mIGFsbCByZWxldmFudCBjaGFuZ2VzIHNpbmNlIHJlbGVhc2UgMS42LiAgT2xkZXIKY2hhbmdlcyBhcmUgaW4gdGhlIGZpbGUgSElTVE9SWS4gIElmIHlvdSBhcmUgbWFraW5nIHRoZSBqdW1wIGRpcmVjdGx5CmZyb20gUHl0aG9uIDEuNS4yIHRvIDIuMCwgbWFrZSBzdXJlIHRvIHJlYWQgdGhlIHNlY3Rpb24gZm9yIDEuNiBpbiB0aGUKSElTVE9SWSBmaWxlISAgTWFueSBpbXBvcnRhbnQgY2hhbmdlcyBsaXN0ZWQgdGhlcmUuCgpBbHRlcm5hdGl2ZWx5LCBhIGdvb2Qgb3ZlcnZpZXcgb2YgdGhlIGNoYW5nZXMgYmV0d2VlbiAxLjUuMiBhbmQgMi4wIGlzCnRoZSBkb2N1bWVudCAiV2hhdCdzIE5ldyBpbiBQeXRob24gMi4wIiBieSBLdWNobGluZyBhbmQgTW9zaGUgWmFka2E6Cmh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcvYW1rL3B5dGhvbi93cml0aW5nL25ldy1weXRob24vLgoKLS1HdWlkbyB2YW4gUm9zc3VtIChob21lIHBhZ2U6IGh0dHA6Ly93d3cucHl0aG9ubGFicy5jb20vfmd1aWRvLykKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldoYXQncyBuZXcgaW4gMi4wIChzaW5jZSByZWxlYXNlIGNhbmRpZGF0ZSAxKT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU3RhbmRhcmQgbGlicmFyeQoKLSBUaGUgY29weV9yZWcgbW9kdWxlIHdhcyBtb2RpZmllZCB0byBjbGFyaWZ5IGl0cyBpbnRlbmRlZCB1c2U6IHRvCiAgcmVnaXN0ZXIgcGlja2xlIHN1cHBvcnQgZm9yIGV4dGVuc2lvbiB0eXBlcywgbm90IGZvciBjbGFzc2VzLgogIHBpY2tsZSgpIHdpbGwgcmFpc2UgYSBUeXBlRXJyb3IgaWYgaXQgaXMgcGFzc2VkIGEgY2xhc3MuCgotIEZpeGVkIGEgYnVnIGluIGdldHRleHQncyAibm9ybWFsaXplIGFuZCBleHBhbmQiIGNvZGUgdGhhdCBwcmV2ZW50ZWQKICBpdCBmcm9tIGZpbmRpbmcgYW4gZXhpc3RpbmcgLm1vIGZpbGUuCgotIFJlc3RvcmVkIHN1cHBvcnQgZm9yIEhUVFAvMC45IHNlcnZlcnMgaW4gaHR0cGxpYi4KCi0gVGhlIG1hdGggbW9kdWxlIHdhcyBjaGFuZ2VkIHRvIHN0b3AgcmFpc2luZyBPdmVyZmxvd0Vycm9yIGluIGNhc2Ugb2YKICB1bmRlcmZsb3csIGFuZCByZXR1cm4gMCBpbnN0ZWFkIGluIHVuZGVyZmxvdyBjYXNlcy4gIFdoZXRoZXIgUHl0aG9uCiAgdXNlZCB0byByYWlzZSBPdmVyZmxvd0Vycm9yIGluIGNhc2Ugb2YgdW5kZXJmbG93IHdhcyBwbGF0Zm9ybS0KICBkZXBlbmRlbnQgKGl0IGRpZCB3aGVuIHRoZSBwbGF0Zm9ybSBtYXRoIGxpYnJhcnkgc2V0IGVycm5vIHRvIEVSQU5HRQogIG9uIHVuZGVyZmxvdykuCgotIEZpeGVkIGEgYnVnIGluIFN0cmluZ0lPIHRoYXQgb2NjdXJyZWQgd2hlbiB0aGUgZmlsZSBwb3NpdGlvbiB3YXMgbm90CiAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgd3JpdGUoKSB3YXMgY2FsbGVkIHdpdGggZW5vdWdoIGRhdGEgdG8KICBleHRlbmQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgoKLSBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBUa2ludGVyIGVycm9yIG1lc3NhZ2VzIHRvIGdldCBsb3N0IG9uCiAgV2luZG93cy4gIFRoZSBidWcgd2FzIGZpeGVkIGJ5IHJlcGxhY2luZyBkaXJlY3QgdXNlIG9mCiAgaW50ZXJwLT5yZXN1bHQgd2l0aCBUY2xfR2V0U3RyaW5nUmVzdWx0KGludGVycCkuCgotIEZpeGVkIGJ1ZyBpbiB1cmxsaWIyIHRoYXQgY2F1c2VkIGl0IHRvIGZhaWwgd2hlbiBpdCByZWNlaXZlZCBhbiBIVFRQCiAgcmVkaXJlY3QgcmVzcG9uc2UuCgotIFNldmVyYWwgY2hhbmdlcyB3ZXJlIG1hZGUgdG8gZGlzdHV0aWxzOiBTb21lIGRlYnVnZ2luZyBjb2RlIHdhcwogIHJlbW92ZWQgZnJvbSB1dGlsLiAgRml4ZWQgdGhlIGluc3RhbGxlciB1c2VkIHdoZW4gYW4gZXh0ZXJuYWwgemlwCiAgcHJvZ3JhbSAobGlrZSBXaW5aaXApIGlzIG5vdCBmb3VuZDsgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzCiAgaW5zdGFsbGVyIGlzIGluIE1pc2MvZGlzdHV0aWxzLiAgY2hlY2tfbGliKCkgd2FzIG1vZGlmaWVkIHRvIGJlaGF2ZQogIG1vcmUgbGlrZSBBQ19DSEVDS19MSUIgYnkgYWRkIG90aGVyX2xpYnJhcmllcygpIGFzIGEgcGFyYW1ldGVyLiAgVGhlCiAgdGVzdCBmb3Igd2hldGhlciBpbnN0YWxsZWQgbW9kdWxlcyBhcmUgb24gc3lzLnBhdGggd2FzIGNoYW5nZWQgdG8KICB1c2UgYm90aCBub3JtY2FzZSgpIGFuZCBub3JtcGF0aCgpLgoKLSBTZXZlcmFsIG1pbm9yIGJ1Z3Mgd2VyZSBmaXhlZCBpbiB0aGUgeG1sIHBhY2thZ2UgKHRoZSBtaW5pZG9tLAogIHB1bGxkb20sIGV4cGF0cmVhZGVyLCBhbmQgc2F4dXRpbHMgbW9kdWxlcykuCgotIFRoZSByZWdyZXNzaW9uIHRlc3QgZHJpdmVyIChyZWdydGVzdC5weSkgYmVoYXZpb3Igd2hlbiBpbnZva2VkIHdpdGgKICAtbCBjaGFuZ2VkOiBJdCBub3cgcmVwb3J0cyBhIGNvdW50IG9mIG9iamVjdHMgdGhhdCBhcmUgcmVjb2duaXplZCBhcwogIGdhcmJhZ2UgYnV0IG5vdCBmcmVlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCgotIFRoZSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBtYXRoIG1vZHVsZSB3YXMgY2hhbmdlZCB0byB0ZXN0CiAgZXhjZXB0aW9uYWwgYmVoYXZpb3Igd2hlbiB0aGUgdGVzdCBpcyBydW4gaW4gdmVyYm9zZSBtb2RlLiAgUHl0aG9uCiAgY2Fubm90IHlldCBndWFyYW50ZWUgY29uc2lzdGVudCBleGNlcHRpb24gYmVoYXZpb3IgYWNyb3NzIHBsYXRmb3JtcywKICBzbyB0aGUgZXhjZXB0aW9uIHBhcnQgb2YgdGVzdF9tYXRoIGlzIHJ1biBvbmx5IGluIHZlcmJvc2UgbW9kZSwgYW5kCiAgbWF5IGZhaWwgb24geW91ciBwbGF0Zm9ybS4KCkludGVybmFscwoKLSBQeU9TX0NoZWNrU3RhY2soKSBoYXMgYmVlbiBkaXNhYmxlZCBvbiBXaW42NCwgd2hlcmUgaXQgY2F1c2VkCiAgdGVzdF9zcmUgdG8gZmFpbC4KCkJ1aWxkIGlzc3VlcwoKLSBDaGFuZ2VkIGNvbXBpbGVyIGZsYWdzLCBzbyB0aGF0IGdjYyBpcyBhbHdheXMgaW52b2tlZCB3aXRoIC1XYWxsIGFuZAogIC1Xc3RyaWN0LXByb3RvdHlwZXMuICBVc2VycyBjb21waWxpbmcgUHl0aG9uIHdpdGggR0NDIHNob3VsZCBzZWUKICBleGFjdGx5IG9uZSB3YXJuaW5nLCBleGNlcHQgaWYgdGhleSBoYXZlIHBhc3NlZCBjb25maWd1cmUgdGhlCiAgLS13aXRoLXB5ZGVidWcgZmxhZy4gIFRoZSBleHBlY3RlZCB3YXJuaW5nIGlzIGZvciBnZXRvcHQoKSBpbgogIE1vZHVsZXMvbWFpbi5jLiAgVGhpcyB3YXJuaW5nIHdpbGwgYmUgZml4ZWQgZm9yIFB5dGhvbiAyLjEuCgotIEZpeGVkIGNvbmZpZ3VyZSB0byBhZGQgLXRocmVhZHMgYXJndW1lbnQgZHVyaW5nIGxpbmtpbmcgb24gT1NGMS4KClRvb2xzIGFuZCBvdGhlciBtaXNjZWxsYW55CgotIFRoZSBjb21waWxlciBpbiBUb29scy9jb21waWxlciB3YXMgdXBkYXRlZCB0byBzdXBwb3J0IHRoZSBuZXcKICBsYW5ndWFnZSBmZWF0dXJlcyBpbnRyb2R1Y2VkIGluIDIuMDogZXh0ZW5kZWQgcHJpbnQgc3RhdGVtZW50LCBsaXN0CiAgY29tcHJlaGVuc2lvbnMsIGFuZCBhdWdtZW50ZWQgYXNzaWdubWVudHMuICBUaGUgbmV3IGNvbXBpbGVyIHNob3VsZAogIGFsc28gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMS41LjI7IHRoZSBjb21waWxlciB3aWxsCiAgYWx3YXlzIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcnByZXRlciBpdCBydW5zCiAgdW5kZXIuCgpXaGF0J3MgbmV3IGluIDIuMCByZWxlYXNlIGNhbmRpZGF0ZSAxIChzaW5jZSBiZXRhIDIpPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2hhdCBpcyByZWxlYXNlIGNhbmRpZGF0ZSAxPwoKV2UgYmVsaWV2ZSB0aGF0IHJlbGVhc2UgY2FuZGlkYXRlIDEgd2lsbCBmaXggYWxsIGtub3duIGJ1Z3MgdGhhdCB3ZQppbnRlbmQgdG8gZml4IGZvciB0aGUgMi4wIGZpbmFsIHJlbGVhc2UuICBUaGlzIHJlbGVhc2Ugc2hvdWxkIGJlIGEgYml0Cm1vcmUgc3RhYmxlIHRoYW4gdGhlIHByZXZpb3VzIGJldGFzLiAgV2Ugd291bGQgbGlrZSB0byBzZWUgZXZlbiBtb3JlCndpZGVzcHJlYWQgdGVzdGluZyBiZWZvcmUgdGhlIGZpbmFsIHJlbGVhc2UsIHNvIHdlIGFyZSBwcm9kdWNpbmcgdGhpcwpyZWxlYXNlIGNhbmRpZGF0ZS4gIFRoZSBmaW5hbCByZWxlYXNlIHdpbGwgYmUgZXhhY3RseSB0aGUgc2FtZSB1bmxlc3MKYW55IHNob3ctc3RvcHBpbmcgKG9yIGJyb3duIGJhZykgYnVncyBhcmUgZm91bmQgYnkgdGVzdGVycyBvZiB0aGUKcmVsZWFzZSBjYW5kaWRhdGUuCgpBbGwgdGhlIGNoYW5nZXMgc2luY2UgdGhlIGxhc3QgYmV0YSByZWxlYXNlIGFyZSBidWcgZml4ZXMgb3IgY2hhbmdlcwp0byBzdXBwb3J0IGJ1aWxkaW5nIFB5dGhvbiBmb3Igc3BlY2lmaWMgcGxhdGZvcm1zLgoKQ29yZSBsYW5ndWFnZSwgYnVpbHRpbnMsIGFuZCBpbnRlcnByZXRlcgoKLSBBIGJ1ZyB0aGF0IGNhdXNlZCBjcmFzaGVzIHdoZW4gX19jb2VyY2VfXyB3YXMgdXNlZCB3aXRoIGF1Z21lbnRlZAogIGFzc2lnbm1lbnQsIGUuZy4gKz0sIHdhcyBmaXhlZC4KCi0gUmFpc2UgWmVyb0RpdmlzaW9uRXJyb3Igd2hlbiByYWlzaW5nIHplcm8gdG8gYSBuZWdhdGl2ZSBudW1iZXIsCiAgZS5nLiAwLjAgKiogLTIuMC4gIE5vdGUgdGhhdCBtYXRoLnBvdyBpcyB1bnJlbGF0ZWQgdG8gdGhlIGJ1aWx0aW4KICBwb3dlciBvcGVyYXRvciBhbmQgdGhlIHJlc3VsdCBvZiBtYXRoLnBvdygwLjAsIC0yLjApIHdpbGwgdmFyeSBieQogIHBsYXRmb3JtLiAgT24gTGludXgsIGl0IHJhaXNlcyBhIFZhbHVlRXJyb3IuCgotIEEgYnVnIGluIFVuaWNvZGUgc3RyaW5nIGludGVycG9sYXRpb24gd2FzIGZpeGVkIHRoYXQgb2NjYXNpb25hbGx5CiAgY2F1c2VkIGVycm9ycyB3aXRoIGZvcm1hdHMgaW5jbHVkaW5nICIlJSIuICBGb3IgZXhhbXBsZSwgdGhlCiAgZm9sbG93aW5nIGV4cHJlc3Npb24gIiUlICVzIiAlIHUiYWJjIiBubyBsb25nZXIgcmFpc2VzIGEgVHlwZUVycm9yLgoKLSBDb21waWxhdGlvbiBvZiBkZWVwbHkgbmVzdGVkIGV4cHJlc3Npb25zIHJhaXNlcyBNZW1vcnlFcnJvciBpbnN0ZWFkCiAgb2YgU3ludGF4RXJyb3IsIGUuZy4gZXZhbCgiWyIgKiA1MCArICJdIiAqIDUwKS4KCi0gSW4gMi4wYjIgb24gV2luZG93cywgdGhlIGludGVycHJldGVyIHdyb3RlIC5weWMgZmlsZXMgaW4gdGV4dCBtb2RlLAogIHJlbmRlcmluZyB0aGVtIHVzZWxlc3MuICBUaGV5IGFyZSBub3cgd3JpdHRlbiBpbiBiaW5hcnkgbW9kZSBhZ2Fpbi4KClN0YW5kYXJkIGxpYnJhcnkKCi0gS2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdyBhY2NlcHRlZCBmb3IgbW9zdCBwYXR0ZXJuIGFuZCBtYXRjaCBvYmplY3QKICBtZXRob2RzIGluIFNSRSwgdGhlIHN0YW5kYXJkIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUuCgotIEluIFNSRSwgZml4ZWQgZXJyb3Igd2l0aCBuZWdhdGl2ZSBsb29rYWhlYWQgYW5kIGxvb2tiZWhpbmQgdGhhdAogIG1hbmlmZXN0ZWQgaXRzZWxmIGFzIGEgcnVudGltZSBlcnJvciBpbiBwYXR0ZXJucyBsaWtlICIoPzwhYWJjKShkZWYpIi4KCi0gU2V2ZXJhbCBidWdzIGluIHRoZSBVbmljb2RlIGhhbmRsaW5nIGFuZCBlcnJvciBoYW5kbGluZyBpbiBfdGtpbnRlcgogIHdlcmUgZml4ZWQuCgotIEZpeCBtZW1vcnkgbWFuYWdlbWVudCBlcnJvcnMgaW4gTWVyZ2UoKSBhbmQgVGthcHBfQ2FsbCgpIHJvdXRpbmVzLgoKLSBTZXZlcmFsIGNoYW5nZXMgd2VyZSBtYWRlIHRvIGNTdHJpbmdJTyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aAogIHRoZSBmaWxlLWxpa2Ugb2JqZWN0IGludGVyZmFjZSBhbmQgd2l0aCBTdHJpbmdJTy4gIElmIG9wZXJhdGlvbnMgYXJlCiAgcGVyZm9ybWVkIG9uIGEgY2xvc2VkIG9iamVjdCwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFRoZSB0cnVuY2F0ZQogIG1ldGhvZCBub3cgYWNjZXB0cyBhIHBvc2l0aW9uIGFyZ3VtZW50IGFuZCByZWFkbGluZSBhY2NlcHRzIGEgc2l6ZQogIGFyZ3VtZW50LgoKLSBUaGVyZSB3ZXJlIG1hbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBsaW51eGF1ZGlvZGV2IG1vZHVsZSBhbmQgaXRzCiAgdGVzdCBzdWl0ZTsgYXMgYSByZXN1bHQsIGEgc2hvcnQsIHVuZXhwZWN0ZWQgYXVkaW8gc2FtcGxlIHNob3VsZCBub3cKICBwbGF5IHdoZW4gdGhlIHJlZ3Jlc3Npb24gdGVzdCBpcyBydW4uCgogIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBuYW1lZCBwb29ybHksIGJlY2F1c2UgaXQgc2hvdWxkIHdvcmsKICBjb3JyZWN0bHkgb24gYW55IHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgdGhlIE9wZW4gU291bmQgU3lzdGVtCiAgKE9TUykuCgogIFRoZSBtb2R1bGUgbm93IHJhaXNlcyBleGNlcHRpb25zIHdoZW4gZXJyb3JzIG9jY3VyIGluc3RlYWQgb2YKICBjcmFzaGluZy4gIEl0IGFsc28gZGVmaW5lcyB0aGUgQUZNVF9BX0xBVyBmb3JtYXQgKGxvZ2FyaXRobWljIEEtbGF3CiAgYXVkaW8pIGFuZCBkZWZpbmVzIGEgZ2V0cHRyKCkgbWV0aG9kIHRoYXQgY2FsbHMgdGhlCiAgU05EQ1RMX0RTUF9HRVR4UFRSIGlvY3RsIGRlZmluZWQgaW4gdGhlIE9TUyBQcm9ncmFtbWVyJ3MgR3VpZGUuCgotIFRoZSBsaWJyYXJ5X3ZlcnNpb24gYXR0cmlidXRlLCBpbnRyb2R1Y2VkIGluIGFuIGVhcmxpZXIgYmV0YSwgd2FzCiAgcmVtb3ZlZCBiZWNhdXNlIGl0IGNhbiBub3QgYmUgc3VwcG9ydGVkIHdpdGggZWFybHkgdmVyc2lvbnMgb2YgdGhlIEMKICByZWFkbGluZSBsaWJyYXJ5LCB3aGljaCBwcm92aWRlcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIGF0CiAgY29tcGlsZS10aW1lLgoKLSBUaGUgYmluYXNjaWkgbW9kdWxlIGlzIG5vdyBlbmFibGVkIG9uIFdpbjY0LgoKLSB0b2tlbml6ZS5weSBubyBsb25nZXIgc3VmZmVycyAicmVjdXJzaW9uIGRlcHRoIiBlcnJvcnMgd2hlbiBwYXJzaW5nCiAgcHJvZ3JhbXMgd2l0aCB2ZXJ5IGxvbmcgc3RyaW5nIGxpdGVyYWxzLgoKSW50ZXJuYWxzCgotIEZpeGVkIHNldmVyYWwgYnVmZmVyIG92ZXJmbG93IHZ1bG5lcmFiaWxpdGllcyBpbiBjYWxjdWxhdGVfcGF0aCgpLAogIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMgdXAgdG8gZGV0ZXJtaW5lIHdoZXJlCiAgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaXMgaW5zdGFsbGVkLiAgVGhlc2UgdnVsbmVyYWJpbGl0aWVzIGFmZmVjdCBhbGwKICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24gYW5kIGNhbiBiZSBleHBsb2l0ZWQgYnkgc2V0dGluZyB2ZXJ5CiAgbG9uZyB2YWx1ZXMgZm9yIFBZVEhPTkhPTUUgb3IgYXJndlswXS4gIFRoZSByaXNrIGlzIGdyZWF0ZXN0IGZvciBhCiAgc2V0dWlkIFB5dGhvbiBzY3JpcHQsIGFsdGhvdWdoIHVzZSBvZiB0aGUgd3JhcHBlciBpbgogIE1pc2Mvc2V0dWlkLXByb2cuYyB3aWxsIGVsaW1pbmF0ZSB0aGUgdnVsbmVyYWJpbGl0eS4KCi0gRml4ZWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGJ1Z3MgaW4gaW5zdGFuY2UgY3JlYXRpb24gdGhhdCB3ZXJlCiAgdHJpZ2dlcmVkIHdoZW4gZXJyb3JzIG9jY3VycmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gIFRoZSBzb2x1dGlvbiwKICBhcHBsaWVkIGluIGNQaWNrbGUgYW5kIGluIFB5SW5zdGFuY2VfTmV3KCksIGlzIHRvIGNhbGwKICBQeU9iamVjdF9HQ19Jbml0KCkgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvYmplY3QncwogIGNvbnRhaW5lciBhdHRyaWJ1dGVzIGlzIGNvbXBsZXRlLgoKLSBweWV4cGF0IGFkZHMgZGVmaW5pdGlvbnMgb2YgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQgYW5kCiAgUHlNb2R1bGVfQWRkT2JqZWN0IGlmIHRoZSBQeXRob24gdmVyc2lvbiBpcyBsZXNzIHRoYW4gMi4wLCB3aGljaAogIHByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aCBQeVhNTCBvbiBQeXRob24gMS41LjIuCgotIElmIHRoZSBwbGF0Zm9ybSBoYXMgYSBib2d1cyBkZWZpbml0aW9uIGZvciBMT05HX0JJVCAodGhlIG51bWJlciBvZgogIGJpdHMgaW4gYSBsb25nKSwgYW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuCgotIEZpeCBidWdzIGluIF9QeVR1cGxlX1Jlc2l6ZSgpIHdoaWNoIGNhdXNlZCBoYXJkLXRvLWludGVycHJldCBnYXJiYWdlCiAgY29sbGVjdGlvbiBjcmFzaGVzIGFuZCBwb3NzaWJseSBvdGhlciwgdW5yZXBvcnRlZCBjcmFzaGVzLgoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIF9QeVVuaWNvZGVfRmluaSgpLgoKQnVpbGQgaXNzdWVzCgotIGNvbmZpZ3VyZSBub3cgYWNjZXB0cyBhIC0td2l0aC1zdWZmaXggb3B0aW9uIHRoYXQgc3BlY2lmaWVzIHRoZQogIGV4ZWN1dGFibGUgc3VmZml4LiAgVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkcyBvbiBDeWd3aW4gYW5kIE1hYyBPUwogIFgsIGZvciBleGFtcGxlLgoKLSBUaGUgbW1hcC5QQUdFU0laRSBjb25zdGFudCBpcyBub3cgaW5pdGlhbGl6ZWQgdXNpbmcgc3lzY29uZiB3aGVuCiAgcG9zc2libGUsIHdoaWNoIGVsaW1pbmF0ZXMgYSBkZXBlbmRlbmN5IG9uIC1sdWNiIGZvciBSZWxpYW50IFVOSVguCgotIFRoZSBtZDUgZmlsZSBzaG91bGQgbm93IGNvbXBpbGUgb24gYWxsIHBsYXRmb3Jtcy4KCi0gVGhlIHNlbGVjdCBtb2R1bGUgbm93IGNvbXBpbGVzIG9uIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBkZWZpbmUKICBQT0xMUkROT1JNIGFuZCByZWxhdGVkIGNvbnN0YW50cy4KCi0gRGFyd2luIChNYWMgT1MgWCk6ICBJbml0aWFsIHN1cHBvcnQgZm9yIHN0YXRpYyBidWlsZHMgb24gdGhpcwogIHBsYXRmb3JtLgoKLSBCZU9TOiBBIG51bWJlciBvZiBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgYnVpbGQgYW5kIGluc3RhbGxhdGlvbgogIHByb2Nlc3MuICBhci1mYWtlIG5vdyBvcGVyYXRlcyBvbiBhIGRpcmVjdG9yeSBvZiBvYmplY3QgZmlsZXMuCiAgZGxfZXhwb3J0LmggaXMgZ29uZSwgYW5kIGl0cyBtYWNyb3Mgbm93IGFwcGVhciBvbiB0aGUgbXdjYyBjb21tYW5kCiAgbGluZSBkdXJpbmcgYnVpbGQgb24gUFBDIEJlT1MuCgotIFBsYXRmb3JtIGRpcmVjdG9yeSBpbiBsaWIvcHl0aG9uMi4wIGlzICJwbGF0LWJlb3M1IiAob3IKICAicGxhdC1iZW9zNCIsIGlmIGJ1aWxkaW5nIG9uIEJlT1MgNC41KSwgcmF0aGVyIHRoYW4gInBsYXQtYmVvcyIuCgotIEN5Z3dpbjogU3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcywgVGtpbnRlciwgYW5kIHNvY2tldHMuCgotIFN1bk9TIDQuMS40X0pMOiBGaXggdGVzdCBmb3IgZGlyZWN0b3J5IGV4aXN0ZW5jZSBpbiBjb25maWd1cmUuCgpUb29scyBhbmQgb3RoZXIgbWlzY2VsbGFueQoKLSBSZW1vdmVkIGRlYnVnZ2luZyBwcmludHMgZnJvbSBtYWluIHVzZWQgd2l0aCBmcmVlemUuCgotIElETEUgYXV0by1pbmRlbnQgbm8gbG9uZ2VyIGNyYXNoZXMgd2hlbiBpdCBlbmNvdW50ZXJzIFVuaWNvZGUKICBjaGFyYWN0ZXJzLgoKV2hhdCdzIG5ldyBpbiAyLjAgYmV0YSAyIChzaW5jZSBiZXRhIDEpPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb3JlIGxhbmd1YWdlLCBidWlsdGlucywgYW5kIGludGVycHJldGVyCgotIEFkZCBzdXBwb3J0IGZvciB1bmJvdW5kZWQgaW50cyBpbiAlZCxpLHUseCxYLG8gZm9ybWF0czsgZm9yIGV4YW1wbGUKICAiJWQiICUgMkwqKjY0ID09ICIxODQ0Njc0NDA3MzcwOTU1MTYxNiIuCgotIEFkZCAtaCBhbmQgLVYgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gcHJpbnQgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kCiAgUHl0aG9uIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0IGltbWVkaWF0ZWx5LgoKLSBldmFsKCkgYW5kIGV4ZWMgYWNjZXB0IFVuaWNvZGUgb2JqZWN0cyBhcyBjb2RlIHBhcmFtZXRlcnMuCgotIGdldGF0dHIoKSBhbmQgc2V0YXR0cigpIG5vdyBhbHNvIGFjY2VwdCBVbmljb2RlIG9iamVjdHMgZm9yIHRoZQogIGF0dHJpYnV0ZSBuYW1lLCB3aGljaCBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQKICBlbmNvZGluZyBiZWZvcmUgbG9va3VwLgoKLSBNdWx0aXBsaWNhdGlvbiBvbiBzdHJpbmcgYW5kIFVuaWNvZGUgbm93IGRvZXMgcHJvcGVyIGJvdW5kcwogIGNoZWNraW5nOyBlLmcuICdhJyAqIDY1NTM2ICogNjU1MzYgd2lsbCByYWlzZSBWYWx1ZUVycm9yLCAicmVwZWF0ZWQKICBzdHJpbmcgaXMgdG9vIGxvbmcuIgoKLSBCZXR0ZXIgZXJyb3IgbWVzc2FnZSB3aGVuIGNvbnRpbnVlIGlzIGZvdW5kIGluIHRyeSBzdGF0ZW1lbnQgaW4gYQogIGxvb3AuCgoKU3RhbmRhcmQgbGlicmFyeSBhbmQgZXh0ZW5zaW9ucwoKLSBzb2NrZXQgbW9kdWxlOiB0aGUgT3BlblNTTCBjb2RlIG5vdyBhZGRzIHN1cHBvcnQgZm9yIFJBTkRfc3RhdHVzKCkKICBhbmQgRUdEIChFbnRyb3B5IEdhdGhlcmluZyBEZXZpY2UpLgoKLSBhcnJheTogcmV2ZXJzZSgpIG1ldGhvZCBvZiBhcnJheSBub3cgd29ya3MuICBidWZmZXJfaW5mbygpIG5vdyBkb2VzCiAgYXJndW1lbnQgY2hlY2tpbmc7IGl0IHN0aWxsIHRha2VzIG5vIGFyZ3VtZW50cy4KCi0gYXN5bmNvcmUvYXN5bmNoYXQ6IEluY2x1ZGVkIG1vc3QgcmVjZW50IHZlcnNpb24gZnJvbSBTYW0gUnVzaGluZy4KCi0gY2dpOiBBY2NlcHQgJyYnIG9yICc7JyBhcyBzZXBhcmF0b3IgY2hhcmFjdGVycyB3aGVuIHBhcnNpbmcgZm9ybSBkYXRhLgoKLSBDR0lIVFRQU2VydmVyOiBOb3cgd29ya3Mgb24gV2luZG93cyAoYW5kIHBlcmhhcHMgZXZlbiBNYWMpLgoKLSBDb25maWdQYXJzZXI6IFdoZW4gcmVhZGluZyB0aGUgZmlsZSwgb3B0aW9ucyBzcGVsbGVkIGluIHVwcGVyIGNhc2UKICBsZXR0ZXJzIGFyZSBub3cgY29ycmVjdGx5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCgotIGNvcHk6IENvcHkgVW5pY29kZSBvYmplY3RzIGF0b21pY2FsbHkuCgotIGNQaWNrbGU6IEZhaWwgZ3JhY2VmdWxseSB3aGVuIGNvcHlfcmVnIGNhbid0IGJlIGltcG9ydGVkLgoKLSBjU3RyaW5nSU86IEltcGxlbWVudGVkIHJlYWRsaW5lcygpIG1ldGhvZC4KCi0gZGJtOiBBZGQgZ2V0KCkgYW5kIHNldGRlZmF1bHQoKSBtZXRob2RzIHRvIGRibSBvYmplY3QuICBBZGQgY29uc3RhbnQKICBgbGlicmFyeScgdG8gbW9kdWxlIHRoYXQgbmFtZXMgdGhlIGxpYnJhcnkgdXNlZC4gIEFkZGVkIGRvYyBzdHJpbmdzCiAgYW5kIG1ldGhvZCBuYW1lcyB0byBlcnJvciBtZXNzYWdlcy4gIFVzZXMgY29uZmlndXJlIHRvIGRldGVybWluZQogIHdoaWNoIG5kYm0uaCBmaWxlIHRvIGluY2x1ZGU7IEJlcmtlbGV5IERCJ3MgbmJkbSBhbmQgR0RCTSdzIG5kYm0gaXMKICBub3cgYXZhaWxhYmxlIG9wdGlvbnMuCgotIGRpc3R1dGlsczogVXBkYXRlIHRvIHZlcnNpb24gMC45LjMuCgotIGRsOiBBZGQgc2V2ZXJhbCBkbC5SVExEXyBjb25zdGFudHMuCgotIGZwZWN0bDogTm93IHN1cHBvcnRlZCBvbiBGcmVlQlNELgoKLSBnYzogQWRkIERFQlVHX1NBVkVBTEwgb3B0aW9uLiAgV2hlbiBlbmFibGVkIGFsbCBnYXJiYWdlIG9iamVjdHMKICBmb3VuZCBieSB0aGUgY29sbGVjdG9yIHdpbGwgYmUgc2F2ZWQgaW4gZ2MuZ2FyYmFnZS4gIFRoaXMgaXMgdXNlZnVsCiAgZm9yIGRlYnVnZ2luZyBhIHByb2dyYW0gdGhhdCBjcmVhdGVzIHJlZmVyZW5jZSBjeWNsZXMuCgotIGh0dHBsaWI6IFRocmVlIGNoYW5nZXM6IFJlc3RvcmUgc3VwcG9ydCBmb3Igc2V0X2RlYnVnbGV2ZWwgZmVhdHVyZQogIG9mIEhUVFAgY2xhc3MuICBEbyBub3QgY2xvc2Ugc29ja2V0IG9uIHplcm8tbGVuZ3RoIHJlc3BvbnNlLiAgRG8gbm90CiAgY3Jhc2ggd2hlbiBzZXJ2ZXIgc2VuZHMgaW52YWxpZCBjb250ZW50LWxlbmd0aCBoZWFkZXIuCgotIG1haWxib3g6IE1haWxib3ggY2xhc3MgY29uZm9ybXMgYmV0dGVyIHRvIHFtYWlsIHNwZWNpZmljYXRpb25zLgoKLSBtYXJzaGFsOiBXaGVuIHJlYWRpbmcgYSBzaG9ydCwgc2lnbi1leHRlbmQgb24gcGxhdGZvcm1zIHdoZXJlIHNob3J0cwogIGFyZSBiaWdnZXIgdGhhbiAxNiBiaXRzLiAgV2hlbiByZWFkaW5nIGEgbG9uZywgcmVwYWlyIHRoZSB1bnBvcnRhYmxlCiAgc2lnbiBleHRlbnNpb24gdGhhdCB3YXMgYmVpbmcgZG9uZSBmb3IgNjQtYml0IG1hY2hpbmVzLiAgKEl0IGFzc3VtZWQKICB0aGF0IHNpZ25lZCByaWdodCBzaGlmdCBzaWduLWV4dGVuZHMuKQoKLSBvcGVyYXRvcjogQWRkIGNvbnRhaW5zKCksIGludmVydCgpLCBfX2ludmVydF9fKCkgYXMgYWxpYXNlcyBmb3IKICBfX2NvbnRhaW5zX18oKSwgaW52KCksIGFuZCBfX2ludl9fKCkgcmVzcGVjdGl2ZWx5LgoKLSBvczogQWRkIHN1cHBvcnQgZm9yIHBvcGVuMigpIGFuZCBwb3BlbjMoKSBvbiBhbGwgcGxhdGZvcm1zIHdoZXJlCiAgZm9yaygpIGV4aXN0cy4gIChwb3BlbjQoKSBpcyBzdGlsbCBpbiB0aGUgd29ya3MuKQoKLSBvczogKFdpbmRvd3Mgb25seTopIEFkZCBzdGFydGZpbGUoKSBmdW5jdGlvbiB0aGF0IGFjdHMgbGlrZSBkb3VibGUtCiAgY2xpY2tpbmcgb24gYSBmaWxlIGluIEV4cGxvcmVyIChvciBwYXNzaW5nIHRoZSBmaWxlIG5hbWUgdG8gdGhlCiAgRE9TICJzdGFydCIgY29tbWFuZCkuCgotIG9zLnBhdGg6IChXaW5kb3dzLCBET1M6KSBUcmVhdCB0cmFpbGluZyBjb2xvbiBjb3JyZWN0bHkgaW4KICBvcy5wYXRoLmpvaW4uICBvcy5wYXRoLmpvaW4oImE6IiwgImIiKSB5aWVsZHMgImE6YiIuCgotIHBpY2tsZTogTm93IHJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gYW4gaW52YWxpZCBwaWNrbGUgdGhhdCBjb250YWlucwogIGEgbm9uLXN0cmluZyByZXByIHdoZXJlIGEgc3RyaW5nIHJlcHIgd2FzIGV4cGVjdGVkLiAgVGhpcyBiZWhhdmlvcgogIG1hdGNoZXMgY1BpY2tsZS4KCi0gcG9zaXhmaWxlOiBSZW1vdmUgYnJva2VuIF9fZGVsX18oKSBtZXRob2QuCgotIHB5X2NvbXBpbGU6IHN1cHBvcnQgQ1IrTEYgbGluZSB0ZXJtaW5hdG9ycyBpbiBzb3VyY2UgZmlsZS4KCi0gcmVhZGxpbmU6IERvZXMgbm90IGltbWVkaWF0ZWx5IGV4aXQgd2hlbiBeQyBpcyBoaXQgd2hlbiByZWFkbGluZSBhbmQKICB0aHJlYWRzIGFyZSBjb25maWd1cmVkLiAgQWRkcyBkZWZpbml0aW9uIG9mIHJsX2xpYnJhcnlfdmVyc2lvbi4gIChUaGUKICBsYXR0ZXIgYWRkaXRpb24gcmVxdWlyZXMgR05VIHJlYWRsaW5lIDIuMiBvciBsYXRlci4pCgotIHJmYzgyMjogRG9tYWluIGxpdGVyYWxzIHJldHVybmVkIGJ5IEFkZHJsaXN0Q2xhc3MgbWV0aG9kCiAgZ2V0ZG9tYWlubGl0ZXJhbCgpIGFyZSBub3cgcHJvcGVybHkgd3JhcHBlZCBpbiBicmFja2V0cy4KCi0gc2l0ZTogc3lzLnNldGRlZmF1bHRlbmNvZGluZygpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBjYXNlIHRoZQogIHN0YW5kYXJkIGRlZmF1bHQgZW5jb2RpbmcgKCJhc2NpaSIpIGlzIGNoYW5nZWQuIFRoaXMgc2F2ZXMgcXVpdGUgYQogIGZldyBjeWNsZXMgZHVyaW5nIHN0YXJ0dXAgc2luY2UgdGhlIGZpcnN0IGNhbGwgdG8KICBzZXRkZWZhdWx0ZW5jb2RpbmcoKSB3aWxsIGluaXRpYWxpemUgdGhlIGNvZGVjIHJlZ2lzdHJ5IGFuZCB0aGUKICBlbmNvZGluZ3MgcGFja2FnZS4KCi0gc29ja2V0OiBTdXBwb3J0IGZvciBzaXplIGhpbnQgaW4gcmVhZGxpbmVzKCkgbWV0aG9kIG9mIG9iamVjdCByZXR1cm5lZAogIGJ5IG1ha2VmaWxlKCkuCgotIHNyZTogQWRkZWQgZXhwZXJpbWVudGFsIGV4cGFuZCgpIG1ldGhvZCB0byBtYXRjaCBvYmplY3RzLiAgRG9lcyBub3QKICB1c2UgYnVmZmVyIGludGVyZmFjZSBvbiBVbmljb2RlIHN0cmluZ3MuICBEb2VzIG5vdCBoYW5nIGlmIGdyb3VwIGlkCiAgaXMgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZS4KCi0gU3RyaW5nSU86IFNpemUgaGludCBpbiByZWFkbGluZXMoKSBpcyBub3cgc3VwcG9ydGVkIGFzIGRvY3VtZW50ZWQuCgotIHN0cnVjdDogQ2hlY2sgcmFuZ2VzIGZvciBieXRlcyBhbmQgc2hvcnRzLgoKLSB1cmxsaWI6IEltcHJvdmVkIGhhbmRsaW5nIG9mIHdpbjMyIHByb3h5IHNldHRpbmdzLiBGaXhlZCBxdW90ZSBhbmQKICBxdW90ZV9wbHVzIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBhbHdheXMgZW5jb2RlIGEgY29tbWEuCgotIFRraW50ZXI6IEltYWdlIG9iamVjdHMgYXJlIG5vdyBndWFyYW50ZWVkIHRvIGhhdmUgdW5pcXVlIGlkcy4gIFNldAogIGV2ZW50LmRlbHRhIHRvIHplcm8gaWYgVGsgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgbW91c2V3aGVlbC4KICBSZW1vdmVkIHNvbWUgZGVidWdnaW5nIHByaW50cy4KCi0gVXNlckxpc3Q6IG5vdyBpbXBsZW1lbnRzIF9fY29udGFpbnNfXygpLgoKLSB3ZWJicm93c2VyOiBPbiBXaW5kb3dzLCB1c2Ugb3Muc3RhcnRmaWxlKCkgaW5zdGVhZCBvZiBvcy5wb3BlbigpLAogIHdoaWNoIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBOb3J0b24gQW50aVZpcnVzIDIwMDAgdGhhdCBsZWFkcyBkaXJlY3RseQogIHRvIGEgQmx1ZSBTY3JlZW4gZnJlZXplLgoKLSB4bWw6IE5ldyB2ZXJzaW9uIGRldGVjdGlvbiBjb2RlIGFsbG93cyBQeVhNTCB0byBvdmVycmlkZSBzdGFuZGFyZAogIFhNTCBwYWNrYWdlIGlmIFB5WE1MIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIDAuNi4xLgoKLSB4bWwuZG9tOiBET00gbGV2ZWwgMSBzdXBwb3J0IGZvciBiYXNpYyBYTUwuICBJbmNsdWRlcyB4bWwuZG9tLm1pbmlkb20KICAoY29udmVudGlvbmFsIERPTSksIGFuZCB4bWwuZG9tLnB1bGxkb20sIHdoaWNoIGFsbG93cyBidWlsZGluZyB0aGUgRE9NCiAgdHJlZSBvbmx5IGZvciBub2RlcyB3aGljaCBhcmUgc3VmZmljaWVudGx5IGludGVyZXN0aW5nIHRvIGEgc3BlY2lmaWMKICBhcHBsaWNhdGlvbi4gIERvZXMgbm90IHByb3ZpZGUgdGhlIEhUTUwtc3BlY2lmaWMgZXh0ZW5zaW9ucy4gIFN0aWxsCiAgdW5kb2N1bWVudGVkLgoKLSB4bWwuc2F4OiBTQVggMiBzdXBwb3J0IGZvciBQeXRob24sIGluY2x1ZGluZyBhbGwgdGhlIGhhbmRsZXIKICBpbnRlcmZhY2VzIG5lZWRlZCB0byBwcm9jZXNzIFhNTCAxLjAgY29tcGxpYW50IFhNTC4gIFNvbWUKICBkb2N1bWVudGF0aW9uIGlzIGFscmVhZHkgYXZhaWxhYmxlLgoKLSBweWV4cGF0OiBSZW5hbWVkIHRvIHhtbC5wYXJzZXJzLmV4cGF0IHNpbmNlIHRoaXMgaXMgcGFydCBvZiB0aGUgbmV3LAogIHBhY2thZ2l6ZWQgWE1MIHN1cHBvcnQuCgoKQyBBUEkKCi0gQWRkIHRocmVlIG5ldyBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIG1vZHVsZSBpbml0aWFsaXphdGlvbiAtLQogIFB5TW9kdWxlX0FkZE9iamVjdCgpLCBQeU1vZHVsZV9BZGRJbnRDb25zdGFudCgpLCBhbmQKICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCgpLgoKLSBDbGVhbmVkIHVwIGRlZmluaXRpb24gb2YgTlVMTCBpbiBDIHNvdXJjZSBjb2RlOyBhbGwgZGVmaW5pdGlvbnMgd2VyZQogIHJlbW92ZWQgYW5kIGFkZCAjZXJyb3IgdG8gUHl0aG9uLmggaWYgTlVMTCBpc24ndCBkZWZpbmVkIGFmdGVyCiAgI2luY2x1ZGUgb2Ygc3RkaW8uaC4KCi0gUHlfUFJPVE8oKSBtYWNyb3MgdGhhdCB3ZXJlIHJlbW92ZWQgaW4gMi4wYjEgaGF2ZSBiZWVuIHJlc3RvcmVkIGZvcgogIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChhdCB0aGUgc291cmNlIGxldmVsKSB3aXRoIG9sZCBleHRlbnNpb25zLgoKLSBBIHdyYXBwZXIgQVBJIHdhcyBhZGRlZCBmb3Igc2lnbmFsKCkgYW5kIHNpZ2FjdGlvbigpLiAgSW5zdGVhZCBvZgogIGVpdGhlciBmdW5jdGlvbiwgYWx3YXlzIHVzZSBQeU9TX2dldHNpZygpIHRvIGdldCBhIHNpZ25hbCBoYW5kbGVyCiAgYW5kIFB5T1Nfc2V0c2lnKCkgdG8gc2V0IG9uZS4gIEEgbmV3IGNvbnZlbmllbmNlIHR5cGVkZWYKICBQeU9TX3NpZ2hhbmRsZXJfdCBpcyBkZWZpbmVkIGZvciB0aGUgdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMuCgotIEFkZCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoKSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKICBpbnRlcm5hbCBkYXRhIGJ1ZmZlciBhbmQgc2l6ZSBvZiBhIHN0cmluZyBvYmplY3QgLS0gb3IgdGhlIGRlZmF1bHQKICBlbmNvZGVkIHZlcnNpb24gb2YgYSBVbmljb2RlIG9iamVjdC4KCi0gUHlTdHJpbmdfU2l6ZSgpIGFuZCBQeVN0cmluZ19Bc1N0cmluZygpIGFjY2VwdCBVbmljb2RlIG9iamVjdHMuCgotIFRoZSBzdGFuZGFyZCBoZWFkZXIgPGxpbWl0cy5oPiBpcyBub3cgaW5jbHVkZWQgYnkgUHl0aG9uLmggKGlmIGl0CiAgZXhpc3RzKS4gIElOVF9NQVggYW5kIExPTkdfTUFYIHdpbGwgYWx3YXlzIGJlIGRlZmluZWQsIGV2ZW4gaWYKICA8bGltaXRzLmg+IGlzIG5vdCBhdmFpbGFibGUuCgotIFB5RmxvYXRfRnJvbVN0cmluZyB0YWtlcyBhIHNlY29uZCBhcmd1bWVudCwgcGVuZCwgdGhhdCB3YXMKICBlZmZlY3RpdmVseSB1c2VsZXNzLiAgSXQgaXMgbm93IG9mZmljaWFsbHkgdXNlbGVzcyBidXQgcHJlc2VydmVkIGZvcgogIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSWYgdGhlIHBlbmQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpwZW5kIGlzCiAgc2V0IHRvIE5VTEwuCgotIFB5T2JqZWN0X0dldEF0dHIoKSBhbmQgUHlPYmplY3RfU2V0QXR0cigpIG5vdyBhY2NlcHQgVW5pY29kZSBvYmplY3RzCiAgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZS4gIFNlZSBub3RlIG9uIGdldGF0dHIoKSBhYm92ZS4KCi0gQSBmZXcgYnVnIGZpeGVzIHRvIGFyZ3VtZW50IHByb2Nlc3NpbmcgZm9yIFVuaWNvZGUuCiAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkgbm93IGFjY2VwdHMgImVzIyIgYW5kICJlcyIuCiAgUHlBcmdfUGFyc2UoKSBzcGVjaWFsIGNhc2VzICJzIyIgZm9yIFVuaWNvZGUgb2JqZWN0czsgaXQgcmV0dXJucyBhCiAgcG9pbnRlciB0byB0aGUgZGVmYXVsdCBlbmNvZGVkIHN0cmluZyBkYXRhIGluc3RlYWQgb2YgdG8gdGhlIHJhdwogIFVURi0xNi4KCi0gUHlfQnVpbGRWYWx1ZSBhY2NlcHRzIEIgZm9ybWF0IChmb3IgYmdlbi1nZW5lcmF0ZWQgY29kZSkuCgoKSW50ZXJuYWxzCgotIE9uIFVuaXgsIGZpeCBjb2RlIGZvciBmaW5kaW5nIFB5dGhvbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHNvIHRoYXQKICBpdCB3b3JrcyB3aGVuIGFyZ3ZbMF0gaXMgYSByZWxhdGl2ZSBwYXRoLgoKLSBBZGRlZCBhIHRydWUgdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUoKSBmdW5jdGlvbiBhbmQgZml4ZWQgdGhlCiAgdW5pY29kZV9pbnRlcm5hbF9kZWNvZGUgZnVuY3Rpb24oKSB0byBzdXBwb3J0IFVuaWNvZGUgb2JqZWN0cyBkaXJlY3RseQogIHJhdGhlciB0aGFuIGJ5IGdlbmVyYXRpbmcgYSBjb3B5IG9mIHRoZSBvYmplY3QuCgotIFNldmVyYWwgb2YgdGhlIGludGVybmFsIFVuaWNvZGUgdGFibGVzIGFyZSBtdWNoIHNtYWxsZXIgbm93LCBhbmQKICB0aGUgc291cmNlIGNvZGUgc2hvdWxkIGJlIG11Y2ggZnJpZW5kbGllciB0byB3ZWFrZXIgY29tcGlsZXJzLgoKLSBJbiB0aGUgZ2FyYmFnZSBjb2xsZWN0b3I6IEZpeGVkIGJ1ZyBpbiBjb2xsZWN0aW9uIG9mIHR1cGxlcy4gIEZpeGVkCiAgYnVnIHRoYXQgY2F1c2VkIHNvbWUgaW5zdGFuY2VzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgY29udGFpbmVyIHNldAogIHdoaWxlIHRoZXkgd2VyZSBzdGlsbCBsaXZlLiAgRml4ZWQgcGFyc2luZyBpbiBnYy5zZXRfZGVidWcoKSBmb3IKICBwbGF0Zm9ybXMgd2hlcmUgc2l6ZW9mKGxvbmcpID4gc2l6ZW9mKGludCkuCgotIEZpeGVkIHJlZmNvdW50IHByb2JsZW0gaW4gaW5zdGFuY2UgZGVhbGxvY2F0aW9uIHRoYXQgb25seSBvY2N1cnJlZAogIHdoZW4gUHlfUkVGX0RFQlVHIHdhcyBkZWZpbmVkIGFuZCBQeV9UUkFDRV9SRUZTIHdhcyBub3QuCgotIE9uIFdpbmRvd3MsIGdldHB5dGhvbnJlZ3BhdGggaXMgbm93IHByb3RlY3RlZCBhZ2FpbnN0IG51bGwgZGF0YSBpbgogIHJlZ2lzdHJ5IGtleS4KCi0gT24gVW5peCwgY3JlYXRlIC5weWMvLnB5byBmaWxlcyB3aXRoIE9fRVhDTCBmbGFnIHRvIGF2b2lkIGEgcmFjZQogIGNvbmRpdGlvbi4KCgpCdWlsZCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgaXNzdWVzCgotIEJldHRlciBzdXBwb3J0IG9mIEdOVSBQdGggdmlhIC0td2l0aC1wdGggY29uZmlndXJlIG9wdGlvbi4KCi0gUHl0aG9uL0MgQVBJIG5vdyBwcm9wZXJseSBleHBvc2VkIHRvIGR5bmFtaWNhbGx5LWxvYWRlZCBleHRlbnNpb24KICBtb2R1bGVzIG9uIFJlbGlhbnQgVU5JWC4KCi0gQ2hhbmdlcyBmb3IgdGhlIGJlbmVmaXQgb2YgU3VuT1MgNC4xLjQgKHJlYWxseSEpLiAgbW1hcG1vZHVsZS5jOgogIERvbid0IGRlZmluZSBNU19TWU5DIHRvIGJlIHplcm8gd2hlbiBpdCBpcyB1bmRlZmluZWQuICBBZGRlZCBtaXNzaW5nCiAgcHJvdG90eXBlcyBpbiBwb3NpeG1vZHVsZS5jLgoKLSBJbXByb3ZlZCBzdXBwb3J0IGZvciBIUC1VWCBidWlsZC4gIFRocmVhZHMgc2hvdWxkIG5vdyBiZSBjb3JyZWN0bHkKICBjb25maWd1cmVkIChvbiBIUC1VWCAxMC4yMCBhbmQgMTEuMDApLgoKLSBGaXggbGFyZ2VmaWxlIHN1cHBvcnQgb24gb2xkZXIgTmV0QlNEIHN5c3RlbXMgYW5kIE9wZW5CU0QgYnkgYWRkaW5nCiAgZGVmaW5lIGZvciBURUxMNjQuCgoKVG9vbHMgYW5kIG90aGVyIG1pc2NlbGxhbnkKCi0gZnRwbWlycm9yOiBDYWxsIHRvIG1haW4oKSBpcyB3cmFwcGVkIGluIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyIuCgotIGZyZWV6ZTogVGhlIG1vZHVsZWZpbmRlciBub3cgd29ya3Mgd2l0aCAyLjAgb3Bjb2Rlcy4KCi0gSURMRToKICBNb3ZlIGhhY2tlcnkgb2Ygc3lzLmFyZ3YgdW50aWwgYWZ0ZXIgdGhlIFRrIGluc3RhbmNlIGhhcyBiZWVuCiAgY3JlYXRlZCwgd2hpY2ggYWxsb3dzIHRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBUa2ludGVyCiAgaW5pdGlhbGl6YXRpb24gdG8gYmUgZXhlY3V0ZWQgaWYgcHJlc2VudDsgYWxzbyBwYXNzIGFuIGV4cGxpY2l0CiAgY2xhc3NOYW1lIHBhcmFtZXRlciB0byB0aGUgVGsoKSBjb25zdHJ1Y3Rvci4KCgpXaGF0J3MgbmV3IGluIDIuMCBiZXRhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT0KClNvdXJjZSBJbmNvbXBhdGliaWxpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5vbmUuICBOb3RlIHRoYXQgMS42IGludHJvZHVjZWQgc2V2ZXJhbCBpbmNvbXBhdGliaWxpdGllcyB3aXRoIDEuNS4yLApzdWNoIGFzIHNpbmdsZS1hcmd1bWVudCBhcHBlbmQoKSwgY29ubmVjdCgpIGFuZCBiaW5kKCksIGFuZCBjaGFuZ2VzIHRvCnN0cihsb25nKSBhbmQgcmVwcihmbG9hdCkuCgoKQmluYXJ5IEluY29tcGF0aWJpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBUaGlyZCBwYXJ0eSBleHRlbnNpb25zIGJ1aWx0IGZvciBQeXRob24gMS41Lnggb3IgMS42IGNhbm5vdCBiZSB1c2VkCndpdGggUHl0aG9uIDIuMDsgdGhlc2UgZXh0ZW5zaW9ucyB3aWxsIGhhdmUgdG8gYmUgcmVidWlsdCBmb3IgUHl0aG9uCjIuMC4KCi0gT24gV2luZG93cywgYXR0ZW1wdGluZyB0byBpbXBvcnQgYSB0aGlyZCBwYXJ0eSBleHRlbnNpb24gYnVpbHQgZm9yClB5dGhvbiAxLjUueCBvciAxLjYgcmVzdWx0cyBpbiBhbiBpbW1lZGlhdGUgY3Jhc2g7IHRoZXJlJ3Mgbm90IG11Y2ggd2UKY2FuIGRvIGFib3V0IHRoaXMuICBDaGVjayB5b3VyIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUhCgotIFB5dGhvbiBieXRlY29kZSBmaWxlcyAoKi5weWMgYW5kICoucHlvKSBhcmUgbm90IGNvbXBhdGlibGUgYmV0d2VlbgpyZWxlYXNlcy4KCgpPdmVydmlldyBvZiBDaGFuZ2VzIFNpbmNlIDEuNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlcmUgYXJlIG1hbnkgbmV3IG1vZHVsZXMgKGluY2x1ZGluZyBicmFuZCBuZXcgWE1MIHN1cHBvcnQgdGhyb3VnaAp0aGUgeG1sIHBhY2thZ2UsIGFuZCBpMThuIHN1cHBvcnQgdGhyb3VnaCB0aGUgZ2V0dGV4dCBtb2R1bGUpOyBhIGxpc3QKb2YgYWxsIG5ldyBtb2R1bGVzIGlzIGluY2x1ZGVkIGJlbG93LiAgTG90cyBvZiBidWdzIGhhdmUgYmVlbiBmaXhlZC4KClRoZSBwcm9jZXNzIGZvciBtYWtpbmcgbWFqb3IgbmV3IGNoYW5nZXMgdG8gdGhlIGxhbmd1YWdlIGhhcyBjaGFuZ2VkCnNpbmNlIFB5dGhvbiAxLjYuICBFbmhhbmNlbWVudHMgbXVzdCBub3cgYmUgZG9jdW1lbnRlZCBieSBhIFB5dGhvbgpFbmhhbmNlbWVudCBQcm9wb3NhbCAoUEVQKSBiZWZvcmUgdGhleSBjYW4gYmUgYWNjZXB0ZWQuCgpUaGVyZSBhcmUgc2V2ZXJhbCBpbXBvcnRhbnQgc3ludGF4IGVuaGFuY2VtZW50cywgZGVzY3JpYmVkIGluIG1vcmUKZGV0YWlsIGJlbG93OgoKICAtIEF1Z21lbnRlZCBhc3NpZ25tZW50LCBlLmcuIHggKz0gMQoKICAtIExpc3QgY29tcHJlaGVuc2lvbnMsIGUuZy4gW3gqKjIgZm9yIHggaW4gcmFuZ2UoMTApXQoKICAtIEV4dGVuZGVkIGltcG9ydCBzdGF0ZW1lbnQsIGUuZy4gaW1wb3J0IE1vZHVsZSBhcyBOYW1lCgogIC0gRXh0ZW5kZWQgcHJpbnQgc3RhdGVtZW50LCBlLmcuIHByaW50ID4+IGZpbGUsICJIZWxsbyIKCk90aGVyIGltcG9ydGFudCBjaGFuZ2VzOgoKICAtIE9wdGlvbmFsIGNvbGxlY3Rpb24gb2YgY3ljbGljYWwgZ2FyYmFnZQoKUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FsIChQRVApCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUEVQIHN0YW5kcyBmb3IgUHl0aG9uIEVuaGFuY2VtZW50IFByb3Bvc2FsLiAgQSBQRVAgaXMgYSBkZXNpZ24KZG9jdW1lbnQgcHJvdmlkaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBQeXRob24gY29tbXVuaXR5LCBvciBkZXNjcmliaW5nCmEgbmV3IGZlYXR1cmUgZm9yIFB5dGhvbi4gIFRoZSBQRVAgc2hvdWxkIHByb3ZpZGUgYSBjb25jaXNlIHRlY2huaWNhbApzcGVjaWZpY2F0aW9uIG9mIHRoZSBmZWF0dXJlIGFuZCBhIHJhdGlvbmFsZSBmb3IgdGhlIGZlYXR1cmUuCgpXZSBpbnRlbmQgUEVQcyB0byBiZSB0aGUgcHJpbWFyeSBtZWNoYW5pc21zIGZvciBwcm9wb3NpbmcgbmV3CmZlYXR1cmVzLCBmb3IgY29sbGVjdGluZyBjb21tdW5pdHkgaW5wdXQgb24gYW4gaXNzdWUsIGFuZCBmb3IKZG9jdW1lbnRpbmcgdGhlIGRlc2lnbiBkZWNpc2lvbnMgdGhhdCBoYXZlIGdvbmUgaW50byBQeXRob24uICBUaGUgUEVQCmF1dGhvciBpcyByZXNwb25zaWJsZSBmb3IgYnVpbGRpbmcgY29uc2Vuc3VzIHdpdGhpbiB0aGUgY29tbXVuaXR5IGFuZApkb2N1bWVudGluZyBkaXNzZW50aW5nIG9waW5pb25zLgoKVGhlIFBFUHMgYXJlIGF2YWlsYWJsZSBhdCBodHRwOi8vcHl0aG9uLnNvdXJjZWZvcmdlLm5ldC9wZXBzLy4KCkF1Z21lbnRlZCBBc3NpZ25tZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGlzIG11c3QgaGF2ZSBiZWVuIHRoZSBtb3N0LXJlcXVlc3RlZCBmZWF0dXJlIG9mIHRoZSBwYXN0IHllYXJzIQpFbGV2ZW4gbmV3IGFzc2lnbm1lbnQgb3BlcmF0b3JzIHdlcmUgYWRkZWQ6CgogICAgKz0gLT0gKj0gLz0gJT0gKio9IDw8PSA+Pj0gJj0gXj0gfD0KCkZvciBleGFtcGxlLAoKICAgIEEgKz0gQgoKaXMgc2ltaWxhciB0bwoKICAgIEEgPSBBICsgQgoKZXhjZXB0IHRoYXQgQSBpcyBldmFsdWF0ZWQgb25seSBvbmNlIChyZWxldmFudCB3aGVuIEEgaXMgc29tZXRoaW5nCmxpa2UgZGljdFtpbmRleF0uYXR0cikuCgpIb3dldmVyLCBpZiBBIGlzIGEgbXV0YWJsZSBvYmplY3QsIEEgbWF5IGJlIG1vZGlmaWVkIGluIHBsYWNlLiAgVGh1cywKaWYgQSBpcyBhIG51bWJlciBvciBhIHN0cmluZywgQSArPSBCIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQSA9IEErQgooZXhjZXB0IEEgaXMgb25seSBldmFsdWF0ZWQgb25jZSk7IGJ1dCBpZiBhIGlzIGEgbGlzdCwgQSArPSBCIGhhcyB0aGUKc2FtZSBlZmZlY3QgYXMgQS5leHRlbmQoQikhCgpDbGFzc2VzIGFuZCBidWlsdC1pbiBvYmplY3QgdHlwZXMgY2FuIG92ZXJyaWRlIHRoZSBuZXcgb3BlcmF0b3JzIGluCm9yZGVyIHRvIGltcGxlbWVudCB0aGUgaW4tcGxhY2UgYmVoYXZpb3I7IHRoZSBub3QtaW4tcGxhY2UgYmVoYXZpb3IgaXMKdXNlZCBhdXRvbWF0aWNhbGx5IGFzIGEgZmFsbGJhY2sgd2hlbiBhbiBvYmplY3QgZG9lc24ndCBpbXBsZW1lbnQgdGhlCmluLXBsYWNlIGJlaGF2aW9yLiAgRm9yIGNsYXNzZXMsIHRoZSBtZXRob2QgbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlCm1ldGhvZCBuYW1lIGZvciB0aGUgY29ycmVzcG9uZGluZyBub3QtaW4tcGxhY2Ugb3BlcmF0b3IgYnkgaW5zZXJ0aW5nCmFuICdpJyBpbiBmcm9udCBvZiB0aGUgbmFtZSwgZS5nLiBfX2lhZGRfXyBpbXBsZW1lbnRzIGluLXBsYWNlCl9fYWRkX18uCgpBdWdtZW50ZWQgYXNzaWdubWVudCB3YXMgaW1wbGVtZW50ZWQgYnkgVGhvbWFzIFdvdXRlcnMuCgoKTGlzdCBDb21wcmVoZW5zaW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGlzIGlzIGEgZmxleGlibGUgbmV3IG5vdGF0aW9uIGZvciBsaXN0cyB3aG9zZSBlbGVtZW50cyBhcmUgY29tcHV0ZWQKZnJvbSBhbm90aGVyIGxpc3QgKG9yIGxpc3RzKS4gIFRoZSBzaW1wbGVzdCBmb3JtIGlzOgoKICAgIFs8ZXhwcmVzc2lvbj4gZm9yIDx2YXJpYWJsZT4gaW4gPHNlcXVlbmNlPl0KCkZvciBleGFtcGxlLCBbaSoqMiBmb3IgaSBpbiByYW5nZSg0KV0geWllbGRzIHRoZSBsaXN0IFswLCAxLCA0LCA5XS4KVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGEgZm9yIGxvb3Agd2l0aCBhIGxpc3QuYXBwZW5kKCkgY2FsbC4KCllvdSBjYW4gYWxzbyBhZGQgYSBjb25kaXRpb246CgogICAgWzxleHByZXNzaW9uPiBmb3IgPHZhcmlhYmxlPiBpbiA8c2VxdWVuY2U+IGlmIDxjb25kaXRpb24+XQoKRm9yIGV4YW1wbGUsIFt3IGZvciB3IGluIHdvcmRzIGlmIHcgPT0gdy5sb3dlcigpXSB3b3VsZCB5aWVsZCB0aGUgbGlzdApvZiB3b3JkcyB0aGF0IGNvbnRhaW4gbm8gdXBwZXJjYXNlIGNoYXJhY3RlcnMuICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50CnRoYW4gYSBmb3IgbG9vcCB3aXRoIGFuIGlmIHN0YXRlbWVudCBhbmQgYSBsaXN0LmFwcGVuZCgpIGNhbGwuCgpZb3UgY2FuIGFsc28gaGF2ZSBuZXN0ZWQgZm9yIGxvb3BzIGFuZCBtb3JlIHRoYW4gb25lICdpZicgY2xhdXNlLiAgRm9yCmV4YW1wbGUsIGhlcmUncyBhIGZ1bmN0aW9uIHRoYXQgZmxhdHRlbnMgYSBzZXF1ZW5jZSBvZiBzZXF1ZW5jZXM6OgoKICAgIGRlZiBmbGF0dGVuKHNlcSk6CiAgICAgICAgcmV0dXJuIFt4IGZvciBzdWJzZXEgaW4gc2VxIGZvciB4IGluIHN1YnNlcV0KCiAgICBmbGF0dGVuKFtbMF0sIFsxLDIsM10sIFs0LDVdLCBbNiw3LDgsOV0sIFtdXSkKClRoaXMgcHJpbnRzCgogICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCgpMaXN0IGNvbXByZWhlbnNpb25zIG9yaWdpbmF0ZWQgYXMgYSBwYXRjaCBzZXQgZnJvbSBHcmVnIEV3aW5nOyBTa2lwCk1vbnRhbmFybyBhbmQgVGhvbWFzIFdvdXRlcnMgYWxzbyBjb250cmlidXRlZC4gIERlc2NyaWJlZCBieSBQRVAgMjAyLgoKCkV4dGVuZGVkIEltcG9ydCBTdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTWFueSBwZW9wbGUgaGF2ZSBhc2tlZCBmb3IgYSB3YXkgdG8gaW1wb3J0IGEgbW9kdWxlIHVuZGVyIGEgZGlmZmVyZW50Cm5hbWUuICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgbGlrZSB0aGlzOgoKICAgIGltcG9ydCBmb28KICAgIGJhciA9IGZvbwogICAgZGVsIGZvbwoKYnV0IHRoaXMgY29tbW9uIGlkaW9tIGdldHMgb2xkIHF1aWNrbHkuICBBIHNpbXBsZSBleHRlbnNpb24gb2YgdGhlCmltcG9ydCBzdGF0ZW1lbnQgbm93IGFsbG93cyB0aGlzIHRvIGJlIHdyaXR0ZW4gYXMgZm9sbG93czoKCiAgICBpbXBvcnQgZm9vIGFzIGJhcgoKVGhlcmUncyBhbHNvIGEgdmFyaWFudCBmb3IgJ2Zyb20gLi4uIGltcG9ydCc6CgogICAgZnJvbSBmb28gaW1wb3J0IGJhciBhcyBzcGFtCgpUaGlzIGFsc28gd29ya3Mgd2l0aCBwYWNrYWdlczsgZS5nLiB5b3UgY2FuIHdyaXRlIHRoaXM6CgogICAgaW1wb3J0IHRlc3QucmVncnRlc3QgYXMgcmVncnRlc3QKCk5vdGUgdGhhdCAnYXMnIGlzIG5vdCBhIG5ldyBrZXl3b3JkIC0tIGl0IGlzIHJlY29nbml6ZWQgb25seSBpbiB0aGlzCmNvbnRleHQgKHRoaXMgaXMgb25seSBwb3NzaWJsZSBiZWNhdXNlIHRoZSBzeW50YXggZm9yIHRoZSBpbXBvcnQKc3RhdGVtZW50IGRvZXNuJ3QgaW52b2x2ZSBleHByZXNzaW9ucykuCgpJbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4gIERlc2NyaWJlZCBieSBQRVAgMjIxLgoKCkV4dGVuZGVkIFByaW50IFN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkVhc2lseSB0aGUgbW9zdCBjb250cm92ZXJzaWFsIG5ldyBmZWF0dXJlLCB0aGlzIGV4dGVuc2lvbiB0byB0aGUgcHJpbnQKc3RhdGVtZW50IGFkZHMgYW4gb3B0aW9uIHRvIG1ha2UgdGhlIG91dHB1dCBnbyB0byBhIGRpZmZlcmVudCBmaWxlCnRoYW4gdGhlIGRlZmF1bHQgc3lzLnN0ZG91dC4KCkZvciBleGFtcGxlLCB0byB3cml0ZSBhbiBlcnJvciBtZXNzYWdlIHRvIHN5cy5zdGRlcnIsIHlvdSBjYW4gbm93CndyaXRlOgoKICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJFcnJvcjogYmFkIGRvZyEiCgpBcyBhIHNwZWNpYWwgZmVhdHVyZSwgaWYgdGhlIGV4cHJlc3Npb24gdXNlZCB0byBpbmRpY2F0ZSB0aGUgZmlsZQpldmFsdWF0ZXMgdG8gTm9uZSwgdGhlIGN1cnJlbnQgdmFsdWUgb2Ygc3lzLnN0ZG91dCBpcyB1c2VkLiAgVGh1czoKCiAgICBwcmludCA+PiBOb25lLCAiSGVsbG8gd29ybGQiCgppcyBlcXVpdmFsZW50IHRvCgogICAgcHJpbnQgIkhlbGxvIHdvcmxkIgoKRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieSBCYXJyeSBXYXJzYXcuICBEZXNjcmliZWQgYnkgUEVQIDIxNC4KCgpPcHRpb25hbCBDb2xsZWN0aW9uIG9mIEN5Y2xpY2FsIEdhcmJhZ2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQeXRob24gaXMgbm93IGVxdWlwcGVkIHdpdGggYSBnYXJiYWdlIGNvbGxlY3RvciB0aGF0IGNhbiBodW50IGRvd24KY3ljbGljYWwgcmVmZXJlbmNlcyBiZXR3ZWVuIFB5dGhvbiBvYmplY3RzLiAgSXQncyBubyByZXBsYWNlbWVudCBmb3IKcmVmZXJlbmNlIGNvdW50aW5nOyBpbiBmYWN0LCBpdCBkZXBlbmRzIG9uIHRoZSByZWZlcmVuY2UgY291bnRzIGJlaW5nCmNvcnJlY3QsIGFuZCBkZWNpZGVzIHRoYXQgYSBzZXQgb2Ygb2JqZWN0cyBiZWxvbmcgdG8gYSBjeWNsZSBpZiBhbGwKdGhlaXIgcmVmZXJlbmNlIGNvdW50cyBjYW4gYmUgYWNjb3VudGVkIGZvciBmcm9tIHRoZWlyIHJlZmVyZW5jZXMgdG8KZWFjaCBvdGhlci4gIFRoaXMgZGV2aW91cyBzY2hlbWUgd2FzIGZpcnN0IHByb3Bvc2VkIGJ5IEVyaWMgVGllZGVtYW5uLAphbmQgYnJvdWdodCB0byBpbXBsZW1lbnRhdGlvbiBieSBOZWlsIFNjaGVtZW5hdWVyLgoKVGhlcmUncyBhIG1vZHVsZSAiZ2MiIHRoYXQgbGV0cyB5b3UgY29udHJvbCBzb21lIHBhcmFtZXRlcnMgb2YgdGhlCmdhcmJhZ2UgY29sbGVjdGlvbi4gIFRoZXJlJ3MgYWxzbyBhbiBvcHRpb24gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQKdGhhdCBsZXRzIHlvdSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgSW4gMi4wYjEsCml0J3Mgb24gYnkgZGVmYXVsdCwgc28gdGhhdCB3ZSAoaG9wZWZ1bGx5KSBjYW4gY29sbGVjdCBkZWNlbnQgdXNlcgpleHBlcmllbmNlIHdpdGggdGhpcyBuZXcgZmVhdHVyZS4gIFRoZXJlIGFyZSBzb21lIHF1ZXN0aW9ucyBhYm91dCBpdHMKcGVyZm9ybWFuY2UuICBJZiBpdCBwcm92ZXMgdG8gYmUgdG9vIG11Y2ggb2YgYSBwcm9ibGVtLCB3ZSdsbCB0dXJuIGl0Cm9mZiBieSBkZWZhdWx0IGluIHRoZSBmaW5hbCAyLjAgcmVsZWFzZS4KCgpTbWFsbGVyIENoYW5nZXMKLS0tLS0tLS0tLS0tLS0tCgpBIG5ldyBmdW5jdGlvbiB6aXAoKSB3YXMgYWRkZWQuICB6aXAoc2VxMSwgc2VxMiwgLi4uKSBpcyBlcXVpdmFsZW50IHRvCm1hcChOb25lLCBzZXExLCBzZXEyLCAuLi4pIHdoZW4gdGhlIHNlcXVlbmNlcyBoYXZlIHRoZSBzYW1lIGxlbmd0aDsKaS5lLiB6aXAoWzEsMiwzXSwgWzEwLDIwLDMwXSkgcmV0dXJucyBbKDEsMTApLCAoMiwyMCksICgzLDMwKV0uICBXaGVuCnRoZSBsaXN0cyBhcmUgbm90IGFsbCB0aGUgc2FtZSBsZW5ndGgsIHRoZSBzaG9ydGVzdCBsaXN0IHdpbnM6CnppcChbMSwyLDNdLCBbMTAsMjBdKSByZXR1cm5zIFsoMSwxMCksICgyLDIwKV0uICBTZWUgUEVQIDIwMS4KCnN5cy52ZXJzaW9uX2luZm8gaXMgYSB0dXBsZSAobWFqb3IsIG1pbm9yLCBtaWNybywgbGV2ZWwsIHNlcmlhbCkuCgpEaWN0aW9uYXJpZXMgaGF2ZSBhbiBvZGQgbmV3IG1ldGhvZCwgc2V0ZGVmYXVsdChrZXksIGRlZmF1bHQpLgpkaWN0LnNldGRlZmF1bHQoa2V5LCBkZWZhdWx0KSByZXR1cm5zIGRpY3Rba2V5XSBpZiBpdCBleGlzdHM7IGlmIG5vdCwKaXQgc2V0cyBkaWN0W2tleV0gdG8gZGVmYXVsdCBhbmQgcmV0dXJucyB0aGF0IHZhbHVlLiAgVGh1czoKCiAgICBkaWN0LnNldGRlZmF1bHQoa2V5LCBbXSkuYXBwZW5kKGl0ZW0pCgpkb2VzIHRoZSBzYW1lIHdvcmsgYXMgdGhpcyBjb21tb24gaWRpb206CgogICAgaWYgbm90IGRpY3QuaGFzX2tleShrZXkpOgogICAgICAgIGRpY3Rba2V5XSA9IFtdCiAgICBkaWN0W2tleV0uYXBwZW5kKGl0ZW0pCgpUaGVyZSBhcmUgdHdvIG5ldyB2YXJpYW50cyBvZiBTeW50YXhFcnJvciB0aGF0IGFyZSByYWlzZWQgZm9yCmluZGVudGF0aW9uLXJlbGF0ZWQgZXJyb3JzOiBJbmRlbnRhdGlvbkVycm9yIGFuZCBUYWJFcnJvci4KCkNoYW5nZWQgXHggdG8gY29uc3VtZSBleGFjdGx5IHR3byBoZXggZGlnaXRzOyBzZWUgUEVQIDIyMy4gIEFkZGVkIFxVCmVzY2FwZSB0aGF0IGNvbnN1bWVzIGV4YWN0bHkgZWlnaHQgaGV4IGRpZ2l0cy4KClRoZSBsaW1pdHMgb24gdGhlIHNpemUgb2YgZXhwcmVzc2lvbnMgYW5kIGZpbGUgaW4gUHl0aG9uIHNvdXJjZSBjb2RlCmhhdmUgYmVlbiByYWlzZWQgZnJvbSAyKioxNiB0byAyKiozMi4gIFByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbgp3ZXJlIGxpbWl0ZWQgYmVjYXVzZSB0aGUgbWF4aW11bSBhcmd1bWVudCBzaXplIHRoZSBQeXRob24gVk0gYWNjZXB0ZWQKd2FzIDIqKjE2LiAgVGhpcyBsaW1pdGVkIHRoZSBzaXplIG9mIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9ucywKZS5nLiBbMSwyLDNdIG9yIHsnYSc6MSwgJ2InOjJ9LCBhbmQgdGhlIHNpemUgb2Ygc291cmNlIGZpbGVzLiAgVGhpcwpsaW1pdCB3YXMgcmFpc2VkIHRoYW5rcyB0byBhIHBhdGNoIGJ5IENoYXJsZXMgV2FsZG1hbiB0aGF0IGVmZmVjdGl2ZWx5CmZpeGVzIHRoZSBwcm9ibGVtLiAgSXQgaXMgbm93IG11Y2ggbW9yZSBsaWtlbHkgdGhhdCB5b3Ugd2lsbCBiZQpsaW1pdGVkIGJ5IGF2YWlsYWJsZSBtZW1vcnkgdGhhbiBieSBhbiBhcmJpdHJhcnkgbGltaXQgaW4gUHl0aG9uLgoKVGhlIGludGVycHJldGVyJ3MgbWF4aW11bSByZWN1cnNpb24gZGVwdGggY2FuIGJlIG1vZGlmaWVkIGJ5IFB5dGhvbgpwcm9ncmFtcyB1c2luZyBzeXMuZ2V0cmVjdXJzaW9ubGltaXQgYW5kIHN5cy5zZXRyZWN1cnNpb25saW1pdC4gIFRoaXMKbGltaXQgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyB0aGF0IGNhbiBiZSBtYWRlIGJ5ClB5dGhvbiBjb2RlLiAgVGhlIGxpbWl0IGV4aXN0cyB0byBwcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBmcm9tCm92ZXJmbG93aW5nIHRoZSBDIHN0YWNrIGFuZCBjYXVzaW5nIGEgY29yZSBkdW1wLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKMTAwMC4gIFRoZSBtYXhpbXVtIHNhZmUgdmFsdWUgZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSBjYW4gYmUgZm91bmQKYnkgcnVubmluZyBNaXNjL2ZpbmRfcmVjdXJzaW9ubGltaXQucHkuCgpOZXcgTW9kdWxlcyBhbmQgUGFja2FnZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphdGV4aXQgLSBmb3IgcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCB3aGVuIFB5dGhvbiBleGl0cy4KCmltcHV0aWwgLSBHcmVnIFN0ZWluJ3MgYWx0ZXJuYXRpdmUgQVBJIGZvciB3cml0aW5nIGN1c3RvbSBpbXBvcnQKaG9va3MuCgpweWV4cGF0IC0gYW4gaW50ZXJmYWNlIHRvIHRoZSBFeHBhdCBYTUwgcGFyc2VyLCBjb250cmlidXRlZCBieSBQYXVsClByZXNjb2QuCgp4bWwgLSBhIG5ldyBwYWNrYWdlIHdpdGggWE1MIHN1cHBvcnQgY29kZSBvcmdhbml6ZWQgKHNvIGZhcikgaW4gdGhyZWUKc3VicGFja2FnZXM6IHhtbC5kb20sIHhtbC5zYXgsIGFuZCB4bWwucGFyc2Vycy4gIERlc2NyaWJpbmcgdGhlc2UKd291bGQgZmlsbCBhIHZvbHVtZS4gIFRoZXJlJ3MgYSBzcGVjaWFsIGZlYXR1cmUgd2hlcmVieSBhCnVzZXItaW5zdGFsbGVkIHBhY2thZ2UgbmFtZWQgX3htbHBsdXMgb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZAp4bWxwYWNrYWdlOyB0aGlzIGlzIGludGVuZGVkIHRvIGdpdmUgdGhlIFhNTCBTSUcgYSBob29rIHRvIGRpc3RyaWJ1dGUKYmFja3dhcmRzLWNvbXBhdGlibGUgdXBkYXRlcyB0byB0aGUgc3RhbmRhcmQgeG1sIHBhY2thZ2UuCgp3ZWJicm93c2VyIC0gYSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBBUEkgdG8gbGF1bmNoIGEgd2ViIGJyb3dzZXIuCgoKQ2hhbmdlZCBNb2R1bGVzCi0tLS0tLS0tLS0tLS0tLQoKYXJyYXkgLS0gbmV3IG1ldGhvZHMgZm9yIGFycmF5IG9iamVjdHM6IGNvdW50LCBleHRlbmQsIGluZGV4LCBwb3AsIGFuZApyZW1vdmUKCmJpbmFzY2lpIC0tIG5ldyBmdW5jdGlvbnMgYjJhX2hleCBhbmQgYTJiX2hleCB0aGF0IGNvbnZlcnQgYmV0d2VlbgpiaW5hcnkgZGF0YSBhbmQgaXRzIGhleCByZXByZXNlbnRhdGlvbgoKY2FsZW5kYXIgLS0gTWFueSBuZXcgZnVuY3Rpb25zIHRoYXQgc3VwcG9ydCBmZWF0dXJlcyBpbmNsdWRpbmcgY29udHJvbApvdmVyIHdoaWNoIGRheSBvZiB0aGUgd2VlayBpcyB0aGUgZmlyc3QgZGF5LCByZXR1cm5pbmcgc3RyaW5ncyBpbnN0ZWFkCm9mIHByaW50aW5nIHRoZW0uICBBbHNvIG5ldyBzeW1ib2xpYyBjb25zdGFudHMgZm9yIGRheXMgb2Ygd2VlaywKZS5nLiBNT05EQVksIC4uLiwgU1VOREFZLgoKY2dpIC0tIEZpZWxkU3RvcmFnZSBvYmplY3RzIGhhdmUgYSBnZXR2YWx1ZSBtZXRob2QgdGhhdCB3b3JrcyBsaWtlIGEKZGljdGlvbmFyeSdzIGdldCBtZXRob2QgYW5kIHJldHVybnMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgb2JqZWN0LgoKQ29uZmlnUGFyc2VyIC0tIFRoZSBwYXJzZXIgb2JqZWN0IGhhcyBuZXcgbWV0aG9kcyBoYXNfb3B0aW9uLApyZW1vdmVfc2VjdGlvbiwgcmVtb3ZlX29wdGlvbiwgc2V0LCBhbmQgd3JpdGUuICBUaGV5IGFsbG93IHRoZSBtb2R1bGUKdG8gYmUgdXNlZCBmb3Igd3JpdGluZyBjb25maWcgZmlsZXMgYXMgd2VsbCBhcyByZWFkaW5nIHRoZW0uCgpmdHBsaWIgLS0gbnRyYW5zZmVyY21kKCksIHRyYW5zZmVyY21kKCksIGFuZCByZXRyYmluYXJ5KCkgYWxsIG5vdwpvcHRpb25hbGx5IHN1cHBvcnQgdGhlIFJGQyA5NTkgUkVTVCBjb21tYW5kLgoKZ3ppcCAtLSByZWFkbGluZSBhbmQgcmVhZGxpbmVzIG5vdyBhY2NlcHQgb3B0aW9uYWwgc2l6ZSBhcmd1bWVudHMKCmh0dHBsaWIgLS0gTmV3IGludGVyZmFjZXMgYW5kIHN1cHBvcnQgZm9yIEhUVFAvMS4xIGJ5IEdyZWcgU3RlaW4uICBTZWUKdGhlIG1vZHVsZSBkb2Mgc3RyaW5ncyBmb3IgZGV0YWlscy4KCmxvY2FsZSAtLSBpbXBsZW1lbnQgZ2V0ZGVmYXVsdGxvY2FsZSBmb3IgV2luMzIgYW5kIE1hY2ludG9zaAoKbWFyc2hhbCAtLSBubyBsb25nZXIgZHVtcHMgY29yZSB3aGVuIG1hcnNoYWxpbmcgZGVlcGx5IG5lc3RlZCBvcgpyZWN1cnNpdmUgZGF0YSBzdHJ1Y3R1cmVzCgpvcyAtLSBuZXcgZnVuY3Rpb25zIGlzYXR0eSwgc2V0ZXVpZCwgc2V0ZWdpZCwgc2V0cmV1aWQsIHNldHJlZ2lkCgpvcy9wb3BlbjIgLS0gcG9wZW4yL3BvcGVuMy9wb3BlbjQgc3VwcG9ydCB1bmRlciBXaW5kb3dzLiAgcG9wZW4yL3BvcGVuMwpzdXBwb3J0IHVuZGVyIFVuaXguCgpvcy9wdHkgLS0gc3VwcG9ydCBmb3Igb3BlbnB0eSBhbmQgZm9ya3B0eQoKb3MucGF0aCAtLSBmaXggc2VtYW50aWNzIG9mIG9zLnBhdGguY29tbW9ucHJlZml4CgpzbXRwbGliIC0tIHN1cHBvcnQgZm9yIHNlbmRpbmcgdmVyeSBsb25nIG1lc3NhZ2VzCgpzb2NrZXQgLS0gbmV3IGZ1bmN0aW9uIGdldGZxZG4oKQoKcmVhZGxpbmUgLS0gbmV3IGZ1bmN0aW9ucyB0byByZWFkLCB3cml0ZSBhbmQgdHJ1bmNhdGUgaGlzdG9yeSBmaWxlcy4KVGhlIHJlYWRsaW5lIHNlY3Rpb24gb2YgdGhlIGxpYnJhcnkgcmVmZXJlbmNlIG1hbnVhbCBjb250YWlucyBhbgpleGFtcGxlLgoKc2VsZWN0IC0tIGFkZCBpbnRlcmZhY2UgdG8gcG9sbCBzeXN0ZW0gY2FsbAoKc2h1dGlsIC0tIG5ldyBjb3B5ZmlsZW9iaiBmdW5jdGlvbgoKU2ltcGxlSFRUUFNlcnZlciwgQ0dJSFRUUFNlcnZlciAtLSBGaXggcHJvYmxlbXMgd2l0aCBidWZmZXJpbmcgaW4gdGhlCkhUVFAgc2VydmVyLgoKVGtpbnRlciAtLSBvcHRpbWl6YXRpb24gb2YgZnVuY3Rpb24gZmxhdHRlbgoKdXJsbGliIC0tIHNjYW5zIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgcHJveHkgY29uZmlndXJhdGlvbiwKZS5nLiBodHRwX3Byb3h5LgoKd2hpY2hkYiAtLSByZWNvZ25pemVzIGR1bWJkYm0gZm9ybWF0CgoKT2Jzb2xldGUgTW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tCgpOb25lLiAgSG93ZXZlciBub3RlIHRoYXQgMS42IG1hZGUgYSB3aG9sZSBzbGV3IG9mIG1vZHVsZXMgb2Jzb2xldGU6CnN0ZHdpbiwgc291bmRleCwgY21sLCBjbXBjYWNoZSwgZGlyY2FjaGUsIGR1bXAsIGZpbmQsIGdyZXAsIHBhY2ttYWlsLApwb2x5LCB6bW9kLCBzdHJvcCwgdXRpbCwgd2hhdHNvdW5kLgoKCkNoYW5nZWQsIE5ldywgT2Jzb2xldGUgVG9vbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTm9uZS4KCgpDLWxldmVsIENoYW5nZXMKLS0tLS0tLS0tLS0tLS0tCgpTZXZlcmFsIGNsZWFudXAgam9icyB3ZXJlIGNhcnJpZWQgb3V0IHRocm91Z2hvdXQgdGhlIHNvdXJjZSBjb2RlLgoKQWxsIEMgY29kZSB3YXMgY29udmVydGVkIHRvIEFOU0kgQzsgd2UgZ290IHJpZCBvZiBhbGwgdXNlcyBvZiB0aGUKUHlfUFJPVE8oKSBtYWNybywgd2hpY2ggbWFrZXMgdGhlIGhlYWRlciBmaWxlcyBhIGxvdCBtb3JlIHJlYWRhYmxlLgoKTW9zdCBvZiB0aGUgcG9ydGFiaWxpdHkgaGFja3Mgd2VyZSBtb3ZlZCB0byBhIG5ldyBoZWFkZXIgZmlsZSwKcHlwb3J0Lmg7IHNldmVyYWwgb3RoZXIgbmV3IGhlYWRlciBmaWxlcyB3ZXJlIGFkZGVkIGFuZCBzb21lIG9sZApoZWFkZXIgZmlsZXMgd2VyZSByZW1vdmVkLCBpbiBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhIG1vcmUgcmF0aW9uYWwgc2V0Cm9mIGhlYWRlciBmaWxlcy4gIChGZXcgb2YgdGhlc2UgZXZlciBuZWVkIHRvIGJlIGluY2x1ZGVkIGV4cGxpY2l0bHk7CnRoZXkgYXJlIGFsbCBpbmNsdWRlZCBieSBQeXRob24uaC4pCgpUcmVudCBNaWNrIGVuc3VyZWQgcG9ydGFiaWxpdHkgdG8gNjQtYml0IHBsYXRmb3JtcywgdW5kZXIgYm90aCBMaW51eAphbmQgV2luNjQsIGVzcGVjaWFsbHkgZm9yIHRoZSBuZXcgSW50ZWwgSXRhbml1bSBwcm9jZXNzb3IuICBNaWNrIGFsc28KYWRkZWQgbGFyZ2UgZmlsZSBzdXBwb3J0IGZvciBMaW51eDY0IGFuZCBXaW42NC4KClRoZSBDIEFQSXMgdG8gcmV0dXJuIGFuIG9iamVjdCdzIHNpemUgaGF2ZSBiZWVuIHVwZGF0ZSB0byBjb25zaXN0ZW50bHkKdXNlIHRoZSBmb3JtIFB5WFhYX1NpemUsIGUuZy4gUHlTZXF1ZW5jZV9TaXplIGFuZCBQeURpY3RfU2l6ZS4gIEluCnByZXZpb3VzIHZlcnNpb25zLCB0aGUgYWJzdHJhY3QgaW50ZXJmYWNlcyB1c2VkIFB5WFhYX0xlbmd0aCBhbmQgdGhlCmNvbmNyZXRlIGludGVyZmFjZXMgdXNlZCBQeVhYWF9TaXplLiAgVGhlIG9sZCBuYW1lcywKZS5nLiBQeU9iamVjdF9MZW5ndGgsIGFyZSBzdGlsbCBhdmFpbGFibGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CmF0IHRoZSBBUEkgbGV2ZWwsIGJ1dCBhcmUgZGVwcmVjYXRlZC4KClRoZSBQeU9TX0NoZWNrU3RhY2sgZnVuY3Rpb24gaGFzIGJlZW4gaW1wbGVtZW50ZWQgb24gV2luZG93cyBieQpGcmVkcmlrIEx1bmRoLiAgSXQgcHJldmVudHMgUHl0aG9uIGZyb20gZmFpbGluZyB3aXRoIGEgc3RhY2sgb3ZlcmZsb3cKb24gV2luZG93cy4KClRoZSBHQyBjaGFuZ2VzIHJlc3VsdGVkIGluIGNyZWF0aW9uIG9mIHR3byBuZXcgc2xvdHMgb24gb2JqZWN0LAp0cF90cmF2ZXJzZSBhbmQgdHBfY2xlYXIuICBUaGUgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2hhbmdlcyByZXN1bHQgaW4KdGhlIGNyZWF0aW9uIG9mIGEgbmV3IHNsb3QgZm9yIGVhY2ggaW4tcGxhY2Ugb3BlcmF0b3IuCgpUaGUgR0MgQVBJIGNyZWF0ZXMgbmV3IHJlcXVpcmVtZW50cyBmb3IgY29udGFpbmVyIHR5cGVzIGltcGxlbWVudGVkIGluCkMgZXh0ZW5zaW9uIG1vZHVsZXMuICBTZWUgSW5jbHVkZS9vYmppbXBsLmggZm9yIGRldGFpbHMuCgpQeUVycl9Gb3JtYXQgaGFzIGJlZW4gdXBkYXRlZCB0byBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZgp0aGUgYnVmZmVyIG5lZWRlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IHN0cmluZy4gIFRoaXMgY2hhbmdlCnByZXZlbnRzIGNyYXNoZXMgY2F1c2VkIGJ5IHByb2dyYW1tZXIgZXJyb3IuCgpOZXcgQyBBUEkgY2FsbHM6IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IsIFB5RXJyX1dyaXRlVW5yYWlzYWJsZS4KClB5UnVuX0FueUZpbGVFeCwgUHlSdW5fU2ltcGxlRmlsZUV4LCBQeVJ1bl9GaWxlRXggLS0gTmV3IGZ1bmN0aW9ucwp0aGF0IGFyZSB0aGUgc2FtZSBhcyB0aGVpciBub24tRXggY291bnRlcnBhcnRzIGV4Y2VwdCB0aGV5IHRha2UgYW4KZXh0cmEgZmxhZyBhcmd1bWVudCB0aGF0IHRlbGxzIHRoZW0gdG8gY2xvc2UgdGhlIGZpbGUgd2hlbiBkb25lLgoKWFhYIFRoZXJlIHdlcmUgb3RoZXIgQVBJIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZmxlc2hlZCBvdXQgaGVyZS4KCgpXaW5kb3dzIENoYW5nZXMKLS0tLS0tLS0tLS0tLS0tCgpOZXcgcG9wZW4yL3BvcGVuMy9wZW9wZW40IGluIG9zIG1vZHVsZSAoc2VlIENoYW5nZWQgTW9kdWxlcyBhYm92ZSkuCgpvcy5wb3BlbiBpcyBtdWNoIG1vcmUgdXNhYmxlIG9uIFdpbmRvd3MgOTUgYW5kIDk4LiAgU2VlIE1pY3Jvc29mdApLbm93bGVkZ2UgQmFzZSBhcnRpY2xlIFExNTA5NTYuICBUaGUgV2luOXggd29ya2Fyb3VuZCBkZXNjcmliZWQgdGhlcmUKaXMgaW1wbGVtZW50ZWQgYnkgdGhlIG5ldyB3OXhwb3Blbi5leGUgaGVscGVyIGluIHRoZSByb290IG9mIHlvdXIKUHl0aG9uIGluc3RhbGxhdGlvbi4gIE5vdGUgdGhhdCBQeXRob24gdXNlcyB0aGlzIGludGVybmFsbHk7IGl0IGlzIG5vdAphIHN0YW5kYWxvbmUgcHJvZ3JhbS4KCkFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGluc3RhbGwgUHl0aG9uCm9uIFdpbmRvd3MgTlQgb3IgV2luZG93cyAyMDAwLiAgSWYgeW91IGhhdmUgYWRtaW5pc3RyYXRvciBwcml2aWxlZ2VzLApQeXRob24ncyByZWdpc3RyeSBpbmZvIHdpbGwgYmUgd3JpdHRlbiB1bmRlciBIS0VZX0xPQ0FMX01BQ0hJTkUuCk90aGVyd2lzZSB0aGUgaW5zdGFsbGVyIGJhY2tzIG9mZiB0byB3cml0aW5nIFB5dGhvbidzIHJlZ2lzdHJ5IGluZm8KdW5kZXIgSEtFWV9DVVJSRU5UX1VTRVIuICBUaGUgbGF0dGVyIGlzIHN1ZmZpY2llbnQgZm9yIGFsbCAibm9ybWFsIgp1c2VzIG9mIFB5dGhvbiwgYnV0IHdpbGwgcHJldmVudCBzb21lIGFkdmFuY2VkIHVzZXMgZnJvbSB3b3JraW5nCihmb3IgZXhhbXBsZSwgcnVubmluZyBhIFB5dGhvbiBzY3JpcHQgYXMgYW4gTlQgc2VydmljZSwgb3IgcG9zc2libHkKZnJvbSBDR0kpLgoKW1RoaXMgd2FzIG5ldyBpbiAxLjZdIFRoZSBpbnN0YWxsZXIgbm8gbG9uZ2VyIHJ1bnMgYSBzZXBhcmF0ZSBUY2wvVGsKaW5zdGFsbGVyOyBpbnN0ZWFkLCBpdCBpbnN0YWxscyB0aGUgbmVlZGVkIFRjbC9UayBmaWxlcyBkaXJlY3RseSBpbiB0aGUKUHl0aG9uIGRpcmVjdG9yeS4gIElmIHlvdSBhbHJlYWR5IGhhdmUgYSBUY2wvVGsgaW5zdGFsbGF0aW9uLCB0aGlzCndhc3RlcyBzb21lIGRpc2sgc3BhY2UgKGFib3V0IDQgTWVncykgYnV0IGF2b2lkcyBwcm9ibGVtcyB3aXRoCmNvbmZsaWN0aW5nIFRjbC9UayBpbnN0YWxsYXRpb25zLCBhbmQgbWFrZXMgaXQgbXVjaCBlYXNpZXIgZm9yIFB5dGhvbgp0byBlbnN1cmUgdGhhdCBUY2wvVGsgY2FuIGZpbmQgYWxsIGl0cyBmaWxlcy4KCltUaGlzIHdhcyBuZXcgaW4gMS42XSBUaGUgV2luZG93cyBpbnN0YWxsZXIgbm93IGluc3RhbGxzIGJ5IGRlZmF1bHQgaW4KXFB5dGhvbjIwXCBvbiB0aGUgZGVmYXVsdCB2b2x1bWUsIGluc3RlYWQgb2YgXFByb2dyYW0gRmlsZXNcUHl0aG9uLTIuMFwuCgoKVXBkYXRlcyB0byB0aGUgY2hhbmdlcyBiZXR3ZWVuIDEuNS4yIGFuZCAxLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSAxLjYgTkVXUyBmaWxlIGNhbid0IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIHJlbGVhc2UgaXMgZG9uZSwgc28gaGVyZQppcyBzb21lIGxhdGUtYnJlYWtpbmcgbmV3czoKCk5ldyBBUElzIGluIGxvY2FsZS5weTogbm9ybWFsaXplKCksIGdldGRlZmF1bHRsb2NhbGUoKSwgcmVzZXRsb2NhbGUoKSwKYW5kIGNoYW5nZXMgdG8gZ2V0bG9jYWxlKCkgYW5kIHNldGxvY2FsZSgpLgoKVGhlIG5ldyBtb2R1bGUgaXMgbm93IGVuYWJsZWQgcGVyIGRlZmF1bHQuCgpJdCBpcyBub3QgdHJ1ZSB0aGF0IHRoZSBlbmNvZGluZ3MgY29kZWNzIGNhbm5vdCBiZSB1c2VkIGZvciBub3JtYWwKc3RyaW5nczogdGhlIHN0cmluZy5lbmNvZGUoKSAod2hpY2ggaXMgYWxzbyBwcmVzZW50IG9uIDgtYml0IHN0cmluZ3MKISkgYWxsb3dzIHVzaW5nIHRoZW0gZm9yIDgtYml0IHN0cmluZ3MgdG9vLCBlLmcuIHRvIGNvbnZlcnQgZmlsZXMgZnJvbQpjcDEyNTIgKFdpbmRvd3MpIHRvIGxhdGluLTEgb3IgdmljZS12ZXJzYS4KCkphcGFuZXNlIGNvZGVjcyBhcmUgYXZhaWxhYmxlIGZyb20gVGFtaXRvIEtBSklZQU1BOgpodHRwOi8vcHNldWRvLmdyYWQuc2Njcy5jaHVreW8tdS5hYy5qcC9+a2FqaXlhbWEvcHl0aG9uLwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K