pyobf2


Namepyobf2 JSON
Version 1.3.1 PyPI version JSON
download
home_pagehttps://github.com/0x3C50/pyobf2
SummaryAn in-place obfuscator for python 3.11
upload_time2023-08-06 18:39:32
maintainer
docs_urlNone
author0x150
requires_python>=3.10,<4.0
license
keywords obfuscator obfuscator-api
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # PyObf 2

A python obfuscator that actually understands your program.

## What sets it apart?
PyObf actually understands your program, parsing it in the exact same way the python interpreter would. This allows for better protection, compared to most other obfuscators, which just wrap your code in a launcher and hope no one is bored enough to crack it.

With PyObf, your program isn't just wrapped, **it is changed fundamentally**. Since it can actually parse the python code you write, certain elements of it can be swapped out entirely, which makes obfuscating it way easier and, more importantly, way more secure.

### Comparison
Assuming this program:
```py
def hi():
    return "Hi"

def print_hi(suffix):
    print(hi() + " " + suffix)

if __name__ == "__main__":
    print_hi("World")
```

Obfuscating it with some common obfuscator may result in this program:
```py
import lzma, gzip, zlib, base64
exec(lzma.decompress(gzip.decompress(zlib.decompress(base64.a85decode(b'GanfH!(?i/M[0;*H@\'0(rrJnq>Q=X\\H<=>N!!MH8Zpk)s+TW>Y!!%*ojeL`6JH0.b!&>E_s%a=KI_.BiVuHH@Ze*#DT<W^8FO?SoOTWE,4ZNU`I=A`@,6[Lp^AP2+$I]]Sg+.bi.LDR=1q-\'(Y_]K^crG<0D%=2pb;>5nY[.Fr-F-@W-<MRn<(;S>r1.L$!!)tqp>Q!Ra_(SSIY%S#!!)mYkCKnVBDV`1!!!!%=^(#9?@J[M!!"^a:%J')))))
```

Whereas obfuscating it with a **LIGHT** PyObf config results in this:
```py
def method0():
    return __𝗶𝘮𝘱𝘰𝘳𝙩__('base64').b64decode(__𝗶𝘮𝘱𝘰𝗿𝘁__('zlib').decompress(b'x\xda\x0bv\xcf\xb6\x05\x00\x038\x01C')).decode()

def method1(arg0):
    𝘱𝙧𝗶𝙣𝘁(𝙢𝗲𝙩𝗵𝙤𝙙0() + __𝙞𝗺𝙥𝙤𝙧𝘵__('base64').b64decode(__𝗶𝘮𝘱𝘰𝘳𝘁__('zlib').decompress(b'x\xda\xf3t\xb4\xb5\x05\x00\x02\xa2\x01\x05')).decode() + 𝘢𝗿𝘨0)
if (__𝙣𝗮𝙢𝘦__ == __𝙞𝗺𝘱𝗼𝙧𝘁__('base64').b64decode(__𝗶𝘮𝙥𝙤𝙧𝘵__('zlib').decompress(b'x\xda\x8b0\xb4,\x89\x0c\xcf)\x8d0\xb4\xb0\x05\x00\x19/\x03\xc6')).decode() or __𝗶𝘮𝗽𝘰𝗿𝘵__(__𝙞𝙢𝙥𝘰𝘳𝙩__('base64').b64decode(__𝘪𝘮𝘱𝗼𝘳𝘁__('zlib').decompress(b'x\xdaK\xceu+\x8dr\xb7,\x01\x00\r+\x02\xda')).decode()).betavariate(18.609942471140883, 73.43725108007276) == 95.35595495280745) << 14 == 16384:
    𝙢𝗲𝘁𝗵𝙤𝗱1(__𝘪𝗺𝘱𝙤𝙧𝘵__('base64').b64decode(__𝗶𝗺𝘱𝗼𝗿𝘁__('zlib').decompress(b'x\xda\x0b3\xb2\xacLr\x0f\xb4\x05\x00\x0b\x05\x02r')).decode())
