REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 37.08 KB
Close
//proc/self/root/opt/alt/python35/lib/python3.5/site-packages/pip/_vendor/__pycache__/distro.cpython-35.pyc
Text
Base64
Fw0NCouTUmVsqgAA4wAAAAAAAAAAAAAAAAoAAABAAAAAc00CAABkAABaAABkAQBkAgBsAQBaAQBkAQBkAgBsAgBaAgBkAQBkAgBsAwBaAwBkAQBkAgBsBABaBABkAQBkAgBsBQBaBQBkAQBkAgBsBgBaBgBkAQBkAgBsBwBaBwBkAQBkAgBsCABaCABlAQBqCQBqCgBkAwBkBACDAgBaCwBkBQBaDABkBgBkBwBpAQBaDQBkCABkBwBkCQBkBwBkCgBkCwBkDABkCwBkDQBkCwBpBQBaDgBkDgBkCwBpAQBaDwBlAgBqEABkDwCDAQBaEQBlAgBqEABkEACDAQBaEgBkEQBkEgBkEwBlDABkFABkFQBmBgBaEwBkFgBkFwBkGACEAQBaFABkGQBkGgCEAABaFQBkGwBkHABkHQCEAQBaFgBkGwBkGwBkHgBkHwCEAgBaFwBkGwBkIABkIQCEAQBaGABkGwBkIgBkIwCEAQBaGQBkGwBkJABkJQCEAQBaGgBkGwBkJgBkJwCEAQBaGwBkKABkKQCEAABaHABkKgBkKwCEAABaHQBkGwBkGwBkLABkLQCEAgBaHgBkLgBkLwCEAABaHwBkMABkMQCEAABaIABkMgBkMwCEAABaIQBkNABkNQCEAABaIgBkNgBkNwCEAABaIwBkOABkOQCEAABaJABkOgBkOwCEAABaJQBkPABkPQCEAABaJgBHZD4AZD8AhAAAZD8AZScAgwMAWigAR2RAAGRBAIQAAGRBAGUnAIMDAFopAGUpAIMAAFoqAGRCAGRDAIQAAForAGUsAGREAGsCAHJJAmUrAIMAAAFkAgBTKUVhDAMAAApUaGUgYGBkaXN0cm9gYCBwYWNrYWdlIChgYGRpc3Ryb2BgIHN0YW5kcyBmb3IgTGludXggRGlzdHJpYnV0aW9uKSBwcm92aWRlcwppbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggZGlzdHJpYnV0aW9uIGl0IHJ1bnMgb24sIHN1Y2ggYXMgYSByZWxpYWJsZQptYWNoaW5lLXJlYWRhYmxlIGRpc3RybyBJRCwgb3IgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCkl0IGlzIHRoZSByZWNvbW1lbmRlZCByZXBsYWNlbWVudCBmb3IgUHl0aG9uJ3Mgb3JpZ2luYWwKOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIGJ1dCBpdCBwcm92aWRlcyBtdWNoIG1vcmUKZnVuY3Rpb25hbGl0eS4gQW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFB5dGhvbgozLjUgZGVwcmVjYXRlZCB0aGlzIGZ1bmN0aW9uLCBhbmQgUHl0aG9uIDMuOCB3aWxsIHJlbW92ZSBpdCBhbHRvZ2V0aGVyLgpJdHMgcHJlZGVjZXNzb3IgZnVuY3Rpb24gOnB5OmZ1bmM6YHBsYXRmb3JtLmRpc3RgIHdhcyBhbHJlYWR5CmRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNiBhbmQgd2lsbCBhbHNvIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuOC4KU3RpbGwsIHRoZXJlIGFyZSBtYW55IGNhc2VzIGluIHdoaWNoIGFjY2VzcyB0byBPUyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24KaXMgbmVlZGVkLiBTZWUgYFB5dGhvbiBpc3N1ZSAxMzIyIDxodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjI+YF8gZm9yCm1vcmUgaW5mb3JtYXRpb24uCukAAAAATloLVU5JWENPTkZESVJ6BC9ldGN6Cm9zLXJlbGVhc2XaAm9s2gZvcmFjbGXaFmVudGVycHJpc2VlbnRlcnByaXNlYXPaGmVudGVycHJpc2VlbnRlcnByaXNlc2VydmVy2htyZWRoYXRlbnRlcnByaXNld29ya3N0YXRpb27aBHJoZWzaFnJlZGhhdGVudGVycHJpc2VzZXJ2ZXLaG3JlZGhhdGVudGVycHJpc2Vjb21wdXRlbm9kZdoGcmVkaGF0ekEoPzpbXildKlwpKC4qKVwoKT8gKig/OlNUTCApPyhbXGQuK1wtYS16XSpcZCkgKig/OmVzYWVsZXIgKik/KC4rKXobKFx3KylbLV9dKHJlbGVhc2V8dmVyc2lvbikk2g5kZWJpYW5fdmVyc2lvbnoLbHNiLXJlbGVhc2V6C29lbS1yZWxlYXNleg5zeXN0ZW0tcmVsZWFzZXoNcGxlc2stcmVsZWFzZVRjAQAAAAAAAAABAAAAAgAAAEMAAABzDQAAAHQAAGoBAHwAAIMBAFMpAWEbBAAACiAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKGlkX25hbWUsIHZlcnNpb24sIGNvZGVuYW1lKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgaWRfbmFtZWBgOiAgSWYgKmZ1bGxfZGlzdHJpYnV0aW9uX25hbWUqIGlzIGZhbHNlLCB0aGUgcmVzdWx0IG9mCiAgICAgIDpmdW5jOmBkaXN0cm8uaWRgLiBPdGhlcndpc2UsIHRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5uYW1lYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGBjb2RlbmFtZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KCiAgICBUaGUgaW50ZXJmYWNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbAogICAgOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIHN1cHBvcnRpbmcgYSBzdWJzZXQgb2YKICAgIGl0cyBwYXJhbWV0ZXJzLgoKICAgIFRoZSBkYXRhIGl0IHJldHVybnMgbWF5IG5vdCBleGFjdGx5IGJlIHRoZSBzYW1lLCBiZWNhdXNlIGl0IHVzZXMgbW9yZSBkYXRhCiAgICBzb3VyY2VzIHRoYW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLCBhbmQgdGhhdCBtYXkgbGVhZCB0byBkaWZmZXJlbnQgZGF0YSBpZgogICAgdGhlIE9TIGRpc3RyaWJ1dGlvbiBpcyBub3QgY29uc2lzdGVudCBhY3Jvc3MgbXVsdGlwbGUgZGF0YSBzb3VyY2VzIGl0CiAgICBwcm92aWRlcyAodGhlcmUgYXJlIGluZGVlZCBzdWNoIGRpc3RyaWJ1dGlvbnMgLi4uKS4KCiAgICBBbm90aGVyIHJlYXNvbiBmb3IgZGlmZmVyZW5jZXMgaXMgdGhlIGZhY3QgdGhhdCB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAKICAgIG1ldGhvZCBub3JtYWxpemVzIHRoZSBkaXN0cm8gSUQgc3RyaW5nIHRvIGEgcmVsaWFibGUgbWFjaGluZS1yZWFkYWJsZSB2YWx1ZQogICAgZm9yIGEgbnVtYmVyIG9mIHBvcHVsYXIgT1MgZGlzdHJpYnV0aW9ucy4KICAgICkC2gdfZGlzdHJv2hJsaW51eF9kaXN0cmlidXRpb24pAdoWZnVsbF9kaXN0cmlidXRpb25fbmFtZakAcg8AAAD6gS9idWlsZGRpci9idWlsZC9CVUlMRFJPT1QvYWx0LXB5dGhvbjM1LXBpcC0yMC4yLjQtNS5lbDgueDg2XzY0L29wdC9hbHQvcHl0aG9uMzUvbGliL3B5dGhvbjMuNS9zaXRlLXBhY2thZ2VzL3BpcC9fdmVuZG9yL2Rpc3Ryby5weXINAAAAZAAAAHMCAAAAABlyDQAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMKAAAAdAAAagEAgwAAUykBYUQLAAAKICAgIFJldHVybiB0aGUgZGlzdHJvIElEIG9mIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbiwgYXMgYQogICAgbWFjaGluZS1yZWFkYWJsZSBzdHJpbmcuCgogICAgRm9yIGEgbnVtYmVyIG9mIE9TIGRpc3RyaWJ1dGlvbnMsIHRoZSByZXR1cm5lZCBkaXN0cm8gSUQgdmFsdWUgaXMKICAgICpyZWxpYWJsZSosIGluIHRoZSBzZW5zZSB0aGF0IGl0IGlzIGRvY3VtZW50ZWQgYW5kIHRoYXQgaXQgZG9lcyBub3QgY2hhbmdlCiAgICBhY3Jvc3MgcmVsZWFzZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICBUaGlzIHBhY2thZ2UgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgcmVsaWFibGUgZGlzdHJvIElEIHZhbHVlczoKCiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIERpc3RybyBJRCAgICAgICBEaXN0cmlidXRpb24KICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgInVidW50dSIgICAgICAgIFVidW50dQogICAgImRlYmlhbiIgICAgICAgIERlYmlhbgogICAgInJoZWwiICAgICAgICAgIFJlZEhhdCBFbnRlcnByaXNlIExpbnV4CiAgICAiY2VudG9zIiAgICAgICAgQ2VudE9TCiAgICAiZmVkb3JhIiAgICAgICAgRmVkb3JhCiAgICAic2xlcyIgICAgICAgICAgU1VTRSBMaW51eCBFbnRlcnByaXNlIFNlcnZlcgogICAgIm9wZW5zdXNlIiAgICAgIG9wZW5TVVNFCiAgICAiYW1hem9uIiAgICAgICAgQW1hem9uIExpbnV4CiAgICAiYXJjaCIgICAgICAgICAgQXJjaCBMaW51eAogICAgImNsb3VkbGludXgiICAgIENsb3VkTGludXggT1MKICAgICJleGhlcmJvIiAgICAgICBFeGhlcmJvIExpbnV4CiAgICAiZ2VudG9vIiAgICAgICAgR2VuVG9vIExpbnV4CiAgICAiaWJtX3Bvd2Vya3ZtIiAgSUJNIFBvd2VyS1ZNCiAgICAia3ZtaWJtIiAgICAgICAgS1ZNIGZvciBJQk0geiBTeXN0ZW1zCiAgICAibGludXhtaW50IiAgICAgTGludXggTWludAogICAgIm1hZ2VpYSIgICAgICAgIE1hZ2VpYQogICAgIm1hbmRyaXZhIiAgICAgIE1hbmRyaXZhIExpbnV4CiAgICAicGFyYWxsZWxzIiAgICAgUGFyYWxsZWxzCiAgICAicGlkb3JhIiAgICAgICAgUGlkb3JhCiAgICAicmFzcGJpYW4iICAgICAgUmFzcGJpYW4KICAgICJvcmFjbGUiICAgICAgICBPcmFjbGUgTGludXggKGFuZCBPcmFjbGUgRW50ZXJwcmlzZSBMaW51eCkKICAgICJzY2llbnRpZmljIiAgICBTY2llbnRpZmljIExpbnV4CiAgICAic2xhY2t3YXJlIiAgICAgU2xhY2t3YXJlCiAgICAieGVuc2VydmVyIiAgICAgWGVuU2VydmVyCiAgICAib3BlbmJzZCIgICAgICAgT3BlbkJTRAogICAgIm5ldGJzZCIgICAgICAgIE5ldEJTRAogICAgImZyZWVic2QiICAgICAgIEZyZWVCU0QKICAgICJtaWRuaWdodGJzZCIgICBNaWRuaWdodEJTRAogICAgPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgSWYgeW91IGhhdmUgYSBuZWVkIHRvIGdldCBkaXN0cm9zIGZvciByZWxpYWJsZSBJRHMgYWRkZWQgaW50byB0aGlzIHNldCwKICAgIG9yIGlmIHlvdSBmaW5kIHRoYXQgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIGZ1bmN0aW9uIHJldHVybnMgYSBkaWZmZXJlbnQKICAgIGRpc3RybyBJRCBmb3Igb25lIG9mIHRoZSBsaXN0ZWQgZGlzdHJvcywgcGxlYXNlIGNyZWF0ZSBhbiBpc3N1ZSBpbiB0aGUKICAgIGBkaXN0cm8gaXNzdWUgdHJhY2tlcmBfLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeSBhbmQgdHJhbnNmb3JtYXRpb25zOioqCgogICAgRmlyc3QsIHRoZSBJRCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcywgaW4gdGhlIHNwZWNpZmllZAogICAgb3JkZXIuIFRoZSBmaXJzdCBhdmFpbGFibGUgYW5kIG5vbi1lbXB0eSB2YWx1ZSBpcyB1c2VkOgoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwKCiAgICAqIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCgogICAgVGhlIHNvIGRldGVybWluZWQgSUQgdmFsdWUgdGhlbiBwYXNzZXMgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnMsCiAgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Q6CgogICAgKiBpdCBpcyB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsCgogICAgKiBibGFua3MgKHdoaWNoIHNob3VsZCBub3QgYmUgdGhlcmUgYW55d2F5KSBhcmUgdHJhbnNsYXRlZCB0byB1bmRlcnNjb3JlcywKCiAgICAqIGEgbm9ybWFsaXphdGlvbiBvZiB0aGUgSUQgaXMgcGVyZm9ybWVkLCBiYXNlZCB1cG9uCiAgICAgIGBub3JtYWxpemF0aW9uIHRhYmxlc2BfLiBUaGUgcHVycG9zZSBvZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgdG8gZW5zdXJlCiAgICAgIHRoYXQgdGhlIElEIGlzIGFzIHJlbGlhYmxlIGFzIHBvc3NpYmxlLCBldmVuIGFjcm9zcyBpbmNvbXBhdGlibGUgY2hhbmdlcwogICAgICBpbiB0aGUgT1MgZGlzdHJpYnV0aW9ucy4gQSBjb21tb24gcmVhc29uIGZvciBhbiBpbmNvbXBhdGlibGUgY2hhbmdlIGlzCiAgICAgIHRoZSBhZGRpdGlvbiBvZiBhbiBvcy1yZWxlYXNlIGZpbGUsIG9yIHRoZSBhZGRpdGlvbiBvZiB0aGUgbHNiX3JlbGVhc2UKICAgICAgY29tbWFuZCwgd2l0aCBJRCB2YWx1ZXMgdGhhdCBkaWZmZXIgZnJvbSB3aGF0IHdhcyBwcmV2aW91c2x5IGRldGVybWluZWQKICAgICAgZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSBuYW1lLgogICAgKQJyDAAAANoCaWRyDwAAAHIPAAAAcg8AAAByEAAAAHIRAAAAgAAAAHMCAAAAAExyEQAAAEZjAQAAAAAAAAABAAAAAgAAAEMAAABzDQAAAHQAAGoBAHwAAIMBAFMpAWFrBAAACiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLCBhcyBhIGh1bWFuLXJlYWRhYmxlCiAgICBzdHJpbmcuCgogICAgSWYgKnByZXR0eSogaXMgZmFsc2UsIHRoZSBuYW1lIGlzIHJldHVybmVkIHdpdGhvdXQgdmVyc2lvbiBvciBjb2RlbmFtZS4KICAgIChlLmcuICJDZW50T1MgTGludXgiKQoKICAgIElmICpwcmV0dHkqIGlzIHRydWUsIHRoZSB2ZXJzaW9uIGFuZCBjb2RlbmFtZSBhcmUgYXBwZW5kZWQuCiAgICAoZS5nLiAiQ2VudE9TIExpbnV4IDcuMS4xNTAzIChDb3JlKSIpCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgVGhlIG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMsIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCiAgICBUaGUgZmlyc3QgYXZhaWxhYmxlIGFuZCBub24tZW1wdHkgdmFsdWUgaXMgdXNlZDoKCiAgICAqIElmICpwcmV0dHkqIGlzIGZhbHNlOgoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJOQU1FIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgICBjb21tYW5kLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICI8bmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICogSWYgKnByZXR0eSogaXMgdHJ1ZToKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiUFJFVFRZX05BTUUiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJEZXNjcmlwdGlvbiIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICAgIGNvbW1hbmQsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIjxuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsIGFwcGVuZGVkCiAgICAgICAgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHByZXR0eSB2ZXJzaW9uICgiPHZlcnNpb25faWQ+IiBhbmQgIjxjb2RlbmFtZT4iCiAgICAgICAgZmllbGRzKSBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwgaWYgYXZhaWxhYmxlLgogICAgKQJyDAAAANoEbmFtZSkB2gZwcmV0dHlyDwAAAHIPAAAAchAAAAByEgAAAM8AAABzAgAAAAAkchIAAABjAgAAAAAAAAACAAAAAwAAAEMAAABzEAAAAHQAAGoBAHwAAHwBAIMCAFMpAWF2BgAACiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLCBhcyBhIGh1bWFuLXJlYWRhYmxlCiAgICBzdHJpbmcuCgogICAgSWYgKnByZXR0eSogaXMgZmFsc2UsIHRoZSB2ZXJzaW9uIGlzIHJldHVybmVkIHdpdGhvdXQgY29kZW5hbWUgKGUuZy4KICAgICI3LjAiKS4KCiAgICBJZiAqcHJldHR5KiBpcyB0cnVlLCB0aGUgY29kZW5hbWUgaW4gcGFyZW50aGVzaXMgaXMgYXBwZW5kZWQsIGlmIHRoZQogICAgY29kZW5hbWUgaXMgbm9uLWVtcHR5IChlLmcuICI3LjAgKE1haXBvKSIpLgoKICAgIFNvbWUgZGlzdHJpYnV0aW9ucyBwcm92aWRlIHZlcnNpb24gbnVtYmVycyB3aXRoIGRpZmZlcmVudCBwcmVjaXNpb25zIGluCiAgICB0aGUgZGlmZmVyZW50IHNvdXJjZXMgb2YgZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uLiBFeGFtaW5pbmcgdGhlIGRpZmZlcmVudAogICAgc291cmNlcyBpbiBhIGZpeGVkIHByaW9yaXR5IG9yZGVyIGRvZXMgbm90IGFsd2F5cyB5aWVsZCB0aGUgbW9zdCBwcmVjaXNlCiAgICB2ZXJzaW9uIChlLmcuIGZvciBEZWJpYW4gOC4yLCBvciBDZW50T1MgNy4xKS4KCiAgICBUaGUgKmJlc3QqIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBhcHByb2FjaCBmb3IgdGhlIHJldHVybmVkCiAgICB2ZXJzaW9uOgoKICAgIElmICpiZXN0KiBpcyBmYWxzZSwgdGhlIGZpcnN0IG5vbi1lbXB0eSB2ZXJzaW9uIG51bWJlciBpbiBwcmlvcml0eSBvcmRlciBvZgogICAgdGhlIGV4YW1pbmVkIHNvdXJjZXMgaXMgcmV0dXJuZWQuCgogICAgSWYgKmJlc3QqIGlzIHRydWUsIHRoZSBtb3N0IHByZWNpc2UgdmVyc2lvbiBudW1iZXIgb3V0IG9mIGFsbCBleGFtaW5lZAogICAgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBJbiBhbGwgY2FzZXMsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcy4KICAgIElmICpiZXN0KiBpcyBmYWxzZSwgdGhpcyBvcmRlciByZXByZXNlbnRzIHRoZSBwcmlvcml0eSBvcmRlcjoKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlZFUlNJT05fSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJSZWxlYXNlIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIjx2ZXJzaW9uX2lkPiIgZmllbGQgb2YgdGhlIGZpcnN0IGxpbmUKICAgICAgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIlBSRVRUWV9OQU1FIiBhdHRyaWJ1dGUgb2YgdGhlCiAgICAgIG9zLXJlbGVhc2UgZmlsZSwgaWYgaXQgZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlcy4KICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiRGVzY3JpcHRpb24iIGF0dHJpYnV0ZSByZXR1cm5lZCBieQogICAgICB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCwgaWYgaXQgZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBkaXN0cm8gcmVsZWFzZQogICAg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AnIMAAAA2gxidWlsZF9udW1iZXIpAXIVAAAAcg8AAAByDwAAAHIQAAAAchkAAABNAQAAcwIAAAAACnIZAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwoAAAB0AABqAQCDAABTKQFhDwIAAAogICAgUmV0dXJuIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZGlzdHJvIElEcyBvZiBkaXN0cmlidXRpb25zIHRoYXQgYXJlCiAgICBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uIGluIHJlZ2FyZHMgdG8gcGFja2FnaW5nCiAgICBhbmQgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcywgZm9yIGV4YW1wbGUgZGlzdHJpYnV0aW9ucyB0aGUgY3VycmVudAogICAgZGlzdHJpYnV0aW9uIGlzIGEgZGVyaXZhdGl2ZSBmcm9tLgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgIFRoaXMgaW5mb3JtYXRpb24gaXRlbSBpcyBvbmx5IHByb3ZpZGVkIGJ5IHRoZSBvcy1yZWxlYXNlIGZpbGUuCiAgICBGb3IgZGV0YWlscywgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgIklEX0xJS0UiIGF0dHJpYnV0ZSBpbiB0aGUKICAgIGBvcy1yZWxlYXNlIG1hbiBwYWdlCiAgICA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vb3MtcmVsZWFzZS5odG1sPmBfLgogICAgKQJyDAAAANoEbGlrZXIPAAAAcg8AAAByDwAAAHIQAAAAchoAAABaAQAAcwIAAAAADnIaAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwoAAAB0AABqAQCDAABTKQFhpgIAAAogICAgUmV0dXJuIHRoZSBjb2RlbmFtZSBmb3IgdGhlIHJlbGVhc2Ugb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLAogICAgYXMgYSBzdHJpbmcuCgogICAgSWYgdGhlIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCBoYXZlIGEgY29kZW5hbWUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KCiAgICBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGNvZGVuYW1lIGlzIG5vdCBhbHdheXMgcmVhbGx5IGEgY29kZW5hbWUuIEZvcgogICAgZXhhbXBsZSwgb3BlblNVU0UgcmV0dXJucyAieDg2XzY0Ii4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgc3VjaAogICAgY2FzZXMgaW4gYW55IHNwZWNpYWwgd2F5IGFuZCBqdXN0IHJldHVybnMgdGhlIHN0cmluZyBpdCBmaW5kcywgaWYgYW55LgoKICAgICoqTG9va3VwIGhpZXJhcmNoeToqKgoKICAgICogdGhlIGNvZGVuYW1lIHdpdGhpbiB0aGUgIlZFUlNJT04iIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLCBpZgogICAgICBwcm92aWRlZCwKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIkNvZGVuYW1lIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICI8Y29kZW5hbWU+IiBmaWVsZCBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KICAgICkCcgwAAADaCGNvZGVuYW1lcg8AAAByDwAAAHIPAAAAchAAAAByGwAAAGsBAABzAgAAAAAVchsAAABjAgAAAAAAAAACAAAAAwAAAEMAAABzEAAAAHQAAGoBAHwAAHwBAIMCAFMpAWHUBAAACiAgICBSZXR1cm4gY2VydGFpbiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGl0ZW1zIGFib3V0IHRoZSBjdXJyZW50IE9TCiAgICBkaXN0cmlidXRpb24gaW4gYSBkaWN0aW9uYXJ5LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CgogICAgLi4gc291cmNlY29kZTo6IHB5dGhvbgoKICAgICAgICB7CiAgICAgICAgICAgICdpZCc6ICdyaGVsJywKICAgICAgICAgICAgJ3ZlcnNpb24nOiAnNy4wJywKICAgICAgICAgICAgJ3ZlcnNpb25fcGFydHMnOiB7CiAgICAgICAgICAgICAgICAnbWFqb3InOiAnNycsCiAgICAgICAgICAgICAgICAnbWlub3InOiAnMCcsCiAgICAgICAgICAgICAgICAnYnVpbGRfbnVtYmVyJzogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2xpa2UnOiAnZmVkb3JhJywKICAgICAgICAgICAgJ2NvZGVuYW1lJzogJ01haXBvJwogICAgICAgIH0KCiAgICBUaGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgYW5kIGtleXMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgcmVnYXJkbGVzcyBvZiB3aGljaAogICAgaW5mb3JtYXRpb24gaXRlbXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZXMuIFRoZSB2YWx1ZXMKICAgIGZvciB0aGUgdmFyaW91cyBrZXlzIGFyZSBhcyBmb2xsb3dzOgoKICAgICogYGBpZGBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmlkYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBidWlsZF9udW1iZXJgYDogIFRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5idWlsZF9udW1iZXJgLgoKICAgICogYGBsaWtlYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubGlrZWAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqcHJldHR5KiBhbmQgKmJlc3QqIHBhcmFtZXRlcnMsIHNlZSB0aGUKICAgIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAgbWV0aG9kLgogICAgKQJyDAAAANoEaW5mbykCchMAAAByFQAAAHIPAAAAcg8AAAByEAAAAHIcAAAAgwEAAHMCAAAAAClyHAAAAGMAAAAAAAAAAAAAAAABAAAAQwAAAHMKAAAAdAAAagEAgwAAUykBeuIKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgKQJyDAAAANoPb3NfcmVsZWFzZV9pbmZvcg8AAAByDwAAAHIPAAAAchAAAAByHQAAAK8BAABzAgAAAAAHch0AAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCgAAAHQAAGoBAIMAAFMpAXr1CiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbgogICAgaXRlbXMuCiAgICApAnIMAAAA2hBsc2JfcmVsZWFzZV9pbmZvcg8AAAByDwAAAHIPAAAAchAAAAByHgAAALkBAABzAgAAAAAIch4AAABjAAAAAAAAAAAAAAAAAQAAAEMAAABzCgAAAHQAAGoBAIMAAFMpAXrqCiAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24gaXRlbXMKICAgIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgKQJyDAAAANoTZGlzdHJvX3JlbGVhc2VfaW5mb3IPAAAAcg8AAAByDwAAAHIQAAAAch8AAADEAQAAcwIAAAAAB3IfAAAAYwAAAAAAAAAAAAAAAAEAAABDAAAAcwoAAAB0AABqAQCDAABTKQF6nwogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KICAgICkCcgwAAADaCnVuYW1lX2luZm9yDwAAAHIPAAAAcg8AAAByEAAAAHIgAAAAzgEAAHMCAAAAAAVyIAAAAGMBAAAAAAAAAAEAAAACAAAAQwAAAHMNAAAAdAAAagEAfAAAgwEAUykBYZMBAAAKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZQogICAgb2YgdGhlIGN1cnJlbnQgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFBhcmFtZXRlcnM6CgogICAgKiBgYGF0dHJpYnV0ZWBgIChzdHJpbmcpOiBLZXkgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0uCgogICAgUmV0dXJuczoKCiAgICAqIChzdHJpbmcpOiBWYWx1ZSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbSwgaWYgdGhlIGl0ZW0gZXhpc3RzLgogICAgICBUaGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdC4KCiAgICBTZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgKQJyDAAAANoPb3NfcmVsZWFzZV9hdHRyKQHaCWF0dHJpYnV0ZXIPAAAAcg8AAAByEAAAAHIhAAAA1gEAAHMCAAAAABByIQAAAGMBAAAAAAAAAAEAAAACAAAAQwAAAHMNAAAAdAAAagEAfAAAgwEAUykBYa0BAAAKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0CiAgICBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBPUyBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbgogICAgaXRlbXMuCiAgICApAnIMAAAA2hBsc2JfcmVsZWFzZV9hdHRyKQFyIgAAAHIPAAAAcg8AAAByEAAAAHIjAAAA6QEAAHMCAAAAABFyIwAAAGMBAAAAAAAAAAEAAAACAAAAQwAAAHMNAAAAdAAAagEAfAAAgwEAUykBYZsBAAAKICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUKICAgIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBp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JACEAABaEwBkJQBkJgCEAABaFABkJwBkKACEAABaFQBkKQBkKgCEAABaFgBkKwBkLACEAABaFwBkLQBkLgCEAABaGABlGQBkLwBkMACEAACDAQBaGgBlGwBkMQBkMgCEAACDAQBaHABlGQBkMwBkNACEAACDAQBaHQBlGwBkNQBkNgCEAACDAQBaHgBlGQBkNwBkOACEAACDAQBaHwBlGwBkOQBkOgCEAACDAQBaIABlGwBkOwBkPACEAACDAQBaIQBlGQBkPQBkPgCEAACDAQBaIgBkPwBkQACEAABaIwBlGwBkQQBkQgCEAACDAQBaJABkQwBTKUTaEUxpbnV4RGlzdHJpYnV0aW9uYQwDAAAKICAgIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgT1MgZGlzdHJpYnV0aW9uLgoKICAgIFRoaXMgcGFja2FnZSBjcmVhdGVzIGEgcHJpdmF0ZSBtb2R1bGUtZ2xvYmFsIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2l0aAogICAgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgaXMgdXNlZCBieSB0aGUKICAgIGBjb25zb2xpZGF0ZWQgYWNjZXNzb3IgZnVuY3Rpb25zYF8gYW5kIGBzaW5nbGUgc291cmNlIGFjY2Vzc29yIGZ1bmN0aW9uc2BfLgogICAgQnkgdXNpbmcgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMsIHRoYXQgbW9kdWxlLWdsb2JhbCBpbnN0YW5jZQogICAgcmV0dXJucyBkYXRhIGFib3V0IHRoZSBjdXJyZW50IE9TIGRpc3RyaWJ1dGlvbiAoaS5lLiB0aGUgZGlzdHJvIHRoaXMKICAgIHBhY2thZ2UgcnVucyBvbikuCgogICAgTm9ybWFsbHksIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGFkZGl0aW9uYWwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuCiAgICBIb3dldmVyLCBpbiBzaXR1YXRpb25zIHdoZXJlIGNvbnRyb2wgaXMgbmVlZGVkIG92ZXIgdGhlIGV4YWN0IGRhdGEgc291cmNlcwogICAgdGhhdCBhcmUgdXNlZCwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgY2FuIGJlIGNyZWF0ZWQgd2l0aCBhIHNwZWNpZmljCiAgICBkaXN0cm8gcmVsZWFzZSBmaWxlLCBvciBhIHNwZWNpZmljIG9zLXJlbGVhc2UgZmlsZSwgb3Igd2l0aG91dCBpbnZva2luZyB0aGUKICAgIGxzYl9yZWxlYXNlIGNvbW1hbmQuCiAgICBU2gBjBQAAAAAAAAAFAAAAAwAAAEMAAABzQwAAAHwCAHAYAHQAAGoBAGoCAHQDAHQEAIMCAHwAAF8FAHwDAHAnAGQBAHwAAF8GAHwBAHwAAF8HAHwEAHwAAF8IAGQCAFMpA2FwCwAACiAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIG1ldGhvZCBvZiB0aGlzIGNsYXNzIGdhdGhlcnMgaW5mb3JtYXRpb24gZnJvbSB0aGUKICAgICAgICBhdmFpbGFibGUgZGF0YSBzb3VyY2VzLCBhbmQgc3RvcmVzIHRoYXQgaW4gcHJpdmF0ZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgogICAgICAgIFN1YnNlcXVlbnQgYWNjZXNzIHRvIHRoZSBpbmZvcm1hdGlvbiBpdGVtcyB1c2VzIHRoZXNlIHByaXZhdGUgaW5zdGFuY2UKICAgICAgICBhdHRyaWJ1dGVzLCBzbyB0aGF0IHRoZSBkYXRhIHNvdXJjZXMgYXJlIHJlYWQgb25seSBvbmNlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGBgaW5jbHVkZV9sc2JgYCAoYm9vbCk6IENvbnRyb2xzIHdoZXRoZXIgdGhlCiAgICAgICAgICBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBpcyBpbmNsdWRlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIElmIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIHRoZSBkZWZhdWx0IHBhdGggbmFtZSB0bwogICAgICAgICAgYmUgdXNlZCAoc2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgb3MtcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUKICAgICAgICAgIGRhdGEgc291cmNlIGZvciB0aGUgb3MtcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgYSBkZWZhdWx0IHNlYXJjaCBhbGdvcml0aG0KICAgICAgICAgIHRvIGJlIHVzZWQgKHNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIGlmIG5vIGRlZmF1bHQKICAgICAgICAgIGRpc3RybyByZWxlYXNlIGZpbGUgY2FuIGJlIGZvdW5kLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICAqIGBgaW5jbHVkZV91bmFtZWBgIChib29sKTogQ29udHJvbHMgd2hldGhlciB1bmFtZSBjb21tYW5kIG91dHB1dCBpcwogICAgICAgICAgaW5jbHVkZWQgYXMgYSBkYXRhIHNvdXJjZS4gSWYgdGhlIHVuYW1lIGNvbW1hbmQgaXMgbm90IGF2YWlsYWJsZSBpbgogICAgICAgICAgdGhlIHByb2dyYW0gZXhlY3V0aW9uIHBhdGggdGhlIGRhdGEgc291cmNlIGZvciB0aGUgdW5hbWUgY29tbWFuZCB3aWxsCiAgICAgICAgICBiZSBlbXB0eS4KCiAgICAgICAgUHVibGljIGluc3RhbmNlIGF0dHJpYnV0ZXM6CgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4gVGhlCiAgICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm8gZGlzdHJvIHJlbGVhc2UgZmlsZSBpcyB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBhcyBhIGRhdGEgc291cmNlLiBUaGUKICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBubyBkaXN0cm8gcmVsZWFzZSBmaWxlIGlzIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgKiBgYGluY2x1ZGVfbHNiYGAgKGJvb2wpOiBUaGUgcmVzdWx0IG9mIHRoZSBgYGluY2x1ZGVfbHNiYGAgcGFyYW1ldGVyLgogICAgICAgICAgVGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSBsc2IgaW5mb3JtYXRpb24gd2lsbCBiZSBsb2FkZWQuCgogICAgICAgICogYGBpbmNsdWRlX3VuYW1lYGAgKGJvb2wpOiBUaGUgcmVzdWx0IG9mIHRoZSBgYGluY2x1ZGVfdW5hbWVgYAogICAgICAgICAgcGFyYW1ldGVyLiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHVuYW1lIGluZm9ybWF0aW9uIHdpbGwKICAgICAgICAgIGJlIGxvYWRlZC4KCiAgICAgICAgUmFpc2VzOgoKICAgICAgICAqIDpweTpleGM6YElPRXJyb3JgOiBTb21lIEkvTyBpc3N1ZSB3aXRoIGFuIG9zLXJlbGVhc2UgZmlsZSBvciBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgKiA6cHk6ZXhjOmBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcmA6IFRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGhhZAogICAgICAgICAgc29tZSBpc3N1ZSAob3RoZXIgdGhhbiBub3QgYmVpbmcgYXZhaWxhYmxlIGluIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbgogICAgICAgICAgcGF0aCkuCgogICAgICAgICogOnB5OmV4YzpgVW5pY29kZUVycm9yYDogQSBkYXRhIHNvdXJjZSBoYXMgdW5leHBlY3RlZCBjaGFyYWN0ZXJzIG9yCiAgICAgICAgICB1c2VzIGFuIHVuZXhwZWN0ZWQgZW5jb2RpbmcuCiAgICAgICAgcjgAAABOKQnaAm9z2gRwYXRo2gRqb2lu2gxfVU5JWENPTkZESVLaFF9PU19SRUxFQVNFX0JBU0VOQU1F2g9vc19yZWxlYXNlX2ZpbGXaE2Rpc3Ryb19yZWxlYXNlX2ZpbGXaC2luY2x1ZGVfbHNi2g1pbmNsdWRlX3VuYW1lKQVyKgAAAHJAAAAAcj4AAAByPwAAAHJBAAAAcg8AAAByDwAAAHIQAAAAciwAAABCAgAAcwoAAAAASAYBGAEPAQkBehpMaW51eERpc3RyaWJ1dGlvbi5fX2luaXRfX2MBAAAAAAAAAAEAAAADAAAAQwAAAHMQAAAAZAEAagAAZAIAfAAAgwABUykDeiBSZXR1cm4gcmVwciBvZiBhbGwgaW5mbwogICAgICAgIGFlAQAATGludXhEaXN0cmlidXRpb24ob3NfcmVsZWFzZV9maWxlPXtzZWxmLm9zX3JlbGVhc2VfZmlsZSFyfSwgZGlzdHJvX3JlbGVhc2VfZmlsZT17c2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlIXJ9LCBpbmNs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AQAAAEMAAABzBwAAAHwAAGoAAFMpAXrmCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBkYXRhIHNvdXJjZSBvZiB0aGUgT1MKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5sc2JfcmVsZWFzZV9pbmZvYC4KICAgICAgICApAdoRX2xzYl9yZWxlYXNlX2luZm8pAXIqAAAAcg8AAAByDwAAAHIQAAAAch4AAABaAwAAcwIAAAAACHoiTGludXhEaXN0cmlidXRpb24ubHNiX3JlbGVhc2VfaW5mb2MBAAAAAAAAAAEAAAABAAAAQwAAAHMHAAAAfAAAagAAUykBeukKICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciB0aGUgaW5mb3JtYXRpb24KICAgICAgICBpdGVtcyBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBPUwogICAgICAgIGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmRpc3Ryb19yZWxlYXNlX2luZm9gLgogICAgICAgICkB2hRfZGlzdHJvX3JlbGVhc2VfaW5mbykBcioAAAByDwAAAHIPAAAAchAAAAByHwAAAGQDAABzAgAAAAAIeiVMaW51eERpc3RyaWJ1dGlvbi5kaXN0cm9fcmVsZWFzZV9pbmZvYwEAAAAAAAAAAQAAAAEAAABDAAAAcwcAAAB8AABqAABTKQF60gogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIHVuYW1lIGNvbW1hbmQgZGF0YSBzb3VyY2Ugb2YgdGhlIE9TIGRpc3RyaWJ1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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 8
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
appdirs.cpython-35.pyc
22.29 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
contextlib2.cpython-35.pyc
15.82 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
distro.cpython-35.pyc
37.08 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
ipaddress.cpython-35.pyc
69.17 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
pyparsing.cpython-35.pyc
250.92 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
retrying.cpython-35.pyc
8.57 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
six.cpython-35.pyc
28.44 KB
lrw-r--r--
2023-11-13 21:22:19
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-35.pyc
3.11 KB
lrw-r--r--
2023-11-13 21:22:19
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).