REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 208.24 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/__pycache__/add_newdocs.cpython-37.pyc
Text
Base64
Qg0NCgAAAADC2EZkbXsDAOMAAAAAAAAAAAAAAAAIAAAAQAAAAHMgDwAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZAFkA2wFbQZaBgEAZQZkBGQFZAaDAwEAZQZkBGQFZAeDAwEAZQZkBGQFZAiDAwEAZQZkBGQFZAmDAwEAZQZkBGQFZAqDAwEAZQZkBGQFZAuDAwEAZQZkBGQMZA2DAwEAZQZkBGQMZA6DAwEAZQZkBGQMZA+DAwEAZQZkBGQMZBCDAwEAZQZkBGQMZBGDAwEAZQZkBGQMZBKDAwEAZQZkBGQMZBODAwEAZQZkBGQMZBSDAwEAZQZkBGQVZBaDAwEAZQZkBGQVZBeDAwEAZQZkBGQVZBiDAwEAZQZkBGQVZBmDAwEAZQZkBGQVZBqDAwEAZQZkBGQVZBuDAwEAZQZkBGQVZByDAwEAZQZkBGQVZB2DAwEAZQZkBGQVZB6DAwEAZQZkH2QgZCGDAwEAZQZkH2QiZCODAwEAZQZkH2QkZCWDAwEAZQZkH2QmZCeDAwEAZQZkH2QoZCmDAwEAZQZkH2QqZCuDAwEAZQZkH2QsZC2DAwEAZQZkH2QuZC+DAwEAZQZkH2QwZDGDAwEAZQZkH2QyZDODAwEAZQZkH2Q0ZDWDAwEAZQZkBGQ2ZDeDAwEAZQZkBGQ4ZDmDAwEAZQZkH2Q6ZDuDAwEAZQZkH2Q8ZD2DAwEAZQZkH2Q+ZD+DAwEAZQZkH2RAZEGDAwEAZQZkH2RCZEODAwEAZQZkH2REZEWDAwEAZQZkH2RGZEeDAwEAZQZkH2RIZEmDAwEAZQZkH2RKZEuDAwEAZQZkH2RMZE2DAwEAZQZkH2ROZE+DAwEAZQZkH2RQZFGDAwEAZQZkH2RSZFODAwEAZQZkH2RUZFWDAwEAZQZkBGRWZFeDAwEAZQZkBGRYZFmDAwEAZQZkBGRaZFuDAwEAZQZkBGRcZF2DAwEAZQZkH2ReZF+DAwEAZQZkH2ReZGCDAwEAZQZkH2ReZGGDAwEAZQZkH2ReZGKDAwEAZQZkH2ReZGODAwEAZQZkH2ReZGSDAwEAZQZkH2ReZGWDAwEAZQZkH2ReZGaDAwEAZQZkH2ReZGeDAwEAZQZkH2ReZGiDAwEAZQZkH2ReZGmDAwEAZQZkH2ReZGqDAwEAZQZkH2ReZGuDAwEAZQZkH2ReZGyDAwEAZQZkH2ReZG2DAwEAZQZkH2ReZG6DAwEAZQZkH2ReZG+DAwEAZQZkH2ReZHCDAwEAZQZkH2ReZHGDAwEAZQZkH2ReZHKDAwEAZQZkH2ReZHODAwEAZQZkH2ReZHSDAwEAZQZkH2ReZHWDAwEAZQZkH2ReZHaDAwEAZQZkH2ReZHeDAwEAZQZkH2ReZHiDAwEAZQZkH2ReZHmDAwEAZQZkH2ReZHqDAwEAZQZkH2ReZHuDAwEAZQZkH2ReZHyDAwEAZQZkH2ReZH2DAwEAZQZkH2ReZH6DAwEAZQZkH2ReZH+DAwEAZQZkH2ReZICDAwEAZQZkH2ReZIGDAwEAZQZkH2ReZIKDAwEAZQZkH2ReZIODAwEAZQZkH2ReZISDAwEAZQZkH2ReZIWDAwEAZQZkH2ReZIaDAwEAZQZkH2ReZIeDAwEAZQZkH2ReZIiDAwEAZQZkH2ReZImDAwEAZQZkH2ReZIqDAwEAZQZkH2ReZIuDAwEAZQZkH2ReZIyDAwEAZQZkH2ReZI2DAwEAZQZkH2ReZI6DAwEAZQZkH2ReZI+DAwEAZQZkH2ReZJCDAwEAZQZkH2ReZJGDAwEAZQZkH2ReZJKDAwEAZQZkH2ReZJODAwEAZQZkH2ReZJSDAwEAZQZkH2ReZJWDAwEAZQZkH2ReZJaDAwEAZQZkH2SXZJiDAwEAZQZkH2SZZJqDAwEAZQZkH2ReZJuDAwEAZQZkH2ReZJyDAwEAZQZkH2ReZJ2DAwEAZQZkH2ReZJ6DAwEAZQZkH2ReZJ+DAwEAZQZkH2SgZKGDAwEAZQZkH2SiZKODAwEAZQZkH2ReZKSDAwEAZQZkH2ReZKWDAwEAZQZkH2ReZKaDAwEAZQZkH2ReZKeDAwEAZQZkH2ReZKiDAwEAZQZkH2ReZKmDAwEAZQZkH2ReZKqDAwEAZQZkH2ReZKuDAwEAZQZkH2ReZKyDAwEAZQZkH2ReZK2DAwEAZQZkH2ReZK6DAwEAZQZkH2ReZK+DAwEAZQZkH2ReZLCDAwEAZQZkH2ReZLGDAwEAZQZkH2ReZLKDAwEAZQZkH2ReZLODAwEAZQZkH2ReZLSDAwEAZLVaB2UGZB9kXmS2ZQdqCGS2ZLdkuI0CZgKDAwEAZQZkH2ReZLllB2oIZLlkumS4jQJmAoMDAQBlBmQfZF5ku4MDAQBlBmQfZF5kvIMDAQBlBmQfZF5kvYMDAQBlBmQfZF5kvoMDAQBlBmS/ZMBkwYMDAQBlBmS/ZMJkw4MDAQBlBmS/ZMRkxYMDAQBlBmQfZMZkx4MDAQBlBmQfZMhkyYMDAQBlBmQfZMpky4MDAQBlBmQfZMxkzYMDAQBlBmQfZM5kz4MDAQBlBmS/ZNBk0YMDAQBlBmQfZNJk04MDAQBlBmQfZNRk1YMDAQBlBmQEZNZk14MDAQBlBmQEZNZk2IMDAQBlBmQEZNZk2YMDAQBlBmQEZNZk2oMDAQBlBmQEZNZk24MDAQBlBmQEZNZk3IMDAQBlBmQEZNZk3YMDAQBlBmQEZNZk3oMDAQBlBmQEZNZk34MDAQBlBmQEZNZk4IMDAQBlBmQEZNZk4YMDAQBlBmQEZNZk4oMDAQBlBmQfZONk5IMDAQBlBmQfZONk5YMDAQBlBmQfZONk5oMDAQBlBmQfZONk54MDAQBlBmQfZONk6IMDAQBlBmQfZONk6YMDAQBlBmQfZONk6oMDAQBlBmQfZONk64MDAQBlBmQfZONk7IMDAQBlBmQfZONk7YMDAQBlBmQfZONk7oMDAQBlBmQfZONk74MDAQBlBmQfZONk8IMDAQBlBmQfZONk8YMDAQBlBmQfZONk8oMDAQBlBmQfZONk84MDAQBlBmQfZONk9IMDAQBlBmQfZONk9YMDAQBlBmQfZONk9oMDAQBlBmQfZONk94MDAQBlBmQfZONk+IMDAQBlBmQfZONk+YMDAQBlBmQfZPpk+4MDAQBlBmQfZPpk/IMDAQBlBmQfZPpk/YMDAQBlBmQfZP5k/4MDAQBlBmQfkAFkAJABZAGDAwEAZQZkH5ABZAKQAWQDgwMBAGUGZB+QAWQEkAFkBYMDAQBlBpABZAaQAWQHkAFkCIMDAQBlBpABZAaQAWQJkAFkCoMDAQBlBpABZAuQAWQMkAFkDYMDAQBlBpABZAuQAWQMkAFkDoMDAQBlBpABZAuQAWQMkAFkD4MDAQBlBpABZAuQAWQMkAFkEIMDAQBlBpABZAuQAWQMkAFkEYMDAQBlBpABZAuQAWQMkAFkEoMDAQBlBpABZAuQAWQMkAFkE4MDAQBlBpABZAuQAWQMkAFkFIMDAQBlBpABZAuQAWQMkAFkFYMDAQBlBpABZAuQAWQMkAFkFoMDAQBlBpABZAuQAWQMkAFkF4MDAQBlBpABZAuQAWQMkAFkGIMDAQBlBpABZAuQAWQMkAFkGYMDAQBlBpABZAuQAWQMkAFkGoMDAQBlBpABZAuQAWQMkAFkG4MDAQBlBpABZAuQAWQMkAFkHIMDAQBlBpABZAuQAWQMkAFkHYMDAQBlBpABZAuQAWQMkAFkHoMDAQBlBpABZAuQAWQMkAFkH4MDAQBlBpABZAuQAWQMkAFkIIMDAQBlBpABZAuQAWQMkAFkIYMDAQBlBpABZAuQAWQMkAFkIoMDAQBlBpABZAuQAWQMkAFkI4MDAQBlBpABZAuQAWQMkAFkJIMDAQBlBpABZAuQAWQMkAFkJYMDAQBlBpABZAuQAWQMkAFkJoMDAQBlBpABZAuQAWQMkAFkJ4MDAQBlBpABZAuQAWQMkAFkKIMDAQBlBpABZAuQAWQMkAFkKYMDAQBlBpABZAuQAWQMkAFkKoMDAQBlBpABZAuQAWQMkAFkK4MDAQBlBpABZAuQAWQMkAFkLIMDAQBlBpABZAuQAWQMkAFkLYMDAQBlBpABZAuQAWQMkAFkLoMDAQBlBpABZAuQAWQMkAFkL4MDAQBlBpABZAuQAWQMkAFkMIMDAQBlBpABZAuQAWQMkAFkMYMDAQBlBpABZAuQAWQMkAFkMoMDAQBlBpABZAuQAWQMkAFkM4MDAQBlBpABZAuQAWQMkAFkNIMDAQBlBpABZAuQAWQMkAFkNYMDAQBlBpABZAuQAWQMkAFkNoMDAQBlBpABZAuQAWQMkAFkN4MDAQBlBpABZAuQAWQMkAFkOIMDAQBlBpABZAuQAWQMkAFkOYMDAQBlBpABZAuQAWQMkAFkOoMDAQBlBpABZAuQAWQMkAFkO4MDAQBlBpABZAuQAWQMkAFkPIMDAQBlBpABZAuQAWQMkAFkPYMDAQBlBpABZAuQAWQMkAFkPoMDAQBlBpABZAuQAWQMkAFkP4MDAQBlBpABZAuQAWQMkAFkQIMDAQBlBpABZAuQAWQMkAFkQYMDAQBlBpABZAuQAWQMkAFkQoMDAQBlBpABZAuQAWQMkAFkQ4MDAQBlBpABZAuQAWQMkAFkRIMDAQBlBpABZAuQAWQMkAFkRYMDAQBlBpABZAuQAWQMkAFkRoMDAQBlBpABZAuQAWQMkAFkR4MDAQBlBpABZAuQAWQMkAFkSIMDAQBlBpABZAuQAWQMkAFkSYMDAQBlBpABZAuQAWQMkAFkSoMDAQBlBpABZAuQAWQMkAFkS4MDAQBlBpABZAuQAWQMkAFkTIMDAQBlBpABZAuQAWQMkAFkTYMDAQBlBpABZAuQAWQMkAFkToMDAQBlBpABZAuQAWRPkAFkUIMDAQBlBpABZAuQAWRRkAFkUoMDAQBlBpABZAuQAWRTkAFkVIMDAQBlBpABZAuQAWRVkAFkVoMDAQBlBpABZAuQAWRXkAFkWIMDAQBlBpABZAuQAWRZkAFkWoMDAQBlBpABZAuQAWRbkAFkXIMDAQBlBpABZAuQAWRdkAFkXoMDAQBlBpABZAuQAWRfkAFkYIMDAQBlBpABZAuQAWRhkAFkYoMDAQBlBpABZAuQAWRjkAFkZIMDAQBlBpABZAuQAWRlkAFkZoMDAQBlBpABZAuQAWRnkAFkaIMDAQCQAWRpUwAoagEAAGFlAQAAClRoaXMgaXMgb25seSBtZWFudCB0byBhZGQgZG9jcyB0byBvYmplY3RzIGRlZmluZWQgaW4gQy1leHRlbnNpb24gbW9kdWxlcy4KVGhlIHB1cnBvc2UgaXMgdG8gYWxsb3cgZWFzaWVyIGVkaXRpbmcgb2YgdGhlIGRvY3N0cmluZ3Mgd2l0aG91dApyZXF1aXJpbmcgYSByZS1jb21waWxlLgoKTk9URTogTWFueSBvZiB0aGUgbWV0aG9kcyBvZiBuZGFycmF5IGhhdmUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMuCiAgICAgIElmIHlvdSB1cGRhdGUgdGhlc2UgZG9jc3RyaW5ncywgcGxlYXNlIGtlZXAgYWxzbyB0aGUgb25lcyBpbgogICAgICBjb3JlL2Zyb21udW1lcmljLnB5LCBjb3JlL2RlZm1hdHJpeC5weSB1cC10by1kYXRlLgoK6QAAAAApA9oIZGl2aXNpb27aD2Fic29sdXRlX2ltcG9ydNoOcHJpbnRfZnVuY3Rpb24pAdoKYWRkX25ld2RvY3oKbnVtcHkuY29yZVoIZmxhdGl0ZXJhxAMAAAogICAgRmxhdCBpdGVyYXRvciBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyIGFycmF5cy4KCiAgICBBIGBmbGF0aXRlcmAgaXRlcmF0b3IgaXMgcmV0dXJuZWQgYnkgYGB4LmZsYXRgYCBmb3IgYW55IGFycmF5IGB4YC4KICAgIEl0IGFsbG93cyBpdGVyYXRpbmcgb3ZlciB0aGUgYXJyYXkgYXMgaWYgaXQgd2VyZSBhIDEtRCBhcnJheSwKICAgIGVpdGhlciBpbiBhIGZvci1sb29wIG9yIGJ5IGNhbGxpbmcgaXRzIGBuZXh0YCBtZXRob2QuCgogICAgSXRlcmF0aW9uIGlzIGRvbmUgaW4gcm93LW1ham9yLCBDLXN0eWxlIG9yZGVyICh0aGUgbGFzdAogICAgaW5kZXggdmFyeWluZyB0aGUgZmFzdGVzdCkuIFRoZSBpdGVyYXRvciBjYW4gYWxzbyBiZSBpbmRleGVkIHVzaW5nCiAgICBiYXNpYyBzbGljaW5nIG9yIGFkdmFuY2VkIGluZGV4aW5nLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbmRhcnJheS5mbGF0IDogUmV0dXJuIGEgZmxhdCBpdGVyYXRvciBvdmVyIGFuIGFycmF5LgogICAgbmRhcnJheS5mbGF0dGVuIDogUmV0dXJucyBhIGZsYXR0ZW5lZCBjb3B5IG9mIGFuIGFycmF5LgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgQSBgZmxhdGl0ZXJgIGl0ZXJhdG9yIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgZnJvbSBQeXRob24gY29kZQogICAgYnkgY2FsbGluZyB0aGUgYGZsYXRpdGVyYCBjb25zdHJ1Y3Rvci4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJhbmdlKDYpLnJlc2hhcGUoMiwgMykKICAgID4+PiBmbCA9IHguZmxhdAogICAgPj4+IHR5cGUoZmwpCiAgICA8dHlwZSAnbnVtcHkuZmxhdGl0ZXInPgogICAgPj4+IGZvciBpdGVtIGluIGZsOgogICAgLi4uICAgICBwcmludChpdGVtKQogICAgLi4uCiAgICAwCiAgICAxCiAgICAyCiAgICAzCiAgICA0CiAgICA1CgogICAgPj4+IGZsWzI6NF0KICAgIGFycmF5KFsyLCAzXSkKCiAgICApAtoEYmFzZXqgCiAgICBBIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgdGhhdCBpcyBpdGVyYXRlZCBvdmVyLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcmFuZ2UoNSkKICAgID4+PiBmbCA9IHguZmxhdAogICAgPj4+IGZsLmJhc2UgaXMgeAogICAgVHJ1ZQoKICAgICkCWgZjb29yZHN64QogICAgQW4gTi1kaW1lbnNpb25hbCB0dXBsZSBvZiBjdXJyZW50IGNvb3JkaW5hdGVzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcmFuZ2UoNikucmVzaGFwZSgyLCAzKQogICAgPj4+IGZsID0geC5mbGF0CiAgICA+Pj4gZmwuY29vcmRzCiAgICAoMCwgMCkKICAgID4+PiBmbC5uZXh0KCkKICAgIDAKICAgID4+PiBmbC5jb29yZHMKICAgICgwLCAxKQoKICAgICkC2gVpbmRleHrJCiAgICBDdXJyZW50IGZsYXQgaW5kZXggaW50byB0aGUgYXJyYXkuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFyYW5nZSg2KS5yZXNoYXBlKDIsIDMpCiAgICA+Pj4gZmwgPSB4LmZsYXQKICAgID4+PiBmbC5pbmRleAogICAgMAogICAgPj4+IGZsLm5leHQoKQogICAgMAogICAgPj4+IGZsLmluZGV4CiAgICAxCgogICAgKQLaCV9fYXJyYXlfX3oyX19hcnJheV9fKHR5cGU9Tm9uZSkgR2V0IGFycmF5IGZyb20gaXRlcmF0b3IKCiAgICApAtoEY29weXr+CiAgICBjb3B5KCkKCiAgICBHZXQgYSBjb3B5IG9mIHRoZSBpdGVyYXRvciBhcyBhIDEtRCBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJhbmdlKDYpLnJlc2hhcGUoMiwgMykKICAgID4+PiB4CiAgICBhcnJheShbWzAsIDEsIDJdLAogICAgICAgICAgIFszLCA0LCA1XV0pCiAgICA+Pj4gZmwgPSB4LmZsYXQKICAgID4+PiBmbC5jb3B5KCkKICAgIGFycmF5KFswLCAxLCAyLCAzLCA0LCA1XSkKCiAgICBaBm5kaXRlcmEXKgAACiAgICBFZmZpY2llbnQgbXVsdGktZGltZW5zaW9uYWwgaXRlcmF0b3Igb2JqZWN0IHRvIGl0ZXJhdGUgb3ZlciBhcnJheXMuCiAgICBUbyBnZXQgc3RhcnRlZCB1c2luZyB0aGlzIG9iamVjdCwgc2VlIHRoZQogICAgOnJlZjpgaW50cm9kdWN0b3J5IGd1aWRlIHRvIGFycmF5IGl0ZXJhdGlvbiA8YXJyYXlzLm5kaXRlcj5gLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG9wIDogbmRhcnJheSBvciBzZXF1ZW5jZSBvZiBhcnJheV9saWtlCiAgICAgICAgVGhlIGFycmF5KHMpIHRvIGl0ZXJhdGUgb3Zlci4KICAgIGZsYWdzIDogc2VxdWVuY2Ugb2Ygc3RyLCBvcHRpb25hbAogICAgICAgIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBpdGVyYXRvci4KCiAgICAgICAgICAqICJidWZmZXJlZCIgZW5hYmxlcyBidWZmZXJpbmcgd2hlbiByZXF1aXJlZC4KICAgICAgICAgICogImNfaW5kZXgiIGNhdXNlcyBhIEMtb3JkZXIgaW5kZXggdG8gYmUgdHJhY2tlZC4KICAgICAgICAgICogImZfaW5kZXgiIGNhdXNlcyBhIEZvcnRyYW4tb3JkZXIgaW5kZXggdG8gYmUgdHJhY2tlZC4KICAgICAgICAgICogIm11bHRpX2luZGV4IiBjYXVzZXMgYSBtdWx0aS1pbmRleCwgb3IgYSB0dXBsZSBvZiBpbmRpY2VzCiAgICAgICAgICAgIHdpdGggb25lIHBlciBpdGVyYXRpb24gZGltZW5zaW9uLCB0byBiZSB0cmFja2VkLgogICAgICAgICAgKiAiY29tbW9uX2R0eXBlIiBjYXVzZXMgYWxsIHRoZSBvcGVyYW5kcyB0byBiZSBjb252ZXJ0ZWQgdG8KICAgICAgICAgICAgYSBjb21tb24gZGF0YSB0eXBlLCB3aXRoIGNvcHlpbmcgb3IgYnVmZmVyaW5nIGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICogImNvcHlfaWZfb3ZlcmxhcCIgY2F1c2VzIHRoZSBpdGVyYXRvciB0byBkZXRlcm1pbmUgaWYgcmVhZAogICAgICAgICAgICBvcGVyYW5kcyBoYXZlIG92ZXJsYXAgd2l0aCB3cml0ZSBvcGVyYW5kcywgYW5kIG1ha2UgdGVtcG9yYXJ5CiAgICAgICAgICAgIGNvcGllcyBhcyBuZWNlc3NhcnkgdG8gYXZvaWQgb3ZlcmxhcC4gRmFsc2UgcG9zaXRpdmVzIChuZWVkbGVzcwogICAgICAgICAgICBjb3B5aW5nKSBhcmUgcG9zc2libGUgaW4gc29tZSBjYXNlcy4KICAgICAgICAgICogImRlbGF5X2J1ZmFsbG9jIiBkZWxheXMgYWxsb2NhdGlvbiBvZiB0aGUgYnVmZmVycyB1bnRpbAogICAgICAgICAgICBhIHJlc2V0KCkgY2FsbCBpcyBtYWRlLiBBbGxvd3MgImFsbG9jYXRlIiBvcGVyYW5kcyB0bwogICAgICAgICAgICBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlaXIgdmFsdWVzIGFyZSBjb3BpZWQgaW50byB0aGUgYnVmZmVycy4KICAgICAgICAgICogImV4dGVybmFsX2xvb3AiIGNhdXNlcyB0aGUgYHZhbHVlc2AgZ2l2ZW4gdG8gYmUKICAgICAgICAgICAgb25lLWRpbWVuc2lvbmFsIGFycmF5cyB3aXRoIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHplcm8tZGltZW5zaW9uYWwgYXJyYXlzLgogICAgICAgICAgKiAiZ3Jvd19pbm5lciIgYWxsb3dzIHRoZSBgdmFsdWVgIGFycmF5IHNpemVzIHRvIGJlIG1hZGUKICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlciBzaXplIHdoZW4gYm90aCAiYnVmZmVyZWQiIGFuZAogICAgICAgICAgICAiZXh0ZXJuYWxfbG9vcCIgaXMgdXNlZC4KICAgICAgICAgICogInJhbmdlZCIgYWxsb3dzIHRoZSBpdGVyYXRvciB0byBiZSByZXN0cmljdGVkIHRvIGEgc3ViLXJhbmdlCiAgICAgICAgICAgIG9mIHRoZSBpdGVyaW5kZXggdmFsdWVzLgogICAgICAgICAgKiAicmVmc19vayIgZW5hYmxlcyBpdGVyYXRpb24gb2YgcmVmZXJlbmNlIHR5cGVzLCBzdWNoIGFzCiAgICAgICAgICAgIG9iamVjdCBhcnJheXMuCiAgICAgICAgICAqICJyZWR1Y2Vfb2siIGVuYWJsZXMgaXRlcmF0aW9uIG9mICJyZWFkd3JpdGUiIG9wZXJhbmRzCiAgICAgICAgICAgIHdoaWNoIGFyZSBicm9hZGNhc3RlZCwgYWxzbyBrbm93biBhcyByZWR1Y3Rpb24gb3BlcmFuZHMuCiAgICAgICAgICAqICJ6ZXJvc2l6ZV9vayIgYWxsb3dzIGBpdGVyc2l6ZWAgdG8gYmUgemVyby4KICAgIG9wX2ZsYWdzIDogbGlzdCBvZiBsaXN0IG9mIHN0ciwgb3B0aW9uYWwKICAgICAgICBUaGlzIGlzIGEgbGlzdCBvZiBmbGFncyBmb3IgZWFjaCBvcGVyYW5kLiBBdCBtaW5pbXVtLCBvbmUgb2YKICAgICAgICAicmVhZG9ubHkiLCAicmVhZHdyaXRlIiwgb3IgIndyaXRlb25seSIgbXVzdCBiZSBzcGVjaWZpZWQuCgogICAgICAgICAgKiAicmVhZG9ubHkiIGluZGljYXRlcyB0aGUgb3BlcmFuZCB3aWxsIG9ubHkgYmUgcmVhZCBmcm9tLgogICAgICAgICAgKiAicmVhZHdyaXRlIiBpbmRpY2F0ZXMgdGhlIG9wZXJhbmQgd2lsbCBiZSByZWFkIGZyb20gYW5kIHdyaXR0ZW4gdG8uCiAgICAgICAgICAqICJ3cml0ZW9ubHkiIGluZGljYXRlcyB0aGUgb3BlcmFuZCB3aWxsIG9ubHkgYmUgd3JpdHRlbiB0by4KICAgICAgICAgICogIm5vX2Jyb2FkY2FzdCIgcHJldmVudHMgdGhlIG9wZXJhbmQgZnJvbSBiZWluZyBicm9hZGNhc3RlZC4KICAgICAgICAgICogImNvbnRpZyIgZm9yY2VzIHRoZSBvcGVyYW5kIGRhdGEgdG8gYmUgY29udGlndW91cy4KICAgICAgICAgICogImFsaWduZWQiIGZvcmNlcyB0aGUgb3BlcmFuZCBkYXRhIHRvIGJlIGFsaWduZWQuCiAgICAgICAgICAqICJuYm8iIGZvcmNlcyB0aGUgb3BlcmFuZCBkYXRhIHRvIGJlIGluIG5hdGl2ZSBieXRlIG9yZGVyLgogICAgICAgICAgKiAiY29weSIgYWxsb3dzIGEgdGVtcG9yYXJ5IHJlYWQtb25seSBjb3B5IGlmIHJlcXVpcmVkLgogICAgICAgICAgKiAidXBkYXRlaWZjb3B5IiBhbGxvd3MgYSB0ZW1wb3JhcnkgcmVhZC13cml0ZSBjb3B5IGlmIHJlcXVpcmVkLgogICAgICAgICAgKiAiYWxsb2NhdGUiIGNhdXNlcyB0aGUgYXJyYXkgdG8gYmUgYWxsb2NhdGVkIGlmIGl0IGlzIE5vbmUKICAgICAgICAgICAgaW4gdGhlIGBvcGAgcGFyYW1ldGVyLgogICAgICAgICAgKiAibm9fc3VidHlwZSIgcHJldmVudHMgYW4gImFsbG9jYXRlIiBvcGVyYW5kIGZyb20gdXNpbmcgYSBzdWJ0eXBlLgogICAgICAgICAgKiAiYXJyYXltYXNrIiBpbmRpY2F0ZXMgdGhhdCB0aGlzIG9wZXJhbmQgaXMgdGhlIG1hc2sgdG8gdXNlCiAgICAgICAgICAgIGZvciBzZWxlY3RpbmcgZWxlbWVudHMgd2hlbiB3cml0aW5nIHRvIG9wZXJhbmRzIHdpdGggdGhlCiAgICAgICAgICAgICd3cml0ZW1hc2tlZCcgZmxhZyBzZXQuIFRoZSBpdGVyYXRvciBkb2VzIG5vdCBlbmZvcmNlIHRoaXMsCiAgICAgICAgICAgIGJ1dCB3aGVuIHdyaXRpbmcgZnJvbSBhIGJ1ZmZlciBiYWNrIHRvIHRoZSBhcnJheSwgaXQgb25seQogICAgICAgICAgICBjb3BpZXMgdGhvc2UgZWxlbWVudHMgaW5kaWNhdGVkIGJ5IHRoaXMgbWFzay4KICAgICAgICAgICogJ3dyaXRlbWFza2VkJyBpbmRpY2F0ZXMgdGhhdCBvbmx5IGVsZW1lbnRzIHdoZXJlIHRoZSBjaG9zZW4KICAgICAgICAgICAgJ2FycmF5bWFzaycgb3BlcmFuZCBpcyBUcnVlIHdpbGwgYmUgd3JpdHRlbiB0by4KICAgICAgICAgICogIm92ZXJsYXBfYXNzdW1lX2VsZW1lbnR3aXNlIiBjYW4gYmUgdXNlZCB0byBtYXJrIG9wZXJhbmRzIHRoYXQgYXJlCiAgICAgICAgICAgIGFjY2Vzc2VkIG9ubHkgaW4gdGhlIGl0ZXJhdG9yIG9yZGVyLCB0byBhbGxvdyBsZXNzIGNvbnNlcnZhdGl2ZQogICAgICAgICAgICBjb3B5aW5nIHdoZW4gImNvcHlfaWZfb3ZlcmxhcCIgaXMgcHJlc2VudC4KICAgIG9wX2R0eXBlcyA6IGR0eXBlIG9yIHR1cGxlIG9mIGR0eXBlKHMpLCBvcHRpb25hbAogICAgICAgIFRoZSByZXF1aXJlZCBkYXRhIHR5cGUocykgb2YgdGhlIG9wZXJhbmRzLiBJZiBjb3B5aW5nIG9yIGJ1ZmZlcmluZwogICAgICAgIGlzIGVuYWJsZWQsIHRoZSBkYXRhIHdpbGwgYmUgY29udmVydGVkIHRvL2Zyb20gdGhlaXIgb3JpZ2luYWwgdHlwZXMuCiAgICBvcmRlciA6IHsnQycsICdGJywgJ0EnLCAnSyd9LCBvcHRpb25hbAogICAgICAgIENvbnRyb2xzIHRoZSBpdGVyYXRpb24gb3JkZXIuICdDJyBtZWFucyBDIG9yZGVyLCAnRicgbWVhbnMKICAgICAgICBGb3J0cmFuIG9yZGVyLCAnQScgbWVhbnMgJ0YnIG9yZGVyIGlmIGFsbCB0aGUgYXJyYXlzIGFyZSBGb3J0cmFuCiAgICAgICAgY29udGlndW91cywgJ0MnIG9yZGVyIG90aGVyd2lzZSwgYW5kICdLJyBtZWFucyBhcyBjbG9zZSB0byB0aGUKICAgICAgICBvcmRlciB0aGUgYXJyYXkgZWxlbWVudHMgYXBwZWFyIGluIG1lbW9yeSBhcyBwb3NzaWJsZS4gVGhpcyBhbHNvCiAgICAgICAgYWZmZWN0cyB0aGUgZWxlbWVudCBtZW1vcnkgb3JkZXIgb2YgImFsbG9jYXRlIiBvcGVyYW5kcywgYXMgdGhleQogICAgICAgIGFyZSBhbGxvY2F0ZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGl0ZXJhdGlvbiBvcmRlci4KICAgICAgICBEZWZhdWx0IGlzICdLJy4KICAgIGNhc3RpbmcgOiB7J25vJywgJ2VxdWl2JywgJ3NhZmUnLCAnc2FtZV9raW5kJywgJ3Vuc2FmZSd9LCBvcHRpb25hbAogICAgICAgIENvbnRyb2xzIHdoYXQga2luZCBvZiBkYXRhIGNhc3RpbmcgbWF5IG9jY3VyIHdoZW4gbWFraW5nIGEgY29weQogICAgICAgIG9yIGJ1ZmZlcmluZy4gIFNldHRpbmcgdGhpcyB0byAndW5zYWZlJyBpcyBub3QgcmVjb21tZW5kZWQsCiAgICAgICAgYXMgaXQgY2FuIGFkdmVyc2VseSBhZmZlY3QgYWNjdW11bGF0aW9ucy4KCiAgICAgICAgICAqICdubycgbWVhbnMgdGhlIGRhdGEgdHlwZXMgc2hvdWxkIG5vdCBiZSBjYXN0IGF0IGFsbC4KICAgICAgICAgICogJ2VxdWl2JyBtZWFucyBvbmx5IGJ5dGUtb3JkZXIgY2hhbmdlcyBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3NhZmUnIG1lYW5zIG9ubHkgY2FzdHMgd2hpY2ggY2FuIHByZXNlcnZlIHZhbHVlcyBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3NhbWVfa2luZCcgbWVhbnMgb25seSBzYWZlIGNhc3RzIG9yIGNhc3RzIHdpdGhpbiBhIGtpbmQsCiAgICAgICAgICAgIGxpa2UgZmxvYXQ2NCB0byBmbG9hdDMyLCBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3Vuc2FmZScgbWVhbnMgYW55IGRhdGEgY29udmVyc2lvbnMgbWF5IGJlIGRvbmUuCiAgICBvcF9heGVzIDogbGlzdCBvZiBsaXN0IG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgSWYgcHJvdmlkZWQsIGlzIGEgbGlzdCBvZiBpbnRzIG9yIE5vbmUgZm9yIGVhY2ggb3BlcmFuZHMuCiAgICAgICAgVGhlIGxpc3Qgb2YgYXhlcyBmb3IgYW4gb3BlcmFuZCBpcyBhIG1hcHBpbmcgZnJvbSB0aGUgZGltZW5zaW9ucwogICAgICAgIG9mIHRoZSBpdGVyYXRvciB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgb3BlcmFuZC4gQSB2YWx1ZSBvZgogICAgICAgIC0xIGNhbiBiZSBwbGFjZWQgZm9yIGVudHJpZXMsIGNhdXNpbmcgdGhhdCBkaW1lbnNpb24gdG8gYmUKICAgICAgICB0cmVhdGVkIGFzICJuZXdheGlzIi4KICAgIGl0ZXJzaGFwZSA6IHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgVGhlIGRlc2lyZWQgc2hhcGUgb2YgdGhlIGl0ZXJhdG9yLiBUaGlzIGFsbG93cyAiYWxsb2NhdGUiIG9wZXJhbmRzCiAgICAgICAgd2l0aCBhIGRpbWVuc2lvbiBtYXBwZWQgYnkgb3BfYXhlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRpbWVuc2lvbgogICAgICAgIG9mIGEgZGlmZmVyZW50IG9wZXJhbmQgdG8gZ2V0IGEgdmFsdWUgbm90IGVxdWFsIHRvIDEgZm9yIHRoYXQKICAgICAgICBkaW1lbnNpb24uCiAgICBidWZmZXJzaXplIDogaW50LCBvcHRpb25hbAogICAgICAgIFdoZW4gYnVmZmVyaW5nIGlzIGVuYWJsZWQsIGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZSB0ZW1wb3JhcnkKICAgICAgICBidWZmZXJzLiBTZXQgdG8gMCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUuCgogICAgQXR0cmlidXRlcwogICAgLS0tLS0tLS0tLQogICAgZHR5cGVzIDogdHVwbGUgb2YgZHR5cGUocykKICAgICAgICBUaGUgZGF0YSB0eXBlcyBvZiB0aGUgdmFsdWVzIHByb3ZpZGVkIGluIGB2YWx1ZWAuIFRoaXMgbWF5IGJlCiAgICAgICAgZGlmZmVyZW50IGZyb20gdGhlIG9wZXJhbmQgZGF0YSB0eXBlcyBpZiBidWZmZXJpbmcgaXMgZW5hYmxlZC4KICAgIGZpbmlzaGVkIDogYm9vbAogICAgICAgIFdoZXRoZXIgdGhlIGl0ZXJhdGlvbiBvdmVyIHRoZSBvcGVyYW5kcyBpcyBmaW5pc2hlZCBvciBub3QuCiAgICBoYXNfZGVsYXllZF9idWZhbGxvYyA6IGJvb2wKICAgICAgICBJZiBUcnVlLCB0aGUgaXRlcmF0b3Igd2FzIGNyZWF0ZWQgd2l0aCB0aGUgImRlbGF5X2J1ZmFsbG9jIiBmbGFnLAogICAgICAgIGFuZCBubyByZXNldCgpIGZ1bmN0aW9uIHdhcyBjYWxsZWQgb24gaXQgeWV0LgogICAgaGFzX2luZGV4IDogYm9vbAogICAgICAgIElmIFRydWUsIHRoZSBpdGVyYXRvciB3YXMgY3JlYXRlZCB3aXRoIGVpdGhlciB0aGUgImNfaW5kZXgiIG9yCiAgICAgICAgdGhlICJmX2luZGV4IiBmbGFnLCBhbmQgdGhlIHByb3BlcnR5IGBpbmRleGAgY2FuIGJlIHVzZWQgdG8KICAgICAgICByZXRyaWV2ZSBpdC4KICAgIGhhc19tdWx0aV9pbmRleCA6IGJvb2wKICAgICAgICBJZiBUcnVlLCB0aGUgaXRlcmF0b3Igd2FzIGNyZWF0ZWQgd2l0aCB0aGUgIm11bHRpX2luZGV4IiBmbGFnLAogICAgICAgIGFuZCB0aGUgcHJvcGVydHkgYG11bHRpX2luZGV4YCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBpdC4KICAgIGluZGV4CiAgICAgICAgV2hlbiB0aGUgImNfaW5kZXgiIG9yICJmX2luZGV4IiBmbGFnIHdhcyB1c2VkLCB0aGlzIHByb3BlcnR5CiAgICAgICAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbmRleC4gUmFpc2VzIGEgVmFsdWVFcnJvciBpZiBhY2Nlc3NlZAogICAgICAgIGFuZCBgaGFzX2luZGV4YCBpcyBGYWxzZS4KICAgIGl0ZXJhdGlvbm5lZWRzYXBpIDogYm9vbAogICAgICAgIFdoZXRoZXIgaXRlcmF0aW9uIHJlcXVpcmVzIGFjY2VzcyB0byB0aGUgUHl0aG9uIEFQSSwgZm9yIGV4YW1wbGUKICAgICAgICBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGFuIG9iamVjdCBhcnJheS4KICAgIGl0ZXJpbmRleCA6IGludAogICAgICAgIEFuIGluZGV4IHdoaWNoIG1hdGNoZXMgdGhlIG9yZGVyIG9mIGl0ZXJhdGlvbi4KICAgIGl0ZXJzaXplIDogaW50CiAgICAgICAgU2l6ZSBvZiB0aGUgaXRlcmF0b3IuCiAgICBpdHZpZXdzCiAgICAgICAgU3RydWN0dXJlZCB2aWV3KHMpIG9mIGBvcGVyYW5kc2AgaW4gbWVtb3J5LCBtYXRjaGluZyB0aGUgcmVvcmRlcmVkCiAgICAgICAgYW5kIG9wdGltaXplZCBpdGVyYXRvciBhY2Nlc3MgcGF0dGVybi4KICAgIG11bHRpX2luZGV4CiAgICAgICAgV2hlbiB0aGUgIm11bHRpX2luZGV4IiBmbGFnIHdhcyB1c2VkLCB0aGlzIHByb3BlcnR5CiAgICAgICAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbmRleC4gUmFpc2VzIGEgVmFsdWVFcnJvciBpZiBhY2Nlc3NlZAogICAgICAgIGFjY2Vzc2VkIGFuZCBgaGFzX211bHRpX2luZGV4YCBpcyBGYWxzZS4KICAgIG5kaW0gOiBpbnQKICAgICAgICBUaGUgaXRlcmF0b3IncyBkaW1lbnNpb24uCiAgICBub3AgOiBpbnQKICAgICAgICBUaGUgbnVtYmVyIG9mIGl0ZXJhdG9yIG9wZXJhbmRzLgogICAgb3BlcmFuZHMgOiB0dXBsZSBvZiBvcGVyYW5kKHMpCiAgICAgICAgVGhlIGFycmF5KHMpIHRvIGJlIGl0ZXJhdGVkIG92ZXIuCiAgICBzaGFwZSA6IHR1cGxlIG9mIGludHMKICAgICAgICBTaGFwZSB0dXBsZSwgdGhlIHNoYXBlIG9mIHRoZSBpdGVyYXRvci4KICAgIHZhbHVlCiAgICAgICAgVmFsdWUgb2YgYG9wZXJhbmRzYCBhdCBjdXJyZW50IGl0ZXJhdGlvbi4gTm9ybWFsbHksIHRoaXMgaXMgYQogICAgICAgIHR1cGxlIG9mIGFycmF5IHNjYWxhcnMsIGJ1dCBpZiB0aGUgZmxhZyAiZXh0ZXJuYWxfbG9vcCIgaXMgdXNlZCwKICAgICAgICBpdCBpcyBhIHR1cGxlIG9mIG9uZSBkaW1lbnNpb25hbCBhcnJheXMuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBgbmRpdGVyYCBzdXBlcnNlZGVzIGBmbGF0aXRlcmAuICBUaGUgaXRlcmF0b3IgaW1wbGVtZW50YXRpb24gYmVoaW5kCiAgICBgbmRpdGVyYCBpcyBhbHNvIGV4cG9zZWQgYnkgdGhlIE51bVB5IEMgQVBJLgoKICAgIFRoZSBQeXRob24gZXhwb3N1cmUgc3VwcGxpZXMgdHdvIGl0ZXJhdGlvbiBpbnRlcmZhY2VzLCBvbmUgd2hpY2ggZm9sbG93cwogICAgdGhlIFB5dGhvbiBpdGVyYXRvciBwcm90b2NvbCwgYW5kIGFub3RoZXIgd2hpY2ggbWlycm9ycyB0aGUgQy1zdHlsZQogICAgZG8td2hpbGUgcGF0dGVybi4gIFRoZSBuYXRpdmUgUHl0aG9uIGFwcHJvYWNoIGlzIGJldHRlciBpbiBtb3N0IGNhc2VzLCBidXQKICAgIGlmIHlvdSBuZWVkIHRoZSBpdGVyYXRvcidzIGNvb3JkaW5hdGVzIG9yIGluZGV4LCB1c2UgdGhlIEMtc3R5bGUgcGF0dGVybi4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgIEhlcmUgaXMgaG93IHdlIG1pZ2h0IHdyaXRlIGFuIGBgaXRlcl9hZGRgYCBmdW5jdGlvbiwgdXNpbmcgdGhlCiAgICBQeXRob24gaXRlcmF0b3IgcHJvdG9jb2w6OgoKICAgICAgICBkZWYgaXRlcl9hZGRfcHkoeCwgeSwgb3V0PU5vbmUpOgogICAgICAgICAgICBhZGRvcCA9IG5wLmFkZAogICAgICAgICAgICBpdCA9IG5wLm5kaXRlcihbeCwgeSwgb3V0XSwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgIFtbJ3JlYWRvbmx5J10sIFsncmVhZG9ubHknXSwgWyd3cml0ZW9ubHknLCdhbGxvY2F0ZSddXSkKICAgICAgICAgICAgZm9yIChhLCBiLCBjKSBpbiBpdDoKICAgICAgICAgICAgICAgIGFkZG9wKGEsIGIsIG91dD1jKQogICAgICAgICAgICByZXR1cm4gaXQub3BlcmFuZHNbMl0KCiAgICBIZXJlIGlzIHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgZm9sbG93aW5nIHRoZSBDLXN0eWxlIHBhdHRlcm46OgoKICAgICAgICBkZWYgaXRlcl9hZGQoeCwgeSwgb3V0PU5vbmUpOgogICAgICAgICAgICBhZGRvcCA9IG5wLmFkZAoKICAgICAgICAgICAgaXQgPSBucC5uZGl0ZXIoW3gsIHksIG91dF0sIFtdLAogICAgICAgICAgICAgICAgICAgICAgICBbWydyZWFkb25seSddLCBbJ3JlYWRvbmx5J10sIFsnd3JpdGVvbmx5JywnYWxsb2NhdGUnXV0pCgogICAgICAgICAgICB3aGlsZSBub3QgaXQuZmluaXNoZWQ6CiAgICAgICAgICAgICAgICBhZGRvcChpdFswXSwgaXRbMV0sIG91dD1pdFsyXSkKICAgICAgICAgICAgICAgIGl0Lml0ZXJuZXh0KCkKCiAgICAgICAgICAgIHJldHVybiBpdC5vcGVyYW5kc1syXQoKICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvdXRlciBwcm9kdWN0IGZ1bmN0aW9uOjoKCiAgICAgICAgZGVmIG91dGVyX2l0KHgsIHksIG91dD1Ob25lKToKICAgICAgICAgICAgbXVsb3AgPSBucC5tdWx0aXBseQoKICAgICAgICAgICAgaXQgPSBucC5uZGl0ZXIoW3gsIHksIG91dF0sIFsnZXh0ZXJuYWxfbG9vcCddLAogICAgICAgICAgICAgICAgICAgIFtbJ3JlYWRvbmx5J10sIFsncmVhZG9ubHknXSwgWyd3cml0ZW9ubHknLCAnYWxsb2NhdGUnXV0sCiAgICAgICAgICAgICAgICAgICAgb3BfYXhlcz1bcmFuZ2UoeC5uZGltKStbLTFdKnkubmRpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbLTFdKngubmRpbStyYW5nZSh5Lm5kaW0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmVdKQoKICAgICAgICAgICAgZm9yIChhLCBiLCBjKSBpbiBpdDoKICAgICAgICAgICAgICAgIG11bG9wKGEsIGIsIG91dD1jKQoKICAgICAgICAgICAgcmV0dXJuIGl0Lm9wZXJhbmRzWzJdCgogICAgICAgID4+PiBhID0gbnAuYXJhbmdlKDIpKzEKICAgICAgICA+Pj4gYiA9IG5wLmFyYW5nZSgzKSsxCiAgICAgICAgPj4+IG91dGVyX2l0KGEsYikKICAgICAgICBhcnJheShbWzEsIDIsIDNdLAogICAgICAgICAgICAgICBbMiwgNCwgNl1dKQoKICAgIEhlcmUgaXMgYW4gZXhhbXBsZSBmdW5jdGlvbiB3aGljaCBvcGVyYXRlcyBsaWtlIGEgImxhbWJkYSIgdWZ1bmM6OgoKICAgICAgICBkZWYgbHVmKGxhbWRhZXhwciwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgImx1ZihsYW1iZGFleHByLCBvcDEsIC4uLiwgb3BuLCBvdXQ9Tm9uZSwgb3JkZXI9J0snLCBjYXN0aW5nPSdzYWZlJywgYnVmZmVyc2l6ZT0wKSIKICAgICAgICAgICAgbmFyZ3MgPSBsZW4oYXJncykKICAgICAgICAgICAgb3AgPSAoa3dhcmdzLmdldCgnb3V0JyxOb25lKSwpICsgYXJncwogICAgICAgICAgICBpdCA9IG5wLm5kaXRlcihvcCwgWydidWZmZXJlZCcsJ2V4dGVybmFsX2xvb3AnXSwKICAgICAgICAgICAgICAgICAgICBbWyd3cml0ZW9ubHknLCdhbGxvY2F0ZScsJ25vX2Jyb2FkY2FzdCddXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbJ3JlYWRvbmx5JywnbmJvJywnYWxpZ25lZCddXSpuYXJncywKICAgICAgICAgICAgICAgICAgICBvcmRlcj1rd2FyZ3MuZ2V0KCdvcmRlcicsJ0snKSwKICAgICAgICAgICAgICAgICAgICBjYXN0aW5nPWt3YXJncy5nZXQoJ2Nhc3RpbmcnLCdzYWZlJyksCiAgICAgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZT1rd2FyZ3MuZ2V0KCdidWZmZXJzaXplJywwKSkKICAgICAgICAgICAgd2hpbGUgbm90IGl0LmZpbmlzaGVkOgogICAgICAgICAgICAgICAgaXRbMF0gPSBsYW1kYWV4cHIoKml0WzE6XSkKICAgICAgICAgICAgICAgIGl0Lml0ZXJuZXh0KCkKICAgICAgICAgICAgcmV0dXJuIGl0Lm9wZXJhbmRzWzBdCgogICAgICAgID4+PiBhID0gbnAuYXJhbmdlKDUpCiAgICAgICAgPj4+IGIgPSBucC5vbmVzKDUpCiAgICAgICAgPj4+IGx1ZihsYW1iZGEgaSxqOmkqaSArIGovMiwgYSwgYikKICAgICAgICBhcnJheShbICAwLjUsICAgMS41LCAgIDQuNSwgICA5LjUsICAxNi41XSkKCiAgICApAnIJAAAAYRwBAAAKICAgIGNvcHkoKQoKICAgIEdldCBhIGNvcHkgb2YgdGhlIGl0ZXJhdG9yIGluIGl0cyBjdXJyZW50IHN0YXRlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcmFuZ2UoMTApCiAgICA+Pj4geSA9IHggKyAxCiAgICA+Pj4gaXQgPSBucC5uZGl0ZXIoW3gsIHldKQogICAgPj4+IGl0Lm5leHQoKQogICAgKGFycmF5KDApLCBhcnJheSgxKSkKICAgID4+PiBpdDIgPSBpdC5jb3B5KCkKICAgID4+PiBpdDIubmV4dCgpCiAgICAoYXJyYXkoMSksIGFycmF5KDIpKQoKICAgICkC2gtkZWJ1Z19wcmludHpoCiAgICBkZWJ1Z19wcmludCgpCgogICAgUHJpbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGBuZGl0ZXJgIGluc3RhbmNlIGFuZCBkZWJ1ZyBpbmZvIHRvIHN0ZG91dC4KCiAgICApAloUZW5hYmxlX2V4dGVybmFsX2xvb3B6vAogICAgZW5hYmxlX2V4dGVybmFsX2xvb3AoKQoKICAgIFdoZW4gdGhlICJleHRlcm5hbF9sb29wIiB3YXMgbm90IHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiwgYnV0CiAgICBpcyBkZXNpcmVkLCB0aGlzIG1vZGlmaWVzIHRoZSBpdGVyYXRvciB0byBiZWhhdmUgYXMgaWYgdGhlIGZsYWcKICAgIHdhcyBzcGVjaWZpZWQuCgogICAgKQJaCGl0ZXJuZXh0YTgBAAAKICAgIGl0ZXJuZXh0KCkKCiAgICBDaGVjayB3aGV0aGVyIGl0ZXJhdGlvbnMgYXJlIGxlZnQsIGFuZCBwZXJmb3JtIGEgc2luZ2xlIGludGVybmFsIGl0ZXJhdGlvbgogICAgd2l0aG91dCByZXR1cm5pbmcgdGhlIHJlc3VsdC4gIFVzZWQgaW4gdGhlIEMtc3R5bGUgcGF0dGVybiBkby13aGlsZQogICAgcGF0dGVybi4gIEZvciBhbiBleGFtcGxlLCBzZWUgYG5kaXRlcmAuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgaXRlcm5leHQgOiBib29sCiAgICAgICAgV2hldGhlciBvciBub3QgdGhlcmUgYXJlIGl0ZXJhdGlvbnMgbGVmdC4KCiAgICApAloLcmVtb3ZlX2F4aXN6dwogICAgcmVtb3ZlX2F4aXMoaSkKCiAgICBSZW1vdmVzIGF4aXMgYGlgIGZyb20gdGhlIGl0ZXJhdG9yLiBSZXF1aXJlcyB0aGF0IHRoZSBmbGFnICJtdWx0aV9pbmRleCIKICAgIGJlIGVuYWJsZWQuCgogICAgKQJaEnJlbW92ZV9tdWx0aV9pbmRleHqnCiAgICByZW1vdmVfbXVsdGlfaW5kZXgoKQoKICAgIFdoZW4gdGhlICJtdWx0aV9pbmRleCIgZmxhZyB3YXMgc3BlY2lmaWVkLCB0aGlzIHJlbW92ZXMgaXQsIGFsbG93aW5nCiAgICB0aGUgaW50ZXJuYWwgaXRlcmF0aW9uIHN0cnVjdHVyZSB0byBiZSBvcHRpbWl6ZWQgZnVydGhlci4KCiAgICApAtoFcmVzZXR6QAogICAgcmVzZXQoKQoKICAgIFJlc2V0IHRoZSBpdGVyYXRvciB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KCiAgICBaCWJyb2FkY2FzdGG+AwAACiAgICBQcm9kdWNlIGFuIG9iamVjdCB0aGF0IG1pbWljcyBicm9hZGNhc3RpbmcuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgaW4xLCBpbjIsIC4uLiA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBwYXJhbWV0ZXJzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGIgOiBicm9hZGNhc3Qgb2JqZWN0CiAgICAgICAgQnJvYWRjYXN0IHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFnYWluc3Qgb25lIGFub3RoZXIsIGFuZAogICAgICAgIHJldHVybiBhbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHJlc3VsdC4KICAgICAgICBBbW9uZ3N0IG90aGVycywgaXQgaGFzIGBgc2hhcGVgYCBhbmQgYGBuZGBgIHByb3BlcnRpZXMsIGFuZAogICAgICAgIG1heSBiZSB1c2VkIGFzIGFuIGl0ZXJhdG9yLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYnJvYWRjYXN0X2FycmF5cwogICAgYnJvYWRjYXN0X3RvCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBNYW51YWxseSBhZGRpbmcgdHdvIHZlY3RvcnMsIHVzaW5nIGJyb2FkY2FzdGluZzoKCiAgICA+Pj4geCA9IG5wLmFycmF5KFtbMV0sIFsyXSwgWzNdXSkKICAgID4+PiB5ID0gbnAuYXJyYXkoWzQsIDUsIDZdKQogICAgPj4+IGIgPSBucC5icm9hZGNhc3QoeCwgeSkKCiAgICA+Pj4gb3V0ID0gbnAuZW1wdHkoYi5zaGFwZSkKICAgID4+PiBvdXQuZmxhdCA9IFt1K3YgZm9yICh1LHYpIGluIGJdCiAgICA+Pj4gb3V0CiAgICBhcnJheShbWyA1LiwgIDYuLCAgNy5dLAogICAgICAgICAgIFsgNi4sICA3LiwgIDguXSwKICAgICAgICAgICBbIDcuLCAgOC4sICA5Ll1dKQoKICAgIENvbXBhcmUgYWdhaW5zdCBidWlsdC1pbiBicm9hZGNhc3Rpbmc6CgogICAgPj4+IHggKyB5CiAgICBhcnJheShbWzUsIDYsIDddLAogICAgICAgICAgIFs2LCA3LCA4XSwKICAgICAgICAgICBbNywgOCwgOV1dKQoKICAgICkCcgcAAABhHAEAAAogICAgY3VycmVudCBpbmRleCBpbiBicm9hZGNhc3RlZCByZXN1bHQKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJyYXkoW1sxXSwgWzJdLCBbM11dKQogICAgPj4+IHkgPSBucC5hcnJheShbNCwgNSwgNl0pCiAgICA+Pj4gYiA9IG5wLmJyb2FkY2FzdCh4LCB5KQogICAgPj4+IGIuaW5kZXgKICAgIDAKICAgID4+PiBiLm5leHQoKSwgYi5uZXh0KCksIGIubmV4dCgpCiAgICAoKDEsIDQpLCAoMSwgNSksICgxLCA2KSkKICAgID4+PiBiLmluZGV4CiAgICAzCgogICAgKQJaBWl0ZXJzYYsBAAAKICAgIHR1cGxlIG9mIGl0ZXJhdG9ycyBhbG9uZyBgYHNlbGZgYCdzICJjb21wb25lbnRzLiIKCiAgICBSZXR1cm5zIGEgdHVwbGUgb2YgYG51bXB5LmZsYXRpdGVyYCBvYmplY3RzLCBvbmUgZm9yIGVhY2ggImNvbXBvbmVudCIKICAgIG9mIGBgc2VsZmBgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuZmxhdGl0ZXIKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJyYXkoWzEsIDIsIDNdKQogICAgPj4+IHkgPSBucC5hcnJheShbWzRdLCBbNV0sIFs2XV0pCiAgICA+Pj4gYiA9IG5wLmJyb2FkY2FzdCh4LCB5KQogICAgPj4+IHJvdywgY29sID0gYi5pdGVycwogICAgPj4+IHJvdy5uZXh0KCksIGNvbC5uZXh0KCkKICAgICgxLCA0KQoKICAgICkC2gRuZGltevkKICAgIE51bWJlciBvZiBkaW1lbnNpb25zIG9mIGJyb2FkY2FzdGVkIHJlc3VsdC4gQWxpYXMgZm9yIGBuZGAuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMi4wCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFycmF5KFsxLCAyLCAzXSkKICAgID4+PiB5ID0gbnAuYXJyYXkoW1s0XSwgWzVdLCBbNl1dKQogICAgPj4+IGIgPSBucC5icm9hZGNhc3QoeCwgeSkKICAgID4+PiBiLm5kaW0KICAgIDIKCiAgICApAloCbmRhIwEAAAogICAgTnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgYnJvYWRjYXN0ZWQgcmVzdWx0LiBGb3IgY29kZSBpbnRlbmRlZCBmb3IgTnVtUHkKICAgIDEuMTIuMCBhbmQgbGF0ZXIgdGhlIG1vcmUgY29uc2lzdGVudCBgbmRpbWAgaXMgcHJlZmVycmVkLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbMSwgMiwgM10pCiAgICA+Pj4geSA9IG5wLmFycmF5KFtbNF0sIFs1XSwgWzZdXSkKICAgID4+PiBiID0gbnAuYnJvYWRjYXN0KHgsIHkpCiAgICA+Pj4gYi5uZAogICAgMgoKICAgICkCWgdudW1pdGVyetsKICAgIE51bWJlciBvZiBpdGVyYXRvcnMgcG9zc2Vzc2VkIGJ5IHRoZSBicm9hZGNhc3RlZCByZXN1bHQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFycmF5KFsxLCAyLCAzXSkKICAgID4+PiB5ID0gbnAuYXJyYXkoW1s0XSwgWzVdLCBbNl1dKQogICAgPj4+IGIgPSBucC5icm9hZGNhc3QoeCwgeSkKICAgID4+PiBiLm51bWl0ZXIKICAgIDIKCiAgICApAtoFc2hhcGV6wgogICAgU2hhcGUgb2YgYnJvYWRjYXN0ZWQgcmVzdWx0LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbMSwgMiwgM10pCiAgICA+Pj4geSA9IG5wLmFycmF5KFtbNF0sIFs1XSwgWzZdXSkKICAgID4+PiBiID0gbnAuYnJvYWRjYXN0KHgsIHkpCiAgICA+Pj4gYi5zaGFwZQogICAgKDMsIDMpCgogICAgKQLaBHNpemV6wQogICAgVG90YWwgc2l6ZSBvZiBicm9hZGNhc3RlZCByZXN1bHQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFycmF5KFsxLCAyLCAzXSkKICAgID4+PiB5ID0gbnAuYXJyYXkoW1s0XSwgWzVdLCBbNl1dKQogICAgPj4+IGIgPSBucC5icm9hZGNhc3QoeCwgeSkKICAgID4+PiBiLnNpemUKICAgIDkKCiAgICApAnILAAAAYaIBAAAKICAgIHJlc2V0KCkKCiAgICBSZXNldCB0aGUgYnJvYWRjYXN0ZWQgcmVzdWx0J3MgaXRlcmF0b3IocykuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgTm9uZQoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIE5vbmUKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJyYXkoWzEsIDIsIDNdKQogICAgPj4+IHkgPSBucC5hcnJheShbWzRdLCBbNV0sIFs2XV0KICAgID4+PiBiID0gbnAuYnJvYWRjYXN0KHgsIHkpCiAgICA+Pj4gYi5pbmRleAogICAgMAogICAgPj4+IGIubmV4dCgpLCBiLm5leHQoKSwgYi5uZXh0KCkKICAgICgoMSwgNCksICgyLCA0KSwgKDMsIDQpKQogICAgPj4+IGIuaW5kZXgKICAgIDMKICAgID4+PiBiLnJlc2V0KCkKICAgID4+PiBiLmluZGV4CiAgICAwCgogICAgehVudW1weS5jb3JlLm11bHRpYXJyYXnaBWFycmF5YeoNAAAKICAgIGFycmF5KG9iamVjdCwgZHR5cGU9Tm9uZSwgY29weT1UcnVlLCBvcmRlcj0nSycsIHN1Ym9rPUZhbHNlLCBuZG1pbj0wKQoKICAgIENyZWF0ZSBhbiBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBvYmplY3QgOiBhcnJheV9saWtlCiAgICAgICAgQW4gYXJyYXksIGFueSBvYmplY3QgZXhwb3NpbmcgdGhlIGFycmF5IGludGVyZmFjZSwgYW4gb2JqZWN0IHdob3NlCiAgICAgICAgX19hcnJheV9fIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5LCBvciBhbnkgKG5lc3RlZCkgc2VxdWVuY2UuCiAgICBkdHlwZSA6IGRhdGEtdHlwZSwgb3B0aW9uYWwKICAgICAgICBUaGUgZGVzaXJlZCBkYXRhLXR5cGUgZm9yIHRoZSBhcnJheS4gIElmIG5vdCBnaXZlbiwgdGhlbiB0aGUgdHlwZSB3aWxsCiAgICAgICAgYmUgZGV0ZXJtaW5lZCBhcyB0aGUgbWluaW11bSB0eXBlIHJlcXVpcmVkIHRvIGhvbGQgdGhlIG9iamVjdHMgaW4gdGhlCiAgICAgICAgc2VxdWVuY2UuICBUaGlzIGFyZ3VtZW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gJ3VwY2FzdCcgdGhlIGFycmF5LiAgRm9yCiAgICAgICAgZG93bmNhc3RpbmcsIHVzZSB0aGUgLmFzdHlwZSh0KSBtZXRob2QuCiAgICBjb3B5IDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgdGhlbiB0aGUgb2JqZWN0IGlzIGNvcGllZC4gIE90aGVyd2lzZSwgYSBjb3B5IHdpbGwKICAgICAgICBvbmx5IGJlIG1hZGUgaWYgX19hcnJheV9fIHJldHVybnMgYSBjb3B5LCBpZiBvYmogaXMgYSBuZXN0ZWQgc2VxdWVuY2UsCiAgICAgICAgb3IgaWYgYSBjb3B5IGlzIG5lZWRlZCB0byBzYXRpc2Z5IGFueSBvZiB0aGUgb3RoZXIgcmVxdWlyZW1lbnRzCiAgICAgICAgKGBkdHlwZWAsIGBvcmRlcmAsIGV0Yy4pLgogICAgb3JkZXIgOiB7J0snLCAnQScsICdDJywgJ0YnfSwgb3B0aW9uYWwKICAgICAgICBTcGVjaWZ5IHRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSBhcnJheS4gSWYgb2JqZWN0IGlzIG5vdCBhbiBhcnJheSwgdGhlCiAgICAgICAgbmV3bHkgY3JlYXRlZCBhcnJheSB3aWxsIGJlIGluIEMgb3JkZXIgKHJvdyBtYWpvcikgdW5sZXNzICdGJyBpcwogICAgICAgIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGluIEZvcnRyYW4gb3JkZXIgKGNvbHVtbiBtYWpvcikuCiAgICAgICAgSWYgb2JqZWN0IGlzIGFuIGFycmF5IHRoZSBmb2xsb3dpbmcgaG9sZHMuCgogICAgICAgID09PT09ID09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICBvcmRlciAgbm8gY29weSAgICAgICAgICAgICAgICAgICAgIGNvcHk9VHJ1ZQogICAgICAgID09PT09ID09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAnSycgICB1bmNoYW5nZWQgRiAmIEMgb3JkZXIgcHJlc2VydmVkLCBvdGhlcndpc2UgbW9zdCBzaW1pbGFyIG9yZGVyCiAgICAgICAgJ0EnICAgdW5jaGFuZ2VkIEYgb3JkZXIgaWYgaW5wdXQgaXMgRiBhbmQgbm90IEMsIG90aGVyd2lzZSBDIG9yZGVyCiAgICAgICAgJ0MnICAgQyBvcmRlciAgIEMgb3JkZXIKICAgICAgICAnRicgICBGIG9yZGVyICAgRiBvcmRlcgogICAgICAgID09PT09ID09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAgICAgV2hlbiBgYGNvcHk9RmFsc2VgYCBhbmQgYSBjb3B5IGlzIG1hZGUgZm9yIG90aGVyIHJlYXNvbnMsIHRoZSByZXN1bHQgaXMKICAgICAgICB0aGUgc2FtZSBhcyBpZiBgYGNvcHk9VHJ1ZWBgLCB3aXRoIHNvbWUgZXhjZXB0aW9ucyBmb3IgYEFgLCBzZWUgdGhlCiAgICAgICAgTm90ZXMgc2VjdGlvbi4gVGhlIGRlZmF1bHQgb3JkZXIgaXMgJ0snLgogICAgc3Vib2sgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIFRydWUsIHRoZW4gc3ViLWNsYXNzZXMgd2lsbCBiZSBwYXNzZWQtdGhyb3VnaCwgb3RoZXJ3aXNlCiAgICAgICAgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgZm9yY2VkIHRvIGJlIGEgYmFzZS1jbGFzcyBhcnJheSAoZGVmYXVsdCkuCiAgICBuZG1pbiA6IGludCwgb3B0aW9uYWwKICAgICAgICBTcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpbWVuc2lvbnMgdGhhdCB0aGUgcmVzdWx0aW5nCiAgICAgICAgYXJyYXkgc2hvdWxkIGhhdmUuICBPbmVzIHdpbGwgYmUgcHJlLXBlbmRlZCB0byB0aGUgc2hhcGUgYXMKICAgICAgICBuZWVkZWQgdG8gbWVldCB0aGlzIHJlcXVpcmVtZW50LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkKICAgICAgICBBbiBhcnJheSBvYmplY3Qgc2F0aXNmeWluZyB0aGUgc3BlY2lmaWVkIHJlcXVpcmVtZW50cy4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGVtcHR5LCBlbXB0eV9saWtlLCB6ZXJvcywgemVyb3NfbGlrZSwgb25lcywgb25lc19saWtlLCBmdWxsLCBmdWxsX2xpa2UKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFdoZW4gb3JkZXIgaXMgJ0EnIGFuZCBgb2JqZWN0YCBpcyBhbiBhcnJheSBpbiBuZWl0aGVyICdDJyBub3IgJ0YnIG9yZGVyLAogICAgYW5kIGEgY29weSBpcyBmb3JjZWQgYnkgYSBjaGFuZ2UgaW4gZHR5cGUsIHRoZW4gdGhlIG9yZGVyIG9mIHRoZSByZXN1bHQgaXMKICAgIG5vdCBuZWNlc3NhcmlseSAnQycgYXMgZXhwZWN0ZWQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmFycmF5KFsxLCAyLCAzXSkKICAgIGFycmF5KFsxLCAyLCAzXSkKCiAgICBVcGNhc3Rpbmc6CgogICAgPj4+IG5wLmFycmF5KFsxLCAyLCAzLjBdKQogICAgYXJyYXkoWyAxLiwgIDIuLCAgMy5dKQoKICAgIE1vcmUgdGhhbiBvbmUgZGltZW5zaW9uOgoKICAgID4+PiBucC5hcnJheShbWzEsIDJdLCBbMywgNF1dKQogICAgYXJyYXkoW1sxLCAyXSwKICAgICAgICAgICBbMywgNF1dKQoKICAgIE1pbmltdW0gZGltZW5zaW9ucyAyOgoKICAgID4+PiBucC5hcnJheShbMSwgMiwgM10sIG5kbWluPTIpCiAgICBhcnJheShbWzEsIDIsIDNdXSkKCiAgICBUeXBlIHByb3ZpZGVkOgoKICAgID4+PiBucC5hcnJheShbMSwgMiwgM10sIGR0eXBlPWNvbXBsZXgpCiAgICBhcnJheShbIDEuKzAuaiwgIDIuKzAuaiwgIDMuKzAual0pCgogICAgRGF0YS10eXBlIGNvbnNpc3Rpbmcgb2YgbW9yZSB0aGFuIG9uZSBlbGVtZW50OgoKICAgID4+PiB4ID0gbnAuYXJyYXkoWygxLDIpLCgzLDQpXSxkdHlwZT1bKCdhJywnPGk0JyksKCdiJywnPGk0JyldKQogICAgPj4+IHhbJ2EnXQogICAgYXJyYXkoWzEsIDNdKQoKICAgIENyZWF0aW5nIGFuIGFycmF5IGZyb20gc3ViLWNsYXNzZXM6CgogICAgPj4+IG5wLmFycmF5KG5wLm1hdCgnMSAyOyAzIDQnKSkKICAgIGFycmF5KFtbMSwgMl0sCiAgICAgICAgICAgWzMsIDRdXSkKCiAgICA+Pj4gbnAuYXJyYXkobnAubWF0KCcxIDI7IDMgNCcpLCBzdWJvaz1UcnVlKQogICAgbWF0cml4KFtbMSwgMl0sCiAgICAgICAgICAgIFszLCA0XV0pCgogICAg2gVlbXB0eWH0BAAACiAgICBlbXB0eShzaGFwZSwgZHR5cGU9ZmxvYXQsIG9yZGVyPSdDJykKCiAgICBSZXR1cm4gYSBuZXcgYXJyYXkgb2YgZ2l2ZW4gc2hhcGUgYW5kIHR5cGUsIHdpdGhvdXQgaW5pdGlhbGl6aW5nIGVudHJpZXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgc2hhcGUgOiBpbnQgb3IgdHVwbGUgb2YgaW50CiAgICAgICAgU2hhcGUgb2YgdGhlIGVtcHR5IGFycmF5CiAgICBkdHlwZSA6IGRhdGEtdHlwZSwgb3B0aW9uYWwKICAgICAgICBEZXNpcmVkIG91dHB1dCBkYXRhLXR5cGUuCiAgICBvcmRlciA6IHsnQycsICdGJ30sIG9wdGlvbmFsCiAgICAgICAgV2hldGhlciB0byBzdG9yZSBtdWx0aS1kaW1lbnNpb25hbCBkYXRhIGluIHJvdy1tYWpvcgogICAgICAgIChDLXN0eWxlKSBvciBjb2x1bW4tbWFqb3IgKEZvcnRyYW4tc3R5bGUpIG9yZGVyIGluCiAgICAgICAgbWVtb3J5LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkKICAgICAgICBBcnJheSBvZiB1bmluaXRpYWxpemVkIChhcmJpdHJhcnkpIGRhdGEgb2YgdGhlIGdpdmVuIHNoYXBlLCBkdHlwZSwgYW5kCiAgICAgICAgb3JkZXIuICBPYmplY3QgYXJyYXlzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gTm9uZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGVtcHR5X2xpa2UsIHplcm9zLCBvbmVzCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBgZW1wdHlgLCB1bmxpa2UgYHplcm9zYCwgZG9lcyBub3Qgc2V0IHRoZSBhcnJheSB2YWx1ZXMgdG8gemVybywKICAgIGFuZCBtYXkgdGhlcmVmb3JlIGJlIG1hcmdpbmFsbHkgZmFzdGVyLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IHJlcXVpcmVzCiAgICB0aGUgdXNlciB0byBtYW51YWxseSBzZXQgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5LCBhbmQgc2hvdWxkIGJlCiAgICB1c2VkIHdpdGggY2F1dGlvbi4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5lbXB0eShbMiwgMl0pCiAgICBhcnJheShbWyAtOS43NDQ5OTM1OWUrMDAxLCAgIDYuNjk1ODMwNDBlLTMwOV0sCiAgICAgICAgICAgWyAgMi4xMzE4MjYxMWUtMzE0LCAgIDMuMDY5NTk0MzNlLTMwOV1dKSAgICAgICAgICNyYW5kb20KCiAgICA+Pj4gbnAuZW1wdHkoWzIsIDJdLCBkdHlwZT1pbnQpCiAgICBhcnJheShbWy0xMDczNzQxODIxLCAtMTA2Nzk0OTEzM10sCiAgICAgICAgICAgWyAgNDk2MDQxOTg2LCAgICAxOTI0OTc2MF1dKSAgICAgICAgICAgICAgICAgICAgICNyYW5kb20KCiAgICBaCmVtcHR5X2xpa2Vh7QcAAAogICAgZW1wdHlfbGlrZShhLCBkdHlwZT1Ob25lLCBvcmRlcj0nSycsIHN1Ym9rPVRydWUpCgogICAgUmV0dXJuIGEgbmV3IGFycmF5IHdpdGggdGhlIHNhbWUgc2hhcGUgYW5kIHR5cGUgYXMgYSBnaXZlbiBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBzaGFwZSBhbmQgZGF0YS10eXBlIG9mIGBhYCBkZWZpbmUgdGhlc2Ugc2FtZSBhdHRyaWJ1dGVzIG9mIHRoZQogICAgICAgIHJldHVybmVkIGFycmF5LgogICAgZHR5cGUgOiBkYXRhLXR5cGUsIG9wdGlvbmFsCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHJlc3VsdC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS42LjAKICAgIG9yZGVyIDogeydDJywgJ0YnLCAnQScsIG9yICdLJ30sIG9wdGlvbmFsCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSByZXN1bHQuICdDJyBtZWFucyBDLW9yZGVyLAogICAgICAgICdGJyBtZWFucyBGLW9yZGVyLCAnQScgbWVhbnMgJ0YnIGlmIGBgYWBgIGlzIEZvcnRyYW4gY29udGlndW91cywKICAgICAgICAnQycgb3RoZXJ3aXNlLiAnSycgbWVhbnMgbWF0Y2ggdGhlIGxheW91dCBvZiBgYGFgYCBhcyBjbG9zZWx5CiAgICAgICAgYXMgcG9zc2libGUuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNi4wCiAgICBzdWJvayA6IGJvb2wsIG9wdGlvbmFsLgogICAgICAgIElmIFRydWUsIHRoZW4gdGhlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgd2lsbCB1c2UgdGhlIHN1Yi1jbGFzcwogICAgICAgIHR5cGUgb2YgJ2EnLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBhIGJhc2UtY2xhc3MgYXJyYXkuIERlZmF1bHRzCiAgICAgICAgdG8gVHJ1ZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBuZGFycmF5CiAgICAgICAgQXJyYXkgb2YgdW5pbml0aWFsaXplZCAoYXJiaXRyYXJ5KSBkYXRhIHdpdGggdGhlIHNhbWUKICAgICAgICBzaGFwZSBhbmQgdHlwZSBhcyBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBvbmVzX2xpa2UgOiBSZXR1cm4gYW4gYXJyYXkgb2Ygb25lcyB3aXRoIHNoYXBlIGFuZCB0eXBlIG9mIGlucHV0LgogICAgemVyb3NfbGlrZSA6IFJldHVybiBhbiBhcnJheSBvZiB6ZXJvcyB3aXRoIHNoYXBlIGFuZCB0eXBlIG9mIGlucHV0LgogICAgZW1wdHkgOiBSZXR1cm4gYSBuZXcgdW5pbml0aWFsaXplZCBhcnJheS4KICAgIG9uZXMgOiBSZXR1cm4gYSBuZXcgYXJyYXkgc2V0dGluZyB2YWx1ZXMgdG8gb25lLgogICAgemVyb3MgOiBSZXR1cm4gYSBuZXcgYXJyYXkgc2V0dGluZyB2YWx1ZXMgdG8gemVyby4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyAqbm90KiBpbml0aWFsaXplIHRoZSByZXR1cm5lZCBhcnJheTsgdG8gZG8gdGhhdCB1c2UKICAgIGB6ZXJvc19saWtlYCBvciBgb25lc19saWtlYCBpbnN0ZWFkLiAgSXQgbWF5IGJlIG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4KICAgIHRoZSBmdW5jdGlvbnMgdGhhdCBkbyBzZXQgdGhlIGFycmF5IHZhbHVlcy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gKFsxLDIsM10sIFs0LDUsNl0pICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBpcyBhcnJheS1saWtlCiAgICA+Pj4gbnAuZW1wdHlfbGlrZShhKQogICAgYXJyYXkoW1stMTA3Mzc0MTgyMSwgLTEwNzM3NDE4MjEsICAgICAgICAgICAzXSwgICAgI3JhbmRvbQogICAgICAgICAgIFsgICAgICAgICAgMCwgICAgICAgICAgIDAsIC0xMDczNzQxODIxXV0pCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMS4sIDIuLCAzLl0sWzQuLDUuLDYuXV0pCiAgICA+Pj4gbnAuZW1wdHlfbGlrZShhKQogICAgYXJyYXkoW1sgLTIuMDAwMDA3MTVlKzAwMCwgICAxLjQ4MjE5Njk0ZS0zMjMsICAtMi4wMDAwMDU3MmUrMDAwXSwjcmFuZG9tCiAgICAgICAgICAgWyAgNC4zODc5MTUxOGUtMzA1LCAgLTIuMDAwMDA3MTVlKzAwMCwgICA0LjE3MjY5MjUyZS0zMDldXSkKCiAgICBaBnNjYWxhcmGxAQAACiAgICBzY2FsYXIoZHR5cGUsIG9iaikKCiAgICBSZXR1cm4gYSBuZXcgc2NhbGFyIGFycmF5IG9mIHRoZSBnaXZlbiB0eXBlIGluaXRpYWxpemVkIHdpdGggb2JqLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgbWFpbmx5IGZvciBwaWNrbGUgc3VwcG9ydC4gYGR0eXBlYCBtdXN0IGJlIGEKICAgIHZhbGlkIGRhdGEtdHlwZSBkZXNjcmlwdG9yLiBJZiBgZHR5cGVgIGNvcnJlc3BvbmRzIHRvIGFuIG9iamVjdAogICAgZGVzY3JpcHRvciwgdGhlbiBgb2JqYCBjYW4gYmUgYW55IG9iamVjdCwgb3RoZXJ3aXNlIGBvYmpgIG11c3QgYmUgYQogICAgc3RyaW5nLiBJZiBgb2JqYCBpcyBub3QgZ2l2ZW4sIGl0IHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgTm9uZSBmb3Igb2JqZWN0CiAgICB0eXBlIGFuZCBhcyB6ZXJvcyBmb3IgYWxsIG90aGVyIHR5cGVzLgoKICAgINoFemVyb3NhigUAAAogICAgemVyb3Moc2hhcGUsIGR0eXBlPWZsb2F0LCBvcmRlcj0nQycpCgogICAgUmV0dXJuIGEgbmV3IGFycmF5IG9mIGdpdmVuIHNoYXBlIGFuZCB0eXBlLCBmaWxsZWQgd2l0aCB6ZXJvcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBzaGFwZSA6IGludCBvciBzZXF1ZW5jZSBvZiBpbnRzCiAgICAgICAgU2hhcGUgb2YgdGhlIG5ldyBhcnJheSwgZS5nLiwgYGAoMiwgMylgYCBvciBgYDJgYC4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIFRoZSBkZXNpcmVkIGRhdGEtdHlwZSBmb3IgdGhlIGFycmF5LCBlLmcuLCBgbnVtcHkuaW50OGAuICBEZWZhdWx0IGlzCiAgICAgICAgYG51bXB5LmZsb2F0NjRgLgogICAgb3JkZXIgOiB7J0MnLCAnRid9LCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gc3RvcmUgbXVsdGlkaW1lbnNpb25hbCBkYXRhIGluIEMtIG9yIEZvcnRyYW4tY29udGlndW91cwogICAgICAgIChyb3ctIG9yIGNvbHVtbi13aXNlKSBvcmRlciBpbiBtZW1vcnkuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIEFycmF5IG9mIHplcm9zIHdpdGggdGhlIGdpdmVuIHNoYXBlLCBkdHlwZSwgYW5kIG9yZGVyLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgemVyb3NfbGlrZSA6IFJldHVybiBhbiBhcnJheSBvZiB6ZXJvcyB3aXRoIHNoYXBlIGFuZCB0eXBlIG9mIGlucHV0LgogICAgb25lc19saWtlIDogUmV0dXJuIGFuIGFycmF5IG9mIG9uZXMgd2l0aCBzaGFwZSBhbmQgdHlwZSBvZiBpbnB1dC4KICAgIGVtcHR5X2xpa2UgOiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgd2l0aCBzaGFwZSBhbmQgdHlwZSBvZiBpbnB1dC4KICAgIG9uZXMgOiBSZXR1cm4gYSBuZXcgYXJyYXkgc2V0dGluZyB2YWx1ZXMgdG8gb25lLgogICAgZW1wdHkgOiBSZXR1cm4gYSBuZXcgdW5pbml0aWFsaXplZCBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC56ZXJvcyg1KQogICAgYXJyYXkoWyAwLiwgIDAuLCAgMC4sICAwLiwgIDAuXSkKCiAgICA+Pj4gbnAuemVyb3MoKDUsKSwgZHR5cGU9bnAuaW50KQogICAgYXJyYXkoWzAsIDAsIDAsIDAsIDBdKQoKICAgID4+PiBucC56ZXJvcygoMiwgMSkpCiAgICBhcnJheShbWyAwLl0sCiAgICAgICAgICAgWyAwLl1dKQoKICAgID4+PiBzID0gKDIsMikKICAgID4+PiBucC56ZXJvcyhzKQogICAgYXJyYXkoW1sgMC4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDAuXV0pCgogICAgPj4+IG5wLnplcm9zKCgyLCksIGR0eXBlPVsoJ3gnLCAnaTQnKSwgKCd5JywgJ2k0JyldKSAjIGN1c3RvbSBkdHlwZQogICAgYXJyYXkoWygwLCAwKSwgKDAsIDApXSwKICAgICAgICAgIGR0eXBlPVsoJ3gnLCAnPGk0JyksICgneScsICc8aTQnKV0pCgogICAgWgxzZXRfdHlwZURpY3R6dXNldF90eXBlRGljdChkaWN0KQoKICAgIFNldCB0aGUgaW50ZXJuYWwgZGljdGlvbmFyeSB0aGF0IGNhbiBsb29rIHVwIGFuIGFycmF5IHR5cGUgdXNpbmcgYQogICAgcmVnaXN0ZXJlZCBjb2RlLgoKICAgIFoKZnJvbXN0cmluZ2EVBgAACiAgICBmcm9tc3RyaW5nKHN0cmluZywgZHR5cGU9ZmxvYXQsIGNvdW50PS0xLCBzZXA9JycpCgogICAgQSBuZXcgMS1EIGFycmF5IGluaXRpYWxpemVkIGZyb20gcmF3IGJpbmFyeSBvciB0ZXh0IGRhdGEgaW4gYSBzdHJpbmcuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgc3RyaW5nIDogc3RyCiAgICAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGF0YS4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGFycmF5OyBkZWZhdWx0OiBmbG9hdC4gIEZvciBiaW5hcnkgaW5wdXQgZGF0YSwKICAgICAgICB0aGUgZGF0YSBtdXN0IGJlIGluIGV4YWN0bHkgdGhpcyBmb3JtYXQuCiAgICBjb3VudCA6IGludCwgb3B0aW9uYWwKICAgICAgICBSZWFkIHRoaXMgbnVtYmVyIG9mIGBkdHlwZWAgZWxlbWVudHMgZnJvbSB0aGUgZGF0YS4gIElmIHRoaXMgaXMKICAgICAgICBuZWdhdGl2ZSAodGhlIGRlZmF1bHQpLCB0aGUgY291bnQgd2lsbCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlCiAgICAgICAgbGVuZ3RoIG9mIHRoZSBkYXRhLgogICAgc2VwIDogc3RyLCBvcHRpb25hbAogICAgICAgIElmIG5vdCBwcm92aWRlZCBvciwgZXF1aXZhbGVudGx5LCB0aGUgZW1wdHkgc3RyaW5nLCB0aGUgZGF0YSB3aWxsCiAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYmluYXJ5IGRhdGE7IG90aGVyd2lzZSwgYXMgQVNDSUkgdGV4dCB3aXRoCiAgICAgICAgZGVjaW1hbCBudW1iZXJzLiAgQWxzbyBpbiB0aGlzIGxhdHRlciBjYXNlLCB0aGlzIGFyZ3VtZW50IGlzCiAgICAgICAgaW50ZXJwcmV0ZWQgYXMgdGhlIHN0cmluZyBzZXBhcmF0aW5nIG51bWJlcnMgaW4gdGhlIGRhdGE7IGV4dHJhCiAgICAgICAgd2hpdGVzcGFjZSBiZXR3ZWVuIGVsZW1lbnRzIGlzIGFsc28gaWdub3JlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBhcnIgOiBuZGFycmF5CiAgICAgICAgVGhlIGNvbnN0cnVjdGVkIGFycmF5LgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgdGhlIHN0cmluZyBpcyBub3QgdGhlIGNvcnJlY3Qgc2l6ZSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0ZWQKICAgICAgICBgZHR5cGVgIGFuZCBgY291bnRgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgZnJvbWJ1ZmZlciwgZnJvbWZpbGUsIGZyb21pdGVyCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuZnJvbXN0cmluZygnXHgwMVx4MDInLCBkdHlwZT1ucC51aW50OCkKICAgIGFycmF5KFsxLCAyXSwgZHR5cGU9dWludDgpCiAgICA+Pj4gbnAuZnJvbXN0cmluZygnMSAyJywgZHR5cGU9aW50LCBzZXA9JyAnKQogICAgYXJyYXkoWzEsIDJdKQogICAgPj4+IG5wLmZyb21zdHJpbmcoJzEsIDInLCBkdHlwZT1pbnQsIHNlcD0nLCcpCiAgICBhcnJheShbMSwgMl0pCiAgICA+Pj4gbnAuZnJvbXN0cmluZygnXHgwMVx4MDJceDAzXHgwNFx4MDUnLCBkdHlwZT1ucC51aW50OCwgY291bnQ9MykKICAgIGFycmF5KFsxLCAyLCAzXSwgZHR5cGU9dWludDgpCgogICAgWghmcm9taXRlcmEuAwAACiAgICBmcm9taXRlcihpdGVyYWJsZSwgZHR5cGUsIGNvdW50PS0xKQoKICAgIENyZWF0ZSBhIG5ldyAxLWRpbWVuc2lvbmFsIGFycmF5IGZyb20gYW4gaXRlcmFibGUgb2JqZWN0LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGl0ZXJhYmxlIDogaXRlcmFibGUgb2JqZWN0CiAgICAgICAgQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGluZyBkYXRhIGZvciB0aGUgYXJyYXkuCiAgICBkdHlwZSA6IGRhdGEtdHlwZQogICAgICAgIFRoZSBkYXRhLXR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5LgogICAgY291bnQgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgVGhlIG51bWJlciBvZiBpdGVtcyB0byByZWFkIGZyb20gKml0ZXJhYmxlKi4gIFRoZSBkZWZhdWx0IGlzIC0xLAogICAgICAgIHdoaWNoIG1lYW5zIGFsbCBkYXRhIGlzIHJlYWQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIFRoZSBvdXRwdXQgYXJyYXkuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBTcGVjaWZ5IGBjb3VudGAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gIEl0IGFsbG93cyBgYGZyb21pdGVyYGAgdG8KICAgIHByZS1hbGxvY2F0ZSB0aGUgb3V0cHV0IGFycmF5LCBpbnN0ZWFkIG9mIHJlc2l6aW5nIGl0IG9uIGRlbWFuZC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpdGVyYWJsZSA9ICh4KnggZm9yIHggaW4gcmFuZ2UoNSkpCiAgICA+Pj4gbnAuZnJvbWl0ZXIoaXRlcmFibGUsIG5wLmZsb2F0KQogICAgYXJyYXkoWyAgMC4sICAgMS4sICAgNC4sICAgOS4sICAxNi5dKQoKICAgIFoIZnJvbWZpbGVhIQkAAAogICAgZnJvbWZpbGUoZmlsZSwgZHR5cGU9ZmxvYXQsIGNvdW50PS0xLCBzZXA9JycpCgogICAgQ29uc3RydWN0IGFuIGFycmF5IGZyb20gZGF0YSBpbiBhIHRleHQgb3IgYmluYXJ5IGZpbGUuCgogICAgQSBoaWdobHkgZWZmaWNpZW50IHdheSBvZiByZWFkaW5nIGJpbmFyeSBkYXRhIHdpdGggYSBrbm93biBkYXRhLXR5cGUsCiAgICBhcyB3ZWxsIGFzIHBhcnNpbmcgc2ltcGx5IGZvcm1hdHRlZCB0ZXh0IGZpbGVzLiAgRGF0YSB3cml0dGVuIHVzaW5nIHRoZQogICAgYHRvZmlsZWAgbWV0aG9kIGNhbiBiZSByZWFkIHVzaW5nIHRoaXMgZnVuY3Rpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgZmlsZSA6IGZpbGUgb3Igc3RyCiAgICAgICAgT3BlbiBmaWxlIG9iamVjdCBvciBmaWxlbmFtZS4KICAgIGR0eXBlIDogZGF0YS10eXBlCiAgICAgICAgRGF0YSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheS4KICAgICAgICBGb3IgYmluYXJ5IGZpbGVzLCBpdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgc2l6ZSBhbmQgYnl0ZS1vcmRlcgogICAgICAgIG9mIHRoZSBpdGVtcyBpbiB0aGUgZmlsZS4KICAgIGNvdW50IDogaW50CiAgICAgICAgTnVtYmVyIG9mIGl0ZW1zIHRvIHJlYWQuIGBgLTFgYCBtZWFucyBhbGwgaXRlbXMgKGkuZS4sIHRoZSBjb21wbGV0ZQogICAgICAgIGZpbGUpLgogICAgc2VwIDogc3RyCiAgICAgICAgU2VwYXJhdG9yIGJldHdlZW4gaXRlbXMgaWYgZmlsZSBpcyBhIHRleHQgZmlsZS4KICAgICAgICBFbXB0eSAoIiIpIHNlcGFyYXRvciBtZWFucyB0aGUgZmlsZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBiaW5hcnkuCiAgICAgICAgU3BhY2VzICgiICIpIGluIHRoZSBzZXBhcmF0b3IgbWF0Y2ggemVybyBvciBtb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KICAgICAgICBBIHNlcGFyYXRvciBjb25zaXN0aW5nIG9ubHkgb2Ygc3BhY2VzIG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lCiAgICAgICAgd2hpdGVzcGFjZS4KCiAgICBTZWUgYWxzbwogICAgLS0tLS0tLS0KICAgIGxvYWQsIHNhdmUKICAgIG5kYXJyYXkudG9maWxlCiAgICBsb2FkdHh0IDogTW9yZSBmbGV4aWJsZSB3YXkgb2YgbG9hZGluZyBkYXRhIGZyb20gYSB0ZXh0IGZpbGUuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBEbyBub3QgcmVseSBvbiB0aGUgY29tYmluYXRpb24gb2YgYHRvZmlsZWAgYW5kIGBmcm9tZmlsZWAgZm9yCiAgICBkYXRhIHN0b3JhZ2UsIGFzIHRoZSBiaW5hcnkgZmlsZXMgZ2VuZXJhdGVkIGFyZSBhcmUgbm90IHBsYXRmb3JtCiAgICBpbmRlcGVuZGVudC4gIEluIHBhcnRpY3VsYXIsIG5vIGJ5dGUtb3JkZXIgb3IgZGF0YS10eXBlIGluZm9ybWF0aW9uIGlzCiAgICBzYXZlZC4gIERhdGEgY2FuIGJlIHN0b3JlZCBpbiB0aGUgcGxhdGZvcm0gaW5kZXBlbmRlbnQgYGAubnB5YGAgZm9ybWF0CiAgICB1c2luZyBgc2F2ZWAgYW5kIGBsb2FkYCBpbnN0ZWFkLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgQ29uc3RydWN0IGFuIG5kYXJyYXk6CgogICAgPj4+IGR0ID0gbnAuZHR5cGUoWygndGltZScsIFsoJ21pbicsIGludCksICgnc2VjJywgaW50KV0pLAogICAgLi4uICAgICAgICAgICAgICAgICgndGVtcCcsIGZsb2F0KV0pCiAgICA+Pj4geCA9IG5wLnplcm9zKCgxLCksIGR0eXBlPWR0KQogICAgPj4+IHhbJ3RpbWUnXVsnbWluJ10gPSAxMDsgeFsndGVtcCddID0gOTguMjUKICAgID4+PiB4CiAgICBhcnJheShbKCgxMCwgMCksIDk4LjI1KV0sCiAgICAgICAgICBkdHlwZT1bKCd0aW1lJywgWygnbWluJywgJzxpNCcpLCAoJ3NlYycsICc8aTQnKV0pLCAoJ3RlbXAnLCAnPGY4JyldKQoKICAgIFNhdmUgdGhlIHJhdyBkYXRhIHRvIGRpc2s6CgogICAgPj4+IGltcG9ydCBvcwogICAgPj4+IGZuYW1lID0gb3MudG1wbmFtKCkKICAgID4+PiB4LnRvZmlsZShmbmFtZSkKCiAgICBSZWFkIHRoZSByYXcgZGF0YSBmcm9tIGRpc2s6CgogICAgPj4+IG5wLmZyb21maWxlKGZuYW1lLCBkdHlwZT1kdCkKICAgIGFycmF5KFsoKDEwLCAwKSwgOTguMjUpXSwKICAgICAgICAgIGR0eXBlPVsoJ3RpbWUnLCBbKCdtaW4nLCAnPGk0JyksICgnc2VjJywgJzxpNCcpXSksICgndGVtcCcsICc8ZjgnKV0pCgogICAgVGhlIHJlY29tbWVuZGVkIHdheSB0byBzdG9yZSBhbmQgbG9hZCBkYXRhOgoKICAgID4+PiBucC5zYXZlKGZuYW1lLCB4KQogICAgPj4+IG5wLmxvYWQoZm5hbWUgKyAnLm5weScpCiAgICBhcnJheShbKCgxMCwgMCksIDk4LjI1KV0sCiAgICAgICAgICBkdHlwZT1bKCd0aW1lJywgWygnbWluJywgJzxpNCcpLCAoJ3NlYycsICc8aTQnKV0pLCAoJ3RlbXAnLCAnPGY4JyldKQoKICAgIFoKZnJvbWJ1ZmZlcmEDBAAACiAgICBmcm9tYnVmZmVyKGJ1ZmZlciwgZHR5cGU9ZmxvYXQsIGNvdW50PS0xLCBvZmZzZXQ9MCkKCiAgICBJbnRlcnByZXQgYSBidWZmZXIgYXMgYSAxLWRpbWVuc2lvbmFsIGFycmF5LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGJ1ZmZlciA6IGJ1ZmZlcl9saWtlCiAgICAgICAgQW4gb2JqZWN0IHRoYXQgZXhwb3NlcyB0aGUgYnVmZmVyIGludGVyZmFjZS4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIERhdGEtdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXk7IGRlZmF1bHQ6IGZsb2F0LgogICAgY291bnQgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgTnVtYmVyIG9mIGl0ZW1zIHRvIHJlYWQuIGBgLTFgYCBtZWFucyBhbGwgZGF0YSBpbiB0aGUgYnVmZmVyLgogICAgb2Zmc2V0IDogaW50LCBvcHRpb25hbAogICAgICAgIFN0YXJ0IHJlYWRpbmcgdGhlIGJ1ZmZlciBmcm9tIHRoaXMgb2Zmc2V0IChpbiBieXRlcyk7IGRlZmF1bHQ6IDAuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBJZiB0aGUgYnVmZmVyIGhhcyBkYXRhIHRoYXQgaXMgbm90IGluIG1hY2hpbmUgYnl0ZS1vcmRlciwgdGhpcyBzaG91bGQKICAgIGJlIHNwZWNpZmllZCBhcyBwYXJ0IG9mIHRoZSBkYXRhLXR5cGUsIGUuZy46OgoKICAgICAgPj4+IGR0ID0gbnAuZHR5cGUoaW50KQogICAgICA+Pj4gZHQgPSBkdC5uZXdieXRlb3JkZXIoJz4nKQogICAgICA+Pj4gbnAuZnJvbWJ1ZmZlcihidWYsIGR0eXBlPWR0KQoKICAgIFRoZSBkYXRhIG9mIHRoZSByZXN1bHRpbmcgYXJyYXkgd2lsbCBub3QgYmUgYnl0ZXN3YXBwZWQsIGJ1dCB3aWxsIGJlCiAgICBpbnRlcnByZXRlZCBjb3JyZWN0bHkuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gcyA9ICdoZWxsbyB3b3JsZCcKICAgID4+PiBucC5mcm9tYnVmZmVyKHMsIGR0eXBlPSdTMScsIGNvdW50PTUsIG9mZnNldD02KQogICAgYXJyYXkoWyd3JywgJ28nLCAncicsICdsJywgJ2QnXSwKICAgICAgICAgIGR0eXBlPSd8UzEnKQoKICAgIFoLY29uY2F0ZW5hdGVhlwkAAAogICAgY29uY2F0ZW5hdGUoKGExLCBhMiwgLi4uKSwgYXhpcz0wKQoKICAgIEpvaW4gYSBzZXF1ZW5jZSBvZiBhcnJheXMgYWxvbmcgYW4gZXhpc3RpbmcgYXhpcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhMSwgYTIsIC4uLiA6IHNlcXVlbmNlIG9mIGFycmF5X2xpa2UKICAgICAgICBUaGUgYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSwgZXhjZXB0IGluIHRoZSBkaW1lbnNpb24KICAgICAgICBjb3JyZXNwb25kaW5nIHRvIGBheGlzYCAodGhlIGZpcnN0LCBieSBkZWZhdWx0KS4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgVGhlIGF4aXMgYWxvbmcgd2hpY2ggdGhlIGFycmF5cyB3aWxsIGJlIGpvaW5lZC4gIERlZmF1bHQgaXMgMC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXMgOiBuZGFycmF5CiAgICAgICAgVGhlIGNvbmNhdGVuYXRlZCBhcnJheS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG1hLmNvbmNhdGVuYXRlIDogQ29uY2F0ZW5hdGUgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaW5wdXQgbWFza3MuCiAgICBhcnJheV9zcGxpdCA6IFNwbGl0IGFuIGFycmF5IGludG8gbXVsdGlwbGUgc3ViLWFycmF5cyBvZiBlcXVhbCBvcgogICAgICAgICAgICAgICAgICBuZWFyLWVxdWFsIHNpemUuCiAgICBzcGxpdCA6IFNwbGl0IGFycmF5IGludG8gYSBsaXN0IG9mIG11bHRpcGxlIHN1Yi1hcnJheXMgb2YgZXF1YWwgc2l6ZS4KICAgIGhzcGxpdCA6IFNwbGl0IGFycmF5IGludG8gbXVsdGlwbGUgc3ViLWFycmF5cyBob3Jpem9udGFsbHkgKGNvbHVtbiB3aXNlKQogICAgdnNwbGl0IDogU3BsaXQgYXJyYXkgaW50byBtdWx0aXBsZSBzdWItYXJyYXlzIHZlcnRpY2FsbHkgKHJvdyB3aXNlKQogICAgZHNwbGl0IDogU3BsaXQgYXJyYXkgaW50byBtdWx0aXBsZSBzdWItYXJyYXlzIGFsb25nIHRoZSAzcmQgYXhpcyAoZGVwdGgpLgogICAgc3RhY2sgOiBTdGFjayBhIHNlcXVlbmNlIG9mIGFycmF5cyBhbG9uZyBhIG5ldyBheGlzLgogICAgaHN0YWNrIDogU3RhY2sgYXJyYXlzIGluIHNlcXVlbmNlIGhvcml6b250YWxseSAoY29sdW1uIHdpc2UpCiAgICB2c3RhY2sgOiBTdGFjayBhcnJheXMgaW4gc2VxdWVuY2UgdmVydGljYWxseSAocm93IHdpc2UpCiAgICBkc3RhY2sgOiBTdGFjayBhcnJheXMgaW4gc2VxdWVuY2UgZGVwdGggd2lzZSAoYWxvbmcgdGhpcmQgZGltZW5zaW9uKQoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgV2hlbiBvbmUgb3IgbW9yZSBvZiB0aGUgYXJyYXlzIHRvIGJlIGNvbmNhdGVuYXRlZCBpcyBhIE1hc2tlZEFycmF5LAogICAgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIE1hc2tlZEFycmF5IG9iamVjdCBpbnN0ZWFkIG9mIGFuIG5kYXJyYXksCiAgICBidXQgdGhlIGlucHV0IG1hc2tzIGFyZSAqbm90KiBwcmVzZXJ2ZWQuIEluIGNhc2VzIHdoZXJlIGEgTWFza2VkQXJyYXkKICAgIGlzIGV4cGVjdGVkIGFzIGlucHV0LCB1c2UgdGhlIG1hLmNvbmNhdGVuYXRlIGZ1bmN0aW9uIGZyb20gdGhlIG1hc2tlZAogICAgYXJyYXkgbW9kdWxlIGluc3RlYWQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMSwgMl0sIFszLCA0XV0pCiAgICA+Pj4gYiA9IG5wLmFycmF5KFtbNSwgNl1dKQogICAgPj4+IG5wLmNvbmNhdGVuYXRlKChhLCBiKSwgYXhpcz0wKQogICAgYXJyYXkoW1sxLCAyXSwKICAgICAgICAgICBbMywgNF0sCiAgICAgICAgICAgWzUsIDZdXSkKICAgID4+PiBucC5jb25jYXRlbmF0ZSgoYSwgYi5UKSwgYXhpcz0xKQogICAgYXJyYXkoW1sxLCAyLCA1XSwKICAgICAgICAgICBbMywgNCwgNl1dKQoKICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcHJlc2VydmUgbWFza2luZyBvZiBNYXNrZWRBcnJheSBpbnB1dHMuCgogICAgPj4+IGEgPSBucC5tYS5hcmFuZ2UoMykKICAgID4+PiBhWzFdID0gbnAubWEubWFza2VkCiAgICA+Pj4gYiA9IG5wLmFyYW5nZSgyLCA1KQogICAgPj4+IGEKICAgIG1hc2tlZF9hcnJheShkYXRhID0gWzAgLS0gMl0sCiAgICAgICAgICAgICAgICAgbWFzayA9IFtGYWxzZSAgVHJ1ZSBGYWxzZV0sCiAgICAgICAgICAgZmlsbF92YWx1ZSA9IDk5OTk5OSkKICAgID4+PiBiCiAgICBhcnJheShbMiwgMywgNF0pCiAgICA+Pj4gbnAuY29uY2F0ZW5hdGUoW2EsIGJdKQogICAgbWFza2VkX2FycmF5KGRhdGEgPSBbMCAxIDIgMiAzIDRdLAogICAgICAgICAgICAgICAgIG1hc2sgPSBGYWxzZSwKICAgICAgICAgICBmaWxsX3ZhbHVlID0gOTk5OTk5KQogICAgPj4+IG5wLm1hLmNvbmNhdGVuYXRlKFthLCBiXSkKICAgIG1hc2tlZF9hcnJheShkYXRhID0gWzAgLS0gMiAyIDMgNF0sCiAgICAgICAgICAgICAgICAgbWFzayA9IFtGYWxzZSAgVHJ1ZSBGYWxzZSBGYWxzZSBGYWxzZSBGYWxzZV0sCiAgICAgICAgICAgZmlsbF92YWx1ZSA9IDk5OTk5OSkKCiAgICDaBWlubmVyYWoGAAAKICAgIGlubmVyKGEsIGIpCgogICAgSW5uZXIgcHJvZHVjdCBvZiB0d28gYXJyYXlzLgoKICAgIE9yZGluYXJ5IGlubmVyIHByb2R1Y3Qgb2YgdmVjdG9ycyBmb3IgMS1EIGFycmF5cyAod2l0aG91dCBjb21wbGV4CiAgICBjb25qdWdhdGlvbiksIGluIGhpZ2hlciBkaW1lbnNpb25zIGEgc3VtIHByb2R1Y3Qgb3ZlciB0aGUgbGFzdCBheGVzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEsIGIgOiBhcnJheV9saWtlCiAgICAgICAgSWYgYGFgIGFuZCBgYmAgYXJlIG5vbnNjYWxhciwgdGhlaXIgbGFzdCBkaW1lbnNpb25zIG11c3QgbWF0Y2guCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIGBvdXQuc2hhcGUgPSBhLnNoYXBlWzotMV0gKyBiLnNoYXBlWzotMV1gCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIFZhbHVlRXJyb3IKICAgICAgICBJZiB0aGUgbGFzdCBkaW1lbnNpb24gb2YgYGFgIGFuZCBgYmAgaGFzIGRpZmZlcmVudCBzaXplLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgdGVuc29yZG90IDogU3VtIHByb2R1Y3RzIG92ZXIgYXJiaXRyYXJ5IGF4ZXMuCiAgICBkb3QgOiBHZW5lcmFsaXNlZCBtYXRyaXggcHJvZHVjdCwgdXNpbmcgc2Vjb25kIGxhc3QgZGltZW5zaW9uIG9mIGBiYC4KICAgIGVpbnN1bSA6IEVpbnN0ZWluIHN1bW1hdGlvbiBjb252ZW50aW9uLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgRm9yIHZlY3RvcnMgKDEtRCBhcnJheXMpIGl0IGNvbXB1dGVzIHRoZSBvcmRpbmFyeSBpbm5lci1wcm9kdWN0OjoKCiAgICAgICAgbnAuaW5uZXIoYSwgYikgPSBzdW0oYVs6XSpiWzpdKQoKICAgIE1vcmUgZ2VuZXJhbGx5LCBpZiBgbmRpbShhKSA9IHIgPiAwYCBhbmQgYG5kaW0oYikgPSBzID4gMGA6OgoKICAgICAgICBucC5pbm5lcihhLCBiKSA9IG5wLnRlbnNvcmRvdChhLCBiLCBheGVzPSgtMSwtMSkpCgogICAgb3IgZXhwbGljaXRseTo6CgogICAgICAgIG5wLmlubmVyKGEsIGIpW2kwLC4uLixpci0xLGowLC4uLixqcy0xXQogICAgICAgICAgICAgPSBzdW0oYVtpMCwuLi4saXItMSw6XSpiW2owLC4uLixqcy0xLDpdKQoKICAgIEluIGFkZGl0aW9uIGBhYCBvciBgYmAgbWF5IGJlIHNjYWxhcnMsIGluIHdoaWNoIGNhc2U6OgoKICAgICAgIG5wLmlubmVyKGEsYikgPSBhKmIKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgIE9yZGluYXJ5IGlubmVyIHByb2R1Y3QgZm9yIHZlY3RvcnM6CgogICAgPj4+IGEgPSBucC5hcnJheShbMSwyLDNdKQogICAgPj4+IGIgPSBucC5hcnJheShbMCwxLDBdKQogICAgPj4+IG5wLmlubmVyKGEsIGIpCiAgICAyCgogICAgQSBtdWx0aWRpbWVuc2lvbmFsIGV4YW1wbGU6CgogICAgPj4+IGEgPSBucC5hcmFuZ2UoMjQpLnJlc2hhcGUoKDIsMyw0KSkKICAgID4+PiBiID0gbnAuYXJhbmdlKDQpCiAgICA+Pj4gbnAuaW5uZXIoYSwgYikKICAgIGFycmF5KFtbIDE0LCAgMzgsICA2Ml0sCiAgICAgICAgICAgWyA4NiwgMTEwLCAxMzRdXSkKCiAgICBBbiBleGFtcGxlIHdoZXJlIGBiYCBpcyBhIHNjYWxhcjoKCiAgICA+Pj4gbnAuaW5uZXIobnAuZXllKDIpLCA3KQogICAgYXJyYXkoW1sgNy4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDcuXV0pCgogICAgWhRmYXN0Q29weUFuZFRyYW5zcG9zZXoYX2Zhc3RDb3B5QW5kVHJhbnNwb3NlKGEpWgljb3JyZWxhdGV6HGNyb3NzX2NvcnJlbGF0ZShhLHYsIG1vZGU9MClaBmFyYW5nZWFUCAAACiAgICBhcmFuZ2UoW3N0YXJ0LF0gc3RvcFssIHN0ZXAsXSwgZHR5cGU9Tm9uZSkKCiAgICBSZXR1cm4gZXZlbmx5IHNwYWNlZCB2YWx1ZXMgd2l0aGluIGEgZ2l2ZW4gaW50ZXJ2YWwuCgogICAgVmFsdWVzIGFyZSBnZW5lcmF0ZWQgd2l0aGluIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgYGBbc3RhcnQsIHN0b3ApYGAKICAgIChpbiBvdGhlciB3b3JkcywgdGhlIGludGVydmFsIGluY2x1ZGluZyBgc3RhcnRgIGJ1dCBleGNsdWRpbmcgYHN0b3BgKS4KICAgIEZvciBpbnRlZ2VyIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGJ1aWx0LWluCiAgICBgcmFuZ2UgPGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGliL2J1aWx0LWluLWZ1bmNzLmh0bWw+YF8gZnVuY3Rpb24sCiAgICBidXQgcmV0dXJucyBhbiBuZGFycmF5IHJhdGhlciB0aGFuIGEgbGlzdC4KCiAgICBXaGVuIHVzaW5nIGEgbm9uLWludGVnZXIgc3RlcCwgc3VjaCBhcyAwLjEsIHRoZSByZXN1bHRzIHdpbGwgb2Z0ZW4gbm90CiAgICBiZSBjb25zaXN0ZW50LiAgSXQgaXMgYmV0dGVyIHRvIHVzZSBgYGxpbnNwYWNlYGAgZm9yIHRoZXNlIGNhc2VzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHN0YXJ0IDogbnVtYmVyLCBvcHRpb25hbAogICAgICAgIFN0YXJ0IG9mIGludGVydmFsLiAgVGhlIGludGVydmFsIGluY2x1ZGVzIHRoaXMgdmFsdWUuICBUaGUgZGVmYXVsdAogICAgICAgIHN0YXJ0IHZhbHVlIGlzIDAuCiAgICBzdG9wIDogbnVtYmVyCiAgICAgICAgRW5kIG9mIGludGVydmFsLiAgVGhlIGludGVydmFsIGRvZXMgbm90IGluY2x1ZGUgdGhpcyB2YWx1ZSwgZXhjZXB0CiAgICAgICAgaW4gc29tZSBjYXNlcyB3aGVyZSBgc3RlcGAgaXMgbm90IGFuIGludGVnZXIgYW5kIGZsb2F0aW5nIHBvaW50CiAgICAgICAgcm91bmQtb2ZmIGFmZmVjdHMgdGhlIGxlbmd0aCBvZiBgb3V0YC4KICAgIHN0ZXAgOiBudW1iZXIsIG9wdGlvbmFsCiAgICAgICAgU3BhY2luZyBiZXR3ZWVuIHZhbHVlcy4gIEZvciBhbnkgb3V0cHV0IGBvdXRgLCB0aGlzIGlzIHRoZSBkaXN0YW5jZQogICAgICAgIGJldHdlZW4gdHdvIGFkamFjZW50IHZhbHVlcywgYGBvdXRbaSsxXSAtIG91dFtpXWBgLiAgVGhlIGRlZmF1bHQKICAgICAgICBzdGVwIHNpemUgaXMgMS4gIElmIGBzdGVwYCBpcyBzcGVjaWZpZWQsIGBzdGFydGAgbXVzdCBhbHNvIGJlIGdpdmVuLgogICAgZHR5cGUgOiBkdHlwZQogICAgICAgIFRoZSB0eXBlIG9mIHRoZSBvdXRwdXQgYXJyYXkuICBJZiBgZHR5cGVgIGlzIG5vdCBnaXZlbiwgaW5mZXIgdGhlIGRhdGEKICAgICAgICB0eXBlIGZyb20gdGhlIG90aGVyIGlucHV0IGFyZ3VtZW50cy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBhcmFuZ2UgOiBuZGFycmF5CiAgICAgICAgQXJyYXkgb2YgZXZlbmx5IHNwYWNlZCB2YWx1ZXMuCgogICAgICAgIEZvciBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCBpcwogICAgICAgIGBgY2VpbCgoc3RvcCAtIHN0YXJ0KS9zdGVwKWBgLiAgQmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBvdmVyZmxvdywKICAgICAgICB0aGlzIHJ1bGUgbWF5IHJlc3VsdCBpbiB0aGUgbGFzdCBlbGVtZW50IG9mIGBvdXRgIGJlaW5nIGdyZWF0ZXIKICAgICAgICB0aGFuIGBzdG9wYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGxpbnNwYWNlIDogRXZlbmx5IHNwYWNlZCBudW1iZXJzIHdpdGggY2FyZWZ1bCBoYW5kbGluZyBvZiBlbmRwb2ludHMuCiAgICBvZ3JpZDogQXJyYXlzIG9mIGV2ZW5seSBzcGFjZWQgbnVtYmVycyBpbiBOLWRpbWVuc2lvbnMuCiAgICBtZ3JpZDogR3JpZC1zaGFwZWQgYXJyYXlzIG9mIGV2ZW5seSBzcGFjZWQgbnVtYmVycyBpbiBOLWRpbWVuc2lvbnMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuYXJhbmdlKDMpCiAgICBhcnJheShbMCwgMSwgMl0pCiAgICA+Pj4gbnAuYXJhbmdlKDMuMCkKICAgIGFycmF5KFsgMC4sICAxLiwgIDIuXSkKICAgID4+PiBucC5hcmFuZ2UoMyw3KQogICAgYXJyYXkoWzMsIDQsIDUsIDZdKQogICAgPj4+IG5wLmFyYW5nZSgzLDcsMikKICAgIGFycmF5KFszLCA1XSkKCiAgICBaFl9nZXRfbmRhcnJheV9jX3ZlcnNpb256U19nZXRfbmRhcnJheV9jX3ZlcnNpb24oKQoKICAgIFJldHVybiB0aGUgY29tcGlsZSB0aW1lIE5EQVJSQVlfVkVSU0lPTiBudW1iZXIuCgogICAg2gxfcmVjb25zdHJ1Y3R6WV9yZWNvbnN0cnVjdChzdWJ0eXBlLCBzaGFwZSwgZHR5cGUpCgogICAgQ29uc3RydWN0IGFuIGVtcHR5IGFycmF5LiBVc2VkIGJ5IFBpY2tsZXMuCgogICAgWhNzZXRfc3RyaW5nX2Z1bmN0aW9uengKICAgIHNldF9zdHJpbmdfZnVuY3Rpb24oZiwgcmVwcj0xKQoKICAgIEludGVybmFsIG1ldGhvZCB0byBzZXQgYSBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gcHJldHR5IHByaW50aW5nIGFycmF5cy4KCiAgICBaD3NldF9udW1lcmljX29wc2FMBAAACiAgICBzZXRfbnVtZXJpY19vcHMob3AxPWZ1bmMxLCBvcDI9ZnVuYzIsIC4uLikKCiAgICBTZXQgbnVtZXJpY2FsIG9wZXJhdG9ycyBmb3IgYXJyYXkgb2JqZWN0cy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBvcDEsIG9wMiwgLi4uIDogY2FsbGFibGUKICAgICAgICBFYWNoIGBgb3AgPSBmdW5jYGAgcGFpciBkZXNjcmliZXMgYW4gb3BlcmF0b3IgdG8gYmUgcmVwbGFjZWQuCiAgICAgICAgRm9yIGV4YW1wbGUsIGBgYWRkID0gbGFtYmRhIHgsIHk6IG5wLmFkZCh4LCB5KSAlIDVgYCB3b3VsZCByZXBsYWNlCiAgICAgICAgYWRkaXRpb24gYnkgbW9kdWx1cyA1IGFkZGl0aW9uLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHNhdmVkX29wcyA6IGxpc3Qgb2YgY2FsbGFibGVzCiAgICAgICAgQSBsaXN0IG9mIGFsbCBvcGVyYXRvcnMsIHN0b3JlZCBiZWZvcmUgbWFraW5nIHJlcGxhY2VtZW50cy4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIC4uIFdBUk5JTkc6OgogICAgICAgVXNlIHdpdGggY2FyZSEgIEluY29ycmVjdCB1c2FnZSBtYXkgbGVhZCB0byBtZW1vcnkgZXJyb3JzLgoKICAgIEEgZnVuY3Rpb24gcmVwbGFjaW5nIGFuIG9wZXJhdG9yIGNhbm5vdCBtYWtlIHVzZSBvZiB0aGF0IG9wZXJhdG9yLgogICAgRm9yIGV4YW1wbGUsIHdoZW4gcmVwbGFjaW5nIGFkZCwgeW91IG1heSBub3QgdXNlIGBgK2BgLiAgSW5zdGVhZCwKICAgIGRpcmVjdGx5IGNhbGwgdWZ1bmNzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGRlZiBhZGRfbW9kNSh4LCB5KToKICAgIC4uLiAgICAgcmV0dXJuIG5wLmFkZCh4LCB5KSAlIDUKICAgIC4uLgogICAgPj4+IG9sZF9mdW5jcyA9IG5wLnNldF9udW1lcmljX29wcyhhZGQ9YWRkX21vZDUpCgogICAgPj4+IHggPSBucC5hcmFuZ2UoMTIpLnJlc2hhcGUoKDMsIDQpKQogICAgPj4+IHggKyB4CiAgICBhcnJheShbWzAsIDIsIDQsIDFdLAogICAgICAgICAgIFszLCAwLCAyLCA0XSwKICAgICAgICAgICBbMSwgMywgMCwgMl1dKQoKICAgID4+PiBpZ25vcmUgPSBucC5zZXRfbnVtZXJpY19vcHMoKipvbGRfZnVuY3MpICMgcmVzdG9yZSBvcGVyYXRvcnMKCiAgICDaBXdoZXJlYZcHAAAKICAgIHdoZXJlKGNvbmRpdGlvbiwgW3gsIHldKQoKICAgIFJldHVybiBlbGVtZW50cywgZWl0aGVyIGZyb20gYHhgIG9yIGB5YCwgZGVwZW5kaW5nIG9uIGBjb25kaXRpb25gLgoKICAgIElmIG9ubHkgYGNvbmRpdGlvbmAgaXMgZ2l2ZW4sIHJldHVybiBgYGNvbmRpdGlvbi5ub256ZXJvKClgYC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBjb25kaXRpb24gOiBhcnJheV9saWtlLCBib29sCiAgICAgICAgV2hlbiBUcnVlLCB5aWVsZCBgeGAsIG90aGVyd2lzZSB5aWVsZCBgeWAuCiAgICB4LCB5IDogYXJyYXlfbGlrZSwgb3B0aW9uYWwKICAgICAgICBWYWx1ZXMgZnJvbSB3aGljaCB0byBjaG9vc2UuIGB4YCwgYHlgIGFuZCBgY29uZGl0aW9uYCBuZWVkIHRvIGJlCiAgICAgICAgYnJvYWRjYXN0YWJsZSB0byBzb21lIHNoYXBlLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkgb3IgdHVwbGUgb2YgbmRhcnJheXMKICAgICAgICBJZiBib3RoIGB4YCBhbmQgYHlgIGFyZSBzcGVjaWZpZWQsIHRoZSBvdXRwdXQgYXJyYXkgY29udGFpbnMKICAgICAgICBlbGVtZW50cyBvZiBgeGAgd2hlcmUgYGNvbmRpdGlvbmAgaXMgVHJ1ZSwgYW5kIGVsZW1lbnRzIGZyb20KICAgICAgICBgeWAgZWxzZXdoZXJlLgoKICAgICAgICBJZiBvbmx5IGBjb25kaXRpb25gIGlzIGdpdmVuLCByZXR1cm4gdGhlIHR1cGxlCiAgICAgICAgYGBjb25kaXRpb24ubm9uemVybygpYGAsIHRoZSBpbmRpY2VzIHdoZXJlIGBjb25kaXRpb25gIGlzIFRydWUuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBub256ZXJvLCBjaG9vc2UKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIElmIGB4YCBhbmQgYHlgIGFyZSBnaXZlbiBhbmQgaW5wdXQgYXJyYXlzIGFyZSAxLUQsIGB3aGVyZWAgaXMKICAgIGVxdWl2YWxlbnQgdG86OgoKICAgICAgICBbeHYgaWYgYyBlbHNlIHl2IGZvciAoYyx4dix5dikgaW4gemlwKGNvbmRpdGlvbix4LHkpXQoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLndoZXJlKFtbVHJ1ZSwgRmFsc2VdLCBbVHJ1ZSwgVHJ1ZV1dLAogICAgLi4uICAgICAgICAgIFtbMSwgMl0sIFszLCA0XV0sCiAgICAuLi4gICAgICAgICAgW1s5LCA4XSwgWzcsIDZdXSkKICAgIGFycmF5KFtbMSwgOF0sCiAgICAgICAgICAgWzMsIDRdXSkKCiAgICA+Pj4gbnAud2hlcmUoW1swLCAxXSwgWzEsIDBdXSkKICAgIChhcnJheShbMCwgMV0pLCBhcnJheShbMSwgMF0pKQoKICAgID4+PiB4ID0gbnAuYXJhbmdlKDkuKS5yZXNoYXBlKDMsIDMpCiAgICA+Pj4gbnAud2hlcmUoIHggPiA1ICkKICAgIChhcnJheShbMiwgMiwgMl0pLCBhcnJheShbMCwgMSwgMl0pKQogICAgPj4+IHhbbnAud2hlcmUoIHggPiAzLjAgKV0gICAgICAgICAgICAgICAjIE5vdGU6IHJlc3VsdCBpcyAxRC4KICAgIGFycmF5KFsgNC4sICA1LiwgIDYuLCAgNy4sICA4Ll0pCiAgICA+Pj4gbnAud2hlcmUoeCA8IDUsIHgsIC0xKSAgICAgICAgICAgICAgICMgTm90ZTogYnJvYWRjYXN0aW5nLgogICAgYXJyYXkoW1sgMC4sICAxLiwgIDIuXSwKICAgICAgICAgICBbIDMuLCAgNC4sIC0xLl0sCiAgICAgICAgICAgWy0xLiwgLTEuLCAtMS5dXSkKCiAgICBGaW5kIHRoZSBpbmRpY2VzIG9mIGVsZW1lbnRzIG9mIGB4YCB0aGF0IGFyZSBpbiBgZ29vZHZhbHVlc2AuCgogICAgPj4+IGdvb2R2YWx1ZXMgPSBbMywgNCwgN10KICAgID4+PiBpeCA9IG5wLmlzaW4oeCwgZ29vZHZhbHVlcykKICAgID4+PiBpeAogICAgYXJyYXkoW1tGYWxzZSwgRmFsc2UsIEZhbHNlXSwKICAgICAgICAgICBbIFRydWUsICBUcnVlLCBGYWxzZV0sCiAgICAgICAgICAgW0ZhbHNlLCAgVHJ1ZSwgRmFsc2VdXSwgZHR5cGU9Ym9vbCkKICAgID4+PiBucC53aGVyZShpeCkKICAgIChhcnJheShbMSwgMSwgMl0pLCBhcnJheShbMCwgMSwgMV0pKQoKICAgIFoHbGV4c29ydGH/CQAACiAgICBsZXhzb3J0KGtleXMsIGF4aXM9LTEpCgogICAgUGVyZm9ybSBhbiBpbmRpcmVjdCBzb3J0IHVzaW5nIGEgc2VxdWVuY2Ugb2Yga2V5cy4KCiAgICBHaXZlbiBtdWx0aXBsZSBzb3J0aW5nIGtleXMsIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBjb2x1bW5zIGluIGEKICAgIHNwcmVhZHNoZWV0LCBsZXhzb3J0IHJldHVybnMgYW4gYXJyYXkgb2YgaW50ZWdlciBpbmRpY2VzIHRoYXQgZGVzY3JpYmVzCiAgICB0aGUgc29ydCBvcmRlciBieSBtdWx0aXBsZSBjb2x1bW5zLiBUaGUgbGFzdCBrZXkgaW4gdGhlIHNlcXVlbmNlIGlzIHVzZWQKICAgIGZvciB0aGUgcHJpbWFyeSBzb3J0IG9yZGVyLCB0aGUgc2Vjb25kLXRvLWxhc3Qga2V5IGZvciB0aGUgc2Vjb25kYXJ5IHNvcnQKICAgIG9yZGVyLCBhbmQgc28gb24uIFRoZSBrZXlzIGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBvYmplY3RzIHRoYXQKICAgIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYXJyYXlzIG9mIHRoZSBzYW1lIHNoYXBlLiBJZiBhIDJEIGFycmF5IGlzIHByb3ZpZGVkCiAgICBmb3IgdGhlIGtleXMgYXJndW1lbnQsIGl0J3Mgcm93cyBhcmUgaW50ZXJwcmV0ZWQgYXMgdGhlIHNvcnRpbmcga2V5cyBhbmQKICAgIHNvcnRpbmcgaXMgYWNjb3JkaW5nIHRvIHRoZSBsYXN0IHJvdywgc2Vjb25kIGxhc3Qgcm93IGV0Yy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBrZXlzIDogKGssIE4pIGFycmF5IG9yIHR1cGxlIGNvbnRhaW5pbmcgayAoTiwpLXNoYXBlZCBzZXF1ZW5jZXMKICAgICAgICBUaGUgYGtgIGRpZmZlcmVudCAiY29sdW1ucyIgdG8gYmUgc29ydGVkLiAgVGhlIGxhc3QgY29sdW1uIChvciByb3cgaWYKICAgICAgICBga2V5c2AgaXMgYSAyRCBhcnJheSkgaXMgdGhlIHByaW1hcnkgc29ydCBrZXkuCiAgICBheGlzIDogaW50LCBvcHRpb25hbAogICAgICAgIEF4aXMgdG8gYmUgaW5kaXJlY3RseSBzb3J0ZWQuICBCeSBkZWZhdWx0LCBzb3J0IG92ZXIgdGhlIGxhc3QgYXhpcy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBpbmRpY2VzIDogKE4sKSBuZGFycmF5IG9mIGludHMKICAgICAgICBBcnJheSBvZiBpbmRpY2VzIHRoYXQgc29ydCB0aGUga2V5cyBhbG9uZyB0aGUgc3BlY2lmaWVkIGF4aXMuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBhcmdzb3J0IDogSW5kaXJlY3Qgc29ydC4KICAgIG5kYXJyYXkuc29ydCA6IEluLXBsYWNlIHNvcnQuCiAgICBzb3J0IDogUmV0dXJuIGEgc29ydGVkIGNvcHkgb2YgYW4gYXJyYXkuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBTb3J0IG5hbWVzOiBmaXJzdCBieSBzdXJuYW1lLCB0aGVuIGJ5IG5hbWUuCgogICAgPj4+IHN1cm5hbWVzID0gICAgKCdIZXJ0eicsICAgICdHYWxpbGVpJywgJ0hlcnR6JykKICAgID4+PiBmaXJzdF9uYW1lcyA9ICgnSGVpbnJpY2gnLCAnR2FsaWxlbycsICdHdXN0YXYnKQogICAgPj4+IGluZCA9IG5wLmxleHNvcnQoKGZpcnN0X25hbWVzLCBzdXJuYW1lcykpCiAgICA+Pj4gaW5kCiAgICBhcnJheShbMSwgMiwgMF0pCgogICAgPj4+IFtzdXJuYW1lc1tpXSArICIsICIgKyBmaXJzdF9uYW1lc1tpXSBmb3IgaSBpbiBpbmRdCiAgICBbJ0dhbGlsZWksIEdhbGlsZW8nLCAnSGVydHosIEd1c3RhdicsICdIZXJ0eiwgSGVpbnJpY2gnXQoKICAgIFNvcnQgdHdvIGNvbHVtbnMgb2YgbnVtYmVyczoKCiAgICA+Pj4gYSA9IFsxLDUsMSw0LDMsNCw0XSAjIEZpcnN0IGNvbHVtbgogICAgPj4+IGIgPSBbOSw0LDAsNCwwLDIsMV0gIyBTZWNvbmQgY29sdW1uCiAgICA+Pj4gaW5kID0gbnAubGV4c29ydCgoYixhKSkgIyBTb3J0IGJ5IGEsIHRoZW4gYnkgYgogICAgPj4+IHByaW50KGluZCkKICAgIFsyIDAgNCA2IDUgMyAxXQoKICAgID4+PiBbKGFbaV0sYltpXSkgZm9yIGkgaW4gaW5kXQogICAgWygxLCAwKSwgKDEsIDkpLCAoMywgMCksICg0LCAxKSwgKDQsIDIpLCAoNCwgNCksICg1LCA0KV0KCiAgICBOb3RlIHRoYXQgc29ydGluZyBpcyBmaXJzdCBhY2NvcmRpbmcgdG8gdGhlIGVsZW1lbnRzIG9mIGBgYWBgLgogICAgU2Vjb25kYXJ5IHNvcnRpbmcgaXMgYWNjb3JkaW5nIHRvIHRoZSBlbGVtZW50cyBvZiBgYGJgYC4KCiAgICBBIG5vcm1hbCBgYGFyZ3NvcnRgYCB3b3VsZCBoYXZlIHlpZWxkZWQ6CgogICAgPj4+IFsoYVtpXSxiW2ldKSBmb3IgaSBpbiBucC5hcmdzb3J0KGEpXQogICAgWygxLCA5KSwgKDEsIDApLCAoMywgMCksICg0LCA0KSwgKDQsIDIpLCAoNCwgMSksICg1LCA0KV0KCiAgICBTdHJ1Y3R1cmVkIGFycmF5cyBhcmUgc29ydGVkIGxleGljYWxseSBieSBgYGFyZ3NvcnRgYDoKCiAgICA+Pj4geCA9IG5wLmFycmF5KFsoMSw5KSwgKDUsNCksICgxLDApLCAoNCw0KSwgKDMsMCksICg0LDIpLCAoNCwxKV0sCiAgICAuLi4gICAgICAgICAgICAgIGR0eXBlPW5wLmR0eXBlKFsoJ3gnLCBpbnQpLCAoJ3knLCBpbnQpXSkpCgogICAgPj4+IG5wLmFyZ3NvcnQoeCkgIyBvciBucC5hcmdzb3J0KHgsIG9yZGVyPSgneCcsICd5JykpCiAgICBhcnJheShbMiwgMCwgNCwgNiwgNSwgMywgMV0pCgogICAgWghjYW5fY2FzdGHUCgAACiAgICBjYW5fY2FzdChmcm9tLCB0b3R5cGUsIGNhc3RpbmcgPSAnc2FmZScpCgogICAgUmV0dXJucyBUcnVlIGlmIGNhc3QgYmV0d2VlbiBkYXRhIHR5cGVzIGNhbiBvY2N1ciBhY2NvcmRpbmcgdG8gdGhlCiAgICBjYXN0aW5nIHJ1bGUuICBJZiBmcm9tIGlzIGEgc2NhbGFyIG9yIGFycmF5IHNjYWxhciwgYWxzbyByZXR1cm5zCiAgICBUcnVlIGlmIHRoZSBzY2FsYXIgdmFsdWUgY2FuIGJlIGNhc3Qgd2l0aG91dCBvdmVyZmxvdyBvciB0cnVuY2F0aW9uCiAgICB0byBhbiBpbnRlZ2VyLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGZyb20gOiBkdHlwZSwgZHR5cGUgc3BlY2lmaWVyLCBzY2FsYXIsIG9yIGFycmF5CiAgICAgICAgRGF0YSB0eXBlLCBzY2FsYXIsIG9yIGFycmF5IHRvIGNhc3QgZnJvbS4KICAgIHRvdHlwZSA6IGR0eXBlIG9yIGR0eXBlIHNwZWNpZmllcgogICAgICAgIERhdGEgdHlwZSB0byBjYXN0IHRvLgogICAgY2FzdGluZyA6IHsnbm8nLCAnZXF1aXYnLCAnc2FmZScsICdzYW1lX2tpbmQnLCAndW5zYWZlJ30sIG9wdGlvbmFsCiAgICAgICAgQ29udHJvbHMgd2hhdCBraW5kIG9mIGRhdGEgY2FzdGluZyBtYXkgb2NjdXIuCgogICAgICAgICAgKiAnbm8nIG1lYW5zIHRoZSBkYXRhIHR5cGVzIHNob3VsZCBub3QgYmUgY2FzdCBhdCBhbGwuCiAgICAgICAgICAqICdlcXVpdicgbWVhbnMgb25seSBieXRlLW9yZGVyIGNoYW5nZXMgYXJlIGFsbG93ZWQuCiAgICAgICAgICAqICdzYWZlJyBtZWFucyBvbmx5IGNhc3RzIHdoaWNoIGNhbiBwcmVzZXJ2ZSB2YWx1ZXMgYXJlIGFsbG93ZWQuCiAgICAgICAgICAqICdzYW1lX2tpbmQnIG1lYW5zIG9ubHkgc2FmZSBjYXN0cyBvciBjYXN0cyB3aXRoaW4gYSBraW5kLAogICAgICAgICAgICBsaWtlIGZsb2F0NjQgdG8gZmxvYXQzMiwgYXJlIGFsbG93ZWQuCiAgICAgICAgICAqICd1bnNhZmUnIG1lYW5zIGFueSBkYXRhIGNvbnZlcnNpb25zIG1heSBiZSBkb25lLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGJvb2wKICAgICAgICBUcnVlIGlmIGNhc3QgY2FuIG9jY3VyIGFjY29yZGluZyB0byB0aGUgY2FzdGluZyBydWxlLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgU3RhcnRpbmcgaW4gTnVtUHkgMS45LCBjYW5fY2FzdCBmdW5jdGlvbiBub3cgcmV0dXJucyBGYWxzZSBpbiAnc2FmZScKICAgIGNhc3RpbmcgbW9kZSBmb3IgaW50ZWdlci9mbG9hdCBkdHlwZSBhbmQgc3RyaW5nIGR0eXBlIGlmIHRoZSBzdHJpbmcgZHR5cGUKICAgIGxlbmd0aCBpcyBub3QgbG9uZyBlbm91Z2ggdG8gc3RvcmUgdGhlIG1heCBpbnRlZ2VyL2Zsb2F0IHZhbHVlIGNvbnZlcnRlZAogICAgdG8gYSBzdHJpbmcuIFByZXZpb3VzbHkgY2FuX2Nhc3QgaW4gJ3NhZmUnIG1vZGUgcmV0dXJuZWQgVHJ1ZSBmb3IKICAgIGludGVnZXIvZmxvYXQgZHR5cGUgYW5kIGEgc3RyaW5nIGR0eXBlIG9mIGFueSBsZW5ndGguCgogICAgU2VlIGFsc28KICAgIC0tLS0tLS0tCiAgICBkdHlwZSwgcmVzdWx0X3R5cGUKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgIEJhc2ljIGV4YW1wbGVzCgogICAgPj4+IG5wLmNhbl9jYXN0KG5wLmludDMyLCBucC5pbnQ2NCkKICAgIFRydWUKICAgID4+PiBucC5jYW5fY2FzdChucC5mbG9hdDY0LCBucC5jb21wbGV4KQogICAgVHJ1ZQogICAgPj4+IG5wLmNhbl9jYXN0KG5wLmNvbXBsZXgsIG5wLmZsb2F0KQogICAgRmFsc2UKCiAgICA+Pj4gbnAuY2FuX2Nhc3QoJ2k4JywgJ2Y4JykKICAgIFRydWUKICAgID4+PiBucC5jYW5fY2FzdCgnaTgnLCAnZjQnKQogICAgRmFsc2UKICAgID4+PiBucC5jYW5fY2FzdCgnaTQnLCAnUzQnKQogICAgRmFsc2UKCiAgICBDYXN0aW5nIHNjYWxhcnMKCiAgICA+Pj4gbnAuY2FuX2Nhc3QoMTAwLCAnaTEnKQogICAgVHJ1ZQogICAgPj4+IG5wLmNhbl9jYXN0KDE1MCwgJ2kxJykKICAgIEZhbHNlCiAgICA+Pj4gbnAuY2FuX2Nhc3QoMTUwLCAndTEnKQogICAgVHJ1ZQoKICAgID4+PiBucC5jYW5fY2FzdCgzLjVlMTAwLCBucC5mbG9hdDMyKQogICAgRmFsc2UKICAgID4+PiBucC5jYW5fY2FzdCgxMDAwLjAsIG5wLmZsb2F0MzIpCiAgICBUcnVlCgogICAgQXJyYXkgc2NhbGFyIGNoZWNrcyB0aGUgdmFsdWUsIGFycmF5IGRvZXMgbm90CgogICAgPj4+IG5wLmNhbl9jYXN0KG5wLmFycmF5KDEwMDAuMCksIG5wLmZsb2F0MzIpCiAgICBUcnVlCiAgICA+Pj4gbnAuY2FuX2Nhc3QobnAuYXJyYXkoWzEwMDAuMF0pLCBucC5mbG9hdDMyKQogICAgRmFsc2UKCiAgICBVc2luZyB0aGUgY2FzdGluZyBydWxlcwoKICAgID4+PiBucC5jYW5fY2FzdCgnaTgnLCAnaTgnLCAnbm8nKQogICAgVHJ1ZQogICAgPj4+IG5wLmNhbl9jYXN0KCc8aTgnLCAnPmk4JywgJ25vJykKICAgIEZhbHNlCgogICAgPj4+IG5wLmNhbl9jYXN0KCc8aTgnLCAnPmk4JywgJ2VxdWl2JykKICAgIFRydWUKICAgID4+PiBucC5jYW5fY2FzdCgnPGk0JywgJz5pOCcsICdlcXVpdicpCiAgICBGYWxzZQoKICAgID4+PiBucC5jYW5fY2FzdCgnPGk0JywgJz5pOCcsICdzYWZlJykKICAgIFRydWUKICAgID4+PiBucC5jYW5fY2FzdCgnPGk4JywgJz5pNCcsICdzYWZlJykKICAgIEZhbHNlCgogICAgPj4+IG5wLmNhbl9jYXN0KCc8aTgnLCAnPmk0JywgJ3NhbWVfa2luZCcpCiAgICBUcnVlCiAgICA+Pj4gbnAuY2FuX2Nhc3QoJzxpOCcsICc+dTQnLCAnc2FtZV9raW5kJykKICAgIEZhbHNlCgogICAgPj4+IG5wLmNhbl9jYXN0KCc8aTgnLCAnPnU0JywgJ3Vuc2FmZScpCiAgICBUcnVlCgogICAgWg1wcm9tb3RlX3R5cGVzYcYEAAAKICAgIHByb21vdGVfdHlwZXModHlwZTEsIHR5cGUyKQoKICAgIFJldHVybnMgdGhlIGRhdGEgdHlwZSB3aXRoIHRoZSBzbWFsbGVzdCBzaXplIGFuZCBzbWFsbGVzdCBzY2FsYXIKICAgIGtpbmQgdG8gd2hpY2ggYm90aCBgYHR5cGUxYGAgYW5kIGBgdHlwZTJgYCBtYXkgYmUgc2FmZWx5IGNhc3QuCiAgICBUaGUgcmV0dXJuZWQgZGF0YSB0eXBlIGlzIGFsd2F5cyBpbiBuYXRpdmUgYnl0ZSBvcmRlci4KCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHN5bW1ldHJpYyBhbmQgYXNzb2NpYXRpdmUuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdHlwZTEgOiBkdHlwZSBvciBkdHlwZSBzcGVjaWZpZXIKICAgICAgICBGaXJzdCBkYXRhIHR5cGUuCiAgICB0eXBlMiA6IGR0eXBlIG9yIGR0eXBlIHNwZWNpZmllcgogICAgICAgIFNlY29uZCBkYXRhIHR5cGUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogZHR5cGUKICAgICAgICBUaGUgcHJvbW90ZWQgZGF0YSB0eXBlLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgLi4gdmVyc2lvbmFkZGVkOjogMS42LjAKCiAgICBTdGFydGluZyBpbiBOdW1QeSAxLjksIHByb21vdGVfdHlwZXMgZnVuY3Rpb24gbm93IHJldHVybnMgYSB2YWxpZCBzdHJpbmcKICAgIGxlbmd0aCB3aGVuIGdpdmVuIGFuIGludGVnZXIgb3IgZmxvYXQgZHR5cGUgYXMgb25lIGFyZ3VtZW50IGFuZCBhIHN0cmluZwogICAgZHR5cGUgYXMgYW5vdGhlciBhcmd1bWVudC4gUHJldmlvdXNseSBpdCBhbHdheXMgcmV0dXJuZWQgdGhlIGlucHV0IHN0cmluZwogICAgZHR5cGUsIGV2ZW4gaWYgaXQgd2Fzbid0IGxvbmcgZW5vdWdoIHRvIHN0b3JlIHRoZSBtYXggaW50ZWdlci9mbG9hdCB2YWx1ZQogICAgY29udmVydGVkIHRvIGEgc3RyaW5nLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcmVzdWx0X3R5cGUsIGR0eXBlLCBjYW5fY2FzdAoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLnByb21vdGVfdHlwZXMoJ2Y0JywgJ2Y4JykKICAgIGR0eXBlKCdmbG9hdDY0JykKCiAgICA+Pj4gbnAucHJvbW90ZV90eXBlcygnaTgnLCAnZjQnKQogICAgZHR5cGUoJ2Zsb2F0NjQnKQoKICAgID4+PiBucC5wcm9tb3RlX3R5cGVzKCc+aTgnLCAnPGM4JykKICAgIGR0eXBlKCdjb21wbGV4MTI4JykKCiAgICA+Pj4gbnAucHJvbW90ZV90eXBlcygnaTQnLCAnUzgnKQogICAgZHR5cGUoJ1MxMScpCgogICAgWg9taW5fc2NhbGFyX3R5cGVhvQMAAAogICAgbWluX3NjYWxhcl90eXBlKGEpCgogICAgRm9yIHNjYWxhciBgYGFgYCwgcmV0dXJucyB0aGUgZGF0YSB0eXBlIHdpdGggdGhlIHNtYWxsZXN0IHNpemUKICAgIGFuZCBzbWFsbGVzdCBzY2FsYXIga2luZCB3aGljaCBjYW4gaG9sZCBpdHMgdmFsdWUuICBGb3Igbm9uLXNjYWxhcgogICAgYXJyYXkgYGBhYGAsIHJldHVybnMgdGhlIHZlY3RvcidzIGR0eXBlIHVubW9kaWZpZWQuCgogICAgRmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFyZSBub3QgZGVtb3RlZCB0byBpbnRlZ2VycywKICAgIGFuZCBjb21wbGV4IHZhbHVlcyBhcmUgbm90IGRlbW90ZWQgdG8gZmxvYXRzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBzY2FsYXIgb3IgYXJyYXlfbGlrZQogICAgICAgIFRoZSB2YWx1ZSB3aG9zZSBtaW5pbWFsIGRhdGEgdHlwZSBpcyB0byBiZSBmb3VuZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBkdHlwZQogICAgICAgIFRoZSBtaW5pbWFsIGRhdGEgdHlwZS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNi4wCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICByZXN1bHRfdHlwZSwgcHJvbW90ZV90eXBlcywgZHR5cGUsIGNhbl9jYXN0CgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAubWluX3NjYWxhcl90eXBlKDEwKQogICAgZHR5cGUoJ3VpbnQ4JykKCiAgICA+Pj4gbnAubWluX3NjYWxhcl90eXBlKC0yNjApCiAgICBkdHlwZSgnaW50MTYnKQoKICAgID4+PiBucC5taW5fc2NhbGFyX3R5cGUoMy4xKQogICAgZHR5cGUoJ2Zsb2F0MTYnKQoKICAgID4+PiBucC5taW5fc2NhbGFyX3R5cGUoMWU1MCkKICAgIGR0eXBlKCdmbG9hdDY0JykKCiAgICA+Pj4gbnAubWluX3NjYWxhcl90eXBlKG5wLmFyYW5nZSg0LGR0eXBlPSdmOCcpKQogICAgZHR5cGUoJ2Zsb2F0NjQnKQoKICAgIFoLcmVzdWx0X3R5cGVhpwgAAAogICAgcmVzdWx0X3R5cGUoKmFycmF5c19hbmRfZHR5cGVzKQoKICAgIFJldHVybnMgdGhlIHR5cGUgdGhhdCByZXN1bHRzIGZyb20gYXBwbHlpbmcgdGhlIE51bVB5CiAgICB0eXBlIHByb21vdGlvbiBydWxlcyB0byB0aGUgYXJndW1lbnRzLgoKICAgIFR5cGUgcHJvbW90aW9uIGluIE51bVB5IHdvcmtzIHNpbWlsYXJseSB0byB0aGUgcnVsZXMgaW4gbGFuZ3VhZ2VzCiAgICBsaWtlIEMrKywgd2l0aCBzb21lIHNsaWdodCBkaWZmZXJlbmNlcy4gIFdoZW4gYm90aCBzY2FsYXJzIGFuZAogICAgYXJyYXlzIGFyZSB1c2VkLCB0aGUgYXJyYXkncyB0eXBlIHRha2VzIHByZWNlZGVuY2UgYW5kIHRoZSBhY3R1YWwgdmFsdWUKICAgIG9mIHRoZSBzY2FsYXIgaXMgdGFrZW4gaW50byBhY2NvdW50LgoKICAgIEZvciBleGFtcGxlLCBjYWxjdWxhdGluZyAzKmEsIHdoZXJlIGEgaXMgYW4gYXJyYXkgb2YgMzItYml0IGZsb2F0cywKICAgIGludHVpdGl2ZWx5IHNob3VsZCByZXN1bHQgaW4gYSAzMi1iaXQgZmxvYXQgb3V0cHV0LiAgSWYgdGhlIDMgaXMgYQogICAgMzItYml0IGludGVnZXIsIHRoZSBOdW1QeSBydWxlcyBpbmRpY2F0ZSBpdCBjYW4ndCBjb252ZXJ0IGxvc3NsZXNzbHkKICAgIGludG8gYSAzMi1iaXQgZmxvYXQsIHNvIGEgNjQtYml0IGZsb2F0IHNob3VsZCBiZSB0aGUgcmVzdWx0IHR5cGUuCiAgICBCeSBleGFtaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCwgJzMnLCB3ZSBzZWUgdGhhdCBpdCBmaXRzIGluCiAgICBhbiA4LWJpdCBpbnRlZ2VyLCB3aGljaCBjYW4gYmUgY2FzdCBsb3NzbGVzc2x5IGludG8gdGhlIDMyLWJpdCBmbG9hdC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcnJheXNfYW5kX2R0eXBlcyA6IGxpc3Qgb2YgYXJyYXlzIGFuZCBkdHlwZXMKICAgICAgICBUaGUgb3BlcmFuZHMgb2Ygc29tZSBvcGVyYXRpb24gd2hvc2UgcmVzdWx0IHR5cGUgaXMgbmVlZGVkLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGR0eXBlCiAgICAgICAgVGhlIHJlc3VsdCB0eXBlLgoKICAgIFNlZSBhbHNvCiAgICAtLS0tLS0tLQogICAgZHR5cGUsIHByb21vdGVfdHlwZXMsIG1pbl9zY2FsYXJfdHlwZSwgY2FuX2Nhc3QKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNi4wCgogICAgVGhlIHNwZWNpZmljIGFsZ29yaXRobSB1c2VkIGlzIGFzIGZvbGxvd3MuCgogICAgQ2F0ZWdvcmllcyBhcmUgZGV0ZXJtaW5lZCBieSBmaXJzdCBjaGVja2luZyB3aGljaCBvZiBib29sZWFuLAogICAgaW50ZWdlciAoaW50L3VpbnQpLCBvciBmbG9hdGluZyBwb2ludCAoZmxvYXQvY29tcGxleCkgdGhlIG1heGltdW0KICAgIGtpbmQgb2YgYWxsIHRoZSBhcnJheXMgYW5kIHRoZSBzY2FsYXJzIGFyZS4KCiAgICBJZiB0aGVyZSBhcmUgb25seSBzY2FsYXJzIG9yIHRoZSBtYXhpbXVtIGNhdGVnb3J5IG9mIHRoZSBzY2FsYXJzCiAgICBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSBjYXRlZ29yeSBvZiB0aGUgYXJyYXlzLAogICAgdGhlIGRhdGEgdHlwZXMgYXJlIGNvbWJpbmVkIHdpdGggOmZ1bmM6YHByb21vdGVfdHlwZXNgCiAgICB0byBwcm9kdWNlIHRoZSByZXR1cm4gdmFsdWUuCgogICAgT3RoZXJ3aXNlLCBgbWluX3NjYWxhcl90eXBlYCBpcyBjYWxsZWQgb24gZWFjaCBhcnJheSwgYW5kCiAgICB0aGUgcmVzdWx0aW5nIGRhdGEgdHlwZXMgYXJlIGFsbCBjb21iaW5lZCB3aXRoIDpmdW5jOmBwcm9tb3RlX3R5cGVzYAogICAgdG8gcHJvZHVjZSB0aGUgcmV0dXJuIHZhbHVlLgoKICAgIFRoZSBzZXQgb2YgaW50IHZhbHVlcyBpcyBub3QgYSBzdWJzZXQgb2YgdGhlIHVpbnQgdmFsdWVzIGZvciB0eXBlcwogICAgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYml0cywgc29tZXRoaW5nIG5vdCByZWZsZWN0ZWQgaW4KICAgIDpmdW5jOmBtaW5fc2NhbGFyX3R5cGVgLCBidXQgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiBgcmVzdWx0X3R5cGVgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLnJlc3VsdF90eXBlKDMsIG5wLmFyYW5nZSg3LCBkdHlwZT0naTEnKSkKICAgIGR0eXBlKCdpbnQ4JykKCiAgICA+Pj4gbnAucmVzdWx0X3R5cGUoJ2k0JywgJ2M4JykKICAgIGR0eXBlKCdjb21wbGV4MTI4JykKCiAgICA+Pj4gbnAucmVzdWx0X3R5cGUoMy4wLCAtMikKICAgIGR0eXBlKCdmbG9hdDY0JykKCiAgICBaCW5ld2J1ZmZlcmEeAQAACiAgICBuZXdidWZmZXIoc2l6ZSkKCiAgICBSZXR1cm4gYSBuZXcgdW5pbml0aWFsaXplZCBidWZmZXIgb2JqZWN0LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHNpemUgOiBpbnQKICAgICAgICBTaXplIGluIGJ5dGVzIG9mIHJldHVybmVkIGJ1ZmZlciBvYmplY3QuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgbmV3YnVmZmVyIDogYnVmZmVyIG9iamVjdAogICAgICAgIFJldHVybmVkLCB1bmluaXRpYWxpemVkIGJ1ZmZlciBvYmplY3Qgb2YgYHNpemVgIGJ5dGVzLgoKICAgINoJZ2V0YnVmZmVyYWECAAAKICAgIGdldGJ1ZmZlcihvYmogWyxvZmZzZXRbLCBzaXplXV0pCgogICAgQ3JlYXRlIGEgYnVmZmVyIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBvYmplY3QgcmVmZXJlbmNpbmcgYSBzbGljZSBvZgogICAgbGVuZ3RoIHNpemUgc3RhcnRpbmcgYXQgb2Zmc2V0LgoKICAgIERlZmF1bHQgaXMgdGhlIGVudGlyZSBidWZmZXIuIEEgcmVhZC13cml0ZSBidWZmZXIgaXMgYXR0ZW1wdGVkIGZvbGxvd2VkCiAgICBieSBhIHJlYWQtb25seSBidWZmZXIuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgb2JqIDogb2JqZWN0CgogICAgb2Zmc2V0IDogaW50LCBvcHRpb25hbAoKICAgIHNpemUgOiBpbnQsIG9wdGlvbmFsCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgYnVmZmVyX29iaiA6IGJ1ZmZlcgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGJ1ZiA9IG5wLmdldGJ1ZmZlcihucC5vbmVzKDUpLCAxLCAzKQogICAgPj4+IGxlbihidWYpCiAgICAzCiAgICA+Pj4gYnVmWzBdCiAgICAnXHgwMCcKICAgID4+PiBidWYKICAgIDxyZWFkLXdyaXRlIGJ1ZmZlciBmb3IgMHg4YWYxZTcwLCBzaXplIDMsIG9mZnNldCAxIGF0IDB4OGJhNGVjMD4KCiAgICDaA2RvdGEXCAAACiAgICBkb3QoYSwgYiwgb3V0PU5vbmUpCgogICAgRG90IHByb2R1Y3Qgb2YgdHdvIGFycmF5cy4KCiAgICBGb3IgMi1EIGFycmF5cyBpdCBpcyBlcXVpdmFsZW50IHRvIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiwgYW5kIGZvciAxLUQKICAgIGFycmF5cyB0byBpbm5lciBwcm9kdWN0IG9mIHZlY3RvcnMgKHdpdGhvdXQgY29tcGxleCBjb25qdWdhdGlvbikuIEZvcgogICAgTiBkaW1lbnNpb25zIGl0IGlzIGEgc3VtIHByb2R1Y3Qgb3ZlciB0aGUgbGFzdCBheGlzIG9mIGBhYCBhbmQKICAgIHRoZSBzZWNvbmQtdG8tbGFzdCBvZiBgYmA6OgoKICAgICAgICBkb3QoYSwgYilbaSxqLGssbV0gPSBzdW0oYVtpLGosOl0gKiBiW2ssOixtXSkKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIEZpcnN0IGFyZ3VtZW50LgogICAgYiA6IGFycmF5X2xpa2UKICAgICAgICBTZWNvbmQgYXJndW1lbnQuCiAgICBvdXQgOiBuZGFycmF5LCBvcHRpb25hbAogICAgICAgIE91dHB1dCBhcmd1bWVudC4gVGhpcyBtdXN0IGhhdmUgdGhlIGV4YWN0IGtpbmQgdGhhdCB3b3VsZCBiZSByZXR1cm5lZAogICAgICAgIGlmIGl0IHdhcyBub3QgdXNlZC4gSW4gcGFydGljdWxhciwgaXQgbXVzdCBoYXZlIHRoZSByaWdodCB0eXBlLCBtdXN0IGJlCiAgICAgICAgQy1jb250aWd1b3VzLCBhbmQgaXRzIGR0eXBlIG11c3QgYmUgdGhlIGR0eXBlIHRoYXQgd291bGQgYmUgcmV0dXJuZWQKICAgICAgICBmb3IgYGRvdChhLGIpYC4gVGhpcyBpcyBhIHBlcmZvcm1hbmNlIGZlYXR1cmUuIFRoZXJlZm9yZSwgaWYgdGhlc2UKICAgICAgICBjb25kaXRpb25zIGFyZSBub3QgbWV0LCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLCBpbnN0ZWFkIG9mIGF0dGVtcHRpbmcKICAgICAgICB0byBiZSBmbGV4aWJsZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXRwdXQgOiBuZGFycmF5CiAgICAgICAgUmV0dXJucyB0aGUgZG90IHByb2R1Y3Qgb2YgYGFgIGFuZCBgYmAuICBJZiBgYWAgYW5kIGBiYCBhcmUgYm90aAogICAgICAgIHNjYWxhcnMgb3IgYm90aCAxLUQgYXJyYXlzIHRoZW4gYSBzY2FsYXIgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZQogICAgICAgIGFuIGFycmF5IGlzIHJldHVybmVkLgogICAgICAgIElmIGBvdXRgIGlzIGdpdmVuLCB0aGVuIGl0IGlzIHJldHVybmVkLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgdGhlIGxhc3QgZGltZW5zaW9uIG9mIGBhYCBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcwogICAgICAgIHRoZSBzZWNvbmQtdG8tbGFzdCBkaW1lbnNpb24gb2YgYGJgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgdmRvdCA6IENvbXBsZXgtY29uanVnYXRpbmcgZG90IHByb2R1Y3QuCiAgICB0ZW5zb3Jkb3QgOiBTdW0gcHJvZHVjdHMgb3ZlciBhcmJpdHJhcnkgYXhlcy4KICAgIGVpbnN1bSA6IEVpbnN0ZWluIHN1bW1hdGlvbiBjb252ZW50aW9uLgogICAgbWF0bXVsIDogJ0AnIG9wZXJhdG9yIGFzIG1ldGhvZCB3aXRoIG91dCBwYXJhbWV0ZXIuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuZG90KDMsIDQpCiAgICAxMgoKICAgIE5laXRoZXIgYXJndW1lbnQgaXMgY29tcGxleC1jb25qdWdhdGVkOgoKICAgID4+PiBucC5kb3QoWzJqLCAzal0sIFsyaiwgM2pdKQogICAgKC0xMyswaikKCiAgICBGb3IgMi1EIGFycmF5cyBpdCBpcyB0aGUgbWF0cml4IHByb2R1Y3Q6CgogICAgPj4+IGEgPSBbWzEsIDBdLCBbMCwgMV1dCiAgICA+Pj4gYiA9IFtbNCwgMV0sIFsyLCAyXV0KICAgID4+PiBucC5kb3QoYSwgYikKICAgIGFycmF5KFtbNCwgMV0sCiAgICAgICAgICAgWzIsIDJdXSkKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSgzKjQqNSo2KS5yZXNoYXBlKCgzLDQsNSw2KSkKICAgID4+PiBiID0gbnAuYXJhbmdlKDMqNCo1KjYpWzo6LTFdLnJlc2hhcGUoKDUsNCw2LDMpKQogICAgPj4+IG5wLmRvdChhLCBiKVsyLDMsMiwxLDIsMl0KICAgIDQ5OTEyOAogICAgPj4+IHN1bShhWzIsMywyLDpdICogYlsxLDIsOiwyXSkKICAgIDQ5OTEyOAoKICAgINoGbWF0bXVsYXAOAAAKICAgIG1hdG11bChhLCBiLCBvdXQ9Tm9uZSkKCiAgICBNYXRyaXggcHJvZHVjdCBvZiB0d28gYXJyYXlzLgoKICAgIFRoZSBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSBhcmd1bWVudHMgaW4gdGhlIGZvbGxvd2luZyB3YXkuCgogICAgLSBJZiBib3RoIGFyZ3VtZW50cyBhcmUgMi1EIHRoZXkgYXJlIG11bHRpcGxpZWQgbGlrZSBjb252ZW50aW9uYWwKICAgICAgbWF0cmljZXMuCiAgICAtIElmIGVpdGhlciBhcmd1bWVudCBpcyBOLUQsIE4gPiAyLCBpdCBpcyB0cmVhdGVkIGFzIGEgc3RhY2sgb2YKICAgICAgbWF0cmljZXMgcmVzaWRpbmcgaW4gdGhlIGxhc3QgdHdvIGluZGV4ZXMgYW5kIGJyb2FkY2FzdCBhY2NvcmRpbmdseS4KICAgIC0gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIDEtRCwgaXQgaXMgcHJvbW90ZWQgdG8gYSBtYXRyaXggYnkKICAgICAgcHJlcGVuZGluZyBhIDEgdG8gaXRzIGRpbWVuc2lvbnMuIEFmdGVyIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgogICAgICB0aGUgcHJlcGVuZGVkIDEgaXMgcmVtb3ZlZC4KICAgIC0gSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyAxLUQsIGl0IGlzIHByb21vdGVkIHRvIGEgbWF0cml4IGJ5CiAgICAgIGFwcGVuZGluZyBhIDEgdG8gaXRzIGRpbWVuc2lvbnMuIEFmdGVyIG1hdHJpeCBtdWx0aXBsaWNhdGlvbgogICAgICB0aGUgYXBwZW5kZWQgMSBpcyByZW1vdmVkLgoKICAgIE11bHRpcGxpY2F0aW9uIGJ5IGEgc2NhbGFyIGlzIG5vdCBhbGxvd2VkLCB1c2UgYGAqYGAgaW5zdGVhZC4gTm90ZSB0aGF0CiAgICBtdWx0aXBseWluZyBhIHN0YWNrIG9mIG1hdHJpY2VzIHdpdGggYSB2ZWN0b3Igd2lsbCByZXN1bHQgaW4gYSBzdGFjayBvZgogICAgdmVjdG9ycywgYnV0IG1hdG11bCB3aWxsIG5vdCByZWNvZ25pemUgaXQgYXMgc3VjaC4KCiAgICBgYG1hdG11bGBgIGRpZmZlcnMgZnJvbSBgYGRvdGBgIGluIHR3byBpbXBvcnRhbnQgd2F5cy4KCiAgICAtIE11bHRpcGxpY2F0aW9uIGJ5IHNjYWxhcnMgaXMgbm90IGFsbG93ZWQuCiAgICAtIFN0YWNrcyBvZiBtYXRyaWNlcyBhcmUgYnJvYWRjYXN0IHRvZ2V0aGVyIGFzIGlmIHRoZSBtYXRyaWNlcwogICAgICB3ZXJlIGVsZW1lbnRzLgoKICAgIC4uIHdhcm5pbmc6OgogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBwcmVsaW1pbmFyeSBhbmQgaW5jbHVkZWQgaW4gTnVtUHkgMS4xMC4wIGZvciB0ZXN0aW5nCiAgICAgICBhbmQgZG9jdW1lbnRhdGlvbi4gSXRzIHNlbWFudGljcyB3aWxsIG5vdCBjaGFuZ2UsIGJ1dCB0aGUgbnVtYmVyIGFuZAogICAgICAgb3JkZXIgb2YgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyB3aWxsLgoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTAuMAoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgRmlyc3QgYXJndW1lbnQuCiAgICBiIDogYXJyYXlfbGlrZQogICAgICAgIFNlY29uZCBhcmd1bWVudC4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgT3V0cHV0IGFyZ3VtZW50LiBUaGlzIG11c3QgaGF2ZSB0aGUgZXhhY3Qga2luZCB0aGF0IHdvdWxkIGJlIHJldHVybmVkCiAgICAgICAgaWYgaXQgd2FzIG5vdCB1c2VkLiBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0IGhhdmUgdGhlIHJpZ2h0IHR5cGUsIG11c3QgYmUKICAgICAgICBDLWNvbnRpZ3VvdXMsIGFuZCBpdHMgZHR5cGUgbXVzdCBiZSB0aGUgZHR5cGUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZAogICAgICAgIGZvciBgZG90KGEsYilgLiBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgZmVhdHVyZS4gVGhlcmVmb3JlLCBpZiB0aGVzZQogICAgICAgIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQsIGluc3RlYWQgb2YgYXR0ZW1wdGluZwogICAgICAgIHRvIGJlIGZsZXhpYmxlLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dHB1dCA6IG5kYXJyYXkKICAgICAgICBSZXR1cm5zIHRoZSBkb3QgcHJvZHVjdCBvZiBgYWAgYW5kIGBiYC4gIElmIGBhYCBhbmQgYGJgIGFyZSBib3RoCiAgICAgICAgMS1EIGFycmF5cyB0aGVuIGEgc2NhbGFyIGlzIHJldHVybmVkOyBvdGhlcndpc2UgYW4gYXJyYXkgaXMKICAgICAgICByZXR1cm5lZC4gIElmIGBvdXRgIGlzIGdpdmVuLCB0aGVuIGl0IGlzIHJldHVybmVkLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgdGhlIGxhc3QgZGltZW5zaW9uIG9mIGBhYCBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcwogICAgICAgIHRoZSBzZWNvbmQtdG8tbGFzdCBkaW1lbnNpb24gb2YgYGJgLgoKICAgICAgICBJZiBzY2FsYXIgdmFsdWUgaXMgcGFzc2VkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgdmRvdCA6IENvbXBsZXgtY29uanVnYXRpbmcgZG90IHByb2R1Y3QuCiAgICB0ZW5zb3Jkb3QgOiBTdW0gcHJvZHVjdHMgb3ZlciBhcmJpdHJhcnkgYXhlcy4KICAgIGVpbnN1bSA6IEVpbnN0ZWluIHN1bW1hdGlvbiBjb252ZW50aW9uLgogICAgZG90IDogYWx0ZXJuYXRpdmUgbWF0cml4IHByb2R1Y3Qgd2l0aCBkaWZmZXJlbnQgYnJvYWRjYXN0aW5nIHJ1bGVzLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIG1hdG11bCBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGBAYCBvcGVyYXRvciBpbnRyb2R1Y2VkCiAgICBpbiBQeXRob24gMy41IGZvbGxvd2luZyBQRVA0NjUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBGb3IgMi1EIGFycmF5cyBpdCBpcyB0aGUgbWF0cml4IHByb2R1Y3Q6CgogICAgPj4+IGEgPSBbWzEsIDBdLCBbMCwgMV1dCiAgICA+Pj4gYiA9IFtbNCwgMV0sIFsyLCAyXV0KICAgID4+PiBucC5tYXRtdWwoYSwgYikKICAgIGFycmF5KFtbNCwgMV0sCiAgICAgICAgICAgWzIsIDJdXSkKCiAgICBGb3IgMi1EIG1peGVkIHdpdGggMS1ELCB0aGUgcmVzdWx0IGlzIHRoZSB1c3VhbC4KCiAgICA+Pj4gYSA9IFtbMSwgMF0sIFswLCAxXV0KICAgID4+PiBiID0gWzEsIDJdCiAgICA+Pj4gbnAubWF0bXVsKGEsIGIpCiAgICBhcnJheShbMSwgMl0pCiAgICA+Pj4gbnAubWF0bXVsKGIsIGEpCiAgICBhcnJheShbMSwgMl0pCgoKICAgIEJyb2FkY2FzdGluZyBpcyBjb252ZW50aW9uYWwgZm9yIHN0YWNrcyBvZiBhcnJheXMKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSgyKjIqNCkucmVzaGFwZSgoMiwyLDQpKQogICAgPj4+IGIgPSBucC5hcmFuZ2UoMioyKjQpLnJlc2hhcGUoKDIsNCwyKSkKICAgID4+PiBucC5tYXRtdWwoYSxiKS5zaGFwZQogICAgKDIsIDIsIDIpCiAgICA+Pj4gbnAubWF0bXVsKGEsYilbMCwxLDFdCiAgICA5OAogICAgPj4+IHN1bShhWzAsMSw6XSAqIGJbMCw6LDFdKQogICAgOTgKCiAgICBWZWN0b3IsIHZlY3RvciByZXR1cm5zIHRoZSBzY2FsYXIgaW5uZXIgcHJvZHVjdCwgYnV0IG5laXRoZXIgYXJndW1lbnQKICAgIGlzIGNvbXBsZXgtY29uanVnYXRlZDoKCiAgICA+Pj4gbnAubWF0bXVsKFsyaiwgM2pdLCBbMmosIDNqXSkKICAgICgtMTMrMGopCgogICAgU2NhbGFyIG11bHRpcGxpY2F0aW9uIHJhaXNlcyBhbiBlcnJvci4KCiAgICA+Pj4gbnAubWF0bXVsKFsxLDJdLCAzKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgLi4uCiAgICBWYWx1ZUVycm9yOiBTY2FsYXIgb3BlcmFuZHMgYXJlIG5vdCBhbGxvd2VkLCB1c2UgJyonIGluc3RlYWQKCiAgICBaCGNfZWluc3VtYRMeAAAKICAgIGNfZWluc3VtKHN1YnNjcmlwdHMsICpvcGVyYW5kcywgb3V0PU5vbmUsIGR0eXBlPU5vbmUsIG9yZGVyPSdLJywgY2FzdGluZz0nc2FmZScpCgogICAgRXZhbHVhdGVzIHRoZSBFaW5zdGVpbiBzdW1tYXRpb24gY29udmVudGlvbiBvbiB0aGUgb3BlcmFuZHMuCgogICAgVXNpbmcgdGhlIEVpbnN0ZWluIHN1bW1hdGlvbiBjb252ZW50aW9uLCBtYW55IGNvbW1vbiBtdWx0aS1kaW1lbnNpb25hbAogICAgYXJyYXkgb3BlcmF0aW9ucyBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gYSBzaW1wbGUgZmFzaGlvbi4gIFRoaXMgZnVuY3Rpb24KICAgIHByb3ZpZGVzIGEgd2F5IHRvIGNvbXB1dGUgc3VjaCBzdW1tYXRpb25zLiBUaGUgYmVzdCB3YXkgdG8gdW5kZXJzdGFuZCB0aGlzCiAgICBmdW5jdGlvbiBpcyB0byB0cnkgdGhlIGV4YW1wbGVzIGJlbG93LCB3aGljaCBzaG93IGhvdyBtYW55IGNvbW1vbiBOdW1QeQogICAgZnVuY3Rpb25zIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBjYWxscyB0byBgZWluc3VtYC4KCiAgICBUaGlzIGlzIHRoZSBjb3JlIEMgZnVuY3Rpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgc3Vic2NyaXB0cyA6IHN0cgogICAgICAgIFNwZWNpZmllcyB0aGUgc3Vic2NyaXB0cyBmb3Igc3VtbWF0aW9uLgogICAgb3BlcmFuZHMgOiBsaXN0IG9mIGFycmF5X2xpa2UKICAgICAgICBUaGVzZSBhcmUgdGhlIGFycmF5cyBmb3IgdGhlIG9wZXJhdGlvbi4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgSWYgcHJvdmlkZWQsIHRoZSBjYWxjdWxhdGlvbiBpcyBkb25lIGludG8gdGhpcyBhcnJheS4KICAgIGR0eXBlIDoge2RhdGEtdHlwZSwgTm9uZX0sIG9wdGlvbmFsCiAgICAgICAgSWYgcHJvdmlkZWQsIGZvcmNlcyB0aGUgY2FsY3VsYXRpb24gdG8gdXNlIHRoZSBkYXRhIHR5cGUgc3BlY2lmaWVkLgogICAgICAgIE5vdGUgdGhhdCB5b3UgbWF5IGhhdmUgdG8gYWxzbyBnaXZlIGEgbW9yZSBsaWJlcmFsIGBjYXN0aW5nYAogICAgICAgIHBhcmFtZXRlciB0byBhbGxvdyB0aGUgY29udmVyc2lvbnMuIERlZmF1bHQgaXMgTm9uZS4KICAgIG9yZGVyIDogeydDJywgJ0YnLCAnQScsICdLJ30sIG9wdGlvbmFsCiAgICAgICAgQ29udHJvbHMgdGhlIG1lbW9yeSBsYXlvdXQgb2YgdGhlIG91dHB1dC4gJ0MnIG1lYW5zIGl0IHNob3VsZAogICAgICAgIGJlIEMgY29udGlndW91cy4gJ0YnIG1lYW5zIGl0IHNob3VsZCBiZSBGb3J0cmFuIGNvbnRpZ3VvdXMsCiAgICAgICAgJ0EnIG1lYW5zIGl0IHNob3VsZCBiZSAnRicgaWYgdGhlIGlucHV0cyBhcmUgYWxsICdGJywgJ0MnIG90aGVyd2lzZS4KICAgICAgICAnSycgbWVhbnMgaXQgc2hvdWxkIGJlIGFzIGNsb3NlIHRvIHRoZSBsYXlvdXQgYXMgdGhlIGlucHV0cyBhcwogICAgICAgIGlzIHBvc3NpYmxlLCBpbmNsdWRpbmcgYXJiaXRyYXJpbHkgcGVybXV0ZWQgYXhlcy4KICAgICAgICBEZWZhdWx0IGlzICdLJy4KICAgIGNhc3RpbmcgOiB7J25vJywgJ2VxdWl2JywgJ3NhZmUnLCAnc2FtZV9raW5kJywgJ3Vuc2FmZSd9LCBvcHRpb25hbAogICAgICAgIENvbnRyb2xzIHdoYXQga2luZCBvZiBkYXRhIGNhc3RpbmcgbWF5IG9jY3VyLiAgU2V0dGluZyB0aGlzIHRvCiAgICAgICAgJ3Vuc2FmZScgaXMgbm90IHJlY29tbWVuZGVkLCBhcyBpdCBjYW4gYWR2ZXJzZWx5IGFmZmVjdCBhY2N1bXVsYXRpb25zLgoKICAgICAgICAgICogJ25vJyBtZWFucyB0aGUgZGF0YSB0eXBlcyBzaG91bGQgbm90IGJlIGNhc3QgYXQgYWxsLgogICAgICAgICAgKiAnZXF1aXYnIG1lYW5zIG9ubHkgYnl0ZS1vcmRlciBjaGFuZ2VzIGFyZSBhbGxvd2VkLgogICAgICAgICAgKiAnc2FmZScgbWVhbnMgb25seSBjYXN0cyB3aGljaCBjYW4gcHJlc2VydmUgdmFsdWVzIGFyZSBhbGxvd2VkLgogICAgICAgICAgKiAnc2FtZV9raW5kJyBtZWFucyBvbmx5IHNhZmUgY2FzdHMgb3IgY2FzdHMgd2l0aGluIGEga2luZCwKICAgICAgICAgICAgbGlrZSBmbG9hdDY0IHRvIGZsb2F0MzIsIGFyZSBhbGxvd2VkLgogICAgICAgICAgKiAndW5zYWZlJyBtZWFucyBhbnkgZGF0YSBjb252ZXJzaW9ucyBtYXkgYmUgZG9uZS4KCiAgICAgICAgRGVmYXVsdCBpcyAnc2FmZScuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0cHV0IDogbmRhcnJheQogICAgICAgIFRoZSBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgRWluc3RlaW4gc3VtbWF0aW9uIGNvbnZlbnRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBlaW5zdW0sIGRvdCwgaW5uZXIsIG91dGVyLCB0ZW5zb3Jkb3QKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNi4wCgogICAgVGhlIHN1YnNjcmlwdHMgc3RyaW5nIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc3Vic2NyaXB0IGxhYmVscywKICAgIHdoZXJlIGVhY2ggbGFiZWwgcmVmZXJzIHRvIGEgZGltZW5zaW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhbmQuCiAgICBSZXBlYXRlZCBzdWJzY3JpcHRzIGxhYmVscyBpbiBvbmUgb3BlcmFuZCB0YWtlIHRoZSBkaWFnb25hbC4gIEZvciBleGFtcGxlLAogICAgYGBucC5laW5zdW0oJ2lpJywgYSlgYCBpcyBlcXVpdmFsZW50IHRvIGBgbnAudHJhY2UoYSlgYC4KCiAgICBXaGVuZXZlciBhIGxhYmVsIGlzIHJlcGVhdGVkLCBpdCBpcyBzdW1tZWQsIHNvIGBgbnAuZWluc3VtKCdpLGknLCBhLCBiKWBgCiAgICBpcyBlcXVpdmFsZW50IHRvIGBgbnAuaW5uZXIoYSxiKWBgLiAgSWYgYSBsYWJlbCBhcHBlYXJzIG9ubHkgb25jZSwKICAgIGl0IGlzIG5vdCBzdW1tZWQsIHNvIGBgbnAuZWluc3VtKCdpJywgYSlgYCBwcm9kdWNlcyBhIHZpZXcgb2YgYGBhYGAKICAgIHdpdGggbm8gY2hhbmdlcy4KCiAgICBUaGUgb3JkZXIgb2YgbGFiZWxzIGluIHRoZSBvdXRwdXQgaXMgYnkgZGVmYXVsdCBhbHBoYWJldGljYWwuICBUaGlzCiAgICBtZWFucyB0aGF0IGBgbnAuZWluc3VtKCdpaicsIGEpYGAgZG9lc24ndCBhZmZlY3QgYSAyRCBhcnJheSwgd2hpbGUKICAgIGBgbnAuZWluc3VtKCdqaScsIGEpYGAgdGFrZXMgaXRzIHRyYW5zcG9zZS4KCiAgICBUaGUgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIGJ5IHNwZWNpZnlpbmcgb3V0cHV0IHN1YnNjcmlwdCBsYWJlbHMKICAgIGFzIHdlbGwuICBUaGlzIHNwZWNpZmllcyB0aGUgbGFiZWwgb3JkZXIsIGFuZCBhbGxvd3Mgc3VtbWluZyB0bwogICAgYmUgZGlzYWxsb3dlZCBvciBmb3JjZWQgd2hlbiBkZXNpcmVkLiAgVGhlIGNhbGwgYGBucC5laW5zdW0oJ2ktPicsIGEpYGAKICAgIGlzIGxpa2UgYGBucC5zdW0oYSwgYXhpcz0tMSlgYCwgYW5kIGBgbnAuZWluc3VtKCdpaS0+aScsIGEpYGAKICAgIGlzIGxpa2UgYGBucC5kaWFnKGEpYGAuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IGBlaW5zdW1gIGRvZXMgbm90CiAgICBhbGxvdyBicm9hZGNhc3RpbmcgYnkgZGVmYXVsdC4KCiAgICBUbyBlbmFibGUgYW5kIGNvbnRyb2wgYnJvYWRjYXN0aW5nLCB1c2UgYW4gZWxsaXBzaXMuICBEZWZhdWx0CiAgICBOdW1QeS1zdHlsZSBicm9hZGNhc3RpbmcgaXMgZG9uZSBieSBhZGRpbmcgYW4gZWxsaXBzaXMKICAgIHRvIHRoZSBsZWZ0IG9mIGVhY2ggdGVybSwgbGlrZSBgYG5wLmVpbnN1bSgnLi4uaWktPi4uLmknLCBhKWBgLgogICAgVG8gdGFrZSB0aGUgdHJhY2UgYWxvbmcgdGhlIGZpcnN0IGFuZCBsYXN0IGF4ZXMsCiAgICB5b3UgY2FuIGRvIGBgbnAuZWluc3VtKCdpLi4uaScsIGEpYGAsIG9yIHRvIGRvIGEgbWF0cml4LW1hdHJpeAogICAgcHJvZHVjdCB3aXRoIHRoZSBsZWZ0LW1vc3QgaW5kaWNlcyBpbnN0ZWFkIG9mIHJpZ2h0bW9zdCwgeW91IGNhbiBkbwogICAgYGBucC5laW5zdW0oJ2lqLi4uLGprLi4uLT5pay4uLicsIGEsIGIpYGAuCgogICAgV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBvcGVyYW5kLCBubyBheGVzIGFyZSBzdW1tZWQsIGFuZCBubyBvdXRwdXQKICAgIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgYSB2aWV3IGludG8gdGhlIG9wZXJhbmQgaXMgcmV0dXJuZWQgaW5zdGVhZAogICAgb2YgYSBuZXcgYXJyYXkuICBUaHVzLCB0YWtpbmcgdGhlIGRpYWdvbmFsIGFzIGBgbnAuZWluc3VtKCdpaS0+aScsIGEpYGAKICAgIHByb2R1Y2VzIGEgdmlldy4KCiAgICBBbiBhbHRlcm5hdGl2ZSB3YXkgdG8gcHJvdmlkZSB0aGUgc3Vic2NyaXB0cyBhbmQgb3BlcmFuZHMgaXMgYXMKICAgIGBgZWluc3VtKG9wMCwgc3VibGlzdDAsIG9wMSwgc3VibGlzdDEsIC4uLiwgW3N1Ymxpc3RvdXRdKWBgLiBUaGUgZXhhbXBsZXMKICAgIGJlbG93IGhhdmUgY29ycmVzcG9uZGluZyBgZWluc3VtYCBjYWxscyB3aXRoIHRoZSB0d28gcGFyYW1ldGVyIG1ldGhvZHMuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgVmlld3MgcmV0dXJuZWQgZnJvbSBlaW5zdW0gYXJlIG5vdyB3cml0ZWFibGUgd2hlbmV2ZXIgdGhlIGlucHV0IGFycmF5CiAgICBpcyB3cml0ZWFibGUuIEZvciBleGFtcGxlLCBgYG5wLmVpbnN1bSgnaWprLi4uLT5ramkuLi4nLCBhKWBgIHdpbGwgbm93CiAgICBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyBgYG5wLnN3YXBheGVzKGEsIDAsIDIpYGAgYW5kCiAgICBgYG5wLmVpbnN1bSgnaWktPmknLCBhKWBgIHdpbGwgcmV0dXJuIGEgd3JpdGVhYmxlIHZpZXcgb2YgdGhlIGRpYWdvbmFsCiAgICBvZiBhIDJEIGFycmF5LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcmFuZ2UoMjUpLnJlc2hhcGUoNSw1KQogICAgPj4+IGIgPSBucC5hcmFuZ2UoNSkKICAgID4+PiBjID0gbnAuYXJhbmdlKDYpLnJlc2hhcGUoMiwzKQoKICAgID4+PiBucC5laW5zdW0oJ2lpJywgYSkKICAgIDYwCiAgICA+Pj4gbnAuZWluc3VtKGEsIFswLDBdKQogICAgNjAKICAgID4+PiBucC50cmFjZShhKQogICAgNjAKCiAgICA+Pj4gbnAuZWluc3VtKCdpaS0+aScsIGEpCiAgICBhcnJheShbIDAsICA2LCAxMiwgMTgsIDI0XSkKICAgID4+PiBucC5laW5zdW0oYSwgWzAsMF0sIFswXSkKICAgIGFycmF5KFsgMCwgIDYsIDEyLCAxOCwgMjRdKQogICAgPj4+IG5wLmRpYWcoYSkKICAgIGFycmF5KFsgMCwgIDYsIDEyLCAxOCwgMjRdKQoKICAgID4+PiBucC5laW5zdW0oJ2lqLGonLCBhLCBiKQogICAgYXJyYXkoWyAzMCwgIDgwLCAxMzAsIDE4MCwgMjMwXSkKICAgID4+PiBucC5laW5zdW0oYSwgWzAsMV0sIGIsIFsxXSkKICAgIGFycmF5KFsgMzAsICA4MCwgMTMwLCAxODAsIDIzMF0pCiAgICA+Pj4gbnAuZG90KGEsIGIpCiAgICBhcnJheShbIDMwLCAgODAsIDEzMCwgMTgwLCAyMzBdKQogICAgPj4+IG5wLmVpbnN1bSgnLi4uaixqJywgYSwgYikKICAgIGFycmF5KFsgMzAsICA4MCwgMTMwLCAxODAsIDIzMF0pCgogICAgPj4+IG5wLmVpbnN1bSgnamknLCBjKQogICAgYXJyYXkoW1swLCAzXSwKICAgICAgICAgICBbMSwgNF0sCiAgICAgICAgICAgWzIsIDVdXSkKICAgID4+PiBucC5laW5zdW0oYywgWzEsMF0pCiAgICBhcnJheShbWzAsIDNdLAogICAgICAgICAgIFsxLCA0XSwKICAgICAgICAgICBbMiwgNV1dKQogICAgPj4+IGMuVAogICAgYXJyYXkoW1swLCAzXSwKICAgICAgICAgICBbMSwgNF0sCiAgICAgICAgICAgWzIsIDVdXSkKCiAgICA+Pj4gbnAuZWluc3VtKCcuLi4sIC4uLicsIDMsIGMpCiAgICBhcnJheShbWyAwLCAgMywgIDZdLAogICAgICAgICAgIFsgOSwgMTIsIDE1XV0pCiAgICA+Pj4gbnAuZWluc3VtKDMsIFtFbGxpcHNpc10sIGMsIFtFbGxpcHNpc10pCiAgICBhcnJheShbWyAwLCAgMywgIDZdLAogICAgICAgICAgIFsgOSwgMTIsIDE1XV0pCiAgICA+Pj4gbnAubXVsdGlwbHkoMywgYykKICAgIGFycmF5KFtbIDAsICAzLCAgNl0sCiAgICAgICAgICAgWyA5LCAxMiwgMTVdXSkKCiAgICA+Pj4gbnAuZWluc3VtKCdpLGknLCBiLCBiKQogICAgMzAKICAgID4+PiBucC5laW5zdW0oYiwgWzBdLCBiLCBbMF0pCiAgICAzMAogICAgPj4+IG5wLmlubmVyKGIsYikKICAgIDMwCgogICAgPj4+IG5wLmVpbnN1bSgnaSxqJywgbnAuYXJhbmdlKDIpKzEsIGIpCiAgICBhcnJheShbWzAsIDEsIDIsIDMsIDRdLAogICAgICAgICAgIFswLCAyLCA0LCA2LCA4XV0pCiAgICA+Pj4gbnAuZWluc3VtKG5wLmFyYW5nZSgyKSsxLCBbMF0sIGIsIFsxXSkKICAgIGFycmF5KFtbMCwgMSwgMiwgMywgNF0sCiAgICAgICAgICAgWzAsIDIsIDQsIDYsIDhdXSkKICAgID4+PiBucC5vdXRlcihucC5hcmFuZ2UoMikrMSwgYikKICAgIGFycmF5KFtbMCwgMSwgMiwgMywgNF0sCiAgICAgICAgICAgWzAsIDIsIDQsIDYsIDhdXSkKCiAgICA+Pj4gbnAuZWluc3VtKCdpLi4uLT4uLi4nLCBhKQogICAgYXJyYXkoWzUwLCA1NSwgNjAsIDY1LCA3MF0pCiAgICA+Pj4gbnAuZWluc3VtKGEsIFswLEVsbGlwc2lzXSwgW0VsbGlwc2lzXSkKICAgIGFycmF5KFs1MCwgNTUsIDYwLCA2NSwgNzBdKQogICAgPj4+IG5wLnN1bShhLCBheGlzPTApCiAgICBhcnJheShbNTAsIDU1LCA2MCwgNjUsIDcwXSkKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg2MC4pLnJlc2hhcGUoMyw0LDUpCiAgICA+Pj4gYiA9IG5wLmFyYW5nZSgyNC4pLnJlc2hhcGUoNCwzLDIpCiAgICA+Pj4gbnAuZWluc3VtKCdpamssamlsLT5rbCcsIGEsIGIpCiAgICBhcnJheShbWyA0NDAwLiwgIDQ3MzAuXSwKICAgICAgICAgICBbIDQ1MzIuLCAgNDg3NC5dLAogICAgICAgICAgIFsgNDY2NC4sICA1MDE4Ll0sCiAgICAgICAgICAgWyA0Nzk2LiwgIDUxNjIuXSwKICAgICAgICAgICBbIDQ5MjguLCAgNTMwNi5dXSkKICAgID4+PiBucC5laW5zdW0oYSwgWzAsMSwyXSwgYiwgWzEsMCwzXSwgWzIsM10pCiAgICBhcnJheShbWyA0NDAwLiwgIDQ3MzAuXSwKICAgICAgICAgICBbIDQ1MzIuLCAgNDg3NC5dLAogICAgICAgICAgIFsgNDY2NC4sICA1MDE4Ll0sCiAgICAgICAgICAgWyA0Nzk2LiwgIDUxNjIuXSwKICAgICAgICAgICBbIDQ5MjguLCAgNTMwNi5dXSkKICAgID4+PiBucC50ZW5zb3Jkb3QoYSxiLCBheGVzPShbMSwwXSxbMCwxXSkpCiAgICBhcnJheShbWyA0NDAwLiwgIDQ3MzAuXSwKICAgICAgICAgICBbIDQ1MzIuLCAgNDg3NC5dLAogICAgICAgICAgIFsgNDY2NC4sICA1MDE4Ll0sCiAgICAgICAgICAgWyA0Nzk2LiwgIDUxNjIuXSwKICAgICAgICAgICBbIDQ5MjguLCAgNTMwNi5dXSkKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg2KS5yZXNoYXBlKCgzLDIpKQogICAgPj4+IGIgPSBucC5hcmFuZ2UoMTIpLnJlc2hhcGUoKDQsMykpCiAgICA+Pj4gbnAuZWluc3VtKCdraSxqay0+aWonLCBhLCBiKQogICAgYXJyYXkoW1sxMCwgMjgsIDQ2LCA2NF0sCiAgICAgICAgICAgWzEzLCA0MCwgNjcsIDk0XV0pCiAgICA+Pj4gbnAuZWluc3VtKCdraSwuLi5rLT5pLi4uJywgYSwgYikKICAgIGFycmF5KFtbMTAsIDI4LCA0NiwgNjRdLAogICAgICAgICAgIFsxMywgNDAsIDY3LCA5NF1dKQogICAgPj4+IG5wLmVpbnN1bSgnay4uLixqaycsIGEsIGIpCiAgICBhcnJheShbWzEwLCAyOCwgNDYsIDY0XSwKICAgICAgICAgICBbMTMsIDQwLCA2NywgOTRdXSkKCiAgICA+Pj4gIyBzaW5jZSB2ZXJzaW9uIDEuMTAuMAogICAgPj4+IGEgPSBucC56ZXJvcygoMywgMykpCiAgICA+Pj4gbnAuZWluc3VtKCdpaS0+aScsIGEpWzpdID0gMQogICAgPj4+IGEKICAgIGFycmF5KFtbIDEuLCAgMC4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDEuLCAgMC5dLAogICAgICAgICAgIFsgMC4sICAwLiwgIDEuXV0pCgogICAgWgR2ZG90YYkFAAAKICAgIHZkb3QoYSwgYikKCiAgICBSZXR1cm4gdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzLgoKICAgIFRoZSB2ZG90KGBhYCwgYGJgKSBmdW5jdGlvbiBoYW5kbGVzIGNvbXBsZXggbnVtYmVycyBkaWZmZXJlbnRseSB0aGFuCiAgICBkb3QoYGFgLCBgYmApLiAgSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGNvbXBsZXggdGhlIGNvbXBsZXggY29uanVnYXRlCiAgICBvZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdXNlZCBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBkb3QgcHJvZHVjdC4KCiAgICBOb3RlIHRoYXQgYHZkb3RgIGhhbmRsZXMgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMgZGlmZmVyZW50bHkgdGhhbiBgZG90YDoKICAgIGl0IGRvZXMgKm5vdCogcGVyZm9ybSBhIG1hdHJpeCBwcm9kdWN0LCBidXQgZmxhdHRlbnMgaW5wdXQgYXJndW1lbnRzCiAgICB0byAxLUQgdmVjdG9ycyBmaXJzdC4gQ29uc2VxdWVudGx5LCBpdCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB2ZWN0b3JzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSWYgYGFgIGlzIGNvbXBsZXggdGhlIGNvbXBsZXggY29uanVnYXRlIGlzIHRha2VuIGJlZm9yZSBjYWxjdWxhdGlvbgogICAgICAgIG9mIHRoZSBkb3QgcHJvZHVjdC4KICAgIGIgOiBhcnJheV9saWtlCiAgICAgICAgU2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBkb3QgcHJvZHVjdC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXRwdXQgOiBuZGFycmF5CiAgICAgICAgRG90IHByb2R1Y3Qgb2YgYGFgIGFuZCBgYmAuICBDYW4gYmUgYW4gaW50LCBmbG9hdCwgb3IKICAgICAgICBjb21wbGV4IGRlcGVuZGluZyBvbiB0aGUgdHlwZXMgb2YgYGFgIGFuZCBgYmAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBkb3QgOiBSZXR1cm4gdGhlIGRvdCBwcm9kdWN0IHdpdGhvdXQgdXNpbmcgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIHRoZQogICAgICAgICAgZmlyc3QgYXJndW1lbnQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsxKzJqLDMrNGpdKQogICAgPj4+IGIgPSBucC5hcnJheShbNSs2aiw3KzhqXSkKICAgID4+PiBucC52ZG90KGEsIGIpCiAgICAoNzAtOGopCiAgICA+Pj4gbnAudmRvdChiLCBhKQogICAgKDcwKzhqKQoKICAgIE5vdGUgdGhhdCBoaWdoZXItZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBmbGF0dGVuZWQhCgogICAgPj4+IGEgPSBucC5hcnJheShbWzEsIDRdLCBbNSwgNl1dKQogICAgPj4+IGIgPSBucC5hcnJheShbWzQsIDFdLCBbMiwgMl1dKQogICAgPj4+IG5wLnZkb3QoYSwgYikKICAgIDMwCiAgICA+Pj4gbnAudmRvdChiLCBhKQogICAgMzAKICAgID4+PiAxKjQgKyA0KjEgKyA1KjIgKyA2KjIKICAgIDMwCgogICAgWgduZGFycmF5Yf4QAAAKICAgIG5kYXJyYXkoc2hhcGUsIGR0eXBlPWZsb2F0LCBidWZmZXI9Tm9uZSwgb2Zmc2V0PTAsCiAgICAgICAgICAgIHN0cmlkZXM9Tm9uZSwgb3JkZXI9Tm9uZSkKCiAgICBBbiBhcnJheSBvYmplY3QgcmVwcmVzZW50cyBhIG11bHRpZGltZW5zaW9uYWwsIGhvbW9nZW5lb3VzIGFycmF5CiAgICBvZiBmaXhlZC1zaXplIGl0ZW1zLiAgQW4gYXNzb2NpYXRlZCBkYXRhLXR5cGUgb2JqZWN0IGRlc2NyaWJlcyB0aGUKICAgIGZvcm1hdCBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IChpdHMgYnl0ZS1vcmRlciwgaG93IG1hbnkgYnl0ZXMgaXQKICAgIG9jY3VwaWVzIGluIG1lbW9yeSwgd2hldGhlciBpdCBpcyBhbiBpbnRlZ2VyLCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwKICAgIG9yIHNvbWV0aGluZyBlbHNlLCBldGMuKQoKICAgIEFycmF5cyBzaG91bGQgYmUgY29uc3RydWN0ZWQgdXNpbmcgYGFycmF5YCwgYHplcm9zYCBvciBgZW1wdHlgIChyZWZlcgogICAgdG8gdGhlIFNlZSBBbHNvIHNlY3Rpb24gYmVsb3cpLiAgVGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaGVyZSByZWZlciB0bwogICAgYSBsb3ctbGV2ZWwgbWV0aG9kIChgbmRhcnJheSguLi4pYCkgZm9yIGluc3RhbnRpYXRpbmcgYW4gYXJyYXkuCgogICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBgbnVtcHlgIG1vZHVsZSBhbmQgZXhhbWluZSB0aGUKICAgIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgb2YgYW4gYXJyYXkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgKGZvciB0aGUgX19uZXdfXyBtZXRob2Q7IHNlZSBOb3RlcyBiZWxvdykKCiAgICBzaGFwZSA6IHR1cGxlIG9mIGludHMKICAgICAgICBTaGFwZSBvZiBjcmVhdGVkIGFycmF5LgogICAgZHR5cGUgOiBkYXRhLXR5cGUsIG9wdGlvbmFsCiAgICAgICAgQW55IG9iamVjdCB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIG51bXB5IGRhdGEgdHlwZS4KICAgIGJ1ZmZlciA6IG9iamVjdCBleHBvc2luZyBidWZmZXIgaW50ZXJmYWNlLCBvcHRpb25hbAogICAgICAgIFVzZWQgdG8gZmlsbCB0aGUgYXJyYXkgd2l0aCBkYXRhLgogICAgb2Zmc2V0IDogaW50LCBvcHRpb25hbAogICAgICAgIE9mZnNldCBvZiBhcnJheSBkYXRhIGluIGJ1ZmZlci4KICAgIHN0cmlkZXMgOiB0dXBsZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIFN0cmlkZXMgb2YgZGF0YSBpbiBtZW1vcnkuCiAgICBvcmRlciA6IHsnQycsICdGJ30sIG9wdGlvbmFsCiAgICAgICAgUm93LW1ham9yIChDLXN0eWxlKSBvciBjb2x1bW4tbWFqb3IgKEZvcnRyYW4tc3R5bGUpIG9yZGVyLgoKICAgIEF0dHJpYnV0ZXMKICAgIC0tLS0tLS0tLS0KICAgIFQgOiBuZGFycmF5CiAgICAgICAgVHJhbnNwb3NlIG9mIHRoZSBhcnJheS4KICAgIGRhdGEgOiBidWZmZXIKICAgICAgICBUaGUgYXJyYXkncyBlbGVtZW50cywgaW4gbWVtb3J5LgogICAgZHR5cGUgOiBkdHlwZSBvYmplY3QKICAgICAgICBEZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5LgogICAgZmxhZ3MgOiBkaWN0CiAgICAgICAgRGljdGlvbmFyeSBjb250YWluaW5nIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gbWVtb3J5IHVzZSwgZS5nLiwKICAgICAgICAnQ19DT05USUdVT1VTJywgJ09XTkRBVEEnLCAnV1JJVEVBQkxFJywgZXRjLgogICAgZmxhdCA6IG51bXB5LmZsYXRpdGVyIG9iamVjdAogICAgICAgIEZsYXR0ZW5lZCB2ZXJzaW9uIG9mIHRoZSBhcnJheSBhcyBhbiBpdGVyYXRvci4gIFRoZSBpdGVyYXRvcgogICAgICAgIGFsbG93cyBhc3NpZ25tZW50cywgZS5nLiwgYGB4LmZsYXQgPSAzYGAgKFNlZSBgbmRhcnJheS5mbGF0YCBmb3IKICAgICAgICBhc3NpZ25tZW50IGV4YW1wbGVzOyBUT0RPKS4KICAgIGltYWcgOiBuZGFycmF5CiAgICAgICAgSW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGFycmF5LgogICAgcmVhbCA6IG5kYXJyYXkKICAgICAgICBSZWFsIHBhcnQgb2YgdGhlIGFycmF5LgogICAgc2l6ZSA6IGludAogICAgICAgIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCiAgICBpdGVtc2l6ZSA6IGludAogICAgICAgIFRoZSBtZW1vcnkgdXNlIG9mIGVhY2ggYXJyYXkgZWxlbWVudCBpbiBieXRlcy4KICAgIG5ieXRlcyA6IGludAogICAgICAgIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGFycmF5IGRhdGEsCiAgICAgICAgaS5lLiwgYGBpdGVtc2l6ZSAqIHNpemVgYC4KICAgIG5kaW0gOiBpbnQKICAgICAgICBUaGUgYXJyYXkncyBudW1iZXIgb2YgZGltZW5zaW9ucy4KICAgIHNoYXBlIDogdHVwbGUgb2YgaW50cwogICAgICAgIFNoYXBlIG9mIHRoZSBhcnJheS4KICAgIHN0cmlkZXMgOiB0dXBsZSBvZiBpbnRzCiAgICAgICAgVGhlIHN0ZXAtc2l6ZSByZXF1aXJlZCB0byBtb3ZlIGZyb20gb25lIGVsZW1lbnQgdG8gdGhlIG5leHQgaW4KICAgICAgICBtZW1vcnkuIEZvciBleGFtcGxlLCBhIGNvbnRpZ3VvdXMgYGAoMywgNClgYCBhcnJheSBvZiB0eXBlCiAgICAgICAgYGBpbnQxNmBgIGluIEMtb3JkZXIgaGFzIHN0cmlkZXMgYGAoOCwgMilgYC4gIFRoaXMgaW1wbGllcyB0aGF0CiAgICAgICAgdG8gbW92ZSBmcm9tIGVsZW1lbnQgdG8gZWxlbWVudCBpbiBtZW1vcnkgcmVxdWlyZXMganVtcHMgb2YgMiBieXRlcy4KICAgICAgICBUbyBtb3ZlIGZyb20gcm93LXRvLXJvdywgb25lIG5lZWRzIHRvIGp1bXAgOCBieXRlcyBhdCBhIHRpbWUKICAgICAgICAoYGAyICogNGBgKS4KICAgIGN0eXBlcyA6IGN0eXBlcyBvYmplY3QKICAgICAgICBDbGFzcyBjb250YWluaW5nIHByb3BlcnRpZXMgb2YgdGhlIGFycmF5IG5lZWRlZCBmb3IgaW50ZXJhY3Rpb24KICAgICAgICB3aXRoIGN0eXBlcy4KICAgIGJhc2UgOiBuZGFycmF5CiAgICAgICAgSWYgdGhlIGFycmF5IGlzIGEgdmlldyBpbnRvIGFub3RoZXIgYXJyYXksIHRoYXQgYXJyYXkgaXMgaXRzIGBiYXNlYAogICAgICAgICh1bmxlc3MgdGhhdCBhcnJheSBpcyBhbHNvIGEgdmlldykuICBUaGUgYGJhc2VgIGFycmF5IGlzIHdoZXJlIHRoZQogICAgICAgIGFycmF5IGRhdGEgaXMgYWN0dWFsbHkgc3RvcmVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYXJyYXkgOiBDb25zdHJ1Y3QgYW4gYXJyYXkuCiAgICB6ZXJvcyA6IENyZWF0ZSBhbiBhcnJheSwgZWFjaCBlbGVtZW50IG9mIHdoaWNoIGlzIHplcm8uCiAgICBlbXB0eSA6IENyZWF0ZSBhbiBhcnJheSwgYnV0IGxlYXZlIGl0cyBhbGxvY2F0ZWQgbWVtb3J5IHVuY2hhbmdlZCAoaS5lLiwKICAgICAgICAgICAgaXQgY29udGFpbnMgImdhcmJhZ2UiKS4KICAgIGR0eXBlIDogQ3JlYXRlIGEgZGF0YS10eXBlLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiBjcmVhdGluZyBhbiBhcnJheSB1c2luZyBgYF9fbmV3X19gYDoKCiAgICAxLiBJZiBgYnVmZmVyYCBpcyBOb25lLCB0aGVuIG9ubHkgYHNoYXBlYCwgYGR0eXBlYCwgYW5kIGBvcmRlcmAKICAgICAgIGFyZSB1c2VkLgogICAgMi4gSWYgYGJ1ZmZlcmAgaXMgYW4gb2JqZWN0IGV4cG9zaW5nIHRoZSBidWZmZXIgaW50ZXJmYWNlLCB0aGVuCiAgICAgICBhbGwga2V5d29yZHMgYXJlIGludGVycHJldGVkLgoKICAgIE5vIGBgX19pbml0X19gYCBtZXRob2QgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGFycmF5IGlzIGZ1bGx5IGluaXRpYWxpemVkCiAgICBhZnRlciB0aGUgYGBfX25ld19fYGAgbWV0aG9kLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgVGhlc2UgZXhhbXBsZXMgaWxsdXN0cmF0ZSB0aGUgbG93LWxldmVsIGBuZGFycmF5YCBjb25zdHJ1Y3Rvci4gIFJlZmVyCiAgICB0byB0aGUgYFNlZSBBbHNvYCBzZWN0aW9uIGFib3ZlIGZvciBlYXNpZXIgd2F5cyBvZiBjb25zdHJ1Y3RpbmcgYW4KICAgIG5kYXJyYXkuCgogICAgRmlyc3QgbW9kZSwgYGJ1ZmZlcmAgaXMgTm9uZToKCiAgICA+Pj4gbnAubmRhcnJheShzaGFwZT0oMiwyKSwgZHR5cGU9ZmxvYXQsIG9yZGVyPSdGJykKICAgIGFycmF5KFtbIC0xLjEzNjk4MjI3ZSswMDIsICAgNC4yNTA4NzAxMWUtMzAzXSwKICAgICAgICAgICBbICAyLjg4NTI4NDE0ZS0zMDYsICAgMy4yNzAyNTAxNWUtMzA5XV0pICAgICAgICAgI3JhbmRvbQoKICAgIFNlY29uZCBtb2RlOgoKICAgID4+PiBucC5uZGFycmF5KCgyLCksIGJ1ZmZlcj1ucC5hcnJheShbMSwyLDNdKSwKICAgIC4uLiAgICAgICAgICAgIG9mZnNldD1ucC5pbnRfKCkuaXRlbXNpemUsCiAgICAuLi4gICAgICAgICAgICBkdHlwZT1pbnQpICMgb2Zmc2V0ID0gMSppdGVtc2l6ZSwgaS5lLiBza2lwIGZpcnN0IGVsZW1lbnQKICAgIGFycmF5KFsyLCAzXSkKCiAgICApAloTX19hcnJheV9pbnRlcmZhY2VfX3ocQXJyYXkgcHJvdG9jb2w6IFB5dGhvbiBzaWRlLikCWhJfX2FycmF5X2ZpbmFsaXplX196BU5vbmUuKQJaEl9fYXJyYXlfcHJpb3JpdHlfX3oPQXJyYXkgcHJpb3JpdHkuKQJaEF9fYXJyYXlfc3RydWN0X196HkFycmF5IHByb3RvY29sOiBDLXN0cnVjdCBzaWRlLikCWg5fYXNfcGFyYW1ldGVyX3pyQWxsb3cgdGhlIGFycmF5IHRvIGJlIGludGVycHJldGVkIGFzIGEgY3R5cGVzIG9iamVjdCBieSByZXR1cm5pbmcgdGhlCiAgICBkYXRhLW1lbW9yeSBsb2NhdGlvbiBhcyBhbiBpbnRlZ2VyCgogICAgKQJyBgAAAGE6AQAACiAgICBCYXNlIG9iamVjdCBpZiBtZW1vcnkgaXMgZnJvbSBzb21lIG90aGVyIG9iamVjdC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgIFRoZSBiYXNlIG9mIGFuIGFycmF5IHRoYXQgb3ducyBpdHMgbWVtb3J5IGlzIE5vbmU6CgogICAgPj4+IHggPSBucC5hcnJheShbMSwyLDMsNF0pCiAgICA+Pj4geC5iYXNlIGlzIE5vbmUKICAgIFRydWUKCiAgICBTbGljaW5nIGNyZWF0ZXMgYSB2aWV3LCB3aG9zZSBtZW1vcnkgaXMgc2hhcmVkIHdpdGggeDoKCiAgICA+Pj4geSA9IHhbMjpdCiAgICA+Pj4geS5iYXNlIGlzIHgKICAgIFRydWUKCiAgICApAtoGY3R5cGVzYcEQAAAKICAgIEFuIG9iamVjdCB0byBzaW1wbGlmeSB0aGUgaW50ZXJhY3Rpb24gb2YgdGhlIGFycmF5IHdpdGggdGhlIGN0eXBlcwogICAgbW9kdWxlLgoKICAgIFRoaXMgYXR0cmlidXRlIGNyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgbWFrZXMgaXQgZWFzaWVyIHRvIHVzZSBhcnJheXMKICAgIHdoZW4gY2FsbGluZyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdGhlIGN0eXBlcyBtb2R1bGUuIFRoZSByZXR1cm5lZAogICAgb2JqZWN0IGhhcywgYW1vbmcgb3RoZXJzLCBkYXRhLCBzaGFwZSwgYW5kIHN0cmlkZXMgYXR0cmlidXRlcyAoc2VlCiAgICBOb3RlcyBiZWxvdykgd2hpY2ggdGhlbXNlbHZlcyByZXR1cm4gY3R5cGVzIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZAogICAgYXMgYXJndW1lbnRzIHRvIGEgc2hhcmVkIGxpYnJhcnkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgTm9uZQoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGMgOiBQeXRob24gb2JqZWN0CiAgICAgICAgUG9zc2Vzc2luZyBhdHRyaWJ1dGVzIGRhdGEsIHNoYXBlLCBzdHJpZGVzLCBldGMuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5jdHlwZXNsaWIKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIEJlbG93IGFyZSB0aGUgcHVibGljIGF0dHJpYnV0ZXMgb2YgdGhpcyBvYmplY3Qgd2hpY2ggd2VyZSBkb2N1bWVudGVkCiAgICBpbiAiR3VpZGUgdG8gTnVtUHkiICh3ZSBoYXZlIG9taXR0ZWQgdW5kb2N1bWVudGVkIHB1YmxpYyBhdHRyaWJ1dGVzLAogICAgYXMgd2VsbCBhcyBkb2N1bWVudGVkIHByaXZhdGUgYXR0cmlidXRlcyk6CgogICAgKiBkYXRhOiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBhcmVhIG9mIHRoZSBhcnJheSBhcyBhIFB5dGhvbiBpbnRlZ2VyLgogICAgICBUaGlzIG1lbW9yeSBhcmVhIG1heSBjb250YWluIGRhdGEgdGhhdCBpcyBub3QgYWxpZ25lZCwgb3Igbm90IGluIGNvcnJlY3QKICAgICAgYnl0ZS1vcmRlci4gVGhlIG1lbW9yeSBhcmVhIG1heSBub3QgZXZlbiBiZSB3cml0ZWFibGUuIFRoZSBhcnJheQogICAgICBmbGFncyBhbmQgZGF0YS10eXBlIG9mIHRoaXMgYXJyYXkgc2hvdWxkIGJlIHJlc3BlY3RlZCB3aGVuIHBhc3NpbmcgdGhpcwogICAgICBhdHRyaWJ1dGUgdG8gYXJiaXRyYXJ5IEMtY29kZSB0byBhdm9pZCB0cm91YmxlIHRoYXQgY2FuIGluY2x1ZGUgUHl0aG9uCiAgICAgIGNyYXNoaW5nLiBVc2VyIEJld2FyZSEgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIGV4YWN0bHkgdGhlIHNhbWUKICAgICAgYXMgc2VsZi5fYXJyYXlfaW50ZXJmYWNlX1snZGF0YSddWzBdLgoKICAgICogc2hhcGUgKGNfaW50cCpzZWxmLm5kaW0pOiBBIGN0eXBlcyBhcnJheSBvZiBsZW5ndGggc2VsZi5uZGltIHdoZXJlCiAgICAgIHRoZSBiYXNldHlwZSBpcyB0aGUgQy1pbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gZHR5cGUoJ3AnKSBvbiB0aGlzCiAgICAgIHBsYXRmb3JtLiBUaGlzIGJhc2UtdHlwZSBjb3VsZCBiZSBjX2ludCwgY19sb25nLCBvciBjX2xvbmdsb25nCiAgICAgIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uIFRoZSBjX2ludHAgdHlwZSBpcyBkZWZpbmVkIGFjY29yZGluZ2x5IGluCiAgICAgIG51bXB5LmN0eXBlc2xpYi4gVGhlIGN0eXBlcyBhcnJheSBjb250YWlucyB0aGUgc2hhcGUgb2YgdGhlIHVuZGVybHlpbmcKICAgICAgYXJyYXkuCgogICAgKiBzdHJpZGVzIChjX2ludHAqc2VsZi5uZGltKTogQSBjdHlwZXMgYXJyYXkgb2YgbGVuZ3RoIHNlbGYubmRpbSB3aGVyZQogICAgICB0aGUgYmFzZXR5cGUgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSBzaGFwZSBhdHRyaWJ1dGUuIFRoaXMgY3R5cGVzIGFycmF5CiAgICAgIGNvbnRhaW5zIHRoZSBzdHJpZGVzIGluZm9ybWF0aW9uIGZyb20gdGhlIHVuZGVybHlpbmcgYXJyYXkuIFRoaXMgc3RyaWRlcwogICAgICBpbmZvcm1hdGlvbiBpcyBpbXBvcnRhbnQgZm9yIHNob3dpbmcgaG93IG1hbnkgYnl0ZXMgbXVzdCBiZSBqdW1wZWQgdG8KICAgICAgZ2V0IHRvIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgoKICAgICogZGF0YV9hcyhvYmopOiBSZXR1cm4gdGhlIGRhdGEgcG9pbnRlciBjYXN0IHRvIGEgcGFydGljdWxhciBjLXR5cGVzIG9iamVjdC4KICAgICAgRm9yIGV4YW1wbGUsIGNhbGxpbmcgc2VsZi5fYXNfcGFyYW1ldGVyXyBpcyBlcXVpdmFsZW50IHRvCiAgICAgIHNlbGYuZGF0YV9hcyhjdHlwZXMuY192b2lkX3ApLiBQZXJoYXBzIHlvdSB3YW50IHRvIHVzZSB0aGUgZGF0YSBhcyBhCiAgICAgIHBvaW50ZXIgdG8gYSBjdHlwZXMgYXJyYXkgb2YgZmxvYXRpbmctcG9pbnQgZGF0YToKICAgICAgc2VsZi5kYXRhX2FzKGN0eXBlcy5QT0lOVEVSKGN0eXBlcy5jX2RvdWJsZSkpLgoKICAgICogc2hhcGVfYXMob2JqKTogUmV0dXJuIHRoZSBzaGFwZSB0dXBsZSBhcyBhbiBhcnJheSBvZiBzb21lIG90aGVyIGMtdHlwZXMKICAgICAgdHlwZS4gRm9yIGV4YW1wbGU6IHNlbGYuc2hhcGVfYXMoY3R5cGVzLmNfc2hvcnQpLgoKICAgICogc3RyaWRlc19hcyhvYmopOiBSZXR1cm4gdGhlIHN0cmlkZXMgdHVwbGUgYXMgYW4gYXJyYXkgb2Ygc29tZSBvdGhlcgogICAgICBjLXR5cGVzIHR5cGUuIEZvciBleGFtcGxlOiBzZWxmLnN0cmlkZXNfYXMoY3R5cGVzLmNfbG9uZ2xvbmcpLgoKICAgIEJlIGNhcmVmdWwgdXNpbmcgdGhlIGN0eXBlcyBhdHRyaWJ1dGUgLSBlc3BlY2lhbGx5IG9uIHRlbXBvcmFyeQogICAgYXJyYXlzIG9yIGFycmF5cyBjb25zdHJ1Y3RlZCBvbiB0aGUgZmx5LiBGb3IgZXhhbXBsZSwgY2FsbGluZwogICAgYGAoYStiKS5jdHlwZXMuZGF0YV9hcyhjdHlwZXMuY192b2lkX3ApYGAgcmV0dXJucyBhIHBvaW50ZXIgdG8gbWVtb3J5CiAgICB0aGF0IGlzIGludmFsaWQgYmVjYXVzZSB0aGUgYXJyYXkgY3JlYXRlZCBhcyAoYStiKSBpcyBkZWFsbG9jYXRlZAogICAgYmVmb3JlIHRoZSBuZXh0IFB5dGhvbiBzdGF0ZW1lbnQuIFlvdSBjYW4gYXZvaWQgdGhpcyBwcm9ibGVtIHVzaW5nCiAgICBlaXRoZXIgYGBjPWErYmBgIG9yIGBgY3Q9KGErYikuY3R5cGVzYGAuIEluIHRoZSBsYXR0ZXIgY2FzZSwgY3Qgd2lsbAogICAgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgdW50aWwgY3QgaXMgZGVsZXRlZCBvciByZS1hc3NpZ25lZC4KCiAgICBJZiB0aGUgY3R5cGVzIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLCB0aGVuIHRoZSBjdHlwZXMgYXR0cmlidXRlCiAgICBvZiBhcnJheSBvYmplY3RzIHN0aWxsIHJldHVybnMgc29tZXRoaW5nIHVzZWZ1bCwgYnV0IGN0eXBlcyBvYmplY3RzCiAgICBhcmUgbm90IHJldHVybmVkIGFuZCBlcnJvcnMgbWF5IGJlIHJhaXNlZCBpbnN0ZWFkLiBJbiBwYXJ0aWN1bGFyLAogICAgdGhlIG9iamVjdCB3aWxsIHN0aWxsIGhhdmUgdGhlIGFzIHBhcmFtZXRlciBhdHRyaWJ1dGUgd2hpY2ggd2lsbAogICAgcmV0dXJuIGFuIGludGVnZXIgZXF1YWwgdG8gdGhlIGRhdGEgYXR0cmlidXRlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGltcG9ydCBjdHlwZXMKICAgID4+PiB4CiAgICBhcnJheShbWzAsIDFdLAogICAgICAgICAgIFsyLCAzXV0pCiAgICA+Pj4geC5jdHlwZXMuZGF0YQogICAgMzA0Mzk3MTIKICAgID4+PiB4LmN0eXBlcy5kYXRhX2FzKGN0eXBlcy5QT0lOVEVSKGN0eXBlcy5jX2xvbmcpKQogICAgPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IDB4MDFGMDEzMDA+CiAgICA+Pj4geC5jdHlwZXMuZGF0YV9hcyhjdHlwZXMuUE9JTlRFUihjdHlwZXMuY19sb25nKSkuY29udGVudHMKICAgIGNfbG9uZygwKQogICAgPj4+IHguY3R5cGVzLmRhdGFfYXMoY3R5cGVzLlBPSU5URVIoY3R5cGVzLmNfbG9uZ2xvbmcpKS5jb250ZW50cwogICAgY19sb25nbG9uZyg0Mjk0OTY3Mjk2TCkKICAgID4+PiB4LmN0eXBlcy5zaGFwZQogICAgPG51bXB5LmNvcmUuX2ludGVybmFsLmNfbG9uZ19BcnJheV8yIG9iamVjdCBhdCAweDAxRkZENTgwPgogICAgPj4+IHguY3R5cGVzLnNoYXBlX2FzKGN0eXBlcy5jX2xvbmcpCiAgICA8bnVtcHkuY29yZS5faW50ZXJuYWwuY19sb25nX0FycmF5XzIgb2JqZWN0IGF0IDB4MDFGQ0U2MjA+CiAgICA+Pj4geC5jdHlwZXMuc3RyaWRlcwogICAgPG51bXB5LmNvcmUuX2ludGVybmFsLmNfbG9uZ19BcnJheV8yIG9iamVjdCBhdCAweDAxRkNFNjIwPgogICAgPj4+IHguY3R5cGVzLnN0cmlkZXNfYXMoY3R5cGVzLmNfbG9uZ2xvbmcpCiAgICA8bnVtcHkuY29yZS5faW50ZXJuYWwuY19sb25nbG9uZ19BcnJheV8yIG9iamVjdCBhdCAweDAxRjAxMzAwPgoKICAgICkC2gRkYXRhej9QeXRob24gYnVmZmVyIG9iamVjdCBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIGFycmF5J3MgZGF0YS4pAtoFZHR5cGVhUgEAAAogICAgRGF0YS10eXBlIG9mIHRoZSBhcnJheSdzIGVsZW1lbnRzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIE5vbmUKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBkIDogbnVtcHkgZHR5cGUgb2JqZWN0CgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5kdHlwZQoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHgKICAgIGFycmF5KFtbMCwgMV0sCiAgICAgICAgICAgWzIsIDNdXSkKICAgID4+PiB4LmR0eXBlCiAgICBkdHlwZSgnaW50MzInKQogICAgPj4+IHR5cGUoeC5kdHlwZSkKICAgIDx0eXBlICdudW1weS5kdHlwZSc+CgogICAgKQLaBGltYWd6xwogICAgVGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuc3FydChbMSswaiwgMCsxal0pCiAgICA+Pj4geC5pbWFnCiAgICBhcnJheShbIDAuICAgICAgICAsICAwLjcwNzEwNjc4XSkKICAgID4+PiB4LmltYWcuZHR5cGUKICAgIGR0eXBlKCdmbG9hdDY0JykKCiAgICApAtoIaXRlbXNpemV64QogICAgTGVuZ3RoIG9mIG9uZSBhcnJheSBlbGVtZW50IGluIGJ5dGVzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbMSwyLDNdLCBkdHlwZT1ucC5mbG9hdDY0KQogICAgPj4+IHguaXRlbXNpemUKICAgIDgKICAgID4+PiB4ID0gbnAuYXJyYXkoWzEsMiwzXSwgZHR5cGU9bnAuY29tcGxleDEyOCkKICAgID4+PiB4Lml0ZW1zaXplCiAgICAxNgoKICAgICkC2gVmbGFnc2GuCwAACiAgICBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgYXJyYXkuCgogICAgQXR0cmlidXRlcwogICAgLS0tLS0tLS0tLQogICAgQ19DT05USUdVT1VTIChDKQogICAgICAgIFRoZSBkYXRhIGlzIGluIGEgc2luZ2xlLCBDLXN0eWxlIGNvbnRpZ3VvdXMgc2VnbWVudC4KICAgIEZfQ09OVElHVU9VUyAoRikKICAgICAgICBUaGUgZGF0YSBpcyBpbiBhIHNpbmdsZSwgRm9ydHJhbi1zdHlsZSBjb250aWd1b3VzIHNlZ21lbnQuCiAgICBPV05EQVRBIChPKQogICAgICAgIFRoZSBhcnJheSBvd25zIHRoZSBtZW1vcnkgaXQgdXNlcyBvciBib3Jyb3dzIGl0IGZyb20gYW5vdGhlciBvYmplY3QuCiAgICBXUklURUFCTEUgKFcpCiAgICAgICAgVGhlIGRhdGEgYXJlYSBjYW4gYmUgd3JpdHRlbiB0by4gIFNldHRpbmcgdGhpcyB0byBGYWxzZSBsb2NrcwogICAgICAgIHRoZSBkYXRhLCBtYWtpbmcgaXQgcmVhZC1vbmx5LiAgQSB2aWV3IChzbGljZSwgZXRjLikgaW5oZXJpdHMgV1JJVEVBQkxFCiAgICAgICAgZnJvbSBpdHMgYmFzZSBhcnJheSBhdCBjcmVhdGlvbiB0aW1lLCBidXQgYSB2aWV3IG9mIGEgd3JpdGVhYmxlCiAgICAgICAgYXJyYXkgbWF5IGJlIHN1YnNlcXVlbnRseSBsb2NrZWQgd2hpbGUgdGhlIGJhc2UgYXJyYXkgcmVtYWlucyB3cml0ZWFibGUuCiAgICAgICAgKFRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZSwgaW4gdGhhdCBhIHZpZXcgb2YgYSBsb2NrZWQgYXJyYXkgbWF5IG5vdAogICAgICAgIGJlIG1hZGUgd3JpdGVhYmxlLiAgSG93ZXZlciwgY3VycmVudGx5LCBsb2NraW5nIGEgYmFzZSBvYmplY3QgZG9lcyBub3QKICAgICAgICBsb2NrIGFueSB2aWV3cyB0aGF0IGFscmVhZHkgcmVmZXJlbmNlIGl0LCBzbyB1bmRlciB0aGF0IGNpcmN1bXN0YW5jZSBpdAogICAgICAgIGlzIHBvc3NpYmxlIHRvIGFsdGVyIHRoZSBjb250ZW50cyBvZiBhIGxvY2tlZCBhcnJheSB2aWEgYSBwcmV2aW91c2x5CiAgICAgICAgY3JlYXRlZCB3cml0ZWFibGUgdmlldyBvbnRvIGl0LikgIEF0dGVtcHRpbmcgdG8gY2hhbmdlIGEgbm9uLXdyaXRlYWJsZQogICAgICAgIGFycmF5IHJhaXNlcyBhIFJ1bnRpbWVFcnJvciBleGNlcHRpb24uCiAgICBBTElHTkVEIChBKQogICAgICAgIFRoZSBkYXRhIGFuZCBhbGwgZWxlbWVudHMgYXJlIGFsaWduZWQgYXBwcm9wcmlhdGVseSBmb3IgdGhlIGhhcmR3YXJlLgogICAgVVBEQVRFSUZDT1BZIChVKQogICAgICAgIFRoaXMgYXJyYXkgaXMgYSBjb3B5IG9mIHNvbWUgb3RoZXIgYXJyYXkuIFdoZW4gdGhpcyBhcnJheSBpcwogICAgICAgIGRlYWxsb2NhdGVkLCB0aGUgYmFzZSBhcnJheSB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgY29udGVudHMgb2YKICAgICAgICB0aGlzIGFycmF5LgogICAgRk5DCiAgICAgICAgRl9DT05USUdVT1VTIGFuZCBub3QgQ19DT05USUdVT1VTLgogICAgRk9SQwogICAgICAgIEZfQ09OVElHVU9VUyBvciBDX0NPTlRJR1VPVVMgKG9uZS1zZWdtZW50IHRlc3QpLgogICAgQkVIQVZFRCAoQikKICAgICAgICBBTElHTkVEIGFuZCBXUklURUFCTEUuCiAgICBDQVJSQVkgKENBKQogICAgICAgIEJFSEFWRUQgYW5kIENfQ09OVElHVU9VUy4KICAgIEZBUlJBWSAoRkEpCiAgICAgICAgQkVIQVZFRCBhbmQgRl9DT05USUdVT1VTIGFuZCBub3QgQ19DT05USUdVT1VTLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIGBmbGFnc2Agb2JqZWN0IGNhbiBiZSBhY2Nlc3NlZCBkaWN0aW9uYXJ5LWxpa2UgKGFzIGluIGBgYS5mbGFnc1snV1JJVEVBQkxFJ11gYCksCiAgICBvciBieSB1c2luZyBsb3dlcmNhc2VkIGF0dHJpYnV0ZSBuYW1lcyAoYXMgaW4gYGBhLmZsYWdzLndyaXRlYWJsZWBgKS4gU2hvcnQgZmxhZwogICAgbmFtZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGRpY3Rpb25hcnkgYWNjZXNzLgoKICAgIE9ubHkgdGhlIFVQREFURUlGQ09QWSwgV1JJVEVBQkxFLCBhbmQgQUxJR05FRCBmbGFncyBjYW4gYmUgY2hhbmdlZCBieQogICAgdGhlIHVzZXIsIHZpYSBkaXJlY3QgYXNzaWdubWVudCB0byB0aGUgYXR0cmlidXRlIG9yIGRpY3Rpb25hcnkgZW50cnksCiAgICBvciBieSBjYWxsaW5nIGBuZGFycmF5LnNldGZsYWdzYC4KCiAgICBUaGUgYXJyYXkgZmxhZ3MgY2Fubm90IGJlIHNldCBhcmJpdHJhcmlseToKCiAgICAtIFVQREFURUlGQ09QWSBjYW4gb25seSBiZSBzZXQgYGBGYWxzZWBgLgogICAgLSBBTElHTkVEIGNhbiBvbmx5IGJlIHNldCBgYFRydWVgYCBpZiB0aGUgZGF0YSBpcyB0cnVseSBhbGlnbmVkLgogICAgLSBXUklURUFCTEUgY2FuIG9ubHkgYmUgc2V0IGBgVHJ1ZWBgIGlmIHRoZSBhcnJheSBvd25zIGl0cyBvd24gbWVtb3J5CiAgICAgIG9yIHRoZSB1bHRpbWF0ZSBvd25lciBvZiB0aGUgbWVtb3J5IGV4cG9zZXMgYSB3cml0ZWFibGUgYnVmZmVyCiAgICAgIGludGVyZmFjZSBvciBpcyBhIHN0cmluZy4KCiAgICBBcnJheXMgY2FuIGJlIGJvdGggQy1zdHlsZSBhbmQgRm9ydHJhbi1zdHlsZSBjb250aWd1b3VzIHNpbXVsdGFuZW91c2x5LgogICAgVGhpcyBpcyBjbGVhciBmb3IgMS1kaW1lbnNpb25hbCBhcnJheXMsIGJ1dCBjYW4gYWxzbyBiZSB0cnVlIGZvciBoaWdoZXIKICAgIGRpbWVuc2lvbmFsIGFycmF5cy4KCiAgICBFdmVuIGZvciBjb250aWd1b3VzIGFycmF5cyBhIHN0cmlkZSBmb3IgYSBnaXZlbiBkaW1lbnNpb24KICAgIGBgYXJyLnN0cmlkZXNbZGltXWBgIG1heSBiZSAqYXJiaXRyYXJ5KiBpZiBgYGFyci5zaGFwZVtkaW1dID09IDFgYAogICAgb3IgdGhlIGFycmF5IGhhcyBubyBlbGVtZW50cy4KICAgIEl0IGRvZXMgKm5vdCogZ2VuZXJhbGx5IGhvbGQgdGhhdCBgYHNlbGYuc3RyaWRlc1stMV0gPT0gc2VsZi5pdGVtc2l6ZWBgCiAgICBmb3IgQy1zdHlsZSBjb250aWd1b3VzIGFycmF5cyBvciBgYHNlbGYuc3RyaWRlc1swXSA9PSBzZWxmLml0ZW1zaXplYGAgZm9yCiAgICBGb3J0cmFuLXN0eWxlIGNvbnRpZ3VvdXMgYXJyYXlzIGlzIHRydWUuCiAgICApAtoEZmxhdGHsAgAACiAgICBBIDEtRCBpdGVyYXRvciBvdmVyIHRoZSBhcnJheS4KCiAgICBUaGlzIGlzIGEgYG51bXB5LmZsYXRpdGVyYCBpbnN0YW5jZSwgd2hpY2ggYWN0cyBzaW1pbGFybHkgdG8sIGJ1dCBpcyBub3QKICAgIGEgc3ViY2xhc3Mgb2YsIFB5dGhvbidzIGJ1aWx0LWluIGl0ZXJhdG9yIG9iamVjdC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGZsYXR0ZW4gOiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBhcnJheSBjb2xsYXBzZWQgaW50byBvbmUgZGltZW5zaW9uLgoKICAgIGZsYXRpdGVyCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFyYW5nZSgxLCA3KS5yZXNoYXBlKDIsIDMpCiAgICA+Pj4geAogICAgYXJyYXkoW1sxLCAyLCAzXSwKICAgICAgICAgICBbNCwgNSwgNl1dKQogICAgPj4+IHguZmxhdFszXQogICAgNAogICAgPj4+IHguVAogICAgYXJyYXkoW1sxLCA0XSwKICAgICAgICAgICBbMiwgNV0sCiAgICAgICAgICAgWzMsIDZdXSkKICAgID4+PiB4LlQuZmxhdFszXQogICAgNQogICAgPj4+IHR5cGUoeC5mbGF0KQogICAgPHR5cGUgJ251bXB5LmZsYXRpdGVyJz4KCiAgICBBbiBhc3NpZ25tZW50IGV4YW1wbGU6CgogICAgPj4+IHguZmxhdCA9IDM7IHgKICAgIGFycmF5KFtbMywgMywgM10sCiAgICAgICAgICAgWzMsIDMsIDNdXSkKICAgID4+PiB4LmZsYXRbWzEsNF1dID0gMTsgeAogICAgYXJyYXkoW1szLCAxLCAzXSwKICAgICAgICAgICBbMywgMSwgM11dKQoKICAgICkC2gZuYnl0ZXNhPwEAAAogICAgVG90YWwgYnl0ZXMgY29uc3VtZWQgYnkgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIERvZXMgbm90IGluY2x1ZGUgbWVtb3J5IGNvbnN1bWVkIGJ5IG5vbi1lbGVtZW50IGF0dHJpYnV0ZXMgb2YgdGhlCiAgICBhcnJheSBvYmplY3QuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLnplcm9zKCgzLDUsMiksIGR0eXBlPW5wLmNvbXBsZXgxMjgpCiAgICA+Pj4geC5uYnl0ZXMKICAgIDQ4MAogICAgPj4+IG5wLnByb2QoeC5zaGFwZSkgKiB4Lml0ZW1zaXplCiAgICA0ODAKCiAgICApAnIMAAAAeqsKICAgIE51bWJlciBvZiBhcnJheSBkaW1lbnNpb25zLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbMSwgMiwgM10pCiAgICA+Pj4geC5uZGltCiAgICAxCiAgICA+Pj4geSA9IG5wLnplcm9zKCgyLCAzLCA0KSkKICAgID4+PiB5Lm5kaW0KICAgIDMKCiAgICApAtoEcmVhbGECAQAACiAgICBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuc3FydChbMSswaiwgMCsxal0pCiAgICA+Pj4geC5yZWFsCiAgICBhcnJheShbIDEuICAgICAgICAsICAwLjcwNzEwNjc4XSkKICAgID4+PiB4LnJlYWwuZHR5cGUKICAgIGR0eXBlKCdmbG9hdDY0JykKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnJlYWwgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQJyDQAAAGGtAgAACiAgICBUdXBsZSBvZiBhcnJheSBkaW1lbnNpb25zLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgTWF5IGJlIHVzZWQgdG8gInJlc2hhcGUiIHRoZSBhcnJheSwgYXMgbG9uZyBhcyB0aGlzIHdvdWxkIG5vdAogICAgcmVxdWlyZSBhIGNoYW5nZSBpbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFycmF5KFsxLCAyLCAzLCA0XSkKICAgID4+PiB4LnNoYXBlCiAgICAoNCwpCiAgICA+Pj4geSA9IG5wLnplcm9zKCgyLCAzLCA0KSkKICAgID4+PiB5LnNoYXBlCiAgICAoMiwgMywgNCkKICAgID4+PiB5LnNoYXBlID0gKDMsIDgpCiAgICA+Pj4geQogICAgYXJyYXkoW1sgMC4sICAwLiwgIDAuLCAgMC4sICAwLiwgIDAuLCAgMC4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDAuLCAgMC4sICAwLiwgIDAuLCAgMC4sICAwLiwgIDAuXSwKICAgICAgICAgICBbIDAuLCAgMC4sICAwLiwgIDAuLCAgMC4sICAwLiwgIDAuLCAgMC5dXSkKICAgID4+PiB5LnNoYXBlID0gKDMsIDYpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICBWYWx1ZUVycm9yOiB0b3RhbCBzaXplIG9mIG5ldyBhcnJheSBtdXN0IGJlIHVuY2hhbmdlZAoKICAgICkCcg4AAABhCwEAAAogICAgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KCiAgICBFcXVpdmFsZW50IHRvIGBgbnAucHJvZChhLnNoYXBlKWBgLCBpLmUuLCB0aGUgcHJvZHVjdCBvZiB0aGUgYXJyYXkncwogICAgZGltZW5zaW9ucy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuemVyb3MoKDMsIDUsIDIpLCBkdHlwZT1ucC5jb21wbGV4MTI4KQogICAgPj4+IHguc2l6ZQogICAgMzAKICAgID4+PiBucC5wcm9kKHguc2hhcGUpCiAgICAzMAoKICAgICkC2gdzdHJpZGVzYZQGAAAKICAgIFR1cGxlIG9mIGJ5dGVzIHRvIHN0ZXAgaW4gZWFjaCBkaW1lbnNpb24gd2hlbiB0cmF2ZXJzaW5nIGFuIGFycmF5LgoKICAgIFRoZSBieXRlIG9mZnNldCBvZiBlbGVtZW50IGBgKGlbMF0sIGlbMV0sIC4uLiwgaVtuXSlgYCBpbiBhbiBhcnJheSBgYWAKICAgIGlzOjoKCiAgICAgICAgb2Zmc2V0ID0gc3VtKG5wLmFycmF5KGkpICogYS5zdHJpZGVzKQoKICAgIEEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBzdHJpZGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUKICAgICJuZGFycmF5LnJzdCIgZmlsZSBpbiB0aGUgTnVtUHkgcmVmZXJlbmNlIGd1aWRlLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgSW1hZ2luZSBhbiBhcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMgKGVhY2ggNCBieXRlcyk6OgoKICAgICAgeCA9IG5wLmFycmF5KFtbMCwgMSwgMiwgMywgNF0sCiAgICAgICAgICAgICAgICAgICAgWzUsIDYsIDcsIDgsIDldXSwgZHR5cGU9bnAuaW50MzIpCgogICAgVGhpcyBhcnJheSBpcyBzdG9yZWQgaW4gbWVtb3J5IGFzIDQwIGJ5dGVzLCBvbmUgYWZ0ZXIgdGhlIG90aGVyCiAgICAoa25vd24gYXMgYSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSkuICBUaGUgc3RyaWRlcyBvZiBhbiBhcnJheSB0ZWxsCiAgICB1cyBob3cgbWFueSBieXRlcyB3ZSBoYXZlIHRvIHNraXAgaW4gbWVtb3J5IHRvIG1vdmUgdG8gdGhlIG5leHQgcG9zaXRpb24KICAgIGFsb25nIGEgY2VydGFpbiBheGlzLiAgRm9yIGV4YW1wbGUsIHdlIGhhdmUgdG8gc2tpcCA0IGJ5dGVzICgxIHZhbHVlKSB0bwogICAgbW92ZSB0byB0aGUgbmV4dCBjb2x1bW4sIGJ1dCAyMCBieXRlcyAoNSB2YWx1ZXMpIHRvIGdldCB0byB0aGUgc2FtZQogICAgcG9zaXRpb24gaW4gdGhlIG5leHQgcm93LiAgQXMgc3VjaCwgdGhlIHN0cmlkZXMgZm9yIHRoZSBhcnJheSBgeGAgd2lsbCBiZQogICAgYGAoMjAsIDQpYGAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5saWIuc3RyaWRlX3RyaWNrcy5hc19zdHJpZGVkCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geSA9IG5wLnJlc2hhcGUobnAuYXJhbmdlKDIqMyo0KSwgKDIsMyw0KSkKICAgID4+PiB5CiAgICBhcnJheShbW1sgMCwgIDEsICAyLCAgM10sCiAgICAgICAgICAgIFsgNCwgIDUsICA2LCAgN10sCiAgICAgICAgICAgIFsgOCwgIDksIDEwLCAxMV1dLAogICAgICAgICAgIFtbMTIsIDEzLCAxNCwgMTVdLAogICAgICAgICAgICBbMTYsIDE3LCAxOCwgMTldLAogICAgICAgICAgICBbMjAsIDIxLCAyMiwgMjNdXV0pCiAgICA+Pj4geS5zdHJpZGVzCiAgICAoNDgsIDE2LCA0KQogICAgPj4+IHlbMSwxLDFdCiAgICAxNwogICAgPj4+IG9mZnNldD1zdW0oeS5zdHJpZGVzICogbnAuYXJyYXkoKDEsMSwxKSkpCiAgICA+Pj4gb2Zmc2V0L3kuaXRlbXNpemUKICAgIDE3CgogICAgPj4+IHggPSBucC5yZXNoYXBlKG5wLmFyYW5nZSg1KjYqNyo4KSwgKDUsNiw3LDgpKS50cmFuc3Bvc2UoMiwzLDEsMCkKICAgID4+PiB4LnN0cmlkZXMKICAgICgzMiwgNCwgMjI0LCAxMzQ0KQogICAgPj4+IGkgPSBucC5hcnJheShbMyw1LDIsMl0pCiAgICA+Pj4gb2Zmc2V0ID0gc3VtKGkgKiB4LnN0cmlkZXMpCiAgICA+Pj4geFszLDUsMiwyXQogICAgODEzCiAgICA+Pj4gb2Zmc2V0IC8geC5pdGVtc2l6ZQogICAgODEzCgogICAgKQLaAVRhiAEAAAogICAgU2FtZSBhcyBzZWxmLnRyYW5zcG9zZSgpLCBleGNlcHQgdGhhdCBzZWxmIGlzIHJldHVybmVkIGlmCiAgICBzZWxmLm5kaW0gPCAyLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbWzEuLDIuXSxbMy4sNC5dXSkKICAgID4+PiB4CiAgICBhcnJheShbWyAxLiwgIDIuXSwKICAgICAgICAgICBbIDMuLCAgNC5dXSkKICAgID4+PiB4LlQKICAgIGFycmF5KFtbIDEuLCAgMy5dLAogICAgICAgICAgIFsgMi4sICA0Ll1dKQogICAgPj4+IHggPSBucC5hcnJheShbMS4sMi4sMy4sNC5dKQogICAgPj4+IHgKICAgIGFycmF5KFsgMS4sICAyLiwgIDMuLCAgNC5dKQogICAgPj4+IHguVAogICAgYXJyYXkoWyAxLiwgIDIuLCAgMy4sICA0Ll0pCgogICAgKQJyCAAAAHr0IGEuX19hcnJheV9fKHxkdHlwZSkgLT4gcmVmZXJlbmNlIGlmIHR5cGUgdW5jaGFuZ2VkLCBjb3B5IG90aGVyd2lzZS4KCiAgICBSZXR1cm5zIGVpdGhlciBhIG5ldyByZWZlcmVuY2UgdG8gc2VsZiBpZiBkdHlwZSBpcyBub3QgZ2l2ZW4gb3IgYSBuZXcgYXJyYXkKICAgIG9mIHByb3ZpZGVkIGRhdGEgdHlwZSBpZiBkdHlwZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBkdHlwZSBvZiB0aGUKICAgIGFycmF5LgoKICAgICkCWhFfX2FycmF5X3ByZXBhcmVfX3pMYS5fX2FycmF5X3ByZXBhcmVfXyhvYmopIC0+IE9iamVjdCBvZiBzYW1lIHR5cGUgYXMgbmRhcnJheSBvYmplY3Qgb2JqLgoKICAgICkCWg5fX2FycmF5X3dyYXBfX3pHYS5fX2FycmF5X3dyYXBfXyhvYmopIC0+IE9iamVjdCBvZiBzYW1lIHR5cGUgYXMgbmRhcnJheSBvYmplY3QgYS4KCiAgICApAtoIX19jb3B5X19higEAAGEuX19jb3B5X18oW29yZGVyXSkKCiAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBvcmRlciA6IHsnQycsICdGJywgJ0EnfSwgb3B0aW9uYWwKICAgICAgICBJZiBvcmRlciBpcyAnQycgKEZhbHNlKSB0aGVuIHRoZSByZXN1bHQgaXMgY29udGlndW91cyAoZGVmYXVsdCkuCiAgICAgICAgSWYgb3JkZXIgaXMgJ0ZvcnRyYW4nIChUcnVlKSB0aGVuIHRoZSByZXN1bHQgaGFzIGZvcnRyYW4gb3JkZXIuCiAgICAgICAgSWYgb3JkZXIgaXMgJ0FueScgKE5vbmUpIHRoZW4gdGhlIHJlc3VsdCBoYXMgZm9ydHJhbiBvcmRlcgogICAgICAgIG9ubHkgaWYgdGhlIGFycmF5IGFscmVhZHkgaXMgaW4gZm9ydHJhbiBvcmRlci4KCiAgICApAtoMX19kZWVwY29weV9fel9hLl9fZGVlcGNvcHlfXygpIC0+IERlZXAgY29weSBvZiBhcnJheS4KCiAgICBVc2VkIGlmIGNvcHkuZGVlcGNvcHkgaXMgY2FsbGVkIG9uIGFuIGFycmF5LgoKICAgICkC2gpfX3JlZHVjZV9feidhLl9fcmVkdWNlX18oKQoKICAgIEZvciBwaWNrbGluZy4KCiAgICApAtoMX19zZXRzdGF0ZV9fYWYBAABhLl9fc2V0c3RhdGVfXyh2ZXJzaW9uLCBzaGFwZSwgZHR5cGUsIGlzZm9ydHJhbiwgcmF3ZGF0YSkKCiAgICBGb3IgdW5waWNrbGluZy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB2ZXJzaW9uIDogaW50CiAgICAgICAgb3B0aW9uYWwgcGlja2xlIHZlcnNpb24uIElmIG9taXR0ZWQgZGVmYXVsdHMgdG8gMC4KICAgIHNoYXBlIDogdHVwbGUKICAgIGR0eXBlIDogZGF0YS10eXBlCiAgICBpc0ZvcnRyYW4gOiBib29sCiAgICByYXdkYXRhIDogc3RyaW5nIG9yIGxpc3QKICAgICAgICBhIGJpbmFyeSBzdHJpbmcgd2l0aCB0aGUgZGF0YSAob3IgYSBsaXN0IGlmICdhJyBpcyBhbiBvYmplY3QgYXJyYXkpCgogICAgKQLaA2FsbHraCiAgICBhLmFsbChheGlzPU5vbmUsIG91dD1Ob25lLCBrZWVwZGltcz1GYWxzZSkKCiAgICBSZXR1cm5zIFRydWUgaWYgYWxsIGVsZW1lbnRzIGV2YWx1YXRlIHRvIFRydWUuCgogICAgUmVmZXIgdG8gYG51bXB5LmFsbGAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmFsbCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoDYW55eugKICAgIGEuYW55KGF4aXM9Tm9uZSwgb3V0PU5vbmUsIGtlZXBkaW1zPUZhbHNlKQoKICAgIFJldHVybnMgVHJ1ZSBpZiBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mIGBhYCBldmFsdWF0ZSB0byBUcnVlLgoKICAgIFJlZmVyIHRvIGBudW1weS5hbnlgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5hbnkgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaBmFyZ21heHrfCiAgICBhLmFyZ21heChheGlzPU5vbmUsIG91dD1Ob25lKQoKICAgIFJldHVybiBpbmRpY2VzIG9mIHRoZSBtYXhpbXVtIHZhbHVlcyBhbG9uZyB0aGUgZ2l2ZW4gYXhpcy4KCiAgICBSZWZlciB0byBgbnVtcHkuYXJnbWF4YCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuYXJnbWF4IDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2gZhcmdtaW566gogICAgYS5hcmdtaW4oYXhpcz1Ob25lLCBvdXQ9Tm9uZSkKCiAgICBSZXR1cm4gaW5kaWNlcyBvZiB0aGUgbWluaW11bSB2YWx1ZXMgYWxvbmcgdGhlIGdpdmVuIGF4aXMgb2YgYGFgLgoKICAgIFJlZmVyIHRvIGBudW1weS5hcmdtaW5gIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuYXJnbWluIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2gdhcmdzb3J0eukKICAgIGEuYXJnc29ydChheGlzPS0xLCBraW5kPSdxdWlja3NvcnQnLCBvcmRlcj1Ob25lKQoKICAgIFJldHVybnMgdGhlIGluZGljZXMgdGhhdCB3b3VsZCBzb3J0IHRoaXMgYXJyYXkuCgogICAgUmVmZXIgdG8gYG51bXB5LmFyZ3NvcnRgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5hcmdzb3J0IDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkCWgxhcmdwYXJ0aXRpb25hIQEAAAogICAgYS5hcmdwYXJ0aXRpb24oa3RoLCBheGlzPS0xLCBraW5kPSdpbnRyb3NlbGVjdCcsIG9yZGVyPU5vbmUpCgogICAgUmV0dXJucyB0aGUgaW5kaWNlcyB0aGF0IHdvdWxkIHBhcnRpdGlvbiB0aGlzIGFycmF5LgoKICAgIFJlZmVyIHRvIGBudW1weS5hcmdwYXJ0aXRpb25gIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmFyZ3BhcnRpdGlvbiA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoGYXN0eXBlYeAJAAAKICAgIGEuYXN0eXBlKGR0eXBlLCBvcmRlcj0nSycsIGNhc3Rpbmc9J3Vuc2FmZScsIHN1Ym9rPVRydWUsIGNvcHk9VHJ1ZSkKCiAgICBDb3B5IG9mIHRoZSBhcnJheSwgY2FzdCB0byBhIHNwZWNpZmllZCB0eXBlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGR0eXBlIDogc3RyIG9yIGR0eXBlCiAgICAgICAgVHlwZWNvZGUgb3IgZGF0YS10eXBlIHRvIHdoaWNoIHRoZSBhcnJheSBpcyBjYXN0LgogICAgb3JkZXIgOiB7J0MnLCAnRicsICdBJywgJ0snfSwgb3B0aW9uYWwKICAgICAgICBDb250cm9scyB0aGUgbWVtb3J5IGxheW91dCBvcmRlciBvZiB0aGUgcmVzdWx0LgogICAgICAgICdDJyBtZWFucyBDIG9yZGVyLCAnRicgbWVhbnMgRm9ydHJhbiBvcmRlciwgJ0EnCiAgICAgICAgbWVhbnMgJ0YnIG9yZGVyIGlmIGFsbCB0aGUgYXJyYXlzIGFyZSBGb3J0cmFuIGNvbnRpZ3VvdXMsCiAgICAgICAgJ0MnIG9yZGVyIG90aGVyd2lzZSwgYW5kICdLJyBtZWFucyBhcyBjbG9zZSB0byB0aGUKICAgICAgICBvcmRlciB0aGUgYXJyYXkgZWxlbWVudHMgYXBwZWFyIGluIG1lbW9yeSBhcyBwb3NzaWJsZS4KICAgICAgICBEZWZhdWx0IGlzICdLJy4KICAgIGNhc3RpbmcgOiB7J25vJywgJ2VxdWl2JywgJ3NhZmUnLCAnc2FtZV9raW5kJywgJ3Vuc2FmZSd9LCBvcHRpb25hbAogICAgICAgIENvbnRyb2xzIHdoYXQga2luZCBvZiBkYXRhIGNhc3RpbmcgbWF5IG9jY3VyLiBEZWZhdWx0cyB0byAndW5zYWZlJwogICAgICAgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAqICdubycgbWVhbnMgdGhlIGRhdGEgdHlwZXMgc2hvdWxkIG5vdCBiZSBjYXN0IGF0IGFsbC4KICAgICAgICAgICogJ2VxdWl2JyBtZWFucyBvbmx5IGJ5dGUtb3JkZXIgY2hhbmdlcyBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3NhZmUnIG1lYW5zIG9ubHkgY2FzdHMgd2hpY2ggY2FuIHByZXNlcnZlIHZhbHVlcyBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3NhbWVfa2luZCcgbWVhbnMgb25seSBzYWZlIGNhc3RzIG9yIGNhc3RzIHdpdGhpbiBhIGtpbmQsCiAgICAgICAgICAgIGxpa2UgZmxvYXQ2NCB0byBmbG9hdDMyLCBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3Vuc2FmZScgbWVhbnMgYW55IGRhdGEgY29udmVyc2lvbnMgbWF5IGJlIGRvbmUuCiAgICBzdWJvayA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgSWYgVHJ1ZSwgdGhlbiBzdWItY2xhc3NlcyB3aWxsIGJlIHBhc3NlZC10aHJvdWdoIChkZWZhdWx0KSwgb3RoZXJ3aXNlCiAgICAgICAgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgZm9yY2VkIHRvIGJlIGEgYmFzZS1jbGFzcyBhcnJheS4KICAgIGNvcHkgOiBib29sLCBvcHRpb25hbAogICAgICAgIEJ5IGRlZmF1bHQsIGFzdHlwZSBhbHdheXMgcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBhcnJheS4gSWYgdGhpcwogICAgICAgIGlzIHNldCB0byBmYWxzZSwgYW5kIHRoZSBgZHR5cGVgLCBgb3JkZXJgLCBhbmQgYHN1Ym9rYAogICAgICAgIHJlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkLCB0aGUgaW5wdXQgYXJyYXkgaXMgcmV0dXJuZWQgaW5zdGVhZAogICAgICAgIG9mIGEgY29weS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBhcnJfdCA6IG5kYXJyYXkKICAgICAgICBVbmxlc3MgYGNvcHlgIGlzIEZhbHNlIGFuZCB0aGUgb3RoZXIgY29uZGl0aW9ucyBmb3IgcmV0dXJuaW5nIHRoZSBpbnB1dAogICAgICAgIGFycmF5IGFyZSBzYXRpc2ZpZWQgKHNlZSBkZXNjcmlwdGlvbiBmb3IgYGNvcHlgIGlucHV0IHBhcmFtZXRlciksIGBhcnJfdGAKICAgICAgICBpcyBhIG5ldyBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgaW5wdXQgYXJyYXksIHdpdGggZHR5cGUsIG9yZGVyCiAgICAgICAgZ2l2ZW4gYnkgYGR0eXBlYCwgYG9yZGVyYC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFN0YXJ0aW5nIGluIE51bVB5IDEuOSwgYXN0eXBlIG1ldGhvZCBub3cgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc3RyaW5nCiAgICBkdHlwZSB0byBjYXN0IHRvIGlzIG5vdCBsb25nIGVub3VnaCBpbiAnc2FmZScgY2FzdGluZyBtb2RlIHRvIGhvbGQgdGhlIG1heAogICAgdmFsdWUgb2YgaW50ZWdlci9mbG9hdCBhcnJheSB0aGF0IGlzIGJlaW5nIGNhc3RlZC4gUHJldmlvdXNseSB0aGUgY2FzdGluZwogICAgd2FzIGFsbG93ZWQgZXZlbiBpZiB0aGUgcmVzdWx0IHdhcyB0cnVuY2F0ZWQuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIENvbXBsZXhXYXJuaW5nCiAgICAgICAgV2hlbiBjYXN0aW5nIGZyb20gY29tcGxleCB0byBmbG9hdCBvciBpbnQuIFRvIGF2b2lkIHRoaXMsCiAgICAgICAgb25lIHNob3VsZCB1c2UgYGBhLnJlYWwuYXN0eXBlKHQpYGAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFycmF5KFsxLCAyLCAyLjVdKQogICAgPj4+IHgKICAgIGFycmF5KFsgMS4gLCAgMi4gLCAgMi41XSkKCiAgICA+Pj4geC5hc3R5cGUoaW50KQogICAgYXJyYXkoWzEsIDIsIDJdKQoKICAgICkC2ghieXRlc3dhcGFdAwAACiAgICBhLmJ5dGVzd2FwKGlucGxhY2UpCgogICAgU3dhcCB0aGUgYnl0ZXMgb2YgdGhlIGFycmF5IGVsZW1lbnRzCgogICAgVG9nZ2xlIGJldHdlZW4gbG93LWVuZGlhbiBhbmQgYmlnLWVuZGlhbiBkYXRhIHJlcHJlc2VudGF0aW9uIGJ5CiAgICByZXR1cm5pbmcgYSBieXRlc3dhcHBlZCBhcnJheSwgb3B0aW9uYWxseSBzd2FwcGVkIGluLXBsYWNlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGlucGxhY2UgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIGBgVHJ1ZWBgLCBzd2FwIGJ5dGVzIGluLXBsYWNlLCBkZWZhdWx0IGlzIGBgRmFsc2VgYC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBuZGFycmF5CiAgICAgICAgVGhlIGJ5dGVzd2FwcGVkIGFycmF5LiBJZiBgaW5wbGFjZWAgaXMgYGBUcnVlYGAsIHRoaXMgaXMKICAgICAgICBhIHZpZXcgdG8gc2VsZi4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBBID0gbnAuYXJyYXkoWzEsIDI1NiwgODc1NV0sIGR0eXBlPW5wLmludDE2KQogICAgPj4+IG1hcChoZXgsIEEpCiAgICBbJzB4MScsICcweDEwMCcsICcweDIyMzMnXQogICAgPj4+IEEuYnl0ZXN3YXAoVHJ1ZSkKICAgIGFycmF5KFsgIDI1NiwgICAgIDEsIDEzMDkwXSwgZHR5cGU9aW50MTYpCiAgICA+Pj4gbWFwKGhleCwgQSkKICAgIFsnMHgxMDAnLCAnMHgxJywgJzB4MzMyMiddCgogICAgQXJyYXlzIG9mIHN0cmluZ3MgYXJlIG5vdCBzd2FwcGVkCgogICAgPj4+IEEgPSBucC5hcnJheShbJ2NlZycsICdmYWMnXSkKICAgID4+PiBBLmJ5dGVzd2FwKCkKICAgIGFycmF5KFsnY2VnJywgJ2ZhYyddLAogICAgICAgICAgZHR5cGU9J3xTMycpCgogICAgKQLaBmNob29zZXrzCiAgICBhLmNob29zZShjaG9pY2VzLCBvdXQ9Tm9uZSwgbW9kZT0ncmFpc2UnKQoKICAgIFVzZSBhbiBpbmRleCBhcnJheSB0byBjb25zdHJ1Y3QgYSBuZXcgYXJyYXkgZnJvbSBhIHNldCBvZiBjaG9pY2VzLgoKICAgIFJlZmVyIHRvIGBudW1weS5jaG9vc2VgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5jaG9vc2UgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaBGNsaXBhCAEAAAogICAgYS5jbGlwKG1pbj1Ob25lLCBtYXg9Tm9uZSwgb3V0PU5vbmUpCgogICAgUmV0dXJuIGFuIGFycmF5IHdob3NlIHZhbHVlcyBhcmUgbGltaXRlZCB0byBgYFttaW4sIG1heF1gYC4KICAgIE9uZSBvZiBtYXggb3IgbWluIG11c3QgYmUgZ2l2ZW4uCgogICAgUmVmZXIgdG8gYG51bXB5LmNsaXBgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5jbGlwIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2ghjb21wcmVzc3rsCiAgICBhLmNvbXByZXNzKGNvbmRpdGlvbiwgYXhpcz1Ob25lLCBvdXQ9Tm9uZSkKCiAgICBSZXR1cm4gc2VsZWN0ZWQgc2xpY2VzIG9mIHRoaXMgYXJyYXkgYWxvbmcgZ2l2ZW4gYXhpcy4KCiAgICBSZWZlciB0byBgbnVtcHkuY29tcHJlc3NgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5jb21wcmVzcyA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoEY29uanq1CiAgICBhLmNvbmooKQoKICAgIENvbXBsZXgtY29uanVnYXRlIGFsbCBlbGVtZW50cy4KCiAgICBSZWZlciB0byBgbnVtcHkuY29uanVnYXRlYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuY29uanVnYXRlIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2gljb25qdWdhdGV6xgogICAgYS5jb25qdWdhdGUoKQoKICAgIFJldHVybiB0aGUgY29tcGxleCBjb25qdWdhdGUsIGVsZW1lbnQtd2lzZS4KCiAgICBSZWZlciB0byBgbnVtcHkuY29uanVnYXRlYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuY29uanVnYXRlIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkCcgkAAABhRQMAAAogICAgYS5jb3B5KG9yZGVyPSdDJykKCiAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBvcmRlciA6IHsnQycsICdGJywgJ0EnLCAnSyd9LCBvcHRpb25hbAogICAgICAgIENvbnRyb2xzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSBjb3B5LiAnQycgbWVhbnMgQy1vcmRlciwKICAgICAgICAnRicgbWVhbnMgRi1vcmRlciwgJ0EnIG1lYW5zICdGJyBpZiBgYWAgaXMgRm9ydHJhbiBjb250aWd1b3VzLAogICAgICAgICdDJyBvdGhlcndpc2UuICdLJyBtZWFucyBtYXRjaCB0aGUgbGF5b3V0IG9mIGBhYCBhcyBjbG9zZWx5CiAgICAgICAgYXMgcG9zc2libGUuIChOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhbmQgOmZ1bmM6bnVtcHkuY29weSBhcmUgdmVyeQogICAgICAgIHNpbWlsYXIsIGJ1dCBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlaXIgb3JkZXI9CiAgICAgICAgYXJndW1lbnRzLikKCiAgICBTZWUgYWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmNvcHkKICAgIG51bXB5LmNvcHl0bwoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbWzEsMiwzXSxbNCw1LDZdXSwgb3JkZXI9J0YnKQoKICAgID4+PiB5ID0geC5jb3B5KCkKCiAgICA+Pj4geC5maWxsKDApCgogICAgPj4+IHgKICAgIGFycmF5KFtbMCwgMCwgMF0sCiAgICAgICAgICAgWzAsIDAsIDBdXSkKCiAgICA+Pj4geQogICAgYXJyYXkoW1sxLCAyLCAzXSwKICAgICAgICAgICBbNCwgNSwgNl1dKQoKICAgID4+PiB5LmZsYWdzWydDX0NPTlRJR1VPVVMnXQogICAgVHJ1ZQoKICAgICkC2gdjdW1wcm9kevcKICAgIGEuY3VtcHJvZChheGlzPU5vbmUsIGR0eXBlPU5vbmUsIG91dD1Ob25lKQoKICAgIFJldHVybiB0aGUgY3VtdWxhdGl2ZSBwcm9kdWN0IG9mIHRoZSBlbGVtZW50cyBhbG9uZyB0aGUgZ2l2ZW4gYXhpcy4KCiAgICBSZWZlciB0byBgbnVtcHkuY3VtcHJvZGAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmN1bXByb2QgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaBmN1bXN1bXrwCiAgICBhLmN1bXN1bShheGlzPU5vbmUsIGR0eXBlPU5vbmUsIG91dD1Ob25lKQoKICAgIFJldHVybiB0aGUgY3VtdWxhdGl2ZSBzdW0gb2YgdGhlIGVsZW1lbnRzIGFsb25nIHRoZSBnaXZlbiBheGlzLgoKICAgIFJlZmVyIHRvIGBudW1weS5jdW1zdW1gIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5jdW1zdW0gOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaCGRpYWdvbmFsYYABAAAKICAgIGEuZGlhZ29uYWwob2Zmc2V0PTAsIGF4aXMxPTAsIGF4aXMyPTEpCgogICAgUmV0dXJuIHNwZWNpZmllZCBkaWFnb25hbHMuIEluIE51bVB5IDEuOSB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgYQogICAgcmVhZC1vbmx5IHZpZXcgaW5zdGVhZCBvZiBhIGNvcHkgYXMgaW4gcHJldmlvdXMgTnVtUHkgdmVyc2lvbnMuICBJbgogICAgYSBmdXR1cmUgdmVyc2lvbiB0aGUgcmVhZC1vbmx5IHJlc3RyaWN0aW9uIHdpbGwgYmUgcmVtb3ZlZC4KCiAgICBSZWZlciB0byA6ZnVuYzpgbnVtcHkuZGlhZ29uYWxgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5kaWFnb25hbCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAnIWAAAAYbsBAAAKICAgIGEuZG90KGIsIG91dD1Ob25lKQoKICAgIERvdCBwcm9kdWN0IG9mIHR3byBhcnJheXMuCgogICAgUmVmZXIgdG8gYG51bXB5LmRvdGAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmRvdCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuZXllKDIpCiAgICA+Pj4gYiA9IG5wLm9uZXMoKDIsIDIpKSAqIDIKICAgID4+PiBhLmRvdChiKQogICAgYXJyYXkoW1sgMi4sICAyLl0sCiAgICAgICAgICAgWyAyLiwgIDIuXV0pCgogICAgVGhpcyBhcnJheSBtZXRob2QgY2FuIGJlIGNvbnZlbmllbnRseSBjaGFpbmVkOgoKICAgID4+PiBhLmRvdChiKS5kb3QoYikKICAgIGFycmF5KFtbIDguLCAgOC5dLAogICAgICAgICAgIFsgOC4sICA4Ll1dKQoKICAgICkC2gRkdW1wet1hLmR1bXAoZmlsZSkKCiAgICBEdW1wIGEgcGlja2xlIG9mIHRoZSBhcnJheSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgICBUaGUgYXJyYXkgY2FuIGJlIHJlYWQgYmFjayB3aXRoIHBpY2tsZS5sb2FkIG9yIG51bXB5LmxvYWQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgZmlsZSA6IHN0cgogICAgICAgIEEgc3RyaW5nIG5hbWluZyB0aGUgZHVtcCBmaWxlLgoKICAgICkC2gVkdW1wc3q4CiAgICBhLmR1bXBzKCkKCiAgICBSZXR1cm5zIHRoZSBwaWNrbGUgb2YgdGhlIGFycmF5IGFzIGEgc3RyaW5nLgogICAgcGlja2xlLmxvYWRzIG9yIG51bXB5LmxvYWRzIHdpbGwgY29udmVydCB0aGUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgTm9uZQoKICAgICkC2gRmaWxsYVwBAAAKICAgIGEuZmlsbCh2YWx1ZSkKCiAgICBGaWxsIHRoZSBhcnJheSB3aXRoIGEgc2NhbGFyIHZhbHVlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZhbHVlIDogc2NhbGFyCiAgICAgICAgQWxsIGVsZW1lbnRzIG9mIGBhYCB3aWxsIGJlIGFzc2lnbmVkIHRoaXMgdmFsdWUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsxLCAyXSkKICAgID4+PiBhLmZpbGwoMCkKICAgID4+PiBhCiAgICBhcnJheShbMCwgMF0pCiAgICA+Pj4gYSA9IG5wLmVtcHR5KDIpCiAgICA+Pj4gYS5maWxsKDEpCiAgICA+Pj4gYQogICAgYXJyYXkoWyAxLiwgIDEuXSkKCiAgICApAtoHZmxhdHRlbmGKAwAACiAgICBhLmZsYXR0ZW4ob3JkZXI9J0MnKQoKICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGFycmF5IGNvbGxhcHNlZCBpbnRvIG9uZSBkaW1lbnNpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgb3JkZXIgOiB7J0MnLCAnRicsICdBJywgJ0snfSwgb3B0aW9uYWwKICAgICAgICAnQycgbWVhbnMgdG8gZmxhdHRlbiBpbiByb3ctbWFqb3IgKEMtc3R5bGUpIG9yZGVyLgogICAgICAgICdGJyBtZWFucyB0byBmbGF0dGVuIGluIGNvbHVtbi1tYWpvciAoRm9ydHJhbi0KICAgICAgICBzdHlsZSkgb3JkZXIuICdBJyBtZWFucyB0byBmbGF0dGVuIGluIGNvbHVtbi1tYWpvcgogICAgICAgIG9yZGVyIGlmIGBhYCBpcyBGb3J0cmFuICpjb250aWd1b3VzKiBpbiBtZW1vcnksCiAgICAgICAgcm93LW1ham9yIG9yZGVyIG90aGVyd2lzZS4gJ0snIG1lYW5zIHRvIGZsYXR0ZW4KICAgICAgICBgYWAgaW4gdGhlIG9yZGVyIHRoZSBlbGVtZW50cyBvY2N1ciBpbiBtZW1vcnkuCiAgICAgICAgVGhlIGRlZmF1bHQgaXMgJ0MnLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHkgOiBuZGFycmF5CiAgICAgICAgQSBjb3B5IG9mIHRoZSBpbnB1dCBhcnJheSwgZmxhdHRlbmVkIHRvIG9uZSBkaW1lbnNpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICByYXZlbCA6IFJldHVybiBhIGZsYXR0ZW5lZCBhcnJheS4KICAgIGZsYXQgOiBBIDEtRCBmbGF0IGl0ZXJhdG9yIG92ZXIgdGhlIGFycmF5LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcnJheShbWzEsMl0sIFszLDRdXSkKICAgID4+PiBhLmZsYXR0ZW4oKQogICAgYXJyYXkoWzEsIDIsIDMsIDRdKQogICAgPj4+IGEuZmxhdHRlbignRicpCiAgICBhcnJheShbMSwgMywgMiwgNF0pCgogICAgKQLaCGdldGZpZWxkYa8EAAAKICAgIGEuZ2V0ZmllbGQoZHR5cGUsIG9mZnNldD0wKQoKICAgIFJldHVybnMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gYXJyYXkgYXMgYSBjZXJ0YWluIHR5cGUuCgogICAgQSBmaWVsZCBpcyBhIHZpZXcgb2YgdGhlIGFycmF5IGRhdGEgd2l0aCBhIGdpdmVuIGRhdGEtdHlwZS4gVGhlIHZhbHVlcyBpbgogICAgdGhlIHZpZXcgYXJlIGRldGVybWluZWQgYnkgdGhlIGdpdmVuIHR5cGUgYW5kIHRoZSBvZmZzZXQgaW50byB0aGUgY3VycmVudAogICAgYXJyYXkgaW4gYnl0ZXMuIFRoZSBvZmZzZXQgbmVlZHMgdG8gYmUgc3VjaCB0aGF0IHRoZSB2aWV3IGR0eXBlIGZpdHMgaW4gdGhlCiAgICBhcnJheSBkdHlwZTsgZm9yIGV4YW1wbGUgYW4gYXJyYXkgb2YgZHR5cGUgY29tcGxleDEyOCBoYXMgMTYtYnl0ZSBlbGVtZW50cy4KICAgIElmIHRha2luZyBhIHZpZXcgd2l0aCBhIDMyLWJpdCBpbnRlZ2VyICg0IGJ5dGVzKSwgdGhlIG9mZnNldCBuZWVkcyB0byBiZQogICAgYmV0d2VlbiAwIGFuZCAxMiBieXRlcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBkdHlwZSA6IHN0ciBvciBkdHlwZQogICAgICAgIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZpZXcuIFRoZSBkdHlwZSBzaXplIG9mIHRoZSB2aWV3IGNhbiBub3QgYmUgbGFyZ2VyCiAgICAgICAgdGhhbiB0aGF0IG9mIHRoZSBhcnJheSBpdHNlbGYuCiAgICBvZmZzZXQgOiBpbnQKICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgYmVnaW5uaW5nIHRoZSBlbGVtZW50IHZpZXcuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmRpYWcoWzEuKzEual0qMikKICAgID4+PiB4WzEsIDFdID0gMiArIDQuagogICAgPj4+IHgKICAgIGFycmF5KFtbIDEuKzEuaiwgIDAuKzAual0sCiAgICAgICAgICAgWyAwLiswLmosICAyLis0LmpdXSkKICAgID4+PiB4LmdldGZpZWxkKG5wLmZsb2F0NjQpCiAgICBhcnJheShbWyAxLiwgIDAuXSwKICAgICAgICAgICBbIDAuLCAgMi5dXSkKCiAgICBCeSBjaG9vc2luZyBhbiBvZmZzZXQgb2YgOCBieXRlcyB3ZSBjYW4gc2VsZWN0IHRoZSBjb21wbGV4IHBhcnQgb2YgdGhlCiAgICBhcnJheSBmb3Igb3VyIHZpZXc6CgogICAgPj4+IHguZ2V0ZmllbGQobnAuZmxvYXQ2NCwgb2Zmc2V0PTgpCiAgICBhcnJheShbWyAxLiwgIDAuXSwKICAgICAgIFsgMC4sICA0Ll1dKQoKICAgICkC2gRpdGVtYYkGAAAKICAgIGEuaXRlbSgqYXJncykKCiAgICBDb3B5IGFuIGVsZW1lbnQgb2YgYW4gYXJyYXkgdG8gYSBzdGFuZGFyZCBQeXRob24gc2NhbGFyIGFuZCByZXR1cm4gaXQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgXCphcmdzIDogQXJndW1lbnRzICh2YXJpYWJsZSBudW1iZXIgYW5kIHR5cGUpCgogICAgICAgICogbm9uZTogaW4gdGhpcyBjYXNlLCB0aGUgbWV0aG9kIG9ubHkgd29ya3MgZm9yIGFycmF5cwogICAgICAgICAgd2l0aCBvbmUgZWxlbWVudCAoYGEuc2l6ZSA9PSAxYCksIHdoaWNoIGVsZW1lbnQgaXMKICAgICAgICAgIGNvcGllZCBpbnRvIGEgc3RhbmRhcmQgUHl0aG9uIHNjYWxhciBvYmplY3QgYW5kIHJldHVybmVkLgoKICAgICAgICAqIGludF90eXBlOiB0aGlzIGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzIGEgZmxhdCBpbmRleCBpbnRvCiAgICAgICAgICB0aGUgYXJyYXksIHNwZWNpZnlpbmcgd2hpY2ggZWxlbWVudCB0byBjb3B5IGFuZCByZXR1cm4uCgogICAgICAgICogdHVwbGUgb2YgaW50X3R5cGVzOiBmdW5jdGlvbnMgYXMgZG9lcyBhIHNpbmdsZSBpbnRfdHlwZSBhcmd1bWVudCwKICAgICAgICAgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudCBpcyBpbnRlcnByZXRlZCBhcyBhbiBuZC1pbmRleCBpbnRvIHRoZQogICAgICAgICAgYXJyYXkuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgeiA6IFN0YW5kYXJkIFB5dGhvbiBzY2FsYXIgb2JqZWN0CiAgICAgICAgQSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBvZiB0aGUgYXJyYXkgYXMgYSBzdWl0YWJsZQogICAgICAgIFB5dGhvbiBzY2FsYXIKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFdoZW4gdGhlIGRhdGEgdHlwZSBvZiBgYWAgaXMgbG9uZ2RvdWJsZSBvciBjbG9uZ2RvdWJsZSwgaXRlbSgpIHJldHVybnMKICAgIGEgc2NhbGFyIGFycmF5IG9iamVjdCBiZWNhdXNlIHRoZXJlIGlzIG5vIGF2YWlsYWJsZSBQeXRob24gc2NhbGFyIHRoYXQKICAgIHdvdWxkIG5vdCBsb3NlIGluZm9ybWF0aW9uLiBWb2lkIGFycmF5cyByZXR1cm4gYSBidWZmZXIgb2JqZWN0IGZvciBpdGVtKCksCiAgICB1bmxlc3MgZmllbGRzIGFyZSBkZWZpbmVkLCBpbiB3aGljaCBjYXNlIGEgdHVwbGUgaXMgcmV0dXJuZWQuCgogICAgYGl0ZW1gIGlzIHZlcnkgc2ltaWxhciB0byBhW2FyZ3NdLCBleGNlcHQsIGluc3RlYWQgb2YgYW4gYXJyYXkgc2NhbGFyLAogICAgYSBzdGFuZGFyZCBQeXRob24gc2NhbGFyIGlzIHJldHVybmVkLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHNwZWVkaW5nIHVwCiAgICBhY2Nlc3MgdG8gZWxlbWVudHMgb2YgdGhlIGFycmF5IGFuZCBkb2luZyBhcml0aG1ldGljIG9uIGVsZW1lbnRzIG9mIHRoZQogICAgYXJyYXkgdXNpbmcgUHl0aG9uJ3Mgb3B0aW1pemVkIG1hdGguCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLnJhbmRvbS5yYW5kaW50KDksIHNpemU9KDMsIDMpKQogICAgPj4+IHgKICAgIGFycmF5KFtbMywgMSwgN10sCiAgICAgICAgICAgWzIsIDgsIDNdLAogICAgICAgICAgIFs4LCA1LCAzXV0pCiAgICA+Pj4geC5pdGVtKDMpCiAgICAyCiAgICA+Pj4geC5pdGVtKDcpCiAgICA1CiAgICA+Pj4geC5pdGVtKCgwLCAxKSkKICAgIDEKICAgID4+PiB4Lml0ZW0oKDIsIDIpKQogICAgMwoKICAgICkC2gdpdGVtc2V0YaMFAAAKICAgIGEuaXRlbXNldCgqYXJncykKCiAgICBJbnNlcnQgc2NhbGFyIGludG8gYW4gYXJyYXkgKHNjYWxhciBpcyBjYXN0IHRvIGFycmF5J3MgZHR5cGUsIGlmIHBvc3NpYmxlKQoKICAgIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgMSBhcmd1bWVudCwgYW5kIGRlZmluZSB0aGUgbGFzdCBhcmd1bWVudAogICAgYXMgKml0ZW0qLiAgVGhlbiwgYGBhLml0ZW1zZXQoKmFyZ3MpYGAgaXMgZXF1aXZhbGVudCB0byBidXQgZmFzdGVyCiAgICB0aGFuIGBgYVthcmdzXSA9IGl0ZW1gYC4gIFRoZSBpdGVtIHNob3VsZCBiZSBhIHNjYWxhciB2YWx1ZSBhbmQgYGFyZ3NgCiAgICBtdXN0IHNlbGVjdCBhIHNpbmdsZSBpdGVtIGluIHRoZSBhcnJheSBgYWAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgXCphcmdzIDogQXJndW1lbnRzCiAgICAgICAgSWYgb25lIGFyZ3VtZW50OiBhIHNjYWxhciwgb25seSB1c2VkIGluIGNhc2UgYGFgIGlzIG9mIHNpemUgMS4KICAgICAgICBJZiB0d28gYXJndW1lbnRzOiB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgdmFsdWUgdG8gYmUgc2V0CiAgICAgICAgYW5kIG11c3QgYmUgYSBzY2FsYXIsIHRoZSBmaXJzdCBhcmd1bWVudCBzcGVjaWZpZXMgYSBzaW5nbGUgYXJyYXkKICAgICAgICBlbGVtZW50IGxvY2F0aW9uLiBJdCBpcyBlaXRoZXIgYW4gaW50IG9yIGEgdHVwbGUuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBDb21wYXJlZCB0byBpbmRleGluZyBzeW50YXgsIGBpdGVtc2V0YCBwcm92aWRlcyBzb21lIHNwZWVkIGluY3JlYXNlCiAgICBmb3IgcGxhY2luZyBhIHNjYWxhciBpbnRvIGEgcGFydGljdWxhciBsb2NhdGlvbiBpbiBhbiBgbmRhcnJheWAsCiAgICBpZiB5b3UgbXVzdCBkbyB0aGlzLiAgSG93ZXZlciwgZ2VuZXJhbGx5IHRoaXMgaXMgZGlzY291cmFnZWQ6CiAgICBhbW9uZyBvdGhlciBwcm9ibGVtcywgaXQgY29tcGxpY2F0ZXMgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGNvZGUuCiAgICBBbHNvLCB3aGVuIHVzaW5nIGBpdGVtc2V0YCAoYW5kIGBpdGVtYCkgaW5zaWRlIGEgbG9vcCwgYmUgc3VyZQogICAgdG8gYXNzaWduIHRoZSBtZXRob2RzIHRvIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQgdGhlIGF0dHJpYnV0ZQogICAgbG9vay11cCBhdCBlYWNoIGxvb3AgaXRlcmF0aW9uLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5yYW5kb20ucmFuZGludCg5LCBzaXplPSgzLCAzKSkKICAgID4+PiB4CiAgICBhcnJheShbWzMsIDEsIDddLAogICAgICAgICAgIFsyLCA4LCAzXSwKICAgICAgICAgICBbOCwgNSwgM11dKQogICAgPj4+IHguaXRlbXNldCg0LCAwKQogICAgPj4+IHguaXRlbXNldCgoMiwgMiksIDkpCiAgICA+Pj4geAogICAgYXJyYXkoW1szLCAxLCA3XSwKICAgICAgICAgICBbMiwgMCwgM10sCiAgICAgICAgICAgWzgsIDUsIDldXSkKCiAgICApAtoDbWF4esQKICAgIGEubWF4KGF4aXM9Tm9uZSwgb3V0PU5vbmUpCgogICAgUmV0dXJuIHRoZSBtYXhpbXVtIGFsb25nIGEgZ2l2ZW4gYXhpcy4KCiAgICBSZWZlciB0byBgbnVtcHkuYW1heGAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmFtYXggOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaBG1lYW569gogICAgYS5tZWFuKGF4aXM9Tm9uZSwgZHR5cGU9Tm9uZSwgb3V0PU5vbmUsIGtlZXBkaW1zPUZhbHNlKQoKICAgIFJldHVybnMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGFycmF5IGVsZW1lbnRzIGFsb25nIGdpdmVuIGF4aXMuCgogICAgUmVmZXIgdG8gYG51bXB5Lm1lYW5gIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5tZWFuIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2gNtaW561AogICAgYS5taW4oYXhpcz1Ob25lLCBvdXQ9Tm9uZSwga2VlcGRpbXM9RmFsc2UpCgogICAgUmV0dXJuIHRoZSBtaW5pbXVtIGFsb25nIGEgZ2l2ZW4gYXhpcy4KCiAgICBSZWZlciB0byBgbnVtcHkuYW1pbmAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmFtaW4gOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgWg1zaGFyZXNfbWVtb3J5YYoDAAAKICAgIHNoYXJlc19tZW1vcnkoYSwgYiwgbWF4X3dvcms9Tm9uZSkKCiAgICBEZXRlcm1pbmUgaWYgdHdvIGFycmF5cyBzaGFyZSBtZW1vcnkKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhLCBiIDogbmRhcnJheQogICAgICAgIElucHV0IGFycmF5cwogICAgbWF4X3dvcmsgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgRWZmb3J0IHRvIHNwZW5kIG9uIHNvbHZpbmcgdGhlIG92ZXJsYXAgcHJvYmxlbSAobWF4aW11bSBudW1iZXIKICAgICAgICBvZiBjYW5kaWRhdGUgc29sdXRpb25zIHRvIGNvbnNpZGVyKS4gVGhlIGZvbGxvd2luZyBzcGVjaWFsCiAgICAgICAgdmFsdWVzIGFyZSByZWNvZ25pemVkOgoKICAgICAgICBtYXhfd29yaz1NQVlfU0hBUkVfRVhBQ1QgIChkZWZhdWx0KQogICAgICAgICAgICBUaGUgcHJvYmxlbSBpcyBzb2x2ZWQgZXhhY3RseS4gSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucwogICAgICAgICAgICBUcnVlIG9ubHkgaWYgdGhlcmUgaXMgYW4gZWxlbWVudCBzaGFyZWQgYmV0d2VlbiB0aGUgYXJyYXlzLgogICAgICAgIG1heF93b3JrPU1BWV9TSEFSRV9CT1VORFMKICAgICAgICAgICAgT25seSB0aGUgbWVtb3J5IGJvdW5kcyBvZiBhIGFuZCBiIGFyZSBjaGVja2VkLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBudW1weS5Ub29IYXJkRXJyb3IKICAgICAgICBFeGNlZWRlZCBtYXhfd29yay4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBib29sCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBtYXlfc2hhcmVfbWVtb3J5CgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAubWF5X3NoYXJlX21lbW9yeShucC5hcnJheShbMSwyXSksIG5wLmFycmF5KFs1LDgsOV0pKQogICAgRmFsc2UKCiAgICBaEG1heV9zaGFyZV9tZW1vcnlhMQMAAAogICAgbWF5X3NoYXJlX21lbW9yeShhLCBiLCBtYXhfd29yaz1Ob25lKQoKICAgIERldGVybWluZSBpZiB0d28gYXJyYXlzIG1pZ2h0IHNoYXJlIG1lbW9yeQoKICAgIEEgcmV0dXJuIG9mIFRydWUgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSB0d28gYXJyYXlzCiAgICBzaGFyZSBhbnkgZWxlbWVudC4gIEl0IGp1c3QgbWVhbnMgdGhhdCB0aGV5ICptaWdodCouCgogICAgT25seSB0aGUgbWVtb3J5IGJvdW5kcyBvZiBhIGFuZCBiIGFyZSBjaGVja2VkIGJ5IGRlZmF1bHQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSwgYiA6IG5kYXJyYXkKICAgICAgICBJbnB1dCBhcnJheXMKICAgIG1heF93b3JrIDogaW50LCBvcHRpb25hbAogICAgICAgIEVmZm9ydCB0byBzcGVuZCBvbiBzb2x2aW5nIHRoZSBvdmVybGFwIHByb2JsZW0uICBTZWUKICAgICAgICBgc2hhcmVzX21lbW9yeWAgZm9yIGRldGFpbHMuICBEZWZhdWx0IGZvciBgYG1heV9zaGFyZV9tZW1vcnlgYAogICAgICAgIGlzIHRvIGRvIGEgYm91bmRzIGNoZWNrLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGJvb2wKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHNoYXJlc19tZW1vcnkKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5tYXlfc2hhcmVfbWVtb3J5KG5wLmFycmF5KFsxLDJdKSwgbnAuYXJyYXkoWzUsOCw5XSkpCiAgICBGYWxzZQogICAgPj4+IHggPSBucC56ZXJvcyhbMywgNF0pCiAgICA+Pj4gbnAubWF5X3NoYXJlX21lbW9yeSh4WzosMF0sIHhbOiwxXSkKICAgIFRydWUKCiAgICApAtoMbmV3Ynl0ZW9yZGVyYU8EAAAKICAgIGFyci5uZXdieXRlb3JkZXIobmV3X29yZGVyPSdTJykKCiAgICBSZXR1cm4gdGhlIGFycmF5IHdpdGggdGhlIHNhbWUgZGF0YSB2aWV3ZWQgd2l0aCBhIGRpZmZlcmVudCBieXRlIG9yZGVyLgoKICAgIEVxdWl2YWxlbnQgdG86OgoKICAgICAgICBhcnIudmlldyhhcnIuZHR5cGUubmV3Ynl0b3JkZXIobmV3X29yZGVyKSkKCiAgICBDaGFuZ2VzIGFyZSBhbHNvIG1hZGUgaW4gYWxsIGZpZWxkcyBhbmQgc3ViLWFycmF5cyBvZiB0aGUgYXJyYXkgZGF0YQogICAgdHlwZS4KCgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG5ld19vcmRlciA6IHN0cmluZywgb3B0aW9uYWwKICAgICAgICBCeXRlIG9yZGVyIHRvIGZvcmNlOyBhIHZhbHVlIGZyb20gdGhlIGJ5dGUgb3JkZXIgc3BlY2lmaWNhdGlvbnMKICAgICAgICBiZWxvdy4gYG5ld19vcmRlcmAgY29kZXMgY2FuIGJlIGFueSBvZjoKCiAgICAgICAgKiAnUycgLSBzd2FwIGR0eXBlIGZyb20gY3VycmVudCB0byBvcHBvc2l0ZSBlbmRpYW4KICAgICAgICAqIHsnPCcsICdMJ30gLSBsaXR0bGUgZW5kaWFuCiAgICAgICAgKiB7Jz4nLCAnQid9IC0gYmlnIGVuZGlhbgogICAgICAgICogeyc9JywgJ04nfSAtIG5hdGl2ZSBvcmRlcgogICAgICAgICogeyd8JywgJ0knfSAtIGlnbm9yZSAobm8gY2hhbmdlIHRvIGJ5dGUgb3JkZXIpCgogICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlICgnUycpIHJlc3VsdHMgaW4gc3dhcHBpbmcgdGhlIGN1cnJlbnQKICAgICAgICBieXRlIG9yZGVyLiBUaGUgY29kZSBkb2VzIGEgY2FzZS1pbnNlbnNpdGl2ZSBjaGVjayBvbiB0aGUgZmlyc3QKICAgICAgICBsZXR0ZXIgb2YgYG5ld19vcmRlcmAgZm9yIHRoZSBhbHRlcm5hdGl2ZXMgYWJvdmUuICBGb3IgZXhhbXBsZSwKICAgICAgICBhbnkgb2YgJ0InIG9yICdiJyBvciAnYmlnZ2lzaCcgYXJlIHZhbGlkIHRvIHNwZWNpZnkgYmlnLWVuZGlhbi4KCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgbmV3X2FyciA6IGFycmF5CiAgICAgICAgTmV3IGFycmF5IG9iamVjdCB3aXRoIHRoZSBkdHlwZSByZWZsZWN0aW5nIGdpdmVuIGNoYW5nZSB0byB0aGUKICAgICAgICBieXRlIG9yZGVyLgoKICAgICkC2gdub256ZXJvesoKICAgIGEubm9uemVybygpCgogICAgUmV0dXJuIHRoZSBpbmRpY2VzIG9mIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBub24temVyby4KCiAgICBSZWZlciB0byBgbnVtcHkubm9uemVyb2AgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5Lm5vbnplcm8gOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaBHByb2R69wogICAgYS5wcm9kKGF4aXM9Tm9uZSwgZHR5cGU9Tm9uZSwgb3V0PU5vbmUsIGtlZXBkaW1zPUZhbHNlKQoKICAgIFJldHVybiB0aGUgcHJvZHVjdCBvZiB0aGUgYXJyYXkgZWxlbWVudHMgb3ZlciB0aGUgZ2l2ZW4gYXhpcwoKICAgIFJlZmVyIHRvIGBudW1weS5wcm9kYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkucHJvZCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoDcHRwetYKICAgIGEucHRwKGF4aXM9Tm9uZSwgb3V0PU5vbmUpCgogICAgUGVhayB0byBwZWFrIChtYXhpbXVtIC0gbWluaW11bSkgdmFsdWUgYWxvbmcgYSBnaXZlbiBheGlzLgoKICAgIFJlZmVyIHRvIGBudW1weS5wdHBgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5wdHAgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaA3B1dHrbCiAgICBhLnB1dChpbmRpY2VzLCB2YWx1ZXMsIG1vZGU9J3JhaXNlJykKCiAgICBTZXQgYGBhLmZsYXRbbl0gPSB2YWx1ZXNbbl1gYCBmb3IgYWxsIGBuYCBpbiBpbmRpY2VzLgoKICAgIFJlZmVyIHRvIGBudW1weS5wdXRgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5wdXQgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgWgZjb3B5dG9hrwQAAAogICAgY29weXRvKGRzdCwgc3JjLCBjYXN0aW5nPSdzYW1lX2tpbmQnLCB3aGVyZT1Ob25lKQoKICAgIENvcGllcyB2YWx1ZXMgZnJvbSBvbmUgYXJyYXkgdG8gYW5vdGhlciwgYnJvYWRjYXN0aW5nIGFzIG5lY2Vzc2FyeS4KCiAgICBSYWlzZXMgYSBUeXBlRXJyb3IgaWYgdGhlIGBjYXN0aW5nYCBydWxlIGlzIHZpb2xhdGVkLCBhbmQgaWYKICAgIGB3aGVyZWAgaXMgcHJvdmlkZWQsIGl0IHNlbGVjdHMgd2hpY2ggZWxlbWVudHMgdG8gY29weS4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGRzdCA6IG5kYXJyYXkKICAgICAgICBUaGUgYXJyYXkgaW50byB3aGljaCB2YWx1ZXMgYXJlIGNvcGllZC4KICAgIHNyYyA6IGFycmF5X2xpa2UKICAgICAgICBUaGUgYXJyYXkgZnJvbSB3aGljaCB2YWx1ZXMgYXJlIGNvcGllZC4KICAgIGNhc3RpbmcgOiB7J25vJywgJ2VxdWl2JywgJ3NhZmUnLCAnc2FtZV9raW5kJywgJ3Vuc2FmZSd9LCBvcHRpb25hbAogICAgICAgIENvbnRyb2xzIHdoYXQga2luZCBvZiBkYXRhIGNhc3RpbmcgbWF5IG9jY3VyIHdoZW4gY29weWluZy4KCiAgICAgICAgICAqICdubycgbWVhbnMgdGhlIGRhdGEgdHlwZXMgc2hvdWxkIG5vdCBiZSBjYXN0IGF0IGFsbC4KICAgICAgICAgICogJ2VxdWl2JyBtZWFucyBvbmx5IGJ5dGUtb3JkZXIgY2hhbmdlcyBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3NhZmUnIG1lYW5zIG9ubHkgY2FzdHMgd2hpY2ggY2FuIHByZXNlcnZlIHZhbHVlcyBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3NhbWVfa2luZCcgbWVhbnMgb25seSBzYWZlIGNhc3RzIG9yIGNhc3RzIHdpdGhpbiBhIGtpbmQsCiAgICAgICAgICAgIGxpa2UgZmxvYXQ2NCB0byBmbG9hdDMyLCBhcmUgYWxsb3dlZC4KICAgICAgICAgICogJ3Vuc2FmZScgbWVhbnMgYW55IGRhdGEgY29udmVyc2lvbnMgbWF5IGJlIGRvbmUuCiAgICB3aGVyZSA6IGFycmF5X2xpa2Ugb2YgYm9vbCwgb3B0aW9uYWwKICAgICAgICBBIGJvb2xlYW4gYXJyYXkgd2hpY2ggaXMgYnJvYWRjYXN0ZWQgdG8gbWF0Y2ggdGhlIGRpbWVuc2lvbnMKICAgICAgICBvZiBgZHN0YCwgYW5kIHNlbGVjdHMgZWxlbWVudHMgdG8gY29weSBmcm9tIGBzcmNgIHRvIGBkc3RgCiAgICAgICAgd2hlcmV2ZXIgaXQgY29udGFpbnMgdGhlIHZhbHVlIFRydWUuCgogICAgWgdwdXRtYXNrYegDAAAKICAgIHB1dG1hc2soYSwgbWFzaywgdmFsdWVzKQoKICAgIENoYW5nZXMgZWxlbWVudHMgb2YgYW4gYXJyYXkgYmFzZWQgb24gY29uZGl0aW9uYWwgYW5kIGlucHV0IHZhbHVlcy4KCiAgICBTZXRzIGBgYS5mbGF0W25dID0gdmFsdWVzW25dYGAgZm9yIGVhY2ggbiB3aGVyZSBgYG1hc2suZmxhdFtuXT09VHJ1ZWBgLgoKICAgIElmIGB2YWx1ZXNgIGlzIG5vdCB0aGUgc2FtZSBzaXplIGFzIGBhYCBhbmQgYG1hc2tgIHRoZW4gaXQgd2lsbCByZXBlYXQuCiAgICBUaGlzIGdpdmVzIGJlaGF2aW9yIGRpZmZlcmVudCBmcm9tIGBgYVttYXNrXSA9IHZhbHVlc2BgLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgVGFyZ2V0IGFycmF5LgogICAgbWFzayA6IGFycmF5X2xpa2UKICAgICAgICBCb29sZWFuIG1hc2sgYXJyYXkuIEl0IGhhcyB0byBiZSB0aGUgc2FtZSBzaGFwZSBhcyBgYWAuCiAgICB2YWx1ZXMgOiBhcnJheV9saWtlCiAgICAgICAgVmFsdWVzIHRvIHB1dCBpbnRvIGBhYCB3aGVyZSBgbWFza2AgaXMgVHJ1ZS4gSWYgYHZhbHVlc2AgaXMgc21hbGxlcgogICAgICAgIHRoYW4gYGFgIGl0IHdpbGwgYmUgcmVwZWF0ZWQuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBwbGFjZSwgcHV0LCB0YWtlLCBjb3B5dG8KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJhbmdlKDYpLnJlc2hhcGUoMiwgMykKICAgID4+PiBucC5wdXRtYXNrKHgsIHg+MiwgeCoqMikKICAgID4+PiB4CiAgICBhcnJheShbWyAwLCAgMSwgIDJdLAogICAgICAgICAgIFsgOSwgMTYsIDI1XV0pCgogICAgSWYgYHZhbHVlc2AgaXMgc21hbGxlciB0aGFuIGBhYCBpdCBpcyByZXBlYXRlZDoKCiAgICA+Pj4geCA9IG5wLmFyYW5nZSg1KQogICAgPj4+IG5wLnB1dG1hc2soeCwgeD4xLCBbLTMzLCAtNDRdKQogICAgPj4+IHgKICAgIGFycmF5KFsgIDAsICAgMSwgLTMzLCAtNDQsIC0zM10pCgogICAgKQLaBXJhdmVseuEKICAgIGEucmF2ZWwoW29yZGVyXSkKCiAgICBSZXR1cm4gYSBmbGF0dGVuZWQgYXJyYXkuCgogICAgUmVmZXIgdG8gYG51bXB5LnJhdmVsYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkucmF2ZWwgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgbmRhcnJheS5mbGF0IDogYSBmbGF0IGl0ZXJhdG9yIG9uIHRoZSBhcnJheS4KCiAgICApAtoGcmVwZWF0esAKICAgIGEucmVwZWF0KHJlcGVhdHMsIGF4aXM9Tm9uZSkKCiAgICBSZXBlYXQgZWxlbWVudHMgb2YgYW4gYXJyYXkuCgogICAgUmVmZXIgdG8gYG51bXB5LnJlcGVhdGAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnJlcGVhdCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoHcmVzaGFwZXrgCiAgICBhLnJlc2hhcGUoc2hhcGUsIG9yZGVyPSdDJykKCiAgICBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNhbWUgZGF0YSB3aXRoIGEgbmV3IHNoYXBlLgoKICAgIFJlZmVyIHRvIGBudW1weS5yZXNoYXBlYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkucmVzaGFwZSA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoGcmVzaXplYToJAAAKICAgIGEucmVzaXplKG5ld19zaGFwZSwgcmVmY2hlY2s9VHJ1ZSkKCiAgICBDaGFuZ2Ugc2hhcGUgYW5kIHNpemUgb2YgYXJyYXkgaW4tcGxhY2UuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgbmV3X3NoYXBlIDogdHVwbGUgb2YgaW50cywgb3IgYG5gIGludHMKICAgICAgICBTaGFwZSBvZiByZXNpemVkIGFycmF5LgogICAgcmVmY2hlY2sgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIEZhbHNlLCByZWZlcmVuY2UgY291bnQgd2lsbCBub3QgYmUgY2hlY2tlZC4gRGVmYXVsdCBpcyBUcnVlLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIE5vbmUKCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIGBhYCBkb2VzIG5vdCBvd24gaXRzIG93biBkYXRhIG9yIHJlZmVyZW5jZXMgb3Igdmlld3MgdG8gaXQgZXhpc3QsCiAgICAgICAgYW5kIHRoZSBkYXRhIG1lbW9yeSBtdXN0IGJlIGNoYW5nZWQuCiAgICAgICAgUHlQeSBvbmx5OiB3aWxsIGFsd2F5cyByYWlzZSBpZiB0aGUgZGF0YSBtZW1vcnkgbXVzdCBiZSBjaGFuZ2VkLCBzaW5jZQogICAgICAgIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBkZXRlcm1pbmUgaWYgcmVmZXJlbmNlcyBvciB2aWV3cyB0byBpdAogICAgICAgIGV4aXN0LgoKICAgIFN5c3RlbUVycm9yCiAgICAgICAgSWYgdGhlIGBvcmRlcmAga2V5d29yZCBhcmd1bWVudCBpcyBzcGVjaWZpZWQuIFRoaXMgYmVoYXZpb3VyIGlzIGEKICAgICAgICBidWcgaW4gTnVtUHkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICByZXNpemUgOiBSZXR1cm4gYSBuZXcgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHNoYXBlLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhpcyByZWFsbG9jYXRlcyBzcGFjZSBmb3IgdGhlIGRhdGEgYXJlYSBpZiBuZWNlc3NhcnkuCgogICAgT25seSBjb250aWd1b3VzIGFycmF5cyAoZGF0YSBlbGVtZW50cyBjb25zZWN1dGl2ZSBpbiBtZW1vcnkpIGNhbiBiZQogICAgcmVzaXplZC4KCiAgICBUaGUgcHVycG9zZSBvZiB0aGUgcmVmZXJlbmNlIGNvdW50IGNoZWNrIGlzIHRvIG1ha2Ugc3VyZSB5b3UKICAgIGRvIG5vdCB1c2UgdGhpcyBhcnJheSBhcyBhIGJ1ZmZlciBmb3IgYW5vdGhlciBQeXRob24gb2JqZWN0IGFuZCB0aGVuCiAgICByZWFsbG9jYXRlIHRoZSBtZW1vcnkuIEhvd2V2ZXIsIHJlZmVyZW5jZSBjb3VudHMgY2FuIGluY3JlYXNlIGluCiAgICBvdGhlciB3YXlzIHNvIGlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdSBoYXZlIG5vdCBzaGFyZWQgdGhlIG1lbW9yeQogICAgZm9yIHRoaXMgYXJyYXkgd2l0aCBhbm90aGVyIFB5dGhvbiBvYmplY3QsIHRoZW4geW91IG1heSBzYWZlbHkgc2V0CiAgICBgcmVmY2hlY2tgIHRvIEZhbHNlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgU2hyaW5raW5nIGFuIGFycmF5OiBhcnJheSBpcyBmbGF0dGVuZWQgKGluIHRoZSBvcmRlciB0aGF0IHRoZSBkYXRhIGFyZQogICAgc3RvcmVkIGluIG1lbW9yeSksIHJlc2l6ZWQsIGFuZCByZXNoYXBlZDoKCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMCwgMV0sIFsyLCAzXV0sIG9yZGVyPSdDJykKICAgID4+PiBhLnJlc2l6ZSgoMiwgMSkpCiAgICA+Pj4gYQogICAgYXJyYXkoW1swXSwKICAgICAgICAgICBbMV1dKQoKICAgID4+PiBhID0gbnAuYXJyYXkoW1swLCAxXSwgWzIsIDNdXSwgb3JkZXI9J0YnKQogICAgPj4+IGEucmVzaXplKCgyLCAxKSkKICAgID4+PiBhCiAgICBhcnJheShbWzBdLAogICAgICAgICAgIFsyXV0pCgogICAgRW5sYXJnaW5nIGFuIGFycmF5OiBhcyBhYm92ZSwgYnV0IG1pc3NpbmcgZW50cmllcyBhcmUgZmlsbGVkIHdpdGggemVyb3M6CgogICAgPj4+IGIgPSBucC5hcnJheShbWzAsIDFdLCBbMiwgM11dKQogICAgPj4+IGIucmVzaXplKDIsIDMpICMgbmV3X3NoYXBlIHBhcmFtZXRlciBkb2Vzbid0IGhhdmUgdG8gYmUgYSB0dXBsZQogICAgPj4+IGIKICAgIGFycmF5KFtbMCwgMSwgMl0sCiAgICAgICAgICAgWzMsIDAsIDBdXSkKCiAgICBSZWZlcmVuY2luZyBhbiBhcnJheSBwcmV2ZW50cyByZXNpemluZy4uLgoKICAgID4+PiBjID0gYQogICAgPj4+IGEucmVzaXplKCgxLCAxKSkKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgIC4uLgogICAgVmFsdWVFcnJvcjogY2Fubm90IHJlc2l6ZSBhbiBhcnJheSB0aGF0IGhhcyBiZWVuIHJlZmVyZW5jZWQgLi4uCgogICAgVW5sZXNzIGByZWZjaGVja2AgaXMgRmFsc2U6CgogICAgPj4+IGEucmVzaXplKCgxLCAxKSwgcmVmY2hlY2s9RmFsc2UpCiAgICA+Pj4gYQogICAgYXJyYXkoW1swXV0pCiAgICA+Pj4gYwogICAgYXJyYXkoW1swXV0pCgogICAgKQLaBXJvdW5keuoKICAgIGEucm91bmQoZGVjaW1hbHM9MCwgb3V0PU5vbmUpCgogICAgUmV0dXJuIGBhYCB3aXRoIGVhY2ggZWxlbWVudCByb3VuZGVkIHRvIHRoZSBnaXZlbiBudW1iZXIgb2YgZGVjaW1hbHMuCgogICAgUmVmZXIgdG8gYG51bXB5LmFyb3VuZGAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmFyb3VuZCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoMc2VhcmNoc29ydGVkYQUBAAAKICAgIGEuc2VhcmNoc29ydGVkKHYsIHNpZGU9J2xlZnQnLCBzb3J0ZXI9Tm9uZSkKCiAgICBGaW5kIGluZGljZXMgd2hlcmUgZWxlbWVudHMgb2YgdiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW4gYSB0byBtYWludGFpbiBvcmRlci4KCiAgICBGb3IgZnVsbCBkb2N1bWVudGF0aW9uLCBzZWUgYG51bXB5LnNlYXJjaHNvcnRlZGAKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnNlYXJjaHNvcnRlZCA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoIc2V0ZmllbGRhtAQAAAogICAgYS5zZXRmaWVsZCh2YWwsIGR0eXBlLCBvZmZzZXQ9MCkKCiAgICBQdXQgYSB2YWx1ZSBpbnRvIGEgc3BlY2lmaWVkIHBsYWNlIGluIGEgZmllbGQgZGVmaW5lZCBieSBhIGRhdGEtdHlwZS4KCiAgICBQbGFjZSBgdmFsYCBpbnRvIGBhYCdzIGZpZWxkIGRlZmluZWQgYnkgYGR0eXBlYCBhbmQgYmVnaW5uaW5nIGBvZmZzZXRgCiAgICBieXRlcyBpbnRvIHRoZSBmaWVsZC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB2YWwgOiBvYmplY3QKICAgICAgICBWYWx1ZSB0byBiZSBwbGFjZWQgaW4gZmllbGQuCiAgICBkdHlwZSA6IGR0eXBlIG9iamVjdAogICAgICAgIERhdGEtdHlwZSBvZiB0aGUgZmllbGQgaW4gd2hpY2ggdG8gcGxhY2UgYHZhbGAuCiAgICBvZmZzZXQgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBmaWVsZCBhdCB3aGljaCB0byBwbGFjZSBgdmFsYC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBOb25lCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBnZXRmaWVsZAoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5leWUoMykKICAgID4+PiB4LmdldGZpZWxkKG5wLmZsb2F0NjQpCiAgICBhcnJheShbWyAxLiwgIDAuLCAgMC5dLAogICAgICAgICAgIFsgMC4sICAxLiwgIDAuXSwKICAgICAgICAgICBbIDAuLCAgMC4sICAxLl1dKQogICAgPj4+IHguc2V0ZmllbGQoMywgbnAuaW50MzIpCiAgICA+Pj4geC5nZXRmaWVsZChucC5pbnQzMikKICAgIGFycmF5KFtbMywgMywgM10sCiAgICAgICAgICAgWzMsIDMsIDNdLAogICAgICAgICAgIFszLCAzLCAzXV0pCiAgICA+Pj4geAogICAgYXJyYXkoW1sgIDEuMDAwMDAwMDBlKzAwMCwgICAxLjQ4MjE5Njk0ZS0zMjMsICAgMS40ODIxOTY5NGUtMzIzXSwKICAgICAgICAgICBbICAxLjQ4MjE5Njk0ZS0zMjMsICAgMS4wMDAwMDAwMGUrMDAwLCAgIDEuNDgyMTk2OTRlLTMyM10sCiAgICAgICAgICAgWyAgMS40ODIxOTY5NGUtMzIzLCAgIDEuNDgyMTk2OTRlLTMyMywgICAxLjAwMDAwMDAwZSswMDBdXSkKICAgID4+PiB4LnNldGZpZWxkKG5wLmV5ZSgzKSwgbnAuaW50MzIpCiAgICA+Pj4geAogICAgYXJyYXkoW1sgMS4sICAwLiwgIDAuXSwKICAgICAgICAgICBbIDAuLCAgMS4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDAuLCAgMS5dXSkKCiAgICApAtoIc2V0ZmxhZ3NhCQkAAAogICAgYS5zZXRmbGFncyh3cml0ZT1Ob25lLCBhbGlnbj1Ob25lLCB1aWM9Tm9uZSkKCiAgICBTZXQgYXJyYXkgZmxhZ3MgV1JJVEVBQkxFLCBBTElHTkVELCBhbmQgVVBEQVRFSUZDT1BZLCByZXNwZWN0aXZlbHkuCgogICAgVGhlc2UgQm9vbGVhbi12YWx1ZWQgZmxhZ3MgYWZmZWN0IGhvdyBudW1weSBpbnRlcnByZXRzIHRoZSBtZW1vcnkKICAgIGFyZWEgdXNlZCBieSBgYWAgKHNlZSBOb3RlcyBiZWxvdykuIFRoZSBBTElHTkVEIGZsYWcgY2FuIG9ubHkKICAgIGJlIHNldCB0byBUcnVlIGlmIHRoZSBkYXRhIGlzIGFjdHVhbGx5IGFsaWduZWQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlLgogICAgVGhlIFVQREFURUlGQ09QWSBmbGFnIGNhbiBuZXZlciBiZSBzZXQgdG8gVHJ1ZS4gVGhlIGZsYWcgV1JJVEVBQkxFCiAgICBjYW4gb25seSBiZSBzZXQgdG8gVHJ1ZSBpZiB0aGUgYXJyYXkgb3ducyBpdHMgb3duIG1lbW9yeSwgb3IgdGhlCiAgICB1bHRpbWF0ZSBvd25lciBvZiB0aGUgbWVtb3J5IGV4cG9zZXMgYSB3cml0ZWFibGUgYnVmZmVyIGludGVyZmFjZSwKICAgIG9yIGlzIGEgc3RyaW5nLiAoVGhlIGV4Y2VwdGlvbiBmb3Igc3RyaW5nIGlzIG1hZGUgc28gdGhhdCB1bnBpY2tsaW5nCiAgICBjYW4gYmUgZG9uZSB3aXRob3V0IGNvcHlpbmcgbWVtb3J5LikKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB3cml0ZSA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgRGVzY3JpYmVzIHdoZXRoZXIgb3Igbm90IGBhYCBjYW4gYmUgd3JpdHRlbiB0by4KICAgIGFsaWduIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBEZXNjcmliZXMgd2hldGhlciBvciBub3QgYGFgIGlzIGFsaWduZWQgcHJvcGVybHkgZm9yIGl0cyB0eXBlLgogICAgdWljIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBEZXNjcmliZXMgd2hldGhlciBvciBub3QgYGFgIGlzIGEgY29weSBvZiBhbm90aGVyICJiYXNlIiBhcnJheS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIEFycmF5IGZsYWdzIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBtZW1vcnkgYXJlYSB1c2VkCiAgICBmb3IgdGhlIGFycmF5IGlzIHRvIGJlIGludGVycHJldGVkLiBUaGVyZSBhcmUgNiBCb29sZWFuIGZsYWdzCiAgICBpbiB1c2UsIG9ubHkgdGhyZWUgb2Ygd2hpY2ggY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHVzZXI6CiAgICBVUERBVEVJRkNPUFksIFdSSVRFQUJMRSwgYW5kIEFMSUdORUQuCgogICAgV1JJVEVBQkxFIChXKSB0aGUgZGF0YSBhcmVhIGNhbiBiZSB3cml0dGVuIHRvOwoKICAgIEFMSUdORUQgKEEpIHRoZSBkYXRhIGFuZCBzdHJpZGVzIGFyZSBhbGlnbmVkIGFwcHJvcHJpYXRlbHkgZm9yIHRoZSBoYXJkd2FyZQogICAgKGFzIGRldGVybWluZWQgYnkgdGhlIGNvbXBpbGVyKTsKCiAgICBVUERBVEVJRkNPUFkgKFUpIHRoaXMgYXJyYXkgaXMgYSBjb3B5IG9mIHNvbWUgb3RoZXIgYXJyYXkgKHJlZmVyZW5jZWQKICAgIGJ5IC5iYXNlKS4gV2hlbiB0aGlzIGFycmF5IGlzIGRlYWxsb2NhdGVkLCB0aGUgYmFzZSBhcnJheSB3aWxsIGJlCiAgICB1cGRhdGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkuCgogICAgQWxsIGZsYWdzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB0aGVpciBmaXJzdCAodXBwZXIgY2FzZSkgbGV0dGVyIGFzIHdlbGwKICAgIGFzIHRoZSBmdWxsIG5hbWUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geQogICAgYXJyYXkoW1szLCAxLCA3XSwKICAgICAgICAgICBbMiwgMCwgMF0sCiAgICAgICAgICAgWzgsIDUsIDldXSkKICAgID4+PiB5LmZsYWdzCiAgICAgIENfQ09OVElHVU9VUyA6IFRydWUKICAgICAgRl9DT05USUdVT1VTIDogRmFsc2UKICAgICAgT1dOREFUQSA6IFRydWUKICAgICAgV1JJVEVBQkxFIDogVHJ1ZQogICAgICBBTElHTkVEIDogVHJ1ZQogICAgICBVUERBVEVJRkNPUFkgOiBGYWxzZQogICAgPj4+IHkuc2V0ZmxhZ3Mod3JpdGU9MCwgYWxpZ249MCkKICAgID4+PiB5LmZsYWdzCiAgICAgIENfQ09OVElHVU9VUyA6IFRydWUKICAgICAgRl9DT05USUdVT1VTIDogRmFsc2UKICAgICAgT1dOREFUQSA6IFRydWUKICAgICAgV1JJVEVBQkxFIDogRmFsc2UKICAgICAgQUxJR05FRCA6IEZhbHNlCiAgICAgIFVQREFURUlGQ09QWSA6IEZhbHNlCiAgICA+Pj4geS5zZXRmbGFncyh1aWM9MSkKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgIFZhbHVlRXJyb3I6IGNhbm5vdCBzZXQgVVBEQVRFSUZDT1BZIGZsYWcgdG8gVHJ1ZQoKICAgICkC2gRzb3J0YQkGAAAKICAgIGEuc29ydChheGlzPS0xLCBraW5kPSdxdWlja3NvcnQnLCBvcmRlcj1Ob25lKQoKICAgIFNvcnQgYW4gYXJyYXksIGluLXBsYWNlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0byBzb3J0LiBEZWZhdWx0IGlzIC0xLCB3aGljaCBtZWFucyBzb3J0IGFsb25nIHRoZQogICAgICAgIGxhc3QgYXhpcy4KICAgIGtpbmQgOiB7J3F1aWNrc29ydCcsICdtZXJnZXNvcnQnLCAnaGVhcHNvcnQnfSwgb3B0aW9uYWwKICAgICAgICBTb3J0aW5nIGFsZ29yaXRobS4gRGVmYXVsdCBpcyAncXVpY2tzb3J0Jy4KICAgIG9yZGVyIDogc3RyIG9yIGxpc3Qgb2Ygc3RyLCBvcHRpb25hbAogICAgICAgIFdoZW4gYGFgIGlzIGFuIGFycmF5IHdpdGggZmllbGRzIGRlZmluZWQsIHRoaXMgYXJndW1lbnQgc3BlY2lmaWVzCiAgICAgICAgd2hpY2ggZmllbGRzIHRvIGNvbXBhcmUgZmlyc3QsIHNlY29uZCwgZXRjLiAgQSBzaW5nbGUgZmllbGQgY2FuCiAgICAgICAgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nLCBhbmQgbm90IGFsbCBmaWVsZHMgbmVlZCBiZSBzcGVjaWZpZWQsCiAgICAgICAgYnV0IHVuc3BlY2lmaWVkIGZpZWxkcyB3aWxsIHN0aWxsIGJlIHVzZWQsIGluIHRoZSBvcmRlciBpbiB3aGljaAogICAgICAgIHRoZXkgY29tZSB1cCBpbiB0aGUgZHR5cGUsIHRvIGJyZWFrIHRpZXMuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5zb3J0IDogUmV0dXJuIGEgc29ydGVkIGNvcHkgb2YgYW4gYXJyYXkuCiAgICBhcmdzb3J0IDogSW5kaXJlY3Qgc29ydC4KICAgIGxleHNvcnQgOiBJbmRpcmVjdCBzdGFibGUgc29ydCBvbiBtdWx0aXBsZSBrZXlzLgogICAgc2VhcmNoc29ydGVkIDogRmluZCBlbGVtZW50cyBpbiBzb3J0ZWQgYXJyYXkuCiAgICBwYXJ0aXRpb246IFBhcnRpYWwgc29ydC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFNlZSBgYHNvcnRgYCBmb3Igbm90ZXMgb24gdGhlIGRpZmZlcmVudCBzb3J0aW5nIGFsZ29yaXRobXMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMSw0XSwgWzMsMV1dKQogICAgPj4+IGEuc29ydChheGlzPTEpCiAgICA+Pj4gYQogICAgYXJyYXkoW1sxLCA0XSwKICAgICAgICAgICBbMSwgM11dKQogICAgPj4+IGEuc29ydChheGlzPTApCiAgICA+Pj4gYQogICAgYXJyYXkoW1sxLCAzXSwKICAgICAgICAgICBbMSwgNF1dKQoKICAgIFVzZSB0aGUgYG9yZGVyYCBrZXl3b3JkIHRvIHNwZWNpZnkgYSBmaWVsZCB0byB1c2Ugd2hlbiBzb3J0aW5nIGEKICAgIHN0cnVjdHVyZWQgYXJyYXk6CgogICAgPj4+IGEgPSBucC5hcnJheShbKCdhJywgMiksICgnYycsIDEpXSwgZHR5cGU9WygneCcsICdTMScpLCAoJ3knLCBpbnQpXSkKICAgID4+PiBhLnNvcnQob3JkZXI9J3knKQogICAgPj4+IGEKICAgIGFycmF5KFsoJ2MnLCAxKSwgKCdhJywgMildLAogICAgICAgICAgZHR5cGU9WygneCcsICd8UzEnKSwgKCd5JywgJzxpNCcpXSkKCiAgICApAtoJcGFydGl0aW9uYYEHAAAKICAgIGEucGFydGl0aW9uKGt0aCwgYXhpcz0tMSwga2luZD0naW50cm9zZWxlY3QnLCBvcmRlcj1Ob25lKQoKICAgIFJlYXJyYW5nZXMgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBpbiBzdWNoIGEgd2F5IHRoYXQgdmFsdWUgb2YgdGhlCiAgICBlbGVtZW50IGluIGt0aCBwb3NpdGlvbiBpcyBpbiB0aGUgcG9zaXRpb24gaXQgd291bGQgYmUgaW4gYSBzb3J0ZWQgYXJyYXkuCiAgICBBbGwgZWxlbWVudHMgc21hbGxlciB0aGFuIHRoZSBrdGggZWxlbWVudCBhcmUgbW92ZWQgYmVmb3JlIHRoaXMgZWxlbWVudCBhbmQKICAgIGFsbCBlcXVhbCBvciBncmVhdGVyIGFyZSBtb3ZlZCBiZWhpbmQgaXQuIFRoZSBvcmRlcmluZyBvZiB0aGUgZWxlbWVudHMgaW4KICAgIHRoZSB0d28gcGFydGl0aW9ucyBpcyB1bmRlZmluZWQuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBrdGggOiBpbnQgb3Igc2VxdWVuY2Ugb2YgaW50cwogICAgICAgIEVsZW1lbnQgaW5kZXggdG8gcGFydGl0aW9uIGJ5LiBUaGUga3RoIGVsZW1lbnQgdmFsdWUgd2lsbCBiZSBpbiBpdHMKICAgICAgICBmaW5hbCBzb3J0ZWQgcG9zaXRpb24gYW5kIGFsbCBzbWFsbGVyIGVsZW1lbnRzIHdpbGwgYmUgbW92ZWQgYmVmb3JlIGl0CiAgICAgICAgYW5kIGFsbCBlcXVhbCBvciBncmVhdGVyIGVsZW1lbnRzIGJlaGluZCBpdC4KICAgICAgICBUaGUgb3JkZXIgYWxsIGVsZW1lbnRzIGluIHRoZSBwYXJ0aXRpb25zIGlzIHVuZGVmaW5lZC4KICAgICAgICBJZiBwcm92aWRlZCB3aXRoIGEgc2VxdWVuY2Ugb2Yga3RoIGl0IHdpbGwgcGFydGl0aW9uIGFsbCBlbGVtZW50cwogICAgICAgIGluZGV4ZWQgYnkga3RoIG9mIHRoZW0gaW50byB0aGVpciBzb3J0ZWQgcG9zaXRpb24gYXQgb25jZS4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0byBzb3J0LiBEZWZhdWx0IGlzIC0xLCB3aGljaCBtZWFucyBzb3J0IGFsb25nIHRoZQogICAgICAgIGxhc3QgYXhpcy4KICAgIGtpbmQgOiB7J2ludHJvc2VsZWN0J30sIG9wdGlvbmFsCiAgICAgICAgU2VsZWN0aW9uIGFsZ29yaXRobS4gRGVmYXVsdCBpcyAnaW50cm9zZWxlY3QnLgogICAgb3JkZXIgOiBzdHIgb3IgbGlzdCBvZiBzdHIsIG9wdGlvbmFsCiAgICAgICAgV2hlbiBgYWAgaXMgYW4gYXJyYXkgd2l0aCBmaWVsZHMgZGVmaW5lZCwgdGhpcyBhcmd1bWVudCBzcGVjaWZpZXMKICAgICAgICB3aGljaCBmaWVsZHMgdG8gY29tcGFyZSBmaXJzdCwgc2Vjb25kLCBldGMuICBBIHNpbmdsZSBmaWVsZCBjYW4KICAgICAgICBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcsIGFuZCBub3QgYWxsIGZpZWxkcyBuZWVkIGJlIHNwZWNpZmllZCwKICAgICAgICBidXQgdW5zcGVjaWZpZWQgZmllbGRzIHdpbGwgc3RpbGwgYmUgdXNlZCwgaW4gdGhlIG9yZGVyIGluIHdoaWNoCiAgICAgICAgdGhleSBjb21lIHVwIGluIHRoZSBkdHlwZSwgdG8gYnJlYWsgdGllcy4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnBhcnRpdGlvbiA6IFJldHVybiBhIHBhcml0aXRpb25lZCBjb3B5IG9mIGFuIGFycmF5LgogICAgYXJncGFydGl0aW9uIDogSW5kaXJlY3QgcGFydGl0aW9uLgogICAgc29ydCA6IEZ1bGwgc29ydC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFNlZSBgYG5wLnBhcnRpdGlvbmBgIGZvciBub3RlcyBvbiB0aGUgZGlmZmVyZW50IGFsZ29yaXRobXMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFszLCA0LCAyLCAxXSkKICAgID4+PiBhLnBhcnRpdGlvbigzKQogICAgPj4+IGEKICAgIGFycmF5KFsyLCAxLCAzLCA0XSkKCiAgICA+Pj4gYS5wYXJ0aXRpb24oKDEsIDMpKQogICAgYXJyYXkoWzEsIDIsIDMsIDRdKQogICAgKQLaB3NxdWVlemV61gogICAgYS5zcXVlZXplKGF4aXM9Tm9uZSkKCiAgICBSZW1vdmUgc2luZ2xlLWRpbWVuc2lvbmFsIGVudHJpZXMgZnJvbSB0aGUgc2hhcGUgb2YgYGFgLgoKICAgIFJlZmVyIHRvIGBudW1weS5zcXVlZXplYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuc3F1ZWV6ZSA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoDc3RkYQYBAAAKICAgIGEuc3RkKGF4aXM9Tm9uZSwgZHR5cGU9Tm9uZSwgb3V0PU5vbmUsIGRkb2Y9MCwga2VlcGRpbXM9RmFsc2UpCgogICAgUmV0dXJucyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBhcnJheSBlbGVtZW50cyBhbG9uZyBnaXZlbiBheGlzLgoKICAgIFJlZmVyIHRvIGBudW1weS5zdGRgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5zdGQgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaA3N1bXrxCiAgICBhLnN1bShheGlzPU5vbmUsIGR0eXBlPU5vbmUsIG91dD1Ob25lLCBrZWVwZGltcz1GYWxzZSkKCiAgICBSZXR1cm4gdGhlIHN1bSBvZiB0aGUgYXJyYXkgZWxlbWVudHMgb3ZlciB0aGUgZ2l2ZW4gYXhpcy4KCiAgICBSZWZlciB0byBgbnVtcHkuc3VtYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuc3VtIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2ghzd2FwYXhlc3rlCiAgICBhLnN3YXBheGVzKGF4aXMxLCBheGlzMikKCiAgICBSZXR1cm4gYSB2aWV3IG9mIHRoZSBhcnJheSB3aXRoIGBheGlzMWAgYW5kIGBheGlzMmAgaW50ZXJjaGFuZ2VkLgoKICAgIFJlZmVyIHRvIGBudW1weS5zd2FwYXhlc2AgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnN3YXBheGVzIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2gR0YWtlevsKICAgIGEudGFrZShpbmRpY2VzLCBheGlzPU5vbmUsIG91dD1Ob25lLCBtb2RlPSdyYWlzZScpCgogICAgUmV0dXJuIGFuIGFycmF5IGZvcm1lZCBmcm9tIHRoZSBlbGVtZW50cyBvZiBgYWAgYXQgdGhlIGdpdmVuIGluZGljZXMuCgogICAgUmVmZXIgdG8gYG51bXB5LnRha2VgIGZvciBmdWxsIGRvY3VtZW50YXRpb24uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS50YWtlIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkC2gZ0b2ZpbGVhiwQAAAogICAgYS50b2ZpbGUoZmlkLCBzZXA9IiIsIGZvcm1hdD0iJXMiKQoKICAgIFdyaXRlIGFycmF5IHRvIGEgZmlsZSBhcyB0ZXh0IG9yIGJpbmFyeSAoZGVmYXVsdCkuCgogICAgRGF0YSBpcyBhbHdheXMgd3JpdHRlbiBpbiAnQycgb3JkZXIsIGluZGVwZW5kZW50IG9mIHRoZSBvcmRlciBvZiBgYWAuCiAgICBUaGUgZGF0YSBwcm9kdWNlZCBieSB0aGlzIG1ldGhvZCBjYW4gYmUgcmVjb3ZlcmVkIHVzaW5nIHRoZSBmdW5jdGlvbgogICAgZnJvbWZpbGUoKS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBmaWQgOiBmaWxlIG9yIHN0cgogICAgICAgIEFuIG9wZW4gZmlsZSBvYmplY3QsIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmaWxlbmFtZS4KICAgIHNlcCA6IHN0cgogICAgICAgIFNlcGFyYXRvciBiZXR3ZWVuIGFycmF5IGl0ZW1zIGZvciB0ZXh0IG91dHB1dC4KICAgICAgICBJZiAiIiAoZW1wdHkpLCBhIGJpbmFyeSBmaWxlIGlzIHdyaXR0ZW4sIGVxdWl2YWxlbnQgdG8KICAgICAgICBgYGZpbGUud3JpdGUoYS50b2J5dGVzKCkpYGAuCiAgICBmb3JtYXQgOiBzdHIKICAgICAgICBGb3JtYXQgc3RyaW5nIGZvciB0ZXh0IGZpbGUgb3V0cHV0LgogICAgICAgIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGZvcm1hdHRlZCB0byB0ZXh0IGJ5IGZpcnN0IGNvbnZlcnRpbmcKICAgICAgICBpdCB0byB0aGUgY2xvc2VzdCBQeXRob24gdHlwZSwgYW5kIHRoZW4gdXNpbmcgImZvcm1hdCIgJSBpdGVtLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBxdWljayBzdG9yYWdlIG9mIGFycmF5IGRhdGEuCiAgICBJbmZvcm1hdGlvbiBvbiBlbmRpYW5uZXNzIGFuZCBwcmVjaXNpb24gaXMgbG9zdCwgc28gdGhpcyBtZXRob2QgaXMgbm90IGEKICAgIGdvb2QgY2hvaWNlIGZvciBmaWxlcyBpbnRlbmRlZCB0byBhcmNoaXZlIGRhdGEgb3IgdHJhbnNwb3J0IGRhdGEgYmV0d2VlbgogICAgbWFjaGluZXMgd2l0aCBkaWZmZXJlbnQgZW5kaWFubmVzcy4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBjYW4gYmUgb3ZlcmNvbWUKICAgIGJ5IG91dHB1dHRpbmcgdGhlIGRhdGEgYXMgdGV4dCBmaWxlcywgYXQgdGhlIGV4cGVuc2Ugb2Ygc3BlZWQgYW5kIGZpbGUKICAgIHNpemUuCgogICAgKQLaBnRvbGlzdGF5AgAACiAgICBhLnRvbGlzdCgpCgogICAgUmV0dXJuIHRoZSBhcnJheSBhcyBhIChwb3NzaWJseSBuZXN0ZWQpIGxpc3QuCgogICAgUmV0dXJuIGEgY29weSBvZiB0aGUgYXJyYXkgZGF0YSBhcyBhIChuZXN0ZWQpIFB5dGhvbiBsaXN0LgogICAgRGF0YSBpdGVtcyBhcmUgY29udmVydGVkIHRvIHRoZSBuZWFyZXN0IGNvbXBhdGlibGUgUHl0aG9uIHR5cGUuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgbm9uZQoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHkgOiBsaXN0CiAgICAgICAgVGhlIHBvc3NpYmx5IG5lc3RlZCBsaXN0IG9mIGFycmF5IGVsZW1lbnRzLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIGFycmF5IG1heSBiZSByZWNyZWF0ZWQsIGBgYSA9IG5wLmFycmF5KGEudG9saXN0KCkpYGAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsxLCAyXSkKICAgID4+PiBhLnRvbGlzdCgpCiAgICBbMSwgMl0KICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAyXSwgWzMsIDRdXSkKICAgID4+PiBsaXN0KGEpCiAgICBbYXJyYXkoWzEsIDJdKSwgYXJyYXkoWzMsIDRdKV0KICAgID4+PiBhLnRvbGlzdCgpCiAgICBbWzEsIDJdLCBbMywgNF1dCgogICAgYfsDAAAKICAgIGEue25hbWV9KG9yZGVyPSdDJykKCiAgICBDb25zdHJ1Y3QgUHl0aG9uIGJ5dGVzIGNvbnRhaW5pbmcgdGhlIHJhdyBkYXRhIGJ5dGVzIGluIHRoZSBhcnJheS4KCiAgICBDb25zdHJ1Y3RzIFB5dGhvbiBieXRlcyBzaG93aW5nIGEgY29weSBvZiB0aGUgcmF3IGNvbnRlbnRzIG9mCiAgICBkYXRhIG1lbW9yeS4gVGhlIGJ5dGVzIG9iamVjdCBjYW4gYmUgcHJvZHVjZWQgaW4gZWl0aGVyICdDJyBvciAnRm9ydHJhbicsCiAgICBvciAnQW55JyBvcmRlciAodGhlIGRlZmF1bHQgaXMgJ0MnLW9yZGVyKS4gJ0FueScgb3JkZXIgbWVhbnMgQy1vcmRlcgogICAgdW5sZXNzIHRoZSBGX0NPTlRJR1VPVVMgZmxhZyBpbiB0aGUgYXJyYXkgaXMgc2V0LCBpbiB3aGljaCBjYXNlIGl0CiAgICBtZWFucyAnRm9ydHJhbicgb3JkZXIuCgogICAge2RlcHJlY2F0ZWR9CgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgb3JkZXIgOiB7eydDJywgJ0YnLCBOb25lfX0sIG9wdGlvbmFsCiAgICAgICAgT3JkZXIgb2YgdGhlIGRhdGEgZm9yIG11bHRpZGltZW5zaW9uYWwgYXJyYXlzOgogICAgICAgIEMsIEZvcnRyYW4sIG9yIHRoZSBzYW1lIGFzIGZvciB0aGUgb3JpZ2luYWwgYXJyYXkuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgcyA6IGJ5dGVzCiAgICAgICAgUHl0aG9uIGJ5dGVzIGV4aGliaXRpbmcgYSBjb3B5IG9mIGBhYCdzIHJhdyBkYXRhLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbWzAsIDFdLCBbMiwgM11dKQogICAgPj4+IHgudG9ieXRlcygpCiAgICBiJ1x4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDNceDAwXHgwMFx4MDAnCiAgICA+Pj4geC50b2J5dGVzKCdDJykgPT0geC50b2J5dGVzKCkKICAgIFRydWUKICAgID4+PiB4LnRvYnl0ZXMoJ0YnKQogICAgYidceDAwXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDFceDAwXHgwMFx4MDBceDAzXHgwMFx4MDBceDAwJwoKICAgINoIdG9zdHJpbmd6YlRoaXMgZnVuY3Rpb24gaXMgYSBjb21wYXRpYmlsaXR5IGFsaWFzIGZvciB0b2J5dGVzLiBEZXNwaXRlIGl0cyBuYW1lIGl0IHJldHVybnMgYnl0ZXMgbm90IHN0cmluZ3MuKQLaBG5hbWVaCmRlcHJlY2F0ZWTaB3RvYnl0ZXN6Fy4uIHZlcnNpb25hZGRlZDo6IDEuOS4wKQLaBXRyYWNleusKICAgIGEudHJhY2Uob2Zmc2V0PTAsIGF4aXMxPTAsIGF4aXMyPTEsIGR0eXBlPU5vbmUsIG91dD1Ob25lKQoKICAgIFJldHVybiB0aGUgc3VtIGFsb25nIGRpYWdvbmFscyBvZiB0aGUgYXJyYXkuCgogICAgUmVmZXIgdG8gYG51bXB5LnRyYWNlYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkudHJhY2UgOiBlcXVpdmFsZW50IGZ1bmN0aW9uCgogICAgKQLaCXRyYW5zcG9zZWGbBQAACiAgICBhLnRyYW5zcG9zZSgqYXhlcykKCiAgICBSZXR1cm5zIGEgdmlldyBvZiB0aGUgYXJyYXkgd2l0aCBheGVzIHRyYW5zcG9zZWQuCgogICAgRm9yIGEgMS1EIGFycmF5LCB0aGlzIGhhcyBubyBlZmZlY3QuIChUbyBjaGFuZ2UgYmV0d2VlbiBjb2x1bW4gYW5kCiAgICByb3cgdmVjdG9ycywgZmlyc3QgY2FzdCB0aGUgMS1EIGFycmF5IGludG8gYSBtYXRyaXggb2JqZWN0LikKICAgIEZvciBhIDItRCBhcnJheSwgdGhpcyBpcyB0aGUgdXN1YWwgbWF0cml4IHRyYW5zcG9zZS4KICAgIEZvciBhbiBuLUQgYXJyYXksIGlmIGF4ZXMgYXJlIGdpdmVuLCB0aGVpciBvcmRlciBpbmRpY2F0ZXMgaG93IHRoZQogICAgYXhlcyBhcmUgcGVybXV0ZWQgKHNlZSBFeGFtcGxlcykuIElmIGF4ZXMgYXJlIG5vdCBwcm92aWRlZCBhbmQKICAgIGBgYS5zaGFwZSA9IChpWzBdLCBpWzFdLCAuLi4gaVtuLTJdLCBpW24tMV0pYGAsIHRoZW4KICAgIGBgYS50cmFuc3Bvc2UoKS5zaGFwZSA9IChpW24tMV0sIGlbbi0yXSwgLi4uIGlbMV0sIGlbMF0pYGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYXhlcyA6IE5vbmUsIHR1cGxlIG9mIGludHMsIG9yIGBuYCBpbnRzCgogICAgICogTm9uZSBvciBubyBhcmd1bWVudDogcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBheGVzLgoKICAgICAqIHR1cGxlIG9mIGludHM6IGBpYCBpbiB0aGUgYGpgLXRoIHBsYWNlIGluIHRoZSB0dXBsZSBtZWFucyBgYWAncwogICAgICAgYGlgLXRoIGF4aXMgYmVjb21lcyBgYS50cmFuc3Bvc2UoKWAncyBgamAtdGggYXhpcy4KCiAgICAgKiBgbmAgaW50czogc2FtZSBhcyBhbiBuLXR1cGxlIG9mIHRoZSBzYW1lIGludHMgKHRoaXMgZm9ybSBpcwogICAgICAgaW50ZW5kZWQgc2ltcGx5IGFzIGEgImNvbnZlbmllbmNlIiBhbHRlcm5hdGl2ZSB0byB0aGUgdHVwbGUgZm9ybSkKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBuZGFycmF5CiAgICAgICAgVmlldyBvZiBgYWAsIHdpdGggYXhlcyBzdWl0YWJseSBwZXJtdXRlZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG5kYXJyYXkuVCA6IEFycmF5IHByb3BlcnR5IHJldHVybmluZyB0aGUgYXJyYXkgdHJhbnNwb3NlZC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAyXSwgWzMsIDRdXSkKICAgID4+PiBhCiAgICBhcnJheShbWzEsIDJdLAogICAgICAgICAgIFszLCA0XV0pCiAgICA+Pj4gYS50cmFuc3Bvc2UoKQogICAgYXJyYXkoW1sxLCAzXSwKICAgICAgICAgICBbMiwgNF1dKQogICAgPj4+IGEudHJhbnNwb3NlKCgxLCAwKSkKICAgIGFycmF5KFtbMSwgM10sCiAgICAgICAgICAgWzIsIDRdXSkKICAgID4+PiBhLnRyYW5zcG9zZSgxLCAwKQogICAgYXJyYXkoW1sxLCAzXSwKICAgICAgICAgICBbMiwgNF1dKQoKICAgICkC2gN2YXJ6/QogICAgYS52YXIoYXhpcz1Ob25lLCBkdHlwZT1Ob25lLCBvdXQ9Tm9uZSwgZGRvZj0wLCBrZWVwZGltcz1GYWxzZSkKCiAgICBSZXR1cm5zIHRoZSB2YXJpYW5jZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMsIGFsb25nIGdpdmVuIGF4aXMuCgogICAgUmVmZXIgdG8gYG51bXB5LnZhcmAgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbi4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnZhciA6IGVxdWl2YWxlbnQgZnVuY3Rpb24KCiAgICApAtoEdmlld2HzDAAACiAgICBhLnZpZXcoZHR5cGU9Tm9uZSwgdHlwZT1Ob25lKQoKICAgIE5ldyB2aWV3IG9mIGFycmF5IHdpdGggdGhlIHNhbWUgZGF0YS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBkdHlwZSA6IGRhdGEtdHlwZSBvciBuZGFycmF5IHN1Yi1jbGFzcywgb3B0aW9uYWwKICAgICAgICBEYXRhLXR5cGUgZGVzY3JpcHRvciBvZiB0aGUgcmV0dXJuZWQgdmlldywgZS5nLiwgZmxvYXQzMiBvciBpbnQxNi4gVGhlCiAgICAgICAgZGVmYXVsdCwgTm9uZSwgcmVzdWx0cyBpbiB0aGUgdmlldyBoYXZpbmcgdGhlIHNhbWUgZGF0YS10eXBlIGFzIGBhYC4KICAgICAgICBUaGlzIGFyZ3VtZW50IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBhbiBuZGFycmF5IHN1Yi1jbGFzcywgd2hpY2gKICAgICAgICB0aGVuIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0ICh0aGlzIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICBzZXR0aW5nIHRoZSBgYHR5cGVgYCBwYXJhbWV0ZXIpLgogICAgdHlwZSA6IFB5dGhvbiB0eXBlLCBvcHRpb25hbAogICAgICAgIFR5cGUgb2YgdGhlIHJldHVybmVkIHZpZXcsIGUuZy4sIG5kYXJyYXkgb3IgbWF0cml4LiAgQWdhaW4sIHRoZQogICAgICAgIGRlZmF1bHQgTm9uZSByZXN1bHRzIGluIHR5cGUgcHJlc2VydmF0aW9uLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgYGBhLnZpZXcoKWBgIGlzIHVzZWQgdHdvIGRpZmZlcmVudCB3YXlzOgoKICAgIGBgYS52aWV3KHNvbWVfZHR5cGUpYGAgb3IgYGBhLnZpZXcoZHR5cGU9c29tZV9kdHlwZSlgYCBjb25zdHJ1Y3RzIGEgdmlldwogICAgb2YgdGhlIGFycmF5J3MgbWVtb3J5IHdpdGggYSBkaWZmZXJlbnQgZGF0YS10eXBlLiAgVGhpcyBjYW4gY2F1c2UgYQogICAgcmVpbnRlcnByZXRhdGlvbiBvZiB0aGUgYnl0ZXMgb2YgbWVtb3J5LgoKICAgIGBgYS52aWV3KG5kYXJyYXlfc3ViY2xhc3MpYGAgb3IgYGBhLnZpZXcodHlwZT1uZGFycmF5X3N1YmNsYXNzKWBgIGp1c3QKICAgIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYG5kYXJyYXlfc3ViY2xhc3NgIHRoYXQgbG9va3MgYXQgdGhlIHNhbWUgYXJyYXkKICAgIChzYW1lIHNoYXBlLCBkdHlwZSwgZXRjLikgIFRoaXMgZG9lcyBub3QgY2F1c2UgYSByZWludGVycHJldGF0aW9uIG9mIHRoZQogICAgbWVtb3J5LgoKICAgIEZvciBgYGEudmlldyhzb21lX2R0eXBlKWBgLCBpZiBgYHNvbWVfZHR5cGVgYCBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mCiAgICBieXRlcyBwZXIgZW50cnkgdGhhbiB0aGUgcHJldmlvdXMgZHR5cGUgKGZvciBleGFtcGxlLCBjb252ZXJ0aW5nIGEKICAgIHJlZ3VsYXIgYXJyYXkgdG8gYSBzdHJ1Y3R1cmVkIGFycmF5KSwgdGhlbiB0aGUgYmVoYXZpb3Igb2YgdGhlIHZpZXcKICAgIGNhbm5vdCBiZSBwcmVkaWN0ZWQganVzdCBmcm9tIHRoZSBzdXBlcmZpY2lhbCBhcHBlYXJhbmNlIG9mIGBgYWBgIChzaG93bgogICAgYnkgYGBwcmludChhKWBgKS4gSXQgYWxzbyBkZXBlbmRzIG9uIGV4YWN0bHkgaG93IGBgYWBgIGlzIHN0b3JlZCBpbgogICAgbWVtb3J5LiBUaGVyZWZvcmUgaWYgYGBhYGAgaXMgQy1vcmRlcmVkIHZlcnN1cyBmb3J0cmFuLW9yZGVyZWQsIHZlcnN1cwogICAgZGVmaW5lZCBhcyBhIHNsaWNlIG9yIHRyYW5zcG9zZSwgZXRjLiwgdGhlIHZpZXcgbWF5IGdpdmUgZGlmZmVyZW50CiAgICByZXN1bHRzLgoKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJyYXkoWygxLCAyKV0sIGR0eXBlPVsoJ2EnLCBucC5pbnQ4KSwgKCdiJywgbnAuaW50OCldKQoKICAgIFZpZXdpbmcgYXJyYXkgZGF0YSB1c2luZyBhIGRpZmZlcmVudCB0eXBlIGFuZCBkdHlwZToKCiAgICA+Pj4geSA9IHgudmlldyhkdHlwZT1ucC5pbnQxNiwgdHlwZT1ucC5tYXRyaXgpCiAgICA+Pj4geQogICAgbWF0cml4KFtbNTEzXV0sIGR0eXBlPWludDE2KQogICAgPj4+IHByaW50KHR5cGUoeSkpCiAgICA8Y2xhc3MgJ251bXB5Lm1hdHJpeGxpYi5kZWZtYXRyaXgubWF0cml4Jz4KCiAgICBDcmVhdGluZyBhIHZpZXcgb24gYSBzdHJ1Y3R1cmVkIGFycmF5IHNvIGl0IGNhbiBiZSB1c2VkIGluIGNhbGN1bGF0aW9ucwoKICAgID4+PiB4ID0gbnAuYXJyYXkoWygxLCAyKSwoMyw0KV0sIGR0eXBlPVsoJ2EnLCBucC5pbnQ4KSwgKCdiJywgbnAuaW50OCldKQogICAgPj4+IHh2ID0geC52aWV3KGR0eXBlPW5wLmludDgpLnJlc2hhcGUoLTEsMikKICAgID4+PiB4dgogICAgYXJyYXkoW1sxLCAyXSwKICAgICAgICAgICBbMywgNF1dLCBkdHlwZT1pbnQ4KQogICAgPj4+IHh2Lm1lYW4oMCkKICAgIGFycmF5KFsgMi4sICAzLl0pCgogICAgTWFraW5nIGNoYW5nZXMgdG8gdGhlIHZpZXcgY2hhbmdlcyB0aGUgdW5kZXJseWluZyBhcnJheQoKICAgID4+PiB4dlswLDFdID0gMjAKICAgID4+PiBwcmludCh4KQogICAgWygxLCAyMCkgKDMsIDQpXQoKICAgIFVzaW5nIGEgdmlldyB0byBjb252ZXJ0IGFuIGFycmF5IHRvIGEgcmVjYXJyYXk6CgogICAgPj4+IHogPSB4LnZpZXcobnAucmVjYXJyYXkpCiAgICA+Pj4gei5hCiAgICBhcnJheShbMV0sIGR0eXBlPWludDgpCgogICAgVmlld3Mgc2hhcmUgZGF0YToKCiAgICA+Pj4geFswXSA9ICg5LCAxMCkKICAgID4+PiB6WzBdCiAgICAoOSwgMTApCgogICAgVmlld3MgdGhhdCBjaGFuZ2UgdGhlIGR0eXBlIHNpemUgKGJ5dGVzIHBlciBlbnRyeSkgc2hvdWxkIG5vcm1hbGx5IGJlCiAgICBhdm9pZGVkIG9uIGFycmF5cyBkZWZpbmVkIGJ5IHNsaWNlcywgdHJhbnNwb3NlcywgZm9ydHJhbi1vcmRlcmluZywgZXRjLjoKCiAgICA+Pj4geCA9IG5wLmFycmF5KFtbMSwyLDNdLFs0LDUsNl1dLCBkdHlwZT1ucC5pbnQxNikKICAgID4+PiB5ID0geFs6LCAwOjJdCiAgICA+Pj4geQogICAgYXJyYXkoW1sxLCAyXSwKICAgICAgICAgICBbNCwgNV1dLCBkdHlwZT1pbnQxNikKICAgID4+PiB5LnZpZXcoZHR5cGU9Wygnd2lkdGgnLCBucC5pbnQxNiksICgnbGVuZ3RoJywgbnAuaW50MTYpXSkKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgIFZhbHVlRXJyb3I6IG5ldyB0eXBlIG5vdCBjb21wYXRpYmxlIHdpdGggYXJyYXkuCiAgICA+Pj4geiA9IHkuY29weSgpCiAgICA+Pj4gei52aWV3KGR0eXBlPVsoJ3dpZHRoJywgbnAuaW50MTYpLCAoJ2xlbmd0aCcsIG5wLmludDE2KV0pCiAgICBhcnJheShbWygxLCAyKV0sCiAgICAgICAgICAgWyg0LCA1KV1dLCBkdHlwZT1bKCd3aWR0aCcsICc8aTInKSwgKCdsZW5ndGgnLCAnPGkyJyldKQogICAgehBudW1weS5jb3JlLnVtYXRoWgpmcm9tcHlmdW5jYTUEAAAKICAgIGZyb21weWZ1bmMoZnVuYywgbmluLCBub3V0KQoKICAgIFRha2VzIGFuIGFyYml0cmFyeSBQeXRob24gZnVuY3Rpb24gYW5kIHJldHVybnMgYSBOdW1QeSB1ZnVuYy4KCiAgICBDYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGFkZCBicm9hZGNhc3RpbmcgdG8gYSBidWlsdC1pbiBQeXRob24KICAgIGZ1bmN0aW9uIChzZWUgRXhhbXBsZXMgc2VjdGlvbikuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgZnVuYyA6IFB5dGhvbiBmdW5jdGlvbiBvYmplY3QKICAgICAgICBBbiBhcmJpdHJhcnkgUHl0aG9uIGZ1bmN0aW9uLgogICAgbmluIDogaW50CiAgICAgICAgVGhlIG51bWJlciBvZiBpbnB1dCBhcmd1bWVudHMuCiAgICBub3V0IDogaW50CiAgICAgICAgVGhlIG51bWJlciBvZiBvYmplY3RzIHJldHVybmVkIGJ5IGBmdW5jYC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiB1ZnVuYwogICAgICAgIFJldHVybnMgYSBOdW1QeSB1bml2ZXJzYWwgZnVuY3Rpb24gKGBgdWZ1bmNgYCkgb2JqZWN0LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgdmVjdG9yaXplIDogZXZhbHVhdGVzIHB5ZnVuYyBvdmVyIGlucHV0IGFycmF5cyB1c2luZyBicm9hZGNhc3RpbmcgcnVsZXMgb2YgbnVtcHkKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSByZXR1cm5lZCB1ZnVuYyBhbHdheXMgcmV0dXJucyBQeU9iamVjdCBhcnJheXMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBVc2UgZnJvbXB5ZnVuYyB0byBhZGQgYnJvYWRjYXN0aW5nIHRvIHRoZSBQeXRob24gZnVuY3Rpb24gYGBvY3RgYDoKCiAgICA+Pj4gb2N0X2FycmF5ID0gbnAuZnJvbXB5ZnVuYyhvY3QsIDEsIDEpCiAgICA+Pj4gb2N0X2FycmF5KG5wLmFycmF5KCgxMCwgMzAsIDEwMCkpKQogICAgYXJyYXkoWzAxMiwgMDM2LCAwMTQ0XSwgZHR5cGU9b2JqZWN0KQogICAgPj4+IG5wLmFycmF5KChvY3QoMTApLCBvY3QoMzApLCBvY3QoMTAwKSkpICMgZm9yIGNvbXBhcmlzb24KICAgIGFycmF5KFsnMDEyJywgJzAzNicsICcwMTQ0J10sCiAgICAgICAgICBkdHlwZT0nfFM0JykKCiAgICBaCWdldGVycm9iamHCBwAACiAgICBnZXRlcnJvYmooKQoKICAgIFJldHVybiB0aGUgY3VycmVudCBvYmplY3QgdGhhdCBkZWZpbmVzIGZsb2F0aW5nLXBvaW50IGVycm9yIGhhbmRsaW5nLgoKICAgIFRoZSBlcnJvciBvYmplY3QgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcKICAgIGJlaGF2aW9yIGluIE51bVB5LiBgZ2V0ZXJyb2JqYCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIG90aGVyCiAgICBmdW5jdGlvbnMgdGhhdCBnZXQgYW5kIHNldCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciAoYGdldGVycmAsIGBzZXRlcnJgLAogICAgYGdldGVycmNhbGxgLCBgc2V0ZXJyY2FsbGApLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGVycm9iaiA6IGxpc3QKICAgICAgICBUaGUgZXJyb3Igb2JqZWN0LCBhIGxpc3QgY29udGFpbmluZyB0aHJlZSBlbGVtZW50czoKICAgICAgICBbaW50ZXJuYWwgbnVtcHkgYnVmZmVyIHNpemUsIGVycm9yIG1hc2ssIGVycm9yIGNhbGxiYWNrIGZ1bmN0aW9uXS4KCiAgICAgICAgVGhlIGVycm9yIG1hc2sgaXMgYSBzaW5nbGUgaW50ZWdlciB0aGF0IGhvbGRzIHRoZSB0cmVhdG1lbnQgaW5mb3JtYXRpb24KICAgICAgICBvbiBhbGwgZm91ciBmbG9hdGluZyBwb2ludCBlcnJvcnMuIFRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBlcnJvciB0eXBlCiAgICAgICAgaXMgY29udGFpbmVkIGluIHRocmVlIGJpdHMgb2YgdGhlIGludGVnZXIuIElmIHdlIHByaW50IGl0IGluIGJhc2UgOCwgd2UKICAgICAgICBjYW4gc2VlIHdoYXQgdHJlYXRtZW50IGlzIHNldCBmb3IgImludmFsaWQiLCAidW5kZXIiLCAib3ZlciIsIGFuZAogICAgICAgICJkaXZpZGUiIChpbiB0aGF0IG9yZGVyKS4gVGhlIHByaW50ZWQgc3RyaW5nIGNhbiBiZSBpbnRlcnByZXRlZCB3aXRoCgogICAgICAgICogMCA6ICdpZ25vcmUnCiAgICAgICAgKiAxIDogJ3dhcm4nCiAgICAgICAgKiAyIDogJ3JhaXNlJwogICAgICAgICogMyA6ICdjYWxsJwogICAgICAgICogNCA6ICdwcmludCcKICAgICAgICAqIDUgOiAnbG9nJwoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgc2V0ZXJyb2JqLCBzZXRlcnIsIGdldGVyciwgc2V0ZXJyY2FsbCwgZ2V0ZXJyY2FsbAogICAgZ2V0YnVmc2l6ZSwgc2V0YnVmc2l6ZQoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgRm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb2YgdGhlIHR5cGVzIG9mIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbnMgYW5kCiAgICB0cmVhdG1lbnQgb3B0aW9ucywgc2VlIGBzZXRlcnJgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmdldGVycm9iaigpICAjIGZpcnN0IGdldCB0aGUgZGVmYXVsdHMKICAgIFsxMDAwMCwgMCwgTm9uZV0KCiAgICA+Pj4gZGVmIGVycl9oYW5kbGVyKHR5cGUsIGZsYWcpOgogICAgLi4uICAgICBwcmludCgiRmxvYXRpbmcgcG9pbnQgZXJyb3IgKCVzKSwgd2l0aCBmbGFnICVzIiAlICh0eXBlLCBmbGFnKSkKICAgIC4uLgogICAgPj4+IG9sZF9idWZzaXplID0gbnAuc2V0YnVmc2l6ZSgyMDAwMCkKICAgID4+PiBvbGRfZXJyID0gbnAuc2V0ZXJyKGRpdmlkZT0ncmFpc2UnKQogICAgPj4+IG9sZF9oYW5kbGVyID0gbnAuc2V0ZXJyY2FsbChlcnJfaGFuZGxlcikKICAgID4+PiBucC5nZXRlcnJvYmooKQogICAgWzIwMDAwLCAyLCA8ZnVuY3Rpb24gZXJyX2hhbmRsZXIgYXQgMHg5MWRjYWFjPl0KCiAgICA+Pj4gb2xkX2VyciA9IG5wLnNldGVycihhbGw9J2lnbm9yZScpCiAgICA+Pj4gbnAuYmFzZV9yZXByKG5wLmdldGVycm9iaigpWzFdLCA4KQogICAgJzAnCiAgICA+Pj4gb2xkX2VyciA9IG5wLnNldGVycihkaXZpZGU9J3dhcm4nLCBvdmVyPSdsb2cnLCB1bmRlcj0nY2FsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkPSdwcmludCcpCiAgICA+Pj4gbnAuYmFzZV9yZXByKG5wLmdldGVycm9iaigpWzFdLCA4KQogICAgJzQzNTEnCgogICAgWglzZXRlcnJvYmphIAcAAAogICAgc2V0ZXJyb2JqKGVycm9iaikKCiAgICBTZXQgdGhlIG9iamVjdCB0aGF0IGRlZmluZXMgZmxvYXRpbmctcG9pbnQgZXJyb3IgaGFuZGxpbmcuCgogICAgVGhlIGVycm9yIG9iamVjdCBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gdGhhdCBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZwogICAgYmVoYXZpb3IgaW4gTnVtUHkuIGBzZXRlcnJvYmpgIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgb3RoZXIKICAgIGZ1bmN0aW9ucyB0aGF0IHNldCBlcnJvciBoYW5kbGluZyBiZWhhdmlvciAoYHNldGVycmAsIGBzZXRlcnJjYWxsYCkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgZXJyb2JqIDogbGlzdAogICAgICAgIFRoZSBlcnJvciBvYmplY3QsIGEgbGlzdCBjb250YWluaW5nIHRocmVlIGVsZW1lbnRzOgogICAgICAgIFtpbnRlcm5hbCBudW1weSBidWZmZXIgc2l6ZSwgZXJyb3IgbWFzaywgZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb25dLgoKICAgICAgICBUaGUgZXJyb3IgbWFzayBpcyBhIHNpbmdsZSBpbnRlZ2VyIHRoYXQgaG9sZHMgdGhlIHRyZWF0bWVudCBpbmZvcm1hdGlvbgogICAgICAgIG9uIGFsbCBmb3VyIGZsb2F0aW5nIHBvaW50IGVycm9ycy4gVGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIGVycm9yIHR5cGUKICAgICAgICBpcyBjb250YWluZWQgaW4gdGhyZWUgYml0cyBvZiB0aGUgaW50ZWdlci4gSWYgd2UgcHJpbnQgaXQgaW4gYmFzZSA4LCB3ZQogICAgICAgIGNhbiBzZWUgd2hhdCB0cmVhdG1lbnQgaXMgc2V0IGZvciAiaW52YWxpZCIsICJ1bmRlciIsICJvdmVyIiwgYW5kCiAgICAgICAgImRpdmlkZSIgKGluIHRoYXQgb3JkZXIpLiBUaGUgcHJpbnRlZCBzdHJpbmcgY2FuIGJlIGludGVycHJldGVkIHdpdGgKCiAgICAgICAgKiAwIDogJ2lnbm9yZScKICAgICAgICAqIDEgOiAnd2FybicKICAgICAgICAqIDIgOiAncmFpc2UnCiAgICAgICAgKiAzIDogJ2NhbGwnCiAgICAgICAgKiA0IDogJ3ByaW50JwogICAgICAgICogNSA6ICdsb2cnCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBnZXRlcnJvYmosIHNldGVyciwgZ2V0ZXJyLCBzZXRlcnJjYWxsLCBnZXRlcnJjYWxsCiAgICBnZXRidWZzaXplLCBzZXRidWZzaXplCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBGb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgdHlwZXMgb2YgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucyBhbmQKICAgIHRyZWF0bWVudCBvcHRpb25zLCBzZWUgYHNldGVycmAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gb2xkX2Vycm9iaiA9IG5wLmdldGVycm9iaigpICAjIGZpcnN0IGdldCB0aGUgZGVmYXVsdHMKICAgID4+PiBvbGRfZXJyb2JqCiAgICBbMTAwMDAsIDAsIE5vbmVdCgogICAgPj4+IGRlZiBlcnJfaGFuZGxlcih0eXBlLCBmbGFnKToKICAgIC4uLiAgICAgcHJpbnQoIkZsb2F0aW5nIHBvaW50IGVycm9yICglcyksIHdpdGggZmxhZyAlcyIgJSAodHlwZSwgZmxhZykpCiAgICAuLi4KICAgID4+PiBuZXdfZXJyb2JqID0gWzIwMDAwLCAxMiwgZXJyX2hhbmRsZXJdCiAgICA+Pj4gbnAuc2V0ZXJyb2JqKG5ld19lcnJvYmopCiAgICA+Pj4gbnAuYmFzZV9yZXByKDEyLCA4KSAgIyBpbnQgZm9yIGRpdmlkZT00ICgncHJpbnQnKSBhbmQgb3Zlcj0xICgnd2FybicpCiAgICAnMTQnCiAgICA+Pj4gbnAuZ2V0ZXJyKCkKICAgIHsnb3Zlcic6ICd3YXJuJywgJ2RpdmlkZSc6ICdwcmludCcsICdpbnZhbGlkJzogJ2lnbm9yZScsICd1bmRlcic6ICdpZ25vcmUnfQogICAgPj4+IG5wLmdldGVycmNhbGwoKSBpcyBlcnJfaGFuZGxlcgogICAgVHJ1ZQoKICAgIFoIZGlnaXRpemVhmQoAAAogICAgZGlnaXRpemUoeCwgYmlucywgcmlnaHQ9RmFsc2UpCgogICAgUmV0dXJuIHRoZSBpbmRpY2VzIG9mIHRoZSBiaW5zIHRvIHdoaWNoIGVhY2ggdmFsdWUgaW4gaW5wdXQgYXJyYXkgYmVsb25ncy4KCiAgICBFYWNoIGluZGV4IGBgaWBgIHJldHVybmVkIGlzIHN1Y2ggdGhhdCBgYGJpbnNbaS0xXSA8PSB4IDwgYmluc1tpXWBgIGlmCiAgICBgYmluc2AgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLCBvciBgYGJpbnNbaS0xXSA+IHggPj0gYmluc1tpXWBgIGlmCiAgICBgYmluc2AgaXMgbW9ub3RvbmljYWxseSBkZWNyZWFzaW5nLiBJZiB2YWx1ZXMgaW4gYHhgIGFyZSBiZXlvbmQgdGhlCiAgICBib3VuZHMgb2YgYGJpbnNgLCAwIG9yIGBgbGVuKGJpbnMpYGAgaXMgcmV0dXJuZWQgYXMgYXBwcm9wcmlhdGUuIElmIHJpZ2h0CiAgICBpcyBUcnVlLCB0aGVuIHRoZSByaWdodCBiaW4gaXMgY2xvc2VkIHNvIHRoYXQgdGhlIGluZGV4IGBgaWBgIGlzIHN1Y2gKICAgIHRoYXQgYGBiaW5zW2ktMV0gPCB4IDw9IGJpbnNbaV1gYCBvciBgYGJpbnNbaS0xXSA+PSB4ID4gYmluc1tpXWBgIGlmIGBiaW5zYAogICAgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcsIHJlc3BlY3RpdmVseS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4IDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5IHRvIGJlIGJpbm5lZC4gUHJpb3IgdG8gTnVtUHkgMS4xMC4wLCB0aGlzIGFycmF5IGhhZCB0bwogICAgICAgIGJlIDEtZGltZW5zaW9uYWwsIGJ1dCBjYW4gbm93IGhhdmUgYW55IHNoYXBlLgogICAgYmlucyA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiBiaW5zLiBJdCBoYXMgdG8gYmUgMS1kaW1lbnNpb25hbCBhbmQgbW9ub3RvbmljLgogICAgcmlnaHQgOiBib29sLCBvcHRpb25hbAogICAgICAgIEluZGljYXRpbmcgd2hldGhlciB0aGUgaW50ZXJ2YWxzIGluY2x1ZGUgdGhlIHJpZ2h0IG9yIHRoZSBsZWZ0IGJpbgogICAgICAgIGVkZ2UuIERlZmF1bHQgYmVoYXZpb3IgaXMgKHJpZ2h0PT1GYWxzZSkgaW5kaWNhdGluZyB0aGF0IHRoZSBpbnRlcnZhbAogICAgICAgIGRvZXMgbm90IGluY2x1ZGUgdGhlIHJpZ2h0IGVkZ2UuIFRoZSBsZWZ0IGJpbiBlbmQgaXMgb3BlbiBpbiB0aGlzCiAgICAgICAgY2FzZSwgaS5lLiwgYmluc1tpLTFdIDw9IHggPCBiaW5zW2ldIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvcgogICAgICAgIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBiaW5zLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkgb2YgaW50cwogICAgICAgIE91dHB1dCBhcnJheSBvZiBpbmRpY2VzLCBvZiBzYW1lIHNoYXBlIGFzIGB4YC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIGBiaW5zYCBpcyBub3QgbW9ub3RvbmljLgogICAgVHlwZUVycm9yCiAgICAgICAgSWYgdGhlIHR5cGUgb2YgdGhlIGlucHV0IGlzIGNvbXBsZXguCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBiaW5jb3VudCwgaGlzdG9ncmFtLCB1bmlxdWUsIHNlYXJjaHNvcnRlZAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgSWYgdmFsdWVzIGluIGB4YCBhcmUgc3VjaCB0aGF0IHRoZXkgZmFsbCBvdXRzaWRlIHRoZSBiaW4gcmFuZ2UsCiAgICBhdHRlbXB0aW5nIHRvIGluZGV4IGBiaW5zYCB3aXRoIHRoZSBpbmRpY2VzIHRoYXQgYGRpZ2l0aXplYCByZXR1cm5zCiAgICB3aWxsIHJlc3VsdCBpbiBhbiBJbmRleEVycm9yLgoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTAuMAoKICAgIGBucC5kaWdpdGl6ZWAgaXMgIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIGBucC5zZWFyY2hzb3J0ZWRgLiBUaGlzIG1lYW5zCiAgICB0aGF0IGEgYmluYXJ5IHNlYXJjaCBpcyB1c2VkIHRvIGJpbiB0aGUgdmFsdWVzLCB3aGljaCBzY2FsZXMgbXVjaCBiZXR0ZXIKICAgIGZvciBsYXJnZXIgbnVtYmVyIG9mIGJpbnMgdGhhbiB0aGUgcHJldmlvdXMgbGluZWFyIHNlYXJjaC4gSXQgYWxzbyByZW1vdmVzCiAgICB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBpbnB1dCBhcnJheSB0byBiZSAxLWRpbWVuc2lvbmFsLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbMC4yLCA2LjQsIDMuMCwgMS42XSkKICAgID4+PiBiaW5zID0gbnAuYXJyYXkoWzAuMCwgMS4wLCAyLjUsIDQuMCwgMTAuMF0pCiAgICA+Pj4gaW5kcyA9IG5wLmRpZ2l0aXplKHgsIGJpbnMpCiAgICA+Pj4gaW5kcwogICAgYXJyYXkoWzEsIDQsIDMsIDJdKQogICAgPj4+IGZvciBuIGluIHJhbmdlKHguc2l6ZSk6CiAgICAuLi4gICBwcmludChiaW5zW2luZHNbbl0tMV0sICI8PSIsIHhbbl0sICI8IiwgYmluc1tpbmRzW25dXSkKICAgIC4uLgogICAgMC4wIDw9IDAuMiA8IDEuMAogICAgNC4wIDw9IDYuNCA8IDEwLjAKICAgIDIuNSA8PSAzLjAgPCA0LjAKICAgIDEuMCA8PSAxLjYgPCAyLjUKCiAgICA+Pj4geCA9IG5wLmFycmF5KFsxLjIsIDEwLjAsIDEyLjQsIDE1LjUsIDIwLl0pCiAgICA+Pj4gYmlucyA9IG5wLmFycmF5KFswLCA1LCAxMCwgMTUsIDIwXSkKICAgID4+PiBucC5kaWdpdGl6ZSh4LGJpbnMscmlnaHQ9VHJ1ZSkKICAgIGFycmF5KFsxLCAyLCAzLCA0LCA0XSkKICAgID4+PiBucC5kaWdpdGl6ZSh4LGJpbnMscmlnaHQ9RmFsc2UpCiAgICBhcnJheShbMSwgMywgMywgNCwgNV0pCiAgICBaCGJpbmNvdW50YcIIAAAKICAgIGJpbmNvdW50KHgsIHdlaWdodHM9Tm9uZSwgbWlubGVuZ3RoPTApCgogICAgQ291bnQgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIGVhY2ggdmFsdWUgaW4gYXJyYXkgb2Ygbm9uLW5lZ2F0aXZlIGludHMuCgogICAgVGhlIG51bWJlciBvZiBiaW5zIChvZiBzaXplIDEpIGlzIG9uZSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCB2YWx1ZSBpbgogICAgYHhgLiBJZiBgbWlubGVuZ3RoYCBpcyBzcGVjaWZpZWQsIHRoZXJlIHdpbGwgYmUgYXQgbGVhc3QgdGhpcyBudW1iZXIKICAgIG9mIGJpbnMgaW4gdGhlIG91dHB1dCBhcnJheSAodGhvdWdoIGl0IHdpbGwgYmUgbG9uZ2VyIGlmIG5lY2Vzc2FyeSwKICAgIGRlcGVuZGluZyBvbiB0aGUgY29udGVudHMgb2YgYHhgKS4KICAgIEVhY2ggYmluIGdpdmVzIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgaXRzIGluZGV4IHZhbHVlIGluIGB4YC4KICAgIElmIGB3ZWlnaHRzYCBpcyBzcGVjaWZpZWQgdGhlIGlucHV0IGFycmF5IGlzIHdlaWdodGVkIGJ5IGl0LCBpLmUuIGlmIGEKICAgIHZhbHVlIGBgbmBgIGlzIGZvdW5kIGF0IHBvc2l0aW9uIGBgaWBgLCBgYG91dFtuXSArPSB3ZWlnaHRbaV1gYCBpbnN0ZWFkCiAgICBvZiBgYG91dFtuXSArPSAxYGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCA6IGFycmF5X2xpa2UsIDEgZGltZW5zaW9uLCBub25uZWdhdGl2ZSBpbnRzCiAgICAgICAgSW5wdXQgYXJyYXkuCiAgICB3ZWlnaHRzIDogYXJyYXlfbGlrZSwgb3B0aW9uYWwKICAgICAgICBXZWlnaHRzLCBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSBhcyBgeGAuCiAgICBtaW5sZW5ndGggOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQSBtaW5pbXVtIG51bWJlciBvZiBiaW5zIGZvciB0aGUgb3V0cHV0IGFycmF5LgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjYuMAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkgb2YgaW50cwogICAgICAgIFRoZSByZXN1bHQgb2YgYmlubmluZyB0aGUgaW5wdXQgYXJyYXkuCiAgICAgICAgVGhlIGxlbmd0aCBvZiBgb3V0YCBpcyBlcXVhbCB0byBgYG5wLmFtYXgoeCkrMWBgLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgdGhlIGlucHV0IGlzIG5vdCAxLWRpbWVuc2lvbmFsLCBvciBjb250YWlucyBlbGVtZW50cyB3aXRoIG5lZ2F0aXZlCiAgICAgICAgdmFsdWVzLCBvciBpZiBgbWlubGVuZ3RoYCBpcyBuZWdhdGl2ZS4KICAgIFR5cGVFcnJvcgogICAgICAgIElmIHRoZSB0eXBlIG9mIHRoZSBpbnB1dCBpcyBmbG9hdCBvciBjb21wbGV4LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgaGlzdG9ncmFtLCBkaWdpdGl6ZSwgdW5pcXVlCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuYmluY291bnQobnAuYXJhbmdlKDUpKQogICAgYXJyYXkoWzEsIDEsIDEsIDEsIDFdKQogICAgPj4+IG5wLmJpbmNvdW50KG5wLmFycmF5KFswLCAxLCAxLCAzLCAyLCAxLCA3XSkpCiAgICBhcnJheShbMSwgMywgMSwgMSwgMCwgMCwgMCwgMV0pCgogICAgPj4+IHggPSBucC5hcnJheShbMCwgMSwgMSwgMywgMiwgMSwgNywgMjNdKQogICAgPj4+IG5wLmJpbmNvdW50KHgpLnNpemUgPT0gbnAuYW1heCh4KSsxCiAgICBUcnVlCgogICAgVGhlIGlucHV0IGFycmF5IG5lZWRzIHRvIGJlIG9mIGludGVnZXIgZHR5cGUsIG90aGVyd2lzZSBhCiAgICBUeXBlRXJyb3IgaXMgcmFpc2VkOgoKICAgID4+PiBucC5iaW5jb3VudChucC5hcmFuZ2UoNSwgZHR5cGU9bnAuZmxvYXQpKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgVHlwZUVycm9yOiBhcnJheSBjYW5ub3QgYmUgc2FmZWx5IGNhc3QgdG8gcmVxdWlyZWQgdHlwZQoKICAgIEEgcG9zc2libGUgdXNlIG9mIGBgYmluY291bnRgYCBpcyB0byBwZXJmb3JtIHN1bXMgb3ZlcgogICAgdmFyaWFibGUtc2l6ZSBjaHVua3Mgb2YgYW4gYXJyYXksIHVzaW5nIHRoZSBgYHdlaWdodHNgYCBrZXl3b3JkLgoKICAgID4+PiB3ID0gbnAuYXJyYXkoWzAuMywgMC41LCAwLjIsIDAuNywgMS4sIC0wLjZdKSAjIHdlaWdodHMKICAgID4+PiB4ID0gbnAuYXJyYXkoWzAsIDEsIDEsIDIsIDIsIDJdKQogICAgPj4+IG5wLmJpbmNvdW50KHgsICB3ZWlnaHRzPXcpCiAgICBhcnJheShbIDAuMywgIDAuNywgIDEuMV0pCgogICAgWhFyYXZlbF9tdWx0aV9pbmRleGGbBgAACiAgICByYXZlbF9tdWx0aV9pbmRleChtdWx0aV9pbmRleCwgZGltcywgbW9kZT0ncmFpc2UnLCBvcmRlcj0nQycpCgogICAgQ29udmVydHMgYSB0dXBsZSBvZiBpbmRleCBhcnJheXMgaW50byBhbiBhcnJheSBvZiBmbGF0CiAgICBpbmRpY2VzLCBhcHBseWluZyBib3VuZGFyeSBtb2RlcyB0byB0aGUgbXVsdGktaW5kZXguCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgbXVsdGlfaW5kZXggOiB0dXBsZSBvZiBhcnJheV9saWtlCiAgICAgICAgQSB0dXBsZSBvZiBpbnRlZ2VyIGFycmF5cywgb25lIGFycmF5IGZvciBlYWNoIGRpbWVuc2lvbi4KICAgIGRpbXMgOiB0dXBsZSBvZiBpbnRzCiAgICAgICAgVGhlIHNoYXBlIG9mIGFycmF5IGludG8gd2hpY2ggdGhlIGluZGljZXMgZnJvbSBgYG11bHRpX2luZGV4YGAgYXBwbHkuCiAgICBtb2RlIDogeydyYWlzZScsICd3cmFwJywgJ2NsaXAnfSwgb3B0aW9uYWwKICAgICAgICBTcGVjaWZpZXMgaG93IG91dC1vZi1ib3VuZHMgaW5kaWNlcyBhcmUgaGFuZGxlZC4gIENhbiBzcGVjaWZ5CiAgICAgICAgZWl0aGVyIG9uZSBtb2RlIG9yIGEgdHVwbGUgb2YgbW9kZXMsIG9uZSBtb2RlIHBlciBpbmRleC4KCiAgICAgICAgKiAncmFpc2UnIC0tIHJhaXNlIGFuIGVycm9yIChkZWZhdWx0KQogICAgICAgICogJ3dyYXAnIC0tIHdyYXAgYXJvdW5kCiAgICAgICAgKiAnY2xpcCcgLS0gY2xpcCB0byB0aGUgcmFuZ2UKCiAgICAgICAgSW4gJ2NsaXAnIG1vZGUsIGEgbmVnYXRpdmUgaW5kZXggd2hpY2ggd291bGQgbm9ybWFsbHkKICAgICAgICB3cmFwIHdpbGwgY2xpcCB0byAwIGluc3RlYWQuCiAgICBvcmRlciA6IHsnQycsICdGJ30sIG9wdGlvbmFsCiAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtdWx0aS1pbmRleCBzaG91bGQgYmUgdmlld2VkIGFzCiAgICAgICAgaW5kZXhpbmcgaW4gcm93LW1ham9yIChDLXN0eWxlKSBvciBjb2x1bW4tbWFqb3IKICAgICAgICAoRm9ydHJhbi1zdHlsZSkgb3JkZXIuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgcmF2ZWxlZF9pbmRpY2VzIDogbmRhcnJheQogICAgICAgIEFuIGFycmF5IG9mIGluZGljZXMgaW50byB0aGUgZmxhdHRlbmVkIHZlcnNpb24gb2YgYW4gYXJyYXkKICAgICAgICBvZiBkaW1lbnNpb25zIGBgZGltc2BgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgdW5yYXZlbF9pbmRleAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgLi4gdmVyc2lvbmFkZGVkOjogMS42LjAKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhcnIgPSBucC5hcnJheShbWzMsNiw2XSxbNCw1LDFdXSkKICAgID4+PiBucC5yYXZlbF9tdWx0aV9pbmRleChhcnIsICg3LDYpKQogICAgYXJyYXkoWzIyLCA0MSwgMzddKQogICAgPj4+IG5wLnJhdmVsX211bHRpX2luZGV4KGFyciwgKDcsNiksIG9yZGVyPSdGJykKICAgIGFycmF5KFszMSwgNDEsIDEzXSkKICAgID4+PiBucC5yYXZlbF9tdWx0aV9pbmRleChhcnIsICg0LDYpLCBtb2RlPSdjbGlwJykKICAgIGFycmF5KFsyMiwgMjMsIDE5XSkKICAgID4+PiBucC5yYXZlbF9tdWx0aV9pbmRleChhcnIsICg0LDQpLCBtb2RlPSgnY2xpcCcsJ3dyYXAnKSkKICAgIGFycmF5KFsxMiwgMTMsIDEzXSkKCiAgICA+Pj4gbnAucmF2ZWxfbXVsdGlfaW5kZXgoKDMsMSw0LDEpLCAoNiw3LDgsOSkpCiAgICAxNjIxCiAgICBaDXVucmF2ZWxfaW5kZXhhiQQAAAogICAgdW5yYXZlbF9pbmRleChpbmRpY2VzLCBkaW1zLCBvcmRlcj0nQycpCgogICAgQ29udmVydHMgYSBmbGF0IGluZGV4IG9yIGFycmF5IG9mIGZsYXQgaW5kaWNlcyBpbnRvIGEgdHVwbGUKICAgIG9mIGNvb3JkaW5hdGUgYXJyYXlzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGluZGljZXMgOiBhcnJheV9saWtlCiAgICAgICAgQW4gaW50ZWdlciBhcnJheSB3aG9zZSBlbGVtZW50cyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBmbGF0dGVuZWQKICAgICAgICB2ZXJzaW9uIG9mIGFuIGFycmF5IG9mIGRpbWVuc2lvbnMgYGBkaW1zYGAuIEJlZm9yZSB2ZXJzaW9uIDEuNi4wLAogICAgICAgIHRoaXMgZnVuY3Rpb24gYWNjZXB0ZWQganVzdCBvbmUgaW5kZXggdmFsdWUuCiAgICBkaW1zIDogdHVwbGUgb2YgaW50cwogICAgICAgIFRoZSBzaGFwZSBvZiB0aGUgYXJyYXkgdG8gdXNlIGZvciB1bnJhdmVsaW5nIGBgaW5kaWNlc2BgLgogICAgb3JkZXIgOiB7J0MnLCAnRid9LCBvcHRpb25hbAogICAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUgaW5kaWNlcyBzaG91bGQgYmUgdmlld2VkIGFzIGluZGV4aW5nIGluCiAgICAgICAgcm93LW1ham9yIChDLXN0eWxlKSBvciBjb2x1bW4tbWFqb3IgKEZvcnRyYW4tc3R5bGUpIG9yZGVyLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjYuMAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHVucmF2ZWxlZF9jb29yZHMgOiB0dXBsZSBvZiBuZGFycmF5CiAgICAgICAgRWFjaCBhcnJheSBpbiB0aGUgdHVwbGUgaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBgYGluZGljZXNgYAogICAgICAgIGFycmF5LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcmF2ZWxfbXVsdGlfaW5kZXgKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC51bnJhdmVsX2luZGV4KFsyMiwgNDEsIDM3XSwgKDcsNikpCiAgICAoYXJyYXkoWzMsIDYsIDZdKSwgYXJyYXkoWzQsIDUsIDFdKSkKICAgID4+PiBucC51bnJhdmVsX2luZGV4KFszMSwgNDEsIDEzXSwgKDcsNiksIG9yZGVyPSdGJykKICAgIChhcnJheShbMywgNiwgNl0pLCBhcnJheShbNCwgNSwgMV0pKQoKICAgID4+PiBucC51bnJhdmVsX2luZGV4KDE2MjEsICg2LDcsOCw5KSkKICAgICgzLCAxLCA0LCAxKQoKICAgIFoNYWRkX2RvY3N0cmluZ3r0CiAgICBhZGRfZG9jc3RyaW5nKG9iaiwgZG9jc3RyaW5nKQoKICAgIEFkZCBhIGRvY3N0cmluZyB0byBhIGJ1aWx0LWluIG9iaiBpZiBwb3NzaWJsZS4KICAgIElmIHRoZSBvYmogYWxyZWFkeSBoYXMgYSBkb2NzdHJpbmcgcmFpc2UgYSBSdW50aW1lRXJyb3IKICAgIElmIHRoaXMgcm91dGluZSBkb2VzIG5vdCBrbm93IGhvdyB0byBhZGQgYSBkb2NzdHJpbmcgdG8gdGhlIG9iamVjdAogICAgcmFpc2UgYSBUeXBlRXJyb3IKICAgIFoRX2FkZF9uZXdkb2NfdWZ1bmNhSQMAAAogICAgYWRkX3VmdW5jX2RvY3N0cmluZyh1ZnVuYywgbmV3X2RvY3N0cmluZykKCiAgICBSZXBsYWNlIHRoZSBkb2NzdHJpbmcgZm9yIGEgdWZ1bmMgd2l0aCBuZXdfZG9jc3RyaW5nLgogICAgVGhpcyBtZXRob2Qgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGN1cnJlbnQgZG9jc3RyaW5nIGZvcgogICAgdGhlIHVmdW5jIGlzIE5VTEwuIChBdCB0aGUgQyBsZXZlbCwgaS5lLiB3aGVuIHVmdW5jLT5kb2MgaXMgTlVMTC4pCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgdWZ1bmMgOiBudW1weS51ZnVuYwogICAgICAgIEEgdWZ1bmMgd2hvc2UgY3VycmVudCBkb2MgaXMgTlVMTC4KICAgIG5ld19kb2NzdHJpbmcgOiBzdHJpbmcKICAgICAgICBUaGUgbmV3IGRvY3N0cmluZyBmb3IgdGhlIHVmdW5jLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhpcyBtZXRob2QgYWxsb2NhdGVzIG1lbW9yeSBmb3IgbmV3X2RvY3N0cmluZyBvbgogICAgdGhlIGhlYXAuIFRlY2huaWNhbGx5IHRoaXMgY3JlYXRlcyBhIG1lbXBvcnkgbGVhaywgc2luY2UgdGhpcwogICAgbWVtb3J5IHdpbGwgbm90IGJlIHJlY2xhaW1lZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtCiAgICBldmVuIGlmIHRoZSB1ZnVuYyBpdHNlbGYgaXMgcmVtb3ZlZC4gSG93ZXZlciB0aGlzIHdpbGwgb25seQogICAgYmUgYSBwcm9ibGVtIGlmIHRoZSB1c2VyIGlzIHJlcGVhdGVkbHkgY3JlYXRpbmcgdWZ1bmNzIHdpdGgKICAgIG5vIGRvY3VtZW50YXRpb24sIGFkZGluZyBkb2N1bWVudGF0aW9uIHZpYSBhZGRfbmV3ZG9jX3VmdW5jLAogICAgYW5kIHRoZW4gdGhyb3dpbmcgYXdheSB0aGUgdWZ1bmMuCiAgICBaCHBhY2tiaXRzYQEFAAAKICAgIHBhY2tiaXRzKG15YXJyYXksIGF4aXM9Tm9uZSkKCiAgICBQYWNrcyB0aGUgZWxlbWVudHMgb2YgYSBiaW5hcnktdmFsdWVkIGFycmF5IGludG8gYml0cyBpbiBhIHVpbnQ4IGFycmF5LgoKICAgIFRoZSByZXN1bHQgaXMgcGFkZGVkIHRvIGZ1bGwgYnl0ZXMgYnkgaW5zZXJ0aW5nIHplcm8gYml0cyBhdCB0aGUgZW5kLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG15YXJyYXkgOiBhcnJheV9saWtlCiAgICAgICAgQW4gYXJyYXkgb2YgaW50ZWdlcnMgb3IgYm9vbGVhbnMgd2hvc2UgZWxlbWVudHMgc2hvdWxkIGJlIHBhY2tlZCB0bwogICAgICAgIGJpdHMuCiAgICBheGlzIDogaW50LCBvcHRpb25hbAogICAgICAgIFRoZSBkaW1lbnNpb24gb3ZlciB3aGljaCBiaXQtcGFja2luZyBpcyBkb25lLgogICAgICAgIGBgTm9uZWBgIGltcGxpZXMgcGFja2luZyB0aGUgZmxhdHRlbmVkIGFycmF5LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHBhY2tlZCA6IG5kYXJyYXkKICAgICAgICBBcnJheSBvZiB0eXBlIHVpbnQ4IHdob3NlIGVsZW1lbnRzIHJlcHJlc2VudCBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCiAgICAgICAgbG9naWNhbCAoMCBvciBub256ZXJvKSB2YWx1ZSBvZiB0aGUgaW5wdXQgZWxlbWVudHMuIFRoZSBzaGFwZSBvZgogICAgICAgIGBwYWNrZWRgIGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQgKHVubGVzcyBgYXhpc2AKICAgICAgICBpcyBOb25lLCBpbiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgaXMgMS1EKS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHVucGFja2JpdHM6IFVucGFja3MgZWxlbWVudHMgb2YgYSB1aW50OCBhcnJheSBpbnRvIGEgYmluYXJ5LXZhbHVlZCBvdXRwdXQKICAgICAgICAgICAgICAgIGFycmF5LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcnJheShbW1sxLDAsMV0sCiAgICAuLi4gICAgICAgICAgICAgICAgWzAsMSwwXV0sCiAgICAuLi4gICAgICAgICAgICAgICBbWzEsMSwwXSwKICAgIC4uLiAgICAgICAgICAgICAgICBbMCwwLDFdXV0pCiAgICA+Pj4gYiA9IG5wLnBhY2tiaXRzKGEsIGF4aXM9LTEpCiAgICA+Pj4gYgogICAgYXJyYXkoW1tbMTYwXSxbNjRdXSxbWzE5Ml0sWzMyXV1dLCBkdHlwZT11aW50OCkKCiAgICBOb3RlIHRoYXQgaW4gYmluYXJ5IDE2MCA9IDEwMTAgMDAwMCwgNjQgPSAwMTAwIDAwMDAsIDE5MiA9IDExMDAgMDAwMCwKICAgIGFuZCAzMiA9IDAwMTAgMDAwMC4KCiAgICBaCnVucGFja2JpdHNhRwQAAAogICAgdW5wYWNrYml0cyhteWFycmF5LCBheGlzPU5vbmUpCgogICAgVW5wYWNrcyBlbGVtZW50cyBvZiBhIHVpbnQ4IGFycmF5IGludG8gYSBiaW5hcnktdmFsdWVkIG91dHB1dCBhcnJheS4KCiAgICBFYWNoIGVsZW1lbnQgb2YgYG15YXJyYXlgIHJlcHJlc2VudHMgYSBiaXQtZmllbGQgdGhhdCBzaG91bGQgYmUgdW5wYWNrZWQKICAgIGludG8gYSBiaW5hcnktdmFsdWVkIG91dHB1dCBhcnJheS4gVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgZWl0aGVyCiAgICAxLUQgKGlmIGBheGlzYCBpcyBOb25lKSBvciB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgaW5wdXQgYXJyYXkgd2l0aCB1bnBhY2tpbmcKICAgIGRvbmUgYWxvbmcgdGhlIGF4aXMgc3BlY2lmaWVkLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG15YXJyYXkgOiBuZGFycmF5LCB1aW50OCB0eXBlCiAgICAgICBJbnB1dCBhcnJheS4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICBVbnBhY2tzIGFsb25nIHRoaXMgYXhpcy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB1bnBhY2tlZCA6IG5kYXJyYXksIHVpbnQ4IHR5cGUKICAgICAgIFRoZSBlbGVtZW50cyBhcmUgYmluYXJ5LXZhbHVlZCAoMCBvciAxKS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHBhY2tiaXRzIDogUGFja3MgdGhlIGVsZW1lbnRzIG9mIGEgYmluYXJ5LXZhbHVlZCBhcnJheSBpbnRvIGJpdHMgaW4gYSB1aW50OAogICAgICAgICAgICAgICBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuYXJyYXkoW1syXSwgWzddLCBbMjNdXSwgZHR5cGU9bnAudWludDgpCiAgICA+Pj4gYQogICAgYXJyYXkoW1sgMl0sCiAgICAgICAgICAgWyA3XSwKICAgICAgICAgICBbMjNdXSwgZHR5cGU9dWludDgpCiAgICA+Pj4gYiA9IG5wLnVucGFja2JpdHMoYSwgYXhpcz0xKQogICAgPj4+IGIKICAgIGFycmF5KFtbMCwgMCwgMCwgMCwgMCwgMCwgMSwgMF0sCiAgICAgICAgICAgWzAsIDAsIDAsIDAsIDAsIDEsIDEsIDFdLAogICAgICAgICAgIFswLCAwLCAwLCAxLCAwLCAxLCAxLCAxXV0sIGR0eXBlPXVpbnQ4KQoKICAgIFoFdWZ1bmNh4QYAAAogICAgRnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBlbGVtZW50IGJ5IGVsZW1lbnQgb24gd2hvbGUgYXJyYXlzLgoKICAgIFRvIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBzcGVjaWZpYyB1ZnVuYywgdXNlIGBpbmZvYC4gIEZvcgogICAgZXhhbXBsZSwgYGBucC5pbmZvKG5wLnNpbilgYC4gIEJlY2F1c2UgdWZ1bmNzIGFyZSB3cml0dGVuIGluIEMKICAgIChmb3Igc3BlZWQpIGFuZCBsaW5rZWQgaW50byBQeXRob24gd2l0aCBOdW1QeSdzIHVmdW5jIGZhY2lsaXR5LAogICAgUHl0aG9uJ3MgaGVscCgpIGZ1bmN0aW9uIGZpbmRzIHRoaXMgcGFnZSB3aGVuZXZlciBoZWxwKCkgaXMgY2FsbGVkCiAgICBvbiBhIHVmdW5jLgoKICAgIEEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdWZ1bmNzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZG9jcyBmb3IgOnJlZjpgdWZ1bmNzYC4KCiAgICBDYWxsaW5nIHVmdW5jczoKICAgID09PT09PT09PT09PT09PQoKICAgIG9wKCp4Wywgb3V0XSwgd2hlcmU9VHJ1ZSwgKiprd2FyZ3MpCiAgICBBcHBseSBgb3BgIHRvIHRoZSBhcmd1bWVudHMgYCp4YCBlbGVtZW50d2lzZSwgYnJvYWRjYXN0aW5nIHRoZSBhcmd1bWVudHMuCgogICAgVGhlIGJyb2FkY2FzdGluZyBydWxlcyBhcmU6CgogICAgKiBEaW1lbnNpb25zIG9mIGxlbmd0aCAxIG1heSBiZSBwcmVwZW5kZWQgdG8gZWl0aGVyIGFycmF5LgogICAgKiBBcnJheXMgbWF5IGJlIHJlcGVhdGVkIGFsb25nIGRpbWVuc2lvbnMgb2YgbGVuZ3RoIDEuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgKnggOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXlzLgogICAgb3V0IDogbmRhcnJheSwgTm9uZSwgb3IgdHVwbGUgb2YgbmRhcnJheSBhbmQgTm9uZSwgb3B0aW9uYWwKICAgICAgICBBbHRlcm5hdGUgYXJyYXkgb2JqZWN0KHMpIGluIHdoaWNoIHRvIHB1dCB0aGUgcmVzdWx0OyBpZiBwcm92aWRlZCwgaXQKICAgICAgICBtdXN0IGhhdmUgYSBzaGFwZSB0aGF0IHRoZSBpbnB1dHMgYnJvYWRjYXN0IHRvLiBBIHR1cGxlIG9mIGFycmF5cwogICAgICAgIChwb3NzaWJsZSBvbmx5IGFzIGEga2V5d29yZCBhcmd1bWVudCkgbXVzdCBoYXZlIGxlbmd0aCBlcXVhbCB0byB0aGUKICAgICAgICBudW1iZXIgb2Ygb3V0cHV0czsgdXNlIGBOb25lYCBmb3Igb3V0cHV0cyB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIHVmdW5jLgogICAgd2hlcmUgOiBhcnJheV9saWtlLCBvcHRpb25hbAogICAgICAgIFZhbHVlcyBvZiBUcnVlIGluZGljYXRlIHRvIGNhbGN1bGF0ZSB0aGUgdWZ1bmMgYXQgdGhhdCBwb3NpdGlvbiwgdmFsdWVzCiAgICAgICAgb2YgRmFsc2UgaW5kaWNhdGUgdG8gbGVhdmUgdGhlIHZhbHVlIGluIHRoZSBvdXRwdXQgYWxvbmUuCiAgICAqKmt3YXJncwogICAgICAgIEZvciBvdGhlciBrZXl3b3JkLW9ubHkgYXJndW1lbnRzLCBzZWUgdGhlIDpyZWY6YHVmdW5jIGRvY3MgPHVmdW5jcy5rd2FyZ3M+YC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByIDogbmRhcnJheSBvciB0dXBsZSBvZiBuZGFycmF5CiAgICAgICAgYHJgIHdpbGwgaGF2ZSB0aGUgc2hhcGUgdGhhdCB0aGUgYXJyYXlzIGluIGB4YCBicm9hZGNhc3QgdG87IGlmIGBvdXRgIGlzCiAgICAgICAgcHJvdmlkZWQsIGByYCB3aWxsIGJlIGVxdWFsIHRvIGBvdXRgLiBJZiB0aGUgZnVuY3Rpb24gaGFzIG1vcmUgdGhhbiBvbmUKICAgICAgICBvdXRwdXQsIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlIGEgdHVwbGUgb2YgYXJyYXlzLgoKICAgICkC2ghpZGVudGl0eWFEAQAACiAgICBUaGUgaWRlbnRpdHkgdmFsdWUuCgogICAgRGF0YSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgaWRlbnRpdHkgZWxlbWVudCBmb3IgdGhlIHVmdW5jLCBpZiBpdCBoYXMgb25lLgogICAgSWYgaXQgZG9lcyBub3QsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgTm9uZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5hZGQuaWRlbnRpdHkKICAgIDAKICAgID4+PiBucC5tdWx0aXBseS5pZGVudGl0eQogICAgMQogICAgPj4+IG5wLnBvd2VyLmlkZW50aXR5CiAgICAxCiAgICA+Pj4gcHJpbnQobnAuZXhwLmlkZW50aXR5KQogICAgTm9uZQogICAgKQLaBW5hcmdzYakBAAAKICAgIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgoKICAgIERhdGEgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIHVmdW5jIHRha2VzLCBpbmNsdWRpbmcKICAgIG9wdGlvbmFsIG9uZXMuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUeXBpY2FsbHkgdGhpcyB2YWx1ZSB3aWxsIGJlIG9uZSBtb3JlIHRoYW4gd2hhdCB5b3UgbWlnaHQgZXhwZWN0IGJlY2F1c2UgYWxsCiAgICB1ZnVuY3MgdGFrZSAgdGhlIG9wdGlvbmFsICJvdXQiIGFyZ3VtZW50LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmFkZC5uYXJncwogICAgMwogICAgPj4+IG5wLm11bHRpcGx5Lm5hcmdzCiAgICAzCiAgICA+Pj4gbnAucG93ZXIubmFyZ3MKICAgIDMKICAgID4+PiBucC5leHAubmFyZ3MKICAgIDIKICAgICkC2gNuaW569wogICAgVGhlIG51bWJlciBvZiBpbnB1dHMuCgogICAgRGF0YSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgdWZ1bmMgdHJlYXRzIGFzIGlucHV0LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmFkZC5uaW4KICAgIDIKICAgID4+PiBucC5tdWx0aXBseS5uaW4KICAgIDIKICAgID4+PiBucC5wb3dlci5uaW4KICAgIDIKICAgID4+PiBucC5leHAubmluCiAgICAxCiAgICApAtoEbm91dGFlAQAACiAgICBUaGUgbnVtYmVyIG9mIG91dHB1dHMuCgogICAgRGF0YSBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgdWZ1bmMgdHJlYXRzIGFzIG91dHB1dC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFNpbmNlIGFsbCB1ZnVuY3MgY2FuIHRha2Ugb3V0cHV0IGFyZ3VtZW50cywgdGhpcyB3aWxsIGFsd2F5cyBiZSAoYXQgbGVhc3QpIDEuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuYWRkLm5vdXQKICAgIDEKICAgID4+PiBucC5tdWx0aXBseS5ub3V0CiAgICAxCiAgICA+Pj4gbnAucG93ZXIubm91dAogICAgMQogICAgPj4+IG5wLmV4cC5ub3V0CiAgICAxCgogICAgKQJaBm50eXBlc2F1AQAACiAgICBUaGUgbnVtYmVyIG9mIHR5cGVzLgoKICAgIFRoZSBudW1iZXIgb2YgbnVtZXJpY2FsIE51bVB5IHR5cGVzIC0gb2Ygd2hpY2ggdGhlcmUgYXJlIDE4IHRvdGFsIC0gb24gd2hpY2gKICAgIHRoZSB1ZnVuYyBjYW4gb3BlcmF0ZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LnVmdW5jLnR5cGVzCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuYWRkLm50eXBlcwogICAgMTgKICAgID4+PiBucC5tdWx0aXBseS5udHlwZXMKICAgIDE4CiAgICA+Pj4gbnAucG93ZXIubnR5cGVzCiAgICAxNwogICAgPj4+IG5wLmV4cC5udHlwZXMKICAgIDcKICAgID4+PiBucC5yZW1haW5kZXIubnR5cGVzCiAgICAxNAoKICAgICkC2gV0eXBlc2FcBAAACiAgICBSZXR1cm5zIGEgbGlzdCB3aXRoIHR5cGVzIGdyb3VwZWQgaW5wdXQtPm91dHB1dC4KCiAgICBEYXRhIGF0dHJpYnV0ZSBsaXN0aW5nIHRoZSBkYXRhLXR5cGUgIkRvbWFpbi1SYW5nZSIgZ3JvdXBpbmdzIHRoZSB1ZnVuYyBjYW4KICAgIGRlbGl2ZXIuIFRoZSBkYXRhLXR5cGVzIGFyZSBnaXZlbiB1c2luZyB0aGUgY2hhcmFjdGVyIGNvZGVzLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkudWZ1bmMubnR5cGVzCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuYWRkLnR5cGVzCiAgICBbJz8/LT4/JywgJ2JiLT5iJywgJ0JCLT5CJywgJ2hoLT5oJywgJ0hILT5IJywgJ2lpLT5pJywgJ0lJLT5JJywgJ2xsLT5sJywKICAgICdMTC0+TCcsICdxcS0+cScsICdRUS0+UScsICdmZi0+ZicsICdkZC0+ZCcsICdnZy0+ZycsICdGRi0+RicsICdERC0+RCcsCiAgICAnR0ctPkcnLCAnT08tPk8nXQoKICAgID4+PiBucC5tdWx0aXBseS50eXBlcwogICAgWyc/Py0+PycsICdiYi0+YicsICdCQi0+QicsICdoaC0+aCcsICdISC0+SCcsICdpaS0+aScsICdJSS0+SScsICdsbC0+bCcsCiAgICAnTEwtPkwnLCAncXEtPnEnLCAnUVEtPlEnLCAnZmYtPmYnLCAnZGQtPmQnLCAnZ2ctPmcnLCAnRkYtPkYnLCAnREQtPkQnLAogICAgJ0dHLT5HJywgJ09PLT5PJ10KCiAgICA+Pj4gbnAucG93ZXIudHlwZXMKICAgIFsnYmItPmInLCAnQkItPkInLCAnaGgtPmgnLCAnSEgtPkgnLCAnaWktPmknLCAnSUktPkknLCAnbGwtPmwnLCAnTEwtPkwnLAogICAgJ3FxLT5xJywgJ1FRLT5RJywgJ2ZmLT5mJywgJ2RkLT5kJywgJ2dnLT5nJywgJ0ZGLT5GJywgJ0RELT5EJywgJ0dHLT5HJywKICAgICdPTy0+TyddCgogICAgPj4+IG5wLmV4cC50eXBlcwogICAgWydmLT5mJywgJ2QtPmQnLCAnZy0+ZycsICdGLT5GJywgJ0QtPkQnLCAnRy0+RycsICdPLT5PJ10KCiAgICA+Pj4gbnAucmVtYWluZGVyLnR5cGVzCiAgICBbJ2JiLT5iJywgJ0JCLT5CJywgJ2hoLT5oJywgJ0hILT5IJywgJ2lpLT5pJywgJ0lJLT5JJywgJ2xsLT5sJywgJ0xMLT5MJywKICAgICdxcS0+cScsICdRUS0+UScsICdmZi0+ZicsICdkZC0+ZCcsICdnZy0+ZycsICdPTy0+TyddCgogICAgKQLaBnJlZHVjZWFRDAAACiAgICByZWR1Y2UoYSwgYXhpcz0wLCBkdHlwZT1Ob25lLCBvdXQ9Tm9uZSwga2VlcGRpbXM9RmFsc2UpCgogICAgUmVkdWNlcyBgYWAncyBkaW1lbnNpb24gYnkgb25lLCBieSBhcHBseWluZyB1ZnVuYyBhbG9uZyBvbmUgYXhpcy4KCiAgICBMZXQgOm1hdGg6YGEuc2hhcGUgPSAoTl8wLCAuLi4sIE5faSwgLi4uLCBOX3tNLTF9KWAuICBUaGVuCiAgICA6bWF0aDpgdWZ1bmMucmVkdWNlKGEsIGF4aXM9aSlba18wLCAuLixrX3tpLTF9LCBrX3tpKzF9LCAuLiwga197TS0xfV1gID0KICAgIHRoZSByZXN1bHQgb2YgaXRlcmF0aW5nIGBqYCBvdmVyIDptYXRoOmByYW5nZShOX2kpYCwgY3VtdWxhdGl2ZWx5IGFwcGx5aW5nCiAgICB1ZnVuYyB0byBlYWNoIDptYXRoOmBhW2tfMCwgLi4sa197aS0xfSwgaiwga197aSsxfSwgLi4sIGtfe00tMX1dYC4KICAgIEZvciBhIG9uZS1kaW1lbnNpb25hbCBhcnJheSwgcmVkdWNlIHByb2R1Y2VzIHJlc3VsdHMgZXF1aXZhbGVudCB0bzoKICAgIDo6CgogICAgIHIgPSBvcC5pZGVudGl0eSAjIG9wID0gdWZ1bmMKICAgICBmb3IgaSBpbiByYW5nZShsZW4oQSkpOgogICAgICAgciA9IG9wKHIsIEFbaV0pCiAgICAgcmV0dXJuIHIKCiAgICBGb3IgZXhhbXBsZSwgYWRkLnJlZHVjZSgpIGlzIGVxdWl2YWxlbnQgdG8gc3VtKCkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBUaGUgYXJyYXkgdG8gYWN0IG9uLgogICAgYXhpcyA6IE5vbmUgb3IgaW50IG9yIHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIGEgcmVkdWN0aW9uIGlzIHBlcmZvcm1lZC4KICAgICAgICBUaGUgZGVmYXVsdCAoYGF4aXNgID0gMCkgaXMgcGVyZm9ybSBhIHJlZHVjdGlvbiBvdmVyIHRoZSBmaXJzdAogICAgICAgIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXQgYXJyYXkuIGBheGlzYCBtYXkgYmUgbmVnYXRpdmUsIGluCiAgICAgICAgd2hpY2ggY2FzZSBpdCBjb3VudHMgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3QgYXhpcy4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICAgICAgSWYgdGhpcyBpcyBgTm9uZWAsIGEgcmVkdWN0aW9uIGlzIHBlcmZvcm1lZCBvdmVyIGFsbCB0aGUgYXhlcy4KICAgICAgICBJZiB0aGlzIGlzIGEgdHVwbGUgb2YgaW50cywgYSByZWR1Y3Rpb24gaXMgcGVyZm9ybWVkIG9uIG11bHRpcGxlCiAgICAgICAgYXhlcywgaW5zdGVhZCBvZiBhIHNpbmdsZSBheGlzIG9yIGFsbCB0aGUgYXhlcyBhcyBiZWZvcmUuCgogICAgICAgIEZvciBvcGVyYXRpb25zIHdoaWNoIGFyZSBlaXRoZXIgbm90IGNvbW11dGF0aXZlIG9yIG5vdCBhc3NvY2lhdGl2ZSwKICAgICAgICBkb2luZyBhIHJlZHVjdGlvbiBvdmVyIG11bHRpcGxlIGF4ZXMgaXMgbm90IHdlbGwtZGVmaW5lZC4gVGhlCiAgICAgICAgdWZ1bmNzIGRvIG5vdCBjdXJyZW50bHkgcmFpc2UgYW4gZXhjZXB0aW9uIGluIHRoaXMgY2FzZSwgYnV0IHdpbGwKICAgICAgICBsaWtlbHkgZG8gc28gaW4gdGhlIGZ1dHVyZS4KICAgIGR0eXBlIDogZGF0YS10eXBlIGNvZGUsIG9wdGlvbmFsCiAgICAgICAgVGhlIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLiBEZWZhdWx0cwogICAgICAgIHRvIHRoZSBkYXRhLXR5cGUgb2YgdGhlIG91dHB1dCBhcnJheSBpZiB0aGlzIGlzIHByb3ZpZGVkLCBvcgogICAgICAgIHRoZSBkYXRhLXR5cGUgb2YgdGhlIGlucHV0IGFycmF5IGlmIG5vIG91dHB1dCBhcnJheSBpcyBwcm92aWRlZC4KICAgIG91dCA6IG5kYXJyYXksIE5vbmUsIG9yIHR1cGxlIG9mIG5kYXJyYXkgYW5kIE5vbmUsIG9wdGlvbmFsCiAgICAgICAgQSBsb2NhdGlvbiBpbnRvIHdoaWNoIHRoZSByZXN1bHQgaXMgc3RvcmVkLiBJZiBub3QgcHJvdmlkZWQgb3IgYE5vbmVgLAogICAgICAgIGEgZnJlc2hseS1hbGxvY2F0ZWQgYXJyYXkgaXMgcmV0dXJuZWQuIEZvciBjb25zaXN0ZW5jeSB3aXRoCiAgICAgICAgOnJlZjpgdWZ1bmMuX19jYWxsX19gLCBpZiBnaXZlbiBhcyBhIGtleXdvcmQsIHRoaXMgbWF5IGJlIHdyYXBwZWQgaW4gYQogICAgICAgIDEtZWxlbWVudCB0dXBsZS4KCiAgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAxLjEzLjAKICAgICAgICAgICBUdXBsZXMgYXJlIGFsbG93ZWQgZm9yIGtleXdvcmQgYXJndW1lbnQuCiAgICBrZWVwZGltcyA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgSWYgdGhpcyBpcyBzZXQgdG8gVHJ1ZSwgdGhlIGF4ZXMgd2hpY2ggYXJlIHJlZHVjZWQgYXJlIGxlZnQKICAgICAgICBpbiB0aGUgcmVzdWx0IGFzIGRpbWVuc2lvbnMgd2l0aCBzaXplIG9uZS4gV2l0aCB0aGlzIG9wdGlvbiwKICAgICAgICB0aGUgcmVzdWx0IHdpbGwgYnJvYWRjYXN0IGNvcnJlY3RseSBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgYXJyYC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByIDogbmRhcnJheQogICAgICAgIFRoZSByZWR1Y2VkIGFycmF5LiBJZiBgb3V0YCB3YXMgc3VwcGxpZWQsIGByYCBpcyBhIHJlZmVyZW5jZSB0byBpdC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5tdWx0aXBseS5yZWR1Y2UoWzIsMyw1XSkKICAgIDMwCgogICAgQSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBleGFtcGxlOgoKICAgID4+PiBYID0gbnAuYXJhbmdlKDgpLnJlc2hhcGUoKDIsMiwyKSkKICAgID4+PiBYCiAgICBhcnJheShbW1swLCAxXSwKICAgICAgICAgICAgWzIsIDNdXSwKICAgICAgICAgICBbWzQsIDVdLAogICAgICAgICAgICBbNiwgN11dXSkKICAgID4+PiBucC5hZGQucmVkdWNlKFgsIDApCiAgICBhcnJheShbWyA0LCAgNl0sCiAgICAgICAgICAgWyA4LCAxMF1dKQogICAgPj4+IG5wLmFkZC5yZWR1Y2UoWCkgIyBjb25maXJtOiBkZWZhdWx0IGF4aXMgdmFsdWUgaXMgMAogICAgYXJyYXkoW1sgNCwgIDZdLAogICAgICAgICAgIFsgOCwgMTBdXSkKICAgID4+PiBucC5hZGQucmVkdWNlKFgsIDEpCiAgICBhcnJheShbWyAyLCAgNF0sCiAgICAgICAgICAgWzEwLCAxMl1dKQogICAgPj4+IG5wLmFkZC5yZWR1Y2UoWCwgMikKICAgIGFycmF5KFtbIDEsICA1XSwKICAgICAgICAgICBbIDksIDEzXV0pCgogICAgKQLaCmFjY3VtdWxhdGVhYwkAAAogICAgYWNjdW11bGF0ZShhcnJheSwgYXhpcz0wLCBkdHlwZT1Ob25lLCBvdXQ9Tm9uZSwga2VlcGRpbXM9Tm9uZSkKCiAgICBBY2N1bXVsYXRlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIG9wZXJhdG9yIHRvIGFsbCBlbGVtZW50cy4KCiAgICBGb3IgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXksIGFjY3VtdWxhdGUgcHJvZHVjZXMgcmVzdWx0cyBlcXVpdmFsZW50IHRvOjoKCiAgICAgIHIgPSBucC5lbXB0eShsZW4oQSkpCiAgICAgIHQgPSBvcC5pZGVudGl0eSAgICAgICAgIyBvcCA9IHRoZSB1ZnVuYyBiZWluZyBhcHBsaWVkIHRvIEEncyAgZWxlbWVudHMKICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKEEpKToKICAgICAgICAgIHQgPSBvcCh0LCBBW2ldKQogICAgICAgICAgcltpXSA9IHQKICAgICAgcmV0dXJuIHIKCiAgICBGb3IgZXhhbXBsZSwgYWRkLmFjY3VtdWxhdGUoKSBpcyBlcXVpdmFsZW50IHRvIG5wLmN1bXN1bSgpLgoKICAgIEZvciBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCBhY2N1bXVsYXRlIGlzIGFwcGxpZWQgYWxvbmcgb25seSBvbmUKICAgIGF4aXMgKGF4aXMgemVybyBieSBkZWZhdWx0OyBzZWUgRXhhbXBsZXMgYmVsb3cpIHNvIHJlcGVhdGVkIHVzZSBpcwogICAgbmVjZXNzYXJ5IGlmIG9uZSB3YW50cyB0byBhY2N1bXVsYXRlIG92ZXIgbXVsdGlwbGUgYXhlcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcnJheSA6IGFycmF5X2xpa2UKICAgICAgICBUaGUgYXJyYXkgdG8gYWN0IG9uLgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byBhcHBseSB0aGUgYWNjdW11bGF0aW9uOyBkZWZhdWx0IGlzIHplcm8uCiAgICBkdHlwZSA6IGRhdGEtdHlwZSBjb2RlLCBvcHRpb25hbAogICAgICAgIFRoZSBkYXRhLXR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLiBEZWZhdWx0cwogICAgICAgIHRvIHRoZSBkYXRhLXR5cGUgb2YgdGhlIG91dHB1dCBhcnJheSBpZiBzdWNoIGlzIHByb3ZpZGVkLCBvciB0aGUKICAgICAgICB0aGUgZGF0YS10eXBlIG9mIHRoZSBpbnB1dCBhcnJheSBpZiBubyBvdXRwdXQgYXJyYXkgaXMgcHJvdmlkZWQuCiAgICBvdXQgOiBuZGFycmF5LCBOb25lLCBvciB0dXBsZSBvZiBuZGFycmF5IGFuZCBOb25lLCBvcHRpb25hbAogICAgICAgIEEgbG9jYXRpb24gaW50byB3aGljaCB0aGUgcmVzdWx0IGlzIHN0b3JlZC4gSWYgbm90IHByb3ZpZGVkIG9yIGBOb25lYCwKICAgICAgICBhIGZyZXNobHktYWxsb2NhdGVkIGFycmF5IGlzIHJldHVybmVkLiBGb3IgY29uc2lzdGVuY3kgd2l0aAogICAgICAgIDpyZWY6YHVmdW5jLl9fY2FsbF9fYCwgaWYgZ2l2ZW4gYXMgYSBrZXl3b3JkLCB0aGlzIG1heSBiZSB3cmFwcGVkIGluIGEKICAgICAgICAxLWVsZW1lbnQgdHVwbGUuCgogICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMS4xMy4wCiAgICAgICAgICAgVHVwbGVzIGFyZSBhbGxvd2VkIGZvciBrZXl3b3JkIGFyZ3VtZW50LgogICAga2VlcGRpbXMgOiBib29sCiAgICAgICAgSGFzIG5vIGVmZmVjdC4gRGVwcmVjYXRlZCwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgciA6IG5kYXJyYXkKICAgICAgICBUaGUgYWNjdW11bGF0ZWQgdmFsdWVzLiBJZiBgb3V0YCB3YXMgc3VwcGxpZWQsIGByYCBpcyBhIHJlZmVyZW5jZSB0bwogICAgICAgIGBvdXRgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgMS1EIGFycmF5IGV4YW1wbGVzOgoKICAgID4+PiBucC5hZGQuYWNjdW11bGF0ZShbMiwgMywgNV0pCiAgICBhcnJheShbIDIsICA1LCAxMF0pCiAgICA+Pj4gbnAubXVsdGlwbHkuYWNjdW11bGF0ZShbMiwgMywgNV0pCiAgICBhcnJheShbIDIsICA2LCAzMF0pCgogICAgMi1EIGFycmF5IGV4YW1wbGVzOgoKICAgID4+PiBJID0gbnAuZXllKDIpCiAgICA+Pj4gSQogICAgYXJyYXkoW1sgMS4sICAwLl0sCiAgICAgICAgICAgWyAwLiwgIDEuXV0pCgogICAgQWNjdW11bGF0ZSBhbG9uZyBheGlzIDAgKHJvd3MpLCBkb3duIGNvbHVtbnM6CgogICAgPj4+IG5wLmFkZC5hY2N1bXVsYXRlKEksIDApCiAgICBhcnJheShbWyAxLiwgIDAuXSwKICAgICAgICAgICBbIDEuLCAgMS5dXSkKICAgID4+PiBucC5hZGQuYWNjdW11bGF0ZShJKSAjIG5vIGF4aXMgc3BlY2lmaWVkID0gYXhpcyB6ZXJvCiAgICBhcnJheShbWyAxLiwgIDAuXSwKICAgICAgICAgICBbIDEuLCAgMS5dXSkKCiAgICBBY2N1bXVsYXRlIGFsb25nIGF4aXMgMSAoY29sdW1ucyksIHRocm91Z2ggcm93czoKCiAgICA+Pj4gbnAuYWRkLmFjY3VtdWxhdGUoSSwgMSkKICAgIGFycmF5KFtbIDEuLCAgMS5dLAogICAgICAgICAgIFsgMC4sICAxLl1dKQoKICAgICkCWghyZWR1Y2VhdGGjDQAACiAgICByZWR1Y2VhdChhLCBpbmRpY2VzLCBheGlzPTAsIGR0eXBlPU5vbmUsIG91dD1Ob25lKQoKICAgIFBlcmZvcm1zIGEgKGxvY2FsKSByZWR1Y2Ugd2l0aCBzcGVjaWZpZWQgc2xpY2VzIG92ZXIgYSBzaW5nbGUgYXhpcy4KCiAgICBGb3IgaSBpbiBgYHJhbmdlKGxlbihpbmRpY2VzKSlgYCwgYHJlZHVjZWF0YCBjb21wdXRlcwogICAgYGB1ZnVuYy5yZWR1Y2UoYVtpbmRpY2VzW2ldOmluZGljZXNbaSsxXV0pYGAsIHdoaWNoIGJlY29tZXMgdGhlIGktdGgKICAgIGdlbmVyYWxpemVkICJyb3ciIHBhcmFsbGVsIHRvIGBheGlzYCBpbiB0aGUgZmluYWwgcmVzdWx0IChpLmUuLCBpbiBhCiAgICAyLUQgYXJyYXksIGZvciBleGFtcGxlLCBpZiBgYXhpcyA9IDBgLCBpdCBiZWNvbWVzIHRoZSBpLXRoIHJvdywgYnV0IGlmCiAgICBgYXhpcyA9IDFgLCBpdCBiZWNvbWVzIHRoZSBpLXRoIGNvbHVtbikuICBUaGVyZSBhcmUgdGhyZWUgZXhjZXB0aW9ucyB0byB0aGlzOgoKICAgICogd2hlbiBgYGkgPSBsZW4oaW5kaWNlcykgLSAxYGAgKHNvIGZvciB0aGUgbGFzdCBpbmRleCksCiAgICAgIGBgaW5kaWNlc1tpKzFdID0gYS5zaGFwZVtheGlzXWBgLgogICAgKiBpZiBgYGluZGljZXNbaV0gPj0gaW5kaWNlc1tpICsgMV1gYCwgdGhlIGktdGggZ2VuZXJhbGl6ZWQgInJvdyIgaXMKICAgICAgc2ltcGx5IGBgYVtpbmRpY2VzW2ldXWBgLgogICAgKiBpZiBgYGluZGljZXNbaV0gPj0gbGVuKGEpYGAgb3IgYGBpbmRpY2VzW2ldIDwgMGBgLCBhbiBlcnJvciBpcyByYWlzZWQuCgogICAgVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiBgaW5kaWNlc2AsIGFuZCBtYXkgYmUKICAgIGxhcmdlciB0aGFuIGBhYCAodGhpcyBoYXBwZW5zIGlmIGBgbGVuKGluZGljZXMpID4gYS5zaGFwZVtheGlzXWBgKS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBhcnJheSB0byBhY3Qgb24uCiAgICBpbmRpY2VzIDogYXJyYXlfbGlrZQogICAgICAgIFBhaXJlZCBpbmRpY2VzLCBjb21tYSBzZXBhcmF0ZWQgKG5vdCBjb2xvbiksIHNwZWNpZnlpbmcgc2xpY2VzIHRvCiAgICAgICAgcmVkdWNlLgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byBhcHBseSB0aGUgcmVkdWNlYXQuCiAgICBkdHlwZSA6IGRhdGEtdHlwZSBjb2RlLCBvcHRpb25hbAogICAgICAgIFRoZSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cy4gRGVmYXVsdHMKICAgICAgICB0byB0aGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgYXJyYXkgaWYgdGhpcyBpcyBwcm92aWRlZCwgb3IKICAgICAgICB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbnB1dCBhcnJheSBpZiBubyBvdXRwdXQgYXJyYXkgaXMgcHJvdmlkZWQuCiAgICBvdXQgOiBuZGFycmF5LCBOb25lLCBvciB0dXBsZSBvZiBuZGFycmF5IGFuZCBOb25lLCBvcHRpb25hbAogICAgICAgIEEgbG9jYXRpb24gaW50byB3aGljaCB0aGUgcmVzdWx0IGlzIHN0b3JlZC4gSWYgbm90IHByb3ZpZGVkIG9yIGBOb25lYCwKICAgICAgICBhIGZyZXNobHktYWxsb2NhdGVkIGFycmF5IGlzIHJldHVybmVkLiBGb3IgY29uc2lzdGVuY3kgd2l0aAogICAgICAgIDpyZWY6YHVmdW5jLl9fY2FsbF9fYCwgaWYgZ2l2ZW4gYXMgYSBrZXl3b3JkLCB0aGlzIG1heSBiZSB3cmFwcGVkIGluIGEKICAgICAgICAxLWVsZW1lbnQgdHVwbGUuCgogICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMS4xMy4wCiAgICAgICAgICAgVHVwbGVzIGFyZSBhbGxvd2VkIGZvciBrZXl3b3JkIGFyZ3VtZW50LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHIgOiBuZGFycmF5CiAgICAgICAgVGhlIHJlZHVjZWQgdmFsdWVzLiBJZiBgb3V0YCB3YXMgc3VwcGxpZWQsIGByYCBpcyBhIHJlZmVyZW5jZSB0bwogICAgICAgIGBvdXRgLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgQSBkZXNjcmlwdGl2ZSBleGFtcGxlOgoKICAgIElmIGBhYCBpcyAxLUQsIHRoZSBmdW5jdGlvbiBgdWZ1bmMuYWNjdW11bGF0ZShhKWAgaXMgdGhlIHNhbWUgYXMKICAgIGBgdWZ1bmMucmVkdWNlYXQoYSwgaW5kaWNlcylbOjoyXWBgIHdoZXJlIGBpbmRpY2VzYCBpcwogICAgYGByYW5nZShsZW4oYXJyYXkpIC0gMSlgYCB3aXRoIGEgemVybyBwbGFjZWQKICAgIGluIGV2ZXJ5IG90aGVyIGVsZW1lbnQ6CiAgICBgYGluZGljZXMgPSB6ZXJvcygyICogbGVuKGEpIC0gMSlgYCwgYGBpbmRpY2VzWzE6OjJdID0gcmFuZ2UoMSwgbGVuKGEpKWBgLgoKICAgIERvbid0IGJlIGZvb2xlZCBieSB0aGlzIGF0dHJpYnV0ZSdzIG5hbWU6IGByZWR1Y2VhdChhKWAgaXMgbm90CiAgICBuZWNlc3NhcmlseSBzbWFsbGVyIHRoYW4gYGFgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgVG8gdGFrZSB0aGUgcnVubmluZyBzdW0gb2YgZm91ciBzdWNjZXNzaXZlIHZhbHVlczoKCiAgICA+Pj4gbnAuYWRkLnJlZHVjZWF0KG5wLmFyYW5nZSg4KSxbMCw0LCAxLDUsIDIsNiwgMyw3XSlbOjoyXQogICAgYXJyYXkoWyA2LCAxMCwgMTQsIDE4XSkKCiAgICBBIDItRCBleGFtcGxlOgoKICAgID4+PiB4ID0gbnAubGluc3BhY2UoMCwgMTUsIDE2KS5yZXNoYXBlKDQsNCkKICAgID4+PiB4CiAgICBhcnJheShbWyAgMC4sICAgMS4sICAgMi4sICAgMy5dLAogICAgICAgICAgIFsgIDQuLCAgIDUuLCAgIDYuLCAgIDcuXSwKICAgICAgICAgICBbICA4LiwgICA5LiwgIDEwLiwgIDExLl0sCiAgICAgICAgICAgWyAxMi4sICAxMy4sICAxNC4sICAxNS5dXSkKCiAgICA6OgoKICAgICAjIHJlZHVjZSBzdWNoIHRoYXQgdGhlIHJlc3VsdCBoYXMgdGhlIGZvbGxvd2luZyBmaXZlIHJvd3M6CiAgICAgIyBbcm93MSArIHJvdzIgKyByb3czXQogICAgICMgW3JvdzRdCiAgICAgIyBbcm93Ml0KICAgICAjIFtyb3czXQogICAgICMgW3JvdzEgKyByb3cyICsgcm93MyArIHJvdzRdCgogICAgPj4+IG5wLmFkZC5yZWR1Y2VhdCh4LCBbMCwgMywgMSwgMiwgMF0pCiAgICBhcnJheShbWyAxMi4sICAxNS4sICAxOC4sICAyMS5dLAogICAgICAgICAgIFsgMTIuLCAgMTMuLCAgMTQuLCAgMTUuXSwKICAgICAgICAgICBbICA0LiwgICA1LiwgICA2LiwgICA3Ll0sCiAgICAgICAgICAgWyAgOC4sICAgOS4sICAxMC4sICAxMS5dLAogICAgICAgICAgIFsgMjQuLCAgMjguLCAgMzIuLCAgMzYuXV0pCgogICAgOjoKCiAgICAgIyByZWR1Y2Ugc3VjaCB0aGF0IHJlc3VsdCBoYXMgdGhlIGZvbGxvd2luZyB0d28gY29sdW1uczoKICAgICAjIFtjb2wxICogY29sMiAqIGNvbDMsIGNvbDRdCgogICAgPj4+IG5wLm11bHRpcGx5LnJlZHVjZWF0KHgsIFswLCAzXSwgMSkKICAgIGFycmF5KFtbICAgIDAuLCAgICAgMy5dLAogICAgICAgICAgIFsgIDEyMC4sICAgICA3Ll0sCiAgICAgICAgICAgWyAgNzIwLiwgICAgMTEuXSwKICAgICAgICAgICBbIDIxODQuLCAgICAxNS5dXSkKCiAgICApAloFb3V0ZXJhtQUAAAogICAgb3V0ZXIoQSwgQiwgKiprd2FyZ3MpCgogICAgQXBwbHkgdGhlIHVmdW5jIGBvcGAgdG8gYWxsIHBhaXJzIChhLCBiKSB3aXRoIGEgaW4gYEFgIGFuZCBiIGluIGBCYC4KCiAgICBMZXQgYGBNID0gQS5uZGltYGAsIGBgTiA9IEIubmRpbWBgLiBUaGVuIHRoZSByZXN1bHQsIGBDYCwgb2YKICAgIGBgb3Aub3V0ZXIoQSwgQilgYCBpcyBhbiBhcnJheSBvZiBkaW1lbnNpb24gTSArIE4gc3VjaCB0aGF0OgoKICAgIC4uIG1hdGg6OiBDW2lfMCwgLi4uLCBpX3tNLTF9LCBqXzAsIC4uLiwgal97Ti0xfV0gPQogICAgICAgb3AoQVtpXzAsIC4uLiwgaV97TS0xfV0sIEJbal8wLCAuLi4sIGpfe04tMX1dKQoKICAgIEZvciBgQWAgYW5kIGBCYCBvbmUtZGltZW5zaW9uYWwsIHRoaXMgaXMgZXF1aXZhbGVudCB0bzo6CgogICAgICByID0gZW1wdHkobGVuKEEpLGxlbihCKSkKICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKEEpKToKICAgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihCKSk6CiAgICAgICAgICAgICAgcltpLGpdID0gb3AoQVtpXSwgQltqXSkgIyBvcCA9IHVmdW5jIGluIHF1ZXN0aW9uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgQSA6IGFycmF5X2xpa2UKICAgICAgICBGaXJzdCBhcnJheQogICAgQiA6IGFycmF5X2xpa2UKICAgICAgICBTZWNvbmQgYXJyYXkKICAgIGt3YXJncyA6IGFueQogICAgICAgIEFyZ3VtZW50cyB0byBwYXNzIG9uIHRvIHRoZSB1ZnVuYy4gVHlwaWNhbGx5IGBkdHlwZWAgb3IgYG91dGAuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgciA6IG5kYXJyYXkKICAgICAgICBPdXRwdXQgYXJyYXkKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5Lm91dGVyCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAubXVsdGlwbHkub3V0ZXIoWzEsIDIsIDNdLCBbNCwgNSwgNl0pCiAgICBhcnJheShbWyA0LCAgNSwgIDZdLAogICAgICAgICAgIFsgOCwgMTAsIDEyXSwKICAgICAgICAgICBbMTIsIDE1LCAxOF1dKQoKICAgIEEgbXVsdGktZGltZW5zaW9uYWwgZXhhbXBsZToKCiAgICA+Pj4gQSA9IG5wLmFycmF5KFtbMSwgMiwgM10sIFs0LCA1LCA2XV0pCiAgICA+Pj4gQS5zaGFwZQogICAgKDIsIDMpCiAgICA+Pj4gQiA9IG5wLmFycmF5KFtbMSwgMiwgMywgNF1dKQogICAgPj4+IEIuc2hhcGUKICAgICgxLCA0KQogICAgPj4+IEMgPSBucC5tdWx0aXBseS5vdXRlcihBLCBCKQogICAgPj4+IEMuc2hhcGU7IEMKICAgICgyLCAzLCAxLCA0KQogICAgYXJyYXkoW1tbWyAxLCAgMiwgIDMsICA0XV0sCiAgICAgICAgICAgIFtbIDIsICA0LCAgNiwgIDhdXSwKICAgICAgICAgICAgW1sgMywgIDYsICA5LCAxMl1dXSwKICAgICAgICAgICBbW1sgNCwgIDgsIDEyLCAxNl1dLAogICAgICAgICAgICBbWyA1LCAxMCwgMTUsIDIwXV0sCiAgICAgICAgICAgIFtbIDYsIDEyLCAxOCwgMjRdXV1dKQoKICAgICkCWgJhdGFFBgAACiAgICBhdChhLCBpbmRpY2VzLCBiPU5vbmUpCgogICAgUGVyZm9ybXMgdW5idWZmZXJlZCBpbiBwbGFjZSBvcGVyYXRpb24gb24gb3BlcmFuZCAnYScgZm9yIGVsZW1lbnRzCiAgICBzcGVjaWZpZWQgYnkgJ2luZGljZXMnLiBGb3IgYWRkaXRpb24gdWZ1bmMsIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KICAgIGBhW2luZGljZXNdICs9IGJgLCBleGNlcHQgdGhhdCByZXN1bHRzIGFyZSBhY2N1bXVsYXRlZCBmb3IgZWxlbWVudHMgdGhhdAogICAgYXJlIGluZGV4ZWQgbW9yZSB0aGFuIG9uY2UuIEZvciBleGFtcGxlLCBgYVtbMCwwXV0gKz0gMWAgd2lsbCBvbmx5CiAgICBpbmNyZW1lbnQgdGhlIGZpcnN0IGVsZW1lbnQgb25jZSBiZWNhdXNlIG9mIGJ1ZmZlcmluZywgd2hlcmVhcwogICAgYGFkZC5hdChhLCBbMCwwXSwgMSlgIHdpbGwgaW5jcmVtZW50IHRoZSBmaXJzdCBlbGVtZW50IHR3aWNlLgoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuOC4wCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBUaGUgYXJyYXkgdG8gcGVyZm9ybSBpbiBwbGFjZSBvcGVyYXRpb24gb24uCiAgICBpbmRpY2VzIDogYXJyYXlfbGlrZSBvciB0dXBsZQogICAgICAgIEFycmF5IGxpa2UgaW5kZXggb2JqZWN0IG9yIHNsaWNlIG9iamVjdCBmb3IgaW5kZXhpbmcgaW50byBmaXJzdAogICAgICAgIG9wZXJhbmQuIElmIGZpcnN0IG9wZXJhbmQgaGFzIG11bHRpcGxlIGRpbWVuc2lvbnMsIGluZGljZXMgY2FuIGJlIGEKICAgICAgICB0dXBsZSBvZiBhcnJheSBsaWtlIGluZGV4IG9iamVjdHMgb3Igc2xpY2Ugb2JqZWN0cy4KICAgIGIgOiBhcnJheV9saWtlCiAgICAgICAgU2Vjb25kIG9wZXJhbmQgZm9yIHVmdW5jcyByZXF1aXJpbmcgdHdvIG9wZXJhbmRzLiBPcGVyYW5kIG11c3QgYmUKICAgICAgICBicm9hZGNhc3RhYmxlIG92ZXIgZmlyc3Qgb3BlcmFuZCBhZnRlciBpbmRleGluZyBvciBzbGljaW5nLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgU2V0IGl0ZW1zIDAgYW5kIDEgdG8gdGhlaXIgbmVnYXRpdmUgdmFsdWVzOgoKICAgID4+PiBhID0gbnAuYXJyYXkoWzEsIDIsIDMsIDRdKQogICAgPj4+IG5wLm5lZ2F0aXZlLmF0KGEsIFswLCAxXSkKICAgID4+PiBwcmludChhKQogICAgYXJyYXkoWy0xLCAtMiwgMywgNF0pCgogICAgOjoKCiAgICBJbmNyZW1lbnQgaXRlbXMgMCBhbmQgMSwgYW5kIGluY3JlbWVudCBpdGVtIDIgdHdpY2U6CgogICAgPj4+IGEgPSBucC5hcnJheShbMSwgMiwgMywgNF0pCiAgICA+Pj4gbnAuYWRkLmF0KGEsIFswLCAxLCAyLCAyXSwgMSkKICAgID4+PiBwcmludChhKQogICAgYXJyYXkoWzIsIDMsIDUsIDRdKQoKICAgIDo6CgogICAgQWRkIGl0ZW1zIDAgYW5kIDEgaW4gZmlyc3QgYXJyYXkgdG8gc2Vjb25kIGFycmF5LAogICAgYW5kIHN0b3JlIHJlc3VsdHMgaW4gZmlyc3QgYXJyYXk6CgogICAgPj4+IGEgPSBucC5hcnJheShbMSwgMiwgMywgNF0pCiAgICA+Pj4gYiA9IG5wLmFycmF5KFsxLCAyXSkKICAgID4+PiBucC5hZGQuYXQoYSwgWzAsIDFdLCBiKQogICAgPj4+IHByaW50KGEpCiAgICBhcnJheShbMiwgNCwgMywgNF0pCgogICAgchoAAABh8wkAAAogICAgZHR5cGUob2JqLCBhbGlnbj1GYWxzZSwgY29weT1GYWxzZSkKCiAgICBDcmVhdGUgYSBkYXRhIHR5cGUgb2JqZWN0LgoKICAgIEEgbnVtcHkgYXJyYXkgaXMgaG9tb2dlbmVvdXMsIGFuZCBjb250YWlucyBlbGVtZW50cyBkZXNjcmliZWQgYnkgYQogICAgZHR5cGUgb2JqZWN0LiBBIGR0eXBlIG9iamVjdCBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBkaWZmZXJlbnQKICAgIGNvbWJpbmF0aW9ucyBvZiBmdW5kYW1lbnRhbCBudW1lcmljIHR5cGVzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG9iagogICAgICAgIE9iamVjdCB0byBiZSBjb252ZXJ0ZWQgdG8gYSBkYXRhIHR5cGUgb2JqZWN0LgogICAgYWxpZ24gOiBib29sLCBvcHRpb25hbAogICAgICAgIEFkZCBwYWRkaW5nIHRvIHRoZSBmaWVsZHMgdG8gbWF0Y2ggd2hhdCBhIEMgY29tcGlsZXIgd291bGQgb3V0cHV0CiAgICAgICAgZm9yIGEgc2ltaWxhciBDLXN0cnVjdC4gQ2FuIGJlIGBgVHJ1ZWBgIG9ubHkgaWYgYG9iamAgaXMgYSBkaWN0aW9uYXJ5CiAgICAgICAgb3IgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLiBJZiBhIHN0cnVjdCBkdHlwZSBpcyBiZWluZyBjcmVhdGVkLAogICAgICAgIHRoaXMgYWxzbyBzZXRzIGEgc3RpY2t5IGFsaWdubWVudCBmbGFnIGBgaXNhbGlnbmVkc3RydWN0YGAuCiAgICBjb3B5IDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBNYWtlIGEgbmV3IGNvcHkgb2YgdGhlIGRhdGEtdHlwZSBvYmplY3QuIElmIGBgRmFsc2VgYCwgdGhlIHJlc3VsdAogICAgICAgIG1heSBqdXN0IGJlIGEgcmVmZXJlbmNlIHRvIGEgYnVpbHQtaW4gZGF0YS10eXBlIG9iamVjdC4KCiAgICBTZWUgYWxzbwogICAgLS0tLS0tLS0KICAgIHJlc3VsdF90eXBlCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBVc2luZyBhcnJheS1zY2FsYXIgdHlwZToKCiAgICA+Pj4gbnAuZHR5cGUobnAuaW50MTYpCiAgICBkdHlwZSgnaW50MTYnKQoKICAgIFN0cnVjdHVyZWQgdHlwZSwgb25lIGZpZWxkIG5hbWUgJ2YxJywgY29udGFpbmluZyBpbnQxNjoKCiAgICA+Pj4gbnAuZHR5cGUoWygnZjEnLCBucC5pbnQxNildKQogICAgZHR5cGUoWygnZjEnLCAnPGkyJyldKQoKICAgIFN0cnVjdHVyZWQgdHlwZSwgb25lIGZpZWxkIG5hbWVkICdmMScsIGluIGl0c2VsZiBjb250YWluaW5nIGEgc3RydWN0dXJlZAogICAgdHlwZSB3aXRoIG9uZSBmaWVsZDoKCiAgICA+Pj4gbnAuZHR5cGUoWygnZjEnLCBbKCdmMScsIG5wLmludDE2KV0pXSkKICAgIGR0eXBlKFsoJ2YxJywgWygnZjEnLCAnPGkyJyldKV0pCgogICAgU3RydWN0dXJlZCB0eXBlLCB0d28gZmllbGRzOiB0aGUgZmlyc3QgZmllbGQgY29udGFpbnMgYW4gdW5zaWduZWQgaW50LCB0aGUKICAgIHNlY29uZCBhbiBpbnQzMjoKCiAgICA+Pj4gbnAuZHR5cGUoWygnZjEnLCBucC51aW50KSwgKCdmMicsIG5wLmludDMyKV0pCiAgICBkdHlwZShbKCdmMScsICc8dTQnKSwgKCdmMicsICc8aTQnKV0pCgogICAgVXNpbmcgYXJyYXktcHJvdG9jb2wgdHlwZSBzdHJpbmdzOgoKICAgID4+PiBucC5kdHlwZShbKCdhJywnZjgnKSwoJ2InLCdTMTAnKV0pCiAgICBkdHlwZShbKCdhJywgJzxmOCcpLCAoJ2InLCAnfFMxMCcpXSkKCiAgICBVc2luZyBjb21tYS1zZXBhcmF0ZWQgZmllbGQgZm9ybWF0cy4gIFRoZSBzaGFwZSBpcyAoMiwzKToKCiAgICA+Pj4gbnAuZHR5cGUoImk0LCAoMiwzKWY4IikKICAgIGR0eXBlKFsoJ2YwJywgJzxpNCcpLCAoJ2YxJywgJzxmOCcsICgyLCAzKSldKQoKICAgIFVzaW5nIHR1cGxlcy4gIGBgaW50YGAgaXMgYSBmaXhlZCB0eXBlLCAzIHRoZSBmaWVsZCdzIHNoYXBlLiAgYGB2b2lkYGAKICAgIGlzIGEgZmxleGlibGUgdHlwZSwgaGVyZSBvZiBzaXplIDEwOgoKICAgID4+PiBucC5kdHlwZShbKCdoZWxsbycsKG5wLmludCwzKSksKCd3b3JsZCcsbnAudm9pZCwxMCldKQogICAgZHR5cGUoWygnaGVsbG8nLCAnPGk0JywgMyksICgnd29ybGQnLCAnfFYxMCcpXSkKCiAgICBTdWJkaXZpZGUgYGBpbnQxNmBgIGludG8gMiBgYGludDhgYCdzLCBjYWxsZWQgeCBhbmQgeS4gIDAgYW5kIDEgYXJlCiAgICB0aGUgb2Zmc2V0cyBpbiBieXRlczoKCiAgICA+Pj4gbnAuZHR5cGUoKG5wLmludDE2LCB7J3gnOihucC5pbnQ4LDApLCAneSc6KG5wLmludDgsMSl9KSkKICAgIGR0eXBlKCgnPGkyJywgWygneCcsICd8aTEnKSwgKCd5JywgJ3xpMScpXSkpCgogICAgVXNpbmcgZGljdGlvbmFyaWVzLiAgVHdvIGZpZWxkcyBuYW1lZCAnZ2VuZGVyJyBhbmQgJ2FnZSc6CgogICAgPj4+IG5wLmR0eXBlKHsnbmFtZXMnOlsnZ2VuZGVyJywnYWdlJ10sICdmb3JtYXRzJzpbJ1MxJyxucC51aW50OF19KQogICAgZHR5cGUoWygnZ2VuZGVyJywgJ3xTMScpLCAoJ2FnZScsICd8dTEnKV0pCgogICAgT2Zmc2V0cyBpbiBieXRlcywgaGVyZSAwIGFuZCAyNToKCiAgICA+Pj4gbnAuZHR5cGUoeydzdXJuYW1lJzooJ1MyNScsMCksJ2FnZSc6KG5wLnVpbnQ4LDI1KX0pCiAgICBkdHlwZShbKCdzdXJuYW1lJywgJ3xTMjUnKSwgKCdhZ2UnLCAnfHUxJyldKQoKICAgICkC2glhbGlnbm1lbnR6nQogICAgVGhlIHJlcXVpcmVkIGFsaWdubWVudCAoYnl0ZXMpIG9mIHRoaXMgZGF0YS10eXBlIGFjY29yZGluZyB0byB0aGUgY29tcGlsZXIuCgogICAgTW9yZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIEMtQVBJIHNlY3Rpb24gb2YgdGhlIG1hbnVhbC4KCiAgICApAtoJYnl0ZW9yZGVyYdoDAAAKICAgIEEgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhlIGJ5dGUtb3JkZXIgb2YgdGhpcyBkYXRhLXR5cGUgb2JqZWN0LgoKICAgIE9uZSBvZjoKCiAgICA9PT0gID09PT09PT09PT09PT09CiAgICAnPScgIG5hdGl2ZQogICAgJzwnICBsaXR0bGUtZW5kaWFuCiAgICAnPicgIGJpZy1lbmRpYW4KICAgICd8JyAgbm90IGFwcGxpY2FibGUKICAgID09PSAgPT09PT09PT09PT09PT0KCiAgICBBbGwgYnVpbHQtaW4gZGF0YS10eXBlIG9iamVjdHMgaGF2ZSBieXRlb3JkZXIgZWl0aGVyICc9JyBvciAnfCcuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCgogICAgPj4+IGR0ID0gbnAuZHR5cGUoJ2kyJykKICAgID4+PiBkdC5ieXRlb3JkZXIKICAgICc9JwogICAgPj4+ICMgZW5kaWFuIGlzIG5vdCByZWxldmFudCBmb3IgOCBiaXQgbnVtYmVycwogICAgPj4+IG5wLmR0eXBlKCdpMScpLmJ5dGVvcmRlcgogICAgJ3wnCiAgICA+Pj4gIyBvciBBU0NJSSBzdHJpbmdzCiAgICA+Pj4gbnAuZHR5cGUoJ1MyJykuYnl0ZW9yZGVyCiAgICAnfCcKICAgID4+PiAjIEV2ZW4gaWYgc3BlY2lmaWMgY29kZSBpcyBnaXZlbiwgYW5kIGl0IGlzIG5hdGl2ZQogICAgPj4+ICMgJz0nIGlzIHRoZSBieXRlb3JkZXIKICAgID4+PiBpbXBvcnQgc3lzCiAgICA+Pj4gc3lzX2lzX2xlID0gc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJwogICAgPj4+IG5hdGl2ZV9jb2RlID0gc3lzX2lzX2xlIGFuZCAnPCcgb3IgJz4nCiAgICA+Pj4gc3dhcHBlZF9jb2RlID0gc3lzX2lzX2xlIGFuZCAnPicgb3IgJzwnCiAgICA+Pj4gZHQgPSBucC5kdHlwZShuYXRpdmVfY29kZSArICdpMicpCiAgICA+Pj4gZHQuYnl0ZW9yZGVyCiAgICAnPScKICAgID4+PiAjIFN3YXBwZWQgY29kZSBzaG93cyB1cCBhcyBpdHNlbGYKICAgID4+PiBkdCA9IG5wLmR0eXBlKHN3YXBwZWRfY29kZSArICdpMicpCiAgICA+Pj4gZHQuYnl0ZW9yZGVyID09IHN3YXBwZWRfY29kZQogICAgVHJ1ZQoKICAgICkC2gRjaGFyekRBIHVuaXF1ZSBjaGFyYWN0ZXIgY29kZSBmb3IgZWFjaCBvZiB0aGUgMjEgZGlmZmVyZW50IGJ1aWx0LWluIHR5cGVzLikC2gVkZXNjcmEsAQAACiAgICBQRVAzMTE4IGludGVyZmFjZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGF0YS10eXBlLgoKICAgIFRoZSBmb3JtYXQgaXMgdGhhdCByZXF1aXJlZCBieSB0aGUgJ2Rlc2NyJyBrZXkgaW4gdGhlCiAgICBQRVAzMTE4IGBfX2FycmF5X2ludGVyZmFjZV9fYCBhdHRyaWJ1dGUuCgogICAgV2FybmluZzogVGhpcyBhdHRyaWJ1dGUgZXhpc3RzIHNwZWNpZmljYWxseSBmb3IgUEVQMzExOCBjb21wbGlhbmNlLCBhbmQKICAgIGlzIG5vdCBhIGRhdGF0eXBlIGRlc2NyaXB0aW9uIGNvbXBhdGlibGUgd2l0aCBgbnAuZHR5cGVgLgogICAgKQLaBmZpZWxkc2FYAwAACiAgICBEaWN0aW9uYXJ5IG9mIG5hbWVkIGZpZWxkcyBkZWZpbmVkIGZvciB0aGlzIGRhdGEgdHlwZSwgb3IgYGBOb25lYGAuCgogICAgVGhlIGRpY3Rpb25hcnkgaXMgaW5kZXhlZCBieSBrZXlzIHRoYXQgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzLgogICAgRWFjaCBlbnRyeSBpbiB0aGUgZGljdGlvbmFyeSBpcyBhIHR1cGxlIGZ1bGx5IGRlc2NyaWJpbmcgdGhlIGZpZWxkOjoKCiAgICAgIChkdHlwZSwgb2Zmc2V0WywgdGl0bGVdKQoKICAgIElmIHByZXNlbnQsIHRoZSBvcHRpb25hbCB0aXRsZSBjYW4gYmUgYW55IG9iamVjdCAoaWYgaXQgaXMgYSBzdHJpbmcKICAgIG9yIHVuaWNvZGUgdGhlbiBpdCB3aWxsIGFsc28gYmUgYSBrZXkgaW4gdGhlIGZpZWxkcyBkaWN0aW9uYXJ5LAogICAgb3RoZXJ3aXNlIGl0J3MgbWV0YS1kYXRhKS4gTm90aWNlIGFsc28gdGhhdCB0aGUgZmlyc3QgdHdvIGVsZW1lbnRzCiAgICBvZiB0aGUgdHVwbGUgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSBhcyBhcmd1bWVudHMgdG8gdGhlIGBgbmRhcnJheS5nZXRmaWVsZGBgCiAgICBhbmQgYGBuZGFycmF5LnNldGZpZWxkYGAgbWV0aG9kcy4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG5kYXJyYXkuZ2V0ZmllbGQsIG5kYXJyYXkuc2V0ZmllbGQKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBkdCA9IG5wLmR0eXBlKFsoJ25hbWUnLCBucC5zdHJfLCAxNiksICgnZ3JhZGVzJywgbnAuZmxvYXQ2NCwgKDIsKSldKQogICAgPj4+IHByaW50KGR0LmZpZWxkcykKICAgIHsnZ3JhZGVzJzogKGR0eXBlKCgnZmxvYXQ2NCcsKDIsKSkpLCAxNiksICduYW1lJzogKGR0eXBlKCd8UzE2JyksIDApfQoKICAgICkCch0AAABheAEAAAogICAgQml0LWZsYWdzIGRlc2NyaWJpbmcgaG93IHRoaXMgZGF0YSB0eXBlIGlzIHRvIGJlIGludGVycHJldGVkLgoKICAgIEJpdC1tYXNrcyBhcmUgaW4gYG51bXB5LmNvcmUubXVsdGlhcnJheWAgYXMgdGhlIGNvbnN0YW50cwogICAgYElURU1fSEFTT0JKRUNUYCwgYExJU1RfUElDS0xFYCwgYElURU1fSVNfUE9JTlRFUmAsIGBORUVEU19JTklUYCwKICAgIGBORUVEU19QWUFQSWAsIGBVU0VfR0VUSVRFTWAsIGBVU0VfU0VUSVRFTWAuIEEgZnVsbCBleHBsYW5hdGlvbgogICAgb2YgdGhlc2UgZmxhZ3MgaXMgaW4gQy1BUEkgZG9jdW1lbnRhdGlvbjsgdGhleSBhcmUgbGFyZ2VseSB1c2VmdWwKICAgIGZvciB1c2VyLWRlZmluZWQgZGF0YS10eXBlcy4KCiAgICApAloJaGFzb2JqZWN0YbMBAAAKICAgIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgZHR5cGUgY29udGFpbnMgYW55IHJlZmVyZW5jZS1jb3VudGVkCiAgICBvYmplY3RzIGluIGFueSBmaWVsZHMgb3Igc3ViLWR0eXBlcy4KCiAgICBSZWNhbGwgdGhhdCB3aGF0IGlzIGFjdHVhbGx5IGluIHRoZSBuZGFycmF5IG1lbW9yeSByZXByZXNlbnRpbmcKICAgIHRoZSBQeXRob24gb2JqZWN0IGlzIHRoZSBtZW1vcnkgYWRkcmVzcyBvZiB0aGF0IG9iamVjdCAoYSBwb2ludGVyKS4KICAgIFNwZWNpYWwgaGFuZGxpbmcgbWF5IGJlIHJlcXVpcmVkLCBhbmQgdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGZvcgogICAgZGlzdGluZ3Vpc2hpbmcgZGF0YSB0eXBlcyB0aGF0IG1heSBjb250YWluIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cwogICAgYW5kIGRhdGEtdHlwZXMgdGhhdCB3b24ndC4KCiAgICApAtoJaXNidWlsdGluYTEDAAAKICAgIEludGVnZXIgaW5kaWNhdGluZyBob3cgdGhpcyBkdHlwZSByZWxhdGVzIHRvIHRoZSBidWlsdC1pbiBkdHlwZXMuCgogICAgUmVhZC1vbmx5LgoKICAgID0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgMCAgaWYgdGhpcyBpcyBhIHN0cnVjdHVyZWQgYXJyYXkgdHlwZSwgd2l0aCBmaWVsZHMKICAgIDEgIGlmIHRoaXMgaXMgYSBkdHlwZSBjb21waWxlZCBpbnRvIG51bXB5IChzdWNoIGFzIGludHMsIGZsb2F0cyBldGMpCiAgICAyICBpZiB0aGUgZHR5cGUgaXMgZm9yIGEgdXNlci1kZWZpbmVkIG51bXB5IHR5cGUKICAgICAgIEEgdXNlci1kZWZpbmVkIHR5cGUgdXNlcyB0aGUgbnVtcHkgQy1BUEkgbWFjaGluZXJ5IHRvIGV4dGVuZAogICAgICAgbnVtcHkgdG8gaGFuZGxlIGEgbmV3IGFycmF5IHR5cGUuIFNlZQogICAgICAgOnJlZjpgdXNlci51c2VyLWRlZmluZWQtZGF0YS10eXBlc2AgaW4gdGhlIE51bVB5IG1hbnVhbC4KICAgID0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGR0ID0gbnAuZHR5cGUoJ2kyJykKICAgID4+PiBkdC5pc2J1aWx0aW4KICAgIDEKICAgID4+PiBkdCA9IG5wLmR0eXBlKCdmOCcpCiAgICA+Pj4gZHQuaXNidWlsdGluCiAgICAxCiAgICA+Pj4gZHQgPSBucC5kdHlwZShbKCdmaWVsZDEnLCAnZjgnKV0pCiAgICA+Pj4gZHQuaXNidWlsdGluCiAgICAwCgogICAgKQJaCGlzbmF0aXZlemEKICAgIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBieXRlIG9yZGVyIG9mIHRoaXMgZHR5cGUgaXMgbmF0aXZlCiAgICB0byB0aGUgcGxhdGZvcm0uCgogICAgKQJaD2lzYWxpZ25lZHN0cnVjdHrpCiAgICBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZHR5cGUgaXMgYSBzdHJ1Y3Qgd2hpY2ggbWFpbnRhaW5zCiAgICBmaWVsZCBhbGlnbm1lbnQuIFRoaXMgZmxhZyBpcyBzdGlja3ksIHNvIHdoZW4gY29tYmluaW5nIG11bHRpcGxlCiAgICBzdHJ1Y3RzIHRvZ2V0aGVyLCBpdCBpcyBwcmVzZXJ2ZWQgYW5kIHByb2R1Y2VzIG5ldyBkdHlwZXMgd2hpY2gKICAgIGFyZSBhbHNvIGFsaWduZWQuCiAgICApAnIcAAAAerYKICAgIFRoZSBlbGVtZW50IHNpemUgb2YgdGhpcyBkYXRhLXR5cGUgb2JqZWN0LgoKICAgIEZvciAxOCBvZiB0aGUgMjEgdHlwZXMgdGhpcyBudW1iZXIgaXMgZml4ZWQgYnkgdGhlIGRhdGEtdHlwZS4KICAgIEZvciB0aGUgZmxleGlibGUgZGF0YS10eXBlcywgdGhpcyBudW1iZXIgY2FuIGJlIGFueXRoaW5nLgoKICAgICkC2gRraW5kYWUBAAAKICAgIEEgY2hhcmFjdGVyIGNvZGUgKG9uZSBvZiAnYml1ZmNtTU9TVVYnKSBpZGVudGlmeWluZyB0aGUgZ2VuZXJhbCBraW5kIG9mIGRhdGEuCgogICAgPSAgPT09PT09PT09PT09PT09PT09PT09PQogICAgYiAgYm9vbGVhbgogICAgaSAgc2lnbmVkIGludGVnZXIKICAgIHUgIHVuc2lnbmVkIGludGVnZXIKICAgIGYgIGZsb2F0aW5nLXBvaW50CiAgICBjICBjb21wbGV4IGZsb2F0aW5nLXBvaW50CiAgICBtICB0aW1lZGVsdGEKICAgIE0gIGRhdGV0aW1lCiAgICBPICBvYmplY3QKICAgIFMgIChieXRlLSlzdHJpbmcKICAgIFUgIFVuaWNvZGUKICAgIFYgIHZvaWQKICAgID0gID09PT09PT09PT09PT09PT09PT09PT0KCiAgICApAnJXAAAAenQKICAgIEEgYml0LXdpZHRoIG5hbWUgZm9yIHRoaXMgZGF0YS10eXBlLgoKICAgIFVuLXNpemVkIGZsZXhpYmxlIGRhdGEtdHlwZSBvYmplY3RzIGRvIG5vdCBoYXZlIHRoaXMgYXR0cmlidXRlLgoKICAgICkC2gVuYW1lc2F3AQAACiAgICBPcmRlcmVkIGxpc3Qgb2YgZmllbGQgbmFtZXMsIG9yIGBgTm9uZWBgIGlmIHRoZXJlIGFyZSBubyBmaWVsZHMuCgogICAgVGhlIG5hbWVzIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byBpbmNyZWFzaW5nIGJ5dGUgb2Zmc2V0LiBUaGlzIGNhbiBiZQogICAgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIHdhbGsgdGhyb3VnaCBhbGwgb2YgdGhlIG5hbWVkIGZpZWxkcyBpbiBvZmZzZXQgb3JkZXIuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZHQgPSBucC5kdHlwZShbKCduYW1lJywgbnAuc3RyXywgMTYpLCAoJ2dyYWRlcycsIG5wLmZsb2F0NjQsICgyLCkpXSkKICAgID4+PiBkdC5uYW1lcwogICAgKCduYW1lJywgJ2dyYWRlcycpCgogICAgKQLaA251bXqECiAgICBBIHVuaXF1ZSBudW1iZXIgZm9yIGVhY2ggb2YgdGhlIDIxIGRpZmZlcmVudCBidWlsdC1pbiB0eXBlcy4KCiAgICBUaGVzZSBhcmUgcm91Z2hseSBvcmRlcmVkIGZyb20gbGVhc3QtdG8tbW9zdCBwcmVjaXNpb24uCgogICAgKQJyDQAAAHpqCiAgICBTaGFwZSB0dXBsZSBvZiB0aGUgc3ViLWFycmF5IGlmIHRoaXMgZGF0YSB0eXBlIGRlc2NyaWJlcyBhIHN1Yi1hcnJheSwKICAgIGFuZCBgYCgpYGAgb3RoZXJ3aXNlLgoKICAgICkCcgwAAAB6kAogICAgTnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIHN1Yi1hcnJheSBpZiB0aGlzIGRhdGEgdHlwZSBkZXNjcmliZXMgYQogICAgc3ViLWFycmF5LCBhbmQgYGAwYGAgb3RoZXJ3aXNlLgoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTMuMAoKICAgICkC2gNzdHJ6N1RoZSBhcnJheS1wcm90b2NvbCB0eXBlc3RyaW5nIG9mIHRoaXMgZGF0YS10eXBlIG9iamVjdC4pAloIc3ViZHR5cGVhlAEAAAogICAgVHVwbGUgYGAoaXRlbV9kdHlwZSwgc2hhcGUpYGAgaWYgdGhpcyBgZHR5cGVgIGRlc2NyaWJlcyBhIHN1Yi1hcnJheSwgYW5kCiAgICBOb25lIG90aGVyd2lzZS4KCiAgICBUaGUgKnNoYXBlKiBpcyB0aGUgZml4ZWQgc2hhcGUgb2YgdGhlIHN1Yi1hcnJheSBkZXNjcmliZWQgYnkgdGhpcwogICAgZGF0YSB0eXBlLCBhbmQgKml0ZW1fZHR5cGUqIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGFycmF5LgoKICAgIElmIGEgZmllbGQgd2hvc2UgZHR5cGUgb2JqZWN0IGhhcyB0aGlzIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQsCiAgICB0aGVuIHRoZSBleHRyYSBkaW1lbnNpb25zIGltcGxpZWQgYnkgKnNoYXBlKiBhcmUgdGFja2VkIG9uIHRvCiAgICB0aGUgZW5kIG9mIHRoZSByZXRyaWV2ZWQgYXJyYXkuCgogICAgKQLaBHR5cGV6P1RoZSB0eXBlIG9iamVjdCB1c2VkIHRvIGluc3RhbnRpYXRlIGEgc2NhbGFyIG9mIHRoaXMgZGF0YS10eXBlLikCckAAAABhoAcAAAogICAgbmV3Ynl0ZW9yZGVyKG5ld19vcmRlcj0nUycpCgogICAgUmV0dXJuIGEgbmV3IGR0eXBlIHdpdGggYSBkaWZmZXJlbnQgYnl0ZSBvcmRlci4KCiAgICBDaGFuZ2VzIGFyZSBhbHNvIG1hZGUgaW4gYWxsIGZpZWxkcyBhbmQgc3ViLWFycmF5cyBvZiB0aGUgZGF0YSB0eXBlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIG5ld19vcmRlciA6IHN0cmluZywgb3B0aW9uYWwKICAgICAgICBCeXRlIG9yZGVyIHRvIGZvcmNlOyBhIHZhbHVlIGZyb20gdGhlIGJ5dGUgb3JkZXIgc3BlY2lmaWNhdGlvbnMKICAgICAgICBiZWxvdy4gIFRoZSBkZWZhdWx0IHZhbHVlICgnUycpIHJlc3VsdHMgaW4gc3dhcHBpbmcgdGhlIGN1cnJlbnQKICAgICAgICBieXRlIG9yZGVyLiAgYG5ld19vcmRlcmAgY29kZXMgY2FuIGJlIGFueSBvZjoKCiAgICAgICAgKiAnUycgLSBzd2FwIGR0eXBlIGZyb20gY3VycmVudCB0byBvcHBvc2l0ZSBlbmRpYW4KICAgICAgICAqIHsnPCcsICdMJ30gLSBsaXR0bGUgZW5kaWFuCiAgICAgICAgKiB7Jz4nLCAnQid9IC0gYmlnIGVuZGlhbgogICAgICAgICogeyc9JywgJ04nfSAtIG5hdGl2ZSBvcmRlcgogICAgICAgICogeyd8JywgJ0knfSAtIGlnbm9yZSAobm8gY2hhbmdlIHRvIGJ5dGUgb3JkZXIpCgogICAgICAgIFRoZSBjb2RlIGRvZXMgYSBjYXNlLWluc2Vuc2l0aXZlIGNoZWNrIG9uIHRoZSBmaXJzdCBsZXR0ZXIgb2YKICAgICAgICBgbmV3X29yZGVyYCBmb3IgdGhlc2UgYWx0ZXJuYXRpdmVzLiAgRm9yIGV4YW1wbGUsIGFueSBvZiAnPicKICAgICAgICBvciAnQicgb3IgJ2InIG9yICdicmlhbicgYXJlIHZhbGlkIHRvIHNwZWNpZnkgYmlnLWVuZGlhbi4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBuZXdfZHR5cGUgOiBkdHlwZQogICAgICAgIE5ldyBkdHlwZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlIHRvIHRoZSBieXRlIG9yZGVyLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgQ2hhbmdlcyBhcmUgYWxzbyBtYWRlIGluIGFsbCBmaWVsZHMgYW5kIHN1Yi1hcnJheXMgb2YgdGhlIGRhdGEgdHlwZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBpbXBvcnQgc3lzCiAgICA+Pj4gc3lzX2lzX2xlID0gc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJwogICAgPj4+IG5hdGl2ZV9jb2RlID0gc3lzX2lzX2xlIGFuZCAnPCcgb3IgJz4nCiAgICA+Pj4gc3dhcHBlZF9jb2RlID0gc3lzX2lzX2xlIGFuZCAnPicgb3IgJzwnCiAgICA+Pj4gbmF0aXZlX2R0ID0gbnAuZHR5cGUobmF0aXZlX2NvZGUrJ2kyJykKICAgID4+PiBzd2FwcGVkX2R0ID0gbnAuZHR5cGUoc3dhcHBlZF9jb2RlKydpMicpCiAgICA+Pj4gbmF0aXZlX2R0Lm5ld2J5dGVvcmRlcignUycpID09IHN3YXBwZWRfZHQKICAgIFRydWUKICAgID4+PiBuYXRpdmVfZHQubmV3Ynl0ZW9yZGVyKCkgPT0gc3dhcHBlZF9kdAogICAgVHJ1ZQogICAgPj4+IG5hdGl2ZV9kdCA9PSBzd2FwcGVkX2R0Lm5ld2J5dGVvcmRlcignUycpCiAgICBUcnVlCiAgICA+Pj4gbmF0aXZlX2R0ID09IHN3YXBwZWRfZHQubmV3Ynl0ZW9yZGVyKCc9JykKICAgIFRydWUKICAgID4+PiBuYXRpdmVfZHQgPT0gc3dhcHBlZF9kdC5uZXdieXRlb3JkZXIoJ04nKQogICAgVHJ1ZQogICAgPj4+IG5hdGl2ZV9kdCA9PSBuYXRpdmVfZHQubmV3Ynl0ZW9yZGVyKCd8JykKICAgIFRydWUKICAgID4+PiBucC5kdHlwZSgnPGkyJykgPT0gbmF0aXZlX2R0Lm5ld2J5dGVvcmRlcignPCcpCiAgICBUcnVlCiAgICA+Pj4gbnAuZHR5cGUoJzxpMicpID09IG5hdGl2ZV9kdC5uZXdieXRlb3JkZXIoJ0wnKQogICAgVHJ1ZQogICAgPj4+IG5wLmR0eXBlKCc+aTInKSA9PSBuYXRpdmVfZHQubmV3Ynl0ZW9yZGVyKCc+JykKICAgIFRydWUKICAgID4+PiBucC5kdHlwZSgnPmkyJykgPT0gbmF0aXZlX2R0Lm5ld2J5dGVvcmRlcignQicpCiAgICBUcnVlCgogICAgWg5idXNkYXljYWxlbmRhcmHRCQAACiAgICBidXNkYXljYWxlbmRhcih3ZWVrbWFzaz0nMTExMTEwMCcsIGhvbGlkYXlzPU5vbmUpCgogICAgQSBidXNpbmVzcyBkYXkgY2FsZW5kYXIgb2JqZWN0IHRoYXQgZWZmaWNpZW50bHkgc3RvcmVzIGluZm9ybWF0aW9uCiAgICBkZWZpbmluZyB2YWxpZCBkYXlzIGZvciB0aGUgYnVzZGF5IGZhbWlseSBvZiBmdW5jdGlvbnMuCgogICAgVGhlIGRlZmF1bHQgdmFsaWQgZGF5cyBhcmUgTW9uZGF5IHRocm91Z2ggRnJpZGF5ICgiYnVzaW5lc3MgZGF5cyIpLgogICAgQSBidXNkYXljYWxlbmRhciBvYmplY3QgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGFueSBzZXQgb2Ygd2Vla2x5CiAgICB2YWxpZCBkYXlzLCBwbHVzIGFuIG9wdGlvbmFsICJob2xpZGF5IiBkYXRlcyB0aGF0IGFsd2F5cyB3aWxsIGJlIGludmFsaWQuCgogICAgT25jZSBhIGJ1c2RheWNhbGVuZGFyIG9iamVjdCBpcyBjcmVhdGVkLCB0aGUgd2Vla21hc2sgYW5kIGhvbGlkYXlzCiAgICBjYW5ub3QgYmUgbW9kaWZpZWQuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB3ZWVrbWFzayA6IHN0ciBvciBhcnJheV9saWtlIG9mIGJvb2wsIG9wdGlvbmFsCiAgICAgICAgQSBzZXZlbi1lbGVtZW50IGFycmF5IGluZGljYXRpbmcgd2hpY2ggb2YgTW9uZGF5IHRocm91Z2ggU3VuZGF5IGFyZQogICAgICAgIHZhbGlkIGRheXMuIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBsZW5ndGgtc2V2ZW4gbGlzdCBvciBhcnJheSwgbGlrZQogICAgICAgIFsxLDEsMSwxLDEsMCwwXTsgYSBsZW5ndGgtc2V2ZW4gc3RyaW5nLCBsaWtlICcxMTExMTAwJzsgb3IgYSBzdHJpbmcKICAgICAgICBsaWtlICJNb24gVHVlIFdlZCBUaHUgRnJpIiwgbWFkZSB1cCBvZiAzLWNoYXJhY3RlciBhYmJyZXZpYXRpb25zIGZvcgogICAgICAgIHdlZWtkYXlzLCBvcHRpb25hbGx5IHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZS4gVmFsaWQgYWJicmV2aWF0aW9ucwogICAgICAgIGFyZTogTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXQgU3VuCiAgICBob2xpZGF5cyA6IGFycmF5X2xpa2Ugb2YgZGF0ZXRpbWU2NFtEXSwgb3B0aW9uYWwKICAgICAgICBBbiBhcnJheSBvZiBkYXRlcyB0byBjb25zaWRlciBhcyBpbnZhbGlkIGRhdGVzLCBubyBtYXR0ZXIgd2hpY2gKICAgICAgICB3ZWVrZGF5IHRoZXkgZmFsbCB1cG9uLiAgSG9saWRheSBkYXRlcyBtYXkgYmUgc3BlY2lmaWVkIGluIGFueQogICAgICAgIG9yZGVyLCBhbmQgTmFUIChub3QtYS10aW1lKSBkYXRlcyBhcmUgaWdub3JlZC4gIFRoaXMgbGlzdCBpcwogICAgICAgIHNhdmVkIGluIGEgbm9ybWFsaXplZCBmb3JtIHRoYXQgaXMgc3VpdGVkIGZvciBmYXN0IGNhbGN1bGF0aW9ucwogICAgICAgIG9mIHZhbGlkIGRheXMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogYnVzZGF5Y2FsZW5kYXIKICAgICAgICBBIGJ1c2luZXNzIGRheSBjYWxlbmRhciBvYmplY3QgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkCiAgICAgICAgd2Vla21hc2sgYW5kIGhvbGlkYXlzIHZhbHVlcy4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGlzX2J1c2RheSA6IFJldHVybnMgYSBib29sZWFuIGFycmF5IGluZGljYXRpbmcgdmFsaWQgZGF5cy4KICAgIGJ1c2RheV9vZmZzZXQgOiBBcHBsaWVzIGFuIG9mZnNldCBjb3VudGVkIGluIHZhbGlkIGRheXMuCiAgICBidXNkYXlfY291bnQgOiBDb3VudHMgaG93IG1hbnkgdmFsaWQgZGF5cyBhcmUgaW4gYSBoYWxmLW9wZW4gZGF0ZSByYW5nZS4KCiAgICBBdHRyaWJ1dGVzCiAgICAtLS0tLS0tLS0tCiAgICBOb3RlOiBvbmNlIGEgYnVzZGF5Y2FsZW5kYXIgb2JqZWN0IGlzIGNyZWF0ZWQsIHlvdSBjYW5ub3QgbW9kaWZ5IHRoZQogICAgd2Vla21hc2sgb3IgaG9saWRheXMuICBUaGUgYXR0cmlidXRlcyByZXR1cm4gY29waWVzIG9mIGludGVybmFsIGRhdGEuCiAgICB3ZWVrbWFzayA6IChjb3B5KSBzZXZlbi1lbGVtZW50IGFycmF5IG9mIGJvb2wKICAgIGhvbGlkYXlzIDogKGNvcHkpIHNvcnRlZCBhcnJheSBvZiBkYXRldGltZTY0W0RdCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gIyBTb21lIGltcG9ydGFudCBkYXlzIGluIEp1bHkKICAgIC4uLiBiZGQgPSBucC5idXNkYXljYWxlbmRhcigKICAgIC4uLiAgICAgICAgICAgICBob2xpZGF5cz1bJzIwMTEtMDctMDEnLCAnMjAxMS0wNy0wNCcsICcyMDExLTA3LTE3J10pCiAgICA+Pj4gIyBEZWZhdWx0IGlzIE1vbmRheSB0byBGcmlkYXkgd2Vla2RheXMKICAgIC4uLiBiZGQud2Vla21hc2sKICAgIGFycmF5KFsgVHJ1ZSwgIFRydWUsICBUcnVlLCAgVHJ1ZSwgIFRydWUsIEZhbHNlLCBGYWxzZV0sIGR0eXBlPSdib29sJykKICAgID4+PiAjIEFueSBob2xpZGF5cyBhbHJlYWR5IG9uIHRoZSB3ZWVrZW5kIGFyZSByZW1vdmVkCiAgICAuLi4gYmRkLmhvbGlkYXlzCiAgICBhcnJheShbJzIwMTEtMDctMDEnLCAnMjAxMS0wNy0wNCddLCBkdHlwZT0nZGF0ZXRpbWU2NFtEXScpCiAgICApAloId2Vla21hc2t6P0EgY29weSBvZiB0aGUgc2V2ZW4tZWxlbWVudCBib29sZWFuIG1hc2sgaW5kaWNhdGluZyB2YWxpZCBkYXlzLikCWghob2xpZGF5c3o/QSBjb3B5IG9mIHRoZSBob2xpZGF5IGFycmF5IGluZGljYXRpbmcgYWRkaXRpb25hbCBpbnZhbGlkIGRheXMuWglpc19idXNkYXlhBwgAAAogICAgaXNfYnVzZGF5KGRhdGVzLCB3ZWVrbWFzaz0nMTExMTEwMCcsIGhvbGlkYXlzPU5vbmUsIGJ1c2RheWNhbD1Ob25lLCBvdXQ9Tm9uZSkKCiAgICBDYWxjdWxhdGVzIHdoaWNoIG9mIHRoZSBnaXZlbiBkYXRlcyBhcmUgdmFsaWQgZGF5cywgYW5kIHdoaWNoIGFyZSBub3QuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBkYXRlcyA6IGFycmF5X2xpa2Ugb2YgZGF0ZXRpbWU2NFtEXQogICAgICAgIFRoZSBhcnJheSBvZiBkYXRlcyB0byBwcm9jZXNzLgogICAgd2Vla21hc2sgOiBzdHIgb3IgYXJyYXlfbGlrZSBvZiBib29sLCBvcHRpb25hbAogICAgICAgIEEgc2V2ZW4tZWxlbWVudCBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIG9mIE1vbmRheSB0aHJvdWdoIFN1bmRheSBhcmUKICAgICAgICB2YWxpZCBkYXlzLiBNYXkgYmUgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLXNldmVuIGxpc3Qgb3IgYXJyYXksIGxpa2UKICAgICAgICBbMSwxLDEsMSwxLDAsMF07IGEgbGVuZ3RoLXNldmVuIHN0cmluZywgbGlrZSAnMTExMTEwMCc7IG9yIGEgc3RyaW5nCiAgICAgICAgbGlrZSAiTW9uIFR1ZSBXZWQgVGh1IEZyaSIsIG1hZGUgdXAgb2YgMy1jaGFyYWN0ZXIgYWJicmV2aWF0aW9ucyBmb3IKICAgICAgICB3ZWVrZGF5cywgb3B0aW9uYWxseSBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UuIFZhbGlkIGFiYnJldmlhdGlvbnMKICAgICAgICBhcmU6IE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0IFN1bgogICAgaG9saWRheXMgOiBhcnJheV9saWtlIG9mIGRhdGV0aW1lNjRbRF0sIG9wdGlvbmFsCiAgICAgICAgQW4gYXJyYXkgb2YgZGF0ZXMgdG8gY29uc2lkZXIgYXMgaW52YWxpZCBkYXRlcy4gIFRoZXkgbWF5IGJlCiAgICAgICAgc3BlY2lmaWVkIGluIGFueSBvcmRlciwgYW5kIE5hVCAobm90LWEtdGltZSkgZGF0ZXMgYXJlIGlnbm9yZWQuCiAgICAgICAgVGhpcyBsaXN0IGlzIHNhdmVkIGluIGEgbm9ybWFsaXplZCBmb3JtIHRoYXQgaXMgc3VpdGVkIGZvcgogICAgICAgIGZhc3QgY2FsY3VsYXRpb25zIG9mIHZhbGlkIGRheXMuCiAgICBidXNkYXljYWwgOiBidXNkYXljYWxlbmRhciwgb3B0aW9uYWwKICAgICAgICBBIGBidXNkYXljYWxlbmRhcmAgb2JqZWN0IHdoaWNoIHNwZWNpZmllcyB0aGUgdmFsaWQgZGF5cy4gSWYgdGhpcwogICAgICAgIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgbmVpdGhlciB3ZWVrbWFzayBub3IgaG9saWRheXMgbWF5IGJlCiAgICAgICAgcHJvdmlkZWQuCiAgICBvdXQgOiBhcnJheSBvZiBib29sLCBvcHRpb25hbAogICAgICAgIElmIHByb3ZpZGVkLCB0aGlzIGFycmF5IGlzIGZpbGxlZCB3aXRoIHRoZSByZXN1bHQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogYXJyYXkgb2YgYm9vbAogICAgICAgIEFuIGFycmF5IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGBkYXRlc2BgLCBjb250YWluaW5nIFRydWUgZm9yCiAgICAgICAgZWFjaCB2YWxpZCBkYXksIGFuZCBGYWxzZSBmb3IgZWFjaCBpbnZhbGlkIGRheS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGJ1c2RheWNhbGVuZGFyOiBBbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgYSBjdXN0b20gc2V0IG9mIHZhbGlkIGRheXMuCiAgICBidXNkYXlfb2Zmc2V0IDogQXBwbGllcyBhbiBvZmZzZXQgY291bnRlZCBpbiB2YWxpZCBkYXlzLgogICAgYnVzZGF5X2NvdW50IDogQ291bnRzIGhvdyBtYW55IHZhbGlkIGRheXMgYXJlIGluIGEgaGFsZi1vcGVuIGRhdGUgcmFuZ2UuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gIyBUaGUgd2Vla2RheXMgYXJlIEZyaWRheSwgU2F0dXJkYXksIGFuZCBNb25kYXkKICAgIC4uLiBucC5pc19idXNkYXkoWycyMDExLTA3LTAxJywgJzIwMTEtMDctMDInLCAnMjAxMS0wNy0xOCddLAogICAgLi4uICAgICAgICAgICAgICAgICBob2xpZGF5cz1bJzIwMTEtMDctMDEnLCAnMjAxMS0wNy0wNCcsICcyMDExLTA3LTE3J10pCiAgICBhcnJheShbRmFsc2UsIEZhbHNlLCAgVHJ1ZV0sIGR0eXBlPSdib29sJykKICAgIFoNYnVzZGF5X29mZnNldGEpEAAACiAgICBidXNkYXlfb2Zmc2V0KGRhdGVzLCBvZmZzZXRzLCByb2xsPSdyYWlzZScsIHdlZWttYXNrPScxMTExMTAwJywgaG9saWRheXM9Tm9uZSwgYnVzZGF5Y2FsPU5vbmUsIG91dD1Ob25lKQoKICAgIEZpcnN0IGFkanVzdHMgdGhlIGRhdGUgdG8gZmFsbCBvbiBhIHZhbGlkIGRheSBhY2NvcmRpbmcgdG8KICAgIHRoZSBgYHJvbGxgYCBydWxlLCB0aGVuIGFwcGxpZXMgb2Zmc2V0cyB0byB0aGUgZ2l2ZW4gZGF0ZXMKICAgIGNvdW50ZWQgaW4gdmFsaWQgZGF5cy4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGRhdGVzIDogYXJyYXlfbGlrZSBvZiBkYXRldGltZTY0W0RdCiAgICAgICAgVGhlIGFycmF5IG9mIGRhdGVzIHRvIHByb2Nlc3MuCiAgICBvZmZzZXRzIDogYXJyYXlfbGlrZSBvZiBpbnQKICAgICAgICBUaGUgYXJyYXkgb2Ygb2Zmc2V0cywgd2hpY2ggaXMgYnJvYWRjYXN0IHdpdGggYGBkYXRlc2BgLgogICAgcm9sbCA6IHsncmFpc2UnLCAnbmF0JywgJ2ZvcndhcmQnLCAnZm9sbG93aW5nJywgJ2JhY2t3YXJkJywgJ3ByZWNlZGluZycsICdtb2RpZmllZGZvbGxvd2luZycsICdtb2RpZmllZHByZWNlZGluZyd9LCBvcHRpb25hbAogICAgICAgIEhvdyB0byB0cmVhdCBkYXRlcyB0aGF0IGRvIG5vdCBmYWxsIG9uIGEgdmFsaWQgZGF5LiBUaGUgZGVmYXVsdAogICAgICAgIGlzICdyYWlzZScuCgogICAgICAgICAgKiAncmFpc2UnIG1lYW5zIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgYW4gaW52YWxpZCBkYXkuCiAgICAgICAgICAqICduYXQnIG1lYW5zIHRvIHJldHVybiBhIE5hVCAobm90LWEtdGltZSkgZm9yIGFuIGludmFsaWQgZGF5LgogICAgICAgICAgKiAnZm9yd2FyZCcgYW5kICdmb2xsb3dpbmcnIG1lYW4gdG8gdGFrZSB0aGUgZmlyc3QgdmFsaWQgZGF5CiAgICAgICAgICAgIGxhdGVyIGluIHRpbWUuCiAgICAgICAgICAqICdiYWNrd2FyZCcgYW5kICdwcmVjZWRpbmcnIG1lYW4gdG8gdGFrZSB0aGUgZmlyc3QgdmFsaWQgZGF5CiAgICAgICAgICAgIGVhcmxpZXIgaW4gdGltZS4KICAgICAgICAgICogJ21vZGlmaWVkZm9sbG93aW5nJyBtZWFucyB0byB0YWtlIHRoZSBmaXJzdCB2YWxpZCBkYXkKICAgICAgICAgICAgbGF0ZXIgaW4gdGltZSB1bmxlc3MgaXQgaXMgYWNyb3NzIGEgTW9udGggYm91bmRhcnksIGluIHdoaWNoCiAgICAgICAgICAgIGNhc2UgdG8gdGFrZSB0aGUgZmlyc3QgdmFsaWQgZGF5IGVhcmxpZXIgaW4gdGltZS4KICAgICAgICAgICogJ21vZGlmaWVkcHJlY2VkaW5nJyBtZWFucyB0byB0YWtlIHRoZSBmaXJzdCB2YWxpZCBkYXkKICAgICAgICAgICAgZWFybGllciBpbiB0aW1lIHVubGVzcyBpdCBpcyBhY3Jvc3MgYSBNb250aCBib3VuZGFyeSwgaW4gd2hpY2gKICAgICAgICAgICAgY2FzZSB0byB0YWtlIHRoZSBmaXJzdCB2YWxpZCBkYXkgbGF0ZXIgaW4gdGltZS4KICAgIHdlZWttYXNrIDogc3RyIG9yIGFycmF5X2xpa2Ugb2YgYm9vbCwgb3B0aW9uYWwKICAgICAgICBBIHNldmVuLWVsZW1lbnQgYXJyYXkgaW5kaWNhdGluZyB3aGljaCBvZiBNb25kYXkgdGhyb3VnaCBTdW5kYXkgYXJlCiAgICAgICAgdmFsaWQgZGF5cy4gTWF5IGJlIHNwZWNpZmllZCBhcyBhIGxlbmd0aC1zZXZlbiBsaXN0IG9yIGFycmF5LCBsaWtlCiAgICAgICAgWzEsMSwxLDEsMSwwLDBdOyBhIGxlbmd0aC1zZXZlbiBzdHJpbmcsIGxpa2UgJzExMTExMDAnOyBvciBhIHN0cmluZwogICAgICAgIGxpa2UgIk1vbiBUdWUgV2VkIFRodSBGcmkiLCBtYWRlIHVwIG9mIDMtY2hhcmFjdGVyIGFiYnJldmlhdGlvbnMgZm9yCiAgICAgICAgd2Vla2RheXMsIG9wdGlvbmFsbHkgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlLiBWYWxpZCBhYmJyZXZpYXRpb25zCiAgICAgICAgYXJlOiBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdCBTdW4KICAgIGhvbGlkYXlzIDogYXJyYXlfbGlrZSBvZiBkYXRldGltZTY0W0RdLCBvcHRpb25hbAogICAgICAgIEFuIGFycmF5IG9mIGRhdGVzIHRvIGNvbnNpZGVyIGFzIGludmFsaWQgZGF0ZXMuICBUaGV5IG1heSBiZQogICAgICAgIHNwZWNpZmllZCBpbiBhbnkgb3JkZXIsIGFuZCBOYVQgKG5vdC1hLXRpbWUpIGRhdGVzIGFyZSBpZ25vcmVkLgogICAgICAgIFRoaXMgbGlzdCBpcyBzYXZlZCBpbiBhIG5vcm1hbGl6ZWQgZm9ybSB0aGF0IGlzIHN1aXRlZCBmb3IKICAgICAgICBmYXN0IGNhbGN1bGF0aW9ucyBvZiB2YWxpZCBkYXlzLgogICAgYnVzZGF5Y2FsIDogYnVzZGF5Y2FsZW5kYXIsIG9wdGlvbmFsCiAgICAgICAgQSBgYnVzZGF5Y2FsZW5kYXJgIG9iamVjdCB3aGljaCBzcGVjaWZpZXMgdGhlIHZhbGlkIGRheXMuIElmIHRoaXMKICAgICAgICBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIG5laXRoZXIgd2Vla21hc2sgbm9yIGhvbGlkYXlzIG1heSBiZQogICAgICAgIHByb3ZpZGVkLgogICAgb3V0IDogYXJyYXkgb2YgZGF0ZXRpbWU2NFtEXSwgb3B0aW9uYWwKICAgICAgICBJZiBwcm92aWRlZCwgdGhpcyBhcnJheSBpcyBmaWxsZWQgd2l0aCB0aGUgcmVzdWx0LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGFycmF5IG9mIGRhdGV0aW1lNjRbRF0KICAgICAgICBBbiBhcnJheSB3aXRoIGEgc2hhcGUgZnJvbSBicm9hZGNhc3RpbmcgYGBkYXRlc2BgIGFuZCBgYG9mZnNldHNgYAogICAgICAgIHRvZ2V0aGVyLCBjb250YWluaW5nIHRoZSBkYXRlcyB3aXRoIG9mZnNldHMgYXBwbGllZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGJ1c2RheWNhbGVuZGFyOiBBbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgYSBjdXN0b20gc2V0IG9mIHZhbGlkIGRheXMuCiAgICBpc19idXNkYXkgOiBSZXR1cm5zIGEgYm9vbGVhbiBhcnJheSBpbmRpY2F0aW5nIHZhbGlkIGRheXMuCiAgICBidXNkYXlfY291bnQgOiBDb3VudHMgaG93IG1hbnkgdmFsaWQgZGF5cyBhcmUgaW4gYSBoYWxmLW9wZW4gZGF0ZSByYW5nZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiAjIEZpcnN0IGJ1c2luZXNzIGRheSBpbiBPY3RvYmVyIDIwMTEgKG5vdCBhY2NvdW50aW5nIGZvciBob2xpZGF5cykKICAgIC4uLiBucC5idXNkYXlfb2Zmc2V0KCcyMDExLTEwJywgMCwgcm9sbD0nZm9yd2FyZCcpCiAgICBudW1weS5kYXRldGltZTY0KCcyMDExLTEwLTAzJywnRCcpCiAgICA+Pj4gIyBMYXN0IGJ1c2luZXNzIGRheSBpbiBGZWJydWFyeSAyMDEyIChub3QgYWNjb3VudGluZyBmb3IgaG9saWRheXMpCiAgICAuLi4gbnAuYnVzZGF5X29mZnNldCgnMjAxMi0wMycsIC0xLCByb2xsPSdmb3J3YXJkJykKICAgIG51bXB5LmRhdGV0aW1lNjQoJzIwMTItMDItMjknLCdEJykKICAgID4+PiAjIFRoaXJkIFdlZG5lc2RheSBpbiBKYW51YXJ5IDIwMTEKICAgIC4uLiBucC5idXNkYXlfb2Zmc2V0KCcyMDExLTAxJywgMiwgcm9sbD0nZm9yd2FyZCcsIHdlZWttYXNrPSdXZWQnKQogICAgbnVtcHkuZGF0ZXRpbWU2NCgnMjAxMS0wMS0xOScsJ0QnKQogICAgPj4+ICMgMjAxMiBNb3RoZXIncyBEYXkgaW4gQ2FuYWRhIGFuZCB0aGUgVS5TLgogICAgLi4uIG5wLmJ1c2RheV9vZmZzZXQoJzIwMTItMDUnLCAxLCByb2xsPSdmb3J3YXJkJywgd2Vla21hc2s9J1N1bicpCiAgICBudW1weS5kYXRldGltZTY0KCcyMDEyLTA1LTEzJywnRCcpCgogICAgPj4+ICMgRmlyc3QgYnVzaW5lc3MgZGF5IG9uIG9yIGFmdGVyIGEgZGF0ZQogICAgLi4uIG5wLmJ1c2RheV9vZmZzZXQoJzIwMTEtMDMtMjAnLCAwLCByb2xsPSdmb3J3YXJkJykKICAgIG51bXB5LmRhdGV0aW1lNjQoJzIwMTEtMDMtMjEnLCdEJykKICAgID4+PiBucC5idXNkYXlfb2Zmc2V0KCcyMDExLTAzLTIyJywgMCwgcm9sbD0nZm9yd2FyZCcpCiAgICBudW1weS5kYXRldGltZTY0KCcyMDExLTAzLTIyJywnRCcpCiAgICA+Pj4gIyBGaXJzdCBidXNpbmVzcyBkYXkgYWZ0ZXIgYSBkYXRlCiAgICAuLi4gbnAuYnVzZGF5X29mZnNldCgnMjAxMS0wMy0yMCcsIDEsIHJvbGw9J2JhY2t3YXJkJykKICAgIG51bXB5LmRhdGV0aW1lNjQoJzIwMTEtMDMtMjEnLCdEJykKICAgID4+PiBucC5idXNkYXlfb2Zmc2V0KCcyMDExLTAzLTIyJywgMSwgcm9sbD0nYmFja3dhcmQnKQogICAgbnVtcHkuZGF0ZXRpbWU2NCgnMjAxMS0wMy0yMycsJ0QnKQogICAgWgxidXNkYXlfY291bnRhtwkAAAogICAgYnVzZGF5X2NvdW50KGJlZ2luZGF0ZXMsIGVuZGRhdGVzLCB3ZWVrbWFzaz0nMTExMTEwMCcsIGhvbGlkYXlzPVtdLCBidXNkYXljYWw9Tm9uZSwgb3V0PU5vbmUpCgogICAgQ291bnRzIHRoZSBudW1iZXIgb2YgdmFsaWQgZGF5cyBiZXR3ZWVuIGBiZWdpbmRhdGVzYCBhbmQKICAgIGBlbmRkYXRlc2AsIG5vdCBpbmNsdWRpbmcgdGhlIGRheSBvZiBgZW5kZGF0ZXNgLgoKICAgIElmIGBgZW5kZGF0ZXNgYCBzcGVjaWZpZXMgYSBkYXRlIHZhbHVlIHRoYXQgaXMgZWFybGllciB0aGFuIHRoZQogICAgY29ycmVzcG9uZGluZyBgYGJlZ2luZGF0ZXNgYCBkYXRlIHZhbHVlLCB0aGUgY291bnQgd2lsbCBiZSBuZWdhdGl2ZS4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGJlZ2luZGF0ZXMgOiBhcnJheV9saWtlIG9mIGRhdGV0aW1lNjRbRF0KICAgICAgICBUaGUgYXJyYXkgb2YgdGhlIGZpcnN0IGRhdGVzIGZvciBjb3VudGluZy4KICAgIGVuZGRhdGVzIDogYXJyYXlfbGlrZSBvZiBkYXRldGltZTY0W0RdCiAgICAgICAgVGhlIGFycmF5IG9mIHRoZSBlbmQgZGF0ZXMgZm9yIGNvdW50aW5nLCB3aGljaCBhcmUgZXhjbHVkZWQKICAgICAgICBmcm9tIHRoZSBjb3VudCB0aGVtc2VsdmVzLgogICAgd2Vla21hc2sgOiBzdHIgb3IgYXJyYXlfbGlrZSBvZiBib29sLCBvcHRpb25hbAogICAgICAgIEEgc2V2ZW4tZWxlbWVudCBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIG9mIE1vbmRheSB0aHJvdWdoIFN1bmRheSBhcmUKICAgICAgICB2YWxpZCBkYXlzLiBNYXkgYmUgc3BlY2lmaWVkIGFzIGEgbGVuZ3RoLXNldmVuIGxpc3Qgb3IgYXJyYXksIGxpa2UKICAgICAgICBbMSwxLDEsMSwxLDAsMF07IGEgbGVuZ3RoLXNldmVuIHN0cmluZywgbGlrZSAnMTExMTEwMCc7IG9yIGEgc3RyaW5nCiAgICAgICAgbGlrZSAiTW9uIFR1ZSBXZWQgVGh1IEZyaSIsIG1hZGUgdXAgb2YgMy1jaGFyYWN0ZXIgYWJicmV2aWF0aW9ucyBmb3IKICAgICAgICB3ZWVrZGF5cywgb3B0aW9uYWxseSBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UuIFZhbGlkIGFiYnJldmlhdGlvbnMKICAgICAgICBhcmU6IE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0IFN1bgogICAgaG9saWRheXMgOiBhcnJheV9saWtlIG9mIGRhdGV0aW1lNjRbRF0sIG9wdGlvbmFsCiAgICAgICAgQW4gYXJyYXkgb2YgZGF0ZXMgdG8gY29uc2lkZXIgYXMgaW52YWxpZCBkYXRlcy4gIFRoZXkgbWF5IGJlCiAgICAgICAgc3BlY2lmaWVkIGluIGFueSBvcmRlciwgYW5kIE5hVCAobm90LWEtdGltZSkgZGF0ZXMgYXJlIGlnbm9yZWQuCiAgICAgICAgVGhpcyBsaXN0IGlzIHNhdmVkIGluIGEgbm9ybWFsaXplZCBmb3JtIHRoYXQgaXMgc3VpdGVkIGZvcgogICAgICAgIGZhc3QgY2FsY3VsYXRpb25zIG9mIHZhbGlkIGRheXMuCiAgICBidXNkYXljYWwgOiBidXNkYXljYWxlbmRhciwgb3B0aW9uYWwKICAgICAgICBBIGBidXNkYXljYWxlbmRhcmAgb2JqZWN0IHdoaWNoIHNwZWNpZmllcyB0aGUgdmFsaWQgZGF5cy4gSWYgdGhpcwogICAgICAgIHBhcmFtZXRlciBpcyBwcm92aWRlZCwgbmVpdGhlciB3ZWVrbWFzayBub3IgaG9saWRheXMgbWF5IGJlCiAgICAgICAgcHJvdmlkZWQuCiAgICBvdXQgOiBhcnJheSBvZiBpbnQsIG9wdGlvbmFsCiAgICAgICAgSWYgcHJvdmlkZWQsIHRoaXMgYXJyYXkgaXMgZmlsbGVkIHdpdGggdGhlIHJlc3VsdC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBhcnJheSBvZiBpbnQKICAgICAgICBBbiBhcnJheSB3aXRoIGEgc2hhcGUgZnJvbSBicm9hZGNhc3RpbmcgYGBiZWdpbmRhdGVzYGAgYW5kIGBgZW5kZGF0ZXNgYAogICAgICAgIHRvZ2V0aGVyLCBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdmFsaWQgZGF5cyBiZXR3ZWVuCiAgICAgICAgdGhlIGJlZ2luIGFuZCBlbmQgZGF0ZXMuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBidXNkYXljYWxlbmRhcjogQW4gb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGEgY3VzdG9tIHNldCBvZiB2YWxpZCBkYXlzLgogICAgaXNfYnVzZGF5IDogUmV0dXJucyBhIGJvb2xlYW4gYXJyYXkgaW5kaWNhdGluZyB2YWxpZCBkYXlzLgogICAgYnVzZGF5X29mZnNldCA6IEFwcGxpZXMgYW4gb2Zmc2V0IGNvdW50ZWQgaW4gdmFsaWQgZGF5cy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiAjIE51bWJlciBvZiB3ZWVrZGF5cyBpbiBKYW51YXJ5IDIwMTEKICAgIC4uLiBucC5idXNkYXlfY291bnQoJzIwMTEtMDEnLCAnMjAxMS0wMicpCiAgICAyMQogICAgPj4+ICMgTnVtYmVyIG9mIHdlZWtkYXlzIGluIDIwMTEKICAgIC4uLiAgbnAuYnVzZGF5X2NvdW50KCcyMDExJywgJzIwMTInKQogICAgMjYwCiAgICA+Pj4gIyBOdW1iZXIgb2YgU2F0dXJkYXlzIGluIDIwMTEKICAgIC4uLiBucC5idXNkYXlfY291bnQoJzIwMTEnLCAnMjAxMicsIHdlZWttYXNrPSdTYXQnKQogICAgNTMKICAgIFoUbm9ybWFsaXplX2F4aXNfaW5kZXhhegUAAAogICAgbm9ybWFsaXplX2F4aXNfaW5kZXgoYXhpcywgbmRpbSwgbXNnX3ByZWZpeD1Ob25lKQoKICAgIE5vcm1hbGl6ZXMgYW4gYXhpcyBpbmRleCwgYGF4aXNgLCBzdWNoIHRoYXQgaXMgYSB2YWxpZCBwb3NpdGl2ZSBpbmRleCBpbnRvCiAgICB0aGUgc2hhcGUgb2YgYXJyYXkgd2l0aCBgbmRpbWAgZGltZW5zaW9ucy4gUmFpc2VzIGFuIEF4aXNFcnJvciB3aXRoIGFuCiAgICBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmIHRoaXMgaXMgbm90IHBvc3NpYmxlLgoKICAgIFVzZWQgaW50ZXJuYWxseSBieSBhbGwgYXhpcy1jaGVja2luZyBsb2dpYy4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEzLjAKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBheGlzIDogaW50CiAgICAgICAgVGhlIHVuLW5vcm1hbGl6ZWQgaW5kZXggb2YgdGhlIGF4aXMuIENhbiBiZSBuZWdhdGl2ZQogICAgbmRpbSA6IGludAogICAgICAgIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBvZiB0aGUgYXJyYXkgdGhhdCBgYXhpc2Agc2hvdWxkIGJlIG5vcm1hbGl6ZWQKICAgICAgICBhZ2FpbnN0CiAgICBtc2dfcHJlZml4IDogc3RyCiAgICAgICAgQSBwcmVmaXggdG8gcHV0IGJlZm9yZSB0aGUgbWVzc2FnZSwgdHlwaWNhbGx5IHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG5vcm1hbGl6ZWRfYXhpcyA6IGludAogICAgICAgIFRoZSBub3JtYWxpemVkIGF4aXMgaW5kZXgsIHN1Y2ggdGhhdCBgMCA8PSBub3JtYWxpemVkX2F4aXMgPCBuZGltYAoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBBeGlzRXJyb3IKICAgICAgICBJZiB0aGUgYXhpcyBpbmRleCBpcyBpbnZhbGlkLCB3aGVuIGAtbmRpbSA8PSBheGlzIDwgbmRpbWAgaXMgZmFsc2UuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbm9ybWFsaXplX2F4aXNfaW5kZXgoMCwgbmRpbT0zKQogICAgMAogICAgPj4+IG5vcm1hbGl6ZV9heGlzX2luZGV4KDEsIG5kaW09MykKICAgIDEKICAgID4+PiBub3JtYWxpemVfYXhpc19pbmRleCgtMSwgbmRpbT0zKQogICAgMgoKICAgID4+PiBub3JtYWxpemVfYXhpc19pbmRleCgzLCBuZGltPTMpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAuLi4KICAgIEF4aXNFcnJvcjogYXhpcyAzIGlzIG91dCBvZiBib3VuZHMgZm9yIGFycmF5IG9mIGRpbWVuc2lvbiAzCiAgICA+Pj4gbm9ybWFsaXplX2F4aXNfaW5kZXgoLTQsIG5kaW09MywgbXNnX3ByZWZpeD0nYXhlc19hcmcnKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgLi4uCiAgICBBeGlzRXJyb3I6IGF4ZXNfYXJnOiBheGlzIC00IGlzIG91dCBvZiBib3VuZHMgZm9yIGFycmF5IG9mIGRpbWVuc2lvbiAzCiAgICB6Fm51bXB5LmxpYi5pbmRleF90cmlja3NaBW1ncmlkYWcFAAAKICAgIGBuZF9ncmlkYCBpbnN0YW5jZSB3aGljaCByZXR1cm5zIGEgZGVuc2UgbXVsdGktZGltZW5zaW9uYWwgIm1lc2hncmlkIi4KCiAgICBBbiBpbnN0YW5jZSBvZiBgbnVtcHkubGliLmluZGV4X3RyaWNrcy5uZF9ncmlkYCB3aGljaCByZXR1cm5zIGFuIGRlbnNlCiAgICAob3IgZmxlc2hlZCBvdXQpIG1lc2gtZ3JpZCB3aGVuIGluZGV4ZWQsIHNvIHRoYXQgZWFjaCByZXR1cm5lZCBhcmd1bWVudAogICAgaGFzIHRoZSBzYW1lIHNoYXBlLiAgVGhlIGRpbWVuc2lvbnMgYW5kIG51bWJlciBvZiB0aGUgb3V0cHV0IGFycmF5cyBhcmUKICAgIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaW5kZXhpbmcgZGltZW5zaW9ucy4gIElmIHRoZSBzdGVwIGxlbmd0aCBpcyBub3QgYQogICAgY29tcGxleCBudW1iZXIsIHRoZW4gdGhlIHN0b3AgaXMgbm90IGluY2x1c2l2ZS4KCiAgICBIb3dldmVyLCBpZiB0aGUgc3RlcCBsZW5ndGggaXMgYSAqKmNvbXBsZXggbnVtYmVyKiogKGUuZy4gNWopLCB0aGVuCiAgICB0aGUgaW50ZWdlciBwYXJ0IG9mIGl0cyBtYWduaXR1ZGUgaXMgaW50ZXJwcmV0ZWQgYXMgc3BlY2lmeWluZyB0aGUKICAgIG51bWJlciBvZiBwb2ludHMgdG8gY3JlYXRlIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBzdG9wIHZhbHVlcywgd2hlcmUKICAgIHRoZSBzdG9wIHZhbHVlICoqaXMgaW5jbHVzaXZlKiouCgogICAgUmV0dXJucwogICAgLS0tLS0tLS0tLQogICAgbWVzaC1ncmlkIGBuZGFycmF5c2AgYWxsIG9mIHRoZSBzYW1lIGRpbWVuc2lvbnMKCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmxpYi5pbmRleF90cmlja3MubmRfZ3JpZCA6IGNsYXNzIG9mIGBvZ3JpZGAgYW5kIGBtZ3JpZGAgb2JqZWN0cwogICAgb2dyaWQgOiBsaWtlIG1ncmlkIGJ1dCByZXR1cm5zIG9wZW4gKG5vdCBmbGVzaGVkIG91dCkgbWVzaCBncmlkcwogICAgcl8gOiBhcnJheSBjb25jYXRlbmF0b3IKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5tZ3JpZFswOjUsMDo1XQogICAgYXJyYXkoW1tbMCwgMCwgMCwgMCwgMF0sCiAgICAgICAgICAgIFsxLCAxLCAxLCAxLCAxXSwKICAgICAgICAgICAgWzIsIDIsIDIsIDIsIDJdLAogICAgICAgICAgICBbMywgMywgMywgMywgM10sCiAgICAgICAgICAgIFs0LCA0LCA0LCA0LCA0XV0sCiAgICAgICAgICAgW1swLCAxLCAyLCAzLCA0XSwKICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDRdLAogICAgICAgICAgICBbMCwgMSwgMiwgMywgNF0sCiAgICAgICAgICAgIFswLCAxLCAyLCAzLCA0XSwKICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDRdXV0pCiAgICA+Pj4gbnAubWdyaWRbLTE6MTo1al0KICAgIGFycmF5KFstMS4gLCAtMC41LCAgMC4gLCAgMC41LCAgMS4gXSkKCiAgICBaBW9ncmlkYe4EAAAKICAgIGBuZF9ncmlkYCBpbnN0YW5jZSB3aGljaCByZXR1cm5zIGFuIG9wZW4gbXVsdGktZGltZW5zaW9uYWwgIm1lc2hncmlkIi4KCiAgICBBbiBpbnN0YW5jZSBvZiBgbnVtcHkubGliLmluZGV4X3RyaWNrcy5uZF9ncmlkYCB3aGljaCByZXR1cm5zIGFuIG9wZW4KICAgIChpLmUuIG5vdCBmbGVzaGVkIG91dCkgbWVzaC1ncmlkIHdoZW4gaW5kZXhlZCwgc28gdGhhdCBvbmx5IG9uZSBkaW1lbnNpb24KICAgIG9mIGVhY2ggcmV0dXJuZWQgYXJyYXkgaXMgZ3JlYXRlciB0aGFuIDEuICBUaGUgZGltZW5zaW9uIGFuZCBudW1iZXIgb2YgdGhlCiAgICBvdXRwdXQgYXJyYXlzIGFyZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGluZGV4aW5nIGRpbWVuc2lvbnMuICBJZiB0aGUgc3RlcAogICAgbGVuZ3RoIGlzIG5vdCBhIGNvbXBsZXggbnVtYmVyLCB0aGVuIHRoZSBzdG9wIGlzIG5vdCBpbmNsdXNpdmUuCgogICAgSG93ZXZlciwgaWYgdGhlIHN0ZXAgbGVuZ3RoIGlzIGEgKipjb21wbGV4IG51bWJlcioqIChlLmcuIDVqKSwgdGhlbgogICAgdGhlIGludGVnZXIgcGFydCBvZiBpdHMgbWFnbml0dWRlIGlzIGludGVycHJldGVkIGFzIHNwZWNpZnlpbmcgdGhlCiAgICBudW1iZXIgb2YgcG9pbnRzIHRvIGNyZWF0ZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgc3RvcCB2YWx1ZXMsIHdoZXJlCiAgICB0aGUgc3RvcCB2YWx1ZSAqKmlzIGluY2x1c2l2ZSoqLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0tLS0KICAgIG1lc2gtZ3JpZCBgbmRhcnJheXNgIHdpdGggb25seSBvbmUgZGltZW5zaW9uIDptYXRoOmBcbmVxIDFgCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBucC5saWIuaW5kZXhfdHJpY2tzLm5kX2dyaWQgOiBjbGFzcyBvZiBgb2dyaWRgIGFuZCBgbWdyaWRgIG9iamVjdHMKICAgIG1ncmlkIDogbGlrZSBgb2dyaWRgIGJ1dCByZXR1cm5zIGRlbnNlIChvciBmbGVzaGVkIG91dCkgbWVzaCBncmlkcwogICAgcl8gOiBhcnJheSBjb25jYXRlbmF0b3IKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5IGltcG9ydCBvZ3JpZAogICAgPj4+IG9ncmlkWy0xOjE6NWpdCiAgICBhcnJheShbLTEuICwgLTAuNSwgIDAuICwgIDAuNSwgIDEuIF0pCiAgICA+Pj4gb2dyaWRbMDo1LDA6NV0KICAgIFthcnJheShbWzBdLAogICAgICAgICAgICBbMV0sCiAgICAgICAgICAgIFsyXSwKICAgICAgICAgICAgWzNdLAogICAgICAgICAgICBbNF1dKSwgYXJyYXkoW1swLCAxLCAyLCAzLCA0XV0pXQoKICAgIHoXbnVtcHkuY29yZS5udW1lcmljdHlwZXNaB2dlbmVyaWNhaQEAAAogICAgQmFzZSBjbGFzcyBmb3IgbnVtcHkgc2NhbGFyIHR5cGVzLgoKICAgIENsYXNzIGZyb20gd2hpY2ggbW9zdCAoYWxsPykgbnVtcHkgc2NhbGFyIHR5cGVzIGFyZSBkZXJpdmVkLiAgRm9yCiAgICBjb25zaXN0ZW5jeSwgZXhwb3NlcyB0aGUgc2FtZSBBUEkgYXMgYG5kYXJyYXlgLCBkZXNwaXRlIG1hbnkKICAgIGNvbnNlcXVlbnQgYXR0cmlidXRlcyBiZWluZyBlaXRoZXIgImdldC1vbmx5LCIgb3IgY29tcGxldGVseSBpcnJlbGV2YW50LgogICAgVGhpcyBpcyB0aGUgY2xhc3MgZnJvbSB3aGljaCBpdCBpcyBzdHJvbmdseSBzdWdnZXN0ZWQgdXNlcnMgc2hvdWxkIGRlcml2ZQogICAgY3VzdG9tIHNjYWxhciB0eXBlcy4KCiAgICApAnIiAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzIHNvIGFzIHRvCiAgICBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyBgAAAGE3AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcyBzbyBhcyB0bwogICAgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnIZAAAAehlQb2ludGVyIHRvIHN0YXJ0IG9mIGRhdGEuKQJyGgAAAHoaR2V0IGFycmF5IGRhdGEtZGVzY3JpcHRvci4pAnIdAAAAehtUaGUgaW50ZWdlciB2YWx1ZSBvZiBmbGFncy4pAnIeAAAAehlBIDEtRCB2aWV3IG9mIHRoZSBzY2FsYXIuKQJyGwAAAHohVGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBzY2FsYXIuKQJyHAAAAHojVGhlIGxlbmd0aCBvZiBvbmUgZWxlbWVudCBpbiBieXRlcy4pAnIfAAAAeiJUaGUgbGVuZ3RoIG9mIHRoZSBzY2FsYXIgaW4gYnl0ZXMuKQJyDAAAAHofVGhlIG51bWJlciBvZiBhcnJheSBkaW1lbnNpb25zLikCciAAAAB6HFRoZSByZWFsIHBhcnQgb2YgdGhlIHNjYWxhci4pAnINAAAAehpUdXBsZSBvZiBhcnJheSBkaW1lbnNpb25zLikCcg4AAAB6JlRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdlbnR5cGUuKQJyIQAAAHonVHVwbGUgb2YgYnl0ZXMgc3RlcHMgaW4gZWFjaCBkaW1lbnNpb24uKQJyJwAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcigAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnIpAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyKgAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcisAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnIsAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyLQAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcyBzbyBhcyB0bwogICAgcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCci4AAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnIvAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyMAAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcjIAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnIJAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyMwAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcjQAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnI1AAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyNgAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcjcAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnI4AAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyOQAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcjoAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnI7AAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyPAAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCcj0AAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnI+AAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyPwAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCckAAAABhxAMAAAogICAgbmV3Ynl0ZW9yZGVyKG5ld19vcmRlcj0nUycpCgogICAgUmV0dXJuIGEgbmV3IGBkdHlwZWAgd2l0aCBhIGRpZmZlcmVudCBieXRlIG9yZGVyLgoKICAgIENoYW5nZXMgYXJlIGFsc28gbWFkZSBpbiBhbGwgZmllbGRzIGFuZCBzdWItYXJyYXlzIG9mIHRoZSBkYXRhIHR5cGUuCgogICAgVGhlIGBuZXdfb3JkZXJgIGNvZGUgY2FuIGJlIGFueSBmcm9tIHRoZSBmb2xsb3dpbmc6CgogICAgKiAnUycgLSBzd2FwIGR0eXBlIGZyb20gY3VycmVudCB0byBvcHBvc2l0ZSBlbmRpYW4KICAgICogeyc8JywgJ0wnfSAtIGxpdHRsZSBlbmRpYW4KICAgICogeyc+JywgJ0InfSAtIGJpZyBlbmRpYW4KICAgICogeyc9JywgJ04nfSAtIG5hdGl2ZSBvcmRlcgogICAgKiB7J3wnLCAnSSd9IC0gaWdub3JlIChubyBjaGFuZ2UgdG8gYnl0ZSBvcmRlcikKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBuZXdfb3JkZXIgOiBzdHIsIG9wdGlvbmFsCiAgICAgICAgQnl0ZSBvcmRlciB0byBmb3JjZTsgYSB2YWx1ZSBmcm9tIHRoZSBieXRlIG9yZGVyIHNwZWNpZmljYXRpb25zCiAgICAgICAgYWJvdmUuICBUaGUgZGVmYXVsdCB2YWx1ZSAoJ1MnKSByZXN1bHRzIGluIHN3YXBwaW5nIHRoZSBjdXJyZW50CiAgICAgICAgYnl0ZSBvcmRlci4gVGhlIGNvZGUgZG9lcyBhIGNhc2UtaW5zZW5zaXRpdmUgY2hlY2sgb24gdGhlIGZpcnN0CiAgICAgICAgbGV0dGVyIG9mIGBuZXdfb3JkZXJgIGZvciB0aGUgYWx0ZXJuYXRpdmVzIGFib3ZlLiAgRm9yIGV4YW1wbGUsCiAgICAgICAgYW55IG9mICdCJyBvciAnYicgb3IgJ2JpZ2dpc2gnIGFyZSB2YWxpZCB0byBzcGVjaWZ5IGJpZy1lbmRpYW4uCgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG5ld19kdHlwZSA6IGR0eXBlCiAgICAgICAgTmV3IGBkdHlwZWAgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNoYW5nZSB0byB0aGUgYnl0ZSBvcmRlci4KCiAgICApAnJBAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyQgAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCckMAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJEAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyRQAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCckYAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJHAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJySAAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCckkAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJKAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJySwAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCckwAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3Mgc28gYXMgdG8KICAgIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJNAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyTwAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCclAAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJRAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyUgAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCclMAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJUAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyVQAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCclYAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJZAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgKQJyWgAAAGE/AQAACiAgICBOb3QgaW1wbGVtZW50ZWQgKHZpcnR1YWwgYXR0cmlidXRlKQoKICAgIENsYXNzIGdlbmVyaWMgZXhpc3RzIHNvbGVseSB0byBkZXJpdmUgbnVtcHkgc2NhbGFycyBmcm9tLCBhbmQgcG9zc2Vzc2VzLAogICAgYWxiZWl0IHVuaW1wbGVtZW50ZWQsIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmRhcnJheSBjbGFzcwogICAgc28gYXMgdG8gcHJvdmlkZSBhIHVuaWZvcm0gQVBJLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgVGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9mIHRoZSBkZXJpdmVkIGNsYXNzIG9mIGludGVyZXN0LgoKICAgICkCclsAAABhPwEAAAogICAgTm90IGltcGxlbWVudGVkICh2aXJ0dWFsIGF0dHJpYnV0ZSkKCiAgICBDbGFzcyBnZW5lcmljIGV4aXN0cyBzb2xlbHkgdG8gZGVyaXZlIG51bXB5IHNjYWxhcnMgZnJvbSwgYW5kIHBvc3Nlc3NlcywKICAgIGFsYmVpdCB1bmltcGxlbWVudGVkLCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5kYXJyYXkgY2xhc3MKICAgIHNvIGFzIHRvIHByb3ZpZGUgYSB1bmlmb3JtIEFQSS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIFRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgZGVyaXZlZCBjbGFzcyBvZiBpbnRlcmVzdC4KCiAgICApAnJcAAAAYT8BAAAKICAgIE5vdCBpbXBsZW1lbnRlZCAodmlydHVhbCBhdHRyaWJ1dGUpCgogICAgQ2xhc3MgZ2VuZXJpYyBleGlzdHMgc29sZWx5IHRvIGRlcml2ZSBudW1weSBzY2FsYXJzIGZyb20sIGFuZCBwb3NzZXNzZXMsCiAgICBhbGJlaXQgdW5pbXBsZW1lbnRlZCwgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZGFycmF5IGNsYXNzCiAgICBzbyBhcyB0byBwcm92aWRlIGEgdW5pZm9ybSBBUEkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBUaGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIGRlcml2ZWQgY2xhc3Mgb2YgaW50ZXJlc3QuCgogICAgWgVib29sX3o7TnVtUHkncyBCb29sZWFuIHR5cGUuICBDaGFyYWN0ZXIgY29kZTogYGA/YGAuICBBbGlhczogYm9vbDhaCWNvbXBsZXg2NHpSCiAgICBDb21wbGV4IG51bWJlciB0eXBlIGNvbXBvc2VkIG9mIHR3byAzMiBiaXQgZmxvYXRzLiBDaGFyYWN0ZXIgY29kZTogJ0YnLgoKICAgIFoKY29tcGxleDEyOHpxCiAgICBDb21wbGV4IG51bWJlciB0eXBlIGNvbXBvc2VkIG9mIHR3byA2NCBiaXQgZmxvYXRzLiBDaGFyYWN0ZXIgY29kZTogJ0QnLgogICAgUHl0aG9uIGNvbXBsZXggY29tcGF0aWJsZS4KCiAgICBaCmNvbXBsZXgyNTZ6UwogICAgQ29tcGxleCBudW1iZXIgdHlwZSBjb21wb3NlZCBvZiB0d28gMTI4LWJpdCBmbG9hdHMuIENoYXJhY3RlciBjb2RlOiAnRycuCgogICAgWgdmbG9hdDMyelAKICAgIDMyLWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXIuIENoYXJhY3RlciBjb2RlICdmJy4gQyBmbG9hdCBjb21wYXRpYmxlLgoKICAgIFoHZmxvYXQ2NHpVCiAgICA2NC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiBDaGFyYWN0ZXIgY29kZSAnZCcuIFB5dGhvbiBmbG9hdCBjb21wYXRpYmxlLgoKICAgIFoHZmxvYXQ5NnoFCiAgICBaCGZsb2F0MTI4elsKICAgIDEyOC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVyLiBDaGFyYWN0ZXIgY29kZTogJ2cnLiBDIGxvbmcgZmxvYXQKICAgIGNvbXBhdGlibGUuCgogICAgWgRpbnQ4ejc4LWJpdCBpbnRlZ2VyLiBDaGFyYWN0ZXIgY29kZSBgYGJgYC4gQyBjaGFyIGNvbXBhdGlibGUuWgVpbnQxNno5MTYtYml0IGludGVnZXIuIENoYXJhY3RlciBjb2RlIGBgaGBgLiBDIHNob3J0IGNvbXBhdGlibGUuWgVpbnQzMno1MzItYml0IGludGVnZXIuIENoYXJhY3RlciBjb2RlICdpJy4gQyBpbnQgY29tcGF0aWJsZS7aBWludDY0ejo2NC1iaXQgaW50ZWdlci4gQ2hhcmFjdGVyIGNvZGUgJ2wnLiBQeXRob24gaW50IGNvbXBhdGlibGUuWgdvYmplY3RfeihBbnkgUHl0aG9uIG9iamVjdC4gIENoYXJhY3RlciBjb2RlOiAnTycuTikJ2gdfX2RvY19f2gpfX2Z1dHVyZV9fcgIAAAByAwAAAHIEAAAAWgludW1weS5saWJyBQAAAFoKdG9ieXRlc2RvY9oGZm9ybWF0qQBycwAAAHJzAAAA+kQvb3B0L2FsdC9weXRob24zNy9saWI2NC9weXRob24zLjcvc2l0ZS1wYWNrYWdlcy9udW1weS9hZGRfbmV3ZG9jcy5wedoIPG1vZHVsZT4KAAAAc8oCAAAEARQCDAoGKQYEDA8MEwwTDAYMGQZ/AGkGBAwTDAgMCgwPDAkMCQwQBiwGBAwSDBYMEAwPDA4MDgwODCUGaAYCBiwGAgY6BgMGDAYCBjMGAgYGBgIGMgYCBiAGAgZJBgIGJAYCBkkGAgZIBgIGAQYCBgEGAgY7BgIGBQYCBgUGAwYGBgIGKgYCBkUGAwZKBgIGagYCBjIGAgYuBgIGQwYCBhAGAgYgBgIGSQYCBnkGAwZ/AF8GAgY1BhEGdwYKDAQMBAwEDAQMBwwVDGcMBAwdDA8MEAxHDCoMFAwQDBMMHgwSDD4MHgwKDAYMBgwQDAgMCAwSDA8MDwwPDA8MDwwRDEUMKAwPDBAMDwwPDA8MKwwPDA8MEQwdDA4MDgwZDCYMKgw6DC4MDwwPDA8GJwYDBiQGAwwqDA8MDwwPDA4GHwYCBigGAwwRDA8MDwxcDA8MDwwzDEgMOAw3DA8MDwwPDA8MDwwjDEYEAgYBCAIMBAYBCAEMAgwPDDYMDwxqBioGAgY+BgIGOQYJBk4GAgZHBgIGOAYCBikGAgYIBgIGGAYCBisGAgYpBhAGLQYJDBMMGAwSDBcMGgwsDFwMUQxrDEAMRAZTBggMCAwrDAMMCwwbDAwMDQwdDAcMCAwJDBQMCAwPDAgMBwwJDAMMDgwJDEgGPgYCDAMMAwYxBgIIWAgCCD4IAggxCAgKKQgCCiUICQoKCAQSDhIOEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIFEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SIRIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIOEg4SDhIVCgEIAgoECAIKBQgCCgQIAgoECAIKBAgCCgIIAgoFCAIKAQgCCgEIAgoBCAIKAQgCCgE=
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 11
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
add_newdocs.cpython-37.pyc
208.24 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
ctypeslib.cpython-37.pyc
11.76 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
dual.cpython-37.pyc
1.81 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
matlib.cpython-37.pyc
9.78 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
883 B
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
version.cpython-37.pyc
267 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_distributor_init.cpython-37.pyc
500 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_globals.cpython-37.pyc
2.16 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_import_tools.cpython-37.pyc
9.51 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__config__.cpython-37.pyc
1.23 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
5.46 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).