```

<sup>if you don't believe this will run, try to run it :troll:</sup>

You might notice that the actual program structure is still recognizable, but that can change very fast if you use a more aggressive configuration:
<details>
<summary>Obfuscated code (very long)</summary>

```py
lMIIIMIMllMMNlIINIlIMlIlNllNlMNI = eval(__import__('marshal').loads(b'\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xf3\x1c\x00\x00\x00\x97\x00\x02\x00G\x00d\x00\x84\x00d\x01\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00S\x00)\x02c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xf3\x14\x00\x00\x00\x97\x00d\x00Z\x00d\x00Z\x01d\x01\x84\x00Z\x02d\x02S\x00)\x03\xda\x010c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00\xf3\n\x03\x00\x00\x97\x00d\x01d\x00l\x00}\x02d\x01d\x00l\x01}\x03d\x01d\x00l\x02}\x04d\x01d\x00l\x03}\x05d\x01d\x02l\x04m\x05}\x06\x01\x00|\x01}\x07|\x03\xa0\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x03\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00}\x08|\x05\xa0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x04\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00}\ti\x00}\nd\x04}\x0b\t\x00\t\x00|\x05\xa0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x0b\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00}\x0ci\x00|\x0cj\x08\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x01|\n\xa5\x01}\n|\x0bd\x04z\r\x00\x00}\x0b|\x0cj\t\x00\x00\x00\x00\x00\x00\x00\x00j\n\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x06\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00s\x01n\x12n\x10#\x00t\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00r\x03\x01\x00Y\x00n\x05w\x00x\x03Y\x00w\x01\x8cXi\x00|\tj\r\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x01|\n\xa5\x01}\r|\x07d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x01k\x02\x00\x00\x00\x00rN\x02\x00t\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x04|\x08\xa0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x07\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00|\x02\xa0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x07d\x04d\x00\x85\x02\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00|\r\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00S\x00|\x07d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x04k\x02\x00\x00\x00\x00rN\x02\x00t\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x04|\x08\xa0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x08\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00|\x02\xa0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x07d\x04d\x00\x85\x02\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00|\r\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00S\x00|\x02\xa0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x07d\x04d\x00\x85\x02\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00d\x00d\x00d\t\x85\x03\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00)\nN\xe9\x00\x00\x00\x00)\x01\xda\tFrameType\xda\x05rot13\xe9\x01\x00\x00\x00T\xfa\x01<\xda\x04riny\xda\x04rkrp\xe9\xff\xff\xff\xff)\x11\xda\x04zlib\xda\x06codecs\xda\x08builtins\xda\x03sys\xda\x05typesr\x06\x00\x00\x00\xda\x06lookup\xda\t_getframe\xda\x08f_locals\xda\x06f_code\xda\x07co_name\xda\nstartswith\xda\nValueError\xda\tf_globals\xda\x07getattr\xda\x06decode\xda\ndecompress)\x0e\xda\x02a0\xda\x02a1\xda\x02v0\xda\x02v1\xda\x02v2\xda\x02v3r\x06\x00\x00\x00\xda\x02v4\xda\x02v5\xda\x02v6\xda\x02v7\xda\x02v8\xda\x02v9\xda\x03v12s\x0e\x00\x00\x00              \xda\x00\xfa\x02m0r+\x00\x00\x00\x01\x00\x00\x00s\xe0\x01\x00\x00\x80\x00\xf0\x14\x00\x05\x19\xd0\x04\x18\xd0\x04\x18\xd0\x04\x18\xd8\x04\x1c\xd0\x04\x1c\xd0\x04\x1c\xd0\x04\x1c\xd8\x04 \xd0\x04 \xd0\x04 \xd0\x04 \xd8\x04\x16\xd0\x04\x16\xd0\x04\x16\xd0\x04\x16\xd8\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xe0\x13\x17\x80L\xd8\r\x14\x8f^\x8a^\x98G\xd1\r$\xd4\r$\x80F\xd8\x1d!\x9f^\x9a^\xa8A\xd1\x1d.\xd4\x1d.\x80K\xd8\x13\x15\x80L\xd8\x0c\r\x80E\xf0\x02\x08\x05\x12\xf0\x02\x07\t\x12\xd8\'+\xa7~\xa2~\xb0e\xd1\'<\xd4\'<\x88M\xd8\x1bE\x98m\xd4\x1e4\xd0\x1bE\xb8\x0c\xd0\x1bE\x88L\xd8\x0c\x11\x90Q\x89J\x88E\xd8\x13 \xd4\x13\'\xd4\x13/\xd7\x13:\xd2\x13:\xb83\xd1\x13?\xd4\x13?\xf0\x00\x01\r\x16\xd8\x10\x15\xf0\x03\x01\r\x16\xf8\xe5\x0f\x19\xf0\x00\x01\t\x12\xf0\x00\x01\t\x12\xf0\x00\x01\t\x12\xd8\x0c\x11\x88E\xf0\x03\x01\t\x12\xf8\xf8\xf8\xf0\x0f\x08\x05\x12\xf0\x12\x00\r6\x88{\xd4\x0f$\xd0\x0c5\xa8\x0c\xd0\x0c5\x80E\xd8\x07\x13\x90A\x84\x7f\x98$\xd2\x07\x1e\xd0\x07\x1e\xe0\x0f;\x8dw\x90y\xa0&\xa7-\xa2-\xb0\x06\xd1"7\xd4"7\xb8\x01\xd4":\xd1\x0f;\xd4\x0f;\xb8E\xd7<L\xd2<L\xc8\\\xd0Z[\xd0Z\\\xd0Z\\\xd4M]\xd1<^\xd4<^\xd0`e\xd1\x0ff\xd4\x0ff\xd0\x08f\xd8\t\x15\x90a\x8c\x1f\x98D\xd2\t \xd0\t \xe0\x0f;\x8dw\x90y\xa0&\xa7-\xa2-\xb0\x06\xd1"7\xd4"7\xb8\x01\xd4":\xd1\x0f;\xd4\x0f;\xb8E\xd7<L\xd2<L\xc8\\\xd0Z[\xd0Z\\\xd0Z\\\xd4M]\xd1<^\xd4<^\xd0`e\xd1\x0ff\xd4\x0ff\xd0\x08f\xe0\x0f\x14\xd7\x0f\x1f\xd2\x0f\x1f\xa0\x0c\xa8Q\xa8R\xa8R\xd4 0\xd1\x0f1\xd4\x0f1\xb0$\xb0$\xb0B\xb0$\xd4\x0f7\xd0\x087s\x13\x00\x00\x00\xc1\tA\x04B\x0f\x00\xc2\x0f\nB\x1c\x03\xc2\x1b\x01B\x1c\x03N)\x03\xda\n__module__\xda\x0c__qualname__\xda\x0b__getitem__\xa9\x00\xf3\x00\x00\x00\x00\xfa\x05<asm>r*\x00\x00\x00r*\x00\x00\x00\x00\x00\x00\x00r0\x00\x00\x00r0\x00\x00\x00r\x03\x00\x00\x00r/\x00\x00\x00r/\x00\x00\x00r0\x00\x00\x00r1\x00\x00\x00r*\x00\x00\x00r*\x00\x00\x00\x00\x00\x00\x00r0\x00\x00\x00r0\x00\x00\x00'))()

def b():
    pass

def NIlMlIlMNIIIMMNIlNlIllNlNMlIIINI():
    a = [None] * 18
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:8], ('__import__', 'b64decode', 'decompress', 'decode'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][9:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:6], b'\x97\x00t\x01\xd0\xcdu\xec{\xc7\x9b\xd4\xf9Vd\x01\xa6\x01\xb7\xb6\xab\x01\xf4\r\x14\x17\r!iZ\xa0\x01;\xc3\xa9s\x8c\xc2,\xd5\x8b&\x81\xfe\xeb\xa7\xb3\xf8\x10R\xe8\x12t\x01\xcb\x0c]+\xf6\xb7\xcdc\t\xf7d\x02\xa6\x01\xd7\xc1\xab\x01\x15\tj\xfa\xbcZ\xe1\x03\xa0\x02=\x1f\xda\x1c\x83\xdaI\r\x08M,8\xcf\xffJ}\x7fT\x14hd\x03\xa6\x01W\xc8\xab\x01\xf2\r\xcf\xb0\xb8R\xe83\xa6\x01"\x17\xab\x01Z!eN\xfb\x91X\xe7\xa0\x03\xcf\x9f+\xbb\xb0T\xde\xc6\xcf\xd6\x06\xc8{XU\x87\xe8\x8c\x9dK\xa6\x00\xe1\x88\xab\x00\xe9\xa3/\xef\x18\x91\xcaxS\x00', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][7:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:9], (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][10:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][16:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][14:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][6:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:0], 0, 0, 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][4:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:7], (None, 'base64', 'zlib', b'x\xda\x0bv\xcf\xb6\x05\x00\x038\x01C'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][8:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][13:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][18:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:4], 5, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][5:]]
    return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda+\xa9,H\x05\x00\x04\x84\x01\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x02\x00\x00c\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'])

