LyogJElkJCAqLwovKiAKICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGVsdXUgSW5jLiAoaHR0cDovL3d3dy50ZWx1dS5jb20pCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCiAqLwoKCi8qKgoKQGRlZmdyb3VwIG5hdF9pbnRybyBJbnRyb2R1Y3Rpb24gdG8gTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0aW9uIChOQVQpIGFuZCBOQVQgVHJhdmVyc2FsCkBicmllZiBUaGlzIHBhZ2UgZGVzY3JpYmVzIE5BVCBhbmQgdGhlIHByb2JsZW1zIGNhdXNlZCBieSBpdCBhbmQgdGhlIHNvbHV0aW9ucwoKCgpcc2VjdGlvbiBpbnRvIEludHJvZHVjdGlvbiB0byBOQVQKCgpOQVQgKE5ldHdvcmsgQWRkcmVzcyBUcmFuc2xhdGlvbikgaXMgYSBtZWNoYW5pc20gd2hlcmUgYSBkZXZpY2UgcGVyZm9ybXMgCm1vZGlmaWNhdGlvbnMgdG8gdGhlIFRDUC9JUCBhZGRyZXNzL3BvcnQgbnVtYmVyIG9mIGEgcGFja2V0IGFuZCBtYXBzIHRoZSAKSVAgYWRkcmVzcyBmcm9tIG9uZSByZWFsbSB0byBhbm90aGVyICh1c3VhbGx5IGZyb20gcHJpdmF0ZSBJUCBhZGRyZXNzIHRvIApwdWJsaWMgSVAgYWRkcmVzcyBhbmQgdmljZSB2ZXJzYSkuIFRoaXMgd29ya3MgYnkgdGhlIE5BVCBkZXZpY2UgYWxsb2NhdGluZwphIHRlbXBvcmFyeSBwb3J0IG51bWJlciBvbiB0aGUgcHVibGljIHNpZGUgb2YgdGhlIE5BVCB1cG9uIGZvcndhcmRpbmcgCm91dGJvdW5kIHBhY2tldCBmcm9tIHRoZSBpbnRlcm5hbCBob3N0IHRvd2FyZHMgdGhlIEludGVybmV0LCBtYWludGFpbmluZwp0aGlzIG1hcHBpbmcgZm9yIHNvbWUgcHJlZGVmaW5lZCB0aW1lLCBhbmQgZm9yd2FyZGluZyB0aGUgaW5ib3VuZCBwYWNrZXRzCnJlY2VpdmVkIGZyb20gdGhlIEludGVybmV0IG9uIHRoaXMgcHVibGljIHBvcnQgYmFjayB0byB0aGUgaW50ZXJuYWwgaG9zdC4KCgpOQVQgZGV2aWNlcyBhcmUgaW5zdGFsbGVkIHByaW1hcmlseSB0byBhbGxldmlhdGUgdGhlIGV4aGF1c3Rpb24gb2YgSVB2NCAKYWRkcmVzcyBzcGFjZSBieSBhbGxvd2luZyBtdWx0aXBsZSBob3N0cyB0byBzaGFyZSBhIHB1YmxpYy9JbnRlcm5ldCBhZGRyZXNzLgpBbHNvIGR1ZSB0byBpdHMgbWFwcGluZyBuYXR1cmUgKGkuZS4gYSBtYXBwaW5nIGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgCmEgdHJhbnNtaXNzaW9uIGZyb20gYW4gaW50ZXJuYWwgaG9zdCksIE5BVCBkZXZpY2UgaXMgcHJlZmVycmVkIHRvIGJlIAppbnN0YWxsZWQgZXZlbiB3aGVuIElQdjQgYWRkcmVzcyBleGhhdXN0aW9uIGlzIG5vdCBhIHByb2JsZW0gKGZvciBleGFtcGxlCndoZW4gdGhlcmUgaXMgb25seSBvbmUgaG9zdCBhdCBob21lKSwgdG8gcHJvdmlkZSBzb21lIHNvcnQgb2Ygc2VjdXJpdHkvc2hpZWxkCmZvciB0aGUgaW50ZXJuYWwgaG9zdHMgYWdhaW5zdCB0aHJlYXRzIGZyb20gdGhlIEludGVybmV0LgoKCkRlc3BpdGUgdGhlIGZhY3QgdGhhdCBOQVQgcHJvdmlkZXMgc29tZSBzaGllbGRzIGZvciB0aGUgaW50ZXJuYWwgbmV0d29yaywKb25lIG11c3QgZGlzdGluZ3Vpc2ggTkFUIHNvbHV0aW9uIGZyb20gZmlyZXdhbGwgc29sdXRpb24uIE5BVCBpcyBub3QgCmEgZmlyZXdhbGwgc29sdXRpb24uIEEgZmlyZXdhbGwgaXMgYSBzZWN1cml0eSBzb2x1dGlvbiBkZXNpZ25lZCB0byBlbmZvcmNlCnRoZSBzZWN1cml0eSBwb2xpY3kgb2YgYW4gb3JnYW5pemF0aW9uLCB3aGlsZSBOQVQgaXMgYSBjb25uZWN0aXZpdHkgc29sdXRpb24KdG8gYWxsb3cgbXVsdGlwbGUgaG9zdHMgdG8gdXNlIGEgc2luZ2xlIHB1YmxpYyBJUCBhZGRyZXNzLiBVbmRlcnN0YW5kYWJseQpib3RoIGZ1bmN0aW9uYWxpdGllcyBhcmUgZGlmZmljdWx0IHRvIHNlcGFyYXRlIGF0IHRpbWVzLCBzaW5jZSBtYW55IAoodHlwaWNhbGx5IGNvbnN1bWVyKSBwcm9kdWN0cyBjbGFpbXMgdG8gZG8gYm90aCB3aXRoIHRoZSBzYW1lIGRldmljZSBhbmQKc2ltcGx5IGxhYmVsIHRoZSBkZXZpY2UgYSCTTkFUIGJveJQuIEJ1dCB3ZSBkbyB3YW50IHRvIG1ha2UgdGhpcyBkaXN0aW5jdGlvbgpyYXRoZXIgY2xlYXIsIGFzIFBKTkFUSCBpcyBhIE5BVCB0cmF2ZXJzYWwgaGVscGVyIGFuZCBub3QgYSBmaXJld2FsbCBieXBhc3MKc29sdXRpb24gKHlldCkuCgoKClxzZWN0aW9uIHByb2JsZW1zIFRoZSBOQVQgdHJhdmVyc2FsIHByb2JsZW1zCgoKV2hpbGUgTkFUIHdvdWxkIHdvcmsgd2VsbCBmb3IgdHlwaWNhbCBjbGllbnQgc2VydmVyIGNvbW11bmljYXRpb25zIChzdWNoIGFzCndlYiBhbmQgZW1haWwpLCBzaW5jZSBpdCdzIGFsd2F5cyB0aGUgY2xpZW50IHRoYXQgaW5pdGlhdGVzIHRoZSBjb252ZXJzYXRpb24KYW5kIG5vcm1hbGx5IGNsaWVudCBkb2Vzbid0IG5lZWQgdG8gbWFpbnRhaW4gdGhlIGNvbm5lY3Rpb24gZm9yIGEgbG9uZyB0aW1lLAppbnN0YWxsYXRpb24gb2YgTkFUIHdvdWxkIGNhdXNlIG1ham9yIHByb2JsZW0gZm9yIHBlZXItdG8tcGVlciBjb21tdW5pY2F0aW9uLApzdWNoIGFzIChhbmQgZXNwZWNpYWxseSkgVm9JUC4gVGhlc2UgcHJvYmxlbXMgd2lsbCBiZSBleHBsYWluZWQgaW4gbW9yZSBkZXRhaWwKYmVsb3cuCgoKXHN1YnNlY3Rpb24gcGVlcl9hZGRyIFBlZXIgYWRkcmVzcyBwcm9ibGVtCgoKSW4gVm9JUCwgbm9ybWFsbHkgd2Ugd2FudCB0aGUgbWVkaWEgKGF1ZGlvLCBhbmQgdmlkZW8pIHRvIGZsb3cgZGlyZWN0bHkKYmV0d2VlbiB0aGUgY2xpZW50cywgc2luY2UgcmVsYXlpbmcgaXMgY29zdGx5IChib3RoIGluIHRlcm1zIG9mIGJhbmR3aWR0aApjb3N0IGZvciBzZXJ2aWNlIHByb3ZpZGVyLCBhbmQgYWRkaXRpb25hbCBsYXRlbmN5IGludHJvZHVjZWQgYnkgcmVsYXlpbmcpLgpUbyBkbyB0aGlzLCBlYWNoIGNsaWVudCBpbmZvcm1zIGl0cyBtZWRpYSB0cmFuc3BvcnQgYWRkcmVzcyB0byB0aGUgb3RoZXIKY2xpZW50ICwgYnkgc2VuZGluZyBpdCB2aWEgdGhlIFZvSVAgc2lnbmFsaW5nIHBhdGgsIGFuZCB0aGUgb3RoZXIgc2lkZSB3b3VsZApzZW5kIGl0cyBtZWRpYSB0byB0aGlzIHRyYW5zcG9ydCBhZGRyZXNzLgoKCkFuZCB0aGVyZSBsaWVzIHRoZSBwcm9ibGVtLiBJZiB0aGUgY2xpZW50IHNvZnR3YXJlIGlzIG5vdCBOQVQgYXdhcmUsIHRoZW4KaXQgd291bGQgc2VuZCBpdHMgcHJpdmF0ZSBJUCBhZGRyZXNzIHRvIHRoZSBvdGhlciBjbGllbnQsIGFuZCB0aGUgb3RoZXIKY2xpZW50IHdvdWxkIG5vdCBiZSBhYmxlIHRvIHNlbmQgbWVkaWEgdG8gdGhpcyBhZGRyZXNzLgoKClRyYWRpdGlvbmFsbHkgdGhpcyB3YXMgc29sdmVkIGJ5IHVzaW5nIFNUVU4uIFdpdGggdGhpcyBtZWNoYW5pc20sIHRoZSBjbGllbnQKZmlyc3QgZmluZHMgb3V0IGl0cyBwdWJsaWMgSVAgYWRkcmVzcy9wb3J0IGJ5IHF1ZXJ5aW5nIGEgU1RVTiBzZXJ2ZXIsIHRoZW4Kc2VuZCBzdGhpcyBwdWJsaWMgYWRkcmVzcyBpbnN0ZWFkIG9mIGl0cyBwcml2YXRlIGFkZHJlc3MgdG8gdGhlIG90aGVyIApjbGllbnQuIFdoZW4gYm90aCBzaWRlcyBhcmUgdXNpbmcgdGhpcyBtZWNoYW5pc20sIHRoZXkgY2FuIHRoZW4gc2VuZCBtZWRpYSAKcGFja2V0cyB0byB0aGVzZSBhZGRyZXNzZXMsIHRoZXJlYnkgY3JlYXRpbmcgYSBtYXBwaW5nIGluIHRoZSBOQVQgKGFsc28gCmNhbGxlZCBvcGVuaW5nIGEgImhvbGUiLCBoZW5jZSB0aGlzIG1lY2hhbmlzbSBpcyBhbHNvIHBvcHVsYXJseSBjYWxsZWQgCiJob2xlIHB1bmNoaW5nIikgYW5kIGJvdGggY2FuIHRoZW4gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyLgoKCkJ1dCB0aGlzIG1lY2hhbmlzbSBkb2VzIG5vdCB3b3JrIGluIGFsbCBjYXNlcywgYXMgd2lsbCBiZSBleHBsYWluZWQgYmVsb3cuCgoKClxzdWJzZWN0aW9uIGhhaXJwaW4gSGFpcnBpbm5pbmcgYmVoYXZpb3IKCgpIYWlycGluIGlzIGEgYmVoYXZpb3Igd2hlcmUgYSBOQVQgZGV2aWNlIGZvcndhcmRzIHBhY2tldHMgZnJvbSBhIGhvc3QgaW4KaW50ZXJuYWwgbmV0d29yayAobGV0cyBjYWxsIGl0IGhvc3QgQSkgYmFjayB0byBzb21lIG90aGVyIGhvc3QgKGhvc3QgQikgaW4KdGhlIHNhbWUgaW50ZXJuYWwgbmV0d29yaywgd2hlbiBpdCBkZXRlY3RzIHRoYXQgdGhlIChwdWJsaWMgSVAgYWRkcmVzcykKZGVzdGluYXRpb24gb2YgdGhlIHBhY2tldCBpcyBhY3R1YWxseSBhIG1hcHBlZCBJUCBhZGRyZXNzIHRoYXQgd2FzIGNyZWF0ZWQKZm9yIHRoZSBpbnRlcm5hbCBob3N0IChob3N0IEIpLiBUaGlzIGlzIGEgZGVzaXJhYmxlIGJlaGF2aW9yIG9mIGEgTkFULCAKYnV0IHVuZm9ydHVuYXRlbHkgbm90IGFsbCBOQVQgZGV2aWNlcyBzdXBwb3J0IHRoaXMuCgoKTGFja2luZyB0aGlzIGJlaGF2aW9yLCB0d28gKGludGVybmFsKSBob3N0cyBiZWhpbmQgdGhlIHNhbWUgTkFUIHdpbGwgbm90CmJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBlYWNoIG90aGVyIGlmIHRoZXkgZXhjaGFuZ2UgdGhlaXIgcHVibGljCmFkZHJlc3NlcyAocmVzb2x2ZWQgYnkgU1RVTiBhYm92ZSkgdG8gZWFjaCBvdGhlci4KCgoKXHN1YnNlY3Rpb24gc3ltbWV0cmljIFN5bW1ldHJpYyBiZWhhdmlvcgoKCk5BVCBkZXZpY2VzIGRvbid0IGJlaGF2ZSB1bmlmb3JtbHkgYW5kIHBlb3BsZSBoYXZlIGJlZW4gdHJ5aW5nIHRvIGNsYXNzaWZ5CnRoZWlyIGJlaGF2aW9yIGludG8gZGlmZmVyZW50IGNsYXNzZXMuIFRyYWRpdGlvbmFsbHkgTkFUIGRldmljZXMgYXJlCmNsYXNzaWZpZWQgaW50byBGdWxsIENvbmUsIFJlc3RyaWN0ZWQgQ29uZSwgUG9ydCBSZXN0cmljdGVkIENvbmUsIGFuZCAKU3ltbWV0cmljIHR5cGVzLCBhY2NvcmRpbmcgdG8gPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzQ4OS50eHQiPlJGQyAzNDg5PC9BPgpzZWN0aW9uIDUuIEEgbW9yZSByZWNlbnQgbWV0aG9kIG9mIGNsYXNzaWZpY2F0aW9uLCBhcyBleHBsYWluZWQgYnkgCjxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQ3ODcudHh0Ij5SRkMgNDc4NzwvQT4sIGRpdmlkZXMgCnRoZSBOQVQgYmVoYXZpb3JhbCB0eXBlcyBpbnRvIHR3byBhdHRyaWJ1dGVzOiB0aGUgbWFwcGluZyBiZWhhdmlvciAKYXR0cmlidXRlIGFuZCB0aGUgZmlsdGVyaW5nIGJlaGF2aW9yIGF0dHJpYnV0ZS4gRWFjaCBhdHRyaWJ1dGUgY2FuIGJlIApvbmUgb2YgdGhyZWUgdHlwZXM6IDxpPkVuZHBvaW50LUluZGVwZW5kZW50PC9pPiwgPGk+QWRkcmVzcy1EZXBlbmRlbnQ8L2k+LApvciA8aT5BZGRyZXNzIGFuZCBQb3J0LURlcGVuZGVudDwvaT4uIFdpdGggdGhpcyBuZXcgY2xhc3NpZmljYXRpb24gbWV0aG9kLAphIFN5bW1ldHJpYyBOQVQgYWN0dWFsbHkgaXMgYW4gQWRkcmVzcyBhbmQgUG9ydC1EZXBlbmRlbnQgbWFwcGluZyBOQVQuCgoKQW1vbmcgdGhlc2UgdHlwZXMsIHRoZSBTeW1tZXRyaWMgdHlwZSBpcyB0aGUgaGFyZGVzdCBvbmUgdG8gd29yayB3aXRoLiAKVGhlIHByb2JsZW0gaXMgYmVjYXVzZSB0aGUgTkFUIGFsbG9jYXRlcyBkaWZmZXJlbnQgbWFwcGluZyAob2YgdGhlIHNhbWUKaW50ZXJuYWwgaG9zdCkgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHRvIHRoZSBTVFVOIHNlcnZlciBhbmQgdGhlIApjb21tdW5pY2F0aW9uIHRvIHRoZSBvdGhlciAoZXh0ZXJuYWwpIGhvc3RzLCBzbyB0aGUgSVAgYWRkcmVzcy9wb3J0IHRoYXQKaXMgaW5mb3JtZWQgYnkgb25lIGhvc3QgdG8gdGhlIG90aGVyIGlzIG1lYW5pbmdsZXNzIGZvciB0aGUgcmVjaXBpZW50IApzaW5jZSB0aGlzIGlzIG5vdCB0aGUgYWN0dWFsIElQIGFkZHJlc3MvcG9ydCBtYXBwaW5nIHRoYXQgdGhlIE5BVCBkZXZpY2UgCmNyZWF0ZXMuIFRoZSByZXN1bHQgaXMgd2hlbiB0aGUgcmVjaXBpZW50IGhvc3QgdHJpZXMgdG8gc2VuZCBhIHBhY2tldCB0byAKdGhpcyBhZGRyZXNzLCB0aGUgTkFUIGRldmljZSB3b3VsZCBkcm9wIHRoZSBwYWNrZXQgc2luY2UgaXQgZG9lcyBub3QgCnJlY29nbml6ZSB0aGUgc2VuZGVyIG9mIHRoZSBwYWNrZXQgYXMgdGhlICJhdXRob3JpemVkIiBob3N0cyB0byBzZW5kIAp0byB0aGlzIGFkZHJlc3MuCgoKVGhlcmUgYXJlIHR3byBzb2x1dGlvbnMgZm9yIHRoaXMuIFRoZSBmaXJzdCwgd2UgY291bGQgbWFrZSB0aGUgY2xpZW50IApzbWFydGVyIGJ5IHN3aXRjaGluZyB0cmFuc21pc3Npb24gb2YgdGhlIG1lZGlhIHRvIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiAKdGhlIG1lZGlhIHBhY2tldHMuIFRoaXMgd291bGQgd29yayBzaW5jZSBub3JtYWxseSBjbGllbnRzIHVzZXMgYSB3ZWxsIAprbm93biB0cmljayBjYWxsZWQgc3ltbWV0cmljIFJUUCwgd2hlcmUgdGhleSB1c2Ugb25lIHNvY2tldCBmb3IgYm90aCAKdHJhbnNtaXR0aW5nIGFuZCByZWNlaXZpbmcgUlRQL21lZGlhIHBhY2tldHMuIFdlIGFsc28gdXNlIHRoaXMgCm1lY2hhbmlzbSBpbiBQSk1FRElBIG1lZGlhIHRyYW5zcG9ydC4gQnV0IHRoaXMgc29sdXRpb24gb25seSB3b3JrcyAKaWYgYSBjbGllbnQgYmVoaW5kIGEgc3ltbWV0cmljIE5BVCBpcyBub3QgY29tbXVuaWNhdGluZyB3aXRoIG90aGVyIApjbGllbnQgYmVoaW5kIGVpdGhlciBzeW1tZXRyaWMgTkFUIG9yIHBvcnQtcmVzdHJpY3RlZCBOQVQuCgoKVGhlIHNlY29uZCBzb2x1dGlvbiBpcyB0byB1c2UgbWVkaWEgcmVsYXksIGJ1dCBhcyBoYXZlIGJlZW4gbWVudGlvbmVkIAphYm92ZSwgcmVsYXlpbmcgaXMgY29zdGx5LCBib3RoIGluIHRlcm1zIG9mIGJhbmR3aWR0aCBjb3N0IGZvciBzZXJ2aWNlCnByb3ZpZGVyIGFuZCBhZGRpdGlvbmFsIGxhdGVuY3kgaW50cm9kdWNlZCBieSByZWxheWluZy4KCgoKXHN1YnNlY3Rpb24gYmluZGluZ190aW1lb3V0IEJpbmRpbmcgdGltZW91dAoKV2hlbiBhIE5BVCBkZXZpY2UgY3JlYXRlcyBhIGJpbmRpbmcgKGEgcHVibGljLXByaXZhdGUgSVAgYWRkcmVzcyAKbWFwcGluZyksIGl0IHdpbGwgYXNzb2NpYXRlIGEgdGltZXIgd2l0aCBpdC4gVGhlIHRpbWVyIGlzIHVzZWQgdG8gCmRlc3Ryb3kgdGhlIGJpbmRpbmcgb25jZSB0aGVyZSBpcyBubyBhY3Rpdml0eS90cmFmZmljIGFzc29jaWF0ZWQgd2l0aCAKdGhlIGJpbmRpbmcuIEJlY2F1c2Ugb2YgdGhpcywgYSBOQVQgYXdhcmUgYXBwbGljYXRpb24gdGhhdCB3aXNoZXMgdG8gCmtlZXAgdGhlIGJpbmRpbmcgb3BlbiBtdXN0IHBlcmlvZGljYWxseSBzZW5kIG91dGJvdW5kIHBhY2tldHMsIAphIG1lY2hhbmlzbSBrbm93biBhcyBrZWVwLWFsaXZlLCBvciBvdGhlcndpc2UgaXQgd2lsbCB1bHRpbWF0ZWx5IApsb29zZSB0aGUgYmluZGluZyBhbmQgdW5hYmxlIHRvIHJlY2VpdmUgaW5jb21pbmcgcGFja2V0cyBmcm9tIEludGVybmV0LgoKClxzZWN0aW9uIHNvbHV0aW9ucyBUaGUgTkFUIHRyYXZlcnNhbCBzb2x1dGlvbnMKCgpcc3Vic2VjdGlvbiBzdHVuIE9sZCBTVFVOIChSRkMgMzQ4OSkKClRoZSBvcmlnaW5hbCBTVFVOIChTaW1wbGUgVHJhdmVyc2FsIG9mIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wgKFVEUCkgClRocm91Z2ggTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0b3JzIChOQVRzKSkgYXMgZGVmaW5lZCBieSAKPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzQ4OS50eHQiPlJGQyAzNDg5PC9BPgoocHVibGlzaGVkIGluIDIwMDMsIGJ1dCB0aGUgd29yayB3YXMgc3RhcnRlZCBhcyBlYXJseSBhcyAyMDAxKSB3YXMgCm1lYW50IHRvIGJlIGEgc3RhbmRhbG9uZSwgc3RhbmRhcmQtYmFzZWQgc29sdXRpb24gZm9yIHRoZSBOQVQgCmNvbm5lY3Rpdml0eSBwcm9ibGVtcyBhYm92ZS4gSXQgaXMgZXF1aXBwZWQgd2l0aCBOQVQgdHlwZSBkZXRlY3Rpb24gCmFsZ29yaXRtIGFuZCBtZXRob2RzIHRvIGhvbGUtcHVuY2ggdGhlIE5BVCBpbiBvcmRlciB0byBsZXQgdHJhZmZpYyAKdG8gZ2V0IHRocm91Z2ggYW5kIGhhcyBiZWVuIHByb3ZlbiB0byBiZSBxdWl0ZSBzdWNjZXNzZnVsIGluIAp0cmF2ZXJzaW5nIG1hbnkgdHlwZXMgb2YgTkFUcywgaGVuY2UgaXQgaGFzIGdhaW5lZCBhIGxvdCBvZiBwb3B1bGFyaXR5CiBhcyBhIHNpbXBsZSBhbmQgZWZmZWN0aXZlIE5BVCB0cmF2ZXJzYWwgc29sdXRpb24uCgpCdXQgc2luY2UgdGhlbiB0aGUgc21hcnQgcGVvcGxlIGF0IElFVEYgaGFzIHJlYWxpemVkIHRoYXQgU1RVTiBhbG9uZSAKaXMgbm90IGdvaW5nIHRvIGJlIGVub3VnaC4gQmVzaWRlcyBpdHMgbmF0dXJlIHRoYXQgU1RVTiBzb2x1dGlvbiBjYW5ub3QgCnNvbHZlIHRoZSBzeW1tZXRyaWMtdG8tc3ltbWV0cmljIG9yIHBvcnQtcmVzdHJpY3RlZCBjb25uZWN0aW9uLCAKcGVvcGxlIGhhdmUgYWxzbyBkaXNjb3ZlcmVkIHRoYXQgTkFUIGJlaGF2aW9yIGNhbiBjaGFuZ2UgZm9yIGRpZmZlcmVudCAKdHJhZmZpYyAob3IgZm9yIHRoZSBzYW1lIHRyYWZmaWMgb3ZlcnRpbWUpIGhlbmNlIGl0IHdhcyBjb25jbHVkZWQgdGhhdCAKTkFUIHR5cGUgZGV0ZWN0aW9uIGNvdWxkIHByb2R1Y2UgdW5yZWxpYWJsZSByZXN1bHRzIGhlbmNlIG9uZSBzaG91bGQgbm90IApyZWx5IHRvbyBtdWNoIG9uIGl0LgoKQmVjYXVzZSBvZiB0aGlzLCBTVFVOIGhhcyBzaW5jZSBtb3ZlZCBpdHMgZWZmb3J0cyB0byBkaWZmZXJlbnQgc3RyYXRlZ3kuIApJbnN0ZWFkIG9mIGF0dGVtcHRpbmcgdG8gcHJvdmlkZSBhIHN0YW5kYWxvbmUgc29sdXRpb24sIGl0J3Mgbm93IHByb3ZpZGluZyAKYSBwYXJ0IHNvbHV0aW9uIGFuZCBmcmFtZXdvcmsgdG8gYnVpbGQgb3RoZXIgKFNUVU4gYmFzZWQpIHByb3RvY29scyAKb24gdG9wIG9mIGl0LCBzdWNoIGFzIFRVUk4gYW5kIElDRS4KCgpcc3Vic2VjdGlvbiBzdHVuYmlzIFNUVU4vU1RVTmJpcyAoUkZDIDUzODkpCgpUaGUgU2Vzc2lvbiBUcmF2ZXJzYWwgVXRpbGl0aWVzIGZvciBOQVQgKFNUVU4pIGlzIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IApvZiB0aGUgb2xkIFNUVU4uIFdoaWxlIGl0IHN0aWxsIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBhIGNsaWVudCB0byAKcXVlcnkgaXRzIHB1YmxpYy9tYXBwZWQgYWRkcmVzcyB0byBhIFNUVU4gc2VydmVyLCBpdCBoYXMgZGVwcmVjYXRlZCAKdGhlIHVzZSBvZiBOQVQgdHlwZSBkZXRlY3Rpb24sIGFuZCBub3cgaXQgc2VydmVzIGFzIGEgZnJhbWV3b3JrIHRvIGJ1aWxkIApvdGhlciBwcm90b2NvbHMgb24gdG9wIG9mIGl0IChzdWNoIGFzIFRVUk4gYW5kIElDRSkuCgoKXHN1YnNlY3Rpb24gbWlkY29tX3R1cm4gT2xkIFRVUk4gKGRyYWZ0LXJvc2VuYmVyZy1taWRjb20tdHVybikKClRyYXZlcnNhbCBVc2luZyBSZWxheSBOQVQgKFRVUk4pLCBhIHN0YW5kYXJkLWJhc2VkIGVmZm9ydCBzdGFydGVkIGFzIGVhcmx5CmFzIGluIE5vdmVtYmVyIDIwMDEsIHdhcyBtZWFudCB0byBiZSB0aGUgY29tcGxlbWVudGFyeSBtZXRob2QgZm9yIHRoZSAKKG9sZCkgU1RVTiB0byBjb21wbGV0ZSB0aGUgc29sdXRpb24uIFRoZSBvcmlnaW5hbCBpZGVhIHdhcyB0aGUgaG9zdCB0byB1c2UgClNUVU4gdG8gZGV0ZWN0IHRoZSBOQVQgdHlwZSwgYW5kIHdoZW4gaXQgaGFzIGZvdW5kIHRoYXQgdGhlIE5BVCB0eXBlIGlzIApzeW1tZXRyaWMgaXQgd291bGQgdXNlIFRVUk4gdG8gcmVsYXkgdGhlIHRyYWZmaWMuIEJ1dCBhcyBzdGF0ZWQgYWJvdmUsIAp0aGlzIGFwcHJvYWNoIHdhcyBkZWVtZWQgdG8gYmUgdW5yZWxpYWJsZSwgYW5kIG5vdyB0aGUgcHJlZmVyZWQgd2F5IHRvIHVzZQpUVVJOIChhbmQgaXQncyBhIG5ldyBUVVJOIHNwZWNpZmljYXRpb24gYXMgd2VsbCkgaXMgdG8gY29tYmluZSBpdCB3aXRoIElDRS4KCgpcc3Vic2VjdGlvbiB0dXJuIFRVUk4gKGRyYWZ0LWlldGYtYmVoYXZlLXR1cm4pCgpUcmF2ZXJzYWwgVXNpbmcgUmVsYXlzIGFyb3VuZCBOQVQgKFRVUk4pIGlzIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgb2YgVFVSTi4gCldoaWxlIHRoZSBwcm90b2NvbCBkZXRhaWxzIGhhdmUgY2hhbmdlZCBhIGxvdCwgdGhlIG9iamVjdGl2ZSBpcyBzdGlsbCAKdGhlIHNhbWUsIHRoYXQgaXMgdG8gcHJvdmlkZSByZWxheWluZyBjb250cm9sIGZvciB0aGUgYXBwbGljYXRpb24uIApBcyBtZW50aW9uZWQgYWJvdmUsIHByZWZlcmFibHkgVFVSTiBzaG91bGQgYmUgdXNlZCB3aXRoIElDRSBzaW5jZSByZWxheWluZyAKaXMgY29zdGx5IGluIHRlcm1zIG9mIGJvdGggYmFuZHdpZHRoIGFuZCBsYXRlbmN5LCBoZW5jZSBpdCBzaG91bGQgYmUgdXNlZCAKYXMgdGhlIGxhc3QgcmVzb3J0LgoKClxzdWJzZWN0aW9uIGIyYnVhIEIyQlVBIGFwcHJvYWNoCgpBIFNJUCBCYWNrIHRvIEJhY2sgVXNlciBBZ2VudHMgKEIyQlVBKSBpcyBhIFNJUCBlbnRpdHkgdGhhdCBzaXRzIGluIHRoZSAKbWlkZGxlIG9mIFNJUCB0cmFmZmljIGFuZCBhY3RzIGFzIFNJUCB1c2VyIGFnZW50cyBvbiBib3RoIGNhbGwgbGVncy4gClRoZSBwcmltYXJ5IG1vdGl2YXRpb25zIHRvIGhhdmUgYSBCMkJVQSBhcmUgdG8gYmUgYWJsZSB0byBwcm92aXNpb24gCnRoZSBjYWxsIChlLmcuIGJpbGxpbmcsIGVuZm9yY2luZyBwb2xpY3kpIGFuZCB0byBoZWxwIHdpdGggTkFUIHRyYXZlcnNhbCAKZm9yIHRoZSBjbGllbnRzLiBOb3JtYWxseSBhIEIyQlVBIHdvdWxkIGJlIGVxdWlwcGVkIHdpdGggbWVkaWEgcmVsYXlpbmcgCm9yIG90aGVyd2lzZSBpdCB3b3VsZG4ndCBiZSB2ZXJ5IHVzZWZ1bC4KClByb2R1Y3RzIHRoYXQgZmFsbCBpbnRvIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZSBTSVAgU2Vzc2lvbiBCb3JkZXIgCkNvbnRyb2xsZXJzIChTQkMpLCBhbmQgUEJYcyBzdWNoIGFzIEFzdGVyaXNrIGFyZSB0ZWNobmljYWxseSBhIEIyQlVBIAphcyB3ZWxsLgoKVGhlIGJlbmVmaXQgb2YgQjJCVUEgd2l0aCByZWdhcmQgdG8gaGVscGluZyBOQVQgdHJhdmVyc2FsIGlzIGl0IGRvZXMgbm90IApyZXF1aXJlIGFueSBtb2RpZmljYXRpb25zIHRvIHRoZSBjbGllbnQgdG8gbWFrZSBpdCBnbyB0aHJvdWdoIE5BVHMuIApBbmQgc2luY2UgYmFzaWNhbGx5IGl0IGlzIGEgcmVsYXksIGl0IHNob3VsZCBiZSBhYmxlIHRvIHRyYXZlcnNlIApzeW1tZXRyaWMgTkFUIHN1Y2Nlc3NmdWxseS4KCkhvd2V2ZXIsIHNpbmNlIGl0IGlzIGEgcmVsYXksIHRoZSB1c3VhbCByZWxheWluZyBkcmF3YmFja3MgYXBwbHksIApuYW1lbHkgdGhlIGJhbmR3aWR0aCBhbmQgbGF0ZW5jeSBpc3N1ZS4gTW9yZSBvdmVyLCBzaW5jZSBhIEIyQlVBIGFjdHMgCmFzIHVzZXIgYWdlbnQgaW4gZWl0aGVyIGNhbGwtbGVncyAoaS5lLiBpdCB0ZXJtaW5hdGVzIHRoZSBTSVAgCnNpZ25hbGluZy9jYWxsIG9uIG9uZSBsZWcsIGFsYmVpdCBpdCBjcmVhdGVzIGFub3RoZXIgY2FsbCBvbiB0aGUgb3RoZXIgCmxlZyksIGl0IG1heSBhbHNvIGludHJvZHVjZSBzZXJpb3VzIGlzc3VlcyB3aXRoIGVuZC10by1lbmQgU0lQIHNpZ25hbGluZy4KCgpcc3Vic2VjdGlvbiBhbGcgQUxHIGFwcHJvYWNoCgpOb3dkYXlzIG1hbnkgTkFUIGRldmljZXMgKHN1Y2ggYXMgY29uc3VtZXIgQURTTCByb3V0ZXJzKSBhcmUgZXF1aXBwZWQgCndpdGggaW50ZWxsaWdlbmNlIHRvIGluc3BlY3QgYW5kIGZpeCBWb0lQIHRyYWZmaWMgaW4gaXRzIGVmZm9ydCB0byBoZWxwIAppdCB3aXRoIHRoZSBOQVQgdHJhdmVyc2FsLiBUaGlzIGZlYXR1cmUgaXMgY2FsbGVkIEFwcGxpY2F0aW9uIExheWVyIApHYXRld2F5IChBTEcpIGludGVsbGlnZW5jZS4gVGhlIGlkZWEgaXMgc2luY2UgdGhlIE5BVCBkZXZpY2Uga25vd3MgYWJvdXQgCnRoZSBtYXBwaW5nLCBpdCBtaWdodCBhcyB3ZWxsIHRyeSB0byBmaXggdGhlIGFwcGxpY2F0aW9uIHRyYWZmaWMgc28gdGhhdCAKdGhlIHRyYWZmaWMgY291bGQgYmV0dGVyIHRyYXZlcnNlIHRoZSBOQVQuIFNvbWUgdHJpY2tzIHRoYXQgYXJlIApwZXJmb3JtZWQgaW5jbHVkZSBmb3IgZXhhbXBsZSByZXBsYWNpbmcgdGhlIHByaXZhdGUgSVAgYWRkcmVzc2VzL3BvcnRzIAppbiB0aGUgU0lQL1NEUCBwYWNrZXQgd2l0aCB0aGUgbWFwcGVkIHB1YmxpYyBhZGRyZXNzL3BvcnQgb2YgdGhlIGhvc3QgCnRoYXQgc2VuZHMgdGhlIHBhY2tldC4KCkRlc3BpdGUgbWFueSBjbGFpbXMgYWJvdXQgaXRzIHVzZWZ1bGxuZXNzLCBpbiByZWFsaXR5IHRoaXMgaGFzIGdpdmVuIHVzIAptb3JlIHByb2JsZW1zIHRoYW4gdGhlIGZpeC4gVG9vIG1hbnkgZGV2aWNlcyBzdWNoIGFzIHRoZXNlIGJyZWFrIHRoZSAKU0lQIHNpZ25hbGluZywgYW5kIGluIG1vcmUgYWR2YW5jZWQgY2FzZSwgSUNFIG5lZ290aWF0aW9uLiBTb21lIApleGFtcGxlcyBvZiBiYWQgc2l0dWF0aW9ucyB0aGF0IHdlIGhhdmUgZW5jb3VudGVyZWQgaW4gdGhlIHBhc3Q6CgogLSBOQVQgZGV2aWNlIGFsdGVycyB0aGUgVmlhIGFkZHJlc3MvcG9ydCBmaWVsZHMgaW4gdGhlIFNJUCByZXNwb25zZSAKICAgbWVzc2FnZSwgbWFraW5nIHRoZSByZXNwb25zZSBmYWlsIHRvIHBhc3MgU0lQIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiAKICAgYXMgZGVmaW5lZCBieSBTSVAgUkZDLgogLSBJbiBvdGhlciBjYXNlLCB0aGUgbW9kaWZpY2F0aW9ucyBpbiB0aGUgVmlhIGhlYWRlcnMgb2YgdGhlIFNJUCAKICAgcmVzcG9uc2UgaGlkZXMgdGhlIGltcG9ydGFudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTSVAgc2VydmVyLCAKICAgbmFtZW55IHRoZSBhY3R1YWwgSVAgYWRkcmVzcy9wb3J0IG9mIHRoZSBjbGllbnQgYXMgc2VlbiBieSB0aGUgU0lQIAogICBzZXJ2ZXIuCiAtIE1vZGlmaWNhdGlvbnMgaW4gdGhlIENvbnRhY3QgVVJJIG9mIFJFR0lTVEVSIHJlcXVlc3QvcmVzcG9uc2UgbWFrZXMgCiAgIHRoZSBjbGllbnQgdW5hYmxlIHRvIGRldGVjdCBpdCdzIHJlZ2lzdGVyZWQgYmluZGluZy4KIC0gTW9kaWZpY2F0aW9ucyBpbiB0aGUgSVAgYWRkcmVzc2VzL3BvcnRzIGluIFNEUCBjYXVzZXMgSUNFIAogICBuZWdvdGlhdGlvbiB0byBmYWlsIHdpdGggaWNlLW1pc21hdGNoIHN0YXR1cy4KIC0gVGhlIGNvbXBsZXhpdHkgb2YgdGhlIEFMRyBwcm9jZXNzaW5nIGluIGl0c2VsZiBzZWVtcyB0byBoYXZlIGNhdXNlZCAKICAgdGhlIGRldmljZSB0byBiZWhhdmUgZXJyYXRpY2x5IHdpdGggbWFuYWdpbmcgdGhlIGFkZHJlc3MgYmluZGluZ3MgCiAgIChlLmcuIGl0IGNyZWF0ZXMgYSBuZXcgYmluZGluZyBmb3IgdGhlIHNlY29uZCBwYWNrZXQgc2VudCBieSB0aGUgCiAgIGNsaWVudCwgZXZlbiB3aGVuIHRoZSBwcmV2aW91cyBwYWNrZXQgd2FzIHNlbnQganVzdCBzZWNvbmQgYWdvLCBvcgogICBpdCBqdXN0IHNlbmRzIGluYm91bmQgcGFja2V0IHRvIHRoZSB3cm9uZyBob3N0KS4KCgpNYW55IG1hbi1tb250aHMgZWZmb3J0cyBoYXZlIGJlZW4gc3BlbnQganVzdCB0byB0cm91Ymxlc2hvb3QgaXNzdWVzIApjYXVzZWQgYnkgdGhlc2UgQUxHIChtYWwpZnVuY3Rpb25pbmcsIGFuZCBhcyBpdCBhZGRzIGNvbXBsZXhpdHkgdG8gCnRoZSBwcm9ibGVtIHJhdGhlciB0aGFuIHNvbHZpbmcgaXQsIGluIGdlbmVyYWwgd2UgZG8gbm90IGxpa2UgdGhpcyAKYXBwcm9hY2ggYXQgYWxsIGFuZCB3b3VsZCBwcmVmZXIgaXQgdG8gZ28gYXdheS4KCgpcc3Vic2VjdGlvbiB1cG5wIFVQblAKClRoZSBVbml2ZXJzYWwgUGx1ZyBhbmQgUGxheSAoVVBuUCkgaXMgYSBzZXQgb2YgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbnMgCnRvIGNvbnRyb2wgbmV0d29yayBhcHBsaWFuY2VzIGFuZCBvbmUgb2YgaXRzIHNwZWNpZmljYXRpb24gaXMgdG8gCmNvbnRyb2wgTkFUIGRldmljZS4gV2l0aCB0aGlzIHByb3RvY29sLCBhIGNsaWVudCBjYW4gaW5zdHJ1Y3QgdGhlIApOQVQgZGV2aWNlIHRvIG9wZW4gYSBwb3J0IGluIHRoZSBOQVQncyBwdWJsaWMgc2lkZSBhbmQgdXNlIHRoaXMgcG9ydCAKZm9yIGl0cyBjb21tdW5pY2F0aW9uLiBVUG5QIGhhcyBnYWluZWQgcG9wdWxhcml0eSBkdWUgdG8gaXRzIApzaW1wbGljaXR5LCBhbmQgb25lIGNhbiBleHBlY3QgaXQgdG8gYmUgYXZhaWxhYmxlIG9uIG1ham9yaXR5IG9mIApOQVQgZGV2aWNlcy4KClRoZSBkcmF3YmFjayBvZiBVUG5QIGlzIHNpbmNlIGl0IHVzZXMgbXVsdGljYXN0IGluIGl0cyBjb21tdW5pY2F0aW9uLAppdCB3aWxsIG9ubHkgYWxsb3cgY2xpZW50IHRvIGNvbnRyb2wgb25lIE5BVCBkZXZpY2UgdGhhdCBpcyBpbiB0aGUgCnNhbWUgbXVsdGljYXN0IGRvbWFpbi4gV2hpbGUgdGhpcyBub3JtYWxseSBpcyBub3QgYSBwcm9ibGVtIGluIApob3VzZWhvbGQgaW5zdGFsbGF0aW9ucyAod2hlcmUgcGVvcGxlIG5vcm1hbGx5IG9ubHkgaGF2ZSBvbmUgTkFUIApyb3V0ZXIpLCBpdCB3aWxsIG5vdCB3b3JrIGlmIHRoZSBjbGllbnQgaXMgYmVoaW5kIGNhc2NhZGVkIHJvdXRlcnMgCmluc3RhbGxhdGlvbi4gTW9yZSBvdmVyIHVQblAgaGFzIHNlcmlvdXMgaXNzdWVzIHdpdGggc2VjdXJpdHkgZHVlIHRvIAppdHMgbGFjayBvZiBhdXRoZW50aWNhdGlvbiwgaXQncyBwcm9iYWJseSBub3QgdGhlIHByZWZlcmVkIHNvbHV0aW9uIApmb3Igb3JnYW5pemF0aW9ucy4KClxzdWJzZWN0aW9uIG90aGVyIE90aGVyIHNvbHV0aW9ucwoKT3RoZXIgc29sdXRpb25zIHRvIE5BVCB0cmF2ZXJzYWwgaW5jbHVkZXM6CgogLSBTT0NLUywgd2hpY2ggc3VwcG9ydHMgVURQIHByb3RvY29sIHNpbmNlIFNPQ0tTNS4KCgoKXHNlY3Rpb24gaWNlIElDRSBTb2x1dGlvbiAtIFRoZSBQcm90b2NvbCB0aGF0IFdvcmtzIEhhcmRlcgoKQSBuZXcgcHJvdG9jb2wgaXMgYmVpbmcgc3RhbmRhcmRpemVkIChpdCdzIGluIFdvcmsgR3JvdXAgTGFzdCBDYWxsL1dHTEMgCnN0YWdlIGF0IHRoZSB0aW1lIHRoaXMgYXJ0aWNsZSB3YXMgd3JpdHRlbikgYnkgdGhlIElFVEYsIGNhbGxlZCAKSW50ZXJhY3RpdmUgQ29ubmVjdGl2aXR5IEVzdGFibGlzaG1lbnQgKElDRSkuIElDRSBpcyB0aGUgdWx0aW1hdGUgCndlYXBvbiBhIGNsaWVudCBjYW4gaGF2ZSBpbiBpdHMgTkFUIHRyYXZlcnNhbCBzb2x1dGlvbiBhcnNlbmFscywgCmFzIGl0IHByb21pc2VzIHRoYXQgaWYgdGhlcmUgaXMgaW5kZWVkIG9uZSBwYXRoIGZvciB0d28gY2xpZW50cyAKdG8gY29tbXVuaWNhdGUsIHRoZW4gSUNFIHdpbGwgZmluZCB0aGlzIHBhdGguIEFuZCBpZiB0aGVyZSBhcmUgCm1vcmUgdGhhbiBvbmUgcGF0aHMgd2hpY2ggdGhlIGNsaWVudHMgY2FuIGNvbW11bmljYXRlLCBJQ0Ugd2lsbCAKdXNlIHRoZSBiZXN0L21vc3QgZWZmaWNpZW50IG9uZS4KCklDRSB3b3JrcyBieSBjb21iaW5pbmcgc2V2ZXJhbCBwcm90b2NvbHMgKHN1Y2ggYXMgU1RVTiBhbmQgVFVSTikgCmFsdG9nZXRoZXIgYW5kIG9mZmVyaW5nIHNldmVyYWwgY2FuZGlkYXRlIHBhdGhzIGZvciB0aGUgY29tbXVuaWNhdGlvbiwgCnRoZXJlYnkgbWF4aW1pc2luZyB0aGUgY2hhbmNlIG9mIHN1Y2Nlc3MsIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGFsc28gCmhhcyB0aGUgY2FwYWJpbGl0eSB0byBwcmlvcml0aXplIHRoZSBjYW5kaWRhdGVzLCBzbyB0aGF0IHRoZSBtb3JlIApleHBlbnNpdmUgYWx0ZXJuYXRpdmUgKG5hbWVseSByZWxheSkgd2lsbCBvbmx5IGJlIHVzZWQgYXMgdGhlIGxhc3QKcmVzb3J0IHdoZW4gZWxzZSBmYWlscy4gSUNFIG5lZ290aWF0aW9uIHByb2Nlc3MgaW52b2x2ZXMgc2V2ZXJhbCAKc3RhZ2VzOgoKIC0gY2FuZGlkYXRlIGdhdGhlcmluZywgd2hlcmUgdGhlIGNsaWVudCBmaW5kcyBvdXQgYWxsIHRoZSBwb3NzaWJsZSAKICAgYWRkcmVzc2VzIHRoYXQgaXQgY2FuIHVzZSBmb3IgdGhlIGNvbW11bmljYXRpb24uIEl0IG1heSBmaW5kIAogICB0aHJlZSB0eXBlcyBvZiBjYW5kaWRhdGVzOiBob3N0IGNhbmRpZGF0ZSB0byByZXByZXNlbnQgaXRzIAogICBwaHlzaWNhbCBOSUNzLCBzZXJ2ZXIgcmVmbGV4aXZlIGNhbmRpZGF0ZSBmb3IgdGhlIGFkZHJlc3MgdGhhdCAKICAgaGFzIGJlZW4gcmVzb2x2ZWQgZnJvbSBTVFVOLCBhbmQgcmVsYXkgY2FuZGlkYXRlIGZvciB0aGUgYWRkcmVzcyAKICAgdGhhdCB0aGUgY2xpZW50IGhhcyBhbGxvY2F0ZWQgZnJvbSBhIFRVUk4gcmVsYXkuCiAtIHByaW9yaXRpemluZyB0aGVzZSBjYW5kaWRhdGVzLiBUeXBpY2FsbHkgdGhlIHJlbGF5IGNhbmRpZGF0ZSB3aWxsCiAgIGhhdmUgdGhlIGxvd2VzdCBwcmlvcml0eSB0byB1c2Ugc2luY2UgaXQncyB0aGUgbW9zdCBleHBlbnNpdmUuCiAtIGVuY29kaW5nIHRoZXNlIGNhbmRpZGF0ZXMsIHNlbmRpbmcgaXQgdG8gcmVtb3RlIHBlZXIsIGFuZCAKICAgbmVnb3RpYXRpbmcgaXQgd2l0aCBvZmZlci1hbnN3ZXIuCiAtIHBhaXJpbmcgdGhlIGNhbmRpZGF0ZXMsIHdoZXJlIGl0IHBhaXJzIGV2ZXJ5IGxvY2FsIGNhbmRpZGF0ZXMgCiAgIHdpdGggZXZlcnkgcmVtb3RlIGNhbmRpZGF0ZXMgdGhhdCBpdCByZWNlaXZlcyBmcm9tIHRoZSByZW1vdGUgcGVlci4KIC0gY2hlY2tpbmcgdGhlIGNvbm5lY3Rpdml0eSBmb3IgZWFjaCBjYW5kaWRhdGUgcGFpcnMuCiAtIGNvbmNsdWRpbmcgdGhlIHJlc3VsdC4gU2luY2UgZXZlcnkgcG9zc2libGUgcGF0aCBjb21iaW5hdGlvbnMgYXJlIAogICBjaGVja2VkLCBpZiB0aGVyZSBpcyBhIHBhdGggdG8gY29tbXVuaWNhdGUgSUNFIHdpbGwgZmluZCBpdC4KCgpUaGVyZSBhcmUgbWFueSBiZW5ldGlmcyBvZiBJQ0U6CgogLSBpdCdzIHN0YW5kYXJkIGJhc2VkLgogLSBpdCB3b3JrcyB3aGVyZSBTVFVOIHdvcmtzIChhbmQgbW9yZSkKIC0gdW5saWtlIHN0YW5kYWxvbmUgU1RVTiBzb2x1dGlvbiwgaXQgc29sdmVzIHRoZSBoYWlycGlubmluZyBpc3N1ZSwgCiAgIHNpbmNlIGl0IGFsc28gb2ZmZXJzIGhvc3QgY2FuZGlkYXRlcy4KIC0ganVzdCBhcyByZWxheWluZyBzb2x1dGlvbnMsIGl0IHdvcmtzIHdpdGggc3ltbWV0cmljIE5BVHMuIEJ1dCB1bmxpa2UgCiAgIHBsYWluIHJlbGF5aW5nLCByZWxheSBpcyBvbmx5IHVzZWQgYXMgdGhlIGxhc3QgcmVzb3J0LCB0aGVyZWJ5IAogICBtaW5pbWl6aW5nIHRoZSBiYW5kd2lkdGggYW5kIGxhdGVuY3kgaXNzdWUgb2YgcmVsYXlpbmcuCiAtIGl0IG9mZmVycyBhIGdlbmVyaWMgZnJhbWV3b3JrIGZvciBvZmZlcmluZyBhbmQgY2hlY2tpbmcgYWRkcmVzcyAKICAgY2FuZGlkYXRlcy4gV2hpbGUgdGhlIElDRSBjb3JlIHN0YW5kYXJkIG9ubHkgdGFsa3MgYWJvdXQgdXNpbmcgU1RVTiAKICAgYW5kIFRVUk4sIGltcGxlbWVudG9ycyBjYW4gYWRkIG1vcmUgdHlwZXMgb2YgY2FuZGlkYXRlcyBpbiB0aGUgSUNFIAogICBvZmZlciwgZm9yIGV4YW1wbGUgVURQIG92ZXIgVENQIG9yIEhUVFAgcmVsYXlzLCBvciBldmVuIHVQblAgCiAgIGNhbmRpZGF0ZXMsIGFuZCB0aGlzIGNvdWxkIGJlIGRvbmUgdHJhbnNwYXJlbnRseSBmb3IgdGhlIHJlbW90ZSAKICAgcGVlciBoZW5jZSBpdCdzIGNvbXBhdGlibGUgYW5kIHVzYWJsZSBldmVuIHdoZW4gdGhlIHJlbW90ZSBwZWVyIAogICBkb2VzIG5vdCBzdXBwb3J0IHRoZXNlLgogLSBpdCBhbHNvIGFkZHMgc29tZSBraW5kIG9mIHNlY3VyaXR5IHBhcnRpY3VsYXJseSBhZ2FpbnN0IERvUyBhdHRhY2tzLCAKICAgc2luY2UgbWVkaWEgYWRkcmVzcyBtdXN0IGJlIGFja25vd2xlZGdlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuCgoKSGF2aW5nIHNhaWQgdGhhdCwgSUNFIGlzIGEgY29tcGxleCBwcm90b2NvbCB0byBpbXBsZW1lbnQsIG1ha2luZyAKaW50ZXJvcGVyYWJpbGl0eSBhbiBpc3N1ZSwgYW5kIGF0IHRoaXMgdGltZSBvZiB3cml0aW5nIHdlIGRvbid0IHNlZSAKbWFueSBpbXBsZW1lbnRhdGlvbnMgb2YgaXQgeWV0LiBGb3J0dW5hdGVseSwgUEpOQVRIIGhhcyBiZWVuIG9uZSBvZiAKdGhlIGZpcnN0IGhlbmNlIG1vcmUgbWF0dXJlIElDRSBpbXBsZW1lbnRhdGlvbiwgYmVpbmcgZmlyc3QgcmVsZWFzZWQKb24gbWlkLTIwMDcsIGFuZCB3ZSBoYXZlIGJlZW4gdGVzdGluZyBvdXIgaW1wbGVtZW50YXRpb24gYXQgCjxBIEhSRUY9Imh0dHA6Ly93d3cuc2lwaXQubmV0Ij5TSVAgSW50ZXJvcGVyYWJpbGl0eSBUZXN0IChTSVBpdCk8L0E+CmV2ZW50cyByZWd1bGFybHksIHNvIGhvcGVmdWxseSB3ZSBhcmUgb25lIG9mIHRoZSBtb3N0IHN0YWJsZSBhcyB3ZWxsLgoKClxzZWN0aW9uIHBqbmF0aCBQSk5BVEggLSBUaGUgYnVpbGRpbmcgYmxvY2tzIGZvciBlZmZlY3RpdmUgTkFUIHRyYXZlcnNhbCBzb2x1dGlvbgoKUEpTSVAgTkFUIEhlbHBlciAoUEpOQVRIKSBpcyBhIGxpYnJhcnkgd2hpY2ggY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIApvZiBzdGFuZGFyZCBiYXNlZCBOQVQgdHJhdmVyc2FsIHNvbHV0aW9ucy4gUEpOQVRIIGNhbiBiZSB1c2VkIGFzIGEgCnN0YW5kLWFsb25lIGxpYnJhcnkgZm9yIHlvdXIgc29mdHdhcmUsIG9yIHlvdSBtYXkgdXNlIFBKU1VBLUxJQiBsaWJyYXJ5LCAKYSB2ZXJ5IGhpZ2ggbGV2ZWwgbGlicmFyeSBpbnRlZ3JhdGluZyBQSlNJUCwgUEpNRURJQSwgYW5kIFBKTkFUSCBpbnRvIApzaW1wbGUgdG8gdXNlIEFQSXMuCgpQSk5BVEggaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6CgogLSBTVFVOYmlzIGltcGxlbWVudGF0aW9uLCBwcm92aWRpbmcgYm90aCByZWFkeSB0byB1c2UgU1RVTi1hd2FyZSBzb2NrZXQgCiAgIGFuZCBmcmFtZXdvcmsgdG8gaW1wbGVtZW50IGhpZ2hlciBsZXZlbCBTVFVOIGJhc2VkIHByb3RvY29scyBzdWNoIGFzIAogICBUVVJOIGFuZCBJQ0UuCiAtIE5BVCB0eXBlIGRldGVjdGlvbiwgdXNlZnVsIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuCiAtIFRVUk4gaW1wbGVtZW50YXRpb24uCiAtIElDRSBpbXBsZW1lbnRhdGlvbi4KCgpNb3JlIHByb3RvY29scyB3aWxsIGJlIGltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUuCgpHbyBiYWNrIHRvIFxyZWYgaW5kZXguCgogKi8K