ICAgICAgICAgICAgICAgICAgICBBcGFjaGUgQ29tbW9ucyBJTwogICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi42CiAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlIE5vdGVzCgpJTlRST0RVQ1RJT046CgpBcGFjaGUgQ29tbW9ucyBJTyBpcyBhIHBhY2thZ2Ugb2YgSmF2YSB1dGlsaXR5IGNsYXNzZXMgbGlrZSBqYXZhLmlvLgpDbGFzc2VzIGluIHRoaXMgcGFja2FnZSBhcmUgY29uc2lkZXJlZCB0byBiZSBzbyBzdGFuZGFyZCBhbmQgb2Ygc3VjaCBoaWdoCnJldXNlIGFzIHRvIGp1c3RpZnkgZXhpc3RlbmNlIGluIGphdmEuaW8uCgpUaGUgQXBhY2hlIENvbW1vbnMgSU8gbGlicmFyeSBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsCmZpbGUgZmlsdGVycywgZmlsZSBjb21wYXJhdG9ycywgZW5kaWFuIHRyYW5zZm9ybWF0aW9uIGNsYXNzZXMsIGFuZCBtdWNoIG1vcmUuCgpBcGFjaGUgQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgYXQgbGVhc3QgSmF2YSA3IHRvIGJ1aWxkIGFuZCBydW4uCgoKREVQUkVDQVRJT05TCj09PT09PT09PT09PQoKQWxsIGNsb3NlUXVpZXRseSBvdmVybG9hZHMgaW4gb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHMgaGF2ZSBiZWVuCmRlcHJlY2F0ZWQuIFVzZSB0aGUgdHJ5LXdpdGgtcmVzb3VyY2VzIHN0YXRlbWVudCBvciBoYW5kbGUgc3VwcHJlc3NlZApleGNlcHRpb25zIG1hbnVhbGx5LgoKVGhlIGNsYXNzIG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlU3lzdGVtVXRpbHMgaGFzIGJlZW4gZGVwcmVjYXRlZC4KVXNlIGVxdWl2YWxlbnQgbWV0aG9kcyBpbiBqYXZhLm5pby5maWxlLkZpbGVTdG9yZSBpbnN0ZWFkLCBlLmcuCkZpbGVzLmdldEZpbGVTdG9yZShQYXRocy5nZXQoIi9ob21lIikpLmdldFVzYWJsZVNwYWNlKCkgb3IgaXRlcmF0ZSBvdmVyCkZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5nZXRGaWxlU3RvcmVzKCkuCgoKQ09NUEFUSUJJTElUWSBXSVRIIEpBVkEgOQo9PT09PT09PT09PT09PT09PT0KClRoZSBNQU5JRkVTVC5NRiBub3cgY29udGFpbnMgYW4gYWRkaXRpb25hbCBlbnRyeToKCiAgQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8KClRoaXMgc2hvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIENvbW1vbnMgSU8gMi42IGFzIGEgbW9kdWxlIGluIHRoZSBKYXZhIDkKbW9kdWxlIHN5c3RlbS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGlzc3VlOgoKICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tNTUxCgpCdWlsZGluZyBDb21tb25zIElPIDIuNiBzaG91bGQgd29yayBvdXQgb2YgdGhlIGJveCB3aXRoIHRoZSBsYXRlc3QgSmF2YSA5CnJlbGVhc2UuIFBsZWFzZSByZXBvcnQgYW55IEphdmEgOSByZWxhdGVkIGlzc3VlcyBhdDoKCiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPCgoKTkVXIEZFQVRVUkVTCj09PT09PT09PT09PQoKbyBJTy01NTE6IEFkZCBBdXRvbWF0aWMtTW9kdWxlLU5hbWUgTUFOSUZFU1QgZW50cnkgZm9yIEphdmEgOSBjb21wYXRpYmlsaXR5LgpvIElPLTM2NzogQWRkIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvcHlUb0RpcmVjdG9yeS4gVGhhbmtzIHRvIEphbWVzIFNhd2xlLgpvIElPLTQ5MzogQWRkIGluZmluaXRlIGNpcmN1bGFyIGlucHV0IHN0cmVhbS4gVGhhbmtzIHRvIFBpb3RyIFR1cnNraS4KbyBJTy01MDc6IEFkZCBhIEJ5dGVPcmRlclV0aWxzIGNsYXNzLgpvIElPLTUxODogQWRkIE9ic2VydmFibGVJbnB1dFN0cmVhbS4KbyBJTy01MTk6IEFkZCBNZXNzYWdlRGlnZXN0Q2FsY3VsYXRpbmdJbnB1dFN0cmVhbS4KbyBJTy01MTM6IEFkZCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciByZWFkaW5nIGNsYXNzIHBhdGggcmVzb3VyY2VzLgogICAgICAgICAgVGhhbmtzIHRvIEJlaHJhbmcgU2FlZWR6YWRlaC4KCkZJWEVEIEJVR1MKPT09PT09PT09PQoKbyBJTy01NDY6IENsb3NlZE91dHB1dFN0cmVhbSNmbHVzaCBzaG91bGQgdGhyb3cuIFRoYW5rcyB0byBUb21hcyBDZWxheWEuCm8gSU8tNTUwOiBEb2N1bWVudGF0aW9uIGlzc3VlLCBmaXggNDA0IEphdmFkb2MgaXNzdWVzIGluIHRoZSBkZXNjcmlwdGlvbiBwYWdlLgogICAgICAgICAgVGhhbmtzIHRvIEppbWkgQWRyaWFuLgpvIElPLTQ0MjogSmF2YWRvYyBjb250cmFkaWN0b3J5IGZvciBGaWxlRmlsdGVyVXRpbHMuYWdlRmlsZUZpbHRlcihjdXRvZmYpIGFuZAogICAgICAgICAgdGhlIGZpbHRlciBpdCBjb25zdHJ1Y3RzOiBBZ2VGaWxlRmlsdGVyKGN1dG9mZikuCiAgICAgICAgICBUaGFua3MgdG8gU2ltb24gUm9iaW5zb24uCm8gSU8tNTM0OiBGaWxlVXRpbFRlc3RDYXNlLnRlc3RGb3JjZURlbGV0ZURpcigpIHNob3VsZCBub3QgZGVsZXRlIHRlc3REaXJlY3RvcnkKICAgICAgICAgIHBhcmVudC4KbyBJTy01Mjg6IEZpeCBUYWlsZXIucnVuIHJhY2UgY29uZGl0aW9uIHJ1bmF3YXkgbG9nZ2luZy4gVGhhbmtzIHRvIERhdmUgTW90ZW4uCm8gSU8tNDgzOiBnZXRQcmVmaXhMZW5ndGggcmV0dXJuIC0xIGlmIHVuaXggZmlsZSBjb250YWlucyBjb2xvbi4KICAgICAgICAgIFRoYW5rcyB0byBNYXJrbyBWYXNpYy4KbyBJTy01MjA6IEZpbGVVdGlsc1Rlc3RDYXNlI3Rlc3RDb250ZW50RXF1YWxzSWdub3JlRU9MIGZhaWxzIG9uIFdpbmRvd3MuCm8gSU8tNTE2OiAuZ2l0YXR0cmlidXRlcyBub3QgY29ycmVjdGx5IGFwcGxpZWQuIFRoYW5rcyB0byBKYXNvbiBQeWVyb24uCm8gSU8tNTE1OiBBbGxvdyBTcGVjaWZ5aW5nIEluaXRpYWwgQnVmZmVyIFNpemUgb2YgRGVmZXJyZWRGaWxlT3V0cHV0U3RyZWFtLgogICAgICAgICAgVGhhbmtzIHRvIEJyZXR0IExvdW5zYnVyeSwgR2FyeSBHcmVnb3J5LgpvIElPLTUxMjogVGhyZXNob2xkaW5nT3V0cHV0U3RyZWFtLnRocmVzaG9sZFJlYWNoZWQoKSByZXN1bHRzIGluCiAgICAgICAgICBGaWxlTm90Rm91bmRFeGNlcHRpb24uIFRoYW5rcyB0byBSYWxmIEhhdXNlci4KbyBJTy01MTE6IEFmdGVyIGEgZmV3IHVuaXQgdGVzdHMsIGEgZmV3IG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3JpZXMgbm90IGNsZWFuZWQKICAgICAgICAgIGNvbXBsZXRlbHkuIFRoYW5rcyB0byBBaG1ldCBDZWxpay4KbyBJTy01MDI6IEV4Y2VwdGlvbnMgYXJlIHN1cHByZXNzZWQgaW5jb3JyZWN0bHkgd2hlbiBjb3B5aW5nIGZpbGVzLgogICAgICAgICAgVGhhbmtzIHRvIENocmlzdGlhbiBTY2h1bHRlLgpvIElPLTUwMzogVXBkYXRlIHBsYXRmb3JtIHJlcXVpcmVtZW50IHRvIEphdmEgNy4KbyBJTy01Mzc6IEJPTUlucHV0U3RyZWFtIHNob3VsZG4ndCBzb3J0IGFycmF5IG9mIEJPTXMgaW4tcGxhY2UuCiAgICAgICAgICBUaGFua3MgdG8gQm9yeXMgWmlicm92LgoKQ0hBTkdFUwo9PT09PT09CgpvIElPLTU1MzogTWFrZSBjb2RlIHN0eWxlIG9mIGhhc0JPTSgpIGNvbnNpc3RlbnQgd2l0aCBnZXRCT01DaGFyc2V0TmFtZSgpLgogICAgICAgICAgVGhhbmtzIHRvIE1pY2hhZWwgRXJuc3QuCm8gSU8tNTQyOiBGaWxlVXRpbHMjcmVhZEZpbGVUb0J5dGVBcnJheTogb3B0aW1pemUgcmVhZGluZyBvZiBmaWxlcyB3aXRoIGtub3duCiAgICAgICAgICBzaXplLiBUaGFua3MgdG8gSWxtYXJzIFBvaWthbnMuCm8gSU8tNTQ3OiBUaHJvdyBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnN0ZWFkIG9mIE51bGxQb2ludGVyRXhjZXB0aW9uIGluCiAgICAgICAgICBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlV2luZG93cygpLiBUaGFua3MgdG8gTmlraGlsIFNoaW5kZSwKICAgICAgICAgIE1pY2hhZWwgRXJuc3QsIEdhcnkgR3Jlb3J5LgpvIElPLTUwNjogRGVwcmVjYXRlIG1ldGhvZHMgRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZUtiKCkuCiAgICAgICAgICBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCm8gSU8tNTA1OiBNYWtlIExpbmVJdGVyYXRvciBpbXBsZW1lbnQgQ2xvc2VhYmxlIHRvIHN1cHBvcnQgdHJ5LXdpdGgtcmVzb3VyY2VzCiAgICAgICAgICBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gQ2hyaXN0aWFuIFNjaHVsdGUuCm8gSU8tNTA0OiBEZXByZWNhdGVkIG9mIGFsbCBJT1V0aWxzLmNsb3NlUXVpZXRseSgpIG1ldGhvZHMgYW5kIHVzZQogICAgICAgICAgdHJ5LXdpdGgtcmVzb3VyY2VzIGludGVybmFsbHkuIFRoYW5rcyB0byBDaHJpc3RpYW4gU2NodWx0ZS4KClJFTU9WRUQKPT09PT09PQoKbyBJTy01MTQ6IFJlbW92ZSBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSmF2YTdTdXBwb3J0LgoKQ09NUEFUSUJJTElUWSBXSVRIIE9MREVSIFZFUlNJT05TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNToKQmluYXJ5IGNvbXBhdGlibGU6IFllcy4KU291cmNlIGNvbXBhdGlibGU6IFllcy4KU2VtYW50aWMgY29tcGF0aWJsZTogWWVzLgoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuNiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluCiAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbgogIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgoKQ29tbW9ucyBJTyAyLjYgcmVxdWlyZXMgSkRLIDEuNyBvciBsYXRlci4KQ29tbW9ucyBJTyAyLjUgcmVxdWlyZXMgSkRLIDEuNiBvciBsYXRlci4KQ29tbW9ucyBJTyAyLjQgcmVxdWlyZXMgSkRLIDEuNiBvciBsYXRlci4KQ29tbW9ucyBJTyAyLjMgcmVxdWlyZXMgSkRLIDEuNiBvciBsYXRlci4KQ29tbW9ucyBJTyAyLjIgcmVxdWlyZXMgSkRLIDEuNSBvciBsYXRlci4KQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgSkRLIDEuMyBvciBsYXRlci4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDIuNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KTmV3IGZlYXR1cmVzIGFuZCBidWcgZml4ZXMuCgpDaGFuZ2VzIGluIHRoaXMgdmVyc2lvbiBpbmNsdWRlOgoKTmV3IGZlYXR1cmVzOgpvIElPLTQ4NzogIEFkZCBWYWxpZGF0aW5nT2JqZWN0SW5wdXRTdHJlYW0gZm9yIGNvbnRyb2xsZWQgZGVzZXJpYWxpemF0aW9uIApvIElPLTQ3MTogIFN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgZW5jb2RpbmdzIGluIFJldmVyc2VkTGluZXNGaWxlUmVhZGVyIFRoYW5rcyB0byBMZWFuZHJvIFJlaXMuIApvIElPLTQyNTogIFNldHRlciBtZXRob2QgZm9yIHRocmVzaG9sZCBvbiBUaHJlc2hvbGRpbmdPdXRwdXRTdHJlYW0gVGhhbmtzIHRvIENyYWlnIFN3YW5rLiAKbyBJTy00MDY6ICBJbnRyb2R1Y2UgbmV3IGNsYXNzIEFwcGVuZGFibGVPdXRwdXRTdHJlYW0gVGhhbmtzIHRvIE5pYWxsIFBlbWJlcnRvbi4gCm8gSU8tNDU5OiAgQWRkIFdpbmRvd3NMaW5lRW5kaW5nSW5wdXRTdHJlYW0gYW5kIFVuaXhMaW5lRW5kaW5nSW5wdXRTdHJlYW0uIFRoYW5rcyB0byBLcmlzdGlhbiBSb3NlbnZvbGQuIApvIElPLTQ1NzogIEFkZCBhIEJvdW5kZWRSZWFkZXIsIGEgd3JhcHBlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiBhY2Nlc3MKICAgICAgICB0byBhbiB1bmRlcmx5aW5nIHN0cmVhbSB3aGVuIHVzZWQgd2l0aCBtYXJrL3Jlc2V0IC0KICAgICAgICB0byBhdm9pZCBvdmVyZmxvd2luZyB0aGUgbWFyayBsaW1pdCBvZiB0aGUgdW5kZXJseWluZyBidWZmZXIuIFRoYW5rcyB0byBLcmlzdGlhbiBSb3NlbnZvbGQuIApvIElPLTQyNjogIEFkZCBBUEkgSU9VdGlscy5jbG9zZVF1aWV0bHkoQ2xvc2VhYmxlLi4uKSAKbyBJTy00MTA6ICBSZWFkZnVsbHkoKSBUaGF0IFJldHVybnMgQSBCeXRlIEFycmF5IFRoYW5rcyB0byBCZWx1Z2EgQmVoci4gCm8gSU8tMzk1OiAgT3ZlcmxvYWQgSU9VdGlscyBidWZmZXIgbWV0aG9kcyB0byBhY2NlcHQgYnVmZmVyIHNpemUgVGhhbmtzIHRvIEJlbHVnYSBCZWhyLiAKbyBJTy0zODI6ICBDaHVua2VkIElPIGZvciBsYXJnZSBhcnJheXMuCiAgICAgICAgIEFkZGVkIHdyaXRlQ2h1bmtlZChieXRlW10sIE91dHB1dFN0cmVhbSkgYW5kIHdyaXRlQ2h1bmtlZChjaGFyW10gV3JpdGVyKQogICAgICAgICBBZGRlZCBDaHVua2VkT3V0cHV0U3RyZWFtLCBDaHVua2VkV3JpdGVyIApvIElPLTIzMzogIEFkZCBNZXRob2RzIGZvciBCdWZmZXJpbmcgU3RyZWFtcy9Xcml0ZXJzIFRvIElPVXRpbHMKICAgICAgICAgQWRkZWQgb3ZlcmxvYWRlZCBidWZmZXIoKSBtZXRob2RzIC0gc2VlIGFsc28gSU8tMzMwIApvIElPLTMzMDogIElPVXRpbHMjdG9CdWZmZXJlZE91dHB1dFN0cmVhbS90b0J1ZmZlcmVkV3JpdGVyIHRvIGNvbmRpdGlvbmFsbHkgd3JhcCB0aGUgb3V0cHV0CiAgICAgICAgIEFkZGVkIG92ZXJsb2FkZWQgYnVmZmVyKCkgbWV0aG9kcyAtIHNlZSBhbHNvIElPLTIzMyAKbyBJTy0zODE6ICBBZGQgRmlsZVV0aWxzLmNvcHlJbnB1dFN0cmVhbVRvRmlsZSBBUEkgd2l0aCBvcHRpb24gdG8gbGVhdmUgdGhlIHNvdXJjZSBvcGVuLgogICAgICAgIFNlZSBjb3B5SW5wdXRTdHJlYW1Ub0ZpbGUoZmluYWwgSW5wdXRTdHJlYW0gc291cmNlLCBmaW5hbCBGaWxlIGRlc3RpbmF0aW9uLCBib29sZWFuIGNsb3NlU291cmNlKSAKbyBJTy0zNzk6ICBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSAtIGFkZCB0ZXN0cyBmb3IgYXZhaWxhYmxlKCkKICAgICAgICAgRml4IGNvZGUgc28gaXQgcmVhbGx5IGRvZXMgcmVmbGVjdCBhIG1pbmltdW0gYXZhaWxhYmxlLiAKbyBJTy0zNDY6ICBBZGQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvSW5wdXRTdHJlYW0oKSAKbyBJTy0zNDE6ICBBIGNvbnN0YW50IGZvciBob2xkaW5nIHRoZSBCT00gY2hhcmFjdGVyIChVK0ZFRkYpIApvIElPLTM2MTogIEFkZCBBUEkgRmlsZVV0aWxzLmZvcmNlTWtkaXJzUGFyZW50KCkuIApvIElPLTM2MDogIEFkZCBBUEkgQ2hhcnNldHMucmVxdWlyZWRDaGFyc2V0cygpLiAKbyBJTy0zNTk6ICBBZGQgSU9VdGlscy5za2lwIGFuZCBza2lwRnVsbHkoUmVhZGFibGVCeXRlQ2hhbm5lbCwgbG9uZykuIFRoYW5rcyB0byB5dWtvYmEuIApvIElPLTM1ODogIEFkZCBJT1V0aWxzLnJlYWQgYW5kIHJlYWRGdWxseShSZWFkYWJsZUJ5dGVDaGFubmVsLCBCeXRlQnVmZmVyIGJ1ZmZlcikuIFRoYW5rcyB0byB5dWtvYmEuIApvIElPLTM1MzogIEFkZCBBUEkgSU9VdGlscy5jb3B5KElucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0sIGludCkgVGhhbmtzIHRvIGdncmVnb3J5LiAKbyBJTy0zNDk6ICBBZGQgQVBJIHdpdGggYXJyYXkgb2Zmc2V0IGFuZCBsZW5ndGggYXJndW1lbnQgdG8gRmlsZVV0aWxzLndyaXRlQnl0ZUFycmF5VG9GaWxlLiBUaGFua3MgdG8gc2NvcC4gCm8gSU8tMzQ4OiAgTWlzc2luZyBpbmZvcm1hdGlvbiBpbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdGhyb3duIGJ5IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMjdmFsaWRhdGVMaXN0RmlsZXNQYXJhbWV0ZXJzLiBUaGFua3MgdG8gcGxjc3RwaWVycmUuIApvIElPLTM0NTogIFN1cHBseSBhIGhvb2sgbWV0aG9kIGFsbG93aW5nIFRhaWxlciBhY3RpdmVseSBkZXRlcm1pbmluZyBzdG9wIGNvbmRpdGlvbi4gVGhhbmtzIHRvIG1rcmVzc2UuIApvIElPLTQzNzogIE1ha2UgSU9VdGlscy5FT0YgcHVibGljIGFuZCByZXVzZSBpdCBpbiB2YXJpb3VzIGNsYXNzZXMuIAoKRml4ZWQgQnVnczoKbyBJTy00NDY6ICBhZGRzIGFuIGVuZE9mRmlsZVJlYWNoZWQgbWV0aG9kIHRvIHRoZSBUYWlsZXJMaXN0ZW5lciBUaGFua3MgdG8gSmVmZnJleSBCYXJydXMuIApvIElPLTQ4NDogIEZpbGVuYW1lVXRpbHMgc2hvdWxkIGhhbmRsZSBlbWJlZGRlZCBudWxsIGJ5dGVzIFRoYW5rcyB0byBQaGlsaXBwZSBBcnRlYXUuIApvIElPLTQ4MTogIENoYW5nZWQvQ29ycmVjdGVkIGFsZ29yaXRobSBmb3Igd2FpdEZvciAKbyBJTy00Mjg6ICBCT01JbnB1dFN0cmVhbS5za2lwIHJldHVybnMgd3JvbmcgY291bnQgaWYgc3RyZWFtIGNvbnRhaW5zIG5vIEJPTSBUaGFua3MgdG8gU3RlZmFuIEdtZWluZXIuIApvIElPLTQ4ODogIEZpbGVVdGlscy53YWl0Rm9yKC4uLikgc3dhbGxvd3MgdGhyZWFkIGludGVycnVwdGVkIHN0YXR1cyBUaGFua3MgdG8gQmr2cm4gQnVjaG5lci4gCm8gSU8tNDUyOiAgU3VwcG9ydCBmb3Igc3ltbGlua3Mgd2l0aCBtaXNzaW5nIHRhcmdldC4gQWRkZWQgc3VwcG9ydCBmb3IgSkRLNyBzeW1saW5rIGZlYXR1cmVzIHdoZW4gcHJlc2VudCBUaGFua3MgdG8gRGF2aWQgU3RhbmRpc2guIApvIElPLTQ1MzogIFJlZ3Jlc3Npb24gaW4gRmlsZVV0aWxzLnJlYWRGaWxlVG9TdHJpbmcgZnJvbSAyLjAuMSBUaGFua3MgdG8gU3RldmVuIENocmlzdG91LiAKbyBJTy00NTE6ICBhbnQgdGVzdCBmYWlscyAtIHJlc291cmNlcyBtaXNzaW5nIGZyb20gdGVzdCBjbGFzc3BhdGggVGhhbmtzIHRvIERhdmlkIFN0YW5kaXNoLiAKbyBJTy00MzU6ICBEb2N1bWVudCB0aGF0IEZpbGVVdGlscy5kZWxldGVEaXJlY3RvcnksIGRpcmVjdG9yeUNvbnRhaW5zIGFuZCBjbGVhbkRpcmVjdG9yeQogICAgICAgICBtYXkgdGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgdGhlIHBhc3NlZCBkaXJlY3RvcnkgZG9lcyBub3QKICAgICAgICAgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5LiBUaGFua3MgdG8gRG9taW5payBTdGFkbGVyLiAKbyBJTy00MjQ6ICBKYXZhZG9jIGZpeGVzLCBtb3N0bHkgdG8gYXBwZWFzZSAxLjguMCBUaGFua3MgdG8gVmlsbGUgU2t5dHTkLiAKbyBJTy0zODk6ICBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5IGNhbiB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhhbmtzIHRvIEF1c3RpbiBEb3VwbmlrLiAKbyBJTy0zOTA6ICBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5QXNCaWdJbnRlZ2VyIGNhbiBvdmVyZmxvdy4KICAgICAgICAgRW5zdXJlIHRoYXQgcmVjdXJzaXZlIGNhbGxzIGFsbCB1c2UgQmlnSW50ZWdlciAKbyBJTy0zODU6ICBGaWxlVXRpbHMuZG9Db3B5RmlsZSBjYW4gcG90ZW50aWFsbHkgbG9vcCBmb3IgZXZlcgogICAgICAgICBFeGl0IGxvb3AgaWYgbm8gZGF0YSB0byBjb3B5IApvIElPLTM4MzogIEZpbGVVdGlscy5kb0NvcHlGaWxlIGNhY2hlcyB0aGUgZmlsZSBzaXplOyBuZWVkcyB0byBiZSBkb2N1bWVudGVkCiAgICAgICAgIEFkZGVkIEphdmFkb2M7IHNob3cgZmlsZSBsZW5ndGhzIGluIGV4Y2VwdGlvbiBtZXNzYWdlIApvIElPLTM4MDogIEZpbGVVdGlscy5jb3B5SW5wdXRTdHJlYW1Ub0ZpbGUgc2hvdWxkIGRvY3VtZW50IGl0IGNsb3NlcyB0aGUgaW5wdXQgc291cmNlIFRoYW5rcyB0byBjbGF1ZGlvX2NoLiAKbyBJTy0yNzk6ICBUYWlsZXIgZXJyb25lb3VzbHkgY29uc2lkZXJzIGZpbGUgYXMgbmV3LgogICAgICAgIEZpeCB0byB1c2UgZmlsZS5sYXN0TW9kaWZpZWQoKSByYXRoZXIgdGhhbiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAKbyBJTy0zNTY6ICBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSNyZXNldCgpIGJlaGF2ZXMgaW5jb3JyZWN0bHkgaW4gY2FzZSB3aGVuIGJ1ZmZlciBzaXplIGlzIG5vdCBkaXZpZGFibGUgYnkgZGF0YSBzaXplLgogICAgICAgICBGaXggY29kZSBzbyBza2lwIHJlbGF0ZXMgdG8gdGhlIGVuY29kZWQgYnl0ZXM7IHJlc2V0IG5vdyByZS1lbmNvZGVzIHRoZSBkYXRhIHVwIHRvIHRoZSBwb2ludCBvZiB0aGUgbWFyayAKbyBJTy0zNjg6ICBDbGFzc0xvYWRlck9iamVjdElucHV0U3RyZWFtIGRvZXMgbm90IGhhbmRsZSBwcmltaXRpdmUgdHlwZWQgbWVtYmVycyAKbyBJTy0zMTQ6ICBEZXByZWNhdGUgYWxsIG1ldGhvZHMgdGhhdCB1c2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcgCm8gSU8tMzM4OiAgV2hlbiBhIGZpbGUgaXMgcm90YXRlZCwgZmluaXNoIHJlYWRpbmcgcHJldmlvdXMgZmlsZSBwcmlvciB0byBzdGFydGluZyBuZXcgb25lIApvIElPLTM1NDogIENvbW1vbnMgSU8gVGFpbGVyIGRvZXMgbm90IHJlc3BlY3QgVVRGLTggQ2hhcnNldC4gCm8gSU8tMzIzOiAgV2hhdCBzaG91bGQgaGFwcGVuIGluIEZpbGVVdGlscy5zaXplT2ZbRGlyZWN0b3J5XSB3aGVuIGFuIG92ZXJmbG93IHRha2VzIHBsYWNlPwogICAgICAgIEFkZGVkIEphdmFkb2MuIApvIElPLTM3MjogIEZpbGVVdGlscy5tb3ZlRGlyZWN0b3J5IGNhbiBwcm9kdWNlIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZSBvbiBmYWlsaXVyZSAKbyBJTy0zNjI6ICBJT1V0aWxzLmNvbnRlbnRFcXVhbHMqIG1ldGhvZHMgcmV0dXJucyBmYWxzZSBpZiBpbnB1dDEgPT0gaW5wdXQyLCBzaG91bGQgcmV0dXJuIHRydWUuIFRoYW5rcyB0byBtbWFkc29uLCBnZ3JlZ29yeS4gCm8gSU8tMzU3OiAgW1RhaWxlcl0gSW50ZXJydXB0ZWRFeGNlcHRpb24gd2hpbGUgdGhlIHRocmVhZCBpcyBzbGVlcGluZyBpcyBzaWxlbnRseSBpZ25vcmVkIFRoYW5rcyB0byBtb3J0ZW5oLiAKbyBJTy0zNTI6ICBTcGVsbGluZyBmaXhlcy4gVGhhbmtzIHRvIHNjb3AuIApvIElPLTQzNjogIEltcHJvcGVyIEphdmFkb2MgY29tbWVudCBmb3IgRmlsZW5hbWVVdGlscy5pbmRleE9mRXh0ZW5zaW9uLiBUaGFua3MgdG8gY2hyaXN0b3BoLnNjaG5lZWdhbnMuIAoKQ2hhbmdlczoKbyBJTy00MzM6ICBDb252ZXJ0ZWQgYWxsIHRlc3RjYXNlcyB0byBKVW5pdCA0IApvIElPLTQ2NjogIEFkZGVkIHRlc3RjYXNlIHRvIHNob3cgdGhpcyB3YXMgZml4ZWQgd2l0aCBJTy00MjMgCm8gSU8tNDc5OiAgQ29ycmVjdCBleGNlcHRpb24gbWVzc2FnZSBpbiBGaWxlVXRpbHMuZ2V0RmlsZShGaWxlLCBTdHJpbmcuLi4pIFRoYW5rcyB0byBaaG91Y2UgQ2hlbi4gCm8gSU8tNDY1OiAgVXBkYXRlIHRvIEpVbml0IDQuMTIgVGhhbmtzIHRvIGJhc2VkMi4gCm8gSU8tNDYyOiAgSU9FeGNlcHRpb25XaXRoQ2F1c2Ugbm8gbG9uZ2VyIG5lZWRlZCAKbyBJTy00MjI6ICBEZXByZWNhdGUgQ2hhcnNldHMgQ2hhcnNldCBjb25zdGFudHMgaW4gZmF2b3Igb2YgSmF2YSA3J3MgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzIApvIElPLTIzOTogIENvbnZlcnQgSU9DYXNlIHRvIGEgSmF2YSAxLjUrIEVudW1lcmF0aW9uCiAgICAgICAgIFtOLkIuIHRoaXMgaXMgYmluYXJ5IGNvbXBhdGlibGVdIApvIElPLTMyODogIGdldFByZWZpeExlbmd0aCByZXR1cm5zIG51bGwgaWYgZmlsZW5hbWUgaGFzIGxlYWRpbmcgc2xhc2hlcwogICAgICAgIEphdmFkb2M6IGFkZCBleGFtcGxlcyB0byBzaG93IGNvcnJlY3QgYmVoYXZpb3I7IGFkZCB1bml0IHRlc3RzIApvIElPLTI5OTogIEZpbGVVdGlscy5saXN0RmlsZXNBbmREaXJzIGluY2x1ZGVzIG9yaWdpbmFsIGRpciBpbiByZXN1bHRzIGV2ZW4gd2hlbiBpdCBkb2Vzbid0IG1hdGNoIGZpbHRlcgogICAgICAgIEphdmFkb2M6IGNsYXJpZnkgdGhhdCBvcmlnaW5hbCBkaXIgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMgCm8gSU8tMzc1OiAgRmlsZW5hbWVVdGlscy5zcGxpdE9uVG9rZW5zKFN0cmluZyB0ZXh0KSBjaGVjayBmb3IgJyoqJyBjb3VsZCBiZSBzaW1wbGlmaWVkIApvIElPLTM3NDogIFdpbGRjYXJkRmlsZUZpbHRlciBjdG9ycyBzaG91bGQgbm90IHVzZSBudWxsIHRvIG1lYW4gSU9DYXNlLlNFTlNJVElWRSB3aGVuIGRlbGVnYXRpbmcgdG8gb3RoZXIgY3RvcnMgCgpDb21wYXRpYmlsaXR5IHdpdGggMi40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21wYXRpYmlsaXR5IHdpdGggMi4yIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KCkNvbW1vbnMgSU8gMi41IHJlcXVpcmVzIEpESyAxLjYgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMi40IHJlcXVpcmVzIEpESyAxLjYgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMi4zIHJlcXVpcmVzIEpESyAxLjYgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEpESyAxLjUgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEpESyAxLjMgb3IgbGF0ZXIuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDaGFuZ2VzIGluIHRoaXMgdmVyc2lvbiBpbmNsdWRlOgoKTmV3IGZlYXR1cmVzOgpvIElPLTI2OTogIFRhaWxlciBsb2NrcyBmaWxlIGZyb20gZGVsZXRpb24vcmVuYW1lIG9uIFdpbmRvd3MuIFRoYW5rcyB0bwpzZWJiLgpvIElPLTMzMzogIEV4cG9ydCBPU0dpIHBhY2thZ2VzIGF0IHZlcnNpb24gMS54IGluIGFkZGl0aW9uIHRvIDIueC4gVGhhbmtzCnRvIGZtZXNjaGJlLgpvIElPLTMyMDogIEFkZCBYbWxTdHJlYW1SZWFkZXIgc3VwcG9ydCBmb3IgVVRGLTMyLiBUaGFua3MgdG8gZ2dyZWdvcnkuCm8gSU8tMzMxOiAgQk9NSW5wdXRTdHJlYW0gd3JvbmdseSBkZXRlY3RzIFVURi0zMkxFX0JPTSBmaWxlcyBhcwpVVEYtMTZMRV9CT00gZmlsZXMgaW4gbWV0aG9kIGdldEJPTSgpLiBUaGFua3MgdG8gZ2dyZWdvcnkuCm8gSU8tMzI3OiAgQWRkIGJ5dGVDb3VudFRvRGlzcGxheVNpemUoQmlnSW50ZWdlcikuIFRoYW5rcyB0byBnZ3JlZ29yeS4KbyBJTy0zMjY6ICBBZGQgbmV3IEZpbGVVdGlscy5zaXplT2ZbRGlyZWN0b3J5XSBBUElzIHRvIHJldHVybiBCaWdJbnRlZ2VyLgpUaGFua3MgdG8gZ2dyZWdvcnkuCm8gSU8tMzI1OiAgQWRkIElPVXRpbHMudG9CeXRlQXJyYXkgbWV0aG9kcyB0byB3b3JrIHdpdGggVVJMIGFuZCBVUkkuIFRoYW5rcwp0byByYXZpcHJhay4KbyBJTy0zMjQ6ICBBZGQgbWlzc2luZyBDaGFyc2V0IHNpc3RlciBBUElzIHRvIG1ldGhvZCB0aGF0IHRha2UgYSBTdHJpbmcKY2hhcnNldCBuYW1lLiBUaGFua3MgdG8gcmF2aXByYWsuCgpGaXhlZCBCdWdzOgpvIElPLTMzNjogIFlvdHRhYnl0ZSAoWUIpIGluY29ycmVjdGx5IGRlZmluZWQgaW4gRmlsZVV0aWxzLiBUaGFua3MgdG8KcmxlYXZlbGxlLgpvIElPLTI3OTogIFRhaWxlciBlcnJvbmVvdXNseSBjb25zaWRlcnMgZmlsZSBhcyBuZXcuIFRoYW5rcyB0byBTZXJnaW8KQm9zc2EsIENocmlzIEJhcm9uLgpvIElPLTMzNTogIFRhaWxlciNyZWFkTGluZXMgLSBpbmNvcnJlY3QgQ1IgaGFuZGxpbmcuCm8gSU8tMzM0OiAgRmlsZVV0aWxzLnRvVVJMcyB0aHJvd3MgTlBFIGZvciBudWxsIHBhcmFtZXRlcjsgZG9jdW1lbnQgdGhlCmJlaGF2aW9yLgpvIElPLTMzMjogIEltcHJvdmUgdGFpbGVyJ3MgcmVhZGluZyBwZXJmb3JtYW5jZS4gVGhhbmtzIHRvIGxpYW5nbHkuCm8gSU8tMjc5OiAgSW1wcm92ZSBUYWlsZXIgcGVyZm9ybWFuY2Ugd2l0aCBidWZmZXJlZCByZWFkcyAoc2VlIElPLTMzMikuCm8gSU8tMzI5OiAgRmlsZVV0aWxzLndyaXRlTGluZXMgdXNlcyB1bmJ1ZmZlcmVkIElPLiBUaGFua3MgdG8gdGl2di4KbyBJTy0zMTk6ICBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5IGZvbGxvd3Mgc3ltYm9saWMgbGlua3MuIFRoYW5rcyB0bwpyYXZpcHJhay4KCgpDb21wYXRpYmlsaXR5IHdpdGggMi4zOgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogWWVzLgpTZW1hbnRpYyBjb21wYXRpYmxlOiBZZXMuCgpDb21wYXRpYmlsaXR5IHdpdGggMi4yIGFuZCAxLjQ6CkJpbmFyeSBjb21wYXRpYmxlOiBZZXMuClNvdXJjZSBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguClNlbWFudGljIGNvbXBhdGlibGU6IE5vLCBzZWUgdGhlIHJhcmUgY2FzZSBpbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0lPLTMxOC4KCkNvbW1vbnMgSU8gMi40IHJlcXVpcmVzIEpESyAxLjYgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMi4zIHJlcXVpcmVzIEpESyAxLjYgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIEpESyAxLjUgb3IgbGF0ZXIuCkNvbW1vbnMgSU8gMS40IHJlcXVpcmVzIEpESyAxLjMgb3IgbGF0ZXIuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAyLjMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDaGFuZ2VzIGluIHRoaXMgdmVyc2lvbiBpbmNsdWRlOgoKTmV3IGZlYXR1cmVzOgpvIElPLTMyMjogIEFkZCBhbmQgdXNlIGNsYXNzIENoYXJzZXRzLiBUaGFua3MgdG8gZ2dyZWdvcnkuIApvIElPLTMyMTogIEJ5dGVPcmRlck1hcmsgVVRGXzMyTEUgaXMgaW5jb3JyZWN0LiBUaGFua3MgdG8gZ2dyZWdvcnkuIApvIElPLTMxODogIEFkZCBDaGFyc2V0IHNpc3RlciBBUElzIHRvIG1ldGhvZCB0aGF0IHRha2UgYSBTdHJpbmcgY2hhcnNldCBuYW1lLiBUaGFua3MgdG8gZ2dyZWdvcnkuIAoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMiBhbmQgMS40OgpCaW5hcnkgY29tcGF0aWJsZTogWWVzLgpTb3VyY2UgY29tcGF0aWJsZTogTm8sIHNlZSB0aGUgcmFyZSBjYXNlIGluIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvSU8tMzE4LgpTZW1hbnRpYyBjb21wYXRpYmxlOiBObywgc2VlIHRoZSByYXJlIGNhc2UgaW4gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTy0zMTguCgpDb21tb25zIElPIDIuMyByZXF1aXJlcyBKREsgMS42IG9yIGxhdGVyLgpDb21tb25zIElPIDIuMiByZXF1aXJlcyBKREsgMS41IG9yIGxhdGVyLgpDb21tb25zIElPIDEuNCByZXF1aXJlcyBKREsgMS4zIG9yIGxhdGVyLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi4yCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ2hhbmdlcyBpbiB0aGlzIHZlcnNpb24gaW5jbHVkZToKCk5ldyBmZWF0dXJlczoKbyBBZGQgSU9VVGlscy50b0J1ZmZlcmVkUmVhZGVyKFJlYWRlcikgIElzc3VlOiBJTy0zMTMuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gQWxsb3cgYXBwbGljYXRpb25zIHRvIHByb3ZpZGUgYnVmZmVyIChvciBzaXplKSBmb3IgY29weUxhcmdlIG1ldGhvZHMuICBJc3N1ZTogSU8tMzA4LiBUaGFua3MgdG8gTWFub2ogTW9rYXNoaS4gCm8gTmV3IGNvcHlMYXJnZSgpIG1ldGhvZCBpbiBJT1V0aWxzIHRoYXQgdGFrZXMgYWRkaXRpb25hbCBvZmZzZXQsIGxlbmd0aCBhcmd1bWVudHMgIElzc3VlOiBJTy0zMDUuIFRoYW5rcyB0byBNYW5vaiBNb2thc2hpLiAKbyBVc2UgdGVyYWJ5dGUgKFRCKSwgcGV0YWJ5dGUgKFBCKSBhbmQgZXhhYnl0ZSAoRUIpIGluIEZpbGVVdGlscy5ieXRlQ291bnRUb0Rpc3BsYXlTaXplKGxvbmcgc2l6ZSkgIElzc3VlOiBJTy0yODcuIFRoYW5rcyB0byBSb24gS3VyaXMsIEdhcnkgR3JlZ29yeS4gCm8gRmlsZVV0aWxzLmxpc3RGaWxlcygpIGRvZXNuJ3QgcmV0dXJuIGRpcmVjdG9yaWVzICBJc3N1ZTogSU8tMTczLiBUaGFua3MgdG8gTWFyY29zIFZpbu1jaXVzIGRhIFNpbHZhLiAKbyBDaGFyU2VxdWVuY2VJbnB1dFN0cmVhbSB0byBlZmZpY2llbnRseSBzdHJlYW0gY29udGVudCBvZiBhIENoYXJTZXF1ZW5jZSAgSXNzdWU6IElPLTI5Ny4gVGhhbmtzIHRvIE9sZWcgS2FsbmljaGV2c2tpLiAKbyBUaGUgc2Vjb25kIGNvbnN0cnVjdG9yIG9mIFRhaWxlciBjbGFzcyBkb2VzIG5vdCBwYXNzICdkZWxheScgdG8gdGhlIHRoaXJkIG9uZSAgSXNzdWU6IElPLTMwNC4gVGhhbmtzIHRvIGxpYW5nbHkuIApvIFRlZU91dHB1dFN0cmVhbSBkb2VzIG5vdCBjYWxsIGJyYW5jaC5jbG9zZSgpIHdoZW4gbWFpbi5jbG9zZSgpIHRocm93cyBhbiBleGNlcHRpb24gIElzc3VlOiBJTy0zMDMuIFRoYW5rcyB0byBmYWJpYW4uYmFybmV5LiAKbyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gQk9NSW5wdXRTdHJlYW0gd2hlbiByZWFkaW5nIGEgZmlsZSB3aXRob3V0IEJPTSBtdWx0aXBsZSB0aW1lcyAgSXNzdWU6IElPLTMwMi4gVGhhbmtzIHRvIGpzdGV1ZXJ3YWxkLCBkZXRpbmhvLiAKbyBBZGQgSU9VdGlscy5jbG9zZVF1aWV0bHkoU2VsZWN0b3IpIG5lY2Vzc2FyeSAgSXNzdWU6IElPLTMwMS4gVGhhbmtzIHRvIGtheWtheS51bmlxdWUuIApvIElPVXRpbHMuY2xvc2VRdWlldGx5KCkgc2hvdWxkIHRha2UgYSBTZXJ2ZXJTb2NrZXQgYXMgYSBwYXJhbWV0ZXIgIElzc3VlOiBJTy0yOTIuIFRoYW5rcyB0byBzZWJiLiAKbyBBZGQgcmVhZC9yZWFkRnVsbHkgbWV0aG9kcyB0byBJT1V0aWxzICBJc3N1ZTogSU8tMjkwLiBUaGFua3MgdG8gc2ViYi4gCm8gU3VwcGx5IGEgUmV2ZXJzZWRMaW5lc0ZpbGVSZWFkZXIgIElzc3VlOiBJTy0yODguIFRoYW5rcyB0byBHZW9yZyBIZW56bGVyLiAKbyBBZGQgbmV3IGZ1bmN0aW9uIEZpbGVVdGlscy5kaXJlY3RvcnlDb250YWlucy4gIElzc3VlOiBJTy0yOTEuIFRoYW5rcyB0byBnZ3JlZ29yeS4gCm8gRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHMgYW5kIElPVXRpbHMuY29udGVudEVxdWFscyAtIEFkZCBvcHRpb24gdG8gaWdub3JlICJsaW5lIGVuZGluZ3MiCiAgICAgICAgQWRkZWQgY29udGVudEVxdWFsc0lnbm9yZUVPTCBtZXRob2RzIHRvIGJvdGggY2xhc3NlcyAgSXNzdWU6IElPLTI3NS4gVGhhbmtzIHRvIENKIEFzcHJvbWdvcy4gCgpGaXhlZCBCdWdzOgpvIElPVXRpbHMucmVhZChJbnB1dFN0cmVhbS9SZWFkZXIpIGlnbm9yZXMgdGhlIG9mZnNldCBwYXJhbWV0ZXIgIElzc3VlOiBJTy0zMTEuIFRoYW5rcyB0byBSb2JlcnQgTXVpci4gCm8gQ2hhclNlcXVlbmNlSW5wdXRTdHJlYW0oQ2hhclNlcXVlbmNlIHMsIENoYXJzZXQgY2hhcnNldCwgaW50IGJ1ZmZlclNpemUpIGlnbm9yZXMgYnVmZmVyU2l6ZSAgSXNzdWU6IElPLTMxMi4gCm8gRmlsZVV0aWxzLm1vdmVEaXJlY3RvcnlUb0RpcmVjdG9yeSByZW1vdmVzIHNvdXJjZSBkaXJlY3RvcnkgaWYgZGVzdGluYXRpb24gaXMgYSBzdWJkaXJlY3RvcnkgIElzc3VlOiBJTy0zMDAuIApvIFJlYWRlcklucHV0U3RyZWFtI3JlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHNob3VsZCBjaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVycyAgSXNzdWU6IElPLTMwNy4gCm8gUmVhZGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgc2hvdWxkIGFsd2F5cyByZXR1cm4gMCBmb3IgbGVuZ3RoID09IDAgIElzc3VlOiBJTy0zMDYuIApvICJGaWxlVXRpbHMjZGVsZXRlRGlyZWN0b3J5T25FeGl0KEZpbGUpIiBkb2VzIG5vdCB3b3JrICBJc3N1ZTogSU8tMjc2LiBUaGFua3MgdG8gbmthbWkuIApvIEJvdW5kZWRJbnB1dFN0cmVhbS5yZWFkKCkgdHJlYXRzIG1heCBkaWZmZXJlbnRseSBmcm9tIEJvdW5kZWRJbnB1dFN0cmVhbS5yZWFkKGJ5dGVbXS4uLikgIElzc3VlOiBJTy0yNzMuIFRoYW5rcyB0byBzZWJiLiAKbyBWYXJpb3VzIG1ldGhvZHMgb2YgY2xhc3MgJ29yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHMnIGluY29ycmVjdGx5IHN1cHByZXNzICdqYXZhLmlvLklPRXhjZXB0aW9uJyAgSXNzdWU6IElPLTI5OC4gVGhhbmtzIHRvIENocmlzdGlhbiBTY2h1bHRlLiAKCkNoYW5nZXM6Cm8gUmVhZGVySW5wdXRTdHJlYW0gb3B0aW1pemF0aW9uOiBtb3JlIGVmZmljaWVudCByZWFkaW5nIG9mIHNtYWxsIGNodW5rcyBvZiBkYXRhICBJc3N1ZTogSU8tMjk2LiBUaGFua3MgdG8gT2xlZyBLYWxuaWNoZXZza2kuIAoKCkNvbXBhdGliaWxpdHkgd2l0aCAyLjEgYW5kIDEuNDoKQmluYXJ5IGNvbXBhdGlibGU6IFllcwpTb3VyY2UgY29tcGF0aWJsZTogWWVzClNlbWFudGljIGNvbXBhdGlibGU6IFllcy4gQ2hlY2sgdGhlIGJ1ZyBmaXhlcyBzZWN0aW9uIGZvciBzZW1hbnRpYyBidWcgZml4ZXMKCkNvbW1vbnMgSU8gMi4yIHJlcXVpcmVzIGEgbWluaW11bSBvZiBKREsgMS41LiAKQ29tbW9ucyBJTyAxLjQgcmVxdWlyZXMgYSBtaW5pbXVtIG9mIEpESyAxLjMuIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMi4xCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTmV3IGZlYXR1cmVzOgpvIFVzZSBzdGFuZGFyZCBNYXZlbiBkaXJlY3RvcnkgbGF5b3V0ICBJc3N1ZTogSU8tMjg1LiBUaGFua3MgdG8gZ2dyZWdvcnkuIApvIEFkZCBJT1V0aWxzIEFQSSB0b1N0cmluZyBmb3IgVVJMIGFuZCBVUkkgdG8gZ2V0IGNvbnRlbnRzICBJc3N1ZTogSU8tMjg0LiBUaGFua3MgdG8gZ2dyZWdvcnkuIApvIEFkZCBBUEkgRmlsZVV0aWxzLmNvcHlGaWxlKEZpbGUgaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQpICBJc3N1ZTogSU8tMjgyLiBUaGFua3MgdG8gZ2dyZWdvcnkuIApvIEZpbGVBbHRlcmF0aW9uT2JzZXJ2ZXIgaGFzIG5vIGdldHRlciBmb3IgRmlsZUZpbHRlciAgSXNzdWU6IElPLTI2Mi4gCm8gQWRkIEZpbGVVdGlscy5nZXRGaWxlIEFQSSB3aXRoIHZhcmFyZ3MgcGFyYW1ldGVyICBJc3N1ZTogSU8tMjYxLiAKbyBBZGQgbmV3IEFQUEVORCBwYXJhbWV0ZXIgZm9yIHdyaXRpbmcgc3RyaW5nIGludG8gZmlsZXMgIElzc3VlOiBJTy0xODIuIApvIEFkZCBuZXcgcmVhZCBtZXRob2QgInRvQnl0ZUFycmF5IiB0byBoYW5kbGUgSW5wdXRTdHJlYW0gd2l0aCBrbm93biBzaXplLiAgSXNzdWU6IElPLTI1MS4gVGhhbmtzIHRvIE1hcmNvIEFsYmluaS4gCgpGaXhlZCBCdWdzOgpvIER1YmlvdXMgdXNlIG9mIG1rZGlycygpIHJldHVybiBjb2RlICBJc3N1ZTogSU8tMjgwLiBUaGFua3MgdG8gc2ViYi4gCm8gUmVhZGVySW5wdXRTdHJlYW0gZW50ZXJzIGluZmluaXRlIGxvb3Agd2hlbiBpdCBlbmNvdW50ZXJzIGFuIHVubWFwcGFibGUgY2hhcmFjdGVyICBJc3N1ZTogSU8tMjc3LiAKbyBGaWxlVXRpbHMubW92ZUZpbGUoKSBKYXZhZG9jIHNob3VsZCBzcGVjaWZ5IEZpbGVFeGlzdHNFeGNlcHRpb24gdGhyb3duICBJc3N1ZTogSU8tMjY0LiAKbyBDbGFzc0xvYWRlck9iamVjdElucHV0U3RyZWFtIGRvZXMgbm90IGhhbmRsZSBQcm94eSBjbGFzc2VzICBJc3N1ZTogSU8tMjYwLiAKbyBUYWlsZXIgcmV0dXJuaW5nIHBhcnRpYWwgbGluZXMgd2hlbiByZWFjaGluZyBFT0YgYmVmb3JlIEVPTCAgSXNzdWU6IElPLTI3NC4gVGhhbmtzIHRvIEZyYW5rIEdyaW1lcy4gCm8gRmlsZVV0aWxzLmNvcHlGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gY29weWluZyBsYXJnZSBmaWxlcyB0byBhIHNoYXJlZCBkaXJlY3RvcnkgKG9uIFdpbmRvd3MpICBJc3N1ZTogSU8tMjY2LiBUaGFua3MgdG8gSWdvciBTbWVyZWthLiAKbyBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlS2IgdGhyb3dzIGV4Y2VwdGlvbiBmb3IgV2luZG93cyB2b2x1bWVzIHdpdGggbm8gdmlzaWJsZSBmaWxlcy4KICAgICAgICBJbXByb3ZlIGNvdmVyYWdlIGJ5IGFsc28gbG9va2luZyBmb3IgaGlkZGVuIGZpbGVzLiAgSXNzdWU6IElPLTI2My4gVGhhbmtzIHRvIEdpbCBBZGFtLiAKCkNoYW5nZXM6Cm8gRmlsZUFsdGVyYXRpb25Nb25pdG9yLnN0b3AoYm9vbGVhbiBhbGxvd0ludGVydmFsVG9GaW5pc2gpICBJc3N1ZTogSU8tMjU5LiAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpBcGFjaGUgQ29tbW9ucyBJTyBQYWNrYWdlIDIuMC4xCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDIuMCBhbmQgMS40Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKICBDaGVjayB0aGUgYnVnIGZpeGVzIHNlY3Rpb24gZm9yIHNlbWFudGljIGJ1ZyBmaXhlcwoKQ29tbW9ucyBJTyAyLjAuMSByZXF1aXJlcyBhIG1pbmltdW0gb2YgSkRLIDEuNQogKENvbW1vbnMgSU8gMS40IGhhZCBhIG1pbmltdW0gb2YgSkRLIDEuMykgCgpFbmhhbmNlbWVudHMgZnJvbSAyLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAqIFtJTy0yNTZdIC0gUHJvdmlkZSB0aHJlYWQgZmFjdG9yeSBmb3IgRmlsZUFsdGVybmF0aW9uTW9uaXRvcgoKQnVnIGZpeGVzIGZyb20gMi4wCi0tLS0tLS0tLS0tLS0tLS0tLQoKICAgKiBbSU8tMjU3XSAtIEJPTUlucHV0U3RyZWFtLnJlYWQoYnl0ZVtdKSBjYW4gcmV0dXJuIDAgd2hpY2ggaXQgc2hvdWxkIG5vdAogICAqIFtJTy0yNThdIC0gWG1sU3RyZWFtUmVhZGVyIGNvbnN1bWVzIHRoZSBzdHJlYW0gZHVyaW5nIGVuY29kaW5nIGRldGVjdGlvbgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkFwYWNoZSBDb21tb25zIElPIFBhY2thZ2UgMi4wCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuNAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpDb21tb25zIElPIDIuMCByZXF1aXJlcyBhIG1pbmltdW0gb2YgSkRLIDEuNQogKENvbW1vbnMgSU8gMS40IGhhZCBhIG1pbmltdW0gb2YgSkRLIDEuMykgCgpEZXByZWNhdGlvbnMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIElPVXRpbHMKICAtIHdyaXRlKFN0cmluZ0J1ZmZlciwgV3JpdGVyKSBpbiBmYXZvdXIgb2Ygd3JpdGUoQ2hhclNlcXVlbmNlLCBXcml0ZXIpCiAgLSB3cml0ZShTdHJpbmdCdWZmZXIsIE91dHB1dFN0cmVhbSkgIGluIGZhdm91ciBvZiB3cml0ZShDaGFyU2VxdWVuY2UsIE91dHB1dFN0cmVhbSkKICAtIHdyaXRlKFN0cmluZ0J1ZmZlciwgT3V0cHV0U3RyZWFtLCBTdHJpbmcpIGluIGZhdm91ciBvZiB3cml0ZShDaGFyU2VxdWVuY2UsIE91dHB1dFN0cmVhbSwgU3RyaW5nKQoKLSBGaWxlRmlsdGVyVXRpbHMKICAtIGFuZEZpbGVGaWx0ZXIoSU9GaWxlRmlsdGVyLCBJT0ZpbGVGaWx0ZXIpIGluIGZhdm91ciBvZiBhbmQoSU9GaWxlRmlsdGVyLi4uKSAKICAtIG9yRmlsZUZpbHRlcihJT0ZpbGVGaWx0ZXIsIElPRmlsZUZpbHRlcikgIGluIGZhdm91ciBvZiBvcihJT0ZpbGVGaWx0ZXIuLi4pCgpFbmhhbmNlbWVudHMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICogW0lPLTE0MF0gTW92ZSBtaW5pbXVtIEphdmEgcmVxdWlyZW1lbnQgZnJvbSBKREsgMS4zIHRvIEpESyAxLjUKICAgICAgICAgICAgIC0gdXNlIEdlbmVyaWNzCiAgICAgICAgICAgICAtIGFkZCBuZXcgQ2hhclNlcXVlbmNlIHdyaXRlKCkgZmxhdm91ciBtZXRob2RzIHRvIElPVXRpbHMgYW5kIEZpbGVVdGlscwogICAgICAgICAgICAgLSByZXBsYWNlIFN0cmluZ0J1ZmZlciB3aXRoIFN0cmluZ0J1aWxkZXIsIHdoZXJlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgICAtIGFkZCBuZXcgUmVhZGVyL1dyaXRlciBtZXRob2RzIHRvIFByb3h5UmVhZGVyIGFuZCBQcm94eVdyaXRlcgogICAgICAgICAgICAgLSBBbm5vdGF0ZSB3aXRoIEBPdmVycmlkZSBhbmQgQERlcHJlY2F0ZWQKCiAgKiBbSU8tMTc4XSBOZXcgQk9NSW5wdXRTdHJlYW0gYW5kIEJ5dGVPcmRlck1hcmsgaW1wbGVtZW50YXRpb25zIC0gdG8gZGV0ZWN0IGFuZCBvcHRpb25hbGx5IGV4Y2x1ZGUgYW4gaW5pdGlhbCBCeXRlIE9yZGVyIG1hcmsgKEJPTSkKICAqIFtJTy0xOTddIE5ldyBCb3VuZGVkSW5wdXRTdHJlYW0gKGNvcGllZCBmcm9tIGZyb20gQXBhY2hlIEphY2tSYWJiaXQpCiAgKiBbSU8tMTkzXSBOZXcgQnJva2VuIElucHV0IGFuZCBPdXRwdXQgc3RyZWFtcwogICogW0lPLTEzMl0gTmV3IEZpbGUgTGlzdGVuZXIvTW9uaXRvciBmYWNpbGl0eQogICogW0lPLTE1OF0gTmV3IFJlYWRlcklucHV0U3RyZWFtIGFuZCBXcml0ZXJPdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zCiAgKiBbSU8tMTM5XSBOZXcgU3RyaW5nQnVpbGRlciBXcml0ZXIgaW1wbGVtZW50YXRpb24KICAqIFtJTy0xOTJdIE5ldyBUYWdnZWQgSW5wdXQgYW5kIE91dHB1dCBzdHJlYW1zCiAgKiBbSU8tMTc3XSBOZXcgVGFpbGVyIGNsYXNzIC0gc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBVbml4ICJ0YWlsIC1mIiBmdW5jdGlvbmFsaXR5CiAgKiBbSU8tMTYyXSBOZXcgWE1MIFN0cmVhbSBSZWFkZXIvV3JpdGVyIGltcGxlbWVudGF0aW9ucyAoZnJvbSBST01FIHZpYSBwbGV4dXMtdXRpbHMpCgogICogW0lPLTE0Ml0gQ29tcGFyYXRvcnMgLSBhZGQgZmFjaWxpdHkgdG8gc29ydCBmaWxlIGxpc3RzL2FycmF5cwogICogW0lPLTE4Nl0gQ29tcGFyYXRvcnMgLSBuZXcgQ29tcG9zaXRlIGFuZCBEaXJlY3RvcnkgRmlsZSBDb21wYXJhdG9yIGltcGxlbWVudGF0aW9ucwogICogW0lPLTE3Nl0gRGlyZWN0b3J5V2Fsa2VyIC0gYWRkIGZpbHRlckRpcmVjdG9yeUNvbnRlbnRzKCkgY2FsbGJhY2sgbWV0aG9kIGZvciBmaWx0ZXJpbmcgZGlyZWN0b3J5IGNvbnRlbnRzCiAgKiBbSU8tMjEwXSBGaWxlRmlsdGVyIC0gbmV3IE1hZ2ljIE51bWJlciBGaWxlRmlsdGVyCiAgKiBbSU8tMjIxXSBGaWxlRmlsdGVyVXRpbHMgLSBhZGQgbWV0aG9kcyBmb3Igc3VmZml4IGFuZCBwcmVmaXggZmlsdGVycyB3aGljaCB0YWtlIGFuIElPQ2FzZSBvYmplY3QKICAqIFtJTy0yMzJdIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCBtZXRob2QgZm9yIG5hbWUgZmlsdGVycyB3aGljaCB0YWtlIGFuIElPQ2FzZSBvYmplY3QKICAqIFtJTy0yMjldIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCB2YXJhcmdzIGFuZCgpIGFuZCBvcigpIG1ldGhvZHMKICAqIFtJTy0xOThdIEZpbGVGaWx0ZXJVdGlscyAtIGFkZCBhYmlsaXR5IHRvIGFwcGx5IGZpbGUgZmlsdGVycyB0byBjb2xsZWN0aW9ucyBhbmQgYXJyYXlzCiAgKiBbSU8tMTU2XSBGaWxlbmFtZVV0aWxzIC0gYWRkIG5vcm1hbGl6ZSgpIGFuZCBub3JtYWxpemVOb0VuZFNlcGFyYXRvcigpIG1ldGhvZHMgd2hpY2ggYWxsb3cgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgdG8gYmUgc3BlY2lmaWVkCiAgKiBbSU8tMTk0XSBGaWxlU3lzdGVtVXRpbHMgLSBhZGQgZnJlZVNwYWNlS2IoKSBtZXRob2Qgd2l0aCBubyBpbnB1dCBhcmd1bWVudHMKICAqIFtJTy0xODVdIEZpbGVTeXN0ZW1VdGlscyAtIGFkZCBmcmVlU3BhY2VLYigpIG1ldGhvZHMgdGhhdCB0YWtlIGEgdGltZW91dCBwYXJhbWV0ZXIgLSBmaXhlcyBmcmVlU3BhY2VXaW5kb3dzKCkgYmxvY2tzCiAgKiBbSU8tMTU1XSBGaWxlVXRpbHMgLSB1c2UgTklPIHRvIGNvcHkgZmlsZXMKICAqIFtJTy0xNjhdIEZpbGVVdGlscyAtIGFkZCBuZXcgaXNTeW1saW5rKCkgbWV0aG9kCiAgKiBbSU8tMjE5XSBGaWxlVXRpbHMgLSB0aHJvdyBGaWxlRXhpc3RzRXhjZXB0aW9uIHdoZW4gbW92aW5nIGEgZmlsZSBvciBkaXJlY3RvcnkgaWYgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzCiAgKiBbSU8tMjM0XSBGaWxlVXRpbHMgLSBhZGQgTWV0aG9kcyBmb3IgcmV0cmlldmluZyBTeXN0ZW0gVXNlci9UZW1wIGRpcmVjdG9yaWVzL3BhdGhzCiAgKiBbSU8tMjA4XSBGaWxlVXRpbHMgLSBhZGQgdGltZW91dCAoY29ubmVjdGlvbiBhbmQgcmVhZCkgc3VwcG9ydCBmb3IgY29weVVSTFRvRmlsZSgpIG1ldGhvZCAKICAqIFtJTy0yMzhdIEZpbGVVdGlscyAtIGFkZCBzaXplT2YoRmlsZSkgbWV0aG9kCiAgKiBbSU8tMTgxXSBMaW5lSXRlcmF0b3Igbm93IGltcGxlbWVudHMgSXRlcmFibGUKICAqIFtJTy0yMjRdIElPVXRpbHMgLSBhZGQgY2xvc2VRdWlldGx5KENsb3NlYWJsZSkgYW5kIGNsb3NlUXVpZXRseShTb2NrZXQpIG1ldGhvZHMKICAqIFtJTy0yMDNdIElPVXRpbHMgLSBhZGQgc2tpcEZ1bGx5KCkgbWV0aG9kIGZvciBJbnB1dFN0cmVhbXMKICAqIFtJTy0xMzddIElPVXRpbHMgYW5kIEJ5dGVBcnJheU91dHB1dFN0cmVhbSAtIGFkZCB0b0J1ZmZlcmVkSW5wdXRTdHJlYW0oKSBtZXRob2QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYXJyYXkgYWxsb2NhdGlvbi9jb3B5CiAgKiBbSU8tMTk1XSBQcm94eSBzdHJlYW1zL1JlYWRlci9Xcml0ZXIgLSBwcm92aWRlIGV4Y2VwdGlvbiBoYW5kbGluZyBtZXRob2RzCiAgKiBbSU8tMjExXSBQcm94eSBJbnB1dC9PdXRwdXQgc3RyZWFtcyAtIGFkZCBwcmUvcG9zdCBwcm9jZXNzaW5nIHN1cHBvcnQKICAqIFtJTy0yNDJdIFByb3h5IFJlYWRlci9Xcml0ZXIgLSBhZGQgcHJlL3Bvc3QgcHJvY2Vzc2luZyBzdXBwb3J0CgpCdWcgZml4ZXMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBbSU8tMjE0XSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gLSBmaXggaW5jb25zaXN0ZW50IHN5bmNocm9uaXphdGlvbiBvZiBmaWVsZHMKICAqIFtJTy0yMDFdIENvdW50aW5nIElucHV0L091dHB1dCBzdHJlYW1zIC0gZml4IGluY29uc2lzdGVudCBzeW5jaHJvbml6YXRpb24KICAqIFtJTy0xNTldIEZpbGVDbGVhbmluZ1RyYWNrZXIgLSBmaXggcmVtb3ZlKCkgbmV2ZXIgcmV0dXJucyBudWxsCiAgKiBbSU8tMjIwXSBGaWxlQ2xlYW5pbmdUcmFja2VyIC0gZml4IFZlY3RvciBwZXJmb3JtcyBiYWRseSB1bmRlciBsb2FkCiAgKiBbSU8tMTY3XSBGaWxlbmFtZVV0aWxzIC0gZml4IGNhc2UtaW5zZW5zaXRpdmUgc3RyaW5nIGhhbmRsaW5nIGluIEZpbGVuYW1lVXRpbHMgYW5kIEZpbGVzeXN0ZW1VdGlscwogICogW0lPLTE3OV0gRmlsZW5hbWVVdGlscyAtIGZpeCBTdHJpbmdJbmRleE91dE9mQm91bmRzIGV4Y2VwdGlvbiBpbiBnZXRQYXRoTm9FbmRTZXBhcmF0b3IoKQogICogW0lPLTI0OF0gRmlsZW5hbWVVdGlscyAtIGZpeCBnZXRGdWxsUGF0aE5vRW5kU2VwYXJhdG9yKCkgcmV0dXJucyBlbXB0eSB3aGlsZSBwYXRoIGlzIGEgb25lIGxldmVsIGRpcmVjdG9yeQogICogW0lPLTI0Nl0gRmlsZW5hbWVVdGlscyAtIGZpeCB3aWxkY2FyZE1hdGNoIGdpdmVzIGluY29ycmVjdCByZXN1bHRzIAogICogW0lPLTE4N10gRmlsZVN5c3RlbVV0aWxzIC0gZml4IGZyZWVTcGFjZUtiKCkgZG9lc24ndCB3b3JrIHdpdGggcmVsYXRpdmUgcGF0aHMgb24gTGludXgKICAqIFtJTy0xNjBdIEZpbGVTeXN0ZW1VdGlscyAtIGZpeCBmcmVlU3BhY2UoKSBmYWlscyBvbiBzb2xhcmlzCiAgKiBbSU8tMjA5XSBGaWxlU3lzdGVtVXRpbHMgLSBmaXggZnJlZVNwYWNlS2IoKSBmYWlscyB0byByZXR1cm4gY29ycmVjdCBzaXplIGZvciBhIHdpbmRvd3MgbW91bnQgcG9pbnQKICAqIFtJTy0xNjNdIEZpbGVVdGlscyAtIGZpeCB0b1VSTHMoKSB1c2luZyBkZXByZWNhdGVkIG1ldGhvZCBvZiBjb252ZXJzaW9uIHRvIFVSTAogICogW0lPLTE2OF0gRmlsZVV0aWxzIC0gZml4IFN5bWJvbGljIGxpbmtzIGZvbGxvd2VkIHdoZW4gZGVsZXRpbmcgZGlyZWN0b3J5CiAgKiBbSU8tMjMxXSBGaWxlVXRpbHMgLSBmaXggd3JvbmcgZXhjZXB0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGluIGlzRmlsZU5ld2VyKCkgbWV0aG9kCiAgKiBbSU8tMjA3XSBGaWxlVXRpbHMgLSBmaXggcmFjZSBjb25kaXRpb24gaW4gZm9yY2VNa2RpcigpIG1ldGhvZAogICogW0lPLTIxN10gRmlsZVV0aWxzIC0gZml4IGNvcHlEaXJlY3RvcnlUb0RpcmVjdG9yeSgpIG1ha2VzIGluZmluaXRlIGxvb3BzCiAgKiBbSU8tMTY2XSBGaWxlVXRpbHMgLSBmaXggVVJMIGRlY29kaW5nIGluIHRvRmlsZShVUkwpCiAgKiBbSU8tMTkwXSBGaWxlVXRpbHMgLSBmaXggY29weURpcmVjdG9yeSBub3QgcHJlc2VydmluZyBsYXN0bW9kaWZpZWQgZGF0ZSBvbiBzdWItZGlyZWN0b3JpZXMKICAqIFtJTy0yNDBdIEZpbGVGaWx0ZXJVdGlscyAtIGVuc3VyZSBjdnNGaWx0ZXIgYW5kIHN2bkZpbHRlciBhcmUgb25seSBjcmVhdGVkIG9uY2UuCiAgKiBbSU8tMTc1XSBJT1V0aWxzIC0gZml4IGNvcHlGaWxlKCkgaXNzdWVzIHdpdGggdmVyeSBsYXJnZSBmaWxlcwogICogW0lPLTE5MV0gSW1wcm92ZW1lbnRzIGZyb20gc3RhdGljIGFuYWx5c2lzCiAgKiBbSU8tMjE2XSBMb2NrYWJsZUZpbGVXcml0ZXIgLSBkZWxldGUgZmlsZXMgcXVpZXRseSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIGluaXRpYWxpemF0aW9uCiAgKiBbSU8tMjQzXSBTd2FwcGVkRGF0YUlucHV0U3RyZWFtIC0gZml4IHJlYWRCb29sZWFuIGlzIGludmVydGVkCiAgKiBbSU8tMjM1XSBUZXN0cyAtIHJlbW92ZSB1bnVzZWQgWWVsbE9uRmx1c2hBbmRDbG9zZU91dHB1dFN0cmVhbSBmcm9tIENvcHlVdGlsc1Rlc3QKICAqIFtJTy0xNjFdIFRlc3RzIC0gZml4IEZpbGVDbGVhbmluZ1RyYWNrZXJUZXN0Q2FzZSBoYW5naW5nCgpEb2N1bWVudGF0aW9uIGNoYW5nZXMgZnJvbSAxLjQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBbSU8tMTgzIEZpbGVuYW1lVXRpbHMuZ2V0RXh0ZW5zaW9uKCkgbWV0aG9kIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCiAgKiBbSU8tMjI2IEZpbGVVdGlscy5ieXRlQ291bnRUb0Rpc3BsYXlTaXplKCkgZG9jdW1lbnRhdGlvbiBjb3JyZWN0aW9ucwogICogW0lPLTIwNSBGaWxlVXRpbHMuZm9yY2VNa2RpcigpIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCiAgKiBbSU8tMjE1IEZpbGVVdGlscyBjb3B5IGZpbGUvZGlyZWN0b3J5IGltcHJvdmUgZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgcHJlc2VydmluZyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlCiAgKiBbSU8tMTg5IEhleER1bXAuZHVtcCgpIG1ldGhvZCBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwogICogW0lPLTE3MSBJT0Nhc2UgZG9jdW1lbnQgdGhhdCBpdCBhc3N1bWVzIHRoZXJlIGFyZSBvbmx5IHR3byBPU2VzOiBXaW5kb3dzIGFuZCBVbml4CiAgKiBbSU8tMjIzIElPVXRpbHMuY29weSgpIGRvY3VtZW50YXRpb24gY29ycmVjdGlvbnMKICAqIFtJTy0yNDcgSU9VdGlscy5jbG9zZVF1aWV0bHkoKSBpbXByb3ZlIGRvY3VtZW50YXRpb24gd2l0aCBleGFtcGxlcwogICogW0lPLTIwMiBOb3RGaWxlRmlsdGVyIGRvY3VtZW50YXRpb24gY29ycmVjdGlvbnMKICAqIFtJTy0yMDYgUHJveHlJbnB1dFN0cmVhbSAtIGZpeCBtaXNsZWFkaW5nIHBhcmFtZXRlciBuYW1lcwogICogW0lPLTIxMiBQcm94eUlucHV0U3RyZWFtLnNraXAoKSBkb2N1bWVudGF0aW9uIGNvcnJlY3Rpb25zCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb21wYXRpYmlsaXR5IHdpdGggMS4zLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpDb21tb25zIElPIDEuNCBpbnRyb2R1Y2VzIGZvdXIgbmV3IGltcGxlbWVudGF0aW9ucyB3aGljaCBkZXBlbmQgb24gSkRLIDEuNCBmZWF0dXJlcwooQ2hhclNlcXVlbmNlUmVhZGVyLCBGaWxlV3JpdGVyV2l0aEVuY29kaW5nLCBJT0V4Y2VwdGlvbldpdGhDYXVzZSBhbmQgUmVnZXhGaWxlRmlsdGVyKS4KSXQgaGFzIGJlZW4gYnVpbHQgd2l0aCB0aGUgSkRLIHNvdXJjZSBhbmQgdGFyZ2V0IG9wdGlvbnMgc2V0IHRvIEpESyAxLjMgYW5kLCBleGNlcHQgZm9yCnRob3NlIGltcGxlbWVudGF0aW9ucywgY2FuIGJlIHVzZWQgd2l0aCBKREsgMS4zIChzZWUgSU8gSU8tMTI3KS4KCkRlcHJlY2F0aW9ucyBmcm9tIDEuMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZUNsZWFuZXIgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgRmlsZUNsZWFuaW5nVHJhY2tlciBbc2VlIElPLTExNl0KCkJ1ZyBmaXhlcyBmcm9tIDEuMy4yCi0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZVV0aWxzCiAgLSBmb3JjZURlbGV0ZSBvZiBvcnBoYW5lZCBTb2Z0bGlua3MgZG9lcyBub3Qgd29yayBbSU8tMTQ3XQogIC0gSW5maW5pdGUgbG9vcCBvbiBGaWxlVXRpbHMuY29weURpcmVjdG9yeSB3aGVuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXMgd2l0aGluCiAgICB0aGUgc291cmNlIGRpcmVjdG9yeSBbSU8tMTQxXQogIC0gQWRkIGEgY29weURpcmVjdG9yeSgpIG1ldGhvZCB0aGF0IG1ha2VzIHVzZSBvZiBGaWxlRmlsdGVyIFtJTy0xMDVdCiAgLSBBZGQgbW92ZURpcmVjdG9yeSgpIGFuZCBtb3ZlRmlsZSgpIG1ldGhvZHMgW0lPLTc3XQoKLSBIZXhEdW1wCiAgLSBIZXhEdW1wJ3MgdXNlIG9mIHN0YXRpYyBTdHJpbmdCdWZmZXJzIGlzbid0IHRocmVhZC1zYWZlIFtJTy0xMzZdCgpFbmhhbmNlbWVudHMgZnJvbSAxLjMuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZpbGVVdGlscwogIC0gQWRkIGEgZGVsZXRlUXVpZXRseSBtZXRob2QgW0lPLTEzNV0KCi0gRmlsZW5hbWVVdGlscwogIC0gQWRkIGZpbGUgbmFtZSBleHRlbnNpb24gc2VwYXJhdG9yIGNvbnN0YW50c1tJTy0xNDldCgotIElPRXhjZXB0aW9uV2l0aENhdXNlIFtJTy0xNDhdCiAgLSBBZGQgYSBuZXcgSU9FeGNlcHRpb24gaW1wbGVtZW50YXRpb24gd2l0aCBjb25zdHJ1Y3RvcnMgd2hpY2ggdGFrZSBhIGNhdXNlCgotIFRlZUlucHV0U3RyZWFtIFtJTy0xMjldCiAgLSBBZGQgbmV3IFRlZSBpbnB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24KCi0gRmlsZVdyaXRlcldpdGhFbmNvZGluZyBbSU8tMTUzXQogIC0gQWRkIG5ldyBGaWxlIFdyaXRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFjY2VwdHMgYW4gZW5jb2RpbmcKCi0gQ2hhclNlcXVlbmNlUmVhZGVyIFtJTy0xMzhdCiAgLSBBZGQgbmV3IFJlYWRlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXMgYW55IENoYXJTZXF1ZW5jZSAoU3RyaW5nLAogICAgU3RyaW5nQnVmZmVyLCBTdHJpbmdCdWlsZGVyIG9yIENoYXJCdWZmZXIpIAoKLSBUaGVzaG9sZGluZ091cHV0U3RyZWFtIFtJTy0xMjFdCiAgLSBBZGQgYSByZXNldCgpIG1ldGhvZCB3aGljaCBzZXRzIHRoZSBjb3VudCBvZiB0aGUgYnl0ZXMgd3JpdHRlbiBiYWNrIHRvIHplcm8uCgotIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbSBbSU8tMTMwXQogIC0gQWRkIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBmaWxlcwoKLSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0KICAtIEFkZCBhIG5ldyB3cml0ZShJbnB1dFN0cmVhbSkgbWV0aG9kIFtJTy0xNTJdCgotIE5ldyBDbG9zZWQgSW5wdXQvT3V0cHV0IHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgW0lPLTEyMl0KICAtIEF1dG9DbG9zZUlucHV0U3RyZWFtIC0gYXV0b21hdGljYWxseSBjbG9zZXMgYW5kIGRpc2NhcmRzIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbQogIC0gQ2xvc2VkSW5wdXRTdHJlYW0gLSByZXR1cm5zIC0xIGZvciBhbnkgcmVhZCBhdHRlbXB0cwogIC0gQ2xvc2VkT3V0cHV0U3RyZWFtIC0gdGhyb3dzIGFuIElPRXhjZXB0aW9uIGZvciBhbnkgd3JpdGUgYXR0ZW1wdHMKICAtIENsb3NlU2hpZWxkSW5wdXRTdHJlYW0gLSBwcmV2ZW50cyB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gZnJvbSBiZWluZyBjbG9zZWQuCiAgLSBDbG9zZVNoaWVsZE91dHB1dFN0cmVhbSAtIHByZXZlbnRzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZnJvbSBiZWluZyBjbG9zZWQuCgotIEFkZCBTaW5nbGV0b24gQ29uc3RhbnRzIHRvIHNldmVyYWwgc3RyZWFtIGNsYXNzZXMgW0lPLTE0M10KCi0gUHJlZml4RmlsZUZpbHRlciBbSU8tMTI2XQogIC0gQWRkIGZhY2lsdGl5IHRvIHNwZWNpZnkgY2FzZSBzZW5zaXRpdml0eSBvbiBwcmVmaXggbWF0Y2hpbmcKCi0gU3VmZml4RmlsZUZpbHRlciBbSU8tMTI2XQogIC0gQWRkIGZhY2lsdGl5IHRvIHNwZWNpZnkgY2FzZSBzZW5zaXRpdml0eSBvbiBzdWZmaXggbWF0Y2hpbmcKCi0gUmVnZXhGaWxlRmlsdGVyIFtJTy03NF0KICAtIEFkZCBuZXcgcmVndWxhciBleHByZXNzaW9uIGZpbGUgZmlsdGVyIGltcGxlbWVudGF0aW9uCgotIE1ha2UgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9ucyBTZXJpYWxpemFibGUgW0lPLTEzMV0KCi0gSW1wcm92ZSBJT0ZpbGVGaWx0ZXIgdG9TdHJpbmcoKSBtZXRob2RzIFtJTy0xMjBdCgotIE1ha2UgZmllbGRzIGZpbmFsIHNvIGNsYXNzZXMgYXJlIGltbXV0YWJsZS90aHJlYWRzYWZlIFtJTy0xMzNdCiAgLSBjaGFuZ2VzIHRvIEFnZSwgRGVsZWdhdGUsIE5hbWUsIE5vdCwgUHJlZml4LCBSZWdleCwgU2l6ZSwgU3VmZml4IGFuZCBXaWxkY2FyZCBJT0ZpbGVGaWx0ZXIKICAgIGltcGxlbWVudGF0aW9ucy4KCi0gSU9DYXNlCiAgLSBBZGQgYSBjb21wYXJlIG1ldGhvZCB0byBJT0Nhc2UgW0lPLTE0NF0KCi0gQWRkIGEgcGFja2FnZSBvZiBqYXZhLnV0aWwuQ29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbnMgZm9yIGZpbGVzIFtJTy0xNDVdCiAgLSBEZWZhdWx0RmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlIGZpbGVzIHVzaW5nIHRoZSBkZWZhdWx0IEZpbGUuY29tcGFyZVRvKEZpbGUpIG1ldGhvZC4KICAtIEV4dGVuc2lvbkZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgZmlsZSBuYW1lIGV4dGVuc2lvbnMuCiAgLSBMYXN0TW9kaWZpZWRGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUvdGltZS4KICAtIE5hbWVGaWxlQ29tcGFyYXRvciAtIGNvbXBhcmVzIGZpbGVzIHVzaW5nIGZpbGUgbmFtZXMuCiAgLSBQYXRoRmlsZUNvbXBhcmF0b3IgLSBjb21wYXJlcyBmaWxlcyB1c2luZyBmaWxlIHBhdGhzLgogIC0gU2l6ZUZpbGVDb21wYXJhdG9yIC0gY29tcGFyZXMgZmlsZXMgdXNpbmcgZmlsZSBzaXplcy4KICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4zLjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb21wYXRpYmlsaXR5IHdpdGggMS4zLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIFllcwoKU291cmNlIGNvbXBhdGlibGUgLSBZZXMKClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKCkNvbXBhdGliaWxpdHkgd2l0aCAxLjMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpCaW5hcnkgY29tcGF0aWJsZSAtIE5vCiAgU2VlIFtJTy0xMTNdCgpTb3VyY2UgY29tcGF0aWJsZSAtIE5vCiAgU2VlIFtJTy0xMTNdCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCgpFbmhhbmNlbWVudHMgc2luY2UgMS4zLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIENyZWF0ZWQgdGhlIEZpbGVDbGVhbmluZ1RyYWNrZXIsIGJhc2ljYWxseSBhIG5vbi1zdGF0aWMgdmVyc2lvbiBvZiB0aGUKICBGaWxlQ2xlYW5lciwgd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgYnkgdGhlIHVzZXIuIFtJTy0xMTZdCi0gVGhlIEZpbGVDbGVhbmVyIGlzIGRlcHJlY2F0ZWQuCgpCdWcgZml4ZXMgZnJvbSAxLjMuMQotLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBTb21lIHRlc3RzLCB3aGljaCBhcmUgaW1wbGljaXRseSBhc3N1bWluZyBhIFVuaXgtbGlrZSBmaWxlIHN5c3RlbSwgYXJlCiAgbm93IHNraXBwZWQgb24gV2luZG93cy4gW0lPLTExNV0KLSBFbmRpYW5VdGlscwogIC0gQm90aCByZWFkU3dhcHBlZFVuc2lnbmVkSW50ZWdlciguLi4pIG1ldGhvZHMgY291bGQgcmV0dXJuIG5lZ2F0aXZlIAogICAgbnVtYmVycyBkdWUgdG8gaW50L2xvbmcgY2FzdGluZy4gW0lPLTExN10KCkJ1ZyBmaXhlcyBmcm9tIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0KCi0gRmlsZVV0aWxzCiAgLSBOUEUgaW4gb3Blbk91dHB1dFN0cmVhbShGaWxlKSB3aGVuIGZpbGUgaGFzIG5vIHBhcmVudCBpbiBwYXRoIFtJTy0xMTJdCiAgLSByZWFkRmlsZVRvU3RyaW5nKEZpbGUpIGlzIG5vdCBzdGF0aWMgW0lPLTExM10KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpBcGFjaGUgQ29tbW9ucyBJTyBWZXJzaW9uIDEuMy4xCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gTm8KICBTZWUgW0lPLTExM10KClNvdXJjZSBjb21wYXRpYmxlIC0gTm8KICBTZWUgW0lPLTExM10KClNlbWFudGljIGNvbXBhdGlibGUgLSBZZXMKCkJ1ZyBmaXhlcyBmcm9tIDEuMwotLS0tLS0tLS0tLS0tLS0tLS0KCi0gRmlsZVV0aWxzCiAgLSBOUEUgaW4gb3Blbk91dHB1dFN0cmVhbShGaWxlKSB3aGVuIGZpbGUgaGFzIG5vIHBhcmVudCBpbiBwYXRoIFtJTy0xMTJdCiAgLSByZWFkRmlsZVRvU3RyaW5nKEZpbGUpIGlzIG5vdCBzdGF0aWMgW0lPLTExM10KICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4zCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ29tcGF0aWJpbGl0eSB3aXRoIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpbmFyeSBjb21wYXRpYmxlIC0gWWVzCgpTb3VyY2UgY29tcGF0aWJsZSAtIFllcwoKU2VtYW50aWMgY29tcGF0aWJsZSAtIFllcwogIENoZWNrIHRoZSBidWcgZml4ZXMgc2VjdGlvbiBmb3Igc2VtYW50aWMgYnVnIGZpeGVzCgpEZXByZWNhdGlvbnMgZnJvbSAxLjIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gV2lsZGNhcmRGaWx0ZXIgZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgV2lsZGNhcmRGaWxlRmlsdGVyCiAgLSBvbGQgY2xhc3Mgb25seSBhY2NlcHRlZCBmaWxlcywgdGh1cyBoYWQgYSBjb25mdXNpbmcgZHVhbCBwdXJwb3NlCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UgZGVwcmVjYXRlZCwgcmVwbGFjZWQgYnkgZnJlZVNwYWNlS2IKICAtIGZyZWVTcGFjZSByZXR1cm5zIGEgcmVzdWx0IHRoYXQgdmFyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gYW5kCiAgICB0aHVzIGlzbid0IHRoYXQgdXNlZnVsCiAgLSBmcmVlU3BhY2VLYiByZXR1cm5zIG11Y2ggYmV0dGVyIGFuZCBtb3JlIGNvbnNpc3RlbnQgcmVzdWx0cwogIC0gZnJlZVNwYWNlS2IgZXhpc3RlZCBpbiB2MS4yLCBzbyB0aGlzIGlzIGEgZ2VudGxlIGN1dG92ZXIKCkJ1ZyBmaXhlcyBmcm9tIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0KLSBMaW5lSXRlcmF0b3Igbm93IGltcGxlbWVudHMgSXRlcmF0b3IKICAtIEl0IHdhcyBhbHdheXMgc3VwcG9zZWQgdG8uLi4KCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZS9mcmVlU3BhY2VLYiBbSU8tODNdCiAgLSBUaGVzZSBzaG91bGQgbm93IHdvcmsgb24gQUlYIGFuZCBIUC1VWAoKLSBGaWxlU3lzdGVtVXRpbHMuZnJlZVNwYWNlL2ZyZWVTcGFjZUtiIFtJTy05MF0KICAtIEF2b2lkIGluZmluaXRlIGxvb3BpbmcgaW4gV2luZG93cwogIC0gQ2F0Y2ggbW9yZSBlcnJvcnMgd2l0aCBuaWNlIG1lc3NhZ2VzCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2UgW0lPLTkxXQogIC0gVGhpcyBpcyBub3cgZG9jdW1lbnRlZCBub3QgdG8gd29yayBvbiBTdW5PUyA1CgotIEZpbGVTeXN0ZW1VdGlscyBbSU8tOTNdCiAgLSBGaXhlZCByZXNvdXJjZSBsZWFrIGxlYWRpbmcgdG8gJ1RvbyBtYW55IG9wZW4gZmlsZXMnIGVycm9yCiAgLSBQcmV2aW91c2x5IGRpZCBub3QgZGVzdHJveSBQcm9jZXNzIGluc3RhbmNlcyAoYXMgSkRLIEphdmFkb2MgaXMgc28gcG9vcikKICAtIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ4MDEwMjcKCi0gRmlsZVV0aWxzLnRvdWNoIFtJTy0xMDBdCiAgLSBUaGUgdG91Y2ggbWV0aG9kIHByZXZpb3VzbHkgZ2F2ZSBubyBpbmRpY2F0aW9uIHdoZW4gdGhlIGZpbGUgY291bGQgbm90CiAgICBiZSB0b3VjaGVkIHN1Y2Nlc3NmdWxseSAoc3VjaCBhcyBkdWUgdG8gYWNjZXNzIHJlc3RyaWN0aW9ucykgLSBpdCBub3cKICAgIHRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIGNhbm5vdCBiZSBjaGFuZ2VkCgotIEZpbGVDbGVhbmVyCiAgLSBUaGlzIG5vdyBoYW5kbGVzIHRoZSBzaXR1YXRpb24gd2hlcmUgYW4gZXJyb3Igb2NjdXJzIHdoZW4gZGVsZXRpbmcgdGhlIGZpbGUKCi0gSU9VdGlscy5jb3B5IFtJTy04NF0KICAtIENvcHkgbWV0aG9kcyBjb3VsZCByZXR1cm4gaW5hY2N1cmF0ZSBieXRlL2NoYXIgY291bnQgZm9yIGxhcmdlIHN0cmVhbXMKICAtIFRoZSBjb3B5KElucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0pIG1ldGhvZCBub3cgcmV0dXJucyAtMSBpZiB0aGUgY291bnQgaXMgZ3JlYXRlciB0aGFuIGFuIGludAogIC0gVGhlIGNvcHkoUmVhZGVyLCBXcml0ZXIpIG1ldGhvZCBub3cgdGhyb3dzIG5vdyByZXR1cm5zIC0xIGlmIHRoZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gYW4gaW50CiAgLSBBZGRlZCBhIG5ldyBjb3B5TGFyZ2UoSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIGxvbmcKICAtIEFkZGVkIGEgbmV3IGNvcHlMYXJnZShSZWFkZXIsIFdyaXRlcikgbWV0aG9kIHRoYXQgcmV0dXJucyBhIGxvbmcKCi0gQ291bnRpbmdJbnB1dFN0cmVhbS9Db3VudGluZ091dHB1dFN0cmVhbSBbSU8tODRdCiAgLSBNZXRob2RzIHdlcmUgZGVjbGFyZWQgYXMgaW50IHRodXMgdGhlIGNvdW50IHdhcyBpbm5hY3VyYXRlIGZvciBsYXJnZSBzdHJlYW1zCiAgLSBuZXcgbG9uZyBiYXNlZCBtZXRob2RzIGdldEJ5dGVDb3VudCgpL3Jlc2V0Qnl0ZUNvdW50KCkgYWRkZWQKICAtIGV4aXN0aW5nIG1ldGhvZHMgY2hhbmdlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBhbiBpbnQKCi0gRmlsZUJhc2VkVGVzdENhc2UKICAtIEZpeGVkIGJ1ZyBpbiBjb21wYXJlIGNvbnRlbnQgbWV0aG9kcyBpZGVudGlmaWVkIGJ5IEdOVSBjbGFzc3BhdGgKCi0gRW5kaWFuVXRpbHMud3JpdGVTd2FwcGVkTG9uZyhieXRlW10sIGludCkgW0lPLTEwMV0KICAtIEFuIGludCBvdmVycnVuIGluIHRoZSBiaXQgc2hpZnRpbmcgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIGEgbG9uZwoKLSBFbmRpYW5VdGlscy53cml0ZVN3YXBwZWRMb25nKElucHV0U3RyZWFtKSBbSU8tMTAyXQogIC0gVGhlIHJldHVybiBvZiBpbnB1dC5yZWFkKGJ5dGVbXSkgd2FzIG5vdCBiZWluZyBjaGVja2VkIHRvIGVuc3VyZSBhbGwgOCBieXRlcyB3ZXJlIHJlYWQKCkVuaGFuY2VtZW50cyBmcm9tIDEuMgotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBEaXJlY3RvcnlXYWxrZXIgW0lPLTg2XQogIC0gTmV3IGNsYXNzIGRlc2lnbmVkIGZvciBzdWJjbGFzc2luZyB0byB3YWxrIHRocm91Z2ggYSBzZXQgb2YgZmlsZXMuCiAgICBEaXJlY3RvcnlXYWxrZXIgcHJvdmlkZXMgdGhlIHdhbGsgb2YgdGhlIGRpcmVjdG9yaWVzLCBmaWx0ZXJpbmcgb2YKICAgIGRpcmVjdG9yaWVzIGFuZCBmaWxlcywgYW5kIGNhbmNlbGxhdGlvbiBzdXBwb3J0LiBUaGUgc3ViY2xhc3MgbXVzdCBwcm92aWRlCiAgICB0aGUgc3BlY2lmaWMgYmVoYXZpb3IsIHN1Y2ggYXMgdGV4dCBzZWFyY2hpbmcgb3IgaW1hZ2UgcHJvY2Vzc2luZy4KCi0gSU9DYXNlCiAgLSBOZXcgY2xhc3MvZW51bWVyYXRpb24gZm9yIGNhc2Utc2Vuc2l0aXZpdHkgY29udHJvbAoKLSBGaWxlbmFtZVV0aWxzCiAgLSBOZXcgbWV0aG9kcyB0byBoYW5kbGUgY2FzZS1zZW5zaXRpdml0eQogIC0gd2lsZGNhcmRNYXRjaCAtIG5ldyBtZXRob2QgdGhhdCBoYXMgSU9DYXNlIGFzIGEgcGFyYW1ldGVyCiAgLSBlcXVhbHMgLSBuZXcgbWV0aG9kIHRoYXQgaGFzIElPQ2FzZSBhcyBhIHBhcmFtZXRlcgoKLSBGaWxlVXRpbHMgW0lPLTEwOF0gLSBuZXcgZGVmYXVsdCBlbmNvZGluZyBtZXRob2RzIGZvcjoKICAtIHJlYWRGaWxlVG9TdHJpbmcoRmlsZSkKICAtIHJlYWRMaW5lcyhGaWxlKQogIC0gbGluZUl0ZXJhdG9yKEZpbGUpCiAgLSB3cml0ZVN0cmluZ1RvRmlsZShGaWxlLCBTdHJpbmcpCiAgLSB3cml0ZUxpbmVzKEZpbGUsIENvbGxlY3Rpb24pCiAgLSB3cml0ZUxpbmVzKEZpbGUsIENvbGxlY3Rpb24sIFN0cmluZykKCi0gRmlsZVV0aWxzLm9wZW5PdXRwdXRTdHJlYW0gIFtJTy0xMDddCiAgLSBuZXcgbWV0aG9kIHRvIG9wZW4gYSBGaWxlT3V0cHV0U3RyZWFtLCBjcmVhdGluZyBwYXJlbnQgZGlyZWN0b3JpZXMgaWYgcmVxdWlyZWQKLSBGaWxlVXRpbHMudG91Y2gKLSBGaWxlVXRpbHMuY29weVVSTFRvRmlsZQotIEZpbGVVdGlscy53cml0ZVN0cmluZ1RvRmlsZQotIEZpbGVVdGlscy53cml0ZUJ5dGVBcnJheVRvRmlsZQotIEZpbGVVdGlscy53cml0ZUxpbmVzCiAgLSBlbmhhbmNlZCB0byBjcmVhdGUgcGFyZW50IGRpcmVjdG9yaWVzIGlmIHJlcXVpcmVkCi0gRmlsZVV0aWxzLm9wZW5JbnB1dFN0cmVhbSAgW0lPLTEwN10KICAtIG5ldyBtZXRob2QgdG8gb3BlbiBhIEZpbGVJbnB1dFN0cmVhbSwgcHJvdmlkaW5nIGJldHRlciBlcnJvciBtZXNzYWdlcyB0aGFuIHRoZSBKREsKCi0gRmlsZVV0aWxzLmlzRmlsZU9sZGVyCiAgLSBuZXcgbWV0aG9kcyB0byBjaGVjayBpZiBhIGZpbGUgaXMgb2xkZXIgKGkuZS4gaXNGaWxlT2xkZXIoKSkgLSBjb3VudGVycGFydHMKICAgIHRvIHRoZSBleGlzdGluZyBpc0ZpbGVOZXdlcigpIG1ldGhvZHMuCgotIEZpbGVVdGlscy5jaGVja3N1bSwgRmlsZVV0aWxzLmNoZWNrc3VtQ1JDMzIKICAtIG5ldyBtZXRob2RzIHRvIGNyZWF0ZSBhIGNoZWNrc3VtIG9mIGEgZmlsZQoKLSBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeSAgW0lPLTEwNF0KICAtIG5ldyB2YXJpYW50IHRoYXQgb3B0aW9uYWxseSByZXRhaW5zIHRoZSBmaWxlIGRhdGUKCi0gRmlsZURlbGV0ZVN0cmF0ZWd5Ci0gRmlsZUNsZWFuZXIgICAgW0lPLTU2LElPLTcwXQogIC0gRmlsZURlbGV0ZVN0cmF0ZWd5IGlzIGEgc3RyYXRlZ3kgZm9yIGhhbmRsaW5nIGZpbGUgZGVsZXRpb24KICAtIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjYWxiYWNrIGluIEZpbGVDbGVhbmVyCiAgLSBUb2dldGhlciB0aGVzZSBhbGxvdyBGaWxlQ2xlYW5lciB0byBkbyBhIGZvcmNlRGVsZXRlIHRvIGtpbGwgZGlyZWN0b3JpZXMKCi0gRmlsZUNsZWFuZXIuZXhpdFdoZW5GaW5pc2hlZCBbSU8tOTldCiAgLSBBIG5ldyBtZXRob2QgdGhhdCBhbGxvd3MgdGhlIGludGVybmFsIGNsZWFuZXIgdGhyZWFkIHRvIGJlIGNsZWFubHkgdGVybWluYXRlZAoKLSBXaWxkY2FyZEZpbGVGaWx0ZXIKICAtIFJlcGxhY2VtZW50IGZvciBXaWxkY2FyZEZpbHRlcgogIC0gQWNjZXB0cyBib3RoIGZpbGVzIGFuZCBkaXJlY3RvcmllcwogIC0gQWJpbGl0eSB0byBjb250cm9sIGNhc2Utc2Vuc2l0aXZpdHkKCi0gTmFtZUZpbGVGaWx0ZXIKICAtIEFiaWxpdHkgdG8gY29udHJvbCBjYXNlLXNlbnNpdGl2aXR5CgotIEZpbGVGaWxlRmlsdGVyCiAgLSBOZXcgSU9GaWxlRmlsdGVyIGltcGxlbWVudGF0aW9uCiAgLSBBY2NlcHRzIGZpbGVzIHdoZXJlIEZpbGUuaXNGaWxlKCkgaXMgdHJ1ZQogIC0gSW4gb3RoZXIgd29yZHMgaXQgZmlsdGVycyBvdXQgZGlyZWN0b3JpZXMKICAtIFNpbmdsZXRvbiBpbnN0YW5jZSBwcm92aWRlZCAoRklMRSkKCi0gQ2FuUmVhZEZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5jYW5SZWFkKCkgaXMgdHJ1ZQogIC0gU2luZ2xldG9uIGluc3RhbmNlcyBwcm92aWRlZCAoQ0FOX1JFQUQvQ0FOTk9UX1JFQUQvUkVBRF9PTkxZKQoKLSBDYW5Xcml0ZUZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5jYW5Xcml0ZSgpIGlzIHRydWUKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKENBTl9XUklURS9DQU5OT1RfV1JJVEUpCgotIEhpZGRlbkZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgd2hlcmUgRmlsZS5pc0hpZGRlbigpIGlzIHRydWUKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKEhJRERFTi9WSVNJQkxFKQoKLSBFbXB0eUZpbGVGaWx0ZXIKICAtIE5ldyBJT0ZpbGVGaWx0ZXIgaW1wbGVtZW50YXRpb24KICAtIEFjY2VwdHMgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBhcmUgZW1wdHkKICAtIFNpbmdsZXRvbiBpbnN0YW5jZXMgcHJvdmlkZWQgKEVNUFRZL05PVF9FTVBUWSkKCi0gVHJ1ZUZpbGVGaWx0ZXIvRmFsc2VGaWxlRmlsdGVyL0RpcmVjdG9yeUZpbGVGaWx0ZXIKICAtIE5ldyBzaW5nbGV0b24gaW5zdGFuY2UgY29uc3RhbnRzIChUUlVFL0ZBTFNFL0RJUkVDVE9SWSkKICAtIFRoZSBuZXcgY29uc3RhbnRzIGFyZSBtb3JlIEpESyAxLjUgZnJpZW5kbHkgd2l0aCByZWdhcmRzIHRvIHN0YXRpYyBpbXBvcnRzCiAgICAod2hlcmVhcyBpZiBldmVyeXRoaW5nIHVzZXMgSU5TVEFOQ0UsIHRoZW4gdGhleSBqdXN0IGNsYXNoKQogIC0gVGhlIG9sZCBJTlNUQU5DRSBjb25zdGFudHMgYXJlIHN0aWxsIHByZXNlbnQgYW5kIGhhdmUgbm90IGJlZW4gZGVwcmVjYXRlZAoKLSBGaWxlRmlsdGVyVXRpbHMuc2l6ZVJhbmdlRmlsZUZpbHRlcgogIC0gbmV3IHNpemVSYW5nZUZpbGVGaWx0ZXIobG9uZyBtaW5pbXVtU2l6ZSwgbG9uZyBtYXhpbXVtU2l6ZSkgbWV0aG9kIHdoaWNoIAogICAgY3JlYXRlcyBhIGZpbHRlciB0aGF0IGFjY2VwdHMgZmlsZXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgc2l6ZSByYW5nZS4KCi0gRmlsZUZpbHRlclV0aWxzLm1ha2VEaXJlY3RvcnlPbmx5L21ha2VGaWxlT25seQogIC0gdHdvIG5ldyBtZXRob2RzIHRoYXQgZGVjb3JhdGUgYSBmaWxlIGZpbHRlciB0byBtYWtlIGl0IGFwcGx5IHRvCiAgICBkaXJlY3RvcmllcyBvbmx5IG9yIGZpbGVzIG9ubHkKCi0gTnVsbFdyaXRlcgogIC0gTmV3IHdyaXRlciB0aGF0IGFjdHMgYXMgYSBzaW5rIGZvciBhbGwgZGF0YSwgYXMgcGVyIC9kZXYvbnVsbAoKLSBOdWxsSW5wdXRTdHJlYW0KICAtIE5ldyBpbnB1dCBzdHJlYW0gdGhhdCBlbXVsYXRlcyBhIHN0cmVhbSBvZiBhIHNwZWNpZmllZCBzaXplCgotIE51bGxSZWFkZXIKICAtIE5ldyByZWFkZXIgdGhhdCBlbXVsYXRlcyBhIHJlYWRlciBvZiBhIHNwZWNpZmllZCBzaXplCgotIEJ5dGVBcnJheU91dHB1dFN0cmVhbSAgW0lPLTk3XQogIC0gUGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQXBhY2hlIENvbW1vbnMgSU8gVmVyc2lvbiAxLjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDb21wYXRpYmlsaXR5IHdpdGggMS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzCgpEZXByZWNhdGlvbnMgZnJvbSAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpCdWcgZml4ZXMgZnJvbSAxLjEKLS0tLS0tLS0tLS0tLS0tLS0tCi0gRmlsZVN5c3RlbVV0aWxzLmZyZWVTcGFjZShkcml2ZSkKICBGaXggdG8gYWxsb3cgV2luZG93cyBiYXNlZCBjb21tYW5kIHRvIGZ1bmN0aW9uIGluIEZyZW5jaCBsb2NhbGUKCi0gRmlsZVV0aWxzLnJlYWQqCiAgSW5jcmVhc2UgY2VydGFpbnR5IHRoYXQgZmlsZXMgYXJlIGNsb3NlZCBpbiBjYXNlIG9mIGVycm9yCgotIExvY2thYmxlRmlsZVdyaXRlcgogIExvY2tpbmcgbWVjaGFuaXNtIHdhcyBicm9rZW4gYW5kIG9ubHkgcHJvdmlkZWQgbGltaXRlZCBwcm90ZWN0aW9uIFszODk0Ml0KICBGaWxlIGRlbGV0aW9uIGFuZCBsb2NraW5nIGluIGNhc2Ugb2YgY29uc3RydWN0b3IgZXJyb3Igd2FzIGJyb2tlbgoKRW5oYW5jZW1lbnRzIGZyb20gMS4xCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEFnZUZpbGVGaWx0ZXIvU2l6ZUZpbGVGaWx0ZXIKICBOZXcgZmlsZSBmaWx0ZXJzIHRoYXQgY29tcGFyZXMgYWdhaW5zdCB0aGUgYWdlIGFuZCBzaXplIG9mIHRoZSBmaWxlCgotIEZpbGVTeXN0ZW1VdGlscy5mcmVlU3BhY2VLYihkcml2ZSkKICBOZXcgbWV0aG9kIHRoYXQgdW5pZmllcyByZXN1bHQgdG8gYmUgaW4ga2lsb2J5dGVzIFszODU3NF0KCi0gRmlsZVV0aWxzLmNvbnRlbnRFcXVhbHMoRmlsZSxGaWxlKQogIFBlcmZvcm1hbmNlIGltcHJvdmVkIGJ5IGFkZGluZyBsZW5ndGggYW5kIGZpbGUgbG9jYXRpb24gY2hlY2tpbmcKCi0gRmlsZVV0aWxzLml0ZXJhdGVGaWxlcwogIFR3byBuZXcgbWV0aG9kIHRvIHByb3ZpZGUgZGlyZWN0IGFjY2VzcyB0byBpdGVyYXRvcnMgb3ZlciBmaWxlcwoKLSBGaWxlVXRpbHMubGluZUl0ZXJhdG9yCiAgSU9VdGlscy5saW5lSXRlcmF0b3IKICBOZXcgbWV0aG9kcyB0byBwcm92aWRlIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGxpbmVzIGluIGEgZmlsZSBbMzgwODNdCgotIEZpbGVVdGlscy5jb3B5RGlyZWN0b3J5VG9EaXJlY3RvcnkKICBOZXcgbWV0aG9kIHRvIGNvcHkgYSBkaXJlY3RvcnkgdG8gd2l0aGluIGFub3RoZXIgZGlyZWN0b3J5IFszNjMxNV0KICAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkFwYWNoZSBDb21tb25zIElPIFZlcnNpb24gMS4xCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKSW5jb21wYXRpYmxlIGNoYW5nZXMgZnJvbSAxLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQmluYXJ5IGNvbXBhdGlibGUgLSBZZXMKClNvdXJjZSBjb21wYXRpYmxlIC0gWWVzCgpTZW1hbnRpYyBjb21wYXRpYmxlIC0gWWVzLCBleGNlcHQ6Ci0gRmlsZVV0aWxzLndyaXRlU3RyaW5nVG9GaWxlKCkKICAgIEEgbnVsbCBlbmNvZGluZyBwcmV2aW91c2x5IHVzZWQgJ0lTTy04ODU5LTEnLCBub3cgaXQgdXNlcyB0aGUgcGxhdGZvcm0gZGVmYXVsdAogICAgR2VuZXJhbGx5IHRoaXMgd2lsbCBtYWtlIG5vIGRpZmZlcmVuY2UKCi0gTG9ja2FibGVGaWxlV3JpdGVyCiAgICBJbXByb3ZlZCB2YWxpZGF0aW9uIGFuZCBub3cgY3JlYXRlIGRpcmVjdG9yaWVzIGlmIG5lY2Vzc3NhcnkKCnBsdXMgdGhlc2UgYnVnIGZpeGVzIG1heSBhZmZlY3QgeW91IHNlbWFudGljYWxseToKLSBGaWxlVXRpbHMudG91Y2goKSAgKEJ1ZyBmaXggMjk4MjEpCiAgICBOb3cgY3JlYXRlcyB0aGUgZmlsZSBpZiBpdCBkaWQgbm90IHByZXZpb3VzbHkgZXhpc3QKCi0gRmlsZVV0aWxzLnRvRmlsZShVUkwpIChCdWcgZml4IDMyNTc1KQogICAgTm93IGhhbmRsZXMgZXNjYXBlIHN5bnRheCBzdWNoIGFzICUyMAoKLSBGaWxlVXRpbHMuc2l6ZU9mRGlyZWN0b3J5KCkgIChCdWcgZml4IDM2ODAxKQogICAgTWF5IG5vdyByZXR1cm4gYSBzaXplIG9mIDAgaWYgdGhlIGRpcmVjdG9yeSBpcyBzZWN1cml0eSByZXN0cmljdGVkCgpEZXByZWNhdGlvbnMgZnJvbSAxLjAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQ29weVV0aWxzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCiAgICBJdHMgbWV0aG9kcyBoYXZlIGJlZW4gbW92ZWQgdG8gSU9VdGlscy4KICAgIFRoZSBuZXcgSU9VdGlscyBtZXRob2RzIGhhbmRsZSBudWxscyBiZXR0ZXIsIGFuZCBoYXZlIGNsZWFyZXIgbmFtZXMuCgotIElPVXRpbHMudG9CeXRlQXJyYXkoU3RyaW5nKSAtIFVzZSB7QGxpbmsgU3RyaW5nI2dldEJ5dGVzKCl9Ci0gSU9VdGlscy50b1N0cmluZyhieXRlW10pIC0gVXNlIHtAbGluayBTdHJpbmcjU3RyaW5nKGJ5dGVbXSl9Ci0gSU9VdGlscy50b1N0cmluZyhieXRlW10sU3RyaW5nKSAtIFVzZSB7QGxpbmsgU3RyaW5nI1N0cmluZyhieXRlW10sU3RyaW5nKX0KCkJ1ZyBmaXhlcyBmcm9tIDEuMAotLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlVXRpbHMgLSB0b3VjaCgpICBbMjk4MjFdCiAgICBOb3cgY3JlYXRlcyB0aGUgZmlsZSBpZiBpdCBkaWQgbm90IHByZXZpb3VzbHkgZXhpc3QKCi0gRmlsZVV0aWxzIC0gdG9GaWxlKFVSTCkgIFszMjU3NV0KICAgIE5vdyBoYW5kbGVzIGVzY2FwZSBzeW50YXggc3VjaCBhcyAlMjAKCi0gRmlsZUZpbHRlclV0aWxzIC0gbWFrZUNWU0F3YXJlKElPRmlsZUZpbHRlcikgIFszMzAyM10KICAgIEZpeGVkIGJ1ZyB0aGF0IGNhdXNlZCBtZXRob2QgdG8gYmUgY29tcGxldGVseSBicm9rZW4KCi0gQ291bnRpbmdJbnB1dFN0cmVhbSAgWzMzMzM2XQogICAgRml4ZWQgYnVnIHRoYXQgY2F1c2VkIHRoZSBjb3VudCB0byByZWR1Y2UgYnkgb25lIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbQoKLSBDb3VudGluZ0lucHV0U3RyZWFtIC0gc2tpcChsb25nKSAgWzM0MzExXQogICAgQnl0ZXMgZnJvbSBjYWxscyB0byB0aGlzIG1ldGhvZCB3ZXJlIG5vdCBwcmV2aW91c2x5IGNvdW50ZWQKCi0gTnVsbE91dHB1dFN0cmVhbSAgWzMzNDgxXQogICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHN5bmNocm9uaXphdGlvbgoKLSBBYnN0cmFjdEZpbGVGaWx0ZXIgLSBhY2NlcHQoRmlsZSwgU3RyaW5nKSAgWzMwOTkyXQogICAgRml4ZWQgYnJva2VuIGltcGxlbWVudGF0aW9uCgotIEZpbGVVdGlscyAgWzM2ODAxXQogICAgUHJldmlvdXNseSB0aHJldyBOUEUgd2hlbiBsaXN0aW5nIGZpbGVzIGluIGEgc2VjdXJpdHkgcmVzdHJpY3RlZCBkaXJlY3RvcnkKICAgIE5vdyB0aHJvdyBJT0V4Y2VwdGlvbiB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UKCi0gRmlsZVV0aWxzIC0gd3JpdGVTdHJpbmdUb0ZpbGUoKQogICAgTnVsbCBlbmNvZGluZyBub3cgY29ycmVjdGx5IHVzZXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQKCkVuaGFuY2VtZW50cyBmcm9tIDEuMAotLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGaWxlbmFtZVV0aWxzIC0gbmV3IGNsYXNzICBbMzMzMDMsMjkzNTFdCiAgICBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZmlsZW5hbWVzCiAgICBTZWVrcyB0byBlYXNlIHRoZSBwYWluIG9mIGRldmVsb3Bpbmcgb24gV2luZG93cyBhbmQgZGVwbG95aW5nIG9uIFVuaXgKCi0gRmlsZVN5c3RlbVV0aWxzIC0gbmV3IGNsYXNzICBbMzI5ODIsMzYzMjVdCiAgICBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZmlsZSBzeXN0ZW1zCiAgICBQcm92aWRlcyBvbmUgbWV0aG9kIGF0IHByZXNlbnQsIHRvIGdldCB0aGUgZnJlZSBzcGFjZSBvbiB0aGUgZmlsaW5nIHN5c3RlbQoKLSBJT1V0aWxzIC0gbmV3IHB1YmxpYyBjb25zdGFudHMKICAgIENvbnN0YW50cyBmb3IgZGlyZWN0b3J5IGFuZCBsaW5lIHNlcGFyYXRvcnMgb24gV2luZG93cyBhbmQgVW5peAoKLSBJT1V0aWxzIC0gdG9CeXRlQXJyYXkoUmVhZGVyLGVuY29kaW5nKQogICAgSGFuZGxlcyBlbmNvZGluZ3Mgd2hlbiByZWFkaW5nIHRvIGEgYnl0ZSBhcnJheQoKLSBJT1V0aWxzIC0gdG9DaGFyQXJyYXkoSW5wdXRTdHJlYW0pICBbMjg5NzldCiAgICAgICAgICAtIHRvQ2hhckFycmF5KElucHV0U3RyZWFtLGVuY29kaW5nKQogICAgICAgICAgLSB0b0NoYXJBcnJheShSZWFkZXIpCiAgICBSZWFkcyBhIHN0cmVhbS9yZWFkZXIgaW50byBhIGNoYXJhdGN0ZXIgYXJyYXkKCi0gSU9VdGlscyAtIHJlYWRMaW5lcyhJbnB1dFN0cmVhbSkgIFszNjIxNF0KICAgICAgICAgIC0gcmVhZExpbmVzKElucHV0U3RyZWFtLGVuY29kaW5nKQogICAgICAgICAgLSByZWFkTGluZXMoUmVhZGVyKQogICAgUmVhZHMgYSBzdHJlYW0vcmVhZGVyIGxpbmUgYnkgbGluZSBpbnRvIGEgTGlzdCBvZiBTdHJpbmdzCgotIElPVXRpbHMgLSB0b0lucHV0U3RyZWFtKFN0cmluZykgIFszMjk1OF0KICAgICAgICAgIC0gdG9JbnB1dFN0cmVhbShTdHJpbmcsZW5jb2RpbmcpCiAgICBDcmVhdGVzIGFuIGlucHV0IHN0cmVhbSB0aGF0IHVzZXMgdGhlIHN0cmluZyBhcyBhIHNvdXJjZSBvZiBkYXRhCgotIElPVXRpbHMgLSB3cml0ZUxpbmVzKENvbGxlY3Rpb24sbGluZUVuZGluZyxPdXRwdXRTdHJlYW0pICBbMzYyMTRdCiAgICAgICAgICAtIHdyaXRlTGluZXMoQ29sbGVjdGlvbixsaW5lRW5kaW5nLE91dHB1dFN0cmVhbSxlbmNvZGluZykKICAgICAgICAgIC0gd3JpdGVMaW5lcyhDb2xsZWN0aW9uLGxpbmVFbmRpbmcsV3JpdGVyKQogICAgV3JpdGVzIGEgY29sbGVjdGlvbiB0byBhIHN0cmVhbS93cml0ZXIgbGluZSBieSBsaW5lCgotIElPVXRpbHMgLSB3cml0ZSguLi4pCiAgICBXcml0ZSBkYXRhIHRvIGEgc3RyZWFtL3dyaXRlciAobW92ZWQgZnJvbSBDb3B5VXRpbHMgd2l0aCBiZXR0ZXIgbnVsbCBoYW5kbGluZykKCi0gSU9VdGlscyAtIGNvcHkoLi4uKQogICAgQ29weSBkYXRhIGJldHdlZW4gc3RyZWFtcyAobW92ZWQgZnJvbSBDb3B5VXRpbHMgd2l0aCBiZXR0ZXIgbnVsbCBoYW5kbGluZykKCi0gSU9VdGlscyAtIGNvbnRlbnRFcXVhbHMoUmVhZGVyLFJlYWRlcikKICAgIE1ldGhvZCB0byBjb21wYXJlIHRoZSBjb250ZW50cyBvZiB0d28gcmVhZGVycwoKLSBGaWxlVXRpbHMgLSB0b0ZpbGVzKFVSTFtdKQogICAgQ29udmVydHMgYW4gYXJyYXkgb2YgVVJMcyB0byBhbiBhcnJheSBvZiBGaWxlcwoKLSBGaWxlVXRpbHMgLSBjb3B5RGlyZWN0b3J5KCkgIFszMjk0NF0KICAgIE5ldyBtZXRob2RzIHRvIGNvcHkgYSBkaXJlY3RvcnkKCi0gRmlsZVV0aWxzIC0gcmVhZEZpbGVUb0J5dGVBcnJheShGaWxlKQogICAgUmVhZHMgYW4gZW50aXJlIGZpbGUgaW50byBhIGJ5dGUgYXJyYXkKCi0gRmlsZVV0aWxzIC0gd3JpdGVCeXRlQXJyYXlUb0ZpbGUoRmlsZSxieXRlW10pCiAgICBXcml0ZXMgYSBieXRlIGFycmF5IHRvIGEgZmlsZQoKLSBGaWxlVXRpbHMgLSByZWFkTGluZXMoRmlsZSxlbmNvZGluZykgIFszNjIxNF0KICAgIFJlYWRzIGEgZmlsZSBsaW5lIGJ5IGxpbmUgaW50byBhIExpc3Qgb2YgU3RyaW5ncwoKLSBGaWxlVXRpbHMgLSB3cml0ZUxpbmVzKEZpbGUsZW5jb2RpbmcsTGlzdCkKICAgICAgICAgICAgICB3cml0ZUxpbmVzKEZpbGUsZW5jb2RpbmcsTGlzdCxsaW5lRW5kaW5nKQogICAgV3JpdGVzIGEgY29sbGVjdGlvbiB0byBhIGZpbGUgbGluZSBieSBsaW5lCgotIEZpbGVVdGlscyAtIEVNUFRZX0ZJTEVfQVJSQVkKICAgIENvbnN0YW50IGZvciBhbiBlbXB0eSBhcnJheSBvZiBGaWxlIG9iamVjdHMKCi0gQ29uZGl0aW9uYWxGaWxlRmlsdGVyIC0gbmV3IGludGVyZmFjZSAgWzMwNzA1XQogICAgRGVmaW5lcyB0aGUgYmVoYXZpb3Igb2YgbGlzdCBiYXNlZCBmaWx0ZXJzCgotIEFuZEZpbGVGaWx0ZXIsIE9yRmlsZUZpbHRlciAgWzMwNzA1XQogICAgTm93IHN1cHBvcnQgYSBsaXN0IG9mIGZpbHRlcnMgdG8gYW5kL29yCgotIFdpbGRjYXJkRmlsdGVyICBbMzExMTVdCiAgICBOZXcgZmlsdGVyIHRoYXQgY2FuIG1hdGNoIHVzaW5nIHdpbGRjYXJkIGZpbGUgbmFtZXMKCi0gRmlsZUZpbHRlclV0aWxzIC0gbWFrZVNWTkF3YXJlKElPRmlsZUZpbHRlcikKICAgIE5ldyBtZXRob2QsIGxpa2UgbWFrZUNWU0F3YXJlLCB0aGF0IGlnbm9yZXMgU3VidmVyc2lvbiBzb3VyY2UgY29udHJvbCBkaXJlY3RvcmllcwoKLSBDbGFzc0xvYWRlck9iamVjdElucHV0U3RyZWFtCiAgICBBbiBPYmplY3RJbnB1dFN0cmVhbSB0aGF0IHN1cHBvcnRzIGEgQ2xhc3NMb2FkZXIKCi0gQ291bnRpbmdJbnB1dFN0cmVhbSxDb3VudGluZ091dHB1dFN0cmVhbSAtIHJlc2V0Q291bnQoKSAgWzI4OTc2XQogICAgQWRkcyB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY291bnQgcGFydCB3YXkgdGhyb3VnaCByZWFkaW5nL3dyaXRpbmcgdGhlIHN0cmVhbQoKLSBEZWZlcnJlZEZpbGVPdXRwdXRTdHJlYW0gLSB3cml0ZVRvKE91dHB1dFN0cmVhbSkgIFszNDE3M10KICAgIE5ldyBtZXRob2QgdG8gYWxsb3cgY3VycmVudCBjb250ZW50cyB0byBiZSB3cml0dGVuIHRvIGEgc3RyZWFtCgotIERlZmVycmVkRmlsZU91dHB1dFN0cmVhbSAgWzM0MTQyXQogICAgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBhdm9pZGluZyBkb3VibGUgYnVmZmVyaW5nCgotIExvY2thYmxlRmlsZVdyaXRlciAtIGVuY29kaW5nIHN1cHBvcnQgWzM2ODI1XQogICAgQWRkIHN1cHBvcnQgZm9yIGNoYXJhY3RlciBlbmNvZGluZ3MgdG8gTG9ja2FibGVGaWxlV3JpdGVyCiAgICBJbXByb3ZlIHRoZSB2YWxpZGF0aW9uCiAgICBDcmVhdGUgZGlyZWN0b3JpZXMgaWYgbmVjZXNzc2FyeQoKLSBJT1V0aWxzIGFuZCBFbmRpYW5VdGlscyBhcmUgbm8gbG9uZ2VyIGZpbmFsICBbMjg5NzhdCiAgICBBbGxvd3MgZGV2ZWxvcGVycyB0byBoYXZlIHN1YmNsYXNzZXMgaWYgZGVzaXJlZCAgIAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkZlZWRiYWNrCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT3BlbiBzb3VyY2Ugd29ya3MgYmVzdCB3aGVuIHlvdSBnaXZlIGZlZWRiYWNrOgpodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9pby8KClBsZWFzZSBkaXJlY3QgYWxsIGJ1ZyByZXBvcnRzIHRvIEpJUkEKaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9JTwoKT3Igc3Vic2NyaWJlIHRvIHRoZSBjb21tb25zLXVzZXIgbWFpbGluZyBsaXN0IChwcmVmaXggZW1haWxzIGJ5IFtpb10pCmh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL21haWwtbGlzdHMuaHRtbAoKVGhlIENvbW1vbnMtSU8gVGVhbQo=