def MMINIIlIlINNlMINMMMNMMlNMIlMlllI():
    a = [None] * 18
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:1], 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][3:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:3], 1, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][4:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:8], ('print', 'method0', '__import__', 'b64decode', 'decompress', 'decode'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][9:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:0], 1, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][1:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:6], b"\x97\x00t\x01\xf8_6\x13\xbc@J\x822Wt\x03\x15W\x12\xda\xd6eulM\x04\xa6\x00\xfb\xbf\xab\x00\x8bf\x95\x18\xad\x0bj\x9ct\x05\x1c\x1b\x18\x94W\xe5\xec\xc7\x7f\xe6d\x01\xa6\x01~\xb5\xab\x01\xb8h\xfd\xe6\xdd\xc3\x95c\xa0\x03d\xd1\xaf\x97/9\xc1\x8f&\xe4[W\xf1\x12-\xb8\tw\xa6\xaft\x05\x0b\xf2\xc4\xfd~&x\x82>\xaad\x02\xa6\x01\x07\xea\xab\x01-\xf0\xdfW\x08\xb5*9\xa0\x04je\xd4\xcb \xcb;\xe3\xfbs\xfb\xff\x91/\xf2\xbcT%\xf6Rd\x03\xa6\x014\x1e\xab\x01\xe2]\x84;\xc6\\c1\xa6\x01\xd2\xa8\xab\x01\xa7\xb3S\xc1\x89\xbf\xdb\xfd\xa0\x05\xa0Z\x8b\x1dd\xa3\\*\x02R\x06\x13\xc6\xbe\x01\x87\xa2\x9f\xd5\x12\xa6\x00%\x93\xab\x00*\x15\xf9\xe1.\x075\xfdz\x00'\x1d|\x00z\x00I\xb1\xa6\x01\x11\xa9\xab\x01\xc3\n\xef\xe1\xc2b\x83\xd0\x01\x00d\x00S\x00", *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][7:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:4], 8, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][5:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:9], ('arg0',), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][10:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][6:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:7], (None, 'base64', 'zlib', b'x\xda\xf3t\xb4\xb5\x05\x00\x02\xa2\x01\x05'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][8:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][18:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][13:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][16:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][14:]]
    return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda+\xa9,H\x05\x00\x04\x84\x01\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x02\x00\x00c\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'])

def NMMIlMlNMNlMMIIllIIMlNllNIllNlNI():
    a = [None] * 18
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][16:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:0], 0, 0, 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][4:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][13:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][6:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][18:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:9], (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][10:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:7], (lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b"\x00x\xda\xf3\xf3\xcc\xf1\xcd\x01b?OOO_ \x99\xe3\x07\xe4\x01\t?\xa0\xa8\xa7\xa7\x9f'\x00\xaf)\n\x93"](), lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda\r\xc6\xb1\t\x00\x00\x0c\x84\xc0\xf9,\xfcI\xdc\xbfN\x90\x03\x95A\xdf\xd6\xbf\xfa\x9ad\xc5\x01\xa8d\n\x7f'](), 'base64', 'zlib', b'x\xda\x8b0\xb4,\x89\x0c\xcf)\x8d0\xb4\xb0\x05\x00\x19/\x03\xc6', b'x\xdaK\xceu+\x8dr\xb7,\x01\x00\r+\x02\xda', 41.61482108994687, 16.285766185599883, 32.3993595971086, 12, 4096, b'x\xda\x0b3\xb2\xacLr\x0f\xb4\x05\x00\x0b\x05\x02r', None), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][8:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:4], 7, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][5:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:8], ('method0', 'method1', '__name__', '__import__', 'b64decode', 'decompress', 'decode', 'betavariate'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][9:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:6], b'\x97\x00d\x00\x84\x00Z\x00d\x01\x84\x00Z\x01e\x02\x02\x00e\x03d\x02\xa6\x01\xe2Z\xab\x015d\x98\xc2\x1a\xd7\xc3\xdd\xa0\x04.\x7f\xed\xa2O\xd0\xbb\x16\xfbg\x9a\x12\xaa*\xa4\x05\x19\xe0\x96Q\x02\x00e\x03d\x03\xa6\x01@\xb4\xab\x01\xa1\x16\xf3fAtP;\xa0\x05\x7f7Rt\x07\x1eZ\x81]\x17b#iX;\xcc\x97\x08<\xf8d\x04\xa6\x01\xedV\xab\x01\xd4\x1e;\xf0s\x02\n}\xa6\x01\xa7\xed\xab\x01f\x8bf\x81\xd2>\x88\x8c\xa0\x06\xc6\xf1\x18\xb9*\xd0\x8d=D\xd1\xc9M<%\x9c\x9ca\x17\xf4\x98\xa6\x00\x976\xab\x00\x9b\xbb\x08l\xf5"\xbc\xd5k\x02\xbc\x0f\x97\xfapl\x02\x00e\x03\x02\x00e\x03d\x02\xa6\x01\x8d]\xab\x01\xd8\xa7\xb6Pi\x08\xd2\xec\xa0\x04\xcb\xd9\xc8)\xf0<,\xf8\x17\x87\xe4pUO\xdf\xef\xff\xf8*L\x02\x00e\x03d\x03\xa6\x01g\x19\xab\x01\xb2\xc2\xc0\x05`fU\xbf\xa0\x05\xecz\xde\xe4\xf6\xe4\t\x87\x02\x0f5\x9f\xb1q\'\x1dA\xe5\xd4\xbfd\x05\xa6\x01\xb9\xa1\xab\x01\xccz\xc2L\xa1\xad\x8dL\xa6\x01\xf9\x8f\xab\x01\xb6a\xe1\x0f)\x9b\xfd\x8f\xa0\x06\xfa\xac\x11:\x81T\xd6\xdb\xb0\x1c\xcb*\xa6\x0b\x86\xc9\xa6\x81\x17\xac\xa6\x00=\x9f\xab\x00\xf8\x1e\xe3\xd3\x92F9@\xa6\x01O\x04\xab\x01\xab\xd5\xbb\x19\xc9\xa5\xaf\xf1\xa0\x07Q+F4\x83q\xd9\x87\x14\xea\x99\x99@\x075\xe1\x06I\x11\x1cd\x06d\x07\xa6\x02N\xac\xab\x02a\xa3\xef\xfe\xd3.\x13\x93d\x08k\x02\x99\xc0\xaa\xbdd\tz\x03\xd4[d\nk\x02/\x05\x94.rW\x02\x00e\x01\x02\x00e\x03d\x02\xa6\x01\xb6\x19\xab\x01\xae\xec\x9e\xb3\xaba\xaa\x06\xa0\x04\x04b\xc0\xaf\x16*\xe0s\x90\xd6\x90\x9ae\xbd\xd6\xa1\x8b\x13\\\x10\x02\x00e\x03d\x03\xa6\x01\xdd\xdd\xab\x01\x88\xfdc\x0543\xcex\xa0\x05\x8c2%"\xf8\xd94\x1c\xd4\x1b%\r\xf5a\xa7n\xbbP\x7f\x80d\x0b\xa6\x01\x96\x90\xab\x01oFq\x06\xd6\x01\xb8\xe0\xa6\x01\xb1B\xab\x01\x0e\xda\xcat.D\x99\xfc\xa0\x06n\xc2\xd4\xda\x8c\xaf\x96\xe9g:t{sJ\xcd\xf6-\xce\x81\xfd\xa6\x00\xf7`\xab\x00.\t\x8edr\x14\xb4Y\xa6\x01\xde\xf2\xab\x01T\xe1\x82\x84\xb8\x02\xb1\xc9\x01\x00d\x0cS\x00d\x0cS\x00', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][7:]]
    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][14:]]
    return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda+\xa9,H\x05\x00\x04\x84\x01\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x02\x00\x00c\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'])
lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\xadHM\x06\x00\x04-\x01\xa6'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda\r\xc7\xa1\x11\x00\x00\x00\x82\xc0\xf9\x0c2\t\xfbg-\xdcC\x1b+\xc5+\x9a\xfc\x94\x93w\xb0c\n\xe1']())
```
</details>

## Installing
The package now has a pypi! https://pypi.org/project/pyobf2/

Install with `python3 -m pip install pyobf2`

## Usage

The obfuscator has an API, to allow you to integrate it into your own projects. For example, it can be used to obfuscate the output of a code generator automatically. An example usages of the API can be found in `examples/api/`. If you end up using the API, please credit this repository.

If you just want to run the obfuscator, run `pyobf2` or `python3 -m pyobf2` after installing it

## API usage
As previously mentioned, the `examples/api/` directory contains examples on how the api works. Some notes are required, though:
- When obfuscating multiple files that depend on each other, use `do_obfuscation_batch_ast`, instead of calling `do_obfuscation_single_ast` on all of them separately. This will allow the obfuscator to draw conclusions on which file depends on which other file, and allows it to understand the structure between them.
- `do_obfuscation_batch_ast` is a generator. It will progressively yield each step it does, to allow for progress bar rendering. It will do nothing when not iterated through.
- Some transformers (eg. `packInPyz`, `compileFinalFiles`) only act on the **output files** of the obfuscation process, and do nothing in the standard run. To invoke them, use `do_post_run`. This will require you to write the obfuscated AST into a file, though.

## Feedback & bugs

The obfuscator is in no way perfect as of now, so feedback is encouraged. Please tell me how bad my code is in the
issues tab.
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/0x3C50/pyobf2",
    "name": "pyobf2",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.10,<4.0",
    "maintainer_email": "",
    "keywords": "obfuscator,obfuscator-api",
    "author": "0x150",
    "author_email": "99053360+0x3C50@users.noreply.github.com",
    "download_url": "https://files.pythonhosted.org/packages/d5/c6/ef65188d584dd7b8f12aa93b305231b9aa06f15efc4d9dc165a8a781039f/pyobf2-1.3.1.tar.gz",
    "platform": null,
    "description": "# PyObf 2\n\nA python obfuscator that actually understands your program.\n\n## What sets it apart?\nPyObf actually understands your program, parsing it in the exact same way the python interpreter would. This allows for better protection, compared to most other obfuscators, which just wrap your code in a launcher and hope no one is bored enough to crack it.\n\nWith PyObf, your program isn't just wrapped, **it is changed fundamentally**. Since it can actually parse the python code you write, certain elements of it can be swapped out entirely, which makes obfuscating it way easier and, more importantly, way more secure.\n\n### Comparison\nAssuming this program:\n```py\ndef hi():\n    return \"Hi\"\n\ndef print_hi(suffix):\n    print(hi() + \" \" + suffix)\n\nif __name__ == \"__main__\":\n    print_hi(\"World\")\n```\n\nObfuscating it with some common obfuscator may result in this program:\n```py\nimport lzma, gzip, zlib, base64\nexec(lzma.decompress(gzip.decompress(zlib.decompress(base64.a85decode(b'GanfH!(?i/M[0;*H@\\'0(rrJnq>Q=X\\\\H<=>N!!MH8Zpk)s+TW>Y!!%*ojeL`6JH0.b!&>E_s%a=KI_.BiVuHH@Ze*#DT<W^8FO?SoOTWE,4ZNU`I=A`@,6[Lp^AP2+$I]]Sg+.bi.LDR=1q-\\'(Y_]K^crG<0D%=2pb;>5nY[.Fr-F-@W-<MRn<(;S>r1.L$!!)tqp>Q!Ra_(SSIY%S#!!)mYkCKnVBDV`1!!!!%=^(#9?@J[M!!\"^a:%J')))))\n```\n\nWhereas obfuscating it with a **LIGHT** PyObf config results in this:\n```py\ndef method0():\n    return __\ud835\uddf6\ud835\ude2e\ud835\ude31\ud835\ude30\ud835\ude33\ud835\ude69__('base64').b64decode(__\ud835\uddf6\ud835\ude2e\ud835\ude31\ud835\ude30\ud835\uddff\ud835\ude01__('zlib').decompress(b'x\\xda\\x0bv\\xcf\\xb6\\x05\\x00\\x038\\x01C')).decode()\n\ndef method1(arg0):\n    \ud835\ude31\ud835\ude67\ud835\uddf6\ud835\ude63\ud835\ude01(\ud835\ude62\ud835\uddf2\ud835\ude69\ud835\uddf5\ud835\ude64\ud835\ude590() + __\ud835\ude5e\ud835\uddfa\ud835\ude65\ud835\ude64\ud835\ude67\ud835\ude35__('base64').b64decode(__\ud835\uddf6\ud835\ude2e\ud835\ude31\ud835\ude30\ud835\ude33\ud835\ude01__('zlib').decompress(b'x\\xda\\xf3t\\xb4\\xb5\\x05\\x00\\x02\\xa2\\x01\\x05')).decode() + \ud835\ude22\ud835\uddff\ud835\ude280)\nif (__\ud835\ude63\ud835\uddee\ud835\ude62\ud835\ude26__ == __\ud835\ude5e\ud835\uddfa\ud835\ude31\ud835\uddfc\ud835\ude67\ud835\ude01__('base64').b64decode(__\ud835\uddf6\ud835\ude2e\ud835\ude65\ud835\ude64\ud835\ude67\ud835\ude35__('zlib').decompress(b'x\\xda\\x8b0\\xb4,\\x89\\x0c\\xcf)\\x8d0\\xb4\\xb0\\x05\\x00\\x19/\\x03\\xc6')).decode() or __\ud835\uddf6\ud835\ude2e\ud835\uddfd\ud835\ude30\ud835\uddff\ud835\ude35__(__\ud835\ude5e\ud835\ude62\ud835\ude65\ud835\ude30\ud835\ude33\ud835\ude69__('base64').b64decode(__\ud835\ude2a\ud835\ude2e\ud835\ude31\ud835\uddfc\ud835\ude33\ud835\ude01__('zlib').decompress(b'x\\xdaK\\xceu+\\x8dr\\xb7,\\x01\\x00\\r+\\x02\\xda')).decode()).betavariate(18.609942471140883, 73.43725108007276) == 95.35595495280745) << 14 == 16384:\n    \ud835\ude62\ud835\uddf2\ud835\ude01\ud835\uddf5\ud835\ude64\ud835\uddf11(__\ud835\ude2a\ud835\uddfa\ud835\ude31\ud835\ude64\ud835\ude67\ud835\ude35__('base64').b64decode(__\ud835\uddf6\ud835\uddfa\ud835\ude31\ud835\uddfc\ud835\uddff\ud835\ude01__('zlib').decompress(b'x\\xda\\x0b3\\xb2\\xacLr\\x0f\\xb4\\x05\\x00\\x0b\\x05\\x02r')).decode())\n```\n\n<sup>if you don't believe this will run, try to run it :troll:</sup>\n\nYou might notice that the actual program structure is still recognizable, but that can change very fast if you use a more aggressive configuration:\n<details>\n<summary>Obfuscated code (very long)</summary>\n\n```py\nlMIIIMIMllMMNlIINIlIMlIlNllNlMNI = eval(__import__('marshal').loads(b'\\xe3\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x1e\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xf3\\x1c\\x00\\x00\\x00\\x97\\x00\\x02\\x00G\\x00d\\x00\\x84\\x00d\\x01\\xa6\\x02\\x00\\x00\\xab\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00S\\x00)\\x02c\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x1e\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xf3\\x14\\x00\\x00\\x00\\x97\\x00d\\x00Z\\x00d\\x00Z\\x01d\\x01\\x84\\x00Z\\x02d\\x02S\\x00)\\x03\\xda\\x010c\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x07\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\xf3\\n\\x03\\x00\\x00\\x97\\x00d\\x01d\\x00l\\x00}\\x02d\\x01d\\x00l\\x01}\\x03d\\x01d\\x00l\\x02}\\x04d\\x01d\\x00l\\x03}\\x05d\\x01d\\x02l\\x04m\\x05}\\x06\\x01\\x00|\\x01}\\x07|\\x03\\xa0\\x06\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x03\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00}\\x08|\\x05\\xa0\\x07\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x04\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00}\\ti\\x00}\\nd\\x04}\\x0b\\t\\x00\\t\\x00|\\x05\\xa0\\x07\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x0b\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00}\\x0ci\\x00|\\x0cj\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa5\\x01|\\n\\xa5\\x01}\\n|\\x0bd\\x04z\\r\\x00\\x00}\\x0b|\\x0cj\\t\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00j\\n\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa0\\x0b\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x06\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00s\\x01n\\x12n\\x10#\\x00t\\x18\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00$\\x00r\\x03\\x01\\x00Y\\x00n\\x05w\\x00x\\x03Y\\x00w\\x01\\x8cXi\\x00|\\tj\\r\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa5\\x01|\\n\\xa5\\x01}\\r|\\x07d\\x01\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x01k\\x02\\x00\\x00\\x00\\x00rN\\x02\\x00t\\x1d\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x04|\\x08\\xa0\\x0f\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x07\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x01\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa6\\x02\\x00\\x00\\xab\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x02\\xa0\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x07d\\x04d\\x00\\x85\\x02\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\r\\xa6\\x02\\x00\\x00\\xab\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00S\\x00|\\x07d\\x01\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x04k\\x02\\x00\\x00\\x00\\x00rN\\x02\\x00t\\x1d\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x04|\\x08\\xa0\\x0f\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x08\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x01\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa6\\x02\\x00\\x00\\xab\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x02\\xa0\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x07d\\x04d\\x00\\x85\\x02\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\r\\xa6\\x02\\x00\\x00\\xab\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00S\\x00|\\x02\\xa0\\x10\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00|\\x07d\\x04d\\x00\\x85\\x02\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xa6\\x01\\x00\\x00\\xab\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00d\\x00d\\x00d\\t\\x85\\x03\\x19\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00S\\x00)\\nN\\xe9\\x00\\x00\\x00\\x00)\\x01\\xda\\tFrameType\\xda\\x05rot13\\xe9\\x01\\x00\\x00\\x00T\\xfa\\x01<\\xda\\x04riny\\xda\\x04rkrp\\xe9\\xff\\xff\\xff\\xff)\\x11\\xda\\x04zlib\\xda\\x06codecs\\xda\\x08builtins\\xda\\x03sys\\xda\\x05typesr\\x06\\x00\\x00\\x00\\xda\\x06lookup\\xda\\t_getframe\\xda\\x08f_locals\\xda\\x06f_code\\xda\\x07co_name\\xda\\nstartswith\\xda\\nValueError\\xda\\tf_globals\\xda\\x07getattr\\xda\\x06decode\\xda\\ndecompress)\\x0e\\xda\\x02a0\\xda\\x02a1\\xda\\x02v0\\xda\\x02v1\\xda\\x02v2\\xda\\x02v3r\\x06\\x00\\x00\\x00\\xda\\x02v4\\xda\\x02v5\\xda\\x02v6\\xda\\x02v7\\xda\\x02v8\\xda\\x02v9\\xda\\x03v12s\\x0e\\x00\\x00\\x00              \\xda\\x00\\xfa\\x02m0r+\\x00\\x00\\x00\\x01\\x00\\x00\\x00s\\xe0\\x01\\x00\\x00\\x80\\x00\\xf0\\x14\\x00\\x05\\x19\\xd0\\x04\\x18\\xd0\\x04\\x18\\xd0\\x04\\x18\\xd8\\x04\\x1c\\xd0\\x04\\x1c\\xd0\\x04\\x1c\\xd0\\x04\\x1c\\xd8\\x04 \\xd0\\x04 \\xd0\\x04 \\xd0\\x04 \\xd8\\x04\\x16\\xd0\\x04\\x16\\xd0\\x04\\x16\\xd0\\x04\\x16\\xd8\\x04\\x1f\\xd0\\x04\\x1f\\xd0\\x04\\x1f\\xd0\\x04\\x1f\\xd0\\x04\\x1f\\xd0\\x04\\x1f\\xe0\\x13\\x17\\x80L\\xd8\\r\\x14\\x8f^\\x8a^\\x98G\\xd1\\r$\\xd4\\r$\\x80F\\xd8\\x1d!\\x9f^\\x9a^\\xa8A\\xd1\\x1d.\\xd4\\x1d.\\x80K\\xd8\\x13\\x15\\x80L\\xd8\\x0c\\r\\x80E\\xf0\\x02\\x08\\x05\\x12\\xf0\\x02\\x07\\t\\x12\\xd8\\'+\\xa7~\\xa2~\\xb0e\\xd1\\'<\\xd4\\'<\\x88M\\xd8\\x1bE\\x98m\\xd4\\x1e4\\xd0\\x1bE\\xb8\\x0c\\xd0\\x1bE\\x88L\\xd8\\x0c\\x11\\x90Q\\x89J\\x88E\\xd8\\x13 \\xd4\\x13\\'\\xd4\\x13/\\xd7\\x13:\\xd2\\x13:\\xb83\\xd1\\x13?\\xd4\\x13?\\xf0\\x00\\x01\\r\\x16\\xd8\\x10\\x15\\xf0\\x03\\x01\\r\\x16\\xf8\\xe5\\x0f\\x19\\xf0\\x00\\x01\\t\\x12\\xf0\\x00\\x01\\t\\x12\\xf0\\x00\\x01\\t\\x12\\xd8\\x0c\\x11\\x88E\\xf0\\x03\\x01\\t\\x12\\xf8\\xf8\\xf8\\xf0\\x0f\\x08\\x05\\x12\\xf0\\x12\\x00\\r6\\x88{\\xd4\\x0f$\\xd0\\x0c5\\xa8\\x0c\\xd0\\x0c5\\x80E\\xd8\\x07\\x13\\x90A\\x84\\x7f\\x98$\\xd2\\x07\\x1e\\xd0\\x07\\x1e\\xe0\\x0f;\\x8dw\\x90y\\xa0&\\xa7-\\xa2-\\xb0\\x06\\xd1\"7\\xd4\"7\\xb8\\x01\\xd4\":\\xd1\\x0f;\\xd4\\x0f;\\xb8E\\xd7<L\\xd2<L\\xc8\\\\\\xd0Z[\\xd0Z\\\\\\xd0Z\\\\\\xd4M]\\xd1<^\\xd4<^\\xd0`e\\xd1\\x0ff\\xd4\\x0ff\\xd0\\x08f\\xd8\\t\\x15\\x90a\\x8c\\x1f\\x98D\\xd2\\t \\xd0\\t \\xe0\\x0f;\\x8dw\\x90y\\xa0&\\xa7-\\xa2-\\xb0\\x06\\xd1\"7\\xd4\"7\\xb8\\x01\\xd4\":\\xd1\\x0f;\\xd4\\x0f;\\xb8E\\xd7<L\\xd2<L\\xc8\\\\\\xd0Z[\\xd0Z\\\\\\xd0Z\\\\\\xd4M]\\xd1<^\\xd4<^\\xd0`e\\xd1\\x0ff\\xd4\\x0ff\\xd0\\x08f\\xe0\\x0f\\x14\\xd7\\x0f\\x1f\\xd2\\x0f\\x1f\\xa0\\x0c\\xa8Q\\xa8R\\xa8R\\xd4 0\\xd1\\x0f1\\xd4\\x0f1\\xb0$\\xb0$\\xb0B\\xb0$\\xd4\\x0f7\\xd0\\x087s\\x13\\x00\\x00\\x00\\xc1\\tA\\x04B\\x0f\\x00\\xc2\\x0f\\nB\\x1c\\x03\\xc2\\x1b\\x01B\\x1c\\x03N)\\x03\\xda\\n__module__\\xda\\x0c__qualname__\\xda\\x0b__getitem__\\xa9\\x00\\xf3\\x00\\x00\\x00\\x00\\xfa\\x05<asm>r*\\x00\\x00\\x00r*\\x00\\x00\\x00\\x00\\x00\\x00\\x00r0\\x00\\x00\\x00r0\\x00\\x00\\x00r\\x03\\x00\\x00\\x00r/\\x00\\x00\\x00r/\\x00\\x00\\x00r0\\x00\\x00\\x00r1\\x00\\x00\\x00r*\\x00\\x00\\x00r*\\x00\\x00\\x00\\x00\\x00\\x00\\x00r0\\x00\\x00\\x00r0\\x00\\x00\\x00'))()\n\ndef b():\n    pass\n\ndef NIlMlIlMNIIIMMNIlNlIllNlNMlIIINI():\n    a = [None] * 18\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:8], ('__import__', 'b64decode', 'decompress', 'decode'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][9:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:6], b'\\x97\\x00t\\x01\\xd0\\xcdu\\xec{\\xc7\\x9b\\xd4\\xf9Vd\\x01\\xa6\\x01\\xb7\\xb6\\xab\\x01\\xf4\\r\\x14\\x17\\r!iZ\\xa0\\x01;\\xc3\\xa9s\\x8c\\xc2,\\xd5\\x8b&\\x81\\xfe\\xeb\\xa7\\xb3\\xf8\\x10R\\xe8\\x12t\\x01\\xcb\\x0c]+\\xf6\\xb7\\xcdc\\t\\xf7d\\x02\\xa6\\x01\\xd7\\xc1\\xab\\x01\\x15\\tj\\xfa\\xbcZ\\xe1\\x03\\xa0\\x02=\\x1f\\xda\\x1c\\x83\\xdaI\\r\\x08M,8\\xcf\\xffJ}\\x7fT\\x14hd\\x03\\xa6\\x01W\\xc8\\xab\\x01\\xf2\\r\\xcf\\xb0\\xb8R\\xe83\\xa6\\x01\"\\x17\\xab\\x01Z!eN\\xfb\\x91X\\xe7\\xa0\\x03\\xcf\\x9f+\\xbb\\xb0T\\xde\\xc6\\xcf\\xd6\\x06\\xc8{XU\\x87\\xe8\\x8c\\x9dK\\xa6\\x00\\xe1\\x88\\xab\\x00\\xe9\\xa3/\\xef\\x18\\x91\\xcaxS\\x00', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][7:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:9], (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][10:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][16:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][14:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][6:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:0], 0, 0, 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][4:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:7], (None, 'base64', 'zlib', b'x\\xda\\x0bv\\xcf\\xb6\\x05\\x00\\x038\\x01C'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][8:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][13:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][18:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:4], 5, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][5:]]\n    return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xda+\\xa9,H\\x05\\x00\\x04\\x84\\x01\\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x02\\x00\\x00c\\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'])\n\ndef MMINIIlIlINNlMINMMMNMMlNMIlMlllI():\n    a = [None] * 18\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:1], 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][3:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:3], 1, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][4:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:8], ('print', 'method0', '__import__', 'b64decode', 'decompress', 'decode'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][9:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:0], 1, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][1:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:6], b\"\\x97\\x00t\\x01\\xf8_6\\x13\\xbc@J\\x822Wt\\x03\\x15W\\x12\\xda\\xd6eulM\\x04\\xa6\\x00\\xfb\\xbf\\xab\\x00\\x8bf\\x95\\x18\\xad\\x0bj\\x9ct\\x05\\x1c\\x1b\\x18\\x94W\\xe5\\xec\\xc7\\x7f\\xe6d\\x01\\xa6\\x01~\\xb5\\xab\\x01\\xb8h\\xfd\\xe6\\xdd\\xc3\\x95c\\xa0\\x03d\\xd1\\xaf\\x97/9\\xc1\\x8f&\\xe4[W\\xf1\\x12-\\xb8\\tw\\xa6\\xaft\\x05\\x0b\\xf2\\xc4\\xfd~&x\\x82>\\xaad\\x02\\xa6\\x01\\x07\\xea\\xab\\x01-\\xf0\\xdfW\\x08\\xb5*9\\xa0\\x04je\\xd4\\xcb \\xcb;\\xe3\\xfbs\\xfb\\xff\\x91/\\xf2\\xbcT%\\xf6Rd\\x03\\xa6\\x014\\x1e\\xab\\x01\\xe2]\\x84;\\xc6\\\\c1\\xa6\\x01\\xd2\\xa8\\xab\\x01\\xa7\\xb3S\\xc1\\x89\\xbf\\xdb\\xfd\\xa0\\x05\\xa0Z\\x8b\\x1dd\\xa3\\\\*\\x02R\\x06\\x13\\xc6\\xbe\\x01\\x87\\xa2\\x9f\\xd5\\x12\\xa6\\x00%\\x93\\xab\\x00*\\x15\\xf9\\xe1.\\x075\\xfdz\\x00'\\x1d|\\x00z\\x00I\\xb1\\xa6\\x01\\x11\\xa9\\xab\\x01\\xc3\\n\\xef\\xe1\\xc2b\\x83\\xd0\\x01\\x00d\\x00S\\x00\", *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][7:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:4], 8, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][5:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:9], ('arg0',), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][10:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][6:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:7], (None, 'base64', 'zlib', b'x\\xda\\xf3t\\xb4\\xb5\\x05\\x00\\x02\\xa2\\x01\\x05'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][8:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][18:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][13:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][16:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][14:]]\n    return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xda+\\xa9,H\\x05\\x00\\x04\\x84\\x01\\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x02\\x00\\x00c\\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'])\n\ndef NMMIlMlNMNlMMIIllIIMlNllNIllNlNI():\n    a = [None] * 18\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][16:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:0], 0, 0, 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][4:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][13:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][6:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][18:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:9], (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][10:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:7], (lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b\"\\x00x\\xda\\xf3\\xf3\\xcc\\xf1\\xcd\\x01b?OOO_ \\x99\\xe3\\x07\\xe4\\x01\\t?\\xa0\\xa8\\xa7\\xa7\\x9f'\\x00\\xaf)\\n\\x93\"](), lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xda\\r\\xc6\\xb1\\t\\x00\\x00\\x0c\\x84\\xc0\\xf9,\\xfcI\\xdc\\xbfN\\x90\\x03\\x95A\\xdf\\xd6\\xbf\\xfa\\x9ad\\xc5\\x01\\xa8d\\n\\x7f'](), 'base64', 'zlib', b'x\\xda\\x8b0\\xb4,\\x89\\x0c\\xcf)\\x8d0\\xb4\\xb0\\x05\\x00\\x19/\\x03\\xc6', b'x\\xdaK\\xceu+\\x8dr\\xb7,\\x01\\x00\\r+\\x02\\xda', 41.61482108994687, 16.285766185599883, 32.3993595971086, 12, 4096, b'x\\xda\\x0b3\\xb2\\xacLr\\x0f\\xb4\\x05\\x00\\x0b\\x05\\x02r', None), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][8:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:4], 7, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][5:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:8], ('method0', 'method1', '__name__', '__import__', 'b64decode', 'decompress', 'decode', 'betavariate'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][9:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:6], b'\\x97\\x00d\\x00\\x84\\x00Z\\x00d\\x01\\x84\\x00Z\\x01e\\x02\\x02\\x00e\\x03d\\x02\\xa6\\x01\\xe2Z\\xab\\x015d\\x98\\xc2\\x1a\\xd7\\xc3\\xdd\\xa0\\x04.\\x7f\\xed\\xa2O\\xd0\\xbb\\x16\\xfbg\\x9a\\x12\\xaa*\\xa4\\x05\\x19\\xe0\\x96Q\\x02\\x00e\\x03d\\x03\\xa6\\x01@\\xb4\\xab\\x01\\xa1\\x16\\xf3fAtP;\\xa0\\x05\\x7f7Rt\\x07\\x1eZ\\x81]\\x17b#iX;\\xcc\\x97\\x08<\\xf8d\\x04\\xa6\\x01\\xedV\\xab\\x01\\xd4\\x1e;\\xf0s\\x02\\n}\\xa6\\x01\\xa7\\xed\\xab\\x01f\\x8bf\\x81\\xd2>\\x88\\x8c\\xa0\\x06\\xc6\\xf1\\x18\\xb9*\\xd0\\x8d=D\\xd1\\xc9M<%\\x9c\\x9ca\\x17\\xf4\\x98\\xa6\\x00\\x976\\xab\\x00\\x9b\\xbb\\x08l\\xf5\"\\xbc\\xd5k\\x02\\xbc\\x0f\\x97\\xfapl\\x02\\x00e\\x03\\x02\\x00e\\x03d\\x02\\xa6\\x01\\x8d]\\xab\\x01\\xd8\\xa7\\xb6Pi\\x08\\xd2\\xec\\xa0\\x04\\xcb\\xd9\\xc8)\\xf0<,\\xf8\\x17\\x87\\xe4pUO\\xdf\\xef\\xff\\xf8*L\\x02\\x00e\\x03d\\x03\\xa6\\x01g\\x19\\xab\\x01\\xb2\\xc2\\xc0\\x05`fU\\xbf\\xa0\\x05\\xecz\\xde\\xe4\\xf6\\xe4\\t\\x87\\x02\\x0f5\\x9f\\xb1q\\'\\x1dA\\xe5\\xd4\\xbfd\\x05\\xa6\\x01\\xb9\\xa1\\xab\\x01\\xccz\\xc2L\\xa1\\xad\\x8dL\\xa6\\x01\\xf9\\x8f\\xab\\x01\\xb6a\\xe1\\x0f)\\x9b\\xfd\\x8f\\xa0\\x06\\xfa\\xac\\x11:\\x81T\\xd6\\xdb\\xb0\\x1c\\xcb*\\xa6\\x0b\\x86\\xc9\\xa6\\x81\\x17\\xac\\xa6\\x00=\\x9f\\xab\\x00\\xf8\\x1e\\xe3\\xd3\\x92F9@\\xa6\\x01O\\x04\\xab\\x01\\xab\\xd5\\xbb\\x19\\xc9\\xa5\\xaf\\xf1\\xa0\\x07Q+F4\\x83q\\xd9\\x87\\x14\\xea\\x99\\x99@\\x075\\xe1\\x06I\\x11\\x1cd\\x06d\\x07\\xa6\\x02N\\xac\\xab\\x02a\\xa3\\xef\\xfe\\xd3.\\x13\\x93d\\x08k\\x02\\x99\\xc0\\xaa\\xbdd\\tz\\x03\\xd4[d\\nk\\x02/\\x05\\x94.rW\\x02\\x00e\\x01\\x02\\x00e\\x03d\\x02\\xa6\\x01\\xb6\\x19\\xab\\x01\\xae\\xec\\x9e\\xb3\\xaba\\xaa\\x06\\xa0\\x04\\x04b\\xc0\\xaf\\x16*\\xe0s\\x90\\xd6\\x90\\x9ae\\xbd\\xd6\\xa1\\x8b\\x13\\\\\\x10\\x02\\x00e\\x03d\\x03\\xa6\\x01\\xdd\\xdd\\xab\\x01\\x88\\xfdc\\x0543\\xcex\\xa0\\x05\\x8c2%\"\\xf8\\xd94\\x1c\\xd4\\x1b%\\r\\xf5a\\xa7n\\xbbP\\x7f\\x80d\\x0b\\xa6\\x01\\x96\\x90\\xab\\x01oFq\\x06\\xd6\\x01\\xb8\\xe0\\xa6\\x01\\xb1B\\xab\\x01\\x0e\\xda\\xcat.D\\x99\\xfc\\xa0\\x06n\\xc2\\xd4\\xda\\x8c\\xaf\\x96\\xe9g:t{sJ\\xcd\\xf6-\\xce\\x81\\xfd\\xa6\\x00\\xf7`\\xab\\x00.\\t\\x8edr\\x14\\xb4Y\\xa6\\x01\\xde\\xf2\\xab\\x01T\\xe1\\x82\\x84\\xb8\\x02\\xb1\\xc9\\x01\\x00d\\x0cS\\x00d\\x0cS\\x00', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][7:]]\n    a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'][14:]]\n    return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xda+\\xa9,H\\x05\\x00\\x04\\x84\\x01\\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x02\\x00\\x00c\\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\x04\\x00\\x00b\\x00b'])\nlMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xdaK\\xadHM\\x06\\x00\\x04-\\x01\\xa6'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\\x00x\\xda\\r\\xc7\\xa1\\x11\\x00\\x00\\x00\\x82\\xc0\\xf9\\x0c2\\t\\xfbg-\\xdcC\\x1b+\\xc5+\\x9a\\xfc\\x94\\x93w\\xb0c\\n\\xe1']())\n```\n</details>\n\n## Installing\nThe package now has a pypi! https://pypi.org/project/pyobf2/\n\nInstall with `python3 -m pip install pyobf2`\n\n## Usage\n\nThe obfuscator has an API, to allow you to integrate it into your own projects. For example, it can be used to obfuscate the output of a code generator automatically. An example usages of the API can be found in `examples/api/`. If you end up using the API, please credit this repository.\n\nIf you just want to run the obfuscator, run `pyobf2` or `python3 -m pyobf2` after installing it\n\n## API usage\nAs previously mentioned, the `examples/api/` directory contains examples on how the api works. Some notes are required, though:\n- When obfuscating multiple files that depend on each other, use `do_obfuscation_batch_ast`, instead of calling `do_obfuscation_single_ast` on all of them separately. This will allow the obfuscator to draw conclusions on which file depends on which other file, and allows it to understand the structure between them.\n- `do_obfuscation_batch_ast` is a generator. It will progressively yield each step it does, to allow for progress bar rendering. It will do nothing when not iterated through.\n- Some transformers (eg. `packInPyz`, `compileFinalFiles`) only act on the **output files** of the obfuscation process, and do nothing in the standard run. To invoke them, use `do_post_run`. This will require you to write the obfuscated AST into a file, though.\n\n## Feedback & bugs\n\nThe obfuscator is in no way perfect as of now, so feedback is encouraged. Please tell me how bad my code is in the\nissues tab.",
    "bugtrack_url": null,
    "license": "",
    "summary": "An in-place obfuscator for python 3.11",
    "version": "1.3.1",
    "project_urls": {
        "Homepage": "https://github.com/0x3C50/pyobf2",
        "Repository": "https://github.com/0x3C50/pyobf2"
    },
    "split_keywords": [
        "obfuscator",
        "obfuscator-api"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "50098c7e11c8ee29ac593a10f15931c0bf92c232d4228df0e5d38e0efe510cbf",
                "md5": "9e65a12b807ed7d6027a5e7577d99da3",
                "sha256": "5d1db0ee58324788aa9c84c896ed4c8090695c861cc87d7d9b9c7258f8771808"
            },
            "downloads": -1,
            "filename": "pyobf2-1.3.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9e65a12b807ed7d6027a5e7577d99da3",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10,<4.0",
            "size": 44188,
            "upload_time": "2023-08-06T18:39:30",
            "upload_time_iso_8601": "2023-08-06T18:39:30.886579Z",
            "url": "https://files.pythonhosted.org/packages/50/09/8c7e11c8ee29ac593a10f15931c0bf92c232d4228df0e5d38e0efe510cbf/pyobf2-1.3.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d5c6ef65188d584dd7b8f12aa93b305231b9aa06f15efc4d9dc165a8a781039f",
                "md5": "678bc96195cf13841ce79ba8d20de616",
                "sha256": "915ea4b0c4236a900bba0e83530421931600129a05006135e1f82d585c0b79e6"
            },
            "downloads": -1,
            "filename": "pyobf2-1.3.1.tar.gz",
            "has_sig": false,
            "md5_digest": "678bc96195cf13841ce79ba8d20de616",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10,<4.0",
            "size": 39742,
            "upload_time": "2023-08-06T18:39:32",
            "upload_time_iso_8601": "2023-08-06T18:39:32.675568Z",
            "url": "https://files.pythonhosted.org/packages/d5/c6/ef65188d584dd7b8f12aa93b305231b9aa06f15efc4d9dc165a8a781039f/pyobf2-1.3.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-08-06 18:39:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "0x3C50",
    "github_project": "pyobf2",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "pyobf2"
}
        
Elapsed time: 0.11317s