ZGlmZiAtLWdpdCBhL0RvYy9NYWtlZmlsZS5kZXBzIGIvRG9jL01ha2VmaWxlLmRlcHMKaW5kZXggZjgyOGUxYi4uMzM3MWY2MSAxMDA2NDQKLS0tIGEvRG9jL01ha2VmaWxlLmRlcHMKKysrIGIvRG9jL01ha2VmaWxlLmRlcHMKQEAgLTEwOSw3ICsxMDksNiBAQAogCWxpYi9saWJwbGF0Zm9ybS50ZXggXAogCWxpYi9saWJmcGVjdGwudGV4IFwKIAlsaWIvbGliZ2MudGV4IFwKLQlsaWIvbGlic2V0cy50ZXggXAogCWxpYi9saWJ3ZWFrcmVmLnRleCBcCiAJbGliL2xpYmluc3BlY3QudGV4IFwKIAlsaWIvbGlicHlkb2MudGV4IFwKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCA4MzdjNzU5Li40MjdkNzFkIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC0xMDQsNyArMTA0LDYgQEAKIFxpbnB1dHtsaWJoZWFwcX0KIFxpbnB1dHtsaWJiaXNlY3R9CiBcaW5wdXR7bGliYXJyYXl9Ci1caW5wdXR7bGlic2V0c30KIFxpbnB1dHtsaWJzY2hlZH0KIFxpbnB1dHtsaWJtdXRleH0KIFxpbnB1dHtsaWJxdWV1ZX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2V0cy50ZXggYi9Eb2MvbGliL2xpYnNldHMudGV4CmluZGV4IDIyYmYzNGIuLmU2OWRlMjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic2V0cy50ZXgKKysrIGIvRG9jL2xpYi9saWJzZXRzLnRleApAQCAtMSwyNjQgKzAsMCBAQAotXHNlY3Rpb257XG1vZHVsZXtzZXRzfSAtLS0KLSAgICAgICAgIFVub3JkZXJlZCBjb2xsZWN0aW9ucyBvZiB1bmlxdWUgZWxlbWVudHN9Ci0KLVxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtzZXRzfQotXG1vZHVsZXN5bm9wc2lze0ltcGxlbWVudGF0aW9uIG9mIHNldHMgb2YgdW5pcXVlIGVsZW1lbnRzLn0KLVxtb2R1bGVhdXRob3J7R3JlZyBWLiBXaWxzb259e2d2d2lsc29uQG5ldmV4LmNvbX0KLVxtb2R1bGVhdXRob3J7QWxleCBNYXJ0ZWxsaX17YWxlYXhAYWxlYXguaXR9Ci1cbW9kdWxlYXV0aG9ye0d1aWRvIHZhbiBSb3NzdW19e2d1aWRvQHB5dGhvbi5vcmd9Ci1cc2VjdGlvbmF1dGhvcntSYXltb25kIEQuIEhldHRpbmdlcn17cHl0aG9uQHJjbi5jb219Ci0KLVx2ZXJzaW9uYWRkZWR7Mi4zfQotCi1UaGUgXG1vZHVsZXtzZXRzfSBtb2R1bGUgcHJvdmlkZXMgY2xhc3NlcyBmb3IgY29uc3RydWN0aW5nIGFuZCBtYW5pcHVsYXRpbmcKLXVub3JkZXJlZCBjb2xsZWN0aW9ucyBvZiB1bmlxdWUgZWxlbWVudHMuICBDb21tb24gdXNlcyBpbmNsdWRlIG1lbWJlcnNoaXAKLXRlc3RpbmcsIHJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmQgY29tcHV0aW5nIHN0YW5kYXJkIG1hdGgKLW9wZXJhdGlvbnMgb24gc2V0cyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sIGRpZmZlcmVuY2UsIGFuZCBzeW1tZXRyaWMKLWRpZmZlcmVuY2UuCi0KLUxpa2Ugb3RoZXIgY29sbGVjdGlvbnMsIHNldHMgc3VwcG9ydCBcY29kZXtcdmFye3h9IGluIFx2YXJ7c2V0fX0sCi1cY29kZXtsZW4oXHZhcntzZXR9KX0sIGFuZCBcY29kZXtmb3IgXHZhcnt4fSBpbiBcdmFye3NldH19LiAgQmVpbmcgYW4KLXVub3JkZXJlZCBjb2xsZWN0aW9uLCBzZXRzIGRvIG5vdCByZWNvcmQgZWxlbWVudCBwb3NpdGlvbiBvciBvcmRlciBvZgotaW5zZXJ0aW9uLiAgQWNjb3JkaW5nbHksIHNldHMgZG8gbm90IHN1cHBvcnQgaW5kZXhpbmcsIHNsaWNpbmcsIG9yCi1vdGhlciBzZXF1ZW5jZS1saWtlIGJlaGF2aW9yLgotCi1Nb3N0IHNldCBhcHBsaWNhdGlvbnMgdXNlIHRoZSBcY2xhc3N7U2V0fSBjbGFzcyB3aGljaCBwcm92aWRlcyBldmVyeSBzZXQKLW1ldGhvZCBleGNlcHQgZm9yIFxtZXRob2R7X19oYXNoX18oKX0uIEZvciBhZHZhbmNlZCBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nCi1hIGhhc2ggbWV0aG9kLCB0aGUgXGNsYXNze0ltbXV0YWJsZVNldH0gY2xhc3MgYWRkcyBhIFxtZXRob2R7X19oYXNoX18oKX0KLW1ldGhvZCBidXQgb21pdHMgbWV0aG9kcyB3aGljaCBhbHRlciB0aGUgY29udGVudHMgb2YgdGhlIHNldC4gQm90aAotXGNsYXNze1NldH0gYW5kIFxjbGFzc3tJbW11dGFibGVTZXR9IGRlcml2ZSBmcm9tIFxjbGFzc3tCYXNlU2V0fSwgYW4KLWFic3RyYWN0IGNsYXNzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBzb21ldGhpbmcgaXMgYSBzZXQ6Ci1cY29kZXtpc2luc3RhbmNlKFx2YXJ7b2JqfSwgQmFzZVNldCl9LgotCi1UaGUgc2V0IGNsYXNzZXMgYXJlIGltcGxlbWVudGVkIHVzaW5nIGRpY3Rpb25hcmllcy4gIEFjY29yZGluZ2x5LCB0aGUKLXJlcXVpcmVtZW50cyBmb3Igc2V0IGVsZW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgZGljdGlvbmFyeSBrZXlzOwotbmFtZWx5LCB0aGF0IHRoZSBlbGVtZW50IGRlZmluZXMgYm90aCBcbWV0aG9ke19fZXFfX30gYW5kIFxtZXRob2R7X19oYXNoX199LgotQXMgYSByZXN1bHQsIHNldHMKLWNhbm5vdCBjb250YWluIG11dGFibGUgZWxlbWVudHMgc3VjaCBhcyBsaXN0cyBvciBkaWN0aW9uYXJpZXMuCi1Ib3dldmVyLCB0aGV5IGNhbiBjb250YWluIGltbXV0YWJsZSBjb2xsZWN0aW9ucyBzdWNoIGFzIHR1cGxlcyBvcgotaW5zdGFuY2VzIG9mIFxjbGFzc3tJbW11dGFibGVTZXR9LiAgRm9yIGNvbnZlbmllbmNlIGluIGltcGxlbWVudGluZwotc2V0cyBvZiBzZXRzLCBpbm5lciBzZXRzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBpbW11dGFibGUKLWZvcm0sIGZvciBleGFtcGxlLCBcY29kZXtTZXQoW1NldChbJ2RvZyddKV0pfSBpcyB0cmFuc2Zvcm1lZCB0bwotXGNvZGV7U2V0KFtJbW11dGFibGVTZXQoWydkb2cnXSldKX0uCi0KLVxiZWdpbntjbGFzc2Rlc2N9e1NldH17XG9wdGlvbmFse2l0ZXJhYmxlfX0KLUNvbnN0cnVjdHMgYSBuZXcgZW1wdHkgXGNsYXNze1NldH0gb2JqZWN0LiAgSWYgdGhlIG9wdGlvbmFsIFx2YXJ7aXRlcmFibGV9Ci1wYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIHVwZGF0ZXMgdGhlIHNldCB3aXRoIGVsZW1lbnRzIG9idGFpbmVkIGZyb20gaXRlcmF0aW9uLgotQWxsIG9mIHRoZSBlbGVtZW50cyBpbiBcdmFye2l0ZXJhYmxlfSBzaG91bGQgYmUgaW1tdXRhYmxlIG9yIGJlIHRyYW5zZm9ybWFibGUKLXRvIGFuIGltbXV0YWJsZSB1c2luZyB0aGUgcHJvdG9jb2wgZGVzY3JpYmVkIGluCi1zZWN0aW9uflxyZWZ7aW1tdXRhYmxlLXRyYW5zZm9ybXN9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0ltbXV0YWJsZVNldH17XG9wdGlvbmFse2l0ZXJhYmxlfX0KLUNvbnN0cnVjdHMgYSBuZXcgZW1wdHkgXGNsYXNze0ltbXV0YWJsZVNldH0gb2JqZWN0LiAgSWYgdGhlIG9wdGlvbmFsCi1cdmFye2l0ZXJhYmxlfSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQsIHVwZGF0ZXMgdGhlIHNldCB3aXRoIGVsZW1lbnRzIG9idGFpbmVkCi1mcm9tIGl0ZXJhdGlvbi4gIEFsbCBvZiB0aGUgZWxlbWVudHMgaW4gXHZhcntpdGVyYWJsZX0gc2hvdWxkIGJlIGltbXV0YWJsZSBvcgotYmUgdHJhbnNmb3JtYWJsZSB0byBhbiBpbW11dGFibGUgdXNpbmcgdGhlIHByb3RvY29sIGRlc2NyaWJlZCBpbgotc2VjdGlvbn5ccmVme2ltbXV0YWJsZS10cmFuc2Zvcm1zfS4KLQotQmVjYXVzZSBcY2xhc3N7SW1tdXRhYmxlU2V0fSBvYmplY3RzIHByb3ZpZGUgYSBcbWV0aG9ke19faGFzaF9fKCl9IG1ldGhvZCwKLXRoZXkgY2FuIGJlIHVzZWQgYXMgc2V0IGVsZW1lbnRzIG9yIGFzIGRpY3Rpb25hcnkga2V5cy4gIFxjbGFzc3tJbW11dGFibGVTZXR9Ci1vYmplY3RzIGRvIG5vdCBoYXZlIG1ldGhvZHMgZm9yIGFkZGluZyBvciByZW1vdmluZyBlbGVtZW50cywgc28gYWxsIG9mIHRoZQotZWxlbWVudHMgbXVzdCBiZSBrbm93biB3aGVuIHRoZSBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuCi1cZW5ke2NsYXNzZGVzY30KLQotCi1cc3Vic2VjdGlvbntTZXQgT2JqZWN0cyBcbGFiZWx7c2V0LW9iamVjdHN9fQotCi1JbnN0YW5jZXMgb2YgXGNsYXNze1NldH0gYW5kIFxjbGFzc3tJbW11dGFibGVTZXR9IGJvdGggcHJvdmlkZQotdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOgotCi1cYmVnaW57dGFibGVpaWl9e2N8Y3xsfXtjb2RlfXtPcGVyYXRpb259e0VxdWl2YWxlbnR9e1Jlc3VsdH0KLSAgXGxpbmVpaWl7bGVuKFx2YXJ7c30pfXt9e2NhcmRpbmFsaXR5IG9mIHNldCBcdmFye3N9fQotCi0gIFxobGluZQotICBcbGluZWlpaXtcdmFye3h9IGluIFx2YXJ7c319e30KLSAgICAgICAgIHt0ZXN0IFx2YXJ7eH0gZm9yIG1lbWJlcnNoaXAgaW4gXHZhcntzfX0KLSAgXGxpbmVpaWl7XHZhcnt4fSBub3QgaW4gXHZhcntzfX17fQotICAgICAgICAge3Rlc3QgXHZhcnt4fSBmb3Igbm9uLW1lbWJlcnNoaXAgaW4gXHZhcntzfX0KLSAgXGxpbmVpaWl7XHZhcntzfS5pc3N1YnNldChcdmFye3R9KX17XGNvZGV7XHZhcntzfSA8PSBcdmFye3R9fX0KLSAgICAgICAgIHt0ZXN0IHdoZXRoZXIgZXZlcnkgZWxlbWVudCBpbiBcdmFye3N9IGlzIGluIFx2YXJ7dH19Ci0gIFxsaW5laWlpe1x2YXJ7c30uaXNzdXBlcnNldChcdmFye3R9KX17XGNvZGV7XHZhcntzfSA+PSBcdmFye3R9fX0KLSAgICAgICAgIHt0ZXN0IHdoZXRoZXIgZXZlcnkgZWxlbWVudCBpbiBcdmFye3R9IGlzIGluIFx2YXJ7c319Ci0KLSAgXGhsaW5lCi0gIFxsaW5laWlpe1x2YXJ7c30udW5pb24oXHZhcnt0fSl9e1x2YXJ7c30gXHRleHRiYXJ7fSBcdmFye3R9fQotICAgICAgICAge25ldyBzZXQgd2l0aCBlbGVtZW50cyBmcm9tIGJvdGggXHZhcntzfSBhbmQgXHZhcnt0fX0KLSAgXGxpbmVpaWl7XHZhcntzfS5pbnRlcnNlY3Rpb24oXHZhcnt0fSl9e1x2YXJ7c30gXCZcIFx2YXJ7dH19Ci0gICAgICAgICB7bmV3IHNldCB3aXRoIGVsZW1lbnRzIGNvbW1vbiB0byBcdmFye3N9IGFuZCBcdmFye3R9fQotICBcbGluZWlpaXtcdmFye3N9LmRpZmZlcmVuY2UoXHZhcnt0fSl9e1x2YXJ7c30gLSBcdmFye3R9fQotICAgICAgICAge25ldyBzZXQgd2l0aCBlbGVtZW50cyBpbiBcdmFye3N9IGJ1dCBub3QgaW4gXHZhcnt0fX0KLSAgXGxpbmVpaWl7XHZhcntzfS5zeW1tZXRyaWNfZGlmZmVyZW5jZShcdmFye3R9KX17XHZhcntzfSBcXlwgXHZhcnt0fX0KLSAgICAgICAgIHtuZXcgc2V0IHdpdGggZWxlbWVudHMgaW4gZWl0aGVyIFx2YXJ7c30gb3IgXHZhcnt0fSBidXQgbm90IGJvdGh9Ci0gIFxsaW5laWlpe1x2YXJ7c30uY29weSgpfXt9Ci0gICAgICAgICB7bmV3IHNldCB3aXRoIGEgc2hhbGxvdyBjb3B5IG9mIFx2YXJ7c319Ci1cZW5ke3RhYmxlaWlpfQotCi1Ob3RlLCB0aGUgbm9uLW9wZXJhdG9yIHZlcnNpb25zIG9mIFxtZXRob2R7dW5pb24oKX0sCi1cbWV0aG9ke2ludGVyc2VjdGlvbigpfSwgXG1ldGhvZHtkaWZmZXJlbmNlKCl9LCBhbmQKLVxtZXRob2R7c3ltbWV0cmljX2RpZmZlcmVuY2UoKX0gd2lsbCBhY2NlcHQgYW55IGl0ZXJhYmxlIGFzIGFuIGFyZ3VtZW50LgotSW4gY29udHJhc3QsIHRoZWlyIG9wZXJhdG9yIGJhc2VkIGNvdW50ZXJwYXJ0cyByZXF1aXJlIHRoZWlyIGFyZ3VtZW50cyB0bwotYmUgc2V0cy4gIFRoaXMgcHJlY2x1ZGVzIGVycm9yLXByb25lIGNvbnN0cnVjdGlvbnMgbGlrZQotXGNvZGV7U2V0KCdhYmMnKSBcJlwgJ2Nicyd9IGluIGZhdm9yIG9mIHRoZSBtb3JlIHJlYWRhYmxlCi1cY29kZXtTZXQoJ2FiYycpLmludGVyc2VjdGlvbignY2JzJyl9LgotXHZlcnNpb25jaGFuZ2VkW0Zvcm1lcmx5IGFsbCBhcmd1bWVudHMgd2VyZSByZXF1aXJlZCB0byBiZSBzZXRzXXsyLjMuMX0KLQotSW4gYWRkaXRpb24sIGJvdGggXGNsYXNze1NldH0gYW5kIFxjbGFzc3tJbW11dGFibGVTZXR9Ci1zdXBwb3J0IHNldCB0byBzZXQgY29tcGFyaXNvbnMuICBUd28gc2V0cyBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYKLWV2ZXJ5IGVsZW1lbnQgb2YgZWFjaCBzZXQgaXMgY29udGFpbmVkIGluIHRoZSBvdGhlciAoZWFjaCBpcyBhIHN1YnNldAotb2YgdGhlIG90aGVyKS4KLUEgc2V0IGlzIGxlc3MgdGhhbiBhbm90aGVyIHNldCBpZiBhbmQgb25seSBpZiB0aGUgZmlyc3Qgc2V0IGlzIGEgcHJvcGVyCi1zdWJzZXQgb2YgdGhlIHNlY29uZCBzZXQgKGlzIGEgc3Vic2V0LCBidXQgaXMgbm90IGVxdWFsKS4KLUEgc2V0IGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyIHNldCBpZiBhbmQgb25seSBpZiB0aGUgZmlyc3Qgc2V0IGlzIGEgcHJvcGVyCi1zdXBlcnNldCBvZiB0aGUgc2Vjb25kIHNldCAoaXMgYSBzdXBlcnNldCwgYnV0IGlzIG5vdCBlcXVhbCkuCi0KLVRoZSBzdWJzZXQgYW5kIGVxdWFsaXR5IGNvbXBhcmlzb25zIGRvIG5vdCBnZW5lcmFsaXplIHRvIGEgY29tcGxldGUKLW9yZGVyaW5nIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGFueSB0d28gZGlzam9pbnQgc2V0cyBhcmUgbm90IGVxdWFsIGFuZAotYXJlIG5vdCBzdWJzZXRzIG9mIGVhY2ggb3RoZXIsIHNvIFxlbXBoe2FsbH0gb2YgdGhlIGZvbGxvd2luZyByZXR1cm4KLVxjb2Rle0ZhbHNlfTogIFxjb2Rle1x2YXJ7YX08XHZhcntifX0sIFxjb2Rle1x2YXJ7YX09PVx2YXJ7Yn19LCBvcgotXGNvZGV7XHZhcnthfT5cdmFye2J9fS4KLUFjY29yZGluZ2x5LCBzZXRzIGRvIG5vdCBpbXBsZW1lbnQgdGhlIFxtZXRob2R7X19jbXBfX30gbWV0aG9kLgotCi1TaW5jZSBzZXRzIG9ubHkgZGVmaW5lIHBhcnRpYWwgb3JkZXJpbmcgKHN1YnNldCByZWxhdGlvbnNoaXBzKSwgdGhlIG91dHB1dAotb2YgdGhlIFxtZXRob2R7bGlzdC5zb3J0KCl9IG1ldGhvZCBpcyB1bmRlZmluZWQgZm9yIGxpc3RzIG9mIHNldHMuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgb3BlcmF0aW9ucyBhdmFpbGFibGUgaW4gXGNsYXNze0ltbXV0YWJsZVNldH0KLWJ1dCBub3QgZm91bmQgaW4gXGNsYXNze1NldH06Ci0KLVxiZWdpbnt0YWJsZWlpfXtjfGx9e2NvZGV9e09wZXJhdGlvbn17UmVzdWx0fQotICBcbGluZWlpe2hhc2goXHZhcntzfSl9e3JldHVybnMgYSBoYXNoIHZhbHVlIGZvciBcdmFye3N9fQotXGVuZHt0YWJsZWlpfQotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGluIFxjbGFzc3tTZXR9Ci1idXQgbm90IGZvdW5kIGluIFxjbGFzc3tJbW11dGFibGVTZXR9OgotCi1cYmVnaW57dGFibGVpaWl9e2N8Y3xsfXtjb2RlfXtPcGVyYXRpb259e0VxdWl2YWxlbnR9e1Jlc3VsdH0KLSAgXGxpbmVpaWl7XHZhcntzfS51cGRhdGUoXHZhcnt0fSl9Ci0gICAgICAgICB7XHZhcntzfSBcdGV4dGJhcj0gXHZhcnt0fX0KLSAgICAgICAgIHtyZXR1cm4gc2V0IFx2YXJ7c30gd2l0aCBlbGVtZW50cyBhZGRlZCBmcm9tIFx2YXJ7dH19Ci0gIFxsaW5laWlpe1x2YXJ7c30uaW50ZXJzZWN0aW9uX3VwZGF0ZShcdmFye3R9KX0KLSAgICAgICAgIHtcdmFye3N9IFwmPSBcdmFye3R9fQotICAgICAgICAge3JldHVybiBzZXQgXHZhcntzfSBrZWVwaW5nIG9ubHkgZWxlbWVudHMgYWxzbyBmb3VuZCBpbiBcdmFye3R9fQotICBcbGluZWlpaXtcdmFye3N9LmRpZmZlcmVuY2VfdXBkYXRlKFx2YXJ7dH0pfQotICAgICAgICAge1x2YXJ7c30gLT0gXHZhcnt0fX0KLSAgICAgICAgIHtyZXR1cm4gc2V0IFx2YXJ7c30gYWZ0ZXIgcmVtb3ZpbmcgZWxlbWVudHMgZm91bmQgaW4gXHZhcnt0fX0KLSAgXGxpbmVpaWl7XHZhcntzfS5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoXHZhcnt0fSl9Ci0gICAgICAgICB7XHZhcntzfSBcdGV4dGFzY2lpY2lyY3VtPSBcdmFye3R9fQotICAgICAgICAge3JldHVybiBzZXQgXHZhcntzfSB3aXRoIGVsZW1lbnRzIGZyb20gXHZhcntzfSBvciBcdmFye3R9Ci0gICAgICAgICAgYnV0IG5vdCBib3RofQotCi0gIFxobGluZQotICBcbGluZWlpaXtcdmFye3N9LmFkZChcdmFye3h9KX17fQotICAgICAgICAge2FkZCBlbGVtZW50IFx2YXJ7eH0gdG8gc2V0IFx2YXJ7c319Ci0gIFxsaW5laWlpe1x2YXJ7c30ucmVtb3ZlKFx2YXJ7eH0pfXt9Ci0gICAgICAgICB7cmVtb3ZlIFx2YXJ7eH0gZnJvbSBzZXQgXHZhcntzfTsgcmFpc2VzIFxleGNlcHRpb257S2V5RXJyb3J9Ci0JICBpZiBub3QgcHJlc2VudH0KLSAgXGxpbmVpaWl7XHZhcntzfS5kaXNjYXJkKFx2YXJ7eH0pfXt9Ci0gICAgICAgICB7cmVtb3ZlcyBcdmFye3h9IGZyb20gc2V0IFx2YXJ7c30gaWYgcHJlc2VudH0KLSAgXGxpbmVpaWl7XHZhcntzfS5wb3AoKX17fQotICAgICAgICAge3JlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBlbGVtZW50IGZyb20gXHZhcntzfTsgcmFpc2VzCi0JICBcZXhjZXB0aW9ue0tleUVycm9yfSBpZiBlbXB0eX0KLSAgXGxpbmVpaWl7XHZhcntzfS5jbGVhcigpfXt9Ci0gICAgICAgICB7cmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHNldCBcdmFye3N9fQotXGVuZHt0YWJsZWlpaX0KLQotTm90ZSwgdGhlIG5vbi1vcGVyYXRvciB2ZXJzaW9ucyBvZiBcbWV0aG9ke3VwZGF0ZSgpfSwKLVxtZXRob2R7aW50ZXJzZWN0aW9uX3VwZGF0ZSgpfSwgXG1ldGhvZHtkaWZmZXJlbmNlX3VwZGF0ZSgpfSwgYW5kCi1cbWV0aG9ke3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSgpfSB3aWxsIGFjY2VwdCBhbnkgaXRlcmFibGUgYXMKLWFuIGFyZ3VtZW50LgotXHZlcnNpb25jaGFuZ2VkW0Zvcm1lcmx5IGFsbCBhcmd1bWVudHMgd2VyZSByZXF1aXJlZCB0byBiZSBzZXRzXXsyLjMuMX0KLQotQWxzbyBub3RlLCB0aGUgbW9kdWxlIGFsc28gaW5jbHVkZXMgYSBcbWV0aG9ke3VuaW9uX3VwZGF0ZSgpfSBtZXRob2QKLXdoaWNoIGlzIGFuIGFsaWFzIGZvciBcbWV0aG9ke3VwZGF0ZSgpfS4gIFRoZSBtZXRob2QgaXMgaW5jbHVkZWQgZm9yCi1iYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIFByb2dyYW1tZXJzIHNob3VsZCBwcmVmZXIgdGhlCi1cbWV0aG9ke3VwZGF0ZSgpfSBtZXRob2QgYmVjYXVzZSBpdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJ1aWx0aW4KLVxjbGFzc3tzZXQoKX0gYW5kIFxjbGFzc3tmcm96ZW5zZXQoKX0gdHlwZXMuCi0KLVxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3NldC1leGFtcGxlfX0KLQotXGJlZ2lue3ZlcmJhdGltfQotPj4+IGZyb20gc2V0cyBpbXBvcnQgU2V0Ci0+Pj4gZW5naW5lZXJzID0gU2V0KFsnSm9obicsICdKYW5lJywgJ0phY2snLCAnSmFuaWNlJ10pCi0+Pj4gcHJvZ3JhbW1lcnMgPSBTZXQoWydKYWNrJywgJ1NhbScsICdTdXNhbicsICdKYW5pY2UnXSkKLT4+PiBtYW5hZ2VycyA9IFNldChbJ0phbmUnLCAnSmFjaycsICdTdXNhbicsICdaYWNrJ10pCi0+Pj4gZW1wbG95ZWVzID0gZW5naW5lZXJzIHwgcHJvZ3JhbW1lcnMgfCBtYW5hZ2VycyAgICAgICAgICAgIyB1bmlvbgotPj4+IGVuZ2luZWVyaW5nX21hbmFnZW1lbnQgPSBlbmdpbmVlcnMgJiBtYW5hZ2VycyAgICAgICAgICAgICMgaW50ZXJzZWN0aW9uCi0+Pj4gZnVsbHRpbWVfbWFuYWdlbWVudCA9IG1hbmFnZXJzIC0gZW5naW5lZXJzIC0gcHJvZ3JhbW1lcnMgIyBkaWZmZXJlbmNlCi0+Pj4gZW5naW5lZXJzLmFkZCgnTWFydmluJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgZWxlbWVudAotPj4+IHByaW50IGVuZ2luZWVycwotU2V0KFsnSmFuZScsICdNYXJ2aW4nLCAnSmFuaWNlJywgJ0pvaG4nLCAnSmFjayddKQotPj4+IGVtcGxveWVlcy5pc3N1cGVyc2V0KGVuZ2luZWVycykgICAgICAgICAgICMgc3VwZXJzZXQgdGVzdAotRmFsc2UKLT4+PiBlbXBsb3llZXMudW5pb25fdXBkYXRlKGVuZ2luZWVycykgICAgICAgICAjIHVwZGF0ZSBmcm9tIGFub3RoZXIgc2V0Ci0+Pj4gZW1wbG95ZWVzLmlzc3VwZXJzZXQoZW5naW5lZXJzKQotVHJ1ZQotPj4+IGZvciBncm91cCBpbiBbZW5naW5lZXJzLCBwcm9ncmFtbWVycywgbWFuYWdlcnMsIGVtcGxveWVlc106Ci0uLi4gICAgIGdyb3VwLmRpc2NhcmQoJ1N1c2FuJykgICAgICAgICAgICAgICAgIyB1bmNvbmRpdGlvbmFsbHkgcmVtb3ZlIGVsZW1lbnQKLS4uLiAgICAgcHJpbnQgZ3JvdXAKLS4uLgotU2V0KFsnSmFuZScsICdNYXJ2aW4nLCAnSmFuaWNlJywgJ0pvaG4nLCAnSmFjayddKQotU2V0KFsnSmFuaWNlJywgJ0phY2snLCAnU2FtJ10pCi1TZXQoWydKYW5lJywgJ1phY2snLCAnSmFjayddKQotU2V0KFsnSmFjaycsICdTYW0nLCAnSmFuZScsICdNYXJ2aW4nLCAnSmFuaWNlJywgJ0pvaG4nLCAnWmFjayddKQotXGVuZHt2ZXJiYXRpbX0KLQotCi1cc3Vic2VjdGlvbntQcm90b2NvbCBmb3IgYXV0b21hdGljIGNvbnZlcnNpb24gdG8gaW1tdXRhYmxlCi0gICAgICAgICAgICBcbGFiZWx7aW1tdXRhYmxlLXRyYW5zZm9ybXN9fQotCi1TZXRzIGNhbiBvbmx5IGNvbnRhaW4gaW1tdXRhYmxlIGVsZW1lbnRzLiAgRm9yIGNvbnZlbmllbmNlLCBtdXRhYmxlCi1cY2xhc3N7U2V0fSBvYmplY3RzIGFyZSBhdXRvbWF0aWNhbGx5IGNvcGllZCB0byBhbiBcY2xhc3N7SW1tdXRhYmxlU2V0fQotYmVmb3JlIGJlaW5nIGFkZGVkIGFzIGEgc2V0IGVsZW1lbnQuCi0KLVRoZSBtZWNoYW5pc20gaXMgdG8gYWx3YXlzIGFkZCBhIGhhc2hhYmxlIGVsZW1lbnQsIG9yIGlmIGl0IGlzIG5vdAotaGFzaGFibGUsIHRoZSBlbGVtZW50IGlzIGNoZWNrZWQgdG8gc2VlIGlmIGl0IGhhcyBhbgotXG1ldGhvZHtfX2FzX2ltbXV0YWJsZV9fKCl9IG1ldGhvZCB3aGljaCByZXR1cm5zIGFuIGltbXV0YWJsZSBlcXVpdmFsZW50LgotCi1TaW5jZSBcY2xhc3N7U2V0fSBvYmplY3RzIGhhdmUgYSBcbWV0aG9ke19fYXNfaW1tdXRhYmxlX18oKX0gbWV0aG9kCi1yZXR1cm5pbmcgYW4gaW5zdGFuY2Ugb2YgXGNsYXNze0ltbXV0YWJsZVNldH0sIGl0IGlzIHBvc3NpYmxlIHRvCi1jb25zdHJ1Y3Qgc2V0cyBvZiBzZXRzLgotCi1BIHNpbWlsYXIgbWVjaGFuaXNtIGlzIG5lZWRlZCBieSB0aGUgXG1ldGhvZHtfX2NvbnRhaW5zX18oKX0gYW5kCi1cbWV0aG9ke3JlbW92ZSgpfSBtZXRob2RzIHdoaWNoIG5lZWQgdG8gaGFzaCBhbiBlbGVtZW50IHRvIGNoZWNrCi1mb3IgbWVtYmVyc2hpcCBpbiBhIHNldC4gIFRob3NlIG1ldGhvZHMgY2hlY2sgYW4gZWxlbWVudCBmb3IgaGFzaGFiaWxpdHkKLWFuZCwgaWYgbm90LCBjaGVjayBmb3IgYSBcbWV0aG9ke19fYXNfdGVtcG9yYXJpbHlfaW1tdXRhYmxlX18oKX0gbWV0aG9kCi13aGljaCByZXR1cm5zIHRoZSBlbGVtZW50IHdyYXBwZWQgYnkgYSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRlbXBvcmFyeQotbWV0aG9kcyBmb3IgXG1ldGhvZHtfX2hhc2hfXygpfSwgXG1ldGhvZHtfX2VxX18oKX0sIGFuZCBcbWV0aG9ke19fbmVfXygpfS4KLQotVGhlIGFsdGVybmF0ZSBtZWNoYW5pc20gc3BhcmVzIHRoZSBuZWVkIHRvIGJ1aWxkIGEgc2VwYXJhdGUgY29weSBvZgotdGhlIG9yaWdpbmFsIG11dGFibGUgb2JqZWN0LgotCi1cY2xhc3N7U2V0fSBvYmplY3RzIGltcGxlbWVudCB0aGUgXG1ldGhvZHtfX2FzX3RlbXBvcmFyaWx5X2ltbXV0YWJsZV9fKCl9Ci1tZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgXGNsYXNze1NldH0gb2JqZWN0IHdyYXBwZWQgYnkgYSBuZXcgY2xhc3MKLVxjbGFzc3tfVGVtcG9yYXJpbHlJbW11dGFibGVTZXR9LgotCi1UaGUgdHdvIG1lY2hhbmlzbXMgZm9yIGFkZGluZyBoYXNoYWJpbGl0eSBhcmUgbm9ybWFsbHkgaW52aXNpYmxlIHRvIHRoZQotdXNlcjsgaG93ZXZlciwgYSBjb25mbGljdCBjYW4gYXJpc2UgaW4gYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudAotd2hlcmUgb25lIHRocmVhZCBpcyB1cGRhdGluZyBhIHNldCB3aGlsZSBhbm90aGVyIGhhcyB0ZW1wb3JhcmlseSB3cmFwcGVkIGl0Ci1pbiBcY2xhc3N7X1RlbXBvcmFyaWx5SW1tdXRhYmxlU2V0fS4gIEluIG90aGVyIHdvcmRzLCBzZXRzIG9mIG11dGFibGUgc2V0cwotYXJlIG5vdCB0aHJlYWQtc2FmZS4KLQotCi1cc3Vic2VjdGlvbntDb21wYXJpc29uIHRvIHRoZSBidWlsdC1pbiBcY2xhc3N7c2V0fSB0eXBlcwotICAgICAgICAgICAgXGxhYmVse2NvbXBhcmlzb24tdG8tYnVpbHRpbi1zZXR9fQotCi1UaGUgYnVpbHQtaW4gXGNsYXNze3NldH0gYW5kIFxjbGFzc3tmcm96ZW5zZXR9IHR5cGVzIHdlcmUgZGVzaWduZWQgYmFzZWQKLW9uIGxlc3NvbnMgbGVhcm5lZCBmcm9tIHRoZSBcbW9kdWxle3NldHN9IG1vZHVsZS4gIFRoZSBrZXkgZGlmZmVyZW5jZXMgYXJlOgotCi1cYmVnaW57aXRlbWl6ZX0KLVxpdGVtIFxjbGFzc3tTZXR9IGFuZCBcY2xhc3N7SW1tdXRhYmxlU2V0fSB3ZXJlIHJlbmFtZWQgdG8gXGNsYXNze3NldH0gYW5kCi0gICAgICBcY2xhc3N7ZnJvemVuc2V0fS4KLVxpdGVtIFRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgdG8gXGNsYXNze0Jhc2VTZXR9LiAgSW5zdGVhZCwgdXNlCi0gICAgICBcY29kZXtpc2luc3RhbmNlKHgsIChzZXQsIGZyb3plbnNldCkpfS4KLVxpdGVtIFRoZSBoYXNoIGFsZ29yaXRobSBmb3IgdGhlIGJ1aWx0LWlucyBwZXJmb3JtcyBzaWduaWZpY2FudGx5IGJldHRlcgotICAgICAgKGZld2VyIGNvbGxpc2lvbnMpIGZvciBtb3N0IGRhdGFzZXRzLgotXGl0ZW0gVGhlIGJ1aWx0LWluIHZlcnNpb25zIGhhdmUgbW9yZSBzcGFjZSBlZmZpY2llbnQgcGlja2xlcy4KLVxpdGVtIFRoZSBidWlsdC1pbiB2ZXJzaW9ucyBkbyBub3QgaGF2ZSBhIFxtZXRob2R7dW5pb25fdXBkYXRlKCl9IG1ldGhvZC4KLSAgICAgIEluc3RlYWQsIHVzZSB0aGUgXG1ldGhvZHt1cGRhdGUoKX0gbWV0aG9kIHdoaWNoIGlzIGVxdWl2YWxlbnQuCi1caXRlbSBUaGUgYnVpbHQtaW4gdmVyc2lvbnMgZG8gbm90IGhhdmUgYSBcbWV0aG9ke19yZXByKHNvcnRlZD1UcnVlKX0gbWV0aG9kLgotICAgICAgSW5zdGVhZCwgdXNlIHRoZSBidWlsdC1pbiBcZnVuY3Rpb257cmVwcigpfSBhbmQgXGZ1bmN0aW9ue3NvcnRlZCgpfQotICAgICAgZnVuY3Rpb25zOiAgXGNvZGV7cmVwcihzb3J0ZWQocykpfS4KLVxpdGVtIFRoZSBidWlsdC1pbiB2ZXJzaW9uIGRvZXMgbm90IGhhdmUgYSBwcm90b2NvbCBmb3IgYXV0b21hdGljIGNvbnZlcnNpb24KLSAgICAgIHRvIGltbXV0YWJsZS4gIE1hbnkgZm91bmQgdGhpcyBmZWF0dXJlIHRvIGJlIGNvbmZ1c2luZyBhbmQgbm8gb25lCi0gICAgICBpbiB0aGUgY29tbXVuaXR5IHJlcG9ydGVkIGhhdmluZyBmb3VuZCByZWFsIHVzZXMgZm9yIGl0LgotXGVuZHtpdGVtaXplfSAgICAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RkdHlwZXMudGV4IGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKaW5kZXggOGE1MjdmNi4uYTA3ZTdkNyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKQEAgLTEzMzQsMTYgKzEzMzQsNiBAQAogXG1ldGhvZHtpbnRlcnNlY3Rpb25fdXBkYXRlKCl9LCBcbWV0aG9ke2RpZmZlcmVuY2VfdXBkYXRlKCl9LCBhbmQKIFxtZXRob2R7c3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKCl9IG1ldGhvZHMgd2lsbCBhY2NlcHQgYW55IGl0ZXJhYmxlCiBhcyBhbiBhcmd1bWVudC4KLQotVGhlIGRlc2lnbiBvZiB0aGUgc2V0IHR5cGVzIHdhcyBiYXNlZCBvbiBsZXNzb25zIGxlYXJuZWQgZnJvbSB0aGUKLVxtb2R1bGV7c2V0c30gbW9kdWxlLgotICAgICAKLVxiZWdpbntzZWVhbHNvfSAgICAgCi0gIFxzZWVsaW5re2NvbXBhcmlzb24tdG8tYnVpbHRpbi1zZXQuaHRtbH0KLSAgICAgICAgICB7Q29tcGFyaXNvbiB0byB0aGUgYnVpbHQtaW4gc2V0IHR5cGVzfQotICAgICAgICAgIHtEaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBcbW9kdWxle3NldHN9IG1vZHVsZSBhbmQgdGhlCi0gICAgICAgICAgIGJ1aWx0LWluIHNldCB0eXBlcy59CQkJCQkgICAgICAKLVxlbmR7c2VlYWxzb30KICAgICAgCiAKIFxzZWN0aW9ue01hcHBpbmcgVHlwZXMgLS0tIFxjbGFzc3tkaWN0fSBcbGFiZWx7dHlwZXNtYXBwaW5nfX0KZGlmZiAtLWdpdCBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CmluZGV4IDA3MDUzYmEuLjllZmVmOTEgMTAwNjQ0Ci0tLSBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkKKysrIGIvTGliL21zaWxpYi9fX2luaXRfXy5weQpAQCAtMiw3ICsyLDcgQEAKICMgQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiB2LiBM9ndpcwogIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCiBmcm9tIF9tc2kgaW1wb3J0ICoKLWltcG9ydCBzZXRzLCBvcywgc3RyaW5nLCByZQoraW1wb3J0IG9zLCBzdHJpbmcsIHJlCiAKIFdpbjY0PTAKIApAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgIHNlbGYuZmlsZXMgPSBbXQotICAgICAgICBzZWxmLmZpbGVuYW1lcyA9IHNldHMuU2V0KCkKKyAgICAgICAgc2VsZi5maWxlbmFtZXMgPSBzZXQoKQogICAgICAgICBzZWxmLmluZGV4ID0gMAogCiAgICAgZGVmIGdlbl9pZChzZWxmLCBmaWxlKToKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCiAgICAgICAgIGRiLkNvbW1pdCgpCiAKLV9kaXJlY3RvcmllcyA9IHNldHMuU2V0KCkKK19kaXJlY3RvcmllcyA9IHNldCgpCiBjbGFzcyBEaXJlY3Rvcnk6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiLCBjYWIsIGJhc2VkaXIsIHBoeXNpY2FsLCBfbG9naWNhbCwgZGVmYXVsdCwgY29tcG9uZW50ZmxhZ3M9Tm9uZSk6CiAgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgaW4gdGhlIERpcmVjdG9yeSB0YWJsZS4gVGhlcmUgaXMgYSBjdXJyZW50IGNvbXBvbmVudApAQCAtMjM5LDggKzIzOSw4IEBACiAgICAgICAgIHNlbGYucGh5c2ljYWwgPSBwaHlzaWNhbAogICAgICAgICBzZWxmLmxvZ2ljYWwgPSBsb2dpY2FsCiAgICAgICAgIHNlbGYuY29tcG9uZW50ID0gTm9uZQotICAgICAgICBzZWxmLnNob3J0X25hbWVzID0gc2V0cy5TZXQoKQotICAgICAgICBzZWxmLmlkcyA9IHNldHMuU2V0KCkKKyAgICAgICAgc2VsZi5zaG9ydF9uYW1lcyA9IHNldCgpCisgICAgICAgIHNlbGYuaWRzID0gc2V0KCkKICAgICAgICAgc2VsZi5rZXlmaWxlcyA9IHt9CiAgICAgICAgIHNlbGYuY29tcG9uZW50ZmxhZ3MgPSBjb21wb25lbnRmbGFncwogICAgICAgICBpZiBiYXNlZGlyOgpkaWZmIC0tZ2l0IGEvTGliL3NldHMucHkgYi9MaWIvc2V0cy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmOTNhNi4uMDAwMDAwMAotLS0gYS9MaWIvc2V0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDU3NyArMCwwIEBACi0iIiJDbGFzc2VzIHRvIHJlcHJlc2VudCBhcmJpdHJhcnkgc2V0cyAoaW5jbHVkaW5nIHNldHMgb2Ygc2V0cykuCi0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgc2V0cyB1c2luZyBkaWN0aW9uYXJpZXMgd2hvc2UgdmFsdWVzIGFyZQotaWdub3JlZC4gIFRoZSB1c3VhbCBvcGVyYXRpb25zICh1bmlvbiwgaW50ZXJzZWN0aW9uLCBkZWxldGlvbiwgZXRjLikKLWFyZSBwcm92aWRlZCBhcyBib3RoIG1ldGhvZHMgYW5kIG9wZXJhdG9ycy4KLQotSW1wb3J0YW50OiBzZXRzIGFyZSBub3Qgc2VxdWVuY2VzISAgV2hpbGUgdGhleSBzdXBwb3J0ICd4IGluIHMnLAotJ2xlbihzKScsIGFuZCAnZm9yIHggaW4gcycsIG5vbmUgb2YgdGhvc2Ugb3BlcmF0aW9ucyBhcmUgdW5pcXVlIGZvcgotc2VxdWVuY2VzOyBmb3IgZXhhbXBsZSwgbWFwcGluZ3Mgc3VwcG9ydCBhbGwgdGhyZWUgYXMgd2VsbC4gIFRoZQotY2hhcmFjdGVyaXN0aWMgb3BlcmF0aW9uIGZvciBzZXF1ZW5jZXMgaXMgc3Vic2NyaXB0aW5nIHdpdGggc21hbGwKLWludGVnZXJzOiBzW2ldLCBmb3IgaSBpbiByYW5nZShsZW4ocykpLiAgU2V0cyBkb24ndCBzdXBwb3J0Ci1zdWJzY3JpcHRpbmcgYXQgYWxsLiAgQWxzbywgc2VxdWVuY2VzIGFsbG93IG11bHRpcGxlIG9jY3VycmVuY2VzIGFuZAotdGhlaXIgZWxlbWVudHMgaGF2ZSBhIGRlZmluaXRlIG9yZGVyOyBzZXRzIG9uIHRoZSBvdGhlciBoYW5kIGRvbid0Ci1yZWNvcmQgbXVsdGlwbGUgb2NjdXJyZW5jZXMgYW5kIGRvbid0IHJlbWVtYmVyIHRoZSBvcmRlciBvZiBlbGVtZW50Ci1pbnNlcnRpb24gKHdoaWNoIGlzIHdoeSB0aGV5IGRvbid0IHN1cHBvcnQgc1tpXSkuCi0KLVRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6Ci0KLUJhc2VTZXQgLS0gQWxsIHRoZSBvcGVyYXRpb25zIGNvbW1vbiB0byBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZQotICAgIHNldHMuIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MsIG5vdCBtZWFudCB0byBiZSBkaXJlY3RseQotICAgIGluc3RhbnRpYXRlZC4KLQotU2V0IC0tIE11dGFibGUgc2V0cywgc3ViY2xhc3Mgb2YgQmFzZVNldDsgbm90IGhhc2hhYmxlLgotCi1JbW11dGFibGVTZXQgLS0gSW1tdXRhYmxlIHNldHMsIHN1YmNsYXNzIG9mIEJhc2VTZXQ7IGhhc2hhYmxlLgotICAgIEFuIGl0ZXJhYmxlIGFyZ3VtZW50IGlzIG1hbmRhdG9yeSB0byBjcmVhdGUgYW4gSW1tdXRhYmxlU2V0LgotCi1fVGVtcG9yYXJpbHlJbW11dGFibGVTZXQgLS0gQSB3cmFwcGVyIGFyb3VuZCBhIFNldCwgaGFzaGFibGUsCi0gICAgZ2l2aW5nIHRoZSBzYW1lIGhhc2ggdmFsdWUgYXMgdGhlIGltbXV0YWJsZSBzZXQgZXF1aXZhbGVudAotICAgIHdvdWxkIGhhdmUuICBEbyBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0KLU9ubHkgaGFzaGFibGUgb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gYSBTZXQuIEluIHBhcnRpY3VsYXIsIHlvdSBjYW5ub3QKLXJlYWxseSBhZGQgYSBTZXQgYXMgYW4gZWxlbWVudCB0byBhbm90aGVyIFNldDsgaWYgeW91IHRyeSwgd2hhdCBpcwotYWN0dWFsbHkgYWRkZWQgaXMgYW4gSW1tdXRhYmxlU2V0IGJ1aWx0IGZyb20gaXQgKGl0IGNvbXBhcmVzIGVxdWFsIHRvCi10aGUgb25lIHlvdSB0cmllZCBhZGRpbmcpLgotCi1XaGVuIHlvdSBhc2sgaWYgYHggaW4geScgd2hlcmUgeCBpcyBhIFNldCBhbmQgeSBpcyBhIFNldCBvcgotSW1tdXRhYmxlU2V0LCB4IGlzIHdyYXBwZWQgaW50byBhIF9UZW1wb3JhcmlseUltbXV0YWJsZVNldCB6LCBhbmQKLXdoYXQncyB0ZXN0ZWQgaXMgYWN0dWFsbHkgYHogaW4geScuCi0KLSIiIgotCi0jIENvZGUgaGlzdG9yeToKLSMKLSMgLSBHcmVnIFYuIFdpbHNvbiB3cm90ZSB0aGUgZmlyc3QgdmVyc2lvbiwgdXNpbmcgYSBkaWZmZXJlbnQgYXBwcm9hY2gKLSMgICB0byB0aGUgbXV0YWJsZS9pbW11dGFibGUgcHJvYmxlbSwgYW5kIGluaGVyaXRpbmcgZnJvbSBkaWN0LgotIwotIyAtIEFsZXggTWFydGVsbGkgbW9kaWZpZWQgR3JlZydzIHZlcnNpb24gdG8gaW1wbGVtZW50IHRoZSBjdXJyZW50Ci0jICAgU2V0L0ltbXV0YWJsZVNldCBhcHByb2FjaCwgYW5kIG1ha2UgdGhlIGRhdGEgYW4gYXR0cmlidXRlLgotIwotIyAtIEd1aWRvIHZhbiBSb3NzdW0gcmV3cm90ZSBtdWNoIG9mIHRoZSBjb2RlLCBtYWRlIHNvbWUgQVBJIGNoYW5nZXMsCi0jICAgYW5kIGNsZWFuZWQgdXAgdGhlIGRvY3N0cmluZ3MuCi0jCi0jIC0gUmF5bW9uZCBIZXR0aW5nZXIgYWRkZWQgYSBudW1iZXIgb2Ygc3BlZWR1cHMgYW5kIG90aGVyCi0jICAgaW1wcm92ZW1lbnRzLgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMKLXRyeToKLSAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaWZpbHRlciwgaWZpbHRlcmZhbHNlCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgIyBDb2RlIHRvIG1ha2UgdGhlIG1vZHVsZSBydW4gdW5kZXIgUHkyLjIKLSAgICBkZWYgaWZpbHRlcihwcmVkaWNhdGUsIGl0ZXJhYmxlKToKLSAgICAgICAgaWYgcHJlZGljYXRlIGlzIE5vbmU6Ci0gICAgICAgICAgICBkZWYgcHJlZGljYXRlKHgpOgotICAgICAgICAgICAgICAgIHJldHVybiB4Ci0gICAgICAgIGZvciB4IGluIGl0ZXJhYmxlOgotICAgICAgICAgICAgaWYgcHJlZGljYXRlKHgpOgotICAgICAgICAgICAgICAgIHlpZWxkIHgKLSAgICBkZWYgaWZpbHRlcmZhbHNlKHByZWRpY2F0ZSwgaXRlcmFibGUpOgotICAgICAgICBpZiBwcmVkaWNhdGUgaXMgTm9uZToKLSAgICAgICAgICAgIGRlZiBwcmVkaWNhdGUoeCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHgKLSAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6Ci0gICAgICAgICAgICBpZiBub3QgcHJlZGljYXRlKHgpOgotICAgICAgICAgICAgICAgIHlpZWxkIHgKLSAgICB0cnk6Ci0gICAgICAgIFRydWUsIEZhbHNlCi0gICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgVHJ1ZSwgRmFsc2UgPSAoMD09MCwgMCE9MCkKLQotX19hbGxfXyA9IFsnQmFzZVNldCcsICdTZXQnLCAnSW1tdXRhYmxlU2V0J10KLQotY2xhc3MgQmFzZVNldChvYmplY3QpOgotICAgICIiIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBtdXRhYmxlIGFuZCBpbW11dGFibGUgc2V0cy4iIiIKLQotICAgIF9fc2xvdHNfXyA9IFsnX2RhdGEnXQotCi0gICAgIyBDb25zdHJ1Y3RvcgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICAiIiJUaGlzIGlzIGFuIGFic3RyYWN0IGNsYXNzLiIiIgotICAgICAgICAjIERvbid0IGNhbGwgdGhpcyBmcm9tIGEgY29uY3JldGUgc3ViY2xhc3MhCi0gICAgICAgIGlmIHNlbGYuX19jbGFzc19fIGlzIEJhc2VTZXQ6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICgiQmFzZVNldCBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgU2V0IG9yIEltbXV0YWJsZVNldC4iKQotCi0gICAgIyBTdGFuZGFyZCBwcm90b2NvbHM6IF9fbGVuX18sIF9fcmVwcl9fLCBfX3N0cl9fLCBfX2l0ZXJfXwotCi0gICAgZGVmIF9fbGVuX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgc2V0LiIiIgotICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RhdGEpCi0KLSAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQuCi0KLSAgICAgICAgVGhpcyBsb29rcyBsaWtlICdTZXQoWzxsaXN0IG9mIGVsZW1lbnRzPl0pJy4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmLl9yZXByKCkKLQotICAgICMgX19zdHJfXyBpcyB0aGUgc2FtZSBhcyBfX3JlcHJfXwotICAgIF9fc3RyX18gPSBfX3JlcHJfXwotCi0gICAgZGVmIF9yZXByKHNlbGYsIHNvcnRlZD1GYWxzZSk6Ci0gICAgICAgIGVsZW1lbnRzID0gc2VsZi5fZGF0YS5rZXlzKCkKLSAgICAgICAgaWYgc29ydGVkOgotICAgICAgICAgICAgZWxlbWVudHMuc29ydCgpCi0gICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgZWxlbWVudHMpCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBlbGVtZW50cyBvciBhIHNldC4KLQotICAgICAgICBUaGlzIGlzIHRoZSBrZXlzIGl0ZXJhdG9yIGZvciB0aGUgdW5kZXJseWluZyBkaWN0LgotICAgICAgICAiIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEuaXRlcmtleXMoKQotCi0gICAgIyBUaHJlZS13YXkgY29tcGFyaXNvbiBpcyBub3Qgc3VwcG9ydGVkLiAgSG93ZXZlciwgYmVjYXVzZSBfX2VxX18gaXMKLSAgICAjIHRyaWVkIGJlZm9yZSBfX2NtcF9fLCBpZiBTZXQgeCA9PSBTZXQgeSwgeC5fX2VxX18oeSkgcmV0dXJucyBUcnVlIGFuZAotICAgICMgdGhlbiBjbXAoeCwgeSkgcmV0dXJucyAwIChQeXRob24gZG9lc24ndCBhY3R1YWxseSBjYWxsIF9fY21wX18gaW4gdGhpcwotICAgICMgY2FzZSkuCi0KLSAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbid0IGNvbXBhcmUgc2V0cyB1c2luZyBjbXAoKSIKLQotICAgICMgRXF1YWxpdHkgY29tcGFyaXNvbnMgdXNpbmcgdGhlIHVuZGVybHlpbmcgZGljdHMuICBNaXhlZC10eXBlIGNvbXBhcmlzb25zCi0gICAgIyBhcmUgYWxsb3dlZCBoZXJlLCB3aGVyZSBTZXQgPT0geiBmb3Igbm9uLVNldCB6IGFsd2F5cyByZXR1cm5zIEZhbHNlLAotICAgICMgYW5kIFNldCAhPSB6IGFsd2F5cyBUcnVlLiAgVGhpcyBhbGxvd3MgZXhwcmVzc2lvbnMgbGlrZSAieCBpbiB5IiB0bwotICAgICMgZ2l2ZSB0aGUgZXhwZWN0ZWQgcmVzdWx0IHdoZW4geSBpcyBhIHNlcXVlbmNlIG9mIG1peGVkIHR5cGVzLCBub3QKLSAgICAjIHJhaXNpbmcgYSBwb2ludGxlc3MgVHlwZUVycm9yIGp1c3QgYmVjYXVzZSB5IGNvbnRhaW5zIGEgU2V0LCBvciB4IGlzCi0gICAgIyBhIFNldCBhbmQgeSBjb250YWluJ3MgYSBub24tc2V0ICgiaW4iIGludm9rZXMgb25seSBfX2VxX18pLgotICAgICMgU3VidGxlOiAgaXQgd291bGQgYmUgbmljZXIgaWYgX19lcV9fIGFuZCBfX25lX18gY291bGQgcmV0dXJuCi0gICAgIyBOb3RJbXBsZW1lbnRlZCBpbnN0ZWFkIG9mIFRydWUgb3IgRmFsc2UuICBUaGVuIHRoZSBvdGhlciBjb21wYXJhbmQKLSAgICAjIHdvdWxkIGdldCBhIGNoYW5jZSB0byBkZXRlcm1pbmUgdGhlIHJlc3VsdCwgYW5kIGlmIHRoZSBvdGhlciBjb21wYXJhbmQKLSAgICAjIGFsc28gcmV0dXJuZWQgTm90SW1wbGVtZW50ZWQgdGhlbiBpdCB3b3VsZCBmYWxsIGJhY2sgdG8gb2JqZWN0IGFkZHJlc3MKLSAgICAjIGNvbXBhcmlzb24gKHdoaWNoIHdvdWxkIGFsd2F5cyByZXR1cm4gRmFsc2UgZm9yIF9fZXFfXyBhbmQgYWx3YXlzCi0gICAgIyBUcnVlIGZvciBfX25lX18pLiAgSG93ZXZlciwgdGhhdCBkb2Vzbid0IHdvcmssIGJlY2F1c2UgdGhpcyB0eXBlCi0gICAgIyAqYWxzbyogaW1wbGVtZW50cyBfX2NtcF9fOiAgaWYsIGUuZy4sIF9fZXFfXyByZXR1cm5zIE5vdEltcGxlbWVudGVkLAotICAgICMgUHl0aG9uIHRyaWVzIF9fY21wX18gbmV4dCwgYW5kIHRoZSBfX2NtcF9fIGhlcmUgdGhlbiByYWlzZXMgVHlwZUVycm9yLgotCi0gICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEgPT0gb3RoZXIuX2RhdGEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEgIT0gb3RoZXIuX2RhdGEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0KLSAgICAjIENvcHlpbmcgb3BlcmF0aW9ucwotCi0gICAgZGVmIGNvcHkoc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIHNldC4iIiIKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5fX2NsYXNzX18oKQotICAgICAgICByZXN1bHQuX2RhdGEudXBkYXRlKHNlbGYuX2RhdGEpCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotICAgIF9fY29weV9fID0gY29weSAjIEZvciB0aGUgY29weSBtb2R1bGUKLQotICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6Ci0gICAgICAgICIiIlJldHVybiBhIGRlZXAgY29weSBvZiBhIHNldDsgdXNlZCBieSBjb3B5IG1vZHVsZS4iIiIKLSAgICAgICAgIyBUaGlzIHByZS1jcmVhdGVzIHRoZSByZXN1bHQgYW5kIGluc2VydHMgaXQgaW4gdGhlIG1lbW8KLSAgICAgICAgIyBlYXJseSwgaW4gY2FzZSB0aGUgZGVlcCBjb3B5IHJlY3Vyc2VzIGludG8gYW5vdGhlciByZWZlcmVuY2UKLSAgICAgICAgIyB0byB0aGlzIHNhbWUgc2V0LiAgQSBzZXQgY2FuJ3QgYmUgYW4gZWxlbWVudCBvZiBpdHNlbGYsIGJ1dAotICAgICAgICAjIGl0IGNhbiBjZXJ0YWlubHkgY29udGFpbiBhbiBvYmplY3QgdGhhdCBoYXMgYSByZWZlcmVuY2UgdG8KLSAgICAgICAgIyBpdHNlbGYuCi0gICAgICAgIGZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5fX2NsYXNzX18oKQotICAgICAgICBtZW1vW2lkKHNlbGYpXSA9IHJlc3VsdAotICAgICAgICBkYXRhID0gcmVzdWx0Ll9kYXRhCi0gICAgICAgIHZhbHVlID0gVHJ1ZQotICAgICAgICBmb3IgZWx0IGluIHNlbGY6Ci0gICAgICAgICAgICBkYXRhW2RlZXBjb3B5KGVsdCwgbWVtbyldID0gdmFsdWUKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgIyBTdGFuZGFyZCBzZXQgb3BlcmF0aW9uczogdW5pb24sIGludGVyc2VjdGlvbiwgYm90aCBkaWZmZXJlbmNlcy4KLSAgICAjIEVhY2ggaGFzIGFuIG9wZXJhdG9yIHZlcnNpb24gKGUuZy4gX19vcl9fLCBpbnZva2VkIHdpdGggfCkgYW5kIGEKLSAgICAjIG1ldGhvZCB2ZXJzaW9uIChlLmcuIHVuaW9uKS4KLSAgICAjIFN1YnRsZTogIEVhY2ggcGFpciByZXF1aXJlcyBkaXN0aW5jdCBjb2RlIHNvIHRoYXQgdGhlIG91dGNvbWUgaXMKLSAgICAjIGNvcnJlY3Qgd2hlbiB0aGUgdHlwZSBvZiBvdGhlciBpc24ndCBzdWl0YWJsZS4gIEZvciBleGFtcGxlLCBpZgotICAgICMgd2UgZGlkICJ1bmlvbiA9IF9fb3JfXyIgaW5zdGVhZCwgdGhlbiBTZXQoKS51bmlvbigzKSB3b3VsZCByZXR1cm4KLSAgICAjIE5vdEltcGxlbWVudGVkIGluc3RlYWQgb2YgcmFpc2luZyBUeXBlRXJyb3IgKGFsYmVpdCB0aGF0ICp3aHkqIGl0Ci0gICAgIyByYWlzZXMgVHlwZUVycm9yIGFzLWlzIGlzIGFsc28gYSBiaXQgc3VidGxlKS4KLQotICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIHVuaW9uIG9mIHR3byBzZXRzIGFzIGEgbmV3IHNldC4KLQotICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pCi0gICAgICAgICIiIgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgICAgcmV0dXJuIHNlbGYudW5pb24ob3RoZXIpCi0KLSAgICBkZWYgdW5pb24oc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIHVuaW9uIG9mIHR3byBzZXRzIGFzIGEgbmV3IHNldC4KLQotICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZWl0aGVyIHNldC4pCi0gICAgICAgICIiIgotICAgICAgICByZXN1bHQgPSBzZWxmLl9fY2xhc3NfXyhzZWxmKQotICAgICAgICByZXN1bHQuX3VwZGF0ZShvdGhlcikKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuCi0KLSAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGJvdGggc2V0cy4pCi0gICAgICAgICIiIgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJzZWN0aW9uKG90aGVyKQotCi0gICAgZGVmIGludGVyc2VjdGlvbihzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIlJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBzZXRzIGFzIGEgbmV3IHNldC4KLQotICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gYm90aCBzZXRzLikKLSAgICAgICAgIiIiCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKLSAgICAgICAgICAgIG90aGVyID0gU2V0KG90aGVyKQotICAgICAgICBpZiBsZW4oc2VsZikgPD0gbGVuKG90aGVyKToKLSAgICAgICAgICAgIGxpdHRsZSwgYmlnID0gc2VsZiwgb3RoZXIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxpdHRsZSwgYmlnID0gb3RoZXIsIHNlbGYKLSAgICAgICAgY29tbW9uID0gaWZpbHRlcihiaWcuX2RhdGEuX19jb250YWluc19fLCBsaXR0bGUpCi0gICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhjb21tb24pCi0KLSAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LgotCi0gICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pCi0gICAgICAgICIiIgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgICAgcmV0dXJuIHNlbGYuc3ltbWV0cmljX2RpZmZlcmVuY2Uob3RoZXIpCi0KLSAgICBkZWYgc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBzZXRzIGFzIGEgbmV3IHNldC4KLQotICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZXhhY3RseSBvbmUgb2YgdGhlIHNldHMuKQotICAgICAgICAiIiIKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5fX2NsYXNzX18oKQotICAgICAgICBkYXRhID0gcmVzdWx0Ll9kYXRhCi0gICAgICAgIHZhbHVlID0gVHJ1ZQotICAgICAgICBzZWxmZGF0YSA9IHNlbGYuX2RhdGEKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3RoZXJkYXRhID0gb3RoZXIuX2RhdGEKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgb3RoZXJkYXRhID0gU2V0KG90aGVyKS5fZGF0YQotICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXJmYWxzZShvdGhlcmRhdGEuX19jb250YWluc19fLCBzZWxmZGF0YSk6Ci0gICAgICAgICAgICBkYXRhW2VsdF0gPSB2YWx1ZQotICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXJmYWxzZShzZWxmZGF0YS5fX2NvbnRhaW5zX18sIG90aGVyZGF0YSk6Ci0gICAgICAgICAgICBkYXRhW2VsdF0gPSB2YWx1ZQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICBkZWYgIF9fc3ViX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgU2V0LgotCi0gICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGlzIHNldCBhbmQgbm90IGluIHRoZSBvdGhlci4pCi0gICAgICAgICIiIgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgICAgcmV0dXJuIHNlbGYuZGlmZmVyZW5jZShvdGhlcikKLQotICAgIGRlZiBkaWZmZXJlbmNlKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzZXRzIGFzIGEgbmV3IFNldC4KLQotICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYW5kIG5vdCBpbiB0aGUgb3RoZXIuKQotICAgICAgICAiIiIKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5fX2NsYXNzX18oKQotICAgICAgICBkYXRhID0gcmVzdWx0Ll9kYXRhCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG90aGVyZGF0YSA9IG90aGVyLl9kYXRhCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIG90aGVyZGF0YSA9IFNldChvdGhlcikuX2RhdGEKLSAgICAgICAgdmFsdWUgPSBUcnVlCi0gICAgICAgIGZvciBlbHQgaW4gaWZpbHRlcmZhbHNlKG90aGVyZGF0YS5fX2NvbnRhaW5zX18sIHNlbGYpOgotICAgICAgICAgICAgZGF0YVtlbHRdID0gdmFsdWUKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgIyBNZW1iZXJzaGlwIHRlc3QKLQotICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgZWxlbWVudCk6Ci0gICAgICAgICIiIlJlcG9ydCB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgYSBtZW1iZXIgb2YgYSBzZXQuCi0KLSAgICAgICAgKENhbGxlZCBpbiByZXNwb25zZSB0byB0aGUgZXhwcmVzc2lvbiBgZWxlbWVudCBpbiBzZWxmJy4pCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudCBpbiBzZWxmLl9kYXRhCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICB0cmFuc2Zvcm0gPSBnZXRhdHRyKGVsZW1lbnQsICJfX2FzX3RlbXBvcmFyaWx5X2ltbXV0YWJsZV9fIiwgTm9uZSkKLSAgICAgICAgICAgIGlmIHRyYW5zZm9ybSBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlICMgcmUtcmFpc2UgdGhlIFR5cGVFcnJvciBleGNlcHRpb24gd2UgY2F1Z2h0Ci0gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtKCkgaW4gc2VsZi5fZGF0YQotCi0gICAgIyBTdWJzZXQgYW5kIHN1cGVyc2V0IHRlc3QKLQotICAgIGRlZiBpc3N1YnNldChzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIlJlcG9ydCB3aGV0aGVyIGFub3RoZXIgc2V0IGNvbnRhaW5zIHRoaXMgc2V0LiIiIgotICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQotICAgICAgICBpZiBsZW4oc2VsZikgPiBsZW4ob3RoZXIpOiAgIyBGYXN0IGNoZWNrIGZvciBvYnZpb3VzIGNhc2VzCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgZm9yIGVsdCBpbiBpZmlsdGVyZmFsc2Uob3RoZXIuX2RhdGEuX19jb250YWluc19fLCBzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgZGVmIGlzc3VwZXJzZXQoc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJSZXBvcnQgd2hldGhlciB0aGlzIHNldCBjb250YWlucyBhbm90aGVyIHNldC4iIiIKLSAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKLSAgICAgICAgaWYgbGVuKHNlbGYpIDwgbGVuKG90aGVyKTogICMgRmFzdCBjaGVjayBmb3Igb2J2aW91cyBjYXNlcwotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGZvciBlbHQgaW4gaWZpbHRlcmZhbHNlKHNlbGYuX2RhdGEuX19jb250YWluc19fLCBvdGhlcik6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICMgSW5lcXVhbGl0eSBjb21wYXJpc29ucyB1c2luZyB0aGUgaXMtc3Vic2V0IHJlbGF0aW9uLgotICAgIF9fbGVfXyA9IGlzc3Vic2V0Ci0gICAgX19nZV9fID0gaXNzdXBlcnNldAotCi0gICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCi0gICAgICAgIHJldHVybiBsZW4oc2VsZikgPCBsZW4ob3RoZXIpIGFuZCBzZWxmLmlzc3Vic2V0KG90aGVyKQotCi0gICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCi0gICAgICAgIHJldHVybiBsZW4oc2VsZikgPiBsZW4ob3RoZXIpIGFuZCBzZWxmLmlzc3VwZXJzZXQob3RoZXIpCi0KLSAgICAjIEFzc29ydGVkIGhlbHBlcnMKLQotICAgIGRlZiBfYmluYXJ5X3Nhbml0eV9jaGVjayhzZWxmLCBvdGhlcik6Ci0gICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgb3RoZXIgYXJndW1lbnQgdG8gYSBiaW5hcnkgb3BlcmF0aW9uIGlzIGFsc28KLSAgICAgICAgIyBhIHNldCwgcmFpc2luZyBhIFR5cGVFcnJvciBvdGhlcndpc2UuCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkJpbmFyeSBvcGVyYXRpb24gb25seSBwZXJtaXR0ZWQgYmV0d2VlbiBzZXRzIgotCi0gICAgZGVmIF9jb21wdXRlX2hhc2goc2VsZik6Ci0gICAgICAgICMgQ2FsY3VsYXRlIGhhc2ggY29kZSBmb3IgYSBzZXQgYnkgeG9yJ2luZyB0aGUgaGFzaCBjb2RlcyBvZgotICAgICAgICAjIHRoZSBlbGVtZW50cy4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBoYXNoIGNvZGUgZG9lcyBub3QgZGVwZW5kCi0gICAgICAgICMgb24gdGhlIG9yZGVyIGluIHdoaWNoIGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgc2V0LiAgVGhpcyBpcwotICAgICAgICAjIG5vdCBjYWxsZWQgX19oYXNoX18gYmVjYXVzZSBhIEJhc2VTZXQgc2hvdWxkIG5vdCBiZSBoYXNoYWJsZTsKLSAgICAgICAgIyBvbmx5IGFuIEltbXV0YWJsZVNldCBpcyBoYXNoYWJsZS4KLSAgICAgICAgcmVzdWx0ID0gMAotICAgICAgICBmb3IgZWx0IGluIHNlbGY6Ci0gICAgICAgICAgICByZXN1bHQgXj0gaGFzaChlbHQpCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotICAgIGRlZiBfdXBkYXRlKHNlbGYsIGl0ZXJhYmxlKToKLSAgICAgICAgIyBUaGUgbWFpbiBsb29wIGZvciB1cGRhdGUoKSBhbmQgdGhlIHN1YmNsYXNzIF9faW5pdF9fKCkgbWV0aG9kcy4KLSAgICAgICAgZGF0YSA9IHNlbGYuX2RhdGEKLQotICAgICAgICAjIFVzZSB0aGUgZmFzdCB1cGRhdGUoKSBtZXRob2Qgd2hlbiBhIGRpY3Rpb25hcnkgaXMgYXZhaWxhYmxlLgotICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZXJhYmxlLCBCYXNlU2V0KToKLSAgICAgICAgICAgIGRhdGEudXBkYXRlKGl0ZXJhYmxlLl9kYXRhKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgdmFsdWUgPSBUcnVlCi0KLSAgICAgICAgaWYgdHlwZShpdGVyYWJsZSkgaW4gKGxpc3QsIHR1cGxlLCB4cmFuZ2UpOgotICAgICAgICAgICAgIyBPcHRpbWl6ZWQ6IHdlIGtub3cgdGhhdCBfX2l0ZXJfXygpIGFuZCBuZXh0KCkgY2FuJ3QKLSAgICAgICAgICAgICMgcmFpc2UgVHlwZUVycm9yLCBzbyB3ZSBjYW4gbW92ZSAndHJ5Oicgb3V0IG9mIHRoZSBsb29wLgotICAgICAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0OgotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtlbGVtZW50XSA9IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGdldGF0dHIoZWxlbWVudCwgIl9fYXNfaW1tdXRhYmxlX18iLCBOb25lKQotICAgICAgICAgICAgICAgICAgICBpZiB0cmFuc2Zvcm0gaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlICMgcmUtcmFpc2UgdGhlIFR5cGVFcnJvciBleGNlcHRpb24gd2UgY2F1Z2h0Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFbdHJhbnNmb3JtKCldID0gdmFsdWUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgU2FmZTogb25seSBjYXRjaCBUeXBlRXJyb3Igd2hlcmUgaW50ZW5kZWQKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZXJhYmxlOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtlbGVtZW50XSA9IHZhbHVlCi0gICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZ2V0YXR0cihlbGVtZW50LCAiX19hc19pbW11dGFibGVfXyIsIE5vbmUpCi0gICAgICAgICAgICAgICAgICAgIGlmIHRyYW5zZm9ybSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgIyByZS1yYWlzZSB0aGUgVHlwZUVycm9yIGV4Y2VwdGlvbiB3ZSBjYXVnaHQKLSAgICAgICAgICAgICAgICAgICAgZGF0YVt0cmFuc2Zvcm0oKV0gPSB2YWx1ZQotCi0KLWNsYXNzIEltbXV0YWJsZVNldChCYXNlU2V0KToKLSAgICAiIiJJbW11dGFibGUgc2V0IGNsYXNzLiIiIgotCi0gICAgX19zbG90c19fID0gWydfaGFzaGNvZGUnXQotCi0gICAgIyBCYXNlU2V0ICsgaGFzaGluZwotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZXJhYmxlPU5vbmUpOgotICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gaW1tdXRhYmxlIHNldCBmcm9tIGFuIG9wdGlvbmFsIGl0ZXJhYmxlLiIiIgotICAgICAgICBzZWxmLl9oYXNoY29kZSA9IE5vbmUKLSAgICAgICAgc2VsZi5fZGF0YSA9IHt9Ci0gICAgICAgIGlmIGl0ZXJhYmxlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5fdXBkYXRlKGl0ZXJhYmxlKQotCi0gICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICBpZiBzZWxmLl9oYXNoY29kZSBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBzZWxmLl9jb21wdXRlX2hhc2goKQotICAgICAgICByZXR1cm4gc2VsZi5faGFzaGNvZGUKLQotICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9kYXRhLCBzZWxmLl9oYXNoY29kZQotCi0gICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6Ci0gICAgICAgIHNlbGYuX2RhdGEsIHNlbGYuX2hhc2hjb2RlID0gc3RhdGUKLQotY2xhc3MgU2V0KEJhc2VTZXQpOgotICAgICIiIiBNdXRhYmxlIHNldCBjbGFzcy4iIiIKLQotICAgIF9fc2xvdHNfXyA9IFtdCi0KLSAgICAjIEJhc2VTZXQgKyBvcGVyYXRpb25zIHJlcXVpcmluZyBtdXRhYmlsaXR5OyBubyBoYXNoaW5nCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlcmFibGU9Tm9uZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhIHNldCBmcm9tIGFuIG9wdGlvbmFsIGl0ZXJhYmxlLiIiIgotICAgICAgICBzZWxmLl9kYXRhID0ge30KLSAgICAgICAgaWYgaXRlcmFibGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLl91cGRhdGUoaXRlcmFibGUpCi0KLSAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgotICAgICAgICAjIGdldHN0YXRlJ3MgcmVzdWx0cyBhcmUgaWdub3JlZCBpZiBpdCBpcyBub3QKLSAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEsCi0KLSAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLl9kYXRhLCA9IGRhdGEKLQotICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICAgICAgIiIiQSBTZXQgY2Fubm90IGJlIGhhc2hlZC4iIiIKLSAgICAgICAgIyBXZSBpbmhlcml0IG9iamVjdC5fX2hhc2hfXywgc28gd2UgbXVzdCBkZW55IHRoaXMgZXhwbGljaXRseQotICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJDYW4ndCBoYXNoIGEgU2V0LCBvbmx5IGFuIEltbXV0YWJsZVNldC4iCi0KLSAgICAjIEluLXBsYWNlIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGRpZmZlcmVuY2VzLgotICAgICMgU3VidGxlOiAgVGhlIHh5el91cGRhdGUoKSBmdW5jdGlvbnMgZGVsaWJlcmF0ZWx5IHJldHVybiBOb25lLAotICAgICMgYXMgZG8gYWxsIG11dGF0aW5nIG9wZXJhdGlvbnMgb24gYnVpbHQtaW4gY29udGFpbmVyIHR5cGVzLgotICAgICMgVGhlIF9feHl6X18gc3BlbGxpbmdzIGhhdmUgdG8gcmV0dXJuIHNlbGYsIHRob3VnaC4KLQotICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgYW5vdGhlci4iIiIKLSAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKLSAgICAgICAgc2VsZi5fZGF0YS51cGRhdGUob3RoZXIuX2RhdGEpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgdW5pb25fdXBkYXRlKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgYW5vdGhlci4iIiIKLSAgICAgICAgc2VsZi5fdXBkYXRlKG90aGVyKQotCi0gICAgZGVmIF9faWFuZF9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCi0gICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCi0gICAgICAgIHNlbGYuX2RhdGEgPSAoc2VsZiAmIG90aGVyKS5fZGF0YQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIGludGVyc2VjdGlvbl91cGRhdGUoc2VsZiwgb3RoZXIpOgotICAgICAgICAiIiJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGl0c2VsZiBhbmQgYW5vdGhlci4iIiIKLSAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICBzZWxmICY9IG90aGVyCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl9kYXRhID0gKHNlbGYuaW50ZXJzZWN0aW9uKG90aGVyKSkuX2RhdGEKLQotICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCi0gICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCi0gICAgICAgIHNlbGYuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCBvdGhlcik6Ci0gICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCi0gICAgICAgIGRhdGEgPSBzZWxmLl9kYXRhCi0gICAgICAgIHZhbHVlID0gVHJ1ZQotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICBvdGhlciA9IFNldChvdGhlcikKLSAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKLSAgICAgICAgICAgIHNlbGYuY2xlYXIoKQotICAgICAgICBmb3IgZWx0IGluIG90aGVyOgotICAgICAgICAgICAgaWYgZWx0IGluIGRhdGE6Ci0gICAgICAgICAgICAgICAgZGVsIGRhdGFbZWx0XQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBkYXRhW2VsdF0gPSB2YWx1ZQotCi0gICAgZGVmIF9faXN1Yl9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiUmVtb3ZlIGFsbCBlbGVtZW50cyBvZiBhbm90aGVyIHNldCBmcm9tIHRoaXMgc2V0LiIiIgotICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQotICAgICAgICBzZWxmLmRpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIGRpZmZlcmVuY2VfdXBkYXRlKHNlbGYsIG90aGVyKToKLSAgICAgICAgIiIiUmVtb3ZlIGFsbCBlbGVtZW50cyBvZiBhbm90aGVyIHNldCBmcm9tIHRoaXMgc2V0LiIiIgotICAgICAgICBkYXRhID0gc2VsZi5fZGF0YQotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6Ci0gICAgICAgICAgICBvdGhlciA9IFNldChvdGhlcikKLSAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKLSAgICAgICAgICAgIHNlbGYuY2xlYXIoKQotICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXIoZGF0YS5fX2NvbnRhaW5zX18sIG90aGVyKToKLSAgICAgICAgICAgIGRlbCBkYXRhW2VsdF0KLQotICAgICMgUHl0aG9uIGRpY3QtbGlrZSBtYXNzIG11dGF0aW9uczogdXBkYXRlLCBjbGVhcgotCi0gICAgZGVmIHVwZGF0ZShzZWxmLCBpdGVyYWJsZSk6Ci0gICAgICAgICIiIkFkZCBhbGwgdmFsdWVzIGZyb20gYW4gaXRlcmFibGUgKHN1Y2ggYXMgYSBsaXN0IG9yIGZpbGUpLiIiIgotICAgICAgICBzZWxmLl91cGRhdGUoaXRlcmFibGUpCi0KLSAgICBkZWYgY2xlYXIoc2VsZik6Ci0gICAgICAgICIiIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4iIiIKLSAgICAgICAgc2VsZi5fZGF0YS5jbGVhcigpCi0KLSAgICAjIFNpbmdsZS1lbGVtZW50IG11dGF0aW9uczogYWRkLCByZW1vdmUsIGRpc2NhcmQKLQotICAgIGRlZiBhZGQoc2VsZiwgZWxlbWVudCk6Ci0gICAgICAgICIiIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LgotCi0gICAgICAgIFRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLl9kYXRhW2VsZW1lbnRdID0gVHJ1ZQotICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgdHJhbnNmb3JtID0gZ2V0YXR0cihlbGVtZW50LCAiX19hc19pbW11dGFibGVfXyIsIE5vbmUpCi0gICAgICAgICAgICBpZiB0cmFuc2Zvcm0gaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSAjIHJlLXJhaXNlIHRoZSBUeXBlRXJyb3IgZXhjZXB0aW9uIHdlIGNhdWdodAotICAgICAgICAgICAgc2VsZi5fZGF0YVt0cmFuc2Zvcm0oKV0gPSBUcnVlCi0KLSAgICBkZWYgcmVtb3ZlKHNlbGYsIGVsZW1lbnQpOgotICAgICAgICAiIiJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0OyBpdCBtdXN0IGJlIGEgbWVtYmVyLgotCi0gICAgICAgIElmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgcmFpc2UgYSBLZXlFcnJvci4KLSAgICAgICAgIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGRlbCBzZWxmLl9kYXRhW2VsZW1lbnRdCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICB0cmFuc2Zvcm0gPSBnZXRhdHRyKGVsZW1lbnQsICJfX2FzX3RlbXBvcmFyaWx5X2ltbXV0YWJsZV9fIiwgTm9uZSkKLSAgICAgICAgICAgIGlmIHRyYW5zZm9ybSBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlICMgcmUtcmFpc2UgdGhlIFR5cGVFcnJvciBleGNlcHRpb24gd2UgY2F1Z2h0Ci0gICAgICAgICAgICBkZWwgc2VsZi5fZGF0YVt0cmFuc2Zvcm0oKV0KLQotICAgIGRlZiBkaXNjYXJkKHNlbGYsIGVsZW1lbnQpOgotICAgICAgICAiIiJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLgotCi0gICAgICAgIElmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy4KLSAgICAgICAgIiIiCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYucmVtb3ZlKGVsZW1lbnQpCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgIGRlZiBwb3Aoc2VsZik6Ci0gICAgICAgICIiIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEucG9waXRlbSgpWzBdCi0KLSAgICBkZWYgX19hc19pbW11dGFibGVfXyhzZWxmKToKLSAgICAgICAgIyBSZXR1cm4gYSBjb3B5IG9mIHNlbGYgYXMgYW4gaW1tdXRhYmxlIHNldAotICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KHNlbGYpCi0KLSAgICBkZWYgX19hc190ZW1wb3JhcmlseV9pbW11dGFibGVfXyhzZWxmKToKLSAgICAgICAgIyBSZXR1cm4gc2VsZiB3cmFwcGVkIGluIGEgdGVtcG9yYXJpbHkgaW1tdXRhYmxlIHNldAotICAgICAgICByZXR1cm4gX1RlbXBvcmFyaWx5SW1tdXRhYmxlU2V0KHNlbGYpCi0KLQotY2xhc3MgX1RlbXBvcmFyaWx5SW1tdXRhYmxlU2V0KEJhc2VTZXQpOgotICAgICMgV3JhcCBhIG11dGFibGUgc2V0IGFzIGlmIGl0IHdhcyB0ZW1wb3JhcmlseSBpbW11dGFibGUuCi0gICAgIyBUaGlzIG9ubHkgc3VwcGxpZXMgaGFzaGluZyBhbmQgZXF1YWxpdHkgY29tcGFyaXNvbnMuCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2V0KToKLSAgICAgICAgc2VsZi5fc2V0ID0gc2V0Ci0gICAgICAgIHNlbGYuX2RhdGEgPSBzZXQuX2RhdGEgICMgTmVlZGVkIGJ5IEltbXV0YWJsZVNldC5fX2VxX18oKQotCi0gICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fc2V0Ll9jb21wdXRlX2hhc2goKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQppbmRleCA5OTE1MDZjLi41NDRmMjlmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQpAQCAtMTcyMyw3ICsxNzIzLDYgQEAKIAogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6Ci0gICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3NldHMKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAogICAgICAgICBEYXRlVGltZVRlc3RzLAogICAgICAgICBIZWFkZXJUZXN0cywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKaW5kZXggNjY0MWZmOC4uOWJkMGQ0MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKQEAgLTE0NTEsNyArMTQ1MSw2IEBACiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKLSAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc2V0cwogICAgIHRlc3RfY2xhc3NlcyA9ICgKICAgICAgICAgVGVzdFNldCwKICAgICAgICAgVGVzdFNldFN1YmNsYXNzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXRzLnB5IGIvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGNmY2FjLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQotaW1wb3J0IHVuaXR0ZXN0LCBvcGVyYXRvciwgY29weSwgcGlja2xlLCByYW5kb20KLWZyb20gc2V0cyBpbXBvcnQgU2V0LCBJbW11dGFibGVTZXQKLWZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci0KLWVtcHR5X3NldCA9IFNldCgpCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgVGVzdEJhc2ljT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYucmVwciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzZWxmLnNldCksIHNlbGYucmVwcikKLQotICAgIGRlZiB0ZXN0X2xlbmd0aChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zZXQpLCBzZWxmLmxlbmd0aCkKLQotICAgIGRlZiB0ZXN0X3NlbGZfZXF1YWxpdHkoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNlbGYuc2V0KQotCi0gICAgZGVmIHRlc3RfZXF1aXZhbGVudF9lcXVhbGl0eShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2VsZi5kdXApCi0KLSAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LmNvcHkoKSwgc2VsZi5kdXApCi0KLSAgICBkZWYgdGVzdF9zZWxmX3VuaW9uKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IHNlbGYuc2V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKLQotICAgIGRlZiB0ZXN0X2VtcHR5X3VuaW9uKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IGVtcHR5X3NldAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCi0KLSAgICBkZWYgdGVzdF91bmlvbl9lbXB0eShzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gZW1wdHlfc2V0IHwgc2VsZi5zZXQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQotCi0gICAgZGVmIHRlc3Rfc2VsZl9pbnRlcnNlY3Rpb24oc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgc2VsZi5zZXQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQotCi0gICAgZGVmIHRlc3RfZW1wdHlfaW50ZXJzZWN0aW9uKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIGVtcHR5X3NldAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQotCi0gICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX2VtcHR5KHNlbGYpOgotICAgICAgICByZXN1bHQgPSBlbXB0eV9zZXQgJiBzZWxmLnNldAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQotCi0gICAgZGVmIHRlc3Rfc2VsZl9zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBzZWxmLnNldAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQotCi0gICAgZGVmIGNoZWNrZW1wdHlfc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gZW1wdHlfc2V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLnNldCkKLQotICAgIGRlZiB0ZXN0X3NlbGZfZGlmZmVyZW5jZShzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgLSBzZWxmLnNldAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQotCi0gICAgZGVmIHRlc3RfZW1wdHlfZGlmZmVyZW5jZShzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgLSBlbXB0eV9zZXQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQotCi0gICAgZGVmIHRlc3RfZW1wdHlfZGlmZmVyZW5jZV9yZXYoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IGVtcHR5X3NldCAtIHNlbGYuc2V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCi0KLSAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6Ci0gICAgICAgIGZvciB2IGluIHNlbGYuc2V0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gc2VsZi52YWx1ZXMpCi0KLSAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKLSAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhzZWxmLnNldCkKLSAgICAgICAgY29weSA9IHBpY2tsZS5sb2FkcyhwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBjb3B5LAotICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAhPSAlcyIgJSAoc2VsZi5zZXQsIGNvcHkpKQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRlc3RCYXNpY09wc0VtcHR5KFRlc3RCYXNpY09wcyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLmNhc2UgICA9ICJlbXB0eSBzZXQiCi0gICAgICAgIHNlbGYudmFsdWVzID0gW10KLSAgICAgICAgc2VsZi5zZXQgICAgPSBTZXQoc2VsZi52YWx1ZXMpCi0gICAgICAgIHNlbGYuZHVwICAgID0gU2V0KHNlbGYudmFsdWVzKQotICAgICAgICBzZWxmLmxlbmd0aCA9IDAKLSAgICAgICAgc2VsZi5yZXByICAgPSAiU2V0KFtdKSIKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0QmFzaWNPcHNTaW5nbGV0b24oVGVzdEJhc2ljT3BzKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuY2FzZSAgID0gInVuaXQgc2V0IChudW1iZXIpIgotICAgICAgICBzZWxmLnZhbHVlcyA9IFszXQotICAgICAgICBzZWxmLnNldCAgICA9IFNldChzZWxmLnZhbHVlcykKLSAgICAgICAgc2VsZi5kdXAgICAgPSBTZXQoc2VsZi52YWx1ZXMpCi0gICAgICAgIHNlbGYubGVuZ3RoID0gMQotICAgICAgICBzZWxmLnJlcHIgICA9ICJTZXQoWzNdKSIKLQotICAgIGRlZiB0ZXN0X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMyBpbiBzZWxmLnNldCkKLQotICAgIGRlZiB0ZXN0X25vdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDIgbm90IGluIHNlbGYuc2V0KQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRlc3RCYXNpY09wc1R1cGxlKFRlc3RCYXNpY09wcyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLmNhc2UgICA9ICJ1bml0IHNldCAodHVwbGUpIgotICAgICAgICBzZWxmLnZhbHVlcyA9IFsoMCwgInplcm8iKV0KLSAgICAgICAgc2VsZi5zZXQgICAgPSBTZXQoc2VsZi52YWx1ZXMpCi0gICAgICAgIHNlbGYuZHVwICAgID0gU2V0KHNlbGYudmFsdWVzKQotICAgICAgICBzZWxmLmxlbmd0aCA9IDEKLSAgICAgICAgc2VsZi5yZXByICAgPSAiU2V0KFsoMCwgJ3plcm8nKV0pIgotCi0gICAgZGVmIHRlc3RfaW4oc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcygoMCwgInplcm8iKSBpbiBzZWxmLnNldCkKLQotICAgIGRlZiB0ZXN0X25vdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDkgbm90IGluIHNlbGYuc2V0KQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRlc3RCYXNpY09wc1RyaXBsZShUZXN0QmFzaWNPcHMpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5jYXNlICAgPSAidHJpcGxlIHNldCIKLSAgICAgICAgc2VsZi52YWx1ZXMgPSBbMCwgInplcm8iLCBvcGVyYXRvci5hZGRdCi0gICAgICAgIHNlbGYuc2V0ICAgID0gU2V0KHNlbGYudmFsdWVzKQotICAgICAgICBzZWxmLmR1cCAgICA9IFNldChzZWxmLnZhbHVlcykKLSAgICAgICAgc2VsZi5sZW5ndGggPSAzCi0gICAgICAgIHNlbGYucmVwciAgID0gTm9uZQotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWRlZiBiYWRpdGVyKCk6Ci0gICAgcmFpc2UgVHlwZUVycm9yCi0gICAgeWllbGQgVHJ1ZQotCi1kZWYgZ29vZGl0ZXIoKToKLSAgICB5aWVsZCBUcnVlCi0KLWNsYXNzIFRlc3RFeGNlcHRpb25Qcm9wYWdhdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIiIiU0YgNjI4MjQ2OiAgU2V0IGNvbnN0cnVjdG9yIHNob3VsZCBub3QgdHJhcCBpdGVyYXRvciBUeXBlRXJyb3JzIiIiCi0KLSAgICBkZWYgdGVzdF9pbnN0YW5jZVdpdGhFeGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgU2V0LCBiYWRpdGVyKCkpCi0KLSAgICBkZWYgdGVzdF9pbnN0YW5jZXNXaXRob3V0RXhjZXB0aW9uKHNlbGYpOgotICAgICAgICAjIEFsbCBvZiB0aGVzZSBpdGVyYWJsZXMgc2hvdWxkIGxvYWQgd2l0aG91dCBleGNlcHRpb24uCi0gICAgICAgIFNldChbMSwyLDNdKQotICAgICAgICBTZXQoKDEsMiwzKSkKLSAgICAgICAgU2V0KHsnb25lJzoxLCAndHdvJzoyLCAndGhyZWUnOjN9KQotICAgICAgICBTZXQoeHJhbmdlKDMpKQotICAgICAgICBTZXQoJ2FiYycpCi0gICAgICAgIFNldChnb29kaXRlcigpKQotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNsYXNzIFRlc3RTZXRPZlNldHModW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgotICAgICAgICBpbm5lciA9IFNldChbMV0pCi0gICAgICAgIG91dGVyID0gU2V0KFtpbm5lcl0pCi0gICAgICAgIGVsZW1lbnQgPSBvdXRlci5wb3AoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZWxlbWVudCksIEltbXV0YWJsZVNldCkKLSAgICAgICAgb3V0ZXIuYWRkKGlubmVyKSAgICAgICAgIyBSZWJ1aWxkIHNldCBvZiBzZXRzIHdpdGggLmFkZCBtZXRob2QKLSAgICAgICAgb3V0ZXIucmVtb3ZlKGlubmVyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyLCBTZXQoKSkgICAjIFZlcmlmeSB0aGF0IHJlbW92ZSB3b3JrZWQKLSAgICAgICAgb3V0ZXIuZGlzY2FyZChpbm5lcikgICAgIyBBYnNlbmNlIG9mIEtleUVycm9yIGluZGljYXRlcyB3b3JraW5nIGZpbmUKLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBUZXN0QmluYXJ5T3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0ID0gU2V0KCgyLCA0LCA2KSkKLQotICAgIGRlZiB0ZXN0X2VxKHNlbGYpOiAgICAgICAgICAgICAgIyBTRiBidWcgNjQzMTE1Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCh7MjoxLDQ6Myw2OjV9KSkKLQotICAgIGRlZiB0ZXN0X3VuaW9uX3N1YnNldChzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBTZXQoWzJdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KCgyLCA0LCA2KSkpCi0KLSAgICBkZWYgdGVzdF91bmlvbl9zdXBlcnNldChzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBTZXQoWzIsIDQsIDYsIDhdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFsyLCA0LCA2LCA4XSkpCi0KLSAgICBkZWYgdGVzdF91bmlvbl9vdmVybGFwKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IFNldChbMywgNCwgNV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDMsIDQsIDUsIDZdKSkKLQotICAgIGRlZiB0ZXN0X3VuaW9uX25vbl9vdmVybGFwKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IFNldChbOF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDQsIDYsIDhdKSkKLQotICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdWJzZXQoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgU2V0KCgyLCA0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldCgoMiwgNCkpKQotCi0gICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1cGVyc2V0KHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIFNldChbMiwgNCwgNiwgOF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDQsIDZdKSkKLQotICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9vdmVybGFwKHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIFNldChbMywgNCwgNV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzRdKSkKLQotICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9ub25fb3ZlcmxhcChzZWxmKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBTZXQoWzhdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQotCi0gICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3Vic2V0KHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIFNldCgoMiwgNCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzZdKSkKLQotICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgotICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIFNldCgoMiwgNCwgNiwgOCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzhdKSkKLQotICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX292ZXJsYXAoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gU2V0KCgzLCA0LCA1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldChbMiwgMywgNSwgNl0pKQotCi0gICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gU2V0KFs4XSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldChbMiwgNCwgNiwgOF0pKQotCi0gICAgZGVmIHRlc3RfY21wKHNlbGYpOgotICAgICAgICBhLCBiID0gU2V0KCdhJyksIFNldCgnYicpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBhLCBiKQotCi0gICAgICAgICMgSW4gcHkzaywgdGhpcyB3b3JrcyEKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGEsIGEpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGEsIDEyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgImFiYyIsIGEpCi0KLSAgICBkZWYgdGVzdF9pbnBsYWNlX29uX3NlbGYoc2VsZik6Ci0gICAgICAgIHQgPSBzZWxmLnNldC5jb3B5KCkKLSAgICAgICAgdCB8PSB0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zZXQpCi0gICAgICAgIHQgJj0gdAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNlbGYuc2V0KQotICAgICAgICB0IC09IHQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIDApCi0gICAgICAgIHQgPSBzZWxmLnNldC5jb3B5KCkKLSAgICAgICAgdCBePSB0Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCAwKQotCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgVGVzdFVwZGF0ZU9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCA9IFNldCgoMiwgNCwgNikpCi0KLSAgICBkZWYgdGVzdF91bmlvbl9zdWJzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0IHw9IFNldChbMl0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgoMiwgNCwgNikpKQotCi0gICAgZGVmIHRlc3RfdW5pb25fc3VwZXJzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0IHw9IFNldChbMiwgNCwgNiwgOF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgNCwgNiwgOF0pKQotCi0gICAgZGVmIHRlc3RfdW5pb25fb3ZlcmxhcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgfD0gU2V0KFszLCA0LCA1XSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCAzLCA0LCA1LCA2XSkpCi0KLSAgICBkZWYgdGVzdF91bmlvbl9ub25fb3ZlcmxhcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgfD0gU2V0KFs4XSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCA0LCA2LCA4XSkpCi0KLSAgICBkZWYgdGVzdF91bmlvbl9tZXRob2RfY2FsbChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKFNldChbMywgNCwgNV0pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDMsIDQsIDUsIDZdKSkKLQotICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdWJzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0ICY9IFNldCgoMiwgNCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgoMiwgNCkpKQotCi0gICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1cGVyc2V0KHNlbGYpOgotICAgICAgICBzZWxmLnNldCAmPSBTZXQoWzIsIDQsIDYsIDhdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDZdKSkKLQotICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9vdmVybGFwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCAmPSBTZXQoWzMsIDQsIDVdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzRdKSkKLQotICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9ub25fb3ZlcmxhcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgJj0gU2V0KFs4XSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgZW1wdHlfc2V0KQotCi0gICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX21ldGhvZF9jYWxsKHNlbGYpOgotICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb25fdXBkYXRlKFNldChbMywgNCwgNV0pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzRdKSkKLQotICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1YnNldChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgXj0gU2V0KCgyLCA0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFs2XSkpCi0KLSAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9zdXBlcnNldChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgXj0gU2V0KCgyLCA0LCA2LCA4KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFs4XSkpCi0KLSAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9vdmVybGFwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCBePSBTZXQoKDMsIDQsIDUpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDMsIDUsIDZdKSkKLQotICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX25vbl9vdmVybGFwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCBePSBTZXQoWzhdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDYsIDhdKSkKLQotICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX21ldGhvZF9jYWxsKHNlbGYpOgotICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoU2V0KFszLCA0LCA1XSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgMywgNSwgNl0pKQotCi0gICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9zdWJzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0IC09IFNldCgoMiwgNCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbNl0pKQotCi0gICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9zdXBlcnNldChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgLT0gU2V0KCgyLCA0LCA2LCA4KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFtdKSkKLQotICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Vfb3ZlcmxhcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgLT0gU2V0KCgzLCA0LCA1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCA2XSkpCi0KLSAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX25vbl9vdmVybGFwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCAtPSBTZXQoWzhdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDZdKSkKLQotICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2VfbWV0aG9kX2NhbGwoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0LmRpZmZlcmVuY2VfdXBkYXRlKFNldChbMywgNCwgNV0pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDZdKSkKLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBUZXN0TXV0YXRlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudmFsdWVzID0gWyJhIiwgImIiLCAiYyJdCi0gICAgICAgIHNlbGYuc2V0ID0gU2V0KHNlbGYudmFsdWVzKQotCi0gICAgZGVmIHRlc3RfYWRkX3ByZXNlbnQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0LmFkZCgiYyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWJjIikpCi0KLSAgICBkZWYgdGVzdF9hZGRfYWJzZW50KHNlbGYpOgotICAgICAgICBzZWxmLnNldC5hZGQoImQiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoImFiY2QiKSkKLQotICAgIGRlZiB0ZXN0X2FkZF91bnRpbF9mdWxsKHNlbGYpOgotICAgICAgICB0bXAgPSBTZXQoKQotICAgICAgICBleHBlY3RlZF9sZW4gPSAwCi0gICAgICAgIGZvciB2IGluIHNlbGYudmFsdWVzOgotICAgICAgICAgICAgdG1wLmFkZCh2KQotICAgICAgICAgICAgZXhwZWN0ZWRfbGVuICs9IDEKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRtcCksIGV4cGVjdGVkX2xlbikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0bXAsIHNlbGYuc2V0KQotCi0gICAgZGVmIHRlc3RfcmVtb3ZlX3ByZXNlbnQoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0LnJlbW92ZSgiYiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWMiKSkKLQotICAgIGRlZiB0ZXN0X3JlbW92ZV9hYnNlbnQoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuc2V0LnJlbW92ZSgiZCIpCi0gICAgICAgICAgICBzZWxmLmZhaWwoIlJlbW92aW5nIG1pc3NpbmcgZWxlbWVudCBzaG91bGQgaGF2ZSByYWlzZWQgTG9va3VwRXJyb3IiKQotICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICBkZWYgdGVzdF9yZW1vdmVfdW50aWxfZW1wdHkoc2VsZik6Ci0gICAgICAgIGV4cGVjdGVkX2xlbiA9IGxlbihzZWxmLnNldCkKLSAgICAgICAgZm9yIHYgaW4gc2VsZi52YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLnNldC5yZW1vdmUodikKLSAgICAgICAgICAgIGV4cGVjdGVkX2xlbiAtPSAxCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNldCksIGV4cGVjdGVkX2xlbikKLQotICAgIGRlZiB0ZXN0X2Rpc2NhcmRfcHJlc2VudChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQuZGlzY2FyZCgiYyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWIiKSkKLQotICAgIGRlZiB0ZXN0X2Rpc2NhcmRfYWJzZW50KHNlbGYpOgotICAgICAgICBzZWxmLnNldC5kaXNjYXJkKCJkIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCJhYmMiKSkKLQotICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgotICAgICAgICBzZWxmLnNldC5jbGVhcigpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc2V0KSwgMCkKLQotICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKLSAgICAgICAgcG9wcGVkID0ge30KLSAgICAgICAgd2hpbGUgc2VsZi5zZXQ6Ci0gICAgICAgICAgICBwb3BwZWRbc2VsZi5zZXQucG9wKCldID0gTm9uZQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3BwZWQpLCBsZW4oc2VsZi52YWx1ZXMpKQotICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IGluIHBvcHBlZCkKLQotICAgIGRlZiB0ZXN0X3VwZGF0ZV9lbXB0eV90dXBsZShzZWxmKToKLSAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKCgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoc2VsZi52YWx1ZXMpKQotCi0gICAgZGVmIHRlc3RfdXBkYXRlX3VuaXRfdHVwbGVfb3ZlcmxhcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKCgiYSIsKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KHNlbGYudmFsdWVzKSkKLQotICAgIGRlZiB0ZXN0X3VwZGF0ZV91bml0X3R1cGxlX25vbl9vdmVybGFwKHNlbGYpOgotICAgICAgICBzZWxmLnNldC51bmlvbl91cGRhdGUoKCJhIiwgInoiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KHNlbGYudmFsdWVzICsgWyJ6Il0pKQotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNsYXNzIFRlc3RTdWJzZXRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgIGNhc2UybWV0aG9kID0geyI8PSI6ICJpc3N1YnNldCIsCi0gICAgICAgICAgICAgICAgICAgIj49IjogImlzc3VwZXJzZXQiLAotICAgICAgICAgICAgICAgICAgfQotCi0gICAgcmV2ZXJzZSA9IHsiPT0iOiAiPT0iLAotICAgICAgICAgICAgICAgIiE9IjogIiE9IiwKLSAgICAgICAgICAgICAgICI8IjogICI+IiwKLSAgICAgICAgICAgICAgICI+IjogICI8IiwKLSAgICAgICAgICAgICAgICI8PSI6ICI+PSIsCi0gICAgICAgICAgICAgICAiPj0iOiAiPD0iLAotICAgICAgICAgICAgICB9Ci0KLSAgICBkZWYgdGVzdF9pc3N1YnNldChzZWxmKToKLSAgICAgICAgeCA9IHNlbGYubGVmdAotICAgICAgICB5ID0gc2VsZi5yaWdodAotICAgICAgICBmb3IgY2FzZSBpbiAiIT0iLCAiPT0iLCAiPCIsICI8PSIsICI+IiwgIj49IjoKLSAgICAgICAgICAgIGV4cGVjdGVkID0gY2FzZSBpbiBzZWxmLmNhc2VzCi0gICAgICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBpbmZpeCBzcGVsbGluZy4KLSAgICAgICAgICAgIHJlc3VsdCA9IGV2YWwoIngiICsgY2FzZSArICJ5IiwgbG9jYWxzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCi0gICAgICAgICAgICAjIFRlc3QgdGhlICJmcmllbmRseSIgbWV0aG9kLW5hbWUgc3BlbGxpbmcsIGlmIG9uZSBleGlzdHMuCi0gICAgICAgICAgICBpZiBjYXNlIGluIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kOgotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoeCwgVGVzdFN1YnNldHMuY2FzZTJtZXRob2RbY2FzZV0pCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kKHkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQotCi0gICAgICAgICAgICAjIE5vdyBkbyB0aGUgc2FtZSBmb3IgdGhlIG9wZXJhbmRzIHJldmVyc2VkLgotICAgICAgICAgICAgcmNhc2UgPSBUZXN0U3Vic2V0cy5yZXZlcnNlW2Nhc2VdCi0gICAgICAgICAgICByZXN1bHQgPSBldmFsKCJ5IiArIHJjYXNlICsgIngiLCBsb2NhbHMoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKLSAgICAgICAgICAgIGlmIHJjYXNlIGluIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kOgotICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoeSwgVGVzdFN1YnNldHMuY2FzZTJtZXRob2RbcmNhc2VdKQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZCh4KQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdFN1YnNldEVxdWFsRW1wdHkoVGVzdFN1YnNldHMpOgotICAgIGxlZnQgID0gU2V0KCkKLSAgICByaWdodCA9IFNldCgpCi0gICAgbmFtZSAgPSAiYm90aCBlbXB0eSIKLSAgICBjYXNlcyA9ICI9PSIsICI8PSIsICI+PSIKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0U3Vic2V0RXF1YWxOb25FbXB0eShUZXN0U3Vic2V0cyk6Ci0gICAgbGVmdCAgPSBTZXQoWzEsIDJdKQotICAgIHJpZ2h0ID0gU2V0KFsxLCAyXSkKLSAgICBuYW1lICA9ICJlcXVhbCBwYWlyIgotICAgIGNhc2VzID0gIj09IiwgIjw9IiwgIj49IgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRlc3RTdWJzZXRFbXB0eU5vbkVtcHR5KFRlc3RTdWJzZXRzKToKLSAgICBsZWZ0ICA9IFNldCgpCi0gICAgcmlnaHQgPSBTZXQoWzEsIDJdKQotICAgIG5hbWUgID0gIm9uZSBlbXB0eSwgb25lIG5vbi1lbXB0eSIKLSAgICBjYXNlcyA9ICIhPSIsICI8IiwgIjw9IgotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRlc3RTdWJzZXRQYXJ0aWFsKFRlc3RTdWJzZXRzKToKLSAgICBsZWZ0ICA9IFNldChbMV0pCi0gICAgcmlnaHQgPSBTZXQoWzEsIDJdKQotICAgIG5hbWUgID0gIm9uZSBhIG5vbi1lbXB0eSBwcm9wZXIgc3Vic2V0IG9mIG90aGVyIgotICAgIGNhc2VzID0gIiE9IiwgIjwiLCAiPD0iCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdFN1YnNldE5vbk92ZXJsYXAoVGVzdFN1YnNldHMpOgotICAgIGxlZnQgID0gU2V0KFsxXSkKLSAgICByaWdodCA9IFNldChbMl0pCi0gICAgbmFtZSAgPSAibmVpdGhlciBlbXB0eSwgbmVpdGhlciBjb250YWlucyIKLSAgICBjYXNlcyA9ICIhPSIKLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBUZXN0T25seVNldHNJbkJpbmFyeU9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgICBkZWYgdGVzdF9lcV9uZShzZWxmKToKLSAgICAgICAgIyBVbmxpa2UgdGhlIG90aGVycywgdGhpcyBpcyB0ZXN0aW5nIHRoYXQgPT0gYW5kICE9ICphcmUqIGFsbG93ZWQuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vdGhlciA9PSBzZWxmLnNldCwgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQgPT0gc2VsZi5vdGhlciwgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vdGhlciAhPSBzZWxmLnNldCwgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCAhPSBzZWxmLm90aGVyLCBUcnVlKQotCi0gICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA8IHNlbGYub3RoZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA8PSBzZWxmLm90aGVyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPiBzZWxmLm90aGVyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPj0gc2VsZi5vdGhlcikKLQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA8IHNlbGYuc2V0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA8PSBzZWxmLnNldCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPiBzZWxmLnNldCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPj0gc2VsZi5zZXQpCi0KLSAgICBkZWYgdGVzdF91bmlvbl91cGRhdGVfb3BlcmF0b3Ioc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuc2V0IHw9IHNlbGYub3RoZXIKLSAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIikKLQotICAgIGRlZiB0ZXN0X3VuaW9uX3VwZGF0ZShzZWxmKToKLSAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6Ci0gICAgICAgICAgICBzZWxmLnNldC51bmlvbl91cGRhdGUoc2VsZi5vdGhlcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQudW5pb25fdXBkYXRlLCBzZWxmLm90aGVyKQotCi0gICAgZGVmIHRlc3RfdW5pb24oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCB8IHNlbGYub3RoZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIHwgc2VsZi5zZXQpCi0gICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgotICAgICAgICAgICAgc2VsZi5zZXQudW5pb24oc2VsZi5vdGhlcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQudW5pb24sIHNlbGYub3RoZXIpCi0KLSAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fdXBkYXRlX29wZXJhdG9yKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLnNldCAmPSBzZWxmLm90aGVyCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCi0KLSAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYpOgotICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKLSAgICAgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbl91cGRhdGUoc2VsZi5vdGhlcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbl91cGRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm90aGVyKQotCi0gICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgJiBzZWxmLm90aGVyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciAmIHNlbGYuc2V0KQotICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKLSAgICAgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbihzZWxmLm90aGVyKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC5pbnRlcnNlY3Rpb24sIHNlbGYub3RoZXIpCi0KLSAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV91cGRhdGVfb3BlcmF0b3Ioc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuc2V0IF49IHNlbGYub3RoZXIKLSAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIikKLQotICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKLSAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6Ci0gICAgICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5vdGhlcikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3RoZXIpCi0KLSAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IF4gc2VsZi5vdGhlcikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgXiBzZWxmLnNldCkKLSAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6Ci0gICAgICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLm90aGVyKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZSwgc2VsZi5vdGhlcikKLQotICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2VfdXBkYXRlX29wZXJhdG9yKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLnNldCAtPSBzZWxmLm90aGVyCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCi0KLSAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKLSAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6Ci0gICAgICAgICAgICBzZWxmLnNldC5kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLm90aGVyKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZV91cGRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm90aGVyKQotCi0gICAgZGVmIHRlc3RfZGlmZmVyZW5jZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IC0gc2VsZi5vdGhlcikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgLSBzZWxmLnNldCkKLSAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6Ci0gICAgICAgICAgICBzZWxmLnNldC5kaWZmZXJlbmNlKHNlbGYub3RoZXIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LmRpZmZlcmVuY2UsIHNlbGYub3RoZXIpCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdE9ubHlTZXRzTnVtZXJpYyhUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKLSAgICAgICAgc2VsZi5vdGhlciA9IDE5Ci0gICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gRmFsc2UKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0T25seVNldHNEaWN0KFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQotICAgICAgICBzZWxmLm90aGVyID0gezE6MiwgMzo0fQotICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0T25seVNldHNPcGVyYXRvcihUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKLSAgICAgICAgc2VsZi5vdGhlciA9IG9wZXJhdG9yLmFkZAotICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IEZhbHNlCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdE9ubHlTZXRzVHVwbGUoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgICA9IFNldCgoMSwgMiwgMykpCi0gICAgICAgIHNlbGYub3RoZXIgPSAoMiwgNCwgNikKLSAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdE9ubHlTZXRzU3RyaW5nKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQotICAgICAgICBzZWxmLm90aGVyID0gJ2FiYycKLSAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdE9ubHlTZXRzR2VuZXJhdG9yKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIGRlZiBnZW4oKToKLSAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgwLCAxMCwgMik6Ci0gICAgICAgICAgICAgICAgeWllbGQgaQotICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKLSAgICAgICAgc2VsZi5vdGhlciA9IGdlbigpCi0gICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gVHJ1ZQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFRlc3RPbmx5U2V0c29mU2V0cyhUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKLSAgICAgICAgc2VsZi5vdGhlciA9IFtTZXQoJ2FiJyksIEltbXV0YWJsZVNldCgnY2QnKV0KLSAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgVGVzdENvcHlpbmcodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICAgZGVmIHRlc3RfY29weShzZWxmKToKLSAgICAgICAgZHVwID0gc2VsZi5zZXQuY29weSgpCi0gICAgICAgIGR1cF9saXN0ID0gc29ydGVkKGR1cCwga2V5PXJlcHIpCi0gICAgICAgIHNldF9saXN0ID0gc29ydGVkKHNlbGYuc2V0LCBrZXk9cmVwcikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZHVwX2xpc3QpKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkdXBfbGlzdFtpXSBpcyBzZXRfbGlzdFtpXSkKLQotICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKLSAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKLSAgICAgICAgIyNwcmludCB0eXBlKGR1cCksIHJlcHIoZHVwKQotICAgICAgICBkdXBfbGlzdCA9IHNvcnRlZChkdXAsIGtleT1yZXByKQotICAgICAgICBzZXRfbGlzdCA9IHNvcnRlZChzZWxmLnNldCwga2V5PXJlcHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cF9saXN0KSwgbGVuKHNldF9saXN0KSkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGR1cF9saXN0KSk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR1cF9saXN0W2ldLCBzZXRfbGlzdFtpXSkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0Q29weWluZ0VtcHR5KFRlc3RDb3B5aW5nKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuc2V0ID0gU2V0KCkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0Q29weWluZ1NpbmdsZXRvbihUZXN0Q29weWluZyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCA9IFNldChbImhlbGxvIl0pCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdENvcHlpbmdUcmlwbGUoVGVzdENvcHlpbmcpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5zZXQgPSBTZXQoWyJ6ZXJvIiwgMCwgTm9uZV0pCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVGVzdENvcHlpbmdUdXBsZShUZXN0Q29weWluZyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCA9IFNldChbKDEsIDIpXSkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUZXN0Q29weWluZ05lc3RlZChUZXN0Q29weWluZyk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnNldCA9IFNldChbKCgxLCAyKSwgKDMsIDQpKV0pCi0KLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgVGVzdElkZW50aXRpZXModW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5hID0gU2V0KFtyYW5kb20ucmFuZHJhbmdlKDEwMCkgZm9yIGkgaW4geHJhbmdlKDUwKV0pCi0gICAgICAgIHNlbGYuYiA9IFNldChbcmFuZG9tLnJhbmRyYW5nZSgxMDApIGZvciBpIGluIHhyYW5nZSg1MCldKQotCi0gICAgZGVmIHRlc3RfYmlub3BzVnNTdWJzZXRzKHNlbGYpOgotICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgLSBiIDw9IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIC0gYSA8PSBiKQotICAgICAgICBzZWxmLmFzc2VydF8oYSAmIGIgPD0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgJiBiIDw9IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIHwgYiA+PSBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYSB8IGIgPj0gYikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgXiBiIDw9IGEgfCBiKQotCi0gICAgZGVmIHRlc3RfY29tbXV0YXRpdml0eShzZWxmKToKLSAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSZiLCBiJmEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXxiLCBifGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYV5iLCBiXmEpCi0gICAgICAgIGlmIGEgIT0gYjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYS1iLCBiLWEpCi0KLSAgICBkZWYgdGVzdF9yZWZsZXhzaXZlX3JlbGF0aW9ucyhzZWxmKToKLSAgICAgICAgYSwgemVybyA9IHNlbGYuYSwgU2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIF4gYSwgemVybykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gYSwgemVybykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIHwgYSwgYSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICYgYSwgYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPD0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPj0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPT0gYSkKLQotICAgIGRlZiB0ZXN0X3N1bW1hdGlvbnMoc2VsZik6Ci0gICAgICAgICMgY2hlY2sgdGhhdCBzdW1zIG9mIHBhcnRzIGVxdWFsIHRoZSB3aG9sZQotICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYSZiKXwoYi1hKSwgYXxiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhJmIpfChhXmIpLCBhfGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXwoYi1hKSwgYXxiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpfGIsIGF8YikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYSZiKSwgYSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYi1hKXwoYSZiKSwgYikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYi1hKSwgYV5iKQotCi0gICAgZGVmIHRlc3RfZXhjbHVzaW9uKHNlbGYpOgotICAgICAgICAjIGNoZWNrIHRoYXQgaW52ZXJzZSBvcGVyYXRpb25zIGRvIG5vdCBvdmVybGFwCi0gICAgICAgIGEsIGIsIHplcm8gPSBzZWxmLmEsIHNlbGYuYiwgU2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKSZiLCB6ZXJvKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiLWEpJmEsIHplcm8pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEmYikmKGFeYiksIHplcm8pCi0KLSAgICBkZWYgdGVzdF9jYXJkaW5hbGl0eV9yZWxhdGlvbnMoc2VsZik6Ci0gICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgbGVuKGEtYikgKyBsZW4oYSZiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIGxlbihiLWEpICsgbGVuKGEmYikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFeYiksIGxlbihhLWIpICsgbGVuKGItYSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGF8YiksIGxlbihhLWIpICsgbGVuKGEmYikgKyBsZW4oYi1hKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYV5iKSArIGxlbihhJmIpLCBsZW4oYXxiKSkKLQotIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1saWJyZWZ0ZXN0ID0gIiIiCi1FeGFtcGxlIGZyb20gdGhlIExpYnJhcnkgUmVmZXJlbmNlOiAgRG9jL2xpYi9saWJzZXRzLnRleAotCi0+Pj4gZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgQmFzZSAgIyBvdmVycmlkZSBfcmVwciB0byBnZXQgc29ydGVkIG91dHB1dAotPj4+IGNsYXNzIFNldChCYXNlKToKLS4uLiAgICAgZGVmIF9yZXByKHNlbGYpOgotLi4uICAgICAgICAgcmV0dXJuIEJhc2UuX3JlcHIoc2VsZiwgc29ydGVkPVRydWUpCi0+Pj4gZW5naW5lZXJzID0gU2V0KFsnSm9obicsICdKYW5lJywgJ0phY2snLCAnSmFuaWNlJ10pCi0+Pj4gcHJvZ3JhbW1lcnMgPSBTZXQoWydKYWNrJywgJ1NhbScsICdTdXNhbicsICdKYW5pY2UnXSkKLT4+PiBtYW5hZ2VycyA9IFNldChbJ0phbmUnLCAnSmFjaycsICdTdXNhbicsICdaYWNrJ10pCi0+Pj4gZW1wbG95ZWVzID0gZW5naW5lZXJzIHwgcHJvZ3JhbW1lcnMgfCBtYW5hZ2VycyAgICAgICAgICAgIyB1bmlvbgotPj4+IGVuZ2luZWVyaW5nX21hbmFnZW1lbnQgPSBlbmdpbmVlcnMgJiBtYW5hZ2VycyAgICAgICAgICAgICMgaW50ZXJzZWN0aW9uCi0+Pj4gZnVsbHRpbWVfbWFuYWdlbWVudCA9IG1hbmFnZXJzIC0gZW5naW5lZXJzIC0gcHJvZ3JhbW1lcnMgIyBkaWZmZXJlbmNlCi0+Pj4gZW5naW5lZXJzLmFkZCgnTWFydmluJykKLT4+PiBwcmludCBlbmdpbmVlcnMKLVNldChbJ0phY2snLCAnSmFuZScsICdKYW5pY2UnLCAnSm9obicsICdNYXJ2aW4nXSkKLT4+PiBlbXBsb3llZXMuaXNzdXBlcnNldChlbmdpbmVlcnMpICAgICAgICAgICAjIHN1cGVyc2V0IHRlc3QKLUZhbHNlCi0+Pj4gZW1wbG95ZWVzLnVuaW9uX3VwZGF0ZShlbmdpbmVlcnMpICAgICAgICAgIyB1cGRhdGUgZnJvbSBhbm90aGVyIHNldAotPj4+IGVtcGxveWVlcy5pc3N1cGVyc2V0KGVuZ2luZWVycykKLVRydWUKLT4+PiBmb3IgZ3JvdXAgaW4gW2VuZ2luZWVycywgcHJvZ3JhbW1lcnMsIG1hbmFnZXJzLCBlbXBsb3llZXNdOgotLi4uICAgICBncm91cC5kaXNjYXJkKCdTdXNhbicpICAgICAgICAgICAgICAgICMgdW5jb25kaXRpb25hbGx5IHJlbW92ZSBlbGVtZW50Ci0uLi4gICAgIHByaW50IGdyb3VwCi0uLi4KLVNldChbJ0phY2snLCAnSmFuZScsICdKYW5pY2UnLCAnSm9obicsICdNYXJ2aW4nXSkKLVNldChbJ0phY2snLCAnSmFuaWNlJywgJ1NhbSddKQotU2V0KFsnSmFjaycsICdKYW5lJywgJ1phY2snXSkKLVNldChbJ0phY2snLCAnSmFuZScsICdKYW5pY2UnLCAnSm9obicsICdNYXJ2aW4nLCAnU2FtJywgJ1phY2snXSkKLSIiIgotCi0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLV9fdGVzdF9fID0geydsaWJyZWZ0ZXN0JyA6IGxpYnJlZnRlc3R9Ci0KLWRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKLSAgICBpbXBvcnQgZG9jdGVzdAotICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zZXRzCi0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKLSAgICAgICAgVGVzdFNldE9mU2V0cywKLSAgICAgICAgVGVzdEV4Y2VwdGlvblByb3BhZ2F0aW9uLAotICAgICAgICBUZXN0QmFzaWNPcHNFbXB0eSwKLSAgICAgICAgVGVzdEJhc2ljT3BzU2luZ2xldG9uLAotICAgICAgICBUZXN0QmFzaWNPcHNUdXBsZSwKLSAgICAgICAgVGVzdEJhc2ljT3BzVHJpcGxlLAotICAgICAgICBUZXN0QmluYXJ5T3BzLAotICAgICAgICBUZXN0VXBkYXRlT3BzLAotICAgICAgICBUZXN0TXV0YXRlLAotICAgICAgICBUZXN0U3Vic2V0RXF1YWxFbXB0eSwKLSAgICAgICAgVGVzdFN1YnNldEVxdWFsTm9uRW1wdHksCi0gICAgICAgIFRlc3RTdWJzZXRFbXB0eU5vbkVtcHR5LAotICAgICAgICBUZXN0U3Vic2V0UGFydGlhbCwKLSAgICAgICAgVGVzdFN1YnNldE5vbk92ZXJsYXAsCi0gICAgICAgIFRlc3RPbmx5U2V0c051bWVyaWMsCi0gICAgICAgIFRlc3RPbmx5U2V0c0RpY3QsCi0gICAgICAgIFRlc3RPbmx5U2V0c09wZXJhdG9yLAotICAgICAgICBUZXN0T25seVNldHNUdXBsZSwKLSAgICAgICAgVGVzdE9ubHlTZXRzU3RyaW5nLAotICAgICAgICBUZXN0T25seVNldHNHZW5lcmF0b3IsCi0gICAgICAgIFRlc3RPbmx5U2V0c29mU2V0cywKLSAgICAgICAgVGVzdENvcHlpbmdFbXB0eSwKLSAgICAgICAgVGVzdENvcHlpbmdTaW5nbGV0b24sCi0gICAgICAgIFRlc3RDb3B5aW5nVHJpcGxlLAotICAgICAgICBUZXN0Q29weWluZ1R1cGxlLAotICAgICAgICBUZXN0Q29weWluZ05lc3RlZCwKLSAgICAgICAgVGVzdElkZW50aXRpZXMsCi0gICAgICAgIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKHRlc3Rfc2V0cyksCi0gICAgKQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCg==