From 4f7b16755a0d25d35b84f028673158b7d921f6b3 Mon Sep 17 00:00:00 2001 From: "Fredrick W. Warren" Date: Sun, 26 May 2024 14:47:45 -0600 Subject: [PATCH] initial commit --- .gitignore | 178 +++++++++++++++++++++++++++++++++++++++++++++ LICENSE | 13 ++++ README.md | 61 ++++++++++++++++ pismotek-remote.py | 53 ++++++++++++++ remotedesktop.ico | Bin 0 -> 67646 bytes requirements.txt | 3 + 6 files changed, 308 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 pismotek-remote.py create mode 100644 remotedesktop.ico create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9849862 --- /dev/null +++ b/.gitignore @@ -0,0 +1,178 @@ +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# vim +*.swp diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6812783 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +License: BSD-4-Clause-Shortened + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that: + +(1) source code distributions retain the above copyright notice and this paragraph in its entirety, +(2) distributions including binary code include the above copyright notice and this paragraph in its entirety in the documentation or other materials provided with the distribution, and +(3) all advertising materials mentioning features or use of this software display the following acknowledgement: + +"This product includes software developed by the University of California, Lawrence Berkeley Laboratory and its contributors.'' + +Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..24219ab --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# pismotek-remote + +Remote desktop connection application that will run a copy of TightVNC server performing a reverse connection to PismoTek. + +## Setting up the build environment +Making the assumption that python is installed in `C:\Program Files\Python38` and Develmpent is being done under `C:\Development` + +Pull a copy of this project from git: +``` +cd \development +git clone https://git.elder-geek.net/Pismotek/pisomtek-remote.git +git clone ssh://git@git.elder-geek.net:10330/Pismotek/pismotek-remote.git +``` + +Then setup this foulder with a virtual environment: +``` +cd pismotek-remote +& "C:\Program Files\Python38\python" -m venv venv +``` + +Activate the virtual enviroment: +``` +venv\Script\activate +``` + +Update `pip `and install requirments: +``` +python -m pip install --upgrade pip +pip install -r requisments.txt +``` + +Testing code after making edits: +``` +python pismotek-remote.py +``` + +To create an executable in `C:\Development\pismotek-remote\dist`: +``` +pyinstaller pismotek-remote.spec +``` + + +## To Activate the virtual enviroment from a new DOS prompt +``` +cd \development\hcatitles +venv\Scripts\activate +``` + +When done working in the virtual enviroment: +``` +deactivate +``` + + +## First time run of pyinstaller to generate hcatitles.spec +Windows uses `^` to continues a command on the next line. +``` +pyinstaller --onefile --windowed --icon remotedesktop.ico ^ + --add-data "remotedesktop.ico:." + pismotek-remote.py + ``` diff --git a/pismotek-remote.py b/pismotek-remote.py new file mode 100644 index 0000000..6dc161d --- /dev/null +++ b/pismotek-remote.py @@ -0,0 +1,53 @@ +#!/bin/env python + +import PySimpleGUI as sg + +""" + Pismotek-Remote - Remote Desktop Application + + To "swap out" a portion of a window, use a Column element for that portion. Add multiple Columns + on the same row and make only 1 of them active at a time +""" + +# ----------- Create the 3 layouts this Window will display ----------- +layout1 = [ + [sg.Text('This is layout 1')], +] + +layout2 = [ + [sg.Text('This is layout 2')], +] + +layout3 = [ + [sg.Text('This is layout 3')], +] + +# ----------- Create actual layout using Columns and a row of Buttons +layout = [ + [ + sg.Column(layout1, key='-COL1-'), + sg.Column(layout2, visible=False, key='-COL2-'), + sg.Column(layout3, visible=False, key='-COL3-') + ], + [ + sg.Button('1'), + sg.Button('2'), + sg.Button('3'), + sg.Button('Exit') + ] +] + +window = sg.Window('Swapping the contents of a window', layout) + +layout = 1 # The currently visible layout +while True: + event, values = window.read() + print(event, values) + if event in (sg.WIN_CLOSED, 'Exit'): + break + elif event in '123': + window[f'-COL{layout}-'].update(visible=False) + layout = int(event) + window[f'-COL{layout}-'].update(visible=True) +window.close() + diff --git a/remotedesktop.ico b/remotedesktop.ico new file mode 100644 index 0000000000000000000000000000000000000000..892a6cf1e5024eb04d0feadc30e9cba3889b5475 GIT binary patch literal 67646 zcmeI52bfjW)&5B)Ci#+og2@+6Rk4M{7Sz~9KmqAp=|~ePN|mA_4AP4r((BO66tEjx z#umF`iM=4bGlij-^?!f+-Zh@N4hV>kA>SRJ*K^Og=j?m#e&1F0+WTBel=y-EOHD1I z|CcK9m!JNi#K|Q}l=zFFLmUjpd09g5CI6B=knDkE4P@4oA%PMz9d%9JTLOqejC z;r;jD-&n_*v}x0(yxuP@FrD>R;hckj_c(`h|16v(oFSYhoFe>D_`UF3;UwXIg$33GFzC-fw@Or@c#@6UVxc<5Diy1R!T>ZcU4|Mv+KmIZNpa1;lW6wYT z{J-?K^0n7qv)5mLJ>ZQu-mo{{d^6y!x85?aY}v9xy#4mu2C}oW-&7lKEnT{F@xp}* zXWVtyU7gC5DN|9ObE)um;Ub}oaDi~1fG*I)*}|E^=>nSglYl0ECoo-#4$&jJM4xDa z?|^RkPDwqe6B7QSoYPN%^U8Brg>7|$K<(FSJ_n4~ix*#f@e?#LV#J7Ex{o8(g8PRUkZP%_{ zwr9^C+qZ9@9XN0xVE_L8K_}?q(@#Gw)PsD=w)FJ$>2besiS9AcClEu36&@$tC%6ux zaU#(tB*qEyi2qA}d|%>YA@6$q3)%ZbY#qP--h1x_+lFs!+U=Mv`%%EV+kT?`JO4X& z>?q`a@7}!z?*J{JiQT(*2aRw(TKM3D4}uoZ!KhKAz6*aqT>HP~4~n&UxPR)Yr-l*7 ziPzXWHtx2JJx75rcYmI!2lk`>KR-X;3JMAg{_z3u4Bu$L!7+RT@8c`b0M`*$-hKDo zpo2Pf>eSPHUM75#FNo#`#rXnq#%O+!=nLqh|JFb3zKFlq{x5`*%H>`lcOxbz+Awh( zgY9ekt7o5mb^-i<{`u#@#+@(c z$vHZd2BJBE`v4yYxF3LHxQ@bkce_V>T!)5elU!i(O$}BC4OLZoW^g9FqShpL}uz@t-jr_6I+n zuM@9%jRxQfo}wJV6MQ@Wo(pmu8;)wgb%2f>94n4{Z}X#%KC(OSytA|VwXEP=`j%tI z0^T0_acy|6fi}Dr;oA7Kj-4f(A(RqM75*grK{%9e!S8+_HL67aAL=@~m*D^B&YfEe z{>lB|1+L*enxlJu7Ukc4G~D|*fZWkF5cLCS2B5D*xSl+(aPFxqP;1bA9t)0-rVVs~ zCcY{6h>k@IHF4HiXPr~EYSsGHs#U93qehK7HEY(aeZd76oUZl`m4m|7vGx_TSDX)^ zPR70bnpz%p82CLH|55vQuAF;#XT0b&f~W@E7q~ybCq&_GIqzIcd(<3MgIag>)mJ~S zF~D0l+;Brcty;Cx)u%HnRjPFV#TQ@P8R$D44ZlZv4e=xDA1=P|!V4Q+e);8XbWam? zk8>I}Z1`%MHf>hlamO9jqelRx#bpX(V|5_^98;y(@*Kgd0f zWj^W}NX!9)2FL;M0rdUB{J+P4xPvqJa<1SVd!@d|mVMp>XoPbCT1bTRo~R|pfP)7Q zHub4BY0|{HcI|3Ih72*yEtqOmruwnXnKQ>GPMm1HdiAo79XlF20n!Hgn5i04XK?DN zr`~Y18u2!~P1>(tzy2p}+qMlH4;?zxG)6Ji#eeXKs z2gT(K%xQUiNX#dXl|LvpAD|9E{SW&jMn`ir_KUOoDDU`d#_Vj-fct_(Ex0Cp>v1Eo zEpfR`{X}0K7Vs1Bj-AOqO&kUs?)Bevp0~#qKELVwL%m<2LWTRp^U>yw$HEur7r*#LRpox$%9Sf;|7|$wq?4#yl@d-7zHk0@3x$6_(0uP~ z>cQ~mHtL+aeZmtwJMYvEs2};fFvpA20@o#i&jGZD4wTzb?+Lm2`RAWMQ?_D9gKMt2 z#=y~Bd$4P+yY4!>>Z+^0Rht?!jMeumC4ArhU$^k}KdsR?QRBg7XaJjbzMP{(&Y90= z{uc1sbx@oZ;5ZSk7222Yc}#ayWLzc#%=xaIC=CPqzHA>Nju1@w&F)wK!hY z_SG}aIOCN#W~laX^Ur_&^KF0AJz=9 zhJ^J)j3d#3Yr*{jdWb@~#uE8cIH!M@$0IMI=Fa>cHF)M}sJY=6is(W6h1w|YHT4?o zzjEcu#|(_!FS+EBw)(v9YEFPW{CnqI_wcnp`GGn@&;hk#)`tPsX{df^3l=Oe*|BN; zV5rY%ooAt6h{gysp*X*2?AWoD^&zJSjDt=W&J@lTn9KjG@U1j)?X}ki{>cN56;%7P z%PzaDneOda%>Vqya;@)o&_Dcv@`5qKGS>n8YyD=Z$5QhgK74rC_xQk8e&Si3-$S)h z_zi1KwJn^7)@$nFCkek57!NZpit2+t|FgjL%*8S1kIyJ0utw11NAMXMGft;gqq%}( z2F>A+|JT)Lai7upJ?kl=^*a1FwH0!<f$tVkhAD9P}BW|L8~hlRA~-CwdK-PX*|y2xRkv4poCY+V`ZV3i>R+ zPrXe3J^0{**^3u1Ha#m~dhR3mf6a@eexE&a{q@(UR;g0Ojy2S7`S0_49m~&_?Us>G z#+PRcIplccZh9T&u*m(X2P#inMh+;XzVgZ|b+lh9dLQ%V&C8xXeR`Oi!}l{k^L_KL zT21PAQ9D+<<)h#Iczms#t&V*2a`N(M{mpAL)MUu%iSO_aSR(+WfdDk2Tz`yEM!8(J z)@ldd;U3(5_uXlVm)SshQ?}+z0yKuo);Kyq^^|PQi3VuyCfm`fRjX{EIo9l(Z@xJ| zb8gvcGkd^*0f&V?eflhC?)^y6ty?$yCTM*E1)_Txq9Ho$R*TZnG|3 zx`h7qwGq90_YU*p%-O2XtY5!=rhW}`tC|A{^ZjUve1f)_>(9!{`maW2W~LQ~*|TRG z+CN(UHJ^8)=5&_%`m03lT?2XsDA+G?fH^?cXK^mt;2i3~#0mTW{JRDi`)dx_mMmEk zasccI?w#BI{rhwO%$#?%TKT*X)`#GXUw$mZ{F6_nrKJ_}PmMwI)P_cnckaop6hp)J zpuhYzTjFiv_k;iOlyzILM*up)w=j$?fAO7Lq*Mvv6=m1}l z=m)3+0*wQ0;J|^wud`)M7u*vI*s_iWjle&?A3f+fazlsCKUz|b8EQ<7GxSVAXgjfw zj;DRri=l1qSLd|kNffcMB5(Jt^<;2O{~X2HKZ|9l2<0K3Qc69=$+#*S|L?)%XX{Nww{ zF`R$y(QPKNuh=I~Kr?{rh)WzNwzAK0e96NPKOBzJ@5C6t=CQ{fGp&aR?f7v%n`6a& z-q9TMwxW48x`^(3yGO&n_$}|Y?Q{2R;XmpFhyy^+0tEi?N6gW|DY+jyA@;*R&us#9 zz&_6h_;Xx*7Gs9uG{ASI-&w;6|E!6`{;_%1%)vivCEfox|Iyg*{KFx9qATy8#4Wm_ zF3EB7Q`+Snm(O0X;R23@Hu>Mjz96l6X85^4Rq#wP~$?Mobzq*+;h)`T!(h3 zouV;bvn?*iA?6*a{fpCVIDvD47y!>a7r-;z zY!fx$I$*vJACTw=(7@x5KOXEHUjRq=0P+CEw%{Y+gZSgV-}(30kDX%M^cmbZXNi2! zzYjh1Q1GYdntjgUHK3h?9p^f4kJk>)_v6Q6i+`jY?8P<7){jR&1OBDG!}kBO@lx0{ z{Q4ZbYamev_ya)g20NfG!1y09Ux#MU5$l1meg2})hqw>$EpY*#!TrMz@K}HbR5uRm zxrqU+nPrR)|E!lMA0YOV_q*@MC&Rz{{wV+0YP6q@m)F<^y61k$XYhBtW{aOm{2uTx zZVsD&*>hKNH+;Cyzq=0HxAPuaU`$8Nk1;lV>$M+zIj=b%9T5Zk*&ydX>H~buxa$C) z!5AT`0r&^#oVf1eKIV-U>AYZlh>^UPGsmMu-SU~ApFweif2>cQ5oUAvG!QeWb^AL@(L6v-oxcQF1v82|E% z-{}9bebp9DApXJ`wg;Gl_ic1uo@0#rh`;1qd^UE8z2OTyhvppO1$iPGfMe&^Z9U4r z*B9Lve3J&UhgGxZI{wi9)#U_xrN__h^*+C{xBC9h-X3tOy*K1+`(VU*_VJjD?X&S$ z+80wQ*ov7|ZS~x`wr){l+nCkL@*eAC_Tn98ucVs2KFn;{7_)aLnSGFE_VEI<&$7(E zeAH~!(`M^lFx&W=*_Llen_d3Unfz0d58 z;rg5bX8+RXJ=fjrpB>GfY;E>|p&EVH87;;YT(Ut%`re6yKV)vk0!`{?Y&KH|Td*)ttt{6E$t#{bgl;{Q6cMezT3 zv)S-}w)j6K#{alqivJ(S_#Y1V^P~3fJ^;>$wfJ%JLB@}aFW{HF5YC-@Uc3GCKD8%~c`QJe(eZ%i0?$4DsQs&d zX?ykdpV=FIPPAorpKR|AIK|!{BK}956Zrpp{N?uLl=8M}W))jIx3>6iXq%SYWLqD; z#dba;TYTwmv)2Zjy*bM4?Qv%Ro@(~tY_m@m$(EPKeZW&Oj@SLmY{M(UtFi5R?ZZ7j zBG~=|x^A(qpQCoBNl)X|?!B@0U+QP}g7o%m7qh3^n?2Fe?6JmX57jkWTForuTJe9C z*}RLz|G8!}&JzEBGMjjk*|=YrjY;4?HO0pEXb|cn--7=V*uS*$Bm6lvRkwY(hCA{> zwt!>!0CF(K+}JpujSqltc)>0`@8UQb;5zaY@-2J;V?%O%I7bVB*Bo>H(F(`iSD?Q{ z4Fn(X&`f)^&q?-XpOW@=-;?dV0e=$zXWB<2&#_O(l(8?w|B5N)#D8V+U&}Tuy3sag zHMg9HZnkYtbe2!P%k0&AVm=yQO$>N{=2t%83vmj!E2V+e|BUgyR-D5-`>S-E_rG{B z<}H$CwX}(E|B(w65=Yx98l{2B;}eJ0Rac2k;H=4)!?? z|BOdn1H_7hY2d}hL+!0TzZCz!5&wU*4+fuZACLHpeKzKAwtW1hwqkNwTRo$at(#lJ zHZE#lTe6yo|2CHYc&D#oz-vQdwu%pUPd?y-S+P8TIDiJ0KVr7x@mM^-*Ao}m=Q!_w zrt`=fKGb#i5N!V~*?yt#zat*|JIVLAQS5JK_Q(y2{k6=pDvSSeW(zJC|7Fb5{wn@Y zH=FzivkAX88~by!(Lb{NBO?6wPqEQm>xQ|KgYhp;4~PGt0mbuW@Xz=gd!?`4{_(%= z2jG%8L9F+4qW*#SfF@iIo|`g%#c}rq2d;@*}E%5pHfy7+kwK0|K zoxcBT{~qvr`*3h6`(#9E@qd9WA9snZoP3q7nQ@)1pHs~?Ev#o-G8IzF0xgVue7z(E7Lq2)c$!U`U1XS<$O3?MIixu4?npqRggyPyHt zF~0nxxiNl;?Qo4xV9P!>&-WL*N+ia}E9gpTa#weF54)W9Wt)ACBQ19k}n0^3VI^glK^CipvFF z&Kx2BPqvQ+{mDKZex`jf`W#zv|An@C(q-cR8rv|tvTa^a({j=qSpL$cR`5t0+xbLC z#btcJozj4E^pFdRyPyI2@b{)DACOJMFL@!k9ee}!InMi>hi14gaIbhm&QH4`?n`G+ z-x9I?`ttoXW4?cJxvzZxtiQ_lpYgTWe?YN+pXdIH{qR4$Q%zI;R=D;On{;3oM`HgP z%e7>Fg*qvm6{i9Cr}oSoD7;1M!EhL@r=bPj=NhyG-`pD-AV(l(p$q&3K7;G27s0vP zew2S=1sY(?fCgyWeL!?f_|E+m?c*V(?6VPnw&i2avlX)c)sru`b>e^H>`Jy}es#-D zuV?v78r$}VTiULF++qi^m6Jc;E0zno2FTkO6TW?aj92nG@&at!!9K^~o%1-K>&PVn z_jf7h?-}>|(piZ6%@y~fwtsCb?+@et3yS*w3BQu>|JhfuAKy>zr`W&!t`r;Ap?X*= zz~nkGHk`&&V%7+f7_WG(g-Ycf*$96}yIG@RbEBKau$q=FH)l=d_|4Ajc!0 z$Nu5b<34ui{y&j__;f#jjiV>{hWDrj_&hX1TX5_e@YwJCyMG~9gn#nF#9V;5_s+}~ z_W7vN_T_!&*(&kBR{U?6QC9q4XIsU8-s0L;u;fPD`A{?Q-`e&w9?$L^%g-63!yO#H zqH!Vd03A@ndqW&kCvdROao#6)pvFf%fx6=J*nNciFy3z>?i(oX*NTn#i2IEBsrk&g zAa47mzRLUW|9Keq73cd4?ntpgH&+SkCCRZ8fn6L4{|o|{M`hj=eq94T9>hk;`KkHg z)1$ecYalvL>|8}Pz;$SV_VNE{fOx>YdmNw*_x0$&xkneYg~kARAR6G9`v8vvFFu)N zU)=i_TOs~ei~n^~V*GCw|2gxkSpMQ#wtYzh@!!PuJl4_5{qts@|1%d_?x8ag_ zfDZ5nXrU0|8(Zf+&f#2QJ=Z>`HfW1FFLoceZyFo#Jy=`ZE9ax$x45k0{$;T-A7lPP z+dny8^ZjYjyg%amxAjS}fo-o3^Wlt%5^*&At6sdE+>W-e(?ksr_gQP^x!}PxP+Tm4 zGjzf=!~)vKSHVA8@Hl{9;d=Ovav$ZN_t6OalM`~SYrx~c2QwPk%CX{q0{mZQ8)g4n zW?yT$;(y!XnzlWwzU_Ljk?no7g&iO+;{*PAYm7Je!*^rH_=2E=elecmIzaw`njUo> z=bbzco6lA|jPssqt6X0`pRpceeQG^RtHsBA^83_#=3S(E-+8kAKgY*>zmJXi-S(;Z zd)}v-KY3q)e1Cqg6dTaGlIgjHuW=85)Z;Wydf5IS`zK#yY>z!AYJff_H^9ccE|BO4 zz9}ETwmB#22Z#mm&u0>I&=xvDFL3U0-)$f6X@{7@I060{Gs1sV1Ft?hP5hs4YsCM0 z@xN)t)wXqZ1@V8q_^)9*vg+FI2OHYHN1NFJ#^c!O(;Xrj=pM`4v1i7IFUq#z89jup zUZW4*$JaBy3pOwA$@7`tp~gpzw+Q!@Vzr)ySBm?%-%tBXtlksqeIECJY6qfYez*O; z;$OC(-!sMfx2zb}Oyf@zL9Av>53h&&r+jfKYiDRHQ3J$T=Gn2?Xl;PF9rXk78;u81 zU%+d4BX@*nVhcKR4e+@fqdm?;1Mu!(KgvJn5C_lz*Es(k2bNDRZ)?T>2Jyc+&VSzg z%2u$ry6w!YV|yOB!S+4UBxa*eh_6BoC|@HVz?R_^yM|-N2>1mM_H{h)j?L?Q@;tc5 z?!CUx{2o3(*gf2rSIigpA>aR-a=yRD{r)MM>-lZG-V@9Di^P3wUwI$4zpZzQ<@HFh zel4yI^VisBBH-&t`B(0jO8&>SaDoQlgtn;*Fz*x12iy;!0c_fH!h>nR`9mMk`T!ch z2cRuJ3w`lE{JMVpTDN`L;B$x(@K5b9F&BI%Yk;krDE_BjD*mssoZ00qe|{y~zNnh* z%B&^+>)ZZE8p%eR#WaA;1`Wt}Kcm=9JP0~aEDu`H7=iga#tQ6X?}2yxy?jTo`#AU1 zcOO;T57qn1=cnWIqudko&ywFiHCF4J@auT3KR(x^x!%3eF<->?bGxTl-)0r;_SPO`NwMMo)>!fAt zOX0vZ05{})c@45#41n!CXH^ywA8ehowD=Oc=CYJ97pO4+2raIprVsm`s zO2+E^%=37yZ?NY1>j(iu<|UQfzDI6zkLIny?lYJ`zD*t$Erb=ARr-*QKgo zvpqM5ch=R>w{UYP4G`B4rUQ6$9l$HL%enXy=bz6Y9-u$kf?v+{YopwAJ@4al@c;0S zW}-geqx5dJIq-jF;J;x0wYGCnW!sZc&Gs+VI2`|sofc{UKhPp($K(X);7R%Ppat{* z-`Wqr-r*gamv$c07!RLMd$h|qe`)ntjhFd-#(U)ajP<9LigSNbY^=u|kGL;f;}h}w zJMjB=#B%;z#r>QvDYoU-6zhHC)nQ#UeU%9M@hJE|k@c~v0jDYNE)UmefSL;aAC3~o z1$=I_PMDYzMB@Q`!KH(J_#)o(Sw0@b2atErF8Xi{M6Zi-PaEV1@K0?hng_i3k2Kpn z?NZB`d4=WAE^FK8SFl}+DvAH9wttCilQG#t%F$c{!~%E>zCb#F+kc2-c#a|*$KJ&| zHqRKZ2=}$)+*gVD{*d=wrM&MljrT8%`G4m3g5Cd2+@Da$y~q4riGKffagXiamSUSb zrdZDgSB2-|=%+-`heygk;{?{w$_E6$p}tQeju7{=v$F#~2h)J(1aO%+K7gM@9Ypy< zGx)El58yS&Xp8I70M|I&?s*T5;48=js0k7~qCQ}Y_|Fyp+r2lr~5bsZVk#cKT2d8zfWz6<}K=J{VKJ23vFP~XSyeQjTq zd&c_Y`|kHQbx5&|?NY2;oy)`TB)H8*xAs^JdA;V`qT4)L=8l9 z0@s0S;7~fiCpdqckCr?Jpab^-yoW|Omuvhwzn1sV2*=?caF5Ra=NVmO|7FF0S=%Z8 z_lW=f8RCY#Y$-l~I1u#%vf~gB(1Gk4z;)m|&N=xV=LFsv<13D!qhR-NFMVYw=L>$n zthiU)54JDg&-zYkKFa?OOg+o?O+M51-v39f>pdZ?>t$^R`CgHjuY7+?-0yF^CB@da zO|dSuF11^4y)}GyzJCwC6s6Ep6jhc;7YPyu07$d-Fb^CJ6t;3HJdXJuuL6(<+Gn3gW+l?G5}_5=ZjS z!3W4*S%+1q0p)HX9>jGJc!p~S#|6%LkUS6W$@Sds#eJsQPbcTQMmZn0e|fy#hwnen z4$M5q_D}z-?VI`++c&AS?U_*8c8@ttbGs+l_DH@*orkfW$9%ZoAnw<-O0mv0E(y;v z&<}}#kE7vVww}sbZsh^x(SY{(-Ja#x6B;15iuwUG;PJpU;Nt`L1qagsd^+F`o@s;6 z;xhnk(;jWWv!CzVDEIgYYR2RN%pE!ZZ#_BBa?&ck!8{q3XPd1PLNaP;B@3v3QKmSt2{folb|3KOWwtvR?wr|?` zws*>TwrA3LwtM`!w)6gTY{#fGRO34#)b|7T@v)xA{0%pY`_?J8_NElOwc5quH&d{O zM9^o-<&QZ2E6+osw)0h6aO0fY5aE}Q``ss<*!`>j0w>|p$_6& z2z)!|&O0^__tH;@_vCxB`@nq#)p?_~e~BHKbFuB8C8S+s`=(!Ld#9GMJ(J7W?umc1 zUE?pXotm%MG3IH+it{J-(c67gS4{MQoys{1agW&6@=Ndq;dff{xo3%?DA+6F$wY48OR zEx0Damg8>oQSQn2i234vaXImSwfz2-c3}P$wtw#Bwtvp$wr|#Dws+>GwrBb!wtMQ| zZTIBA+pdWh+fJ=h+CKI|D;RU3Z5vg_@&}i;tzCW`%k`D-ZBV`!<$hI@6l-6(On9!% z$3)RB{ctq=Ys{F&+J1g}iD#>M#;{wKn}#@JXDW!AO*S*inO)z)~hRzRT!f)<=>_;$En$n)?a*u8U4%&%Yv7L~UH3(ML5`PbO~ zd1Y2ljK;WFDk?o#o8scjp5iRF*_yX6hP z*mC-vWuEItxnJEh#a1>-v33>z7M^X4*2erb{c<$?tJagv93a2D!EbHAzkYWkj0e$x zYA`L~+BJ}v7e;jeXW(Eu@ch8Fz!pExHM9fwXpGmM2l%<@!0p|6r#-G`t^oeY1-|0{ zM)9vTKMNb$?!^slPx_6j0RYVbW;U>WS`V-vEU70AXkK86G_gdQSV~Usem-jRviqz! z|Cy>KXgql!y|NuxtlUER#r}mAZT|v|GgWWgJ6AcUa?d@pH1?QT&UVkZ#&%7+#&%9o zJz~<;wtd1?Rxs`=+cx$}%O8D(<&C=Baz|WdIYTvXdB>SW?B2OwaYKsTT;crie5=o^ zM7Q`yjpL5k|0~{Sv(AI(tNCpQ=7U%hqV-{^@XsH)05%oXz~TCW#2gX6;LYLuWAn~` zq7R7bCVCy$;yR1$_Gi=(s@wkbYPN5&u&}D_T~NjLYOTTEd8#$f6=qkm z-Lop%u9?@_uIbm=&S}@$4n3E+eNuTVn4o#7apf$3>@}7*x~%1ny4rF^XuZPFt8B~Q zD{W)1vqQX(a=*NOinS?sUU|KcW%erMi6J?q!vKUMQg)y zqOHjG(x?fc0pNKdTzTFW^##$GkmwIQHaLISKled9@E7#~=qIWfUi)>l1IP`j1A8s_ zjpv^f_pLSW)5>-(ZW*vE{U&Lkh3(GJ8qmyU(g2VqvYOc5ti}QRvKkfD1iHwI`HFp+ ziXVU&l2J$bL~Yxvb!B^%TkKs})AlT=VSBXJc=udE&zuvkg z%C>zG3B~CEF3I7dV?{LJI*9rNUOWG2DcT;_`!&vWbj!5>-xuZo-Rz~dePKJz``&Cj z7Pk%9nXa|}>8)*7Myr6`nJuLQX(F?QGys|l(nOYP!gUez75Iw~KhkedF3}+56nhrc zw>^5kX!ioGEt+4)cF(J0yY$TIF6Es&XVgT=9u$K(=>S z8i@LWs1D#dss&zijB~Jm?!z_Uc|cSH&N*9ehujDLSr>*r-pzi%3Kn*>f<+x{`(n`E zcBJ28J2KkY&VZY>9-ytzMrbV!fL69UOPa`%CWJlcB2$`hKamlSAL)&iPc(`_&lc}m zc%$uFaD(lde}nCur!}T?>)Vbw$~$M(we4xbj5<~@y|!(eTFbUg(U@dXP0O25!*a(} zx16!nZ0i`|-m11`WEI;y{Ce9oa2BN z;5OTyeyh+){DY3RBeR3ngS8j*Ot`QsQ_qEEx+Y?}DAWXgA_K(Y$FB6|$|nT!iiJ&; zUpBFw3mR*jAUh2JX-<(;(ZylpW-y5kyfUUbvfO}rUv-^MI3h+F@&vm`HW?W17FYgQ5S^3B~t@-RBbhiSn2PjDI zDs-{!nitrf(ODX}O&Yj0j!x1*N86d@nuzJ5P!k!_MMhisjad93hU{Fdyke2^iiI~R z&uC#g7PQbjb9381x0#^l%w`L-n%K6PjcuFOCFf6XDE{>f;^Z4GchU`(GogX_Z(v); z*0(KV>e=Seb#2qAI<|3m9osNezgaN2maQ9D)7B2CX>0n|u+@F5+eejBtnnphh2Og& z*G&XtfkW}Hygm($IOoI-;)wb#tvKF`J0||?C`P2A0rCTKMz;FgB0BKA!2P)Ah>3Y3 zTsik>BawfucOT#yaL(EHYsvrMpZuTmH)q|WHUGVZUbZd0r)|r)-3kJFXxrVkXLgID ztJZ~g(b`~XB1@V8K^O89XaZz(kY3{PBfXt+381`Uk@AW~ZEX7jVSZ~XnAge*=C;(F zLrcv&-(=fnwXpoO=9WLBndMCvrZ%ip?unoiN+xj8(Y~7%G;=it~Nv&h6@2+hhT$^HzE;`e0y6L9EIWM34V#|7nL-DV5 z-edSJHr7s3FQdQImxs-LR1f3=;=QZt4a^-E{{Erzgu>r~i28!44qOZF4}1%6&Og`s z_4t6O2Ap%W1Gt{t2kz1HJ1;zCdFg$HyDUHbPRq}@L;MSweT3dtkl8DSte#eoC0%6o zkOriQ0O=wtrityD(uMnq48;${4r0jm#T{cg#iI7gG22_gf?KR$emgrV7r1G8FNUYdS)Xhti`o!-)Nr`=>ZQ(D;8NzHBR#OAhTd^6iTuBmMr+r&1FX<{4i zZEPDxHnR1@8``>|4Q=h<8*RA#cnKfy78M=JO_~oY9I2)2lf9v z??tT#->ETlj%>MQl+&Yqt=d6(jT4q??kW7{CeI5|PasxAc|-%Q12}aZz^!x7aeN2Y z`51$1{9NbTHRD^pJN)AVm;Yn7UPgbRpXFzQyM?~OUA8Uj&N%K6_k9FuB0#!` zXrdrfy2ykKNz$g6JivN28@-hclKvt^d2lUq#^pghe z)-$1fu3y1-Y+PXOXax^jy2?#e5=#jvoeXSw70F(Z?UaYZ?P>?+S%qwH{0fkZEe%|wzl#9Hn#D;*0y1ED_ehW zOItUxrL7%)ldT!r!d4G%ZmS12w^gal?An1#M?cILD8CGO zBK`mkP)p<)BecL;v#3vqYQg;j$Kaj361Z;M51^GOs9!k$E3!53lPUf)hX{i$H*2uv zWepMr3ikx$FBza`!5z}Yl2mD+zaUL4K@&ojbdeSJ6`ArEnZyvqkBr_zuaH;dFYami zi*6TsSl$9*es`gp<<9GBxpTDsWOf(JnbleIP`7C<@~z_kR@*YQllbpwnTWrJFcDDY$n{C}_VN_dNJED!P8P?iX4{2?y2DP%4_q4RPFHNyJe?7&THf?JD z+nUiW{_p$d9}Q3=Q2lTz9FZ4d|2$*D@Adlc_G->4j42bf5Vd{hKT!kt0tfa_%t!mH zKl{iwFTKxlvPKFcEN96G%Uv>D7$yw0ynrFvN)t<@i6sNYJy5O~P*fB7(gc1Yz~e`T zatfflB5&~>LLbXpBrNQ0xeI#fS+kzv|8~onE6nMk=g+!p9;%!8@22Mwx@ui&7p+b1 zY@4RsW}7D6CjM`=4dXl6hWk6(`mr5t-Ixxx_TKikX5=llW_UYWJ+z&z8ho>@9N5;D zU7TXIO8+tZ{w2S!oe0K+>d)`Z|HFOsPc?=*$}^TrlfnO!8{z}d0KX;3@2uk&h!?H{ z?A~pk>j3<7Eb0e5PEeZkwm~uuapti~sJnadJ1?IH{{`n9#-6kLzOV#&))K_uXb|N8f5| zMs>2)BRkou;T>(&&{ROp4Vw`wzx%peAz9KI1{z&wmX6XaQd!q*9Y{9pDrA z%@KaXnYl)OhY;`^L)0JL?m3_OLZSv-E6f8q_gmh4*0w${K^Sj20pqm2Ul?mS58kKW zegb2J(SkG~XHt9Hrs=(H{Ke30c zAK$~)jq7e}$9A)|_jR>3qr2MbQC)1+h|ach*lo6Q$Zhue`6*WI%-@B7Gb`%%{Wasc z|1|#HA4mhGRC`E62iP+CARr%L?iv31Eh>O-U=9-Qqx?tx0QG+7e)Icp+SUiB3R7(B zLtwIg>ur)SQJ4_Nc*}igoN#{}W3`QHVzlLL2hoHO_Z7L)1o0yvE1p+m4w43h z^nvZCxlVNDbIBzrXkw=Jd18v+tG$`r4*6Va8pyar&KlM)3|kr`pHX zPwJy*)_U8z@x5&AxSqCVtT5(wTYYa2TQ#b?tsK$KRt)QAubq=(RZst|@o&ug?;LEvVY{zRR^B1pS<6=41!~%=zBN@tQ7!H68n&h%s2;Gke|1~izgi5bRc)=X zE}%-Ny;6T&mwLVG@St)G{q(z%{VJ(03o6>$z7=iFUBaE$1+2c~I$Pc6T3gjy=yk2F z>?!oP)>d@aZxVN_U|)7EZ_7Iix0bgrI+e4}JCw7}+FxUzwY$bXZF`M<(z>jD+^Vd7 zbW>UTu=&;YLDQ@4{l-_>E2UHH`cqG~`t|D<{zhhW{6~K%=lYNG|IT~jmbgHU$UFow z9AAze$mggnk{9sXWN3kWf%-nYlj{L$|BY+cu%afD*H03fvm@UHs9}5;pk{iw5dTXPYc0wBWDg{JAlU=S9!T~;vImkqknDkE z4*hTOuXCAFk$DeE-Y%`z6Z74y5}2X$ku!WBdMgi4w7o{A#~MXd=4LXB650Ny5HP zNG)|CHjX`3Mm+%!@A9Iv6@dQvR~xmOOz~nyV{R@nm)H=LjRPE-d%WK z|BL*UEb?u1ed2!6?kiC;alh#8l_*)H_takE{+E#t*UOTL`-$f#?k9d;;{ANv{lxG8 zeeYYTA{|!pYx`vq-cQ^=G2#6pyVA=KiyZj+eoDgoKS+%pD0$!q&lcI=RifyAB7a{- z&ldmBo>t^Q$!Gf)IiuvWMeVQTb4Bb;_g}=`!hW;?-jCh_`%#IoAElW6s0oGrNP}TN UqQS5qY4Cg5=bn>)-%StvfBA5q7ytkO literal 0 HcmV?d00001 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..15237a7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pyinstaller +pyinstaller-hooks-contrib +PySimpleGUI==4.60.1