ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjEyLjIgKDE4IE9jdG9iZXIgMjAwNCkKCkRhbmllbCAoMTYgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uIHdvcmsKICBmaW5lIGV2ZW4gZm9yIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCi0gcnVuZWtsIGF0IG9wb2ludC5jb20gZm91bmQgb3V0IChhbmQgcHJvdmlkZWQgYSBmaXgpIHRoYXQgbGliY3VybCBsZWFrZWQKICBtZW1vcnkgZm9yIGNvb2tpZXMgd2l0aCB0aGUgIm1heC1hZ2UiIGZpZWxkIHNldC4KCkdpc2xlICgxNiBPY3RvYmVyIDIwMDQpCi0gSXNzdWUgNTAgaW4gVE9ETy1SRUxFQVNFOyBBZGRlZCBUcmFpYW4gTmljb2xlc2N1J3MgcGF0Y2hlcyBmb3IgdGhyZWFkZWQKICByZXNvbHZlciBvbiBXaW5kb3dzLiBQbHVnZ2VkIHNvbWUgcG90ZW50aWFsIGhhbmRsZSBhbmQgbWVtb3J5IGxlYWtzLgoKRGFuaWVsICgxNCBPY3RvYmVyIDIwMDQpCi0gRXJpYyBWZXJnbmF1ZCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0ID8tbGV0dGVycyBpbiB0aGUgdXNlcgogIG5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkcyBwcm9wZXJseSBpbiBVUkxzLCBsaWtlCiAgZnRwOi8vdXM/ZXI6cGFzcz93b3JkQHNpdGUuY29tLy4gQWRkZWQgdGVzdCAxOTEgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwNCkKLSBsaWJjdXJsIG5vdyB1c2VzIFNPX05PU0lHUElQRSBmb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKE1hYyBPUyBYIDEwLjIgb3IKICBsYXRlciBpcyBvbmUpIHRvIGluaGliaXQgdGhlIFNJR1BJUEUgc2lnbmFsIHdoZW4gd3JpdGluZyB0byBhIHNvY2tldCB3aGlsZQogIHRoZSBwZWVyIGRpZXMuIFRoZSBzYW1lIGVmZmVjdCBpcyBwcm92aWRlIGJ5IHRoZSBNU0dfTk9TSUdOQUwgcGFyYW1ldGVyIHRvCiAgc2VuZCgpIG9uIG90aGVyIHN5c3RlbXMuIEFsYW4gUGluc3RlaW4gdmVyaWZpZWQgdGhlIGZpeC4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDA0KQotIFN5c3RlbXMgd2l0aCA2NGJpdCBsb25ncyBubyBsb25nZXJ1c2Ugc3RydG9sbCgpIG9yIG91ciBzdHJ0b2xsLSByZXBsYWNlbWVudAogIHRvIHBhcnNlIDY0IGJpdCBudW1iZXJzLiBzdHJ0b2woKSB3b3JrcyBmaW5lLiBBZGRlZCBhIGNvbmZpZ3VyZSBjaGVjayB0bwogIGRldGVjdCBpZiBbY29uc3RhbnRdTEwgd29ya3MgYW5kIGlmIHNvLCB1c2UgdGhhdCBpbiB0aGUgc3RydG9sbCByZXBsYWNlbWVudAogIGNvZGUgdG8gd29yayBhcm91bmQgY29tcGlsZXIgd2FybmluZ3MgcmVwb3J0ZWQgYnkgQW5keSBDZWRpbG5pay4KCkdpc2xlICg2IE9jdG9iZXIgMjAwNCkKLSBGb3IgVVNFX0xJQklETiBidWlsZHM6IEFkZGVkIFRvcC1MZXZlbC1Eb21haW4gKFRMRCkgY2hlY2sgb2YgaG9zdC1uYW1lCiAgdXNlZCBpbiBmaXhfaG9zdG5hbWUoKS4gQ2hlY2tzIGlmIGNoYXJhY3RlcnMgaW4gJ2hvc3QtPm5hbWUnIChpbmRpcmVjdGx5CiAgdmlhICdhY2VfaG9zdG5hbWUnKSBhcmUgbGVnYWwgYWNjb3JkaW5nIHRvIHRoZSBUTEQgdGFibGVzIGluIGxpYmlkbi4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDQpCi0gQ2hpaC1DaHVuZyBDaGFuZyByZXBvcnRlZCB0aGF0IGlmIHlvdSB1c2UgQ1VSTE9QVF9SRVNVTUVfRlJPTSBhbmQgZW5hYmxlZAogIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIGxpYmN1cmwgcmVwb3J0ZWQgZXJyb3IgaWYgYSByZWRpcmVjdCBoYXBwZW5lZCBldmVuCiAgaWYgdGhlIG5ldyBVUkwgd291bGQgcHJvdmlkZSB0aGUgcmVzdW1lZCBmaWxlLiBUZXN0IGNhc2UgMTg4IGFkZGVkIHRvIHZlcmlmeQogIHRoZSBmaXggKHRvZ2V0aGVyIHdpdGggZXhpc3RpbmcgdGVzdCA5OSkuCgotIERhbiBGYW5kcmljaCBmaXhlZCBhIGNvbmZpZ3VyZSBmbGF3IGZvciBzeXN0ZW1zIHRoYXQgbmVlZCBib3RoIG5zbCBhbmQgc29ja2V0CiAgbGlicyB0byB1c2UgZ2V0aG9zdGJ5bmFtZSgpLgoKLSBSZW1vdmVkIHRhYnMgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBsb3RzIG9mIHNvdXJjZSBmaWxlcy4KCkRhbmllbCAoNSBPY3RvYmVyIDIwMDQpCi0gTWFkZSBjb25maWd1cmUgLS13aXRoLWxpYmlkbj1QQVRIIHRyeSB0aGUgZ2l2ZW4gUEFUSCBiZWZvcmUgdGhlIGRlZmF1bHQKICBwYXRocyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlLgoKLSBJZiBpZG5hX3N0cmVycm9yKCkgaXMgcHJlc2VudCBpbiBsaWJpZG4sIHdlIGNhbiB1c2UgdGhhdCBpbnN0ZWFkIG9mIG91cgogIGludGVybmFsIHJlcGxhY2VtZW50LiBUaGlzIGZ1bmN0aW9uIHdhcyBhZGRlZCBieSBTaW1vbiBpbiBsaWJpZG4gMC41LjYgYW5kCiAgaXMgZGV0ZWN0ZWQgYnkgY29uZmlndXJlLgoKLSBJdCBzZWVtcyBiYXNlbmFtZSgpIG9uIElSSVggaXMgaW4gdGhlIGxpYmdlbiBsaWJyYXJ5IGFuZCBzaW5jZSB3ZSBkb24ndCB1c2UKICB0aGF0LCBjb25maWd1cmUgZmluZHMgbGliZ2VuLmggYnV0IG5vdCBiYXNlbmFtZSBhbmQgdGhlbiB3ZSBnZXQgYSBjb21waWxlcgogIGVycm9yIGJlY2F1c2Ugb3VyIGJhc2VuYW1lKCkgcmVwbGFjZW1lbnQgZG9lc24ndCBtYXRjaCB0aGUgcHJvdG8gaW4KICBsaWJnZW4uaC4gU3RhcnRpbmcgbm93LCB3ZSBkb24ndCBpbmNsdWRlIHRoZSBmaWxlIGlmIGJhc2VuYW1lIHdhc24ndCBmb3VuZAogIGFzIHdlbGwuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA0KQotIENocmlzIGZvdW5kIGEgcmFjZSBjb25kaXRpb24gcmVzdWx0aW5nIGluIENVUkxFX0NPVUxETlRfUkVTT0xWRV9IT1NUIGFuZAogIHBvdGVudGlhbCBjcmFzaCwgaW4gdGhlIHdpbmRvd3MgdGhyZWFkZWQgbmFtZSByZXNvbHZlciBjb2RlLgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwNCkKLSBSZXBsYWNlZCB0aGUgdXNlIG9mIGlzc3BhY2UoKSBpbiBjb29raWUuYyB3aXRoIG91ciBvd24gdmVyc2lvbiBpbnN0ZWFkIHNpbmNlCiAgd2UgaGF2ZSBtb3N0IGRhdGEgYXMgJ2NoYXIgKicgYW5kIHRoYXQgbWFrZXMgdXMgcGFzcyBpbiBuZWdhdGl2ZSB2YWx1ZXMgaWYKICB0aGVyZSBpcyA4Yml0IGRhdGEgaW4gdGhlIHN0cmluZy4gQ2hhbmdpbmcgdG8gdW5zaWduZWQgY2F1c2VzIHRvbyBtdWNoCiAgd2FybmluZ3Mgb3IgdG9vIG1hbnkgcmVxdWlyZWQgdHlwZWNhc3RzIHRvIHRoZSBub3JtYWwgc3RyaW5nIGZ1bmN0aW9ucy4KICBIYXJzaGFsIFByYWRoYW4gaWRlbnRpZmllZCB0aGlzIHByb2JsZW0uCgpEYW5pZWwgKDIgT2N0b2JlciAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGEgY2FzZSB3aGVyZSBsaWJjdXJsIGNvdWxkIHJlYWQgYWxyZWFkeSBmcmVlZAogIGRhdGEgd2hlbiBDVVJMT1BUX1ZFUkJPU0UgaXMgdXNlZCBhbmQgYSAodmVyeSkgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBJdAogIGhhcHBlbmVkIHdoZW4gdGhlIGRucyBjYWNoZSBlbnRyeSBmb3IgdGhlIGNvbm5lY3Rpb24gd2FzIHBydW5lZCB3aGlsZSB0aGUKICBjb25uZWN0aW9uIHdhcyBzdGlsbCBhbGl2ZSBhbmQgdGhlbiBhZ2FpbiByZS11c2VkLiBXZSB3b3JrZWQgdG9nZXRoZXIgb24KICB0aGlzIGZpeC4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IGRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgKGxpYmlkbgogIGJhc2VkKSBJRE4gY29udmVyc2lvbiBmYWlscy4gVGhpcyBpcyByZWFsbHkgZHVlIHRvIGEgbWlzc2luZyBzdWl0YWJsZQogIGZ1bmN0aW9uIGluIHRoZSBsaWJpZG4gQVBJIHRoYXQgSSBob3BlIHdlIGNhbiByZW1vdmUgb25jZSBsaWJpZG4gZ2V0cyBhCiAgZnVuY3Rpb24gbGlrZSB0aGlzLgoKRGFuaWVsICgxIE9jdG9iZXIgMjAwNCkKLSBBbGVrc2FuZGFyIE1pbGl2b2pldmljIHJlcG9ydGVkIGEgcHJvYmxlbSBpbiB0aGUgUmVkaGF0IGJ1Z3ppbGxhIChzZWUKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzNDEzMykgYW5kIG5vdCB0bwogIGFueW9uZSBpbnZvbHZlZCBpbiB0aGUgY3VybCBwcm9qZWN0ISBUaGlzIGhhcHBlbnMgd2hlbiB5b3UgdHJ5IHRvIGN1cmwgYQogIGZpbGUgZnJvbSBhIHByb2Z0cGQgc2l0ZSB1c2luZyBTU0wuIEl0IHNlZW1zIHByb2Z0cGQgc2VuZHMgYSBzb21ld2hhdAogIHVub3J0aG9kb3ggcmVzcG9uc2UgY29kZSAoMjMyIGluc3RlYWQgb2YgMjMwKS4gSSByZWxheGVkIHRoZSByZXNwb25zZSBjb2RlCiAgY2hlY2sgdG8gZGVhbCB3aXRoIHRoaXMgYW5kIHNpbWlsYXIgY2FzZXMuCgotIEJhc2VkIG9uIEZlZG9yIEthcnBlbGV2aXRjaCdzIGZvcm1wb3N0IHBhdGggYmFzZW5hbWUgcGF0Y2gsIGZpbGUgcGFydHMgaW4KICBmb3JtcG9zdHMgbm8gbG9uZ2VyIGluY2x1ZGUgdGhlIHBhdGggcGFydC4gSWYgeW91IF9yZWFsbHlfIHdhbnQgdGhlbSwgeW91CiAgbXVzdCBwcm92aWRlIHlvdXIgcHJlZmVycmVkIGZ1bGwgZmlsZSBuYW1lIHdpdGggQ1VSTEZPUk1fRklMRU5BTUUuCgogIEFkZGVkIGRldGVjdGlvbiBmb3IgbGliZ2VuLmggYW5kIGJhc2VuYW1lKCkgdG8gY29uZmlndXJlLiBNeSBjdXN0b20KICBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGZ1bmN0aW9uIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQsIG1pZ2h0IGJlIGEgYml0IHRvbwogIG5haXZlLi4uCgogIFVwZGF0ZWQgNiB0ZXN0IGNhc2VzIHRvIG1ha2UgdGhlbSB3b3JrIHdpdGggdGhlIHN0cmlwcGVkIHBhdGhzLgoKRGFuaWVsICgzMCBTZXB0ZW1iZXIgMjAwNCkKLSBMYXJyeSBDYW1wYmVsbCBhZGRlZCBDVVJMSU5GT19PU19FUlJOTyB0byBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRoYXQgYWxsb3dzIGFuCiAgYXBwIHRvIHJldHJpZXZlIHRoZSBlcnJubyB2YXJpYWJsZSBhZnRlciBhIChjb25uZWN0KSBmYWlsdXJlLiBJdCB3aWxsIG1ha2UKICBzZW5zZSB0byBwcm92aWRlIHRoaXMgZm9yIG1vcmUgZmFpbHVyZXMgaW4gYSBtb3JlIGdlbmVyaWMgd2F5LCBidXQgbGV0J3MKICBzdGFydCBsaWtlIHRoaXMuCgotIEf8bnRlciBLbmF1ZiBhbmQgQ2FzZXkgTydEb25uZWxsIHdvcmtlZCBvdXQgYW4gZXh0cmEgI2lmIGNvbmRpdGlvbiBmb3IgdGhlCiAgY3VybC9tdWx0aS5oIGhlYWRlciB0byB3b3JrIGJldHRlciBpbiB3aW5zb2NrLXVzaW5nIGFwcHMuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgbWFkZSBidWlsZGNvbmYgcnVuIGJldHRlciBvbiBNYWMgT1MgWCBieQogIHByb3Blcmx5IHVzaW5nIGdsaWJ0b29saXplIGluc3RlYWQgb2YgcGxhaW4gbGlidG9vbGl6ZS4gKFRoaXMgaXMgbWFkZSBpZgogIGdsaWJ0b29sIHdhcyBmb3VuZCBhbmQgdXNlZCBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2wuKQoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCBjdXJsX2Vhc3lfcmVzZXQoKSBzbyB0aGF0IGl0IGRvZXNuJ3QgbWlzdGFraW5nbHkKICBlbmFibGUgdGhlIHByb2dyZXNzIG1ldGVyLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwNCkKLSAiTWVrb25pa3VtIiBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgYnVpbHQgY3VybCB3aXRob3V0IFNTTCBzdXBwb3J0LCBhbHRob3VnaAogIHlvdXIgY3VycmVudCBTU0wgaW5zdGFsbGF0aW9uIHN1cHBvcnRzIEVuZ2luZSwgdGhlIGNvbXBpbGUgZmFpbHMuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA0KQotIFdoZW4gLS13aXRoLXNzbD1QQVRIIGlzIHVzZWQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGl0IG5vIGxvbmdlciB1c2VzCiAgcGtnLWNvbmZpZyB0byBmaWd1cmUgb3V0IGV4dHJhIGRldGFpbHMuIFRoYXQgaXMgbm93IG9ubHkgZG9uZSBpZiBubyBQQVRIIGlzCiAgaW5jbHVkZWQgb3IgaWYgU1NMIGlzIGNoZWNrZWQgZm9yIGJ5IGRlZmF1bHQgd2l0aG91dCB0aGUgLS13aXRoLXNzbCBvcHRpb24uCgpEYW5pZWwgKDI1IFNlcHRlbWJlciAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCB0aGF0IENVUkxPUFRfU1NMRU5HSU5FIGNvdWxkbid0IGV2ZW4gYmUgc2V0IHRvCiAgTlVMTCB3aGVuIG5vIGVuZ2luZSB3YXMgc3VwcG9ydGVkLiBJdCBjYW4gbm93LgoKRGFuaWVsICgyMiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhyZWUgdGVzdCBjYXNlcyB0byBubyBsb25nZXIgdXNlICJsb2NhbGhvc3QiIGJ1dCBpbnN0ZWFkCiAgdXNlICIxMjcuMC4wLjEiIHRvIGF2b2lkIHJlcXVpcmluZyB0aGF0IGxvY2FsaG9zdCByZXNvbHZlcyBuaWNlbHkuCgotIEplYW4tQ2xhdWRlIENoYXV2ZSBmaXhlZCBhbiBMREFQIGNyYXNoIHdoZW4gbW9yZSB0aGFuIG9uZSByZWNvcmQgd2FzCiAgcmV0cmlldmVkLgoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwNCkKLSBBbmRyZWFzIFJpZWtlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHdpdGhvdXQKICBhIHNlcnZpY2Ugb24gdGhlIHNwZWNpZmllZCBwb3J0LCBjdXJsX2Vhc3lfcGVyZm9ybSgpIGRpZG4ndCBwcm9wZXJseSBwcm92aWRlCiAgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgQ1VSTE9QVF9FUlJPUkJVRkZFUiBidWZmZXIuCgpEYW5pZWwgKDE2IFNlcHRlbWJlciAyMDA0KQotIERhbmllbCBhdCB0b3VjaHR1bmVzIHVzZXMgdGhlIEZUUCtTU0wgc2VydmVyICJCU0RGVFBELVNTTCBmcm9tCiAgaHR0cDovL2JzZGZ0cGQtc3NsLnNjLnJ1LyIgd2hpY2ggYWNjb3JkaW5nbHkgZG9lc24ndCBwcm9wZXJseSB3b3JrIHdpdGggY3VybAogIHdoZW4gIkFVVEggU1NMIiBpcyBpc3N1ZWQgKGFsdGhvdWdoIHRoZSBzZXJ2ZXIgcmVzcG9uZHMgZmluZSBhbmQgZXZlcnl0aGluZykKICBidXQgcmVxdWlyZXMgdGhhdCBjdXJsIGlzc3VlcyAiQVVUSCBUTFMiIGluc3RlYWQuIFNlZQogIGh0dHA6Ly9jdXJsLmhheHguc2UvZmVlZGJhY2svZGlzcGxheS5jZ2k/aWQ9MTA5NTE5NDQ5Mzc2MDMmc3VwcG9ydD15ZXMKCiAgSW50cm9kdWNpbmcgQ1VSTE9QVF9GVFBTU0xBVVRIIHRoYXQgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbiB0byBzZWxlY3Qgd2hpY2gKICBvZiB0aGUgQVVUSCBzdHJpbmdzIHRvIGF0dGVtcHQgZmlyc3QuCgotIEFub255bW91cyBmaWxlZCBidWcgcmVwb3J0ICMxMDI5NDc4IHdoaWNoIGlkZW50aWZpZWQgYSBidWcgd2hlbiB5b3UgMSkgdXNlZAogIGEgVVJMIHdpdGhvdXQgcHJvcGVybHkgc2VwZXJhdGluZyB0aGUgaG9zdCBuYW1lIGFuZCB0aGUgcGFyYW1ldGVycyB3aXRoIGEKICBzbGFzaC4gMikgdGhlIFVSTCBoYWQgcGFyYW1ldGVycyB0byB0aGUgcmlnaHQgb2YgYSA/IHRoYXQgY29udGFpbnMgYSBzbGFzaAogIDMpIGN1cmwgd2FzIHRvbGQgdG8gZm9sbG93IExvY2F0aW9uOnMgNCkgdGhlIHJlcXVlc3QgZ290IGEgcmVzcG9uc2UgdGhhdAogIGNvbnRhaW5lZCBhIExvY2F0aW9uOiB0byByZWRpcmVjdCB0byAiL2RpciIuIGN1cmwgdGhlbiBhcHBlbmRlZCB0aGUgbmV3IHBhdGgKICBvbiB0aGUgd3JvbmcgcG9zaXRpb24gb2YgdGhlIG9yaWdpbmFsIFVSTC4KCiAgVGVzdCBjYXNlIDE4NyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyB3YXMgZml4ZWQgcHJvcGVybHkuCgpEYW5pZWwgKDExIFNlcHRlbWJlciAyMDA0KQotIEFkZGVkIHBhcnNlZGF0ZS5jIHRoYXQgY29udGFpbnMgYSByZXdyaXRlIG9mIHRoZSBkYXRlIHBhcnNlciBjdXJyZW50bHkKICBwcm92aWRlZCBieSBnZXRkYXRlLnkuIFRoZSBuZXcgb25lIGlzIE1VQ0ggc21hbGxlciBhbmQgd2lsbCBhbGxvdyB1cyB0byBydW4KICBhd2F5IGZyb20gdGhlIHlhY2MvYmlzb24ganVuZ2xlLiBJdCBpcyBhbHNvIHNsaWdodGx5IGxhY2tpbmcgaW4gZmVhdHVyZXMKICBjb21wYXJlZCB0byB0aGUgb2xkIG9uZSwgYnV0IGl0IHN1cHBvcnRzIHBhcnNpbmcgb2YgYWxsIGRhdGUgZm9ybWF0cyBIVFRQCiAgaW52b2x2ZXMgKGFuZCBhIGZhaXIgYnVuY2ggb2Ygb3RoZXJzKS4KCkRhbmllbCAoMTAgU2VwdGVtYmVyIDIwMDQpCi0gQXMgZm91bmQgb3V0IGJ5IEpvbmFzIEZvcnNtYW4sIGN1cmwgZGlkbid0IGFsbG93IC1GIHRvIHNldCBDb250ZW50LVR5cGUgb24KICB0ZXh0LXBhcnRzLiBTdGFydGluZyBub3csIHdlIGNhbiBkbyAtRiAibmFtZT1kYW5pZWw7dHlwZT10ZXh0L2V4dHJhIi4gQWRkZWQKICB0ZXN0IGNhc2UgMTg2IHRvIHZlcmlmeS4KCi0gQnVnIHJlcG9ydCAjMTAyNTk4Ni4gV2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjogd2l0aCBhIGN1c3RvbSBIb3N0OiBoZWFkZXIKICByZXBsYWNlbWVudCwgY3VybCBvbmx5IHJlcGxhY2VkIHRoZSBIb3N0OiBoZWFkZXIgb24gdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCBkaWRuJ3QgcmVwbGFjZSBpdCBvbiB0aGUgZm9sbG93aW5nIG9uZXMuIFRoaXMgcmVzdWx0ZWQgaW4gcmVxdWVzdHMgd2l0aAogIHR3byBIb3N0OiBoZWFkZXJzLgoKICBOb3csIGN1cmwgY2hlY2tzIGlmIHRoZSBsb2NhdGlvbiBpcyBvbiB0aGUgc2FtZSBob3N0IGFzIHRoZSBpbml0aWFsIHJlcXVlc3QKICBhbmQgdGhlbiBjb250aW51ZXMgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyLiBBbmQgd2hlbiBpdCBtb3ZlcyB0byBhbm90aGVyCiAgaG9zdCwgaXQgZG9lc24ndCByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgYnV0IGl0IGFsc28gZG9lc24ndCBtYWtlIHRoZQogIHNlY29uZCBIb3N0OiBoZWFkZXIgZ2V0IHVzZWQgaW4gdGhlIHJlcXVlc3QuCgogIFRoaXMgY2hhbmdlIGlzIHZlcmlmaWVkIGJ5IHRoZSB0d28gbmV3IHRlc3QgY2FzZXMgMTg0IGFuZCAxODUuCgpEYW5pZWwgKDggU2VwdGVtYmVyIDIwMDQpCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUgdG8gYmUgYWJsZSB0byB1c2UgYW5kIHJ1biB3aXRoIGN1c3RvbWl6ZWQgcG9ydAogIG51bWJlcnMuIFRoaXMgd2FzIGFsd2F5cyBpbnRlbmRlZCBidXQgbmV2ZXIgYmVmb3JlIHBvc3NpYmxlLiBOb3cgYSBzaW1wbGUKICBjaGFuZ2UgaW4gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCBjYW4gbWFrZSBhbGwgdGVzdHMgdXNlIGRpZmZlcmVudCBwb3J0cy4KICBUaGUgZGVmYXVsdCBwb3J0cyBpbiB1c2UgZnJvbSBub3cgb24gYXJlIDg5OTAgdG8gODk5My4KCkRhbmllbCAoMiBTZXB0ZW1iZXIgMjAwNCkKLSBNaW5vciBtb2RpZmljYXRpb24gb2YgYW4gU1NMLXJlbGF0ZWQgZXJyb3IgbWVzc2FnZS4KCkRhbmllbCAoMzEgQXVndXN0IDIwMDQpCi0gRGF2aWQgVGFyZW5kYXNoIGZvdW5kIG91dCB0aGF0IGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgpIHJldHVybmVkCiAgQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGluc3RlYWQgb2YgQ1VSTE1fT0suCgpEYW5pZWwgKDMwIEF1Z3VzdCAyMDA0KQotIE1ha2UgIlByb3h5LUNvbm5lY3Rpb246IGNsb3NlIiBjbG9zZSB0aGUgY3VycmVudCBwcm94eSBjb25uZWN0aW9uLCBhcyBSb21hbgogIEtvaWZtYW4gZm91bmQgb3V0LgoKRGFuaWVsICgyNCBBdWd1c3QgMjAwNCkKLSBGaXhlZCBhIGdldGRhdGUgcHJvYmxlbSBieSBwb3N0LXJlcGxhY2luZyB0aGUgZ2V0ZGF0ZS5jIGZpbGUgYWZ0ZXIgdGhlCiAgYmlzb24veWFjYyBwcm9jZXNzIHRvIGFkZCB0aGUgZml4IEhhcnNoYWwgUHJhZGhhbiBzdWdnZXN0ZWQuIFRoZSBwcm9ibGVtCiAgY2F1c2VkIGEgY3Jhc2ggb24gV2luZG93cyB3aGVuIHBhcnNpbmcgc29tZSBkYXRlcy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDQpCi0gUm9tYW4gS29pZm1hbiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgc2VuZCBFeHBlY3Q6IDEwMC1jb250aW51ZSBvbiBQT1NUcwogIGV2ZW4gd2hlbiB0b2xkIHRvIHVzZSBIVFRQIDEuMCwgd2hpY2ggaXMgbm90IGNvcnJlY3QuIFRlc3QgY2FzZSAxODAgYW5kCiAgMTgxIHZlcmlmeSB0aGlzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMTgyIHRvIHZlcmlmeSB0aGF0IHplcm8gYnl0ZSB0cmFuc2ZlcnMgY2FsbCB0aGUgY2FsbGJhY2sKICBwcm9wZXJseS4KCkRhbmllbCAoMjAgQXVndXN0IDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSB0aGUgd3JpdGUgY2FsbGJhY2sgZ2V0IGNhbGxlZCBldmVuIHdoZW4gYSB6ZXJvCiAgYnl0ZSBmaWxlIGlzIGRvd25sb2FkZWQuCgpEYW5pZWwgKDE4IEF1Z3VzdCAyMDA0KQotIExpbmcgVGhpbyBwb2ludGVkIG91dCB0aGF0IHdoZW4gbGliY3VybCBpcyBidWlsdCBpcHY2LWVuYWJsZWQsIGl0IHN0aWxsIGRpZAogIHJldmVyc2UgRE5TIGxvb2t1cHMgd2hlbiBmZWQgd2l0aCBhIG51bWVyaWNhbCBJUC1hZGRyZXNzIChsaWtlCiAgaHR0cDovLzEyNy4wLjAuMS8pLCBhbHRob3VnaCBpdCBkb2Vzbid0IHdoZW4gYnVpbHQgaXB2Ni1kaXNhYmxlZC4gbGliY3VybAogIHNob3VsZCBuZXZlciBkbyByZXZlcnNlIGxvb2t1cHMuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA0KQotIEtqZXRpbCBKYWNvYnNlbiBub3RpY2VkIHRoYXQgd2hlbiB0cmFuc2ZlcnJpbmcgYSBmaWxlOi8vIFVSTCBwb2ludGluZyB0byBhbgogIGVtcHR5IGZpbGUsIGxpYmN1cmwgd291bGQgcmV0dXJuIHdpdGggdGhlIGZpbGUgc3RpbGwgb3Blbi4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBuZWVkcyB0byBkZWZpbmUKICBfVEhSRUFEX1NBRkUgZm9yIEFJWCBzeXN0ZW1zIHRvIG1ha2UgbGliY3VybCBidWlsdCByZWFsbHkgdGhyZWFkLXNhZmUuCgogIEFsc28gYWRkZWQgYSBjaGVjayBmb3IgdGhlIHhsYyBjb21waWxlciBvbiBBSVgsIGFuZCBpZiB0aGF0IGlzIGRldGVjdCB3ZSB1c2UKICB0aGUgLXF0aHJlYWRlZCBjb21waWxlciBvcHRpb24KCkRhbmllbCAoMTYgQXVndXN0IDIwMDQpCi0gbGliY3VybCBub3cgYWxsb3dzIGEgY3VzdG9tICJBY2NlcHQtRW5jb2Rpbmc6IiBoZWFkZXIgb3ZlcnJpZGUgdGhlCiAgaW50ZXJuYWxseSBzZXQgb25lIHRoYXQgZ2V0cyBzZXQgd2l0aCBDVVJMT1BUX0VOQ09ESU5HLiBQb2ludGVkIG91dCBieSBBbGV4LgoKLSBSb2xhbmQgS3Jpa2F2YSBmb3VuZCBhbmQgZml4ZWQgYSBjb29raWUgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgKHRoZQogIHBhdGggbWF0Y2hpbmcgd2FzIHdyb25nKS4gSSBhZGRlZCB0ZXN0IGNhc2UgMTc5IHRvIHZlcmlmeSB0aGF0IHdlIG5vdyBkbwogIHJpZ2h0LgoKRGFuaWVsICgxNSBBdWd1c3QgMjAwNCkKLSBDYXNleSBPJ0Rvbm5lbGwgZml4ZWQgc29tZSBNU1ZDIG1ha2VmaWxlIHRhcmdldHMgdG8gbGluayBwcm9wZXJseS4KCkRhbmllbCAoMTEgQXVndXN0IDIwMDQpCi0gY29uZmlndXJlIG5vdyBkZWZpbmVzIF9YT1BFTl9TT1VSQ0UgdG8gNTAwIG9uIHN5c3RlbXMgdGhhdCBuZWVkIGl0IHRvIGJ1aWxkCiAgd2FybmluZy1mcmVlICh0aGUgb25seSBrbm93biBvbmUgc28gZmFyIGlzIG5vbi1nY2MgYnVpbGRzIG9uIDY0Yml0IFNHSQogIElSSVgpLiAoUmV2ZXJ0ZWQgdGhpcyBjaGFuZ2UgbGF0ZXIgYXMgaXQgY2F1c2VkIGNvbXBpbGVyIGVycm9ycy4pCgotIHRoZSBGVFAgY29kZSBub3cgaW5jbHVkZXMgdGhlIHNlcnZlciByZXNwb25zZSBpbiB0aGUgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZQogIHNlcnZlciBnaXZlcyBiYWNrIGEgNTMwIGFmdGVyIHRoZSBwYXNzd29yZCBpcyBwcm92aWRlZCwgYXMgaXQgaXNuJ3QKICBuZWNlc3NhcnkgYmVjYXVzZSBvZiBhIGJhZCB1c2VyIG5hbWUgb3IgcGFzc3dvcmQuCgpWZXJzaW9uIDcuMTIuMSAoMTAgQXVndXN0IDIwMDQpCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDA0KQotIEluIE9wZW5TU0wgMC45LjdkIGFuZCBlYXJsaWVyLCBBU04xX1NUUklOR190b19VVEY4IGZhaWxzIGlmIHRoZSBpbnB1dCBpcwogIGFscmVhZHkgVVRGLTggZW5jb2RlZC4gVGhpcyBtYWRlIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gZmFpbCBpZiB0aGUKICByZW1vdGUgc2VydmVyIHVzZWQgYSBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBuYW1lIFVURi04IGVuY29kZWQuCgogIFdvcmstYXJvdW5kIGJyb3VnaHQgYnkgQWxleGlzIFMuIEwuIENhcnZhbGhvLgoKRGFuaWVsICg5IEF1Z3VzdCAyMDA0KQotIEkgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGtyYjQgdG8gdXNlIC1sY29tX2VyciBhcyB3ZWxsLCBhcyBJIHN0YXJ0ZWQKICB0byBnZXQgbGluayBwcm9ibGVtcyB3aXRoIGl0IHVubGVzcyBJIGRpZCB0aGF0IG9uIG15IFNvbGFyaXMgMi43IGJveC4gSQogIGRvbid0IHVuZGVyc3RhbmQgd2h5IEkgc3RhcnRlZCB0byBnZXQgcHJvYmxlbXMgd2l0aCB0aGlzIG5vdyEKCkRhbmllbCAoNSBBdWd1c3QgMjAwNCkKLSBFbnJpY28gU2Nob2x6IGZpeGVkIHRoZSBIVFRQLU5lZ290aWF0ZSBzZXJ2aWNlIG5hbWUgdG8gYmUgdXBwZXJjYXNlIGFzCiAgcmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjMTAwNDEwNQoKRGFuaWVsICg0IEF1Z3VzdCAyMDA0KQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGEgZml4IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIGFuZCBjb25uZWN0aW5nIHRvIGEgaG9zdAogIHVzaW5nIG11bHRpcGxlIElQIChiYWQpIGFkZHJlc3Nlcy4KCi0gRHlsYW4gU2FsaXNidXJ5IG1hZGUgbGliY3VybCBubyBsb25nZXIgYWNjZXB0IGNvb2tpZXMgc2V0IHRvIGEgVExEIG9ubHkgKGl0CiAgcHJldmlvdXNseSBhbGxvd2VkIHRoYXQgb24gdGhlIHNldmVuIHRocmVlLWxldHRlciBkb21haW5zKS4KCkRhbmllbCAoMzEgSnVseSAyMDA0KQotIEpvZWwgQ2hlbiByZXBvcnRlZCB0aGF0IHRoZSBkaWdlc3QgY29kZSBhc3N1bWVkIHF1b3RlcyBhcm91bmQgdGhlIGNvbnRlbnRzIGEKICBiaXQgdG9vIG11Y2guCgpEYW5pZWwgKDI4IEp1bHkgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0aGUgaG9zdCBuYW1lIHRvIGdldCBzZXR1cCBwcm9wZXJseSBldmVuIHdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCwgd2hlbiBhIHByb3h5IGlzIGluIHVzZS4gUHJldmlvdXNseSB0aGUgd3JvbmcgSG9zdDoKICBoZWFkZXIgY291bGQgZ2V0IHNlbnQgd2hlbiByZS11c2luZyBhIHByb3h5IGNvbm5lY3Rpb24gdG8gYSBkaWZmZXJlbnQgdGFyZ2V0CiAgaG9zdC4KCi0gRml4ZWQgQnJpYW4gQWtpbnMnIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggZHVwbGljYXRlIEhvc3Q6IGhlYWRlcnMgb24gcmUtdXNlZAogIGNvbm5lY3Rpb25zLiBJZiB5b3UgYXR0ZW1wdGVkIHRvIHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBpbiB0aGUgc2Vjb25kCiAgcmVxdWVzdCwgeW91IGdvdCB0d28gc3VjaCBoZWFkZXJzIQoKLSBzcmMvTWFrZWZpbGUuYW0gbm93IGluY2x1ZGVzIHRoZSBNYWtlZmlsZS5pbmMgZmlsZSB0byBnZXQgaW5mbyBhYm91dCBmaWxlcwoKRGFuaWVsICgyNiBKdWx5IDIwMDQpCi0gTWFkZSAiY3VybCBbVVJMXSAtbyBuYW1lIzIiIHdvcmsgYXMgZXhwZWN0ZWQuIElmIHRoZXJlJ3Mgbm8gZ2xvYmJpbmcgZm9yIHRoZQogICMtbnVtYmVyLCBpdCB3aWxsIHNpbXBseSBiZSB1c2VkIGFzICMyIGluIHRoZSBmaWxlIG5hbWUuCgotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRlc3Rpbmcgd2l0aCB2YWxncmluZCAyLjEueCBhbmQgYWRkZWQgdHdvIG1pc3NpbmcKICBuZXdsaW5lcyBpbiB0aGUgY29va2llIGluZm9ybWF0aW9uYWxzLgoKRGFuaWVsICgyNCBKdWx5IDIwMDQpCi0gSSBmaXhlZCB0aGUgYXV0b2J1aWxkcyB3aXRoIGFyZXMsIHNpbmNlIHRoZXkgbm93IG5lZWQgdG8gaGF2ZSBidWlsZGNvbmYgcnVuCiAgaW4gdGhlIGFyZXMgZGlyIGJlZm9yZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpcyBydW4uCgotIEFkZGVkIENhc2V5IE8nRG9ubmVsbCdzIGN1cmxfZWFzeV9yZXNldCgpIGZ1bmN0aW9uLiBJdCBoYXMgYSBwcm90byBpbgogIGN1cmwvY3VybC5oIGJ1dCB3ZSBoYXZlIG5vIG1hbiBwYWdlIHlldC4KCkRhbmllbCAoMjAgSnVseSAyMDA0KQotIEFkZGVkIGJ1aWxkY29uZiBhbmQgYnVpbGRjb25mLmJhdCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlcywgc2luY2UgdGhleSBhcmUKICBoYW5keSBmb3IgcmVidWlsZGluZyBjdXJsIHdoZW4gdXNpbmcgYSBkYWlseSBzbmFwc2hvdCAoYW5kIG5vdCBhIHB1cmUgQ1ZTCiAgY2hlY2tvdXQpLgoKRGFuaWVsICgxNiBKdWx5IDIwMDQpCi0gQXMgc3VnZ2VzdGVkIGJ5IFRvYnkgUGV0ZXJzb24sIGxpYmN1cmwgbm93IGlnbm9yZXMgQ29udGVudC1MZW5ndGggZGF0YSBpZiB0aGUKICBnaXZlbiBzaXplIGlzIGEgbmVnYXRpdmUgbnVtYmVyLiBUZXN0IGNhc2UgMTc4IHZlcmlmaWVzIHRoaXMuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNCkKLSBH/G50ZXIgS25hdWYgaGFzIG1hZGUgdGhlIE5ldHdhcmUgYnVpbGRzIGRvIHdpdGhvdXQgdGhlIGNvbmZpZy1uZXR3YXJlLmgKICBmaWxlcywgc28gdGhleSBhcmUgbm93IHJlbW92ZWQgZnJvbSB0aGUgZGlzdCBwYWNrYWdlcy4KCi0gR/xudGVyIEtuYXVmIG1hZGUgY3VybCBhbmQgbGliY3VybCBidWlsZCB3aXRoIEJvcmxhbmQgYWdhaW4uCgotIEFuZHJlcyBHYXJjaWEgZml4ZWQgdGhlIGNvbW1vbiB0ZXN0IDUwNSBmYWlsdXJlcyBvbiB3aW5kb3dzLgoKRGFuaWVsICg2IEp1bHkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIG91dCB3aHkgdGhlIHdpbmRvd3MgdGVzdHMgZmFpbGVkIG9uIGZpbGU6Ly8gInVwbG9hZHMiLgoKRGFuaWVsICgyIEp1bHkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIHJlcG9ydGVkIGEgY3VybF9zaGFyZV9jbGVhbnVwKCkgY3Jhc2ggdGhhdCBvY2N1cnMgd2hlbiBubwogIGxvY2svdW5sb2NrIGNhbGxiYWNrcyBoYXZlIGJlZW4gc2V0IGFuZCB0aGUgc2hhcmUgaXMgY2xlYW5lZCB1cC4KCkRhbmllbCAoMSBKdWx5IDIwMDQpCi0gV2hlbiB1c2luZyBjdXJsIC0tdHJhY2Ugb3IgLS10cmFjZS1hc2NpaSwgbm8gdHJhY2UgbWVzc2FnZXMgdGhhdCB3ZXJlIHNlbnQKICBieSBjdXJsX2Vhc3lfY2xlYW51cCgpIHdlcmUgaW5jbHVkZWQgaW4gdGhlIHRyYWNlIGZpbGUuIFRoaXMgbWFkZSB0aGUKICBtZXNzYWdlICJDbG9zaW5nIGNvbm5lY3Rpb24gIzAiIG5ldmVyIGFwcGVhciBpbiB0cmFjZSBkdW1wcy4KCkRhbmllbCAoMzAgSnVuZSAyMDA0KQotIE5pZWxzIHZhbiBUb25nZXJlbiBmb3VuZCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gVFJVRSBkb2Vzbid0IGRpc2FibGUKICBhIHByZXZpb3VzbHkgc2V0IFBPU1QgcmVxdWVzdCwgbWFraW5nIGEgdmVyeSBvZGQgcmVxdWVzdCBnZXQgc2VudCAodW5sZXNzCiAgeW91IGRpc2FibGVkIHRoZSBQT1NUKSBhIEhFQUQgcmVxdWVzdCB3aXRoIGEgUE9TVCByZXF1ZXN0LWJvZHkuIEkndmUgbm93CiAgbWFkZSBDVVJMT1BUX05PQk9EWSBlbmZvcmNlIGEgcHJvcGVyIEhFQUQuIEFkZGVkIHRlc3QgY2FzZSA1MTQgZm9yIHRoaXMuCgpEYW5pZWwgKDI5IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgbWFkZSB0aGUgdGVzdGN1cmwucGwgc2NyaXB0IGNhcGFibGUgb2YgdXNpbmcgYSBjdXN0b20gc2V0dXAKICBmaWxlIHRvIGVhc2llciBydW4gbXVsdGlwbGUgYXV0b2J1aWxkcyBvbiB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KCi0gR2lzbGUgZml4ZWQgdGhlIGRqZ3BwIGJ1aWxkIGFuZCBmaXhlZCBhIG1lbW9yeSBwcm9ibGVtIGluIHNvbWUgb2YgdGhlCiAgcmVvcmdlZCBuYW1lIHJlc29sdmVkIGNvZGUuCgotIEZpeGVkIGNvZGUgdG8gYWxsb3cgY29ubmVjdHMgZG9uZSB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIGF0dGVtcHQgdGhlCiAgbmV4dCBJUCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgSVBzIGFuZCBhCiAgY29ubmVjdCBhdHRlbXB0IGZhaWxzLgoKRGFuaWVsICgyNyBKdW5lIDIwMDQpCi0gQmFzZWQgb24gUm9iIFN0YW56ZWwncyBidWcgcmVwb3J0ICM5Nzk0ODAsIEkgd3JvdGUgYSBjb25maWd1cmUgY2hlY2sgdGhhdAogIGNoZWNrcyBpZiBwb2xsKCkgY2FuIGJlIHVzZWQgdG8gd2FpdCBvbiBOVUxMIGFzIG90aGVyd2lzZSBzZWxlY3QoKSBzaG91bGQgYmUKICB1c2VkIHRvIGRvIGl0LiBUaGUgc2VsZWN0KCkgdXNhZ2Ugd2FzIGFsc28gZml4ZWQgYWNjb3JkaW5nIHRvIGhpcyByZXBvcnQuCgogIE1hYyBPUyBYIDEwLjMgc2F5cyAicG9sbCgpIGZ1bmN0aW9uYWxpdHkgZm9yIE1hYyBPUyBYIGlzIGltcGxlbWVudGVkIHZpYSBhbgogIGVtdWxhdGlvbiBsYXllciBvbiB0b3Agb2Ygc2VsZWN0KCksIG5vdCBpbiB0aGUga2VybmVsIGRpcmVjdGx5LiBJdCBpcwogIHJlY29tbWVuZGVkIHRoYXQgcHJvZ3JhbXMgcnVubmluZyB1bmRlciBPUyBYIDEwLjMgcHJlZmVyIHNlbGVjdCgpIG92ZXIKICBwb2xsKCkuIENvbmZpZ3VyZSBzY3JpcHRzIHNob3VsZCBsb29rIGZvciB0aGUgX1BPTExfRU1VTF9IXyBkZWZpbmUgKGluc3RlYWQKICBvZiBfUE9MTF9IXyBvciBfU1lTX1BPTExfSF8pIGFuZCBhdm9pZCBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgcG9sbCBpcyBub3QKICBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsLiIKCiAgWWVzLCB3ZSBjYW4gcHJvYmFibHkgdXNlIHNlbGVjdCgpIG9uIG1vc3QgcGxhdGZvcm1zIGJ1dCB0b2RheSBJIHByZWZlcmVkIHRvCiAgbGVhdmUgdGhlIGNvZGUgdW5hbHRlcmVkLgoKRGFuaWVsICgyNCBKdW5lIDIwMDQpCi0gVGhlIHN0YW5kYXJkIGN1cmxfdmVyc2lvbigpIHN0cmluZyBub3cgb25seSBpbmNsdWRlcyB2ZXJzaW9uIGluZm8gYWJvdXQKICBpbnZvbHZlZCBsaWJyYXJpZXMgYW5kIG5vdCBhYm91dCBwYXJ0aWN1bGFyIGZlYXR1cmVzLiBUaHVzIGl0IHdpbGwgbm8gbG9uZ2VyCiAgaW5jbHVkZSBpbmZvIGFib3V0IGlwdjYgbm9yIEdTUy4gVGhhdCBpbmZvIGlzIG9mIGNvdXJzZSBzdGlsbCBhdmFpbGFibGUgaW4KICB0aGUgZmVhdHVyZSBiaXRtYXNrIGN1cmxfdmVyc2lvbl9pbmZvKCkgb2ZmZXJzLgoKLSBSZXBsYWNlZCBhbGwgb2NjdXJhbmNlcyBvZiBzcHJpbnRmKCkgd2l0aCBzbnByaW50ZigpLiBUaGlzIGlzIG1vc3RseSBiZWNhdXNlCiAgaXQgaXMgIkEgR29vZCBUaGluZyIgcmF0aGVyIHRoYW4gYWN0dWFsbHkgZml4aW5nIGFueSBrbm93biBwcm9ibGVtLiBUaGlzCiAgd2lsbCBoZWxwIHByZXZlbnRpbmcgZnV0dXJlIHBvc3NpYmxlIG1pc3Rha2VzIHRvIGNhdXNlIGJ1ZmZlciBvdmVyZmxvd3MuCgotIE1ham9yIHJlb3JnYW5pemF0aW9uIGluIHRoZSBob3N0IHJlc29sdmUgY29kZSAoYWdhaW4pLiBUaGlzIHRpbWUsIEkndmUKICBtb2RpZmllZCB0aGUgY29kZSB0byBub3cgYWx3YXlzIHVzZSBhIGxpbmtlZCBsaXN0IG9mIEN1cmxfYWRkcmluZm8gc3RydWN0cwogIHRvIHJldHVybiByZXNvbHZlZCBpbmZvIGluLCBubyBtYXR0ZXIgd2hhdCByZXNvbHZlciBtZXRob2Qgb3Igc3VwcG9ydCB0aGF0CiAgaXMgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS4gSXQgbWFrZXMgaXQgYSBsb3QgZWFzaWVyIHRvIHdyaXRlIGNvZGUgdGhhdAogIHVzZXMgb3IgZGVwZW5kcyBvbiByZXNvbHZlZCBkYXRhLgoKICBJbnRlcm5hbGx5LCB0aGlzIG1lYW5zIGFtb25nc3Qgb3RoZXIgdGhpbmdzIHRoYXQgd2UgY2FuIHN0b3AgZG9pbmcgdGhlIHdlaXJkCiAgImluY3JlYXNlIGJ1ZmZlciBzaXplIHVudGlsIGl0IHdvcmtzIiB0cmljayB3aGVuIHJlc29sdmluZyBob3N0cyBvbgogIGlwdjQtb25seSB3aXRoIGdldGhvc3RieW5hbWVfcigpLCB3ZSBzdXBwb3J0IHNvY2tzIGV2ZW4gb24gbGliY3VybHMgYnVpbHQKICB3aXRoIGlwdjYgZW5hYmxlZCAoYnV0IG9ubHkgdG8gc29ja3Mgc2VydmVycyB0aGF0IHJlc29sdmUgdG8gYW4gaXB2NAogIGFkZHJlc3MpIGFuZCB3ZSBubyBsb25nZXIgZGVlcC1jb3B5IG9yIHJlbG9jYXRlIGhvc3RlbnQgc3RydWN0cyAod2UgY3JlYXRlCiAgQ3VybF9hZGRyaW5mbyBjaGFpbnMgaW5zdGVhZCkuCgogIFRoZSBuZXcgImhvc3RlbnQgdG8gQ3VybF9hZGRyaW5mbyIgY29udmVydGVyIGZ1bmN0aW9uIGlzIG5hbWVkIEN1cmxfaGUyYWkoKQogIGFuZCBpcyBzbGlnaHRseSBuYWl2ZSBhbmQgc2ltcGxlLCB5ZXQgSSBiZWxpZXZlIGl0IGlzIGZ1bmN0aW9uYWwgZW5vdWdoIHRvCiAgd29yayBmb3IgbGliY3VybC4KCkRhbmllbCAoMjIgSnVuZSAyMDA0KQotIERhdmlkIENvaGVuIHBvaW50ZWQgb3V0IHRoYXQgUkZDMjEwOSBzYXlzIGNsaWVudHMgc2hvdWxkIGFsbG93IGNvb2tpZXMgdG8KICBjb250YWluIGxlYXN0IDQwOTYgYnl0ZXMgd2hpbGUgbGliY3VybCBvbmx5IGFsbG93ZWQgMjA0Ny4gSSByYWlzZWQgdGhlIGxpbWl0CiAgdG8gNDk5OSBub3cgYW5kIG1hZGUgdGhlIHVzZWQgYnVmZmVyIGdldCBtYWxsb2MoKWVkIGluc3RlYWQgb2Ygc2ltcGx5CiAgYWxsb2NhdGVkIG9uIHN0YWNrIGFzIGJlZm9yZS4gRXh0ZW5kZWQgdGVzdCBjYXNlIDQ2IHRvIGluY2x1ZGUgYSBjb29raWUgd2l0aAogIHZlcnkgaHVnZSBjb250ZW50IHRvIHZlcmlmeSB0aGUgZml4LgoKLSBH/G50ZXIgS25hdWYgZml4ZWQgZ2V0ZGF0ZS55IHRvIHJlbW92ZSBhIGZldyB3YXJuaW5ncy4gSSByZW1vdmVkIHRoZQogIGlmZGVmJ2VkIHRlc3Qgd2UgbmV2ZXIgZXZlciB1c2UgYW55d2F5LgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY2VydGlmaWNhdGUgd2lsZGNhcmQgY2hlY2tzIHRvIHN1cHBvcnQgYSAnKictbGV0dGVyCiAgYW55d2hlcmUgaW4gdGhlIHdpbGRjYXJkIHN0cmluZywgc3VwcG9ydCBtdWx0aXBsZSAnKictbGV0dGVycyBpbiB0aGUKICB3aWxkY2FyZCBhbmQgdG8gYWxsb3cgdGhlICcqJy1sZXR0ZXIgdG8gbWF0Y2ggYSBzdHJpbmcgdGhhdCBpbmNsdWRlcyBhIGRvdC4KCkRhbmllbCAoMjEgSnVuZSAyMDA0KQotIHRlc3RjdXJsLnNoIGlzIG5vdyByZW1vdmVkIGNvbXBsZXRlbHksIHRlc3RzL3Rlc3RjdXJsLnBsIGlzIHRoZSBzY3JpcHQgdG8KICB1c2Ugd2hlbiBhdXRvYnVpbGRpbmcgY3VybCEKCi0gS2pldGlsIEphY29ic2VuIGJyb3VnaHQgbXkgYXR0ZW50aW9uIHRvIHRoZSBmYWN0IHRoYXQgeW91IGNhbm5vdCBwcm9wZXJseQogIGFib3J0IGFuIHVwbG9hZCB3aXRoIHRoZSByZWFkZnVuY3Rpb24gY2FsbGJhY2ssIHNpbmNlIHJldHVybmluZyAwIG9yIC0xIG9ubHkKICBzdG9wcyB0aGUgdXBsb2FkIGFuZCBsaWJjdXJsIHdpbGwgY29udGludWUgd2FpdGluZyBmb3IgZG93bmxvYWRlZCBkYXRhIGFuZAogIHRoZSBzZXJ2ZXIgb2Z0ZW4gd2FpdHMgZm9yIHRoZSByZXN0IG9mIHRoZSB1cGxvYWQgZGF0YSB0byBhcnJpdmUuCgogIFRodXMsIEkndmUgbm93IGFkZGVkIHRoZSBhYmlsaXR5IGZvciByZWFkIGNhbGxiYWNrcyB0byByZXR1cm4KICBDVVJMX1JFQURGVU5DX0FCT1JUIHRvIGFib3J0IGFuIHVwbG9hZCBmcm9tIGEgcmVhZCBjYWxsYmFjay4gVGhpcyB3aWxsIHN0b3AKICB0aGUgdHJhbnNmZXIgaW1tZWRpYXRlbHkgd2l0aCBhIENVUkxFX0FCT1JURURfQllfQ0FMTEJBQ0sgcmV0dXJuIGNvZGUuCgogIFRlc3QgY2FzZSA1MTMgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IGl0IHdvcmtzLiBJIGhhZCB0byBpbXByb3ZlIHRoZSB0ZXN0CiAgSFRUUCBzZXJ2ZXIgdG9vIHRvIGR1bXAgdGhlIHJlcXVlc3QgdG8gYSBmaWxlIGV2ZW4gd2hlbiB0aGUgY2xpZW50CiAgZGlzY29ubmVjdHMgcHJlbWF0dXJlbHkuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNCkKLSBMdWNhIEFsdGVhcyBwcm92aWRlZCBhIHRlc3QgY2FzZSB3aXRoIGEgZmFpbGluZyBjdXJsIG9wZXJhdGlvbjogd2hlbiB3ZSBQT1NUCiAgdG8gYSBzaXRlIHdpdGggLS1kaWdlc3QgKG9yIHNpbWlsYXIpIHNldCwgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSAzMDIKICBMb2NhdGlvbjogdG8gdGhlICJhdXRocHJvYmUiIHJlcXVlc3QsIGl0IHdhcyBub3QgdHJlYXRlZCBjb3JyZWN0bHkuIFdlIHN0aWxsCiAgd2lsbCBiZWhhdmUgYmFkbHkgaWYgRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZCBmb3IgdGhpcyBjYXNlLCBidXQgSSdtIG5vdAogIGluIHRoZSBtb29kIHRvIGRpdmUgaW50byB0aGlzIHJpZ2h0IG5vdyBhbmQgd2lsbCBsZWF2ZSBpdCBhcy1pcyBmb3Igbm93LgogIFZlcmlmaWVkIG15IGZpeCB3aXRoIHRlc3QgY2FzZSAxNzcuCgpEYW5pZWwgKDE4IEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgcHJvdmlkZXMgbW9yZSBkZXRhaWxzIGZyb20gdGhlIFNTTCBsYXllcnMgKGlmIHlvdQogIHVzZSBhbiBPcGVuU1NMIHZlcnNpb24gdGhhdCBzdXBwb3J0cyBpdCkuIEl0IGFsc28gaW50cm9kdWNlcyB0d28gbmV3IHR5cGVzCiAgb2YgZGF0YSB0aGF0IGNhbiBiZSBzZW50IHRvIHRoZSBkZWJ1ZyBjYWxsYmFjazogQ1VSTElORk9fU1NMX0RBVEFfSU4gYW5kCiAgQ1VSTElORk9fU1NMX0RBVEFfT1VULgoKLSBXaXRoIERhdmlkIEJ5cm9uJ3MgdGVzdCBzZXJ2ZXIgSSBjb3VsZCByZXBlYXQgaGlzIHByb2JsZW0gYW5kIG1ha2Ugc3VyZSB0aGF0CiAgUE9TVGluZyBvdmVyIEhUVFBTOi8vIHdpdGggTlRMTSB3b3JrcyBmaW5lIG5vdy4gVGhlcmUgd2FzIGEgZ2VuZXJhbCBwcm9ibGVtCiAgd2l0aCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9uIHdpdGggbm9uLUdFVCBvcGVyYXRpb25zIHdpdGggQ09OTkVDVC4KCkRhbmllbCAoMTYgSnVuZSAyMDA0KQotIE1vZGlmaWVkIHRvIGtlZXAgdGhlIHVwbG9hZCBieXRlIGNvdW50ZXIgaW4gYW4gY3VybF9vZmZfdCwgbm90IGFuIGludCBhcwogIGJlZm9yZS4gMzJiaXRzIGlzIG5vdCBlbm91Z2guIFRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGJ1ZyBKZWFuLUxvdWlzIExlbWFpcmUKICByZXBvcnRlZCB0aGF0IG1ha2VzIDJHQiBGVFAgdXBsb2FkcyB0byByZXBvcnQgZXJyb3IgKCJ1bmFsaWduZWQgZmlsZSBzaXplcyIpCiAgd2hlbiBjb21wbGV0ZWQuCgpEYW5pZWwgKDE1IEp1bmUgMjAwNCkKLSBMdWNhIEFsdGVhcyByZXBvcnRlZCBhIHByb2JsZW0gdGhhdCBJIGZpeGVkOiBpZiB5b3UgZGlkIGEgUE9TVCB3aXRoCiAgQ1VSTEFVVEhfRElHRVNUIHNldCBidXQgdGhlIHNlcnZlciBkaWRuJ3QgcmVxdWlyZSBhbnkgYXV0aGVudGljYXRpb24sCiAgbGliY3VybCB3b3VsZCByZXBlYXRlZGx5IHNlbmQgSEVBRCBsb3RzIG9mIHRpbWVzIHVudGlsIGl0IGdpdmVzIHVwLiBUaGlzIHdhcwogIGFjdHVhbGx5IHRoZSBjYXNlIGZvciBhbGwgbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbnMuIEFkZGVkIHRlc3QgY2FzZSAxNzQsCiAgMTc1IGFuZCAxNzYgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IEp1bmUgMjAwNCkKLSBNdWx0aXBhcnQgZm9ybXBvc3RzIHVwbG9hZGluZyBmaWxlcyBubyBsb25nZXIgaW5zZXJ0cyB0aGUgZmlsZXMgdGhlbXNlbHZlcwogIGludG8gdGhlIGh1Z2UgcHJlYnVpbHQgY2h1bmsuIFRoaXMgZW5hYmxlcyBsaWJjdXJsIHRvIGZvcm1wb3N0IGZpbGVzIHRoYXQgaXMKICBsYXJnZXIgdGhhbiB0aGUgYW1vdW50IG9mIHN5c3RlbSBtZW1vcnkuIFdoZW4gdGhlIGZpbGUgZ2l2ZW4gaXMgcGFzc2VkIG9uCiAgc3RkaW4sIGxpYmN1cmwgc3RpbGwgdXNlcyB0aGUgb2xkIG1ldGhvZCBvZiByZWFkaW5nIHRoZSBmdWxsIGZpbGwgYmVmb3JlIHRoZQogIHVwbG9hZCB0YWtlcyBwbGFjZS4gVGhpcyBhcHByb2FjaCB3YXMgc2VsZWN0ZWQgaW4gb3JkZXIgdG8gbm90IGFsdGVyIHRoZQogIGJlaGF2aW9yIGZvciBleGlzdGluZyBhcHBsaWNhdGlvbnMsIGFzIHdoZW4gdXNpbmcgc3RkaW4gbGliY3VybCBjYW4ndCBrbm93CiAgdGhlIHNpemUgb2YgdGhlIHVwbG9hZCBhbmQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBjYW4gb25seSBiZSB1c2VkIG9uCiAgSFRUUCAxLjEgc2VydmVycy4KCkRhbmllbCAoMTMgSnVuZSAyMDA0KQotIEdpc2xlIGZvdW5kIG91dCB0aGF0IHdlIGRpZCB3aWxkY2FyZCBjZXJ0IG5hbWUgY2hlY2tzIHdyb25nLCBzbyB0aGF0IHBhcnRzCiAgb2YgdGhlIGNoZWNrIHdyb25nbHkgd2FzIGNhc2Ugc2Vuc2l0aXZlLgoKRGFuaWVsICgxMSBKdW5lIDIwMDQpCi0gVGltIFNuZWRkb24gYnJvdWdodCBhIG1pbm9yIFZNUyBmaXggdG8gbWFrZSBjdXJsIGJ1aWxkIHByb3Blcmx5IG9uIGhpcyBWTVMKICBtYWNoaW5lLiBIZSBhbHNvIGhhZCBzb21lIGludGVyZXN0aW5nIGxpYmN1cmwgcGF0Y2hlcy4uLiB0aGV5IG1pZ2h0IGJlIGFibGUKICB0byBkbyBpbiBhIHNsaWdodGx5IG5pY2VyIHdheS4gRGlzY3Vzc2lvbnMgYXJlIGluIHByb2dyZXNzLgoKRGFuaWVsICgxMCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0gYnJvdWdodCBjb2RlIGNsZWFudXBzbSBiZXR0ZXIgdmVyYm9zZSBvdXRwdXQgYW5kIGJldHRlciBjb25uZWN0CiAgdGltZW91dCBoYW5kbGluZyB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0bwogIG11bHRpcGxlIElQIGFkZHJlc3Nlcy4KCi0gU3RldmVuIEJhenlsIGFuZCBTZXNodWJhYnUgUGFzYW0gcG9pbnRlZCBvdXQgYSBidWcgb24gd2luMzIgd2hlbiBmcmVlaW5nIHRoZQogIHBhdGggYWZ0ZXIgYSBmaWxlOi8vIHRyYW5zZmVyLgoKRGFuaWVsICg5IEp1bmUgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlICdjb25maWd1cmUgLS1kaXNhYmxlLWh0dHAnIHdvcmsgdG8gYnVpbGQgbGliY3VybAogIHdpdGhvdXQgSFRUUCBzdXBwb3J0LiBJIGFkZGVkIGEgbmV3IHJldHVybiBjb2RlIGZvciBjdXJsX2Zvcm1hZGQoKSBpbiBjYXNlCiAgbGliY3VybCBpcyBidWlsdCB3aXRoIEhUVFAgZGlzYWJsZTogQ1VSTF9GT1JNQUREX0RJU0FCTEVELgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCBhIG1pc3NpbmcgZmlsZSBpbiB0aGUgZ2VuZXJhdGVkCiAgY3VybGxpYi5kc3AgZmlsZSwgYW5kIG5vdyBwZW9wbGUgYnVpbGRpbmcgd2l0aCB0aGlzIHNob3VsZCBnZXQgYSBsaWJjdXJsLmxpYgogIGZpbGUgZ2VuZXJhdGVkIGFzIGl0IHVzZWQgdG8gZG8gYmVmb3JlIHdlIGdlbmVyYXRlZCB0aGlzIGZpbGUuCgpEYW5pZWwgKDggSnVuZSAyMDA0KQotIE1hcnR5IEt1aHJ0IGZpeGVkIGEgbWlub3IgYnVpbGQgcHJvYmxlbSBmb3IgVk1TLgoKRGFuaWVsICg3IEp1bmUgMjAwNCkKLSBSZXZlcnRlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZyb20gdGhlIDR0aCBzaW5jZSBpdCBvYnZpb3VzbHkgZGlkbid0IHdvcmsuCiAgUmVtYWRlIGl0IGluIGEgZGlmZmVyZW50IG1hbm5lciB0aGF0IGhvcGVmdWxseSB3b3JrcyBiZXR0ZXIuCgpEYW5pZWwgKDQgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBicm91Z2h0IHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTmV0V2FyZSBhZ2Fpbi4KCi0gTWFkZSB0aGUgY29uZmlndXJlIGNoZWNrcyBmb3Igc3RyZXJyb3JfcigpIG5vdCBleGl0IHRoZSBjb25maWd1cmUgc2NyaXB0CiAgd2hlbiBidWlsdCBmb3IgY3Jvc3MtY29tcGlsaW5nLgoKRGFuaWVsICgzIEp1bmUgMjAwNCkKLSBDaHJpcyBHYXVrcm9nZXIgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSB0ZXN0JyBhdHRlbXB0cyB0byBydW4gdGhlIHRlc3RzIGV2ZW4KICBpZiBjdXJsIGlzIGJ1aWx0IGNyb3NzLWNvbXBpbGVkLiBJJ3ZlIG5vdyBtYWRlIGl0IG91dHB1dCBhIHNob3J0IG1lc3NhZ2UKICBpbnN0ZWFkLCBzYXlpbmcgaXQgaXNuJ3QgcG9zc2libGUgdG8gZG8uCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IGJyb3VnaHQgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlciBzdXBwb3J0IHRvIGxpYmN1cmwuCiAgWW91IGNhbiBub3cgdXNlIGxpYmN1cmwgdG8gdHJhbnNmZXIgZmlsZXMgYmV0d2VlbiB0d28gcmVtb3RlIGhvc3RzIHVzaW5nCiAgRlRQLiBUaGVyZSBhcmUgYSBidW5jaCBvZiBuZXcgb3B0aW9ucyB0byBjb250cm9sIHRoaXMgd2l0aDoKICAgQ1VSTE9QVF9TT1VSQ0VfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9VU0VSUFdECiAgIENVUkxPUFRfU09VUkNFX1BBVEgKICAgQ1VSTE9QVF9TT1VSQ0VfUE9SVAogICBDVVJMT1BUX1BBU1ZfSE9TVAogICBDVVJMT1BUX1NPVVJDRV9QUkVRVU9URQogICBDVVJMT1BUX1NPVVJDRV9QT1NUUVVPVEUKCiAgKFRoZXkgc3RpbGwgcmVtYWluIHRvIGJlIGRvY3VtZW50ZWQgcHJvcGVybHkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuCiAgcGFnZS4pCgogIFdoZW4gdXNpbmcgdGhpcywgdGhlIG9yZGluYXJ5IENVUkxPUFRfVVJMIHNwZWNpZmllcyB0aGUgdGFyZ2V0IFVSTCwgYW5kIHlvdQogIHNwZWNpZnkgdGhlIHNvdXJjZSBkYXRhIHdpdGggdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zLiBmdHAzcmRwYXJ0eS5jIGlzIGEKICBuZXcgZXhhbXBsZSBzb3VyY2UgY29kZSBzaG93aW5nIGhvdyB0byB1c2UgdGhpcy4KCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBIVFRQIERpZ2VzdCBjb2RlIHRvIHVzZSB0aGUgcHJveHkgdXNlciBuYW1lIGFuZAogIHBhc3N3b3JkIHdoZW4gZG9pbmcgcHJveHkgYXV0aGVudGljYXRpb24sIGl0IHByZXZpb3VzbHkgYWx3YXlzIHVzZWQgdGhlIGhvc3QKICB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIQoKRGFuaWVsICgyIEp1bmUgMjAwNCkKLSBDVVJMT1BUX1VQTE9BRCBhbmQgQ1VSTE9QVF9QVVQgbm93IGRvIHRoZSBleGFjdCBzYW1lIHRoaW5nIGludGVybmFsbHksIHdoaWNoCiAgZml4ZXMgc29tZSBvbGQgY29uZnVzaW9ucyBvbiB3aGVuIHdoaWNoIG9mIHRoZXNlIHNob3VsZCBiZSB1c2VkIGFuZCB3aGF0IHRoZQogIGRpZmZlcmVuY2VzIGFyZS4KCi0gQXBwbGllZCBHaXNsZSdzIGZpeGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIHdpdGggbGNjLXdpbjMyCgpWZXJzaW9uIDcuMTIuMCAoMiBKdW5lIDIwMDQpCgpEYW5pZWwgKDEgSnVuZSAyMDA0KQotIEkgY2xhcmlmaWVkIHRoZSAtLWNyZWF0ZS1kaXJzIG9wdGlvbiBzb21ld2hhdCBpbiB0aGUgY3VybCBtYW4gcGFnZS4KCi0gUmVuYXVkIER1aGF1dCBjb3JyZWN0ZWQgdGhlIGN1cmxfdW5lc2NhcGUgbWFuIHBhZ2UuCgotIERhdmlkIEJ5cm9uIG1vZGlmaWVkIG9uZSBvZiBNYXNzaW1pbGlhbm8gWmljY2FyZGkncyByZWNlbnQgTVNWQyBtYWtlZmlsZQogIGNoYW5nZXMgdG8gbm93IGFnYWluIHVzZSB0aGUgbW0gbGliIGJ5IGRlZmF1bHQuCgpEYW5pZWwgKDI2IE1heSAyMDA0KQotIE1vaHVuIEJpc3dhcyBhZGRlZCByZWxlYXNlLXpsaWIgYW5kIGRlYnVnLXpsaWIgdGFyZ2V0cyB0byB0aGUgTVNWQyBsaWJjdXJsCiAgTWFrZWZpbGUKCi0gRGF2aWQgQnlyb24gcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBkb2luZyBDT05ORUNULAogIGxpa2Ugd2hlbiBhY2Nlc3NpbmcgSFRUUFMgc2l0ZXMgd2lodCBhIHByb3h5LiBUaGlzIHByb2JhYmx5IGJyb2tlIHdoZW4gSQogIHJld3JvdGUgdGhlIGF1dGggc3R1ZmYgcmVjZW50bHkuCgotIEkgYWRkZWQgZmlsZXVwbG9hZC5jIGluIHRoZSBleGFtcGxlcyBkaXJlY3RvcnksIHNob3dpbmcgaG93IGFuIHVwbG9hZCB0byBhCiAgZmlsZTovLyBVUkwgaXMgbWFkZS4KCkRhbmllbCAoMjUgTWF5IDIwMDQpCi0gTWFzc2ltaWxpYW5vIFppY2NhcmRpIHVwZGF0ZWQgdGhlIE1TVkMgbWFrZWZpbGVzLgoKRGFuaWVsICgyNCBNYXkgMjAwNCkKLSBsaWJjdXJsIG5vdyBzdXBwb3J0cyAidXBsb2FkaW5nIiB0byBmaWxlOi8vIFVSTHMuIFRlc3QgMjA0IGFuZCAyMDUgd2VyZQogIGFkZGVkIHRvIHZlcmlmeS4KCi0gU2ltb24gSm9zZWZzc29uIGFkZGVkIGEgaWRuX2ZyZWUoKSBmdW5jdGlvbiBpbiBsaWJpZG4gMC40LjUgYXMgYSByZWFjdGlvbiB0bwogIEdpc2xlJ3MgcHJldmlvdXMgbWFpbC4gV2Ugbm93IHVzZSB0aGlzIGZ1bmN0aW9uLCBhbmQgdGh1cyB3ZSByZXF1aXJlIGxpYmlkbgogIDAuNC41IG9yIGxhdGVyLiBObyBlYXJsaWVyIHZlcnNpb24gd2lsbCBkby4KCi0gUm9iZXJ0IEQuIFlvdW5nIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DT09LSUVGSUxFIGFuZCBDVVJMT1BUX0NPT0tJRSBjb3VsZAogIG5vdCBiZSB1c2VkIGJvdGggaW4gb25lIHJlcXVlc3QuIEZpeGVkIGl0IGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTcyIHRvIHZlcmlmeS4KCkRhbmllbCAoMjEgTWF5IDIwMDQpCi0gV2hpbGUgdGFsa2luZyB0byBob3N0IGEuYi5jLCBsaWJjdXJsIGRpZCB3cm9uZ2x5IG5vdCBhY2NlcHQgY29va2llcyB0aGF0CiAgd2VyZSBzZXQgdG8gdGhlIGRvbWFpbiAuYS5iLmMgKHRoYXQgaXMgd2l0aCBhIGRvdCBwcmVmaXgpLiBUaGlzIGlzIG5vdyBmaXhlZAogIGFuZCB0ZXN0IGNhc2UgMTcxIHZlcmlmaWVzIGl0LgoKRGFuaWVsICgyMCBNYXkgMjAwNCkKLSBKZXNzZSBOb2xsZXIgcmVwb3J0ZWQgdGhhdCB0aGUgdXBsb2FkIHNwZWVkIGluZm8gcmVwb3J0ZWQgYnkgbGliY3VybCB3YXMKICB3cm9uZy4gVGhlIHNhbWUgd2FzIHRydWUgZm9yIHRoZSBkb3dubG9hZCBzcGVlZC4gRml4ZWQgbm93LgoKRGFuaWVsICgxOSBNYXkgMjAwNCkKLSBEYXZpZCBCeXJvbiBhZGRlZCB0ZXN0IGNhc2UgMTcwIC0gdGhpcyB1c2VkIHRvIGNyYXNoIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mCiAgY3VybC4KCkRhbmllbCAoMTcgTWF5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggdGhhdCBhZGRyZXNzZXMgdHdvIGZsYXdzIGluIHRoZSBwZWVyIGNlcnRpZmljYXRlCiAgbmFtZSB2ZXJpZmljYXRpb246CiAgbyB3aGVuIG11bHRpcGxlIGNvbW1vbiBuYW1lcyBhcmUgdXNlZCAoYXMgaW4gdGhlIGN1cmwgdGVzdHMpLCB0aGUgbGFzdCBuYW1lCiAgICBuZWVkcyB0byBiZSBzZWxlY3RlZC4KICBvIGFsbG93IGNvbXBhcmluZyB3aXRoIGVuY29kZWQgdmFsdWVzLCBhdCBsZWFzdCB3aXRoIEJNUCBhbmQgSVNPIGxhdGluMQogICAgZW5jb2RlZCBUNjFzdHJpbmdzLgoKLSBBbGwgMTkxIHRlc3QgY2FzZXMgcnVuIHRocm91Z2ggdGhlIHRvcnR1cmUgdGVzdCBPSyEgJ21ha2UgdGVzdC10b3J0dXJlJyBpcwogIG5vdyBhdmFpbGFibGUgaW4gdGhlIHJvb3QgbWFrZWZpbGUgKG9uIGNvbmZpZ3VyZS1iYXNlZCBlbnZpcm9ubWVudHMpLgoKRGFuaWVsICgxNCBNYXkgMjAwNCkKLSBXaXRoIGEgc2xpZ2h0bHkgbW9kaWZpZWQgZnRwc2VydmVyLnBsIEkndmUgbm93IHJ1biBhbG1vc3QgYWxsIHRlc3RzIHRocm91Z2gKICB3aXRoIHJ1bnRlc3RzLnBsIC10LiBUaGlzIGlzIGdvb2RuZXNzIQoKLSBTaW5jZSBJIGhhdmUgYmVlbiB1bmFibGUgdG8gY29udGFjdCB0aGUgQ1ZTIGFkbWlucyBmb3Igc2V2ZXJhbCBtb250aHMsIEkndmUKICBkZWNpZGVkIHRoYXQgdGhlIGN1cnJlbnQgQ1ZTIGhvc3Rpbmcgd2FzIG5vdCBnb29kIGVub3VnaC4gSSd2ZSBub3cgbW92ZWQgdGhlCiAgQ1ZTIHJlcG8gb25jZSBhZ2Fpbiwgc2VlIFJFQURNRSBmb3IgdXBkYXRlZCBjdnMgY2hlY2tvdXQgaW5zdHJ1Y3Rpb25zLgoKRGFuaWVsICgxMyBNYXkgMjAwNCkKLSBydW50ZXN0cy5wbCAtdCBub3cgcnVucyBmaW5lIGFsbCB0aGUgd2F5IHRvIHRlc3QgMTAwLiBJIGJlbGlldmUgdGVzdCBjYXNlCiAgMTAwIGZhaWxzIGJlY2F1c2Ugb2YgYW4gRlRQIHNlcnZlciBwcm9ibGVtLgoKRGFuaWVsICgxMiBNYXkgMjAwNCkKLSBHZW5lcmFsIGNsZWFudXBzIGFsbCBvdmVyIHRvIG1ha2UgbGliY3VybCBzdXJ2aXZlIGFuZCBkbyB3ZWxsIHdoZW4gYSBtZW1vcnkKICBmdW5jdGlvbiByZXR1cm5zIE5VTEwuIHJ1bnRlc3RzLnBsIC10IG5vdyB3b3JrcyBmaW5lIGZvciB0aGUgZmlyc3QgMjYgdGVzdAogIGNhc2VzLgoKRGFuaWVsICgxMSBNYXkgMjAwNCkKLSBTZXNodWJhYnUgUGFzYW0gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZXMgY3VybF9nbG9iYWxfaW5pdF9tZW0oKSAtCiAgbGlrZSBub3JtYWwgY3VybF9nbG9iYWxfaW5pdCgpIGJ1dCBhbGxvd3MgdGhlIGFwcCB0byByZXBsYWNlIGFsbCBtZW1vcnkKICBmdW5jdGlvbnMgd2l0aCBpdHMgb3duIHNldC4gSSBtb2RpZmllZCBpdCBzbGlnaHRseS4KCi0gQmFzZWQgb24gTHVjYSBBbHRlYXMnIGNvbW1lbnRzLCBJIG1vZGlmaWVkIHRoZSBjdXJsbGliLmRzcCBnZW5lcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDEwIE1heSAyMDA0KQotIEdpc2xlIG1haWxlZCBTaW1vbiBKb3NlZnNzb24gKG9mIGxpYmlkbiBmYW1lKSBhYm91dCB0aGUgYmVuZWZpdHMgb2YgYQogIHNlcGFyYXRlIGZyZWUoKS1mdW5jdGlvbiBieSB0aGF0IGxpYiB0byBtYWtlIHN1cmUgdGhlIG1lbW9yeSBpcyBmcmVlZCBieSB0aGUKICBzYW1lIG1lbW9yeSBzdWJzeXN0ZW0gdGhhdCBhbGxvY2F0ZWQgaXQuIEhlIHJlc3BvbmRlZCBwb3NpdGl2ZWx5IGFuZCB0aGlzCiAgd2lsbCBsaWtlbHkgY2F1c2UgdXMgdG8gcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgbGliaWRuIGFzIHNvb24gYXMgU2ltb24KICByZWxlYXNlcyBvbmUgd2l0aCBzdWNoIGEgbGliaWRuX2ZyZWUoKSBmdW5jdGlvbi4KCi0gSmFtZXMgQnVyc2EgbWFkZSBydW50ZXN0cy5wbCdzIC10IG9wdGlvbiB3b3JrIGZvciBhbnkgZ2l2ZW4gdGVzdCBjYXNlLCBhbmQgSQogIGVkaXRlZCB0byBhbGxvdyAtZyB0b28uIE5vdCBldmVuIHRlc3QgY2FzZSAxIHdvcmtlZC4uLgoKLSBMdWNhIEFsdGVhIG1hZGUgdGhlIG5jPSBmaWVsZCBub3QgdXNlIHF1b3RlcyBpbiBvdXRnb2luZyBIVFRQIERpZ2VzdCBoZWFkZXJzLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgdGVzdCBzY3JpcHQgdGhhdCBtYWRlIGl0IGZhaWwgdG8KICByZWNvZ25pemUgb3VyIG93biBydW5uaW5nIEhUVFAgc2VydmVyLgoKRGFuaWVsICg3IE1heSAyMDA0KQotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBtZW1hbmFseXplLnBsIHNjcmlwdCB0byBjb25kZXIgbWFsbG9jKDApIGFyZWFzIE9LIHRvCiAgZnJlZSgpIGFuZCBoZSBtYWRlIHR3byBmYWlsZWQtcmVzb2x2ZSBlcnJvciBtZXNzYWdlcyB1c2UgdGhlIG5ldyBkaXNwbGF5LQogIG5hbWUgaW5zdGVhZCBvZiB0aGUgaW50ZXJuYWxseS11c2VkIG5hbWUuCgotIEdpc2xlIFZhbmVtIHRyaWVkIGN1cmwgd2l0aAogIHd3dy5ldGRvbWVuZW5hdm5rYW5tYWtzaW1hbHRpbm5laG9sZGVzZWtzdGl0cmVib2tzdGF2ZXJzbGlrc29tZGV0dGUuY29tCiAgd2hpY2ggY2F1c2VkIHByb2JsZW1zLCBhbmQgSSBmaXhlZCB0aGUgc2luZ2xlIHplcm8gYnl0ZSBidWZmZXIgb3ZlcndyaXRlCiAgdGhhdCBvY2N1cnJlZCAoZHVlIHRvIGEgc3R1cGlkIHByb3RvY29sIGJ1ZmZlciBzaXplIGFuZCBwYXJzZXIpLgoKLSBNYWRlIHRoZSBsaWIvY3VybGxpYi5kc3AgZmlsZSBnZXQgZ2VuZXJhdGVkIGF1dG9tYXRpY2x5IHdoZW4gYSBkaXN0cmlidXRpb24KICBwYWNrYWdlIGlzIG1hZGUsIHdpdGggdGhlIG1zdmNwcm9qLiogZmlsZXMgYXMgdGVtcGxhdGVzIGFuZCBhbGwKICB3aW4zMi1zb3VyY2VzIGFkZGVkLiBJIHRoaW5rIHRoaXMgY2FuIGJlIG1hZGUgdG8gd29yayBiZXR0ZXIgdGhhbiB0aGUgYWx3YXlzCiAgbGFnZ2luZy1iZWhpbmQgcHJldmlvdXMgYXBwcm9hY2guIEknbSBub3Qgc3VyZSB0aGlzIGJ1aWxkcyBhIHdvcmtpbmcgcHJvamVjdAogIGZpbGUgcmlnaHQgbm93IHRob3VnaCEKCkRhbmllbCAoNiBNYXkgMjAwNCkKLSBNaWNoYWVsIEJlbmVkaWN0IGJyb3VnaHQgYSBmaXggdGhhdCBmaWxscyBpbiB0aGUgZXJyb3JidWZmZXIgcHJvcGVybHkgd2hlbgogIGFyZXMgZmFpbHMgdG8gcmVzb2x2ZSBhIG5hbWUgZm9yIGEgY2FzZSBub3QgcHJldmlvdXNseSBkZWFsdCB3aXRoIGxpa2UgdGhpcy4KCkRhbmllbCAoNSBNYXkgMjAwNCkKLSBKb2UgSGFscGluIGZpeGVkIHRoZSBhbm5veWluZyB0eXBlY2FzdCB3YXJuaW5nIGluIGxpYi9sZGFwLmMKCi0gR2lzbGUgVmFuZW0gZml4ZXM6CiAgbyBtZW1kZWJ1ZyB0byBub3QgYWNjZXNzIE5VTEwgb24gc2V2ZXJhbCBwbGFjZXMKICBvIGxpYmN1cmwuZGVmOyBjdXJsX2Zvcm1wYXJzZSBpcyBnb25lLgogIG8gcHJvZ3Jlc3MuYzsgZml4ZWQgdGhlIHBlcmNlbnQgdmFsdWVzIGJlaW5nIHRydW5jZWQgdG8gMC4KICBvIGlmMmlwLio7IGNvbnN0aWZpZWQgdGhlICdpbnRlcmZhY2UnIGFyZ3VtZW50LgoKLSBUb3IgQXJudHNlbiByZXBvcnRlZCB0aGF0IG1hbnkgb2YgaGlzIGF1dG9idWlsZHMgZnJvemUgYW5kIEkgZm91bmQgYW5kIGZpeGVkCiAgYSBwcm9ibGVtIGludHJvZHVjZWQgd2l0aCB0aGUgSFRUUCBhdXRoIG92ZXJoYXVsIHRoYXQgY291bGQgbGVhZCB0byBhCiAgbmV2ZXItZW5kaW5nIGludGVybmFsIHJlcXVlc3QtbG9vcCBkdWUgdG8gdW4taW5pdGlhbGl6ZWQgdmFyaWFibGVzIQoKLSBSZW1vdmVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3Mgb24gdmFyaW91cyBjb21waWxlcnMvcGxhdGZvcm1zLgoKRGFuaWVsICg0IE1heSAyMDA0KQotIGN1cmxfZm9ybXBhcnNlKCkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaWJyYXJ5LiBJdCBoYXMgYmVlbiBtYXJrZWQgYW5kCiAgbWVudGlvbmVkIGFzIGRlcHJlY2F0ZWQgZm9yIHNldmVyYWwgeWVhcnMuCgpEYW5pZWwgKDMgTWF5IDIwMDQpCi0gUmV3cml0dGVuIEhUVFAgYXV0aGVudGljYXRpb24gY29kZS4gVGhlIHByZXZpb3VzIGNvZGUgY291bGQgbm90IHByb3Blcmx5CiAgZGVhbCB3aXRoIHRoZSBhZGRlZCB0ZXN0IGNhc2VzIDE2NywgMTY4IGFuZCAxNjkuIEkndmUgbm93IHJld3JpdHRlbiB0aGUgY29kZQogIHRvIGJldHRlciBzZXBhcmF0ZSBob3N0IGFuZCBwcm94eSBhdXRoZW50aWNhdGlvbiBhbmQgbm90IHJlLXVzZSB0aGUgc2FtZQogIHZhcmlhYmxlcyBhcyBtdWNoIGFzIGJlZm9yZSBhcyBpdCBwcm92ZWQgbm9uIHdvcmtpbmcgaW4gdGhlIG1vcmUgaW52b2x2ZWQKICBjYXNlcy4gQWxsIHRoZSBjdXJyZW50IHRlc3RzIHJ1biBPSyBub3csIGFuZCBzbyBkbyB0aGUgbmV3IG9uZXMuIFRoZSBjdXJsCiAgdG9vbCBnb3QgYSBuZXcgb3B0aW9uIG5hbWVkIC0tcHJveHktZGlnZXN0IHRvIGVuYWJsZSBIVFRQIERpZ2VzdAogIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3h5LiBJIGFsc28gbWFkZSB0aGUgbGlicmFyeSBzdXBwb3J0IGl0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBMREFQIGNvZGUgd29yayB3aXRoIHdsZGFwMzIuZGxsIGFzIHN1cHBsaWVkIHdpdGgKICBXaW4tOTgvTUUvMjAwMC9YUCwgc28gbm8gZXh0cmEgLmRsbHMgYXJlIHJlcXVpcmVkIHdoZW4gY3VybC9saWJjdXJsIGlzIHVzZWQKICBvbiB0aGVzZSBXaW5kb3dzIHZlcnNpb25zLgoKRGFuaWVsICgzMCBBcHJpbCAyMDA0KQotIHJ1bnRlc3RzLnBsIG5vdyBzY2FucyB0aGUgdmFsZ3JpbmQgbG9nIGZvciB2YWxncmluZC1kZXRlY3RlZCBtZW1vcnkgbGVha3MKICBhZnRlciBlYWNoIHRlc3QgY2FzZSBpZiB2YWxncmluZCB3YXMgZm91bmQgYW5kIHVzZWQuCgotIEkgbW9kaWZpZWQgdGhlIGFwcC1jb2RlIGluIGN1cmwgdG8gaW5jbHVkZSB0aGUgbmV3IGxpYi9jdXJseC5oIGFuZCBvbmx5CiAgYWNjZXNzIHRob3NlIGZ1bmN0aW9ucyB1c2luZyB0aGUgY3VybHhfLXByZWZpeCBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIGZ1dHVyZQogIHJlbW92YWwgb2Ygc2V2ZXJhbCBjdXJsXy1mdW5jdGlvbnMgZnJvbSB0aGUgcHVibGljIGxpYmN1cmwgQVBJLgoKLSBJbnRyb2R1Y2VkIGxpYi9jdXJseC5oIGFzIGEgc2luZ2xlIGhlYWRlciB0byBwcm92aWRlIHRoZSBjdXJseF8tZnVuY3Rpb25zCiAgdG8gYXBwcy4KCi0gQWRkZWQgbm90aWNlcyBpbiB0aGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dldGVudiwgY3VybF9tcHJpbnRmLCBjdXJsX3N0cmVxdWFsCiAgYW5kIGN1cmxfc3RybmVxdWFsIHRoYXQgdGhleSBhcmUgc3ViamVjdCBmb3IgcmVtb3ZhbCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogIFNUT1AgVVNJTkcgVEhFU0UgRlVOQ1RJT05TLgoKLSBNaWhhaSBJb25lc2N1IG5vdGljZWQgaGUgY291bGRuJ3QgZG8gZm9ybXBvc3RzIHdpdGggd2hpdGVzcGFjZSBpbiB0aGUgZmlsZQogIG5hbWVzIGFuZCB5ZXMsIEkgYnJva2UgdGhhdCBvbiBBcHJpbCAyMy4gU2lnaC4gSSBmaXhlZCBpdCBub3cgYW5kIGFkZGVkCiAgdGVzdCBjYXNlIDE2NiB0byB2ZXJpZnkgaXQuCgotIEx1Y2EgQWx0ZWEgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGxlZnQgZnJvbSB0aGUgRGlnZXN0IHBhdGNoIG9mIHllc3RlcmRheS4KCkRhbmllbCAoMjkgQXByaWwgMjAwNCkKLSBNYWRlIElETiBkb21haW5zIHdvcmsgd2hlbiBzZW5kaW5nIHJlcXVzdHMgb3ZlciBIVFRQIHByb3h5IGFzIHdlbGwuIEFkZGVkCiAgdGVzdCBjYXNlIDE2NSB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBuZXcgaW50ZXJuYWwgaG9zdCBuYW1lIHNldHVwIHdoZW4gcmUtdXNpbmcgY29ubmVjdGlvbnMuCgotIEphbWVzIEJ1cnNhIGZvdW5kIG91dCB0aGF0IGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB3aXRoIGFyZXMtYnVpbHQgbGliY3VybAogIGNyZWF0ZWQgYSBiYWQgaGFuZGxlIHRoYXQgd291bGQgY3Jhc2ggaW4gdGhlIGZpcnN0IG5hbWUgcmVzb2x2ZSBhdHRlbXB0LiBUaGlzCiAgaXMgbm93IGZpeGVkIGFuZCB0ZXN0IGNhc2UgNTEyIHdhcyBhZGRlZCB0byB2ZXJpZnkgaXQuCgotIEx1Y2EgQWx0ZWEgcHJvdmlkZWQgYSBtYWpvciBIVFRQIERpZ2VzdCBjb2RlIGZpeCBhbmQgY2xlYW51cC4gV2Ugbm93IGZvbGxvdwogIHRoZSBEaWdlc3QgUkZDIGEgbG90IGJldHRlci4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgU1NMIGNvZGUgdXNlIEVSUl9lcnJvcl9zdHJpbmdfbigpIHdoZXJlIGFwcGxpY2FibGUuCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDQpCi0gSSByZW1vZGVsZWQgR2lzbGUncyBJRE4gY29kZSBzbGlnaHRseSBhbmQgbm93IHdlIGNvbnZlcnQgYm90aCB0aGUgaG9zdCBuYW1lCiAgYW5kIHByb3h5IG5hbWUgdG8gdGhlIEFDRSBlbmNvZGVkIHZlcnNpb24gdG8gdXNlIGludGVybmFsbHkgZm9yIHJlc29sdmVzIGFuZAogIGNvb2tpZXMgZXRjLiBUaGV5IGFyZSBub3cgdXNpbmcgb25lICdzdHJ1Y3QgaG9zdG5hbWUnIGVhY2ggdGhhdCBrZWVwIGJvdGgKICB0aGUgb3JpZ2luYWwgbmFtZSBhbmQgdGhlIHBvc3NpYmx5IGVuY29kZWQgbmFtZS4gSUROIHJlc29sdmVzIHdvcmsgZm9yIG1lCiAgbm93IHVzaW5nIGlwdjYsIGlwdjQgYW5kIGFyZXMgcmVzb2x2aW5nLiBFdmVuIGNvb2tpZXMgb24gSUROIHNpdGVzIHNlZW0gdG8KICBkbyByaWdodC4gSSBnb3Qgc29tZSBmYWlsdXJlcyBhdCBmaXJzdCB3aGVuIENIQVJTRVQgd2Fzbid0IHNldCBhdCBhbGwgd2hpY2gKICBjb25mdXNlZCBsaWJpZG4gY29tcGxldGVseSBhbmQgaXQgZGVjaWRlZCBieSBlbmNvZGluZyBvZiBjaG9pY2Ugd2FzCiAgJ0FOU0lfWDMuNC0xOTY4Jy4uLgoKLSBtYWRlICdjb25maWd1cmUgLS13aXRob3V0LWxpYmlkbicgd29yawoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEZpeGVkIHRoZSBzcmMvaHVnZWhlbHAuYyBmaWxlIHRvIGluY2x1ZGUgInNldHVwLmgiIGluc3RlYWQgb2YgImNvbmZpZy5oIiB0bwogIG1ha2UgdGhlIHByb2JsZW1zIHdpdGggVVNFX01BTlVBTCBvbiB3aW5kb3dzIGdvIGF3YXkuCgotIGNvbmZpZ3VyZSAtLXdpdGhvdXQtc3NsIGNvdWxkIHN0aWxsIHdyb25nbHkgaW5jbHVkZSBzb21lIE9wZW5TU0wgaW5mbyBpbiB0aGUKICBNYWtlZmlsZXMgaWYgcGtnLWNvbmZpZyBoYWQgaW5mbyBhYm91dCBPcGVuU1NMLiBCdWcgIzk0MTc2MiByZXBvcnRlZCBieQogIE1hcnRpbi4KCi0gU2luY2Ugd2UgY2FuIG5vdyBidWlsZCBhbmQgdXNlIHF1aXRlIGEgbGFyZ2Ugc2V0IG9mIDNyZCBwYXJ0eSBsaWJyYXJpZXMsIEkKICBkZWNpZGVkIEkgd291bGQgbWFrZSBjb25maWd1cmUgcHJvZHVjZSBhIHN1bW1hcnkgYXQgdGhlIGVuZCBzaG93aW5nIHdoYXQKICBsaWJyYXJpZXMgaXQgdXNlcyBhbmQgaWYgbm90LCB3aGF0IG9wdGlvbiB0byB1c2UgdG8gbWFrZSBpdCB1c2UgdGhhdC4gSSBhbHNvCiAgYWRkZWQgc29tZSBvdGhlciByYW5kb20gaW5mbyB0aGF0IGlzIG5pY2UgaW4gYSAiY29uZmlndXJlIHN1bW1hcnkiIG91dHB1dC4KCi0gQXBwbGllZCBUb21teVRhbSdzIHBhdGNoIHRoYXQgbm93IG1ha2UgY3VybCB3b3JrIHdpdGggdGVsbmV0IGFuZCBzdGRpbgogIHByb3Blcmx5IG9uIFdpbmRvd3MuCgotIFRoZSBjaGFuZ2VzIGZvciB0b2RheSBiZWxvdyB3ZXJlIG1hZGUgYnkgbWUgYW5kIEdpc2xlIFZhbmVtLgoKICBUaGUgZmlsZSBwcmV2aW91c2x5IGtub3duIGFzIGhvc3RpcC5jIGhhcyBub3cgdW5kZXJnb25lIGEgaHVnZSBjbGVhbnVwIGFuZAogIHNwbGl0OgoKICBob3N0aXAuYyBleHBsYWluZWQKICA9PT09PT09PT09PT09PT09PT0KCiAgVGhlIG1haW4gQ09NUElMRS1USU1FIERFRklORVMgdG8ga2VlcCBpbiBtaW5kIHdoZW4gcmVhZGluZyB0aGUgaG9zdCouYwogIHNvdXJjZSBmaWxlIGFyZSB0aGVzZToKCiAgQ1VSTFJFU19JUFY2IC0gdGhpcyBob3N0IGhhcyBnZXRhZGRyaW5mbygpIGFuZCBmYW1pbHksIGFuZCB0aHVzIHdlIHVzZQogIHRoYXQuIFRoZSBob3N0IG1heSBub3QgYmUgYWJsZSB0byByZXNvbHZlIElQdjYsIGJ1dCB3ZSBkb24ndCByZWFsbHkgaGF2ZSB0bwogIHRha2UgdGhhdCBpbnRvIGFjY291bnQuIEhvc3RzIHRoYXQgYXJlbid0IElQdjYtZW5hYmxlZCBoYXZlIENVUkxSRVNfSVBWNAogIGRlZmluZWQuCgogIENVUkxSRVNfQVJFUyAtIGlzIGRlZmluZWQgaWYgbGliY3VybCBpcyBidWlsdCB0byB1c2UgYy1hcmVzIGZvciBhc3luY2hyb25vdXMKICBuYW1lIHJlc29sdmVzLiBJdCBjYW5ub3QgaGF2ZSBFTkFCTEVfSVBWNiBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUsIGFzCiAgYy1hcmVzIGhhcyBubyBpcHY2IHN1cHBvcnQuIFRoaXMgY2FuIGJlIFdpbmRvd3Mgb3IgKm5peC4KCiAgQ1VSTFJFU19USFJFQURFRCAtIGlzIGRlZmluZWQgaWYgbGliY3VybCBpcyBidWlsdCB0byBydW4gdW5kZXIgKG5hdGl2ZSkKICBXaW5kb3dzLCBhbmQgdGhlbiB0aGUgbmFtZSByZXNvbHZlIHdpbGwgYmUgZG9uZSBpbiBhIG5ldyB0aHJlYWQsIGFuZCB0aGUKICBzdXBwb3J0ZWQgYXN5bmNoIEFQSSB3aWxsIGJlIHRoZSBzYW1lIGFzIGZvciBhcmVzLWJ1aWxkcy4KCiAgSWYgYW55IG9mIHRoZSB0d28gcHJldmlvdXMgYXJlIGRlZmluZWQsIENVUkxSRVNfQVNZTkNIIGlzIGRlZmluZWQgdG9vLiBJZgogIGxpYmN1cmwgaXMgbm90IGJ1aWx0IHRvIHVzZSBhbiBhc3luY2hyb25vdXMgcmVzb2x2ZXIsIENVUkxSRVNfU1lOQ0ggaXMKICBkZWZpbmVkLgoKICBUaGUgaG9zdCouYyBzb3VyY2VzIGZpbGVzIGFyZSBzcGxpdCB1cCBsaWtlIHRoaXM6CgogIGhvc3RpcC5jICAgLSBtZXRob2QtaW5kZXBlbmRlbnQgcmVzb2x2ZXIgZnVuY3Rpb25zIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucwogIGhvc3Rhc3luLmMgLSBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdHN5bi5jICAtIGZ1bmN0aW9ucyBmb3Igc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RhcmVzLmMgLSBmdW5jdGlvbnMgZm9yIGFyZXMtdXNpbmcgbmFtZSByZXNvbHZlcwogIGhvc3R0aHJlLmMgLSBmdW5jdGlvbnMgZm9yIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXMKICBob3N0aXA0LmMgIC0gaXB2NC1zcGVjaWZpYyBmdW5jdGlvbnMKICBob3N0aXA2LmMgIC0gaXB2Ni1zcGVjaWZpYyBmdW5jdGlvbnMKCiAgVGhlIGhvc3RpcC5oIGlzIHRoZSBzaW5nbGUgdW5pdGVkIGhlYWRlciBmaWxlIGZvciBhbGwgdGhpcy4gSXQgZGVmaW5lcyB0aGUKICBDVVJMUkVTXyogZGVmaW5lcyBiYXNlZCBvbiB0aGUgY29uZmlnKi5oIGFuZCBzZXR1cC5oIGRlZmluZXMuCgotIEFkZGVkIGZ1bmN0aW9uIGhlYWRlciBjb21tZW50cyB0byBtYW55IGZ1bmN0aW9ucyBpbiBhbiBhdHRlbXB0IHRvIGJldHRlcgogIGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgdGhlbSBhbGwuCgotIGNvbmZpZ3VyZSAtLXdpdGgtbGliaWRuIGlzIG5vdyBzdXBwb3J0ZWQuIEl0IG1ha2VzIHRoZSBjb25maWd1cmUgc2NyaXB0CiAgY2hlY2sgZm9yIGxpYmlkbiBsaWJzIGFuZCBpbmNsdWRlIGZpbGVzIGluIHRoZSBwcmVmaXggcGF0aCBnaXZlbi4gSWYgeW91CiAgc2F5IC0td2l0aC1saWJpZG49L3Vzci9sb2NhbCwgaXQgd2lsbCBjaGVjayBmb3IgdGhlIGxpYiBpbiAvdXNyL2xvY2FsL2xpYgogIGFuZCB0aGUgaW5jbHVkZXMgaW4gL3Vzci9sb2NhbC9pbmNsdWRlIGV0Yy4KCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBhIHN0cnVjdCBhZ2VkIENVUkxWRVJTSU9OX1RISVJEIGluY2x1ZGluZwogIGxpYmlkbiB2ZXJzaW9uIGluZm8uIFRoZSBzdHJpbmcgY3VybF92ZXJzaW9uKCkgcmV0dXJucyBhbHNvIGluY2x1ZGVzIGxpYmlkbgogIHZlcnNpb24gaW5mbywgaWYgYXZhaWxhYmxlLgoKVmVyc2lvbiA3LjExLjIgKDI2IEFwcmlsIDIwMDQpCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRXJ3aW4gQXV0aHJpZWQgcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCBkaWRuJ3QgZG8gcmlnaHQKICBpZiB5b3UgYWxyZWFkeSBoYWQgYSBzcmMvaHVnZWhlbHAuYyBzb3VyY2UgZmlsZSBwcmVzZW50ICh3aGljaCBtb3N0IHBlb3BsZQogIGRvIEkgZ3Vlc3MpLiBJdCBub3cgdXNlcyB0aGUgVVNFX01BTlVBTCBkZWZpbmUgcHJvcGVybHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBkb2luZyAoZmFpbGluZykgV2luZG93cwogIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXMuCgotIEkgYWxzbyBhZGRlZCB0ZXN0IGNhc2UgMTYzIGp1c3QgdG8gbWFrZSBzdXJlIC1GICJ2YXI9PGZpbGUiIHdvcmtzIGZpbmUgYW5kCiAgY2FuIHBhc3Mgb24gY2hhcmFjdGVycyBzdWNoIGFzIG5ld2xpbmVzLCBjYXJyaWFnZS1yZXR1cm4gYW5kIHRhYnMuCgotIFdoZW4gd2UgYWRkZWQgdGVzdCBjYXNlIDE2MiB3aXRob3V0IGFkZGluZyB0aGUgbmVjZXNzYXJ5IHJlcXVpcmVtZW50IGZpZWxkCiAgaW4gdGhlIHRlc3QgbWV0YSBkYXRhIHdlIGNvdWxkIHNlZSB0aGF0IGN1cmwgZGlkbid0IGNvbXBsYWluIGlmIHlvdSB1c2VkCiAgLS1wcm94eS1udGxtIGV2ZW4gaWYgdGhlIHVuZGVybHlpbmcgbGliY3VybCBpdCB1c2VzIGhhcyBubyBOVExNIHN1cHBvcnQhIEkKICBub3cgbWFkZSBpdCBjaGVjayB0aGlzIGZpcnN0LCBhbmQgaXQgbm93IGV4aXN0cyB3aXRoIGEgInRoZSBpbnN0YWxsZWQKICBsaWJjdXJsIHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMiIG1lc3NhZ2UgaWYgaXQgaGFwcGVucyBhZ2Fpbi4KCkRhbmllbCAoMjIgQXByaWwgMjAwNCkKLSBEYXZpZCBCeXJvbiBmb3VuZCBhbmQgZml4ZWQgYSBzbWFsbCBidWcgd2l0aCB0aGUgLS1mYWlsIGFuZCBhdXRoZW50aWNhdGlvbgogIHN0dWZmIGFkZGVkIGEgZmV3IHdlZWtzIGFnby4gIFR1cm5zIG91dCB0aGF0IGlmIHlvdSBzcGVjaWZ5IC0tcHJveHktbnRsbSBhbmQKICBjb21tdW5pY2F0ZSB3aXRoIGEgcHJveHkgdGhhdCByZXF1aXJlcyBiYXNpYyBhdXRoZW50aWNhdGlvbiwgdGhlIHByb3h5CiAgcHJvcGVybHkgcmV0dXJucyBhIDQwNywgYnV0IHRoZSBmYWlsdXJlIGRldGVjdGlvbiBjb2RlIGRvZXNuJ3QgcmVhbGl6ZSBpdAogIHNob3VsZCBnaXZlIHVwLCBzbyBjdXJsIHJldHVybnMgd2l0aCBleGl0IGNvZGUgMC4gVGVzdCBjYXNlIDE2MiBhZGRlZCB0bwogIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gYWxsb3cgbmV3bGluZXMgaW4gdGhlIGNvbnRlbnRzIHdoZW4gZG9pbmcgLUYgInZhcj1bY29udGVudHNdIgogIFJvYmVydCBNYXJsb3cgcmVwb3J0ZWQuCgotIElmIGEgdHJhbnNmZXIgaXMgZm91bmQgb3V0IHRvIGJlIG9ubHkgcGFydGlhbCwgbGliY3VybCB3aWxsIG5vdyB0cmVhdCB0aGF0CiAgYXMgYSBwcm9ibGVtIHNlcmlvdXMgZW5vdWdoIHRvIHNraXAgdGhlIGZpbmFsIFFVSVQgY29tbWFuZCBiZWZvcmUgY2xvc2luZwogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24uIFRvIGF2b2lkIHRoZSByaXNrIHRoYXQgaXQgd2lsbCAiaGFuZyIgd2FpdGluZyBmb3IKICB0aGUgUVVJVCByZXNwb25zZS4gQWRkZWQgdGVzdCBjYXNlIDE2MSB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMjEgQXByaWwgMjAwNCkKLSBNb2RpZmllZCB0aGUgaGV1cmlzdGljcyBmb3IgZGVhbGluZyB3aXRoIHRoZSB0ZXN0IDE2MCBzY2VuYXJpby4gV2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkIGFuZCBub3RoaW5nIGF0IGFsbCBpcyByZWNlaXZlZCBmcm9tIGl0IChiZWNhdXNlIHRoZQogIHNlcnZlciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24pLCB3ZSB3aWxsIG5vdyByZXRyeSB0aGUgcmVxdWVzdCBvbiBhIGZyZXNoIG5ldwogIGNvbm5lY3Rpb24uIFRoZSBwcmV2aW91cyBFQ09OTlJFU0VUIHN0dWZmIGZyb20gSmFudWFyeSAzMCB3YXMgcmVtb3ZlZCBhZ2FpbgogIGFzIGl0IGRpZG4ndCBkZXRlY3QgdGhlIHNpdHVhdGlvbiBnb29kIGVub3VnaC4KCkRhbmllbCAoMjAgQXByaWwgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMTYwIHRvIHZlcmlmeSB0aGF0IGN1cmwgd29ya3MgY29ycmVjdGx5IHdoZW4gaXQgZ2V0cyBhCiAgY29ubmVjdGlvbiByZXNldCB3aGVuIHRyeWluZyB0byByZS11c2UgYSBjb25uZWN0aW9uLiBJdCBzaG91bGQgdGhlbiBzaW1wbHkKICBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kIHRoZSByZXF1ZXN0LgoKRGFuaWVsICgxOSBBcHJpbCAyMDA0KQotIE5vIG1vcmUgNTEyIGJ5dGUgbGltaXQgZm9yIGhvc3QgbmFtZSAoaW5jbHVzaW5nIG5hbWUgKyBwYXNzd29yZCkgaW4gbGliY3VybC4KICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeSBmb3IgdGhlIHR5cGljYWwgKHNob3J0ZXIgVVJMKQogIGNhc2UuCgotIENsZWFuZWQgdXAgdGhlIHNvdXJjZXMgdG8gYmV0dGVyIHVzZSB0aGUgdGVybXMgJ2hvc3RuYW1lJyBhbmQgJ3BhdGgnCiAgaW50ZXJuYWxseSB3aGVuIHJlZmVycmluZyB0byB0aGF0IGRhdGEuIFRoZSBidWZmZXJzIHVzZWQgZm9yIGtlZXAgdGhhdCBpbmZvCiAgaXMgY2FsbGVkICduYW1lYnVmZmVyJyBhbmQgJ3BhdGhidWZmZXInLiBNdWNoIGVhc2llciB0byByZWFkIGFuZCB1bmRlcnN0YW5kCiAgdGhhbiB0aGUgcHJldmlvdXMgbWVzcy4KCkRhbmllbCAoMTUgQXByaWwgMjAwNCkKLSBNb2RpZmllZCBydW50ZXN0cy5wbCBhZ2FpbiB0byByZW1vdmUgYWxsIGxvZyBmaWxlcyBpbiB0aGUgbG9nLyBkaXIgYmV0d2VlbgogIGVhY2ggdGVzdCwgYW5kIHRoZW4gbWFkZSAtcCBkaXNwbGF5IGFsbCBub24temVybyBieXRlIGZpbGVzIGluIHRoZSBsb2cgZGlyLgogIEl0IHNob3VsZCBtYWtlIHRoYXQgZGF0YSBtb3JlIHVzYWJsZSBhbmQgY29udGFpbiBsZXNzIHJ1YmJpc2guCgotIGZ0cHNlcnZlci5wbCBub3cgcHJvZHVjZXMgbG9nIGZpbGVzIG1vcmUgc2ltaWxhciB0byBob3cgdGhlIHN3cyBvbmVzIGxvb2sKICBhbmQgdGhleSBub3cgYWxzbyBjb250YWlucyBhIGJpdCBtb3JlIGRldGFpbHMgdG8gaGVscCBkZWJ1Z2dpbmcgZnRwCiAgcHJvYmxlbXMuCgotIFJlbW92ZWQgdGhlIGZpeGVkIG1heGltdW0gYW1vdW50IG9mIGRpciBsZXZlbHMgdGhlIEZUUCBjb2RlIHN1cHBvcnRlZC4KICBQcmV2aW91c2x5IHdlIGhhZCBhIGZpeGVkIGFycmF5IGZvciAxMDAgbGV2ZWxzLCBub3cgd2Ugc2F2ZSBzcGFjZSBpbiBlYWNoCiAgaGFuZGxlIGJ5IGFsbG9jYXRpbmcgb25seSBmb3IgYSBmZXcgbGV2ZWwgYnkgZGVmYXVsdCBhbmQgdGhlbiBlbmxhcmdpbmcgdGhhdAogIGluIGNhc2Ugb2YgbmVlZCAod2l0aCBubyBtYXhpbXVtIGRlcHRoKS4gQWRqdXN0ZWQgdGVzdCBjYXNlIDE0MiB0byB2ZXJpZnkKICB0aGF0IDE1MCBkaXIgbGV2ZWxzIHdvcmsgZmluZS4gIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5CiAgZm9yIHRoZSB0eXBpY2FsIChub3QgdmVyeSBkZWVwKSBjYXNlLgoKRGFuaWVsICgxNCBBcHJpbCAyMDA0KQotIEFza2luZyBmb3IgQ1VSTF9JUFJFU09MVkVfVjYgd2hlbiBpcHY2IGFkZHJlc3NlcyBjYW4ndCBiZSByZXNvbHZlZCB3aWxsCiAgbm93IGNhdXNlIHRoZSByZXNvbHZlIGZ1bmN0aW9uIHRvIHJldHVybiBOVUxMIGltbWVkaWF0ZWx5LiBUaGlzIGZsYXcgd2FzCiAgcG9pbnRlZCBvdXQgYnkgR2lzbGUgVmFuZW0uCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCAtNC8tNiBhY3R1YWxseSBzZXQgdGhlIGRlc2lyZWQgb3B0aW9uIHRvIGxpYmN1cmwuCgotIHJ1bnRlc3RzLnBsIG5vdyBoYXMgYSBuZXcgb3B0aW9uICgtcCkgdGhhdCB3aWxsIGRpc3BsYXkgImludGVyZXN0aW5nIiBsb2cKICBmaWxlcyB0byBzdGRvdXQgaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4gVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYmUKICB1c2VkIGluIHRoZSAnZnVsbC10ZXN0JyBtYWtlIHRhcmdldCB0aGF0IGlzIHVzZWQgYnkgdGhlIGF1dG9idWlsZCB0ZXN0cywgYXMKICB3ZSB0aGVuIGdldCBhIG11Y2ggYmV0dGVyIGNoYW5jZSB0byB1bmRlcnN0YW5kIChyZW1vdGUpIHRlc3QgZmFpbHVyZXMgYmFzZWQKICBvbiBhdXRvYnVpbGQgbG9ncyBhbG9uZS4KCkRhbmllbCAoMTMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd29yayBhZ2FpbiBvbiBXaW5kb3dzIGV2ZW4gd2hlbiBidWlsdAogIHdpdGhvdXQgYXJlcy4gQmVmb3JlIHRoaXMsIHNlbGVjdCgpIHdvdWxkIHJldHVybiAtMSBkdXJpbmcgdGhlIG5hbWUgcmVzb2x2ZQogIHBoYXNlIHNpbmNlIGN1cmxfbXVsdGlfZmRzZXQoKSBkaWRuJ3QgcmV0dXJuIGFueSBmZF9zZXQgYXQgYWxsIHdoaWNoIHdhc24ndAogIGFwcHJlY2lhdGVkIQoKLSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgbm93IGR1cGxpY2F0ZXMgdGhlIHRjcF9ub2RlbGF5IGluZm8gYXMgd2VsbC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNCkKLSBBcHBsaWVkIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggZm9yIHRoZSBNU1ZDIGxpYmN1cmwgbWFrZWZpbGUgZm9yIGJ1aWxkcyB3aXRoCiAgemxpYi4KCkRhbmllbCAoOSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGltcHJvdmVkIHRoZSB0aW1lciByZXNvbHV0aW9uIGZvciBDVVJMSU5GT18qX1RJTUUsIGl0IGNhbiBub3cKICBiZSBkb3duIHRvIHVzZWMgaWYgdGhlIHN5c3RlbSBzeXBwb3J0cyBpdC4KCkRhbmllbCAoNyBBcHJpbCAyMDA0KQotIEEgcmVxdWVzdCB0aGF0IHNlbmRzICJFeHBlY3Q6IDEwMC1jb250aW51ZSIgYW5kIGdldHMgbm90aGluZyBidXQgYSBzaW5nbGUKICAxMDAgcmVzcG9uc2UgYmFjayB3aWxsIG5vdyByZXR1cm4gYSBDVVJMRV9HT1RfTk9USElORy4gVGVzdCAxNTggdmVyaWZpZXMuCgotIFRoZSBzdHJ0b29mZnQoKSBtYWNybyBpcyBub3cgbmFtZWQgY3VybHhfc3RydG9vZmZ0KCkgdG8gdXNlIHRoZSBjdXJseF8qCiAgYXBwcm9hY2ggZnVsbHkuCgpEYW5pZWwgKDYgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeGVkIGJ1ZyAjOTI3OTc5IHJlcG9ydGVkIGJ5IE5hdGhhbiBPJ1N1bGxpdmFuLiBUaGUgcHJvYmxlbQogIG1hZGUgbGliY3VybCBvbiBXaW5kb3dzIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGluIGVhY2ggbmFtZSByZXNvbHZlCiAgd2hlbiBub3QgdXNlZCBhcyBhIERMTC4KCi0gTmV3IGF1dGhlbnRpY2F0aW9uIGNvZGUgYWRkZWQsIHBhcnRpY3VsYXJseSBub3RpY2FibGUgd2hlbiBkb2luZyBQT1NUIG9yIFBVVAogIHdpdGggRGlnZXN0IG9yIE5UTE0uIGxpYmN1cmwgd2lsbCBub3cgdXNlIEhFQUQgdG8gbmVnb3RpYXRlIHRoZQogIGF1dGhlbnRpY2F0aW9uIGFuZCB3aGVuIGRvbmUgcGVyZm9ybSB0aGUgcmVxdWVzdGVkIFBPU1QuIFByZXZpb3VzbHkgbGliY3VybAogIHNlbnQgUE9TVCBpbW1lZGlhdGVseSBhbmQgZXhwZWN0ZWQgdGhlIHNlcnZlciB0byByZXBseSBhIGZpbmFsIHN0YXR1cyBjb2RlCiAgd2l0aCBhbiBlcnJvciBhbmQgdGhlbiBsaWJjdXJsIHdvdWxkIG5vdCBzZW5kIHRoZSByZXF1ZXN0LWJvZHkgYnV0IGluc3RlYWQKICBzZW5kIHRoZW4gbmV4dCByZXF1ZXN0IGluIHRoZSBzZXF1ZW5jZS4KCiAgVGhlIHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgZHVlIHRvIElJUzYgYmFyZmluZyBvbiBsaWJjdXJsIHdoZW4gd2UgYXR0ZW1wdAogIHRvIFBPU1Qgd2l0aCBOVExNIGF1dGhlbnRpY2F0aW9uLiBUaGUgcmVhc29uIGZvciB0aGUgcHJvYmxlbXMgaXMgZm91bmQgaW4KICBSRkMyNjE2IHNlY3Rpb24gOC4yLjMgcmVnYXJkaW5nIGhvdyBzZXJ2ZXJzIHNob3VsZCBkZWFsIHdpdGggdGhlIDEwMAogIGNvbnRpbnVlIHJlcXVlc3QtaGVhZGVyOgoKICAgICAgICBJZiBpdCByZXNwb25kcyB3aXRoIGEgZmluYWwgc3RhdHVzIGNvZGUsIGl0IE1BWSBjbG9zZSB0aGUgdHJhbnNwb3J0CiAgICAgICAgY29ubmVjdGlvbiBvciBpdCBNQVkgY29udGludWUgdG8gcmVhZCBhbmQgZGlzY2FyZCB0aGUgcmVzdCBvZiB0aGUKICAgICAgICByZXF1ZXN0LgoKICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBJSVMgY2xlYXJseSBkaWQgY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW4gdGhpcyBjYXNlLAogIHdoaWxlIHRoaXMgbmV3ZXIgdmVyc2lvbiBkZWNpZGVkIGl0IHNob3VsZCAicmVhZCBhbmQgZGlzY2FyZCIuIFRoYXQgd291bGQndmUKICBmb3JjZWQgdXMgdG8gc2VuZCB0aGUgd2hvbGUgUE9TVCAob3IgUFVUKSBkYXRhIG9ubHkgdG8gaGF2ZSBpdCBkaXNjYXJkZWQgYW5kCiAgdGhlbiBiZSBmb3JjZWQgdG8gc2VuZCBpdCBhZ2Fpbi4gVG8gYXZvaWQgdGhhdCBodWdlIHBlbmFsaXR5LCB3ZSBzd2l0Y2ggdG8KICB1c2luZyBIRUFEIHVudGlsIHdlIGFyZSBhdXRoZW50aWNhdGVkIGFuZCB0aGVuIHNlbmQgdGhlIFBPU1QuCgogIFRoZSBvbmx5IGFjdHVhbCBkcmF3YmFjayBJIGNhbiB0aGluayBvZiAoZXhjZXB0IGZvciB0aGUgb2RkIHNpdGVzIHRoYXQgbWlnaHQKICB0cmVhdCBIRUFEIGRpZmZlcmVudGx5IHRoYW4gdGhleSB3b3VsZCB0cmVhdCBQT1NUL1BVVCB3aGVuIGdpdmVuIHRoZSBzYW1lCiAgVVJMKSBpcyB0aGF0IGlmIHlvdSBkbyBQT1NUIHdpdGggQ1VSTEFVVEhfQU5ZIHNldCBhbmQgdGhlIHNpdGUgcmVxdWlyZXMgTk8KICBhdXRoZW50aWNhdGlvbiwgbGliY3VybCB3aWxsIHN0aWxsIHVzZSBhIEhFQUQgaW4gYSBmaXJzdCByb3VuZCBhbmQgdGhlbiBkbyBhCiAgUE9TVC4KCiAgSWYgeW91IGRvIGEgSEVBRCBvciBhIEdFVCBvbiBhIHNpdGUgdXNpbmcgQ1VSTEFVVEhfQU5ZLCBsaWJjdXJsIHdpbGwgc2VuZAogIGFuIHVuLWF1dGhlbnRpY2F0ZWQgcmVxdWVzdCBhdCBvbmNlLCB3aGljaCB0aGVuIGlzIHRoZSBvbmx5IHJlcXVlc3QgaWYgdGhlCiAgc2l0ZSByZXF1aXJlcyBubyBhdXRoLgoKICBBbGFuIFBpbnN0ZWluIGhlbHBlZCBtZSB3b3JrIG91dCB0aGUgcHJvdG9jb2wgZGV0YWlscyBieSBmaWd1cmluZyBvdXQgd2h5CiAgbGliY3VybCBmYWlsZWQgYW5kIHdoYXQgSUlTNiBleHBlY3RzLgoKLSBUaGUgLS1saW1pdC1yYXRlIGxvZ2ljIHdhcyBjb3JyZWN0ZWQgYW5kIG5vdyBpdCB3b3JrcyBhIGxvdCBiZXR0ZXIgZm9yCiAgaGlnaGVyIHNwZWVkcywgc3VjaCBhcyAnMTBtJyBvciBzaW1pbGFyLiBSZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM5MzAyNDkuCgotIEludHJvZHVjaW5nIGN1cmx4X3R2bm93KCkgYW5kIGN1cmx4X3R2ZGlmZigpIHVzaW5nIHRoZSBuZXcgY3VybHhfKiBmYXNoaW9uLgogICNpbmNsdWRlICJ0aW1ldmFsLmgiIGZyb20gdGhlIGxpYiBkaXIgdG8gZ2V0IHRoZSBwcm90b3MgZXRjLiAgTm90ZSB0aGF0CiAgdGhlc2UgYXJlIE5PVCBwYXJ0IG9mIHRoZSBsaWJjdXJsIEFQSS4gVGhlIGN1cmwgYXBwIHNpbXBseSB1c2VzIHRoZSBzYW1lCiAgc291cmNlIGZpbGVzIGFzIHRoZSBsaWJyYXJ5IGRvZXMgYW5kIHRoZXJlZm9yZSB0aGUgZmlsZSBuZWVkcyB0byBiZSBjb21waWxlZAogIGFuZCBsaW5rZWQgd2l0aCBjdXJsIHRvbywgbm90IGp1c3Qgd2hlbiBjcmVhdGluZyBsaWJjdXJsLgoKLSBsaWIvc3RyZXJyb3IuYyBubyBsb25nZXIgdXNlcyBzeXNfbmVyciBvbiBub24td2luZG93cyBwbGF0Zm9ybXMgc2luY2UgaXQKICBpc24ndCBwb3J0YWJsZSBlbm91Z2gKCkRhbmllbCAoMiBBcHJpbCAyMDA0KQotIEluIHRoZSBjdXJsX3N0cm5xdWFsLjMgbWFuIHBhZ2UsIHdlIG5vdyBwcmVwZW5kIHRoZSBtYW4zIGRpciB0byB0aGUgZmlsZQogIG5hbWUgdG8gd29yayBiZXR0ZXIuIEFzIHBvaW50ZWQgb3V0IGJ5IFJvYmluIEtheS4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgotIERpcmsgTWFuc2tlIGZpeGVkIGEgcHJvYmxlbSBJIHJlY2VudGx5IGFkZGVkIGluIHRoZSBwcm9ncmVzcyBtZXRlciBjb2RlIHRoYXQKICBicm9rZSBzdWJzZWNvbmQgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fVE9UQUxfVElNRS4gSGUgYWxzbyBwb2ludGVkIG91dCBhCiAgbWlzdGFrZSBpbiB0aGUgY29kZSB0aGF0IHByb2R1Y2VzIHRoZSBmaW5hbCB1cGRhdGUgb2YgdGhlIHByb2dyZXNzIG1ldGVyCiAgdGhhdCB3b3VsZCBvZnRlbiBwcmV2ZW50IGl0IGZyb20gYWN0dWFsbHkgYmVpbmcgdXBkYXRlZCB0aGF0IGZpbmFsIHRpbWUuCgpEYW5pZWwgKDEgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIG1lbW9yeSBsZWFrIHRoYXQgaGFwcGVuZWQgd2hlbiB3ZSB1c2UgYXJlcyBmb3IgbmFtZQogIHJlc29sdmVzIGFuZCBkZWNpZGVzIHRvIHRpbWUtb3V0IGJlZm9yZSBhcmVzIGRvZXMgaXQuIFRoaXMgZml4IHVzZXMgdGhlCiAgYnJhbmQgbmV3IGFyZXNfY2FuY2VsKCkgZnVuY3Rpb24gd2hpY2ggaXMgbm90IHByZXNlbnQgaW4gYy1hcmVzIDEuMS4wLgoKICBXaGVuIHRvbGQgdG8gZW5hYmxlIGFyZXMsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHByZXNlbmNlIG9mCiAgdGhlIGFyZXNfY2FuY2VsIGZ1bmN0aW9uIHRvIGFsZXJ0IHVzZXJzIGlmIHRoZXkgYXR0ZW1wdCB0byB1c2UgYSB0b28gb2xkCiAgYy1hcmVzIGxpYnJhcnkuCgpEYW5pZWwgKDMxIE1hcmNoIDIwMDQpCi0gUm95IFNoYW4gZml4ZWQgYSBmbGF3IHRoYXQgcHJldmVudGVkIGFyZXMgbmFtZSByZXNvbHZlIHRpbWVvdXRzIHRvIG9jY3VyIQoKLSBEaXJrIE1hbnNrZSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIHRpbWVkIG91dCB3YWl0aW5nIGZvciByZXNvbHZlcyBmYXIgdG9vCiAgZWFzeSB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIHVzZSAoYy0pYXJlcyBmb3IgbmFtZSByZXNvbHZpbmcuCgotIEZ1cnRoZXIgRGlnZXN0IGZpeGluZyBhbmQgYSBzdWNjZXNzZnVsIHRlc3QgY2FzZSAxNTMgbm93IG1ha2VzIG1lIGJlbGlldmUKICBNaXR6IFdhcmsncyBwcm9ibGVtcyBhcmUgZml4ZWQuCgotIEFuZHJlcyBHYXJjaWEgZmlndXJlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgNjMsIHdoaWxlIHdvcmtpbmcsIG9ubHkgcHJvdmVkIGEKICBmbGF3IGluIGxpYmN1cmwncyAnaHR0cF9wcm94eScgcGFyc2VyIHdoZW4gYSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGlzCiAgcHJvdmlkZWQuIFRoZSB1c2VyIG5hbWUgd2FzIG5vdCBleHRyYWN0ZWQgcHJvcGVybHkgKGFuZCAnaHR0cCcgd2FzIGFsd2F5cwogIHVzZWQgYXMgdXNlciBuYW1lKS4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBjb21waWxlciB3YXJuaW5ncyBpbiBvdXIgaW9jdGxzb2NrZXQoKSB1c2FnZS4KCkRhbmllbCAoMzAgTWFyY2ggMjAwNCkKLSBKb2UgSGFscGluIGZhY2VkIHByb2JsZW1zIHdpdGggdGhlIGdldG5hbWVpbmZvKCkgYXJndW1lbnQgYWlfZmxhZ3MgYW5kIHRoZQogIHBhcnRpY3VsYXIgYml0IG5hbWVkICdOSV9XSVRIU0NPUEVJRCcgb24gU29sYXJpcyA5IGZvciBJbnRlbC4gIEkndmUgbm93CiAgd3JpdHRlbiBhIGNvbmZpZ3VyZSB0ZXN0IHRoYXQgY2hlY2tzIGZvciBhIHdvcmtpbmcgTklfV0lUSFNDT1BFSUQKICBpbXBsZW1lbmF0aW9uLiBObyBjb2RlIHVzZXMgdGhlIHJlc3VsdCBmcm9tIHRoaXMgdGVzdCB5ZXQsIGl0IGlzIHN0aWxsCiAgZXhwZXJpbWVudGFsLiBKYW1lcyBDYXJsc29uIHdyb3RlIGluIGNvbXAudW5peC5zb2xhcmlzOiAiSXQncyBhIGJ1ZwogICg1MDA2NjIzKSAtLSBpdCdzIG5vdCBzdXBwb3J0ZWQgYW5kIHNob3VsZG4ndCBiZSBpbiB0aGUgaGVhZGVyIGZpbGUuIgoKLSBJIHByb3ZpZGVkIE1pdHogV2FyayB3aXRoIGEgZmlyc3QgcGF0Y2ggaW4gb3JkZXIgdG8gZml4IGxpYmN1cmwncyBwcm9ibGVtcwogIHRvIHJlLW5lZ290aWF0ZSBEaWdlc3QgYXV0aGVudGljYXRpb24gKHdoZW4gJ3N0YWxlPXRydWUnIGlzIGluY2x1ZGVkIGluIHRoZQogIHJlc3BvbnNlIGhlYWRlcikuCgotIFJveSBTaGFuIGRpc2NvdmVyZWQgdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlIGRpZG4ndCBwcm9wZXJseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzIHdoaWNoIGNvdWxkIG1ha2UgaGFuZGxlcyBnZXQgc3R1Y2sgaW4gdGhhdCBzdGF0ZSBhbmQgdGh1cyBuZXZlciBnZXQKICBjb21wbGV0ZWQuIEkndmUgcHJvZHVjZWQgYSBmaXJzdCB0ZXN0IHBhdGNoIHRoYXQgYXR0ZW1wdHMgdG8gY29ycmVjdCB0aGlzLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBwbGllZCB0byBtYWtlIENVUkxPUFRfRkFJTE9ORVJST1Igd29yayBuaWNlbHkKICBldmVuIHdpdGggYXV0aGVudGNhdGlvbnMgc3VjaCBhcyBOVExNIG9yIERpZ2VzdCBlbmFibGVkLiBUZXN0IGNhc2VzIDE1MCwgMTUxCiAgYW5kIDE1MiB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjkgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSB1cGRhdGVkIGZpbGVzIGZvciB0aGUgZGpncHAvTVMtRE9TIGJ1aWxkLgoKLSBBbmRy6XMgR2FyY+1hIGhlbHBlZCBtZSB3b3JrIG91dCBhIGZpeCBmb3IgdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdCB0byBtYWtlCiAgdGhlIGZpbGU6Ly8gdGVzdHMgcnVuIGZpbmUgd2hlbiB0ZXN0ZWQgd2l0aCB0aGUgbWluZ3ctYnVpbHQgdmVyc2lvbiBvZiBjdXJsLgoKLSBGaXhlZCBhbiBpbmNsdWRlIGlzc3VlIHdpdGggbmV0aW5ldC90Y3AuaCBvbiBBSVgsIGJhc2VkIG9uIGlucHV0IGJ5IFRvci4KICBUaGlzIGFsc28gcmVxdWlyZWQgYSBtaW5vciBmaXggb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgotIFRoZSBwb3N0aXQyLmMgc291cmNlIGV4YW1wbGUgdXNlZCB0aGUgd3Jvbmcgc3RydWN0IG5hbWUgZm9yIHRoZSBwb3N0IGRhdGEuCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgaXB2NiBzdXBwb3J0IG9uIHdpbmRvd3MgYnkgbWFraW5nIHRoZSBjdXJsIGJ1aWxkIHRvIHVzZQogIHRoZSBjb3JyZWN0IGdldGFkZHJpbmZvKCkgZnVuY3Rpb24uCgpEYW5pZWwgKDI1IE1hcmNoIDIwMDQpCi0gSXQgdHVybmVkIG91dCB0aGF0IEFJWCwgZGVzcGl0ZSBoYXZpbmcgYSAidGhyZWFkLXNhZmUgbGliYyIsIGRvZXNuJ3Qgb2ZmZXIKICBhbGwgdHJhZGl0aW9uYWwgZnVuY3Rpb25zIHRocmVhZC1zYWZlLiBUaGlzIFVSTCBpcyBpbmZvcm1hdGl2ZSBvbiB0aGlzCiAgc3ViamVjdDoKCiAgICBodHRwOi8vcHVibGlibi5ib3VsZGVyLmlibS5jb20vZG9jX2xpbmsvZW5fVVMvYV9kb2NfbGliL2FpeHByZ2dkLyBcCiAgICBnZW5wcm9nYy90aHJlYWRfcXVpY2tfcmVmLmh0bQoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB3ZSBub3cgY2hlY2sgZm9yIHRocmVlICpfcigpIGZ1bmN0aW9ucyBvbiByZWNlbnQgQUlYCiAgdmVyc2lvbnMgYXMgd2VsbCB0aGF0IHRoZSBVUkwgbWVudGlvbnMgYXJlbid0IHRocmVhZC1zYWZlIGluIEFJWCA1LjEuCgotIHJlbmFtZWQgY3VybF9zdHJlcnJvci5bY2hdIHRvIHN0cmVycm9yLltjaF0KCi0gSm9lIEhhbHBpbiBhZGRlZCBDVVJMT1BUX1RDUF9OT0RFTEFZIGFuZCAtLXRjcC1ub2RlbGF5IHRvIG1ha2UgaXQgcG9zc2libGUKICBmb3IgdXNlcnMgdG8gZGlzYWJsZSB0aGUgTmFnbGUgYWxnb3J0aGltLXVzYWdlLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBzb21lIGludGVyZXN0aW5nIHN0cmVycm9yX3IoKSBrbm93bGVkZ2UuIGdsaWJjIGhhcyBpdHMKICBvd24gQVBJIHdoaWNoIGRpZmZlcnMgZnJvbSB0aGUgUE9TSVggb25lLiBEYW5pZWwgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZQogIHNjcmlwdCB0byBkZXRlY3QgdGhlIHZlcnNpb24gaW4gdXNlLCBhbmQgdGhlIGNvZGUgbm93IHVzZXMgdGhlIG5ldyBkZWZpbmVzCiAgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHNvbWUgYnVpbGQgZmxhd3Mgd2l0aCB0aGUgbmV3IGxpYi9jdXJsX3N0cmVycm9yLmMgc291cmNlIGZpbGUuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXggdG8gcmVwbGFjZSB0aGUgYmFkIHVzZSBvZiBzdHJlcnJvcigpLiBUaGlzIGludHJvZHVjZXMKICBDdXJsX3N0cmVycm9yKCkgdGhhdCBhdHRlbXB0cyB0byBiZSB0aHJlYWQtc2FmZSBfYW5kXyB3b3JrcyBvbiBXaW5kb3dzIHRvbyEKCi0gVG9yIEFybnRzZW4gc3BlbGwtZml4ZWQgbG90cyBvZiBsaWJjdXJsIG1hbiBwYWdlcy4KCi0gVG9yIEFybnRzZW4gbWFkZSB0ZXN0Y3VybC5wbCB3b3JrIHdpdGggb2xkZXIgcGVybCA1IHZlcnNpb25zLCBhbmQgRGFuaWVsCiAgbWFkZSBpdCBub3QgdXNlIGNoZGlyIC4uIHRvIGdvIGJhY2ssIGFzIHRoYXQgaXNuJ3QgdmVyeSBnb29kIHdoZW4geW91J3ZlCiAgc2V0dXAgYSB0ZXN0ZGlyIGNvbnRhaW5pbmcgc3ltbGlua3MuCgotIEFkZGVkIGEgY2hlY2sgZm9yIHN0cmVycm9yX3IoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjMgTWFyY2ggMjAwNCkKLSBBZGRlZCBHcmVnIEhld2dpbGwncyB0ZXN0Y3VybC5wbCBzY3JpcHQgdG8gQ1ZTLiBXZSBoYXZlIG5vdCBtb3ZlZCBvdmVyIHRvCiAgdXNlIHRoaXMgc2NyaXB0IGZvciB0aGUgcmVhbCBkaXN0cmlidXRlZCB0ZXN0aW5nIGp1c3QgeWV0LCBidXQgaXQgaXMgb25seQogIGEgbWF0dGVyIG9mIHRpbWUuCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBtYWtlcyBjdXJsIHJlcG9ydCBhIGJldHRlciBlcnJvciBtZXNzYWdlCiAgaWYgLS1pbnRlcmZhY2UgZmFpbHMgb24gd2luZG93cy4KCi0gVGhlIHJlZ3VsYXIgcHJvZ3Jlc3MgbWV0ZXIgaXMgbm93IGZpeGVkIHRvIG5ldmVyIHdyYXAgZHVlIHRvIGxvbmcgbGluZXMuIEFsbAogIGZpZWxkcyBhcmUgbm93IHN0YXRpYyBzaXplZC4gSWYgdGhlIHRpbWUgaW4gdGhlIHRpbWUgZmllbGRzIGdldCBhIHRpbWUgdmFsdWUKICB0aGF0IHdvdWxkIHJlcHJlc2VudCBhIHRpbWUgdGhhdCBpcyAxMDAgaG91cnMgb3IgbW9yZSAoaWYgbm90LCBpdCByZW1haW5zCiAgdXNpbmcgYSBISDpNTTpTUyBkaXNwbGF5KSwgaXQgc3dpdGNoZXMgZmlyc3QgdG8gYSAiTk5OZCBOTmgiIGRpc3BsYXkgKGZvcgogIGRheXMgYW5kIGhvdXJzKSBhbmQgaWYgdGhhdCBpc24ndCBlbm91Z2ggaXQgc3dpdGNoZXMgdG8gYSAiTk5OZCIgZGlzcGxheSBpZgogIGl0IGlzIG1vcmUgdGhhbiA5OTkgZGF5cy4KCiAgU2V2ZXJhbCBvZiB0aGUgY2FsY3VsYXRpb25zIHdlcmUgYWxzbyBtb3ZlZCB0byBmaXhlZC1wb2ludCBtYXRoIGluc3RlYWQgb2YKICB1c2luZyBkb3VibGVzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDA0KQotIEdsZW4gTmFrYW11cmEgbm90aWNlZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBkaWRuJ3Qgd29yayBhcyBpdAogIHVzZWQgdG8gZG8gaWYgQ1VSTE9QVF9OT0JPRFkgaXMgc2V0IFRSVUUuCgotIEtldmluIFJvdGggcGF0Y2hlZCB0aGUgY3lnd2luIHBhY2thZ2UgbWFrZWZpbGUgYW5kIFJFQURNRSB0byBhZGp1c3QgdG8KICBuZXcgY3lnd2luIHBhY2thZ2luZyBndWlkZWxpbmVzLgoKLSBFbmFibGVkICJOVCByZXNwb25zZXMiIGluIHRoZSBOVExNIGF1dGhlbnRpY2F0aW9uLiBEb2luZyB0aGlzIHNpbXBseSBtZWFucwogIHRoYXQgd2UgcHJvdmlkZSBhbiBleHRyYSBjaHVuayBvZiBkYXRhIGluIGVhY2ggInR5cGUtMyBtZXNzYWdlIi4gVGhlIG9ubHkKICByZWFzb24gZm9yIGRvaW5nIHRoaXMgaXMgdGhhdCBpdCBzZWVtcyB0aGF0IHVzaW5nIG9ubHkgdGhlICJMYW5tYW5hZ2VyIGhhc2giCiAgKGFzIHdlJ3ZlIGJlZW4gZG9pbmcgdW50aWwgbm93KSBkb2Vzbid0IHN1cHBvcnQgcGFzc3dvcmRzIGxvbmdlciB0aGFuIDE0CiAgY2hhcmFjdGVycyBhbmQgaXQgdHVybnMgb3V0IHRoZXJlIGFyZSB1c2VycyBvdXQgdGhlcmUgd2hvIHdhbnQgdG8gdXNlCiAgbGliY3VybCBhbmQgTlRMTSB3aXRoIHN1Y2ggcGFzc3dvcmRzISA7LSkgU2V2ZW4gTlRMTS1yZWxhdGVkIHRlc3QgY2FzZXMgd2VyZQogIHVwZGF0ZWQgYWNjb3JkaW5nbHkuIE1lbnRpb25lZCBhcyBpc3N1ZSAyOSBpbiBUT0RPLVJFTEVBU0UsIGJ1ZyByZXBvcnQKICAjOTE1NjA5CgotIE1vdmVkIHRoZSBnZW5lcmF0ZWQgbGliY3VybCB2ZXJzaW9uIGluZm8gdG8gYSBuZXcgaGVhZGVyIGZpbGUsIG5hbWVkCiAgY3VybC9jdXJsdmVyLmguIE5vdyBpbnRlcmVzdGVkIHBhcnRpZXMgY2FuIGluY2x1ZGUgT05MWSB2ZXJzaW9uIGluZm8sIHNob3VsZAogIGFueW9uZSB3YW50IHRoYXQgKGFuZCBpdCBzZWVtcyBhdCBsZWFzdCBzb21lIHdpbmRvd3MgcmVzb3VyY2UgZmlsZXMgd291bGQpLgogIE1lbnRpb25lZCBhcyBpc3N1ZSAyNyBpbiBUT0RPLVJFTEVBU0UuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDQpCi0gRml4ZWQgdGhlIHJvb3QgTWFrZWZpbGUgdG8gdXNlIHRhYnMgZm9yIHRoZSBuZXR3YXJlIHRhcmdldC4gR/xudGVyIEtuYXVmCiAgcG9pbnRlZCB0aGlzIG91dC4KCi0gTWFydHkgS3VocnQncyBWTVMgY2xlYW51cAoKLSBUaG9tYXMgU2Nod2luZ2UgbWFkZSBidWlsZGNvbmYgcmVjb2duaXplIEFDTE9DQUxfRkxBR1MgdG8gaW52b2tlIGFjbG9jYWwKICB3aXRoIHBhcnRpY3VsYXIgcHJlLWRldGVybWluZWQgb3B0aW9ucy4KClZlcnNpb24gNy4xMS4xICgxOSBNYXJjaCAyMDA0KQoKRGFuaWVsICgxOCBNYXJjaCAyMDA0KQotIFRvciBBcm50c2VuIGJyb3VnaHQgc29tZSBpbmZvIGFib3V0IFNHSSBJUklYOgoKICBJUklYIHN1cHBvcnRzIDMgZGlmZmVyZW50IGV4ZWN1dGFibGUvb2JqZWN0IGZvcm1hdHMsIC0zMiwgLW4zMiBhbmQgLTY0LgogIC1uMzIgaXMgZGVmYXVsdCAzMi1iaXQgZm9ybWF0LCAtMzIgaXMgdGhlICJvbGQiIDMyLWJpdCBmb3JtYXQsIGFuZCAtNjQgaXMKICB0aGUgNjQtYml0IGZvcm1hdC4gIExpYnJhcmllcyBmb3IgdGhlIGRpZmZlcmVudCBmb3JtYXRzIGFyZSBpbiBsaWIsIGxpYjMyCiAgYW5kIGxpYjY0IHJlc3BlY3RpdmVseS4KCiAgV2UndmUgbm93IGFkanVzdGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGFkYXB0IHRvIHRoaXMgd2hlbiBzY2FubmluZyBmb3IKICAzcmQgcGFydHkgbGlicywgc3VjaCBhcyBPcGVuU1NMLgoKRGFuaWVsICgxNyBNYXJjaCAyMDA0KQotIFdhdHogcG9pbnRlZCBvdXQgYSBmZXcgbWlzc2luZyBmaWxlcyBpbiB0aGUgTVNWQyBwcm9qZWN0IGRlc2NyaXB0aW9uIGZpbGUuCgotIEf8bnRlciBLbmF1ZiBicm91Z2h0IHBhdGNoZXMsIGNvZGUgYW5kIG1ha2VmaWxlcyB0byBidWlsZCBjdXJsIG9uIE5vdmVsbAogIE5ldFdhcmUuCgpEYW5pZWwgKDE1IE1hcmNoIDIwMDQpCi0gTG90cyBvZiBsaWJjdXJsIG1hbiBwYWdlcyB3ZXJlIHVwZGF0ZWQgdG8gY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG1hbgogIHBhZ2VzIHRoZSByZWNvZ25pemVkIHdheSBzbyB0aGF0IHRoZXkgYXBwZWFyIGFzIG5pY2UgaHlwZXJsaW5rcyBpbiB0aGUgSFRNTAogIHZlcnNpb25zLgoKLSBidWlsZGNvbmYgbm93IGNoZWNrcyB0aGUgbTQgdmVyc2lvbiB0b28sIHNpbmNlIGF1dG9jb25mIHJlcXVpcmVzIGEgR05VIG00CiAgdmVyc2lvbiB0byBidWlsZCBwcm9wZXIgY29uZmlndXJlIHNjcmlwdHMuCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDQpCi0gQWRkZWQgQ1VSTE9QVF9QT1NURklFTERTSVpFX0xBUkdFLCB0aGUgbGFyZ2UgZmlsZSB2ZXJzaW9uIG9mCiAgQ1VSTE9QVF9QT1NURklFTERTSVpFIHRvIGFsbG93IFBPU1RzIGxhcmdlciB0aGFuIDJHQi4KCi0gRGF2aWQgQnlyb24gZml4ZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSBjYXNlL2NyYXNoLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA0KQotIEplZmYgTGF3c29uIGZpeGVkIHRoZSBTU0wgY29ubmVjdGlvbiB0byBkZWFsIHdpdGggcmVjZWl2ZWQgc2lnbmFscyBkdXJpbmcgdGhlCiAgY29ubmVjdC4KCi0gQ2hhbmdlZCB0aGUgT1Mgc3RyaW5nIGZvciB3aW4zMiB0byBiZWNvbWUgImkzODYtcGMtd2luMzIiLgoKRGFuaWVsICg5IE1hcmNoIDIwMDQpCi0gQ2hhbmdlZCB0aGUgaW50ZXJuYWxzIHRvIHVzZSBjdXJsX3NvY2tldF90IGZvciBzb2NrZXQgdmFyaWFibGUgdHlwZS4gVGhpcwogIHNob3VsZCBlbmFibGUgdXMgdG8gYnVpbGQgd2l0aCBsZXNzIHdhcm5pbmdzIG9uIFdpbmRvd3MsIHdoZXJlIFNPQ0tFVCBpcwogIHVzZWQgd2hpY2ggaXMgYW4gdW5zaWduZWQgaW50LCB3aGlsZSBtb3N0IG90aGVyIHBsYXRmb3JtcyB1c2UgYSBtZXJlIGludC4KCi0gTW9kaWZpZWQgbGliL2NvbmZpZy13aW4zMi5oIHRvIGJ1aWxkIGZpbmUgb24gTVNWQyBhZ2Fpbi4KClZlcnNpb24gNy4xMS4xLXByZTEgKDggTWFyY2ggMjAwNCkKCkRhbmllbCAoOCBNYXJjaCAyMDA0KQotIE1pbm9yIGZpeCB0byBtYWtlIGN1cmwgQ1VSTF9WRVJTSU9OX0xBUkdFRklMRSBpcyBvbmx5IHNldCBpZiBjdXJsX29mZl90IGlzCiAgbGFyZ2VyIHRoYW4gNCBieXRlcy4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEltcHJvdmVkIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24sIHRoZSBzbyBjYWxsZWQgaXNzdWUgMTIuCgotIE1vZGlmaWVkIHRoZSB0ZXN0IEhUVFAgc2VydmVyIGEgbG90IHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgY2hhbmdlcyBmb3IKICBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uIChsaWtlIHRlc3QgY2FzZSA4OCkuIEFkZGVkIEFuZHLpcwogIEdhcmPtYSdzIHdpbjMyLWNoYW5nZXMuIEltcHJvdmVkIHRoZSBsb2dnaW5nLgoKLSBGaXhlZCB0aGUgZmlsZTotcmVsYXRlZCBwcm9ncmVzcy9nZXRpbmZvIHN0dWZmIGEgYml0IG1vcmUuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJIGNvcnJlY3RlZCBhIHByb2JsZW0gd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246CiAgaGVhZGVyIG9yIHdoZW4gZG9pbmcgbXVsdGlwbGUtcmVxdWVzdCBhdXRoZW50aWNhdGlvbnMuIEEgc3Vic2VxdWVudCByZXF1ZXN0CiAgY291bGQgZXJyb25lb3VzbHkgcmUtdXNlIGEgcHJldmlvdXMgY29ubmVjdGlvbiB0aGF0IHdhcyBzZW50IHdpdGgKICBDb25uZWN0aW9uOiBjbG9zZS4gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkLgoKLSBBbmRy6XMgR2FyY+1hIHBhdGNoZWQgY3VybCB0byBwcmV2ZW50IHdhcm5pbmdzIHdoaWxlIGNvbXBpbGluZyB3aXRoIG1pbmd3LAogIG1haW5seSBiZWNhdXNlIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBoYXZlIGJvdGggV0lOMzIgYW5kIEhBVkVfQ09ORklHX0gKICBkZWZpbmVkLgoKLSBXaGVuIHRyYW5zZmVycmluZyBmaWxlcyBmcm9tIGEgZmlsZTogVVJMLCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIG90aGVyCiAgdHJhbnNmZXIgbWV0cmljcyB3ZXJlIG5vdCB1cGRhdGVkIHByb3Blcmx5LgoKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhICJ2ZXJzaW9uIHJlc291cmNlIiBmaWxlIHRvIHRoZSBjdXJsIGV4ZWN1dGFibGUgZm9yCiAgdGhlIHdpbmRvd3MgYnVpbGRzLgoKRGFuaWVsICgzIE1hcmNoIDIwMDQpCi0gRGF2aWQgQnlyb24ncyB3b3JrIG9uIG1ha2luZyBsaWJjdXJsIG9ubHkgcmVxdWlyZSB3aW5zb2NrIDEuMSBvbiBXaW5kb3dzCiAgbWFjaGluZXMuCgotIE1vcmUgdmFyaWFibGUgY2xlYW51cHMgYmFzZWQgb24gY29tcGlsZXIgd2FybmluZ3MgZ2VuZXJhdGVkIGJ5IFRvciBBcm50c2VuJ3MKICBhdXRvYnVpbGRzIHdpdGggTUlQU1Byby4KCi0gSm9lIEhhbHBpbiBoZWxwZWQgdXMgZml4IHNvbWUgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3Mgb24gRnJlZUJTRC4KCi0gQXBwbGllZCBUb20gQmF0ZXMnIHBhdGNoIHRvIGJ1aWxkIG9uIG5zci10YW5kZW0tbnNrLgoKLSBEYW4gRmFuZHJpY2ggY29ycmVjdGVkIHNvbWUgZmxhd3MgaW4gdGhlIGNvbmZpZ3VyZSBHU1MgZGV0ZWN0aW9uLgoKRGFuaWVsICgyIE1hcmNoIDIwMDQpCi0gRml4ZWQgdGhlIGxpYmN1cmwgY29kZSB0byB1c2UgRk9STUFUX09GRl9UIGZvciBwcmludGYoKSBmb3JtYXR0aW5nCiAgY3VybF9vZmZfdCB0eXBlcyBpbnRlcm5hbGx5LgoKRGFuaWVsICgxIE1hcmNoIDIwMDQpCi0gQWRkZWQgQ1VSTF9WRVJTSU9OX0xBUkdFRklMRSBhcyBhIGZlYXR1cmUtYml0IGluIHRoZSBjdXJsX3ZlcnNpb25faW5mbygpCiAgcmVzcG9uc2UsIHRoYXQgc2lnbmFscyBpZiB0aGlzIGxpYmN1cmwgc3VwcG9ydHMgPjJHQiBmaWxlcy4gY3VybCAtViBub3cKICBvdXRwdXRzICdMYXJnZWZpbGUnIGluIHRoZSBGZWF0dXJlczogZmllbGQgaWYgdGhpcyBpcyB0aGUgY2FzZS4gTW9zdCBzeXN0ZW1zCiAgYXJlIGxpa2VseSB0byBzdXBwb3J0IHRoaXMuCgotIFdlIG9mZmVyIGEgQ1VSTF9GT1JNQVRfT0ZGX1QgZGVmaW5lIGluIHRoZSBwdWJsaWMgaGVhZGVyLCB3aGljaCBjYW4gYmUgdXNlZAogIHRvIHByaW50ZigpIGN1cmxfb2ZmX3QgdmFyaWFibGVzLiBXZSBhbHNvIG1vZGlmaWVkIHRoZSBsaWJjdXJsIHNvdXJjZXMgdG8KICB1c2UgdGhpcyBkZWZpbmUgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgJU9kIGFwcHJvYWNoIChhbHRob3VnaCBJJ3ZlIGxlZnQgdGhlCiAgTy1mbGFnIGZ1bmN0aW9uYWwgaW4gdGhlIGNvZGUpLiBUaGlzIHNob3VsZCBhbHNvIHByZXZlbnQgY29tcGlsZXJzIHRvIHdhcm4KICBvbiB0aGUgaG9tZS1ncm93biBvcHRpb24uCgotIEZpeGVkIHRoZSByZXN1bWUtY2hlY2sgY29kZSB0byB0ZXN0IGZvciBhIHdvcmtpbmcgcmVzdW1lIGF0IHRoZSBlbmQgb2YgdGhlCiAgaGVhZGVycyBhbmQgbm90IGF0IHRoZSBmaXJzdCBib2R5LWJ5dGUuCgotIENVUkxPUFRfRE5TX1VTRV9HTE9CQUxfQ0FDSEUgaXMgbm93IGNvbnNpZGVyZWQgb2Jzb2xldGUuIFN0b3AgdXNpbmcgaXQuIElmCiAgeW91IG5lZWQgYSBnbG9iYWwgRE5TIGNhY2hlIGZvciB3aGF0ZXZlciByZWFzb24sIHVzZSB0aGUgc2hhcmUgaW50ZXJmYWNlIGFuZAogIHlvdSdsbCBnZXQgYSBnbG9iYWwgY2FjaGUgdGhhdCB3b3JrcyB0aGUgd2F5IGl0IHNob3VsZCB3b3JrLiBZb3UgY2FuIGV2ZW4KICBoYXZlIGFueSBudW1iZXIgb2YgZ2xvYmFsIGNhY2hlcywgYWxsIGF0IHlvdXIgY29tbWFuZC4gVGhpcyBpcyBub3cgYWxzbwogIG1lbnRpb25lZCBpbiB0aGUgZG9jcy4KCi0gTWFkZSB0aGUgKnByaW50ZiBjb2RlIHN1cHBvcnQgdGhlIHotZmxhZyB0byBlbmFibGUgc2l6ZV90IHByaW50ZigpIGluIGEKICBtYW5uZXIgc2ltaWxhciB0byBob3cgZ2xpYmMgYWxsb3dzIGl0LiBUbyBtYWtlIHByaW50ZmluZyBvZiB0aGlzIHdvcmsgb24KICBwbGF0Zm9ybXMgd2l0aCA2NGJpdCBzaXplX3QgYW5kIDMyYml0IGludHMuIElmIHRoZXJlIGV2ZW4gYXJlIGFueSEgOy0pCgotIENocmlzdG9waGVyIFIuIFBhbG1lciBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IENVUkxPUFRfRlJFU0hfQ09OTkVDVCBhbmQKICBDVVJMQVVUSF9OVExNIChvciBDVVJMQVVUSF9BTlkgYW5kIGxpYmN1cmwgdGhlbiBwaWNrZWQgTlRMTSksIGxpYmN1cmwgd291bGQKICBsb29wIHdpdGhvdXQgc3VjY2VlZGluZyB0byBhdXRoZW50aWNhdGUgZHVlIHRvIHRoZSBuZXcgY29ubmVjdGlvbiB0aGF0IHdhcwogIG1hZGUgZm9yIGFsbCByb3VuZC10cmlwcyBpbiB0aGUgYXV0aGVudGljYXRpb24uIE5vdywgdGhlIEZSRVNIX0NPTk5FQ1QgaXMKICByZW1hZGUgdG8gb25seSBtYXR0ZXIgZm9yIHRoZSBmaXJzdCBjb25uZWN0aW9uIG1hZGUgd2l0aCBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgYW5kIGFsbCB0aGUgcmVzdCB0aGF0IG1pZ2h0IGZvbGxvdyBkdWUgdG8gRk9MTE9XTE9DQVRJT04gb3IgSFRUUAogIGF1dGhlbnRpY2F0aW9uIGFyZSBub3cgaWdub3JpbmcgdGhhdCBvcHRpb24uCgotIEFkanVzdGVkIHRoZSBRVUlUIGNvZGUgc2xpZ2h0bHkgc2luY2UgaXQgY291bGQgY29yZS1kdW1wLgoKLSBDb3JyZWN0ZWQgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRvIHByb3ZpZGUgYSBjb3JyZWN0IHNpemUgdG8gdGhlCiAgJ3ZlcmlmaWVkc2VydmVyJyByZXF1ZXN0LgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA0KQotIEpvZSBIYWxwaW4gbWFkZSB0aGUgRlRQIGNvZGUgc2VuZCBRVUlUIG9uIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYmVmb3JlCiAgZGlzY29ubmVjdGluZyB0aGUgVENQIGNvbm5lY3Rpb24uIFRoaXMgaXMgd2hhdCBnb29kLWJlaGF2aW5nIGZ0cCBjbGllbnRzCiAgc2hvdWxkIGRvLgoKRGFuaWVsICgyNiBGZWJydWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIHVwZGF0ZWQgc2V2ZXJhbCBmaWxlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBNU1ZDIDYuIEhlCiAgYWxzbyBhZGRlZCB0aGUgJ2J1aWxkY29uZi5iYXQnIHRoYXQgd29ya3MgbGlrZSB0aGUgJ2J1aWxkY29uZiArIGNvbmZpZ3VyZScKICBjb21ibyBkb2VzIG9uIHVuaXhlcy4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbWVtZGVidWcgc3R1ZmYgc3VwcG9ydCBjYWxsb2MoKSBhcyB3ZWxsLgoKLSBUb3IgQXJudHNlbiBwb2ludGVkIG91dCB0aGF0IHRlc3RjdXJsLnNoIG5lZWRlZCB0byByZW1vdmUgdGhlIGdlbmVyYXRlZAogIGZpbGVzIGluIG9yZGVyIHRvIGhhdmUgdGhlbSByZS1nZW5lcmF0ZWQgaW4gZWFjaCBidWlsZC4KCi0gQW5keSBTZXJwYSBmb3VuZCBvdXQgdGhhdCB0aGUgc2hhcmUgaW50ZXJmYWNlIGRpZCBub3QgZW5qb3kgbGlmZSB3aGVuIG5vdAogIGhhdmluZyB0aGUgbG9jayBhbmQgdW5sb2NrIGNhbGxiYWNrcyBzZXQsIGV2ZW4gdGhvdWdoIGRvY3VtZW50ZWQgdG8gYmUKICBPSy4gSXQgc3RpbGwgaXMgT0ssIGFuZCBub3cgdGhlIGNvZGUgd29uJ3Qgc2VnZmF1bHQgYW55bW9yZSEKCkRhbmllbCAoMjUgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdyZWcgSGV3Z2lsbCBJIG1vZGlmaWVkIGhvdyBsb25nIGxvbmcgaXMgdXNlZCBpbiB0aGUKICBtcHJpbnRmIGNvZGUsIGFzIHdlIGNhbiB1c2UgYSA2NGJpdCB0eXBlIHdpdGggTVNWQyB0aGF0IGlzIGEgbG9uZyBsb25nCiAgZXF1aXZhbGVudC4gVGhpcyBjb3JyZWN0cyBzb21lIHdlaXJkIGxhcmdlIGZpbGUgYmVoYXZpb3JzIG9uIHdpbmRvd3MuCgotIFRvciBBcm50c2VuIGhlbHBlZCBtZSB3b3JrIG91dCAtLWVuYWJsZS1kZWJ1ZyB0byB3b3JrIGJldHRlciB3aXRoIGRpZmZlcmVudAogIHZlcnNpb25zIG9mIHRoZSBnY2MgYW5kIGljYyBjb21waWxlcnMuCgotIEFkZGVkIENVUkxPUFRfU0hBUkUgdG8gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNCkKLSBBcHBsaWVkIHRoZSBmaW5hbCBwaWVjZXMgb2YgR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IGJyaW5ncyBhIHdvcmtpbmcgbmFtZQogIHJlc29sdmUgdGltZW91dCB0byB0aGUgd2luZG93cyB2ZXJzaW9ucyBvZiBjdXJsIQoKRGFuaWVsICgyMSBGZWJydWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uJ3MgZml4IHRvIGFsbG93IHRoZSBzcGVlZC1saW1pdCBsb2dpYyB3b3JrIGV2ZW4gaWYgeW91IHNldAogIGxpbWl0LXJhdGUuIEl0IGRvZXMgd29yayBvbiB0aGUgZXhwZW5zZSBvZiB0aGUgcmF0ZSBsaW1pdGVyLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA0KQotIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyB3aXRoIGdjYyBub3cgYWxzbyB0cmllcyB0byBkZXRlY3QgdGhlIGljYyBjb21waWxlcgogICh3aGljaCBzb21laG93IGdldHMgdHJlYXRlZCBhcyBpZiBpdCBpcyBhIGdjYykgdG8gc3RvcCB1c2luZyBhbGwgdGhlIGdjYwogIG9wdGlvbnMgd2l0aCBpdCwgYW5kIHdlIGFsc28gcHJvdmlkZSAtaXN5c3RlbSBvcHRpb25zIGZvciBlYWNoIGV4dHJhIC1JCiAgb3B0aW9uIHRoZSBjb25maWd1cmUgc2NyaXB0IGhhcyBmaWd1cmVkIG91dCAoZm9yIE9wZW5TU0wsIGtlcmJlcm9zLCB6bGliLAogIEhlaW1kYWwgZXRjKS4gVGhpcyBvZiBjb3Vyc2UgdG8gcHJldmVudCB3YXJuaW5ncyBvbiBoZWFkZXJzIHdlIGRvbid0IGhhdmUKICBjb250cm9sIG9mLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA0KQotIERvdWcgUG9ydGVyIG1hZGUgbGliY3VybCB1c2UgdGhlIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIHRoZQogIGdldHB3dWlkIHJlc3VsdHMgd2hlbiBsb29raW5nIGZvciAubmV0cmMgZmlsZXMuCgotIElmICdjb25maWd1cmUgLS1lbmFibGUtZGVidWcnIGlzIHVzZWQgd2l0aCBnY2MsIGl0IG5vdyBjaGVja3Mgd2hpY2ggZ2NjCiAgdmVyc2lvbiBpdCBpcyBhbmQgdXNlcyBhcyBwaWNreSBjb21waWxlciBvcHRpb25zIGFzIHBvc3NpYmxlIGZvciB0aGUKICBwYXJ0aWN1bGFyIHZlcnNpb24uCgotIENvZGUgdGhhdCBjYW4gYmUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgbWFkZSB0byB1c2UKICB0aGUgY3VybHhfIHByZWZpeC4gVGhlIGZpcnN0IGZ1bmN0aW9uIHRvIGJlIGF2YWlsYWJsZSBsaWtlIHRoaXMgaXMgdGhlCiAgY3VybHhfc3RydG9sbCgpIGZ1bmN0aW9uLiBUaGlzIGlzIG1hZGUgdG8gYWxsb3cgdGhlIGFwcCB0byB1c2UgZXhpc3RpbmcgY29kZSwKICBidXQgd2l0aG91dCBwb2xsdXRpbmcgdGhlIGxpYmN1cmwgQVBJLiBGdXJ0aGVyIGV4cGxhbmF0aW9ucyBwb3N0ZWQgaGVyZToKCiAgICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDQtMDIvMDIxNS5odG1sCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYnVpbGRjb25mIHRvIG5vdCB1c2UgIndoaWNoIiBhcyBBSVggYW5kIFRydTY0IGhhdmUgd2hhdCBoYXZlIGJlZW4KICByZWZlcnJlZCB0byBhcyAiaG9ycmlibHkgYnJva2VuICd3aGljaCcgcHJvZ3JhbXMiLgoKLSBNYWRlIHN1cmUgZG5zIGNhY2hlIHRpbWVvdXQgc2V0IHRvIC0xIHJlYWxseSBtZWFucyBjYWNoaW5nIGZvcmV2ZXIuCgpEYW5pZWwgKDE3IEZlYnJ1YXJ5IDIwMDQpCi0gTWFkZSBpdCBwb3NzaWJseSB0byBidWlsZCBjLWFyZXMgd2l0aCB0aGUgbGliY3VybCBtZW1kZWJ1ZyBzeXN0ZW0gdG8gYmV0dGVyCiAgdHJhY2sgbWVtb3J5LgoKRGFuaWVsICgxNiBGZWJydWFyeSAyMDA0KQotIFdoZW4gdXNpbmcgYXJlcywgd2Ugbm93IGluaXRpYWxpemUgdGhlIGFyZXMgJ2NoYW5uZWwnIGluIGN1cmxfZWFzeV9pbml0KCkKICBhbmQgcmUtdXNlIHRoYXQgc2FtZSBoYW5kbGUgZHVyaW5nIHRoZSBlbnRpcmUgY3VybCBoYW5kbGUncyBsaWZlLXRpbWUuIEl0CiAgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCgotIEZpeGVkIGEgcHJvYmxlbSB3aGVuIGRpc3BsYXlpbmcgdmVyYm9zZSBmb3IgaXB2Ni1lbmFibGVkIGxpYmN1cmxzIGFuZAogIHJlLXVzZWQgY29ubmVjdGlvbnMuIFByb2JsZW0gcmVwb3J0ZWQgYW5kIGZpeCB2ZXJpZmllZCBieSBHcmlnb3J5IEVudGluLgoKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgdmVyc2lvbi1jaGVjayBpbiB0aGUgU09DS1M1IGNvZGUuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDQpCi0gRml4ZWQgYSBjYXNlIHdoZXJlIGEgaG9zdCBjYWNoZSBlbnRyeSB3YXMgbm90IGZsYWdnZWQgaW4tdXNlIHByb3Blcmx5IHdoZW4gYQogIGNhY2hlZCBlbnRyeSB3YXMgdXNlZC4KCi0gQW5kculzIEdhcmPtYSdzIHBhdGNoIHRoYXQgY2hlY2tzIGZvciB3aW5tbSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxMyBGZWJydWFyeSAyMDA0KQotIEJlbiBHcmVlYXIncyBTT19CSU5EVE9ERVZJQ0UgcGF0Y2ggZm9yIHRoZSBiaW5kaW5nIG9mIHRoZSBsb2NhbCBlbmQgdG8gYQogIHNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlLgoKLSBHcmVnIEhld2dpbGwgZm91bmQgb3V0IHRoYXQgdGhlIHZhcmlhYmxlIGhvbGRpbmcgJ2NvbnRlbnRsZW5ndGgnIHdhc24ndCBiaWcKICBlbm91Z2ggdG8gaG9sZCBhIGxhcmdlIGZpbGUhCgotIFRvciBBcm50c2VuIGZpeGVkIGEgNjRiaXQtcmVsYXRlZCBwcm9ibGVtIGluIGRhdGUtcmVsYXRlZCBjb2RlIGluIHRoZSBmdHAKICBkZXBhcnRtZW50LCBhbmQgdGhlcmUgd2FzIGFub3RoZXIgcG90ZW50aWFsIHByb2JsZW0gaW4gdGhlIG5hbWUgcmVzb2x2ZSBjb2RlCiAgdG9vLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA0KQotIFJlbW92ZWQgYSBmZXcgdmFyaWFibGVzIHRoYXQgd2VyZSBvbmx5IHNldCBidXQgbmV2ZXIgdXNlZCwgYXMgc29tZSBjb21waWxlcnMKICB3YXJuIGFib3V0IHRoYXQgYW5kIHdlIGRvIG5vdCBsaWtlIGNvbXBpbGVyIHdhcm5pbmdzIQoKLSBSZW1vdmVkIHRoZSBuZWVkIGZvciBzeW1saW5rcyBpbiB0aGUgdGVzdHMvZGF0YSBkaXJlY3RvcnkgaWYgY3VybCBpcyBidWlsdAogIG91dHNpZGUgb2YgdGhlIHNvdXJjZSBkaXJlY3RvcnkgYW5kIHRoZSAnbWFrZSB0ZXN0JyBpcyB1c2VkLiBUaGlzIHdhcyBkb25lCiAgYnkgcHJvdmlkaW5nIGEgInNvdXJjZSBkaXIgcGF0aCIgdG8gdGhlIHNjcmlwdHMvc2VydmVycy4KCi0gTm93LCBpZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBmaW5kIGFuIG5yb2ZmIHRvb2wgb3IgYW4gb3B0aW9uIHRvIG5yb2ZmCiAgdG8gdXNlIHRvIGNvbnZlcnQgbWFuIHBhZ2VzIHdpdGgsIGl0IHdpbGwgY29tcGxldGVseSBzd2l0Y2ggb2ZmIHRoZSBidWlsdC1pbgogIG1hbnVhbC4KCi0gJ2NvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsJyBjb21wbGV0ZWx5IGRpc2FibGVzIHRoZSBidWlsdC1pbiBtYW51YWwgZnJvbQogIHRoZSBjdXJsIGNvbW1hbmQgdG9vbC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBtaW5vciBzb3VyY2UgZWRpdCwgYW5kIG5vdwogIGhlIGhhcyBtYW5hZ2VkIHRvIGdldCBtc3lzL21pbmd3IHRvIHJ1biBjb25maWd1cmUgYW5kIHRoZW4gYnVpbGQhCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNCkKLSBUaGUgZGVmYXVsdCBIVFRQIEFjY2VwdDogaGVhZGVyIHdhcyBtb2RpZmllZCB0byB0aGUgbXVjaCBzaW1wbGVyCiAgIkFjY2VwdDogKi8qIi4KCi0gUCBSIFNjaGFmZm5lciB1cGRhdGVkIHRoZSBjdXJsLXNzbCBzcGVjIGZpbGUgZm9yIFJQTXMuCgotIERvbWluaWNrIE1lZ2xpbyBicm91Z2h0IGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNoYXJlIGludGVyZmFjZSdzIG1hbgogIHBhZ2VzIHRoYXQgd2VyZSBwcmV2aW91c2x5IG1pc3NpbmcuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHdvcmstYXJvdW5kIGEgYnVnIGluIHRoZQogIEFJWDUgaW1wbGVtZW50YXRpb24gb2YgZ2V0YWRkcmluZm8oKS4gVGhpcyBtYWtlcyB0aGUgRlRQIFBPUlQgc3R1ZmYgd29yayBvbgogIGlwdjYtZW5hYmxlZCBBSVggYnVpbGRzLgoKLSBLZW4gUmFzdGF0dGVyIHByb3ZpZGVkIHBvcnRhYmlsaXR5IGZpeGVzIGZvciB0aGUgY3VybGd0ay5jIGV4YW1wbGUsIGFuZCBub3cKICBpdCBydW5zIG9uIHdpbmRvd3Mgd2l0aCBHVEsgYXMgd2VsbCEKCkRhbmllbCAoNiBGZWJydWFyeSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIGdldGhvc3RieW5hbWUoKSBmaW5lIHdoZW4gcnVuCiAgd2l0aCBtaW5ndyBvbiB3aW5kb3dzLgoKLSBNb2RpZmllZCB0aGUgbGRhcCBjb2RlIHRvIHVzZSBwcm9wZXIgZnVuY3Rpb24gcG9pbnRlcnMgYWxsIG92ZXIgKGluc3RlYWQgb2YKICBtaXhlZCBkYXRhIGFuZCBmdW5jdGlvbiBwb2ludGVycykgdG8gd29yay1hcm91bmQgdGhlIHBpY2t5IE1JUFNQcm8gY29tcGlsZXIKICB3YXJuaW5ncy4KCi0gQSBjdXN0b20gSG9zdDogaGVhZGVyIGlzIG9ubHkgY29uc2lkZXJlZCBpZiB0aGUgcmVxdWVzdCBpcyBub3QgbWFkZSBieQogIGZvbGxvd2luZyBhIGxvY2F0aW9uLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFRpbSBCYWtlci4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDA0KQotIFRoZSBsaWJ6IHBhcnQgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IG9ubHkgc2V0IHRoZSB0d28gbGliei1yZWxhdGVkCiAgZGVmaW5lIEhBVkVfWkxJQl9IIGFuZCBIQVZFX0xJQlogaWYgYm90aCB0aGUgbGliIGFuZCB0aGUgaGVhZGVyIGlzIGZvdW5kLgogIElmIG9uZSBpcyBtaXNzaW5nLCBub25lIG9mIHRoZSBkZWZpbmVzIGlzIHNldC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0aGUgTWluZ3cgbWFrZWZpbGVzLgoKLSBMZW4gS3JhdXNlIHJlcG9ydGVkIHRoYXQgY3VybCA3LjkuWCBjb3VsZCBkbyB1cGxvYWRpbmcgZnJvbSBzdGRpbiB3aXRob3V0CiAgZG9pbmcgY2h1bmtlZCBlbmNvZGluZywgd2hpY2ggY3VycmVudCBjdXJsIGNhbm5vdCBkbyBldmVuIGlmIHlvdSBkaXNhYmxlCiAgdGhlIHRyYW5zZmVyLWVuY29kaW5nIGNodW5rZWQgaGVhZGVyLiBOb3cgaXQgY2FuIGFnYWluLCBhbmQgdGVzdCBjYXNlIDk4CiAgdmVyaWZpZXMgdGhpcyBmdW5jdGlvbmFsaXR5LgoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIHdlaXJkIGdldGFkZHJpbmZvKCkgdXNhZ2UgaW4gdGhlIEZUUCBjb2RlLCBwcmV2ZW50aW5nCiAgdGhlIGlwdjYtY29kZSBmb3IgUE9SVCB3b3JrIG9uIEFJWCA1LjIuIFdlIG5vdyBhbHNvIHByb3ZpZGUgKGJldHRlcikgZXJyb3IKICBtZXNzYWdlcyB3aGVuIGJhaWxpbmcgb3V0IGluIHRoZSB0aGF0IGZ1bmN0aW9uLgoKLSBUb3IgQXJudHNlbiBub3cgcHJvdmlkZXMgQUlYIGFuZCBJUklYICh1c2luZyBnY2MsIHhsYyBhbmQgdGhlIE1JUFNQcm8KICBjb21waWxlcnMpIGF1dG9tYXRlZCBidWlsZCBsb2dzIChodHRwOi8vY3VybC5oYXh4LnNlL2F1dG8vKSBhbmQgd2UndmUgZml4ZWQKICBudW1lcm91cyBtaW5vciBxdWlya3MgdG8gbWFrZSBsZXNzIHdhcm5pbmdzIGFwcGVhci4KCkRhbmllbCAoNCBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lsYWQsIHdlIG5vdyB1c2UgdGhlIGN1c3RvbSB0aW1lb3V0cyB3aGVuIHdhaXRpbmcgZm9yIGEKICBzZXJ2ZXIgdG8gY29ubmVjdCB3aGVuIHVzaW5nIEZUUCBQT1JULiBQcmV2aW91c2x5IHdlIGFsd2F5cyB3YWl0ZWQgMTAKICBzZWNvbmRzLCBubyBtb3JlIG5vIGxlc3MuIFdlIG5vdyBhbHNvIGNoYW5nZWQgdGhlIGRlZmF1bHQgKGlmIG5vIHRpbWVvdXQgaXMKICBzZXQpIHRvIHdhaXQgNjAgc2Vjb25kcyBmb3IgdGhlIGNvbm5lY3QgYmVmb3JlIHdlIGZhaWwuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNCkKLSBNb2RpZmllZCB0byBsaW5rIHdpdGggYy1hcmVzIGluc3RlYWQgb2YgYXJlcy4KCkRhbmllbCAoMiBGZWJydWFyeSAyMDA0KQotIEFkZGVkIGEgY29uZmlndXJlIHRlc3QgdG8gY2hlY2sgZm9yIHdoaWNoIG9wdGlvbiB0aGUgKGcpbnJvZmYgdG9vbCB3YW50cwogIHRvIGV4dHJhY3QgcGxhaW4gdGV4dCBmcm9tIHRoZSBtYW4gcGFnZXMuIFRvciBBcm50c2VuIHRvbGQgdXMgdGhlIEFJWAogIHZlcnNpb24gb2YgR05VIGducm9mZiBkb2Vzbid0IHN1cHBvcnQgLW1hbiEKCi0gQWRkZWQgYW4gdW5kZWYgb2YgYWNjZXB0IGluIG1lbWRlYnVnLmggdG8gbWFrZSBjdXJsIGJ1aWxkIHdpdGggLS1lbmFibGUtZGVidWcKICBvbiBBSVggNS4yIHdoaWNoIHNlZW1zIHRvIGhhdmUgYWNjZXB0IGRlZmluZWQuIFJlcG9ydGVkIGJ5IFRvciBBcm50c2VuLgoKLSBjdXJsX3ZlcnNpb24oKSBub3cgaW5jbHVkZXMgYy1hcmVzIHZlcnNpb24gaW5mbywgYW5kIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93CiAgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHZlcnNpb24gU0VDT05EIHRoYXQgYWxzbyBpbmNsdWRlcyB0aGF0IGluZm8uCgotIFdlIGFyZSBub3cgb2ZmaWNpYWxseSB1c2luZyBjLWFyZXMgZm9yIGFzeW5jaCBuYW1lIHJlc29sdmVzLiBjLWFyZXMgaXMgdGhlCiAgbmV3IGxpYnJhcnksIGJhc2VkIG9uIHRoZSBleGlzdGluZyBhcmVzIGJ1dCB3aXRoIGFuIGV4dGVuZGVkIGFuZCBzbGlnaHRseQogIG1vZGlmaWVkIEFQSS4KCi0gRGlyayBpbXByb3ZlZCB0aGUgYXJlcyB0aW1lb3V0IGNvZGUsIGFuZCBub3cgd2UgYWxzbyBpbmNsdWRlIHRoZSBhcmVzIGVycm9yCiAgc3RyaW5nIHdoZW4gd2UgZmFpbCB0byByZXNvbHZlIGEgbmFtZS4KCi0gQW5vdGhlciB0d2VhayB0byBtYWtlIHRlc3QgY2FzZSA5MSBydW4gZmluZS4gTm93IHdlIGhhdmUgYW5vdGhlciBiaXQgb24gYQogIGNvbm5lY3Rpb24gdGhhdCBpcyBzZXQgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBtYXJrZWQgZm9yICdyZXRyeScuIFRoYXQKICBtYWtlcyB0aGUgY29ubmVjdGlvbiBnZXQgY2xvc2VkIGFuZCByZS1vcGVuZWQgYW5kIHRoZSBIVFRQLWRvbmUgY29kZSBtdXN0CiAgbm90IGNvbXBsYWluIG9uIHRoZSBmYWN0IHRoYXQgbm8gZGF0YSB3YXMgcmVjZWl2ZWQuCgotIEJhc2VkIG9uIERpcmsgTWFuc2tlJ3MgcGF0Y2gsIEkgbW9kaWZpZWQgdGhlIG5hbWUgcmVzb2x2aW5nIHdpdGggYXJlcyB0bwogIGZlYXR1cmUgYSB0aW1lb3V0IGZvciByZWFsbHkgc2xvdyBsb29rdXBzLiBJdCBub3cgZGVmYXVsdHMgdG8gMzAwIHNlY29uZHMsCiAgYnV0IGlzIG5vdyBhZGp1c3RlZCB0byB0aGUgQ09OTkVDVFRJTUVPVVQvVElNT1VFIHRpbWVvdXRzIGlmIG9uZSBvZiB0aGVtCiAgaXMgc2V0LgoKLSBGaXhlZCB0aGUgaW5jbHVzaW9uIG9mIGNhLWJ1bmRsZS5oIHRvIHJlYWxseSB1c2UgdGhlIG9uZSBpbiB0aGUgYnVpbGQgZGlyCiAgYmVmb3JlIHRoZSBvbmUgaW4gdGhlIHNvdXJjZSBkaXIuIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCBhbmQgcmVwb3J0ZWQuCgotIEFkZGVkIHRlc3QgY2FzZSA5NywgYSBzaW1wbGUgUE9TVCB3aXRoIGEgY3VzdG9tIENvbnRlbnQtVHlwZSBoZWFkZXIKICByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBvbmUuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNCkKLSBBZGRlZCBjb2RlIHRoYXQgYXR0ZW1wdHMgdG8gZml4IHRoZSB0ZXN0IDkxIGZhaWx1cmUuIEFzIGhhcyBiZWVuIGZpZ3VyZWQgb3V0CiAgYnkgUGF0cmljayBTbWl0aCwgdGhlIGVycm9yIGhhcHBlbnMgYmVjYXVzZSB3ZSByZS11c2UgYSBjb25uZWN0aW9uIHRoYXQgdGhlCiAgc2VydmVyIGlzIGp1c3QgYWJvdXQgdG8gY2xvc2UgYW5kIHdlIGV2ZW4gbWFuYWdlIHRvIHNlbmQgYXdheSB0aGUgcmVxdWVzdAogIHdpdGhvdXQgc2VlaW5nIGFuIGVycm9yLiBPbiB0aGUgZmlyc3QgcmVhZCBhdHRlbXB0IHdlIGdldCBhIEVDT05OUkVTRVQuCiAgU3RhcnRpbmcgbm93LCB3ZSBhdHRlbXB0IHRvIGRldGVjdCB0aGlzIGFuZCBpZiBzbywgd2UgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYQogIGZyZXNoIGNvbm5lY3Rpb24uCgotIEkgYWRkZWQgdGVzdCBjYXNlIDUxMCB3aGljaCBpcyBhIGN1c3RvbSBwcm9ncmFtIHRoYXQgZG9lcyBhIFBPU1QgdXNpbmcgYQogIHJlYWQgY2FsbGJhY2ssIHdpdGggY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4KCi0gQWRqdXN0ZWQgb25lIG9mIHRoZSBNUEUvaVggY2hhbmdlcyBhcyBpdCBtYWRlIHRlc3QgY2FzZSA1MDQgZmFpbCBhbGwgb3Zlci4KCi0gQWRkZWQgLS1zb2NrcyBhcyBhIHJlY29nbml6ZWQgb3B0aW9uLiBJdCB3b3JrcyBqdXN0IGxpa2UgLS1wcm94eSBidXQgc2V0cyBhCiAgU09DS1M1IHByb3h5IHRvIHVzZS4gU09DS1M1IHN1cHBvcnQgaGFzIGJlZW4gYXZhaWxhYmxlIGluIGxpYmN1cmwgZm9yIGEKICB3aGlsZSwganVzdCBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cmwgdG9vbC4gVGhpcyBkb2VzIG5vdCBjdXJyZW50bHkgd29yayBmb3IKICBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNCkKLSBTdGFkbGVyIFN0ZXBoYW4gcG9pbnRlZCBvdXQgdGhhdCBzcmMvaHVnZWhlbHAuYyBpbmNsdWRlZCBjb25maWcuaCB3aXRob3V0CiAgY2hlY2tpbmcgdGhlIGRlZmluZSBpZiBpdHMgcHJlc2VudC4uLgoKLSBLZW4gSGlyc2NoIHByb3ZpZGVkIHBhdGNoZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gdGhlIE1QRS9pWCBvcGVyYXRpbmcKICBzeXN0ZW0uCgotIERhbiBGYW5kcmljaCBjb21waWxlZCBjdXJsIHdpdGggbG90cyBvZiBhZ2dyZXNzaXZlbHkgcGVkYW50aWMgY29tcGlsZXIKICBvcHRpb25zIGFuZCB0aHVzIGZvdW5kIGEgZmV3IG1pbm9yIGVycm9ycyBhbmQgZGlkIHNvbWUgZ2VuZXJhbCBjbGVhbnVwcyB0bwogIGF2b2lkIHRoZW0uCgotIERpcmsgTWFuc2tlIGZpeGVkIGEgZmxhdyBpbiBhcmVzIHRoYXQgcHJldmVudGVkIGl0IHRvIHVzZSBub24tYmxvY2tpbmcKICBzb2NrZXRzIHByb3Blcmx5LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDQpCi0gUmljaGFyZCBCcmFtYW50ZSBmaXhlZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kZWQgInVwbG9hZHMiIHRvIHNlbmQgYSBmaW5hbAogIENSTEYgY29tYm8gcHJvcGVybHkuCgpEYW5pZWwgKDI3IEphbnVhcnkgMjAwNCkKLSBNYWRlIHRoZSByZXNwb25zZS1oZWFkZXJzIGR1cmluZyBhIENPTk5FQ1QgcmVxdWVzdCB0byBhIHByb3h5IGdldCBwYXNzZWQgb24KICBhcyByZWd1bGFyIGhlYWRlcnMsIHNvIHRoZXkgYXBwZWFyIHdpdGggLWkvLUkgb3B0aW9ucyBhbmQgc2ltaWxhci4KCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaXNsZSBWYW5lbSwgSSd2ZSBtYWRlIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5CiAgcHJvcGVybHkgc3dpdGNoIHRvIGEgR0ItZGlzcGxheSB3aGVuIG1vcmUgdGhhbiA5OTk5TUIgaGF2ZSBiZWVuIHRyYW5zZmVyZWQuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBwb2ludGVkIG91dCBhIGN1cmxyYyBwYXJzZXIgcHJvYmxlbS9jcmFzaCB3aGVuIGFuIG9wdGlvbiB3aXRoIGEKICByZXF1aXJlZCBkaWRuJ3QgaGF2ZSBvbmUgYW5kIHdhcyBvbiB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZS4KCi0gTW9yZSBXaW5kb3dzIGZpeGVzIGZvciBsYXJnZSBmaWxlcy4gV2Ugbm93IGJ1aWxkIGFuZCBsaW5rIHdpdGgKICAuLi9saWIvc3RydG9vZmZ0LmMgaW4gdGhlIGFwcCBjb2RlIHNpbmNlIEN1cmxfc3RydG9sbCgpIGlzIG5vdCBhIHByb3ZpZGVkCiAgbGliY3VybCBmdW5jdGlvbi4uLiBQZXJoYXBzIHdlIHNob3VsZCBjb25zaWRlciBhICdjb21tb24nIGRpciBvciBzaW1pbGFyCiAgd2hlcmUgd2UgcHV0IHNvdXJjZSBjb2RlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCB0aGUgY2xpZW50LiBPciBwZXJoYXBzCiAgd2UnbGwganVzdCBtYWtlIHRoaXMgZnVuY3Rpb24gYXZhaWxhYmxlIGluIHRoZSBsaWJyYXJ5Li4uCgotIFZpbmNlbnQgQnJvbm5lciBmb3VuZCBvdXQgdGhlIHNvY2tzNSBjb2RlIGNyYXNoZWQgd2hlbiBubyB1c2VybmFtZSB3YXMKICBzZXQuCgotIFZpbmNlbnQgQnJvbm5lciBzcG90dGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IHVzZXJuYW1lL3Bhc3N3b3JkIHdoZW4gcmUtdXNpbmcKICBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4KCi0gRml4ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkgZm9yIGZpbGVzIGxhcmdlciB0aGFuIDJeMzEgYnl0ZXMuIEdpc2xlCiAgVmFuZW0gcmVwb3J0ZWQuCgpEYW5pZWwgKDIyIEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYWRlIHN0cnRvbGwoKSBnZXQgdXNlZCB3aGVuIGN1cmwgaXMgYnVpbHQgd2l0aCB0aGUgbWluZ3cKICBjb21waWxlci4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIGNvbXByZXNzZWQgaGVscCB0ZXh0IGNvZGUgdG8gZGlzcGxheSBwcm9wZXJseS4KCi0gUmVtb3ZlZCB0aGUgJyNkZWZpbmUgSHR0cFBvc3QnIGZyb20gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSwgYXMgY3VybF9odHRwcG9zdAogIGlzIHRoZSBwcm9wZXIgbmFtZSBhbmQgaXQgaGFzIGJlZW4gZm9yIHF1aXRlIHNvbWUgdGltZSBub3cuIEZpeGVzIGFub3RoZXIKICBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCi0gQWRkZWQgJ2N1cmxfb2ZmX3QnIHR5cGVkZWYgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSwgdG8gYmUgdXNlZCB0byBwcm92aWRlCiAgbGFyZ2UgZmlsZSBzaXplcyB0byB0aGUgKl9MQVJHRSBvcHRpb25zLiBBZGp1c3RlZCB0aGUgY29kZSBhbGwgb3ZlciB0byB1c2UKICB0aGlzIHZhcmlhYmxlIHR5cGUgaW5zdGVhZCBvZiAnb2ZmX3QnLiBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgbGFyZ2UKICBmaWxlIHN1cHBvcnQgd29yayBvbiBtb3JlIHBsYXRmb3Jtcy4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyB0aGUKICBzaXplIG9mIHRoZSBjdXJsX29mZl90IGluc3RlYWQgb2YgdGhlIHBsYWluIG9mZl90LgoKVmVyc2lvbiA3LjExLjAgKDIyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA0KQotIFJlbW92ZWQgdGhlIGRlZmluZXMgaW4gdGhlIHB1YmxpYyBoZWFkZXIgZmlsZSB3aXRoIFRJTUVDT05EXyBwcmVmaXhlcy4gVGhleQogIGhhdmUgYmVlbiBvYnNvbGV0ZSBzaW5jZSBBcHJpbCAyMm5kIDIwMDIsIGFuZCBpZiB0aGlzIGNhdXNlcyBhbnlvbmUgYW55CiAgcHJvYmxlbXMgbm93IGl0IGlzIHZlcnkgZWFzeSB0byBqdXN0IGFkZCBDVVJMXyB0byB0aGUgbmFtZXMuIFRoaXMgY29ycmVjdHMKICB0aGlzIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gY2xlYW5lZCB1cCBob3cgLS10cmFjZSB3aXRoIG5vIG9wdGlvbiB3YXMgdHJlYXRlZCwgYW5kIGFsc28KICBhcmd1bWVudHMgaW4gYSBjb25maWcgZmlsZSB3aXRob3V0IGEgcmVxdWlyZWQgcGFyYW1ldGVyIQoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBmZXcgaXNzdWVzIHdoZXJlIGNvbXBpbGVycyB3YXJuZWQgYWJvdXQgdmFyaWFibGVzCiAgcG9zc2libHkgYmVpbmcgdXNlZCB1bmFzc2lnbmVkLgoKLSBNaW5vciBJbnRlcml4IGJ1aWxkIHByb2JsZW0gZml4ZWQuCgpEYW5pZWwgKDE1IEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgc29tZSBuZWNlc3NhcnkgZXNjYXBpbmcgbmVlZGVkIGluIHRoZQogIGFjaW5jbHVkZS5tNCBmaWxlIHdoZW4gYXV0b21ha2UgMS44IG9yIGxhdGVyIGlzIHVzZWQuCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwNCkKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEN1cmxfcmVzb2x2KCkgcmV0dXJuIGNvZGUuIFRoaXMgZXh0ZW5kcyB0aGUgZml4CiAgU3RldmUgR3JlZW4gcHJvdmlkZWQgb24gZGVjZW1iZXIgMy4uLgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDQpCi0gTHVrZSBDYWxsIG1hZGUgdGhlIHdpbjMyIHZlcnNpb24gb2YgdGhlIHBhc3N3b3JkIHByb21wdGluZyBmdW5jdGlvbiBzdXBwb3J0CiAgYmFja3NwYWNlLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhlIGh1Z2VoZWxwIHNvdXJjZSBmaWxlIHRvIGNvbnRhaW4gYm90aCBhIGNvbXByZXNzZWQgYW5kCiAgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gaW4gdGhlIGRpc3RyaWJ1dGlvbiwgc28gdGhhdCBtb3JlIHBlb3BsZSBlYXNpZXIgY2FuCiAgYnVpbGQgY3VybCB3aXRoIHRoZSBjb21wcmVzc2VkIHZlcnNpb24uCgotIERpZWdvIENhc29ycmFuIGJyb3VnaHQgYW5vdGhlciBBbWlnYU9TIGJ1aWxkIHBhdGNoIGZvciBuYXRpdmUgQW1pZ2EgYnVpbGRzLgoKLSBNYXR0IFZlZW5zdHJhIHVwZGF0ZWQgdGhlIE1hYyBPUyBYIGZyYW1ld29yayBmaWxlcy4KCi0gQnJpYW4gUiBEdWZmeSBicm91Z2h0IGEgc2VjdGlvbiB0byB0aGUgSU5TVEFMTCBmaWxlIG9uIGhvdyB0byBidWlsZCBhCiAgU1NMLWVuYWJsZWQgY3VybCB1c2luZyB0aGUgZnJlZSBCb3JsYW5kIEMrKyBjb21waWxlci4gSGUgYWxzbyB1cGRhdGVkIHRoZQogIEJvcmxhbmQgbGliL01ha2VmaWxlLmIzMi4KCi0gSSBmaXhlZCB0aGUgdGVzdCBjYXNlIDUwOSB3aGljaCBJIGJyb2tlIHllc3RlcmRheS4gTm93IHRoZSBsaWJ0ZXN0IGFyZQogIGNvbXBpbGVkIHdpdGggYW4gaW5jbHVkZSBwYXRoIHRoYXQgcG9pbnRzIHRvIHRoZSBsaWJyYXJ5J3Mgc291cmNlIGRpciwgc28KICB0aGF0IHRoZSBsaWJ0ZXN0cyBjYW4gaW5jbHVkZSBmaWxlcyBmcm9tIHRoZSBzb3VyY2UgdHJlZS4gVGhpcyB3YXMgbWFkZSB0bwogIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoZSBVU0VfU1NMRUFZIGRlZmluZSBpbiB0aGUgbGlicmFyeSB0ZXN0IGZpbGVzLgoKRGFuaWVsICgxMiBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIGJyb3VnaHQgY29kZSB0aGF0IG5vdyBhbGxvd3MgYSBjYWxsYmFjayB0byBtb2RpZmllZCB0aGUgVVJMCiAgZXZlbiB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UgaXMgdXNlZCwgYW5kIHRoZW4gbGliY3VybCB3aWxsIHNpbXVsYXRlIGEKICAiZm9sbG93IGxvY2F0aW9uIiB0byB0aGF0IG5ldyBVUkwuIFRlc3QgNTA5IHdhcyBhZGRlZCB0byB0ZXN0IHRoaXMgZmVhdHVyZS4KCi0gRXh0ZW5kZWQgdGhlIHRpbWUgd2UgcmV0cnkgc2VydmVycyBpbiB0aGUgdGVzdCBzY3JpcHQsIGFuZCBJIGFsc28gbWFkZSBpdAogIHJldHJ5IHRoZSBodHRwcyBhbmQgZnRwcyBzZXJ2ZXJzIGJlZm9yZSB0aGV5IGFyZSBjb25zaWRlcmVkIGJhZC4gSSBiZWxpZXZlCiAgdGhlIHByZXZpb3VzIGFwcHJvYWNoIGNvdWxkIHR1cm4gcHJvYmxlbWF0aWMgb24gcmVhbGx5IHNsb3cgaG9zdHMuCgpWZXJzaW9uIDcuMTEuMC1wcmUxICgxMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwNCkKLSBEb21pbmljayBNZWdsaW8gcG9pbnRlZCBvdXQgRlRQUyBzaG91bGQgdXNlIGRlZmF1bHQgcG9ydCA5OTAgYWNjb3JkaW5nIHRvCiAgSUFOQS4KCkRhbmllbCAoOCBKYW51YXJ5IDIwMDQpCi0gRml4ZWQgdGhlIFNQTkVHTyBjb25maWd1cmUgY2hlY2sgdG8gbm90IHVzZSAtUiBvciBvdGhlciBub24tcG9ydGFibGUgb3B0aW9ucwogIGluIHRoZSBMREZMQUdTLiBSZXBvcnRlZCBieSBQaWVycmUgaW4gYnVnIHJlcG9ydCAjODcyOTMwLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwNCkKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBmaXggb24gb3VyIHpsaWIgdXNhZ2UuCgotIERhdmlkIEogTWV5ZXIncyBwYXRjaCB0aGF0IGludHJvZHVjZSBsYXJnZSBmaWxlIHN1cHBvcnQgdG8gbGliY3VybCB3YXMKICBhcHBsaWVkLiBOZXcgY3VybF9lYXN5X3NldG9wdCBvcHRpb25zIHRoYXQgYWNjZXB0ICdvZmZfdCcgYXJndW1lbnRzIGFyZToKCiAgSU5GSUxFU0laRV9MQVJHRQogIFJFU1VNRV9GUk9NX0xBUkdFCiAgTUFYRklMRVNJWkVfTEFSR0UKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDQpCi0gQmFzZWQgb24gRG9taW5pY2sgTWVnbGlvJ3MgY29tbWVudHMsIEkgbWFkZSBvdXIgcHJpdmF0ZSB2ZXJzaW9uIG9mCiAgZ2V0dGltZW9mZGF5KCkgZGVjbGFyZWQgc3RhdGljLiBUaGlzIHdvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggdGhlIHNhbWUKICBmdW5jdGlvbiBpbiBvdGhlciBsaWJzIChsaWtlIGFyZXMgZm9yIGV4YW1wbGUpLgoKLSBBZGRlZCBEb21pbmljayBNZWdsaW8ncyBkZXNjcmlwdGlvbiBvbiBob3cgdG8gYnVpbGQgbGliY3VybCB3aXRoIGFyZXMKICBvbiB3aW4zMi4K