REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 40.16 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-37.pyc
Text
Base64
Qg0NCgAAAADDzDRdKZ0AAOMAAAAAAAAAAAAAAAAEAAAAQAAAAHOGAAAAZABaAGQBZAJsAW0CWgIBAGQBZANsA20EWgQBAGQBZARsA20FWgUBAGUCoAZkBaEBWgdlAqAGZAahAVoIRwBkB2QIhABkCGUFagmDA1oKRwBkCWQKhABkCmUFagmDA1oLRwBkC2QMhABkDGUFagyDA1oNRwBkDWQOhABkDmUNgwNaDmQPUwApEGFFbQAARGVmaW5lIGF0dHJpYnV0ZXMgb24gT1JNLW1hcHBlZCBjbGFzc2VzIHRoYXQgaGF2ZSAiaHlicmlkIiBiZWhhdmlvci4KCiJoeWJyaWQiIG1lYW5zIHRoZSBhdHRyaWJ1dGUgaGFzIGRpc3RpbmN0IGJlaGF2aW9ycyBkZWZpbmVkIGF0IHRoZQpjbGFzcyBsZXZlbCBhbmQgYXQgdGhlIGluc3RhbmNlIGxldmVsLgoKVGhlIDptb2Q6YH5zcWxhbGNoZW15LmV4dC5oeWJyaWRgIGV4dGVuc2lvbiBwcm92aWRlcyBhIHNwZWNpYWwgZm9ybSBvZgptZXRob2QgZGVjb3JhdG9yLCBpcyBhcm91bmQgNTAgbGluZXMgb2YgY29kZSBhbmQgaGFzIGFsbW9zdCBubwpkZXBlbmRlbmNpZXMgb24gdGhlIHJlc3Qgb2YgU1FMQWxjaGVteS4gIEl0IGNhbiwgaW4gdGhlb3J5LCB3b3JrIHdpdGgKYW55IGRlc2NyaXB0b3ItYmFzZWQgZXhwcmVzc2lvbiBzeXN0ZW0uCgpDb25zaWRlciBhIG1hcHBpbmcgYGBJbnRlcnZhbGBgLCByZXByZXNlbnRpbmcgaW50ZWdlciBgYHN0YXJ0YGAgYW5kIGBgZW5kYGAKdmFsdWVzLiBXZSBjYW4gZGVmaW5lIGhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgb24gbWFwcGVkIGNsYXNzZXMgdGhhdCBwcm9kdWNlIFNRTApleHByZXNzaW9ucyBhdCB0aGUgY2xhc3MgbGV2ZWwsIGFuZCBQeXRob24gZXhwcmVzc2lvbiBldmFsdWF0aW9uIGF0IHRoZQppbnN0YW5jZSBsZXZlbC4gIEJlbG93LCBlYWNoIGZ1bmN0aW9uIGRlY29yYXRlZCB3aXRoIDpjbGFzczpgLmh5YnJpZF9tZXRob2RgIG9yCjpjbGFzczpgLmh5YnJpZF9wcm9wZXJ0eWAgbWF5IHJlY2VpdmUgYGBzZWxmYGAgYXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLCBvcgphcyB0aGUgY2xhc3MgaXRzZWxmOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IENvbHVtbiwgSW50ZWdlcgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5kZWNsYXJhdGl2ZSBpbXBvcnQgZGVjbGFyYXRpdmVfYmFzZQogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgU2Vzc2lvbiwgYWxpYXNlZAogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5oeWJyaWQgaW1wb3J0IGh5YnJpZF9wcm9wZXJ0eSwgaHlicmlkX21ldGhvZAoKICAgIEJhc2UgPSBkZWNsYXJhdGl2ZV9iYXNlKCkKCiAgICBjbGFzcyBJbnRlcnZhbChCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ2ludGVydmFsJwoKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHN0YXJ0ID0gQ29sdW1uKEludGVnZXIsIG51bGxhYmxlPUZhbHNlKQogICAgICAgIGVuZCA9IENvbHVtbihJbnRlZ2VyLCBudWxsYWJsZT1GYWxzZSkKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBlbmQpOgogICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKICAgICAgICAgICAgc2VsZi5lbmQgPSBlbmQKCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBsZW5ndGgoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVuZCAtIHNlbGYuc3RhcnQKCiAgICAgICAgQGh5YnJpZF9tZXRob2QKICAgICAgICBkZWYgY29udGFpbnMoc2VsZiwgcG9pbnQpOgogICAgICAgICAgICByZXR1cm4gKHNlbGYuc3RhcnQgPD0gcG9pbnQpICYgKHBvaW50IDw9IHNlbGYuZW5kKQoKICAgICAgICBAaHlicmlkX21ldGhvZAogICAgICAgIGRlZiBpbnRlcnNlY3RzKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMob3RoZXIuc3RhcnQpIHwgc2VsZi5jb250YWlucyhvdGhlci5lbmQpCgpBYm92ZSwgdGhlIGBgbGVuZ3RoYGAgcHJvcGVydHkgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQpgYGVuZGBgIGFuZCBgYHN0YXJ0YGAgYXR0cmlidXRlcy4gIFdpdGggYW4gaW5zdGFuY2Ugb2YgYGBJbnRlcnZhbGBgLAp0aGlzIHN1YnRyYWN0aW9uIG9jY3VycyBpbiBQeXRob24sIHVzaW5nIG5vcm1hbCBQeXRob24gZGVzY3JpcHRvcgptZWNoYW5pY3M6OgoKICAgID4+PiBpMSA9IEludGVydmFsKDUsIDEwKQogICAgPj4+IGkxLmxlbmd0aAogICAgNQoKV2hlbiBkZWFsaW5nIHdpdGggdGhlIGBgSW50ZXJ2YWxgYCBjbGFzcyBpdHNlbGYsIHRoZSA6Y2xhc3M6YC5oeWJyaWRfcHJvcGVydHlgCmRlc2NyaXB0b3IgZXZhbHVhdGVzIHRoZSBmdW5jdGlvbiBib2R5IGdpdmVuIHRoZSBgYEludGVydmFsYGAgY2xhc3MgYXMKdGhlIGFyZ3VtZW50LCB3aGljaCB3aGVuIGV2YWx1YXRlZCB3aXRoIFNRTEFsY2hlbXkgZXhwcmVzc2lvbiBtZWNoYW5pY3MKcmV0dXJucyBhIG5ldyBTUUwgZXhwcmVzc2lvbjo6CgogICAgPj4+IHByaW50IEludGVydmFsLmxlbmd0aAogICAgaW50ZXJ2YWwuImVuZCIgLSBpbnRlcnZhbC5zdGFydAoKICAgID4+PiBwcmludCBTZXNzaW9uKCkucXVlcnkoSW50ZXJ2YWwpLmZpbHRlcihJbnRlcnZhbC5sZW5ndGggPiAxMCkKICAgIFNFTEVDVCBpbnRlcnZhbC5pZCBBUyBpbnRlcnZhbF9pZCwgaW50ZXJ2YWwuc3RhcnQgQVMgaW50ZXJ2YWxfc3RhcnQsCiAgICBpbnRlcnZhbC4iZW5kIiBBUyBpbnRlcnZhbF9lbmQKICAgIEZST00gaW50ZXJ2YWwKICAgIFdIRVJFIGludGVydmFsLiJlbmQiIC0gaW50ZXJ2YWwuc3RhcnQgPiA6cGFyYW1fMQoKT1JNIG1ldGhvZHMgc3VjaCBhcyA6bWV0aDpgfi5RdWVyeS5maWx0ZXJfYnlgIGdlbmVyYWxseSB1c2UgYGBnZXRhdHRyKClgYCB0bwpsb2NhdGUgYXR0cmlidXRlcywgc28gY2FuIGFsc28gYmUgdXNlZCB3aXRoIGh5YnJpZCBhdHRyaWJ1dGVzOjoKCiAgICA+Pj4gcHJpbnQgU2Vzc2lvbigpLnF1ZXJ5KEludGVydmFsKS5maWx0ZXJfYnkobGVuZ3RoPTUpCiAgICBTRUxFQ1QgaW50ZXJ2YWwuaWQgQVMgaW50ZXJ2YWxfaWQsIGludGVydmFsLnN0YXJ0IEFTIGludGVydmFsX3N0YXJ0LAogICAgaW50ZXJ2YWwuImVuZCIgQVMgaW50ZXJ2YWxfZW5kCiAgICBGUk9NIGludGVydmFsCiAgICBXSEVSRSBpbnRlcnZhbC4iZW5kIiAtIGludGVydmFsLnN0YXJ0ID0gOnBhcmFtXzEKClRoZSBgYEludGVydmFsYGAgY2xhc3MgZXhhbXBsZSBhbHNvIGlsbHVzdHJhdGVzIHR3byBtZXRob2RzLApgYGNvbnRhaW5zKClgYCBhbmQgYGBpbnRlcnNlY3RzKClgYCwgZGVjb3JhdGVkIHdpdGgKOmNsYXNzOmAuaHlicmlkX21ldGhvZGAuIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgdGhlIHNhbWUgaWRlYSB0bwptZXRob2RzIHRoYXQgOmNsYXNzOmAuaHlicmlkX3Byb3BlcnR5YCBhcHBsaWVzIHRvIGF0dHJpYnV0ZXMuICAgVGhlCm1ldGhvZHMgcmV0dXJuIGJvb2xlYW4gdmFsdWVzLCBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIFB5dGhvbiBgYHxgYAphbmQgYGAmYGAgYml0d2lzZSBvcGVyYXRvcnMgdG8gcHJvZHVjZSBlcXVpdmFsZW50IGluc3RhbmNlLWxldmVsIGFuZApTUUwgZXhwcmVzc2lvbi1sZXZlbCBib29sZWFuIGJlaGF2aW9yOjoKCiAgICA+Pj4gaTEuY29udGFpbnMoNikKICAgIFRydWUKICAgID4+PiBpMS5jb250YWlucygxNSkKICAgIEZhbHNlCiAgICA+Pj4gaTEuaW50ZXJzZWN0cyhJbnRlcnZhbCg3LCAxOCkpCiAgICBUcnVlCiAgICA+Pj4gaTEuaW50ZXJzZWN0cyhJbnRlcnZhbCgyNSwgMjkpKQogICAgRmFsc2UKCiAgICA+Pj4gcHJpbnQgU2Vzc2lvbigpLnF1ZXJ5KEludGVydmFsKS5maWx0ZXIoSW50ZXJ2YWwuY29udGFpbnMoMTUpKQogICAgU0VMRUNUIGludGVydmFsLmlkIEFTIGludGVydmFsX2lkLCBpbnRlcnZhbC5zdGFydCBBUyBpbnRlcnZhbF9zdGFydCwKICAgIGludGVydmFsLiJlbmQiIEFTIGludGVydmFsX2VuZAogICAgRlJPTSBpbnRlcnZhbAogICAgV0hFUkUgaW50ZXJ2YWwuc3RhcnQgPD0gOnN0YXJ0XzEgQU5EIGludGVydmFsLiJlbmQiID4gOmVuZF8xCgogICAgPj4+IGlhID0gYWxpYXNlZChJbnRlcnZhbCkKICAgID4+PiBwcmludCBTZXNzaW9uKCkucXVlcnkoSW50ZXJ2YWwsIGlhKS5maWx0ZXIoSW50ZXJ2YWwuaW50ZXJzZWN0cyhpYSkpCiAgICBTRUxFQ1QgaW50ZXJ2YWwuaWQgQVMgaW50ZXJ2YWxfaWQsIGludGVydmFsLnN0YXJ0IEFTIGludGVydmFsX3N0YXJ0LAogICAgaW50ZXJ2YWwuImVuZCIgQVMgaW50ZXJ2YWxfZW5kLCBpbnRlcnZhbF8xLmlkIEFTIGludGVydmFsXzFfaWQsCiAgICBpbnRlcnZhbF8xLnN0YXJ0IEFTIGludGVydmFsXzFfc3RhcnQsIGludGVydmFsXzEuImVuZCIgQVMgaW50ZXJ2YWxfMV9lbmQKICAgIEZST00gaW50ZXJ2YWwsIGludGVydmFsIEFTIGludGVydmFsXzEKICAgIFdIRVJFIGludGVydmFsLnN0YXJ0IDw9IGludGVydmFsXzEuc3RhcnQKICAgICAgICBBTkQgaW50ZXJ2YWwuImVuZCIgPiBpbnRlcnZhbF8xLnN0YXJ0CiAgICAgICAgT1IgaW50ZXJ2YWwuc3RhcnQgPD0gaW50ZXJ2YWxfMS4iZW5kIgogICAgICAgIEFORCBpbnRlcnZhbC4iZW5kIiA+IGludGVydmFsXzEuImVuZCIKCi4uIF9oeWJyaWRfZGlzdGluY3RfZXhwcmVzc2lvbjoKCkRlZmluaW5nIEV4cHJlc3Npb24gQmVoYXZpb3IgRGlzdGluY3QgZnJvbSBBdHRyaWJ1dGUgQmVoYXZpb3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk91ciB1c2FnZSBvZiB0aGUgYGAmYGAgYW5kIGBgfGBgIGJpdHdpc2Ugb3BlcmF0b3JzIGFib3ZlIHdhcwpmb3J0dW5hdGUsIGNvbnNpZGVyaW5nIG91ciBmdW5jdGlvbnMgb3BlcmF0ZWQgb24gdHdvIGJvb2xlYW4gdmFsdWVzIHRvCnJldHVybiBhIG5ldyBvbmUuICAgSW4gbWFueSBjYXNlcywgdGhlIGNvbnN0cnVjdGlvbiBvZiBhbiBpbi1QeXRob24KZnVuY3Rpb24gYW5kIGEgU1FMQWxjaGVteSBTUUwgZXhwcmVzc2lvbiBoYXZlIGVub3VnaCBkaWZmZXJlbmNlcyB0aGF0CnR3byBzZXBhcmF0ZSBQeXRob24gZXhwcmVzc2lvbnMgc2hvdWxkIGJlIGRlZmluZWQuICBUaGUKOm1vZDpgfnNxbGFsY2hlbXkuZXh0Lmh5YnJpZGAgZGVjb3JhdG9ycyBkZWZpbmUgdGhlCjptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIG1vZGlmaWVyIGZvciB0aGlzIHB1cnBvc2UuICAgQXMgYW4KZXhhbXBsZSB3ZSdsbCBkZWZpbmUgdGhlIHJhZGl1cyBvZiB0aGUgaW50ZXJ2YWwsIHdoaWNoIHJlcXVpcmVzIHRoZQp1c2FnZSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb246OgoKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgZnVuYwoKICAgIGNsYXNzIEludGVydmFsKG9iamVjdCk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiByYWRpdXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBhYnMoc2VsZi5sZW5ndGgpIC8gMgoKICAgICAgICBAcmFkaXVzLmV4cHJlc3Npb24KICAgICAgICBkZWYgcmFkaXVzKGNscyk6CiAgICAgICAgICAgIHJldHVybiBmdW5jLmFicyhjbHMubGVuZ3RoKSAvIDIKCkFib3ZlIHRoZSBQeXRob24gZnVuY3Rpb24gYGBhYnMoKWBgIGlzIHVzZWQgZm9yIGluc3RhbmNlLWxldmVsCm9wZXJhdGlvbnMsIHRoZSBTUUwgZnVuY3Rpb24gYGBBQlMoKWBgIGlzIHVzZWQgdmlhIHRoZSA6ZGF0YTpgLmZ1bmNgCm9iamVjdCBmb3IgY2xhc3MtbGV2ZWwgZXhwcmVzc2lvbnM6OgoKICAgID4+PiBpMS5yYWRpdXMKICAgIDIKCiAgICA+Pj4gcHJpbnQgU2Vzc2lvbigpLnF1ZXJ5KEludGVydmFsKS5maWx0ZXIoSW50ZXJ2YWwucmFkaXVzID4gNSkKICAgIFNFTEVDVCBpbnRlcnZhbC5pZCBBUyBpbnRlcnZhbF9pZCwgaW50ZXJ2YWwuc3RhcnQgQVMgaW50ZXJ2YWxfc3RhcnQsCiAgICAgICAgaW50ZXJ2YWwuImVuZCIgQVMgaW50ZXJ2YWxfZW5kCiAgICBGUk9NIGludGVydmFsCiAgICBXSEVSRSBhYnMoaW50ZXJ2YWwuImVuZCIgLSBpbnRlcnZhbC5zdGFydCkgLyA6YWJzXzEgPiA6cGFyYW1fMQoKLi4gbm90ZTo6IFdoZW4gZGVmaW5pbmcgYW4gZXhwcmVzc2lvbiBmb3IgYSBoeWJyaWQgcHJvcGVydHkgb3IgbWV0aG9kLCB0aGUKICAgZXhwcmVzc2lvbiBtZXRob2QgKiptdXN0KiogcmV0YWluIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBoeWJyaWQsIGVsc2UKICAgdGhlIG5ldyBoeWJyaWQgd2l0aCB0aGUgYWRkaXRpb25hbCBzdGF0ZSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBjbGFzcwogICB3aXRoIHRoZSBub24tbWF0Y2hpbmcgbmFtZS4gVG8gdXNlIHRoZSBleGFtcGxlIGFib3ZlOjoKCiAgICBjbGFzcyBJbnRlcnZhbChvYmplY3QpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgcmFkaXVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYWJzKHNlbGYubGVuZ3RoKSAvIDIKCiAgICAgICAgIyBXUk9ORyAtIHRoZSBub24tbWF0Y2hpbmcgbmFtZSB3aWxsIGNhdXNlIHRoaXMgZnVuY3Rpb24gdG8gYmUKICAgICAgICAjIGlnbm9yZWQKICAgICAgICBAcmFkaXVzLmV4cHJlc3Npb24KICAgICAgICBkZWYgcmFkaXVzX2V4cHJlc3Npb24oY2xzKToKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYWJzKGNscy5sZW5ndGgpIC8gMgoKICAgVGhpcyBpcyBhbHNvIHRydWUgZm9yIG90aGVyIG11dGF0b3IgbWV0aG9kcywgc3VjaCBhcwogICA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvbmAuIFRoaXMgaXMgdGhlIHNhbWUgYmVoYXZpb3IKICAgYXMgdGhhdCBvZiB0aGUgYGBAcHJvcGVydHlgYCBjb25zdHJ1Y3QgdGhhdCBpcyBwYXJ0IG9mIHN0YW5kYXJkIFB5dGhvbi4KCkRlZmluaW5nIFNldHRlcnMKLS0tLS0tLS0tLS0tLS0tLQoKSHlicmlkIHByb3BlcnRpZXMgY2FuIGFsc28gZGVmaW5lIHNldHRlciBtZXRob2RzLiAgSWYgd2Ugd2FudGVkCmBgbGVuZ3RoYGAgYWJvdmUsIHdoZW4gc2V0LCB0byBtb2RpZnkgdGhlIGVuZHBvaW50IHZhbHVlOjoKCiAgICBjbGFzcyBJbnRlcnZhbChvYmplY3QpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgbGVuZ3RoKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5lbmQgLSBzZWxmLnN0YXJ0CgogICAgICAgIEBsZW5ndGguc2V0dGVyCiAgICAgICAgZGVmIGxlbmd0aChzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYuZW5kID0gc2VsZi5zdGFydCArIHZhbHVlCgpUaGUgYGBsZW5ndGgoc2VsZiwgdmFsdWUpYGAgbWV0aG9kIGlzIG5vdyBjYWxsZWQgdXBvbiBzZXQ6OgoKICAgID4+PiBpMSA9IEludGVydmFsKDUsIDEwKQogICAgPj4+IGkxLmxlbmd0aAogICAgNQogICAgPj4+IGkxLmxlbmd0aCA9IDEyCiAgICA+Pj4gaTEuZW5kCiAgICAxNwoKLi4gX2h5YnJpZF9idWxrX3VwZGF0ZToKCkFsbG93aW5nIEJ1bGsgT1JNIFVwZGF0ZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgaHlicmlkIGNhbiBkZWZpbmUgYSBjdXN0b20gIlVQREFURSIgaGFuZGxlciBmb3Igd2hlbiB1c2luZyB0aGUKOm1ldGg6YC5RdWVyeS51cGRhdGVgIG1ldGhvZCwgYWxsb3dpbmcgdGhlIGh5YnJpZCB0byBiZSB1c2VkIGluIHRoZQpTRVQgY2xhdXNlIG9mIHRoZSB1cGRhdGUuCgpOb3JtYWxseSwgd2hlbiB1c2luZyBhIGh5YnJpZCB3aXRoIDptZXRoOmAuUXVlcnkudXBkYXRlYCwgdGhlIFNRTApleHByZXNzaW9uIGlzIHVzZWQgYXMgdGhlIGNvbHVtbiB0aGF0J3MgdGhlIHRhcmdldCBvZiB0aGUgU0VULiAgSWYgb3VyCmBgSW50ZXJ2YWxgYCBjbGFzcyBoYWQgYSBoeWJyaWQgYGBzdGFydF9wb2ludGBgIHRoYXQgbGlua2VkIHRvCmBgSW50ZXJ2YWwuc3RhcnRgYCwgdGhpcyBjb3VsZCBiZSBzdWJzdGl0dXRlZCBkaXJlY3RseTo6CgogICAgc2Vzc2lvbi5xdWVyeShJbnRlcnZhbCkudXBkYXRlKHtJbnRlcnZhbC5zdGFydF9wb2ludDogMTB9KQoKSG93ZXZlciwgd2hlbiB1c2luZyBhIGNvbXBvc2l0ZSBoeWJyaWQgbGlrZSBgYEludGVydmFsLmxlbmd0aGBgLCB0aGlzCmh5YnJpZCByZXByZXNlbnRzIG1vcmUgdGhhbiBvbmUgY29sdW1uLiAgIFdlIGNhbiBzZXQgdXAgYSBoYW5kbGVyIHRoYXQgd2lsbAphY2NvbW1vZGF0ZSBhIHZhbHVlIHBhc3NlZCB0byA6bWV0aDpgLlF1ZXJ5LnVwZGF0ZWAgd2hpY2ggY2FuIGFmZmVjdAp0aGlzLCB1c2luZyB0aGUgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkudXBkYXRlX2V4cHJlc3Npb25gIGRlY29yYXRvci4KQSBoYW5kbGVyIHRoYXQgd29ya3Mgc2ltaWxhcmx5IHRvIG91ciBzZXR0ZXIgd291bGQgYmU6OgoKICAgIGNsYXNzIEludGVydmFsKG9iamVjdCk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBsZW5ndGgoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVuZCAtIHNlbGYuc3RhcnQKCiAgICAgICAgQGxlbmd0aC5zZXR0ZXIKICAgICAgICBkZWYgbGVuZ3RoKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnN0YXJ0ICsgdmFsdWUKCiAgICAgICAgQGxlbmd0aC51cGRhdGVfZXhwcmVzc2lvbgogICAgICAgIGRlZiBsZW5ndGgoY2xzLCB2YWx1ZSk6CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAoY2xzLmVuZCwgY2xzLnN0YXJ0ICsgdmFsdWUpCiAgICAgICAgICAgIF0KCkFib3ZlLCBpZiB3ZSB1c2UgYGBJbnRlcnZhbC5sZW5ndGhgYCBpbiBhbiBVUERBVEUgZXhwcmVzc2lvbiBhczo6CgogICAgc2Vzc2lvbi5xdWVyeShJbnRlcnZhbCkudXBkYXRlKAogICAgICAgIHtJbnRlcnZhbC5sZW5ndGg6IDI1fSwgc3luY2hyb25pemVfc2Vzc2lvbj0nZmV0Y2gnKQoKV2UnbGwgZ2V0IGFuIFVQREFURSBzdGF0ZW1lbnQgYWxvbmcgdGhlIGxpbmVzIG9mOjoKCiAgICBVUERBVEUgaW50ZXJ2YWwgU0VUIGVuZD1zdGFydCArIDp2YWx1ZQoKSW4gc29tZSBjYXNlcywgdGhlIGRlZmF1bHQgImV2YWx1YXRlIiBzdHJhdGVneSBjYW4ndCBwZXJmb3JtIHRoZSBTRVQKZXhwcmVzc2lvbiBpbiBQeXRob247IHdoaWxlIHRoZSBhZGRpdGlvbiBvcGVyYXRvciB3ZSdyZSB1c2luZyBhYm92ZQppcyBzdXBwb3J0ZWQsIGZvciBtb3JlIGNvbXBsZXggU0VUIGV4cHJlc3Npb25zIGl0IHdpbGwgdXN1YWxseSBiZSBuZWNlc3NhcnkKdG8gdXNlIGVpdGhlciB0aGUgImZldGNoIiBvciBGYWxzZSBzeW5jaHJvbml6YXRpb24gc3RyYXRlZ3kgYXMgaWxsdXN0cmF0ZWQKYWJvdmUuCgouLiB2ZXJzaW9uYWRkZWQ6OiAxLjIgYWRkZWQgc3VwcG9ydCBmb3IgYnVsayB1cGRhdGVzIHRvIGh5YnJpZCBwcm9wZXJ0aWVzLgoKV29ya2luZyB3aXRoIFJlbGF0aW9uc2hpcHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXJlJ3Mgbm8gZXNzZW50aWFsIGRpZmZlcmVuY2Ugd2hlbiBjcmVhdGluZyBoeWJyaWRzIHRoYXQgd29yayB3aXRoCnJlbGF0ZWQgb2JqZWN0cyBhcyBvcHBvc2VkIHRvIGNvbHVtbi1iYXNlZCBkYXRhLiBUaGUgbmVlZCBmb3IgZGlzdGluY3QKZXhwcmVzc2lvbnMgdGVuZHMgdG8gYmUgZ3JlYXRlci4gIFRoZSB0d28gdmFyaWFudHMgd2UnbGwgaWxsdXN0cmF0ZQphcmUgdGhlICJqb2luLWRlcGVuZGVudCIgaHlicmlkLCBhbmQgdGhlICJjb3JyZWxhdGVkIHN1YnF1ZXJ5IiBoeWJyaWQuCgpKb2luLURlcGVuZGVudCBSZWxhdGlvbnNoaXAgSHlicmlkCl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KCkNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpdmUKbWFwcGluZyB3aGljaCByZWxhdGVzIGEgYGBVc2VyYGAgdG8gYSBgYFNhdmluZ3NBY2NvdW50YGA6OgoKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgQ29sdW1uLCBJbnRlZ2VyLCBGb3JlaWduS2V5LCBOdW1lcmljLCBTdHJpbmcKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IHJlbGF0aW9uc2hpcAogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5kZWNsYXJhdGl2ZSBpbXBvcnQgZGVjbGFyYXRpdmVfYmFzZQogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5oeWJyaWQgaW1wb3J0IGh5YnJpZF9wcm9wZXJ0eQoKICAgIEJhc2UgPSBkZWNsYXJhdGl2ZV9iYXNlKCkKCiAgICBjbGFzcyBTYXZpbmdzQWNjb3VudChCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ2FjY291bnQnCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICB1c2VyX2lkID0gQ29sdW1uKEludGVnZXIsIEZvcmVpZ25LZXkoJ3VzZXIuaWQnKSwgbnVsbGFibGU9RmFsc2UpCiAgICAgICAgYmFsYW5jZSA9IENvbHVtbihOdW1lcmljKDE1LCA1KSkKCiAgICBjbGFzcyBVc2VyKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAndXNlcicKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIG5hbWUgPSBDb2x1bW4oU3RyaW5nKDEwMCksIG51bGxhYmxlPUZhbHNlKQoKICAgICAgICBhY2NvdW50cyA9IHJlbGF0aW9uc2hpcCgiU2F2aW5nc0FjY291bnQiLCBiYWNrcmVmPSJvd25lciIpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgYmFsYW5jZShzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi5hY2NvdW50czoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRzWzBdLmJhbGFuY2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIEBiYWxhbmNlLnNldHRlcgogICAgICAgIGRlZiBiYWxhbmNlKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuYWNjb3VudHM6CiAgICAgICAgICAgICAgICBhY2NvdW50ID0gQWNjb3VudChvd25lcj1zZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYWNjb3VudCA9IHNlbGYuYWNjb3VudHNbMF0KICAgICAgICAgICAgYWNjb3VudC5iYWxhbmNlID0gdmFsdWUKCiAgICAgICAgQGJhbGFuY2UuZXhwcmVzc2lvbgogICAgICAgIGRlZiBiYWxhbmNlKGNscyk6CiAgICAgICAgICAgIHJldHVybiBTYXZpbmdzQWNjb3VudC5iYWxhbmNlCgpUaGUgYWJvdmUgaHlicmlkIHByb3BlcnR5IGBgYmFsYW5jZWBgIHdvcmtzIHdpdGggdGhlIGZpcnN0CmBgU2F2aW5nc0FjY291bnRgYCBlbnRyeSBpbiB0aGUgbGlzdCBvZiBhY2NvdW50cyBmb3IgdGhpcyB1c2VyLiAgIFRoZQppbi1QeXRob24gZ2V0dGVyL3NldHRlciBtZXRob2RzIGNhbiB0cmVhdCBgYGFjY291bnRzYGAgYXMgYSBQeXRob24KbGlzdCBhdmFpbGFibGUgb24gYGBzZWxmYGAuCgpIb3dldmVyLCBhdCB0aGUgZXhwcmVzc2lvbiBsZXZlbCwgaXQncyBleHBlY3RlZCB0aGF0IHRoZSBgYFVzZXJgYCBjbGFzcyB3aWxsCmJlIHVzZWQgaW4gYW4gYXBwcm9wcmlhdGUgY29udGV4dCBzdWNoIHRoYXQgYW4gYXBwcm9wcmlhdGUgam9pbiB0bwpgYFNhdmluZ3NBY2NvdW50YGAgd2lsbCBiZSBwcmVzZW50OjoKCiAgICA+Pj4gcHJpbnQgU2Vzc2lvbigpLnF1ZXJ5KFVzZXIsIFVzZXIuYmFsYW5jZSkuXAogICAgLi4uICAgICBqb2luKFVzZXIuYWNjb3VudHMpLmZpbHRlcihVc2VyLmJhbGFuY2UgPiA1MDAwKQogICAgU0VMRUNUICJ1c2VyIi5pZCBBUyB1c2VyX2lkLCAidXNlciIubmFtZSBBUyB1c2VyX25hbWUsCiAgICBhY2NvdW50LmJhbGFuY2UgQVMgYWNjb3VudF9iYWxhbmNlCiAgICBGUk9NICJ1c2VyIiBKT0lOIGFjY291bnQgT04gInVzZXIiLmlkID0gYWNjb3VudC51c2VyX2lkCiAgICBXSEVSRSBhY2NvdW50LmJhbGFuY2UgPiA6YmFsYW5jZV8xCgpOb3RlIGhvd2V2ZXIsIHRoYXQgd2hpbGUgdGhlIGluc3RhbmNlIGxldmVsIGFjY2Vzc29ycyBuZWVkIHRvIHdvcnJ5CmFib3V0IHdoZXRoZXIgYGBzZWxmLmFjY291bnRzYGAgaXMgZXZlbiBwcmVzZW50LCB0aGlzIGlzc3VlIGV4cHJlc3NlcwppdHNlbGYgZGlmZmVyZW50bHkgYXQgdGhlIFNRTCBleHByZXNzaW9uIGxldmVsLCB3aGVyZSB3ZSBiYXNpY2FsbHkKd291bGQgdXNlIGFuIG91dGVyIGpvaW46OgoKICAgID4+PiBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IG9yXwogICAgPj4+IHByaW50IChTZXNzaW9uKCkucXVlcnkoVXNlciwgVXNlci5iYWxhbmNlKS5vdXRlcmpvaW4oVXNlci5hY2NvdW50cykuCiAgICAuLi4gICAgICAgICBmaWx0ZXIob3JfKFVzZXIuYmFsYW5jZSA8IDUwMDAsIFVzZXIuYmFsYW5jZSA9PSBOb25lKSkpCiAgICBTRUxFQ1QgInVzZXIiLmlkIEFTIHVzZXJfaWQsICJ1c2VyIi5uYW1lIEFTIHVzZXJfbmFtZSwKICAgIGFjY291bnQuYmFsYW5jZSBBUyBhY2NvdW50X2JhbGFuY2UKICAgIEZST00gInVzZXIiIExFRlQgT1VURVIgSk9JTiBhY2NvdW50IE9OICJ1c2VyIi5pZCA9IGFjY291bnQudXNlcl9pZAogICAgV0hFUkUgYWNjb3VudC5iYWxhbmNlIDwgIDpiYWxhbmNlXzEgT1IgYWNjb3VudC5iYWxhbmNlIElTIE5VTEwKCkNvcnJlbGF0ZWQgU3VicXVlcnkgUmVsYXRpb25zaGlwIEh5YnJpZApeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCgpXZSBjYW4sIG9mIGNvdXJzZSwgZm9yZWdvIGJlaW5nIGRlcGVuZGVudCBvbiB0aGUgZW5jbG9zaW5nIHF1ZXJ5J3MgdXNhZ2UKb2Ygam9pbnMgaW4gZmF2b3Igb2YgdGhlIGNvcnJlbGF0ZWQgc3VicXVlcnksIHdoaWNoIGNhbiBwb3J0YWJseSBiZSBwYWNrZWQKaW50byBhIHNpbmdsZSBjb2x1bW4gZXhwcmVzc2lvbi4gQSBjb3JyZWxhdGVkIHN1YnF1ZXJ5IGlzIG1vcmUgcG9ydGFibGUsIGJ1dApvZnRlbiBwZXJmb3JtcyBtb3JlIHBvb3JseSBhdCB0aGUgU1FMIGxldmVsLiBVc2luZyB0aGUgc2FtZSB0ZWNobmlxdWUKaWxsdXN0cmF0ZWQgYXQgOnJlZjpgbWFwcGVyX2NvbHVtbl9wcm9wZXJ0eV9zcWxfZXhwcmVzc2lvbnNgLAp3ZSBjYW4gYWRqdXN0IG91ciBgYFNhdmluZ3NBY2NvdW50YGAgZXhhbXBsZSB0byBhZ2dyZWdhdGUgdGhlIGJhbGFuY2VzIGZvcgoqYWxsKiBhY2NvdW50cywgYW5kIHVzZSBhIGNvcnJlbGF0ZWQgc3VicXVlcnkgZm9yIHRoZSBjb2x1bW4gZXhwcmVzc2lvbjo6CgogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBDb2x1bW4sIEludGVnZXIsIEZvcmVpZ25LZXksIE51bWVyaWMsIFN0cmluZwogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgcmVsYXRpb25zaGlwCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmRlY2xhcmF0aXZlIGltcG9ydCBkZWNsYXJhdGl2ZV9iYXNlCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0Lmh5YnJpZCBpbXBvcnQgaHlicmlkX3Byb3BlcnR5CiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IHNlbGVjdCwgZnVuYwoKICAgIEJhc2UgPSBkZWNsYXJhdGl2ZV9iYXNlKCkKCiAgICBjbGFzcyBTYXZpbmdzQWNjb3VudChCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ2FjY291bnQnCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICB1c2VyX2lkID0gQ29sdW1uKEludGVnZXIsIEZvcmVpZ25LZXkoJ3VzZXIuaWQnKSwgbnVsbGFibGU9RmFsc2UpCiAgICAgICAgYmFsYW5jZSA9IENvbHVtbihOdW1lcmljKDE1LCA1KSkKCiAgICBjbGFzcyBVc2VyKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAndXNlcicKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIG5hbWUgPSBDb2x1bW4oU3RyaW5nKDEwMCksIG51bGxhYmxlPUZhbHNlKQoKICAgICAgICBhY2NvdW50cyA9IHJlbGF0aW9uc2hpcCgiU2F2aW5nc0FjY291bnQiLCBiYWNrcmVmPSJvd25lciIpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgYmFsYW5jZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHN1bShhY2MuYmFsYW5jZSBmb3IgYWNjIGluIHNlbGYuYWNjb3VudHMpCgogICAgICAgIEBiYWxhbmNlLmV4cHJlc3Npb24KICAgICAgICBkZWYgYmFsYW5jZShjbHMpOgogICAgICAgICAgICByZXR1cm4gc2VsZWN0KFtmdW5jLnN1bShTYXZpbmdzQWNjb3VudC5iYWxhbmNlKV0pLlwKICAgICAgICAgICAgICAgICAgICB3aGVyZShTYXZpbmdzQWNjb3VudC51c2VyX2lkPT1jbHMuaWQpLlwKICAgICAgICAgICAgICAgICAgICBsYWJlbCgndG90YWxfYmFsYW5jZScpCgpUaGUgYWJvdmUgcmVjaXBlIHdpbGwgZ2l2ZSB1cyB0aGUgYGBiYWxhbmNlYGAgY29sdW1uIHdoaWNoIHJlbmRlcnMKYSBjb3JyZWxhdGVkIFNFTEVDVDo6CgogICAgPj4+IHByaW50IHMucXVlcnkoVXNlcikuZmlsdGVyKFVzZXIuYmFsYW5jZSA+IDQwMCkKICAgIFNFTEVDVCAidXNlciIuaWQgQVMgdXNlcl9pZCwgInVzZXIiLm5hbWUgQVMgdXNlcl9uYW1lCiAgICBGUk9NICJ1c2VyIgogICAgV0hFUkUgKFNFTEVDVCBzdW0oYWNjb3VudC5iYWxhbmNlKSBBUyBzdW1fMQogICAgRlJPTSBhY2NvdW50CiAgICBXSEVSRSBhY2NvdW50LnVzZXJfaWQgPSAidXNlciIuaWQpID4gOnBhcmFtXzEKCi4uIF9oeWJyaWRfY3VzdG9tX2NvbXBhcmF0b3JzOgoKQnVpbGRpbmcgQ3VzdG9tIENvbXBhcmF0b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIGh5YnJpZCBwcm9wZXJ0eSBhbHNvIGluY2x1ZGVzIGEgaGVscGVyIHRoYXQgYWxsb3dzIGNvbnN0cnVjdGlvbiBvZgpjdXN0b20gY29tcGFyYXRvcnMuIEEgY29tcGFyYXRvciBvYmplY3QgYWxsb3dzIG9uZSB0byBjdXN0b21pemUgdGhlCmJlaGF2aW9yIG9mIGVhY2ggU1FMQWxjaGVteSBleHByZXNzaW9uIG9wZXJhdG9yIGluZGl2aWR1YWxseS4gIFRoZXkKYXJlIHVzZWZ1bCB3aGVuIGNyZWF0aW5nIGN1c3RvbSB0eXBlcyB0aGF0IGhhdmUgc29tZSBoaWdobHkKaWRpb3N5bmNyYXRpYyBiZWhhdmlvciBvbiB0aGUgU1FMIHNpZGUuCgouLiBub3RlOjogIFRoZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5jb21wYXJhdG9yYCBkZWNvcmF0b3IgaW50cm9kdWNlZAogICBpbiB0aGlzIHNlY3Rpb24gKipyZXBsYWNlcyoqIHRoZSB1c2Ugb2YgdGhlCiAgIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIGRlY29yYXRvci4KICAgVGhleSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KClRoZSBleGFtcGxlIGNsYXNzIGJlbG93IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zIG9uIHRoZSBhdHRyaWJ1dGUKbmFtZWQgYGB3b3JkX2luc2Vuc2l0aXZlYGA6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBDb21wYXJhdG9yLCBoeWJyaWRfcHJvcGVydHkKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgZnVuYywgQ29sdW1uLCBJbnRlZ2VyLCBTdHJpbmcKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IFNlc3Npb24KICAgIGZyb20gc3FsYWxjaGVteS5leHQuZGVjbGFyYXRpdmUgaW1wb3J0IGRlY2xhcmF0aXZlX2Jhc2UKCiAgICBCYXNlID0gZGVjbGFyYXRpdmVfYmFzZSgpCgogICAgY2xhc3MgQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcihDb21wYXJhdG9yKToKICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgcmV0dXJuIGZ1bmMubG93ZXIoc2VsZi5fX2NsYXVzZV9lbGVtZW50X18oKSkgPT0gZnVuYy5sb3dlcihvdGhlcikKCiAgICBjbGFzcyBTZWFyY2hXb3JkKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnc2VhcmNod29yZCcKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHdvcmQgPSBDb2x1bW4oU3RyaW5nKDI1NSksIG51bGxhYmxlPUZhbHNlKQoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIHdvcmRfaW5zZW5zaXRpdmUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLndvcmQubG93ZXIoKQoKICAgICAgICBAd29yZF9pbnNlbnNpdGl2ZS5jb21wYXJhdG9yCiAgICAgICAgZGVmIHdvcmRfaW5zZW5zaXRpdmUoY2xzKToKICAgICAgICAgICAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZUNvbXBhcmF0b3IoY2xzLndvcmQpCgpBYm92ZSwgU1FMIGV4cHJlc3Npb25zIGFnYWluc3QgYGB3b3JkX2luc2Vuc2l0aXZlYGAgd2lsbCBhcHBseSB0aGUgYGBMT1dFUigpYGAKU1FMIGZ1bmN0aW9uIHRvIGJvdGggc2lkZXM6OgoKICAgID4+PiBwcmludCBTZXNzaW9uKCkucXVlcnkoU2VhcmNoV29yZCkuZmlsdGVyX2J5KHdvcmRfaW5zZW5zaXRpdmU9IlRydWNrcyIpCiAgICBTRUxFQ1Qgc2VhcmNod29yZC5pZCBBUyBzZWFyY2h3b3JkX2lkLCBzZWFyY2h3b3JkLndvcmQgQVMgc2VhcmNod29yZF93b3JkCiAgICBGUk9NIHNlYXJjaHdvcmQKICAgIFdIRVJFIGxvd2VyKHNlYXJjaHdvcmQud29yZCkgPSBsb3dlcig6bG93ZXJfMSkKClRoZSBgYENhc2VJbnNlbnNpdGl2ZUNvbXBhcmF0b3JgYCBhYm92ZSBpbXBsZW1lbnRzIHBhcnQgb2YgdGhlCjpjbGFzczpgLkNvbHVtbk9wZXJhdG9yc2AgaW50ZXJmYWNlLiAgIEEgImNvZXJjaW9uIiBvcGVyYXRpb24gbGlrZQpsb3dlcmNhc2luZyBjYW4gYmUgYXBwbGllZCB0byBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIChpLmUuIGBgZXFgYCwKYGBsdGBgLCBgYGd0YGAsIGV0Yy4pIHVzaW5nIDptZXRoOmAuT3BlcmF0b3JzLm9wZXJhdGVgOjoKCiAgICBjbGFzcyBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKENvbXBhcmF0b3IpOgogICAgICAgIGRlZiBvcGVyYXRlKHNlbGYsIG9wLCBvdGhlcik6CiAgICAgICAgICAgIHJldHVybiBvcChmdW5jLmxvd2VyKHNlbGYuX19jbGF1c2VfZWxlbWVudF9fKCkpLCBmdW5jLmxvd2VyKG90aGVyKSkKCi4uIF9oeWJyaWRfcmV1c2Vfc3ViY2xhc3M6CgpSZXVzaW5nIEh5YnJpZCBQcm9wZXJ0aWVzIGFjcm9zcyBTdWJjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgaHlicmlkIGNhbiBiZSByZWZlcnJlZCB0byBmcm9tIGEgc3VwZXJjbGFzcywgdG8gYWxsb3cgbW9kaWZ5aW5nCm1ldGhvZHMgbGlrZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5nZXR0ZXJgLCA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5zZXR0ZXJgCnRvIGJlIHVzZWQgdG8gcmVkZWZpbmUgdGhvc2UgbWV0aG9kcyBvbiBhIHN1YmNsYXNzLiAgVGhpcyBpcyBzaW1pbGFyIHRvCmhvdyB0aGUgc3RhbmRhcmQgUHl0aG9uIGBgQHByb3BlcnR5YGAgb2JqZWN0IHdvcmtzOjoKCiAgICBjbGFzcyBGaXJzdE5hbWVPbmx5KEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIGZpcnN0X25hbWUgPSBDb2x1bW4oU3RyaW5nKQoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpcnN0X25hbWUKCiAgICAgICAgQG5hbWUuc2V0dGVyCiAgICAgICAgZGVmIG5hbWUoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLmZpcnN0X25hbWUgPSB2YWx1ZQoKICAgIGNsYXNzIEZpcnN0TmFtZUxhc3ROYW1lKEZpcnN0TmFtZU9ubHkpOgogICAgICAgICMgLi4uCgogICAgICAgIGxhc3RfbmFtZSA9IENvbHVtbihTdHJpbmcpCgogICAgICAgIEBGaXJzdE5hbWVPbmx5Lm5hbWUuZ2V0dGVyCiAgICAgICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpcnN0X25hbWUgKyAnICcgKyBzZWxmLmxhc3RfbmFtZQoKICAgICAgICBAbmFtZS5zZXR0ZXIKICAgICAgICBkZWYgbmFtZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYuZmlyc3RfbmFtZSwgc2VsZi5sYXN0X25hbWUgPSB2YWx1ZS5zcGxpdCgnICcsIDEpCgpBYm92ZSwgdGhlIGBgRmlyc3ROYW1lTGFzdE5hbWVgYCBjbGFzcyByZWZlcnMgdG8gdGhlIGh5YnJpZCBmcm9tCmBgRmlyc3ROYW1lT25seS5uYW1lYGAgdG8gcmVwdXJwb3NlIGl0cyBnZXR0ZXIgYW5kIHNldHRlciBmb3IgdGhlIHN1YmNsYXNzLgoKV2hlbiBvdmVycmlkaW5nIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIGFuZAo6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5jb21wYXJhdG9yYCBhbG9uZSBhcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZQpzdXBlcmNsYXNzLCB0aGVzZSBuYW1lcyBjb25mbGljdCB3aXRoIHRoZSBzYW1lLW5hbWVkIGFjY2Vzc29ycyBvbiB0aGUgY2xhc3MtCmxldmVsIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAgb2JqZWN0IHJldHVybmVkIGF0IHRoZSBjbGFzcyBsZXZlbC4gIFRvCm92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgd2hlbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIHBhcmVudCBjbGFzcyBkZXNjcmlwdG9yLAphZGQgdGhlIHNwZWNpYWwgcXVhbGlmaWVyIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5Lm92ZXJyaWRlc2AsIHdoaWNoIHdpbGwgZGUtCnJlZmVyZW5jZSB0aGUgaW5zdHJ1bWVudGVkIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBoeWJyaWQgb2JqZWN0OjoKCiAgICBjbGFzcyBGaXJzdE5hbWVMYXN0TmFtZShGaXJzdE5hbWVPbmx5KToKICAgICAgICAjIC4uLgoKICAgICAgICBsYXN0X25hbWUgPSBDb2x1bW4oU3RyaW5nKQoKICAgICAgICBARmlyc3ROYW1lT25seS5uYW1lLm92ZXJyaWRlcy5leHByZXNzaW9uCiAgICAgICAgZGVmIG5hbWUoY2xzKToKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY29uY2F0KGNscy5maXJzdF9uYW1lLCAnICcsIGNscy5sYXN0X25hbWUpCgouLiB2ZXJzaW9uYWRkZWQ6OiAxLjIgQWRkZWQgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuZ2V0dGVyYCBhcyB3ZWxsIGFzIHRoZQogICBhYmlsaXR5IHRvIHJlZGVmaW5lIGFjY2Vzc29ycyBwZXItc3ViY2xhc3MuCgoKSHlicmlkIFZhbHVlIE9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5vdGUgaW4gb3VyIHByZXZpb3VzIGV4YW1wbGUsIGlmIHdlIHdlcmUgdG8gY29tcGFyZSB0aGUgYGB3b3JkX2luc2Vuc2l0aXZlYGAKYXR0cmlidXRlIG9mIGEgYGBTZWFyY2hXb3JkYGAgaW5zdGFuY2UgdG8gYSBwbGFpbiBQeXRob24gc3RyaW5nLCB0aGUgcGxhaW4KUHl0aG9uIHN0cmluZyB3b3VsZCBub3QgYmUgY29lcmNlZCB0byBsb3dlciBjYXNlIC0gdGhlCmBgQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcmBgIHdlIGJ1aWx0LCBiZWluZyByZXR1cm5lZCBieQpgYEB3b3JkX2luc2Vuc2l0aXZlLmNvbXBhcmF0b3JgYCwgb25seSBhcHBsaWVzIHRvIHRoZSBTUUwgc2lkZS4KCkEgbW9yZSBjb21wcmVoZW5zaXZlIGZvcm0gb2YgdGhlIGN1c3RvbSBjb21wYXJhdG9yIGlzIHRvIGNvbnN0cnVjdCBhICpIeWJyaWQKVmFsdWUgT2JqZWN0Ki4gVGhpcyB0ZWNobmlxdWUgYXBwbGllcyB0aGUgdGFyZ2V0IHZhbHVlIG9yIGV4cHJlc3Npb24gdG8gYSB2YWx1ZQpvYmplY3Qgd2hpY2ggaXMgdGhlbiByZXR1cm5lZCBieSB0aGUgYWNjZXNzb3IgaW4gYWxsIGNhc2VzLiAgIFRoZSB2YWx1ZSBvYmplY3QKYWxsb3dzIGNvbnRyb2wgb2YgYWxsIG9wZXJhdGlvbnMgdXBvbiB0aGUgdmFsdWUgYXMgd2VsbCBhcyBob3cgY29tcGFyZWQgdmFsdWVzCmFyZSB0cmVhdGVkLCBib3RoIG9uIHRoZSBTUUwgZXhwcmVzc2lvbiBzaWRlIGFzIHdlbGwgYXMgdGhlIFB5dGhvbiB2YWx1ZSBzaWRlLgpSZXBsYWNpbmcgdGhlIHByZXZpb3VzIGBgQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcmBgIGNsYXNzIHdpdGggYSBuZXcKYGBDYXNlSW5zZW5zaXRpdmVXb3JkYGAgY2xhc3M6OgoKICAgIGNsYXNzIENhc2VJbnNlbnNpdGl2ZVdvcmQoQ29tcGFyYXRvcik6CiAgICAgICAgIkh5YnJpZCB2YWx1ZSByZXByZXNlbnRpbmcgYSBsb3dlciBjYXNlIHJlcHJlc2VudGF0aW9uIG9mIGEgd29yZC4iCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh3b3JkLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIHNlbGYud29yZCA9IHdvcmQubG93ZXIoKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uod29yZCwgQ2FzZUluc2Vuc2l0aXZlV29yZCk6CiAgICAgICAgICAgICAgICBzZWxmLndvcmQgPSB3b3JkLndvcmQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYud29yZCA9IGZ1bmMubG93ZXIod29yZCkKCiAgICAgICAgZGVmIG9wZXJhdGUoc2VsZiwgb3AsIG90aGVyKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIENhc2VJbnNlbnNpdGl2ZVdvcmQpOgogICAgICAgICAgICAgICAgb3RoZXIgPSBDYXNlSW5zZW5zaXRpdmVXb3JkKG90aGVyKQogICAgICAgICAgICByZXR1cm4gb3Aoc2VsZi53b3JkLCBvdGhlci53b3JkKQoKICAgICAgICBkZWYgX19jbGF1c2VfZWxlbWVudF9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi53b3JkCgogICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi53b3JkCgogICAgICAgIGtleSA9ICd3b3JkJwogICAgICAgICJMYWJlbCB0byBhcHBseSB0byBRdWVyeSB0dXBsZSByZXN1bHRzIgoKQWJvdmUsIHRoZSBgYENhc2VJbnNlbnNpdGl2ZVdvcmRgYCBvYmplY3QgcmVwcmVzZW50cyBgYHNlbGYud29yZGBgLCB3aGljaCBtYXkKYmUgYSBTUUwgZnVuY3Rpb24sIG9yIG1heSBiZSBhIFB5dGhvbiBuYXRpdmUuICAgQnkgb3ZlcnJpZGluZyBgYG9wZXJhdGUoKWBgIGFuZApgYF9fY2xhdXNlX2VsZW1lbnRfXygpYGAgdG8gd29yayBpbiB0ZXJtcyBvZiBgYHNlbGYud29yZGBgLCBhbGwgY29tcGFyaXNvbgpvcGVyYXRpb25zIHdpbGwgd29yayBhZ2FpbnN0IHRoZSAiY29udmVydGVkIiBmb3JtIG9mIGBgd29yZGBgLCB3aGV0aGVyIGl0IGJlClNRTCBzaWRlIG9yIFB5dGhvbiBzaWRlLiBPdXIgYGBTZWFyY2hXb3JkYGAgY2xhc3MgY2FuIG5vdyBkZWxpdmVyIHRoZQpgYENhc2VJbnNlbnNpdGl2ZVdvcmRgYCBvYmplY3QgdW5jb25kaXRpb25hbGx5IGZyb20gYSBzaW5nbGUgaHlicmlkIGNhbGw6OgoKICAgIGNsYXNzIFNlYXJjaFdvcmQoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICdzZWFyY2h3b3JkJwogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgd29yZCA9IENvbHVtbihTdHJpbmcoMjU1KSwgbnVsbGFibGU9RmFsc2UpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgd29yZF9pbnNlbnNpdGl2ZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZVdvcmQoc2VsZi53b3JkKQoKVGhlIGBgd29yZF9pbnNlbnNpdGl2ZWBgIGF0dHJpYnV0ZSBub3cgaGFzIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBiZWhhdmlvcgp1bml2ZXJzYWxseSwgaW5jbHVkaW5nIFNRTCBleHByZXNzaW9uIHZzLiBQeXRob24gZXhwcmVzc2lvbiAobm90ZSB0aGUgUHl0aG9uCnZhbHVlIGlzIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIG9uIHRoZSBQeXRob24gc2lkZSBoZXJlKTo6CgogICAgPj4+IHByaW50IFNlc3Npb24oKS5xdWVyeShTZWFyY2hXb3JkKS5maWx0ZXJfYnkod29yZF9pbnNlbnNpdGl2ZT0iVHJ1Y2tzIikKICAgIFNFTEVDVCBzZWFyY2h3b3JkLmlkIEFTIHNlYXJjaHdvcmRfaWQsIHNlYXJjaHdvcmQud29yZCBBUyBzZWFyY2h3b3JkX3dvcmQKICAgIEZST00gc2VhcmNod29yZAogICAgV0hFUkUgbG93ZXIoc2VhcmNod29yZC53b3JkKSA9IDpsb3dlcl8xCgpTUUwgZXhwcmVzc2lvbiB2ZXJzdXMgU1FMIGV4cHJlc3Npb246OgoKICAgID4+PiBzdzEgPSBhbGlhc2VkKFNlYXJjaFdvcmQpCiAgICA+Pj4gc3cyID0gYWxpYXNlZChTZWFyY2hXb3JkKQogICAgPj4+IHByaW50IFNlc3Npb24oKS5xdWVyeSgKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgc3cxLndvcmRfaW5zZW5zaXRpdmUsCiAgICAuLi4gICAgICAgICAgICAgICAgICAgIHN3Mi53b3JkX2luc2Vuc2l0aXZlKS5cCiAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoCiAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3cxLndvcmRfaW5zZW5zaXRpdmUgPiBzdzIud29yZF9pbnNlbnNpdGl2ZQogICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgU0VMRUNUIGxvd2VyKHNlYXJjaHdvcmRfMS53b3JkKSBBUyBsb3dlcl8xLAogICAgbG93ZXIoc2VhcmNod29yZF8yLndvcmQpIEFTIGxvd2VyXzIKICAgIEZST00gc2VhcmNod29yZCBBUyBzZWFyY2h3b3JkXzEsIHNlYXJjaHdvcmQgQVMgc2VhcmNod29yZF8yCiAgICBXSEVSRSBsb3dlcihzZWFyY2h3b3JkXzEud29yZCkgPiBsb3dlcihzZWFyY2h3b3JkXzIud29yZCkKClB5dGhvbiBvbmx5IGV4cHJlc3Npb246OgoKICAgID4+PiB3czEgPSBTZWFyY2hXb3JkKHdvcmQ9IlNvbWVXb3JkIikKICAgID4+PiB3czEud29yZF9pbnNlbnNpdGl2ZSA9PSAic09tRXdPckQiCiAgICBUcnVlCiAgICA+Pj4gd3MxLndvcmRfaW5zZW5zaXRpdmUgPT0gIlhPbUV3T3JYIgogICAgRmFsc2UKICAgID4+PiBwcmludCB3czEud29yZF9pbnNlbnNpdGl2ZQogICAgc29tZXdvcmQKClRoZSBIeWJyaWQgVmFsdWUgcGF0dGVybiBpcyB2ZXJ5IHVzZWZ1bCBmb3IgYW55IGtpbmQgb2YgdmFsdWUgdGhhdCBtYXkgaGF2ZQptdWx0aXBsZSByZXByZXNlbnRhdGlvbnMsIHN1Y2ggYXMgdGltZXN0YW1wcywgdGltZSBkZWx0YXMsIHVuaXRzIG9mCm1lYXN1cmVtZW50LCBjdXJyZW5jaWVzIGFuZCBlbmNyeXB0ZWQgcGFzc3dvcmRzLgoKLi4gc2VlYWxzbzo6CgogICAgYEh5YnJpZHMgYW5kIFZhbHVlIEFnbm9zdGljIFR5cGVzCiAgICA8aHR0cDovL3RlY2hzcG90Lnp6emVlay5vcmcvMjAxMS8xMC8yMS9oeWJyaWRzLWFuZC12YWx1ZS1hZ25vc3RpYy10eXBlcy8+YF8KICAgIC0gb24gdGhlIHRlY2hzcG90Lnp6emVlay5vcmcgYmxvZwoKICAgIGBWYWx1ZSBBZ25vc3RpYyBUeXBlcywgUGFydCBJSQogICAgPGh0dHA6Ly90ZWNoc3BvdC56enplZWsub3JnLzIwMTEvMTAvMjkvdmFsdWUtYWdub3N0aWMtdHlwZXMtcGFydC1paS8+YF8gLQogICAgb24gdGhlIHRlY2hzcG90Lnp6emVlay5vcmcgYmxvZwoKLi4gX2h5YnJpZF90cmFuc2Zvcm1lcnM6CgpCdWlsZGluZyBUcmFuc2Zvcm1lcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSAqdHJhbnNmb3JtZXIqIGlzIGFuIG9iamVjdCB3aGljaCBjYW4gcmVjZWl2ZSBhIDpjbGFzczpgLlF1ZXJ5YCBvYmplY3QgYW5kCnJldHVybiBhIG5ldyBvbmUuICAgVGhlIDpjbGFzczpgLlF1ZXJ5YCBvYmplY3QgaW5jbHVkZXMgYSBtZXRob2QKOm1ldGg6YC53aXRoX3RyYW5zZm9ybWF0aW9uYCB0aGF0IHJldHVybnMgYSBuZXcgOmNsYXNzOmAuUXVlcnlgIHRyYW5zZm9ybWVkIGJ5CnRoZSBnaXZlbiBmdW5jdGlvbi4KCldlIGNhbiBjb21iaW5lIHRoaXMgd2l0aCB0aGUgOmNsYXNzOmAuQ29tcGFyYXRvcmAgY2xhc3MgdG8gcHJvZHVjZSBvbmUgdHlwZQpvZiByZWNpcGUgd2hpY2ggY2FuIGJvdGggc2V0IHVwIHRoZSBGUk9NIGNsYXVzZSBvZiBhIHF1ZXJ5IGFzIHdlbGwgYXMgYXNzaWduCmZpbHRlcmluZyBjcml0ZXJpb24uCgpDb25zaWRlciBhIG1hcHBlZCBjbGFzcyBgYE5vZGVgYCwgd2hpY2ggYXNzZW1ibGVzIHVzaW5nIGFkamFjZW5jeSBsaXN0IGludG8gYQpoaWVyYXJjaGljYWwgdHJlZSBwYXR0ZXJuOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IENvbHVtbiwgSW50ZWdlciwgRm9yZWlnbktleQogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgcmVsYXRpb25zaGlwCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmRlY2xhcmF0aXZlIGltcG9ydCBkZWNsYXJhdGl2ZV9iYXNlCiAgICBCYXNlID0gZGVjbGFyYXRpdmVfYmFzZSgpCgogICAgY2xhc3MgTm9kZShCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ25vZGUnCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBwYXJlbnRfaWQgPSBDb2x1bW4oSW50ZWdlciwgRm9yZWlnbktleSgnbm9kZS5pZCcpKQogICAgICAgIHBhcmVudCA9IHJlbGF0aW9uc2hpcCgiTm9kZSIsIHJlbW90ZV9zaWRlPWlkKQoKU3VwcG9zZSB3ZSB3YW50ZWQgdG8gYWRkIGFuIGFjY2Vzc29yIGBgZ3JhbmRwYXJlbnRgYC4gIFRoaXMgd291bGQgcmV0dXJuIHRoZQpgYHBhcmVudGBgIG9mIGBgTm9kZS5wYXJlbnRgYC4gIFdoZW4gd2UgaGF2ZSBhbiBpbnN0YW5jZSBvZiBgYE5vZGVgYCwgdGhpcyBpcwpzaW1wbGU6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBoeWJyaWRfcHJvcGVydHkKCiAgICBjbGFzcyBOb2RlKEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5wYXJlbnQKCkZvciB0aGUgZXhwcmVzc2lvbiwgdGhpbmdzIGFyZSBub3Qgc28gY2xlYXIuICAgV2UnZCBuZWVkIHRvIGNvbnN0cnVjdCBhCjpjbGFzczpgLlF1ZXJ5YCB3aGVyZSB3ZSA6bWV0aDpgfi5RdWVyeS5qb2luYCB0d2ljZSBhbG9uZyBgYE5vZGUucGFyZW50YGAgdG8KZ2V0IHRvIHRoZSBgYGdyYW5kcGFyZW50YGAuICAgV2UgY2FuIGluc3RlYWQgcmV0dXJuIGEgdHJhbnNmb3JtaW5nIGNhbGxhYmxlCnRoYXQgd2UnbGwgY29tYmluZSB3aXRoIHRoZSA6Y2xhc3M6YC5Db21wYXJhdG9yYCBjbGFzcyB0byByZWNlaXZlIGFueQo6Y2xhc3M6YC5RdWVyeWAgb2JqZWN0LCBhbmQgcmV0dXJuIGEgbmV3IG9uZSB0aGF0J3Mgam9pbmVkIHRvIHRoZQpgYE5vZGUucGFyZW50YGAgYXR0cmlidXRlIGFuZCBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gY3JpdGVyaW9uOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0Lmh5YnJpZCBpbXBvcnQgQ29tcGFyYXRvcgoKICAgIGNsYXNzIEdyYW5kcGFyZW50VHJhbnNmb3JtZXIoQ29tcGFyYXRvcik6CiAgICAgICAgZGVmIG9wZXJhdGUoc2VsZiwgb3AsIG90aGVyKToKICAgICAgICAgICAgZGVmIHRyYW5zZm9ybShxKToKICAgICAgICAgICAgICAgIGNscyA9IHNlbGYuX19jbGF1c2VfZWxlbWVudF9fKCkKICAgICAgICAgICAgICAgIHBhcmVudF9hbGlhcyA9IGFsaWFzZWQoY2xzKQogICAgICAgICAgICAgICAgcmV0dXJuIHEuam9pbihwYXJlbnRfYWxpYXMsIGNscy5wYXJlbnQpLlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihvcChwYXJlbnRfYWxpYXMucGFyZW50LCBvdGhlcikpCiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0KCiAgICBCYXNlID0gZGVjbGFyYXRpdmVfYmFzZSgpCgogICAgY2xhc3MgTm9kZShCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ25vZGUnCiAgICAgICAgaWQgPUNvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHBhcmVudF9pZCA9IENvbHVtbihJbnRlZ2VyLCBGb3JlaWduS2V5KCdub2RlLmlkJykpCiAgICAgICAgcGFyZW50ID0gcmVsYXRpb25zaGlwKCJOb2RlIiwgcmVtb3RlX3NpZGU9aWQpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5wYXJlbnQKCiAgICAgICAgQGdyYW5kcGFyZW50LmNvbXBhcmF0b3IKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoY2xzKToKICAgICAgICAgICAgcmV0dXJuIEdyYW5kcGFyZW50VHJhbnNmb3JtZXIoY2xzKQoKVGhlIGBgR3JhbmRwYXJlbnRUcmFuc2Zvcm1lcmBgIG92ZXJyaWRlcyB0aGUgY29yZSA6bWV0aDpgLk9wZXJhdG9ycy5vcGVyYXRlYAptZXRob2QgYXQgdGhlIGJhc2Ugb2YgdGhlIDpjbGFzczpgLkNvbXBhcmF0b3JgIGhpZXJhcmNoeSB0byByZXR1cm4gYSBxdWVyeS0KdHJhbnNmb3JtaW5nIGNhbGxhYmxlLCB3aGljaCB0aGVuIHJ1bnMgdGhlIGdpdmVuIGNvbXBhcmlzb24gb3BlcmF0aW9uIGluIGEKcGFydGljdWxhciBjb250ZXh0LiBTdWNoIGFzLCBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGBgb3BlcmF0ZWBgIG1ldGhvZCBpcwpjYWxsZWQsIGdpdmVuIHRoZSA6YXR0cjpgLk9wZXJhdG9ycy5lcWAgY2FsbGFibGUgYXMgd2VsbCBhcyB0aGUgcmlnaHQgc2lkZSBvZgp0aGUgY29tcGFyaXNvbiBgYE5vZGUoaWQ9NSlgYC4gIEEgZnVuY3Rpb24gYGB0cmFuc2Zvcm1gYCBpcyB0aGVuIHJldHVybmVkIHdoaWNoCndpbGwgdHJhbnNmb3JtIGEgOmNsYXNzOmAuUXVlcnlgIGZpcnN0IHRvIGpvaW4gdG8gYGBOb2RlLnBhcmVudGBgLCB0aGVuIHRvCmNvbXBhcmUgYGBwYXJlbnRfYWxpYXNgYCB1c2luZyA6YXR0cjpgLk9wZXJhdG9ycy5lcWAgYWdhaW5zdCB0aGUgbGVmdCBhbmQgcmlnaHQKc2lkZXMsIHBhc3NpbmcgaW50byA6Y2xhc3M6YC5RdWVyeS5maWx0ZXJgOgoKLi4gc291cmNlY29kZTo6IHB5Y29uK3NxbAoKICAgID4+PiBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBTZXNzaW9uCiAgICA+Pj4gc2Vzc2lvbiA9IFNlc3Npb24oKQogICAge3NxbH0+Pj4gc2Vzc2lvbi5xdWVyeShOb2RlKS5cCiAgICAuLi4gICAgICAgIHdpdGhfdHJhbnNmb3JtYXRpb24oTm9kZS5ncmFuZHBhcmVudD09Tm9kZShpZD01KSkuXAogICAgLi4uICAgICAgICBhbGwoKQogICAgU0VMRUNUIG5vZGUuaWQgQVMgbm9kZV9pZCwgbm9kZS5wYXJlbnRfaWQgQVMgbm9kZV9wYXJlbnRfaWQKICAgIEZST00gbm9kZSBKT0lOIG5vZGUgQVMgbm9kZV8xIE9OIG5vZGVfMS5pZCA9IG5vZGUucGFyZW50X2lkCiAgICBXSEVSRSA6cGFyYW1fMSA9IG5vZGVfMS5wYXJlbnRfaWQKICAgIHtzdG9wfQoKV2UgY2FuIG1vZGlmeSB0aGUgcGF0dGVybiB0byBiZSBtb3JlIHZlcmJvc2UgYnV0IGZsZXhpYmxlIGJ5IHNlcGFyYXRpbmcgdGhlCiJqb2luIiBzdGVwIGZyb20gdGhlICJmaWx0ZXIiIHN0ZXAuICBUaGUgdHJpY2t5IHBhcnQgaGVyZSBpcyBlbnN1cmluZyB0aGF0CnN1Y2Nlc3NpdmUgaW5zdGFuY2VzIG9mIGBgR3JhbmRwYXJlbnRUcmFuc2Zvcm1lcmBgIHVzZSB0aGUgc2FtZQo6Y2xhc3M6YC5BbGlhc2VkQ2xhc3NgIG9iamVjdCBhZ2FpbnN0IGBgTm9kZWBgLiAgQmVsb3cgd2UgdXNlIGEgc2ltcGxlCm1lbW9pemluZyBhcHByb2FjaCB0aGF0IGFzc29jaWF0ZXMgYSBgYEdyYW5kcGFyZW50VHJhbnNmb3JtZXJgYCB3aXRoIGVhY2gKY2xhc3M6OgoKICAgIGNsYXNzIE5vZGUoQmFzZSk6CgogICAgICAgICMgLi4uCgogICAgICAgIEBncmFuZHBhcmVudC5jb21wYXJhdG9yCiAgICAgICAgZGVmIGdyYW5kcGFyZW50KGNscyk6CiAgICAgICAgICAgICMgbWVtb2l6ZSBhIEdyYW5kcGFyZW50VHJhbnNmb3JtZXIKICAgICAgICAgICAgIyBwZXIgY2xhc3MKICAgICAgICAgICAgaWYgJ19ncCcgbm90IGluIGNscy5fX2RpY3RfXzoKICAgICAgICAgICAgICAgIGNscy5fZ3AgPSBHcmFuZHBhcmVudFRyYW5zZm9ybWVyKGNscykKICAgICAgICAgICAgcmV0dXJuIGNscy5fZ3AKCiAgICBjbGFzcyBHcmFuZHBhcmVudFRyYW5zZm9ybWVyKENvbXBhcmF0b3IpOgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY2xzKToKICAgICAgICAgICAgc2VsZi5wYXJlbnRfYWxpYXMgPSBhbGlhc2VkKGNscykKCiAgICAgICAgQHByb3BlcnR5CiAgICAgICAgZGVmIGpvaW4oc2VsZik6CiAgICAgICAgICAgIGRlZiBnbyhxKToKICAgICAgICAgICAgICAgIHJldHVybiBxLmpvaW4oc2VsZi5wYXJlbnRfYWxpYXMsIE5vZGUucGFyZW50KQogICAgICAgICAgICByZXR1cm4gZ28KCiAgICAgICAgZGVmIG9wZXJhdGUoc2VsZiwgb3AsIG90aGVyKToKICAgICAgICAgICAgcmV0dXJuIG9wKHNlbGYucGFyZW50X2FsaWFzLnBhcmVudCwgb3RoZXIpCgouLiBzb3VyY2Vjb2RlOjogcHljb24rc3FsCgogICAge3NxbH0+Pj4gc2Vzc2lvbi5xdWVyeShOb2RlKS5cCiAgICAuLi4gICAgICAgICAgICB3aXRoX3RyYW5zZm9ybWF0aW9uKE5vZGUuZ3JhbmRwYXJlbnQuam9pbikuXAogICAgLi4uICAgICAgICAgICAgZmlsdGVyKE5vZGUuZ3JhbmRwYXJlbnQ9PU5vZGUoaWQ9NSkpCiAgICBTRUxFQ1Qgbm9kZS5pZCBBUyBub2RlX2lkLCBub2RlLnBhcmVudF9pZCBBUyBub2RlX3BhcmVudF9pZAogICAgRlJPTSBub2RlIEpPSU4gbm9kZSBBUyBub2RlXzEgT04gbm9kZV8xLmlkID0gbm9kZS5wYXJlbnRfaWQKICAgIFdIRVJFIDpwYXJhbV8xID0gbm9kZV8xLnBhcmVudF9pZAogICAge3N0b3B9CgpUaGUgInRyYW5zZm9ybWVyIiBwYXR0ZXJuIGlzIGFuIGV4cGVyaW1lbnRhbCBwYXR0ZXJuIHRoYXQgc3RhcnRzIHRvIG1ha2UgdXNhZ2UKb2Ygc29tZSBmdW5jdGlvbmFsIHByb2dyYW1taW5nIHBhcmFkaWdtcy4gV2hpbGUgaXQncyBvbmx5IHJlY29tbWVuZGVkIGZvcgphZHZhbmNlZCBhbmQvb3IgcGF0aWVudCBkZXZlbG9wZXJzLCB0aGVyZSdzIHByb2JhYmx5IGEgd2hvbGUgbG90IG9mIGFtYXppbmcKdGhpbmdzIGl0IGNhbiBiZSB1c2VkIGZvci4KCukCAAAAKQHaBHV0aWwpAdoKYXR0cmlidXRlcykB2gppbnRlcmZhY2Vz2g1IWUJSSURfTUVUSE9E2g9IWUJSSURfUFJPUEVSVFljAAAAAAAAAAAAAAAAAwAAAEAAAABzMgAAAGUAWgFkAFoCZAFaA2QCWgRlBVoGZApkBGQFhAFaB2QGZAeEAFoIZAhkCYQAWglkA1MAKQvaDWh5YnJpZF9tZXRob2R6ekEgZGVjb3JhdG9yIHdoaWNoIGFsbG93cyBkZWZpbml0aW9uIG9mIGEgUHl0aG9uIG9iamVjdCBtZXRob2Qgd2l0aCBib3RoCiAgICBpbnN0YW5jZS1sZXZlbCBhbmQgY2xhc3MtbGV2ZWwgYmVoYXZpb3IuCgogICAgVE5jAwAAAAAAAAADAAAAAwAAAEMAAABzGAAAAHwBfABfAHwAoAF8AnAQfAGhAQEAZAFTACkCYb4BAABDcmVhdGUgYSBuZXcgOmNsYXNzOmAuaHlicmlkX21ldGhvZGAuCgogICAgICAgIFVzYWdlIGlzIHR5cGljYWxseSB2aWEgZGVjb3JhdG9yOjoKCiAgICAgICAgICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBoeWJyaWRfbWV0aG9kCgogICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3Mob2JqZWN0KToKICAgICAgICAgICAgICAgIEBoeWJyaWRfbWV0aG9kCiAgICAgICAgICAgICAgICBkZWYgdmFsdWUoc2VsZiwgeCwgeSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlICsgeCAr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dXBkYXRl2gR0eXBlKQNyCgAAANoCa3faCGRlZmF1bHRzcgwAAAByDAAAAHINAAAA2gVfY29weYsDAABzCAAAAAABBgIOAwwBehVoeWJyaWRfcHJvcGVydHkuX2NvcHljAQAAAAAAAAABAAAAAQAAAEMAAABzBAAAAHwAUwApAWEiBAAAUHJlZml4IGZvciBhIG1ldGhvZCB0aGF0IGlzIG92ZXJyaWRpbmcgYW4gZXhpc3RpbmcgYXR0cmlidXRlLgoKICAgICAgICBUaGUgOmF0dHI6YC5oeWJyaWRfcHJvcGVydHkub3ZlcnJpZGVzYCBhY2Nlc3NvciBqdXN0IHJldHVybnMKICAgICAgICB0aGlzIGh5YnJpZCBvYmplY3QsIHdoaWNoIHdoZW4gY2FsbGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBmcm9tCiAgICAgICAgYSBwYXJlbnQgY2xhc3MsIHdpbGwgZGUtcmVmZXJlbmNlIHRoZSAiaW5zdHJ1bWVudGVkIGF0dHJpYnV0ZSIKICAgICAgICBub3JtYWxseSByZXR1cm5lZCBhdCB0aGlzIGxldmVsLCBhbmQgYWxsb3cgbW9kaWZ5aW5nIGRlY29yYXRvcnMKICAgICAgICBsaWtlIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIGFuZAogICAgICAgIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmNvbXBhcmF0b3JgCiAgICAgICAgdG8gYmUgdXNlZCB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIHNhbWUtbmFtZWQgYXR0cmlidXRlcwogICAgICAgIG5vcm1hbGx5IHByZXNlbnQgb24gdGhlIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWA6OgoKICAgICAgICAgICAgY2xhc3MgU3VwZXJDbGFzcyhvYmplY3QpOgogICAgICAgICAgICAgICAgIyAuLi4KCiAgICAgICAgICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgICAgICAgICBkZWYgZm9vYmFyKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mb29iYXIKCiAgICAgICAgICAgIGNsYXNzIFN1YkNsYXNzKFN1cGVyQ2xhc3MpOgogICAgICAgICAgICAgICAgIyAuLi4KCiAgICAgICAgICAgICAgICBAU3VwZXJDbGFzcy5mb29iYXIub3ZlcnJpZGVzLmV4cHJlc3Npb24KICAgICAgICAgICAgICAgIGRlZiBmb29iYXIoY2xzKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5zdWJmb29iYXIoc2VsZi5fZm9vYmFyKQoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjIKCiAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBoeWJyaWRfcmV1c2Vfc3ViY2xhc3NgCgogICAgICAgICByDAAAACkBcgoAAAByDAAAAHIMAAAAcg0AAADaCW92ZXJyaWRlc5QDAABzAgAAAAAiehloeWJyaWRfcHJvcGVydHkub3ZlcnJpZGVzYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB8AGoAfAFkAY0BUwApAnpkUHJvdmlkZSBhIG1vZGlmeWluZyBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIGEgZ2V0dGVyIG1ldGhvZC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4yCgogICAgICAgICkBchoAAAApAXIwAAAAKQJyCgAAAHIaAAAAcgwAAAByDAAAAHINAAAA2gZnZXR0ZXK4AwAAcwIAAAAAB3oWaHlicmlkX3Byb3BlcnR5LmdldHRlcmMCAAAAAAAAAAIAAAADAAAAQwAAAHMMAAAAfABqAHwBZAGNAVMAKQJ6O1Byb3ZpZGUgYSBtb2RpZnlpbmcgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBhIHNldHRlciBtZXRob2QuKQFyGwAAACkBcjAAAAApAnIKAAAAchsAAAByDAAAAHIMAAAAcg0AAADaBnNldHRlcsEDAABzAgAAAAADehZoeWJyaWRfcHJvcGVydHkuc2V0dGVyYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB8AGoAfAFkAY0BUwApAno9UHJvdmlkZSBhIG1vZGlmeWluZyBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIGEgZGVsZXRpb24gbWV0aG9kLikBchwAAAApAXIwAAAAKQJyCgAAAHIcAAAAcgwAAAByDAAAAHINAAAA2gdkZWxldGVyxgMAAHMCAAAAAAN6F2h5YnJpZF9wcm9wZXJ0eS5kZWxldGVyYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB8AGoAfAFkAY0BUwApAmEhBQAAUHJvdmlkZSBhIG1vZGlmeWluZyBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIGEgU1FMLWV4cHJlc3Npb24KICAgICAgICBwcm9kdWNpbmcgbWV0aG9kLgoKICAgICAgICBXaGVuIGEgaHlicmlkIGlzIGludm9rZWQgYXQgdGhlIGNsYXNzIGxldmVsLCB0aGUgU1FMIGV4cHJlc3Npb24gZ2l2ZW4KICAgICAgICBoZXJlIGlzIHdyYXBwZWQgaW5zaWRlIG9mIGEgc3BlY2lhbGl6ZWQgOmNsYXNzOmAuUXVlcnlhYmxlQXR0cmlidXRlYCwKICAgICAgICB3aGljaCBpcyB0aGUgc2FtZSBraW5kIG9mIG9iamVjdCB1c2VkIGJ5IHRoZSBPUk0gdG8gcmVwcmVzZW50IG90aGVyCiAgICAgICAgbWFwcGVkIGF0dHJpYnV0ZXMuICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBzbyB0aGF0IG90aGVyIGNsYXNzLWxldmVsCiAgICAgICAgYXR0cmlidXRlcyBzdWNoIGFzIGRvY3N0cmluZ3MgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBoeWJyaWQgaXRzZWxmIG1heQogICAgICAgIGJlIG1haW50YWluZWQgd2l0aGluIHRoZSBzdHJ1Y3R1cmUgdGhhdCdzIHJldHVybmVkLCB3aXRob3V0IGFueQogICAgICAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG9yaWdpbmFsIFNRTCBleHByZXNzaW9uIHBhc3NlZCBpbi4KCiAgICAgICAgLi4gbm90ZTo6CgogICAgICAgICAgIHdoZW4gcmVmZXJyaW5nIHRvIGEgaHlicmlkIHByb3BlcnR5ICBmcm9tIGFuIG93bmluZyBjbGFzcyAoZS5nLgogICAgICAgICAgIGBgU29tZUNsYXNzLnNvbWVfaHlicmlkYGApLCBhbiBpbnN0YW5jZSBvZgogICAgICAgICAgIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAgaXMgcmV0dXJuZWQsIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICBleHByZXNzaW9uIG9yIGNvbXBhcmF0b3Igb2JqZWN0IGFzIHdlbGwgYXMgdGhpcyAgaHlicmlkIG9iamVjdC4KICAgICAgICAgICBIb3dldmVyLCB0aGF0IG9iamVjdCBpdHNlbGYgaGFzIGFjY2Vzc29ycyBjYWxsZWQgYGBleHByZXNzaW9uYGAgYW5kCiAgICAgICAgICAgYGBjb21wYXJhdG9yYGA7IHNvIHdoZW4gYXR0ZW1wdGluZyB0byBvdmVycmlkZSB0aGVzZSBkZWNvcmF0b3JzIG9uIGEKICAgICAgICAgICBzdWJjbGFzcywgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBxdWFsaWZ5IGl0IHVzaW5nIHRoZQogICAgICAgICAgIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5Lm92ZXJyaWRlc2AgbW9kaWZpZXIgZmlyc3QuICBTZWUgdGhhdAogICAgICAgICAgIG1vZGlmaWVyIGZvciBkZXRhaWxzLgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGh5YnJpZF9kaXN0aW5jdF9leHByZXNzaW9uYAoKICAgICAgICApAXILAAAAKQFyMAAAACkCcgoAAAByCwAAAHIMAAAAcgwAAAByDQAAAHIJAAAAywMAAHMCAAAAAB56Gmh5YnJpZF9wcm9wZXJ0eS5leHByZXNzaW9uYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB8AGoAfAFkAY0BUwApAmEvBgAAUHJvdmlkZSBhIG1vZGlmeWluZyBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIGEgY3VzdG9tCiAgICAgICAgY29tcGFyYXRvciBwcm9kdWNpbmcgbWV0aG9kLgoKICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkZWNvcmF0ZWQgbWV0aG9kIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZgogICAgICAgIDpjbGFzczpgfi5oeWJyaWQuQ29tcGFyYXRvcmAuCgogICAgICAgIC4uIG5vdGU6OiAgVGhlIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmNvbXBhcmF0b3JgIGRlY29yYXRvcgogICAgICAgICAgICoqcmVwbGFjZXMqKiB0aGUgdXNlIG9mIHRoZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5leHByZXNzaW9uYAogICAgICAgICAgIGRlY29yYXRvci4gIFRoZXkgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCgogICAgICAgIFdoZW4gYSBoeWJyaWQgaXMgaW52b2tlZCBhdCB0aGUgY2xhc3MgbGV2ZWwsIHRoZQogICAgICAgIDpjbGFzczpgfi5oeWJyaWQuQ29tcGFyYXRvcmAgb2JqZWN0IGdpdmVuIGhlcmUgaXMgd3JhcHBlZCBpbnNpZGUgb2YgYQogICAgICAgIHNwZWNpYWxpemVkIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAsIHdoaWNoIGlzIHRoZSBzYW1lIGtpbmQgb2YKICAgICAgICBvYmplY3QgdXNlZCBieSB0aGUgT1JNIHRvIHJlcHJlc2VudCBvdGhlciBtYXBwZWQgYXR0cmlidXRlcy4gICBUaGUKICAgICAgICByZWFzb24gZm9yIHRoaXMgaXMgc28gdGhhdCBvdGhlciBjbGFzcy1sZXZlbCBhdHRyaWJ1dGVzIHN1Y2ggYXMKICAgICAgICBkb2NzdHJpbmdzIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgaHlicmlkIGl0c2VsZiBtYXkgYmUgbWFpbnRhaW5lZAogICAgICAgIHdpdGhpbiB0aGUgc3RydWN0dXJlIHRoYXQncyByZXR1cm5lZCwgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUKICAgICAgICBvcmlnaW5hbCBjb21wYXJhdG9yIG9iamVjdCBwYXNzZWQgaW4uCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICB3aGVuIHJlZmVycmluZyB0byBhIGh5YnJpZCBwcm9wZXJ0eSAgZnJvbSBhbiBvd25pbmcgY2xhc3MgKGUuZy4KICAgICAgICAgICBgYFNvbWVDbGFzcy5zb21lX2h5YnJpZGBgKSwgYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICA6Y2xhc3M6YC5RdWVyeWFibGVBdHRyaWJ1dGVgIGlzIHJldHVybmVkLCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgZXhwcmVzc2lvbiBvciBjb21wYXJhdG9yIG9iamVjdCBhcyB0aGlzICBoeWJyaWQgb2JqZWN0LiAgSG93ZXZlciwKICAgICAgICAgICB0aGF0IG9iamVjdCBpdHNlbGYgaGFzIGFjY2Vzc29ycyBjYWxsZWQgYGBleHByZXNzaW9uYGAgYW5kCiAgICAgICAgICAgYGBjb21wYXJhdG9yYGA7IHNvIHdoZW4gYXR0ZW1wdGluZyB0byBvdmVycmlkZSB0aGVzZSBkZWNvcmF0b3JzIG9uIGEKICAgICAgICAgICBzdWJjbGFzcywgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBxdWFsaWZ5IGl0IHVzaW5nIHRoZQogICAgICAgICAgIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5Lm92ZXJyaWRlc2AgbW9kaWZpZXIgZmlyc3QuICBTZWUgdGhhdAogICAgICAgICAgIG1vZGlmaWVyIGZvciBkZXRhaWxzLgoKICAgICAgICApAXIdAAAAKQFyMAAAACkCcgoAAADaCmNvbXBhcmF0b3JyDAAAAHIMAAAAcg0AAAByNQAAAOsDAABzAgAAAAAhehpoeWJyaWRfcHJvcGVydHkuY29tcGFyYXRvcmMCAAAAAAAAAAIAAAADAAAAQwAAAHMMAAAAfABqAHwBZAGNAVMAKQJhTQQAAFByb3ZpZGUgYSBtb2RpZnlpbmcgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBhbiBVUERBVEUgdHVwbGUKICAgICAgICBwcm9kdWNpbmcgbWV0aG9kLgoKICAgICAgICBUaGUgbWV0aG9kIGFjY2VwdHMgYSBzaW5nbGUgdmFsdWUsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBiZQogICAgICAgIHJlbmRlcmVkIGludG8gdGhlIFNFVCBjbGF1c2Ugb2YgYW4gVVBEQVRFIHN0YXRlbWVudC4gIFRoZSBtZXRob2QKICAgICAgICBzaG91bGQgdGhlbiBwcm9jZXNzIHRoaXMgdmFsdWUgaW50byBpbmRpdmlkdWFsIGNvbHVtbiBleHByZXNzaW9ucwogICAgICAgIHRoYXQgZml0IGludG8gdGhlIHVsdGltYXRlIFNFVCBjbGF1c2UsIGFuZCByZXR1cm4gdGhlbSBhcyBhCiAgICAgICAgc2VxdWVuY2Ugb2YgMi10dXBsZXMuICBFYWNoIHR1cGxlCiAgICAgICAgY29udGFpbnMgYSBjb2x1bW4gZXhwcmVzc2lvbiBhcyB0aGUga2V5IGFuZCBhIHZhbHVlIHRvIGJlIHJlbmRlcmVkLgoKICAgICAgICBFLmcuOjoKCiAgICAgICAgICAgIGNsYXNzIFBlcnNvbihCYXNlKToKICAgICAgICAgICAgICAgICMgLi4uCgogICAgICAgICAgICAgICAgZmlyc3RfbmFtZSA9IENvbHVtbihTdHJpbmcpCiAgICAgICAgICAgICAgICBsYXN0X25hbWUgPSBDb2x1bW4oU3RyaW5nKQoKICAgICAgICAgICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICAgICAgICAgIGRlZiBmdWxsbmFtZShzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RfbmFtZSArICIgIiArIGxhc3RfbmFtZQoKICAgICAgICAgICAgICAgIEBmdWxsbmFtZS51cGRhdGVfZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgZGVmIGZ1bGxuYW1lKGNscywgdmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGZuYW1lLCBsbmFtZSA9IHZhbHVlLnNwbGl0KCIgIiwgMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAoY2xzLmZpcnN0X25hbWUsIGZuYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgKGNscy5sYXN0X25hbWUsIGxuYW1lKQogICAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4yCgogICAgICAgICkBch4AAAApAXIwAAAAKQJyCgAAANoEbWV0aHIMAAAAcgwAAAByDQAAANoRdXBkYXRlX2V4cHJlc3Npb24OBAAAcwIAAAAAInohaHlicmlkX3Byb3BlcnR5LnVwZGF0ZV9leHByZXNzaW9uYwEAAAAAAAAAAQAAAAMAAABDAAAAczwAAAB8AGoAZABrCXIWfACgAXwAagChAVMAfABqAmQAawlyLHwAoAN8AGoCoQFTAHwAoAN8AGoEoQFTAGQAUwApAU4pBXIdAAAA2g9fZ2V0X2NvbXBhcmF0b3JyCwAAANoJX2dldF9leHBychoAAAApAXIKAAAAcgwAAAByDAAAAHINAAAAciAAAAAyBAAAcwoAAAAAAgoBDAEKAQwCeiBoeWJyaWRfcHJvcGVydHkuX2V4cHJfY29tcGFyYXRvcmMCAAAAAAAAAAMAAAAEAAAAAwAAAHMkAAAAhwCHAWYCZAFkAoQIfQJ0AKABfAKIAKECAQCIAaACfAKhAVMAKQNOYwEAAAAAAAAAAQAAAAQAAAATAAAAcxAAAAB0AHwAiAB8AIMBiAGDA1MAKQFOKQHaDkV4cHJDb21wYXJhdG9yKQHaA2NscykCcgsAAAByCgAAAHIMAAAAcg0AAADaBV9leHByPAQAAHMCAAAAAAF6KGh5YnJpZF9wcm9wZXJ0eS5fZ2V0X2V4cHIuPGxvY2Fscz4uX2V4cHIpA3ICAAAAch8AAAByOAAAACkDcgoAAAByCwAAAHI8AAAAcgwAAAApAnILAAAAcgoAAAByDQAAAHI5AAAAOwQAAHMGAAAAAAEOAwwCehloeWJyaWRfcHJvcGVydHkuX2dldF9leHByYwIAAAAAAAAAAwAAAAMAAAADAAAAcx4AAAB0AKABiAKhAYkBhwCHAYcCZgNkAWQChAh9AnwCUwApA05jAQAAAAAAAAABAAAABwAAABMAAABzIAAAAIgBfACIAmoAiAKIAHwAgwGIAGoBcBqIAmoBZAGNBVMAKQJOKQHaA2RvYykCchQAAAByEwAAACkBchIAAAApA3I1AAAA2gpwcm94eV9hdHRycgoAAAByDAAAAHINAAAA2g9leHByX2NvbXBhcmF0b3JHBAAAcwwAAAAAAQIBAgEEAQIBBgF6OGh5YnJpZF9wcm9wZXJ0eS5fZ2V0X2NvbXBhcmF0b3IuPGxvY2Fscz4uZXhwcl9jb21wYXJhdG9yKQJyAwAAAFoYY3JlYXRlX3Byb3hpZWRfYXR0cmlidXRlKQNyCgAAAHI1AAAAcj8AAAByDAAAACkDcjUAAAByPgAAAHIKAAAAcg0AAAByOAAAAEMEAABzBgAAAAACCgIQCXofaHlicmlkX3Byb3BlcnR5Ll9nZXRfY29tcGFyYXRvcikFTk5OTk4pGXIUAAAAchUAAAByFgAAAHITAAAAchcAAAByBgAAAHIYAAAAcg4AAAByDwAAAHIjAAAAciQAAAByMAAAANoIcHJvcGVydHlyMQAAAHIyAAAAcjMAAAByNAAAAHIJAAAAcjUAAAByNwAAAHICAAAAWhFtZW1vaXplZF9wcm9wZXJ0eXIgAAAAcjkAAAByOAAAAHIMAAAAcgwAAAByDAAAAHINAAAAchkAAABRAwAAcywAAAAIBAQCBAEEBQABAAEAAQABChoIBggFCAUICQwkCAkIBQgFCCAIIwgkDgkICHIZAAAAYwAAAAAAAAAAAAAAAAIAAABAAAAAcywAAABlAFoBZABaAmQBWgNkAloEZANkBIQAWgVkBWQGhABaBmQHZAiEAFoHZAJTACkJ2gpDb21wYXJhdG9yeodBIGhlbHBlciBjbGFzcyB0aGF0IGFsbG93cyBlYXN5IGNvbnN0cnVjdGlvbiBvZiBjdXN0b20KICAgIDpjbGFzczpgfi5vcm0uaW50ZXJmYWNlcy5Qcm9wQ29tcGFyYXRvcmAKICAgIGNsYXNzZXMgZm9yIHVzYWdlIHdpdGggaHlicmlkcy5OYwIAAAAAAAAAAgAAAAIAAABDAAAAcwoAAAB8AXwAXwBkAFMAKQFOKQFyCQAAACkCcgoAAAByCQAAAHIMAAAAcgwAAAByDQAAAHIOAAAAWgQAAHMCAAAAAAF6E0NvbXBhcmF0b3IuX19pbml0X19jAQAAAAAAAAACAAAAAwAAAEMAAABzHAAAAHwAagB9AXQBfAFkAYMCchh8AaACoQB9AXwBUwApAk7aEl9fY2xhdXNlX2VsZW1lbnRfXykDcgkAAADaB2hhc2F0dHJyQgAAACkCcgoAAAByCwAAAHIMAAAAcgwAAAByDQAAAHJCAAAAXQQAAHMIAAAAAAEGAQoBCAF6HUNvbXBhcmF0b3IuX19jbGF1c2VfZWxlbWVudF9fYwIAAAAAAAAAAgAAAAEAAABDAAAAcwQAAAB8AFMAKQFOcgwAAAApAnIKAAAA2g9hZGFwdF90b19lbnRpdHlyDAAAAHIMAAAAcg0AAAByRAAAAGMEAABzAgAAAAACehpDb21wYXJhdG9yLmFkYXB0X3RvX2VudGl0eSkIchQAAAByFQAAAHIWAAAAchMAAAByQAAAAHIOAAAAckIAAAByRAAAAHIMAAAAcgwAAAByDAAAAHINAAAAckEAAABTBAAAcwoAAAAIAwQCBAIIAwgGckEAAABjAAAAAAAAAAAAAAAAAwAAAEAAAABzTAAAAGUAWgFkAFoCZAFkAoQAWgNkA2QEhABaBGUFZAVkBoQAgwFaBmQHZAiEAFoHZQVkCWQKhACDAVoFZAtkDIQAWghkDWQOhABaCWQPUwApEHI6AAAAYwQAAAAAAAAABAAAAAIAAABDAAAAcxYAAAB8AXwAXwB8AnwAXwF8A3wAXwJkAFMAKQFOKQNyOwAAAHIJAAAA2gZoeWJyaWQpBHIKAAAAcjsAAAByCQAAAHJFAAAAcgwAAAByDAAAAHINAAAAcg4AAABpBAAAcwYAAAAAAQYBBgF6F0V4cHJDb21wYXJhdG9yLl9faW5pdF9fYwIAAAAAAAAAAgAAAAMAAABDAAAAcwwAAAB0AHwAagF8AYMCUwApAU4pAtoHZ2V0YXR0cnIJAAAAKQJyCgAAAHIoAAAAcgwAAAByDAAAAHINAAAA2gtfX2dldGF0dHJfX24EAABzAgAAAAABehpFeHByQ29tcGFyYXRvci5fX2dldGF0dHJfX2MBAAAAAAAAAAEAAAABAAAAQwAAAHMIAAAAfABqAGoBUwApAU4pAnJFAAAA2gRpbmZvKQFyCgAAAHIMAAAAcgwAAAByDQAAAHJIAAAAcQQAAHMCAAAAAAJ6E0V4cHJDb21wYXJhdG9yLmluZm9jAgAAAAAAAAACAAAABAAAAEMAAABzRgAAAHQAfABqAXQCagODAnIafABqAaAEfAGhAVMAfABqBWoGZABrCXI2fABqBaAGfABqB3wBoQJTAHwAagF8AWYCZwFTAGQAUwApAU4pCNoKaXNpbnN0YW5jZXIJAAAAcgMAAABaElF1ZXJ5YWJsZUF0dHJpYnV0ZdoTX2J1bGtfdXBkYXRlX3R1cGxlc3JFAAAAch4AAAByOwAAACkCcgoAAAByIgAAAHIMAAAAcgwAAAByDQAAAHJKAAAAdQQAAHMKAAAAAAEOAQwBDAEQAnoiRXhwckNvbXBhcmF0b3IuX2J1bGtfdXBkYXRlX3R1cGxlc2MBAAAAAAAAAAEAAAABAAAAQwAAAHMIAAAAfABqAGoBUwApAU4pAnIJAAAAckAAAAApAXIKAAAAcgwAAAByDAAAAHINAAAAckAAAAB9BAAAcwIAAAAAAnoXRXhwckNvbXBhcmF0b3IucHJvcGVydHljAgAAAAAAAAAEAAAAAwAAAE8AAABzEgAAAHwBfABqAGYBfAKeAnwDjgFTACkBTikBcgkAAAApBHIKAAAA2gJvcNoFb3RoZXLaBmt3YXJnc3IMAAAAcgwAAAByDQAAANoHb3BlcmF0ZYEEAABzAgAAAAABehZFeHByQ29tcGFyYXRvci5vcGVyYXRlYwMAAAAAAAAABAAAAAMAAABLAAAAcxAAAAB8AXwCfABqAGYCfAOOAVMAKQFOKQFyCQAAACkEcgoAAABySwAAAHJMAAAAck0AAAByDAAAAHIMAAAAcg0AAADaD3JldmVyc2Vfb3BlcmF0ZYQEAABzAgAAAAABeh5FeHByQ29tcGFyYXRvci5yZXZlcnNlX29wZXJhdGVOKQpyFAAAAHIVAAAAchYAAAByDgAAAHJHAAAAckAAAABySAAAAHJKAAAAck4AAAByTwAAAHIMAAAAcgwAAAByDAAAAHINAAAAcjoAAABoBAAAcw4AAAAIAQgFCAMMBAgIDAQIA3I6AAAATikPchMAAADaAHICAAAAWgNvcm1yAwAAAHIEAAAA2gZzeW1ib2xyBQAAAHIGAAAAWhJJbnNwZWN0aW9uQXR0ckluZm9yBwAAAHIZAAAAWg5Qcm9wQ29tcGFyYXRvcnJBAAAAcjoAAAByDAAAAHIMAAAAcgwAAAByDQAAANoIPG1vZHVsZT4DAwAAcxYAAAAEAQwBDAEMAwoNCg4SLRJ/AH8ABBIV
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 12
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
associationproxy.cpython-37.pyc
48.46 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
automap.cpython-37.pyc
34.41 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
baked.cpython-37.pyc
19.92 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
compiler.cpython-37.pyc
16.01 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
horizontal_shard.cpython-37.pyc
7.37 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hybrid.cpython-37.pyc
40.16 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
indexable.cpython-37.pyc
10.51 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
instrumentation.cpython-37.pyc
13.83 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mutable.cpython-37.pyc
33.29 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
orderinglist.cpython-37.pyc
13.85 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
serializer.cpython-37.pyc
4.78 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
257 B
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).