LyoKICogU3RhcnQKICogUG9ydHVndWVzZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAzIE1hcmNlbG8gRHVhcnRlCiAqIENvcHlyaWdodCAyMDA0IEFt6XJpY28gSm9z6SBNZWxvCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfVVNBR0UsICJJbmljaWEgdW0gcHJvZ3JhbWEsIG91IGFicmUgdW0gZG9jdW1lbnRvIG5vIHByb2dyYW1hIG5vcm1hbG1lbnRlIHVzYWRvIHBhcmEgYXJxdWl2b3MgY29tIGRldGVybWluYWRvIHN1ZnV4by4gXG5cClVzbzogXG5cCnN0YXJ0IFtvcOf1ZXNdIGFycXVpdm9fZGVfcHJvZ3JhbWEgW2FyZ3VtZW50b3MuLi5dIFxuXApzdGFydCBbb3Dn9WVzXSBhcnF1aXZvX2RlX2RvY3VtZW50by5leHQgXG5cCiBcblwKT3B0aW9uczogXG5cCi9NW2luaW1pemVkXSBJbmljaWEgbyBwcm9ncmFtYSBtaW5pbWl6YWRvLiBcblwKL01BWFtpbWl6ZWRdIEluaWNpYSBvIHByb2dyYW1hIG1heGltaXphZG8uIFxuXAovUltlc3RvcmVkXSAgSW5pY2lhIG8gcHJvZ3JhbWEgbm9ybWFsbWVudGUgKHNlbSBtaW5pbWl6YXIgbmVtIG1heGltaXphcikuIFxuXAovV1thaXRdICAgICAgQWd1YXJkYSBxdWUgbyBwcm9ncmFtYSBpbmljaWFkbyB0ZXJtaW5lIGUgZW50428gcmV0b3JubyB1bSBj82RpZ28gKGV4aXQgY29kZSkuIFxuXAovTCAgICAgICAgICAgTW9zdHJhIGEgbGljZW7nYSBhbyB1c3XhcmlvLiBcblwKIFxuXApzdGFydC5leGUgdmVyc2lvbiAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClN0YXJ0IG7jbyB2ZW0gY29tIEFCU09MVVRBTUVOVEUgTkVOSFVNQSBHQVJBTlRJQTsgcGFyYSBkZXRhaGVzIGV4ZWN1dGUgY29tIGEgb3Dn428gL0wuIFxuXApFc3RlIOkgdW0gc29mdHdhcmUgbGl2cmUgKGZyZWUgc29mdHdhcmUpLCBlIHZvY+og6SBiZW52aW5kbyBhIHJlZGlzdHJpYnXtLWxvIHNvYiBcblwKY2VydGFzIGNvbmRp5/VlczsgZXhlY3V0ZSAnc3RhcnQgL0wnIHBhcmEgZGV0YWxoZXMuIFxuXAoiCgpTVFJJTkdfTElDRU5TRSwgInN0YXJ0LmV4ZSB2ZXJz428gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsIFxuXApUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIFxuXAptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIFxuXAphcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIFxuXApvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gXG5cCiBcblwKVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIFxuXApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBcblwKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBcblwKR05VIExlc3NlciBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiBcblwKIFxuXApZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIFxuXAphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBcblwKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuIFxuXAogXG5cClZlamEgbyBhcnF1aXZvIENPUFlJTkcuTElCIHBhcmEgaW5mb3JtYefjbyBzb2JyZSBhIGxpY2Vu52EuIFxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkFwbGljYefjbyBu428gcG9kZSBzZXIgaW5pY2lhZGEsIG91IG7jbyBleGlzdGUgYXBsaWNh5+NvIGFzc29jaWFkYSBjb20gbyBhcnF1aXZvIGVzcGVjaWZpY2Fkby5cblNoZWxsRXhlY3V0ZUV4IGZhbGhvdSIKfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1VTQUdFLCAiSW5pY2lhIHVtIHByb2dyYW1hLCBvdSBhYnJlIHVtIGRvY3VtZW50byBubyBwcm9ncmFtYSBub3JtYWxtZW50ZSB1c2FkbyBwYXJhIGZpY2hlaXJvcyBjb20gZGV0ZXJtaW5hZG8gc3VmaXhvLiBcblwKVXNvOiBcblwKc3RhcnQgW29w5/Vlc10gZmljaGVpcm9fZGVfcHJvZ3JhbWEgW2FyZ3VtZW50b3MuLi5dIFxuXApzdGFydCBbb3Dn9WVzXSBmaWNoZWlyb19kZV9kb2N1bWVudG8uZXh0IFxuXAogXG5cCk9wdGlvbnM6IFxuXAovTVtpbmltaXplZF0gSW5pY2lhIG8gcHJvZ3JhbWEgbWluaW1pemFkby4gXG5cCi9NQVhbaW1pemVkXSBJbmljaWEgbyBwcm9ncmFtYSBtYXhpbWl6YWRvLiBcblwKL1JbZXN0b3JlZF0gIEluaWNpYSBvIHByb2dyYW1hIG5vcm1hbG1lbnRlIChzZW0gbWluaW1pemFyIG5lbSBtYXhpbWl6YXIpLiBcblwKL1dbYWl0XSAgICAgIEFndWFyZGEgcXVlIG8gcHJvZ3JhbWEgaW5pY2lhZG8gdGVybWluZSBlIGVudONvIHJldG9ybmUgdW0gY/NkaWdvIChleGl0IGNvZGUpLiBcblwKL0wgICAgICAgICAgIE1vc3RyYSBhIGxpY2Vu52EgYW8gdXRpbGl6YWRvci4gXG5cCiBcblwKc3RhcnQuZXhlIHZlcnNpb24gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsIFxuXApTdGFydCBu428gdmVtIGNvbSBBQlNPTFVUQU1FTlRFIE5FTkhVTUEgR0FSQU5USUE7IHBhcmEgZGV0YWhlcyBleGVjdXRlIGNvbSBhIG9w5+NvIC9MLiBcblwKRXN0ZSDpIHVtIHNvZnR3YXJlIGxpdnJlIChmcmVlIHNvZnR3YXJlKSwgZSDpIGJlbnZpbmRvIGEgcmVkaXN0cmlide0tbG8gc29iIGNlcnRhcyBcblwKY29uZGnn9WVzOyBleGVjdXRlICdzdGFydCAvTCcgcGFyYSBkZXRhbGhlcy4gXG5cCiIKClNUUklOR19MSUNFTlNFLCAic3RhcnQuZXhlIHZlcnPjbyAwLjIgQ29weXJpZ2h0IChDKSAyMDAzLCBEYW4gS2VnZWwgXG5cClRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgXG5cCm9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBcblwKIFxuXApUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgXG5cCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIFxuXApHTlUgTGVzc2VyIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIFxuXAogXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgXG5cCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIFxuXApGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4gXG5cCiBcblwKVmVqYSBvIGZpY2hlaXJvIENPUFlJTkcuTElCIHBhcmEgaW5mb3JtYefjbyBzb2JyZSBhIGxpY2Vu52EuIFxuXAoiCgpTVFJJTkdfRVhFQ0ZBSUwgIkFwbGljYefjbyBu428gcG9kZSBzZXIgaW5pY2lhZGEsIG91IG7jbyBleGlzdGUgYXBsaWNh5+NvIGFzc29jaWFkYSBjb20gbyBmaWNoZWlybyBlc3BlY2lmaWNhZG8uXG5TaGVsbEV4ZWN1dGVFeCBmYWxoYWRvIgp9Cg==