minipy3 1.0.0
Minimizes Python3 code
License: MIT
Requires Python: >=3.9
Keywords: minipy,minimize,code,.min.py,compress

# MiniPy3

Minimizes python3 code

# Usage

## CLI

```
usage: minipy3 [-h] [-o OUT] [--no-compress] [--unparse] [--no-suffix] input

positional arguments:
  input              Input files rglob

options:
  -h, --help         show this help message and exit
  -o OUT, --out OUT  Output files rglob
  --no-compress      Don't use compression algorithms (lzma, zlib, gzip or bz2)
  --unparse          Return from compressed to standard view
  --no-suffix        Add suffix to file name (max for --unparse else min)
```

### Example

> python -m minipy3 --no-suffix venv\**\*.py

> Will compress all .py files in the venv folder and its subfolders.
>
> --no-suffix means that source files will be overwritten otherwise suffix .min will be added when minimizing or .max
> when restoring (argument --unparse)
> (main.py -> main.min.py | main.max.py)

## Python

```python
from minipy3 import *


class Minimize(AddSemicolon, ignore={'Import'}):
    """Class based on ast._Unparse for code compression (see ast.unparse)"""
    ...


def minimize(raw_code: str | bytes,
             compress: bool = True,
             compress_required: bool = False) -> str:
    """
    Minimizes the passed code with the help of the Minimizer class;
    And if necessary or gives more compression, applies one of the compression algorithms: (lzma, zlib, gzip, bz2)
    """
    ...


```

### AddSemicolon

An additional utility is the ability to add semicolons in the code (as in swift, dart and generally everywhere)

```python
class AddSemicolon(ast._Unparser):
    """Adds a semicolon where needed (see add_semicolon_after)"""
    __slots__ = ()
    add_semicolon_after = {'Return', 'Delete', 'Assign', 'AugAssign', 'AnnAssign', 'Raise', 'Assert', 'Import',
                           'ImportFrom', 'Global', 'Nonlocal', 'Expr', 'Pass', 'Break', 'Continue'}

    def and_add(self, func):
        """
        Decorate visitor functions.
        Designed for class extensibility.
        """
        ...

    def __init_subclass__(cls, **kwargs):
        """
        When inheriting a class,
        the ignore argument will exclude the specified sequence from the add_semicolon_after sequence.
        """
        ignore = kwargs.get('ignore', {*()})
        cls.add_semicolon_after ^= ignore

    def __init__(self, *args, **kwargs):
        """Applies the and_add decorator to visitor nodes specified by add_semicolon_after"""
        ...


def add_semicolons(raw_code: str | bytes) -> str: ...
```

# Also happens:

- Large numbers turn into powers of numbers
- The sequence of imports is collected into one
- Dockstrings get cut off, strip('\n') and dedent happen

# Examples:

```python
# semicolon.py ->
from __future__ import annotations;import ast,functools
class AddSemicolon(ast._Unparser):
 'Adds a semicolon where needed (see also ast.unparse)';__slots__=();add_semicolon_after={'Return','Delete','Assign','AugAssign','AnnAssign','Raise','Assert','Import','ImportFrom','Global','Nonlocal','Expr','Pass','Break','Continue'}
 def and_add(self,func):
  'Decorate visitor functions.\nDesigned for class extensibility.'
  @functools.wraps(func)
  def wrapper(*args,**kwargs):res=func(*args,**kwargs);self.write(';');return res
  return wrapper
 def __init_subclass__(cls,**kwargs):'When inheriting a class,\nthe ignore argument will exclude the specified sequence from the add_semicolon_after sequence.';ignore=kwargs.get('ignore',{*()});cls.add_semicolon_after^=ignore
 def __init__(self,*args,**kwargs):
  'Applies the and_add decorator to visitor nodes specified by add_semicolon_after';super().__init__(*args,**kwargs)
  for name in self.add_semicolon_after:
   name=f'visit_{name}'
   if hasattr(self,name):setattr(self,name,self.and_add(getattr(self,name)))
def add_semicolons(raw_code):return AddSemicolon().visit(ast.parse(raw_code))
```

