QVBBQ0hFIDIuMCBTVEFUVVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLXRleHQtKi0KTGFzdCBtb2RpZmllZCBhdCBbJERhdGUkXQoKVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0OgoKICAqIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvaHR0cGQvaHR0cGQvYnJhbmNoZXMvMi4wLngvU1RBVFVTCgpEb2N1bWVudGF0aW9uIHN0YXR1cyBpcyBtYWludGFpbmVkIHNlcGVyYXRlbHkgYW5kIGNhbiBiZSBmb3VuZCBhdDoKCiAgKiBkb2NzL1NUQVRVUyBpbiB0aGlzIHNvdXJjZSB0cmVlLCBvcgogICogaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9odHRwZC9odHRwZC9icmFuY2hlcy8yLjAueC9kb2NzL1NUQVRVUwoKQ29uc3VsdCB0aGUgZm9sbG93aW5nIFNUQVRVUyBmaWxlcyBmb3IgaW5mb3JtYXRpb24gb24gcmVsYXRlZCBwcm9qZWN0czoKCiAgKiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2Fwci9hcHIvYnJhbmNoZXMvMC45LngvU1RBVFVTCiAgKiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2Fwci9hcHItdXRpbC9icmFuY2hlcy8wLjkueC9TVEFUVVMKCkNvbnN1bHQgdGhlIHRydW5rLyBmb3IgYWxsIG5ldyBkZXZlbG9wbWVudCBhbmQgZG9jdW1lbnRhdGlvbiBlZmZvcnRzOgoKICAqIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvaHR0cGQvaHR0cGQvdHJ1bmsvU1RBVFVTCiAgKiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2h0dHBkL2h0dHBkL3RydW5rL2RvY3MvU1RBVFVTCgoKUmVsZWFzZSBoaXN0b3J5OgoKICAgIDIuMC42MSAgOiBUYWdnZWQgU2VwdGVtYmVyIDQsIDIwMDcuCiAgICAyLjAuNjAgIDogVGFnZ2VkIEF1Z3VzdCAxMCwgMjAwNywgbm90IHJlbGVhc2VkLgogICAgMi4wLjU5ICA6IHJlbGVhc2VkIEp1bHkgMjgsIDIwMDYgYXMgR0EuCiAgICAyLjAuNTggIDogcmVsZWFzZWQgTWF5IDEsIDIwMDYgYXMgR0EuIAogICAgMi4wLjU3ICA6IHRhZ2dlZCBBcHJpbCAxOSwgMjAwNiwgbm90IHJlbGVhc2VkLgogICAgMi4wLjU2ICA6IHRhZ2dlZCBBcHJpbCAxNiwgMjAwNiwgbm90IHJlbGVhc2VkLgogICAgMi4wLjU1ICA6IHJlbGVhc2VkIE9jdG9iZXIgMTYsIDIwMDUgYXMgR0EuCiAgICAyLjAuNTQgIDogcmVsZWFzZWQgQXByaWwgMTcsIDIwMDUgYXMgR0EuCiAgICAyLjAuNTMgIDogcmVsZWFzZWQgRmVicnVhcnkgNywgMjAwNSBhcyBHQS4KICAgIDIuMC41MiAgOiByZWxlYXNlZCBTZXB0ZW1iZXIgMjgsIDIwMDQgYXMgR0EuCiAgICAyLjAuNTEgIDogcmVsZWFzZWQgU2VwdGVtYmVyIDE1LCAyMDA0IGFzIEdBLgogICAgMi4wLjUwICA6IHJlbGVhc2VkIEp1bmUgMzAsIDIwMDQgYXMgR0EuCiAgICAyLjAuNDkgIDogcmVsZWFzZWQgTWFyY2ggMTksIDIwMDQgYXMgR0EuCiAgICAyLjAuNDggIDogcmVsZWFzZWQgT2N0b2JlciAyOSwgMjAwMyBhcyBHQS4KICAgIDIuMC40NyAgOiByZWxlYXNlZCBKdWx5IDA5LCAyMDAzIGFzIEdBLgogICAgMi4wLjQ2ICA6IHJlbGVhc2VkIE1heSAyOCwgMjAwMyBhcyBHQS4KICAgIDIuMC40NSAgOiByZWxlYXNlZCBBcHJpbCAxLCAyMDAzIGFzIEdBLgogICAgMi4wLjQ0ICA6IHJlbGVhc2VkIEphbnVhcnkgMjAsIDIwMDMgYXMgR0EuCiAgICAyLjAuNDMgIDogcmVsZWFzZWQgT2N0b2JlciAzLCAyMDAyIGFzIEdBLgogICAgMi4wLjQyICA6IHJlbGVhc2VkIFNlcHRlbWJlciAyNCwgMjAwMiBhcyBHQS4KICAgIDIuMC40MSAgOiByb2xsZWQgU2VwdGVtYmVyIDE2LCAyMDAyLiAgbm90IHJlbGVhc2VkLgogICAgMi4wLjQwICA6IHJlbGVhc2VkIEF1Z3VzdCA5LCAyMDAyIGFzIEdBLgogICAgMi4wLjM5ICA6IHJlbGVhc2VkIEp1bmUgMTcsIDIwMDIgYXMgR0EuCiAgICAyLjAuMzggIDogcm9sbGVkIEp1bmUgMTYsIDIwMDIuICBub3QgcmVsZWFzZWQuCiAgICAyLjAuMzcgIDogcm9sbGVkIEp1bmUgMTEsIDIwMDIuICBub3QgcmVsZWFzZWQuCiAgICAyLjAuMzYgIDogcmVsZWFzZWQgTWF5IDYsIDIwMDIgYXMgR0EuCiAgICAyLjAuMzUgIDogcmVsZWFzZWQgQXByaWwgNSwgMjAwMiBhcyBHQS4KICAgIDIuMC4zNCAgOiB0YWdnZWQgTWFyY2ggMjYsIDIwMDIuCiAgICAyLjAuMzMgIDogdGFnZ2VkIE1hcmNoIDYsIDIwMDIuICBub3QgcmVsZWFzZWQuCiAgICAyLjAuMzIgIDogcmVsZWFzZWQgRmVidXJhcnkgMTYsIDIwMDIgYXMgYmV0YS4KICAgIDIuMC4zMSAgOiByb2xsZWQgRmVidXJhcnkgMSwgMjAwMi4gIG5vdCByZWxlYXNlZC4KICAgIDIuMC4zMCAgOiB0YWdnZWQgSmFudWFyeSA4LCAyMDAyLiAgbm90IHJvbGxlZC4KICAgIDIuMC4yOSAgOiB0YWdnZWQgTm92ZW1iZXIgMjcsIDIwMDEuICBub3Qgcm9sbGVkLgogICAgMi4wLjI4ICA6IHJlbGVhc2VkIE5vdmVtYmVyIDEzLCAyMDAxIGFzIGJldGEuCiAgICAyLjAuMjcgIDogcm9sbGVkIE5vdmVtYmVyIDYsIDIwMDEKICAgIDIuMC4yNiAgOiB0YWdnZWQgT2N0b2JlciAxNiwgMjAwMS4gIG5vdCByb2xsZWQuCiAgICAyLjAuMjUgIDogcm9sbGVkIEF1Z3VzdCAyOSwgMjAwMQogICAgMi4wLjI0ICA6IHJvbGxlZCBBdWd1c3QgMTgsIDIwMDEKICAgIDIuMC4yMyAgOiByb2xsZWQgQXVndXN0IDksIDIwMDEKICAgIDIuMC4yMiAgOiByb2xsZWQgSnVseSAyOSwgMjAwMQogICAgMi4wLjIxICA6IHJvbGxlZCBKdWx5IDIwLCAyMDAxCiAgICAyLjAuMjAgIDogcm9sbGVkIEp1bHkgOCwgMjAwMQogICAgMi4wLjE5ICA6IHJvbGxlZCBKdW5lIDI3LCAyMDAxCiAgICAyLjAuMTggIDogcm9sbGVkIE1heSAxOCwgMjAwMQogICAgMi4wLjE3ICA6IHJvbGxlZCBBcHJpbCAxNywgMjAwMQogICAgMi4wLjE2ICA6IHJvbGxlZCBBcHJpbCA0LCAyMDAxCiAgICAyLjAuMTUgIDogcm9sbGVkIE1hcmNoIDIxLCAyMDAxCiAgICAyLjAuMTQgIDogcm9sbGVkIE1hcmNoIDcsIDIwMDEKICAgIDIuMGE5ICAgOiByZWxlYXNlZCBEZWNlbWJlciAxMiwgMjAwMAogICAgMi4wYTggICA6IHJlbGVhc2VkIE5vdmVtYmVyIDIwLCAyMDAwCiAgICAyLjBhNyAgIDogcmVsZWFzZWQgT2N0b2JlciA4LCAyMDAwCiAgICAyLjBhNiAgIDogcmVsZWFzZWQgQXVndXN0IDE4LCAyMDAwCiAgICAyLjBhNSAgIDogcmVsZWFzZWQgQXVndXN0IDQsIDIwMDAKICAgIDIuMGE0ICAgOiByZWxlYXNlZCBKdW5lIDcsIDIwMDAKICAgIDIuMGEzICAgOiByZWxlYXNlZCBBcHJpbCAyOCwgMjAwMAogICAgMi4wYTIgICA6IHJlbGVhc2VkIE1hcmNoIDMxLCAyMDAwCiAgICAyLjBhMSAgIDogcmVsZWFzZWQgTWFyY2ggMTAsIDIwMDAKCgpDb250cmlidXRvcnMgbG9va2luZyBmb3IgYSBtaXNzaW9uOgoKICAgICogSnVzdCBkbyBhbiBlZ3JlcCBvbiAiVE9ETyIgb3IgIlhYWCIgaW4gdGhlIHNvdXJjZS4KCiAgICAqIFJldmlldyB0aGUgYnVnIGRhdGFiYXNlIGF0OiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvCgogICAgKiBSZXZpZXcgdGhlICJQYXRjaEF2YWlsYWJsZSIgYnVncyBpbiB0aGUgYnVnIGRhdGFiYXNlOgoKICAgICAgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9TkVXJmJ1Z19zdGF0dXM9QVNTSUdORUQmYnVnX3N0YXR1cz1SRU9QRU5FRCZwcm9kdWN0PUFwYWNoZStodHRwZC0yLjAma2V5d29yZHM9UGF0Y2hBdmFpbGFibGUKCiAgICAgIEFmdGVyIHRlc3RpbmcsIHlvdSBjYW4gYXBwZW5kIGEgY29tbWVudCBzYXlpbmcgIlJldmlld2VkIGFuZCB0ZXN0ZWQiLgoKICAgICogT3BlbiBidWdzIGluIHRoZSBidWcgZGF0YWJhc2UuCgoKQ1VSUkVOVCBSRUxFQVNFIE5PVEVTOgoKICAgICogRm9yd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eSBpcyBleHBlY3RlZCBvZiBBcGFjaGUgMi4wLnggcmVsZWFzZXMsIHN1Y2gKICAgICAgdGhhdCBubyBNTU4gbWFqb3IgbnVtYmVyIGNoYW5nZXMgd2lsbCBvY2N1ci4gIFN1Y2ggY2hhbmdlcyBjYW4gb25seSBiZQogICAgICBtYWRlIGluIHRoZSB0cnVuay4KCiAgICAqIEFsbCBjb21taXRzIHRvIGJyYW5jaGVzLzIuMC54IG11c3QgYmUgcmVmbGVjdGVkIGluIFNWTiB0cnVuaywKICAgICAgYXMgd2VsbCwgaWYgdGhleSBhcHBseS4gIExvZ2ljYWwgcHJvZ3Jlc3Npb24gaXMgY29tbWl0IHRvIHRydW5rLAogICAgICBnZXQgZmVlZGJhY2sgYW5kIHZvdGVzIG9uIGxpc3Qgb3IgaW4gU1RBVFVTLCB0aGVuIG1lcmdlIGludG8gCiAgICAgIGJyYW5jaGVzLzIuMi54LCBhbmQgZmluYWxseSBtZXJnZSBpbnRvIGJyYW5jaGVzLzIuMC54LCBhcyBhcHBsaWNhYmxlLgoKClJFTEVBU0UgU0hPV1NUT1BQRVJTOgoKClBBVENIRVMgQUNDRVBURUQgVE8gQkFDS1BPUlQgRlJPTSBUUlVOSzoKICBbIHN0YXJ0IGFsbCBuZXcgcHJvcG9zYWxzIGJlbG93LCB1bmRlciBQQVRDSEVTIFBST1BPU0VELiBdCgoKUEFUQ0hFUyBQUk9QT1NFRCBUTyBCQUNLUE9SVCBGUk9NIFRSVU5LOgogIFsgcGxlYXNlIHBsYWNlIFNWTiByZXZpc2lvbnMgZnJvbSB0cnVuayBoZXJlLCBzbyBpdCBpcyBlYXN5IHRvCiAgICBpZGVudGlmeSBleGFjdGx5IHdoYXQgdGhlIHByb3Bvc2VkIGNoYW5nZXMgYXJlISAgQWRkIGFsbCBuZXcKICAgIHByb3Bvc2FscyB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4gXQoKICAgICopIEJhY2twb3J0IDEwMjg3MDsgUFIgMTcyMTc7IHN0b3AgbGlua2luZyBPcGVuU1NMIC5zbydzIHRvIHN1cHBvcnQvKgogICAgICAgYmluYXJpZXMgKGVzcGVjaWFsbHkgd2hlbiBjb21waWxlZCAtLXdpdGgtc3RhdGljLXN1cHBvcnQgKCEpKSBhbmQKICAgICAgIGZpeCBtb2Rfc3NsLnNvIHRvIGNvbXBpbGUgYWdhaW5zdCAuYSBvcGVuc3NsIGFyY2hpdmVzLgogICAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2k/cmV2PTEwMjg3MCZ2aWV3PXJldgogICAgICAgKzE6IHdyb3dlLCBjb2xtCiAgICAgICAtMTogamltIChkb2VzIG5vdCBjbGVhbmx5IGJhY2twb3J0KQoKClBBVENIRVMgVE8gQkFDS1BPUlQgVEhBVCBBUkUgT04gSE9MRCBPUiBOT1QgR09JTkcgQU5ZV0hFUkUgU09PTjoKCiAgICAqKSBtb2RfaGVhZGVyczogU3VwcG9ydCB7Li4ufXMgdGFnIGZvciBTU0wgdmFyaWFibGUgbG9va3VwLgogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL35qb3J0b24vbW9kX2hlYWRlcnMtMi4wLXNzbC5kaWZmCiAgICAgICArMTogam9ydG9uLCB0cmF3aWNrCiAgICAgICBuZDogdHdvIGNvbW1lbnRzOgogICAgICAgICAoMSkgaXMgdGhlIHVzZSBvZiBBUFJfQVNDSUlfKiBlYmNkaWMtc2FmZT8gSS5lLiBzaG91bGRuJ3Qgd2UgdXNlIHRoZQogICAgICAgICAgICAgbmF0aXZlIGNoYXJzIGhlcmUgYW5kIGl0IHdpbGwgYmUgY29udmVydGVkIGxhdGVyPyAoSSdtIG5vdCBzdXJlKQogICAgICAgam9ydG9uOiBJIGhhdmUgbm8gaWRlYSwgbGV0IGFuIEVCQ0RJQy1lciBjb21wbGFpbiBpZiBpdCBicmVha3M/CiAgICAgICB0cmF3aWNrOiBzZWVtcyB0aGF0ICdccicgYW5kICdcbicgYXJlIHRoZSBiZXR0ZXIgY2hhcnMgdG8gY2hlY2sKICAgICAgICAgICAgICAgIGZvcjsgdGhpcyBpcyBub3QgcmF3IGRhdGEgcmVhZCBmcm9tIHRoZSBuZXR3b3JrIChvciBkaXJlY3RseQogICAgICAgICAgICAgICAgZnJvbSBTU0wpIGJ1dCBpbnN0ZWFkIGl0IGlzIGVpdGhlciBwcm90b2NvbCBkYXRhIHRoYXQgaGFzIAogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmF0aXZlIGNoYXJzZXQgb3IgaXQgaXMgb3RoZXIKICAgICAgICAgICAgICAgIGRhdGEgd2hpY2ggd2FzIGNyZWF0ZWQgaW5zaWRlIHRoZSBzZXJ2ZXIgaW4gdGhlIG5hdGl2ZSBjaGFyc2V0CiAgICAgICAgICgyKSBJJ2QgcHV0IG91dCAobnVsbCkgb25seSBpZiB2YWwgaXMgTlVMTCwgbm90IGlmIGl0J3MgZW1wdHkuCiAgICAgICBqb3J0b246IHNzbF92YXJfbG9va3VwKCkgcmV0dXJucyAiIiBpbiBwbGFjZSBvZiBOVUxMLCB0aGF0IHdhcyByZWFsbHkKICAgICAgICAgIGEgZGVsaWJlcmF0ZSBjaG9pY2UuLi4gYnV0IG1heWJlIHlvdSdyZSByaWdodC4KCgogICAgKikgUHJvdmlkZSBUTFMvU1NMIHVwZ3JhZGUgZnVuY3Rpb25hbGl0eSBpbiBtb2Rfc3NsIGFsbG93aW5nIGFuIHVuc2VjdXJlCiAgICAgICBjb25uZWN0aW9uIHRvIGJlIHVwZ3JhZGVkIHRvIGEgc2VjdXJlIGNvbm5lY3Rpb24gdXBvbiByZXF1ZXN0IGJ5IHRoZQogICAgICAgY2xpZW50LiAgVGhlIGZ1bGwgcGF0Y2ggaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+Ym5pY2hvbGVzLwogICAgICAgYXMgd2VsbCBhcyBhIHRlc3QgY2xpZW50IHRsc3VwZ3JhZGUuYy4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG1haW5seSB1c2VkCiAgICAgICBieSBJUFAgY2xpZW50cyB0b2RheS4KICAgICAgICAgIG1vZHVsZXMvc3NsL21vZF9zc2wuYzogcjEuNzUsIHIxLjk3LCByMS4xMDAKICAgICAgICAgIG1vZHVsZXMvc3NsL21vZF9zc2wuaDogcjEuMTIzCiAgICAgICAgICBtb2R1bGVzL3NzbC9zc2xfZW5naW5lX2NvbmZpZy5jOiByMS43MSwgcjEuOTAKICAgICAgICAgIG1vZHVsZXMvc3NsL3NzbF9lbmdpbmVfaW5pdC5jOiByMS4xMDcsIHIxLjEyNgogICAgICAgICAgbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9pby5jOiByMS4xMDIsIHIxLjEyNAogICAgICAgICAgbW9kdWxlcy9zc2wvc3NsX2VuZ2luZV9rZXJuZWwuYzogcjEuODMsIHIxLjEwNSwgcjEuMTA4CiAgICAgICAgICBtb2R1bGVzL3NzbC9zc2xfdXRpbC5jOiByMS4zNgogICAgICAgICAgbW9kdWxlcy9zc2wvc3NsX3ByaXZhdGUuaDogcjEuMgogICAgICAgKzE6IGJuaWNob2xlcywgd3Jvd2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgLTA6IGplcmVua3JhbnR6IChzaG91bGQgd2FpdCBmb3IgMi4yKQogICAgICAgLTA6IHBxdWVybmEgKDIuMikKICAgICAgIC0wOiBqb3J0b24gKG1zZ2lkIDwyMDA0MDMwNTA4MzU0MC5HQTI0NTI5QHJlZGhhdC5jb20+KQoKCiAgICAqKSBSZXBsYWNlIHNvbWUgb2YgdGhlIG11dGV4IGxvY2tpbmcgaW4gdGhlIHdvcmtlciBNUE0gd2l0aAogICAgICAgYXRvbWljIG9wZXJhdGlvbnMgZm9yIGhpZ2hlciBjb25jdXJyZW5jeS4KICAgICAgICAgc2VydmVyL21wbS93b3JrZXIvZmRxdWV1ZS5jIDEuMjQsIDEuMjUKICAgICAgICsxOiBicmlhbnAsIGlhbmgsIGpqY2xhcgogICAgICAgdHJhd2ljazogRG9lc24ndCB0aGlzIG1ha2UgQXBhY2hlIDIuMC5uZXh0IHNsb3dlciBleGNlcHQKICAgICAgICAgICAgICAgIHdoZW4gdGhlIHJpZ2h0IGF0b21pYyBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUvCiAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZD8gIChEdWUgdG8gdW5kZXItdGhlLWNvdmVycyBtdXRleAogICAgICAgICAgICAgICAgb3BlcmF0aW9ucyB3aGVuIHRoZSBkdW1teSBhdG9taWNzIGFyZSB1c2VkPykKICAgICAgIHBxdWVybmE6IEhhcyBhbnlvbmUgdGVzdGVkIHRoZSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyAKICAgICAgICAgICAgICAgIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zPyBBdCB0aGlzIHBvaW50IEkgd291bGQgCiAgICAgICAgICAgICAgICBmYXZvdXIgd2FpdGluZyBmb3IgMi4yLgogICAgICAgLTA6IHN0b2RkYXJkIChhdCBsZWFzdCB1bnRpbCB0aGUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIGFyZSBjbGFyaWZpZWQpCgogICAgKikgQWxsb3cgbW9kX2RhdiB0byBkbyB3ZWFrIGVudGl0eSBjb21wYXJpc29uIGZ1bmN0aW9ucy4KICAgICAgIG1vZHVsZXMvZGF2L21haW4vdXRpbC5jOiByMS40NQogICAgICAgWyBUaGlzIG9uZSBpcyB1bmRlciByZXZpZXcuICBEb24ndCBtZXJnZS4gIF0KICAgICAgICsxOgoKICAgICopIG1vZF9uZWdvdGlhdGlvbjogcGFyc2UgcXVhbGl0eSB2YWx1ZXMgaW5kZXBlbmRlbnQgZnJvbQogICAgICAgdGhlIGN1cnJlbnQgbG9jYWxlIGFuZCBsZXZlbCB2YWx1ZXMgYXMgaW50ZWdlcnMuIFBSIDE3NTY0LgogICAgICAgKGVzc2VudGlhbGx5OiBnZXQgYSByaWQgb2YgYXRvZigpKSAoMi4wICsgMS4zKQogICAgICAgbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5jOiByMS4xMTQKICAgICAgICsxOiBuZAogICAgICAgICBXZSBuZWVkIHRvIGRlY2lkZSB3aGF0IGhhcHBlbnMgd2l0aCB1bnBhcnNhYmxlIHF2YWx1ZXMuIFJGQyAyNjE2CiAgICAgICAgIHN0YXRlcyB0aGF0IHEgZGVmYXVsdHMgdG8gMS4gKHNlZSAxNC4xIC0gMTQuNCkuIFNvIHNob3VsZCB3cm9uZwogICAgICAgICBxdmFsdWVzIGJlIHJldHVybmVkIGFzIDEuMCBvciAwLjAgKGFzIGF0b2YoKSBkaWQpPwogICAgICAgICAxLjA6IG5kCiAgICAgICAgIDAuMDogamltIChhIGRlZmF1bHQgIT0gYW4gImVycm9yZWQiIHZhbHVlKQoKICAgICopIEtlZXAgdGhlIHNhbWUgU1NMTXV0ZXggZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcGFyZW50IHByb2Nlc3MKICAgICAgIChpbnN0ZWFkIG9mIGhhdmluZyBjaGlsZHJlbiB1c2luZyBkaWZmZXJlbnQgbXV0ZXhlcyBhbmQgZmFpbGluZwogICAgICAgdG8gbG9jayB0aGUgc2Vzc2lvbiBjYWNoZSBhY3Jvc3MgcmVzdGFydHMuKQogICAgICAgTmV3IHBhdGNoIGZvcnRoY29taW5nIC0gSmltSmFnJ3MgY2hhbmdlcyBtYWtlIHRoZSBtZXJnZSB1Z2x5LgogICAgICAgKzE6IHdyb3dlCiAgICAgICArMSAoY29uY2VwdCk6IGppbSAoZmluYWwgdm90ZSB3aGVuIHRoZSBwYXRjaCBpcyBhdmFpbGFibGUpCgogICAgKikgRml4IHRoZSBTU0xNdXRleCBjb25maWcgcGFyc2VyIHNvIHRoYXQgYWxsICdtZWNoYW5pc21zJyBjYW4gdGFrZQogICAgICAgYSBmaWxlbmFtZSwgZXZlbiBpZiBpZ25vcmVkLCBhbmQgdGhleSBhcmUgcm9vdGVkIHRvIHRoZSBmdWxsIHBhdGgKICAgICAgIHRvIHRoZSBzZXJ2ZXIgKGV4Y2VwdCBmb3IgcG9zaXhzZW0gbG9ja3MpLiAgVGhpcyBhbGxvd3MgYSB2ZXJ5CiAgICAgICBjcm9zcy1wbGF0Zm9ybSBkZWZhdWx0OmxvZ3Mvc3NsX211dGV4IHRvIGJlIHVzZWQgZXZlcnl3aGVyZS4gIEFsc28KICAgICAgIGVsaW1pbmF0ZXMgdGhlICcucGlkJyBzdWZmaXggc28gdGhhdCB0aGUgbmFtZSBnaXZlbiBpcyB0aGUgbmFtZS4KICAgICAgIEFsbG93cyBXaW4zMiBhbmQgb3RoZXIgbm9uLXVuaWNpZXMgdG8gdXNlIG5hbWVkIGxvY2tzLgogICAgICAgTmV3IHBhdGNoIGZvcnRoY29taW5nIC0gSmltSmFnJ3MgY2hhbmdlcyBtYWtlIHRoZSBtZXJnZSB1Z2x5LgogICAgICAgKzE6IHdyb3dlCiAgICAgICArMSAoY29uY2VwdCk6IGppbSAoZmluYWwgdm90ZSB3aGVuIHRoZSBwYXRjaCBpcyBhdmFpbGFibGUpCgogICAgKikgbW9kX3NzbDogRHJvcCBTU0xfRVhQRVJJTUVOVEFMX0VOR0lORSB0ZXN0IGluIGZhdm9yIG9mIHRlc3RpbmcgZm9yIHRoZQogICAgICAgRU5HSU5FX2luaXQoKSBmdW5jdGlvbiBpbiBjb25maWcubTQsIGFuZCB1c2UgSEFWRV9FTkdJTkVfSU5JVCBpbnN0ZWFkLgogICAgICAgd3Jvd2Ugbm90ZXMgdGhhdCB0aGlzIGZlYXR1cmUgaXMgYSBub29wIHVudGlsIGNvbmZpZ3VyZWQgd2l0aCBTU0xFbmdpbmUuCiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvfndyb3dlL2hhdmVfZW5naW5lX2luaXQucGF0Y2ggZm9yIGEgY2xlYW4gMi4wIHBhdGNoLgogICAgICAgbW9kdWxlcy9zc2wvUkVBRE1FIDEuNDAKICAgICAgIG1vZHVsZXMvc3NsL2NvbmZpZy5tNCAxLjE0CiAgICAgICBtb2R1bGVzL3NzbC9tb2Rfc3NsLmMgMS43OQogICAgICAgbW9kdWxlcy9zc2wvbW9kX3NzbC5oIDEuMTM1CiAgICAgICBtb2R1bGVzL3NzbC9zc2xfZW5naW5lX2NvbmZpZy5jIDEuNzgKICAgICAgIG1vZHVsZXMvc3NsL3NzbF9lbmdpbmVfaW5pdC5jIDEuMTEzCiAgICAgICBtb2R1bGVzL3NzbC9zc2xfdG9vbGtpdF9jb21wYXQuYyAxLjMzCiAgICAgICArMDogd3Jvd2Uge1BlbmRpbmcgcmVzZWFyY2ggaW50byBob3cgdG8gZ2V0IEFDIHRvIHVzZSAtbHNvY2tldHMgZXQuIGFsLiwKICAgICAgICAgICAgICAgICAgc2hvd3MgYnJlYWthZ2Ugb24gU29sYXJpcyB3aGljaCBjYW4ndCAtbGNyeXB0byAtbHNzbCB3aXRob3V0CiAgICAgICAgICAgICAgICAgIHRoZSBleHRyYSBwa2djb25maWcvb3BlbnNzbC5wYyBMaWJzOiAqIGZvbyB9CgogICAgKikgbW9kX3NzbDogZml4IGEgbGluayBmYWlsdXJlIHdoZW4gdGhlIG9wZW5zc2wtZW5naW5lIGxpYnJhcmllcyBhcmUKICAgICAgIHByZXNlbnQgYnV0IHRoZSBlbmdpbmUgaGVhZGVycyBhcmUgbWlzc2luZy4KICAgICAgICAgbW9kdWxlcy9zc2wvbW9kX3NzbC5jOiByMS44NwogICAgICAgICBtb2R1bGVzL3NzbC9tb2Rfc3NsLmg6IHIxLjEzOQogICAgICAgICBtb2R1bGVzL3NzbC9zc2xfZW5naW5lX2NvbmZpZy5jOiByMS44MgogICAgICAgUFJFUkVROiBCbG93IGF3YXkgb2YgU1NMX0VYUEVSSU1FTlRBTF9FTkdJTkUgKHNlZSBhYm92ZSkKICAgICAgICsxOiBqd29vbGxleSwgdHJhd2ljaywgamltLCBqZXJlbmtyYW50egoKICAgICopIFdoZW4gVXNlQ2Fub25pY2FsTmFtZSBpcyBzZXQgdG8gT0ZGLCBhbGxvdyBhcF9nZXRfc2VydmVyX3BvcnQgdG8gCiAgICAgICBjaGVjayByLT5jb25uZWN0aW9uLT5sb2NhbF9hZGRyLT5wb3J0IGJlZm9yZSBkZWZhdWx0aW5nIHRvIAogICAgICAgc2VydmVyLT5wb3J0IG9yIGFwX2RlZmF1bHRfcG9ydCgpCiAgICAgICAgIHNlcnZlci9jb3JlLmMgcjEuMjQ3CiAgICAgICArMTogYm5pY2hvbGVzLCBqaW0sIHdyb3dlCiAgICAgICAwOiBuZCwgamVyZW5rcmFudHoKICAgICAgICAgIG5kOiBjYW4gdGhlIGxvY2FsX2FkZHItPnBvcnQgZXZlciBiZSAwPwoJICBibmljaG9sZXMgcmVzcG9uc2U6IEkgY291bGRuJ3QgdGVsbCB5b3UgZm9yIHN1cmUgaWYgbG9jYWxfYWRkci0+cG9ydAoJICAgIGNvdWxkIGJlIDAuICBCdXQgaXQgbWFrZXMgc2Vuc2UgdGhhdCBpZiBpdCB3ZXJlIHRoZW4gQXBhY2hlIAoJICAgIHdvdWxkbid0IGJlIGxpc3RlbmluZyBvbiBhbnkgcG9ydCBzbyBpdCB3b3VsZG4ndCBtYXR0ZXIgYW55d2F5LgogICAgICAgICAgbmQgcmVwbGllczogQnV0IGlmIGl0IGNhbid0IGJlIDAgdGhlIGFsdGVybmF0aXZlcyB0aGVyZWFmdGVyIG1ha2Ugbm8KICAgICAgICAgICAgc2Vuc2UgYW55bW9yZSwgcmlnaHQ/CgkgIGppbSBwcm9wb3NlczogVXNlQ2Fub25pY2FsTmFtZSBDbGllbnQgZGlyZWN0aXZlCgkgICAgd2hpY2ggaW1wbGVtZW50cyB0aGlzLCBrZWVwaW5nIFVzZUNhbm9uaWNhbE5hbWUgT2ZmCiAJICAgICJhcyBpcyIuCgogICAgKikgVGhyZWFkU3RhY2tTaXplIGZvciBXaW4zMiBhbmQgdGhyZWFkZWQgTVBNcwogICAgICAgdHJhd2ljayB3aWxsIGV2ZW50dWFsbHkgcHV0IHRvZ2V0aGVyIGEgcGF0Y2ggZm9yIGh0dHBkIDIuMC5uZXh0CiAgICAgICArMSBjb25jZXB0OiB0cmF3aWNrLCBuZCwgc3RvZGRhcmQsIHdyb3dlCiAgICAgIAogICAgKikgZG9uJ3QgcHJvcGFnYXRlIGlucHV0IGhlYWRlcnMgZGVzY3JpYmluZyBhIGJvZHkgdG8gYSBHRVQgc3VicmVxdWVzdAogICAgICAgd2l0aCBubyBib2R5CiAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cz92aWV3PXJldiZyZXY9MTU4Nzk4CiAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cz92aWV3PXJldiZyZXY9MTU5NDEwCiAgICAgICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cz92aWV3PXJldiZyZXY9MTYwNTczCiAgICAgICArMTogZ3JlZ2FtZXMsIHdyb3dlIChwcm92aWRlZCB0aGlzIGlzIGFwcGxpZWQgdG8gQUxMIHN1YnJlcSB0eXBlcyEpCiAgICAgICAtMTogamVyZW5rcmFudHogKHJlYWRfbGVuZ3RoIGlzbid0IGEgc3VmZmljaWVudCBjaGVjayB0byBzZWUgaWYgYSBib2R5CiAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpbiB0aGUgcmVxdWVzdDsgcHJlc2VuY2Ugb2YgVC1FIGFuZCBDLUwgaW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGVhZGVycyBpcyB0aGUgY29ycmVjdCBmbGFnLikKICAgICAgICAgICBncmVnYW1lczogYWRkcmVzc2VkIGplcmVua3JhbnR6JyBvYmplY3Rpb24gaW4gcmV2IDE2MDU3MwogICAgICAgICAgIHdyb3dlOiB0aGlzIGhhcyBhIG5lZ2F0aXZlIGltcGFjdCBvbiBtb2R1bGVzIHdobyB3aXNoIHRvICdpbnNwZWN0JwogICAgICAgICAgICAgdGhlIGhlYWRlcnMsIGUuZy4gYW4geG1sIHRyYW5zZm9ybWF0aW9uIGFmZmVjdGVkIGJ5IHRoZSBxdWVyeQogICAgICAgICAgICAgc3RyaW5nIG9yIHJlcXVlc3QgUE9TVCBhcmdzLiAgVGhlIHJpZ2h0IHNvbHV0aW9uIGlzIGFkb3B0IGFwcmVxLAogICAgICAgICAgICAgcHJvdmlkaW5nIGFuIEFQSSBmb3IgZmlsdGVycyB0byBwYXJ0aWNpcGF0ZSBpbiBQT1NUIGJvZGllcy4KICAgICAgICAgICBncmVnYW1lczogdGhpcyBkb2VzIG5vdCBhZmZlY3QgUE9TVHMuICB0aGUgYWZmZWN0ZWQgZnVuY3Rpb24gaGVscHMKICAgICAgICAgICAgIGNyZWF0ZSBhIEdFVCBzdWJyZXF1ZXN0IHdpdGggbm8gYm9keSBhbmQgaXMgdW5wcmVwYXJlZCB0byBkZWFsIHdpdGgKICAgICAgICAgICAgIHN1YnJlcXVlc3QgYm9kaWVzLiAgYW55IG1vZHVsZXMgb3IgYXBwbGljYXRpb25zIHdpc2hpbmcgdG8KICAgICAgICAgICAgIGluc3BlY3QgaGVhZGVycyB3aWxsIGluIGZhY3Qgd29yayBiZXR0ZXIgYmVjYXVzZSB0aGUgaGVhZGVycyB3aWxsCiAgICAgICAgICAgICByZWZsZWN0IHJlYWxpdHkuCiAgICAgICAgICAgd3Jvd2U6IEkndmUgcmVjb25zaWRlcmVkIC0gdGhlIHNpbXBsZSBmYWN0IGlzIHRoYXQgc3VicmVxdWVzdHMKICAgICAgICAgICAgIGRvbid0IGhhdmUgYSBnb29kIG1lY2hhbmlzbSB0byAnc2hhcmUnIHRoZSBpbnB1dCBib2R5IHdpdGggdGhlCiAgICAgICAgICAgICBtYWluIHJlcXVlc3QsIGFuZCBpdCdzIGdvdHRhIGJlIHVwIHRvIHRoZSBtYWluIHJlcXVlc3QgdG8gaGFuZGxlCiAgICAgICAgICAgICB0aGUgaW5wdXQgYm9keS4gIElmIHRoZSBtb2R1bGUgd2FudHMgdG8gdXNlIGFwcmVxLXByb3ZpZGVkIGRhdGEsCiAgICAgICAgICAgICB0aGVuIGl0J3MgZ29pbmcgdG8gaGF2ZSB0byBhc2sgYXByZXEgZm9yIHRoZSBkYXRhIGluc3RlYWQgb2YKICAgICAgICAgICAgIGxvb2tpbmcgYXQgdGhlIGhlYWRlcnMuICBGb3IgdGhhdCBtYXR0ZXIsIHdoeSBhcmUgc3VicmVxJ3MgZXZlbgogICAgICAgICAgICAgcHJvcG9nYXRpbmcgUE9TVCBvciBvdGhlciBub24tR0VUIHR5cGVzPyAgSXQgc2VlbXMgdGhhdCBhbG1vc3QKICAgICAgICAgICAgIGFueSBzdWJyZXEgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBHRVQgaW4gMi4wLgoKICAgICopIFJldmVyc2UgUHJveHkgZml4ZXM6IDxMb2NhdGlvbj4gYnVnIGFuZCBDb29raWUgc3VwcG9ydAogICAgICAgIFBhdGNoIGlzIGF0CiAgICAgICAgaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL35jb2xtL2h0dHBkLTIuMC1yZXZlcnNlLXByb3h5LWNvb2tpZS5wYXRjaAogICAgICAgIGFuZCBpcyBpbiBwcm9kdWN0aW9uIHdpdGggQ2xpZW50cy4KICAgICAgICsxOiBuaXEsIHdyb3dlCiAgICAgICAgIHdyb3dlIGFkZHM7IGxvb2tzIGdvb2QsIG5vIHdheSB0byBhcHBseSB0aGlzIHdpdGhvdXQgYSBtaW5vciBidW1wCgpDVVJSRU5UIFZPVEVTOgoKICAgICopIGh0dHBkLXN0ZC5jb25mIGFuZCBmcmllbmRzOwoKICAgICAgYSkgaHR0cGQtc3RkLmNvbmYgc2hvdWxkIGJlIHRhaWxvcmVkIGJ5IGluc3RhbGwgKGZyb20gc3JjIG9yCiAgICAgICAgIGJpbmJ1aWxkKSBldmVuIGlmIHVzZXIgaGFzIGV4aXN0aW5nIGh0dHBkLmNvbmYKICAgICAgICAgKzE6ICAgdHJhd2ljaywgc2xpdmUsIGdyZWdhbWVzLCBpYW5oLCBLZW4sIHdyb3dlLCBqd29vbGxleSwgamltLCBuZCwKICAgICAgICAgICAgICAgZXJpa2FiZWxlCiAgICAgICAgICAgd3Jvd2UgLSBwcmVmZXIgaHR0cGQuZGVmYXVsdC5jb25mIHRvIGF2b2lkIGFtYmlndWl0eSB3aXRoIGN2cywKICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCB3aW4zMiBpbnN0YWxsZXIgY3JlYXRlcyBqdXN0IHRoYXQgZmlsZQogICAgICAgICAgICAgICAgICAgKC5kZWZhdWx0LmNvbmYgcmF0aGVyIHRoYW4gLmNvbmYuZGVmYXVsdCBzbyB0aGF0IHdpbjMyCiAgICAgICAgICAgICAgICAgICAgY2FuIHJlY29nbml6ZSAuY29uZiBmaWxlcyBhcyB0ZXh0IGNvbmZpZ3VyYXRpb24gZmlsZXMuKQoKICAgICAgYykgdGFpbG9yZWQgaHR0cGQtc3RkLmNvbmYgc2hvdWxkIGJlIGluc3RhbGxlZCB0bwogICAgICAgICBzeXNjb25mZGlyL2V4YW1wbGVzIG9yIG1hbnVhbGRpci9leGFtcGxlY29uZi8KICAgICAgICAgKzE6ICAgc2xpdmUsIHRyYXdpY2ssIEtlbiwgbmQgKHByZWZlciB0aGUgbGF0dGVyKSwgZXJpa2FiZWxlCgogICAgKikgSWYgdGhlIHBhcmVudCBwcm9jZXNzIGRpZXMsIHNob3VsZCB0aGUgcmVtYWluaW5nIGNoaWxkIHByb2Nlc3NlcwogICAgICAgImdyYWNlZnVsbHkiIHNlbGYtdGVybWluYXRlLiBPciBtYXliZSB3ZSBzaG91bGQgbWFrZSBpdCBhIHJ1bnRpbWUKICAgICAgIG9wdGlvbiwgb3IgaGF2ZSBhIGNvbmNlcHQgb2YgMiBwYXJlbnQgcHJvY2Vzc2VzIChvbmUgYmVpbmcgYSAKICAgICAgICJob3Qgc3BhcmUiKS4KICAgICAgIFNlZTogTWVzc2FnZS1JRDogPDNDNTgyMzJDLkZFOTFGMTlGQEdvbHV4LkNvbT4KCiAgICAgICBTZWxmLWRlc3RydWN0OiBLZW4sIE1hcnRpbgogICAgICAgTm90IHNlbGYtZGVzdHJ1Y3Q6IEJyaWFuUCwgSWFuLCBDbGlmZiwgQmlsbFMKICAgICAgIE1ha2UgaXQgcnVudGltZSBjb25maWd1cmFibGU6IEFhcm9uLCBKdXN0aW4sIHdyb3dlLCByZWRlcnBqLCBqaW0sIG5kCgogICAgICAgLyogVGhlIGJlbG93IHdhcyBhIGNvbmNlcHQgb24gKmhvdyogdG8gaGFuZGxlIHRoZSBwcm9ibGVtICovCiAgICAgICBIYXZlIDIgcGFyZW50czogKzE6IGppbQogICAgICAgICAgICAgICAgICAgICAgIC0xOiBKdXN0aW4sIHdyb3dlLCByZWRlcnBqLCBuZAogICAgICAgICAgICAgICAgICAgICAgICswOiBNYXJ0aW4gKHdoaWxlIHN0YW5kaW5nIGJ5LCBjb3VsZCBpdCBkbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIHVzZWZ1bD8pCgogICAgKikgTWFrZSB0aGUgd29ya2VyIE1QTSB0aGUgZGVmYXVsdCBNUE0gZm9yIHRocmVhZGVkIFVuaXggYm94ZXMuCiAgICAgICArMTogICBKdXN0aW4sIElhbiwgQ2xpZmYsIEJpbGxTLCBzdHJpa2VyCiAgICAgICArMDogICBCcmlhblAsIEFhcm9uIChtdXRleCBjb250ZW50aW9uIGlzIGxvb2tpbmcgYmV0dGVyIHdpdGggdGhlCiAgICAgICAgICAgICBsYXRlc3QgY29kZSwgbGV0J3MgY29udGludWUgdHVuaW5nIGFuZCB0ZXN0aW5nKSwgcmVkZXJwaiwgamltCiAgICAgICAtMDogICBMYXJzLCB3cm93ZSAobGV0J3MgbWFrZSB0aGlzIGRlZmFjdG8gZm9yIHRoZSAyLjIgcmVsZWFzZS4pLAogICAgICAgICAgICAgbmQgKGZvciAyLjApCgoKUkVMRUFTRSBOT04tU0hPV1NUT1BQRVJTIEJVVCBXT1VMRCBCRSBSRUFMIE5JQ0UgVE8gV1JBUCBUSEVTRSBVUDoKCiAgICAqIFRoZXJlIGlzIGEgYnVnIGluIGhvdyB3ZSBzb3J0IHNvbWUgaG9va3MsIGF0IGxlYXN0IHRoZSBwcmUtY29uZmlnCiAgICAgIGhvb2suICBUaGUgZmlyc3QgdGltZSB3ZSBjYWxsIHRoZSBob29rcywgdGhleSBhcmUgaW4gdGhlIGNvcnJlY3QgCiAgICAgIG9yZGVyLCBidXQgdGhlIHNlY29uZCB0aW1lLCB3ZSBkb24ndCBzb3J0IHRoZW0gY29ycmVjdGx5LiAgQ3VycmVudGx5LAogICAgICB0aGUgbW9kdWxlcy9odHRwL2NvbmZpZy5tNCBmaWxlIGhhcyBiZWVuIHJlbmFtZWQgdG8gCiAgICAgIG1vZHVsZXMvaHR0cC9jb25maWcyLm00IHRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbSwgaXQgc2hvdWxkIG1vdmVkCiAgICAgIGJhY2sgd2hlbiB0aGlzIGlzIGZpeGVkLgoKICAgICAgICBPdGhlckJpbGwgb2ZmZXJzIHRoYXQgdGhpcyBpcyBhIFNFUklPVVMgcHJvYmxlbS4gIFdlIGRvIG5vdCBzb3J0CiAgICAgICAgY29ycmVjdGx5IGJ5IHRoZSBvcmRlcmluZyBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSByZWdpc3RlciBob29rCiAgICAgICAgZnVuY3Rpb25zLiAgVGhpcyB3YXMgcHJvdmVuIHdoZW4gSSByZW9yZGVyZWQgdGhlIG9wZW5fbG9ncyBob29rCiAgICAgICAgdG8gYXR0ZW1wdCB0byBvcGVuIHRoZSBlcnJvciBsb2dzIHByaW9yIHRvIHRoZSBhY2Nlc3MgbG9ncy4gIFBvc3NpYmx5CiAgICAgICAgdGhlIGVudGlyZSBzb3J0aW5nIGNvZGUgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZC4KCiAgICAqIHBpcGVzIGRlYWRsb2NrIG9uIGFsbCBwbGF0Zm9ybXMgd2l0aCBsaW1pdGVkIHBpcGUgYnVmZmVycyAoZS5nLiBib3RoCiAgICAgIExpbnV4IGFuZCBXaW4zMiwgYXMgb3Bwb3NlZCB0byBvbmx5IFdpbjMyIG9uIDEuMykuICBUaGUgcmlnaHQgc29sdXRpb24KICAgICAgaXMgZWl0aGVyIEdTdGVpbidzIHByb3Bvc2FsIGZvciBhICJDR0kgQnJpZ2FkZSIsIG9yIE90aGVyQmlsbCdzIHByb3Bvc2FsCiAgICAgIGZvciAiUG9sbCBCdWNrZXRzIiBmb3IgIlBvbGxpbmcgRmlsdGVyIENoYWlucyIuICBPciBwZXJoYXBzIGJvdGggOi0pCgogICAgKiBBbGwgaGFuZGxlcnMgc2hvdWxkIGFsd2F5cyBzZW5kIGNvbnRlbnQgZG93biBldmVuIGlmIHItPmhlYWRlcl9vbmx5CiAgICAgIGlzIHNldC4gIElmIG5vdCwgaXQgbWVhbnMgdGhhdCB0aGUgSEVBRCByZXF1ZXN0cyBkb24ndCBnZW5lcmF0ZSB0aGUKICAgICAgc2FtZSBoZWFkZXJzIGFzIGEgR0VUIHdoaWNoIGlzIHdyb25nLgoKICAgICogSFAvVVggMTAuMjA6IGNvbXBpbGUgYnJlYWthZ2UgaW4gQVBSLiAgTG9va3MgbGlrZSBpdCBzaG91bGQgYmUgZWFzeQogICAgICB0byBmaXgsIHByb2JhYmx5IGp1c3Qgc29tZSBleHRyYW5lb3VzICNpbmNsdWRlJ3MgdGhhdCBhcmUgZm91bGluZwogICAgICB0aGluZ3MgdXAuCiAgICAgIFBSOiA5NDU3CiAgICAgIEplZmY6IFNlZSBteSByZXBseSBhbmQgcGF0Y2ggaW4gdGhlIFBSIChhbmQgcHJldmlvdXMgY29tbWl0IHRvCiAgICAgIHN0b3AgdXNpbmcgInBpcGUiIGFzIGEgZmllbGQgbmFtZSkuICBJZiBwYXRjaCBpcyBjb21taXR0ZWQsIHdlCiAgICAgIHNob3VsZCBiZSBva2F5LiAgSSdsbCB3YWl0IHRvIHNlZSBpZiB0aGUgdXNlciB0ZXN0cyB0aGUgcGF0Y2guCiAgICAgIFVwZGF0ZSBieSBKZWZmIDIwMDIwNzIyOiBJIGdvdCBhbiBhY2NvdW50IG9uIEhQIDEwLjIwLiAgSXQgbG9va3MKICAgICAgbGlrZSBzb21lIG9mIHRoZSBBUFIgdGhyZWFkIGRldGVjdGlvbiBpcyBzY3Jld2VkIHVwLiAgSWYgd2UgZmluZAogICAgICBwdGhyZWFkLmggYnV0IHdlIGNhbid0IGNvbXBpbGUgdGhlIHB0aHJlYWQgdGVzdCBwcm9ncmFtIHdlIHN0aWxsCiAgICAgIHRoaW5rIHdlIGNhbiB1c2UgdGhyZWFkcy4gIEZvciB0aGF0IHJlYXNvbiwgdGhlIHBhdGNoIEkgcG9zdGVkCiAgICAgIHRvIHRoZSBQUiB3b24ndCB3b3JrIGFzLWlzIHNpbmNlIGEgZmFpbGVkIGNvbXBpbGUgb2YgdGhlIHRlc3QKICAgICAgcHJvZ3JhbSBtZWFucyBub3RoaW5nLgoKICAgICogZXhlYyBjbWQgYW5kIHN1ZXhlYyBhcmctcGFzc2luZyBlbmhhbmNlbWVudHMKICAgICAgU3RhdHVzOiBQYXRjaGVzIHByb3Bvc2VkCiAgICAgIE1lc3NhZ2UtSUQ6IDwyMDAyMDUyNjA0MTc0OC5BMjkxNDhAcHJvZGlneS5SZWRicmljay5EQ1UuSUU+CiAgICAgIChzZWUgdGhlICJwcm9jLnBhdGNoIiBhbmQgInN1ZXhlYy1zaGVsbC5wYXRjaCIgbGlua3MgaW4gdGhpcyBtZXNzYWdlKQoKICAgICogVGhlIDIuMC4zNiB3b3JrZXIgTVBNIGdyYWNlbGVzcyBzaHV0ZG93biBjaGFuZ2VzIHdvcmsgYnV0IGFyZQogICAgICBhIGJpdCBjbHVua3kgb24gc29tZSBwbGF0Zm9ybXM7IGVnLCBvbiBMaW51eCwgdGhlIGxvb3AgdG8KICAgICAgam9pbiBlYWNoIHdvcmtlciB0aHJlYWQgc2VlbXMgdG8gaGFuZywgYW5kIHRoZSBwYXJlbnQgZW5kcyB1cAogICAgICBraWxsaW5nIG9mZiB0aGUgY2hpbGQgd2l0aCBTSUdLSUxMLiAgQnV0IGF0IGxlYXN0IGl0IHNodXRzIGRvd24uCgogICAgKiAtLWVuYWJsZS1tb2RzLXNoYXJlZD0iZm9vMSBmb28yIiBpcyBidXN0ZWQgb24gRGFyd2luLiAgUGllcgogICAgICAgIHBvc3RlZCBhIHBhdGNoIChNZXNzYWdlLUlEOiA8QjhEQkJFOEQuNTc1QSVwaWVyQGJldGF2ZXJzaW9uLm9yZz4pLgoKICAgICogV2UgZG8gbm90IHByb3Blcmx5IHN1YnN0aXR1dGUgdGhlIHByZWZpeC12YXJpYWJsZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KICAgICAgc2NyaXB0cyBvciBnZW5lcmF0ZWQtY29uZmlncy4gIChpLmUuIGlmIHN5c2NvbmZkaXIgaXMgZXRjLAogICAgICBodHRwZC1zdGQuY29uZiBwb2ludHMgdG8gY29uZi4pCgogICAgKiBJZiBhbnkgcmVxdWVzdCBnZXRzIHRocm91Z2ggYXBfcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKCkgYW5kIGlzCiAgICAgIHNjaGVkdWxlZCB0byBiZSBzZXJ2ZWQgYnkgdGhlIGNvcmUgaGFuZGxlciwgd2l0aG91dCBhIGZsYWcgdGhhdCB0aGlzIAogICAgICByLT5maWxlbmFtZSB3YXMgdGVzdGVkIGJ5IGRpci9maWxlX3dhbGssIHdlIG5lZWQgdG8gNTAwIGF0IHRoZSB2ZXJ5IAogICAgICBlbmQgb2YgdGhlIGFwX3Byb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbCgpIHByb2Nlc3Npbmcgc28gc3ViX3JlcS1lc3RlcnMKICAgICAga25vdyB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIHJ1bi4gIFRoaXMgcHJvdmlkZXMgYXV0aG9ycyBvZiBvbGRlciAKICAgICAgbW9kdWxlcyBiZXR0ZXIgY29tcGF0aWJpbGl0eSwgd2hpbGUgc3RpbGwgaW1wcm92aW5nIHRoZSBzZWN1cml0eSBhbmQgCiAgICAgIHJvYnVzdG5lc3Mgb2YgMi4wLiAKCiAgICAgICAgU3RhdHVzOiBzdGlsbCBuZWVkIHRvIGRlY2lkZSB3aGVyZSB0aGlzIGdvZXMsIE90aGVyQmlsbCBjb21tZW50cy4uLgogICAgICAgIE1lc3NhZ2UtSUQ6IDwwNjU3MDFjMTQ1MjYkNDk1MjAzYjAkOTZjMGIwZDBAcm93ZWNsYW4ubmV0PgogICAgICAgIFtEZWxldGVkIGNvbW1lbnRzIHJlZ2FyZGluZyB0aGUgYXBfcnVuX2hhbmRsZXIgcGhhc2UsIGFzIGlycmVsZXZhbnQKICAgICAgICAgICAgYXMgQmlsbFMgcG9pbnRzIG91dCB0aGF0ICJjb21tb24gY2FzZSB3aWxsIGJlIGNhdWdodCBpbgogIAkgICAgZGVmYXVsdF9oYW5kbGVyIGFscmVhZHkgKHdpdGggdGhlIHItPmZpbmZvLmZpbGV0eXBlID09IDAgY2hlY2spIgogICAgICAgICAgICBhbmQgdGhlIGlzc3VlIGlzIGRldGVjdGluZyB0aGlzIC1iZWZvcmUtIHdlIHRyeSB0byBydW4gdGhlIHJlcS5dCgoJZ3JlZ2FtZXMgc2F5czogY2FuIHRoaXMgaGFwcGVuIHNvbWVob3cgd2l0aG91dCBhIGJyb2tlbiBtb2R1bGUKICAgICAgICAgICAgYmVpbmcgaW52b2x2ZWQ/ICBJZiBub3QsIHdoeSB3YXN0ZSBjeWNsZXMgdHJ5aW5nIHRvIGRlZmVuZCBhZ2FpbnN0CiAgICAgICAgICAgIHBvdGVudGlhbCBicm9rZW4gbW9kdWxlcz8gIEl0IHNlZW1zIGZ1dGlsZS4KICAgICAgICB3cm93ZSBjb3VudGVyczogbm8sIGl0IHNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIHRoZSBtb2R1bGUgaXMgYnJva2VuLgogICAgICAgICAgICBCdXQgdGhlIHJpZ2h0IGFuc3dlciBpcyB0byBmYWlsIHRoZSByZXF1ZXN0IHVwLWZyb250IGluIGRpci9maWxlCiAgICAgICAgICAgIHdhbGsgaWYgdGhlIHBhdGggd2FzIGVudGlyZWx5IGludmFsaWQ7IGFuZCB3ZSBjYW4ndCBkbyB0aGF0IGVpdGhlcgogICAgICAgICAgICBVTlRJTCAyLjEgb3Igd2UgYnJlYWsgbW9kdWxlcyB0aGF0IGhhdmVuJ3QgaG9va2VkIG1hcF90b19zdG9yYWdlLgoKICAgICogV2l0aCBBUF9NT0RFX0VYSEFVU1RJVkUgaW4gdGhlIGNvcmUsIGl0IGlzIGZpbmFsbHkgY2xlYXIgdG8gbWUKICAgICAgaG93IHRoZSBQZXJjaGlsZCBNUE0gc2hvdWxkIGJlIHJlLXdyaXR0ZW4uICBJdCBoYXNuJ3Qgd29ya2VkCiAgICAgIGNvcnJlY3RseSBzaW5jZSBmaWx0ZXJzIHdlcmUgYWRkZWQgYmVjYXVzZSBpdCB3YXNuJ3QgcG9zc2libGUgdG8KICAgICAgZ2V0IHRoZSBjb250ZW50IHRoYXQgaGFkIGFscmVhZHkgYmVlbiB3cml0dGVuIGFuZCB0aGUgc29ja2V0IGF0CiAgICAgIHRoZSBzYW1lIHRpbWUuICBUaGlzIG1vZGUgbGV0cyB1cyBkbyB0aGF0LCBzbyB0aGUgTVBNIGNhbiBiZQogICAgICBmaXhlZC4KCiAgICAqIGh0cGFzc3dkIGJsaW5kbHkgcHJvY2Vzc2VzIHRoZSBmaWxlIHlvdSBnaXZlIGl0LCBhbmQgZG9lcyBubwogICAgICBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIHRvdGFsbHkgY29ycnVwdGluZyB3aGF0ZXZlciBmaWxlIGl0IHdhcwogICAgICB5b3UgdGhvdWdodCB5b3UgaGFkLiBJdCBzaG91bGQgY2hlY2sgdGhlIGlucHV0IGZpbGUgYW5kIGJhaWwKICAgICAgaWYgaXQgZmluZHMgbm9uLWNvbW1lbnQgbGluZXMgdGhhdCBkbyBub3QgY29udGFpbiBleGFjdGx5IDEKICAgICAgJzonIGNoYXJhY3Rlci4KICAgICAgICBNZXNzYWdlLUlEOiA8MjAwMjAyMTcxNTA0NTcuQTMxNjMyQGNsb3ZlLm9yZz4KCiAgICAqIENhbiBhIHN0YXRpYyBodHRwZCBiZSBidWlsdCByZWxpYWJseT8KICAgICAgICBNZXNzYWdlLUlEOiA8MjAwMjAyMDcxNDI3NTEuVDMxNTgyQGNsb3ZlLm9yZz4KCiAgICAqIFtLZW5dIFRlc3Qgc3VpdGUgZmFpbHVyZXM6CiAgICAgIG8gd29ya2VyIGlzIGFsc28gZmFpbGluZyBzb21lIG9mIHRoZSAnY2dpJyBzdWJ0ZXN0cwogICAgICAoc2VlIDxVUkw6aHR0cDovL1NvdXJjZS1ab25lLk9yZy9BcGFjaGUvcmVncmVzc2lvbi8+KToKICAgICAgICBKdXN0aW4gc2F5czogIldvcmtlciBzaG91bGQgYmUgZmluZSBhbmQgcGFzc2VzIGh0dHBkLXRlc3QgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgIEkgdGhpbmsgaXQncyBhIHBlcmwgb3IgYSBodHRwZC10ZXN0IHByb2JsZW0uIgoKICAgICogVXNhZ2Ugb2YgQVBSX0JSSUdBREVfTk9STUFMSVpFIGluIGNvcmVfaW5wdXRfZmlsdGVyIHNob3VsZCBiZQogICAgICByZW1vdmVkIGlmIHBvc3NpYmxlLgogICAgICAgIE1lc3NhZ2UtSUQ6IDxQaW5lLkxOWC40LjMzLjAyMDEyMDIyMzI0MzAuMzE4LTEwMDAwMEBkZWVwdGhvdWdodC5jcy52aXJnaW5pYS5lZHU+CiAgICAgICAgSmVmZiB3b25kZXJzIGlmIHdlIHN0aWxsIGNhcmUgYWJvdXQgdGhpcy4gIEl0IGlzIG5vIGxvbmdlciBhbgogICAgICAgIEFQSSBpc3N1ZSBidXQgc2ltcGx5IGFuIGV4dHJhIHRyaXAgdGhyb3VnaCB0aGUgYnJpZ2FkZS4KCiAgICAqIFRoZSBBZGQuLi5GaWx0ZXIgYW5kIFNldC4uLkZpbHRlciBkaXJlY3RpdmVzIGRvIG5vdCBhbGxvdyB0aGUKICAgICAgYWRtaW5pc3RyYXRvciB0byBvcmRlciBmaWx0ZXJzLCBiZXlvbmQgdGhlIG9yZGVyIG9mIGZpbGVuYW1lIChtaW1lKQogICAgICBleHRlbnNpb25zLiAgSXQgaXNuJ3QgY2xlYXIgaWYgU2V0Li4uRmlsdGVyKHMpIHNob3VsZCBiZSBpbnNlcnRlZCAKICAgICAgYmVmb3JlIG9yIGFmdGVyIHRoZSBBZGQuLi5GaWx0ZXIocykgd2hpY2ggYXJlIG9yZGVyZWQgYnkgc2VxdWVuY2Ugb2YKICAgICAgZmlsZW5hbWUgZXh0ZW5zaW9ucy4gIEF0IG1pbmltdW0sIHNvbWUgc29ydCBvZiArLVswLTEwXSBzeW50YXggc2VlbXMKICAgICAgbGlrZSBhIG5pY2Ugc29sdXRpb24uICBTZWUgUk9BRE1BUC4KCiAgICAqIEdldCBwZXJjaGlsZCB0byB3b3JrIG9uIHBsYXRmb3JtcyBvdGhlciB0aGFuIExpbnV4LiBUaGlzCiAgICAgIHdpbGwgcmVxdWlyZSBhIHBvcnRhYmxlIG1lY2hhbmlzbSB0byBwYXNzIGRhdGEgYW5kIGZpbGUvc29ja2V0CiAgICAgIGRlc2NyaXB0b3JzIGJldHdlZW4gdmhvc3QgY2hpbGQgZ3JvdXBzLiBBbiBBUEkgd2FzIHByb3Bvc2VkCiAgICAgIG9uIGRldkBhcHI6CiAgICAgICAgTWVzc2FnZS1JRDogPDIwMDIwMTExMTE1MDA2LksxNTI5QGNsb3ZlLm9yZz4KCiAgICAqIFRyeSB0byBnZXQgbGlidG9vbCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY3kgY29kZSB3b3JraW5nIG9uIEFJWC4KICAgICAgICBNZXNzYWdlLUlEOiA8Y20zbjEwbHg1NTUuZnNmQHJkdTE2My00MC0wOTIubmMucnIuY29tPgoKICAgICAgSnVzdGluIHNheXM6IElmIHdlIGdldCBpdCB3b3JraW5nIG9uIEFJWCwgd2UgY2FuIGVuYWJsZSB0aGlzCiAgICAgICAgICAgICAgICAgICBvbiBhbGwgcGxhdGZvcm1zIGFuZCBjbGVhbiB1cCBvdXIgYnVpbGQgc3lzdGVtCiAgICAgICAgICAgICAgICAgICBzb21ld2hhdC4KICAgICAgSmVmZiBzYXlzOiAgIEkgdGhvdWdodCBJIHRlc3RlZCBhIHBhdGNoIGZvciB5b3Ugc29tZXRpbWUgaW4KICAgICAgICAgICAgICAgICAgIEphbnVhcnkgdGhhdCB5b3Ugd2VyZSBnb2luZyB0byBjb21taXQgd2l0aGluIGEgZmV3CiAgICAgICAgICAgICAgICAgICBkYXlzLgoKICAgICogSGFuZGxpbmcgb2YgJTJmIGluIFVSSXMuICBDdXJyZW50bHkgYm90aCAxLjMgYW5kIDIuMAogICAgICBjb21wbGV0ZWx5IGRpc2FsbG93ICUyZiBpbiB0aGUgcmVxdWVzdCBVUkkgcGF0aCAoc2VlCiAgICAgIGFwX3VuZXNjYXBlX3VybCgpIGluIHV0aWwuYykuICBJdCdzIHBlcm1pdHRlZCBhbmQgcGFzc2VkCiAgICAgIHRocm91Z2ggaW4gdGhlIHF1ZXJ5IHN0cmluZywgaG93ZXZlci4gIFJveSBzYXlzIHRoZQogICAgICBvcmlnaW5hbCByZWFzb24gZm9yIGRpc2FsbG93aW5nIGl0LCBmcm9tIGZpdmUgeWVhcnMgYWdvLAogICAgICB3YXMgdG8gcHJvdGVjdCBDR0kgc2NyaXB0cyB0aGF0IGFwcGxpZWQgUEFUSF9JTkZPIHRvCiAgICAgIGEgZmlsZXN5c3RlbSBsb2NhdGlvbiBhbmQgd2hpY2ggbWlnaHQgYmUgdHJpY2tlZCBieQogICAgICAuLiUyZi4uJTJmKC4uLikuICBXZSAqc2hvdWxkKiBhbGxvdyBwYXRoLWluZm8gb2YgdGhlCiAgICAgIGZvcm0gJ2h0dHA6Ly9mb28uY29tL2luZGV4LmNnaS9wYXRoL3RvL3BhdGglMmZpbmZvJy4KICAgICAgU2luY2Ugd2UndmUgcmV2YW1wZWQgYSBsb3Qgb2Ygb3VyIHByb2Nlc3Npbmcgb2YgcGF0aAogICAgICBzZWdtZW50cywgaXQgd291bGQgYmUgbmljZSB0byBhbGxvdyB0aGlzLCBvciBhdCBsZWFzdAogICAgICBhbGxvdyBpdCBjb25kaXRpb25hbGx5IHdpdGggYSBkaXJlY3RpdmUuCgogICAgICAgIE90aGVyQmlsbCBhZGRzIHRoYXQgJTJmIGFzIHRoZSBTRUNPTkQgY2hhcmFjdGVyIG9mIGEgbXVsdGlieXRlCiAgICAgICAgc2VxdWVuY2UgY2F1c2VzIHRoZSByZXF1ZXN0IHRvIGZhaWwhICBUaGlzIGhhcHBlbnMgbm90YWJseSBpbgogICAgICAgIHRoZSBqYS1qaXMgZW5jb2RpbmcuCgogICAgICBPdGhlckJpbGwgaXMgLTAuNSBmb3IgZXZlbiBjb25zaWRlcmluZyB0aGlzIHVudGlsIDIuMiBiZWNhdXNlCiAgICAgIGl0IHJlbW92ZXMgc29tZSBwcm90ZWN0aW9uIHdlIHByb3ZpZGVkIHRvIHRoaXJkIHBhcnR5IG1vZHVsZXMKICAgICAgdGhhdCB3b3VsZCBteXN0ZXJpb3VzbHkgJ2V2YXBvcmF0ZScsIGV4cG9zaW5nIHBvdGVudGlhbCBob2xlcwogICAgICBpbiBzZWN1cml0eS4gIFB1dHRpbmcgdGhpcyBjaGFuZ2UgaW50byAyLjEgZGV2ZWxvcG1lbnQgbm93ICh3aXRoCiAgICAgIHN0cm9uZyB3YXJuaW5ncyEpIHdpbGwgZ2l2ZSBhdXRob3JzIGEgY2hhbmNlIHRvIHZldCB0aGVpciBjb2RlLgoKICAgICogVGhlcmUgaXMgaW5jcmVhc2luZyBkZW1hbmQgZnJvbSBtb2R1bGUgd3JpdGVycyBmb3IgYW4gQVBJCiAgICAgIHRoYXQgd2lsbCBhbGxvdyB0aGVtIHRvIGNvbnRyb2wgdGhlIHNlcnZlciDgIGxhIGFwYWNoZWN0bC4KICAgICAgUmVhc29ucyBpbmNsdWRlIHNvbGUtZnVuY3Rpb24gc2VydmVycyB0aGF0IG5lZWQgdG8gZGllIGlmCiAgICAgIGFuIGV4dGVybmFsIGRlcGVuZGVuY3kgKGUuZy4sIGEgZGF0YWJhc2UpIGZhaWxzLCBldCBjZXRlcmEuCiAgICAgIFBlcmhhcHMgc29tZXRoaW5nIGluIHRoZSAoZXZlciBtb3JlIGFidXNlZCkgc2NvcmVib2FyZD8KICAgICAgICAKICAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBhbHJlYWR5IGhhdmUgYSBwaXBlIHRoYXQgZ29lcyBiZXR3ZWVuIHBhcmVudAogICAgICAgICAgICAgYW5kIGNoaWxkIGZvciBncmFjZWZ1bCBzaHV0ZG93biBldmVudHMsIGFsb25nIHdpdGggYW4gQVBJIHRoYXQKICAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIHNlbmQgYSBtZXNzYWdlIGRvd24gdGhhdCBwaXBlLiAgSW4gdGhyZWFkZWQgTVBNcywKICAgICAgICAgICAgIGl0IGlzIGVhc3kgZW5vdWdoIHRvIG1ha2UgdGhhdCBvbmUgcGlwZSBiZSB1c2VkIGZvciBncmFjZWZ1bAogICAgICAgICAgICAgYW5kIGdyYWNlbGVzcyBldmVudHMsIGFuZCBpdCBpcyBhbHNvIGVhc3kgdG8gb3BlbiB0aGF0IHBpcGUKICAgICAgICAgICAgIHRvIGJvdGggcGFyZW50IGFuZCBjaGlsZCBmb3Igd3JpdGluZy4gIFRoZW4gd2UganVzdCBuZWVkIHRvCiAgICAgICAgICAgICBmaWd1cmUgb3V0IGhvdyB0byBkbyBncmFjZWxlc3Mgb24gbm9uLXRocmVhZGVkIE1QTXMuCgogICAgKiBXaW4zMjogUm90YXRlbG9ncyBzb21ldGltZXMgaXMgbm90IHRlcm1pbmF0ZWQgd2hlbiBBcGFjaGUKICAgICAgZ29lcyBkb3duIGhhcmQuICBGaXJzdEJpbGwgd2FzIGxvb2tpbmcgYXQgcG9zc2libHkgdHJhY2tpbmcgdGhlIAogICAgICBjaGlsZCdzLWNoaWxkIHByb2Nlc3NlcyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCiAgICAgICAgc3RvZGRhcmQ6IFNoYXJlZCBzY29yZWJvYXJkIG1pZ2h0IG9mZmVyIGEgZ29vZCB3YXkgZm9yIHRoZSBwYXJlbnQgCiAgICAgICAgdG8ga2VlcCB0cmFjayBvZiAnb3RoZXIgY2hpbGQnIHByb2Nlc3NlcyBhbmQgd2hhY2sgdGhlbSBpZiB0aGUgY2hpbGQgCiAgICAgICAgZ29lcyBkb3duLgogICAgICAgIE90aGVyIHRob3VnaHRzIG9uIHdhbGtpbmcgdGhlIHByb2Nlc3MgY2hhaW4gdXNpbmcgdGhlIE5UIGtlcm5lbAogICAgICAgIGhhdmUgYWxzbyBiZWVuIHByb3Bvc2VkIG9uIEFQUi4KCiAgICAqIEVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSBjcmVhdGlvbiBvZiBwaXBlcyBpbiBtb2RfY2dpZAoKICAgICogQ29tYmluZSBsb2dfY2hpbGQgYW5kIHBpcGVkX2xvZ19zcGF3bi4gQ2xlYW4gdXAgaHR0cF9sb2cuYy4KICAgICAgQ29tbW9uIGxvZ2dpbmcgQVBJLgoKICAgICogVGhlcmUgYXJlIHN0aWxsIGEgbnVtYmVyIG9mIHBsYWNlcyBpbiB0aGUgY29kZSB3aGVyZSB3ZSBhcmUKICAgICAgbG9zaW5nIGVycm9yIHN0YXR1cyAoaS5lLiB0aHJvd2luZyBhd2F5IHRoZSBlcnJvciByZXR1cm5lZCBieSBhCiAgICAgIHN5c3RlbSBjYWxsIGFuZCByZXBsYWNpbmcgaXQgd2l0aCBhIGdlbmVyaWMgZXJyb3IgY29kZSkKCiAgICAqIE1hc3Mgdmhvc3RpbmcgdmVyc2lvbiBvZiBzdUVYRUMuCgogICAgKiBBbGwgREJNcyBzdWZmZXIgZnJvbSBjb25mdXNpb24gaW4gc3VwcG9ydC9kYm1tYW5hZ2UgKHBlcmwgc2NyaXB0KSBzaW5jZSAKICAgICAgdGhlIGRibW1hbmFnZSBlbXBsb3lzIHRoZSBmaXJzdC1tYXRjaGVkIGRibSBmb3JtYXQuICBUaGlzIGlzIG5vdAogICAgICBuZWNlc3NhcmlseSB0aGUgbGlicmFyeSB0aGF0IEFwYWNoZSB3YXMgYnVpbHQgd2l0aC4gIEF1Z2h0IHRvCiAgICAgIHJld3JpdGUgZGJtbWFuYWdlIHVwb24gaW5zdGFsbGF0aW9uIHRvIGJpbi8gd2l0aCB0aGUgcHJvcGVyIGxpYnJhcnkgCiAgICAgIGZvciBwcmVkaWN0YWJsZSBtb2RfYXV0aF9kYm0gYWRtaW5pc3RyYXRpb24uCiAgICAgICAgUXVlc3Rpb25zOyBodGRibSBleGlzdHMsIHRpbWUgdG8ga2lsbCBkYm1tYW5hZ2UsIG9yIGRvZXMgaXQgcmVtYWluCiAgICAgICAgICAgICAgICAgICB1c2VmdWwgYXMgYSBwZXJsIGRibSBtYW5hZ2VtZW50IGV4YW1wbGU/ICBJZiB3ZSBrZWVwIGl0LAogICAgICAgICAgICAgICAgICAgZG8gd2UgYWRkcmVzcyB0aGUgaXNzdWUgYWJvdmU/CiAgICAgICAgTWFyY2ggZGlzY3Vzc2lvbiBzdW1tYXJ5OyB3ZSBhcmUgbWlzc2luZyBncm91cCBzdXBwb3J0LiAgV2l0aCB0aGF0CiAgICAgICAgICAgICAgICAgICBhZGRlZCB0byB0cnVuaywgdGhpcyBzY3JpcHQgd2lsbCBnbyBhd2F5LiAgSXQgd2lsbCByZW1haW4KICAgICAgICAgICAgICAgICAgIGluIDIuMCBiYXNlZCBvbiBvdXIgdmVyc2lvbmluZyBhcHByb2FjaC4KCiAgICAqIEludGVncmF0ZSBtb2RfZGF2LgogICAgICAgIFNvbWUgYWRkaXRpb25hbCBpdGVtcyByZW1haW5pbmc6CiAgICAgICAgLSBjYXNlX3ByZXNlcnZlZF9maWxlbmFtZSBzdHVmZgogICAgICAgICAgICAodXNlIHRoZSBuZXcgY2Fub25pY2FsIG5hbWUgc3R1ZmY/KQogICAgICAgIC0gZmluZCBhIG5ldyBob21lIGZvciBhcF90ZXh0KF9oZWFkZXIpCiAgICAgICAgLSBpcyBpdCBwb3NzaWJsZSB0byByZW1vdmUgdGhlIERBVjogbmFtZXNwYWNlIHN0dWZmIGZyb20gdXRpbF94bWw/CgogICAgKiBhcF9jb3JlX3RyYW5zbGF0ZSgpIGFuZCBpdHMgdXNlIGJ5IG1vZF9tbWFwX3N0YXRpYyBhbmQgbW9kX2ZpbGVfY2FjaGUKICAgICAgYXJlIGEgYml0IHdvbmt5LiAgVGhlIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBiZSBleHBvc2VkIGFzIGEgdXRpbGl0eSAKICAgICAgZnVuY3Rpb24gKHN1Y2ggYXMgYXBfdHJhbnNsYXRlX3VybDJmcygpIG9yIGFwX3ZhbGlkYXRlX2ZzX3VybCgpIG9yIAogICAgICBzb21ldGhpbmcpLiAgQW5vdGhlciBhcHByb2FjaCB3b3VsZCBiZSBhIG5ldyBob29rIHBoYXNlIGFmdGVyCiAgICAgICJ0cmFuc2xhdGUiIHdoaWNoIHdvdWxkIGFsbG93IHRoZSBtb2R1bGUgdG8gbXVuZ2Ugd2hhdCB0aGUKICAgICAgdHJhbnNsYXRpb24gaGFzIGRlY2lkZWQgdG8gZG8uCiAgICAgICAgU3RhdHVzOiBHcmVnICsxICh2b2x1bnRlZXJzKQoKICAgICogRXhwbG9yZSB1c2Ugb2YgYSBwb3N0LWNvbmZpZyBob29rIGZvciB0aGUgY29kZSBpbiBodHRwX21haW4uYyB3aGljaAogICAgICBjYWxscyBhcF9maXh1cF92aXJ1dGFsX2hvc3RzKCksIGFwX2Zpbmlfdmhvc3RfY29uZmlnKCksIGFuZAogICAgICBhcF9zb3J0X2hvb2tzKCkgIFt0byByZWR1Y2UgdGhlIGxvZ2ljIGluIG1haW4oKV0KCiAgICAqIHJlYWQgdGhlIGNvbmZpZyB0cmVlIGp1c3Qgb25jZSwgYW5kIHByb2Nlc3MgTiB0aW1lcyAoYXMgbmVjZXNzYXJ5KQogICAgICAgIE90aGVyQmlsbCBhZGRzIHRoYXQgdGhlICdnb29kJyBzb2x1dGlvbiBvZiB0aHJlZSBwYXNzZXMgYWdhaW5zdCB0aGUKICAgICAgICBjb25maWcgdHJlZSB3aXRoaW4gb25lIHJlYWQgaXMgdGhlIGJldHRlciBzb2x1dGlvbiwgYnV0IGJyZWFrcyBtYW55CiAgICAgICAgbW9kdWxlcy4gIEJlc3QgbGVmdCBmb3IgMi4yPwogICAgICAgIC0wLjU6ICBPdGhlckJpbGwKCiAgICAqIChwb3NzaWJseSkgdXNlIFVVSURzIGluIG1vZF91bmlxdWVfaWQgYW5kL29yIG1vZF91c2VydHJhY2sKCiAgICAqIChwb3NzaWJseSkgcG9ydCB0aGUgYnVnIGZpeCBmb3IgUFIgNjk0MiAoc2VndiB3aGVuIExvYWRNb2R1bGUgaXMgcHV0CiAgICAgIGludG8gYSBWaXJ0dWFsSG9zdCBjb250YWluZXIpIHRvIDIuMC4KCiAgICAqIHNoaWZ0IHN0dWZmIHRvIG1vZF9jb3JlLmgKCiAgICAqIGNhbGxlcnMgb2YgYXBfcnVuX2NyZWF0ZV9yZXF1ZXN0KCkgc2hvdWxkIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKICAgICAgZm9yIGZhaWx1cmUgKERvdWcgdm9sdW50ZWVycykKCiAgICAqIFdpbjMyOiBHZXQgQXBhY2hlIHdvcmtpbmcgb24gV2luZG93cyA5NS85OC4gVGhlIGZvbGxvd2luZyB3b3JrCiAgICAgICAgKGF0IGxlYXN0KSBuZWVkcyB0byBiZSBkb25lOgogICAgICAgIC0gRG9jdW1lbnQgd2FybmluZyB0aGF0IE9TUjIgaXMgcmVxdWlyZWQgKGZvciBDcnlwdCBmdW5jdGlvbnMsIGluCiAgICAgICAgcmFuZC5jLCBhdCBsZWFzdC4pICBUaGlzIGNvdWxkIGJlIHJlc29sdmVkIHdpdGggYW4gU1NMIGxpYnJhcnksIG9yCiAgICAgICAgcmFuZG9taXphdGlvbiBpbiBBUFIgaXRzZWxmLgogICAgICAgIC0gQnJpbmcgdGhlIFdpbjl4Q29uSG9vay5kbGwgZnJvbSAxLjMgaW50byAyLjAgKG5vIHNlbnNlIHRpbGwgaXQKICAgICAgICBhY3R1YWxseSB3b3JrcykgYW5kIGFkZCBpbiBhIHNwbGFzaCBvZiBXaW45eCBzZXJ2aWNlIGNvZGUuCgogICAgKiBGaXggdGhlIHdvcmtlciBNUE0gdG8gdXNlIFBPRCB0byBraWxsIGNoaWxkIHByb2Nlc3NlcyBpbnN0ZWFkCiAgICAgIG9mIGFwX29zX2tpbGxwZywgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBzaG91bGQgZGllLgoKICAgICogU2NvcmVib2FyZCBzdHJ1Y3R1cmVzIGNvdWxkIGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSBzdWNoIHRoYXQKICAgICAgcHJvcGVyIGFsaWdubWVudCBpcyBub3QgbWFpbnRhaW5lZCwgbGVhZGluZyB0byBzZWdmYXVsdHMgb24gCiAgICAgIHNvbWUgc3lzdGVtcy4gIENsaWZmIHBvc3RlZCBhIHBhdGNoIHRvIGRlYWwgd2l0aCB0aGlzIGlzc3VlIGJ1dAogICAgICBsYXRlciByZWNhbnRlZC4gU2VlIHRoaXMgbWVzc2FnZSB0byBkZXZAYXByLmFwYWNoZS5vcmc6CiAgICAgIE1lc3NhZ2UtSUQ6IDxQaW5lLkxOWC40LjQ0LjAyMDMwMTEzNTQwOTAuMTY0NTctMjAwMDAwQGRlZXB0aG91Z2h0CiAgICAgICAgICAgICAgICAgIC5jcy52aXJnaW5pYS5lZHU+CgogICAgKiBhcF9kaXNjYXJkX3JlcXVlc3Qgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB1c2UgdGhlIGJ1Y2tldCBBUEkKICAgICAgZGlyZWN0bHkgcmF0aGVyIHRoYW4gd2FzdGUgY3ljbGVzIGNvcHlpbmcgYnVmZmVycyB3aXRoIHRoZSBvbGQgQVBJLgoKICAgICogU0lHU0VHViBvbiBMaW51eCAoZ2xpYmMgMi4xLjIpIGlzbid0IGNhdWdodCBwcm9wZXJseSBieSBhCiAgICAgIHNpZ3dhaXRpbmcgdGhyZWFkLiBXZSBuZWVkIHRvIHdvcmsgYXJvdW5kIHRoaXMsIHBlcmhhcHMgdW5sZXNzCiAgICAgIHRoZXJlIGlzIGhvcGUgc29vbiBmb3IgYSBmaXhlZCBnbGliYy4KCgpFWFBFUklNRU5UQUwgTU9EVUxFUzoKCiAgICBtb2RfYXV0aF9sZGFwL3V0aWxfbGRhcDoKICAgICogR2VuZXJhbCBzdGFiaWxpemF0aW9uIGFuZCB0ZXN0aW5nCiAgICAKICAgICogRml4IHRoZSBzaGFyZWQgbWVtb3J5IGNhY2hlCgo=