ICBDaGFuZ2Vsb2cgZm9yIHRoZSBjLWFyZXMgcHJvamVjdAoKVmVyc2lvbiAxLjQuMCAoSnVuZSA4LCAyMDA3KQoKKiBKdW5lIDQgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBKYW1lcyBCdXJzYSByZXBvcnRlZCBhIG1ham9yIG1lbW9yeSBwcm9ibGVtIHdoZW4gcmVzb2x2aW5nIG11bHRpLUlQIG5hbWVzCiAgYW5kIEkgZm91bmQgYW5kIGZpeGVkIHRoZSBwcm9ibGVtLiBJdCB3YXMgYWRkZWQgYnkgQXNoaXNoIFNoYXJtYSdzIHBhdGNoCiAgdHdvIGRheXMgYWdvLgoKICBXaGVuIEkgdGhlbiB0cmllZCB0byB2ZXJpZnkgbXVsdGlwbGUgZW50cmllcyBpbiAvZXRjL2hvc3RzIGFmdGVyIG15IGZpeCwgSQogIGdvdCBhbm90aGVyIHNlZ2ZhdWx0IGFuZCBkZWNpZGVkIHRoaXMgY29kZSB3YXMgbm90IHJpcGUgZm9yIGluY2x1c2lvbiBhbmQgSQogIHJldmVydGVkIHRoZSBwYXRjaC4KCiogSnVuZSAyIDIwMDcKCi0gQnJhZCBTcGVuY2VyIGZvdW5kIGFuZCBmaXhlZCB0aHJlZSBmbGF3cyBpbiB0aGUgY29kZSwgZm91bmQgd2l0aCB0aGUgbmV3CiAgZ2NjIDQuMi4wIHdhcm5pbmc6IC1XYWRkcmVzcwoKLSBCcmFkIEhvdXNlIGZpeGVkIFZTMjAwNSBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGltZV90IGJlaW5nIDY0Yml0LgogIEhlIGFsc28gbWFkZSByZWNlbnQgTWljcm9zb2Z0IGNvbXBpbGVycyB1c2UgX3N0cmR1cCgpIGluc3RlYWQgb2Ygc3RyZHVwKCkuCgotIEJyYWQgSG91c2UncyBtYW4gcGFnZXMgZm9yIGFyZXNfc2F2ZV9vcHRpb25zKCkgYW5kIGFyZXNfZGVzdHJveV9vcHRpb25zKCkKICB3ZXJlIGFkZGVkLgoKLSBBc2hpc2ggU2hhcm1hIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHN1cHBvcnRpbmcgbXVsdGlwbGUgZW50cmllcyBpbiB0aGUKICAvZXRjL2hvc3RzIGZpbGUuIFBhdGNoIGVkaXRlZCBmb3IgY29kaW5nIHN0eWxlIGFuZCBmdW5jdGlvbmFsaXR5IGJ5IG1lCiAgKERhbmllbCkuCgoqIE1heSAzMCAyMDA3CgotIFNobXVsaWsgUmVnZXYgYnJvdWdodCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgdHJhbnNhY3Rpb24gSURzOgoKICBUaGUgYy1hcmVzIGxpYnJhcnkgaW1wbGVtZW50YXRpb24gdXNlcyBhIEROUyAiVHJhbnNhY3Rpb24gSUQiIGZpZWxkIHRoYXQgaXMKICBzZWVkZWQgd2l0aCBhIHBzZXVkbyByYW5kb20gbnVtYmVyIChiYXNlZCBvbiBnZXR0aW1lb2ZkYXkpIHdoaWNoIGlzCiAgaW5jcmVtZW50ZWQgKCsrKSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGNhbGxzIGFuZCBpcyB0aGVyZWZvcmUgcmF0aGVyCiAgcHJlZGljdGFibGUuIEluIGdlbmVyYWwsIHByZWRpY3RhYmlsaXR5IG9mIEROUyBUcmFuc2FjdGlvbiBJRCBpcyBhIHdlbGwKICBrbm93biBzZWN1cml0eSBwcm9ibGVtIChlLmcuCiAgaHR0cDovL2Jhay5zcGMub3JnL2Rtcy9hcmNoaXZlL2Ruc19pZF9hdHRhY2sudHh0KSBhbmQgbWFrZXMgYSBjLWFyZXMgYmFzZWQKICBpbXBsZW1lbnRhdGlvbiB2dWxuZXJhYmxlIHRvIEROUyBwb2lzb25pbmcuIENyZWRpdCBnb2VzIHRvIEFtaXQgS2xlaW4KICAoVHJ1c3RlZXIpIGZvciBpZGVudGlmeWluZyB0aGlzIHByb2JsZW0uCgogIFRoZSBwYXRjaCBJIHdyb3RlIGNoYW5nZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZSBhIG1vcmUgc2VjdXJlIHdheSBvZgogIGdlbmVyYXRpbmcgdW5pcXVlIElEcy4gSXQgc3RhcnRzIGJ5IG9idGFpbmluZyBhIGtleSB3aXRoIHJlYXNvbmFibGUgZW50cm9weQogIHdoaWNoIGlzIHVzZWQgd2l0aCBhbiBSQzQgc3RyZWFtIHRvIGdlbmVyYXRlIHRoZSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUKICB0cmFuc2FjdGlvbiBJRHMuCgogIE5vdGUgdGhhdCB0aGUga2V5IGdlbmVyYXRpb24gY29kZSAoaW4gYXJlc19pbml0OnJhbmRvbWl6ZV9rZXkpIGhhcyB0d28KICB2ZXJzaW9ucywgdGhlIFdpbmRvd3Mgc3BlY2lmaWMgb25lIHVzZXMgYSBjcnlwdG9ncmFwaGljYWxseSBzYWZlIGZ1bmN0aW9uCiAgcHJvdmlkZWQgKGJ1dCB1bmRvY3VtZW50ZWQgOikgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gKGRlc2NyaWJlZCBhdAogIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9taWNoYWVsX2hvd2FyZC9hcmNoaXZlLzIwMDUvMDEvMTQvMzUzMzc5LmFzcHgpLiAgVGhlCiAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIGJpdCBuYWl2ZSBhbmQgdXNlcyB0aGUgc3RhbmRhcmQgJ3JhbmQnCiAgZnVuY3Rpb24uIFN1cmVseSBhIGJldHRlciB3YXkgdG8gZ2VuZXJhdGUgcmFuZG9tIGtleXMgZXhpc3RzIGZvciBvdGhlcgogIHBsYXRmb3Jtcy4KCiAgVGhlIHBhdGNoIGNhbiBiZSB0ZXN0ZWQgYnkgdXNpbmcgdGhlIGFkaWcgdXRpbGl0eSBhbmQgdXNpbmcgdGhlICctcycgb3B0aW9uLgoKLSBCcmFkIEhvdXNlIGFkZGVkIGFyZXNfc2F2ZV9vcHRpb25zKCkgYW5kIGFyZXNfZGVzdHJveV9vcHRpb25zKCkgdGhhdCBjYW4gYmUKICB1c2VkIHRvIGtlZXAgb3B0aW9ucyBmb3IgbGF0ZXIgcmUtdXNhbCB3aGVuIGFyZXNfaW5pdF9vcHRpb25zKCkgaXMgdXNlZC4KICAKICBQcm9ibGVtOiBDYWxsaW5nIGFyZXNfaW5pdCgpIGZvciBlYWNoIGxvb2t1cCBjYW4gYmUgdW5uZWNlc3NhcmlseSByZXNvdXJjZQogICAgICAgICBpbnRlbnNpdmUuICBPbiB3aW5kb3dzLCBpdCBtdXN0IExvYWRMaWJyYXJ5KCkgb3Igc2VhcmNoIHRoZSByZWdpc3RyeQogICAgICAgICBvbiBlYWNoIGNhbGwgdG8gYXJlc19pbml0KCkuICBPbiB1bml4LCBpdCBtdXN0IHJlYWQgYW5kIHBhcnNlCiAgICAgICAgIG11bHRpcGxlIGZpbGVzIHRvIG9idGFpbiB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICBJbgogICAgICAgICBhIHNpbmdsZS10aHJlYWRlZCBlbnZpcm9ubWVudCwgaXQgd291bGQgbWFrZSBzZW5zZSB0byBvbmx5CiAgICAgICAgIGFyZXNfaW5pdCgpIG9uY2UsIGJ1dCBpbiBhIGhlYXZpbHkgbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnQsIGl0IGlzCiAgICAgICAgIHVuZGVzaXJhYmxlIHRvIGFyZXNfaW5pdCgpIGFuZCBhcmVzX2Rlc3Ryb3koKSBmb3IgZWFjaCB0aHJlYWQgY3JlYXRlZAogICAgICAgICBhbmQgdHJhY2sgdGhhdC4KCiAgU29sdXRpb246IENyZWF0ZSBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpIGZ1bmN0aW9ucyB0bwogICAgICAgICByZXRyaWV2ZSBhbmQgZnJlZSBvcHRpb25zIG9idGFpbmVkIGZyb20gYW4gaW5pdGlhbGl6ZWQgY2hhbm5lbC4gIFRoZQogICAgICAgICBvcHRpb25zIHBvcHVsYXRlZCBjYW4gYmUgdXNlZCB0byBwYXNzIGJhY2sgaW50byBhcmVzX2luaXRfb3B0aW9ucygpLAogICAgICAgICBpdCBzaG91bGQgcG9wdWxhdGUgYWxsIG5lZWRlZCBmaWVsZHMgYW5kIG5vdCByZXRyaWV2ZSBhbnkgaW5mb3JtYXRpb24KICAgICAgICAgZnJvbSB0aGUgc3lzdGVtLiAgUHJvYmFibHkgd2lzZSB0byBkZXN0cm95IHRoZSBjYWNoZSBldmVyeSBtaW51dGUgb3IKICAgICAgICAgc28gdG8gcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlY29taW5nIHN0YWxlLgoKLSBEYW5pZWwgUyBhZGRlZCBhcmVzX3Byb2Nlc3NfZmQoKSB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gYXNrIGZvciBwcm9jZXNzaW5nCiAgb24gc3BlY2lmaWMgc29ja2V0cyBhbmQgdGh1cyBhdm9pZGluZyBzZWxlY3QoKSBhbmQgYXNzb2NpYXRlZAogIGZ1bmN0aW9ucy9tYWNyb3MuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBieSB1cGNvbWluZyBsaWJjdXJsIHJlbGVhc2VzCiAgZm9yIHRoaXMgdmVyeSByZWFzb24uIEl0IGFsc28gbWFkZSBtZSBleHBvcnQgdGhlIGFyZXNfc29ja2V0X3QgdHlwZSBpbiB0aGUKICBwdWJsaWMgYXJlcy5oIGhlYWRlciBmaWxlLCBzaW5jZSBhcmVzX3Byb2Nlc3NfZmQoKSB1c2VzIHRoYXQgdHlwZSBmb3IgdHdvIG9mCiAgdGhlIGFyZ3VtZW50cy4KCiogTWF5IDI1IDIwMDcKCi0gUmF2aSBQcmF0YXAgZml4ZWQgYSBmbGF3IGluIHRoZSBpbml0X2J5X3Jlc29sdl9jb25mKCkgZnVuY3Rpb24gZm9yIHdpbmRvd3MKICB0aGF0IGNvdWxkIGNhdXNlIGl0IHRvIHJldHVybiBhIGJhZCByZXR1cm4gY29kZS4KCiogQXByaWwgMTYgMjAwNwoKLSBZYW5nIFRzZTogUHJvdmlkZSBhcmVzX2dldG9wdCgpIGNvbW1hbmQtbGluZSBwYXJzZXIgZnVuY3Rpb24gYXMgYSBzb3VyY2UKICBjb2RlIGhlbHBlciBmdW5jdGlvbiwgbm90IGJlbG9uZ2luZyB0byB0aGUgYWN0dWFsIGMtYXJlcyBsaWJyYXJ5LgoKKiBGZWJydWFyeSAxOSAyMDA3CgotIFZsYWQgRGludWxlc2N1IGFkZGVkIGFyZXNfcGFyc2VfbnNfcmVwbHkoKS4KCiogRmVicnVhcnkgMTMgMjAwNwoKLSBZYW5nIFRzZTogRml4IGZhaWx1cmUgdG8gZ2V0IHRoZSBzZWFyY2ggc2VxdWVuY2Ugb2YgL2V0Yy9ob3N0cyBhbmQKICBETlMgZnJvbSAvZXRjL25zc3dpdGNoLmNvbmYsIC9ldGMvaG9zdC5jb25mIG9yIC9ldGMvc3ZjLmNvbmYgd2hlbgogIC9ldGMvcmVzb2x2LmNvbmYgZGlkIG5vdCBleGlzdCBvciB3YXMgdW5hYmxlIHRvIHJlYWQgaXQuCgoqIE5vdmVtYmVyIDIyIDIwMDYKCi0gSW5zdGFsbCBhcmVzX2Rucy5oIHRvbwoKLSBNaWNoYWVsIFdhbGxuZXIgZml4ZWQgdGhpcyBwcm9ibGVtOiBXaGVuIEkgc2V0IGRvbWFpbnMgaW4gdGhlIG9wdGlvbnMKICBzdHJ1Y3QsIGFuZCB0aGVyZSBhcmUgZG9tYWluL3NlYXJjaCBlbnRyaWVzIGluIC9ldGMvcmVzb2x2LmNvbmYsIHRoZSBkb21haW5zCiAgb2YgdGhlIG9wdGlvbnMgc3RydWN0IHdpbGwgYmUgb3ZlcnJpZGRlbi4KCiogTm92ZW1iZXIgNiAyMDA2CgotIFlhbmcgVHNlIHJlbW92ZWQgYSBjb3VwbGUgb2YgcG90ZW50aWFsIHplcm8gc2l6ZSBtZW1vcnkgYWxsb2NhdGlvbnMuCgotIEFuZHJlYXMgUmlla2UgZml4ZWQgdGhlIGxpbmUgZW5kaW5ncyBpbiB0aGUgYXJlc2xpYi5kc3AgZmlsZSB0aGF0IEkgKERhbmllbCkKICBicm9rZSBpbiB0aGUgMS4zLjIgcmVsZWFzZS4gV2Ugc2hvdWxkIHN3aXRjaCB0byBhIHN5c3RlbSB3aGVyZSB0aGF0IGZpbGUgaXMKICBhdXRvLWdlbmVyYXRlZC4gV2UgY291bGQgcmlwIHNvbWUgY29kZSBmb3IgdGhhdCBmcm9tIGN1cmwuLi4KClZlcnNpb24gMS4zLjIgKE5vdmVtYmVyIDMsIDIwMDYpCgoqIE9jdG9iZXIgMTIgMjAwNgoKLSBQcmV2ZW50IGFyZXNfZ2V0c29jaygpIHRvIG92ZXJmbG93IGlmIG1vcmUgdGhhbiAxNiBzb2NrZXRzIGFyZSB1c2VkLgoKKiBTZXB0ZW1iZXIgMTEgMjAwNgoKLSBHdWlsaGVybWUgQmFsZW5hIFZlcnNpYW5pOiBJIG5vdGVkIGEgc3RyYW5nZSBCVUcgaW4gV2luMzIgcG9ydAogIChhcmVzX2luaXQuYy9nZXRfaXBobHBhcGlfZG5zX2luZm8oKSBmdW5jdGlvbik6IHdoZW4gSSBkaXNhYmxlIHRoZSBuZXR3b3JrCiAgYnkgaGFuZCBvciBkaXNjb25uZWN0IHRoZSBuZXR3b3JrIGNhYmxlIGluIFdpbmRvd3MgMjAwMCBvciBXaW5kb3dzIFhQLCBteQogIGFwcGxpY2F0aW9uIGdldHMgMTI3LjAuMC4xIGFzIHRoZSBvbmx5IG5hbWUgc2VydmVyLiBUaGUgcHJvYmxlbSBjb21lcyBmcm9tCiAgJ0dldE5ldHdvcmtQYXJhbXMnIGZ1bmN0aW9uLCB0aGF0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyAiIiBhcyB0aGUgb25seQogIG5hbWUgc2VydmVyIGluIHRoYXQgY2FzZS4gTW9yZW92ZXIsIHRoZSBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mCiAgaW5ldF9hZGRyKCkgcmV0dXJucyBJTkFERFJfTE9PUEJBQ0sgaW5zdGVhZCBvZiBJTkFERFJfTk9ORS4KCiogQXVndXN0IDI5IDIwMDYKCi0gQnJhZCBTcGVuY2VyIGRpZAoKICBvIG1hZGUgYXJlc192ZXJzaW9uLmggdXNlIGV4dGVybiAiQyIgZm9yIGMrKyBjb21waWxlcnMKICBvIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIGFyZXNfZ2V0bmFtZWluZm8uYwogIG8gZml4ZWQgYSBidWZmZXIgcG9zaXRpb24gaW5pdCBmb3IgVENQIHJlYWRzCgoqIEF1Z3VzdCAzIDIwMDYKCi0gUmF2aSBQcmF0YXAgZml4ZWQgYXJlc19nZXRzb2NrKCkgdG8gYWN0dWFsbHkgcmV0dXJuIHRoZSBwcm9wZXIgYml0bWFwIGFuZAogIG5vdCBhbHdheXMgemVybyEKClZlcnNpb24gMS4zLjEgKEp1bmUgMjQsIDIwMDYpCgoqIEp1bHkgMjMsIDIwMDYKCi0gR2lzbGUgVmFuZW0gYWRkZWQgZ2V0b3B0KCkgdG8gdGhlIGFob3N0IHByb2dyYW0uIEN1cnJlbnRseSBhY2NlcHRzCiAgb25seSBbLXQge2F8YWFhYX1dIHRvIHNwZWNpZnkgYWRkcmVzcyBmYW1pbHkgaW4gYXJlc19nZXRob3N0YnluYW1lKCkuCgoqIEp1bmUgMTksIDIwMDYKCi0gKHdhaGVybikgUmVtb3ZlZCAiYmlnIGVuZGlhbiIgRE5TIHNlY3Rpb24gYW5kIFJSIGRhdGEgaW50ZWdlciBwYXJzZXIKICBtYWNyb3MgZnJvbSBhcmVzX2Rucy5oLCB3aGljaCBicmVhayBjLWFyZXMgb24gbXkgU3BhcmM2NC4gQml0LXdpc2UKICBvcGVyYXRpb25zIGluIEMgb3BlcmF0ZSBvbiBsb2dpY2FsIHZhbHVlcy4gQW5kIGluIGFueSBldmVudCB0aGUgb2N0ZXRzIGFyZQogIGFscmVhZHkgaW4gYmlnLWVuZGlhbiAoYWthIG5ldHdvcmspIGJ5dGUgb3JkZXIgc28gdGhleSdyZSBiZWluZyByZXZlcnNlZAogICh0aHVzIHRoZSBzb3VyY2Ugb2YgdGhlIGJyZWFrYWdlKS4KCiogSnVuZSAxOCwgMjAwNgoKLSBXaWxsaWFtIEFoZXJuIGhhbmRsZXMgRUFHQUlOL0VXT1VMREJMT0NLIGVycm9ycyBpbiBtb3N0IG9mIHRoZSBJL08gY2FsbHMKICBmcm9tIGFyZWFfcHJvY2Vzcy5jLgoKICBUT0RPOiBIYW5kbGUgb25lIGxhc3QgRUFHQUlOIGZvciBhIFVEUCBzb2NrZXQgc2VuZCgyKSBpbgogIGFyZXNfX3NlbmRfcXVlcnkoKS4KCiogTWF5IDEwLCAyMDA2CgotIEJyYW0gTWF0dGh5cyBicm91Z2h0IG15IGF0dGVudGlvbiB0byBhIGxpYnRvb2wgcGVjdWxpYXJpdHkgd2hlcmUgZGV0ZWN0aW5nCiAgdGhpbmdzIHN1Y2ggYXMgQysrIGNvbXBpbGVyIGFjdHVhbGx5IGlzIGEgYmFkIHRoaW5nIGFuZCBzaW5jZSB3ZSBkb24ndCBuZWVkCiAgdGhhdCBkZXRlY3Rpb24gSSBhZGRlZCBhIHdvcmstYXJvdW5kLCBtdWNoIGluc3BpcmVkIGJ5IGEgcHJldmlvdXMgcGF0Y2ggYnkKICBQYW9sbyBCb256aW5pLiBUaGlzIGFsc28gc2hvcnRlbnMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcXVpdGUgYSBsb3QuCgoqIE1heSAzLCAyMDA2CgotIE5pY2sgTWF0aGV3c29uIGFkZGVkIHRoZSBBUkVTX09QVF9TT0NLX1NUQVRFX0NCIG9wdGlvbiB0aGF0IHdoZW4gc2V0IG1ha2VzCiAgYy1hcmVzIGNhbGwgYSBjYWxsYmFjayBvbiBzb2NrZXQgc3RhdGUgY2hhbmdlcy4gQSBiZXR0ZXIgd2F5IHRoYW4gdGhlCiAgYXJlc19nZXRzb2NrKCkgdG8gZ2V0IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBzb2NrZXQgc3RhdGUuCgoqIEphbnVhcnkgOSwgMjAwNgoKLSBBbGV4YW5kZXIgTGF6aWMgaW1wcm92ZWQgdGhlIGdldHNlcnZieXBvcnRfcigpIGNvbmZpZ3VyZSBjaGVjay4KCiogSmFudWFyeSA2LCAyMDA2CgotIEFsZXhhbmRlciBMYXppYyBwb2ludGVkIG91dCB0aGF0IHRoZSBidWlsZGNvbmYgc2hvdWxkIHVzZSB0aGUgQUNMT0NBTF9GTEFHUwogIHZhcmlhYmxlIGZvciBlYXNpZXIgY29udHJvbGxpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgaXQgcnVucy4KCiogSmFudWFyeSA1LCAyMDA2CgotIEphbWVzIEJ1cnNhIGZpeGVkIGMtYXJlcyB0byBmaW5kIHRoZSBob3N0cyBmaWxlIG9uIFJJU0MgT1MsIGFuZCBtYWRlIGl0CiAgYnVpbGQgd2l0aCBuZXdlciBnY2MgdmVyc2lvbnMgdGhhdCBubyBsb25nZXIgZGVmaW5lcyAicmlzY29zIi4KCiogRGVjZW1iZXIgMjIKCi0gRGFuaWVsIFN0ZW5iZXJnIGFkZGVkIGFyZXNfZ2V0c29jaygpIHRoYXQgZXh0cmFjdHMgdGhlIHNldCBvZiBzb2NrZXRzIHRvCiAgd2FpdCBmb3IgYWN0aW9uIG9uLiBTaW1pbGFyIHRvIGFyZXNfZmRzKCkgYnV0IG5vdCByZXN0cmljdGVkIHRvIHVzaW5nCiAgc2VsZWN0KCkgZm9yIHRoZSB3YWl0aW5nLgoKKiBOb3ZlbWJlciAyNQoKLSBZYW5nIFRzZSBmaXhlZCBzb21lIHNlbmQoKSAvIHJlY3YoKSBjb21waWxlciB3YXJuaW5ncwoKKiBTZXB0ZW1iZXIgMTgKCi0gQWRkZWQgY29uc3RhbnRzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGFyZXNfZ2V0YWRkcmluZm8KCi0gTWFkZSBhcmVzX2dldG5hbWVpbmZvIHVzZSB0aGUgcmVlbnRyYW50IGdldHNlcnZieXBvcnQgKGdldHNlcnZieXBvcnRfcikgaWYgaXQKICBpcyBhdmFpbGFibGUgdG8gZW5zdXJlIGl0IHdvcmtzIHByb3Blcmx5IGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQuCgoqIFNlcHRlbWJlciAxMAoKLSBjb25maWd1cmUgZml4IGZvciBkZXRlY3RpbmcgYSBtZW1iZXIgaW4gdGhlIHNvY2thZGRyX2luNiBzdHJ1Y3Qgd2hpY2ggZmFpbGVkCiAgb24gaXB2Ni1lbmFibGVkIEhQLVVYIDExLjAwCgpWZXJzaW9uIDEuMy4wIChBdWd1c3QgMjksIDIwMDUpCgoqIEF1Z3VzdCAyMQoKLSBBbGZyZWRvIFR1cG9uZSBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIFdpbmRvd3MgY29kZSBpbiBnZXRfaXBobHBhcGlfZG5zX2luZm8oKQogIHdoZW4gZ2V0dGluZyB0aGUgRE5TIHNlcnZlciBldGMuCgoqIEp1bmUgMTkKCi0gQWRkZWQgc29tZSBjaGVja3MgZm9yIHRoZSBhZGRyaW5mbyBzdHJ1Y3R1cmUuCgoqIEp1bmUgMgoKLSBXaWxsaWFtIEFoZXJuOgoKICBNYWtlIFVEUCBzb2NrZXRzIG5vbi1ibG9ja2luZy4gSSd2ZSBjb25maXJtZWQgdGhhdCBhdCBsZWFzdCBvbiBMaW51eCAyLjQgYQogIHJlYWQgZXZlbnQgY2FuIGNvbWUgYmFjayBmcm9tIHBvbGwoKSBvbiBhIHZhbGlkIFNPQ0tfREdSQU0gc29ja2V0IGJ1dAogIHJlY3YoMikgd2lsbCBzdGlsbCBibG9jay4gVGhpcyBwYXRjaCBkb2Vzbid0IGlnbm9yZSBFQUdBSU4gaW4KICByZWFkX3VkcF9wYWNrZXRzKCksIHRob3VnaCBtYXliZSBpdCBzaG91bGQuIChUaGlzIHBhdGNoIHdhcyBlZGl0ZWQgYnkgRGFuaWVsCiAgU3RlbmJlcmcgYW5kIGEgbmV3IGNvbmZpZ3VyZSB0ZXN0IHdhcyBhZGRlZCAoaW1wb3J0ZWQgZnJvbSBjdXJsJ3MgY29uZmlndXJlKQogIHRvIHByb3Blcmx5IGRldGVjdCB3aGF0IG5vbi1ibG9ja2luZyBzb2NrZXQgYXBwcm9hY2ggdG8gdXNlLikKCiAgSSdtIG5vdCBxdWl0ZSBzdXJlIGhvdyB0aGlzIHdhcyBoYXBwZW5pbmcsIGJ1dCBJJ3ZlIGJlZW4gc2VlaW5nIFBUUiBxdWVyaWVzCiAgd2hpY2ggc2VlbSB0byByZXR1cm4gZW1wdHkgcmVzcG9uc2VzLiBBdCBsZWFzdCwgdGhleSB3ZXJlIGVtcHR5IHdoZW4gY2FsbGluZwogIGFyZXNfZXhwYW5kX25hbWUoKSBvbiB0aGUgcmVjb3JkLiBIZXJlJ3MgYSBwYXRjaCB3aGljaCBndWFyYW50ZWVzIHRvCiAgTlVMLXRlcm1pbmF0ZSB0aGUgZXhwYW5kZWQgbmFtZS4gVGhlIG9sZCBiZWhhdmlvciBmYWlsZWQgdG8gTlVMLXRlcm1pbmF0ZSBpZgogIGxlbiB3YXMgMCwgYW5kIHRoaXMgd2FzIGNhdXNpbmcgc3RybGVuKCkgdG8gcnVuIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCiAgYWZ0ZXIgY2FsbGluZyBhcmVzX2V4cGFuZF9uYW1lKCkgYW5kIGdldHRpbmcgQVJFU19TVUNDRVNTIGFzIHRoZSByZXR1cm4KICB2YWx1ZS4gSWYgcSBpcyBub3QgZ3JlYXRlciB0aGFuICpzIHRoZW4gaXQncyBlcXVhbCBhbmQgKnMgaXMgYWx3YXlzCiAgYWxsb2NhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGJ5dGUuCgoqIE1heSAxNgoKLSBBZGRlZCBhcmVzX2dldG5hbWVpbmZvIHdoaWNoIG1pbWljcyB0aGUgZ2V0bmFtZWluZm8gQVBJIChhbm90aGVyIGZlYXR1cmUKICB0aGF0IGNvdWxkIHVzZSB0ZXN0aW5nKS4KCiogTWF5IDE0CgotIEFkZGVkIGFuIGluZXRfbnRvcCBmdW5jdGlvbiBmcm9tIEJJTkQgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBpdC4KCiogQXByaWwgOQoKLSBNYWRlIHNvcnRsaXN0IHN1cHBvcnQgSVB2NiAodGhpcyBjYW4gcHJvYmFibHkgdXNlIHNvbWUgdGVzdGluZykuCgotIE1hZGUgc29ydGxpc3Qgc3VwcG9ydCBDSURSIG1hdGNoaW5nIGZvciBJUHY0LgoKKiBBcHJpbCA4CgotIEFkZGVkIHByZWxpbWluYXJ5IElQdjYgc3VwcG9ydCB0byBhcmVzX2dldGhvc3RieW5hbWUuIEN1cnJlbnRseSwgc29ydGxpc3QKICBkb2VzIG5vdCB3b3JrIHdpdGggSVB2Ni4gQWxzbyBwcm92aWRlZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiaXRuY21wIGZyb20KICBCSU5EIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90IHN1cHBseSB0aGlzIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBhZGQKICBJUHY2IHN1cHBvcnQgdG8gc29ydGxpc3QuCgotIE1hZGUgYXJlc19nZXRob3N0YnlhZGRyIHN1cHBvcnQgSVB2NiBieSBzcGVjaWZ5aW5nIEFGX0lORVQ2IGFzIHRoZSBmYW1pbHkuCiAgVGhlIGZ1bmN0aW9uIGNhbiBsb29rdXAgSVB2NiBhZGRyZXNzZXMgYm90aCBmcm9tIGZpbGVzICgvZXRjL2hvc3RzKSBhbmQKICBETlMgbG9va3Vwcy4KCiogQXByaWwgNwoKLSBUdXBvbmUgQWxmcmVkbyBmaXhlZCBpbmNsdWRlcyBvZiBhcnBhL25hbWVzZXJfY29tcGF0LmggdG8gYnVpbGQgZmluZSBvbiBNYWMKICBPUyBYLgoKKiBBcHJpbCA1CgotIERvbWluaWNrIE1lZ2xpbzogUHJvdmlkZWQgaW1wbGVtZW50YXRpb25zIG9mIGluZXRfbmV0X3B0b24gYW5kIGluZXRfcHRvbgogIGZyb20gQklORCBmb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9ucy4KCiogTWFyY2ggMTEsIDIwMDUKCi0gRG9taW5pY2sgTWVnbGlvIGFkZGVkIGFyZXNfcGFyc2VfYWFhYV9yZXBseS5jIGFuZCBkaWQgdmFyaW91cwogIGFkanVzdG1lbnRzLiBUaGUgZmlyc3QgbGl0dGxlIHN0ZXBzIHRvd2FyZHMgSVB2NiBzdXBwb3J0IQoKKiBOb3ZlbWJlciA3CgotIEZpeGVkIHRoZSBWQyBwcm9qZWN0IGFuZCBtYWtlZmlsZSB0byB1c2UgYXJlc19jYW5jZWwgYW5kIGFyZXNfdmVyc2lvbgoKKiBPY3RvYmVyIDI0CgotIFRoZSByZWxlYXNlZCBhcmVzX3ZlcnNpb24uaCBmcm9tIDEuMi4xIHNheXMgMS4yLjAgZHVlIHRvIGEgbWFrZXRneiBmbGF3LgogIFRoaXMgaXMgbm93IGZpeGVkLgoKVmVyc2lvbiAxLjIuMSAoT2N0b2JlciAyMCwgMjAwNCkKCiogU2VwdGVtYmVyIDI5CgotIEhlbnJpayBTdG9lcm5lciBmaXg6IGdvdCBhIHJlcG9ydCB0aGF0IFRydTY0IFVuaXggKHRoZSB1bml4IGZyb20gRGlnaXRhbAogIHdoZW4gdGhleSBtYWRlIEFscGhhJ3MpIHVzZXMgL2V0Yy9zdmMuY29uZiBmb3IgdGhlIHB1cnBvc2UgZml4ZWQgYmVsb3cgZm9yCiAgb3RoZXIgT1Nlcy4gSGUgbWFkZSBjLWFyZXMgY2hlY2sgZm9yIGFuZCB1bmRlcnN0YW5kIGl0IGlmIHByZXNlbnQuCgotIE5vdyBjLWFyZXMgd2lsbCB1c2UgbG9jYWwgaG9zdCBuYW1lIGxvb2t1cCBfYmVmb3JlXyBETlMgcmVzb2x2aW5nIGJ5IGRlZmF1bHQKICBpZiBub3RoaW5nIGVsc2UgaXMgdG9sZC4KCiogU2VwdGVtYmVyIDI2CgotIEhlbnJpayBTdG9lcm5lcjogZm91bmQgb3V0IHRoYXQgYy1hcmVzIGRvZXMgbm90IGxvb2sgYXQgdGhlIC9ldGMvaG9zdC5jb25mCiAgZmlsZSB0byBkZXRlcm1pbmUgdGhlIHNlcXVlbmNlIGluIHdoaWNoIHRvIHNlYXJjaCAvZXRjL2hvc3RzIGFuZCBETlMuICBTbyBvbgogIHN5c3RlbXMgd2hlcmUgdGhpcyBvcmRlciBpcyBkZWZpbmVkIGJ5IC9ldGMvaG9zdC5jb25mIGluc3RlYWQgb2YgYSAibG9va3VwIgogIGVudHJ5IGluIC9ldGMvcmVzb2x2LmNvbmYsIGMtYXJlcyB3aWxsIGFsd2F5cyBkZWZhdWx0IHRvIGxvb2tpbmcgaW4gRE5TCiAgZmlyc3QsIGFuZCAvZXRjL2hvc3RzIHNlY29uZC4KCiAgYy1hcmVzIG5vdyBsb29rcyBhdAoKICAxKSByZXNvbHYuY29uZiAoZm9yIHRoZSAibG9va3VwIiBsaW5lKTsKICAyKSBuc3N3aXRjaC5mb24gKGZvciB0aGUgImhvc3RzOiIgbGluZSk7CiAgMykgaG9zdC5jb25mIChmb3IgdGhlICJvcmRlciIgbGluZSkuCgogIEZpcnN0IG1hdGNoIHdpbnMuCgotIERvbWluaWNrIE1lZ2xpbyBwYXRjaGVkOiBDLWFyZXMgb24gV2luZG93cyBhc3N1bWVkIHRoYXQgdGhlIEhPU1RTIGZpbGUgaXMKICBsb2NhdGVkIGluIGEgc3RhdGljIGxvY2F0aW9uLiBJdCBhc3N1bWVkCiAgQzpcV2luZG93c1xTeXN0ZW0zMlxEcml2ZXJzXEV0Yy4gVGhpcyBpcyBhIHBvb3IgYXNzdW1wdGlvbiB0byBtYWtlLiBJbiBmYWN0LAogIHRoZSBsb2NhdGlvbiBvZiB0aGUgSE9TVFMgZmlsZSBjYW4gYmUgY2hhbmdlZCB2aWEgYSByZWdpc3RyeSBzZXR0aW5nLgoKICBUaGVyZSBpcyBhIGtleSBjYWxsZWQgRGF0YWJhc2VQYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgSE9TVFMKICBmaWxlOgogIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L2l0c29sdXRpb25zL25ldHdvcmsvZGVwbG95L2RlcG92Zy90Y3BpcDJrLm1zcHgKCiAgVGhlIHBhdGNoIHdpbGwgbWFrZSBjLWFyZXMgY29ycmVjdGx5IGNvbnN1bHQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgbG9jYXRpb24KICBvZiB0aGlzIGZpbGUuCgoqIEF1Z3VzdCAyOQoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgTVNWQyBidWlsZCBmaWxlcy4KCiogQXVndXN0IDIwCgotIEdpc2xlIFZhbmVtIG1hZGUgYy1hcmVzIGJ1aWxkIGFuZCB3b3JrIHdpdGggaGlzIFdhdHQtMzIgVENQL0lQIHN0YWNrLgoKKiBBdWd1c3QgMTMKCi0gSGFyc2hhbCBQcmFkaGFuIG1hZGUgYSBtaW5vciBzeW50YXggY2hhbmdlIGluIGFyZXNfaW5pdC5jIHRvIG1ha2UgaXQgYnVpbGQKICBmaW5lIHdpdGggTVNWQyA3LjEKCiogSnVseSAyNAoKLSBNYWRlIHRoZSBsaWIgZ2V0IGJ1aWx0IHN0YXRpYyBvbmx5IGlmIC0tZW5hYmxlLWRlYnVnIGlzIHVzZWQuCgotIEdpc2xlIFZhbmVtIGZpeGVkOgoKICBCYXNpY2FsbHkgaW4gbG9vcHMgbGlrZSBoYW5kbGVfZXJyb3JzKCksICdxdWVyeS0+bmV4dCcgd2FzIGFzc2lnbmVkIGEgbG9jYWwKICB2YXJpYWJsZSBhbmQgdGhlbiBxdWVyeSB3YXMgcmVmZXJlbmNlZCBhZnRlciB0aGUgbWVtb3J5IHdhcyBmcmVlZCBieQogIG5leHRfc2VydmVyKCkuIEkndmUgY2hhbmdlZCB0aGF0IHNvIG5leHRfc2VydmVyKCkgYW5kIGVuZF9xdWVyeSgpIHJldHVybnMKICB0aGUgbmV4dCBxdWVyeS4gU28gY2FsbGVycyBzaG91bGQgdXNlIHRoaXMgcmV0LXZhbHVlLgoKICBUaGUgbmV4dCBwcm9ibGVtIHdhcyB0aGF0ICdzZXJ2ZXItPnRjcF9idWZmZXJfcG9zJyBoYWQgYSByYW5kb20gdmFsdWUgYXQKICBlbnRyeSB0byAxc3QgcmVjdigpIChsdWNraWx5IGNhdXNpbmcgV2luc29jayB0byByZXR1cm4gRU5PQlVGUykuCgogIEkndmUgYWxzbyBhZGRlZCBhIGFyZXNfd3JpdGV2KCkgZm9yIFdpbmRvd3MgdG8gc3RyZWFtbGluZSB0aGUgY29kZSBhIGJpdAogIG1vcmUuCgoqIEp1bHkgMjAKLSBGaXhlZCBhIGZldyB2YXJpYWJsZSByZXR1cm4gdHlwZXMgZm9yIHNvbWUgc3lzdGVtIGNhbGxzLiBNYWRlIGNvbmZpZ3VyZQogIGNoZWNrIGZvciBzc2l6ZV90IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoYXQgd2hlbiByZWNlaXZpbmcgdGhlIHNlbmQoKQogIGVycm9yIGNvZGUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3Mgb24gc29tZSBzeXN0ZW1zLgoKLSBNYWRlIGNvbmZpZ3VyZSBjcmVhdGUgY29uZmlnLmgsIGFuZCBhbGwgc291cmNlIGZpbGVzIG5vdyBpbmNsdWRlIHNldHVwLmggdGhhdAogIG1pZ2h0IGluY2x1ZGUgdGhlIHByb3BlciBjb25maWcuaCAob3IgYSBoYW5kaWNyYWZ0ZWQgYWx0ZXJuYXRpdmUpLgoKLSBTd2l0Y2hlZCB0byAnYXJlc19zb2NrZXRfdCcgdHlwZSBmb3Igc29ja2V0cyBpbiBhcmVzLCBzaW5jZSBXaW5kb3dzIGRvbid0CiAgdXNlICdpbnQnIGZvciB0aGF0LgoKLSBhdXRvbWFrZS1pZmllZCBhbmQgbGlib29sLWlmaWVkIGMtYXJlcy4gTm93IGl0IGJ1aWxkcyBsaWJjYXJlcyBhcyBhIHNoYXJlZAogIGxpYiBvbiBtb3N0IHBsYXRmb3JtcyBpZiB3YW50ZWQuIChUaGlzIGJsb2F0ZWQgdGhlIHNpemUgb2YgdGhlIHJlbGVhc2UKICBhcmNoaXZlIHdpdGggYW5vdGhlciAyMDBLISkKCi0gTWFrZWZpbGUuYW0gbm93IHVzZXMgTWFrZWZpbGUuaW5jIGZvciB0aGUgYyBzb3VyY2VzLCBoIGhlYWRlcnMgYW5kIG1hbgogIHBhZ2VzLCB0byBtYWtlIGl0IGVhc2llciBmb3Igb3RoZXIgbWFrZWZpbGVzIHRvIHVzZSB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YKICBmaWxlcy4KCi0gQWRqdXN0ZWQgJ21ha2V0Z3onIHRvIHVzZSB0aGUgbmV3IGF1dG9tYWtlIG1hZ2ljIHdoZW4gYnVpbGRpbmcgZGlzdHJpYnV0aW9uCiAgYXJjaGl2ZXMuCgotIEFueW9uZSBkZXNpcmVzIEhUTUwgYW5kL29yIFBERiB2ZXJzaW9ucyBvZiB0aGUgbWFuIHBhZ2VzIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZXM/CgoqIEp1bHkgMwotIEf8bnRlciBLbmF1ZiBtYWRlIGMtYXJlcyBidWlsZCBhbmQgcnVuIG9uIE5vdmVsbCBOZXR3YXJlLgoKKiBKdWx5IDEKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBNYWtlZmlsZS5kaiB0byBidWlsZCB3aXRoIGRqZ3BwLCBhZGRlZCBhIGZldyBtb3JlIGRqZ3BwCiAgZml4ZXMgYW5kIG1hZGUgYXJlcyBub3QgdXNlICdlcnJubycgdG8gcHJvdmlkZSBmdXJ0aGVyIGluZm8gb24gV2luZG93cy4KCiogSnVuZSAzMAotIEdpc2xlIFZhbmVtIG1hZGUgaXQgYnVpbGQgd2l0aCBkamdwcCBhbmQgcnVuIGZpbmUgd2l0aCB0aGUgV2F0dC0zMiBzdGFjay4KCiogSnVuZSAxMAotIEdpc2xlIFZhbmVtJ3MgaW5pdCBwYXRjaCBmb3IgV2luZG93czoKCiAgVGhlIGluaXRfYnlfcmVzb2x2X2NvbmYoKSBmdW5jdGlvbiBmZXRjaGVzIHRoZSBETlMtc2VydmVyKHMpCiAgZnJvbSBhIHNlcmllcyBvZiByZWdpc3RyeSBicmFuY2hlcy4KCiAgVGhpcyBjYW4gYmUgd3JvbmcgaW4gdGhlIGNhc2Ugd2hlcmUgREhDUCBoYXMgYXNzaWduZWQgbmFtZXNlcnZlcnMsIGJ1dCB0aGUKICB1c2VyIGhhcyBvdmVycmlkZGVuIHRoZXNlIHNlcnZlcnMgd2l0aCBvdGhlciBwcmVmZXJlZCBzZXR0aW5ncy4gVGhlbiBpdCdzCiAgd3JvbmcgdG8gdXNlIHRoZSBESENQTkFNRVNFUlZFUiBzZXR0aW5nIGluIHJlZ2lzdHJ5LgoKICBJbiB0aGUgY2FzZSBvZiBubyBnbG9iYWwgREhDUC1hc3NpZ25lZCBvciBmaXhlZCBzZXJ2ZXJzLCBidXQgRE5TIHNlcnZlcihzKQogIHBlciBhZGFwdGVyLCBvbmUgaGFzIHRvIHF1ZXJ5IHRoZSBhZGFwdGVyIGJyYW5jaGVzLiAgQnV0IGhvdyBjYW4gYy1hcmVzIGtub3cKICB3aGljaCBhZGFwdGVyIGlzIHZhbGlkIGZvciB1c2U/IEFGQUlDUyBpdCBjYW4ndC4gVGhlcmUgY291bGQgYmUgb25lIGFkYXB0ZXIKICB0aGF0IGlzIGRvd24gKGUuZy4gYSBWUE4gYWRhcHRlcikuCgogIFNvIGl0J3MgYmV0dGVyIHRvIGxlYXZlIHRoaXMgdG8gdGhlIElQIEhlbHBlciBBUEkgKGlwaGxhcGkpIGF2YWlsYWJsZSBpbgogIFdpbi05OC8yMDAwIGFuZCBsYXRlci4gTXkgcGF0Y2ggZmFsbHMtYmFjayB0byB0aGUgb2xkIHdheSBpZiBub3QgYXZhaWxhYmxlLgoKKiBKdW5lIDgKLSBKYW1lcyBCdXJzYSBmaXhlZCBhbiBpbml0IGlzc3VlIGZvciBSSVNDIE9TLgoKKiBNYXkgMTEKLSBOaWNvIFN0YXBwZW5iZWx0IHJlcG9ydGVkIHRoYXQgd2hlbiBwcm9jZXNzaW5nIGRvbWFpbiBhbmQgc2VhcmNoIGxpbmVzIGluCiAgdGhlIHJlc29sdi5jb25mIGZpbGUsIHRoZSBmaXJzdCBlbnRyeSBlbmNvdW50ZXJlZCBpcyBwcm9jZXNzZWQgYW5kIHVzZWQgYXMKICB0aGUgc2VhcmNoIGxpc3QuIEFjY29yZGluZyB0byB0aGUgbWFudWFsIHBhZ2VzIGZvciBib3RoIExpbnV4LCBTb2xhcmlzIGFuZAogIFRydTY0LCB0aGUgbGFzdCBlbnRyeSBvZiBlaXRoZXIgYSBkb21haW4gb3IgYSBzZWFyY2ggZmllbGQgaXMgdXNlZC4KCiAgVGhpcyBpcyBub3cgYWRqdXN0ZWQgaW4gdGhlIGNvZGUKClZlcnNpb24gMS4yLjAgKEFwcmlsIDEzLCAyMDA0KQoKKiBBcHJpbCAyLCAyMDA0Ci0gVXBkYXRlZCB2YXJpb3VzIG1hbiBwYWdlcyB0byBsb29rIG5pY2VyIHdoZW4gY29udmVydGVkIHRvIEhUTUwgb24gdGhlIHdlYgogIHNpdGUuCgoqIEFwcmlsIDEsIDIwMDQKLSBEaXJrIE1hbnNrZSBwcm92aWRlZCBhIG5ldyBmdW5jdGlvbiB0aGF0IGlzIG5vdyBuYW1lZCBhcmVzX2NhbmNlbCgpLiBJdCBpcwogIHVzZWQgdG8gY2FuY2VsL2NsZWFudXAgYSByZXNvbHZlL3JlcXVlc3QgbWFkZSB1c2luZyBhcmVzIGZ1bmN0aW9ucyBvbiB0aGUKICBnaXZlbiBhcmVzIGNoYW5uZWwuIEl0IGRvZXMgbm90IGRlc3Ryb3kva2lsbCB0aGUgYXJlcyBjaGFubmVsIGl0c2VsZi4KCi0gRG9taW5pY2sgTWVnbGlvIGNsZWFuZWQgdXAgdGhlIGZvcm1hdHRpbmcgaW4gc2V2ZXJhbCBtYW4gcGFnZXMuCgoqIE1hcmNoIDMwLCAyMDA0Ci0gRG9taW5pY2sgTWVnbGlvJ3MgbmV3IGFyZXNfZXhwYW5kX3N0cmluZy4gQSBoZWxwZXIgZnVuY3Rpb24gd2hlbiBkZWNvZGluZwogIGluY29taW5nIEROUyBwYWNrYWdlcy4KCi0gRGFuaWVsIFN0ZW5iZXJnIG1vZGlmaWVkIHRoZSBNYWtlZmlsZS5pbiB0byB1c2UgYSBmb3IgbG9vcCBmb3IgdGhlIG1hbiBwYWdlCiAgaW5zdGFsbGF0aW9uIHRvIGltcHJvdmUgb3ZlcnZpZXcgYW5kIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBtYW4gcGFnZXMuCgpWZXJzaW9uIDEuMS4wIChNYXJjaCAxMSwgMjAwNCkKCiogTWFyY2ggOSwgMjAwNAotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGJ1aWxkIG9uIFdpbmRvd3MuCgoqIEZlYnJ1YXJ5IDI1LCAyMDA0Ci0gRGFuIEZhbmRyaWNoIGZvdW5kIGEgZmxhdyBpbiB0aGUgRmViIDIyIGZpeC4KCi0gQWRkZWQgYmV0dGVyIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyBsb2dpYyAodGFrZW4gZnJvbSB0aGUgY3VybCBjb25maWd1cmUKICBzY3JpcHQpLiBBZGRlZCBhY2luY2x1ZGUubTQgdG8gdGhlIHRhcmJhbGwuCgoqIEZlYnJ1YXJ5IDIzLCAyMDA0Ci0gUmVtb3ZlZCBhcmVzX2ZyZWVfZXJybWVtKCksIHRoZSBmdW5jdGlvbiwgdGhlIGZpbGUgYW5kIHRoZSBtYW4gcGFnZS4gSXQgd2FzCiAgbm90IHVzZWQgYW5kIGl0IGRpZCBub3RoaW5nLgoKLSBGaXhlZCBhIGxvdCBvZiBjb2RlIHRoYXQgd2Fzbid0ICI2NGJpdCBjbGVhbiIgYW5kIHRodXMgY2F1c2VkIGEgbG90IG9mCiAgY29tcGlsZXIgd2FybmluZ3Mgb24gcGlja3kgY29tcGlsZXJzLgoKKiBGZWJydWFyeSAyMiwgMjAwNAotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGFyZXMgaW5pdCBzdXBwb3J0IG11bHRpcGxlIG5hbWUgc2VydmVycyBpbiB0aGUKICBOYW1lU2VydmVyIGtleSBvbiBXaW5kb3dzLgoKKiBGZWJydWFyeSAxNiwgMjAwNAotIE1vZGlmaWVkIGFyZXNfcHJpdmF0ZS5oIHRvIGluY2x1ZGUgbGliY3VybCdzIG1lbW9yeSBkZWJ1ZyBoZWFkZXIgaWYKICBDVVJMREVCVUcgaXMgc2V0LiBUaGlzIG1ha2VzIGFsbCB0aGUgYXJlcy1mdW5jdGlvbnMgc3VwZXJ2aXNlZCBwcm9wZXJseSBieQogIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gYWRkIGluY2x1c2lvbiBvZiB0aGUKICBhcmVzX3ByaXZhdGUuaCBoZWFkZXIgaW4gYSBmZXcgbW9yZSBmaWxlcyB0aGF0IGFyZSB1c2luZyBzb21lIGtpbmQgb2YKICBtZW1vcnktcmVsYXRlZCByZXNvdXJjZXMuCgotIE1hZGUgdGhlIG1ha2VmaWxlIG9ubHkgYnVpbGQgYWhvc3QgYW5kIGFkaWcgaWYgJ21ha2UgZGVtb3MnIGlzIHVzZWQuCgoqIEZlYnJ1YXJ5IDEwLCAyMDA0Ci0gRGlyayBNYW5za2UgbWFkZSBhcmVzX3ZlcnNpb24uaCBpbnN0YWxsZWQgd2l0aCAnbWFrZSBpbnN0YWxsJwoKKiBGZWJydWFyeSA0LCAyMDA0Ci0gYXJlc19mcmVlX2Vycm1lbSgpIGlzIHN1YmplY3QgZm9yIHJlbW92YWwsIGl0IGlzIHNpbXBseSBwcmVzZW50IGZvciBmdXR1cmUKICBwdXJwb3NlcywgYW5kIHNpbmNlIHdlIHJlbW92ZWQgdGhlIGV4dHJhIHBhcmFtZXRlciBpbiBzdHJlcnJvcigpIGl0IHdvbid0CiAgYmUgdXNlZCBieSBjLWFyZXMhCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIG5vdyBlbmFibGVzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgaWYgZ2NjIGlzIHVzZWQKLSBmaXhlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIC0tZW5hYmxlLWRlYnVnIHNob3dlZCBhbmQgSm9lcmcgTXVlbGxlci1Ub2xrCiAgcmVwb3J0ZWQKClZlcnNpb24gMS4wLjAgKEZlYnJ1YXJ5IDMsIDIwMDQpCgoqIEZlYnJ1YXJ5IDMsIDIwMDQKLSBub3cgd2UgcHJvZHVjZSB0aGUgbGliY2FyZXMuYSBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGxpYmFyZXMuYQogIHNpbmNlIHdlIGFyZSBubyBsb25nZXIgY29tcGF0aWJsZQoKKiBGZWJydWFyeSAyLCAyMDA0CgotIGFyZXNfc3RyZXJyb3IoKSBoYXMgb25lIGFyZ3VtZW50IGxlc3MuIFRoaXMgaXMgdGhlIGZpcnN0IG9mZmljaWFsCiAgbW9kaWZpY2F0aW9uIG9mIHRoZSBleGlzdGluZyBwcm92aWRlZCBhcmVzIEFQSS4KCiogSmFudWFyeSAyOSwgMjAwNAoKLSBEaXJrIE1hbnNrZSBmaXhlZCBob3cgdGhlIHNvY2tldCBpcyBzZXQgbm9uLWJsb2NraW5nLgoKKiBKYW51YXJ5IDQsIDIwMDQKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgdGhlIHByaXZhdGUgZ2V0dGltZW9mZGF5KCkgYmVjb21lIGFyZXNfZ2V0dGltZW9mZGF5KCkKICBpbnN0ZWFkIGluIG9yZGVyIHRvIG5vdCBwb2xsdXRlIHRoZSBuYW1lIHNwYWNlIGFuZCByaXNrIGNvbGxpZGluZyB3aXRoCiAgb3RoZXIgbGlicmFyaWVzJyB2ZXJzaW9ucyBvZiB0aGlzIGZ1bmN0aW9uLgoKKiBPY3RvYmVyIDI0LCAyMDAzLiBEYW5pZWwgU3RlbmJlcmcKCiAgQWRkZWQgYXJlc192ZXJzaW9uKCkuCgpWZXJzaW9uIDEuMC1wcmUxICg4IE9jdG9iZXIgMjAwMykKCi0gSmFtZXMgQnVyc2EgbWFkZSBpdCBydW4gb24gUklTQyBPUwoKLSBEb21pbmljayBNZWdsaW8gbWFkZSBpdCBydW4gZmluZSBvbiBOVDQKCi0gRHVuY2FuIFdpbGNveCBtYWRlIGl0IHdvcmsgZmluZSBvbiBNYWMgT1MgWAoKLSBEYW5pZWwgU3RlbmJlcmcgYWRqdXN0ZWQgdGhlIHdpbmRvd3MgcG9ydAoKLSBsaXJlbiBhdCB2aXZpc2ltby5jb20gbWFkZSB0aGUgaW5pdGlhbCB3aW5kb3dzIHBvcnQKCiogSW1wb3J0ZWQgdGhlIHNvdXJjZXMgZnJvbSBhcmVzIDEuMS4xCg==