```python
# __init__.py (--no-compress to disable such compression)
exec(__import__('lzma').decompress(b']\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x003\x1c\x8a"o\xaaD6D\xa6P\x82\x88\x10?\x1d\xcb^4\x0fYJY"\xa1\xcdfk\xb9\x04Ns\xa5\x08\x13SFB\xfd\x95\x11IPF)\x86\xa8\xf4$OH\xad\xa4\xb4\xd0\x82RM\x00\x8e\xc8s\xe7\x9d_0.:\x0e\n&j\x10\x94\xe5&\xd3m\xab\x18\x14r}\x04C$\xe5\xf3\xa5\xae\x8a\x8f\xe4\x7f5!\xb3u\x84\x1f\xecL\xaadz\xbb\xf2\n\xaa#a\x0c\xe0\xe8p\x16\xab\x01\x8aQ\x9e\x8f\xbb\xbd\x9d\x04\xfaP\xc1\xf1\xc4\xea\x926\x1c@\xe2\x1co\xd9\xd3)\xcf\xb2\xee\x94\x12\xedL\xa9\x05\xe3\x07V\x1d\xdb\xe4\x19\x00\x06\xd8iq\x01#/\x98\xdbfMS\x19\xf4\x93\xd1\xc8\xeb\xf6=\rz\xf4\xdf`\xef\xbd\x01~S2\xf8e=`\x88\xef\xe8\x80\x84\xc4\x0b\xd2\xb2h1\xb4{\xc8s\xe9\x9a\xf8k?\xa3s\xb2\xe7\xcd%\xe1\xd0\x11g\x00\xad \x02\xaac\xb0\x0e\xbc\x15\xe4\xc9=3}A)\xe3|\x10~U\xe1\x9d7u\x12\xb6\xce\x81~\xe7DD3\x89D\xef\xa2V\xea\x05\xa4y\x12\x17\xf2Ra\xc9a\xcc\x07\x96b\xef\\\xef\xdcb\xde02\x9f@\xa9\x96o\x9cZ\xf2\xa3\xbb\x0c\xad\xf0\xae\xcf\x87\xf2\xd6\x10w\x053\xbf\xd2s\xdf\x8eR\xcb\x01\n~w\xc2!\x1a\x83\x05\x9cP\xealh\xb0\xb3\x1c\xe3F\x86\x1d\xd8\xa3?\'\x0c8\x00\xedB\xf5\x8f\rS\t\x1eR`R\xe5\r\xfb\x83\x02O\x16\xce\t\xd9\xe7\xb2"`\xf4H\xd4W\xfd\xad\xf4\xbc\xa2._\x7fVE\x7f&\xd4\x1f\t\x13\xdbB?s\xd4\x19\x7f\xd6\x15h8\x89c\x9c\xd1\x14n\xc1%4\x8ap\xf7\x8f\xa6\x17\x15\x88c\x8e\xaa\xd6=r\xad\x07JH(\x13\xa78\xe2\xd1v8\xd82m\xbe-\x0c\x9b+\xb6\x05%g\xdc\x98k\xf8fSLD\xa6\xc01\xa5G\x8f\x8c\x89HT\xe9\x98.\xe1\xe0Qk\xfbMm\xbf\x11&\x15\xdb\xd3T:\xe6>\xd6\x7f.\xb4;>uC\x02\xce\xf1\x1c\xeeRZp\x8eODs?|\x1b/\xb4R>\x8fW\xe0\xbc1\xd8\x86\xdb\xcc\n:C\xf9\xfb\xd4\x9d\xd5<\xfd\x9a\xb3\xc1\xa3\xfck\x01J\x1c\xfbX\xd8BXM=h8K\xd9\x99p\xb8D,\x95\xb6\x7fl\xc8\x89W\x80\x9e\xb4\xc2\xc8\x00`\x92\xcc$6\x8f\xc9,\xa3-\xbbg9\x15\xfd\xdbY\xf7\x9c\x02\x8e\xf2\x1bu&a\xfa\xa7V>\x1b\x8dO\xb7\x17\x9e^\xa8+\xa2\xdc\xf6\x11\x94Q\n\x02mw\x0ebR\xe4\xdb\xd7n%\xcb\x9d\x8c\xcb\\\xbd\xa3Kd\xf3\x9cqoi&H2\xd0*\x05\xefn(/\x1a\x96=X\xf0\x1b\xa2}\xffHr\x9a\xa3]\xbf\xef\x02$\xd1\x0e+\xb8x\xfe\x1b\x97\xae\x02km{}\xf7]\'\x1a\xf6h\xadPv/q(\xd9P\xcf\x83\x0eD!4\x98\xf8\x97\x90\x06\x1eY\xfa\xb1\xbbep\xe8\t9\xa4\xee\xaeC\x15\xab\x1d\xb8\xa6\x16k/\x08\xb9g7\x94\x8br\xdf]t\x97\xea\xdc\xe9\x9b\xd1\\\x83\xe9!w\x15\xeb\x0b5\xd0\xccBjN\t\x1c\xbc#\x8c\x06\xfdj\xc9\x9a\x00\xfbd\xb6\xce\xb4\xea&\xd0i\x97\x1a\xfb\n\xf5\x94p\x98 \x983U`\xf7\xe6\nz\x16u\xa1ww\xa7O\\px\xd0\x18oa\xdc\x9c\xb7\xc2\xe7V\xa2\x89\xd0\xba:\xfa^\x9e:\xa83\xd5\xc4\xdf\xba\xc7Q\x0bs\x89y\x84P\x9b\xe54\x12\xa6\xdf\xc5k7E\x00\xfb\xc2L\xf6\xfa\xaa\x95\xfe\xa4\xfd\x98F\x12\xdb\x87\x936\x9b\xf1\xaaO\xd1L\x81\xc8\xcd]\xfd\xaa\xc2\x1d7\xf9\xd6\xd5\x0b\xf5\x12#\x05\xac.6\xaa\'v\xc1)\xebv\xc3\x82\xd4<\x03&\x04!~\x93\xb4\xb7\xea\xdd\xf3\xc1gc\xef\x8c\xe5\x15\t\t\x12\xb9\xc9f\xe8\x9f\x97k\xf1ka\x98\xef\x9d\xdb\x177\xde/\x9a`\x18V\xb0[:\xfc\xd4\xba\x12\xa4\x0e\xd3\x07\xc3\xc4\xd9p\xa7\x19\x15c\xc9\xa6\x98\xa1\xa9\r\x8a\xa3\x8cL\xc4\x85x\x03_\xff\x89+\xde|\xb4\x04\x04Bwy\xd3\r\xe0g\x14\x19\x9d\xef(\xe7D\x96\xfa_\xc0\xf0\x1d\xdaz`\x1c\'\xd2\xd3xz7<\xc8|[\x1e%\xc6\xd3+!k\x15\xc0}\xe4\xbc\xeaS\x8a\xcc#\xda\xff\x02\x9a\x97\xb7\x11\x92\xf1\x1fi\x1cVx[D\xaaU\xb6\xa9\x1c\x16Q\xb2~G.\xb8\xe4\x11WT\xa6rZ\x99b\xfd\xc0\x0046\x8f\xeaCi\xb4M\xac\x1d\x04\x1e\x14\xf6\x9f\x8a\xed`U\x97\xb8\xeb\xa7\x1a\xb5U\x14\x88m\xdd~\xdfL\xfe\xdegp{q\xaf\x92\xe4P\x1ff\x93\x07\xe2o\x1f8\xde\xac\xdd\xff\x97?S\xa9xv\xb6\xaf\x80\xabP\x1f\x95_b\x9a\xb6D\xe9-.\xe7x\xbe\xf3\x07\xd0m\xa1\x07e\xae\xeb\xb0\xc3+S\xf2AK\xe8!\xf4paE\x15\x07\x97i\xa3*\x0f\x03\xb7\xee\xbd\x03~\xc8\xbf\x135iP\xb4\xf0FZ:Z\x95\xf0f\xa1\x96\xdb\xb4\xcb\x92\x8c\xfa\xd1\x0fC\x0bm\x98\xa7c\xefMmM\x93\x8e\x95S\xe3\xb7v!\xde\xa57\xd0\xa2>]B\xec.\xb7\n\xaf7\xea\x16\xe8\x7f\x0b\t\xe0\xf8\xc30B\xdf/\xa5}\x9a\xd4\xce\xe5\xf1u\xfa..\x1e~K\xd7\xa8\xfa\xb38\xd5;\x93\x0cq\xe9\x97\xbfc1\xc0\xe5\xba\x00\x88=Bb\xa3\xf6\xb9\xe2\n\x15@]F\xce\xe6\x1dG\xd4\x0b\xe8L\x18\x9f,\xabN9\x02d\x19mu\\\x9e\x94\xb39{\xa4\xbc`9\xfb,\x91kq\x91\xe1\xfd:\x1c\x80\xe1\xf1\xdb\xdc+\x91\xbd\xec\xd3A\xaa\xac\x0f\x04k\xf2\xc1\xbd_z\xef\x07i\xc7\x97\xfaj\x9d\xc2G\x85\xac\xfc\xf6U\x80\x00h\x81b\x0b\xde%\xcea\x7f\x07\xc1^\x05\x99`\x93\xfeC\xba\x7f\x03\xbf\x92\x17om|\x1c\x83u\xba\xa5\x17\x84\xc0A\xf1\xd1\xff8r\r\xe1m\x9d\xa8@\xf9\xe7t\xcc\xc2oa\x12\xa0w\xa8V\xc2\x7f\xa7G\r\xff\xe9\x18X\xbd\x94\x85\x0b=\x92\x9c\x80\x85B\xa6\x9e#\x84\xb8\x91F\x9c\xcbi8\xe2\x90+)\xd2CR\xb4\x9b)\x07\xd5\xec\xe8\x1c2\xd0\xe4\x13\x18l\xc0~I:k\rM\x02\xae\x8d\xbf\xae\xa5\xcc\xcbX{\\\x86 \x90\x8f*@9~\x8f`S\x11\\O\xfd{;\x06\x17\xd1\x14\xa64\xa7\xeb\x0e$\x14\xd6\xfc!k\xaa\xb7~\xa7\xf1+\x84!\xa3,^\xa6\xeb\xfa]i\xec\x87\x82\x90\x16CF\xc1]\xc7@\xce\x7f#\x04\xfd)\x17\xef&\xddu\xe8\xbd\xbd\x1d\xb2\xf7\xc8`\x15\xbe\xa5Nm.\n\x91\xd0\xbd\xf8I\x87\xcb&\x08\x06s\xd9\xe5\xb2\xd6\xb9\x16\x97\xd048\x15!L\xa1\xfb\xd6`5f\xc80v@\xb1d\x97\x01(\xd3\xe1\x90\\\xfao\x84Y\xce\xb7s\xd6.\xcb\xa6E\xdf\x07\xb3\xd2\x00\r\x97\'g\xf6\xce1\xdd\x97\xba\x92x\xaa\xd1\xc2\xfa+\x1c\xaa\xcc\x85\xe9?\xe8_8\xd1\xc3V\xaf\x07M\x82\xbfA\xca\x9f kv\xf8h\x80\xde\x0c\x16\xa3\x9f\x83\xf5\xe9\xf0\xca]\x02\x12\xc3#\x16\x81\xce\x14\xa8*\xe6\xb9o\xfdx\xe8T\xca@\xc2\x08gSk\xdfK\xa3\xb1\x99\xfe\xb9\x17\xbe\xf6\xab\xf4\xa4\x9e\xaa\x93\x9595|\x82\xacd>\xb5\xd8nG\xe4%?\xe6\x03\xe8\x94q8\xf8\x9e\xed\t\xf7\x18\x08\x87\xdd<|\x80\xed\xb9\tOL\xab4\xf0s\xb2\xfa\x94c-T^\xebP\xeb\xae\xf3\xfa\xc0\x0e<q\xf5\x0c\x98\xd5Do\t\xb2(\xfc+|\xff*\xf8\xcfm%\\}(M\xd2\x9e\xf0\x18\x1b\x1c\xbf\x1f\x89\xe6\xf1\x00T\xa8\xe8\xbce\xe8\xbfJ\x838\xdbx\x94\x7f\xea>x\x1ed\x14UvK\x91\xa8\xef-\x01\x0c6e\x80\xd5\x1cUl.\xebA\x85\xbb:\x9f\xf9Pq\xab\xeb3\xe8\xc7\xe2{\xf2R\x9fL\x91\xbb1E\x8f\x15$\x06U\xa1\xd3\xf2\xea\x03\x98\\\x08-\x99\xe2\xdcsk\x10o\xc7\\\x06\x9cQ\x88\xc4\x821\xf8\xef"\x1eSud\xc7\xe7\x01\xa4\x81\x13\xdb\x9b\xd0tW\xbdb:n\x85\x18\xa7\xe7\xc1xt\xfd\x83[\'\xfb=\x114\xfc^\xc4\xc1\x9c\xb9\xfc\xd5\\_\xfb*PX\xa8\xa7\x86(\xa0\xa2\xfc\x1a\x04\xc6\xc4\x80\xcb;\x1a\x14\xb2\x16*\xf4\r\xcaU\'c\xaa\x10\xb6e>^?\xc9\xef\xde\x0fk\xc3\xbd{\xc2\x82;\x99\xc9\xbe\x97\xa2\x92 \xa4\xaf\'a\x8d[o\xcd15P\xeb\xca`{L\xd4FA\xec\xb6\x9c\xe7x\n[\xdc\xc7\n\x82\x82\x9c\x08=\xc5\x8e\xa2!\x98\xe9\x18,LY\xd4\xf8A,\xb2z\xd4\x13)\x1aH\x1a\xb0\xb8\xc5\xca\xc9\x19\xf8\xd3^L\xed\xa9\xc1a\x82\xa3U\x81\xdf\xbb\t\xc5\xfb<\xa3\xa3\x18\x16\x82A\xd2|Q\xeb\xb0j\xe6\xfbF1\xffp\x07\xe1\xf8+\x89\t\x9d\xaa!\x83\xa4K\xa4\\\xe6@\xa5\xfc\xb0\xc8\xde|\x02\x05\xb7\xa2\xd6\x82\x80\xaf\xf3/<1UtY\xe7O`\x97\xac=4\xbb\x02\xcd\xcdy\x92\xbaw\xa6\x9b\x8b\xbf\xd8\xbaYZ\xd1\xa1\xce\x01Ti.\xc01\xf6\xe6\xd9\xd6\x027\x17<%\x14\x06\xb7\n\xb1D\xf7\xdb$1V\xb3v\x109\x83?\xea\x19z\xc64\xf0g\xab\xee\xb4[\x02\r\xf1\x99$\x8a\xee.\xeb\x86\xb9\xd4\xfb\x84aV1\x80\x92\xbe\xd8hVdpd\xd0\xe1Y\xa0\xb7\xe4o\x18v\x90\xb1\xd9.M\x9f>\x89\xfdGd>]\xd9\xec\x16$\xbf;9\x03yD\x9d\x95\xb8qS~\x00\x96\xb7\xcd\x18K\xe7| \xad\xcf\xb6\xffu-\x8f\xba\x02\xca\xae\xfaq\x15\xa0\x83\xd4zA\xdaRds\xbfc%J/\x84?q\xf4\xf6\xb0u\t\x92\x89\xc3\xda~\xd0\xa6\xf3-\xb7M^\xa9\xbe\xe6\xcb\xa4\xacWdh8*J\xb66\xab;"\xfaeY\xe1\xad\x90+Z\xc3\x83\xeah\x89Z-\xda.\xe7\xe44\xa9\xa51!\x1eMZ$%\xd8\x82\x81\xaas-5\x05\xd4p\xae\xa0=\xd46K\rO\x7f\xf2\xdf\xcc\xa5\xb8\x98Z\xb4\x08\x9e\xe8\xf6\xf0k\xd2\x11\x18\n&\xb3\x19-\x1do\xb2\x90\xe7\x17!\xd9k\xb9P\x84\xa6\x9c\xbd\xf9\x19\xb2\xa5R\xe73\x837qk\x06\xfd\xd6\xabL\x05\xc7`r\xe3\xcc\xb3|\xe4\x96\xc8\xd3\x03\x19~A\xd9\xbaI\xdb1\xfa\x04\x82<\xb2h\x116\xb5\xb1\x96\x84\xb7\x16\xc3\xfd\xc3)T\x0f\x8a\xee\x9fS(\x01\'}\xb53\x00\xd5\x93G\x18\x8e\xb4%\x90\xc1\xbdN\xb4\xe8\xe7\xe8P\x87\xff\x16k\x10\xeb\xf4\x82\xd6_Z4\x15\xc7\xd2\xbfP}\xee\x94p:*\xd6>\x1f\xc6\xccP\x0c\xb6]\x1c\xfd99\xf9\x05\xd97(\x97\xbfQ\x15;W\x10x6"es]#\x88\xe6\xe4\xdb\x1c\xe84\x00d\x8a\xb3\\\xae\xcb\x10a\xe9\xd3l\x95\xa2l\xa9\xf9t\x174"\xdc\xe8\xca\x1b\xad\xcd\xfa\x92\x8a\x14lL\xba\x8f\xda\xa1\xff/\xc4\xb6oi!\x1e\xd6\xe2\xfb\xdcO\x19L\x04\\\x12g\xfd\xe7\xad\x92\xd0\x9bsX\xd7\x93\xdf\x0b\xcb\x94\xffO^\xe8\xde\xb3<\xb23\xd70(L\xd9\xa1\xb6\x0b/\xc7Xv\x1cN\xcex\xda\xe6"\x00\xca\xd5\xa7P\x99h\xfa\x18\x96\x8c\xc8VFT\xa1v\x08\xcd\xac\xcf0cM\x89"\x14\xabjS\x12]\xdc\x02\x05QC\x8b\xfd\xf5\x92blU\xa1\x0fa\xe8\x8f\x11\x0fzZ\xc6\xc7E\xf3\x99\x06\xf7E:_\xc6?\x03\xe1\x17\x91\x96\xbb\xdc\xf7\xbfJ\xf4\xbc\xd7\xbcy\x94\xb8\x16#\xbf\x01\x99z9\xaa\xd0\xe5\x8d\x19"\xce\xb2\xdb\xb4\xad/|~-\xf7I\xc3\xd7\xe1\x1f\xab\xbf@\xe1\x1eTT\x0ctV\xca\x89\xa4R@\x84\x02\x03p\xa6&\xf2AJp4jBmL\x84\x85\x0cI\xb0\xf9\xf8\x9f#\xfa>\xa6?p\xfd[\x03f\x19\r\xde\xcd~\xf2\x1dV\xe3\xb2UqF\xf3T\x14C\xcd\xb1J\x90\x83F\xb7\r\xad\xe5\xe9\x8d?\xbc\xf6Bu\xbd\xde?\xc0\x009\xb4\xe2\x82\xc3\x17\x03\xaf(\xbe\xd0-\xd5a\x9e\xe9\xa3\xd9\x19!\xab!>\xfa\x9d\x1f\x88\xee%\xb0\xed\xa5\xe0\xa2A\x92\xfb\x9e\xda\xc3C\xc6Z\xb7\xe3\x963:s\xfcS\x9a\x92\xb53u\xc8n\xd2\x85\xa2q\x8d\r\t%\x80|xt8\xc4@\xf9l\x0c\xdc\x0bB\x97\xe3\x86H\xa0\x8a\xa30\xd9j\x1a\'\x0b\xff|\xa5\xafS\xfd"2\x07~\xe5B.\x04\xe2vN\x83\x8d{\xc7U\x04(\xef\xa5\xae\xf6U\xd9\x9a\xf4\xe1\x17\xed\xdb\xab\xe2p\x85R.\xa2\xb6GNa\x14"\xf9\xa1\xcem\xc8D\xb9fb\xa8c\xccfy!\xdd<rV\xe1\xba\xceKW\x84\xf35q\x1dwA\xa9\xae\xea\xa4\x1c\xdd\xf5\x7f\xeb\xe0\x93\xd9\xc1\x1c\t\x1b\xa4\xc8Rn9\xd8T\xf8\xf8\xb0\x830\x8e\xbf\xca\x99&Q$\x9f\xae\xed\x96~\xdaI:%\xc3\xf0h3\x81\xcd\xa7V\x91\xf7\x1c\x90j\xd7Pf\x176\x88\x1b\xc9)\xca\'\xe8(\xca\x1a\xa7W\xf0}\xee\xa0\t\xd3{?\x01\x0f\x0f\x172\xd5\xf6\xc5W\x7f\x0b\x92\x8fp\x87|\xbe)\xec\x8bp7\xa5{\x95g\x05\xe3\twlQ\x071&\x04Rn\xf8\xe4\xe5$\tL\x9a\x06\xb14\x8fT\t\n[&\xb8\x8b\xdfa\x90\xdf\x9a\x7f\xdcj&\xe2#.\xcd:\x1d\xed\xd5m\x12^-\x04\x1c\x99\x07\x96\xfd\x90\xf9 YKS\x1e\x08|\xfb\xc7`\x1b\xaa\xa3n\xd4"\xbd\x13J\x9aB\xc2\x9d\xee\x189a\xd8\x9ax\xafd\x87\xcbu\x82\x98\xf6\xba\xf7\xfa\xa2=;b\x06E\xd6E\xe7\xd6\xeaD\\\xee\xc71\x10QV\x0f\x0f:\xdaoq\x1c\x0c\xf1\xd9\x90\x8c\xcd\xcd\x18\x06\xdd\x89\xb2\xe9\x8d\xc8\xb7b\xc5\x08\x88\x00/\xe4\x84\xb0\xe8\r \xa8\xbf\x92 \xf2\x94\xa3t\x19\x14^\xe4\x03\x06\xf5!VF\x15\x92\x95\x89\xd5S\xdc3T\xc6\xdd^\xc7\xb0\xffs\x0c*H\xcf\xa0D\xd0jx\xe42\xa5\xea}\xcb\x99\x05\xbdi[\xb8q(a\x10\xcd\x18\x9b\x15,\xd2\xe8@\xdfj^\x9e\xdc\xc4\xff\xfc\xa9.\xe3'))
```