REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 50.42 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/polynomial/__pycache__/polynomial.cpython-37.pyc
Text
Base64
Qg0NCgAAAADB2EZkZs0AAOMAAAAAAAAAAAAAAAAbAAAAQAAAAHOmAQAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZANkBGQFZAZkB2QIZAlkCmQLZAxkDWQOZA9kEGQRZBJkE2QUZBVkFmQXZBhkGWQaZBtkHGQdZxtaBWQBZB5sBloGZAFkHmwHWghkAWQebAltCloLAQBkAWQfbAxtDVoNAQBkIGQhbA5tD1oQAQBkIGQibBFtEloSAQBlEGoTWhRlCKAVZCNkIGcCoQFaFmUIoBVkAWcBoQFaF2UIoBVkIGcBoQFaGGUIoBVkAWQgZwKhAVoZZCRkB4QAWhpkJWQShABaG2QmZAiEAFocZCdkCYQAWh1kKGQKhABaHmQpZAuEAFofZCpkDIQAWiBkPmQrZA2EAVohZD9kLGQQhAFaImQgZwBkAWQgZAFmBWQtZBGEAVojZEBkL2QOhAFaJGRBZDBkD4QBWiVkMWQYhABaJmQyZBqEAFonZDNkGYQAWihkNGQbhABaKWQ1ZBOEAFoqZDZkHIQAWitkN2QdhABaLGRCZDlkFIQBWi1kOmQ7hABaLmQ8ZBaEAFovRwBkPWQXhABkF2USgwNaMGQeUwApQ2H8BwAACk9iamVjdHMgZm9yIGRlYWxpbmcgd2l0aCBwb2x5bm9taWFscy4KClRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgbnVtYmVyIG9mIG9iamVjdHMgKG1vc3RseSBmdW5jdGlvbnMpIHVzZWZ1bCBmb3IKZGVhbGluZyB3aXRoIHBvbHlub21pYWxzLCBpbmNsdWRpbmcgYSBgUG9seW5vbWlhbGAgY2xhc3MgdGhhdAplbmNhcHN1bGF0ZXMgdGhlIHVzdWFsIGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gIChHZW5lcmFsIGluZm9ybWF0aW9uCm9uIGhvdyB0aGlzIG1vZHVsZSByZXByZXNlbnRzIGFuZCB3b3JrcyB3aXRoIHBvbHlub21pYWwgb2JqZWN0cyBpcyBpbgp0aGUgZG9jc3RyaW5nIGZvciBpdHMgInBhcmVudCIgc3ViLXBhY2thZ2UsIGBudW1weS5wb2x5bm9taWFsYCkuCgpDb25zdGFudHMKLS0tLS0tLS0tCi0gYHBvbHlkb21haW5gIC0tIFBvbHlub21pYWwgZGVmYXVsdCBkb21haW4sIFstMSwxXS4KLSBgcG9seXplcm9gIC0tIChDb2VmZmljaWVudHMgb2YgdGhlKSAiemVybyBwb2x5bm9taWFsLiIKLSBgcG9seW9uZWAgLS0gKENvZWZmaWNpZW50cyBvZiB0aGUpIGNvbnN0YW50IHBvbHlub21pYWwgMS4KLSBgcG9seXhgIC0tIChDb2VmZmljaWVudHMgb2YgdGhlKSBpZGVudGl0eSBtYXAgcG9seW5vbWlhbCwgYGBmKHgpID0geGBgLgoKQXJpdGhtZXRpYwotLS0tLS0tLS0tCi0gYHBvbHlhZGRgIC0tIGFkZCB0d28gcG9seW5vbWlhbHMuCi0gYHBvbHlzdWJgIC0tIHN1YnRyYWN0IG9uZSBwb2x5bm9taWFsIGZyb20gYW5vdGhlci4KLSBgcG9seW11bGAgLS0gbXVsdGlwbHkgdHdvIHBvbHlub21pYWxzLgotIGBwb2x5ZGl2YCAtLSBkaXZpZGUgb25lIHBvbHlub21pYWwgYnkgYW5vdGhlci4KLSBgcG9seXBvd2AgLS0gcmFpc2UgYSBwb2x5bm9taWFsIHRvIGFuIHBvc2l0aXZlIGludGVnZXIgcG93ZXIKLSBgcG9seXZhbGAgLS0gZXZhbHVhdGUgYSBwb2x5bm9taWFsIGF0IGdpdmVuIHBvaW50cy4KLSBgcG9seXZhbDJkYCAtLSBldmFsdWF0ZSBhIDJEIHBvbHlub21pYWwgYXQgZ2l2ZW4gcG9pbnRzLgotIGBwb2x5dmFsM2RgIC0tIGV2YWx1YXRlIGEgM0QgcG9seW5vbWlhbCBhdCBnaXZlbiBwb2ludHMuCi0gYHBvbHlncmlkMmRgIC0tIGV2YWx1YXRlIGEgMkQgcG9seW5vbWlhbCBvbiBhIENhcnRlc2lhbiBwcm9kdWN0LgotIGBwb2x5Z3JpZDNkYCAtLSBldmFsdWF0ZSBhIDNEIHBvbHlub21pYWwgb24gYSBDYXJ0ZXNpYW4gcHJvZHVjdC4KCkNhbGN1bHVzCi0tLS0tLS0tCi0gYHBvbHlkZXJgIC0tIGRpZmZlcmVudGlhdGUgYSBwb2x5bm9taWFsLgotIGBwb2x5aW50YCAtLSBpbnRlZ3JhdGUgYSBwb2x5bm9taWFsLgoKTWlzYyBGdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0KLSBgcG9seWZyb21yb290c2AgLS0gY3JlYXRlIGEgcG9seW5vbWlhbCB3aXRoIHNwZWNpZmllZCByb290cy4KLSBgcG9seXJvb3RzYCAtLSBmaW5kIHRoZSByb290cyBvZiBhIHBvbHlub21pYWwuCi0gYHBvbHl2YWxmcm9tcm9vdHNgIC0tIGV2YWx1dGUgYSBwb2x5bm9taWFsIGF0IGdpdmVuIHBvaW50cyBmcm9tIHJvb3RzLgotIGBwb2x5dmFuZGVyYCAtLSBWYW5kZXJtb25kZS1saWtlIG1hdHJpeCBmb3IgcG93ZXJzLgotIGBwb2x5dmFuZGVyMmRgIC0tIFZhbmRlcm1vbmRlLWxpa2UgbWF0cml4IGZvciAyRCBwb3dlciBzZXJpZXMuCi0gYHBvbHl2YW5kZXIzZGAgLS0gVmFuZGVybW9uZGUtbGlrZSBtYXRyaXggZm9yIDNEIHBvd2VyIHNlcmllcy4KLSBgcG9seWNvbXBhbmlvbmAgLS0gY29tcGFuaW9uIG1hdHJpeCBpbiBwb3dlciBzZXJpZXMgZm9ybS4KLSBgcG9seWZpdGAgLS0gbGVhc3Qtc3F1YXJlcyBmaXQgcmV0dXJuaW5nIGEgcG9seW5vbWlhbC4KLSBgcG9seXRyaW1gIC0tIHRyaW0gbGVhZGluZyBjb2VmZmljaWVudHMgZnJvbSBhIHBvbHlub21pYWwuCi0gYHBvbHlsaW5lYCAtLSBwb2x5bm9taWFsIHJlcHJlc2VudGluZyBnaXZlbiBzdHJhaWdodCBsaW5lLgoKQ2xhc3NlcwotLS0tLS0tCi0gYFBvbHlub21pYWxgIC0tIHBvbHlub21pYWwgY2xhc3MuCgpTZWUgQWxzbwotLS0tLS0tLQpgbnVtcHkucG9seW5vbWlhbGAKCukAAAAAKQPaCGRpdmlzaW9u2g9hYnNvbHV0ZV9pbXBvcnTaDnByaW50X2Z1bmN0aW9u2ghwb2x5emVyb9oHcG9seW9uZdoFcG9seXjaCnBvbHlkb21haW7aCHBvbHlsaW5l2gdwb2x5YWRk2gdwb2x5c3Vi2ghwb2x5bXVseNoHcG9seW11bNoHcG9seWRpdtoHcG9seXBvd9oHcG9seXZhbNoQcG9seXZhbGZyb21yb290c9oHcG9seWRlctoHcG9seWludNoNcG9seWZyb21yb290c9oKcG9seXZhbmRlctoHcG9seWZpdNoIcG9seXRyaW3aCXBvbHlyb290c9oKUG9seW5vbWlhbNoJcG9seXZhbDJk2glwb2x5dmFsM2TaCnBvbHlncmlkMmTaCnBvbHlncmlkM2TaDHBvbHl2YW5kZXIyZNoMcG9seXZhbmRlcjNkTikB2hRub3JtYWxpemVfYXhpc19pbmRleOkBAAAAKQHaCXBvbHl1dGlscykB2gtBQkNQb2x5QmFzZen/////YwIAAAAAAAAAAgAAAAQAAABDAAAAcyYAAAB8AWQBawNyFnQAoAF8AHwBZwKhAVMAdACgAXwAZwGhAVMAZAJTACkDYRYCAAAKICAgIFJldHVybnMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIGEgbGluZWFyIHBvbHlub21pYWwuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgb2ZmLCBzY2wgOiBzY2FsYXJzCiAgICAgICAgVGhlICJ5LWludGVyY2VwdCIgYW5kICJzbG9wZSIgb2YgdGhlIGxpbmUsIHJlc3BlY3RpdmVseS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB5IDogbmRhcnJheQogICAgICAgIFRoaXMgbW9kdWxlJ3MgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpbmVhciBwb2x5bm9taWFsIGBgb2ZmICsKICAgICAgICBzY2wqeGBgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYmxpbmUKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5LnBvbHlub21pYWwgaW1wb3J0IHBvbHlub21pYWwgYXMgUAogICAgPj4+IFAucG9seWxpbmUoMSwtMSkKICAgIGFycmF5KFsgMSwgLTFdKQogICAgPj4+IFAucG9seXZhbCgxLCBQLnBvbHlsaW5lKDEsLTEpKSAjIHNob3VsZCBiZSAwCiAgICAwLjAKCiAgICByAQAAAE4pAtoCbnDaBWFycmF5KQLaA29mZtoDc2NsqQByKQAAAPpOL29wdC9hbHQvcHl0aG9uMzcvbGliNjQvcHl0aG9uMy43L3NpdGUtcGFja2FnZXMvbnVtcHkvcG9seW5vbWlhbC9wb2x5bm9taWFsLnB5cgkAAABiAAAAcwYAAAAAHAgBDgJjAQAAAAAAAAAEAAAABAAAAAMAAABzqAAAAHQAfACDAWQBawJyFnQBoAJkAqEBUwB0A2oEfABnAWQDZASNAlwBfQB8AKAFoQABAGQFZAaEAHwARACDAYkBdACIAYMBfQF4VHwBZAJrBHKadAZ8AWQHgwJcAokAfQKHAIcBZgJkCGQGhAh0B4gAgwFEAIMBfQN8AnKQdAh8A2QBGQCIAWQJGQCDAnwDZAE8AHwDiQGIAH0BcUhXAIgBZAEZAFMAZApTACkLYY8GAAAKICAgIEdlbmVyYXRlIGEgbW9uaWMgcG9seW5vbWlhbCB3aXRoIGdpdmVuIHJvb3RzLgoKICAgIFJldHVybiB0aGUgY29lZmZpY2llbnRzIG9mIHRoZSBwb2x5bm9taWFsCgogICAgLi4gbWF0aDo6IHAoeCkgPSAoeCAtIHJfMCkgKiAoeCAtIHJfMSkgKiAuLi4gKiAoeCAtIHJfbiksCgogICAgd2hlcmUgdGhlIGByX25gIGFyZSB0aGUgcm9vdHMgc3BlY2lmaWVkIGluIGByb290c2AuICBJZiBhIHplcm8gaGFzCiAgICBtdWx0aXBsaWNpdHkgbiwgdGhlbiBpdCBtdXN0IGFwcGVhciBpbiBgcm9vdHNgIG4gdGltZXMuIEZvciBpbnN0YW5jZSwKICAgIGlmIDIgaXMgYSByb290IG9mIG11bHRpcGxpY2l0eSB0aHJlZSBhbmQgMyBpcyBhIHJvb3Qgb2YgbXVsdGlwbGljaXR5IDIsCiAgICB0aGVuIGByb290c2AgbG9va3Mgc29tZXRoaW5nIGxpa2UgWzIsIDIsIDIsIDMsIDNdLiBUaGUgcm9vdHMgY2FuIGFwcGVhcgogICAgaW4gYW55IG9yZGVyLgoKICAgIElmIHRoZSByZXR1cm5lZCBjb2VmZmljaWVudHMgYXJlIGBjYCwgdGhlbgoKICAgIC4uIG1hdGg6OiBwKHgpID0gY18wICsgY18xICogeCArIC4uLiArICB4Xm4KCiAgICBUaGUgY29lZmZpY2llbnQgb2YgdGhlIGxhc3QgdGVybSBpcyAxIGZvciBtb25pYyBwb2x5bm9taWFscyBpbiB0aGlzCiAgICBmb3JtLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHJvb3RzIDogYXJyYXlfbGlrZQogICAgICAgIFNlcXVlbmNlIGNvbnRhaW5pbmcgdGhlIHJvb3RzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkKICAgICAgICAxLUQgYXJyYXkgb2YgdGhlIHBvbHlub21pYWwncyBjb2VmZmljaWVudHMgSWYgYWxsIHRoZSByb290cyBhcmUKICAgICAgICByZWFsLCB0aGVuIGBvdXRgIGlzIGFsc28gcmVhbCwgb3RoZXJ3aXNlIGl0IGlzIGNvbXBsZXguICAoc2VlCiAgICAgICAgRXhhbXBsZXMgYmVsb3cpLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYmZyb21yb290cywgbGVnZnJvbXJvb3RzLCBsYWdmcm9tcm9vdHMsIGhlcm1mcm9tcm9vdHMKICAgIGhlcm1lZnJvbXJvb3RzCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgY29lZmZpY2llbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IG11bHRpcGx5aW5nIHRvZ2V0aGVyIGxpbmVhciBmYWN0b3JzCiAgICBvZiB0aGUgZm9ybSBgKHggLSByX2kpYCwgaS5lLgoKICAgIC4uIG1hdGg6OiBwKHgpID0gKHggLSByXzApICh4IC0gcl8xKSAuLi4gKHggLSByX24pCgogICAgd2hlcmUgYGBuID09IGxlbihyb290cykgLSAxYGA7IG5vdGUgdGhhdCB0aGlzIGltcGxpZXMgdGhhdCBgMWAgaXMgYWx3YXlzCiAgICByZXR1cm5lZCBmb3IgOm1hdGg6YGFfbmAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZnJvbSBudW1weS5wb2x5bm9taWFsIGltcG9ydCBwb2x5bm9taWFsIGFzIFAKICAgID4+PiBQLnBvbHlmcm9tcm9vdHMoKC0xLDAsMSkpICMgeCh4IC0gMSkoeCArIDEpID0geF4zIC0geAogICAgYXJyYXkoWyAwLiwgLTEuLCAgMC4sICAxLl0pCiAg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YnkgYHNjbGAgKHRoZQogICAgc2NhbGluZyBmYWN0b3IgaXMgZm9yIHVzZSBpbiBhIGxpbmVhciBjaGFuZ2Ugb2YgdmFyaWFibGUpLiAgVGhlCiAgICBhcmd1bWVudCBgY2AgaXMgYW4gYXJyYXkgb2YgY29lZmZpY2llbnRzIGZyb20gbG93IHRvIGhpZ2ggZGVncmVlIGFsb25nCiAgICBlYWNoIGF4aXMsIGUuZy4sIFsxLDIsM10gcmVwcmVzZW50cyB0aGUgcG9seW5vbWlhbCBgYDEgKyAyKnggKyAzKngqKjJgYAogICAgd2hpbGUgW1sxLDJdLFsxLDJdXSByZXByZXNlbnRzIGBgMSArIDEqeCArIDIqeSArIDIqeCp5YGAgaWYgYXhpcz0wIGlzCiAgICBgYHhgYCBhbmQgYXhpcz0xIGlzIGBgeWBgLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGMgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgcG9seW5vbWlhbCBjb2VmZmljaWVudHMuIElmIGMgaXMgbXVsdGlkaW1lbnNpb25hbCB0aGUKICAgICAgICBkaWZmZXJlbnQgYXhpcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudCB2YXJpYWJsZXMgd2l0aCB0aGUgZGVncmVlCiAgICAgICAgaW4gZWFjaCBheGlzIGdpdmVuIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGluZGV4LgogICAgbSA6IGludCwgb3B0aW9uYWwKICAgICAgICBOdW1iZXIgb2YgZGVyaXZhdGl2ZXMgdGFrZW4sIG11c3QgYmUgbm9uLW5lZ2F0aXZlLiAoRGVmYXVsdDogMSkKICAgIHNjbCA6IHNjYWxhciwgb3B0aW9uYWwKICAgICAgICBFYWNoIGRpZmZlcmVudGlhdGlvbiBpcyBtdWx0aXBsaWVkIGJ5IGBzY2xgLiAgVGhlIGVuZCByZXN1bHQgaXMKICAgICAgICBtdWx0aXBsaWNhdGlvbiBieSBgYHNjbCoqbWBgLiAgVGhpcyBpcyBmb3IgdXNlIGluIGEgbGluZWFyIGNoYW5nZQogICAgICAgIG9mIHZhcmlhYmxlLiAoRGVmYXVsdDogMSkKICAgIGF4aXMgOiBp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bQogICAgYGxibmRgIGFsb25nIGBheGlzYC4gIEF0IGVhY2ggaXRlcmF0aW9uIHRoZSByZXN1bHRpbmcgc2VyaWVzIGlzCiAgICAqKm11bHRpcGxpZWQqKiBieSBgc2NsYCBhbmQgYW4gaW50ZWdyYXRpb24gY29uc3RhbnQsIGBrYCwgaXMgYWRkZWQuCiAgICBUaGUgc2NhbGluZyBmYWN0b3IgaXMgZm9yIHVzZSBpbiBhIGxpbmVhciBjaGFuZ2Ugb2YgdmFyaWFibGUuICAoIkJ1eWVyCiAgICBiZXdhcmUiOiBub3RlIHRoYXQsIGRlcGVuZGluZyBvbiB3aGF0IG9uZSBpcyBkb2luZywgb25lIG1heSB3YW50IGBzY2xgCiAgICB0byBiZSB0aGUgcmVjaXByb2NhbCBvZiB3aGF0IG9uZSBtaWdodCBleHBlY3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uLAogICAgc2VlIHRoZSBOb3RlcyBzZWN0aW9uIGJlbG93LikgVGhlIGFyZ3VtZW50IGBjYCBpcyBhbiBhcnJheSBvZgogICAgY29lZmZpY2llbnRzLCBmcm9tIGxvdyB0byBoaWdoIGRlZ3JlZSBhbG9uZyBlYWNoIGF4aXMsIGUuZy4sIFsxLDIsM10KICAgIHJlcHJlc2VudHMgdGhlIHBvbHlub21pYWwgYGAxICsgMip4ICsgMyp4KioyYGAgd2hpbGUgW1sxLDJdLFsxLDJdXQogICAgcmVwcmVzZW50cyBgYDEgKyAxKnggKyAyKnkgKyAyKngqeWBgIGlmIGF4aXM9MCBpcyBgYHhgYCBhbmQgYXhpcz0xIGlzCiAgICBgYHlgYC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBjIDogYXJyYXlfbGlrZQogICAgICAgIDEtRCBhcnJheSBvZiBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgb3JkZXJlZCBmcm9tIGxvdyB0byBoaWdoLgogICAgbSA6IGludCwgb3B0aW9uYWwKICAgICAgICBPcmRlciBvZiBpbnRlZ3JhdGlvbiwgbXVzdCBiZSBwb3NpdGl2ZS4gKERlZmF1bHQ6IDEpCiAgICBrIDoge1tdLCBsaXN0LCBzY2FsYXJ9LCBvcHRpb25hbAogICAgICAgIEludGVncmF0aW9uIGNvbnN0YW50KHMpLiAgVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBpbnRlZ3JhbCBhdCB6ZXJvCiAgICAgICAgaXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBsaXN0LCB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBpbnRlZ3JhbAogICAgICAgIGF0IHplcm8gaXMgdGhlIHNlY29uZCB2YWx1ZSwgZXRjLiAgSWYgYGBrID09IFtdYGAgKHRoZSBkZWZhdWx0KSwKICAgICAgICBhbGwgY29uc3RhbnRzIGFyZSBzZXQgdG8gemVyby4gIElmIGBgbSA9PSAxYGAsIGEgc2luZ2xlIHNjYWxhciBjYW4KICAgICAgICBiZSBnaXZlbiBpbnN0ZWFkIG9mIGEgbGlzdC4KICAgIGxibmQgOiBzY2FsYXIsIG9wdGlvbmFsCiAgICAgICAgVGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBpbnRlZ3JhbC4gKERlZmF1bHQ6IDApCiAgICBzY2wgOiBzY2FsYXIsIG9wdGlvbmFsCiAgICAgICAgRm9sbG93aW5nIGVhY2ggaW50ZWdyYXRpb24gdGhlIHJlc3VsdCBpcyAqbXVsdGlwbGllZCogYnkgYHNjbGAKICAgICAgICBiZWZvcmUgdGhlIGludGVncmF0aW9uIGNvbnN0YW50IGlzIGFkZGVkLiAoRGVmYXVsdDogMSkKICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvdmVyIHdoaWNoIHRoZSBpbnRlZ3JhbCBpcyB0YWtlbi4gKERlZmF1bHQ6IDApLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIFMgOiBuZGFycmF5CiAgICAgICAgQ29lZmZpY2llbnQgYXJyYXkgb2YgdGhlIGludGVncmFsLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgYGBtIDwgMWBgLCBgYGxlbihrKSA+IG1gYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHBvbHlkZXIKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIE5vdGUgdGhhdCB0aGUgcmVzdWx0IG9mIGVhY2ggaW50ZWdyYXRpb24gaXMgKm11bHRpcGxpZWQqIGJ5IGBzY2xgLiAgV2h5CiAgICBpcyB0aGlzIGltcG9ydGFudCB0byBub3RlPyAgU2F5IG9uZSBpcyBtYWtpbmcgYSBsaW5lYXIgY2hhbmdlIG9mCiAgICB2YXJpYWJsZSA6bWF0aDpgdSA9IGF4ICsgYmAgaW4gYW4gaW50ZWdyYWwgcmVsYXRpdmUgdG8gYHhgLiBUaGVuCiAgICA6bWF0aDpgZHggPSBkdS9hYCwgc28gb25lIHdpbGwgbmVlZCB0byBzZXQgYHNjbGAgZXF1YWwgdG8KICAgIDptYXRoOmAxL2FgIC0gcGVyaGFwcyBub3Qgd2hhdCBvbmUgd291bGQgaGF2ZSBmaXJzdCB0aG91Z2h0LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGZyb20gbnVtcHkucG9seW5vbWlhbCBpbXBvcnQgcG9seW5vbWlhbCBhcyBQCiAgICA+Pj4gYyA9ICgxLDIsMykKICAgID4+PiBQLnBvbHlpbnQoYykgIyBzaG91bGQgcmV0dXJuIGFycmF5KFswLCAxLCAxLCAxXSkKICAgIGFycmF5KFsgMC4sICAxLiwgIDEuLCAgMS5dKQogICAgPj4+IFAucG9seWludChjLDMpICMgc2hvdWxkIHJldHVybiBhcnJheShbMCwgMCwgMCwgMS82LCAxLzEyLCAxLzIwXSkKICAgIGFycmF5KFsgMC4gICAgICAgICwgIDAuICAgICAgICAsICAwLiAgICAgICAgLCAgMC4xNjY2NjY2NywgIDAuMDgzMzMzMzMsCiAgICAgICAgICAgIDAuMDUgICAgICBdKQogICAgPj4+IFAucG9seWludChjLGs9MykgIyBzaG91bGQgcmV0dXJuIGFycmF5KFszLCAxLCAxLCAxXSkKICAgIGFycmF5KFsgMy4sICAxLiwgIDEuLCAgMS5dKQogICAgPj4+IFAucG9seWludChjLGxibmQ9LTIpICMgc2hvdWxkIHJldHVybiBhcnJheShbNiwgMSwgMSwgMV0pCiAgICBhcnJheShbIDYuLCAgMS4sICAxLiwgIDEuXSkKICAgID4+PiBQLnBvbHlpbnQoYyxzY2w9LTIpICMgc2hvdWxkIHJldHVybiBhcnJheShbMCwgLTIsIC0yLCAtMl0pCiAgICBhcnJheShbIDAuLCAtMi4sIC0yLiwgLTIuXSkKCiAgICByIQAAACkCcksAAAByTAAAAHoNP2JCaEhpSWxMcVFwUGcAAAAAAAAAAGMBAAAAAAAAAAIAAAAEAAAAUwAAAHMUAAAAZwB8AF0MfQF0AHwBgwGRAnEEUwByKQAAACkBckcAAAApAnIrAAAAck0AAAByKQAAAHIpAAAAcioAAAByLQAAAIkCAABzAgAAAAYAehtwb2x5aW50Ljxsb2NhbHM+LjxsaXN0Y29tcD56KFRoZSBvcmRlciBvZiBpbnRlZ3JhdGlvbiBtdXN0IGJlIGludGVnZXJyAQAAAHotVGhlIG9yZGVyIG9mIGludGVncmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZleh5Ub28gbWFueSBpbnRlZ3JhdGlvbiBjb25zdGFudHN6GFRoZSBheGlzIG11c3QgYmUgaW50ZWdlck4pAXJAAAAAKRByJQAAAHImAAAAckAAAAByTgAAANoIaXRlcmFibGVySAAAAHIyAAAAciAAAAByTwAAANoEbGlzdHJQAAAAcjcAAADaA2FsbHJBAAAAclEAAAByEAAAACkNckIAAAByMAAAANoBa1oEbGJuZHIoAAAAclIAAAByUwAAAHJUAAAAclUAAAByLwAAAHI5AAAAcjoAAAByRgAAAHIpAAAAcikAAAByKgAAAHITAAAANQIAAHNEAAAAAE0QAQwCCAEGAQoBBgEWAggBCAEIAQgBDAEIAQgBCAEMAggBBAIaAQwBDgEIAQgBHgEWAiIBEAEMARABHgEeAQgBEgFUYwMAAAAAAAAABQAAAAUAAABDAAAAc6QAAAB0AGoBfAFkAWQCZAONA30BfAFqAmoDZARrBnIkfAFkBRcAfQF0BHwAdAV0BmYCgwJyPHQAoAd8AKEBfQB0BHwAdABqCIMCcmJ8AnJifAGgCXwBagpkBnwAagsUABcAoQF9AXwBZAcZAHwAZAIUABcAfQN4LHQMZAh0DXwBgwFkARcAgwJEAF0WfQR8AXwECwAZAHwDfAAUABcAfQNxhlcAfANTACkJYVkLAAAKICAgIEV2YWx1YXRlIGEgcG9seW5vbWlhbCBhdCBwb2ludHMgeC4KCiAgICBJZiBgY2AgaXMgb2YgbGVuZ3RoIGBuICsgMWAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUKCiAgICAuLiBtYXRoOjogcCh4KSA9IGNfMCArIGNfMSAqIHggKyAuLi4gKyBjX24gKiB4Xm4KCiAgICBUaGUgcGFyYW1ldGVyIGB4YCBpcyBjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb25seSBpZiBpdCBpcyBhIHR1cGxlIG9yIGEKICAgIGxpc3QsIG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIGEgc2NhbGFyLiBJbiBlaXRoZXIgY2FzZSwgZWl0aGVyIGB4YAogICAgb3IgaXRzIGVsZW1lbnRzIG11c3Qgc3VwcG9ydCBtdWx0aXBsaWNhdGlvbiBhbmQgYWRkaXRpb24gYm90aCB3aXRoCiAgICB0aGVtc2VsdmVzIGFuZCB3aXRoIHRoZSBlbGVtZW50cyBvZiBgY2AuCgogICAgSWYgYGNgIGlzIGEgMS1EIGFycmF5LCB0aGVuIGBwKHgpYCB3aWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLiAgSWYKICAgIGBjYCBpcyBtdWx0aWRpbWVuc2lvbmFsLCB0aGVuIHRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlCiAgICB2YWx1ZSBvZiBgdGVuc29yYC4gSWYgYHRlbnNvcmAgaXMgdHJ1ZSB0aGUgc2hhcGUgd2lsbCBiZSBjLnNoYXBlWzE6XSArCiAgICB4LnNoYXBlLiBJZiBgdGVuc29yYCBpcyBmYWxzZSB0aGUgc2hhcGUgd2lsbCBiZSBjLnNoYXBlWzE6XS4gTm90ZSB0aGF0CiAgICBzY2FsYXJzIGhhdmUgc2hhcGUgKCwpLgoKICAgIFRyYWlsaW5nIHplcm9zIGluIHRoZSBjb2VmZmljaWVudHMgd2lsbCBiZSB1c2VkIGluIHRoZSBldmFsdWF0aW9uLCBzbwogICAgdGhleSBzaG91bGQgYmUgYXZvaWRlZCBpZiBlZmZpY2llbmN5IGlzIGEgY29uY2Vybi4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4IDogYXJyYXlfbGlrZSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBJZiBgeGAgaXMgYSBsaXN0IG9yIHR1cGxlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYW4gbmRhcnJheSwgb3RoZXJ3aXNlCiAgICAgICAgaXQgaXMgbGVmdCB1bmNoYW5nZWQgYW5kIHRyZWF0ZWQgYXMgYSBzY2FsYXIuIEluIGVpdGhlciBjYXNlLCBgeGAKICAgICAgICBvciBpdHMgZWxlbWVudHMgbXVzdCBzdXBwb3J0IGFkZGl0aW9uIGFuZCBtdWx0aXBsaWNhdGlvbiB3aXRoCiAgICAgICAgd2l0aCB0aGVtc2VsdmVzIGFuZCB3aXRoIHRoZSBlbGVtZW50cyBvZiBgY2AuCiAgICBjIDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5IG9mIGNvZWZmaWNpZW50cyBvcmRlcmVkIHNvIHRoYXQgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGVybXMgb2YKICAgICAgICBkZWdyZWUgbiBhcmUgY29udGFpbmVkIGluIGNbbl0uIElmIGBjYCBpcyBtdWx0aWRpbWVuc2lvbmFsIHRoZQogICAgICAgIHJlbWFpbmluZyBpbmRpY2VzIGVudW1lcmF0ZSBtdWx0aXBsZSBwb2x5bm9taWFscy4gSW4gdGhlIHR3bwogICAgICAgIGRpbWVuc2lvbmFsIGNhc2UgdGhlIGNvZWZmaWNpZW50cyBtYXkgYmUgdGhvdWdodCBvZiBhcyBzdG9yZWQgaW4KICAgICAgICB0aGUgY29sdW1ucyBvZiBgY2AuCiAgICB0ZW5zb3IgOiBib29sZWFuLCBvcHRpb25hbAogICAgICAgIElmIFRydWUsIHRoZSBzaGFwZSBvZiB0aGUgY29lZmZpY2llbnQgYXJyYXkgaXMgZXh0ZW5kZWQgd2l0aCBvbmVzCiAgICAgICAgb24gdGhlIHJpZ2h0LCBvbmUgZm9yIGVhY2ggZGltZW5zaW9uIG9mIGB4YC4gU2NhbGFycyBoYXZlIGRpbWVuc2lvbiAwCiAgICAgICAgZm9yIHRoaXMgYWN0aW9uLiBUaGUgcmVzdWx0IGlzIHRoYXQgZXZlcnkgY29sdW1uIG9mIGNvZWZmaWNpZW50cyBpbgogICAgICAgIGBjYCBpcyBldmFsdWF0ZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgYHhgLiBJZiBGYWxzZSwgYHhgIGlzIGJyb2FkY2FzdAogICAgICAgIG92ZXIgdGhlIGNvbHVtbnMgb2YgYGNgIGZvciB0aGUgZXZhbHVhdGlvbi4gIFRoaXMga2V5d29yZCBpcyB1c2VmdWwKICAgICAgICB3aGVuIGBjYCBpcyBtdWx0aWRpbWVuc2lvbmFsLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBUcnVlLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHZhbHVlcyA6IG5kYXJyYXksIGNvbXBhdGlibGUgb2JqZWN0CiAgICAgICAgVGhlIHNoYXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyBkZXNjcmliZWQgYWJvdmUuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBwb2x5dmFsMmQsIHBvbHlncmlkMmQsIHBvbHl2YWwzZCwgcG9seWdyaWQzZAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIGV2YWx1YXRpb24gdXNlcyBIb3JuZXIncyBtZXRob2QuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZnJvbSBudW1weS5wb2x5bm9taWFsLnBvbHlub21pYWwgaW1wb3J0IHBvbHl2YWwKICAgID4+PiBwb2x5dmFsKDEsIFsxLDIsM10pCiAgICA2LjAKICAgID4+PiBhID0gbnAuYXJhbmdlKDQpLnJlc2hhcGUoMiwyKQogICAgPj4+IGEKICAgIGFycmF5KFtbMCwgMV0sCiAgICAgICAgICAgWzIsIDNdXSkKICAgID4+PiBwb2x5dmFsKGEsIFsxLDIsM10pCiAgICBhcnJheShbWyAgMS4sICAgNi5dLAogICAgICAgICAgIFsgMTcuLCAgMzQuXV0pCiAgICA+Pj4gY29lZiA9IG5wLmFyYW5nZSg0KS5yZXNoYXBlKDIsMikgIyBtdWx0aWRpbWVuc2lvbmFsIGNvZWZmaWNpZW50cwogICAgPj4+IGNvZWYKICAgIGFycmF5KFtbMCwgMV0sCiAgICAgICAgICAgWzIsIDNdXSkKICAgID4+PiBwb2x5dmFsKFsxLDJdLCBjb2VmLCB0ZW5zb3I9VHJ1ZSkKICAgIGFycmF5KFtbIDIuLCAgNC5dLAogICAgICAgICAgIFsgNC4sICA3Ll1dKQogICAgPj4+IHBvbHl2YWwoWzEsMl0sIGNvZWYsIHRlbnNvcj1GYWxzZSkKICAgIGFycmF5KFsgMi4sICA3Ll0pCgogICAgciEAAAByAQAAACkCcksAAAByTAAAAHoNP2JCaEhpSWxMcVFwUGcAAAAAAAAAACkBciEAAAByJAAAAHIuAAAAKQ5yJQAAAHImAAAAckAAAAByTgAAANoKaXNpbnN0YW5jZdoFdHVwbGVyVwAAANoHYXNhcnJhedoHbmRhcnJhedoHcmVzaGFwZXJRAAAAck8AAAByNwAAAHIyAAAAKQXaAXhyQgAAANoGdGVuc29yWgJjMHIvAAAAcikAAAByKQAAAHIqAAAAchAAAACrAgAAcxYAAAAAURABDAIIAQ4BCgEQARYCEAEYARYBYwMAAAAAAAAAAwAAAAUAAABDAAAAc44AAAB0AGoBfAFkAWQCZAONA30BfAFqAmoDZARrBnIofAGgBHQAagWhAX0BdAZ8AHQHdAhmAoMCckB0AKAJfAChAX0AdAZ8AHQAagqDAnJ8fAJyaHwBoAt8AWoMZAV8AGoNFAAXAKEBfQFuFHwAag18AWoNawVyfHQOZAaDAYIBdABqD3wAfAEYAGQCZAeNAlMAKQhhfQsAAAogICAgRXZhbHVhdGUgYSBwb2x5bm9taWFsIHNwZWNpZmllZCBieSBpdHMgcm9vdHMgYXQgcG9pbnRzIHguCgogICAgSWYgYHJgIGlzIG9mIGxlbmd0aCBgTmAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUKCiAgICAuLiBtYXRoOjogcCh4KSA9IFxwcm9kX3tuPTF9XntOfSAoeCAtIHJfbikKCiAgICBUaGUgcGFyYW1ldGVyIGB4YCBpcyBjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb25seSBpZiBpdCBpcyBhIHR1cGxlIG9yIGEKICAgIGxpc3QsIG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIGEgc2NhbGFyLiBJbiBlaXRoZXIgY2FzZSwgZWl0aGVyIGB4YAogICAgb3IgaXRzIGVsZW1lbnRzIG11c3Qgc3VwcG9ydCBtdWx0aXBsaWNhdGlvbiBhbmQgYWRkaXRpb24gYm90aCB3aXRoCiAgICB0aGVtc2VsdmVzIGFuZCB3aXRoIHRoZSBlbGVtZW50cyBvZiBgcmAuCgogICAgSWYgYHJgIGlzIGEgMS1EIGFycmF5LCB0aGVuIGBwKHgpYCB3aWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLiAgSWYgYHJgCiAgICBpcyBtdWx0aWRpbWVuc2lvbmFsLCB0aGVuIHRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCiAgICBgdGVuc29yYC4gSWYgYHRlbnNvciBpcyBgYFRydWVgYCB0aGUgc2hhcGUgd2lsbCBiZSByLnNoYXBlWzE6XSArIHguc2hhcGU7CiAgICB0aGF0IGlzLCBlYWNoIHBvbHlub21pYWwgaXMgZXZhbHVhdGVkIGF0IGV2ZXJ5IHZhbHVlIG9mIGB4YC4gSWYgYHRlbnNvcmAgaXMKICAgIGBgRmFsc2VgYCwgdGhlIHNoYXBlIHdpbGwgYmUgci5zaGFwZVsxOl07IHRoYXQgaXMsIGVhY2ggcG9seW5vbWlhbCBpcwogICAgZXZhbHVhdGVkIG9ubHkgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJyb2FkY2FzdCB2YWx1ZSBvZiBgeGAuIE5vdGUgdGhhdAogICAgc2NhbGFycyBoYXZlIHNoYXBlICgsKS4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEyCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCA6IGFycmF5X2xpa2UsIGNvbXBhdGlibGUgb2JqZWN0CiAgICAgICAgSWYgYHhgIGlzIGEgbGlzdCBvciB0dXBsZSwgaXQgaXMgY29udmVydGVkIHRvIGFuIG5kYXJyYXksIG90aGVyd2lzZQogICAgICAgIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGFuZCB0cmVhdGVkIGFzIGEgc2NhbGFyLiBJbiBlaXRoZXIgY2FzZSwgYHhgCiAgICAgICAgb3IgaXRzIGVsZW1lbnRzIG11c3Qgc3VwcG9ydCBhZGRpdGlvbiBhbmQgbXVsdGlwbGljYXRpb24gd2l0aAogICAgICAgIHdpdGggdGhlbXNlbHZlcyBhbmQgd2l0aCB0aGUgZWxlbWVudHMgb2YgYHJgLgogICAgciA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiByb290cy4gSWYgYHJgIGlzIG11bHRpZGltZW5zaW9uYWwgdGhlIGZpcnN0IGluZGV4IGlzIHRoZQogICAgICAgIHJvb3QgaW5kZXgsIHdoaWxlIHRoZSByZW1haW5pbmcgaW5kaWNlcyBlbnVtZXJhdGUgbXVsdGlwbGUKICAgICAgICBwb2x5bm9taWFscy4gRm9yIGluc3RhbmNlLCBpbiB0aGUgdHdvIGRpbWVuc2lvbmFsIGNhc2UgdGhlIHJvb3RzCiAgICAgICAgb2YgZWFjaCBwb2x5bm9taWFsIG1heSBiZSB0aG91Z2h0IG9mIGFzIHN0b3JlZCBpbiB0aGUgY29sdW1ucyBvZiBgcmAuCiAgICB0ZW5zb3IgOiBib29sZWFuLCBvcHRpb25hbAogICAgICAgIElmIFRydWUsIHRoZSBzaGFwZSBvZiB0aGUgcm9vdHMgYXJyYXkgaXMgZXh0ZW5kZWQgd2l0aCBvbmVzIG9uIHRoZQogICAgICAgIHJpZ2h0LCBvbmUgZm9yIGVhY2ggZGltZW5zaW9uIG9mIGB4YC4gU2NhbGFycyBoYXZlIGRpbWVuc2lvbiAwIGZvciB0aGlzCiAgICAgICAgYWN0aW9uLiBUaGUgcmVzdWx0IGlzIHRoYXQgZXZlcnkgY29sdW1uIG9mIGNvZWZmaWNpZW50cyBpbiBgcmAgaXMKICAgICAgICBldmFsdWF0ZWQgZm9yIGV2ZXJ5IGVsZW1lbnQgb2YgYHhgLiBJZiBGYWxzZSwgYHhgIGlzIGJyb2FkY2FzdCBvdmVyIHRoZQogICAgICAgIGNvbHVtbnMgb2YgYHJgIGZvciB0aGUgZXZhbHVhdGlvbi4gIFRoaXMga2V5d29yZCBpcyB1c2VmdWwgd2hlbiBgcmAgaXMKICAgICAgICBtdWx0aWRpbWVuc2lvbmFsLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBUcnVlLgoKICAgIFJl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LiBUaGUgc2hhcGUgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIGMuc2hhcGVbMjpdICsKICAgIHguc2hhcGUuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCwgeSA6IGFycmF5X2xpa2UsIGNvbXBhdGlibGUgb2JqZWN0cwogICAgICAgIFRoZSB0d28gZGltZW5zaW9uYWwgc2VyaWVzIGlzIGV2YWx1YXRlZCBhdCB0aGUgcG9pbnRzIGAoeCwgeSlgLAogICAgICAgIHdoZXJlIGB4YCBhbmQgYHlgIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZS4gSWYgYHhgIG9yIGB5YCBpcyBhIGxpc3QKICAgICAgICBvciB0dXBsZSwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIG5kYXJyYXksIG90aGVyd2lzZSBpdCBpcyBsZWZ0CiAgICAgICAgdW5jaGFuZ2VkIGFuZCwgaWYgaXQgaXNuJ3QgYW4gbmRhcnJheSwgaXQgaXMgdHJlYXRlZCBhcyBhIHNjYWxhci4KICAgIGMgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgY29lZmZpY2llbnRzIG9yZGVyZWQgc28gdGhhdCB0aGUgY29lZmZpY2llbnQgb2YgdGhlIHRlcm0KICAgICAgICBvZiBtdWx0aS1kZWdyZWUgaSxqIGlzIGNvbnRhaW5lZCBpbiBgY1tpLGpdYC4gSWYgYGNgIGhhcwogICAgICAgIGRpbWVuc2lvbiBncmVhdGVyIHRoYW4gdHdvIHRoZSByZW1haW5pbmcgaW5kaWNlcyBlbnVtZXJhdGUgbXVsdGlwbGUKICAgICAgICBzZXRzIG9mIGNvZWZmaWNpZW50cy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB2YWx1ZXMgOiBuZGFycmF5LCBjb21wYXRpYmxlIG9iamVjdAogICAgICAgIFRoZSB2YWx1ZXMgb2YgdGhlIHR3byBkaW1lbnNpb25hbCBwb2x5bm9taWFsIGF0IHBvaW50cyBmb3JtZWQgd2l0aAogICAgICAgIHBhaXJzIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZyb20gYHhgIGFuZCBgeWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBwb2x5dmFsLCBwb2x5Z3JpZDJkLCBwb2x5dmFsM2QsIHBvbHlncmlkM2QKCiAgICBOb3RlcwogICAgLS0tLS0KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgIHIBAAAAKQFyTAAAAHoVeCwgeSBhcmUgaW5jb21wYXRpYmxlRikBcmAAAAApBHIlAAAAciYAAABySAAAAHIQAAAAKQNyXwAAANoBeXJCAAAAcikAAAByKQAAAHIqAAAAchoAAABjAwAAcw4AAAAALwIBGgEGAQ4CCgEOAWMDAAAAAAAAAAMAAAADAAAAQwAAAHMYAAAAdAB8AHwCgwJ9AnQAfAF8AoMCfQJ8AlMAKQFh0gYAAAogICAgRXZhbHVhdGUgYSAyLUQgcG9seW5vbWlhbCBvbiB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgeCBhbmQgeS4KCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlczoKCiAgICAuLiBtYXRoOjogcChhLGIpID0gXHN1bV97aSxqfSBjX3tpLGp9ICogYV5pICogYl5qCgogICAgd2hlcmUgdGhlIHBvaW50cyBgKGEsIGIpYCBjb25zaXN0IG9mIGFsbCBwYWlycyBmb3JtZWQgYnkgdGFraW5nCiAgICBgYWAgZnJvbSBgeGAgYW5kIGBiYCBmcm9tIGB5YC4gVGhlIHJlc3VsdGluZyBwb2ludHMgZm9ybSBhIGdyaWQgd2l0aAogICAgYHhgIGluIHRoZSBmaXJzdCBkaW1lbnNpb24gYW5kIGB5YCBpbiB0aGUgc2Vjb25kLgoKICAgIFRoZSBwYXJhbWV0ZXJzIGB4YCBhbmQgYHlgIGFyZSBjb252ZXJ0ZWQgdG8gYXJyYXlzIG9ubHkgaWYgdGhleSBhcmUKICAgIHR1cGxlcyBvciBhIGxpc3RzLCBvdGhlcndpc2UgdGhleSBhcmUgdHJlYXRlZCBhcyBhIHNjYWxhcnMuIEluIGVpdGhlcgogICAgY2FzZSwgZWl0aGVyIGB4YCBhbmQgYHlgIG9yIHRoZWlyIGVsZW1lbnRzIG11c3Qgc3VwcG9ydCBtdWx0aXBsaWNhdGlvbgogICAgYW5kIGFkZGl0aW9uIGJvdGggd2l0aCB0aGVtc2VsdmVzIGFuZCB3aXRoIHRoZSBlbGVtZW50cyBvZiBgY2AuCgogICAgSWYgYGNgIGhhcyBmZXdlciB0aGFuIHR3byBkaW1lbnNpb25zLCBvbmVzIGFyZSBpbXBsaWNpdGx5IGFwcGVuZGVkIHRvCiAgICBpdHMgc2hhcGUgdG8gbWFrZSBpdCAyLUQuIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgYy5zaGFwZVsyOl0gKwogICAgeC5zaGFwZSArIHkuc2hhcGUuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCwgeSA6IGFycmF5X2xpa2UsIGNvbXBhdGlibGUgb2JqZWN0cwogICAgICAgIFRoZSB0d28gZGltZW5zaW9uYWwgc2VyaWVzIGlzIGV2YWx1YXRlZCBhdCB0aGUgcG9pbnRzIGluIHRoZQogICAgICAgIENhcnRlc2lhbiBwcm9kdWN0IG9mIGB4YCBhbmQgYHlgLiAgSWYgYHhgIG9yIGB5YCBpcyBhIGxpc3Qgb3IKICAgICAgICB0dXBsZSwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIG5kYXJyYXksIG90aGVyd2lzZSBpdCBpcyBsZWZ0CiAgICAgICAgdW5jaGFuZ2VkIGFuZCwgaWYgaXQgaXNuJ3QgYW4gbmRhcnJheSwgaXQgaXMgdHJlYXRlZCBhcyBhIHNjYWxhci4KICAgIGMgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgY29lZmZpY2llbnRzIG9yZGVyZWQgc28gdGhhdCB0aGUgY29lZmZpY2llbnRzIGZvciB0ZXJtcyBvZgogICAgICAgIGRlZ3JlZSBpLGogYXJlIGNvbnRhaW5lZCBpbiBgYGNbaSxqXWBgLiBJZiBgY2AgaGFzIGRpbWVuc2lvbgogICAgICAgIGdyZWF0ZXIgdGhhbiB0d28gdGhlIHJlbWFpbmluZyBpbmRpY2VzIGVudW1lcmF0ZSBtdWx0aXBsZSBzZXRzIG9mCiAgICAgICAgY29lZmZpY2llbnRzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHZhbHVlcyA6IG5kYXJyYXksIGNvbXBhdGlibGUgb2JqZWN0CiAgICAgICAgVGhlIHZhbHVlcyBvZiB0aGUgdHdvIGRpbWVuc2lvbmFsIHBvbHlub21pYWwgYXQgcG9pbnRzIGluIHRoZSBDYXJ0ZXNpYW4KICAgICAgICBwcm9kdWN0IG9mIGB4YCBhbmQgYHlgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcG9seXZhbCwgcG9seXZhbDJkLCBwb2x5dmFsM2QsIHBvbHlncmlkM2QKCiAgICBOb3RlcwogICAgLS0tLS0KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgICkBchAAAAApA3JfAAAAcmQAAAByQgAAAHIpAAAAcikAAAByKgAAAHIcAAAAnAMAAHMGAAAAADIKAQoBYwQAAAAAAAAABAAAAAYAAABDAAAAc14AAAB5HnQAagF8AHwBfAJmA2QBZAKNAlwDfQB9AX0CVwBuFAEAAQABAHQCZAODAYIBWQBuAlgAdAN8AHwDgwJ9A3QDfAF8A2QEZAWNA30DdAN8AnwDZARkBY0DfQN8A1MAKQZhlAYAAAogICAgRXZhbHVhdGUgYSAzLUQgcG9seW5vbWlhbCBhdCBwb2ludHMgKHgsIHksIHopLgoKICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWVzOgoKICAgIC4uIG1hdGg6OiBwKHgseSx6KSA9IFxzdW1fe2ksaixrfSBjX3tpLGosa30gKiB4XmkgKiB5XmogKiB6XmsKCiAgICBUaGUgcGFyYW1ldGVycyBgeGAsIGB5YCwgYW5kIGB6YCBhcmUgY29udmVydGVkIHRvIGFycmF5cyBvbmx5IGlmCiAgICB0aGV5IGFyZSB0dXBsZXMgb3IgYSBsaXN0cywgb3RoZXJ3aXNlIHRoZXkgYXJlIHRyZWF0ZWQgYXMgYSBzY2FsYXJzIGFuZAogICAgdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYWZ0ZXIgY29udmVyc2lvbi4gSW4gZWl0aGVyIGNhc2UsIGVpdGhlcgogICAgYHhgLCBgeWAsIGFuZCBgemAgb3IgdGhlaXIgZWxlbWVudHMgbXVzdCBzdXBwb3J0IG11bHRpcGxpY2F0aW9uIGFuZAogICAgYWRkaXRpb24gYm90aCB3aXRoIHRoZW1zZWx2ZXMgYW5kIHdpdGggdGhlIGVsZW1lbnRzIG9mIGBjYC4KCiAgICBJZiBgY2AgaGFzIGZld2VyIHRoYW4gMyBkaW1lbnNpb25zLCBvbmVzIGFyZSBpbXBsaWNpdGx5IGFwcGVuZGVkIHRvIGl0cwogICAgc2hhcGUgdG8gbWFrZSBpdCAzLUQuIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0IHdpbGwgYmUgYy5zaGFwZVszOl0gKwogICAgeC5zaGFwZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4LCB5LCB6IDogYXJyYXlfbGlrZSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBUaGUgdGhyZWUgZGltZW5zaW9uYWwgc2VyaWVzIGlzIGV2YWx1YXRlZCBhdCB0aGUgcG9pbnRzCiAgICAgICAgYCh4LCB5LCB6KWAsIHdoZXJlIGB4YCwgYHlgLCBhbmQgYHpgIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZS4gIElmCiAgICAgICAgYW55IG9mIGB4YCwgYHlgLCBvciBgemAgaXMgYSBsaXN0IG9yIHR1cGxlLCBpdCBpcyBmaXJzdCBjb252ZXJ0ZWQKICAgICAgICB0byBhbiBuZGFycmF5LCBvdGhlcndpc2UgaXQgaXMgbGVmdCB1bmNoYW5nZWQgYW5kIGlmIGl0IGlzbid0IGFuCiAgICAgICAgbmRhcnJheSBpdCBpcyAgdHJlYXRlZCBhcyBhIHNjYWxhci4KICAgIGMgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgb2YgY29lZmZpY2llbnRzIG9yZGVyZWQgc28gdGhhdCB0aGUgY29lZmZpY2llbnQgb2YgdGhlIHRlcm0gb2YKICAgICAgICBtdWx0aS1kZWdyZWUgaSxqLGsgaXMgY29udGFpbmVkIGluIGBgY1tpLGosa11gYC4gSWYgYGNgIGhhcyBkaW1lbnNpb24KICAgICAgICBncmVhdGVyIHRoYW4gMyB0aGUgcmVtYWluaW5nIGluZGljZXMgZW51bWVyYXRlIG11bHRpcGxlIHNldHMgb2YKICAgICAgICBjb2VmZmljaWVudHMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdmFsdWVzIDogbmRhcnJheSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBUaGUgdmFsdWVzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBvbHlub21pYWwgb24gcG9pbnRzIGZvcm1lZCB3aXRoCiAgICAgICAgdHJpcGxlcyBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIGB4YCwgYHlgLCBhbmQgYHpgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcG9seXZhbCwgcG9seXZhbDJkLCBwb2x5Z3JpZDJkLCBwb2x5Z3JpZDNkCgogICAgTm90ZXMKICAgIC0tLS0tCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICByAQAAACkBckwAAAB6GHgsIHksIHogYXJlIGluY29tcGF0aWJsZUYpAXJgAAAAKQRyJQAAAHImAAAAckgAAAByEAAAACkEcl8AAAByZAAAANoBenJCAAAAcikAAAByKQAAAHIqAAAAchsAAADTAwAAcxAAAAAAMAIBHgEGAQ4CCgEOAQ4BYwQAAAAAAAAABAAAAAMAAABDAAAAcyIAAAB0AHwAfAODAn0DdAB8AXwDgwJ9A3QAfAJ8A4MCfQN8A1MAKQFhQAcAAAogICAgRXZhbHVhdGUgYSAzLUQgcG9seW5vbWlhbCBvbiB0aGUgQ2FydGVzaWFuIHByb2R1Y3Qgb2YgeCwgeSBhbmQgei4KCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZhbHVlczoKCiAgICAuLiBtYXRoOjogcChhLGIsYykgPSBcc3VtX3tpLGosa30gY197aSxqLGt9ICogYV5pICogYl5qICogY15rCgogICAgd2hlcmUgdGhlIHBvaW50cyBgKGEsIGIsIGMpYCBjb25zaXN0IG9mIGFsbCB0cmlwbGVzIGZvcm1lZCBieSB0YWtpbmcKICAgIGBhYCBmcm9tIGB4YCwgYGJgIGZyb20gYHlgLCBhbmQgYGNgIGZyb20gYHpgLiBUaGUgcmVzdWx0aW5nIHBvaW50cyBmb3JtCiAgICBhIGdyaWQgd2l0aCBgeGAgaW4gdGhlIGZpcnN0IGRpbWVuc2lvbiwgYHlgIGluIHRoZSBzZWNvbmQsIGFuZCBgemAgaW4KICAgIHRoZSB0aGlyZC4KCiAgICBUaGUgcGFyYW1ldGVycyBgeGAsIGB5YCwgYW5kIGB6YCBhcmUgY29udmVydGVkIHRvIGFycmF5cyBvbmx5IGlmIHRoZXkKICAgIGFyZSB0dXBsZXMgb3IgYSBsaXN0cywgb3RoZXJ3aXNlIHRoZXkgYXJlIHRyZWF0ZWQgYXMgYSBzY2FsYXJzLiBJbgogICAgZWl0aGVyIGNhc2UsIGVpdGhlciBgeGAsIGB5YCwgYW5kIGB6YCBvciB0aGVpciBlbGVtZW50cyBtdXN0IHN1cHBvcnQKICAgIG11bHRpcGxpY2F0aW9uIGFuZCBhZGRpdGlvbiBib3RoIHdpdGggdGhlbXNlbHZlcyBhbmQgd2l0aCB0aGUgZWxlbWVudHMKICAgIG9mIGBjYC4KCiAgICBJZiBgY2AgaGFzIGZld2VyIHRoYW4gdGhyZWUgZGltZW5zaW9ucywgb25lcyBhcmUgaW1wbGljaXRseSBhcHBlbmRlZCB0bwogICAgaXRzIHNoYXBlIHRvIG1ha2UgaXQgMy1ELiBUaGUgc2hhcGUgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIGMuc2hhcGVbMzpdICsKICAgIHguc2hhcGUgKyB5LnNoYXBlICsgei5zaGFwZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4LCB5LCB6IDogYXJyYXlfbGlrZSwgY29tcGF0aWJsZSBvYmplY3RzCiAgICAgICAgVGhlIHRocmVlIGRpbWVuc2lvbmFsIHNlcmllcyBpcyBldmFsdWF0ZWQgYXQgdGhlIHBvaW50cyBpbiB0aGUKICAgICAgICBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiBgeGAsIGB5YCwgYW5kIGB6YC4gIElmIGB4YCxgeWAsIG9yIGB6YCBpcyBhCiAgICAgICAgbGlzdCBvciB0dXBsZSwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIG5kYXJyYXksIG90aGVyd2lzZSBpdCBpcwogICAgICAgIGxlZnQgdW5jaGFuZ2VkIGFuZCwgaWYgaXQgaXNuJ3QgYW4gbmRhcnJheSwgaXQgaXMgdHJlYXRlZCBhcyBhCiAgICAgICAgc2NhbGFyLgogICAgYyA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiBjb2VmZmljaWVudHMgb3JkZXJlZCBzbyB0aGF0IHRoZSBjb2VmZmljaWVudHMgZm9yIHRlcm1zIG9mCiAgICAgICAgZGVncmVlIGksaiBhcmUgY29udGFpbmVkIGluIGBgY1tpLGpdYGAuIElmIGBjYCBoYXMgZGltZW5zaW9uCiAgICAgICAgZ3JlYXRlciB0aGFuIHR3byB0aGUgcmVtYWluaW5nIGluZGljZXMgZW51bWVyYXRlIG11bHRpcGxlIHNldHMgb2YKICAgICAgICBjb2VmZmljaWVudHMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgdmFsdWVzIDogbmRhcnJheSwgY29tcGF0aWJsZSBvYmplY3QKICAgICAgICBUaGUgdmFsdWVzIG9mIHRoZSB0d28gZGltZW5zaW9uYWwgcG9seW5vbWlhbCBhdCBwb2ludHMgaW4gdGhlIENhcnRlc2lhbgogICAgICAgIHByb2R1Y3Qgb2YgYHhgIGFuZCBgeWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBwb2x5dmFsLCBwb2x5dmFsMmQsIHBvbHlncmlkMmQsIHBvbHl2YWwzZAoKICAgIE5vdGVzCiAgICAtLS0tLQoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgKQFyEAAAACkEcl8AAAByZAAAAHJlAAAAckIAAAByKQAAAHIpAAAAcioAAAByHQAAAA4EAABzCAAAAAA1CgEKAQoBYwIAAAAAAAAABwAAAAUAAABDAAAAc7wAAAB0AHwBgwF9AnwCfAFrA3IYdAFkAYMBggF8AmQCawByKHQBZAODAYIBdAJqA3wAZAJkBGQFjQNkBhcAfQB8AmQEFwBmAXwAagQXAH0DfABqBX0EdAJqBnwDfARkB40CfQV8AGQCFABkBBcAfAVkAjwAfAJkAmsEcqx8AHwFZAQ8AHgqdAdkCHwCZAQXAIMCRABdGH0GfAV8BmQEGAAZAHwAFAB8BXwGPABxkFcAdAKgCHwFZAJ8BWoJoQNTACkJYfIEAABWYW5kZXJtb25kZSBtYXRyaXggb2YgZ2l2ZW4gZGVncmVlLgoKICAgIFJldHVybnMgdGhlIFZhbmRlcm1vbmRlIG1hdHJpeCBvZiBkZWdyZWUgYGRlZ2AgYW5kIHNhbXBsZSBwb2ludHMKICAgIGB4YC4gVGhlIFZhbmRlcm1vbmRlIG1hdHJpeCBpcyBkZWZpbmVkIGJ5CgogICAgLi4gbWF0aDo6IFZbLi4uLCBpXSA9IHheaSwKCiAgICB3aGVyZSBgMCA8PSBpIDw9IGRlZ2AuIFRoZSBsZWFkaW5nIGluZGljZXMgb2YgYFZgIGluZGV4IHRoZSBlbGVtZW50cyBvZgogICAgYHhgIGFuZCB0aGUgbGFzdCBpbmRleCBpcyB0aGUgcG93ZXIgb2YgYHhgLgoKICAgIElmIGBjYCBpcyBhIDEtRCBhcnJheSBvZiBjb2VmZmljaWVudHMgb2YgbGVuZ3RoIGBuICsgMWAgYW5kIGBWYCBpcyB0aGUKICAgIG1hdHJpeCBgYFYgPSBwb2x5dmFuZGVyKHgsIG4pYGAsIHRoZW4gYGBucC5kb3QoViwgYylgYCBhbmQKICAgIGBgcG9seXZhbCh4LCBjKWBgIGFyZSB0aGUgc2FtZSB1cCB0byByb3VuZG9mZi4gVGhpcyBlcXVpdmFsZW5jZSBpcwogICAgdXNlZnVsIGJvdGggZm9yIGxlYXN0IHNxdWFyZXMgZml0dGluZyBhbmQgZm9yIHRoZSBldmFsdWF0aW9uIG9mIGEgbGFyZ2UKICAgIG51bWJlciBvZiBwb2x5bm9taWFscyBvZiB0aGUgc2FtZSBkZWdyZWUgYW5kIHNhbXBsZSBwb2ludHMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBvZiBwb2ludHMuIFRoZSBkdHlwZSBpcyBjb252ZXJ0ZWQgdG8gZmxvYXQ2NCBvciBjb21wbGV4MTI4CiAgICAgICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYW55IG9mIHRoZSBlbGVtZW50cyBhcmUgY29tcGxleC4gSWYgYHhgIGlzCiAgICAgICAgc2NhbGFyIGl0IGlzIGNvbnZlcnRlZCB0byBhIDEtRCBhcnJheS4KICAgIGRlZyA6IGludAogICAgICAgIERlZ3JlZSBvZiB0aGUgcmVzdWx0aW5nIG1hdHJpeC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB2YW5kZXIgOiBuZGFycmF5LgogICAgICAgIFRoZSBWYW5kZXJtb25kZSBtYXRyaXguIFRoZSBzaGFwZSBvZiB0aGUgcmV0dXJuZWQgbWF0cml4IGlzCiAgICAgICAgYGB4LnNoYXBlICsgKGRlZyArIDEsKWBgLCB3aGVyZSB0aGUgbGFzdCBpbmRleCBpcyB0aGUgcG93ZXIgb2YgYHhgLgogICAgICAgIFRoZSBkdHlwZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjb252ZXJ0ZWQgYHhgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcG9seXZhbmRlcjJkLCBwb2x5dmFuZGVyM2QKCiAgICB6E2RlZyBtdXN0IGJlIGludGVnZXJyAQAAAHoYZGVnIG11c3QgYmUgbm9uLW5lZ2F0aXZlciEAAAApAnJMAAAAcksAAABnAAAAAAAAAAApAXJAAAAAci4AAAApCnJHAAAAckgAAAByJQAAAHImAAAAclEAAAByQAAAAHJBAAAAcjcAAAByUAAAAHJPAAAAKQdyXwAAANoDZGVn2gRpZGVnWgRkaW1zWgRkdHlw2gF2ci8AAAByKQAAAHIpAAAAcioAAAByFQAAAEkEAABzHgAAAAAmCAEIAQgBCAEIAhQBEAEGAQ4BEAEIAQgBFAEYAWMDAAAAAAAAAAoAAAAGAAAAQwAAAHOeAAAAZAFkAoQAfAJEAIMBfQNkA2QChAB0AHwDfAKDAkQAgwF9BHwEZARkBGcCawNyNnQBZAWDAYIBfANcAn0FfQZ0AmoDfAB8AWYCZAZkB40CZAgXAFwCfQB9AXQEfAB8BYMCfQd0BHwBfAaDAn0IfAdkCRkAfAhkCmQLZAtkC4UCZgMZABQAfQl8CaAFfAlqBmQLZAyFAhkAZA0XAKEBUwApDmFJBgAAUHNldWRvLVZhbmRlcm1vbmRlIG1hdHJpeCBvZiBnaXZlbiBkZWdyZWVzLgoKICAgIFJldHVybnMgdGhlIHBzZXVkby1WYW5kZXJtb25kZSBtYXRyaXggb2YgZGVncmVlcyBgZGVnYCBhbmQgc2FtcGxlCiAgICBwb2ludHMgYCh4LCB5KWAuIFRoZSBwc2V1ZG8tVmFuZGVybW9uZGUgbWF0cml4IGlzIGRlZmluZWQgYnkKCiAgICAuLiBtYXRoOjogVlsuLi4sIChkZWdbMV0gKyAxKSppICsgal0gPSB4XmkgKiB5XmosCgogICAgd2hlcmUgYDAgPD0gaSA8PSBkZWdbMF1gIGFuZCBgMCA8PSBqIDw9IGRlZ1sxXWAuIFRoZSBsZWFkaW5nIGluZGljZXMgb2YKICAgIGBWYCBpbmRleCB0aGUgcG9pbnRzIGAoeCwgeSlgIGFuZCB0aGUgbGFzdCBpbmRleCBlbmNvZGVzIHRoZSBwb3dlcnMgb2YKICAgIGB4YCBhbmQgYHlgLgoKICAgIElmIGBgViA9IHBvbHl2YW5kZXIyZCh4LCB5LCBbeGRlZywgeWRlZ10pYGAsIHRoZW4gdGhlIGNvbHVtbnMgb2YgYFZgCiAgICBjb3JyZXNwb25kIHRvIHRoZSBlbGVtZW50cyBvZiBhIDItRCBjb2VmZmljaWVudCBhcnJheSBgY2Agb2Ygc2hhcGUKICAgICh4ZGVnICsgMSwgeWRlZyArIDEpIGluIHRoZSBvcmRlcgoKICAgIC4uIG1hdGg6OiBjX3swMH0sIGNfezAxfSwgY197MDJ9IC4uLiAsIGNfezEwfSwgY197MTF9LCBjX3sxMn0gLi4uCgogICAgYW5kIGBgbnAuZG90KFYsIGMuZmxhdClgYCBhbmQgYGBwb2x5dmFsMmQoeCwgeSwgYylgYCB3aWxsIGJlIHRoZSBzYW1lCiAgICB1cCB0byByb3VuZG9mZi4gVGhpcyBlcXVpdmFsZW5jZSBpcyB1c2VmdWwgYm90aCBmb3IgbGVhc3Qgc3F1YXJlcwogICAgZml0dGluZyBhbmQgZm9yIHRoZSBldmFsdWF0aW9uIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIDItRCBwb2x5bm9taWFscwogICAgb2YgdGhlIHNhbWUgZGVncmVlcyBhbmQgc2FtcGxlIHBvaW50cy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICB4LCB5IDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5cyBvZiBwb2ludCBjb29yZGluYXRlcywgYWxsIG9mIHRoZSBzYW1lIHNoYXBlLiBUaGUgZHR5cGVzCiAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gZWl0aGVyIGZsb2F0NjQgb3IgY29tcGxleDEyOCBkZXBlbmRpbmcgb24KICAgICAgICB3aGV0aGVyIGFueSBvZiB0aGUgZWxlbWVudHMgYXJlIGNvbXBsZXguIFNjYWxhcnMgYXJlIGNvbnZlcnRlZCB0bwogICAgICAgIDEtRCBhcnJheXMuCiAgICBkZWcgOiBsaXN0IG9mIGludHMKICAgICAgICBMaXN0IG9mIG1heGltdW0gZGVncmVlcyBvZiB0aGUgZm9ybSBbeF9kZWcsIHlfZGVnXS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB2YW5kZXIyZCA6IG5kYXJyYXkKICAgICAgICBUaGUgc2hhcGUgb2YgdGhlIHJldHVybmVkIG1hdHJpeCBpcyBgYHguc2hhcGUgKyAob3JkZXIsKWBgLCB3aGVyZQogICAgICAgIDptYXRoOmBvcmRlciA9IChkZWdbMF0rMSkqKGRlZyhbMV0rMSlgLiAgVGhlIGR0eXBlIHdpbGwgYmUgdGhlIHNhbWUKICAgICAgICBhcyB0aGUgY29udmVydGVkIGB4YCBhbmQgYHlgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcG9seXZhbmRlciwgcG9seXZhbmRlcjNkLiBwb2x5dmFsMmQsIHBvbHl2YWwzZAoKICAgIGMBAAAAAAAAAAIAAAAEAAAAUwAAAHMUAAAAZwB8AF0MfQF0AHwBgwGRAnEEUwByKQAAACkBckcAAAApAnIrAAAA2gFkcikAAAByKQAAAHIqAAAAci0AAACuBAAAcwIAAAAGAHogcG9seXZhbmRlcjJkLjxsb2NhbHM+LjxsaXN0Y29tcD5jAQAAAAAAAAADAAAABAAAAFMAAABzIAAAAGcAfABdGFwCfQF9AnwBfAJrAm8afAFkAGsFkQJxBFMAKQFyAQAAAHIpAAAAKQNyKwAAANoCaWRyaQAAAHIpAAAAcikAAAByKgAAAHItAAAArwQAAHMCAAAABgByIQAAAHolZGVncmVlcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vyc3IBAAAAKQFyTAAAAGcAAAAAAAAAACkCLk4uTun+////KQFyJAAAACkH2gN6aXBySAAAAHIlAAAAciYAAAByFQAAAHJeAAAAclEAAAApCnJfAAAAcmQAAAByZgAAAHJnAAAA2ghpc192YWxpZNoEZGVneNoEZGVnedoCdnjaAnZ5cmgAAAByKQAAAHIpAAAAcioAAAByHgAAAIEEAABzFAAAAAAtDgEUAQwBCAEIARoCCgEKARoDYwQAAAAAAAAADQAAAAcAAABDAAAAc8YAAABkAWQChAB8A0QAgwF9BGQDZAKEAHQAfAR8A4MCRACDAX0FfAVkBGQEZARnA2sDcjh0AWQFgwGCAXwEXAN9Bn0HfQh0AmoDfAB8AXwCZgNkBmQHjQJkCBcAXAN9AH0BfQJ0BHwAfAaDAn0JdAR8AXwHgwJ9CnQEfAJ8CIMCfQt8CWQJGQB8CmQKZAtkC2QLhQJkC2YEGQAUAHwLZApkC2QLZAtkC4UCZgQZABQAfQx8DKAFfAxqBmQLZAyFAhkAZA0XAKEBUwApDmEMBwAAUHNldWRvLVZhbmRlcm1vbmRlIG1hdHJpeCBvZiBnaXZlbiBkZWdyZWVzLgoKICAgIFJldHVybnMgdGhlIHBzZXVkby1WYW5kZXJtb25kZSBtYXRyaXggb2YgZGVncmVlcyBgZGVnYCBhbmQgc2FtcGxlCiAgICBwb2ludHMgYCh4LCB5LCB6KWAuIElmIGBsLCBtLCBuYCBhcmUgdGhlIGdpdmVuIGRlZ3JlZXMgaW4gYHgsIHksIHpgLAogICAgdGhlbiBUaGUgcHNldWRvLVZhbmRlcm1vbmRlIG1hdHJpeCBpcyBkZWZpbmVkIGJ5CgogICAgLi4gbWF0aDo6IFZbLi4uLCAobSsxKShuKzEpaSArIChuKzEpaiArIGtdID0geF5pICogeV5qICogel5rLAoKICAgIHdoZXJlIGAwIDw9IGkgPD0gbGAsIGAwIDw9IGogPD0gbWAsIGFuZCBgMCA8PSBqIDw9IG5gLiAgVGhlIGxlYWRpbmcKICAgIGluZGljZXMgb2YgYFZgIGluZGV4IHRoZSBwb2ludHMgYCh4LCB5LCB6KWAgYW5kIHRoZSBsYXN0IGluZGV4IGVuY29kZXMKICAgIHRoZSBwb3dlcnMgb2YgYHhgLCBgeWAsIGFuZCBgemAuCgogICAgSWYgYGBWID0gcG9seXZhbmRlcjNkKHgsIHksIHosIFt4ZGVnLCB5ZGVnLCB6ZGVnXSlgYCwgdGhlbiB0aGUgY29sdW1ucwogICAgb2YgYFZgIGNvcnJlc3BvbmQgdG8gdGhlIGVsZW1lbnRzIG9mIGEgMy1EIGNvZWZmaWNpZW50IGFycmF5IGBjYCBvZgogICAgc2hhcGUgKHhkZWcgKyAxLCB5ZGVnICsgMSwgemRlZyArIDEpIGluIHRoZSBvcmRlcgoKICAgIC4uIG1hdGg6OiBjX3swMDB9LCBjX3swMDF9LCBjX3swMDJ9LC4uLiAsIGNfezAxMH0sIGNfezAxMX0sIGNfezAxMn0sLi4uCgogICAgYW5kICBgYG5wLmRvdChWLCBjLmZsYXQpYGAgYW5kIGBgcG9seXZhbDNkKHgsIHksIHosIGMpYGAgd2lsbCBiZSB0aGUKICAgIHNhbWUgdXAgdG8gcm91bmRvZmYuIFRoaXMgZXF1aXZhbGVuY2UgaXMgdXNlZnVsIGJvdGggZm9yIGxlYXN0IHNxdWFyZXMKICAgIGZpdHRpbmcgYW5kIGZvciB0aGUgZXZhbHVhdGlvbiBvZiBhIGxhcmdlIG51bWJlciBvZiAzLUQgcG9seW5vbWlhbHMKICAgIG9mIHRoZSBzYW1lIGRlZ3JlZXMgYW5kIHNhbXBsZSBwb2ludHMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCwgeSwgeiA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheXMgb2YgcG9pbnQgY29vcmRpbmF0ZXMsIGFsbCBvZiB0aGUgc2FtZSBzaGFwZS4gVGhlIGR0eXBlcyB3aWxsCiAgICAgICAgYmUgY29udmVydGVkIHRvIGVpdGhlciBmbG9hdDY0IG9yIGNvbXBsZXgxMjggZGVwZW5kaW5nIG9uIHdoZXRoZXIKICAgICAgICBhbnkgb2YgdGhlIGVsZW1lbnRzIGFyZSBjb21wbGV4LiBTY2FsYXJzIGFyZSBjb252ZXJ0ZWQgdG8gMS1ECiAgICAgICAgYXJyYXlzLgogICAgZGVnIDogbGlzdCBvZiBpbnRzCiAgICAgICAgTGlzdCBvZiBtYXhpbXVtIGRlZ3JlZXMgb2YgdGhlIGZvcm0gW3hfZGVnLCB5X2RlZywgel9kZWddLgoKICAgIFJldHVy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dXJuZWQgY29lZmZpY2llbnRzIHdpbGwgYWxzbyBiZSAxLUQuIElmIGB5YCBpcyAyLUQgbXVsdGlwbGUKICAgIGZpdHMgYXJlIGRvbmUsIG9uZSBmb3IgZWFjaCBjb2x1bW4gb2YgYHlgLCBhbmQgdGhlIHJlc3VsdGluZwogICAgY29lZmZpY2llbnRzIGFyZSBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1ucyBvZiBhIDItRCByZXR1cm4uCiAgICBUaGUgZml0dGVkIHBvbHlub21pYWwocykgYXJlIGluIHRoZSBmb3JtCgogICAgLi4gbWF0aDo6ICBwKHgpID0gY18wICsgY18xICogeCArIC4uLiArIGNfbiAqIHhebiwKCiAgICB3aGVyZSBgbmAgaXMgYGRlZ2AuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgeCA6IGFycmF5X2xpa2UsIHNoYXBlIChgTWAsKQogICAgICAgIHgtY29vcmRpbmF0ZXMgb2YgdGhlIGBNYCBzYW1wbGUgKGRhdGEpIHBvaW50cyBgYCh4W2ldLCB5W2ldKWBgLgogICAgeSA6IGFycmF5X2xpa2UsIHNoYXBlIChgTWAsKSBvciAoYE1gLCBgS2ApCiAgICAgICAgeS1jb29yZGluYXRlcyBvZiB0aGUgc2FtcGxlIHBvaW50cy4gIFNldmVyYWwgc2V0cyBvZiBzYW1wbGUgcG9pbnRzCiAgICAgICAgc2hhcmluZyB0aGUgc2FtZSB4LWNvb3JkaW5hdGVzIGNhbiBiZSAoaW5kZXBlbmRlbnRseSkgZml0IHdpdGggb25lCiAgICAgICAgY2FsbCB0byBgcG9seWZpdGAgYnkgcGFzc2luZyBpbiBmb3IgYHlgIGEgMi1EIGFycmF5IHRoYXQgY29udGFpbnMKICAgICAgICBvbmUgZGF0YSBzZXQgcGVyIGNvbHVtbi4KICAgIGRlZyA6IGludCBvciAxLUQgYXJyYXlfbGlrZQogICAgICAgIERlZ3JlZShzKSBvZiB0aGUgZml0dGluZyBwb2x5bm9taWFscy4gSWYgYGRlZ2AgaXMgYSBzaW5nbGUgaW50ZWdlcgogICAgICAgIGFsbCB0ZXJtcyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBgZGVnYCd0aCB0ZXJtIGFyZSBpbmNsdWRlZCBpbiB0aGUKICAgICAgICBmaXQuIEZvciBOdW1QeSB2ZXJzaW9ucyA+PSAxLjExLjAgYSBsaXN0IG9mIGludGVnZXJzIHNwZWNpZnlpbmcgdGhlCiAgICAgICAgZGVncmVlcyBvZiB0aGUgdGVybXMgdG8gaW5jbHVkZSBtYXkgYmUgdXNlZCBpbnN0ZWFkLgogICAgcmNvbmQgOiBmbG9hdCwgb3B0aW9uYWwKICAgICAgICBSZWxhdGl2ZSBjb25kaXRpb24gbnVtYmVyIG9mIHRoZSBmaXQuICBTaW5ndWxhciB2YWx1ZXMgc21hbGxlcgogICAgICAgIHRoYW4gYHJjb25kYCwgcmVsYXRpdmUgdG8gdGhlIGxhcmdlc3Qgc2luZ3VsYXIgdmFsdWUsIHdpbGwgYmUKICAgICAgICBpZ25vcmVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBsZW4oeCkqZXBzYGAsIHdoZXJlIGBlcHNgIGlzIHRoZQogICAgICAgIHJlbGF0aXZlIHByZWNpc2lvbiBvZiB0aGUgcGxhdGZvcm0ncyBmbG9hdCB0eXBlLCBhYm91dCAyZS0xNiBpbgogICAgICAgIG1vc3QgY2FzZXMuCiAgICBmdWxsIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBTd2l0Y2ggZGV0ZXJtaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgV2hlbiBgYEZhbHNlYGAKICAgICAgICAodGhlIGRlZmF1bHQpIGp1c3QgdGhlIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQ7IHdoZW4gYGBUcnVlYGAsCiAgICAgICAgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzaW5ndWxhciB2YWx1ZSBkZWNvbXBvc2l0aW9uICh1c2VkCiAgICAgICAgdG8gc29sdmUgdGhlIGZpdCdzIG1hdHJpeCBlcXVhdGlvbikgaXMgYWxzbyByZXR1cm5lZC4KICAgIHcgOiBhcnJheV9saWtlLCBzaGFwZSAoYE1gLCksIG9wdGlvbmFsCiAgICAgICAgV2VpZ2h0cy4gSWYgbm90IE5vbmUsIHRoZSBjb250cmlidXRpb24gb2YgZWFjaCBwb2ludAogICAgICAgIGBgKHhbaV0seVtpXSlgYCB0byB0aGUgZml0IGlzIHdlaWdodGVkIGJ5IGB3W2ldYC4gSWRlYWxseSB0aGUKICAgICAgICB3ZWlnaHRzIGFyZSBjaG9zZW4gc28gdGhhdCB0aGUgZXJyb3JzIG9mIHRoZSBwcm9kdWN0cyBgYHdbaV0qeVtpXWBgCiAgICAgICAgYWxsIGhhdmUgdGhlIHNhbWUgdmFyaWFuY2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBOb25lLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjUuMAoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGNvZWYgOiBuZGFycmF5LCBzaGFwZSAoYGRlZ2AgKyAxLCkgb3IgKGBkZWdgICsgMSwgYEtgKQogICAgICAgIFBvbHlub21pYWwgY29lZmZpY2llbnRzIG9yZGVyZWQgZnJvbSBsb3cgdG8gaGlnaC4gIElmIGB5YCB3YXMgMi1ELAogICAgICAgIHRoZSBjb2VmZmljaWVudHMgaW4gY29sdW1uIGBrYCBvZiBgY29lZmAgcmVwcmVzZW50IHRoZSBwb2x5bm9taWFsCiAgICAgICAgZml0IHRvIHRoZSBkYXRhIGluIGB5YCdzIGBrYC10aCBjb2x1bW4uCgogICAgW3Jlc2lkdWFscywgcmFuaywgc2luZ3VsYXJfdmFsdWVzLCByY29uZF0gOiBsaXN0CiAgICAgICAgVGhlc2UgdmFsdWVzIGFyZSBvbmx5IHJldHVybmVkIGlmIGBmdWxsYCA9IFRydWUKCiAgICAgICAgcmVzaWQgLS0gc3VtIG9mIHNxdWFyZWQgcmVzaWR1YWxzIG9mIHRoZSBsZWFzdCBzcXVhcmVzIGZpdAogICAgICAgIHJhbmsgLS0gdGhlIG51bWVyaWNhbCByYW5rIG9mIHRoZSBzY2FsZWQgVmFuZGVybW9uZGUgbWF0cml4CiAgICAgICAgc3YgLS0gc2luZ3VsYXIgdmFsdWVzIG9mIHRoZSBzY2FsZWQgVmFuZGVybW9uZGUgbWF0cml4CiAgICAgICAgcmNvbmQgLS0gdmFsdWUgb2YgYHJjb25kYC4KCiAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgc2VlIGBsaW5hbGcubHN0c3FgLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBSYW5rV2FybmluZwogICAgICAgIFJhaXNlZCBpZiB0aGUgbWF0cml4IGluIHRoZSBsZWFzdC1zcXVhcmVzIGZpdCBpcyByYW5rIGRlZmljaWVudC4KICAgICAgICBUaGUgd2FybmluZyBpcyBvbmx5IHJhaXNlZCBpZiBgZnVsbGAgPT0gRmFsc2UuICBUaGUgd2FybmluZ3MgY2FuCiAgICAgICAgYmUgdHVybmVkIG9mZiBieToKCiAgICAgICAgPj4+IGltcG9ydCB3YXJuaW5ncwogICAgICAgID4+PiB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFJhbmtXYXJuaW5nKQoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYmZpdCwgbGVnZml0LCBsYWdmaXQsIGhlcm1maXQsIGhlcm1lZml0CiAgICBwb2x5dmFsIDogRXZhbHVhdGVzIGEgcG9seW5vbWlhbC4KICAgIHBvbHl2YW5kZXIgOiBWYW5kZXJtb25kZSBtYXRyaXggZm9yIHBvd2Vycy4KICAgIGxpbmFsZy5sc3RzcSA6IENvbXB1dGVzIGEgbGVhc3Qtc3F1YXJlcyBmaXQgZnJvbSB0aGUgbWF0cml4LgogICAgc2NpcHkuaW50ZXJwb2xhdGUuVW5pdmFyaWF0ZVNwbGluZSA6IENvbXB1dGVzIHNwbGluZSBmaXRzLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIHNvbHV0aW9uIGlzIHRoZSBjb2VmZmljaWVudHMgb2YgdGhlIHBvbHlub21pYWwgYHBgIHRoYXQgbWluaW1pemVzCiAgICB0aGUgc3VtIG9mIHRoZSB3ZWlnaHRlZCBzcXVhcmVkIGVycm9ycwoKICAgIC4uIG1hdGggOjogRSA9IFxzdW1faiB3X2peMiAqIHx5X2ogLSBwKHhfail8XjIsCgogICAgd2hlcmUgdGhlIDptYXRoOmB3X2pgIGFyZSB0aGUgd2VpZ2h0cy4gVGhpcyBwcm9ibGVtIGlzIHNvbHZlZCBieQogICAgc2V0dGluZyB1cCB0aGUgKHR5cGljYWxseSkgb3Zlci1kZXRlcm1pbmVkIG1hdHJpeCBlcXVhdGlvbjoKCiAgICAuLiBtYXRoIDo6IFYoeCkgKiBjID0gdyAqIHksCgogICAgd2hlcmUgYFZgIGlzIHRoZSB3ZWlnaHRlZCBwc2V1ZG8gVmFuZGVybW9uZGUgbWF0cml4IG9mIGB4YCwgYGNgIGFyZSB0aGUKICAgIGNvZWZmaWNpZW50cyB0byBiZSBzb2x2ZWQgZm9yLCBgd2AgYXJlIHRoZSB3ZWlnaHRzLCBhbmQgYHlgIGFyZSB0aGUKICAgIG9ic2VydmVkIHZhbHVlcy4gIFRoaXMgZXF1YXRpb24gaXMgdGhlbiBzb2x2ZWQgdXNpbmcgdGhlIHNpbmd1bGFyIHZhbHVlCiAgICBkZWNvbXBvc2l0aW9uIG9mIGBWYC4KCiAgICBJZiBzb21lIG9mIHRoZSBzaW5ndWxhciB2YWx1ZXMgb2YgYFZgIGFyZSBzbyBzbWFsbCB0aGF0IHRoZXkgYXJlCiAgICBuZWdsZWN0ZWQgKGFuZCBgZnVsbGAgPT0gYGBGYWxzZWBgKSwgYSBgUmFua1dhcm5pbmdgIHdpbGwgYmUgcmFpc2VkLgogICAgVGhpcyBtZWFucyB0aGF0IHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgbWF5IGJlIHBvb3JseSBkZXRlcm1pbmVkLgogICAgRml0dGluZyB0byBhIGxvd2VyIG9yZGVyIHBvbHlub21pYWwgd2lsbCB1c3VhbGx5IGdldCByaWQgb2YgdGhlIHdhcm5pbmcKICAgIChidXQgbWF5IG5vdCBiZSB3aGF0IHlvdSB3YW50LCBvZiBjb3Vyc2U7IGlmIHlvdSBoYXZlIGluZGVwZW5kZW50CiAgICByZWFzb24ocykgZm9yIGNob29zaW5nIHRoZSBkZWdyZWUgd2hpY2ggaXNuJ3Qgd29ya2luZywgeW91IG1heSBoYXZlIHRvOgogICAgYSkgcmVjb25zaWRlciB0aG9zZSByZWFzb25zLCBhbmQvb3IgYikgcmVjb25zaWRlciB0aGUgcXVhbGl0eSBvZiB5b3VyCiAgICBkYXRhKS4gIFRoZSBgcmNvbmRgIHBhcmFtZXRlciBjYW4gYWxzbyBiZSBzZXQgdG8gYSB2YWx1ZSBzbWFsbGVyIHRoYW4KICAgIGl0cyBkZWZhdWx0LCBidXQgdGhlIHJlc3VsdGluZyBmaXQgbWF5IGJlIHNwdXJpb3VzIGFuZCBoYXZlIGxhcmdlCiAgICBjb250cmlidXRpb25zIGZyb20gcm91bmRvZmYgZXJyb3IuCgogICAgUG9seW5vbWlhbCBmaXRzIHVzaW5nIGRvdWJsZSBwcmVjaXNpb24gdGVuZCB0byAiZmFpbCIgYXQgYWJvdXQKICAgIChwb2x5bm9taWFsKSBkZWdyZWUgMjAuIEZpdHMgdXNpbmcgQ2hlYnlzaGV2IG9yIExlZ2VuZHJlIHNlcmllcyBhcmUKICAgIGdlbmVyYWxseSBiZXR0ZXIgY29uZGl0aW9uZWQsIGJ1dCBtdWNoIGNhbiBzdGlsbCBkZXBlbmQgb24gdGhlCiAgICBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSBwb2ludHMgYW5kIHRoZSBzbW9vdGhuZXNzIG9mIHRoZSBkYXRhLiAgSWYKICAgIHRoZSBxdWFsaXR5IG9mIHRoZSBmaXQgaXMgaW5hZGVxdWF0ZSwgc3BsaW5lcyBtYXkgYmUgYSBnb29kCiAgICBhbHRlcm5hdGl2ZS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIG51bXB5LnBvbHlub21pYWwgaW1wb3J0IHBvbHlub21pYWwgYXMgUAogICAgPj4+IHggPSBucC5saW5zcGFjZSgtMSwxLDUxKSAjIHggImRhdGEiOiBbLTEsIC0wLjk2LCAuLi4sIDAuOTYsIDFdCiAgICA+Pj4geSA9IHgqKjMgLSB4ICsgbnAucmFuZG9tLnJhbmRuKGxlbih4KSkgIyB4XjMgLSB4ICsgTigwLDEpICJub2lzZSIKICAgID4+PiBjLCBzdGF0cyA9IFAucG9seWZpdCh4LHksMyxmdWxsPVRydWUpCiAgICA+Pj4gYyAjIGNbMF0sIGNbMl0gc2hvdWxkIGJlIGFwcHJveC4gMCwgY1sxXSBhcHByb3guIC0xLCBjWzNdIGFwcHJveC4gMQogICAgYXJyYXkoWyAwLjAxOTA5NzI1LCAtMS4zMDU5ODI1NiwgLTAuMDA1Nzc5NjMsICAxLjAy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IGFycmF5IG9mIHBvbHlub21pYWwgY29lZmZpY2llbnRzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IG5kYXJyYXkKICAgICAgICBBcnJheSBvZiB0aGUgcm9vdHMgb2YgdGhlIHBvbHlub21pYWwuIElmIGFsbCB0aGUgcm9vdHMgYXJlIHJlYWwsCiAgICAgICAgdGhlbiBgb3V0YCBpcyBhbHNvIHJlYWwsIG90aGVyd2lzZSBpdCBpcyBjb21wbGV4LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgY2hlYnJvb3RzCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgcm9vdCBlc3RpbWF0ZXMgYXJlIG9idGFpbmVkIGFzIHRoZSBlaWdlbnZhbHVlcyBvZiB0aGUgY29tcGFuaW9uCiAgICBtYXRyaXgsIFJvb3RzIGZhciBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIGNvbXBsZXggcGxhbmUgbWF5IGhhdmUgbGFyZ2UKICAgIGVycm9ycyBkdWUgdG8gdGhlIG51bWVyaWNhbCBpbnN0YWJpbGl0eSBvZiB0aGUgcG93ZXIgc2VyaWVzIGZvciBzdWNoCiAgICB2YWx1ZXMuIFJvb3RzIHdpdGggbXVsdGlwbGljaXR5IGdyZWF0ZXIgdGhhbiAxIHdpbGwgYWxzbyBzaG93IGxhcmdlcgogICAgZXJyb3JzIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc2VyaWVzIG5lYXIgc3VjaCBwb2ludHMgaXMgcmVsYXRpdmVseQogICAgaW5zZW5zaXRpdmUgdG8gZXJyb3JzIGluIHRoZSByb290cy4gSXNvbGF0ZWQgcm9vdHMgbmVhciB0aGUgb3JpZ2luIGNhbgogICAgYmUgaW1wcm92ZWQgYnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gaW1wb3J0IG51bXB5LnBvbHlub21pYWwucG9seW5vbWlhbCBhcyBwb2x5CiAgICA+Pj4gcG9seS5wb2x5cm9vdHMocG9seS5wb2x5ZnJvbXJvb3RzKCgtMSwwLDEpKSkKICAgIGFy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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 10
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
chebyshev.cpython-37.pyc
60.57 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hermite.cpython-37.pyc
55.33 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hermite_e.cpython-37.pyc
55.36 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
laguerre.cpython-37.pyc
53.73 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
legendre.cpython-37.pyc
54.61 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
polynomial.cpython-37.pyc
50.42 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
polyutils.cpython-37.pyc
11.91 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
603 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_polybase.cpython-37.pyc
30.24 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
1.37 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).