QWxsaWFuY2UgZm9yIE9wZW4gTWVkaWEgUGF0ZW50IExpY2Vuc2UgMS4wCgoxLiBMaWNlbnNlIFRlcm1zLgoKMS4xLiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCBlYWNoCiAgICAgTGljZW5zb3IsIG9uIGJlaGFsZiBvZiBpdHNlbGYgYW5kIHN1Y2Nlc3NvcnMgaW4gaW50ZXJlc3QgYW5kIGFzc2lnbnMsCiAgICAgZ3JhbnRzIExpY2Vuc2VlIGEgbm9uLXN1YmxpY2Vuc2FibGUsIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLAogICAgIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcwogICAgIExpY2Vuc2UpIHBhdGVudCBsaWNlbnNlIHRvIGl0cyBOZWNlc3NhcnkgQ2xhaW1zIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIKICAgICBmb3Igc2FsZSwgaW1wb3J0IG9yIGRpc3RyaWJ1dGUgYW55IEltcGxlbWVudGF0aW9uLgoKMS4yLiBDb25kaXRpb25zLgoKMS4yLjEuIEF2YWlsYWJpbGl0eS4gQXMgYSBjb25kaXRpb24gdG8gdGhlIGdyYW50IG9mIHJpZ2h0cyB0byBMaWNlbnNlZSB0byBtYWtlLAogICAgICAgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBvciBkaXN0cmlidXRlIGFuIEltcGxlbWVudGF0aW9uIHVuZGVyCiAgICAgICBTZWN0aW9uIDEuMSwgTGljZW5zZWUgbXVzdCBtYWtlIGl0cyBOZWNlc3NhcnkgQ2xhaW1zIGF2YWlsYWJsZSB1bmRlcgogICAgICAgdGhpcyBMaWNlbnNlLCBhbmQgbXVzdCByZXByb2R1Y2UgdGhpcyBMaWNlbnNlIHdpdGggYW55IEltcGxlbWVudGF0aW9uCiAgICAgICBhcyBmb2xsb3dzOgoKICAgICAgIGEuIEZvciBkaXN0cmlidXRpb24gaW4gc291cmNlIGNvZGUsIGJ5IGluY2x1ZGluZyB0aGlzIExpY2Vuc2UgaW4gdGhlCiAgICAgICAgICByb290IGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIGNvZGUgd2l0aCBpdHMgSW1wbGVtZW50YXRpb24uCgogICAgICAgYi4gRm9yIGRpc3RyaWJ1dGlvbiBpbiBhbnkgb3RoZXIgZm9ybSAoaW5jbHVkaW5nIGJpbmFyeSwgb2JqZWN0IGZvcm0sCiAgICAgICAgICBhbmQvb3IgaGFyZHdhcmUgZGVzY3JpcHRpb24gY29kZSAoZS5nLiwgSERMLCBSVEwsIEdhdGUgTGV2ZWwgTmV0bGlzdCwKICAgICAgICAgIEdEU0lJLCBldGMuKSksIGJ5IGluY2x1ZGluZyB0aGlzIExpY2Vuc2UgaW4gdGhlIGRvY3VtZW50YXRpb24sIGxlZ2FsCiAgICAgICAgICBub3RpY2VzLCBhbmQvb3Igb3RoZXIgd3JpdHRlbiBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICAgICAgICAgIEltcGxlbWVudGF0aW9uLgoKMS4yLjIuIEFkZGl0aW9uYWwgQ29uZGl0aW9ucy4gVGhpcyBsaWNlbnNlIGlzIGRpcmVjdGx5IGZyb20gTGljZW5zb3IgdG8KICAgICAgIExpY2Vuc2VlLiAgTGljZW5zZWUgYWNrbm93bGVkZ2VzIGFzIGEgY29uZGl0aW9uIG9mIGJlbmVmaXRpbmcgZnJvbSBpdAogICAgICAgdGhhdCBubyByaWdodHMgZnJvbSBMaWNlbnNvciBhcmUgcmVjZWl2ZWQgZnJvbSBzdXBwbGllcnMsIGRpc3RyaWJ1dG9ycywKICAgICAgIG9yIG90aGVyd2lzZSBpbiBjb25uZWN0aW9uIHdpdGggdGhpcyBMaWNlbnNlLgoKMS4zLiBEZWZlbnNpdmUgVGVybWluYXRpb24uIElmIGFueSBMaWNlbnNlZSwgaXRzIEFmZmlsaWF0ZXMsIG9yIGl0cyBhZ2VudHMKICAgICBpbml0aWF0ZXMgcGF0ZW50IGxpdGlnYXRpb24gb3IgZmlsZXMsIG1haW50YWlucywgb3Igdm9sdW50YXJpbHkKICAgICBwYXJ0aWNpcGF0ZXMgaW4gYSBsYXdzdWl0IGFnYWluc3QgYW5vdGhlciBlbnRpdHkgb3IgYW55IHBlcnNvbiBhc3NlcnRpbmcKICAgICB0aGF0IGFueSBJbXBsZW1lbnRhdGlvbiBpbmZyaW5nZXMgTmVjZXNzYXJ5IENsYWltcywgYW55IHBhdGVudCBsaWNlbnNlcwogICAgIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGRpcmVjdGx5IHRvIHRoZSBMaWNlbnNlZSBhcmUgaW1tZWRpYXRlbHkKICAgICB0ZXJtaW5hdGVkIGFzIG9mIHRoZSBkYXRlIG9mIHRoZSBpbml0aWF0aW9uIG9mIGFjdGlvbiB1bmxlc3MgMSkgdGhhdCBzdWl0CiAgICAgd2FzIGluIHJlc3BvbnNlIHRvIGEgY29ycmVzcG9uZGluZyBzdWl0IHJlZ2FyZGluZyBhbiBJbXBsZW1lbnRhdGlvbiBmaXJzdAogICAgIGJyb3VnaHQgYWdhaW5zdCBhbiBpbml0aWF0aW5nIGVudGl0eSwgb3IgMikgdGhhdCBzdWl0IHdhcyBicm91Z2h0IHRvCiAgICAgZW5mb3JjZSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgaW50ZXJ2ZW50aW9uIGluIGEgdGhpcmQtcGFydHkKICAgICBhY3Rpb24gYnkgYSBMaWNlbnNlZSkuCgoxLjQuIERpc2NsYWltZXJzLiBUaGUgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIGFuZCBTcGVjaWZpY2F0aW9uIGFyZSBwcm92aWRlZAogICAgICJBUyBJUyIgYW5kIHdpdGhvdXQgd2FycmFudHkuIFRoZSBlbnRpcmUgcmlzayBhcyB0byBpbXBsZW1lbnRpbmcgb3IKICAgICBvdGhlcndpc2UgdXNpbmcgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBvciBTcGVjaWZpY2F0aW9uIGlzIGFzc3VtZWQKICAgICBieSB0aGUgaW1wbGVtZW50ZXIgYW5kIHVzZXIuIExpY2Vuc29yIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55IHdhcnJhbnRpZXMKICAgICAoZXhwcmVzcywgaW1wbGllZCwgb3Igb3RoZXJ3aXNlKSwgaW5jbHVkaW5nIGltcGxpZWQgd2FycmFudGllcyBvZgogICAgIG1lcmNoYW50YWJpbGl0eSwgbm9uLWluZnJpbmdlbWVudCwgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UsIG9yCiAgICAgdGl0bGUsIHJlbGF0ZWQgdG8gdGhlIG1hdGVyaWFsLiBJTiBOTyBFVkVOVCBXSUxMIExJQ0VOU09SIEJFIExJQUJMRSBUTwogICAgIEFOWSBPVEhFUiBQQVJUWSBGT1IgTE9TVCBQUk9GSVRTIE9SIEFOWSBGT1JNIE9GIElORElSRUNULCBTUEVDSUFMLAogICAgIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIEZST00gQU5ZIENBVVNFUyBPRgogICAgIEFDVElPTiBPRiBBTlkgS0lORCBXSVRIIFJFU1BFQ1QgVE8gVEhJUyBMSUNFTlNFLCBXSEVUSEVSIEJBU0VEIE9OIEJSRUFDSAogICAgIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIE9SIE9USEVSV0lTRSwgQU5EIFdIRVRIRVIgT1IKICAgICBOT1QgVEhFIE9USEVSIFBBUlRSWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCjIuIERlZmluaXRpb25zLgoKMi4xLiBBZmZpbGlhdGUuICCTQWZmaWxpYXRllCBtZWFucyBhbiBlbnRpdHkgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5CiAgICAgQ29udHJvbHMsIGlzIENvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBDb250cm9sIG9mIHRoYXQgcGFydHkuCgoyLjIuIENvbnRyb2wuIJNDb250cm9slCBtZWFucyBkaXJlY3Qgb3IgaW5kaXJlY3QgY29udHJvbCBvZiBtb3JlIHRoYW4gNTAlIG9mCiAgICAgdGhlIHZvdGluZyBwb3dlciB0byBlbGVjdCBkaXJlY3RvcnMgb2YgdGhhdCBjb3Jwb3JhdGlvbiwgb3IgZm9yIGFueSBvdGhlcgogICAgIGVudGl0eSwgdGhlIHBvd2VyIHRvIGRpcmVjdCBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LgoKMi4zLiBEZWNvZGVyLiAgIkRlY29kZXIiIG1lYW5zIGFueSBkZWNvZGVyIHRoYXQgY29uZm9ybXMgZnVsbHkgd2l0aCBhbGwKICAgICBub24tb3B0aW9uYWwgcG9ydGlvbnMgb2YgdGhlIFNwZWNpZmljYXRpb24uCgoyLjQuIEVuY29kZXIuICAiRW5jb2RlciIgbWVhbnMgYW55IGVuY29kZXIgdGhhdCBwcm9kdWNlcyBhIGJpdHN0cmVhbSB0aGF0IGNhbgogICAgIGJlIGRlY29kZWQgYnkgYSBEZWNvZGVyIG9ubHkgdG8gdGhlIGV4dGVudCBpdCBwcm9kdWNlcyBzdWNoIGEgYml0c3RyZWFtLgoKMi41LiBGaW5hbCBEZWxpdmVyYWJsZS4gIJNGaW5hbCBEZWxpdmVyYWJsZZQgbWVhbnMgdGhlIGZpbmFsIHZlcnNpb24gb2YgYQogICAgIGRlbGl2ZXJhYmxlIGFwcHJvdmVkIGJ5IHRoZSBBbGxpYW5jZSBmb3IgT3BlbiBNZWRpYSBhcyBhIEZpbmFsCiAgICAgRGVsaXZlcmFibGUuCgoyLjYuIEltcGxlbWVudGF0aW9uLiAgIkltcGxlbWVudGF0aW9uIiBtZWFucyBhbnkgaW1wbGVtZW50YXRpb24sIGluY2x1ZGluZyB0aGUKICAgICBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHRoYXQgaXMgYW4gRW5jb2RlciBhbmQvb3IgYSBEZWNvZGVyLiBBbgogICAgIEltcGxlbWVudGF0aW9uIGFsc28gaW5jbHVkZXMgY29tcG9uZW50cyBvZiBhbiBJbXBsZW1lbnRhdGlvbiBvbmx5IHRvIHRoZQogICAgIGV4dGVudCB0aGV5IGFyZSB1c2VkIGFzIHBhcnQgb2YgYW4gSW1wbGVtZW50YXRpb24uCgoyLjcuIExpY2Vuc2UuIJNMaWNlbnNllCBtZWFucyB0aGlzIGxpY2Vuc2UuCgoyLjguIExpY2Vuc2VlLiCTTGljZW5zZWWUIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHdobyBleGVyY2lzZXMgcGF0ZW50CiAgICAgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLgoKMi45LiBMaWNlbnNvci4gICJMaWNlbnNvciIgbWVhbnMgKGkpIGFueSBMaWNlbnNlZSB0aGF0IG1ha2VzLCBzZWxscywgb2ZmZXJzCiAgICAgZm9yIHNhbGUsIGltcG9ydHMgb3IgZGlzdHJpYnV0ZXMgYW55IEltcGxlbWVudGF0aW9uLCBvciAoaWkpIGEgcGVyc29uCiAgICAgb3IgZW50aXR5IHRoYXQgaGFzIGEgbGljZW5zaW5nIG9ibGlnYXRpb24gdG8gdGhlIEltcGxlbWVudGF0aW9uIGFzIGEKICAgICByZXN1bHQgb2YgaXRzIG1lbWJlcnNoaXAgYW5kL29yIHBhcnRpY2lwYXRpb24gaW4gdGhlIEFsbGlhbmNlIGZvciBPcGVuCiAgICAgTWVkaWEgd29ya2luZyBncm91cCB0aGF0IGRldmVsb3BlZCB0aGUgU3BlY2lmaWNhdGlvbi4KCjIuMTAuIE5lY2Vzc2FyeSBDbGFpbXMuICAiTmVjZXNzYXJ5IENsYWltcyIgbWVhbnMgYWxsIGNsYWltcyBvZiBwYXRlbnRzIG9yCiAgICAgIHBhdGVudCBhcHBsaWNhdGlvbnMsIChhKSB0aGF0IGN1cnJlbnRseSBvciBhdCBhbnkgdGltZSBpbiB0aGUgZnV0dXJlLAogICAgICBhcmUgb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgTGljZW5zb3IsIGFuZCAoYikgKGkpIHdvdWxkIGJlIGFuCiAgICAgIEVzc2VudGlhbCBDbGFpbSBhcyBkZWZpbmVkIGJ5IHRoZSBXM0MgUG9saWN5IGFzIG9mIEZlYnJ1YXJ5IDUsIDIwMDQKICAgICAgKGh0dHBzOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL1BhdGVudC1Qb2xpY3ktMjAwNDAyMDUvI2RlZi1lc3NlbnRpYWwpCiAgICAgIGFzIGlmIHRoZSBTcGVjaWZpY2F0aW9uIHdhcyBhIFczQyBSZWNvbW1lbmRhdGlvbjsgb3IgKGlpKSBhcmUgaW5mcmluZ2VkCiAgICAgIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24uCgoyLjExLiBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24uIJNSZWZlcmVuY2UgSW1wbGVtZW50YXRpb26UIG1lYW5zIGFuIEVuY29kZXIKICAgICAgYW5kL29yIERlY29kZXIgcmVsZWFzZWQgYnkgdGhlIEFsbGlhbmNlIGZvciBPcGVuIE1lZGlhIGFzIGEgRmluYWwKICAgICAgRGVsaXZlcmFibGUuCgoyLjEyLiBTcGVjaWZpY2F0aW9uLiCTU3BlY2lmaWNhdGlvbpQgbWVhbnMgdGhlIHNwZWNpZmljYXRpb24gZGVzaWduYXRlZCBieQogICAgICB0aGUgQWxsaWFuY2UgZm9yIE9wZW4gTWVkaWEgYXMgYSBGaW5hbCBEZWxpdmVyYWJsZSBmb3Igd2hpY2ggdGhpcwogICAgICBMaWNlbnNlIHdhcyBpc3N1ZWQuCgo=