diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/METADATA new file mode 100644 index 00000000..df404f41 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/METADATA @@ -0,0 +1,88 @@ +Metadata-Version: 2.1 +Name: pyOpenRPA +Version: 1.2.0 +Summary: First open source RPA platform for business +Home-page: https://gitlab.com/UnicodeLabs/OpenRPA +Author: Ivan Maslov +Author-email: Ivan.Maslov@unicodelabs.ru +License: MIT +Keywords: OpenRPA RPA Robot Automation Robotization OpenSource +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Software Development :: Testing +Classifier: Topic :: Software Development :: User Interfaces +Classifier: Topic :: Software Development :: Quality Assurance +Classifier: Topic :: Home Automation +Description-Content-Type: text/markdown +Requires-Dist: pywinauto (>=0.6.8) +Requires-Dist: WMI (>=1.4.9) +Requires-Dist: pillow (>=6.0.0) +Requires-Dist: keyboard (>=0.13.3) +Requires-Dist: pyautogui (>=0.9.44) +Requires-Dist: pywin32 (>=224) +Requires-Dist: crypto (>=1.4.1) + +# OpenRPA +First open source RPA platform for business is released! + +# How to run +Studio +Double click to Studio\StudioRun_32.cmd or Studio\StudioRun_64.cmd + +# Robot how to debug +Robot\PythonDebug_64.cmd +import Robot +Robot.ActivityRun( + { + ModuleName: <"GUI"|..., str>, + ActivityName: , + ArgumentList: [, ...] - optional, + ArgumentDict: {:, ...} - optional + } +) + +# Robot example script: +Robot\Examples\GetFolderList\Python_32_Script_Run.cmd + +# Python 32 bit +Resources\WPy32-3720\python-3.7.2\python.exe + +# Python 64 bit +Resources\WPy64-3720\python-3.7.2.amd64\python.exe + +# Module GUI activity List: +############################ +Новая версия +############################ +Получить список элементов, который удовлетворяет условиям через расширенный движок поиска +[ + { + "index":<Позиция элемента в родительском объекте>, + "depth_start" - глубина, с которой начинается поиск (по умолчанию 1) + "depth_end" - глубина, до которой ведется поиск (по умолчанию 1) + "class_name" - наименование класса, который требуется искать + "title" - наименование заголовка + "rich_text" - наименование rich_text + } +] + + +# Open RPA Wiki +- [Home](https://gitlab.com/UnicodeLabs/OpenRPA/wikis/home) +- [04. Desktop app access (win32 & ui automation)](https://gitlab.com/UnicodeLabs/OpenRPA/wikis/04.-Desktop-app-access-(win32-&-ui-automation)) + +#Dependencies +* Python 3 x32 [psutil, pywinauto, wmi, PIL, keyboard, pyautogui, win32api (pywin32), selenium, openCV, tesseract, requests, lxml, PyMuPDF] +* Python 3 x64 [psutil, pywinauto, wmi, PIL, keyboard, pyautogui, win32api (pywin32), selenium, openCV, tesseract, requests, lxml, PyMuPDF] +* pywinauto (Windows GUI automation) +* Semantic UI CSS framework +* JsRender by https://www.jsviews.com (switch to Handlebars) +* Handlebars + +Created by Unicode Labs (Ivan Maslov) + diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/RECORD new file mode 100644 index 00000000..5296492b --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/RECORD @@ -0,0 +1,344 @@ +pyOpenRPA-1.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyOpenRPA-1.2.0.dist-info/METADATA,sha256=abfVMx4Zr9fZV4pw6SslvpUpAg-qJPV39s_8Phx4RNo,3351 +pyOpenRPA-1.2.0.dist-info/RECORD,, +pyOpenRPA-1.2.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA-1.2.0.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 +pyOpenRPA-1.2.0.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 +pyOpenRPA/.idea/inspectionProfiles/profiles_settings.xml,sha256=YXLFmX7rPNGcnKK1uX1uKYPN0fpgskYNe7t0BV7cqkY,174 +pyOpenRPA/.idea/misc.xml,sha256=V-fQnOz-bYEZULgfbFgm-8mURphZrKfXMSd0wKjeEyA,188 +pyOpenRPA/.idea/modules.xml,sha256=Q__U1JIA2cjxbLRXAv-SfYY00fZA0TNlpkkbY4s3ncg,277 +pyOpenRPA/.idea/pyOpenRPA.iml,sha256=EXh41F8lqRiSBMVg-n2tKaEaHC6_3gGSuKkPJA12Na0,408 +pyOpenRPA/.idea/vcs.xml,sha256=2HygA1oRAwc3VBf-irxHrX5JJG9DXuQwrN0BlubhoKY,191 +pyOpenRPA/.idea/workspace.xml,sha256=6tJZehshdK4And6tEoUvkIB0KE7waL_NnTSkTYYAeFA,3802 +pyOpenRPA/Agent/A2O.py,sha256=Ee72BuVpmXgoNTUInqAj1xVdC4JoWCQ0d0lTlijKyuA,1225 +pyOpenRPA/Agent/O2A.py,sha256=IONoht1jb2b7JFT5syelVPq88z7TTLPZjcdH7SrR7rk,2612 +pyOpenRPA/Agent/Processor.py,sha256=FtU7IGIev2_po_fkJTH2KNYZap6IVFODM30qiqBNsm4,4146 +pyOpenRPA/Agent/__Agent__.py,sha256=VxQsuyItFvgXaDKahEKbG6hGgmpNGJFHRTYGGdP7J-A,4916 +pyOpenRPA/Agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Agent/__pycache__/A2O.cpython-37.pyc,, +pyOpenRPA/Agent/__pycache__/O2A.cpython-37.pyc,, +pyOpenRPA/Agent/__pycache__/Processor.cpython-37.pyc,, +pyOpenRPA/Agent/__pycache__/__Agent__.cpython-37.pyc,, +pyOpenRPA/Agent/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Agent/readme.md,sha256=QF_Bnv204OK3t1JUEhjfICkxFmSdX6bvaRl_HI6lH9I,19 +pyOpenRPA/Info.md,sha256=u4Nv-PjniSF0Zlbtr6jEJX2vblK3_1zhSLNUgOdtDaA,85 +pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=lzV3kinWlde5Fs4tBYqyKWetBLM4yEo6nbXmLC-fFaA,30159 +pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103 +pyOpenRPA/Orchestrator/Core.py,sha256=Q0n05GuySXDPy3V7qeYQON0kYEyWogZWhYevSjY4q2s,189 +pyOpenRPA/Orchestrator/Processor.py,sha256=8T10Qos4_GT7Qvhh8q59JPCuUyHbic087y_xBK9lM_4,6645 +pyOpenRPA/Orchestrator/ProcessorOld.py,sha256=Vh5zLRpWWf-vt9CCYI8nDY7oaefiufnu6Pnl4tp27pY,13749 +pyOpenRPA/Orchestrator/RobotRDPActive/CMDStr.py,sha256=6otw1WnR2_evvQ5LGyOVh0BLk_nTdilViGub7p56fXQ,1531 +pyOpenRPA/Orchestrator/RobotRDPActive/Clipboard.py,sha256=YB5HJL-Qf4IlVrFHyRv_ZMJ0Vo4vjyYqWKjvrTnf1k4,1564 +pyOpenRPA/Orchestrator/RobotRDPActive/Connector.py,sha256=CMZcyyc0hcaXn2Vkd4sbd26hWXNZpVZtH7Wx4T7VB5I,27765 +pyOpenRPA/Orchestrator/RobotRDPActive/ConnectorExceptions.py,sha256=wwH9JOoMFFxDKQ7IyNyh1OkFkZ23o1cD8Jm3n31ycII,657 +pyOpenRPA/Orchestrator/RobotRDPActive/Processor.py,sha256=AQ_u9QVSLpce9hhSacm3UT98bErc636MXza4Q6mHsSc,12264 +pyOpenRPA/Orchestrator/RobotRDPActive/RobotRDPActive.py,sha256=pbffSPsUzzaFMevNQ0P24NA0cdJg9KwtyHscnWYQc_M,10769 +pyOpenRPA/Orchestrator/RobotRDPActive/Scheduler.py,sha256=21N0ilFzWI1mj3X5S9tPMgwvG7BviuBxfTuqBY85Hy4,9144 +pyOpenRPA/Orchestrator/RobotRDPActive/Template.rdp,sha256=JEMVYkEmNcfg_p8isdIyvj9E-2ZB5mj-R3MkcNMKxkA,2426 +pyOpenRPA/Orchestrator/RobotRDPActive/Timer.py,sha256=y8--fUvg10qEFomecl_cmdWpdGjarZBlFpMbs_GvzoQ,1077 +pyOpenRPA/Orchestrator/RobotRDPActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Orchestrator/RobotRDPActive/__main__.py,sha256=z9PaUK4_nBiGd0YJdYVHV_rFx6VjZaxrrmKxSyoTFwY,2508 +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/CMDStr.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Clipboard.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Connector.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/ConnectorExceptions.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Processor.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/RobotRDPActive.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Scheduler.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/Timer.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotRDPActive/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/ConsoleStart.bat,sha256=_HNadUKHOYI5y6foG3srh8wjSzhX33xaKNylFtDjOJk,114 +pyOpenRPA/Orchestrator/RobotScreenActive/Monitor.py,sha256=TV-YisVqa_uGiyJLG9oK4u-5aDjGiFYZFh1dPjOgYc8,492 +pyOpenRPA/Orchestrator/RobotScreenActive/Screen.py,sha256=VnYcvCVymrD35l2J4ln_tlVn7CilZhxE4Ggw9P-OhIw,606 +pyOpenRPA/Orchestrator/RobotScreenActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Orchestrator/RobotScreenActive/__main__.py,sha256=JASxDDVKWUU7DAbDkRrGTrPk-P7LZchTZFh8usp6b4U,593 +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/Server.py,sha256=mx4AXf5xEoi9LLKgrJ4s0h20ElcBmsntzZbI99LfboU,28462 +pyOpenRPA/Orchestrator/ServerSettings.py,sha256=TZMoxB090UkNOCQ3ve0KBcrdM7YH6LTFz3ErVU42wTQ,28499 +pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=p7J8xXSN6xdyMTd-OrkTu7JQGLn6t7tJpPp2CPybA-w,19955 +pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 +pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681 +pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Orchestrator/Utils/__pycache__/LoggerHandlerDumpLogList.cpython-37.pyc,, +pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/Web/Basic.py,sha256=UUiV3Rp__i8EVADK-SvIhlVmLzOzW4gpCq1eBpqU4cA,6482 +pyOpenRPA/Orchestrator/Web/Index.js,sha256=DtvpHDBT3_XvJpdKUREpGT1NR3lKdBs9ER4HPvlfwhE,39036 +pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=a4N_reLA6_Zb2KXiL73a7cWtJwO0W0Dr5lZ-RpUwuI0,16428 +pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,, +pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 +pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=QSbaJT1U5L3UE_yNBsPzqJfwdy6Xycb8Tvf6r8OUbSQ,90464 +pyOpenRPA/Orchestrator/__init__.py,sha256=f1RFDzOkL3IVorCtqogjGdXYPtHH-P-y-5CqT7PGy7A,183 +pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273 +pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/ControlPanel.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/Core.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/Processor.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/ProcessorOld.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/Server.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/ServerSettings.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/SettingsTemplate.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/Timer.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/__Orchestrator__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Orchestrator/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293 +pyOpenRPA/Resources/Web/Google/LatoItalic.css,sha256=pB6OZ6F2VsaqkL-g5hW-wE_T0m9H_NltzmzjX-XAKDk,3112 +pyOpenRPA/Resources/Web/Handlebars/handlebars-v4.1.2.js,sha256=h6O4BrhyPtJspLDEQwogC53uHFRozuBpxvN2S4tJHE8,171994 +pyOpenRPA/Resources/Web/JsRender/jsrender.min.js,sha256=00hs6PwCiAfN_gatFdLofj3yBf8ue5Z7jCXX_th2FFg,25927 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/.versions,sha256=gGkuqPk07gAhjnNJVjVR_BA4SSBzqazbY8eEpddH01U,72 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/LICENSE,sha256=ifWbZZ0piwisfkIil1gacnBMxNnAHa7yCn1etItX1Y4,1102 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/README.md,sha256=oITQ5k-7jxoYAAQpzAXFROqgcnGzPrTd7GqkZSGqKW8,448 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.css,sha256=UC6U37i_pXBVMlUmFMLi1S8FIhFycJjAePP-hRGKzQM,8971 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.js,sha256=6cCQ6FlT1bM_QA4OpA_vfMljasKU1foGszlAIyhWi3A,20790 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.min.css,sha256=u9_5Zru9uMTtrXZpdfLawT_kJ5LFcmrMFr1QWXfDqwA,6955 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/accordion.min.js,sha256=kt0Dfi-mrxAU-iYsfDrkROHrb55Hi0lVWC7MT46_xnU,7100 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/ad.css,sha256=CiW55EUiruW1Tp0jrz2yDvQ8jYxDVMDmVcROV5_eBzo,4176 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/ad.min.css,sha256=7D7QYK0TBRyE4dN3SYXD_owb0j8UXywfPKzab2e743I,2066 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/api.js,sha256=Vjx6JZpe0iVJ6t8gp3TO3UjIyZkNBPN-taCS8MWwvJI,40952 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/api.min.js,sha256=und4HgOg2CxzBcqdJOvcT9LfJx0Hf9xQmEO_u7r1Ync,14594 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/breadcrumb.css,sha256=SJD_Mmi9BUmGXVhCXlIM1ei93yJVreQx0FAT68_t01w,2166 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/breadcrumb.min.css,sha256=-40OBPSbvydFFq9P3XPydeyWOrsh8g600mK9HXNoLnI,1192 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/button.css,sha256=wdCjDbx3M-jkpA7whQetZvX3ZE7wyBwRlCbcTVXKobc,116361 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/button.min.css,sha256=37bmMDGVPsjpcyAe7GqWsqv3UpsPTvlE5AiCVtT5NxY,90207 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/card.css,sha256=0oHZ2Qh74uybsgxLhP2ag_kQGTyOx3Kbzsjs6LvARzI,25330 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/card.min.css,sha256=anR2MHuWyx-iEc6wsI5nBMWnboFRqvOT7r-KOrKK-BQ,17410 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.css,sha256=5u4dyQfH-wpdFbakv5CV4uIhWbBb2Tge0ZC5-tA2dX8,17473 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.js,sha256=s-cRpbhGBxHgpnZdU3yFZciSW4n1QuruHjkX6gCyqT0,26912 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.min.css,sha256=cy6WFzeIQ_5hHE7LEFxAK8yfR_zdfjoEubGRy1wCLv4,12727 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/checkbox.min.js,sha256=mlvPY4Gm-w6mgnAZ2GVMiBo5UDU7x_vaxKA5VRxdjR4,11369 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/colorize.js,sha256=imQdcIH6qpozSWEYeIpilPOfKHOJbD6V9RuKOC7yyEE,8710 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/colorize.min.js,sha256=oUDFJRLSaINMaJIZmuzYttfcMgkb7I6CpuEJ6bMfAVI,3270 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/comment.css,sha256=WAotERTFZQyxKNDJiSLlreq5KVja4xNM_bXUeG7NyVQ,5120 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/comment.min.css,sha256=JYlEkH8IupEqfItr2N9WZaNYkyF6rX2bnP6Y8ktXdCU,2945 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/container.css,sha256=bzDnWjcw404DoiHuz6-3iMRmbzJePDPgUGHcx3nFAuU,3099 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/container.min.css,sha256=VizQkNfO7_OANkM37_7xKxHQPEcUTBRuj3R_xkaULO8,1925 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.css,sha256=xKjQ9JWKG6zlrjyB5zECQc5vLZ7uCg7S5X-aUNKh6b8,5559 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.js,sha256=TuB9IPn4wx2n47nRVYf9CKvLotDL9d7gQcNArXupiRU,22303 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.min.css,sha256=-MBET9URQztSrMHpKaB8oyTckkm-lXisQbuxqd2UyOk,3517 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dimmer.min.js,sha256=4jCyaIQIKQX4zzzvspDqEvUmsPnpkr5lFuDOvKR_Wbo,8071 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/divider.css,sha256=a_0UrPhzoGJZZd8PBDgc5C0utGbzM6hjZbkDyy4pzfw,8034 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/divider.min.css,sha256=2XcokR56EPJZJh0ofnGgp-QPx2VpHYzDcdZdtR08uBs,6097 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.css,sha256=rJfAK26TU_FrVEYQxX1iWS4Z91SORlfnM128BfpI1II,37420 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.js,sha256=KnpOJhLPr4nCvh6M4qxqs8Y8lPGNZgLK6jZcGWrYzHo,145962 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.min.css,sha256=7Lwg8bz5Df_7YZ6D-ywoa01hT3IkqC09ZKBKtGe6gow,25679 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/dropdown.min.js,sha256=uEocYy6a0MpPLLHtYV7QAGdOeMRwE0Am2WtnOg_hBfM,50895 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.css,sha256=19QhoCUbplkH_W5a7ejlpO6PoqSEFVA1xdHvaZp98yw,3169 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.js,sha256=O3znHvAxO5xYlwzn4y3lQDde_iTdy29iUAmPqNfg4-0,20926 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.min.css,sha256=SHH3TOGQhg1d5mrYCZeko1qvN3_NoETWQzBmfGUOpjc,1836 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/embed.min.js,sha256=QN4vIzPRpT4BFVPyA702nPG8nZKWfM-HygoF9jPBDJA,7728 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/feed.css,sha256=aFj6fLvIPQfeRxyKu_TlLKeUcwmI5GwOR7pY1Lb0JKM,5845 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/feed.min.css,sha256=-l8OBrtbhQi-fhQLHwA0cut_JWOuRWc44I0KpPxUx_M,3590 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/flag.css,sha256=rvyaZDdUGBPNuvOE8lzpW-Z4q3LYkJi8T99JlN1aF3E,22423 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/flag.min.css,sha256=WX74cISnDHD9kiyzCAiXiUWfnmv6cwdmBXgXtA5TUuw,18577 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.css,sha256=oNyqIev2BGrxigiMt72unbkne8-OWJ6UtaUGM4XZ9Y4,29092 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.js,sha256=FCxhpdJMgA6H88ka82b0jcqg-a8S53T0sVVbS_chLPA,57618 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.min.css,sha256=BmOkPn-zjy4WbHvcIvm18Vq0nhJjwADEBxvsLqX0sXg,21568 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/form.min.js,sha256=fK_KHBgbjblWL2-hRtohUzj6b12XWi6pVujkG1Ru9-w,20458 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/grid.css,sha256=I35Jh57rWCJoLMuJYXksccmBzc6V1XC1Mi_na_oAp84,73036 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/grid.min.css,sha256=5iW6X6_QT_7PgFBce4OTfLOOaSoovOoOb2U8w1yZDtc,57335 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/header.css,sha256=32EgHb7XmTT_AWH7Nr08PjXP2op-xhwlSqSIThcZKmY,13499 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/header.min.css,sha256=hHgAxfAsLFDPcyU6T6cRE_M6R-4rKEfPX5kOHVyJNes,8872 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/icon.css,sha256=CHLhcJDvnks69dz2lyZC0idfGnPFx4qdKA82Hm_bEDo,86945 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/icon.min.css,sha256=4opKQbtTAtsuIkfkEMuIA3eD3T4m1X3mfiCVTS6x2_A,67019 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/image.css,sha256=eZLe0mOsWAJETFvjXHlZXAnSY87SGQlRDJna2_EZ67U,5676 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/image.min.css,sha256=eXzqGHi6p4yiYGCiYPOcGXYbKeQtA0Df_w0gN88KCD0,3727 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/input.css,sha256=lYFTBK5TuWVaB2LSwjdl83iM9l4rn7jPwoFcEfvHQR8,12699 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/input.min.css,sha256=4ouF0Y10UKjiT6iJlHxD5aOe8WljYoAxPqpiy7iEdSw,8692 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/item.css,sha256=O1HR21E9wHtGxCmsqxcEc_65R6Ln3mOvImRwYMQso1g,9753 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/item.min.css,sha256=JRycvfshgviiiwTeAKUj0iPOov4-Uwaue3fTqaY_e5s,5985 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/label.css,sha256=9tLlAtf1Y3NSngCdO1DZ5YcRW_bu2dUKYUAXHPXm2hQ,28382 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/label.min.css,sha256=lzompqItwR2t_PJowmd07tg8QUPAb6yj58N9TwuNS6I,20005 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/list.css,sha256=CI9lvTBhVzN64aRNjJIwhG6bhKydfIbk_RdYQiaAYwE,22486 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/list.min.css,sha256=uXVJMLBcGUe7MZETm-CQO5LMhIbTFxajYZRBFTCTftY,16094 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/loader.css,sha256=Yz3gBB1JS-86XzSzztcNLE24ViO7UnP15A4M4hrFZUY,7128 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/loader.min.css,sha256=XtALKS7EZswkHXCCOthbxsuu36_tpZbqh-LMT1gaRAg,4702 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/menu.css,sha256=aOYMc10qx8D7fVQ7R83XXUkbrrFExpWkWc6ZnECfOJ4,45279 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/menu.min.css,sha256=cRSLOaiPiyfTQ4B4HT1OCF_2CWNzGcPO9Nns6Jrf4hg,31506 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/message.css,sha256=baLR2EbwIWTGTSvNc9qb2FmcWBeZHM3W0kBNvEdxZZU,12466 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/message.min.css,sha256=_plszMa027XkVjjehCTWxgIAftsTT1alP5I6EYfoVMI,8354 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.css,sha256=86mR_k66q9mOP7jwLV6J4iRW1a06eSyQ6tcoZpUlHf8,12800 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.js,sha256=ACX5Za25KIugyXD7eFndkqa18n7LHjZrBkWSpLs8uqQ,33442 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.min.css,sha256=2GGe09HtCS6k__kprnoTwPMNu2CFCjEpaLQ2NBMLua8,8012 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/modal.min.js,sha256=8POmd6680Gev-MdgKbVOHP-9lm-9WB1AVyuLf2WRcxc,12701 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.css,sha256=3Pz6rq1vWHNvB7UHhGFMPYvrP7VZP_pTM4PlwthnviI,2727 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.js,sha256=KuXGvpOopM0i7syRO2cLSXrJ5I7AjwW3m7JMJLfGuN4,15553 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.min.css,sha256=ohX1Du58QE8pgiBVEzmlhuT2rERTdxY4sasod_53NV4,1483 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/nag.min.js,sha256=UN_1Vcu3C_zxEatS7UZKw1x2blSyihZT2F1cmq7UZOk,5696 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/placeholder.css,sha256=ihZF0mK6texbUk_qWnqHqoZ0scXyDhHy-tr77Wougwg,5938 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/placeholder.min.css,sha256=UIFHVCJ1agMPhpUv-aqm6GeN3EmqUv5vClMm_5LEpuM,4452 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.css,sha256=EitCUPKebavrCN6zwsWGZKfKCNjRJhaEGf6dJlCim7g,17407 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.js,sha256=kzErFmfWsOMKZH-mbyLXQpJo_ajderu7pnq_faA7teM,52273 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.min.css,sha256=YlUBHRAaq5FwMcI2g3DQtgcmxmRNG1rEZaGK2LCgVZ0,12032 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/popup.min.js,sha256=VvJYDjsOSD6VaYYZhuQYiPOpBbpRnmaddxVd6shZ9mU,18630 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.css,sha256=p2R5CYj1cVgj0mT7XTBcKKky02140m4A-PumSFirAqc,10669 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.js,sha256=uAQsAqW_DWnH0hK5dC0MVBBwuDyyu8UNolLxO0OSCfs,31204 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.min.css,sha256=JtEqDPto1ZJiE-6k_WoZnzlhFUgwLJqH6VowDWGRez4,7422 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/progress.min.js,sha256=B676J_Jywi6IJ9e_E62nmk7Gn9KDkRQc7RfcIBKPQcI,12331 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rail.css,sha256=XUZeNKRfoqs2bRnKz49lJU8ufQ625eFrtL7IxXLzBD0,2646 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rail.min.css,sha256=4rrNcI5NVX845Bc9aBTWjwjg7tnakWuMHl8zWK-ucmE,1453 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.css,sha256=E_jbykfZK88UZ6kKhL0T8mqn29mzefpwNzCDZEkIyKE,20696 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.js,sha256=rxHeOv-TB5-ViM9hOfODUZMGqWUMNyPvIVIov306LuQ,14869 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.min.css,sha256=4coaKkBwUtNfJL53qHC_TzTE7BmLMuVxDu_Z3gGOs7Q,18393 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/rating.min.js,sha256=jprk9qns6QqU1UWGtHMwug9A_ls7tVMV8p2mueJlj74,5354 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reset.css,sha256=ygW8luaW-MLjYb6fFQYl0HBo4w-P9zwYkVZLpFOMFh0,9123 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reset.min.css,sha256=Cm0OrnD_mnGgt3DPmGhhNLeNUAfYfQlCX2uCK7TG_o8,2822 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reveal.css,sha256=33mQj7j0sprB4_0PrBqMJXxyXXFs4eP2rKoraaht8e8,8177 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/reveal.min.css,sha256=cHuyo1zDTWJH9C1f1GPtKHwuTzA_IUSFAfTH3q5yoME,5784 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.css,sha256=XN5UApUr9lkI_R-ThVSHhNM3UEMEvl8Z6LAYhFABPKw,10377 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.js,sha256=bm3TK1__R62sMnnTL_haoNAZiWbua0IGEgwfdQRpuRo,51211 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.min.css,sha256=HONcBrv7-3sDkmJ9Zwh8KYXWyy_fUw_MjDjhNMtU7hU,6891 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/search.min.js,sha256=gkqnhj5TvM_vwvHKAb4zBC7uL6mndcAlK6CEv5iEUwg,17622 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/segment.css,sha256=FERuSI78q9zgv_iWxHnXIbSnJDsgNKaLh8IgThCD9OM,20063 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/segment.min.css,sha256=zLmNnl__Po9TAZWlayMZpH_DpZXhaHXTcSa8KGeRxMs,13763 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.css,sha256=5sbfPkJ2vSJEo7Ht21qKtfupKDnPdYtwpxkszIHwqsY,3865 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.js,sha256=6D_QO1uZyRzcGRxxaCGP4zRTcnHH-rF11XSDj8fsVn0,29873 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.min.css,sha256=7KDwgqAZXncDCzulBQT3C9UcI_kopiPdoSF2NxpJQWE,2521 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/shape.min.js,sha256=Njt3jnaL2VeRaG0rRHt2niY7YXHeD4Z_fj17tN2syLU,10803 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.css,sha256=pboKxonzco97CJSpXvUG9Bj65PyqdlTlmi8C_XNQcJI,15757 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.js,sha256=-nippst3RqSK6cFS0b1VQIhhZ7x455Oq5vpvjxdFOhc,34488 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.min.css,sha256=FxNmgO-xW6HZ8kqkaDpzZG2GGTYYvBIkhHFsPPUx8f8,10726 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sidebar.min.js,sha256=LxCRzL8rRPXulWQPWkMgncUHL0hBU4IHsuNOVzIMi3I,13466 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.css,sha256=tpW_cbiDbTbWVk1ECO4bnddYLlytmUgArSW1Jx3x9DU,3918 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.js,sha256=-yF4ejA2WwzIujQ1y9b-i6dxpRYCE8lCSU76CQ9hZhw,14604 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.min.css,sha256=AYTFsBcTjn7JH9tBf1s3S68Fxr83IHQf5t5FpD0vGcw,2452 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/site.min.js,sha256=f-45BTFplAj5X_I64VjaIAqTulT6dVhF-rHvOG8pZpM,6066 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/state.js,sha256=rdhOQ83U-t08-IE-ZL7qwiJ_2NPtm0E--BfFJVRylSY,21498 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/state.min.js,sha256=sgXcJIgGI3ymppa7VewFhV3g4rnB_D55Yvoo-QX4Whw,7804 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/statistic.css,sha256=zC6fj8Mg8giRj0rcaq1GVcAfmdLfb0QYgBx_B-7bXlE,13221 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/statistic.min.css,sha256=Nbx1qdI_NIb-YBfRIMcmKn-IdY5OmUdd8gNIGgA2TCs,9594 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/step.css,sha256=3dgzVkMcFYJKP_UPk7quva4L7GLD6sln1aroRZlrcw8,23555 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/step.min.css,sha256=hifahh65UcRx9Cux-rpwi5pTJImD83BlfH1qbkiaWCI,19188 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.css,sha256=eOSA5O3_qugssoDgdTovRNvNMe0kEWqQz1yQGJFZCQM,1288 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.js,sha256=kHIMXTF2Wj8DYTaDRRqQ9ZVNUTOjDbBF84Dwm4tFYaM,31814 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.min.css,sha256=SYOFZjW67UWxBsrtAfD4g0Tvf6CnltYw_IN0VemK2hU,607 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/sticky.min.js,sha256=fu91ThJa6qnZoQAGTpxUw5Q1UN7d2Y_KHS0kjoteWCw,11854 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.css,sha256=aX-PA0rhwxK3q6l3A3przKBvFAQ9LkhlDV3mETbQR98,1865 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.js,sha256=xvNcoJnirQ1TJgVMy_8_AARTIveekx3bgoXNLc-FhC0,33771 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.min.css,sha256=vTnhMR4q6W1dLyB3QYdtwRWnl2XLdtFA0I3kSnZH_EY,1075 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/tab.min.js,sha256=MgUTbr8RHTNylv3wIeBmCec-mS1iL9IJW7Y0NahYmrs,11487 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/table.css,sha256=omOnJC5bkklgjC6vJgTYJae-wbp3MSIu-mUM0gc5Q-o,25536 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/table.min.css,sha256=ODiMJS5bcTBrVMu-BtZytuSNpu3wHtILDb8no5BLNhw,18015 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.css,sha256=XMKp0LQFx2Ec2oOjFuAPJik8VrDUgysP4TNOJH3Rzuw,49176 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.js,sha256=sccxnC8Z9hx9lzlJLPYQ9E5FHETVYEVaA1uIQaA7ubU,36076 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.min.css,sha256=cty1gaoozlRlEnqcQir7t93a7sOy2uCLp0c4jyBLWwA,33525 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/transition.min.js,sha256=k30cmb6hiQ_LGKpX2AcllUduUJ0kA4DKKStgUxkGQzM,13010 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.css,sha256=R9cpZZmFTZ70NmFVp7XhHOXaoZ3iodK1WlxGrisY7Tw,2346 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.js,sha256=Si_eMYc42BiLyyl4ur4u7K17kyw9biw-eAtbidaQH0c,16252 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.min.css,sha256=0MWKfR7_d_meresYhKG49N4ikgDL9YKvdj4ffNqhti0,1328 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/video.min.js,sha256=f7uHgbRqRCqHKBJm7CB31wMMnTjYHPmYaLi1D2i9QfI,6090 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visibility.js,sha256=p_2kDyoT-GlUY_iLWH8RCRtSl-zunZ1oNx3dJwvyKbA,44180 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visibility.min.js,sha256=Th3QlAMxD5M2RJ9nNOvuxJZCgZIlavx5-51jABKTs2A,16294 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visit.js,sha256=9DsUmsPzmp3XD1pplmIeV5tNIeqEHMml5hcr3omsBJw,16142 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/components/visit.min.js,sha256=bT8zWI7mcAwX-Fyt67gogo3u_IT7q8uimamY5Vhk3eU,5887 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.js,sha256=BHq6qGCSMdDXDGJxZ4zxnKaREbFM2un2VqCkydrBTf0,774 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.json,sha256=Sy3ZVA4SxFzecOO88h1IVAnBiuDpRtXiUg6ME_YArI0,524 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.css,sha256=aje_ma2N_7VT1k2QTOLeqr3SfQ3Cr-7vB05D2-uo-YQ,869203 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.js,sha256=t-thIOFbQol3-vcB3C7kRbS49jG2_LC5dEp7NLxBpuA,759089 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css,sha256=f5Dpq5VRrbzn8POovxN9HR3S7LhHQIAiCKYz4PB4ZZA,628934 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.js,sha256=69cT25pJVUmAyniwWMglXlEOEeZYuhmD8Hbj58gCS7Y,275740 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.eot,sha256=0CPFX94iBJXxOoe3KZXg35jI0ok1dymdGZ2lu_W0_gI,98640 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.svg,sha256=IcTTApw6luFW48z0iPvWxbD_LpBQYBaIN5LGFInrfpU,508636 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.ttf,sha256=QuNp3Iw3KXO6d6gmti0seiBwUyMT34MqIyiN23aXQVg,98404 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.woff,sha256=n6_Ww-e_wUXbQqkG5fpo_mpvlyIfAT0-gz_DIxuZLEQ,63728 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/brand-icons.woff2,sha256=59TVNAu-V6Adj3mSFC4nY9Q41Xg4kMdnSDBu6_oFamk,54488 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.eot,sha256=i04bhH4iIz1PRn00-u_nvL_rzm-pu77lYMRc2JSGh1E,106004 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.otf,sha256=vcXQufOXvoPohsdLAUHRlUqkOEs1nc5JgpmUxKLh978,93888 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.svg,sha256=GzY2PC_CxigjA7ao5Pm45c8-mD38cSHKeoiagKC-kA4,392355 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.ttf,sha256=y3-B9UL1xBiju7mtP5--eEFR0TsEzsUOzt7GATMko9o,105784 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff,sha256=lbakhA-HEeyrQnvCNuuGCY235ceCuvsTnIwwgFql_-E,50524 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2,sha256=Q0RmtZVFqKHKxt2zgZfNxrNZlamMPzgS-4jWGxwwDdM,40148 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.eot,sha256=RTf6BjQO5iwmTp16TYqryrPee9osXMM0AQ9GtoMQb8s,31156 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.svg,sha256=T4_RcS28l2Pa57YNTH3ryg_433tFrdN6pDBt0iGL1zE,107567 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.ttf,sha256=Zxchcur85FY3JeZhBD1duFS4Z2ip6L05dY2-gcR5aTU,30928 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.woff,sha256=S8NZwnBXs-0LrKZtbFNJpdSmBQlvvHh1Bhui2Ro9bQU,14712 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outline-icons.woff2,sha256=TSiDRDsk5CRSf2oKeqKJez33HyOdtANzxP92DkgUeAE,12240 +pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/images/flags.png,sha256=lNXH8WYTAcSm3Ekdct1VmgYgzZF6gm8N8bAju5bqnd0,28123 +pyOpenRPA/Resources/Web/jQuery/jquery-3.1.1.min.js,sha256=HPMOWdIdSuVgr3FD9ZE-_MgiK8qk_MdQjrgCtfqp6U4,86713 +pyOpenRPA/Resources/Web/pyOpenRPA_logo.png,sha256=7rulXo_C57xJQEaYWmAkChxXb6xbDW2zq-werzVbDbc,4899 +pyOpenRPA/Robot/Clipboard.py,sha256=q76X8L21zJwcwdoJJNPeCEwAV30xS6ylHP1WwvtxoWI,722 +pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445 +pyOpenRPA/Robot/README.md,sha256=e2hKh7Tx6DAsX6jY_hBDhguL1L2Wiv6iugDB5otMzIA,2293 +pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453 +pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878 +pyOpenRPA/Robot/UIDesktop.py,sha256=wjBDHb9q-kmZoDCV3ai1bLBqR_EVVY88jeDNHFxmF8g,82804 +pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890 +pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=WlKL-DklGaoTnchtapOTM_ydxSB4yOeo9lcG3zr2VME,4524 +pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039 +pyOpenRPA/Robot/Utils/TimerRepeat.py,sha256=_kTct3X9SIEvS3DKM5bGNnjRBVJasmMFZntQaVbPX_E,961 +pyOpenRPA/Robot/Utils/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777 +pyOpenRPA/Robot/Utils/__init__.py,sha256=pHlSQGRFKmn5RCTHIf-3a2ooA9T2xNOWridckynP7W4,28 +pyOpenRPA/Robot/Utils/__pycache__/JSONNormalize.cpython-37.pyc,, +pyOpenRPA/Robot/Utils/__pycache__/ProcessBitness.cpython-37.pyc,, +pyOpenRPA/Robot/Utils/__pycache__/ProcessCommunicator.cpython-37.pyc,, +pyOpenRPA/Robot/Utils/__pycache__/TimerRepeat.cpython-37.pyc,, +pyOpenRPA/Robot/Utils/__pycache__/ValueVerify.cpython-37.pyc,, +pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431 +pyOpenRPA/Robot/__init__.py,sha256=L-5tPm6evytGWOzlqIq-2oiIhmQnruaxwIstyyaMkVI,253 +pyOpenRPA/Robot/__main__.py,sha256=l6II8JuXCsnVOcfs6-2jvogKYTVhbfj3Jl2ld3OIP7s,1992 +pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/OrchestratorConnector.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/SettingsTemplate.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/Test.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/UIDesktop.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/Window.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Robot/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Studio/JSONNormalize.py,sha256=g0Z8G2wojCgTAdZtyRiCfe0_FHSeAi72Va7R7mk27gg,3347 +pyOpenRPA/Studio/ProcessCommunicator.py,sha256=HD3XASJae31_HV3OznFe8E2MgZFXnwt7YveVN82M8nU,7912 +pyOpenRPA/Studio/RobotConnector.py,sha256=CYO0dQoqfs44SYD_VZ_TJh3WFu_DXigHBLHj4GJ2Icc,5038 +pyOpenRPA/Studio/Studio.py,sha256=_BXQjAMHew2fRWloXdqPOmYHX6i6C8ELPsW1TZNvjz4,8618 +pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777 +pyOpenRPA/Studio/Web/Index.xhtml,sha256=wo3Y5CzWJQYMw9AgNHXynt1yGDLIoihRlt1weFLSuYQ,48240 +pyOpenRPA/Studio/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 +pyOpenRPA/Studio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Studio/__main__.py,sha256=_57Rnq9DKbmmlpGFqIwVrWn_LRcU8jjmMTOny4_zlP8,308 +pyOpenRPA/Studio/__pycache__/JSONNormalize.cpython-37.pyc,, +pyOpenRPA/Studio/__pycache__/ProcessCommunicator.cpython-37.pyc,, +pyOpenRPA/Studio/__pycache__/RobotConnector.cpython-37.pyc,, +pyOpenRPA/Studio/__pycache__/Studio.cpython-37.pyc,, +pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,, +pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343 +pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473 +pyOpenRPA/Tools/RobotDB/RobotDB.py,sha256=qtGu8PS2atd0L8taCNpk-08Qpxp8Qz1lqwAcBkyLFLM,1655 +pyOpenRPA/Tools/RobotDB/Server.py,sha256=rjW9Sg-j9P8pFQD66Uih-rke6-f6sCulinwi4_W-3mc,19933 +pyOpenRPA/Tools/RobotDB/ServerSettings.py,sha256=5p9JwrpKHh68oVHIWazTajB6AOfzeapARbvGcJOFmNc,7406 +pyOpenRPA/Tools/RobotDB/__init__.py,sha256=qVH8fEPgXk54rmy-ol0PnT8GF5OlGE0a8mExwJ4tFqY,124 +pyOpenRPA/Tools/RobotDB/__main__.py,sha256=w9sXIF4r_PeWJjHJutTuH8DSYpXxpgcAN0KUOjiJ6PI,140 +pyOpenRPA/Tools/RobotDB/__pycache__/ExcelCom.cpython-37.pyc,, +pyOpenRPA/Tools/RobotDB/__pycache__/RobotDB.cpython-37.pyc,, +pyOpenRPA/Tools/RobotDB/__pycache__/Server.cpython-37.pyc,, +pyOpenRPA/Tools/RobotDB/__pycache__/ServerSettings.cpython-37.pyc,, +pyOpenRPA/Tools/RobotDB/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Tools/RobotDB/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Tools/RobotScreenActive/ConsoleStart.bat,sha256=_HNadUKHOYI5y6foG3srh8wjSzhX33xaKNylFtDjOJk,114 +pyOpenRPA/Tools/RobotScreenActive/Monitor.py,sha256=TV-YisVqa_uGiyJLG9oK4u-5aDjGiFYZFh1dPjOgYc8,492 +pyOpenRPA/Tools/RobotScreenActive/Screen.py,sha256=VnYcvCVymrD35l2J4ln_tlVn7CilZhxE4Ggw9P-OhIw,606 +pyOpenRPA/Tools/RobotScreenActive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Tools/RobotScreenActive/__main__.py,sha256=JASxDDVKWUU7DAbDkRrGTrPk-P7LZchTZFh8usp6b4U,593 +pyOpenRPA/Tools/RobotScreenActive/__pycache__/Monitor.cpython-37.pyc,, +pyOpenRPA/Tools/RobotScreenActive/__pycache__/Screen.cpython-37.pyc,, +pyOpenRPA/Tools/RobotScreenActive/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Tools/RobotScreenActive/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Tools/SafeSource/Crypter.py,sha256=VRrE5-oQxQtvMEPHM1lMXp2CKnceNBmIWJnsJoJkaVE,3616 +pyOpenRPA/Tools/SafeSource/DistrCreate.py,sha256=-_8BTle57LBKVknnB_3af-LghxrRmRGfRNu08CLNIvY,3232 +pyOpenRPA/Tools/SafeSource/DistrRun.py,sha256=zwUh6Jy-rDAZHV6fcTUMupkukojntFMroHJHMsNQgrE,9637 +pyOpenRPA/Tools/SafeSource/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Tools/SafeSource/__main__.py,sha256=g5aYWnuUZoM2jDX2mSIl9tRAJg05tu5VxD2rGJWcACg,649 +pyOpenRPA/Tools/SafeSource/__pycache__/Crypter.cpython-37.pyc,, +pyOpenRPA/Tools/SafeSource/__pycache__/DistrCreate.cpython-37.pyc,, +pyOpenRPA/Tools/SafeSource/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Tools/SafeSource/__pycache__/__main__.cpython-37.pyc,, +pyOpenRPA/Tools/Terminator.py,sha256=VcjX3gFXiCGu3MMCidhrTNsmC9wsAqfjRJdTSU9fLnU,2178 +pyOpenRPA/Tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA/Tools/__pycache__/Terminator.cpython-37.pyc,, +pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/__init__.py,sha256=iosI4OeOIbrI3Van5znqBmnHjqynRxn8OXqujhKpiKY,174 +pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/test.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/REQUESTED b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/WHEEL new file mode 100644 index 00000000..e499438d --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/top_level.txt new file mode 100644 index 00000000..4170df85 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +pyOpenRPA diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py new file mode 100644 index 00000000..c01209ae --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/A2O.py @@ -0,0 +1,27 @@ +import requests, time +# A2O - Data flow Agent to Orchestrator + +# f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O" +# Request BODY: +# { "HostNameUpperStr": "", "UserUpperStr": "", "LogList":[]} +# Response BODY: +# {} + +# Send logs to orchestrator +def _A2ODataSend(inGSettings, inDataDict): + lL = inGSettings["Logger"] + # Send request to the orchestrator server + try: + lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http" + lHostStr = inGSettings["OrchestratorDict"]["HostStr"] + lPortInt = inGSettings["OrchestratorDict"]["PortInt"] + lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O" + lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict) + except Exception as e: + if lL: lL.exception(f"A2O Error handler.") + + +# Send some logs to orchestrator +def LogListSend(inGSettings, inLogList): + lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"], "LogList": inLogList} + _A2ODataSend(inGSettings=inGSettings, inDataDict=lDataDict) \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py new file mode 100644 index 00000000..082d7827 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/O2A.py @@ -0,0 +1,41 @@ +import requests, time +# O2A - Data flow Orchestrator to Agent + +# f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A" +# Request BODY: +# { "HostNameUpperStr": "", "UserUpperStr": "" } +# Response BODY: +# QUEUE ITEM +# # { +# # "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) +# # "ArgList":[1,2,3], # Args list +# # "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary +# # "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList) +# # "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) +# # }, + +def O2A_Loop(inGSettings): + lL = inGSettings["Logger"] + while inGSettings["O2ADict"]["IsOnlineBool"]: + # Send request to the orchestrator server + try: + lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http" + lHostStr = inGSettings["OrchestratorDict"]["HostStr"] + lPortInt = inGSettings["OrchestratorDict"]["PortInt"] + lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A" + lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"]} + lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict) + if lResponse.status_code != 200: + if lL: lL.warning(f"Agent can not connect to Orchestrator. Below the response from the orchestrator:{lResponse}") + time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) + else: + lQueueItem = lResponse.json() # Try to get JSON + # Append QUEUE item in ProcessorDict > ActivityList + inGSettings["ProcessorDict"]["ActivityList"].append(lQueueItem) + if lL: lL.debug(f"ActivityItem was recieved from orchestrator: {lQueueItem}"); + except Exception as e: + if lL: lL.exception(f"A2O Error handler. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") + time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) + except requests.exceptions.ConnectionError as e: + if lL: lL.error(f"A2O Connection error - orchestrator is not available. Sleep for {inGSettings['A2ODict']['RetryTimeoutSecFloat']} s.") + time.sleep(inGSettings["O2ADict"]["RetryTimeoutSecFloat"]) \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/Processor.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/Processor.py new file mode 100644 index 00000000..302552b2 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/Processor.py @@ -0,0 +1,65 @@ +# 1.2.0 - general processor - contains old orchestrator processor + RDPActive processor +import time, copy, threading +# Run processor synchronious +def ProcessorRunSync(inGSettings): + """ + "ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0 + "ActivityList": [ # List of the activities + # { + # "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + # "ArgList":[1,2,3], # Args list + # "ArgDict":{"ttt":1,"222":2,"dsd":3}, # Args dictionary + # "ArgGSettings": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + # "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + # }, + ], + "AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel + "CheckIntervalSecFloat": 1.0 # Interval for check gSettings in ProcessorDict > ActivityList + "ExecuteBool": True # Flag to execute thread processor + """ + lL = inGSettings["Logger"] # Logger alias + inGSettings["ProcessorDict"]["ThreadIdInt"] = threading.get_ident() # fill Processor thread id + while inGSettings["ProcessorDict"]["ExecuteBool"]: + lActivityList = inGSettings["ProcessorDict"]["ActivityList"] # Alias + if len(lActivityList)>0: + if lL: lL.debug(f'Processor ActivityList len: {len(lActivityList)}') + lActivityItem = inGSettings["ProcessorDict"]["ActivityList"].pop(0) # Extract the first item from processor queue + ActivityListExecute(inGSettings = inGSettings, inActivityList = [lActivityItem]) # execute the activity item + else: + time.sleep(inGSettings["ProcessorDict"]["CheckIntervalSecFloat"]) # Sleep when list is empty + +# Execute ActivityItem list +# return the def result +def ActivityListExecute(inGSettings, inActivityList): + lL = inGSettings["Logger"] # Logger alias + lResultList = [] # init the result list + for lActivityItem in inActivityList: # Iterate throught the activity list + lDef = None # Def variable + if callable(lActivityItem["Def"]): # CHeck if def is callable + lDef = lActivityItem["Def"] # Get the def + else: # Is not callable - check alias + lDef = inGSettings["ProcessorDict"]["AliasDefDict"].get(lActivityItem["Def"], None) # get def if def key in Alias def storage + #gSettings + lGSettingsDictKey = lActivityItem.pop("ArgGSettings",None) + # # Prepare arg dict - gSettings + if type(lGSettingsDictKey) is str: # check if gSetting key is in ArgDict + lActivityItem["ArgDict"][lGSettingsDictKey] = inGSettings # Set the gSettings in dict + # # Prepare arg list + elif type(lGSettingsDictKey) is int: # check if gSetting key is in ArgDict + lActivityItem["ArgList"].insert(lGSettingsDictKey,inGSettings)# Set the gSettings in list by the index + #Logger + lLoggerDictKey = lActivityItem.pop("ArgLogger",None) + # # Prepare arg dict - gSettings + if type(lLoggerDictKey) is str: # check if gSetting key is in ArgDict + lActivityItem["ArgDict"][lLoggerDictKey] = lL # Set the lLogger in dict + # # Prepare arg list + elif type(lLoggerDictKey) is int: # check if gSetting key is in ArgDict + lActivityItem["ArgList"].insert(lLoggerDictKey,lL)# Set the lLogger in list by the index + + try: # try to run function from Processor.py + lActivityItemResult = lDef(*lActivityItem["ArgList"], **lActivityItem["ArgDict"]) + lResultList.append(lActivityItemResult) # return the result + except Exception as e: + if lL: lL.exception(f"Processor.ActivityListExecute: Exception in def execution - activity will be ignored. Activity item: {lActivityItem}") # Logging + lResultList.append(e) # return the generated exception + return lResultList # return the result list \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py new file mode 100644 index 00000000..2f4e670b --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__Agent__.py @@ -0,0 +1,97 @@ +import threading, socket, getpass, sys, uuid, subprocess, base64 +from . import O2A, A2O # Data flow Orchestrator To Agent +from . import Processor # Processor Queue + +# Create binary file by the base64 string (safe for JSON transmition) +def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None): + """ Create binary file by the base64 string (safe for JSON transmition)""" + lFile = open(inFilePathStr, "wb") + lFile.write(base64.b64decode(inFileDataBase64Str)) + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Binary file {inFilePathStr} has been created." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + +# Create text file by the string +def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): + lFile = open(inFilePathStr, "w", encoding=inEncodingStr) + lFile.write(inFileDataStr) + lFile.close() + lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None + lMessageStr = f"AGENT Text file {inFilePathStr} has been created." + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + +# Send CMD to OS. Result return to log + Orchestrator by the A2O connection +def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None): + lResultStr = "" + # Subdef to listen OS result + def _CMDRunAndListenLogs(inCMDStr, inGSettings = None): + lL = inGSettings.get("Logger",None) if type(inGSettings) is dict else None + lResultStr = "" + lOSCMDKeyStr = str(uuid.uuid4())[0:4].upper() + lCMDProcess = subprocess.Popen(f'cmd /c {inCMDStr}', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + lListenBool = True + lMessageStr = f"{lOSCMDKeyStr}: # # # # AGENT CMD Process has been STARTED # # # # " + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings,inLogList=[lMessageStr]) + lMessageStr = f"{lOSCMDKeyStr}: {inCMDStr}" + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + while lListenBool: + lOutputLineBytes = lCMDProcess.stdout.readline() + if lOutputLineBytes == b"": + lListenBool = False + lStr = lOutputLineBytes.decode('cp866') + if lStr.endswith("\n"): lStr = lStr[:-1] + lMessageStr = f"{lOSCMDKeyStr}: {lStr}" + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + lResultStr+=lStr + lMessageStr = f"{lOSCMDKeyStr}: # # # # AGENT CMD Process has been FINISHED # # # # " + if lL: lL.info(lMessageStr) + A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) + return lResultStr + # New call + if inRunAsyncBool: + lThread = threading.Thread(target=_CMDRunAndListenLogs, kwargs={"inCMDStr":inCMDStr, "inGSettings":inGSettings}) + lThread.start() + lResultStr="ActivityList has been started in async mode - no output is available here." + else: + lResultStr = _CMDRunAndListenLogs(inCMDStr=inCMDStr, inGSettings=inGSettings) + #lCMDCode = "cmd /c " + inCMDStr + #subprocess.Popen(lCMDCode) + #lResultCMDRun = 1 # os.system(lCMDCode) + return lResultStr + + +# Main def +def Agent(inGSettings): + lL = inGSettings["Logger"] + + # Append Orchestrator def to ProcessorDictAlias + lModule = sys.modules[__name__] + lModuleDefList = dir(lModule) + for lItemDefNameStr in lModuleDefList: + # Dont append alias for defs Agent + if lItemDefNameStr not in ["Agent"]: + lItemDef = getattr(lModule,lItemDefNameStr) + if callable(lItemDef): inGSettings["ProcessorDict"]["AliasDefDict"][lItemDefNameStr]=lItemDef + + # Detect Machine host name and username + inGSettings["AgentDict"]["HostNameUpperStr"] = socket.gethostname().upper() + inGSettings["AgentDict"]["UserUpperStr"] = getpass.getuser().upper() + + # Processor thread + lProcessorThread = threading.Thread(target= Processor.ProcessorRunSync, kwargs={"inGSettings":inGSettings}) + lProcessorThread.daemon = True # Run the thread in daemon mode. + lProcessorThread.start() # Start the thread execution. + if lL: lL.info("Processor has been started (ProcessorDict)") #Logging + + # Start thread to wait data from Orchestrator (O2A) + lO2AThread = threading.Thread(target=O2A.O2A_Loop, kwargs={"inGSettings":inGSettings}) + lO2AThread.start() + + # Send log that Agent has been started + A2O.LogListSend(inGSettings=inGSettings, inLogList=[f'Host: {inGSettings["AgentDict"]["HostNameUpperStr"]}, User: {inGSettings["AgentDict"]["UserUpperStr"]}, Agent has been started.']) \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/readme.md b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/readme.md new file mode 100644 index 00000000..9b46cac7 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Agent/readme.md @@ -0,0 +1,2 @@ +# TEST +Hello world \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ControlPanel.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ControlPanel.py new file mode 100644 index 00000000..283b94f5 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ControlPanel.py @@ -0,0 +1,2 @@ +# Defs to use in ControlPanel files to render panels (busines users + technical user manipulations) + diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Core.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Core.py new file mode 100644 index 00000000..bd4136fb --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Core.py @@ -0,0 +1,5 @@ +import threading + +# Check if current execution is in Processor thread +def IsProcessorThread(inGSettings): + return inGSettings["ProcessorDict"]["ThreadIdInt"] == threading.get_ident() \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ProcessorOld.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ProcessorOld.py new file mode 100644 index 00000000..bafc630e --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ProcessorOld.py @@ -0,0 +1,322 @@ +import datetime +import http.client +import json +import os +import sys +import subprocess +import importlib +import psutil +from . import BackwardCompatibility # Use backward compatibility to goes to the new processor +from . import Processor # Use new processor +import copy +#Input arg +# [ +# { +# "Type": , +# host: , +# port: , +# bodyObject: +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "CMDStart", +# "Command": "" +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "OrchestratorRestart" +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "OrchestratorSessionSave" +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "GlobalDictKeyListValueSet", +# "KeyList": ["key1","key2",...], +# "Value": +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "GlobalDictKeyListValueAppend", +# "KeyList": ["key1","key2",...], +# "Value": +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "GlobalDictKeyListValueOperator+", +# "KeyList": ["key1","key2",...], +# "Value": +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type": "GlobalDictKeyListValueGet", +# "KeyList": ["key1","key2",...] +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type":"ProcessStart", +# "Path":"", +# "ArgList":[] +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type":"ProcessStartIfTurnedOff", +# "CheckTaskName":"", #Check if current task name is not active (then start process), +# "Path":"", +# "ArgList":[] +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type":"ProcessStop", +# "Name":"", +# "FlagForce":True, +# "User":"" #Empty - all users, user or %username% +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type":"PythonStart", +# "ModuleName":"", +# "FunctionName":"", +# "ArgList":[], +# "ArgDict":{} +# }, +# -----BELOW IS UPDATED---------------- +# { +# "Type":"WindowsLogon", +# "Domain":"", +# "User":"", +# "Password":"" +# # Return "Result": True - user is logged on, False - user is not logged on +# } +# ] +################################## +#Output result +# with attributes: +# "DateTimeUTCStringStart" +# "DateTimeUTCStringStop" +# "Result" +gSettingsDict = None +def Activity(inActivity): + lItem = copy.deepcopy(inActivity) + global gSettingsDict + # Update 2020.10 - go to the new processor + lActivityNew = BackwardCompatibility.v1_2_0_ProcessorOld2NewActivityDict(inActivityOld=inActivity) + # Append new activity in list + lItem["Result"] = Processor.ActivityListExecute(inGSettings = gSettingsDict, inActivityList = [lActivityNew])[0] + """ + #Глобальная переменная - глобальный словарь унаследованный от Settings.py + lL = gSettingsDict["Logger"] # Alias for logger + #Alias (compatibility) + lItem = inActivity + lCurrentDateTime = datetime.datetime.now() + ########################################################### + #Обработка запроса на отправку команды на удаленную машину + ########################################################### + if lItem["Type"]=="RemoteMachineProcessingRun": + lHTTPConnection = http.client.HTTPConnection(lItem["host"], lItem["port"], timeout=5) + try: + lHTTPConnection.request("POST","/ProcessingRun",json.dumps(lItem["bodyObject"])) + except Exception as e: + #Объединение словарей + lItem["Result"] = {"State":"disconnected","ExceptionString":str(e)} + else: + lHTTPResponse=lHTTPConnection.getresponse() + lHTTPResponseByteArray=lHTTPResponse.read() + lItem["Result"] = json.loads(lHTTPResponseByteArray.decode('utf8')) + ########################################################### + #Обработка команды CMDStart + ########################################################### + if lItem["Type"]=="CMDStart": + lCMDCode="cmd /c "+lItem["Command"] + subprocess.Popen(lCMDCode) + lResultCMDRun=1#os.system(lCMDCode) + lItem["Result"] = str(lResultCMDRun) + ########################################################### + #Обработка команды OrchestratorRestart + ########################################################### + if lItem["Type"]=="OrchestratorRestart": + # Dump RDP List in file json + lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8") + lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file + lFile.close() # Close the file + if lL: lL.info(f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}. Do restart") + # Restart session + os.execl(sys.executable, os.path.abspath(__file__), *sys.argv) + lItem["Result"] = True + sys.exit(0) + ########################################################### + # Обработка команды OrchestratorSessionSave + ########################################################### + if lItem["Type"] == "OrchestratorSessionSave": + # Dump RDP List in file json + lFile = open("_SessionLast_RDPList.json", "w", encoding="utf-8") + lFile.write(json.dumps(gSettingsDict["RobotRDPActive"]["RDPList"])) # dump json to file + lFile.close() # Close the file + if lL: lL.info( + f"Orchestrator has dump the RDP list before the restart. The RDP List is {gSettingsDict['RobotRDPActive']['RDPList']}") + lItem["Result"] = True + ########################################################### + #Обработка команды GlobalDictKeyListValueSet + ########################################################### + if lItem["Type"]=="GlobalDictKeyListValueSet": + lDict = gSettingsDict + for lItem2 in lItem["KeyList"][:-1]: + #Check if key - value exists + if lItem2 in lDict: + pass + else: + lDict[lItem2]={} + lDict=lDict[lItem2] + #Set value + lDict[lItem["KeyList"][-1]]=lItem["Value"] + lItem["Result"] = True + ########################################################### + # Обработка команды GlobalDictKeyListValueAppend + ########################################################### + if lItem["Type"] == "GlobalDictKeyListValueAppend": + lDict = gSettingsDict + for lItem2 in lItem["KeyList"][:-1]: + # Check if key - value exists + if lItem2 in lDict: + pass + else: + lDict[lItem2] = {} + lDict = lDict[lItem2] + # Set value + lDict[lItem["KeyList"][-1]].append(lItem["Value"]) + lItem["Result"] = True + ########################################################### + # Обработка команды GlobalDictKeyListValueOperator+ + ########################################################### + if lItem["Type"] == "GlobalDictKeyListValueOperator+": + lDict = gSettingsDict + for lItem2 in lItem["KeyList"][:-1]: + # Check if key - value exists + if lItem2 in lDict: + pass + else: + lDict[lItem2] = {} + lDict = lDict[lItem2] + # Set value + lDict[lItem["KeyList"][-1]]+=lItem["Value"] + lItem["Result"] = True + ########################################################### + #Обработка команды GlobalDictKeyListValueGet + ########################################################### + if lItem["Type"]=="GlobalDictKeyListValueGet": + lDict = gSettingsDict + for lItem2 in lItem["KeyList"][:-1]: + #Check if key - value exists + if lItem2 in lDict: + pass + else: + lDict[lItem2]={} + lDict=lDict[lItem2] + #Return value + lItem["Result"]=lDict.get(lItem["KeyList"][-1],None) + ##################################### + #ProcessStart + ##################################### + if lItem["Type"]=="ProcessStart": + #Вид активности - запуск процесса + #Запись в массив отработанных активностей + #Запустить процесс + lItemArgs=[lItem["Path"]] + lItemArgs.extend(lItem["ArgList"]) + subprocess.Popen(lItemArgs,shell=True) + ##################################### + #ProcessStartIfTurnedOff + ##################################### + if lItem["Type"]=="ProcessStartIfTurnedOff": + #Check if process running + #remove .exe from Taskname if exists + lCheckTaskName = lItem["CheckTaskName"] + if len(lCheckTaskName)>4: + if lCheckTaskName[-4:].upper() != ".EXE": + lCheckTaskName = lCheckTaskName+".exe" + else: + lCheckTaskName = lCheckTaskName+".exe" + #Check if process exist + if not CheckIfProcessRunning(lCheckTaskName): + #Вид активности - запуск процесса + #Запись в массив отработанных активностей + #Запустить процесс + lItemArgs=[lItem["Path"]] + lItemArgs.extend(lItem["ArgList"]) + subprocess.Popen(lItemArgs,shell=True) + ################################# + #ProcessStop + ################################# + if lItem["Type"]=="ProcessStop": + #Вид активности - остановка процесса + #часовой пояс пока не учитываем + #Сформировать команду на завершение + lActivityCloseCommand='taskkill /im '+lItem["Name"] + #TODO Сделать безопасную обработку,если параметра нет в конфигурации + if lItem.get('FlagForce',False): + lActivityCloseCommand+=" /F" + #Завершить процессы только текущего пользоваиеля + if lItem.get('User',"")!="": + lActivityCloseCommand+=f' /fi "username eq {lItem["User"]}"' + #Завершить процесс + os.system(lActivityCloseCommand) + ################################# + #PythonStart + ################################# + if lItem["Type"]=="PythonStart": + try: + #Подключить модуль для вызова + lModule=importlib.import_module(lItem["ModuleName"]) + #Найти функцию + lFunction=getattr(lModule,lItem["FunctionName"]) + lItem["Result"]=lFunction(*lItem.get("ArgList",[]),**lItem.get("ArgDict",{})) + except Exception as e: + if lL: lL.exception("Loop activity error: module/function not founded") + ################################# + # Windows logon + ################################# + if lItem["Type"] == "WindowsLogon": + import win32security + try: + hUser = win32security.LogonUser( + lItem["User"], + lItem["Domain"], + lItem["Password"], + win32security.LOGON32_LOGON_NETWORK, + win32security.LOGON32_PROVIDER_DEFAULT + ) + except win32security.error: + lItem["Result"] = False + else: + lItem["Result"] = True + ################################### + """ + #Вернуть результат + return lItem + +def ActivityListOrDict(inActivityListOrDict): + #Check arg type (list or dict) + if type(inActivityListOrDict)==list: + #List activity + lResult=[] + for lItem in inActivityListOrDict: + lResult.append(Activity(lItem)) + return lResult + if type(inActivityListOrDict)==dict: + #Dict activity + return Activity(inActivityListOrDict) + +def CheckIfProcessRunning(processName): + ''' + Check if there is any running process that contains the given name processName. + ''' + #Iterate over the all the running process + for proc in psutil.process_iter(): + try: + # Check if process name contains the given name string. + if processName.lower() in proc.name().lower(): + return True + except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): + pass + return False; \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py new file mode 100644 index 00000000..224b383a --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/SettingsTemplate.py @@ -0,0 +1,364 @@ +import os, logging, datetime, sys + +# Technical def - return GSettings structure with examples +def __Create__(): + return { + "VersionStr": None, # Will be filled in orchestrator, + "Autocleaner": { + # Some gurbage is collecting in g settings. So you can configure autocleaner to periodically clear gSettings + "IntervalSecFloat": 3600.0, # Sec float to periodically clear gsettings + }, + "Client": { # Settings about client web orchestrator + "Session": { + # Settings about web session. Session algorythms works only for special requests (URL in ServerSettings) + "LifetimeSecFloat": 600.0, + # Client Session lifetime in seconds. after this time server will forget about this client session + "LifetimeRequestSecFloat": 120.0, # 1 client request lifetime in server in seconds + "ControlPanelRefreshIntervalSecFloat": 1.5, # Interval to refresh control panels for session, + "TechnicalSessionGUIDCache": { # TEchnical cache. Fills when web browser is requesting + # "SessionGUIDStr":{ # Session with some GUID str. On client session guid stored in cookie "SessionGUIDStr" + # "InitDatetime": None, # Datetime when session GUID was created + # "DatasetLast": { + # "ControlPanel": { + # "Data": None, # Struct to check with new iterations. None if starts + # "ReturnBool": False # flag to return, close request and return data as json + # } + # }, + # "ClientRequestHandler": None, # Last client request handler + # "UserADStr": None, # User, who connect. None if user is not exists + # "DomainADStr": None, # Domain of the user who connect. None if user is not exists + # } + }, + }, + # # # # # # Client... # # # # # # # # + "DumpLogListRefreshIntervalSecFloat": 3.0, # Duration between updates for the Client + "DumpLogListCountInt": 100, # Set the max row for the dump + "DumpLogList": [], # Will be filled automatically + "DumpLogListHashStr": None, # Will be filled automatically + # # # # # # # # # # # # # # # # # # + }, + "ServerDict": { + "WorkingDirectoryPathStr": None, # Will be filled automatically + "RequestTimeoutSecFloat": 300, # Time to handle request in seconds + "ListenPort_": "Порт, по которому можно подключиться к демону", + "ListenPort": 80, + "ListenURLList": [ + { + "Description": "Local machine test", + "URL_": "Сетевое расположение сервера демона", + "URL": "" + } + ], + "AccessUsers": { # Default - all URL is blocked + "FlagCredentialsAsk": True, # Turn on Authentication + "RuleDomainUserDict": { + # ("DOMAIN", "USER"): { !!!!! only in upper case !!!! + # "MethodMatchURLBeforeList": [ + # { + # "Method":"GET|POST", + # "MatchType":"BeginWith|Contains|Equal|EqualCase", + # "URL":"", + # "FlagAccessDefRequestGlobalAuthenticate": None, #Return bool + # "FlagAccess": True + # } + # ], + # "ControlPanelKeyAllowedList":[], # If empty - all is allowed + # "RoleHierarchyAllowedDict": { + # "Orchestrator":{ + # "Controls": { + # "RestartOrchestrator": {}, # Feature to restart orchestrator on virtual machine + # "LookMachineScreenshots": {} # Feature to look machina screenshots + # }, + # "RDPActive": { # Robot RDP active module + # "ListRead": {} # Access to read RDP session list + # } + # } + # } + # } + }, + "RuleMethodMatchURLBeforeList": [ # General MethodMatchURL list (no domain/user) + # { + # "Method":"GET|POST", + # "MatchType":"BeginWith|Contains|Equal|EqualCase", + # "URL":"", + # "FlagAccessDefRequestGlobalAuthenticate": None, #Return bool + # "FlagAccess": True + # } + ], + "AuthTokensDict": { + # "":{"User":"", "Domain":"", "TokenDatetime":, "FlagDoNotExpire":True} + } + }, + "URLList": [ # List of available URLs with the orchestrator server + # { + # "Method":"GET|POST", + # "URL": "/index", #URL of the request + # "MatchType": "", #"BeginWith|Contains|Equal|EqualCase", + # "ResponseFilePath": "", #Absolute or relative path + # "ResponseFolderPath": "", #Absolute or relative path + # "ResponseContentType": "", #HTTP Content-type + # "ResponseDefRequestGlobal": None #Function with str result + # } + { + "Method": "GET", + "URL": "/test/", # URL of the request + "MatchType": "BeginWith", # "BeginWith|Contains|Equal|EqualCase", + # "ResponseFilePath": "", #Absolute or relative path + "ResponseFolderPath": "C:\Abs\Archive\scopeSrcUL\OpenRPA\Orchestrator\Settings", + # Absolute or relative path + # "ResponseContentType": "", #HTTP Content-type + # "ResponseDefRequestGlobal": None #Function with str result + } + ], + + }, + "OrchestratorStart": { + "DefSettingsUpdatePathList": [], + # List of the .py files which should be loaded before init the algorythms + "ActivityList": [ + # { + # "Type": "ProcessStop", #Activity type + # "Name": "OpenRPARobotDaemon.exe", #Process name + # "FlagForce": True, #Force process close + # "User": "%username%" #Empty, user or %username% + # }, + # { + # "Type": "ProcessStartIfTurnedOff", #Activity type + # "CheckTaskName": "notepad.exe", #Python function module name + # "Path": "notepad", #Python function name + # "ArgList": [] #Input python function args + # }, + # { + # "Type": "RDPSessionConnect", #Activity type - start/connect RDP Session + # "RDPSessionKeyStr": "notepad.exe", #Python function module name + # "RDPConfigurationDict": {} + # }, + # { + # "Type": "RDPSessionLogoff", #Activity type - logoff RDP Session + # "RDPSessionKeyStr": "notepad.exe", #Python function module name + # }, + # { + # "Type": "RDPSessionDisconnect", #Activity type - disconnect the RDP Session without logoff + # "RDPSessionKeyStr": "notepad.exe", #Python function module name + # }, + # { + # "Type": "RDPSessionFileSend", #Activity type - send file to RDP session + # ... + # }, + # { + # "Type": "RDPSessionFileRecieve", #Activity type - recieve file from rdp session + # ... + # }, + # { + # "Type": "RDPSessionProcessStart", #Activity type - + # ... + # }, + ] + }, + "SchedulerDict": { + "CheckIntervalSecFloat": 5.0, # Check interval in seconds + "ActivityTimeList": [ + # { + # "TimeHH:MMStr": "22:23", # Time [HH:MM] to trigger activity + # "WeekdayList": [0, 1, 2, 3, 4, 5, 6], #List of the weekday index when activity is applicable, Default [0,1,2,3,4,5,6] + # "ActivityList": [ + # { + # "Type": "ProcessStart", # Activity type + # "Path": "start", # Executable file path + # "ArgList": ["cmd.exe", "/c", "PIPUpgrade.cmd"] # List of the arguments + # } + # ], + # "GUID": None # Will be filled in Orchestrator automatically - is needed for detect activity completion + # }, + ], + }, + "ProcessorDict": { # Has been changed. New general processor (one threaded) v.1.2.0 + "ActivityList": [ # List of the activities + # { + # "Def":"DefAliasTest", # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + # "ArgList":[1,2,3], # Args list + # "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary + # "ArgGSettings": # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + # "ArgLogger": None # Name of GSettings attribute: str (ArgDict) or index (for ArgList) + # }, + ], + "AliasDefDict": {}, # Storage for def with Str alias. To use it see pyOpenRPA.Orchestrator.ControlPanel + "CheckIntervalSecFloat": 1.0, # Interval for check gSettings in ProcessorDict > ActivityList + "ExecuteBool": True, # Flag to execute thread processor + "ThreadIdInt": None # Technical field - will be setup when processor init + }, + "ControlPanelDict": { # Old structure > CPDict + "RefreshSeconds": 5, # deprecated parameter + "RobotList": [ + #{ + # "RenderFunction": RenderRobotR01, + # "KeyStr": "TestControlPanelKey" + #} + ] + }, + "CPDict": { + # "CPKey": {"HTMLRenderDef":None, "JSONGeneratorDef":None, "JSInitGeneratorDef":None} + }, + # # # # # # # # # # # # # # + "RobotRDPActive": { + "RDPList": { + # "RDPSessionKey":{ + # "Host": "77.77.22.22", # Host address + # "Port": "3389", # RDP Port + # "Login": "test", # Login + # "Password": "test", # Password + # "Screen": { + # "Width": 1680, # Width of the remote desktop in pixels + # "Height": 1050, # Height of the remote desktop in pixels + # # "640x480" or "1680x1050" or "FullScreen". If Resolution not exists set full screen + # "FlagUseAllMonitors": False, # True or False + # "DepthBit": "32" # "32" or "24" or "16" or "15" + # }, + # "SharedDriveList": ["c"], # List of the Root sesion hard drives + # ###### Will updated in program ############ + # "SessionHex": "", # Hex is created when robot runs + # "SessionIsWindowExistBool": False, # Flag if the RDP window is exist, old name "FlagSessionIsActive". Check every n seconds + # "SessionIsWindowResponsibleBool": False, # Flag if RDP window is responsible (recieve commands). Check every nn seconds. If window is Responsible - window is Exist too + # "SessionIsIgnoredBool": False # Flag to ignore RDP window False - dont ignore, True - ignore + # } + }, + "ResponsibilityCheckIntervalSec": None, + # Seconds interval when Robot check the RDP responsibility. if None - dont check + "FullScreenRDPSessionKeyStr": None, + # RDPSessionKeyStr of the current session which is full screened, None is no session in fullscreen + "ActivityList": [ + # Technical Activity list for RobotRDPActive thread - equal to Main activity list, apply only RDP activity + # { + # "DefNameStr":"test", # Function name in RobotRDPActive.Processor + # "ArgList":[1,2,3], # Args list + # "ArgDict":{"ttt":1,"222":2,"dsd":3} # Args dictionary + # }, + # { + # "DefNameStr": "RDPSessionConnect", # Function name in RobotRDPActive.Processor + # "ArgList": [], # Args list + # "ArgDict": {"inRDPSessionKeyStr": "TestRDP", "inHostStr": "77.44.33.22", "inPortStr": "3389", + # "inLoginStr": "login", "inPasswordStr": "pass"} # Args dictionary + # }, + # { + # "DefNameStr": "RDPSessionDisconnect", # Disconnect the RDP session without logoff. Function name in RobotRDPActive.Processor + # "ArgList": [], # Args list + # "ArgDict": {"inRDPSessionKeyStr": "TestRDP"} + # }, + # { + # "DefNameStr": "RDPSessionReconnect", # Disconnect the RDP session without logoff. Function name in RobotRDPActive.Processor + # "ArgList": [], # Args list + # "ArgDict": {"inRDPSessionKeyStr": "TestRDP"} + # } + ] + }, + # # # # # # # # # # # # # # + "FileManager": { + "FileURLFilePathDict_help": "https://localhost:8081/filemanager/. All FileURL s must be set in lowercase", + "FileURLFilePathDict": { + #"r01/report.xlsx": "C:\\RPA\\R01_IntegrationOrderOut\\Data\\Reestr_otgruzok.xlsx" + } + }, + "Logger": logging.getLogger("Orchestrator"), + "Storage": { + "Robot_R01_help": "Robot data storage in orchestrator env", + "Robot_R01": {}, + "R01_OrchestratorToRobot": {"Test2": "Test2"} + }, + "AgentDict": { # Will be filled when program runs + #("HostNameUpperStr", "UserUpperStr"): { "IsListenBool": True, "QueueList": [] } + } + } + +# Create full configuration for +def __AgentDictItemCreate__(): + return {"IsListenBool":False, "ConnectionCountInt":0, "ConnectionFirstQueueItemCountInt":0, "ActivityList":[]} +# Create full configuration for +def __UACClientAdminCreate__(): + lResultDict = { + "pyOpenRPADict":{ + "CPKeyDict":{ # Empty dict - all access + # "CPKeyStr"{ + # } + }, + "RDPKeyDict":{ # Empty dict - all access + #"RDPKeyStr"{ + # "FullscreenBool": True, + # "IgnoreBool":True, + # "ReconnectBool": True + # "NothingBool": True # USe option if you dont want to give some access to the RDP controls + # } + }, + "AgentKeyDict": { # Empty dict - all access + # "AgentKeyStr"{ + # } + }, + "AdminDict":{ # Empty dict - all access + "LogViewerBool":True, # Show log viewer on the web page + "CMDInputBool":True, # Execute CMD on the server side and result to the logs + "ScreenshotViewerBool":True, # Show button to look screenshots + "RestartOrchestratorBool": True, # Restart orchestrator activity + "RestartOrchestratorGITPullBool": True, # Turn off (RDP remember) orc + git pull + Turn on (rdp remember) + "RestartPCBool": True, # Send CMD to restart pc + "NothingBool":True # USe option if you dont want to give some access to the RDP controls + }, + "ActivityDict": { # Empty dict - all access + "ActivityListExecuteBool": True, # Execute activity at the current thread + "ActivityListAppendProcessorQueueBool": True # Append activity to the processor queue + } + } + + } + return lResultDict + + +# Init the log dump to WEB +# import pdb; pdb.set_trace() +############################################ +def LoggerDumpLogHandlerAdd(inLogger, inGSettingsClientDict): + lL = inLogger + if len(lL.handlers) == 0: + mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + else: + mRobotLoggerFormatter = lL.handlers[0].formatter + mHandlerDumpLogList = LoggerHandlerDumpLogList.LoggerHandlerDumpLogList(inDict=inGSettingsClientDict, + inKeyStr="DumpLogList", inHashKeyStr="DumpLogListHashStr", inRowCountInt=inGSettingsClientDict[ + "DumpLogListCountInt"]) + mHandlerDumpLogList.setFormatter(mRobotLoggerFormatter) + lL.addHandler(mHandlerDumpLogList) + +# inModeStr: +# "BASIC" - create standart configuration +from pyOpenRPA.Orchestrator.Utils import LoggerHandlerDumpLogList +def Create(inModeStr="BASIC"): + if inModeStr=="BASIC": + lResult = __Create__() # Create settings + # Создать файл логирования + # add filemode="w" to overwrite + if not os.path.exists("Reports"): + os.makedirs("Reports") + ########################## + # Подготовка логгера Robot + ######################### + mRobotLogger = lResult["Logger"] + mRobotLogger.setLevel(logging.INFO) + # create the logging file handler + mRobotLoggerFH = logging.FileHandler( + "Reports\\" + datetime.datetime.now().strftime("%Y_%m_%d") + ".log") + mRobotLoggerFormatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + mRobotLoggerFH.setFormatter(mRobotLoggerFormatter) + # add handler to logger object + mRobotLogger.addHandler(mRobotLoggerFH) + ####################Add console output + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(mRobotLoggerFormatter) + mRobotLogger.addHandler(handler) + ############################################ + LoggerDumpLogHandlerAdd(inLogger=mRobotLogger, inGSettingsClientDict=lResult["Client"]) + #mHandlerDumpLogList = LoggerHandlerDumpLogList.LoggerHandlerDumpLogList(inDict=lResult["Client"], + # inKeyStr="DumpLogList", + # inHashKeyStr="DumpLogListHashStr", + # inRowCountInt=lResult["Client"][ + # "DumpLogListCountInt"]) + #mHandlerDumpLogList.setFormatter(mRobotLoggerFormatter) + #mRobotLogger.addHandler(mHandlerDumpLogList) + return lResult # return the result dict \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py new file mode 100644 index 00000000..6b23c67d --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py @@ -0,0 +1,16 @@ +from logging import StreamHandler + +class LoggerHandlerDumpLogList(StreamHandler): + def __init__(self, inDict, inKeyStr, inHashKeyStr, inRowCountInt): + StreamHandler.__init__(self) + self.Dict = inDict + self.KeyStr = inKeyStr + self.HashKeyStr = inHashKeyStr + self.RowCountInt = inRowCountInt + self.Dict[self.HashKeyStr]="0" + def emit(self, inRecord): + inMessageStr = self.format(inRecord) + self.Dict[self.KeyStr].append(inMessageStr) + self.Dict[self.HashKeyStr]=str(int(self.Dict[self.HashKeyStr])+1) + if len(self.Dict[self.KeyStr])>self.RowCountInt: + self.Dict[self.KeyStr].pop(0) \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Utils/__init__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Basic.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Basic.py new file mode 100644 index 00000000..cc39e082 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Basic.py @@ -0,0 +1,122 @@ +import json +from .. import __Orchestrator__ +from .. import Processor +# Escape JS to the safe JS for the inline JS in HTML tags ATTENTION! Use it only if want to paste JS into HTML tag - not in