ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAyNDBlMmZlLi41MGI1YTJiIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMxMCArMSwzMjQgQEAKLVBvbGFyU1NMIENoYW5nZUxvZw0KLQ0KLT0gVmVyc2lvbiAwLjE0LjAgcmVsZWFzZWQgb24gMjAxMC0wOC0xNg0KLUZlYXR1cmVzDQotICAgKiBBZGRlZCBzdXBwb3J0IGZvciBTU0xfRURIX1JTQV9BRVNfMTI4X1NIQSBhbmQNCi0gICAgIFNTTF9FREhfUlNBX0NBTUVMTElBXzEyOF9TSEEgY2lwaGVyc3VpdGVzDQotICAgKiBBZGRlZCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIHZlcnNpb24gaW5mb3JtYXRpb24NCi0gICAqIEV4cGFuZGVkIHNzbF9jbGllbnQyIGFyZ3VtZW50cyBmb3IgbW9yZSBmbGV4aWJpbGl0eQ0KLSAgICogQWRkZWQgc3VwcG9ydCBmb3IgVExTIHYxLjENCi0NCi1DaGFuZ2VzDQotICAgKiBNYWRlIE1ha2VmaWxlIGNsZWFuZXINCi0gICAqIFJlbW92ZWQgZGVwZW5kZW5jeSBvbiByYW5kKCkgaW4gcnNhX3BrY3MxX2VuY3J5cHQoKS4NCi0gICAgIE5vdyB1c2luZyByYW5kb20gZnVjdGlvbiBwcm92aWRlZCB0byBmdW5jdGlvbiBhbmQNCi0JIGNoYW5nZWQgdGhlIHByb3RvdHlwZSBvZiByc2FfcGtjczFfZW5jcnlwdCgpLA0KLQkgcnNhX2luaXQoKSBhbmQgcnNhX2dlbl9rZXkoKS4NCi0gICAqIFNvbWUgU1NMIGRlZmluZXMgd2VyZSByZW5hbWVkIGluIG9yZGVyIHRvIGF2b2lkDQotICAgICBmdXR1cmUgY29uZnVzaW9uDQotDQotQnVnIGZpeGVzDQotICAgKiBGaXhlZCBDTWFrZSBvdXQgb2Ygc291cmNlIGJ1aWxkIGZvciB0ZXN0cyAoZm91bmQgYnkNCi0gICAgIGtrZXJ0KQ0KLSAgICogcnNhX2NoZWNrX3ByaXZhdGUoKSBub3cgc3VwcG9ydHMgUEtDUzF2MiBrZXlzIGFzIHdlbGwNCi0gICAqIEZpeGVkIGRlYWRsb2NrIGluIHJzYV9wa2NzMV9lbmNyeXB0KCkgb24gZmFpbGluZyByYW5kb20NCi0gICAgIGdlbmVyYXRvcg0KLQ0KLT0gVmVyc2lvbiAwLjEzLjEgcmVsZWFzZWQgb24gMjAxMC0wMy0yNA0KLUJ1ZyBmaXhlcw0KLSAgICogRml4ZWQgTWFrZWZpbGUgaW4gbGlicmFyeSB0aGF0IHdhcyBtaXN0YWtlbmx5IG1lcmdlZA0KLSAgICogQWRkZWQgbWlzc2luZyBjb25zdCBzdHJpbmcgZml4ZXMNCi0NCi09IFZlcnNpb24gMC4xMy4wIHJlbGVhc2VkIG9uIDIwMTAtMDMtMjENCi1GZWF0dXJlcw0KLSAgICogQWRkZWQgb3B0aW9uIHBhcnNpbmcgZm9yIGhvc3QgYW5kIHBvcnQgc2VsZWN0aW9uIHRvDQotICAgICBzc2xfY2xpZW50Mg0KLSAgICogQWRkZWQgc3VwcG9ydCBmb3IgR2VuZXJhbGl6ZWRUaW1lIGluIFg1MDkgcGFyc2luZw0KLSAgICogQWRkZWQgY2VydF9hcHAgcHJvZ3JhbSB0byBhbGxvdyBlYXN5IHJlYWRpbmcgYW5kDQotICAgICBwcmludGluZyBvZiBYNTA5IGNlcnRpZmljYXRlcyBmcm9tIGZpbGUgb3IgU1NMDQotICAgICBjb25uZWN0aW9uLg0KLQ0KLUNoYW5nZXMNCi0gICAqIEFkZGVkIGNvbnN0IGNvcnJlY3RuZXNzIGZvciBtYWluIGNvZGUgYmFzZQ0KLSAgICogWDUwOSBzaWduYXR1cmUgYWxnb3JpdGhtIGRldGVybWluYXRpb24gaXMgbm93DQotICAgICBpbiBhIGZ1bmN0aW9uIHRvIGFsbG93IGVhc3kgZnV0dXJlIGV4cGFuc2lvbg0KLSAgICogQ2hhbmdlZCBzeW1tZXRyaWMgY2lwaGVyIGZ1bmN0aW9ucyB0bw0KLSAgICAgaWRlbnRpY2FsIGludGVyZmFjZSAocmV0dXJuaW5nIGludCByZXN1bHQgdmFsdWVzKQ0KLSAgICogQ2hhbmdlZCBBUkM0IHRvIHVzZSBzZXBlcmF0ZSBpbnB1dC9vdXRwdXQgYnVmZmVyDQotICAgKiBBZGRlZCByZXNldCBmdW5jdGlvbiBmb3IgSE1BQyBjb250ZXh0IGFzIHNwZWVkLXVwDQotICAgICBmb3Igc3BlY2lmaWMgdXNlLWNhc2VzDQotDQotQnVnIGZpeGVzDQotICAgKiBGaXhlZCBidWcgcmVzdWx0aW5nIGluIGZhaWx1cmUgdG8gc2VuZCB0aGUgbGFzdA0KLSAgICAgY2VydGlmaWNhdGUgaW4gdGhlIGNoYWluIGluIHNzbF93cml0ZV9jZXJ0aWZpY2F0ZSgpIGFuZA0KLSAgICAgc3NsX3dyaXRlX2NlcnRpZmljYXRlX3JlcXVlc3QoKSAoZm91bmQgYnkgZmF0Ym9iKQ0KLSAgICogQWRkZWQgc21hbGwgZml4ZXMgZm9yIGNvbXBpbGVyIHdhcm5pbmdzIG9uIGEgTWFjDQotICAgICAoZm91bmQgYnkgRnJhbmsgZGUgQnJhYmFuZGVyKQ0KLSAgICogRml4ZWQgYWxnb3JpdGhtaWMgYnVnIGluIG1waV9pc19wcmltZSgpIChmb3VuZCBieQ0KLSAgICAgU21iYXQgVG9ub3lhbikNCi0NCi09IFZlcnNpb24gMC4xMi4xIHJlbGVhc2VkIG9uIDIwMDktMTAtMDQNCi1DaGFuZ2VzDQotICAgKiBDb3ZlcmFnZSB0ZXN0IGRlZmluaXRpb25zIG5vdyBzdXBwb3J0ICdkZXBlbmRzX29uJw0KLSAgICAgdGFnZ2luZyBzeXN0ZW0uDQotICAgKiBUZXN0cyByZXF1aXJpbmcgc3BlY2lmaWMgaGFzaGluZyBhbGdvcml0aG1zIG5vdyBob25vcg0KLSAgICAgdGhlIGRlZmluZXMuDQotDQotQnVnIGZpeGVzDQotICAgKiBDaGFuZ2VkIHR5cG8gaW4gI2lmZGVmIGluIHg1MDlwYXJzZS5jIChmb3VuZA0KLSAgICAgYnkgRWR1YXJkbykNCi0NCi09IFZlcnNpb24gMC4xMi4wIHJlbGVhc2VkIG9uIDIwMDktMDctMjgNCi1GZWF0dXJlcw0KLSAgICogQWRkZWQgQ01ha2UgbWFrZWZpbGVzIGFzIGFsdGVybmF0aXZlIHRvIHJlZ3VsYXIgTWFrZWZpbGVzLg0KLSAgICogQWRkZWQgcHJlbGltaW5hcnkgQ29kZSBDb3ZlcmFnZSB0ZXN0cyBmb3IgQUVTLCBBUkM0LA0KLSAgICAgQmFzZTY0LCBNUEksIFNIQS1mYW1pbHksIE1ELWZhbWlseSwgSE1BQy1TSEEtZmFtaWx5LA0KLSAgICAgQ2FtZWxsaWEsIERFUywgMy1ERVMsIFJTQSBQS0NTIzEsIFhURUEsIERpZmZpZS1IZWxsbWFuDQotICAgICBhbmQgWDUwOXBhcnNlLg0KLQ0KLUNoYW5nZXMNCi0gICAqIEVycm9yIGNvZGVzIGFyZSBub3QgKG5lY2Vzc2FyaWx5KSBuZWdhdGl2ZS4gS2VlcA0KLSAgICAgdGhpcyBpcyBtaW5kIHdoZW4gY2hlY2tpbmcgZm9yIGVycm9ycy4NCi0gICAqIFJTQV9SQVcgcmVuYW1lZCB0byBTSUdfUlNBX1JBVyBmb3IgY29uc2lzdGVuY3kuDQotICAgKiBGaXhlZCB0eXBvIGluIG5hbWUgb2YgUE9MQVJTU0xfRVJSX1JTQV9PVVRQVVRfVE9PX0xBUkdFLg0KLSAgICogQ2hhbmdlZCBpbnRlcmZhY2UgZm9yIEFFUyBhbmQgQ2FtZWxsaWEgc2V0a2V5IGZ1bmN0aW9ucw0KLSAgICAgdG8gaW5kaWNhdGUgaW52YWxpZCBrZXkgbGVuZ3Rocy4NCi0NCi1CdWcgZml4ZXMNCi0gICAqIEZpeGVkIGluY2x1ZGUgbG9jYXRpb24gb2YgZW5kaWFuLmggb24gRnJlZUJTRCAoZm91bmQgYnkNCi0gICAgIEdhYnJpZWwpDQotICAgKiBGaXhlZCBpbmNsdWRlIGxvY2F0aW9uIG9mIGVuZGlhbi5oIGFuZCBuYW1lIGNsYXNoIG9uDQotICAgICBBcHBsZXMgKGZvdW5kIGJ5IE1hcnRpbiB2YW4gSGVuc2JlcmdlbikNCi0gICAqIEZpeGVkIEhNQUMtTUQyIGJ5IG1vZGlmeWluZyBtZDJfc3RhcnRzKCksIHNvIHRoYXQgdGhlDQotICAgICByZXF1aXJlZCBITUFDIGlwYWQgYW5kIG9wYWQgdmFyaWFibGVzIGFyZSBub3QgY2xlYXJlZC4NCi0gICAgIChmb3VuZCBieSBjb2RlIGNvdmVyYWdlIHRlc3RzKQ0KLSAgICogUHJldmVudGVkIHVzZSBvZiBsb25nIGxvbmcgaW4gYmlnbnVtIGlmIA0KLSAgICAgUE9MQVJTU0xfSEFWRV9MT05HTE9ORyBub3QgZGVmaW5lZCAoZm91bmQgYnkgR2lsZXMNCi0gICAgIEJhdGhnYXRlKS4NCi0gICAqIEZpeGVkIGluY29ycmVjdCBoYW5kbGluZyBvZiBuZWdhdGl2ZSBzdHJpbmdzIGluDQotICAgICBtcGlfcmVhZF9zdHJpbmcoKSAoZm91bmQgYnkgY29kZSBjb3ZlcmFnZSB0ZXN0cykuDQotICAgKiBGaXhlZCBzZWdmYXVsdCBvbiBoYW5kbGluZyBlbXB0eSByc2FfY29udGV4dCBpbg0KLSAgICAgcnNhX2NoZWNrX3B1YmtleSgpIGFuZCByc2FfY2hlY2tfcHJpdmtleSgpIChmb3VuZCBieQ0KLSAgICAgY29kZSBjb3ZlcmFnZSB0ZXN0cykuDQotICAgKiBGaXhlZCBpbmNvcnJlY3QgaGFuZGxpbmcgb2Ygb25lIHNpbmdsZSBuZWdhdGl2ZSBpbnB1dA0KLSAgICAgdmFsdWUgaW4gbXBpX2FkZF9hYnMoKSAoZm91bmQgYnkgY29kZSBjb3ZlcmFnZSB0ZXN0cykuDQotICAgKiBGaXhlZCBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgbmVnYXRpdmUgZmlyc3QgaW5wdXQNCi0gICAgIHZhbHVlIGluIG1waV9zdWJfYWJzKCkgKGZvdW5kIGJ5IGNvZGUgY292ZXJhZ2UgdGVzdHMpLg0KLSAgICogRml4ZWQgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIG5lZ2F0aXZlIGZpcnN0IGlucHV0DQotICAgICB2YWx1ZSBpbiBtcGlfbW9kX21waSgpIGFuZCBtcGlfbW9kX2ludCgpLiBSZXN1bHRpbmcNCi0gICAgIGNoYW5nZSBhbHNvIGFmZmVjdHMgbXBpX3dyaXRlX3N0cmluZygpIChmb3VuZCBieSBjb2RlDQotICAgICBjb3ZlcmFnZSB0ZXN0cykuDQotICAgKiBDb3JyZWN0ZWQgaXNfcHJpbWUoKSByZXN1bHRzIGZvciAwLCAxIGFuZCAyIChmb3VuZCBieQ0KLSAgICAgY29kZSBjb3ZlcmFnZSB0ZXN0cykuDQotICAgKiBGaXhlZCBDYW1lbGxpYSBhbmQgWFRFQSBmb3IgNjQtYml0IFdpbmRvd3Mgc3lzdGVtcy4NCi0NCi09IFZlcnNpb24gMC4xMS4xIHJlbGVhc2VkIG9uIDIwMDktMDUtMTcNCi0gICAqIEZpeGVkIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSBmb3IgU0hBLTIyNCwgU0hBLTI1NiwgU0hBMzg0LA0KLSAgICAgU0hBLTUxMiBpbiByc2FfcGtjczFfc2lnbigpDQotDQotPSBWZXJzaW9uIDAuMTEuMCByZWxlYXNlZCBvbiAyMDA5LTA1LTAzDQotICAgKiBGaXhlZCBhIGJ1ZyBpbiBtcGlfZ2NkKCkgc28gdGhhdCBpdCBhbHNvIHdvcmtzIHdoZW4gYm90aA0KLSAgICAgaW5wdXQgbnVtYmVycyBhcmUgZXZlbiBhbmQgYWRkZWQgdGVzdGNhc2VzIHRvIGNoZWNrDQotICAgICAoZm91bmQgYnkgUGllcnJlIEhhYm91eml0KS4NCi0gICAqIEFkZGVkIHN1cHBvcnQgZm9yIFNIQS0yMjQsIFNIQS0yNTYsIFNIQS0zODQgYW5kIFNIQS01MTINCi0gICAgIG9uZSB3YXkgaGFzaCBmdW5jdGlvbnMgd2l0aCB0aGUgUEtDUyMxIHYxLjUgc2lnbmluZyBhbmQNCi0gICAgIHZlcmlmaWNhdGlvbi4NCi0gICAqIEZpeGVkIG1pbm9yIGJ1ZyByZWdhcmRpbmcgbXBpX2djZCBsb2NhdGVkIHdpdGhpbiB0aGUNCi0gICAgIFBPTEFSU1NMX0dFTlBSSU1FIGJsb2NrLg0KLSAgICogRml4ZWQgbWlub3IgbWVtb3J5IGxlYWsgaW4geDUwOXBhcnNlX2NydCgpIGFuZCBhZGRlZCBiZXR0ZXINCi0gICAgIGhhbmRsaW5nIG9mICdmdWxsJyBjZXJ0aWZpY2F0ZSBjaGFpbnMgKGZvdW5kIGJ5IE1hdGhpYXMNCi0gICAgIE9sc3NvbikuDQotICAgKiBDZW50cmFsaXplZCBmaWxlIG9wZW5pbmcgYW5kIHJlYWRpbmcgZm9yIHg1MDkgZmlsZXMgaW50bw0KLSAgICAgbG9hZF9maWxlKCkNCi0gICAqIE1hZGUgZGVmaW5pdGlvbiBvZiBuZXRfaHRvbnMoKSBlbmRpYW4tY2xlYW4gZm9yIGJpZyBlbmRpYW4NCi0gICAgIHN5c3RlbXMgKEZvdW5kIGJ5IEdlcm5vdCkuDQotICAgKiBVbmRlZmluaW5nIFBPTEFSU1NMX0hBVkVfQVNNIG5vdyBhbHNvIGhhbmRsZXMgcHJldmVudHMgYXNtIGluDQotICAgICBwYWRsb2NrIGFuZCB0aW1pbmcgY29kZS4gDQotICAgKiBGaXhlZCBhbiBvZmYtYnktb25lIGJ1ZmZlciBhbGxvY2F0aW9uIGluIHNzbF9zZXRfaG9zdG5hbWUoKQ0KLSAgICAgcmVzcG9uc2libGUgZm9yIGNyYXNoZXMgYW5kIHVud2FudGVkIGJlaGF2aW91ci4NCi0gICAqIEFkZGVkIHN1cHBvcnQgZm9yIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCAoQ1JMKSBwYXJzaW5nLg0KLSAgICogQWRkZWQgc3VwcG9ydCBmb3IgQ1JMIHJldm9jYXRpb24gdG8geDUwOXBhcnNlX3ZlcmlmeSgpIGFuZA0KLSAgICAgU1NML1RMUyBjb2RlLg0KLSAgICogRml4ZWQgY29tcGF0aWJpbGl0eSBvZiBYVEVBIGFuZCBDYW1lbGxpYSBvbiBhIDY0LWJpdCBzeXN0ZW0NCi0gICAgIChmb3VuZCBieSBGZWxpeCB2b24gTGVpdG5lcikuDQotDQotPSBWZXJzaW9uIDAuMTAuMCByZWxlYXNlZCBvbiAyMDA5LTAxLTEyDQotICAgKiBNaWdyYXRlZCBYeVNTTCB0byBQb2xhclNTTA0KLSAgICogQWRkZWQgWFRFQSBzeW1tZXRyaWMgY2lwaGVyDQotICAgKiBBZGRlZCBDYW1lbGxpYSBzeW1tZXRyaWMgY2lwaGVyDQotICAgKiBBZGRlZCBzdXBwb3J0IGZvciBjaXBoZXJzdWl0ZXM6IFNTTF9SU0FfQ0FNRUxMSUFfMTI4X1NIQSwNCi0gICAgIFNTTF9SU0FfQ0FNRUxMSUFfMjU2X1NIQSBhbmQgU1NMX0VESF9SU0FfQ0FNRUxMSUFfMjU2X1NIQQ0KLSAgICogRml4ZWQgZGFuZ2Vyb3VzIGJ1ZyB0aGF0IGNhbiBjYXVzZSBhIGhlYXAgb3ZlcmZsb3cgaW4NCi0gICAgIHJzYV9wa2NzMV9kZWNyeXB0IChmb3VuZCBieSBDaHJpc3RvcGhlIERldmluZSkNCi0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotWHlTU0wgQ2hhbmdlTG9nDQotDQotPSBWZXJzaW9uIDAuOSByZWxlYXNlZCBvbiAyMDA4LTAzLTE2DQotDQotICAgICogQWRkZWQgc3VwcG9ydCBmb3IgY2lwaGVyc3VpdGU6IFNTTF9SU0FfQUVTXzEyOF9TSEENCi0gICAgKiBFbmFibGVkIHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzIGJ5IGRlZmF1bHQgaW4gYWVzY3J5cHQyLmMNCi0gICAgKiBQcmVsaW1pbmFyeSBvcGVuc3NsIHdyYXBwZXIgY29udHJpYnV0ZWQgYnkgRGF2aWQgQmFycmV0dA0KLSAgICAqIEZpeGVkIGEgYnVnIGluIHNzbF93cml0ZSgpIHRoYXQgY2F1c2VkIHRoZSBzYW1lIHBheWxvYWQgdG8NCi0gICAgICBiZSBzZW50IHR3aWNlIGluIG5vbi1ibG9ja2luZyBtb2RlIHdoZW4gc2VuZCByZXR1cm5zIEVBR0FJTg0KLSAgICAqIEZpeGVkIHNzbF9wYXJzZV9jbGllbnRfaGVsbG8oKTogc2Vzc2lvbiBpZCBhbmQgY2hhbGxlbmdlIG11c3QNCi0gICAgICBub3QgYmUgc3dhcHBlZCBpbiB0aGUgU1NMdjIgQ2xpZW50SGVsbG8gKGZvdW5kIGJ5IEdyZWcgUm9ic29uKQ0KLSAgICAqIEFkZGVkIHVzZXItZGVmaW5lZCBjYWxsYmFjayBkZWJ1ZyBmdW5jdGlvbiAoS3J5c3RpYW4gS29sb2R6aWVqKQ0KLSAgICAqIEJlZm9yZSBmcmVlaW5nIGEgY2VydGlmaWNhdGUsIHByb3Blcmx5IHplcm8gb3V0IGFsbCBjZXJ0LiBkYXRhDQotICAgICogRml4ZWQgdGhlICJtb2RlIiBwYXJhbWV0ZXIgc28gdGhhdCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gYXJlDQotICAgICAgbm90IHN3YXBwZWQgb24gUGFkTG9jazsgYWxzbyBmaXhlZCBjb21waWxhdGlvbiBvbiBvbGRlciB2ZXJzaW9ucw0KLSAgICAgIG9mIGdjYyAoYnVnIHJlcG9ydGVkIGJ5IERhdmlkIEJhcnJldHQpDQotICAgICogQ29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBpbiBwYWRsb2NrX3hjcnlwdGNiYygpIHdoZW4gaW5wdXQgb3INCi0gICAgICBvdXB1dCBkYXRhIGlzIG5vbi1hbGlnbmVkIGJ5IGZhbGxpbmcgYmFjayB0byB0aGUgc29mdHdhcmUNCi0gICAgICBpbXBsZW1lbnRhdGlvbiwgYXMgVklBIE5laGVtaWFoIGNhbm5vdCBoYW5kbGUgbm9uLWFsaWduZWQgYnVmZmVycw0KLSAgICAqIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4geDUwOXBhcnNlX2NydCgpIHdoaWNoIHdhcyByZXBvcnRlZCBieSBHcmVnDQotICAgICAgUm9ic29uLUdhcnRoOyBzb21lIHg1MDl3cml0ZS5jIGZpeGVzIGJ5IFBhc2NhbCBWaXplbGksIHRoYW5rcyB0bw0KLSAgICAgIE1hdHRoZXcgUGFnZSB3aG8gcmVwb3J0ZWQgc2V2ZXJhbCBidWdzDQotICAgICogRml4ZWQgeDUwOV9nZXRfZXh0KCkgdG8gYWNjZXB0IHNvbWUgcmFyZSBjZXJ0aWZpY2F0ZXMgd2hpY2ggaGF2ZQ0KLSAgICAgIGFuIElOVEVHRVIgaW5zdGVhZCBvZiBhIEJPT0xFQU4gZm9yIEJhc2ljQ29uc3RyYWludHM6OmNBLg0KLSAgICAqIEFkZGVkIHN1cHBvcnQgb24gdGhlIGNsaWVudCBzaWRlIGZvciB0aGUgVExTICJob3N0bmFtZSIgZXh0ZW5zaW9uDQotICAgICAgKHBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIFBhdGlubykNCi0gICAgKiBNYWtlIHg1MDlwYXJzZV92ZXJpZnkoKSByZXR1cm4gQkFEQ0VSVF9DTl9NSVNNQVRDSCB3aGVuIGFuIGVtcHR5DQotICAgICAgc3RyaW5nIGlzIHBhc3NlZCBhcyB0aGUgQ04gKGJ1ZyByZXBvcnRlZCBieSBzcG9vZnkpDQotICAgICogQWRkZWQgYW4gb3B0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBCTiBhc3NlbWJseSBjb2RlDQotICAgICogVXBkYXRlZCByc2FfY2hlY2tfcHJpdmtleSgpIHRvIHZlcmlmeSB0aGF0IChEKkUpID0gMSAlIChQLTEpKihRLTEpDQotICAgICogRGlzYWJsZWQgb2Jzb2xldGUgaGFzaCBmdW5jdGlvbnMgYnkgZGVmYXVsdCAoTUQyLCBNRDQpOyB1cGRhdGVkDQotICAgICAgc2VsZnRlc3QgYW5kIGJlbmNobWFyayB0byBub3QgdGVzdCBjaXBoZXJzIHRoYXQgaGF2ZSBiZWVuIGRpc2FibGVkDQotICAgICogVXBkYXRlZCB4NTA5cGFyc2VfY2VydF9pbmZvKCkgdG8gY29ycmVjdGx5IGRpc3BsYXkgYnl0ZSAwIG9mIHRoZQ0KLSAgICAgIHNlcmlhbCBudW1iZXIsIHNldHVwIGNvcnJlY3Qgc2VydmVyIHBvcnQgaW4gdGhlIHNzbCBjbGllbnQgZXhhbXBsZQ0KLSAgICAqIEZpeGVkIGEgY3JpdGljYWwgZGVuaWFsLW9mLXNlcnZpY2Ugd2l0aCBYLjUwOSBjZXJ0LiB2ZXJpZmljYXRpb246DQotICAgICAgcGVlciBtYXkgY2F1c2UgeHlzc2wgdG8gbG9vcCBpbmRlZmluaXRlbHkgYnkgc2VuZGluZyBhIGNlcnRpZmljYXRlDQotICAgICAgZm9yIHdoaWNoIHRoZSBSU0Egc2lnbmF0dXJlIGNoZWNrIGZhaWxzIChidWcgcmVwb3J0ZWQgYnkgQmVub2l0KQ0KLSAgICAqIEFkZGVkIHRlc3QgdmVjdG9ycyBmb3I6IEFFUy1DQkMsIEFFUy1DRkIsIERFUy1DQkMgYW5kIDNERVMtQ0JDLA0KLSAgICAgIEhNQUMtTUQ1LCBITUFDLVNIQTEsIEhNQUMtU0hBLTI1NiwgSE1BQy1TSEEtMzg0LCBhbmQgSE1BQy1TSEEtNTEyDQotICAgICogRml4ZWQgSE1BQy1TSEEtMzg0IGFuZCBITUFDLVNIQS01MTIgKHRoYW5rcyB0byBKb3NoIFNpbnlraW4pDQotICAgICogTW9kaWZpZWQgc3NsX3BhcnNlX2NsaWVudF9rZXlfZXhjaGFuZ2UoKSB0byBwcm90ZWN0IGFnYWluc3QNCi0gICAgICBEYW5pZWwgQmxlaWNoZW5iYWNoZXIgYXR0YWNrIG9uIFBLQ1MjMSB2MS41IHBhZGRpbmcsIGFzIHdlbGwNCi0gICAgICBhcyB0aGUgS2xpbWEtUG9rb3JueS1Sb3NhIGV4dGVuc2lvbiBvZiBCbGVpY2hlbmJhY2hlcidzIGF0dGFjaw0KLSAgICAqIFVwZGF0ZWQgcnNhX2dlbl9rZXkoKSBzbyB0aGF0IGN0eC0+TiBpcyBhbHdheXMgbmJpdHMgaW4gc2l6ZQ0KLSAgICAqIEZpeGVkIGFzc2VtYmx5IFBQQyBjb21waWxhdGlvbiBlcnJvcnMgb24gTWFjIE9TIFgsIHRoYW5rcyB0bw0KLSAgICAgIERhdmlkIEJhcnJldHQgYW5kIER1c2FuIFNlbWVuDQotDQotPSBWZXJzaW9uIDAuOCByZWxlYXNlZCBvbiAyMDA3LTEwLTIwDQotDQotICAgICogTW9kaWZpZWQgdGhlIEhNQUMgZnVuY3Rpb25zIHRvIGhhbmRsZSBrZXlzIGxhcmdlcg0KLSAgICAgIHRoYW4gNjQgYnl0ZXMsIHRoYW5rcyB0byBTdGVwaGFuZSBEZXNuZXV4IGFuZCBnYXJ5IG5nDQotICAgICogRml4ZWQgc3NsX3JlYWRfcmVjb3JkKCkgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBoYW5kc2hha2UNCi0gICAgICBtZXNzYWdlIGRpZ2VzdHMsIHdoaWNoIGZpeGVzIElFNi9JRTcgY2xpZW50IGF1dGhlbnRpY2F0aW9uDQotICAgICogQ2xlYW5lZCB1cCB0aGUgWFlTU0wqICNkZWZpbmVzLCBzdWdnZXN0ZWQgYnkgQXpyaWVsIEZhc3Rlbg0KLSAgICAqIEZpeGVkIG5ldF9yZWN2KCksIHRoYW5rcyB0byBMb3JlbnogU2Nob3JpIGFuZCBFZ29uIEtvY2phbg0KLSAgICAqIEFkZGVkIHVzZXItZGVmaW5lZCBjYWxsYmFja3MgZm9yIGhhbmRsaW5nIEkvTyBhbmQgc2Vzc2lvbnMNCi0gICAgKiBBZGRlZCBsb3RzIG9mIGRlYnVnZ2luZyBvdXRwdXQgaW4gdGhlIFNTTC9UTFMgZnVuY3Rpb25zDQotICAgICogQWRkZWQgcHJlbGltaW5hcnkgWC41MDkgY2VydC4gd3JpdGluZyBieSBQYXNjYWwgVml6ZWxpDQotICAgICogQWRkZWQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgdGhlIFZJQSBQYWRMb2NrIHJvdXRpbmVzDQotICAgICogQWRkZWQgQUVTLUNGQiBtb2RlIG9mIG9wZXJhdGlvbiwgY29udHJpYnV0ZWQgYnkgY2htaWtlDQotICAgICogQWRkZWQgYW4gU1NML1RMUyBzdHJlc3MgdGVzdGluZyBwcm9ncmFtIChzc2xfdGVzdC5jKQ0KLSAgICAqIFVwZGF0ZWQgdGhlIFJTQSBQS0NTIzEgY29kZSB0byBhbGxvdyBjaG9vc2luZyBiZXR3ZWVuDQotICAgICAgUlNBX1BVQkxJQyBhbmQgUlNBX1BSSVZBVEUsIGFzIHN1Z2dlc3RlZCBieSBEYXZpZCBCYXJyZXR0DQotICAgICogVXBkYXRlZCBzc2xfcmVhZCgpIHRvIHNraXAgMC1sZW5ndGggcmVjb3JkcyBmcm9tIE9wZW5TU0wNCi0gICAgKiBGaXhlZCB0aGUgbWFrZSBpbnN0YWxsIHRhcmdldCB0byBjb21wbHkgd2l0aCAqQlNEIG1ha2UNCi0gICAgKiBGaXhlZCBhIGJ1ZyBpbiBtcGlfcmVhZF9iaW5hcnkoKSBvbiA2NC1iaXQgcGxhdGZvcm1zDQotICAgICogbXBpX2lzX3ByaW1lKCkgc3BlZWR1cHMsIHRoYW5rcyB0byBLZXZpbiBNY0xhdWdobGluDQotICAgICogRml4ZWQgYSBsb25nIHN0YW5kaW5nIG1lbW9yeSBsZWFrIGluIG1waV9pc19wcmltZSgpDQotICAgICogUmVwbGFjZWQgcmVhbGxvYyB3aXRoIG1hbGxvYyBpbiBtcGlfZ3JvdygpLCBhbmQgc2V0DQotICAgICAgdGhlIHNpZ24gb2YgemVybyBhcyBwb3NpdGl2ZSBpbiBtcGlfaW5pdCgpIChyZXBvcnRlZA0KLSAgICAgIGJ5IEpvbmF0aGFuIE0uIE1jQ3VuZSkNCi0NCi09IFZlcnNpb24gMC43IHJlbGVhc2VkIG9uIDIwMDctMDctMDcNCi0NCi0gICAgKiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTWljcm9CbGF6ZSBzb2Z0LWNvcmUgcHJvY2Vzc29yDQotICAgICogRml4ZWQgYSBidWcgaW4gc3NsX3Rscy5jIHdoaWNoIHNvbWV0aW1lcyBwcmV2ZW50ZWQgU1NMDQotICAgICAgY29ubmVjdGlvbnMgZnJvbSBiZWluZyBlc3RhYmxpc2hlZCB3aXRoIG5vbi1ibG9ja2luZyBJL08NCi0gICAgKiBGaXhlZCBhIGNvdXBsZSBidWdzIGluIHRoZSBWUzYgYW5kIFVOSVggTWFrZWZpbGVzDQotICAgICogRml4ZWQgdGhlICJQSUMgcmVnaXN0ZXIgZWJ4IGNsb2JiZXJlZCBpbiBhc20iIGJ1Zw0KLSAgICAqIEFkZGVkIEhNQUMgc3RhcnRzL3VwZGF0ZS9maW5pc2ggc3VwcG9ydCBmdW5jdGlvbnMNCi0gICAgKiBBZGRlZCB0aGUgU0hBLTIyNCwgU0hBLTM4NCBhbmQgU0hBLTUxMiBoYXNoIGZ1bmN0aW9ucw0KLSAgICAqIEZpeGVkIHRoZSBuZXRfc2V0XypibG9jayByb3V0aW5lcywgdGhhbmtzIHRvIEFuZHJlYXMNCi0gICAgKiBBZGRlZCBhIGZldyBkZW1vbnN0cmF0aW9uIHByb2dyYW1zOiBtZDVzdW0sIHNoYTFzdW0sDQotICAgICAgZGhfY2xpZW50LCBkaF9zZXJ2ZXIsIHJzYV9nZW5rZXksIHJzYV9zaWduLCByc2FfdmVyaWZ5DQotICAgICogQWRkZWQgbmV3IGJpZ251bSBpbXBvcnQgYW5kIGV4cG9ydCBoZWxwZXIgZnVuY3Rpb25zDQotICAgICogUmV3cm90ZSBSRUFETUUudHh0IGluIHByb2dyYW0vc3NsL2NhIHRvIGJldHRlciBleHBsYWluDQotICAgICAgaG93IHRvIGNyZWF0ZSBhIHRlc3QgUEtJDQotDQotPSBWZXJzaW9uIDAuNiByZWxlYXNlZCBvbiAyMDA3LTA0LTAxDQotDQotICAgICogQ2lwaGVycyB1c2VkIGluIFNTTC9UTFMgY2FuIG5vdyBiZSBkaXNhYmxlZCBhdCBjb21waWxlDQotICAgICAgdGltZSwgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50IG9uIGVtYmVkZGVkIHN5c3RlbXMNCi0gICAgKiBBZGRlZCBtdWx0aXBseSBhc3NlbWJseSBjb2RlIGZvciB0aGUgVHJpQ29yZSBhbmQgbW9kaWZpZWQNCi0gICAgICBoYXZlZ2Vfc3RydWN0IGZvciB0aGlzIHByb2Nlc3NvciwgdGhhbmtzIHRvIERhdmlkIFBhdGnxbw0KLSAgICAqIEFkZGVkIG11bHRpcGx5IGFzc2VtYmx5IGNvZGUgZm9yIDY0LWJpdCBQb3dlclBDcywNCi0gICAgICB0aGFua3MgdG8gUGVraW5nIFVuaXZlcnNpdHkgYW5kIHRoZSBPU1UgT3BlbiBTb3VyY2UgTGFiDQotICAgICogQWRkZWQgZXhwZXJpbWVudGFsIHN1cHBvcnQgb2YgUXVhbnR1bSBDcnlwdG9ncmFwaHkNCi0gICAgKiBBZGRlZCBzdXBwb3J0IGZvciBhdXRvY29uZiwgY29udHJpYnV0ZWQgYnkgQXJuYXVkIENvcm5ldA0KLSAgICAqIEZpeGVkICJsb25nIGxvbmciIGNvbXBpbGF0aW9uIGlzc3VlcyBvbiBJQS02NCBhbmQgUFBDNjQNCi0gICAgKiBGaXhlZCBhIGJ1ZyBpbnRyb2R1Y2VkIGluIHh5c3NsLTAuNS90aW1pbmcuYzogaGFyZGNsb2NrDQotICAgICAgd2FzIG5vdCBiZWluZyBjb3JyZWN0bHkgZGVmaW5lZCBvbiBBUk0gYW5kIE1JUFMNCi0NCi09IFZlcnNpb24gMC41IHJlbGVhc2VkIG9uIDIwMDctMDMtMDENCi0NCi0gICAgKiBBZGRlZCBtdWx0aXBseSBhc3NlbWJseSBjb2RlIGZvciBTUEFSQyBhbmQgQWxwaGENCi0gICAgKiBBZGRlZCAoYmV0YSkgc3VwcG9ydCBmb3Igbm9uLWJsb2NraW5nIEkvTyBvcGVyYXRpb25zDQotICAgICogSW1wbGVtZW50ZWQgc2Vzc2lvbiByZXN1bWluZyBhbmQgY2xpZW50IGF1dGhlbnRpY2F0aW9uDQotICAgICogRml4ZWQgc29tZSBwb3J0YWJpbGl0eSBpc3N1ZXMgb24gV2luQ0UsIE1JTklYIDMsIFBsYW45DQotICAgICAgKHRoYW5rcyB0byBCZW5qYW1pbiBOZXdtYW4pLCBIUC1VWCwgRnJlZUJTRCBhbmQgU29sYXJpcw0KLSAgICAqIEltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgRURIIGtleSBleGNoYW5nZQ0KLSAgICAqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIHZhbGlkIHBhY2tldHMgd2l0aCBhIHBheWxvYWQNCi0gICAgICBzaXplIG9mIDE2Mzg0IGJ5dGVzIHRvIGJlIHJlamVjdGVkDQotDQotPSBWZXJzaW9uIDAuNCByZWxlYXNlZCBvbiAyMDA3LTAyLTAxDQotDQotICAgICogQWRkZWQgc3VwcG9ydCBmb3IgRXBoZW1lcmFsIERpZmZpZS1IZWxsbWFuIGtleSBleGNoYW5nZQ0KLSAgICAqIEFkZGVkIG11bHRpcGx5IGFzbSBjb2RlIGZvciBTU0UyLCBBUk0sIFBQQywgTUlQUyBhbmQgTTY4Sw0KLSAgICAqIFZhcmlvdXMgaW1wcm92ZW1lbnQgdG8gdGhlIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gY29kZQ0KLSAgICAqIFJld3JvdGUgdGhlIGhlYWRlcnMgdG8gZ2VuZXJhdGUgdGhlIEFQSSBkb2NzIHdpdGggZG94eWdlbg0KLSAgICAqIEZpeGVkIGEgYnVnIGluIHNzbF9lbmNyeXB0X2J1ZiAoaW5jb3JyZWN0IHBhZGRpbmcgd2FzDQotICAgICAgZ2VuZXJhdGVkKSBhbmQgaW4gc3NsX3BhcnNlX2NsaWVudF9oZWxsbyAobWF4LiBjbGllbnQNCi0gICAgICB2ZXJzaW9uIHdhcyBub3QgcHJvcGVybHkgc2V0KSwgdGhhbmtzIHRvIERpZGllciBSZWJlaXgNCi0gICAgKiBGaXhlZCBhbm90aGVyIGJ1ZyBpbiBzc2xfcGFyc2VfY2xpZW50X2hlbGxvOiBjbGllbnRzIHdpdGgNCi0gICAgICBjaXBoZXJsaXN0cyBsYXJnZXIgdGhhbiA5NiBieXRlcyB3ZXJlIGluY29ycmVjdGx5IHJlamVjdGVkDQotICAgICogRml4ZWQgYSBjb3VwbGUgbWVtb3J5IGxlYWsgaW4geDUwOV9yZWFkLmMNCi0NCi09IFZlcnNpb24gMC4zIHJlbGVhc2VkIG9uIDIwMDctMDEtMDENCi0NCi0gICAgKiBBZGRlZCBzZXJ2ZXItc2lkZSBTU0x2MyBhbmQgVExTdjEuMCBzdXBwb3J0DQotICAgICogTXVsdGlwbGUgZml4ZXMgdG8gZW5oYW5jZSB0aGUgY29tcGF0aWJpbGl0eSB3aXRoIGcrKywNCi0gICAgICB0aGFua3MgdG8gWG9z6SBBbnTzbiBPdGVybyBGZXJyZWlyYQ0KLSAgICAqIEZpeGVkIGEgYnVnIGluIHRoZSBDQkMgY29kZSwgdGhhbmtzIHRvIGRvd3N0OyBhbHNvLA0KLSAgICAgIHRoZSBiaWdudW0gY29kZSBpcyBubyBsb25nZXIgZGVwZW5kYW50IG9uIGxvbmcgbG9uZw0KLSAgICAqIFVwZGF0ZWQgcnNhX3BrY3MxX3NpZ24gdG8gaGFuZGxlIGFyYml0cmFyeSBsYXJnZSBpbnB1dHMNCi0gICAgKiBVcGRhdGVkIHRpbWluZy5jIGZvciBpbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggaTM4Ng0KLSAgICAgIGFuZCA0ODYgcHJvY2Vzc29ycywgdGhhbmtzIHRvIEFybmF1ZCBDb3JuZXQNCi0NCi09IFZlcnNpb24gMC4yIHJlbGVhc2VkIG9uIDIwMDYtMTItMDENCi0NCi0gICAgKiBVcGRhdGVkIHRpbWluZy5jIHRvIHN1cHBvcnQgQVJNIGFuZCBNSVBTIGFyY2gNCi0gICAgKiBVcGRhdGVkIHRoZSBNUEkgY29kZSB0byBzdXBwb3J0IDgwODYgb24gTVNWQyAxLjUNCi0gICAgKiBBZGRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhdCB0aGUgdG9wIG9mIGhhdmVnZS5oDQotICAgICogRml4ZWQgYSBidWcgaW4gc2hhMl9obWFjLCB0aGFua3MgdG8gbmV3c29mdC9XZW5mYW5nIFpoYW5nDQotICAgICogRml4ZWQgYSBidWcgcmVwb3J0ZWQgYnkgQWRyaWFuIFL8ZWdzZWdnZXIgaW4geDUwOV9yZWFkX2tleQ0KLSAgICAqIEZpeGVkIGEgYnVnIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGF1dGVyIGluIHNzbF9yZWFkX3JlY29yZA0KLSAgICAqIEZpeGVkIGEgYnVnIGluIHJzYV9jaGVja19wcml2a2V5IHRoYXQgd291bGQgd3JvbmdseSBjYXVzZQ0KLSAgICAgIHZhbGlkIFJTQSBrZXlzIHRvIGJlIGRpc21pc3NlZCAodGhhbmtzIHRvIG9sZHdvbGYpDQotICAgICogRml4ZWQgYSBidWcgaW4gbXBpX2lzX3ByaW1lIHRoYXQgY2F1c2VkIHNvbWUgcHJpbWVzIHRvIGZhaWwNCi0gICAgICB0aGUgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0DQotDQotICAgIEknZCBhbHNvIGxpa2UgdG8gdGhhbmsgWW91buhzIEhhZnJpIGZvciB0aGUgQ1JVWCBsaW51eCBwb3J0LA0KLSAgICBLaGFsaWwgUGV0aXQgd2hvIGFkZGVkIFh5U1NMIGludG8gcGtnc3JjIGFuZCBBcm5hdWQgQ29ybmV0DQotICAgIHdobyBtYWludGFpbnMgdGhlIERlYmlhbiBwYWNrYWdlIDotKQ0KLQ0KLT0gVmVyc2lvbiAwLjEgcmVsZWFzZWQgb24gMjAwNi0xMS0wMQ0KLQ0KK1BvbGFyU1NMIENoYW5nZUxvZworCis9IFZlcnNpb24gMC4xNC4xIHJlbGVhc2VkIG9uIDIwMTEtMDItMjIKK0J1Z2ZpeGVzCisgICAqIENvcnJlY3RlZCBwYXJzaW5nIG9mIFVUQ1RpbWUgZGF0ZXMgYmVmb3JlIDE5OTAgYW5kCisgICAgIGFmdGVyIDE5NTAKKyAgICogU3VwcG9ydCBtb3JlIGV4b3RpYyBPSUQncyB3aGVuIHBhcnNpbmcgY2VydGlmaWNhdGVzCisgICAJIChmb3VuZCBieSBNYWRzIEtpaWxlcmljaCkKKyAgICogU3VwcG9ydCBtb3JlIGV4b3RpYyBuYW1lIHJlcHJlc2VudGF0aW9ucyB3aGVuIHBhcnNpbmcKKyAgICAgY2VydGlmaWNhdGVzIChmb3VuZCBieSBNYWRzIEtpaWxlcmljaCkKKyAgICogUmVwbGFjZWQgdGhlIGV4cGlyZWQgdGVzdCBjZXJ0aWZpY2F0ZXMKKyAgICogRG8gbm90IGJhaWwgb3V0IGlmIG5vIGNsaWVudCBjZXJ0aWZpY2F0ZSBzcGVjaWZpZWQuIFRyeQorICAgICB0byBuZWdvdGlhdGUgYW5vbnltb3VzIGNvbm5lY3Rpb24gKEZpeGVzIHRpY2tldCAjMTIsCisJIGZvdW5kIGJ5IEJvcmlzIEtyYXNub3Zza2l5KQorCis9IFZlcnNpb24gMC4xNC4wIHJlbGVhc2VkIG9uIDIwMTAtMDgtMTYKK0ZlYXR1cmVzCisgICAqIEFkZGVkIHN1cHBvcnQgZm9yIFNTTF9FREhfUlNBX0FFU18xMjhfU0hBIGFuZAorICAgICBTU0xfRURIX1JTQV9DQU1FTExJQV8xMjhfU0hBIGNpcGhlcnN1aXRlcworICAgKiBBZGRlZCBjb21waWxlLXRpbWUgYW5kIHJ1bi10aW1lIHZlcnNpb24gaW5mb3JtYXRpb24KKyAgICogRXhwYW5kZWQgc3NsX2NsaWVudDIgYXJndW1lbnRzIGZvciBtb3JlIGZsZXhpYmlsaXR5CisgICAqIEFkZGVkIHN1cHBvcnQgZm9yIFRMUyB2MS4xCisKK0NoYW5nZXMKKyAgICogTWFkZSBNYWtlZmlsZSBjbGVhbmVyCisgICAqIFJlbW92ZWQgZGVwZW5kZW5jeSBvbiByYW5kKCkgaW4gcnNhX3BrY3MxX2VuY3J5cHQoKS4KKyAgICAgTm93IHVzaW5nIHJhbmRvbSBmdWN0aW9uIHByb3ZpZGVkIHRvIGZ1bmN0aW9uIGFuZAorCSBjaGFuZ2VkIHRoZSBwcm90b3R5cGUgb2YgcnNhX3BrY3MxX2VuY3J5cHQoKSwKKwkgcnNhX2luaXQoKSBhbmQgcnNhX2dlbl9rZXkoKS4KKyAgICogU29tZSBTU0wgZGVmaW5lcyB3ZXJlIHJlbmFtZWQgaW4gb3JkZXIgdG8gYXZvaWQKKyAgICAgZnV0dXJlIGNvbmZ1c2lvbgorCitCdWcgZml4ZXMKKyAgICogRml4ZWQgQ01ha2Ugb3V0IG9mIHNvdXJjZSBidWlsZCBmb3IgdGVzdHMgKGZvdW5kIGJ5CisgICAgIGtrZXJ0KQorICAgKiByc2FfY2hlY2tfcHJpdmF0ZSgpIG5vdyBzdXBwb3J0cyBQS0NTMXYyIGtleXMgYXMgd2VsbAorICAgKiBGaXhlZCBkZWFkbG9jayBpbiByc2FfcGtjczFfZW5jcnlwdCgpIG9uIGZhaWxpbmcgcmFuZG9tCisgICAgIGdlbmVyYXRvcgorCis9IFZlcnNpb24gMC4xMy4xIHJlbGVhc2VkIG9uIDIwMTAtMDMtMjQKK0J1ZyBmaXhlcworICAgKiBGaXhlZCBNYWtlZmlsZSBpbiBsaWJyYXJ5IHRoYXQgd2FzIG1pc3Rha2VubHkgbWVyZ2VkCisgICAqIEFkZGVkIG1pc3NpbmcgY29uc3Qgc3RyaW5nIGZpeGVzCisKKz0gVmVyc2lvbiAwLjEzLjAgcmVsZWFzZWQgb24gMjAxMC0wMy0yMQorRmVhdHVyZXMKKyAgICogQWRkZWQgb3B0aW9uIHBhcnNpbmcgZm9yIGhvc3QgYW5kIHBvcnQgc2VsZWN0aW9uIHRvCisgICAgIHNzbF9jbGllbnQyCisgICAqIEFkZGVkIHN1cHBvcnQgZm9yIEdlbmVyYWxpemVkVGltZSBpbiBYNTA5IHBhcnNpbmcKKyAgICogQWRkZWQgY2VydF9hcHAgcHJvZ3JhbSB0byBhbGxvdyBlYXN5IHJlYWRpbmcgYW5kCisgICAgIHByaW50aW5nIG9mIFg1MDkgY2VydGlmaWNhdGVzIGZyb20gZmlsZSBvciBTU0wKKyAgICAgY29ubmVjdGlvbi4KKworQ2hhbmdlcworICAgKiBBZGRlZCBjb25zdCBjb3JyZWN0bmVzcyBmb3IgbWFpbiBjb2RlIGJhc2UKKyAgICogWDUwOSBzaWduYXR1cmUgYWxnb3JpdGhtIGRldGVybWluYXRpb24gaXMgbm93CisgICAgIGluIGEgZnVuY3Rpb24gdG8gYWxsb3cgZWFzeSBmdXR1cmUgZXhwYW5zaW9uCisgICAqIENoYW5nZWQgc3ltbWV0cmljIGNpcGhlciBmdW5jdGlvbnMgdG8KKyAgICAgaWRlbnRpY2FsIGludGVyZmFjZSAocmV0dXJuaW5nIGludCByZXN1bHQgdmFsdWVzKQorICAgKiBDaGFuZ2VkIEFSQzQgdG8gdXNlIHNlcGVyYXRlIGlucHV0L291dHB1dCBidWZmZXIKKyAgICogQWRkZWQgcmVzZXQgZnVuY3Rpb24gZm9yIEhNQUMgY29udGV4dCBhcyBzcGVlZC11cAorICAgICBmb3Igc3BlY2lmaWMgdXNlLWNhc2VzCisKK0J1ZyBmaXhlcworICAgKiBGaXhlZCBidWcgcmVzdWx0aW5nIGluIGZhaWx1cmUgdG8gc2VuZCB0aGUgbGFzdAorICAgICBjZXJ0aWZpY2F0ZSBpbiB0aGUgY2hhaW4gaW4gc3NsX3dyaXRlX2NlcnRpZmljYXRlKCkgYW5kCisgICAgIHNzbF93cml0ZV9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KCkgKGZvdW5kIGJ5IGZhdGJvYikKKyAgICogQWRkZWQgc21hbGwgZml4ZXMgZm9yIGNvbXBpbGVyIHdhcm5pbmdzIG9uIGEgTWFjCisgICAgIChmb3VuZCBieSBGcmFuayBkZSBCcmFiYW5kZXIpCisgICAqIEZpeGVkIGFsZ29yaXRobWljIGJ1ZyBpbiBtcGlfaXNfcHJpbWUoKSAoZm91bmQgYnkKKyAgICAgU21iYXQgVG9ub3lhbikKKworPSBWZXJzaW9uIDAuMTIuMSByZWxlYXNlZCBvbiAyMDA5LTEwLTA0CitDaGFuZ2VzCisgICAqIENvdmVyYWdlIHRlc3QgZGVmaW5pdGlvbnMgbm93IHN1cHBvcnQgJ2RlcGVuZHNfb24nCisgICAgIHRhZ2dpbmcgc3lzdGVtLgorICAgKiBUZXN0cyByZXF1aXJpbmcgc3BlY2lmaWMgaGFzaGluZyBhbGdvcml0aG1zIG5vdyBob25vcgorICAgICB0aGUgZGVmaW5lcy4KKworQnVnIGZpeGVzCisgICAqIENoYW5nZWQgdHlwbyBpbiAjaWZkZWYgaW4geDUwOXBhcnNlLmMgKGZvdW5kCisgICAgIGJ5IEVkdWFyZG8pCisKKz0gVmVyc2lvbiAwLjEyLjAgcmVsZWFzZWQgb24gMjAwOS0wNy0yOAorRmVhdHVyZXMKKyAgICogQWRkZWQgQ01ha2UgbWFrZWZpbGVzIGFzIGFsdGVybmF0aXZlIHRvIHJlZ3VsYXIgTWFrZWZpbGVzLgorICAgKiBBZGRlZCBwcmVsaW1pbmFyeSBDb2RlIENvdmVyYWdlIHRlc3RzIGZvciBBRVMsIEFSQzQsCisgICAgIEJhc2U2NCwgTVBJLCBTSEEtZmFtaWx5LCBNRC1mYW1pbHksIEhNQUMtU0hBLWZhbWlseSwKKyAgICAgQ2FtZWxsaWEsIERFUywgMy1ERVMsIFJTQSBQS0NTIzEsIFhURUEsIERpZmZpZS1IZWxsbWFuCisgICAgIGFuZCBYNTA5cGFyc2UuCisKK0NoYW5nZXMKKyAgICogRXJyb3IgY29kZXMgYXJlIG5vdCAobmVjZXNzYXJpbHkpIG5lZ2F0aXZlLiBLZWVwCisgICAgIHRoaXMgaXMgbWluZCB3aGVuIGNoZWNraW5nIGZvciBlcnJvcnMuCisgICAqIFJTQV9SQVcgcmVuYW1lZCB0byBTSUdfUlNBX1JBVyBmb3IgY29uc2lzdGVuY3kuCisgICAqIEZpeGVkIHR5cG8gaW4gbmFtZSBvZiBQT0xBUlNTTF9FUlJfUlNBX09VVFBVVF9UT09fTEFSR0UuCisgICAqIENoYW5nZWQgaW50ZXJmYWNlIGZvciBBRVMgYW5kIENhbWVsbGlhIHNldGtleSBmdW5jdGlvbnMKKyAgICAgdG8gaW5kaWNhdGUgaW52YWxpZCBrZXkgbGVuZ3Rocy4KKworQnVnIGZpeGVzCisgICAqIEZpeGVkIGluY2x1ZGUgbG9jYXRpb24gb2YgZW5kaWFuLmggb24gRnJlZUJTRCAoZm91bmQgYnkKKyAgICAgR2FicmllbCkKKyAgICogRml4ZWQgaW5jbHVkZSBsb2NhdGlvbiBvZiBlbmRpYW4uaCBhbmQgbmFtZSBjbGFzaCBvbgorICAgICBBcHBsZXMgKGZvdW5kIGJ5IE1hcnRpbiB2YW4gSGVuc2JlcmdlbikKKyAgICogRml4ZWQgSE1BQy1NRDIgYnkgbW9kaWZ5aW5nIG1kMl9zdGFydHMoKSwgc28gdGhhdCB0aGUKKyAgICAgcmVxdWlyZWQgSE1BQyBpcGFkIGFuZCBvcGFkIHZhcmlhYmxlcyBhcmUgbm90IGNsZWFyZWQuCisgICAgIChmb3VuZCBieSBjb2RlIGNvdmVyYWdlIHRlc3RzKQorICAgKiBQcmV2ZW50ZWQgdXNlIG9mIGxvbmcgbG9uZyBpbiBiaWdudW0gaWYgCisgICAgIFBPTEFSU1NMX0hBVkVfTE9OR0xPTkcgbm90IGRlZmluZWQgKGZvdW5kIGJ5IEdpbGVzCisgICAgIEJhdGhnYXRlKS4KKyAgICogRml4ZWQgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIG5lZ2F0aXZlIHN0cmluZ3MgaW4KKyAgICAgbXBpX3JlYWRfc3RyaW5nKCkgKGZvdW5kIGJ5IGNvZGUgY292ZXJhZ2UgdGVzdHMpLgorICAgKiBGaXhlZCBzZWdmYXVsdCBvbiBoYW5kbGluZyBlbXB0eSByc2FfY29udGV4dCBpbgorICAgICByc2FfY2hlY2tfcHVia2V5KCkgYW5kIHJzYV9jaGVja19wcml2a2V5KCkgKGZvdW5kIGJ5CisgICAgIGNvZGUgY292ZXJhZ2UgdGVzdHMpLgorICAgKiBGaXhlZCBpbmNvcnJlY3QgaGFuZGxpbmcgb2Ygb25lIHNpbmdsZSBuZWdhdGl2ZSBpbnB1dAorICAgICB2YWx1ZSBpbiBtcGlfYWRkX2FicygpIChmb3VuZCBieSBjb2RlIGNvdmVyYWdlIHRlc3RzKS4KKyAgICogRml4ZWQgaW5jb3JyZWN0IGhhbmRsaW5nIG9mIG5lZ2F0aXZlIGZpcnN0IGlucHV0CisgICAgIHZhbHVlIGluIG1waV9zdWJfYWJzKCkgKGZvdW5kIGJ5IGNvZGUgY292ZXJhZ2UgdGVzdHMpLgorICAgKiBGaXhlZCBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgbmVnYXRpdmUgZmlyc3QgaW5wdXQKKyAgICAgdmFsdWUgaW4gbXBpX21vZF9tcGkoKSBhbmQgbXBpX21vZF9pbnQoKS4gUmVzdWx0aW5nCisgICAgIGNoYW5nZSBhbHNvIGFmZmVjdHMgbXBpX3dyaXRlX3N0cmluZygpIChmb3VuZCBieSBjb2RlCisgICAgIGNvdmVyYWdlIHRlc3RzKS4KKyAgICogQ29ycmVjdGVkIGlzX3ByaW1lKCkgcmVzdWx0cyBmb3IgMCwgMSBhbmQgMiAoZm91bmQgYnkKKyAgICAgY29kZSBjb3ZlcmFnZSB0ZXN0cykuCisgICAqIEZpeGVkIENhbWVsbGlhIGFuZCBYVEVBIGZvciA2NC1iaXQgV2luZG93cyBzeXN0ZW1zLgorCis9IFZlcnNpb24gMC4xMS4xIHJlbGVhc2VkIG9uIDIwMDktMDUtMTcKKyAgICogRml4ZWQgbWlzc2luZyBmdW5jdGlvbmFsaXR5IGZvciBTSEEtMjI0LCBTSEEtMjU2LCBTSEEzODQsCisgICAgIFNIQS01MTIgaW4gcnNhX3BrY3MxX3NpZ24oKQorCis9IFZlcnNpb24gMC4xMS4wIHJlbGVhc2VkIG9uIDIwMDktMDUtMDMKKyAgICogRml4ZWQgYSBidWcgaW4gbXBpX2djZCgpIHNvIHRoYXQgaXQgYWxzbyB3b3JrcyB3aGVuIGJvdGgKKyAgICAgaW5wdXQgbnVtYmVycyBhcmUgZXZlbiBhbmQgYWRkZWQgdGVzdGNhc2VzIHRvIGNoZWNrCisgICAgIChmb3VuZCBieSBQaWVycmUgSGFib3V6aXQpLgorICAgKiBBZGRlZCBzdXBwb3J0IGZvciBTSEEtMjI0LCBTSEEtMjU2LCBTSEEtMzg0IGFuZCBTSEEtNTEyCisgICAgIG9uZSB3YXkgaGFzaCBmdW5jdGlvbnMgd2l0aCB0aGUgUEtDUyMxIHYxLjUgc2lnbmluZyBhbmQKKyAgICAgdmVyaWZpY2F0aW9uLgorICAgKiBGaXhlZCBtaW5vciBidWcgcmVnYXJkaW5nIG1waV9nY2QgbG9jYXRlZCB3aXRoaW4gdGhlCisgICAgIFBPTEFSU1NMX0dFTlBSSU1FIGJsb2NrLgorICAgKiBGaXhlZCBtaW5vciBtZW1vcnkgbGVhayBpbiB4NTA5cGFyc2VfY3J0KCkgYW5kIGFkZGVkIGJldHRlcgorICAgICBoYW5kbGluZyBvZiAnZnVsbCcgY2VydGlmaWNhdGUgY2hhaW5zIChmb3VuZCBieSBNYXRoaWFzCisgICAgIE9sc3NvbikuCisgICAqIENlbnRyYWxpemVkIGZpbGUgb3BlbmluZyBhbmQgcmVhZGluZyBmb3IgeDUwOSBmaWxlcyBpbnRvCisgICAgIGxvYWRfZmlsZSgpCisgICAqIE1hZGUgZGVmaW5pdGlvbiBvZiBuZXRfaHRvbnMoKSBlbmRpYW4tY2xlYW4gZm9yIGJpZyBlbmRpYW4KKyAgICAgc3lzdGVtcyAoRm91bmQgYnkgR2Vybm90KS4KKyAgICogVW5kZWZpbmluZyBQT0xBUlNTTF9IQVZFX0FTTSBub3cgYWxzbyBoYW5kbGVzIHByZXZlbnRzIGFzbSBpbgorICAgICBwYWRsb2NrIGFuZCB0aW1pbmcgY29kZS4gCisgICAqIEZpeGVkIGFuIG9mZi1ieS1vbmUgYnVmZmVyIGFsbG9jYXRpb24gaW4gc3NsX3NldF9ob3N0bmFtZSgpCisgICAgIHJlc3BvbnNpYmxlIGZvciBjcmFzaGVzIGFuZCB1bndhbnRlZCBiZWhhdmlvdXIuCisgICAqIEFkZGVkIHN1cHBvcnQgZm9yIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdCAoQ1JMKSBwYXJzaW5nLgorICAgKiBBZGRlZCBzdXBwb3J0IGZvciBDUkwgcmV2b2NhdGlvbiB0byB4NTA5cGFyc2VfdmVyaWZ5KCkgYW5kCisgICAgIFNTTC9UTFMgY29kZS4KKyAgICogRml4ZWQgY29tcGF0aWJpbGl0eSBvZiBYVEVBIGFuZCBDYW1lbGxpYSBvbiBhIDY0LWJpdCBzeXN0ZW0KKyAgICAgKGZvdW5kIGJ5IEZlbGl4IHZvbiBMZWl0bmVyKS4KKworPSBWZXJzaW9uIDAuMTAuMCByZWxlYXNlZCBvbiAyMDA5LTAxLTEyCisgICAqIE1pZ3JhdGVkIFh5U1NMIHRvIFBvbGFyU1NMCisgICAqIEFkZGVkIFhURUEgc3ltbWV0cmljIGNpcGhlcgorICAgKiBBZGRlZCBDYW1lbGxpYSBzeW1tZXRyaWMgY2lwaGVyCisgICAqIEFkZGVkIHN1cHBvcnQgZm9yIGNpcGhlcnN1aXRlczogU1NMX1JTQV9DQU1FTExJQV8xMjhfU0hBLAorICAgICBTU0xfUlNBX0NBTUVMTElBXzI1Nl9TSEEgYW5kIFNTTF9FREhfUlNBX0NBTUVMTElBXzI1Nl9TSEEKKyAgICogRml4ZWQgZGFuZ2Vyb3VzIGJ1ZyB0aGF0IGNhbiBjYXVzZSBhIGhlYXAgb3ZlcmZsb3cgaW4KKyAgICAgcnNhX3BrY3MxX2RlY3J5cHQgKGZvdW5kIGJ5IENocmlzdG9waGUgRGV2aW5lKQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitYeVNTTCBDaGFuZ2VMb2cKKworPSBWZXJzaW9uIDAuOSByZWxlYXNlZCBvbiAyMDA4LTAzLTE2CisKKyAgICAqIEFkZGVkIHN1cHBvcnQgZm9yIGNpcGhlcnN1aXRlOiBTU0xfUlNBX0FFU18xMjhfU0hBCisgICAgKiBFbmFibGVkIHN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzIGJ5IGRlZmF1bHQgaW4gYWVzY3J5cHQyLmMKKyAgICAqIFByZWxpbWluYXJ5IG9wZW5zc2wgd3JhcHBlciBjb250cmlidXRlZCBieSBEYXZpZCBCYXJyZXR0CisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBzc2xfd3JpdGUoKSB0aGF0IGNhdXNlZCB0aGUgc2FtZSBwYXlsb2FkIHRvCisgICAgICBiZSBzZW50IHR3aWNlIGluIG5vbi1ibG9ja2luZyBtb2RlIHdoZW4gc2VuZCByZXR1cm5zIEVBR0FJTgorICAgICogRml4ZWQgc3NsX3BhcnNlX2NsaWVudF9oZWxsbygpOiBzZXNzaW9uIGlkIGFuZCBjaGFsbGVuZ2UgbXVzdAorICAgICAgbm90IGJlIHN3YXBwZWQgaW4gdGhlIFNTTHYyIENsaWVudEhlbGxvIChmb3VuZCBieSBHcmVnIFJvYnNvbikKKyAgICAqIEFkZGVkIHVzZXItZGVmaW5lZCBjYWxsYmFjayBkZWJ1ZyBmdW5jdGlvbiAoS3J5c3RpYW4gS29sb2R6aWVqKQorICAgICogQmVmb3JlIGZyZWVpbmcgYSBjZXJ0aWZpY2F0ZSwgcHJvcGVybHkgemVybyBvdXQgYWxsIGNlcnQuIGRhdGEKKyAgICAqIEZpeGVkIHRoZSAibW9kZSIgcGFyYW1ldGVyIHNvIHRoYXQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGFyZQorICAgICAgbm90IHN3YXBwZWQgb24gUGFkTG9jazsgYWxzbyBmaXhlZCBjb21waWxhdGlvbiBvbiBvbGRlciB2ZXJzaW9ucworICAgICAgb2YgZ2NjIChidWcgcmVwb3J0ZWQgYnkgRGF2aWQgQmFycmV0dCkKKyAgICAqIENvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2UgaW4gcGFkbG9ja194Y3J5cHRjYmMoKSB3aGVuIGlucHV0IG9yCisgICAgICBvdXB1dCBkYXRhIGlzIG5vbi1hbGlnbmVkIGJ5IGZhbGxpbmcgYmFjayB0byB0aGUgc29mdHdhcmUKKyAgICAgIGltcGxlbWVudGF0aW9uLCBhcyBWSUEgTmVoZW1pYWggY2Fubm90IGhhbmRsZSBub24tYWxpZ25lZCBidWZmZXJzCisgICAgKiBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIHg1MDlwYXJzZV9jcnQoKSB3aGljaCB3YXMgcmVwb3J0ZWQgYnkgR3JlZworICAgICAgUm9ic29uLUdhcnRoOyBzb21lIHg1MDl3cml0ZS5jIGZpeGVzIGJ5IFBhc2NhbCBWaXplbGksIHRoYW5rcyB0bworICAgICAgTWF0dGhldyBQYWdlIHdobyByZXBvcnRlZCBzZXZlcmFsIGJ1Z3MKKyAgICAqIEZpeGVkIHg1MDlfZ2V0X2V4dCgpIHRvIGFjY2VwdCBzb21lIHJhcmUgY2VydGlmaWNhdGVzIHdoaWNoIGhhdmUKKyAgICAgIGFuIElOVEVHRVIgaW5zdGVhZCBvZiBhIEJPT0xFQU4gZm9yIEJhc2ljQ29uc3RyYWludHM6OmNBLgorICAgICogQWRkZWQgc3VwcG9ydCBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIHRoZSBUTFMgImhvc3RuYW1lIiBleHRlbnNpb24KKyAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBEYXZpZCBQYXRpbm8pCisgICAgKiBNYWtlIHg1MDlwYXJzZV92ZXJpZnkoKSByZXR1cm4gQkFEQ0VSVF9DTl9NSVNNQVRDSCB3aGVuIGFuIGVtcHR5CisgICAgICBzdHJpbmcgaXMgcGFzc2VkIGFzIHRoZSBDTiAoYnVnIHJlcG9ydGVkIGJ5IHNwb29meSkKKyAgICAqIEFkZGVkIGFuIG9wdGlvbiB0byBlbmFibGUvZGlzYWJsZSB0aGUgQk4gYXNzZW1ibHkgY29kZQorICAgICogVXBkYXRlZCByc2FfY2hlY2tfcHJpdmtleSgpIHRvIHZlcmlmeSB0aGF0IChEKkUpID0gMSAlIChQLTEpKihRLTEpCisgICAgKiBEaXNhYmxlZCBvYnNvbGV0ZSBoYXNoIGZ1bmN0aW9ucyBieSBkZWZhdWx0IChNRDIsIE1ENCk7IHVwZGF0ZWQKKyAgICAgIHNlbGZ0ZXN0IGFuZCBiZW5jaG1hcmsgdG8gbm90IHRlc3QgY2lwaGVycyB0aGF0IGhhdmUgYmVlbiBkaXNhYmxlZAorICAgICogVXBkYXRlZCB4NTA5cGFyc2VfY2VydF9pbmZvKCkgdG8gY29ycmVjdGx5IGRpc3BsYXkgYnl0ZSAwIG9mIHRoZQorICAgICAgc2VyaWFsIG51bWJlciwgc2V0dXAgY29ycmVjdCBzZXJ2ZXIgcG9ydCBpbiB0aGUgc3NsIGNsaWVudCBleGFtcGxlCisgICAgKiBGaXhlZCBhIGNyaXRpY2FsIGRlbmlhbC1vZi1zZXJ2aWNlIHdpdGggWC41MDkgY2VydC4gdmVyaWZpY2F0aW9uOgorICAgICAgcGVlciBtYXkgY2F1c2UgeHlzc2wgdG8gbG9vcCBpbmRlZmluaXRlbHkgYnkgc2VuZGluZyBhIGNlcnRpZmljYXRlCisgICAgICBmb3Igd2hpY2ggdGhlIFJTQSBzaWduYXR1cmUgY2hlY2sgZmFpbHMgKGJ1ZyByZXBvcnRlZCBieSBCZW5vaXQpCisgICAgKiBBZGRlZCB0ZXN0IHZlY3RvcnMgZm9yOiBBRVMtQ0JDLCBBRVMtQ0ZCLCBERVMtQ0JDIGFuZCAzREVTLUNCQywKKyAgICAgIEhNQUMtTUQ1LCBITUFDLVNIQTEsIEhNQUMtU0hBLTI1NiwgSE1BQy1TSEEtMzg0LCBhbmQgSE1BQy1TSEEtNTEyCisgICAgKiBGaXhlZCBITUFDLVNIQS0zODQgYW5kIEhNQUMtU0hBLTUxMiAodGhhbmtzIHRvIEpvc2ggU2lueWtpbikKKyAgICAqIE1vZGlmaWVkIHNzbF9wYXJzZV9jbGllbnRfa2V5X2V4Y2hhbmdlKCkgdG8gcHJvdGVjdCBhZ2FpbnN0CisgICAgICBEYW5pZWwgQmxlaWNoZW5iYWNoZXIgYXR0YWNrIG9uIFBLQ1MjMSB2MS41IHBhZGRpbmcsIGFzIHdlbGwKKyAgICAgIGFzIHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mIEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrCisgICAgKiBVcGRhdGVkIHJzYV9nZW5fa2V5KCkgc28gdGhhdCBjdHgtPk4gaXMgYWx3YXlzIG5iaXRzIGluIHNpemUKKyAgICAqIEZpeGVkIGFzc2VtYmx5IFBQQyBjb21waWxhdGlvbiBlcnJvcnMgb24gTWFjIE9TIFgsIHRoYW5rcyB0bworICAgICAgRGF2aWQgQmFycmV0dCBhbmQgRHVzYW4gU2VtZW4KKworPSBWZXJzaW9uIDAuOCByZWxlYXNlZCBvbiAyMDA3LTEwLTIwCisKKyAgICAqIE1vZGlmaWVkIHRoZSBITUFDIGZ1bmN0aW9ucyB0byBoYW5kbGUga2V5cyBsYXJnZXIKKyAgICAgIHRoYW4gNjQgYnl0ZXMsIHRoYW5rcyB0byBTdGVwaGFuZSBEZXNuZXV4IGFuZCBnYXJ5IG5nCisgICAgKiBGaXhlZCBzc2xfcmVhZF9yZWNvcmQoKSB0byBwcm9wZXJseSB1cGRhdGUgdGhlIGhhbmRzaGFrZQorICAgICAgbWVzc2FnZSBkaWdlc3RzLCB3aGljaCBmaXhlcyBJRTYvSUU3IGNsaWVudCBhdXRoZW50aWNhdGlvbgorICAgICogQ2xlYW5lZCB1cCB0aGUgWFlTU0wqICNkZWZpbmVzLCBzdWdnZXN0ZWQgYnkgQXpyaWVsIEZhc3RlbgorICAgICogRml4ZWQgbmV0X3JlY3YoKSwgdGhhbmtzIHRvIExvcmVueiBTY2hvcmkgYW5kIEVnb24gS29jamFuCisgICAgKiBBZGRlZCB1c2VyLWRlZmluZWQgY2FsbGJhY2tzIGZvciBoYW5kbGluZyBJL08gYW5kIHNlc3Npb25zCisgICAgKiBBZGRlZCBsb3RzIG9mIGRlYnVnZ2luZyBvdXRwdXQgaW4gdGhlIFNTTC9UTFMgZnVuY3Rpb25zCisgICAgKiBBZGRlZCBwcmVsaW1pbmFyeSBYLjUwOSBjZXJ0LiB3cml0aW5nIGJ5IFBhc2NhbCBWaXplbGkKKyAgICAqIEFkZGVkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHRoZSBWSUEgUGFkTG9jayByb3V0aW5lcworICAgICogQWRkZWQgQUVTLUNGQiBtb2RlIG9mIG9wZXJhdGlvbiwgY29udHJpYnV0ZWQgYnkgY2htaWtlCisgICAgKiBBZGRlZCBhbiBTU0wvVExTIHN0cmVzcyB0ZXN0aW5nIHByb2dyYW0gKHNzbF90ZXN0LmMpCisgICAgKiBVcGRhdGVkIHRoZSBSU0EgUEtDUyMxIGNvZGUgdG8gYWxsb3cgY2hvb3NpbmcgYmV0d2VlbgorICAgICAgUlNBX1BVQkxJQyBhbmQgUlNBX1BSSVZBVEUsIGFzIHN1Z2dlc3RlZCBieSBEYXZpZCBCYXJyZXR0CisgICAgKiBVcGRhdGVkIHNzbF9yZWFkKCkgdG8gc2tpcCAwLWxlbmd0aCByZWNvcmRzIGZyb20gT3BlblNTTAorICAgICogRml4ZWQgdGhlIG1ha2UgaW5zdGFsbCB0YXJnZXQgdG8gY29tcGx5IHdpdGggKkJTRCBtYWtlCisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBtcGlfcmVhZF9iaW5hcnkoKSBvbiA2NC1iaXQgcGxhdGZvcm1zCisgICAgKiBtcGlfaXNfcHJpbWUoKSBzcGVlZHVwcywgdGhhbmtzIHRvIEtldmluIE1jTGF1Z2hsaW4KKyAgICAqIEZpeGVkIGEgbG9uZyBzdGFuZGluZyBtZW1vcnkgbGVhayBpbiBtcGlfaXNfcHJpbWUoKQorICAgICogUmVwbGFjZWQgcmVhbGxvYyB3aXRoIG1hbGxvYyBpbiBtcGlfZ3JvdygpLCBhbmQgc2V0CisgICAgICB0aGUgc2lnbiBvZiB6ZXJvIGFzIHBvc2l0aXZlIGluIG1waV9pbml0KCkgKHJlcG9ydGVkCisgICAgICBieSBKb25hdGhhbiBNLiBNY0N1bmUpCisKKz0gVmVyc2lvbiAwLjcgcmVsZWFzZWQgb24gMjAwNy0wNy0wNworCisgICAgKiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgTWljcm9CbGF6ZSBzb2Z0LWNvcmUgcHJvY2Vzc29yCisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBzc2xfdGxzLmMgd2hpY2ggc29tZXRpbWVzIHByZXZlbnRlZCBTU0wKKyAgICAgIGNvbm5lY3Rpb25zIGZyb20gYmVpbmcgZXN0YWJsaXNoZWQgd2l0aCBub24tYmxvY2tpbmcgSS9PCisgICAgKiBGaXhlZCBhIGNvdXBsZSBidWdzIGluIHRoZSBWUzYgYW5kIFVOSVggTWFrZWZpbGVzCisgICAgKiBGaXhlZCB0aGUgIlBJQyByZWdpc3RlciBlYnggY2xvYmJlcmVkIGluIGFzbSIgYnVnCisgICAgKiBBZGRlZCBITUFDIHN0YXJ0cy91cGRhdGUvZmluaXNoIHN1cHBvcnQgZnVuY3Rpb25zCisgICAgKiBBZGRlZCB0aGUgU0hBLTIyNCwgU0hBLTM4NCBhbmQgU0hBLTUxMiBoYXNoIGZ1bmN0aW9ucworICAgICogRml4ZWQgdGhlIG5ldF9zZXRfKmJsb2NrIHJvdXRpbmVzLCB0aGFua3MgdG8gQW5kcmVhcworICAgICogQWRkZWQgYSBmZXcgZGVtb25zdHJhdGlvbiBwcm9ncmFtczogbWQ1c3VtLCBzaGExc3VtLAorICAgICAgZGhfY2xpZW50LCBkaF9zZXJ2ZXIsIHJzYV9nZW5rZXksIHJzYV9zaWduLCByc2FfdmVyaWZ5CisgICAgKiBBZGRlZCBuZXcgYmlnbnVtIGltcG9ydCBhbmQgZXhwb3J0IGhlbHBlciBmdW5jdGlvbnMKKyAgICAqIFJld3JvdGUgUkVBRE1FLnR4dCBpbiBwcm9ncmFtL3NzbC9jYSB0byBiZXR0ZXIgZXhwbGFpbgorICAgICAgaG93IHRvIGNyZWF0ZSBhIHRlc3QgUEtJCisKKz0gVmVyc2lvbiAwLjYgcmVsZWFzZWQgb24gMjAwNy0wNC0wMQorCisgICAgKiBDaXBoZXJzIHVzZWQgaW4gU1NML1RMUyBjYW4gbm93IGJlIGRpc2FibGVkIGF0IGNvbXBpbGUKKyAgICAgIHRpbWUsIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludCBvbiBlbWJlZGRlZCBzeXN0ZW1zCisgICAgKiBBZGRlZCBtdWx0aXBseSBhc3NlbWJseSBjb2RlIGZvciB0aGUgVHJpQ29yZSBhbmQgbW9kaWZpZWQKKyAgICAgIGhhdmVnZV9zdHJ1Y3QgZm9yIHRoaXMgcHJvY2Vzc29yLCB0aGFua3MgdG8gRGF2aWQgUGF0acOxbworICAgICogQWRkZWQgbXVsdGlwbHkgYXNzZW1ibHkgY29kZSBmb3IgNjQtYml0IFBvd2VyUENzLAorICAgICAgdGhhbmtzIHRvIFBla2luZyBVbml2ZXJzaXR5IGFuZCB0aGUgT1NVIE9wZW4gU291cmNlIExhYgorICAgICogQWRkZWQgZXhwZXJpbWVudGFsIHN1cHBvcnQgb2YgUXVhbnR1bSBDcnlwdG9ncmFwaHkKKyAgICAqIEFkZGVkIHN1cHBvcnQgZm9yIGF1dG9jb25mLCBjb250cmlidXRlZCBieSBBcm5hdWQgQ29ybmV0CisgICAgKiBGaXhlZCAibG9uZyBsb25nIiBjb21waWxhdGlvbiBpc3N1ZXMgb24gSUEtNjQgYW5kIFBQQzY0CisgICAgKiBGaXhlZCBhIGJ1ZyBpbnRyb2R1Y2VkIGluIHh5c3NsLTAuNS90aW1pbmcuYzogaGFyZGNsb2NrCisgICAgICB3YXMgbm90IGJlaW5nIGNvcnJlY3RseSBkZWZpbmVkIG9uIEFSTSBhbmQgTUlQUworCis9IFZlcnNpb24gMC41IHJlbGVhc2VkIG9uIDIwMDctMDMtMDEKKworICAgICogQWRkZWQgbXVsdGlwbHkgYXNzZW1ibHkgY29kZSBmb3IgU1BBUkMgYW5kIEFscGhhCisgICAgKiBBZGRlZCAoYmV0YSkgc3VwcG9ydCBmb3Igbm9uLWJsb2NraW5nIEkvTyBvcGVyYXRpb25zCisgICAgKiBJbXBsZW1lbnRlZCBzZXNzaW9uIHJlc3VtaW5nIGFuZCBjbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAqIEZpeGVkIHNvbWUgcG9ydGFiaWxpdHkgaXNzdWVzIG9uIFdpbkNFLCBNSU5JWCAzLCBQbGFuOQorICAgICAgKHRoYW5rcyB0byBCZW5qYW1pbiBOZXdtYW4pLCBIUC1VWCwgRnJlZUJTRCBhbmQgU29sYXJpcworICAgICogSW1wcm92ZWQgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBFREgga2V5IGV4Y2hhbmdlCisgICAgKiBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCB2YWxpZCBwYWNrZXRzIHdpdGggYSBwYXlsb2FkCisgICAgICBzaXplIG9mIDE2Mzg0IGJ5dGVzIHRvIGJlIHJlamVjdGVkCisKKz0gVmVyc2lvbiAwLjQgcmVsZWFzZWQgb24gMjAwNy0wMi0wMQorCisgICAgKiBBZGRlZCBzdXBwb3J0IGZvciBFcGhlbWVyYWwgRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlCisgICAgKiBBZGRlZCBtdWx0aXBseSBhc20gY29kZSBmb3IgU1NFMiwgQVJNLCBQUEMsIE1JUFMgYW5kIE02OEsKKyAgICAqIFZhcmlvdXMgaW1wcm92ZW1lbnQgdG8gdGhlIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gY29kZQorICAgICogUmV3cm90ZSB0aGUgaGVhZGVycyB0byBnZW5lcmF0ZSB0aGUgQVBJIGRvY3Mgd2l0aCBkb3h5Z2VuCisgICAgKiBGaXhlZCBhIGJ1ZyBpbiBzc2xfZW5jcnlwdF9idWYgKGluY29ycmVjdCBwYWRkaW5nIHdhcworICAgICAgZ2VuZXJhdGVkKSBhbmQgaW4gc3NsX3BhcnNlX2NsaWVudF9oZWxsbyAobWF4LiBjbGllbnQKKyAgICAgIHZlcnNpb24gd2FzIG5vdCBwcm9wZXJseSBzZXQpLCB0aGFua3MgdG8gRGlkaWVyIFJlYmVpeAorICAgICogRml4ZWQgYW5vdGhlciBidWcgaW4gc3NsX3BhcnNlX2NsaWVudF9oZWxsbzogY2xpZW50cyB3aXRoCisgICAgICBjaXBoZXJsaXN0cyBsYXJnZXIgdGhhbiA5NiBieXRlcyB3ZXJlIGluY29ycmVjdGx5IHJlamVjdGVkCisgICAgKiBGaXhlZCBhIGNvdXBsZSBtZW1vcnkgbGVhayBpbiB4NTA5X3JlYWQuYworCis9IFZlcnNpb24gMC4zIHJlbGVhc2VkIG9uIDIwMDctMDEtMDEKKworICAgICogQWRkZWQgc2VydmVyLXNpZGUgU1NMdjMgYW5kIFRMU3YxLjAgc3VwcG9ydAorICAgICogTXVsdGlwbGUgZml4ZXMgdG8gZW5oYW5jZSB0aGUgY29tcGF0aWJpbGl0eSB3aXRoIGcrKywKKyAgICAgIHRoYW5rcyB0byBYb3PDqSBBbnTDs24gT3Rlcm8gRmVycmVpcmEKKyAgICAqIEZpeGVkIGEgYnVnIGluIHRoZSBDQkMgY29kZSwgdGhhbmtzIHRvIGRvd3N0OyBhbHNvLAorICAgICAgdGhlIGJpZ251bSBjb2RlIGlzIG5vIGxvbmdlciBkZXBlbmRhbnQgb24gbG9uZyBsb25nCisgICAgKiBVcGRhdGVkIHJzYV9wa2NzMV9zaWduIHRvIGhhbmRsZSBhcmJpdHJhcnkgbGFyZ2UgaW5wdXRzCisgICAgKiBVcGRhdGVkIHRpbWluZy5jIGZvciBpbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggaTM4NgorICAgICAgYW5kIDQ4NiBwcm9jZXNzb3JzLCB0aGFua3MgdG8gQXJuYXVkIENvcm5ldAorCis9IFZlcnNpb24gMC4yIHJlbGVhc2VkIG9uIDIwMDYtMTItMDEKKworICAgICogVXBkYXRlZCB0aW1pbmcuYyB0byBzdXBwb3J0IEFSTSBhbmQgTUlQUyBhcmNoCisgICAgKiBVcGRhdGVkIHRoZSBNUEkgY29kZSB0byBzdXBwb3J0IDgwODYgb24gTVNWQyAxLjUKKyAgICAqIEFkZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGF0IHRoZSB0b3Agb2YgaGF2ZWdlLmgKKyAgICAqIEZpeGVkIGEgYnVnIGluIHNoYTJfaG1hYywgdGhhbmtzIHRvIG5ld3NvZnQvV2VuZmFuZyBaaGFuZworICAgICogRml4ZWQgYSBidWcgcmVwb3J0ZWQgYnkgQWRyaWFuIFLDvGVnc2VnZ2VyIGluIHg1MDlfcmVhZF9rZXkKKyAgICAqIEZpeGVkIGEgYnVnIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGF1dGVyIGluIHNzbF9yZWFkX3JlY29yZAorICAgICogRml4ZWQgYSBidWcgaW4gcnNhX2NoZWNrX3ByaXZrZXkgdGhhdCB3b3VsZCB3cm9uZ2x5IGNhdXNlCisgICAgICB2YWxpZCBSU0Ega2V5cyB0byBiZSBkaXNtaXNzZWQgKHRoYW5rcyB0byBvbGR3b2xmKQorICAgICogRml4ZWQgYSBidWcgaW4gbXBpX2lzX3ByaW1lIHRoYXQgY2F1c2VkIHNvbWUgcHJpbWVzIHRvIGZhaWwKKyAgICAgIHRoZSBNaWxsZXItUmFiaW4gcHJpbWFsaXR5IHRlc3QKKworICAgIEknZCBhbHNvIGxpa2UgdG8gdGhhbmsgWW91bsOocyBIYWZyaSBmb3IgdGhlIENSVVggbGludXggcG9ydCwKKyAgICBLaGFsaWwgUGV0aXQgd2hvIGFkZGVkIFh5U1NMIGludG8gcGtnc3JjIGFuZCBBcm5hdWQgQ29ybmV0CisgICAgd2hvIG1haW50YWlucyB0aGUgRGViaWFuIHBhY2thZ2UgOi0pCisKKz0gVmVyc2lvbiAwLjEgcmVsZWFzZWQgb24gMjAwNi0xMS0wMQorCis+Pj4+Pj4+IC5tZXJnZS1yaWdodC5yOTYxDQo=