LyoKICogU3RhcnQKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAzIE1hcmNlbG8gRHVhcnRlCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19ERUZBVUxUCgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19VU0FHRSwgIkluaWNpYSB1bSBwcm9ncmFtYSwgb3UgYWJyZSB1bSBkb2N1bWVudG8gbm8gcHJvZ3JhbWEgbm9ybWFsbWVudGUgdXNhZG8gcGFyYSBhcnF1aXZvcyBjb20gZGV0ZXJtaW5hZG8gc3VmdXhvLiBcblwKVXNvOiBcblwKc3RhcnQgW29w5/Vlc10gYXJxdWl2b19kZV9wcm9ncmFtYSBbYXJndW1lbnRvcy4uLl0gXG5cCnN0YXJ0IFtvcOf1ZXNdIGFycXVpdm9fZGVfZG9jdW1lbnRvLmV4dCBcblwKIFxuXApPcHRpb25zOiBcblwKL01baW5pbWl6ZWRdIEluaWNpYSBvIHByb2dyYW1hIG1pbmltaXphZG8uIFxuXAovTUFYW2ltaXplZF0gSW5pY2lhIG8gcHJvZ3JhbWEgbWF4aW1pemFkby4gXG5cCi9SW2VzdG9yZWRdICBJbmljaWEgbyBwcm9ncmFtYSBub3JtYWxtZW50ZSAoc2VtIG1pbmltaXphciBuZW0gbWF4aW1pemFyKS4gXG5cCi9XW2FpdF0gICAgICBBZ3VhcmRhIHF1ZSBvIHByb2dyYW1hIGluaWNpYWRvIHRlcm1pbmUgZSBlbnTjbyByZXRvcm5vIHVtIGPzZGlnbyAoZXhpdCBjb2RlKS4gXG5cCi9MICAgICAgICAgICBNb3N0cmEgYSBsaWNlbudhIGFvIHVzdeFyaW8uIFxuXAogXG5cCnN0YXJ0LmV4ZSB2ZXJzaW9uIDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbCBcblwKU3RhcnQgbuNvIHZlbSBjb20gQUJTT0xVVEFNRU5URSBORU5IVU1BIEdBUkFOVElBOyBwYXJhIGRldGFoZXMgZXhlY3V0ZSBjb20gYSBvcOfjbyAvTC4gXG5cCkVzdGUg6SB1bSBzb2Z0d2FyZSBsaXZyZSAoZnJlZSBzb2Z0d2FyZSksIGUgdm9j6iDpIGJlbnZpbmRvIGEgcmVkaXN0cmlide0tbG8gc29iIFxuXApjZXJ0YXMgY29uZGnn9WVzOyBleGVjdXRlICdzdGFydCAvTCcgcGFyYSBkZXRhbGhlcy4gXG5cCiIKClNUUklOR19MSUNFTlNFLCAic3RhcnQuZXhlIHZlcnPjbyAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBcblwKIFxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIFxuXAogXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIFxuXApGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gXG5cCiBcblwKVmVqYSBvIGFycXVpdm8gQ09QWUlORy5MSUIgcGFyYSBpbmZvcm1h5+NvIHNvYnJlIGEgbGljZW7nYS4gXG5cCiIKClNUUklOR19FWEVDRkFJTCAiQXBsaWNh5+NvIG7jbyBwb2RlIHNlciBpbmljaWFkYSwgb3UgbuNvIGV4aXN0ZSBhcGxpY2Hn428gYXNzb2NpYWRhIGNvbSBvIGFycXVpdm8gZXNwZWNpZmljYWRvLlxuU2hlbGxFeGVjdXRlRXggZmFsaG91Igp9Cg==