A/MNClBcrFFjAAAAAAAAAAADAAAAQAAAAHM/AAAAZAAAWgAAaQEAZQAAZAEANloBAGQFAGQCAIQBAFoDAGUEAGQDAGsCAHI7AGUDAGQEAGUFAIMAAQFuAABkBQBTKAYAAABzmRoAAAoKVGVzdCBzaW1wbGUgbG9vcCB3aXRoIGNvbmRpdGlvbmFsCgogICAgPj4+IHN1bShpKmkgZm9yIGkgaW4gcmFuZ2UoMTAwKSBpZiBpJjEgPT0gMSkKICAgIDE2NjY1MAoKVGVzdCBzaW1wbGUgbmVzdGluZwoKICAgID4+PiBsaXN0KChpLGopIGZvciBpIGluIHJhbmdlKDMpIGZvciBqIGluIHJhbmdlKDQpICkKICAgIFsoMCwgMCksICgwLCAxKSwgKDAsIDIpLCAoMCwgMyksICgxLCAwKSwgKDEsIDEpLCAoMSwgMiksICgxLCAzKSwgKDIsIDApLCAoMiwgMSksICgyLCAyKSwgKDIsIDMpXQoKVGVzdCBuZXN0aW5nIHdpdGggdGhlIGlubmVyIGV4cHJlc3Npb24gZGVwZW5kZW50IG9uIHRoZSBvdXRlcgoKICAgID4+PiBsaXN0KChpLGopIGZvciBpIGluIHJhbmdlKDQpIGZvciBqIGluIHJhbmdlKGkpICkKICAgIFsoMSwgMCksICgyLCAwKSwgKDIsIDEpLCAoMywgMCksICgzLCAxKSwgKDMsIDIpXQoKTWFrZSBzdXJlIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUgaXMgbm90IGV4cG9zZWQKCiAgICA+Pj4gaSA9IDIwCiAgICA+Pj4gc3VtKGkqaSBmb3IgaSBpbiByYW5nZSgxMDApKQogICAgMzI4MzUwCiAgICA+Pj4gaQogICAgMjAKClRlc3QgZmlyc3QgY2xhc3MKCiAgICA+Pj4gZyA9IChpKmkgZm9yIGkgaW4gcmFuZ2UoNCkpCiAgICA+Pj4gdHlwZShnKQogICAgPHR5cGUgJ2dlbmVyYXRvcic+CiAgICA+Pj4gbGlzdChnKQogICAgWzAsIDEsIDQsIDldCgpUZXN0IGRpcmVjdCBjYWxscyB0byBuZXh0KCkKCiAgICA+Pj4gZyA9IChpKmkgZm9yIGkgaW4gcmFuZ2UoMykpCiAgICA+Pj4gZy5uZXh0KCkKICAgIDAKICAgID4+PiBnLm5leHQoKQogICAgMQogICAgPj4+IGcubmV4dCgpCiAgICA0CiAgICA+Pj4gZy5uZXh0KCkKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHB5c2hlbGwjMjE+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCiAgICAgICAgZy5uZXh0KCkKICAgIFN0b3BJdGVyYXRpb24KCkRvZXMgaXQgc3RheSBzdG9wcGVkPwoKICAgID4+PiBnLm5leHQoKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8cHlzaGVsbCMyMT4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KICAgICAgICBnLm5leHQoKQogICAgU3RvcEl0ZXJhdGlvbgogICAgPj4+IGxpc3QoZykKICAgIFtdCgpUZXN0IHJ1bm5pbmcgZ2VuIHdoZW4gZGVmaW5pbmcgZnVuY3Rpb24gaXMgb3V0IG9mIHNjb3BlCgogICAgPj4+IGRlZiBmKG4pOgogICAgLi4uICAgICByZXR1cm4gKGkqaSBmb3IgaSBpbiB4cmFuZ2UobikpCiAgICA+Pj4gbGlzdChmKDEwKSkKICAgIFswLCAxLCA0LCA5LCAxNiwgMjUsIDM2LCA0OSwgNjQsIDgxXQoKICAgID4+PiBkZWYgZihuKToKICAgIC4uLiAgICAgcmV0dXJuICgoaSxqKSBmb3IgaSBpbiB4cmFuZ2UoMykgZm9yIGogaW4geHJhbmdlKG4pKQogICAgPj4+IGxpc3QoZig0KSkKICAgIFsoMCwgMCksICgwLCAxKSwgKDAsIDIpLCAoMCwgMyksICgxLCAwKSwgKDEsIDEpLCAoMSwgMiksICgxLCAzKSwgKDIsIDApLCAoMiwgMSksICgyLCAyKSwgKDIsIDMpXQogICAgPj4+IGRlZiBmKG4pOgogICAgLi4uICAgICByZXR1cm4gKChpLGopIGZvciBpIGluIHhyYW5nZSgzKSBmb3IgaiBpbiB4cmFuZ2UoNCkgaWYgaiBpbiB4cmFuZ2UobikpCiAgICA+Pj4gbGlzdChmKDQpKQogICAgWygwLCAwKSwgKDAsIDEpLCAoMCwgMiksICgwLCAzKSwgKDEsIDApLCAoMSwgMSksICgxLCAyKSwgKDEsIDMpLCAoMiwgMCksICgyLCAxKSwgKDIsIDIpLCAoMiwgMyldCiAgICA+Pj4gbGlzdChmKDIpKQogICAgWygwLCAwKSwgKDAsIDEpLCAoMSwgMCksICgxLCAxKSwgKDIsIDApLCAoMiwgMSldCgpWZXJpZnkgdGhhdCBwYXJlbnRoZXNpcyBhcmUgcmVxdWlyZWQgaW4gYSBzdGF0ZW1lbnQKCiAgICA+Pj4gZGVmIGYobik6CiAgICAuLi4gICAgIHJldHVybiBpKmkgZm9yIGkgaW4geHJhbmdlKG4pCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAuLi4KICAgIFN5bnRheEVycm9yOiBpbnZhbGlkIHN5bnRheAoKVmVyaWZ5IHRoYXQgcGFyZW50aGVzaXMgYXJlIHJlcXVpcmVkIHdoZW4gdXNlZCBhcyBhIGtleXdvcmQgYXJndW1lbnQgdmFsdWUKCiAgICA+Pj4gZGljdChhID0gaSBmb3IgaSBpbiB4cmFuZ2UoMTApKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCiAgICBTeW50YXhFcnJvcjogaW52YWxpZCBzeW50YXgKClZlcmlmeSB0aGF0IHBhcmVudGhlc2lzIGFyZSByZXF1aXJlZCB3aGVuIHVzZWQgYXMgYSBrZXl3b3JkIGFyZ3VtZW50IHZhbHVlCgogICAgPj4+IGRpY3QoYSA9IChpIGZvciBpIGluIHhyYW5nZSgxMCkpKSAjZG9jdGVzdDogK0VMTElQU0lTCiAgICB7J2EnOiA8Z2VuZXJhdG9yIG9iamVjdCA8Z2VuZXhwcj4gYXQgLi4uPn0KClZlcmlmeSBlYXJseSBiaW5kaW5nIGZvciB0aGUgb3V0ZXJtb3N0IGZvci1leHByZXNzaW9uCgogICAgPj4+IHg9MTAKICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSh4KSkKICAgID4+PiB4ID0gNQogICAgPj4+IGxpc3QoZykKICAgIFswLCAxLCA0LCA5LCAxNiwgMjUsIDM2LCA0OSwgNjQsIDgxXQoKVmVyaWZ5IHRoYXQgdGhlIG91dGVybW9zdCBmb3ItZXhwcmVzc2lvbiBtYWtlcyBhbiBpbW1lZGlhdGUgY2hlY2sKZm9yIGl0ZXJhYmlsaXR5CgogICAgPj4+IChpIGZvciBpIGluIDYpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxweXNoZWxsIzQ+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCiAgICAgICAgKGkgZm9yIGkgaW4gNikKICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQoKVmVyaWZ5IGxhdGUgYmluZGluZyBmb3IgdGhlIG91dGVybW9zdCBpZi1leHByZXNzaW9uCgogICAgPj4+IGluY2x1ZGUgPSAoMiw0LDYsOCkKICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSgxMCkgaWYgaSBpbiBpbmNsdWRlKQogICAgPj4+IGluY2x1ZGUgPSAoMSwzLDUsNyw5KQogICAgPj4+IGxpc3QoZykKICAgIFsxLCA5LCAyNSwgNDksIDgxXQoKVmVyaWZ5IGxhdGUgYmluZGluZyBmb3IgdGhlIGlubmVybW9zdCBmb3ItZXhwcmVzc2lvbgoKICAgID4+PiBnID0gKChpLGopIGZvciBpIGluIHJhbmdlKDMpIGZvciBqIGluIHJhbmdlKHgpKQogICAgPj4+IHggPSA0CiAgICA+Pj4gbGlzdChnKQogICAgWygwLCAwKSwgKDAsIDEpLCAoMCwgMiksICgwLCAzKSwgKDEsIDApLCAoMSwgMSksICgxLCAyKSwgKDEsIDMpLCAoMiwgMCksICgyLCAxKSwgKDIsIDIpLCAoMiwgMyldCgpWZXJpZnkgcmUtdXNlIG9mIHR1cGxlcyAoYSBzaWRlIGJlbmVmaXQgb2YgdXNpbmcgZ2VuZXhwcyBvdmVyIGxpc3Rjb21wcykKCiAgICA+Pj4gdHVwbGVpZHMgPSBtYXAoaWQsICgoaSxpKSBmb3IgaSBpbiB4cmFuZ2UoMTApKSkKICAgID4+PiBpbnQobWF4KHR1cGxlaWRzKSAtIG1pbih0dXBsZWlkcykpCiAgICAwCgpWZXJpZnkgdGhhdCBzeW50YXggZXJyb3IncyBhcmUgcmFpc2VkIGZvciBnZW5leHBzIHVzZWQgYXMgbHZhbHVlcwoKICAgID4+PiAoeSBmb3IgeSBpbiAoMSwyKSkgPSAxMAogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgLi4uCiAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9nZW5leHBzLl9fdGVzdF9fLmRvY3Rlc3RzWzQwXT4iLCBsaW5lIDEKICAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZ2VuZXJhdG9yIGV4cHJlc3Npb24KCiAgICA+Pj4gKHkgZm9yIHkgaW4gKDEsMikpICs9IDEwCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAuLi4KICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmV4cHMuX190ZXN0X18uZG9jdGVzdHNbNDFdPiIsIGxpbmUgMQogICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBnZW5lcmF0b3IgZXhwcmVzc2lvbgoKCiMjIyMjIyMjIyMjIFRlc3RzIGJvcnJvd2VkIGZyb20gb3IgaW5zcGlyZWQgYnkgdGVzdF9nZW5lcmF0b3JzLnB5ICMjIyMjIyMjIyMjIwoKTWFrZSBhIGdlbmVyYXRvciB0aGF0IGFjdHMgbGlrZSByYW5nZSgpCgogICAgPj4+IHlyYW5nZSA9IGxhbWJkYSBuOiAgKGkgZm9yIGkgaW4geHJhbmdlKG4pKQogICAgPj4+IGxpc3QoeXJhbmdlKDEwKSkKICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQoKR2VuZXJhdG9ycyBhbHdheXMgcmV0dXJuIHRvIHRoZSBtb3N0IHJlY2VudCBjYWxsZXI6CgogICAgPj4+IGRlZiBjcmVhdG9yKCk6CiAgICAuLi4gICAgIHIgPSB5cmFuZ2UoNSkKICAgIC4uLiAgICAgcHJpbnQgImNyZWF0b3IiLCByLm5leHQoKQogICAgLi4uICAgICByZXR1cm4gcgogICAgPj4+IGRlZiBjYWxsZXIoKToKICAgIC4uLiAgICAgciA9IGNyZWF0b3IoKQogICAgLi4uICAgICBmb3IgaSBpbiByOgogICAgLi4uICAgICAgICAgICAgIHByaW50ICJjYWxsZXIiLCBpCiAgICA+Pj4gY2FsbGVyKCkKICAgIGNyZWF0b3IgMAogICAgY2FsbGVyIDEKICAgIGNhbGxlciAyCiAgICBjYWxsZXIgMwogICAgY2FsbGVyIDQKCkdlbmVyYXRvcnMgY2FuIGNhbGwgb3RoZXIgZ2VuZXJhdG9yczoKCiAgICA+Pj4gZGVmIHpyYW5nZShuKToKICAgIC4uLiAgICAgZm9yIGkgaW4geXJhbmdlKG4pOgogICAgLi4uICAgICAgICAgeWllbGQgaQogICAgPj4+IGxpc3QoenJhbmdlKDUpKQogICAgWzAsIDEsIDIsIDMsIDRdCgoKVmVyaWZ5IHRoYXQgYSBnZW4gZXhwIGNhbm5vdCBiZSByZXN1bWVkIHdoaWxlIGl0IGlzIGFjdGl2ZWx5IHJ1bm5pbmc6CgogICAgPj4+IGcgPSAobWUubmV4dCgpIGZvciBpIGluIHhyYW5nZSgxMCkpCiAgICA+Pj4gbWUgPSBnCiAgICA+Pj4gbWUubmV4dCgpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxweXNoZWxsIzMwPiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQogICAgICAgIG1lLm5leHQoKQogICAgICBGaWxlICI8cHlzaGVsbCMyOD4iLCBsaW5lIDEsIGluIDxnZW5lcmF0b3IgZXhwcmVzc2lvbj4KICAgICAgICBnID0gKG1lLm5leHQoKSBmb3IgaSBpbiB4cmFuZ2UoMTApKQogICAgVmFsdWVFcnJvcjogZ2VuZXJhdG9yIGFscmVhZHkgZXhlY3V0aW5nCgpWZXJpZnkgZXhjZXB0aW9uIHByb3BhZ2F0aW9uCgogICAgPj4+IGcgPSAoMTAgLy8gaSBmb3IgaSBpbiAoNSwgMCwgMikpCiAgICA+Pj4gZy5uZXh0KCkKICAgIDIKICAgID4+PiBnLm5leHQoKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8cHlzaGVsbCMzNz4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KICAgICAgICBnLm5leHQoKQogICAgICBGaWxlICI8cHlzaGVsbCMzNT4iLCBsaW5lIDEsIGluIDxnZW5lcmF0b3IgZXhwcmVzc2lvbj4KICAgICAgICBnID0gKDEwIC8vIGkgZm9yIGkgaW4gKDUsIDAsIDIpKQogICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KICAgID4+PiBnLm5leHQoKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8cHlzaGVsbCMzOD4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KICAgICAgICBnLm5leHQoKQogICAgU3RvcEl0ZXJhdGlvbgoKTWFrZSBzdXJlIHRoYXQgTm9uZSBpcyBhIHZhbGlkIHJldHVybiB2YWx1ZQoKICAgID4+PiBsaXN0KE5vbmUgZm9yIGkgaW4geHJhbmdlKDEwKSkKICAgIFtOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lXQoKQ2hlY2sgdGhhdCBnZW5lcmF0b3IgYXR0cmlidXRlcyBhcmUgcHJlc2VudAoKICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSgzKSkKICAgID4+PiBleHBlY3RlZCA9IHNldChbJ2dpX2ZyYW1lJywgJ2dpX3J1bm5pbmcnLCAnbmV4dCddKQogICAgPj4+IHNldChhdHRyIGZvciBhdHRyIGluIGRpcihnKSBpZiBub3QgYXR0ci5zdGFydHN3aXRoKCdfXycpKSA+PSBleHBlY3RlZAogICAgVHJ1ZQoKICAgID4+PiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIQVZFX0RPQ1NUUklOR1MKICAgID4+PiBwcmludChnLm5leHQuX19kb2NfXyBpZiBIQVZFX0RPQ1NUUklOR1MgZWxzZSAneC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24nKQogICAgeC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgID4+PiBpbXBvcnQgdHlwZXMKICAgID4+PiBpc2luc3RhbmNlKGcsIHR5cGVzLkdlbmVyYXRvclR5cGUpCiAgICBUcnVlCgpDaGVjayB0aGUgX19pdGVyX18gc2xvdCBpcyBkZWZpbmVkIHRvIHJldHVybiBzZWxmCgogICAgPj4+IGl0ZXIoZykgaXMgZwogICAgVHJ1ZQoKVmVyaWZ5IHRoYXQgdGhlIHJ1bm5pbmcgZmxhZyBpcyBzZXQgcHJvcGVybHkKCiAgICA+Pj4gZyA9IChtZS5naV9ydW5uaW5nIGZvciBpIGluICgwLDEpKQogICAgPj4+IG1lID0gZwogICAgPj4+IG1lLmdpX3J1bm5pbmcKICAgIDAKICAgID4+PiBtZS5uZXh0KCkKICAgIDEKICAgID4+PiBtZS5naV9ydW5uaW5nCiAgICAwCgpWZXJpZnkgdGhhdCBnZW5leHBzIGFyZSB3ZWFrbHkgcmVmZXJlbmNhYmxlCgogICAgPj4+IGltcG9ydCB3ZWFrcmVmCiAgICA+Pj4gZyA9IChpKmkgZm9yIGkgaW4gcmFuZ2UoNCkpCiAgICA+Pj4gd3IgPSB3ZWFrcmVmLnJlZihnKQogICAgPj4+IHdyKCkgaXMgZwogICAgVHJ1ZQogICAgPj4+IHAgPSB3ZWFrcmVmLnByb3h5KGcpCiAgICA+Pj4gbGlzdChwKQogICAgWzAsIDEsIDQsIDldCgoKdAgAAABkb2N0ZXN0c2MBAAAABwAAAAUAAABDAAAAc70AAABkAQBkAABsAAB9AQBkAQBkAgBsAQBtAgB9AgABZAEAZAMAbAEAbQMAfQMAAXwCAGoEAHwDAHwAAIMCAAF8AAByuQB0BQB8AQBkBACDAgByuQBkAQBkAABsBgB9BABkAABnAQBkBQAUfQUAeEQAdAgAdAkAfAUAgwEAgwEARF0wAH0GAHwCAGoEAHwDAHwAAIMCAAF8BABqCgCDAAABfAEAagsAgwAAfAUAfAYAPHF9AFd8BQBHSG4AAGQAAFMoBgAAAE5p/////ygBAAAAdAwAAAB0ZXN0X3N1cHBvcnQoAQAAAHQMAAAAdGVzdF9nZW5leHBzdBAAAABnZXR0b3RhbHJlZmNvdW50aQUAAAAoDAAAAHQDAAAAc3lzdAQAAAB0ZXN0UgEAAABSAgAAAHQLAAAAcnVuX2RvY3Rlc3R0BwAAAGhhc2F0dHJ0AgAAAGdjdAQAAABOb25ldAYAAAB4cmFuZ2V0AwAAAGxlbnQHAAAAY29sbGVjdFIDAAAAKAcAAAB0BwAAAHZlcmJvc2VSBAAAAFIBAAAAUgIAAABSCAAAAHQGAAAAY291bnRzdAEAAABpKAAAAAAoAAAAAHNZAAAAL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHl0CQAAAHRlc3RfbWFpbgoBAABzGAAAAAABDAEQARABEAMVAQwBDQEZARABCgEUAXQIAAAAX19tYWluX19SDQAAAE4oBgAAAFIAAAAAdAgAAABfX3Rlc3RfX1IJAAAAUhAAAAB0CAAAAF9fbmFtZV9fdAQAAABUcnVlKAAAAAAoAAAAACgAAAAAc1kAAAAvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weXQIAAAAPG1vZHVsZT4FAQAAcwgAAAAGAw0CDBAMAQ==