diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/INSTALLER b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/INSTALLER similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/INSTALLER rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/INSTALLER diff --git a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/METADATA b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/METADATA similarity index 99% rename from Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/METADATA rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/METADATA index bc6bd5d2..51ef28a3 100644 --- a/Resources/WPy64-3720/python-3.7.2.amd64/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/METADATA +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/METADATA @@ -1,13 +1,12 @@ Metadata-Version: 2.1 Name: pyOpenRPA -Version: 1.3.0 +Version: 1.3.1 Summary: The powerful open source RPA platform for business Home-page: https://pyopenrpa.ru/ Author: Ivan Maslov Author-email: Ivan.Maslov@pyopenrpa.ru License: Текст лицензии см. в файле: LICENSE.PDF (в корне) или по адресу: https://pyopenrpa.ru/license/oferta.pdf Keywords: pyOpenRPA OpenRPA RPA Robot Automation Robotization OpenSource IT4Business -Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: License :: Free For Educational Use Classifier: License :: Free For Home Use @@ -92,4 +91,3 @@ Ivan Maslov contacts (CEO & FOUNDER): - Web: https://pyopenrpa.ru/ - Telegram: https://t.me/pyopenrpa - WhatsApp | Telegram: +7 906 722 39 25 | @IvanMaslov - diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/RECORD b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/RECORD similarity index 92% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/RECORD rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/RECORD index b8017eec..941c38f3 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/RECORD +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/RECORD @@ -1,11 +1,17 @@ -pyOpenRPA-1.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pyOpenRPA-1.3.0.dist-info/METADATA,sha256=V-qwlFCJ26LQShABSS0p5Tm9vxOXMYqrahL40zkthnI,4378 -pyOpenRPA-1.3.0.dist-info/RECORD,, -pyOpenRPA-1.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pyOpenRPA-1.3.0.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 -pyOpenRPA-1.3.0.dist-info/top_level.txt,sha256=RPzwQXgYBRo_m5L3ZLs6Voh8aEkMeT29Xsul1w1qE0g,10 -pyOpenRPA/Agent/A2O.py,sha256=PlIZZCTnVrYF2i6DSAi_KbzZfc2gtcBPmOerrEZq68U,1718 -pyOpenRPA/Agent/O2A.py,sha256=o-5JF-415L69-vCg0COzK79sWs4btJwOkt53pqVhu0U,6210 +pyOpenRPA-1.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pyOpenRPA-1.3.1.dist-info/METADATA,sha256=oy_kdDRYfQHXr9MUOp_vO-WZ9AOOGvtMKIfYDanGAHY,4359 +pyOpenRPA-1.3.1.dist-info/RECORD,, +pyOpenRPA-1.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pyOpenRPA-1.3.1.dist-info/WHEEL,sha256=qB97nP5e4MrOsXW5bIU5cUn_KSVr10EV0l-GCHG9qNs,97 +pyOpenRPA-1.3.1.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=iSjYhWS2GrL6vdJ0Gc9PVtgfiqzqVwBc5jX0HsOrFdo,1713 +pyOpenRPA/Agent/O2A.py,sha256=DpFWS1uKfFNsuyiSwj5LLI862oe58aJbQilRv3Hgm9o,6205 pyOpenRPA/Agent/Processor.py,sha256=xNZfQ_HcV-qm_x90tBLKYJqvnENiTqHSoUk2LhDfqWQ,6346 pyOpenRPA/Agent/__Agent__.py,sha256=rUvtEGEmlsd3ZujkQnPhL3mGaALmM2iNvfWBoF0Puc4,15167 pyOpenRPA/Agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 @@ -17,12 +23,12 @@ 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/LICENSE.pdf,sha256=8L-9X_kCCt8yWvjy0E_xV-C6Im79hZnH7WcfZHRz8uM,4322139 -pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=IqVZygd8ab9X1gBfP7WImQrYqKy8snCSbThqrvdT5f0,39633 +pyOpenRPA/Orchestrator/BackwardCompatibility.py,sha256=cYsvzgtjpGtD1qW8GRIq7WjHktsPZ0kefN47g9awhDc,39641 pyOpenRPA/Orchestrator/ControlPanel.py,sha256=OzS8HjG__8OZgqhajr8L8owyugXPuSLWHLtXuKdEP78,103 pyOpenRPA/Orchestrator/Core.py,sha256=OHa3mSC3_wRAizqrWBVjlR6ln4-xVVvBpOSnWl6qVvY,529 -pyOpenRPA/Orchestrator/Managers/ControlPanel.py,sha256=PZzh_RUke8bIMGghCXTnEuTYICCwW71r2xXk7iTdUnU,17345 +pyOpenRPA/Orchestrator/Managers/ControlPanel.py,sha256=VJoWVZoGE0dOQ-_jeezG8NNsk0mETUrJQztE8AfqxBY,17531 pyOpenRPA/Orchestrator/Managers/Git.py,sha256=VCXXc-enJhvrAJvYc8jHK9GcGe02meMdszU0tlJDHiQ,12879 -pyOpenRPA/Orchestrator/Managers/Process.py,sha256=4LJNMrt61AJKI3p7SeXnUSEpA61BtqWVxaVYxYS_BaI,42221 +pyOpenRPA/Orchestrator/Managers/Process.py,sha256=JW6cMsgAKmTtSkNMlW7zHhLh3N8lBdZI95wDadxCgtw,42537 pyOpenRPA/Orchestrator/Managers/__init__.py,sha256=4my0XiwmI_QLRQVhOzNvWTggCosF3tb2yRxGkehOCq0,71 pyOpenRPA/Orchestrator/Managers/__pycache__/ControlPanel.cpython-37.pyc,, pyOpenRPA/Orchestrator/Managers/__pycache__/Git.cpython-37.pyc,, @@ -62,8 +68,9 @@ 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=eYiXKvWsiBG_kfHtzdNX4Zu2xL2DjkJZXqBfqOgHAk4,38600 -pyOpenRPA/Orchestrator/ServerSettings.py,sha256=wZe5aEUJOWYol8WzKUQBRq9JEnXj0Z39554PAIoqvbw,34326 +pyOpenRPA/Orchestrator/Server.py,sha256=kejcfciuREYHc8Wl0ZgO6_1Kim0QtgfugPWYQq3VD54,12723 +pyOpenRPA/Orchestrator/ServerBC.py,sha256=hwaFRtw1XN3D1rankd2HwH139-z5vfYvXO1I9skF0bI,23719 +pyOpenRPA/Orchestrator/ServerSettings.py,sha256=1mHElwL46J_dT3qTF3-DaP_u4HekC4C5uGv2rRSngHc,35111 pyOpenRPA/Orchestrator/SettingsTemplate.py,sha256=dVL-JZpAUQP3LLXE_7IUuE7RkLTYBAA-RX4e5FZ_DU0,21499 pyOpenRPA/Orchestrator/Timer.py,sha256=HvYtEeH2Q5WVVjgds9XaBpWRmvZgwgBXurJDdVVq_T0,2097 pyOpenRPA/Orchestrator/Utils/LoggerHandlerDumpLogList.py,sha256=hD47TiOuKR-G8IWu9lJD2kG28qlH7YZV63i3qv1N5Dk,681 @@ -71,11 +78,8 @@ pyOpenRPA/Orchestrator/Utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM pyOpenRPA/Orchestrator/Utils/__pycache__/LoggerHandlerDumpLogList.cpython-37.pyc,, pyOpenRPA/Orchestrator/Utils/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Orchestrator/Web/Basic.py,sha256=pPH55rPwZz1ktpzNIcC51jeV2MgZI10Zf0Q0DncihDw,7757 -pyOpenRPA/Orchestrator/Web/Index.js,sha256=YACiZAvjr6NmFlDhQu6urkJp49BX7L8WJU9p-MeIlCI,43508 -pyOpenRPA/Orchestrator/Web/Index.xhtml,sha256=5JUAs5rEiU0XtHM9QO6EdNMBGt-W6QOVGY7xJ_HLPFM,19257 pyOpenRPA/Orchestrator/Web/__pycache__/Basic.cpython-37.pyc,, -pyOpenRPA/Orchestrator/Web/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 -pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=LmEhNQkdK5SEIqql0ZM9PrjKgQ4-aQOiOheX83GbqmQ,207494 +pyOpenRPA/Orchestrator/__Orchestrator__.py,sha256=E7kysFDJmcmBejKt8_0pk624U6ohLqM32CjvJ-FysoQ,214440 pyOpenRPA/Orchestrator/__init__.py,sha256=nJhjYtBXKOUNX_yNu1rRFk5y9cDz6AFiL0M6KgX_utQ,207 pyOpenRPA/Orchestrator/__main__.py,sha256=czJrc7_57WiO3EPIYfPeF_LG3pZsQVmuAYgbl_YXcVU,273 pyOpenRPA/Orchestrator/__pycache__/BackwardCompatibility.cpython-37.pyc,, @@ -84,6 +88,7 @@ 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__/ServerBC.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/ServerSettings.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/SettingsTemplate.cpython-37.pyc,, pyOpenRPA/Orchestrator/__pycache__/Timer.cpython-37.pyc,, @@ -243,7 +248,7 @@ pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/package.js,sha256=BHq6qGCSMdDXDGJ 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.css,sha256=o4apE2I4Au57fkNgduz1J0rhbTPc04IlvCzBmEeapGE,628944 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 @@ -264,11 +269,12 @@ pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/themes/default/assets/fonts/outli 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/orpa/favicon.ico,sha256=6S8XwSQ_3FXPpaX6zYkf8uUewVXO9bHnrrDHEoWrEgw,112922 -pyOpenRPA/Resources/Web/orpa/footer.xhtml,sha256=5aNthu2jsINqpgo_BS8UDbRWhA3rlRtlQZIILv_4hKo,3190 -pyOpenRPA/Resources/Web/orpa/header.xhtml,sha256=pqVM-N53bz4_DzbG4PoN7B7N7XECZWZe12qVlc68ylk,3617 +pyOpenRPA/Resources/Web/orpa/footer.xhtml,sha256=xB-uUWvzdgD686l8rXWYOzwp3y7DKnZrvJeBS0ClPLI,3482 +pyOpenRPA/Resources/Web/orpa/header.xhtml,sha256=kJF-9Ea9DV2v6Y3F0r3FvF3odfYmw14F5_SAbbq2uyk,3658 pyOpenRPA/Resources/Web/orpa/logo.png,sha256=7rulXo_C57xJQEaYWmAkChxXb6xbDW2zq-werzVbDbc,4899 -pyOpenRPA/Resources/Web/orpa/orc.js,sha256=qlzbbewXWDFbNhNHVVvMEYQFyQbRA7zEHoeaV38fJoQ,43558 -pyOpenRPA/Resources/Web/orpa/orc.xhtml,sha256=x6NdMv6HrjUt0rZsz61dJeMl3DNte1KkEULQRkGfsJg,19098 +pyOpenRPA/Resources/Web/orpa/orc.js,sha256=aVKy_YTcpcOUiXcUyE1hyW7lpSmfFJY3sVjgEgMdXrw,38487 +pyOpenRPA/Resources/Web/orpa/orc.xhtml,sha256=6WQ5fidSF8EW8PzqZ9AMVptVVCJAzQleqEFqfRIqQvo,19324 +pyOpenRPA/Resources/Web/orpa/std.xhtml,sha256=lNg0WRW-sM5J2EGCkqtwqtOzv5n21KFZ8vHv9KlquEY,43547 pyOpenRPA/Resources/Web/orpa/styleset/Lato-Bold.woff2,sha256=roj8DXqWGDL4CVJ9ML05g6aGbUL2alat4j9UNoFZTbY,184912 pyOpenRPA/Resources/Web/orpa/styleset/Lato-Italic.woff2,sha256=RGV2Xy9u3c2tNP_XyrVZ5WvA515F4ZL4XpVisHcUgdw,195704 pyOpenRPA/Resources/Web/orpa/styleset/Lato-Regular.woff2,sha256=mDsMrzNuhUIhT8FwGaT8XgNghkuSgGyhTVXB_BwsWg8,182708 @@ -303,8 +309,9 @@ pyOpenRPA/Resources/Web/orpa/styleset/sidebar.js,sha256=fnype3guWOx0kmyP7rL2I0mk pyOpenRPA/Resources/Web/orpa/styleset/transition.js,sha256=esNkWoCwl6ksZewJkNDMLKCE4nDTdJZDJW3tdE7dlAo,36070 pyOpenRPA/Resources/Web/orpa/styleset/visibility.js,sha256=ulme0GrsuqHAHXTQunq96J0mESTl6Lux8msdK1_fcm4,44174 pyOpenRPA/Resources/Web/orpa/styleset/white-image.png,sha256=D7WJFGDtAIp_OXUU6Tz4zeYm_1yHRd8u7aTu0F35Kcw,5951 +pyOpenRPA/Robot/Audio.py,sha256=kHvFnb3t_vnw-NjfSf1zaL3w1Th-984KMx1S8-6BX5I,22176 pyOpenRPA/Robot/Clipboard.py,sha256=QXClSH1ccCl8KfKbMY1Wk_SynEgfDZqZ_0h-OZYn4kA,1962 -pyOpenRPA/Robot/Keyboard.py,sha256=3RCogucSWPCtq7YbFKIUvJOSBvFE04P6Lo3hjCGUHi8,26071 +pyOpenRPA/Robot/Keyboard.py,sha256=0pe4C5vqYD9LRBm61dZmJ39lyNoI0BXMLCA0bWjvm8I,26589 pyOpenRPA/Robot/Mouse.py,sha256=R-2q5Q-nDhvvQjcQxFz8FRM9tHjhPUKdnK3KuPc_OZw,16361 pyOpenRPA/Robot/OrchestratorConnector.py,sha256=JUtdiUXCruqUqBD19gJBl9jk_b-tpWWx_v3MfBoKzoQ,20445 pyOpenRPA/Robot/README.md,sha256=bwiTAygxuMZzBlwpsndw2QgxA2smIjUyOPZnsnR341k,1623 @@ -312,7 +319,7 @@ pyOpenRPA/Robot/Screen.py,sha256=nH80ghKw7OseNF_fVwfUrih0y9o1Ul2VPEl_WT5b598,454 pyOpenRPA/Robot/SettingsTemplate.py,sha256=Rp5XPeV2I4tCS2uf4Zkqm_ERJ6pZMg4-e5_lMqGJYLk,1453 pyOpenRPA/Robot/Test.py,sha256=qXr990nXiFZX5SNv6QN9GLb_U4HZRmJnbZR2qSnwilY,2878 pyOpenRPA/Robot/UIDesktop.py,sha256=WLy8wUVDFSUN5S7hXUjijQIH0B71c5tj-pBCVex7uFc,125314 -pyOpenRPA/Robot/UIWeb.py,sha256=c3VA8IG2ELuGaWskyFFCbJalBKdDON2sjWhvHjR-2Dk,32353 +pyOpenRPA/Robot/UIWeb.py,sha256=DLr6cPvFdUmGMTKGLVrksaVKHqBmbxzFkkT4qT0WLfo,32589 pyOpenRPA/Robot/Utils/JSONNormalize.py,sha256=aIuVzuZDazhxkCOzoOjfhHVz66mp2FWdfPv5E7KWF5Y,3890 pyOpenRPA/Robot/Utils/ProcessBitness.py,sha256=NvzuTxNWL_EMmdU1Isu0bUck1Iud0Kkzn8GsVCzIAAM,4591 pyOpenRPA/Robot/Utils/ProcessCommunicator.py,sha256=8GfmLnOvAdosmt7YNT86uEV9cjhKippssCX62wOMJwM,8039 @@ -328,6 +335,7 @@ pyOpenRPA/Robot/Utils/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Robot/Window.py,sha256=UJl-sg4RvvJ35aG9jZOzqGVwE15XK7qPHqoOBD13xFk,431 pyOpenRPA/Robot/__init__.py,sha256=eYyMsU33rGlEZcsO-MH9UtXs47UcTCtg4Uc4lxKmmQo,255 pyOpenRPA/Robot/__main__.py,sha256=xtzw5siZZJV2Nmn-zXPZY5u3Tk0wxe-l8lxq3VPEEiI,2029 +pyOpenRPA/Robot/__pycache__/Audio.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Clipboard.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Keyboard.cpython-37.pyc,, pyOpenRPA/Robot/__pycache__/Mouse.cpython-37.pyc,, @@ -343,10 +351,8 @@ 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=6He68tum4IyMSOv9VXsH2hmvMDnnCf4CDI66L7Wpl_Q,8739 +pyOpenRPA/Studio/Studio.py,sha256=pf9feDUyvKRJfhREkxK9uN49dWawYdn3ImkdxuH5mM0,18518 pyOpenRPA/Studio/ValueVerify.py,sha256=ObskxU4fOMoCGw74_nzYt6-a5jjrAckb3sdBLYyhYxY,777 -pyOpenRPA/Studio/Web/Index.xhtml,sha256=X_fLnzxdcJ8ML9VRORpaMmQwlu1Pcr0CR2Krzt65Hes,48119 -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,, @@ -357,7 +363,7 @@ pyOpenRPA/Studio/__pycache__/ValueVerify.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/__init__.cpython-37.pyc,, pyOpenRPA/Studio/__pycache__/__main__.cpython-37.pyc,, pyOpenRPA/Tools/CrossOS.py,sha256=6yq7cit6dgs0KCk6zknoy699r7a3gC0UrnYYe-ZrobM,3539 -pyOpenRPA/Tools/Debugger.py,sha256=2slOSaPnUAwfDlyjhaqqhhchXUBgEKQImTzXagJt4Jw,535 +pyOpenRPA/Tools/Debugger.py,sha256=nLDzlghYnRghULjGze6_yVg5Du25I8K5s3uhFw1hh3w,570 pyOpenRPA/Tools/License.py,sha256=r4z9HExUzpk2Q_6WhzgUnHlOPPHK1MLevtdlLwtZ7Hk,10378 pyOpenRPA/Tools/RobotDB/ExcelCom.py,sha256=hp0dvXOEC7Au00ueh7pqxkdixV-PC-km7tCt-wRunYs,343 pyOpenRPA/Tools/RobotDB/HowToUse,sha256=TUXPZAFcse-PSlKFM6jcaYuuZZEmXOSSvgeqrbmIDoc,1473 @@ -401,7 +407,14 @@ pyOpenRPA/Tools/__pycache__/StopSafe.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/Template.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/Usage.cpython-37.pyc,, pyOpenRPA/Tools/__pycache__/__init__.cpython-37.pyc,, +pyOpenRPA/Utils/Dictionary.py,sha256=dXmsFZoufUxpf_f_grQIsWcto1qwLCRrxN6m93NJCu8,2261 +pyOpenRPA/Utils/Disk.py,sha256=MKD9nIGKNOJeQow1qGDTEz-GffkFbWaNxf3Hj76AyTo,364 +pyOpenRPA/Utils/Network.py,sha256=UHTvc_ut_Fimeg-tBISUYPgkLKQTBkte3EsIh8BW7a8,600 pyOpenRPA/Utils/Render.py,sha256=VCU5cCCwyCFvMmRQwq7MGllgqzeDAp_s8om3UChIoPk,6703 +pyOpenRPA/Utils/Text.py,sha256=ZFIIPaCB8lJ7kwF9bwpVR-lmf_p1o6jz8npBdl_7eNc,214 +pyOpenRPA/Utils/__pycache__/Dictionary.cpython-37.pyc,, +pyOpenRPA/Utils/__pycache__/Disk.cpython-37.pyc,, pyOpenRPA/Utils/__pycache__/Render.cpython-37.pyc,, -pyOpenRPA/__init__.py,sha256=adiLDsNcgYHaK1h_sStFVU0UEQpYGgFRvPiLmmrtvnU,155 +pyOpenRPA/Utils/__pycache__/Text.cpython-37.pyc,, +pyOpenRPA/__init__.py,sha256=Uj0nKJ5lCErziv4h_RMQxX1M13lF_oHY2NJIJ9UndSI,155 pyOpenRPA/__pycache__/__init__.cpython-37.pyc,, diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/REQUESTED b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/REQUESTED similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/REQUESTED rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/REQUESTED diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/WHEEL b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/WHEEL similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/WHEEL rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/WHEEL diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/top_level.txt b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/top_level.txt similarity index 100% rename from Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.0.dist-info/top_level.txt rename to Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA-1.3.1.dist-info/top_level.txt 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 index 3f302476..45cef04d 100755 --- 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 @@ -15,7 +15,7 @@ def _A2ODataSend(inGSettings, inDataDict): lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http" lHostStr = inGSettings["OrchestratorDict"]["HostStr"] lPortInt = inGSettings["OrchestratorDict"]["PortInt"] - lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/A2O" + lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/orpa/agent/a2o" lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=inDataDict, timeout=inGSettings["A2ODict"]["ConnectionTimeoutSecFloat"]) except Exception as e: if lL: lL.exception(f"A2O Error handler.") 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 index 3780cb81..f1a61771 100755 --- 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 @@ -30,7 +30,7 @@ def O2A_Loop(inGSettings): lProtocolStr= "https" if inGSettings["OrchestratorDict"]["IsHTTPSBool"] else "http" lHostStr = inGSettings["OrchestratorDict"]["HostStr"] lPortInt = inGSettings["OrchestratorDict"]["PortInt"] - lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/pyOpenRPA/Agent/O2A" + lURLStr=f"{lProtocolStr}://{lHostStr}:{lPortInt}/orpa/agent/o2a" lDataDict = { "HostNameUpperStr": inGSettings["AgentDict"]["HostNameUpperStr"], "UserUpperStr": inGSettings["AgentDict"]["UserUpperStr"], "ActivityLastGUIDStr": lActivityLastGUIDStr} lResponse = requests.post(url= lURLStr, cookies = {"AuthToken":inGSettings["OrchestratorDict"]["SuperTokenStr"]}, json=lDataDict, timeout=inGSettings["O2ADict"]["ConnectionTimeoutSecFloat"]) lCEPhaseFastTimeLastGoodFloat = time.time() diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py index 841d272d..66cbcf54 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/BackwardCompatibility.py @@ -540,5 +540,5 @@ def Update(inGSettings): # "URLIndexStr" if "URLIndexStr" not in inGSettings["ServerDict"]: inGSettings["ServerDict"]["URLIndexStr"] = "/" - if lL: lL.warning( - f"Обратная совместимость (v1.2.11 -> v1.2.12): ServerDict > URLIndexStr и URLIndexStr = /") # Log about compatibility \ No newline at end of file + if lL: lL.warning( + f"Обратная совместимость (v1.2.11 -> v1.2.12): ServerDict > URLIndexStr и URLIndexStr = /") # Log about compatibility \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/ControlPanel.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/ControlPanel.py index 3ad49fed..22e8a715 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/ControlPanel.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/ControlPanel.py @@ -86,9 +86,9 @@ class ControlPanel(): if inControlPanelNameStr in Orchestrator.GSettingsGet()["ServerDict"]["ControlPanelDict"]: raise Exception(f"Ошибка: Ранее уже была инициализирована панель управления с идентификатором: {inControlPanelNameStr}. Устраните ошибку и перезапустите оркестратор") Orchestrator.GSettingsGet()["ServerDict"]["ControlPanelDict"][inControlPanelNameStr] = self + self.mControlPanelNameStr = inControlPanelNameStr # Set the name of the control panel self.RefreshHTMLJinja2TemplatePathSet(inJinja2TemplatePathStr = inRefreshHTMLJinja2TemplatePathStr) self.mJinja2TemplateRefreshBool = inJinja2TemplateRefreshBool - self.mControlPanelNameStr = inControlPanelNameStr # Set the name of the control panel self.mRobotNameStr = inRobotNameStr # Set the robot name for robot it execute def Jinja2DataUpdateDictSet(self, inJinja2DataUpdateDict): @@ -116,7 +116,7 @@ class ControlPanel(): self.mRefreshHTMLJinja2Env = jinja2.Environment(loader=self.mRefreshHTMLJinja2Loader, trim_blocks=True) self.mRefreshHTMLJinja2Template = self.mRefreshHTMLJinja2Env.get_template(lTemplateFileNameStr) except Exception as e: - Orchestrator.OrchestratorLoggerGet().exception("Ошибка при инициализации Jinja2") + Orchestrator.OrchestratorLoggerGet().exception(f"Ошибка при инициализации Jinja2 ({inJinja2TemplatePathStr}). Панель управления: {self.mControlPanelNameStr}") def RefreshHTMLJinja2StrGenerate(self, inDataDict): """ @@ -145,7 +145,7 @@ class ControlPanel(): self.mInitJSJinja2Env = jinja2.Environment(loader=self.mInitJSJinja2Loader, trim_blocks=True) self.mInitJSJinja2Template = self.mInitJSJinja2Env.get_template(lTemplateFileNameStr) except Exception as e: - Orchestrator.OrchestratorLoggerGet().exception("Ошибка при инициализации Jinja2") + Orchestrator.OrchestratorLoggerGet().exception(f"Ошибка при инициализации Jinja2 ({inJinja2TemplatePathStr}). Панель управления: {self.mControlPanelNameStr}") def InitJSJinja2StrGenerate(self, inDataDict): """ diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/Process.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/Process.py index 392c735b..977c5b94 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/Process.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Managers/Process.py @@ -393,7 +393,7 @@ class Process(): lL.info(f"Модуль Managers.Process ({self.mAgentHostNameStr}, {self.mAgentUserNameStr}, {self.mProcessNameWOExeStr}): Состояние процесса изменилось на {self.mStatusStr})") - def StatusCheck(self): + def StatusCheck(self, inTimeoutSecFloat=9.0, inRaiseExceptionBool=False): """ Check if process is alive. The def will save the manual flag is exists. Don't wait mute but set mute if it is not set. @@ -405,21 +405,27 @@ class Process(): #self.MuteWait() self.mAgentMuteBool=True lGUIDStr = __Orchestrator__.AgentActivityItemAdd(inHostNameStr=self.mAgentHostNameStr,inUserStr=self.mAgentUserNameStr,inActivityItemDict=lActivityItemUserProcessList) - lUserProcessList = __Orchestrator__.AgentActivityItemReturnGet(inGUIDStr=lGUIDStr) - if self.mProcessNameWOExeStr.upper() in lUserProcessList: - if self.mStatusStr == "1_STOPPED_MANUAL": self.mStatusStr = "5_STARTED_MANUAL"; lLogBool=True - if self.mStatusStr == "0_STOPPED": self.mStatusStr = "4_STARTED"; lLogBool=True - if self.mStatusStr is None: self.mStatusStr = "4_STARTED"; lLogBool=True - else: - if self.mStatusStr == "2_STOP_SAFE": self.mStatusStr = "0_STOPPED"; lLogBool = True - if self.mStatusStr == "3_STOP_SAFE_MANUAL": self.mStatusStr = "1_STOPPED_MANUAL"; lLogBool = True - if self.mStatusStr == "5_STARTED_MANUAL": self.mStatusStr = "1_STOPPED_MANUAL"; lLogBool=True - if self.mStatusStr == "4_STARTED": self.mStatusStr = "0_STOPPED"; lLogBool=True - if self.mStatusStr is None: self.mStatusStr = "0_STOPPED"; lLogBool=True - # Log info about process - if lLogBool == True: self.StatusChangeLog() - self.mAgentMuteBool = False - return self.mStatusStr + try: + lUserProcessList = __Orchestrator__.AgentActivityItemReturnGet(inGUIDStr=lGUIDStr,inTimeoutSecFloat=inTimeoutSecFloat) + if self.mProcessNameWOExeStr.upper() in lUserProcessList: + if self.mStatusStr == "1_STOPPED_MANUAL": self.mStatusStr = "5_STARTED_MANUAL"; lLogBool=True + if self.mStatusStr == "0_STOPPED": self.mStatusStr = "4_STARTED"; lLogBool=True + if self.mStatusStr is None: self.mStatusStr = "4_STARTED"; lLogBool=True + else: + if self.mStatusStr == "2_STOP_SAFE": self.mStatusStr = "0_STOPPED"; lLogBool = True + if self.mStatusStr == "3_STOP_SAFE_MANUAL": self.mStatusStr = "1_STOPPED_MANUAL"; lLogBool = True + if self.mStatusStr == "5_STARTED_MANUAL": self.mStatusStr = "1_STOPPED_MANUAL"; lLogBool=True + if self.mStatusStr == "4_STARTED": self.mStatusStr = "0_STOPPED"; lLogBool=True + if self.mStatusStr is None: self.mStatusStr = "0_STOPPED"; lLogBool=True + # Log info about process + if lLogBool == True: self.StatusChangeLog() + self.mAgentMuteBool = False + return self.mStatusStr + except Exception as e: + self.mAgentMuteBool=False + if inRaiseExceptionBool: raise e + else: return "TIMEOUT" + def StatusCheckStart(self): """ Check process status and run it if auto stopped self.mStatusStr is "0_STOPPED" diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py index d702c4bb..27765796 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Server.py @@ -6,685 +6,221 @@ # lResponseDict = {"Headers": {}, "SetCookies": {}, "Body": b"", "StatusCode": None} # self.OpenRPAResponseDict = lResponseDict -from http.server import BaseHTTPRequestHandler, HTTPServer -from socketserver import ThreadingMixIn +#from http.client import HTTPException import threading -import json -from threading import Thread -import inspect from pyOpenRPA.Tools import CrossOS -from . import Processor # Add new processor -from . import ProcessorOld # Support old processor - deprecated defs only for backward compatibility -import urllib.parse # decode URL in string -import importlib -import pdb -import base64 -import uuid -import datetime -import os #for path operations -from http import cookies -gSettingsDict = {} -from . import ServerSettings -from . import __Orchestrator__ -import copy -import mimetypes -mimetypes.add_type("font/woff2",".woff2") -mimetypes.add_type("text/javascript",".js") -gCacheDict = {} +from http import cookies +from . import ServerBC + +# объявление import +from fastapi import FastAPI, Form, Request, HTTPException, Depends, Header, Response, Body +from fastapi.responses import PlainTextResponse, HTMLResponse, FileResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates +from pydantic import BaseModel +import uvicorn +import io +from starlette.responses import StreamingResponse +from typing import Union +from pyOpenRPA import __version__ -# Tool to merge complex dictionaries -def __ComplexDictMerge2to1__(in1Dict, in2Dict): - lPathList=None - if lPathList is None: lPathList = [] - for lKeyStr in in2Dict: - if lKeyStr in in1Dict: - if isinstance(in1Dict[lKeyStr], dict) and isinstance(in2Dict[lKeyStr], dict): - __ComplexDictMerge2to1__(in1Dict[lKeyStr], in2Dict[lKeyStr]) - elif in1Dict[lKeyStr] == in2Dict[lKeyStr]: - pass # same leaf value - else: - raise Exception('Conflict at %s' % '.'.join(lPathList + [str(lKeyStr)])) - else: - in1Dict[lKeyStr] = in2Dict[lKeyStr] - return in1Dict - -# Tool to merge complex dictionaries - no exceptions, just overwrite dict 2 in dict 1 -def __ComplexDictMerge2to1Overwrite__(in1Dict, in2Dict): - """ - Merge in2Dict in in1Dict. In conflict override and get value from dict 2 +import base64 +import uuid +import datetime - :param in1Dict: Source dict. Save the link (structure) - :param in2Dict: New data dict - :return: Merged dict 1 - """ - lPathList=None - if lPathList is None: lPathList = [] - for lKeyStr in in2Dict: - if lKeyStr in in1Dict: - if isinstance(in1Dict[lKeyStr], dict) and isinstance(in2Dict[lKeyStr], dict): - __ComplexDictMerge2to1Overwrite__(in1Dict[lKeyStr], in2Dict[lKeyStr]) +# ИНИЦИАЛИЗАЦИЯ FASTAPI! +app = FastAPI( + title = "pyOpenRPA (ORPA) Orchestrator", + description = "Сервер оркестратора pyOpenRPA Orchestrator", + version = __version__, + openapi_url="/orpa/fastapi/openapi.json", + docs_url = "/orpa/fastapi/docs", + redoc_url = "/orpa/fastapi/redoc", + swagger_ui_oauth2_redirect_url = "/orpa/fastapi/docs/oauth2-redirect", + ) + +def IdentifyAuthorize(inRequest:Request, inResponse:Response, + inCookiesStr: Union[str, None] = Header(default=None,alias="Cookie"), + inAuthorizationStr: Union[str, None] = Header(default="",alias="Authorization")): + if __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False)==True: + lResult={"Domain": "", "User": ""} + ###################################### + #Way 1 - try to find AuthToken + lCookies = cookies.SimpleCookie(inCookiesStr) # inRequest.headers.get("Cookie", "") + __Orchestrator__.GSettingsGet() + lHeaderAuthorization = inAuthorizationStr.split(" ") + if "AuthToken" in lCookies: + lCookieAuthToken = lCookies.get("AuthToken", "").value + if lCookieAuthToken: + #Find AuthToken in GlobalDict + if lCookieAuthToken in __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}): + #Auth Token Has Been Founded + lResult["Domain"] = __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lCookieAuthToken]["Domain"] + lResult["User"] = __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lCookieAuthToken]["User"] + #Set auth token + mOpenRPA={} + mOpenRPA["AuthToken"] = lCookieAuthToken + mOpenRPA["Domain"] = lResult["Domain"] + mOpenRPA["User"] = lResult["User"] + mOpenRPA["IsSuperToken"] = __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(mOpenRPA["AuthToken"], {}).get("FlagDoNotExpire", False) + return lCookieAuthToken + ###################################### + #Way 2 - try to logon + if len(lHeaderAuthorization) == 2: + llHeaderAuthorizationDecodedUserPasswordList = base64.b64decode(lHeaderAuthorization[1]).decode("utf-8").split( + ":") + lUser = llHeaderAuthorizationDecodedUserPasswordList[0] + lPassword = llHeaderAuthorizationDecodedUserPasswordList[1] + lDomain = "" + if "\\" in lUser: + lDomain = lUser.split("\\")[0] + lUser = lUser.split("\\")[1] + lLogonBool = __Orchestrator__.OSCredentialsVerify(inUserStr=lUser, inPasswordStr=lPassword, inDomainStr=lDomain) + #Check result + if lLogonBool: + lResult["Domain"] = lDomain + lResult["User"] = lUser + #Create token + lAuthToken=str(uuid.uuid1()) + __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken] = {} + __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["Domain"] = lResult["Domain"] + __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["User"] = lResult["User"] + __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["FlagDoNotExpire"] = False + __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["TokenDatetime"] = datetime.datetime.now() + #Set-cookie + inResponse.set_cookie(key="AuthToken",value=lAuthToken) + mOpenRPA={} + mOpenRPA["AuthToken"] = lAuthToken + mOpenRPA["Domain"] = lResult["Domain"] + mOpenRPA["User"] = lResult["User"] + mOpenRPA["IsSuperToken"] = __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(mOpenRPA["AuthToken"], {}).get("FlagDoNotExpire", False) + return lAuthToken + #inRequest.OpenRPASetCookie = {} + #New engine of server + #inRequest.OpenRPAResponseDict["SetCookies"]["AuthToken"] = lAuthToken else: - in1Dict[lKeyStr] = in2Dict[lKeyStr] + raise HTTPException(status_code=401, detail="Попытка авторизации не прошла успешно (неверная пара логин / пароль)", headers={}) + ###################################### else: - in1Dict[lKeyStr] = in2Dict[lKeyStr] - return in1Dict + raise HTTPException(status_code=401, detail="Попытка авторизации не прошла успешно (неполная пара логин / пароль)", headers={'Content-type':'text/html', 'WWW-Authenticate':'Basic'}) + else: return None # Credentials are not required - return none + + + +lRouteList =[] +for lItem in app.router.routes: + lRouteList.append(lItem) +app.router.routes=[] +for lItem in lRouteList: + app.add_api_route( + path=lItem.path, + endpoint=lItem.endpoint, + methods=["GET"], + dependencies=[Depends(IdentifyAuthorize)], + tags=["FastAPI"] + ) + + +from . import ServerSettings + +def BackwardCompatibility(inRequest:Request, inResponse:Response, inBodyStr:str = Body(""), inAuthTokenStr = None): + lHTTPRequest = ServerBC.HTTPRequestOld(inRequest=inRequest, inResponse=inResponse, inAuthTokenStr=inAuthTokenStr) + lHTTPRequest.path = inRequest.url.path + lHTTPRequest.body = inBodyStr + lHTTPRequest.client_address = [inRequest.client.host] + threading.current_thread().request = lHTTPRequest + lResult = lHTTPRequest.do_GET(inBodyStr=inBodyStr) + if lResult is None: + lResult = lHTTPRequest.do_POST(inBodyStr=inBodyStr) + if lHTTPRequest.OpenRPAResponseDict["Headers"]["Content-type"] != None: + return StreamingResponse(io.BytesIO(lResult), media_type=lHTTPRequest.OpenRPAResponseDict["Headers"]["Content-type"]) + +#WRAPPERS! +def BackwardCompatibityWrapperAuth(inRequest:Request, inResponse:Response, inBodyStr:str = Body(""), + inAuthTokenStr:str=Depends(ServerSettings.IdentifyAuthorize)): # Old from v1.3.1 (updated to FastAPI) + return BackwardCompatibility(inRequest = inRequest, inResponse = inResponse, inBodyStr = inBodyStr, inAuthTokenStr=inAuthTokenStr) +def BackwardCompatibityWrapperNoAuth(inRequest:Request, inResponse:Response, inBodyStr:str = Body("")): # Old from v1.3.1 (updated to FastAPI) + return BackwardCompatibility(inRequest = inRequest, inResponse = inResponse, inBodyStr = inBodyStr, inAuthTokenStr=None) +def BackwardCompatibityBeginWrapperAuth(inBeginTokenStr, inRequest:Request, inResponse:Response, inBodyStr:str = Body(""), + inAuthTokenStr:str=Depends(ServerSettings.IdentifyAuthorize)): # Old from v1.3.1 (updated to FastAPI) + return BackwardCompatibility(inRequest = inRequest, inResponse = inResponse, inBodyStr = inBodyStr, inAuthTokenStr=inAuthTokenStr) +def BackwardCompatibityBeginWrapperNoAuth(inBeginTokenStr, inRequest:Request, inResponse:Response, inBodyStr:str = Body("")): # Old from v1.3.1 (updated to FastAPI) + return BackwardCompatibility(inRequest = inRequest, inResponse = inResponse, inBodyStr = inBodyStr, inAuthTokenStr=None) -#Authenticate function () -# return dict -# { -# "Domain": "", #Empty if Auth is not success -# "User": "" #Empty if Auth is not success -# } -def AuthenticateVerify(inRequest): - lResult={"Domain": "", "User": ""} - ###################################### - #Way 1 - try to find AuthToken - lCookies = cookies.SimpleCookie(inRequest.headers.get("Cookie", "")) - global gSettingsDict - #pdb.set_trace() - if "AuthToken" in lCookies: - lCookieAuthToken = lCookies.get("AuthToken", "").value - if lCookieAuthToken: - #Find AuthToken in GlobalDict - if lCookieAuthToken in gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}): - #Auth Token Has Been Founded - lResult["Domain"] = gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lCookieAuthToken]["Domain"] - lResult["User"] = gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lCookieAuthToken]["User"] - #Set auth token - inRequest.OpenRPA["AuthToken"] = lCookieAuthToken - inRequest.OpenRPA["Domain"] = lResult["Domain"] - inRequest.OpenRPA["User"] = lResult["User"] - #Exit earlier - return lResult - ###################################### - #Way 2 - try to logon - lHeaderAuthorization = inRequest.headers.get("Authorization", "").split(" ") - if len(lHeaderAuthorization) == 2: - llHeaderAuthorizationDecodedUserPasswordList = base64.b64decode(lHeaderAuthorization[1]).decode("utf-8").split( - ":") - lUser = llHeaderAuthorizationDecodedUserPasswordList[0] - lPassword = llHeaderAuthorizationDecodedUserPasswordList[1] - lDomain = "" - if "\\" in lUser: - lDomain = lUser.split("\\")[0] - lUser = lUser.split("\\")[1] - lLogonBool = __Orchestrator__.OSCredentialsVerify(inUserStr=lUser, inPasswordStr=lPassword, inDomainStr=lDomain) - #Check result - if lLogonBool: - lResult["Domain"] = lDomain - lResult["User"] = lUser - #Create token - lAuthToken=str(uuid.uuid1()) - gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken] = {} - gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["Domain"] = lResult["Domain"] - gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["User"] = lResult["User"] - gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["FlagDoNotExpire"] = False - gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken]["TokenDatetime"] = datetime.datetime.now() - #Set-cookie - inRequest.OpenRPA["AuthToken"] = lAuthToken - inRequest.OpenRPA["Domain"] = lResult["Domain"] - inRequest.OpenRPA["User"] = lResult["User"] - inRequest.OpenRPASetCookie = {} - #New engine of server - inRequest.OpenRPAResponseDict["SetCookies"]["AuthToken"] = lAuthToken - #inRequest.OpenRPAResponse["Set-Cookie"]=[]lResult["Set-Cookie"] = lAuthToken - #pdb.set_trace() - #inRequest.send_header("Set-Cookie:", f"AuthToken={lAuthToken}") - ###################################### - return lResult -def AuthenticateBlock(inRequest): - # Send response status code - inRequest.send_response(401) - # Send headers - inRequest.send_header('Content-type', 'text/html') - inRequest.send_header('WWW-Authenticate', 'Basic') # Always ask login pass - inRequest.end_headers() - # Write content as utf-8 data - inRequest.wfile.write(bytes("", "utf8")) -#Check access before execute the action -#return bool True - go execute, False - dont execute -def UserAccessCheckBefore(inMethod, inRequest): - # Help def - Get access flag from dict - #pdb.set_trace() - global gSettingsDict - def HelpGetFlag(inAccessRuleItem, inRequest, inGlobalDict, inAuthenticateDict): - if "FlagAccess" in inAccessRuleItem: - return inAccessRuleItem["FlagAccess"] - elif "FlagAccessDefRequestGlobalAuthenticate" in inAccessRuleItem: - return inAccessRuleItem["FlagAccessDefRequestGlobalAuthenticate"](inRequest, inGlobalDict, - inAuthenticateDict) - ########################################## - inMethod=inMethod.upper() - #Prepare result false - lResult = False - lAuthToken = inRequest.OpenRPA["AuthToken"] - #go next if user is identified - lUserDict = None - if lAuthToken: - lUserDict = gSettingsDict["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken] - #pdb.set_trace() - ######################################## - ######################################## - #Check general before rule (without User domain) - #Check rules - inRuleMatchURLList = gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("RuleMethodMatchURLBeforeList", []) - for lAccessRuleItem in inRuleMatchURLList: - #Go next execution if flag is false - if not lResult: - #Check if Method is identical - if lAccessRuleItem["Method"].upper() == inMethod: - #check Match type variant: BeginWith - if lAccessRuleItem["MatchType"].upper() == "BEGINWITH": - lURLPath = inRequest.path - lURLPath = lURLPath.upper() - if lURLPath.startswith(lAccessRuleItem["URL"].upper()): - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - # check Match type variant: Contains - elif lAccessRuleItem["MatchType"].upper() == "CONTAINS": - lURLPath = inRequest.path - lURLPath = lURLPath.upper() - if lURLPath.contains(lAccessRuleItem["URL"].upper()): - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - # check Match type variant: Equal - elif lAccessRuleItem["MatchType"].upper() == "EQUAL": - if lAccessRuleItem["URL"].upper() == inRequest.path.upper(): - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - # check Match type variant: EqualCase - elif lAccessRuleItem["MatchType"].upper() == "EQUALCASE": - if lAccessRuleItem["URL"] == inRequest.path: - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - ######################################### - ######################################### - #Do check if lResult is false - if not lResult: - #Check access by User Domain - #Check rules to find first appicable - #Check rules - lMethodMatchURLList = gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("RuleDomainUserDict", {}).get((lUserDict["Domain"].upper(), lUserDict["User"].upper()), {}).get("MethodMatchURLBeforeList", []) - if len(lMethodMatchURLList) > 0: - for lAccessRuleItem in lMethodMatchURLList: - #Go next execution if flag is false - if not lResult: - #Check if Method is identical - if lAccessRuleItem["Method"].upper() == inMethod: - #check Match type variant: BeginWith - if lAccessRuleItem["MatchType"].upper() == "BEGINWITH": - lURLPath = inRequest.path - lURLPath = lURLPath.upper() - if lURLPath.startswith(lAccessRuleItem["URL"].upper()): - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - #check Match type variant: Contains - elif lAccessRuleItem["MatchType"].upper() == "CONTAINS": - lURLPath = inRequest.path - lURLPath = lURLPath.upper() - if lURLPath.contains(lAccessRuleItem["URL"].upper()): - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - # check Match type variant: Equal - elif lAccessRuleItem["MatchType"].upper() == "EQUAL": - if lAccessRuleItem["URL"].upper() == inRequest.path.upper(): - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - # check Match type variant: EqualCase - elif lAccessRuleItem["MatchType"].upper() == "EQUALCASE": - if lAccessRuleItem["URL"] == inRequest.path: - lResult = HelpGetFlag(lAccessRuleItem, inRequest, gSettingsDict, lUserDict) - else: - return True - ##################################### - ##################################### - #Return lResult - return lResult -# HTTPRequestHandler class -class testHTTPServer_RequestHandler(BaseHTTPRequestHandler): - # Def to check User Role access grants - def UACClientCheck(self, inRoleKeyList): # Alias - return self.UserRoleAccessAsk(inRoleKeyList=inRoleKeyList) - def UserRoleAccessAsk(self, inRoleKeyList): - lResult = True # Init flag - lRoleHierarchyDict = self.UserRoleHierarchyGet() # get the Hierarchy - # Try to get value from key list - lKeyValue = lRoleHierarchyDict # Init the base - for lItem in inRoleKeyList: - if type(lKeyValue) is dict: - if lItem in lKeyValue: # Has key - lKeyValue = lKeyValue[lItem] # Get the value and go to the next loop iteration - else: # Else branch - true or false - if len(lKeyValue)>0: # False - if Dict has some elements - lResult = False # Set the False Flag - else: - lResult = True # Set the True flag - break # Stop the loop - else: # Has element with no detalization - return True - lResult = True # Set the flag - break # Close the loop - return lResult # Return the result - # Def to get hierarchy of the current user roles - # if return {} - all is available - def UserRoleHierarchyGet(self): - #global gSettingsDict - lDomainUpperStr = self.OpenRPA["Domain"].upper() - lUserUpperStr = self.OpenRPA["User"].upper() - return gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("RuleDomainUserDict", {}).get((lDomainUpperStr, lUserUpperStr), {}).get("RoleHierarchyAllowedDict", {}) - #Tech def - #return {"headers":[],"body":"","statuscode":111} - def URLItemCheckDo(self, inURLItem, inMethod, inOnlyFlagUACBool = False): - global gSettingsDict - ############################### - #Tech sub def - do item - ################################ - def URLItemDo(inURLItem,inRequest,inGlobalDict): - global gCacheDict - inResponseDict = inRequest.OpenRPAResponseDict - inResponseDict["Headers"]["Content-type"]= None - #Set status code 200 - inResponseDict["StatusCode"] = 200 - #Content-type - if "ResponseContentType" in inURLItem: - inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"] - #If file path is set - if "ResponseFilePath" in inURLItem: - # Check cache - if inURLItem.get("UseCacheBool",False) == True: - if inURLItem["ResponseFilePath"] in gCacheDict: - # Write content as utf-8 data - inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] +from . import __Orchestrator__ +import mimetypes +mimetypes.add_type("font/woff2",".woff2") +mimetypes.add_type("text/javascript",".js") +from typing import Union + +def InitFastAPI(): + global app + lL = __Orchestrator__.OrchestratorLoggerGet() + __Orchestrator__.GSettingsGet()["ServerDict"]["ServerThread"] = app + ServerSettings.SettingsUpdate() + BCURLUpdate() + +def BCURLUpdate(): + for lConnectItemDict in __Orchestrator__.GSettingsGet()["ServerDict"]["URLList"]: + if "BCBool" not in lConnectItemDict: + if "ResponseFolderPath" in lConnectItemDict: + app.mount(lConnectItemDict["URL"], + StaticFiles(directory=CrossOS.PathStr(lConnectItemDict["ResponseFolderPath"])), + name=lConnectItemDict["URL"].replace('/',"_")) + else: + if lConnectItemDict.get("MatchType") in ["EqualCase", "Equal","EqualNoParam"]: + if lConnectItemDict.get("UACBool",True): + app.add_api_route( + path=lConnectItemDict["URL"], + endpoint=BackwardCompatibityWrapperAuth, + response_class=PlainTextResponse, + methods=[lConnectItemDict["Method"]], + tags=["BackwardCompatibility"] + ) else: - if os.path.exists(inURLItem["ResponseFilePath"]) and os.path.isfile(inURLItem["ResponseFilePath"]): - lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb") - # Write content as utf-8 data - gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read() - inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] - # Закрыть файловый объект - lFileObject.close() - else: inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT - else: - if os.path.exists(inURLItem["ResponseFilePath"]) and os.path.isfile(inURLItem["ResponseFilePath"]): - lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb") - # Write content as utf-8 data - inResponseDict["Body"] = lFileObject.read() - # Закрыть файловый объект - lFileObject.close() - else: inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT - # detect MIME type if none - if inResponseDict["Headers"]["Content-type"] is None: - inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0] - #If function is set - if "ResponseDefRequestGlobal" in inURLItem: - lDef = inURLItem["ResponseDefRequestGlobal"] - lDefSignature = inspect.signature(lDef) - if len(lDefSignature.parameters) == 2: - inURLItem["ResponseDefRequestGlobal"](inRequest, inGlobalDict) - elif len(lDefSignature.parameters) == 1: - inURLItem["ResponseDefRequestGlobal"](inRequest) - else: - inURLItem["ResponseDefRequestGlobal"]() - if "ResponseFolderPath" in inURLItem: - - #lRequestPath = inRequest.path - lRequestPath = urllib.parse.unquote(inRequest.path) - if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings - lFilePathSecondPart = lRequestPath.replace(inURLItem["URL"],"") - lFilePathSecondPart = lFilePathSecondPart.split("?")[0] - lFilePath = CrossOS.PathStr(os.path.join(inURLItem["ResponseFolderPath"],lFilePathSecondPart)) - #print(f"File full path {lFilePath}") - #Check if file exist - if os.path.exists(lFilePath) and os.path.isfile(lFilePath): - # Check cache - if inURLItem.get("UseCacheBool",False) == True: - if lFilePath in gCacheDict: - # Write content as utf-8 data - inResponseDict["Body"] = gCacheDict[lFilePath] - else: - lFileObject = open(lFilePath, "rb") - # Write content as utf-8 data - gCacheDict[lFilePath] = lFileObject.read() - inResponseDict["Body"] = gCacheDict[lFilePath] - # Закрыть файловый объект - lFileObject.close() + app.add_api_route( + path=lConnectItemDict["URL"], + endpoint=BackwardCompatibityWrapperNoAuth, + response_class=PlainTextResponse, + methods=[lConnectItemDict["Method"]], + tags=["BackwardCompatibility"] + ) + elif lConnectItemDict.get("MatchType") in ["BeginWith", "Contains"]: + lURLStr = lConnectItemDict["URL"] + if lURLStr[-1]!="/": lURLStr+="/" + lURLStr+="{inBeginTokenStr}" + if lConnectItemDict.get("UACBool",True): + app.add_api_route( + path=lURLStr, + endpoint=BackwardCompatibityBeginWrapperAuth, + response_class=PlainTextResponse, + methods=[lConnectItemDict["Method"]], + tags=["BackwardCompatibility"] + ) else: - lFileObject = open(lFilePath, "rb") - # Write content as utf-8 data - inResponseDict["Body"] = lFileObject.read() - # Закрыть файловый объект - lFileObject.close() - # detect MIME type if none - if inResponseDict["Headers"]["Content-type"] is None: - inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0] - else: - inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT - # If No content-type - if inResponseDict["Headers"]["Content-type"] is None: - inResponseDict["Headers"]["Content-type"]= "application/octet-stream" - ############################################## - # UAC Check - if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]: - return False - if inURLItem["Method"].upper() == inMethod.upper(): - # check Match type variant: BeginWith - if inURLItem["MatchType"].upper() == "BEGINWITH": - lURLPath = urllib.parse.unquote(self.path) - lURLPath = lURLPath.upper() - if lURLPath.startswith(inURLItem["URL"].upper()): - URLItemDo(inURLItem, self, gSettingsDict) - return True - # check Match type variant: Contains - elif inURLItem["MatchType"].upper() == "CONTAINS": - lURLPath = urllib.parse.unquote(self.path) - lURLPath = lURLPath.upper() - if lURLPath.contains(inURLItem["URL"].upper()): - URLItemDo(inURLItem, self, gSettingsDict) - return True - # check Match type variant: Equal - elif inURLItem["MatchType"].upper() == "EQUAL": - if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper(): - URLItemDo(inURLItem, self, gSettingsDict) - return True - # check Match type variant: EqualNoParam - elif inURLItem["MatchType"].upper() == "EQUALNOPARAM": - if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper().split("?")[0]: - URLItemDo(inURLItem, self, gSettingsDict) - return True - # check Match type variant: EqualCase - elif inURLItem["MatchType"].upper() == "EQUALCASE": - if inURLItem["URL"] == urllib.parse.unquote(self.path): - URLItemDo(inURLItem, self, gSettingsDict) - return True - return False - #ResponseContentTypeFile - def SendResponseContentTypeFile(self, inContentType, inFilePath): - # Send response status code - self.send_response(200) - # Send headers - self.send_header('Content-type', inContentType) - #Check if var exist - if hasattr(self, "OpenRPASetCookie"): - self.send_header("Set-Cookie", f"AuthToken={self.OpenRPA['AuthToken']}") - self.end_headers() - lFileObject = open(inFilePath, "rb") - # Write content as utf-8 data - self.wfile.write(lFileObject.read()) - #Закрыть файловый объект - lFileObject.close() - # ResponseContentTypeFile - def ResponseDictSend(self): - lL = gSettingsDict["Logger"] - inResponseDict = self.OpenRPAResponseDict - # Send response status code - self.send_response(inResponseDict["StatusCode"]) - # Send headers - for lItemKey, lItemValue in inResponseDict["Headers"].items(): - self.send_header(lItemKey, lItemValue) - # Send headers: Set-Cookie - for lItemKey, lItemValue in inResponseDict["SetCookies"].items(): - self.send_header("Set-Cookie", f"{lItemKey}={lItemValue}") - #Close headers section in response - try: - self.end_headers() - # Write content as utf-8 data - self.wfile.write(inResponseDict["Body"]) - except (ConnectionResetError, ConnectionAbortedError) as e: - if lL: lL.warning(f"SERVER: Connection was forcibly closed by the client side - OK for the network interactions (ConnectionResetError: [WinError 10054] or ConnectionAbortedError: [WinError 10053])") + app.add_api_route( + path=lURLStr, + endpoint=BackwardCompatibityBeginWrapperNoAuth, + response_class=PlainTextResponse, + methods=[lConnectItemDict["Method"]], + tags=["BackwardCompatibility"] + ) + lConnectItemDict["BCBool"]=True + +def InitUvicorn(inHostStr=None, inPortInt=None, inSSLCertPathStr=None, inSSLKeyPathStr=None, inSSLPasswordStr=None): + if inHostStr is None: inHostStr="0.0.0.0" + if inPortInt is None: inPortInt=1024 + if inSSLCertPathStr != None: inSSLCertPathStr=CrossOS.PathStr(inSSLCertPathStr) + if inSSLKeyPathStr != None: inSSLKeyPathStr=CrossOS.PathStr(inSSLKeyPathStr) + global app + lL = __Orchestrator__.OrchestratorLoggerGet() + #uvicorn.run('pyOpenRPA.Orchestrator.Server:app', host='0.0.0.0', port=1024) + uvicorn.run(app, host=inHostStr, port=inPortInt,ssl_keyfile=inSSLKeyPathStr,ssl_certfile=inSSLCertPathStr,ssl_keyfile_password=inSSLPasswordStr) + if lL and inSSLKeyPathStr != None: lL.info(f"Сервер инициализирован успешно (с поддержкой SSL):: Слушает URL: {inHostStr}, Слушает порт: {inPortInt}, Путь к файлу сертификата (.pem, base64): {inSSLCertPathStr}") + if lL and inSSLKeyPathStr == None: lL.info(f"Сервер инициализирован успешно (без поддержки SSL):: Слушает URL: {inHostStr}, Слушает порт: {inPortInt}") - def do_GET(self): - try: - global gSettingsDict - #self.timeout=gSettingsDict["ServerDict"]["RequestTimeoutSecFloat"] - self.request.settimeout(gSettingsDict["ServerDict"]["RequestTimeoutSecFloat"]) - threading.current_thread().request = self - self.OpenRPA = {} - self.OpenRPA["AuthToken"] = None - self.OpenRPA["Domain"] = None - self.OpenRPA["User"] = None - self.OpenRPA["DefUserRoleAccessAsk"]=self.UserRoleAccessAsk # Alias for def - self.OpenRPA["DefUserRoleHierarchyGet"]=self.UserRoleHierarchyGet # Alias for def - # Prepare result dict - lResponseDict = {"Headers": {}, "SetCookies": {}, "Body": b"", "StatusCode": None} - self.OpenRPAResponseDict = lResponseDict - ############################ - #First - all with Flag UACBool - ############################ - for lURLItem in gSettingsDict["ServerDict"]["URLList"]: - #Check if all condition are applied - lFlagURLIsApplied=False - lFlagURLIsApplied=self.URLItemCheckDo(inURLItem=lURLItem, inMethod="GET", inOnlyFlagUACBool=True) - if lFlagURLIsApplied: - self.ResponseDictSend() - return - ##################################### - #Do authentication - #Check if authentication is turned on - ##################################### - lFlagAccessUserBlock=False - lAuthenticateDict = {"Domain": "", "User": ""} - if gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False): - lAuthenticateDict = AuthenticateVerify(self) - if not lAuthenticateDict["User"]: - lFlagAccessUserBlock=True - # Logging - # gSettingsDict["Logger"].info(f"HTTP request /. Domain: {lAuthenticateDict['Domain']}, User: {lAuthenticateDict['User']}") - if lFlagAccessUserBlock: - AuthenticateBlock(self) - ##################################### - else: - #Check the user access (if flag) - #################################### - lFlagUserAccess = True - #If need user authentication - if gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False): - lFlagUserAccess = UserAccessCheckBefore("GET", self) - ###################################### - if lFlagUserAccess: - if CrossOS.IS_WINDOWS_BOOL: lOrchestratorFolder = "\\".join(__file__.split("\\")[:-1]) - if CrossOS.IS_LINUX_BOOL: lOrchestratorFolder = "/".join(__file__.split("/")[:-1]) - ############################ - #New server engine (url from global dict (URLList)) - ############################ - for lURLItem in gSettingsDict["ServerDict"]["URLList"]: - #Check if all condition are applied - lFlagURLIsApplied=False - lFlagURLIsApplied=self.URLItemCheckDo(lURLItem, "GET") - if lFlagURLIsApplied: - self.ResponseDictSend() - return - #Monitor - if self.path == '/Monitor/JSONDaemonListGet': - # Send response status code - self.send_response(200) - # Send headers - self.send_header('Content-type','application/json') - self.end_headers() - # Send message back to client - message = json.dumps(gSettingsDict) - # Write content as utf-8 data - self.wfile.write(bytes(message, "utf8")) - #Filemanager function - if self.path.lower().startswith('/filemanager/'): - lFileURL=self.path[13:] - # check if file in FileURL - File Path Mapping Dict - if lFileURL.lower() in gSettingsDict["FileManager"]["FileURLFilePathDict"]: - self.SendResponseContentTypeFile('application/octet-stream', gSettingsDict["FileManager"]["FileURLFilePathDict"][lFileURL]) - else: - #Set access denied code - # Send response status code - self.send_response(403) - # Send headers - self.end_headers() - except BrokenPipeError as e: - lL = gSettingsDict["Logger"] - if lL: lL.warning(f"Сервер (do_GET): Возникла ошибка сети - BrokenPipeError: [Errno 32] Broken pipe. Сервер продолжает работу") - except Exception as e: - lL = gSettingsDict["Logger"] - if lL: lL.exception(f"Сервер (do_GET): Неопознанная ошибка сети - см. текст ошибки. Сервер продолжает работу") - # POST - def do_POST(self): - try: - global gSettingsDict - #self.timeout=gSettingsDict["ServerDict"]["RequestTimeoutSecFloat"] - self.request.settimeout(gSettingsDict["ServerDict"]["RequestTimeoutSecFloat"]) - threading.current_thread().request = self - lL = gSettingsDict["Logger"] - self.OpenRPA = {} - self.OpenRPA["AuthToken"] = None - self.OpenRPA["Domain"] = None - self.OpenRPA["User"] = None - self.OpenRPA["DefUserRoleAccessAsk"]=self.UserRoleAccessAsk # Alias for def - self.OpenRPA["DefUserRoleHierarchyGet"]=self.UserRoleHierarchyGet # Alias for def - # Prepare result dict - #pdb.set_trace() - lResponseDict = {"Headers": {}, "SetCookies":{}, "Body": b"", "StatusCode": None} - self.OpenRPAResponseDict = lResponseDict - ############################ - #First - all with Flag UACBool - ############################ - for lURLItem in gSettingsDict["ServerDict"]["URLList"]: - #Check if all condition are applied - lFlagURLIsApplied=False - lFlagURLIsApplied=self.URLItemCheckDo(inURLItem=lURLItem, inMethod="POST", inOnlyFlagUACBool=True) - if lFlagURLIsApplied: - self.ResponseDictSend() - return - ##################################### - #Do authentication - #Check if authentication is turned on - ##################################### - lFlagAccessUserBlock=False - lAuthenticateDict = {"Domain": "", "User": ""} - lIsSuperToken = False # Is supertoken - if gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False): - lAuthenticateDict = AuthenticateVerify(self) - # Get Flag is supertoken (True|False) - lIsSuperToken = gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(self.OpenRPA["AuthToken"], {}).get("FlagDoNotExpire", False) - if not lAuthenticateDict["User"]: - lFlagAccessUserBlock=True - if lFlagAccessUserBlock: - AuthenticateBlock(self) - ##################################### - else: - #Check the user access (if flag) - #################################### - lFlagUserAccess = True - #If need user authentication - if gSettingsDict.get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False): - lFlagUserAccess = UserAccessCheckBefore("POST", self) - ###################################### - if lFlagUserAccess: - lOrchestratorFolder = "\\".join(__file__.split("\\")[:-1]) - ############################ - #New server engine (url from global dict (URLList)) - ############################ - for lURLItem in gSettingsDict["ServerDict"]["URLList"]: - #Check if all condition are applied - lFlagURLIsApplied=False - lFlagURLIsApplied=self.URLItemCheckDo(lURLItem, "POST") - if lFlagURLIsApplied: - self.ResponseDictSend() - return - #Централизованная функция получения запросов/отправки - if self.path == '/Utils/Processor': - #ReadRequest - lInputObject={} - if self.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(self.headers.get('Content-Length')) - lInputByteArray=self.rfile.read(lInputByteArrayLength) - #Превращение массива байт в объект - lInputObject=json.loads(lInputByteArray.decode('utf8')) - # Send response status code - self.send_response(200) - # Send headers - self.send_header('Content-type','application/json') - self.end_headers() - # Logging info about processor activity if not SuperToken () - if not lIsSuperToken: - lActivityTypeListStr = "" - try: - if type(lInputObject) is list: - for lActivityItem in lInputObject: - lActivityTypeListStr+=f"{lActivityItem['Type']}; " - else: - lActivityTypeListStr += f"{lInputObject['Type']}" - except Exception as e: - lActivityTypeListStr = "Has some error with Activity Type read" - if lL: lL.info(f"Сервер:: !ВНИМАНИЕ! /Utils/Processor через некоторое время перестанет поддерживаться. Используйте /pyOpenRPA/Processor или /pyOpenRPA/ActivityListExecute. Активность поступила от пользователя. Домен: {self.OpenRPA['Domain']}, Логин: {self.OpenRPA['User']}, Тип активности: {lActivityTypeListStr}") - # Send message back to client - message = json.dumps(ProcessorOld.ActivityListOrDict(lInputObject)) - # Write content as utf-8 data - self.wfile.write(bytes(message, "utf8")) - return - else: - #Set access denied code - # Send response status code - self.send_response(403) - # Send headers - self.end_headers() - return - except BrokenPipeError as e: - lL = gSettingsDict["Logger"] - if lL: lL.warning(f"Сервер (do_POST): Возникла ошибка сети - BrokenPipeError: [Errno 32] Broken pipe. Сервер продолжает работу") - except Exception as e: - lL = gSettingsDict["Logger"] - if lL: lL.exception(f"Сервер (do_POST): Неопознанная ошибка сети - см. текст ошибки. Сервер продолжает работу") - #Logging - #!Turn it on to stop print in console - #def log_message(self, format, *args): - # return - - - -class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): - daemon_threads = True - """Handle requests in a separate thread.""" - def finish_request(self, request, client_address): - try: - global gSettingsDict - request.settimeout(gSettingsDict["ServerDict"]["RequestTimeoutSecFloat"]) - # "super" can not be used because BaseServer is not created from object - HTTPServer.finish_request(self, request, client_address) - except ConnectionResetError as e: - lL = gSettingsDict["Logger"] - if lL: lL.warning(f"Сервер (finish_request): Возникла ошибка сети - ConnectionResetError: [Errno 104] Connection reset by peer. Сервер продолжает работу") - except Exception as e: - lL = gSettingsDict["Logger"] - if lL: lL.exception(f"Сервер (finish_request): Неопознанная ошибка сети - см. текст ошибки. Сервер продолжает работу") - -#inGlobalDict -# "JSONConfigurationDict": -import ssl -class RobotDaemonServer(Thread): - def __init__(self,name,inGlobalDict): - Thread.__init__(self) - self.name = name - # Update the global dict - ServerSettings.SettingsUpdate(inGlobalDict) - def run(self): - global gSettingsDict - lL = gSettingsDict.get("Logger",None) - try: - lServerDict = gSettingsDict["ServerDict"]["ListenDict"][self.name] - lAddressStr=lServerDict["AddressStr"] - lPortInt=lServerDict["PortInt"] - lCertFilePathStr = lServerDict["CertFilePEMPathStr"] - lKeyFilePathStr = lServerDict["KeyFilePathStr"] - if lCertFilePathStr == "": lCertFilePathStr = None - if lKeyFilePathStr == "": lKeyFilePathStr = None - # Server settings - # Choose port 8080, for port 80, which is normally used for a http server, you need root access - server_address = (lAddressStr, lPortInt) - #httpd = HTTPServer(server_address, testHTTPServer_RequestHandler) - #httpd.serve_forever() - httpd = ThreadedHTTPServer(server_address, testHTTPServer_RequestHandler) - if lCertFilePathStr is not None: - if lKeyFilePathStr is not None: - httpd.socket = ssl.wrap_socket(httpd.socket, server_side=True, certfile=lCertFilePathStr, keyfile=lKeyFilePathStr) - else: - httpd.socket = ssl.wrap_socket(httpd.socket, server_side=True, certfile=lCertFilePathStr) - if lL: lL.info(f"Сервер инициализирован успешно (с поддержкой SSL):: Наименование: {self.name}, Слушает URL: {lAddressStr}, Слушает порт: {lPortInt}, Путь к файлу сертификата (.pem): {lCertFilePathStr}") - else: - if lL: lL.info(f"Сервер инициализирован успешно (без поддержки SSL):: Наименование: {self.name}, Слушает URL: {lAddressStr}, Слушает порт: {lPortInt}") - #print('Starting server, use to stop') - httpd.serve_forever() - except Exception as e: - if lL: lL.exception(f"Сервер:: Ошибка при инициализации - обратитесь в тех. поддержку pyOpenRPA") diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerBC.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerBC.py new file mode 100644 index 00000000..ff444f18 --- /dev/null +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerBC.py @@ -0,0 +1,424 @@ +import inspect +from pyOpenRPA.Tools import CrossOS +import urllib.parse # decode URL in string +import os #for path operations +from . import __Orchestrator__ +import mimetypes +mimetypes.add_type("font/woff2",".woff2") +mimetypes.add_type("application/javascript",".js") + +# объявление import +from fastapi import FastAPI, Form, Request, HTTPException, Depends, Header, Response, Body + +gCacheDict = {} + + +# Tool to merge complex dictionaries +def __ComplexDictMerge2to1__(in1Dict, in2Dict): + lPathList=None + if lPathList is None: lPathList = [] + for lKeyStr in in2Dict: + if lKeyStr in in1Dict: + if isinstance(in1Dict[lKeyStr], dict) and isinstance(in2Dict[lKeyStr], dict): + __ComplexDictMerge2to1__(in1Dict[lKeyStr], in2Dict[lKeyStr]) + elif in1Dict[lKeyStr] == in2Dict[lKeyStr]: + pass # same leaf value + else: + raise Exception('Conflict at %s' % '.'.join(lPathList + [str(lKeyStr)])) + else: + in1Dict[lKeyStr] = in2Dict[lKeyStr] + return in1Dict + +# Tool to merge complex dictionaries - no exceptions, just overwrite dict 2 in dict 1 +def __ComplexDictMerge2to1Overwrite__(in1Dict, in2Dict): + """ + Merge in2Dict in in1Dict. In conflict override and get value from dict 2 + + :param in1Dict: Source dict. Save the link (structure) + :param in2Dict: New data dict + :return: Merged dict 1 + """ + lPathList=None + if lPathList is None: lPathList = [] + for lKeyStr in in2Dict: + if lKeyStr in in1Dict: + if isinstance(in1Dict[lKeyStr], dict) and isinstance(in2Dict[lKeyStr], dict): + __ComplexDictMerge2to1Overwrite__(in1Dict[lKeyStr], in2Dict[lKeyStr]) + else: + in1Dict[lKeyStr] = in2Dict[lKeyStr] + else: + in1Dict[lKeyStr] = in2Dict[lKeyStr] + return in1Dict + + +def AuthenticateBlock(inRequest): + raise HTTPException(status_code=401, detail="here is the details", headers={'Content-type':'text/html', 'WWW-Authenticate':'Basic'}) + +#Check access before execute the action +#return bool True - go execute, False - dont execute +def UserAccessCheckBefore(inMethod, inRequest): + # Help def - Get access flag from dict + #pdb.set_trace() + def HelpGetFlag(inAccessRuleItem, inRequest, inGlobalDict, inAuthenticateDict): + if "FlagAccess" in inAccessRuleItem: + return inAccessRuleItem["FlagAccess"] + elif "FlagAccessDefRequestGlobalAuthenticate" in inAccessRuleItem: + return inAccessRuleItem["FlagAccessDefRequestGlobalAuthenticate"](inRequest, inGlobalDict, + inAuthenticateDict) + ########################################## + inMethod=inMethod.upper() + #Prepare result false + lResult = False + lAuthToken = inRequest.OpenRPA["AuthToken"] + #go next if user is identified + lUserDict = None + #print(f"lAuthToken: {lAuthToken}") + if lAuthToken: + lUserDict = __Orchestrator__.GSettingsGet()["ServerDict"]["AccessUsers"]["AuthTokensDict"][lAuthToken] + #print(f"lUserDict: {lUserDict}") + #pdb.set_trace() + ######################################## + ######################################## + #Check general before rule (without User domain) + #Check rules + inRuleMatchURLList = __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("RuleMethodMatchURLBeforeList", []) + for lAccessRuleItem in inRuleMatchURLList: + #Go next execution if flag is false + if not lResult: + #Check if Method is identical + if lAccessRuleItem["Method"].upper() == inMethod: + #check Match type variant: BeginWith + if lAccessRuleItem["MatchType"].upper() == "BEGINWITH": + lURLPath = inRequest.path + lURLPath = lURLPath.upper() + if lURLPath.startswith(lAccessRuleItem["URL"].upper()): + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + # check Match type variant: Contains + elif lAccessRuleItem["MatchType"].upper() == "CONTAINS": + lURLPath = inRequest.path + lURLPath = lURLPath.upper() + if lURLPath.contains(lAccessRuleItem["URL"].upper()): + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + # check Match type variant: Equal + elif lAccessRuleItem["MatchType"].upper() == "EQUAL": + if lAccessRuleItem["URL"].upper() == inRequest.path.upper(): + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + # check Match type variant: EqualCase + elif lAccessRuleItem["MatchType"].upper() == "EQUALCASE": + if lAccessRuleItem["URL"] == inRequest.path: + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + ######################################### + ######################################### + #Do check if lResult is false + if not lResult: + #Check access by User Domain + #Check rules to find first appicable + #Check rules + lMethodMatchURLList = __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("RuleDomainUserDict", {}).get((lUserDict["Domain"].upper(), lUserDict["User"].upper()), {}).get("MethodMatchURLBeforeList", []) + if len(lMethodMatchURLList) > 0: + for lAccessRuleItem in lMethodMatchURLList: + #Go next execution if flag is false + if not lResult: + #Check if Method is identical + if lAccessRuleItem["Method"].upper() == inMethod: + #check Match type variant: BeginWith + if lAccessRuleItem["MatchType"].upper() == "BEGINWITH": + lURLPath = inRequest.path + lURLPath = lURLPath.upper() + if lURLPath.startswith(lAccessRuleItem["URL"].upper()): + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + #check Match type variant: Contains + elif lAccessRuleItem["MatchType"].upper() == "CONTAINS": + lURLPath = inRequest.path + lURLPath = lURLPath.upper() + if lURLPath.contains(lAccessRuleItem["URL"].upper()): + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + # check Match type variant: Equal + elif lAccessRuleItem["MatchType"].upper() == "EQUAL": + if lAccessRuleItem["URL"].upper() == inRequest.path.upper(): + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + # check Match type variant: EqualCase + elif lAccessRuleItem["MatchType"].upper() == "EQUALCASE": + if lAccessRuleItem["URL"] == inRequest.path: + lResult = HelpGetFlag(lAccessRuleItem, inRequest, __Orchestrator__.GSettingsGet(), lUserDict) + else: + return True + ##################################### + ##################################### + #Return lResult + return lResult + +class HTTPRequestOld(): + mRequest:Request = None + mResponse:Response = None + OpenRPA: dict = {} + headers={} + + def __init__(self,inRequest,inResponse,inAuthTokenStr): + self.mRequest = inRequest + self.mResponse = inResponse + if inAuthTokenStr != None: + self.OpenRPA = {} + self.OpenRPA["IsSuperToken"] = __Orchestrator__.WebUserIsSuperToken(inAuthTokenStr=inAuthTokenStr) + self.OpenRPA["AuthToken"] = inAuthTokenStr + self.OpenRPA["Domain"] = __Orchestrator__.WebUserDomainGet(inAuthTokenStr=inAuthTokenStr) + self.OpenRPA["User"] = __Orchestrator__.WebUserLoginGet(inAuthTokenStr=inAuthTokenStr) + else: self.OpenRPA = {"IsSuperToken":False, "AuthToken":None, "Domain":None, "User":None} + self.headers=inRequest.headers + + # Def to check User Role access grants + def UACClientCheck(self, inRoleKeyList): # Alias + return self.UserRoleAccessAsk(inRoleKeyList=inRoleKeyList) + def UserRoleAccessAsk(self, inRoleKeyList): + lResult = True # Init flag + lRoleHierarchyDict = self.UserRoleHierarchyGet() # get the Hierarchy + # Try to get value from key list + lKeyValue = lRoleHierarchyDict # Init the base + for lItem in inRoleKeyList: + if type(lKeyValue) is dict: + if lItem in lKeyValue: # Has key + lKeyValue = lKeyValue[lItem] # Get the value and go to the next loop iteration + else: # Else branch - true or false + if len(lKeyValue)>0: # False - if Dict has some elements + lResult = False # Set the False Flag + else: + lResult = True # Set the True flag + break # Stop the loop + else: # Has element with no detalization - return True + lResult = True # Set the flag + break # Close the loop + return lResult # Return the result + + # Def to get hierarchy of the current user roles + # if return {} - all is available + def UserRoleHierarchyGet(self): + try: + lDomainUpperStr = self.OpenRPA["Domain"].upper() + lUserUpperStr = self.OpenRPA["User"].upper() + return __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("RuleDomainUserDict", {}).get((lDomainUpperStr, lUserUpperStr), {}).get("RoleHierarchyAllowedDict", {}) + except Exception as e: + return {} + #Tech def + #return {"headers":[],"body":"","statuscode":111} + def URLItemCheckDo(self, inURLItem, inMethod, inOnlyFlagUACBool = False): + ############################### + #Tech sub def - do item + ################################ + def URLItemDo(inURLItem,inRequest,inGlobalDict): + global gCacheDict + inResponseDict = inRequest.OpenRPAResponseDict + inResponseDict["Headers"]["Content-type"]= None + #Set status code 200 + inResponseDict["StatusCode"] = 200 + #Content-type + if "ResponseContentType" in inURLItem: + inResponseDict["Headers"]["Content-type"] = inURLItem["ResponseContentType"] + #If file path is set + if "ResponseFilePath" in inURLItem: + # Check cache + if inURLItem.get("UseCacheBool",False) == True: + if inURLItem["ResponseFilePath"] in gCacheDict: + # Write content as utf-8 data + inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] + else: + if os.path.exists(inURLItem["ResponseFilePath"]) and os.path.isfile(inURLItem["ResponseFilePath"]): + lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb") + # Write content as utf-8 data + gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read() + inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] + # Закрыть файловый объект + lFileObject.close() + else: inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT + else: + if os.path.exists(inURLItem["ResponseFilePath"]) and os.path.isfile(inURLItem["ResponseFilePath"]): + lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb") + # Write content as utf-8 data + inResponseDict["Body"] = lFileObject.read() + # Закрыть файловый объект + lFileObject.close() + else: inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT + # detect MIME type if none + if inResponseDict["Headers"]["Content-type"] is None: + inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0] + #If function is set + if "ResponseDefRequestGlobal" in inURLItem: + lDef = inURLItem["ResponseDefRequestGlobal"] + lDefSignature = inspect.signature(lDef) + if len(lDefSignature.parameters) == 2: + inURLItem["ResponseDefRequestGlobal"](inRequest, inGlobalDict) + elif len(lDefSignature.parameters) == 1: + inURLItem["ResponseDefRequestGlobal"](inRequest) + else: + inURLItem["ResponseDefRequestGlobal"]() + if "ResponseFolderPath" in inURLItem: + #lRequestPath = inRequest.path + lRequestPath = urllib.parse.unquote(inRequest.path) + if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings + lFilePathSecondPart = lRequestPath.replace(inURLItem["URL"],"") + lFilePathSecondPart = lFilePathSecondPart.split("?")[0] + lFilePath = CrossOS.PathStr(os.path.join(inURLItem["ResponseFolderPath"],lFilePathSecondPart)) + #print(f"File full path {lFilePath}") + #Check if file exist + if os.path.exists(lFilePath) and os.path.isfile(lFilePath): + # Check cache + if inURLItem.get("UseCacheBool",False) == True: + if lFilePath in gCacheDict: + # Write content as utf-8 data + inResponseDict["Body"] = gCacheDict[lFilePath] + else: + lFileObject = open(lFilePath, "rb") + # Write content as utf-8 data + gCacheDict[lFilePath] = lFileObject.read() + inResponseDict["Body"] = gCacheDict[lFilePath] + # Закрыть файловый объект + lFileObject.close() + else: + lFileObject = open(lFilePath, "rb") + # Write content as utf-8 data + inResponseDict["Body"] = lFileObject.read() + # Закрыть файловый объект + lFileObject.close() + # detect MIME type if none + if inResponseDict["Headers"]["Content-type"] is None: + inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0] + else: + inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT + # If No content-type + if inResponseDict["Headers"]["Content-type"] is None: + inResponseDict["Headers"]["Content-type"]= "application/octet-stream" + ############################################## + # UAC Check + if inOnlyFlagUACBool == True and inURLItem.get("UACBool",None) in [None, True]: + return False + if inURLItem["Method"].upper() == inMethod.upper(): + # check Match type variant: BeginWith + if inURLItem["MatchType"].upper() == "BEGINWITH": + lURLPath = urllib.parse.unquote(self.path) + lURLPath = lURLPath.upper() + if lURLPath.startswith(inURLItem["URL"].upper()): + URLItemDo(inURLItem, self, __Orchestrator__.GSettingsGet()) + return True + # check Match type variant: Contains + elif inURLItem["MatchType"].upper() == "CONTAINS": + lURLPath = urllib.parse.unquote(self.path) + lURLPath = lURLPath.upper() + if lURLPath.contains(inURLItem["URL"].upper()): + URLItemDo(inURLItem, self, __Orchestrator__.GSettingsGet()) + return True + # check Match type variant: Equal + elif inURLItem["MatchType"].upper() == "EQUAL": + if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper(): + URLItemDo(inURLItem, self, __Orchestrator__.GSettingsGet()) + return True + # check Match type variant: EqualNoParam + elif inURLItem["MatchType"].upper() == "EQUALNOPARAM": + if inURLItem["URL"].upper() == urllib.parse.unquote(self.path).upper().split("?")[0]: + URLItemDo(inURLItem, self, __Orchestrator__.GSettingsGet()) + return True + # check Match type variant: EqualCase + elif inURLItem["MatchType"].upper() == "EQUALCASE": + if inURLItem["URL"] == urllib.parse.unquote(self.path): + URLItemDo(inURLItem, self, __Orchestrator__.GSettingsGet()) + return True + return False + #ResponseContentTypeFile + def SendResponseContentTypeFile(self, inContentType, inFilePath): + inResponseDict = self.OpenRPAResponseDict + self.mResponse.status_code = 200 + # Send headers + self.mResponse.headers["Content-type"]=inContentType + #Check if var exist + if hasattr(self, "OpenRPASetCookie"): + self.mResponse.set_cookie(key='AuthToken',value=self.OpenRPA['AuthToken']) + lFileObject = open(inFilePath, "rb") + # Write content as utf-8 data + lFileBytes = lFileObject.read() + #Закрыть файловый объект + lFileObject.close() + return lFileBytes + # ResponseContentTypeFile + def ResponseDictSend(self): + inResponseDict = self.OpenRPAResponseDict + self.mResponse.status_code = inResponseDict["StatusCode"] + # Send headers + for lItemKey, lItemValue in inResponseDict["Headers"].items(): + self.mResponse.headers[lItemKey]=lItemValue + # Send headers: Set-Cookie + for lItemKey, lItemValue in inResponseDict["SetCookies"].items(): + self.mResponse.set_cookie(key=lItemKey,value=lItemValue) + self.send_header("Set-Cookie", f"{lItemKey}={lItemValue}") + return inResponseDict["Body"] + + def do_GET(self, inBodyStr): + try: + try: + self.OpenRPA["DefUserRoleAccessAsk"]=self.UserRoleAccessAsk # Alias for def + self.OpenRPA["DefUserRoleHierarchyGet"]=self.UserRoleHierarchyGet # Alias for def + except Exception as e: + pass + # Prepare result dict + lResponseDict = {"Headers": {}, "SetCookies": {}, "Body": b"", "StatusCode": None, "BodyIsText":True} + self.OpenRPAResponseDict = lResponseDict + #Check the user access (if flag, UAC) + #################################### + lFlagUserAccess = True + #If need user authentication + if __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False): + if self.OpenRPA["AuthToken"] != None: + lFlagUserAccess = UserAccessCheckBefore("GET", self) + ###################################### + if lFlagUserAccess: + if CrossOS.IS_WINDOWS_BOOL: lOrchestratorFolder = "\\".join(__file__.split("\\")[:-1]) + if CrossOS.IS_LINUX_BOOL: lOrchestratorFolder = "/".join(__file__.split("/")[:-1]) + ############################ + #New server engine (url from global dict (URLList)) + ############################ + for lURLItem in __Orchestrator__.GSettingsGet()["ServerDict"]["URLList"]: + #Check if all condition are applied + lFlagURLIsApplied=False + lFlagURLIsApplied=self.URLItemCheckDo(lURLItem, "GET") + if lFlagURLIsApplied: + return self.ResponseDictSend() + else: + raise HTTPException(status_code=403, detail="here is the details", headers={}) + except Exception as e: + lL = __Orchestrator__.OrchestratorLoggerGet() + if lL: lL.exception(f"Сервер (do_GET): Неопознанная ошибка сети - см. текст ошибки. Сервер продолжает работу") + # POST + def do_POST(self, inBodyStr): + try: + lL = __Orchestrator__.OrchestratorLoggerGet() + try: + self.OpenRPA["DefUserRoleAccessAsk"]=self.UserRoleAccessAsk # Alias for def + self.OpenRPA["DefUserRoleHierarchyGet"]=self.UserRoleHierarchyGet # Alias for def + except Exception as e: + pass + # Prepare result dict + #pdb.set_trace() + lResponseDict = {"Headers": {}, "SetCookies": {}, "Body": b"", "StatusCode": None, "BodyIsText":True} + self.OpenRPAResponseDict = lResponseDict + #Check the user access (if flag) + #################################### + lFlagUserAccess = True + #If need user authentication + if __Orchestrator__.GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("FlagCredentialsAsk", False): + if self.OpenRPA["AuthToken"] != None: + lFlagUserAccess = UserAccessCheckBefore("POST", self) + ###################################### + if lFlagUserAccess: + lOrchestratorFolder = "\\".join(__file__.split("\\")[:-1]) + ############################ + #New server engine (url from global dict (URLList)) + ############################ + for lURLItem in __Orchestrator__.GSettingsGet()["ServerDict"]["URLList"]: + #Check if all condition are applied + lFlagURLIsApplied=False + lFlagURLIsApplied=self.URLItemCheckDo(lURLItem, "POST") + if lFlagURLIsApplied: + return self.ResponseDictSend() + else: + raise HTTPException(status_code=403, detail="here is the details", headers={}) + except Exception as e: + lL = __Orchestrator__.OrchestratorLoggerGet() + if lL: lL.exception(f"Сервер, обратная совместимость (do_POST): Неопознанная ошибка сети - см. текст ошибки. Сервер продолжает работу") + diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py index cf22e826..448415c9 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/ServerSettings.py @@ -1,6 +1,7 @@ import json, os import copy from . import __Orchestrator__ +from .Server import app,IdentifyAuthorize # FAST API SERVER #ControlPanelDict from pyOpenRPA.Tools import CrossOS if CrossOS.IS_WINDOWS_BOOL: #CrossOS @@ -20,6 +21,16 @@ from ..Tools import Usage from . import BackwardCompatibility # Support old up to 1.2.0 defs from . import Processor from . import SettingsTemplate +from fastapi import FastAPI, Form, Request, HTTPException, Depends, Header, Response, Body +from fastapi.responses import PlainTextResponse, HTMLResponse, FileResponse +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates +from pydantic import BaseModel +import io +from starlette.responses import StreamingResponse +from typing import Union +from fastapi.responses import JSONResponse + # # # # # # # # # # # # # v 1.2.0 Functionallity @@ -118,14 +129,8 @@ def HiddenAgentDictGenerate(inRequest, inGSettings): # Client: mGlobal.pyOpenRPA.ServerDataHashStr # Client: mGlobal.pyOpenRPA.ServerDataDict def pyOpenRPA_ServerData(inRequest,inGSettings): - # Extract the hash value from request - lValueStr = None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) - # Превращение массива байт в объект - lValueStr = (lInputByteArray.decode('utf8')) + lValueStr = inRequest.body # Generate ServerDataDict lFlagDoGenerateBool = True while lFlagDoGenerateBool: @@ -168,12 +173,7 @@ def pyOpenRPA_ServerJSInit(inRequest,inGSettings): # Client: mGlobal.pyOpenRPA.ServerLogList def pyOpenRPA_ServerLog(inRequest,inGSDict): # Extract the hash value from request - lValueStr = None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) - # Превращение массива байт в объект - lValueStr = (lInputByteArray.decode('utf8')) + lValueStr = inRequest.body # Generate ServerDataDict lFlagDoGenerateBool = True while lFlagDoGenerateBool: @@ -193,59 +193,60 @@ def pyOpenRPA_ServerLog(inRequest,inGSDict): inResponseDict["Body"] = bytes(message, "utf8") return lResult -def pyOpenRPA_Screenshot(inRequest,inGlobalDict): +# Get thread list /orpa/threads +@app.get(path="/orpa/client/screenshot-get",response_class=PlainTextResponse,tags=["Client"]) +def pyOpenRPA_Screenshot(): # Get Screenshot def SaveScreenshot(inFilePath): - # grab fullscreen - # Save the entire virtual screen as a PNsG lScreenshot = getScreenAsImage() - lScreenshot.save('Screenshot.png', format='png') - # lScreenshot = ScreenshotSecondScreen.grab_screen() - # save image file - # lScreenshot.save('screenshot.png') + lScreenshot.save('screenshot.png', format='png') # Сохранить файл на диск if CrossOS.IS_WINDOWS_BOOL: - SaveScreenshot("Screenshot.png") - lFileObject = open("Screenshot.png", "rb") + SaveScreenshot("screenshot.png") + lFileObject = open("screenshot.png", "rb") # Write content as utf-8 data - inRequest.OpenRPAResponseDict["Body"] = lFileObject.read() + lImage = lFileObject.read() # Закрыть файловый объект lFileObject.close() else: - pyscreeze._screenshot_linux(imageFilename='Screenshot.png') - lFileObject = open("Screenshot.png", "rb") + pyscreeze._screenshot_linux(imageFilename='screenshot.png') + lFileObject = open("screenshot.png", "rb") # Write content as utf-8 data - inRequest.OpenRPAResponseDict["Body"] = lFileObject.read() + lImage = lFileObject.read() # Закрыть файловый объект lFileObject.close() + return StreamingResponse(io.BytesIO(lImage), media_type="image/png") # Add activity item or activity list to the processor queue # Body is Activity item or Activity List -def pyOpenRPA_Processor(inRequest, inGSettings): - lL = inGSettings["Logger"] +# body inauthtoken JSON +@app.post(path="/orpa/api/processor-queue-add",response_class=JSONResponse,tags=["API"]) +def pyOpenRPA_Processor(inRequest:Request, inAuthTokenStr:str = Depends(IdentifyAuthorize), inBodyStr:str = Body("")): + inGSettings = __Orchestrator__.GSettingsGet() + lL = __Orchestrator__.OrchestratorLoggerGet() # Recieve the data - lValueStr = None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) - # Превращение массива байт в объект - lInput = json.loads(lInputByteArray.decode('utf8')) + lValueStr = inBodyStr + # Превращение массива байт в объект + lInput = json.loads(lValueStr) + lResult=[] # If list - operator plus if type(lInput) is list: # Logging info about processor activity if not SuperToken () - if not __Orchestrator__.WebUserIsSuperToken(inRequest=inRequest, inGSettings=inGSettings): + if not __Orchestrator__.WebUserIsSuperToken(inAuthTokenStr=inAuthTokenStr): lActivityTypeListStr = "" try: for lActivityItem in lInput: lActivityTypeListStr += f"{lActivityItem['Def']}; " except Exception as e: lActivityTypeListStr = "Ошибка чтения типа активности" - lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inRequest=inRequest,inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_Processor") + lHostStr = __Orchestrator__.WebRequestHostGet(inRequest=inRequest) + lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inAuthTokenStr=inAuthTokenStr, inHostStr = lHostStr,inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_Processor") if lL: lL.info(lWebAuditMessageStr) # Separate into 2 lists - sync and async lSyncActvityList = [] lAsyncActivityList = [] for lActivityItem in lInput: + lResult.append(__Orchestrator__.ProcessorActivityItemAppend(inActivityItemDict=lActivityItem)) if lInput.get("ThreadBool", False) == False: lSyncActvityList.append(lActivityItem) else: @@ -259,14 +260,16 @@ def pyOpenRPA_Processor(inRequest, inGSettings): lThread = threading.Thread(target=Processor.ActivityListExecute, kwargs=lActivityItemArgsDict) lThread.start() else: + lResult=__Orchestrator__.ProcessorActivityItemAppend(inActivityItemDict=lInput) # Logging info about processor activity if not SuperToken () - if not __Orchestrator__.WebUserIsSuperToken(inRequest=inRequest, inGSettings=inGSettings): + if not __Orchestrator__.WebUserIsSuperToken(inAuthTokenStr=inAuthTokenStr): lActivityTypeListStr = "" try: lActivityTypeListStr = lInput['Def'] except Exception as e: lActivityTypeListStr = "Ошибка чтения типа активности" - lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inRequest=inRequest,inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_Processor") + lHostStr = __Orchestrator__.WebRequestHostGet(inRequest=inRequest) + lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inAuthTokenStr=inAuthTokenStr, inHostStr = lHostStr, inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_Processor") if lL: lL.info(lWebAuditMessageStr) if lInput.get("ThreadBool",False) == False: # Append in list @@ -275,61 +278,65 @@ def pyOpenRPA_Processor(inRequest, inGSettings): lActivityItemArgsDict = {"inGSettings": inGSettings, "inActivityList": [lInput]} lThread = threading.Thread(target=Processor.ActivityListExecute, kwargs=lActivityItemArgsDict) lThread.start() + return lResult + # Execute activity list -def pyOpenRPA_ActivityListExecute(inRequest, inGSettings): +@app.post(path="/orpa/api/activity-list-execute",response_class=JSONResponse,tags=["API"]) +def pyOpenRPA_ActivityListExecute(inRequest:Request, inAuthTokenStr:str = Depends(IdentifyAuthorize), inBodyStr:str = Body("")): # Recieve the data - lL = inGSettings["Logger"] - lValueStr = None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) - # Превращение массива байт в объект - lInput = json.loads(lInputByteArray.decode('utf8')) + inGSettings = __Orchestrator__.GSettingsGet() + lL = __Orchestrator__.OrchestratorLoggerGet() + lValueStr = inBodyStr + # Превращение массива байт в объект + lInput = json.loads(lValueStr) # If list - operator plus if type(lInput) is list: # Logging info about processor activity if not SuperToken () - if not __Orchestrator__.WebUserIsSuperToken(inRequest=inRequest, inGSettings=inGSettings): + if not __Orchestrator__.WebUserIsSuperToken(inAuthTokenStr=inAuthTokenStr): lActivityTypeListStr = "" try: for lActivityItem in lInput: lActivityTypeListStr += f"{lActivityItem['Def']}; " except Exception as e: lActivityTypeListStr = "Ошибка чтения типа активности" - lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inRequest=inRequest,inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_ActivityListExecute") + lHostStr = __Orchestrator__.WebRequestHostGet(inRequest=inRequest) + lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inAuthTokenStr=inAuthTokenStr, inHostStr = lHostStr,inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_ActivityListExecute") if lL: lL.info(lWebAuditMessageStr) # Execution lResultList = Processor.ActivityListExecute(inGSettings = inGSettings, inActivityList = lInput) - inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lResultList), "utf8") + return lResultList + #inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lResultList), "utf8") else: # Logging info about processor activity if not SuperToken () - if not __Orchestrator__.WebUserIsSuperToken(inRequest=inRequest, inGSettings=inGSettings): + if not __Orchestrator__.WebUserIsSuperToken(inAuthTokenStr=inAuthTokenStr): lActivityTypeListStr = "" try: lActivityTypeListStr = lInput['Def'] except Exception as e: lActivityTypeListStr = "Ошибка чтения типа активности" - lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inRequest=inRequest, + lHostStr = __Orchestrator__.WebRequestHostGet(inRequest=inRequest) + lWebAuditMessageStr = __Orchestrator__.WebAuditMessageCreate(inAuthTokenStr=inAuthTokenStr, inHostStr = lHostStr, inOperationCodeStr=lActivityTypeListStr, inMessageStr="pyOpenRPA_ActivityListExecute") if lL: lL.info(lWebAuditMessageStr) # Execution lResultList = Processor.ActivityListExecute(inGSettings = inGSettings, inActivityList = [lInput]) - inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lResultList[0]), "utf8") + return lResultList + #inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lResultList[0]), "utf8") # See docs in Agent (pyOpenRPA.Agent.O2A) -def pyOpenRPA_Agent_O2A(inRequest, inGSettings): - lL = inGSettings["Logger"] # Alias +@app.post(path="/orpa/agent/o2a",response_class=JSONResponse,tags=["Agent"]) +def pyOpenRPA_Agent_O2A(inRequest:Request, inAuthTokenStr:str = Depends(IdentifyAuthorize), inBodyDict = Body({})): + inGSettings = __Orchestrator__.GSettingsGet() + lL = __Orchestrator__.OrchestratorLoggerGet() lConnectionLifetimeSecFloat = inGSettings["ServerDict"]["AgentConnectionLifetimeSecFloat"] # 300.0 # 5 min * 60 sec 300.0 lActivityItemLifetimeLimitSecFloat = inGSettings["ServerDict"]["AgentActivityLifetimeSecFloat"] lAgentLoopSleepSecFloat = inGSettings["ServerDict"]["AgentLoopSleepSecFloat"] lTimeStartFloat = time.time() # Recieve the data - lValueStr = None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) - # Превращение массива байт в объект - lInput = json.loads(lInputByteArray.decode('utf8')) + #lValueStr = inBodyDict + # Превращение массива байт в объект + lInput = inBodyDict#json.loads(lValueStr) # Check if item is created lAgentDictItemKeyTurple = (lInput["HostNameUpperStr"],lInput["UserUpperStr"]) if lAgentDictItemKeyTurple not in inGSettings["AgentDict"]: @@ -380,12 +387,12 @@ def pyOpenRPA_Agent_O2A(inRequest, inGSettings): for lItemDict in lReturnActivityItemList: if "CreatedByDatetime" in lItemDict: del lItemDict["CreatedByDatetime"] - inRequest.OpenRPAResponseDict["Body"] = bytes(json.dumps(lReturnActivityItemList), "utf8") # Log full version if bytes size is less than limit . else short - lBodyLenInt = len(inRequest.OpenRPAResponseDict["Body"]) + lBodyLenInt = len(lReturnActivityItemList) lAgentLimitLogSizeBytesInt = inGSettings["ServerDict"]["AgentLimitLogSizeBytesInt"] if lL: lL.debug(f"ActivityItem to Agent ({lInput['HostNameUpperStr']}, {lInput['UserUpperStr']}): Item count: {len(lReturnActivityItemList)}, bytes size: {lBodyLenInt}") - lDoLoopBool = False # CLose the connection + lThisAgentDict["ConnectionCountInt"] -= 1 # Connection go to be closed - decrement the connection count + return lReturnActivityItemList else: # Nothing to send - sleep for the next iteration time.sleep(lAgentLoopSleepSecFloat) else: # no queue item - sleep for the next iteration @@ -394,42 +401,43 @@ def pyOpenRPA_Agent_O2A(inRequest, inGSettings): if lL: lL.exception("pyOpenRPA_Agent_O2A Exception!") lThisAgentDict["ConnectionCountInt"] -= 1 # Connection go to be closed - decrement the connection count -def pyOpenRPA_Debugging_HelperDefList(inRequest, inGSettings): +@app.get(path="/orpa/api/helper-def-list/{inTokenStr}",response_class=JSONResponse,tags=["API"]) +def pyOpenRPA_Debugging_HelperDefList(inRequest:Request, inAuthTokenStr:str = Depends(IdentifyAuthorize), inBodyStr:str = Body("")): # Parse query lResultDict = { "success": True, "results": [] } # Get the path - lPathSplitList = __Orchestrator__.WebRequestParsePath(inRequest=inRequest).split('/') + lPathSplitList = inRequest.url.path.split('/') lQueryStr = None if "HelperDefList" != lPathSplitList[-1] and "" != lPathSplitList[-1]: lQueryStr = lPathSplitList[-1] if lQueryStr != "" and lQueryStr is not None: lDefList = __Orchestrator__.ActivityItemHelperDefList(inDefQueryStr=lQueryStr) for lDefStr in lDefList: lResultDict["results"].append({"name": lDefStr, "value": lDefStr, "text": lDefStr}) - __Orchestrator__.WebRequestResponseSend(inRequest=inRequest, inResponeStr=json.dumps(lResultDict)) + return lResultDict -def pyOpenRPA_Debugging_HelperDefAutofill(inRequest, inGSettings): +@app.get(path="/orpa/api/helper-def-autofill/{inTokenStr}",response_class=JSONResponse,tags=["API"]) +def pyOpenRPA_Debugging_HelperDefAutofill(inRequest:Request, inAuthTokenStr:str = Depends(IdentifyAuthorize), inBodyStr:str = Body("")): # Parse query # Get the path - lPathSplitList = __Orchestrator__.WebRequestParsePath(inRequest=inRequest).split('/') + lPathSplitList = inRequest.url.path.split('/') lQueryStr = None if "HelperDefAutofill" != lPathSplitList[-1] and "" != lPathSplitList[-1]: lQueryStr = lPathSplitList[-1] lResultDict = __Orchestrator__.ActivityItemHelperDefAutofill(inDef = lQueryStr) - __Orchestrator__.WebRequestResponseSend(inRequest=inRequest, inResponeStr=json.dumps(lResultDict)) + return lResultDict # See docs in Agent (pyOpenRPA.Agent.A2O) -def pyOpenRPA_Agent_A2O(inRequest, inGSettings): - lL = inGSettings["Logger"] +@app.post(path="/orpa/agent/a2o",response_class=JSONResponse,tags=["Agent"]) +def pyOpenRPA_Agent_A2O(inRequest:Request, inAuthTokenStr:str = Depends(IdentifyAuthorize), inBodyDict = Body({})): + inGSettings = __Orchestrator__.GSettingsGet() + lL = __Orchestrator__.OrchestratorLoggerGet() # Recieve the data - lValueStr = None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lInputByteArray = inRequest.rfile.read(lInputByteArrayLength) - # Превращение массива байт в объект - lInput = json.loads(lInputByteArray.decode('utf8')) - lAgentDictItemKeyTurple = (lInput["HostNameUpperStr"], lInput["UserUpperStr"]) + #lValueStr = inBodyStr + # Превращение массива байт в объект + lInput = inBodyDict#json.loads(lValueStr) + lAgentDictItemKeyTurple = (lInput["HostNameUpperStr"], lInput["UserUpperStr"]) if "LogList" in lInput: for lLogItemStr in lInput["LogList"]: inGSettings["Logger"].info(lLogItemStr) @@ -460,14 +468,14 @@ def pyOpenRPA_Agent_A2O(inRequest, inGSettings): from pyOpenRPA.Utils.Render import Render lFileStr = CrossOS.PathJoinList(CrossOS.PathSplitList(__file__)[:-2] + ["Resources","Web","orpa","orc.xhtml"]) gRender = Render(inTemplatePathStr=lFileStr,inTemplateRefreshBool=True) - +from pyOpenRPA import __version__ def pyOpenRPA_Index(): # Пример использования global gRender - lStr = gRender.Generate(inDataDict={"title":"ОРКЕСТРАТОР PYOPENRPA", "subtitle":"ПАНЕЛЬ УПРАВЛЕНИЯ"}) + lStr = gRender.Generate(inDataDict={"title":"ОРКЕСТРАТОР PYOPENRPA", "subtitle":"ПАНЕЛЬ УПРАВЛЕНИЯ", "version":__version__}) __Orchestrator__.WebRequestResponseSend(inResponeStr=lStr,inContentTypeStr="text/html") -def SettingsUpdate(inGlobalConfiguration): +def SettingsUpdate(): import os import pyOpenRPA.Orchestrator gSettingsDict = __Orchestrator__.GSettingsGet() @@ -487,32 +495,36 @@ def SettingsUpdate(inGlobalConfiguration): #Orchestrator basic dependencies # Index page in server.py because of special settings {"Method":"GET", "URL": gSettingsDict["ServerDict"]["URLIndexStr"],"MatchType": "EqualNoParam", "ResponseDefRequestGlobal": pyOpenRPA_Index}, {"Method":"GET", "URL": "/metadata.json", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\orpa\\metadata.json"), "ResponseContentType": "application/json"}, - {"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"}, - {"Method":"GET", "URL": "/orpa/Resources/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources"),"UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css", "UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/3rdParty/Google/LatoItalic.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Google\\LatoItalic.css"), "ResponseContentType": "font/css", "UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2"), "ResponseContentType": "font/woff2", "UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/themes/default/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default"),"UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\favicon.ico"), "ResponseContentType": "image/x-icon", "UACBool":False, "UseCacheBool": True}, - {"Method":"GET", "URL": "/3rdParty/Handlebars/handlebars-v4.1.2.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Handlebars\\handlebars-v4.1.2.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, - {"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"}, - {"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"}, - {"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png", "UACBool":False, "UseCacheBool": True}, - {"Method": "POST", "URL": "/Orchestrator/UserRoleHierarchyGet", "MatchType": "Equal","ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_UserRoleHierarchyGet, "ResponseContentType": "application/json"}, + #{"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"}, + {"Method":"GET", "URL": "/orpa/resources/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources"),"UACBool":False, "UseCacheBool": True}, + {"Method":"GET", "URL": "/orpa/client/resources/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "Web"),"UACBool":False, "UseCacheBool": True}, + + #{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css", "UACBool":False, "UseCacheBool": True}, + #{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, + #{"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, + #{"Method":"GET", "URL": "/3rdParty/Google/LatoItalic.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Google\\LatoItalic.css"), "ResponseContentType": "font/css", "UACBool":False, "UseCacheBool": True}, + #{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/themes/default/assets/fonts/icons.woff2", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default\\assets\\fonts\\icons.woff2"), "ResponseContentType": "font/woff2", "UACBool":False, "UseCacheBool": True}, + #{"Method":"GET", "URL": "/themes/default/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\themes\\default"),"UACBool":False, "UseCacheBool": True}, + {"Method":"GET", "URL": "/favicon.ico", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\orpa\\favicon.ico"), "ResponseContentType": "image/x-icon", "UACBool":False, "UseCacheBool": True}, + #{"Method":"GET", "URL": "/3rdParty/Handlebars/handlebars-v4.1.2.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Handlebars\\handlebars-v4.1.2.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, + #{"Method": "GET", "URL": "/Monitor/ControlPanelDictGet", "MatchType": "Equal", "ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_Monitor_ControlPanelDictGet_SessionCheckInit, "ResponseContentType": "application/json"}, + #{"Method": "GET", "URL": "/GetScreenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"}, + #{"Method": "GET", "URL": "/pyOpenRPA_logo.png", "MatchType": "Equal", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\pyOpenRPA_logo.png"), "ResponseContentType": "image/png", "UACBool":False, "UseCacheBool": True}, + {"Method": "POST", "URL": "/orpa/client/user-role-hierarchy-get", "MatchType": "Equal","ResponseDefRequestGlobal": BackwardCompatibility.v1_2_0_UserRoleHierarchyGet, "ResponseContentType": "application/json"}, # New way of the v.1.2.0 functionallity (all defs by the URL from /pyOpenRPA/...) - {"Method": "POST", "URL": "/pyOpenRPA/ServerData", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"}, - {"Method": "GET", "URL": "/pyOpenRPA/ServerJSInit", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerJSInit, "ResponseContentType": "application/javascript"}, - {"Method": "POST", "URL": "/pyOpenRPA/ServerLog", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerLog, "ResponseContentType": "application/json"}, - {"Method": "GET", "URL": "/pyOpenRPA/Screenshot", "MatchType": "BeginWith", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"}, - {"Method": "POST", "URL": "/pyOpenRPA/ProcessorQueueAdd", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Processor, "ResponseContentType": "application/json"}, - {"Method": "POST", "URL": "/pyOpenRPA/ActivityListExecute", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ActivityListExecute, "ResponseContentType": "application/json"}, - {"Method": "POST", "URL": "/pyOpenRPA/Agent/O2A", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Agent_O2A, "ResponseContentType": "application/json"}, - {"Method": "POST", "URL": "/pyOpenRPA/Agent/A2O", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Agent_A2O, "ResponseContentType": "application/json"}, - {"Method": "GET", "URL": "/pyOpenRPA/Debugging/HelperDefList/", "MatchType": "BeginWith","ResponseDefRequestGlobal": pyOpenRPA_Debugging_HelperDefList, "ResponseContentType": "application/json"}, - {"Method": "GET", "URL": "/pyOpenRPA/Debugging/HelperDefAutofill/", "MatchType": "BeginWith","ResponseDefRequestGlobal": pyOpenRPA_Debugging_HelperDefAutofill, "ResponseContentType": "application/json"}, + {"Method": "POST", "URL": "/orpa/client/server-data", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerData, "ResponseContentType": "application/json"}, + {"Method": "GET", "URL": "/orpa/client/server-js-init", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerJSInit, "ResponseContentType": "application/javascript"}, + {"Method": "POST", "URL": "/orpa/client/server-log", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ServerLog, "ResponseContentType": "application/json"}, + #{"Method": "GET", "URL": "/orpa/client/screenshot-get", "MatchType": "Equal", "ResponseDefRequestGlobal": pyOpenRPA_Screenshot, "ResponseContentType": "image/png"}, + # API + #{"Method": "POST", "URL": "/orpa/api/processor-queue-add", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Processor, "ResponseContentType": "application/json"}, + #{"Method": "POST", "URL": "/orpa/api/activity-list-execute", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_ActivityListExecute, "ResponseContentType": "application/json"}, + #{"Method": "GET", "URL": "/orpa/api/helper-def-list/", "MatchType": "BeginWith","ResponseDefRequestGlobal": pyOpenRPA_Debugging_HelperDefList, "ResponseContentType": "application/json"}, + #{"Method": "GET", "URL": "/orpa/api/helper-def-autofill/", "MatchType": "BeginWith","ResponseDefRequestGlobal": pyOpenRPA_Debugging_HelperDefAutofill, "ResponseContentType": "application/json"}, + # AGENT + #{"Method": "POST", "URL": "/orpa/agent/o2a", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Agent_O2A, "ResponseContentType": "application/json"}, + #{"Method": "POST", "URL": "/orpa/agent/a2o", "MatchType": "Equal","ResponseDefRequestGlobal": pyOpenRPA_Agent_A2O, "ResponseContentType": "application/json"} ] Usage.Process(inComponentStr="Orchestrator") - inGlobalConfiguration["ServerDict"]["URLList"]=inGlobalConfiguration["ServerDict"]["URLList"]+lURLList - return inGlobalConfiguration + gSettingsDict["ServerDict"]["URLList"]=gSettingsDict["ServerDict"]["URLList"]+lURLList + return gSettingsDict diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.js b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.js deleted file mode 100755 index 07fe9ab2..00000000 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.js +++ /dev/null @@ -1,992 +0,0 @@ -var mGlobal={} -mGlobal.pyOpenRPA = {} -window.onload=function() { - //document.cookie = "SessionGUIDStr=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; - //Render existing data - //mGlobal.Monitor.fControlPanelRefresh_TechnicalRender() -} -$(document).ready(function() { - document.cookie = "SessionGUIDStr=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; - console.log("Cookie is deleted") - // fix main menu to page on passing - $('.main.menu').visibility({ - type: 'fixed' - }); - $('.overlay').visibility({ - type: 'fixed', - offset: 80 - }); - - // lazy load images - $('.image').visibility({ - type: 'image', - transition: 'vertical flip in', - duration: 500 - }); - - // show dropdown on hover - $('.main.menu .ui.dropdown').dropdown({ - on: 'hover' - }); - function clone(obj) { - var copy; - - // Handle the 3 simple types, and null or undefined - if (null == obj || "object" != typeof obj) return obj; - - // Handle Date - if (obj instanceof Date) { - copy = new Date(); - copy.setTime(obj.getTime()); - return copy; - } - - // Handle Array - if (obj instanceof Array) { - copy = []; - for (var i = 0, len = obj.length; i < len; i++) { - copy[i] = clone(obj[i]); - } - return copy; - } - - // Handle Object - if (obj instanceof Object) { - copy = {}; - for (var attr in obj) { - if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); - } - return copy; - } - throw new Error("Unable to copy obj! Its type isn't supported."); - } - //For data storage key - mGlobal["DataStorage"] = {} - // Clear the session cookie - - String.prototype.replaceAll = function(search, replace){ - return this.split(search).join(replace); - } - mGlobal.GeneralGenerateHTMLCodeHandlebars=function(inInnerTemplateSelector,inData) { - lHTMLTemplate=$(inInnerTemplateSelector)[0].innerHTML - //console.log(lHTMLTemplate) - //Компиляция - var template = Handlebars.compile(lHTMLTemplate); - //Вставка данных - var lHTMLResult = template(inData); - return lHTMLResult - } - mGlobal.GeneralGenerateHTMLCode=function(inTemplateHTMLSelector,inItemDictionary,inKeywordPrefix="::",inKeywordPostfix="::") { - ///Получить заготовку - lTemplateHTMLCode=$(inTemplateHTMLSelector)[0].outerHTML - ///Определить ключь экранирования специальных ключевых слов - ///Выполнить циклические замены, если там есть пожходящие ключи - lResultHTMLCode=lTemplateHTMLCode - for(var lKey in inItemDictionary) { - lHTMLKey=inKeywordPrefix+lKey+inKeywordPostfix; - lResultHTMLCode=lResultHTMLCode.replaceAll(lHTMLKey,inItemDictionary[lKey]) - } - ///Вернуть результат - return lResultHTMLCode - } - ////////////////////////// - /////Info JS module - ////////////////////////// - mGlobal.Info={}; - - mGlobal.Info.TableActivityLogScheduleListRefresh=function() { - - } - ////////////////////////// - /////Controller JS module - ////////////////////////// - mGlobal.Controller={}; - - mGlobal.Controller.CMDRunText=function(inCMDText) { - ///Подготовить конфигурацию - lData = [ - {"Type":"CMDStart", "Command": inCMDText} - ] - ///Обнулить таблицу - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3){}, - dataType: "text" - }); - } - mGlobal.Controller.CMDRun=function() { - ///Обнулить таблицу - lCMDCode=$(".openrpa-controller-cmd-run-input")[0].value - ///Подготовить конфигурацию - lData = [ - { - "Def":"OSCMD", // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - "ArgList":[], // Args list - "ArgDict":{"inCMDStr":lCMDCode,"inRunAsyncBool":false}, // Args dictionary - "ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - "ArgLogger": "inLogger" // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - } - ] - $.ajax({ - type: "POST", - url: '/pyOpenRPA/ActivityListExecute', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///Отправить запрос на формирование таблицы - //lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result) - }, - dataType: "text" - }); - } - mGlobal.Controller.CMDRunGUILogout=function() { - ///Обнулить таблицу - lCMDCode="for /f \"skip=1 tokens=2\" %s in ('query user %USERNAME%') do (tscon \\dest:console)" - //lCMDCode = lCMDCode.replace(/\\n/g, "\\n") - // .replace(/\\'/g, "\\'") - // .replace(/\\"/g, '\\"') - // .replace(/\\&/g, "\\&") - // .replace(/\\r/g, "\\r") - // .replace(/\\t/g, "\\t") - // .replace(/\\b/g, "\\b") - // .replace(/\\f/g, "\\f") - // .replace('"', "\\\""); - ///Подготовить конфигурацию - lData = [ - {"Type":"CMDStart", "Command": lCMDCode } - ] - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///Отправить запрос на формирование таблицы - //lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result) - }, - dataType: "text" - }); - } - ///Restart PC - mGlobal.Controller.PCRestart = function () { - mGlobal.Controller.OrchestratorSessionSave() - mGlobal.Controller.CMDRunText("shutdown -r") - } - ///Orchestrator save session - mGlobal.Controller.OrchestratorSessionSave=function() { - ///Подготовить конфигурацию - lData = [ - {"Type":"OrchestratorSessionSave"} - ] - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - }, - dataType: "text" - }); - } - ///Перезагрузить Orchestrator - mGlobal.Controller.OrchestratorRestart=function() { - ///Подготовить конфигурацию - lData = [ - {"Type":"OrchestratorRestart"} - ] - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - }, - dataType: "text" - }); - } - mGlobal.Controller.OrchestratorGITPullRestart = function() { - mGlobal.Controller.OrchestratorSessionSave() //Save current RDP list session - mGlobal.Controller.CMDRunText("timeout 3 & taskkill /f /im OpenRPA_Orchestrator.exe & timeout 2 & cd "+mGlobal.WorkingDirectoryPathStr+" & git reset --hard & git pull & pyOpenRPA.Orchestrator_x64_administrator_startup.cmd"); - } - ////////////////////////// - /////Monitor JS module - ////////////////////////// - mGlobal.Monitor={}; - mGlobal.Monitor.ScreenshotModal={}; - mGlobal.Monitor.GenerateUniqueID=function(inPrefix="tempUID=") { - return inPrefix+Math.round(Math.random()*1000)+"-"+Math.round(Math.random()*10000)+"-"+Math.round(Math.random()*1000) - } - //inHostURI: http://localhost:8081 - mGlobal.Monitor.ScreenshotModal.Show=function(inHostURI=" ") { - $('.ui.modal.daemon-screenshot').modal({'onHide':function (inElement) {mGlobal.Monitor.ScreenshotModal.Close();} }).modal('show'); - - //Функция обновления картинки - lScreenshotUpdate=function() { - lScreenshotSrc=inHostURI+"/GetScreenshot?"+mGlobal.Monitor.GenerateUniqueID() - $(".daemon-screenshot img").attr('src', lScreenshotSrc); - } - - mGlobal.Monitor.ScreenshotModal.timerId=setInterval(lScreenshotUpdate,1500) - } - mGlobal.Monitor.ScreenshotModal.Close=function() { - clearInterval(mGlobal.Monitor.ScreenshotModal.timerId); - } - ///Monitor - mGlobal.Monitor.DaemonList={} - mGlobal.Monitor.DaemonList.fRefreshTable=function() { - ///Загрузка данных - $.ajax({ - type: "GET", - url: 'Monitor/JSONDaemonListGet', - data: '', - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///Сформировать HTML код новой таблицы - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-monitor-table-general",lResponseJSON) - ///Очистить дерево - //mGlobal.ElementTree.fClear(); - ///Прогрузить новую таблицу - $(".openrpa-monitor").html(lHTMLCode) - }, - dataType: "text" - }); - } - //////////////////////////////// - ///////Control panel - /////////////////////////////// - ///Refresh control panel - function sleep(ms) { - ms += new Date().getTime(); - while (new Date() < ms){} - } - function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - } - mGlobal.SessionGUIDStr = uuidv4() // Generate uuid4 of the session - //console.log(uuidv4()); - mGlobal.RobotRDPActive = {} - mGlobal.Monitor.fControlPanelRefresh_TechnicalRender = function() - { - lResponseJSON = mGlobal.Monitor.mDatasetLast - - if (lResponseJSON!= null) { - /// New version of control panels - for (var lKeyStr in lResponseJSON){ - if (lKeyStr != "RenderRobotList") { /// Check if not "RenderRobotList" - lCPDict = lResponseJSON[lKeyStr] - /// Render HTML - if ("HTMLStr" in lCPDict) { - - } - } - } - - - /// v1.2.0 Backward compatibility - support old control panels - if ("RenderRobotList" in lResponseJSON) { - ///Escape onclick - /// RenderRobotList - lResponseJSON["RenderRobotList"].forEach( - function(lItem){ - if ('FooterButtonX2List' in lItem) { - /// FooterButtonX2List - lItem["FooterButtonX2List"].forEach( - function(lItem2){ - if ('OnClick' in lItem) { - lOnClickEscaped = lItem["OnClick"]; - lOnClickEscaped = lOnClickEscaped.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); - lItem["OnClick"] = lOnClickEscaped; - } - } - ); - /// FooterButtonX1List - lItem["FooterButtonX1List"].forEach( - function(lItem2){ - if ('OnClick' in lItem) { - lOnClickEscaped = lItem["OnClick"]; - lOnClickEscaped = lOnClickEscaped.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); - lItem["OnClick"] = lOnClickEscaped; - } - } - ); - } - } - ); - ////////////////////////////////////////////////////////// - ///Сформировать HTML код новой таблицы - контрольная панель - lHTMLCode+=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-control-panel",lResponseJSON) - //Присвоить ответ в mGlobal.Monitor.mResponseList - mGlobal.Monitor.mResponseList = lResponseJSON - ///Set result in mGlobal.DataStorage - lResponseJSON["RenderRobotList"].forEach( - function(lItem){ - if ('DataStorageKey' in lItem) { - mGlobal["DataStorage"][lItem['DataStorageKey']]=lItem - } - } - ) - ///Прогрузить новую таблицу - $(".openrpa-control-panel").html(lHTMLCode) - //////////////////////////////////////////////////// - /// !RDP List ! Сформировать HTML код новой таблицы - список RDP - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-robotrdpactive-control-panel",lResponseJSON) - //Присвоить ответ в mGlobal.RobotRDPActive.mResponseList - mGlobal.RobotRDPActive.mResponseList = lResponseJSON - ///Прогрузить новую таблицу - $(".openrpa-robotrdpactive-control-panel").html(lHTMLCode) - ///Очистить дерево - //mGlobal.ElementTree.fClear(); - //////////////////////////////////////////////////// - /// !UserAgent List ! Сформировать HTML код новой таблицы - список RDP - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".pyOpenRPA-Agent-ListTemplate",lResponseJSON) - //Присвоить ответ в mGlobal.RobotRDPActive.mResponseList - mGlobal.RobotRDPActive.mResponseList = lResponseJSON - ///Прогрузить новую таблицу - $(".pyOpenRPA-Agent-List").html(lHTMLCode) - ///Очистить дерево - //mGlobal.ElementTree.fClear(); - } - } - } - - ///v 1.2.0 pyOpenRPA - /// Execute ActivityItem - mGlobal.pyOpenRPA.ActivityItemExecute=function(inActivityItem) { - ///EXAMPLE - // { - // "Def":"OSCMD", // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - // "ArgList":[], // Args list - // "ArgDict":{"inCMDStr":lCMDCode,"inRunAsyncBool":false}, // Args dictionary - // "ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // "ArgLogger": "inLogger" // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // } - ///Подготовить конфигурацию - lData = [inActivityItem] - $.ajax({ - type: "POST", - url: '/pyOpenRPA/ActivityListExecute', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - console.log(lResponseJSON) - }, - dataType: "text" - }); - } - /// Execute ActivityList - mGlobal.pyOpenRPA.ActivityListExecute=function(inActivityList) { - ///EXAMPLE - // [{ - // "Def":"OSCMD", // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - // "ArgList":[], // Args list - // "ArgDict":{"inCMDStr":lCMDCode,"inRunAsyncBool":false}, // Args dictionary - // "ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // "ArgLogger": "inLogger" // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // }] - ///Подготовить конфигурацию - lData = inActivityList - $.ajax({ - type: "POST", - url: '/pyOpenRPA/ActivityListExecute', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - console.log(lResponseJSON) - }, - dataType: "text" - }); - } - /// Add ActivityList in processor queue - mGlobal.pyOpenRPA.ProcessorQueueAdd=function(inActivityList) { - ///EXAMPLE - // [{ - // "Def":"OSCMD", // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - // "ArgList":[], // Args list - // "ArgDict":{"inCMDStr":lCMDCode,"inRunAsyncBool":false}, // Args dictionary - // "ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // "ArgLogger": "inLogger" // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // }] - ///Подготовить конфигурацию - lData = inActivityList - $.ajax({ - type: "POST", - url: '/pyOpenRPA/ProcessorQueueAdd', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - console.log(lResponseJSON) - }, - dataType: "text" - }); - } - - /// v1.2.0 pyOpenRPA ServerJSInit - mGlobal.pyOpenRPA.ServerJSInitDef=function() { - try { - $.ajax({ - type: "GET", - headers: {}, - url: 'pyOpenRPA/ServerJSInit', - data: mGlobal.pyOpenRPA.ServerDataHashStr, - async: false, - success: function(lJSText) { - try { - eval(lJSText) - } - catch(error) { - console.log(error) - } - }, - dataType: "text", - error: function(jqXHR, textStatus, errorThrown ) { - console.log(textStatus) - } - }); - } - catch(error) { - console.log(error) - } - } - - /// v1.2.0 pyOpenRPA ServerData - mGlobal.pyOpenRPA.ServerDataDict = null - mGlobal.pyOpenRPA.ServerDataHashStr = "" - mGlobal.pyOpenRPA.ServerDataRefreshDef_TechnicalRender = function() - { - lResponseJSON = mGlobal.pyOpenRPA.ServerDataDict - if (lResponseJSON!= null) { - /// New version of control panels - lHTMLCode = '
' - for (var lKeyStr in lResponseJSON["CPDict"]){ - lCPDict = lResponseJSON["CPDict"][lKeyStr] - /// Render HTML - if ("HTMLStr" in lCPDict) { - lHTMLCode+=lCPDict["HTMLStr"] - } - } - lHTMLCode += '
' - ///Прогрузить новую таблицу - $(".openrpa-control-panel").html(lHTMLCode) - //////////////////////////////////////////////////// - /// !RDP List ! Сформировать HTML код новой таблицы - список RDP - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-robotrdpactive-control-panel",lResponseJSON["RDPDict"]) - //Присвоить ответ в mGlobal.RobotRDPActive.mResponseList - mGlobal.RobotRDPActive.mResponseList = lResponseJSON["RDPDict"] - ///Прогрузить новую таблицу - $(".openrpa-robotrdpactive-control-panel").html(lHTMLCode) - ///Очистить дерево - //mGlobal.ElementTree.fClear(); - //////////////////////////////////////////////////// - /// !UserAgent List ! Сформировать HTML код новой таблицы - список RDP - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".pyOpenRPA-Agent-ListTemplate",lResponseJSON["AgentDict"]) - ///Прогрузить новую таблицу - $(".pyOpenRPA-Agent-List").html(lHTMLCode) - ///Очистить дерево - //mGlobal.ElementTree.fClear(); - } - } - mGlobal.pyOpenRPA.ServerDataRefreshDef=function() { - try { - $.ajax({ - type: "POST", - headers: {}, - url: 'pyOpenRPA/ServerData', - data: mGlobal.pyOpenRPA.ServerDataHashStr, - success: function(lData,l2,l3) { - try { - var lResponseJSON=JSON.parse(lData) - mGlobal.VersionStr = lResponseJSON["ServerDataDict"]["UserDict"]["VersionStr"] - mGlobal.pyOpenRPA.ServerDataDict = lResponseJSON["ServerDataDict"] - mGlobal.pyOpenRPA.ServerDataHashStr = lResponseJSON["HashStr"] - mGlobal.pyOpenRPA.ServerDataRefreshDef_TechnicalRender() - mGlobal.UserRoleUpdate(); - setTimeout(mGlobal.pyOpenRPA.ServerDataRefreshDef,600) // If LOGS are update every ms - set some limit in ms on the client side - //mGlobal.pyOpenRPA.ServerDataRefreshDef() // Go to the next call - } - catch(error) { - console.log(error) - setTimeout(mGlobal.pyOpenRPA.ServerDataRefreshDef,3000) - } - //mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive - }, - dataType: "text", - error: function(jqXHR, textStatus, errorThrown ) { - setTimeout(mGlobal.pyOpenRPA.ServerDataRefreshDef,3000) - //sleep(3000) - //mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive - } - }); - } - catch(error) { - setTimeout(mGlobal.pyOpenRPA.ServerDataRefreshDef,3000) - //sleep(3000) - //mGlobal.pyOpenRPA.ServerDataRefreshDef() // recursive - } - } - ///////////////////////////////////////////////////////////// - /// v1.2.0 pyOpenRPA ServerLogs - mGlobal.pyOpenRPA.ServerLogList = null - mGlobal.pyOpenRPA.ServerLogListHashStr = "" - mGlobal.pyOpenRPA.ServerLogListDoRenderBool = true - ///Turn OFF rendering - mGlobal.pyOpenRPA.ServerLogListDoRenderFalse = function() { - ///Set unfreeze button - $("a.mGlobal-pyOpenRPA-ServerLogListDoRender").html("Unfreeze textarea") - $("a.mGlobal-pyOpenRPA-ServerLogListDoRender").attr("onclick","mGlobal.pyOpenRPA.ServerLogListDoRenderTrue()") - $("textarea.mGlobal-pyOpenRPA-ServerLogList").css("background-color","#b9e2e8") - mGlobal.pyOpenRPA.ServerLogListDoRenderBool = false - } - ///Turn ON rendering - mGlobal.pyOpenRPA.ServerLogListDoRenderTrue = function() { - mGlobal.pyOpenRPA.ServerLogListDoRenderBool = true - ///Render last data - mGlobal.pyOpenRPA.ServerLogListRefreshDef_TechnicalRender() - ///Set unfreeze button - $("a.mGlobal-pyOpenRPA-ServerLogListDoRender").html("Freeze textarea") - $("a.mGlobal-pyOpenRPA-ServerLogListDoRender").attr("onclick","mGlobal.pyOpenRPA.ServerLogListDoRenderFalse()") - $("textarea.mGlobal-pyOpenRPA-ServerLogList").css("background-color","") - - } - mGlobal.pyOpenRPA.ServerLogListScrollBottomDef = function() { - var lTA = $("textarea.mGlobal-pyOpenRPA-ServerLogList")[0]; - lTA.scrollTop = lTA.scrollHeight; - } - mGlobal.pyOpenRPA.ServerLogListRefreshDef_TechnicalRender = function() - { - lResponseJSON = mGlobal.pyOpenRPA.ServerLogList - if (lResponseJSON!= null && mGlobal.pyOpenRPA.ServerLogListDoRenderBool==true) { - lText = lResponseJSON.join("\n") /// Code for the processing the text - $("textarea.mGlobal-pyOpenRPA-ServerLogList")[0].value= lText ///Прогрузить новую таблицу - mGlobal.pyOpenRPA.ServerLogListScrollBottomDef() //Scroll to the bottom - } - } - mGlobal.pyOpenRPA.ServerLogListRefreshDef=function() { - try { - $.ajax({ - type: "POST", - headers: {}, - url: 'pyOpenRPA/ServerLog', - data: mGlobal.pyOpenRPA.ServerLogListHashStr, - success: function(lData,l2,l3) { - try { - var lResponseJSON=JSON.parse(lData) - mGlobal.pyOpenRPA.ServerLogList = lResponseJSON["ServerLogList"] - mGlobal.pyOpenRPA.ServerLogListHashStr = lResponseJSON["HashStr"] - mGlobal.pyOpenRPA.ServerLogListRefreshDef_TechnicalRender() - } - catch(error) { - } - setTimeout(mGlobal.pyOpenRPA.ServerLogListRefreshDef,600) // If LOGS are update every ms - set some limit in ms on the client side - //mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive - }, - dataType: "text", - error: function(jqXHR, textStatus, errorThrown ) { - setTimeout(mGlobal.pyOpenRPA.ServerLogListRefreshDef,3000) - //sleep(3000) - //mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive - } - }); - } - catch(error) { - setTimeout(mGlobal.pyOpenRPA.ServerLogListRefreshDef,3000) - //sleep(3000) - //mGlobal.pyOpenRPA.ServerLogListRefreshDef() // recursive - } - } - ///////////////////////////////////////////////////////////// - - - mGlobal.Monitor.mDatasetLast = null - - /////////////////////////////// - ///Processor functions - /////////////////////////////// - mGlobal.Processor = {} - mGlobal.Processor.ServerValueAppend = function(inKeyList,inValue) { - lData = [ - { - "Type":"GlobalDictKeyListValueAppend", - "KeyList": inKeyList, - "Value": inValue - } - ] - ///Обнулить таблицу - $('.ui.modal.basic .content').html(""); - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Processor.ServerValueSet = function(inKeyList,inValue) { - lData = [ - { - "Type":"GlobalDictKeyListValueSet", - "KeyList": inKeyList, - "Value": inValue - } - ] - ///Обнулить таблицу - $('.ui.modal.basic .content').html(""); - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Processor.ServerValueOperatorPlus = function(inKeyList,inValue) { - lData = [ - { - "Type":"GlobalDictKeyListValueOperator+", - "KeyList": inKeyList, - "Value": inValue - } - ] - ///Обнулить таблицу - $('.ui.modal.basic .content').html(""); - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Processor.Send = function(inData) { - lData = inData - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Server= {} - mGlobal.Server.JSONGet=function(inMethod, inURL, inDataJSON, inCallback) - { - $.ajax({ - type: inMethod, - url: inURL, - data: JSON.stringify(inDataJSON), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - inCallback(lResponseJSON) - }, - dataType: "text" - }); - } - - ///////////////// - ///Modal - /////////////////// - mGlobal.Modal={} - ///////////////////////////////////////////////////// - mGlobal.Modal.TableFilter={} - mGlobal.Modal.TableFilter.Show=function(inJSON) { - //{ - // "Title":"", - // "Headers":["Header1","Header2"], - // "Rows": [["Cell1","Cell2"],["Cell2-1","Cell2-2"]], - // "FilterOnKeyUp": "" //Fill here in function - //} - //Set js handler to Search field - inJSON["FilterOnKeyUp"]="mGlobal.Modal.TableFilter.FilterUpdate(this.value);" - ///Set value - mGlobal.Modal.TableFilter.mDataJSON = inJSON - //Render HTML - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-table-filter",inJSON); - ///Установить HTML код - $('.ui.modal.basic .content').html(lHTMLCode); - $('.ui.modal.basic').modal('show'); - //DO widest modal for table with scroll x - $("div.ui.basic.modal.transition.visible.active.scrolling")[0].style["width"]="1300px" - $("div.ui.basic.modal.transition.visible.active.scrolling")[0].style["overflow"]="scroll" - } - //Service function - mGlobal.Modal.TableFilter.FilterUpdate=function(inFilterValue) { - //Get JSON, apply filter, clone data - lDataJSON = clone(mGlobal.Modal.TableFilter.mDataJSON) - delete lDataJSON["Rows"] - lDataJSON["Rows"]=[] - //Filter code [any occurence in the row is ok for push! ] - mGlobal.Modal.TableFilter.mDataJSON["Rows"].forEach( - function(inElement) { - lFlagElementAppend = false - inElement.forEach( - function(inElement2) { - if (String(inElement2).includes(inFilterValue)) { - lFlagElementAppend = true - } - } - ) - if (lFlagElementAppend) { - lDataJSON["Rows"].push(inElement) - } - } - ) - //Clear Filter Title property (fixed in html) - delete lDataJSON["FilterOnKeyUp"] - delete lDataJSON["Title"] - //Search the table element [replace only table html] - lElement = $('.ui.modals.active .content table.table')[0] - lElementParentElement = lElement.parentNode - lElement.parentNode.removeChild(lElement); - //Render HTML - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-table-filter",lDataJSON); - ///Установить HTML код - lElementParentElement.insertAdjacentHTML("beforeend",lHTMLCode); - } - ///////////////////////////////////////////////////////////// - mGlobal.Modal.ListFilter={} - mGlobal.Modal.ListFilter.Show=function(inJSON) { - //{ - // "Title":"", - // "List":[{"Header":"","Description":""}], - // "FilterOnKeyUp": "" //Fill here in function - //} - //Set js handler to Search field - inJSON["FilterOnKeyUp"]="mGlobal.Modal.ListFilter.FilterUpdate(this.value);" - ///Set value - mGlobal.Modal.ListFilter.mDataJSON = inJSON - //Render HTML - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-list-filter",inJSON); - ///Установить HTML код - $('.ui.modal.basic .content').html(lHTMLCode); - $('.ui.modal.basic').modal('show'); - } - //Service function - mGlobal.Modal.ListFilter.FilterUpdate=function(inFilterValue) { - //Get JSON, apply filter, clone data - lDataJSON = clone(mGlobal.Modal.ListFilter.mDataJSON) - delete lDataJSON["List"] - lDataJSON["List"]=[] - //Filter code [any occurence in the row is ok for push! ] - mGlobal.Modal.ListFilter.mDataJSON["List"].forEach( - function(inElement) { - lFlagElementAppend = false - if (String(inElement["Header"]).includes(inFilterValue)) { - lFlagElementAppend = true - } - if (String(inElement["Description"]).includes(inFilterValue)) { - lFlagElementAppend = true - } - if (lFlagElementAppend) { - lDataJSON["List"].push(inElement) - } - } - ) - //Clear Filter Title property (fixed in html) - delete lDataJSON["FilterOnKeyUp"] - delete lDataJSON["Title"] - //Search the table element [replace only table html] - lElement = $('.ui.modals.active .content div.ui.inverted.segment')[0] - lElementParentElement = lElement.parentNode - lElement.parentNode.removeChild(lElement); - //Render HTML - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-handlebar-template-list-filter",lDataJSON); - ///Установить HTML код - lElementParentElement.insertAdjacentHTML("beforeend",lHTMLCode); - } - mGlobal.UserRoleHierarchyDict = null // Put here the user role hierarchy - // UAC Ask - mGlobal.UserRoleAsk=function(inList) { - var lResult = true; // Init flag - var lRoleHierarchyDict = mGlobal.pyOpenRPA.ServerDataDict.UserDict.UACClientDict; // get the Hierarchy - // Try to get value from key list - var lKeyValue = lRoleHierarchyDict; // Init the base - var lListLength = inList.length; - for (var i = 0; i 0) { // false - if Dict has some elements - lResult = false; // Set the False Flag - } else { - lResult = true; // Set the true flag - } - break; // Stop the loop - } - } else { // Has element with no detalization - return true - lResult = true; // Set the flag - break; // Close the loop - } - } - return lResult; // Return the result - } - // Check user roles and update the Orchestrator UI - mGlobal.UserRoleUpdate=function() { - var lUACAsk = mGlobal.UserRoleAsk // Alias - //CPKeyDict - if (lUACAsk(["pyOpenRPADict","CPKeyDict"])) { $(".UACClient-pyOpenRPADict-CPKeyDict").show(); } - - //RDPKeyDict - if (lUACAsk(["pyOpenRPADict","RDPKeyDict"])) { $(".UACClient-pyOpenRPADict-RDPKeyDict").show(); } - - //AgentKeyDict - if (lUACAsk(["pyOpenRPADict","AgentKeyDict"])) { $(".UACClient-pyOpenRPADict-AgentKeyDict").show(); } - - // AdminDict - if (lUACAsk(["pyOpenRPADict","AdminDict","LogViewerBool"])) { $(".UACClient-pyOpenRPADict-AdminDict-LogViewerBool").show(); } - if (lUACAsk(["pyOpenRPADict","AdminDict","CMDInputBool"])) { $(".UACClient-pyOpenRPADict-AdminDict-CMDInputBool").show(); } - if (lUACAsk(["pyOpenRPADict","AdminDict","ScreenshotViewerBool"])) { $(".UACClient-pyOpenRPADict-AdminDict-ScreenshotViewerBool").show(); } - if (lUACAsk(["pyOpenRPADict","AdminDict","RestartOrchestratorBool"])) { $(".UACClient-pyOpenRPADict-AdminDict-RestartOrchestratorBool").show(); } - if (lUACAsk(["pyOpenRPADict","AdminDict","RestartOrchestratorGITPullBool"])) { $(".UACClient-pyOpenRPADict-AdminDict-RestartOrchestratorGITPullBool").show(); } - if (lUACAsk(["pyOpenRPADict","AdminDict","RestartPCBool"])) { $(".UACClient-pyOpenRPADict-AdminDict-RestartPCBool").show(); } - if (lUACAsk(["pyOpenRPADict","AdminDict","Debugging"])) { $(".UACClient-pyOpenRPADict-AdminDict-Debugging").show(); } - - } - - /// v1.2.0 pyOpenRPA Init defs - mGlobal.pyOpenRPA.ServerDataRefreshDef(); // Init the refresh data def from server side - mGlobal.pyOpenRPA.ServerLogListRefreshDef(); // Init the refresh data def from the log window - mGlobal.pyOpenRPA.ServerLogListDoRenderTrue(); // Init button to freeze/unfreeze textare with logs - mGlobal.pyOpenRPA.ServerJSInitDef(); // Recieve JS from server (if exist) and then call anothe url ServerData - //$('.ui.dropdown').dropdown(); - - //////////////////////////////////////////// - // 1.2.7 Debugging - /// Execute ActivityItem - - // Debugging onchange def autofill init - var lDropdownOnChange = function(inEvent){ - //lValueStr = inEvent.target.value - lValueStr = inEvent - $.ajax({ - type: "GET", - url: '/pyOpenRPA/Debugging/HelperDefAutofill/'+lValueStr, - data: null, - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - console.log("HelperDefAutofill:") - console.log(lResponseJSON) - //ArgDict merge - var lArgDictTargetDict = lResponseJSON["ArgDict"] - var lArgDictStr = $(".mGlobal-pyOpenRPA-Debugging-ArgDict")[0].value - if (lArgDictStr !="" && lArgDictStr !=null) { - lArgDictLastDict = JSON.parse(lArgDictStr) - lArgDictTargetDict = mGlobal.pyOpenRPA.DebuggingAutofillMerge(lArgDictTargetDict, lArgDictLastDict) - } - - $(".mGlobal-pyOpenRPA-Debugging-ArgList")[0].value = JSON.stringify(lResponseJSON["ArgList"]) - $(".mGlobal-pyOpenRPA-Debugging-ArgDict")[0].value = JSON.stringify(lArgDictTargetDict) - $(".mGlobal-pyOpenRPA-Debugging-ArgGSettingsStr")[0].value = JSON.stringify(lResponseJSON["ArgGSettingsStr"]) - $(".mGlobal-pyOpenRPA-Debugging-ArgLoggerStr")[0].value = JSON.stringify(lResponseJSON["ArgLoggerStr"]) - - }, - dataType: "text" - }); - } - //$('.ui.dropdown.mGlobal-pyOpenRPA-Debugging-Def-Dropdown')[0].onchange=lDropdownOnChange - - - - mGlobal.pyOpenRPA.DebuggingExecute=function() { - ///EXAMPLE - // { - // "Def":"OSCMD", // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - // "ArgList":[], // Args list - // "ArgDict":{"inCMDStr":lCMDCode,"inRunAsyncBool":false}, // Args dictionary - // "ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // "ArgLogger": "inLogger" // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - // } - ///Подготовить конфигурацию - lArgListStr = $(".mGlobal-pyOpenRPA-Debugging-ArgList")[0].value - lArgDictStr = $(".mGlobal-pyOpenRPA-Debugging-ArgDict")[0].value - lArgGSettingsStr = $(".mGlobal-pyOpenRPA-Debugging-ArgGSettingsStr")[0].value - lArgLoggerStr = $(".mGlobal-pyOpenRPA-Debugging-ArgLoggerStr")[0].value - lActivityItem = { - "Def":$(".mGlobal-pyOpenRPA-Debugging-Def")[0].value, // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) - "ArgList":(lArgListStr == "" ? [] : JSON.parse(lArgListStr)), // Args list - "ArgDict":(lArgDictStr == "" ? {} : JSON.parse(lArgDictStr)), // Args dictionary - "ArgGSettingsStr": (lArgGSettingsStr == "" ? null : lArgGSettingsStr), // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - "ArgLoggerStr": (lArgLoggerStr == "" ? null : lArgLoggerStr) // Name of GSettings attribute: str (ArgDict) or index (for ArgList) - } - lData = [lActivityItem] - $.ajax({ - type: "POST", - url: '/pyOpenRPA/ActivityListExecute', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - console.log(lResponseJSON) - $(".mGlobal-pyOpenRPA-Debugging-Output")[0].value = JSON.stringify(lResponseJSON[0]) - }, - dataType: "text" - }); - } - mGlobal.pyOpenRPA.DebuggingAutofillMerge=function(inTargetDict, inLastDict) { - // Merge 2 dict (get values from Last dict if key exists in new dict - for (const [lKeyStr, lValue] of Object.entries(inTargetDict)) { - //Check if key exists in LastDict - if (lKeyStr in inLastDict) { - inTargetDict[lKeyStr] = inLastDict[lKeyStr] - } - } - return inTargetDict - } - // 1.2.7 Debugging toolbox init - $('.ui.dropdown.mGlobal-pyOpenRPA-Debugging-Def-Dropdown') - .dropdown({ - apiSettings: { - // this url parses query server side and returns filtered results - url: '/pyOpenRPA/Debugging/HelperDefList/{query}' - }, - onChange: lDropdownOnChange - }) - ; -}); \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml deleted file mode 100755 index a1253bde..00000000 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/Index.xhtml +++ /dev/null @@ -1,499 +0,0 @@ - - - - - pyOpenRPA Orchestrator - - - - - - - - - -
-
-
- -     -

pyOpenRPA

-
by Ivan Maslov
-     -     -     -     -     -

ORCHESTRATOR WEB GUI

-
-
-
- -
- -
- - - - - - - -
- - -
- -
-
-
-

- -
- Administration -
-

- -
-
- -
-
-

- - Logs -

- - - Freeze textarea - -
-
- - -

- - Controls -

-
- - - - -
- -
- - - -
-
- - - - - - - - diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/favicon.ico b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/favicon.ico deleted file mode 100755 index 867515cf..00000000 Binary files a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/Web/favicon.ico and /dev/null differ diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py index 6550b079..a263bde3 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -16,6 +16,7 @@ from . import BackwardCompatibility # Backward compatibility from v1.1.13 from . import Core from . import Managers from ..Tools import License +from ..Utils import Dictionary if CrossOS.IS_WINDOWS_BOOL: from subprocess import CREATE_NEW_CONSOLE @@ -41,6 +42,8 @@ import math import glob # search the files import urllib + + #Единый глобальный словарь (За основу взять из Settings.py) gSettingsDict = None @@ -108,7 +111,7 @@ def AgentActivityItemReturnExists(inGUIDStr, inGSettings = None): return inGUIDStr in inGSettings["AgentActivityReturnDict"] -def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSettings=None): +def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSettings=None, inTimeoutSecFloat=None): """L+,W+: Ожидает появления результата по активности (ActivityItem). Возвращает результат выполнения активности. !ВНИМАНИЕ! Замораживает поток, пока не будет получен результат. @@ -120,15 +123,21 @@ def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSett :return: Результат выполнения активности. !ВНИМАНИЕ! Возвращаются только то результаты, которые могут быть интерпретированы в JSON формате. """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings + lTimeStampSecFloat = time.time() #Check if Orchestrator has been initialized - else raise exception if Core.IsOrchestratorInitialized(inGSettings=inGSettings) == True: # Wait while result will not come here - while not AgentActivityItemReturnExists(inGSettings=inGSettings, inGUIDStr=inGUIDStr): - time.sleep(inCheckIntervalSecFloat) + lLoopBool = True + while lLoopBool: + if not AgentActivityItemReturnExists(inGSettings=inGSettings, inGUIDStr=inGUIDStr): + time.sleep(inCheckIntervalSecFloat) + else: lLoopBool=False + if (inTimeoutSecFloat is not None) and (time.time() - lTimeStampSecFloat) >= inTimeoutSecFloat: + raise Exception(f"Orchestrator.AgentActivityItemReturnGet !ВНИМАНИЕ! ПРЕВЫШЕНО ВРЕМЯ ОЖИДАНИЯ ОТВЕТА") # Return the result return inGSettings["AgentActivityReturnDict"][inGUIDStr]["Return"] else: - raise Exception(f"__Orchestrator__.AgentActivityItemReturnGet !ATTENTION! Use this function only after Orchestrator initialization! Before orchestrator init exception will be raised.") + raise Exception(f"Orchestrator.AgentActivityItemReturnGet !ВНИМАНИЕ! ФУНКЦИЯ МОЖЕТ БЫТЬ ЗАПУЩЕНА ТОЛЬКО ПОСЛЕ ИНИЦИАЛИЗАЦИИ!") def AgentOSCMD(inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=True, inSendOutputToOrchestratorLogsBool=True, inCMDEncodingStr="cp1251", inGSettings=None, inCaptureBool=True): """L+,W+: Отправка команды командной строки на сессию, где работает pyOpenRPA.Agent. Результат выполнения команды можно выводить в лог оркестратора. @@ -533,6 +542,7 @@ def OSCMD(inCMDStr, inRunAsyncBool=True, inLogger = None): # New call if inRunAsyncBool: lThread = threading.Thread(target=_CMDRunAndListenLogs, kwargs={"inCMDStr":inCMDStr, "inLogger":inLogger}) + lThread.setName("OSCMD_ACTIVITY") lThread.start() lResultStr="Список ActivityList был запущен в асинхронном режиме - захватить содержимое невозможно" else: @@ -592,6 +602,7 @@ def OrchestratorThreadStart(inDef, *inArgList, **inArgDict): :return: threading.Thread экземпляр """ lDefThread = threading.Thread(target=inDef,args=inArgList,kwargs=inArgDict) + lDefThread.setName(f"ORCHESTRATOR_THREAD_{str(inDef).upper()}") lDefThread.start() return lDefThread @@ -638,7 +649,7 @@ def OrchestratorRerunAsAdmin(): else: print(f"Уже запущено с правами администратора!") -def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSettingsStr = None, inAsyncInitBool = False): +def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSettingsStr = None, inAsyncInitBool = False, inPackageLevelInt = 0): """L+,W+: Выполнить поиск и инициализацию пользовательских .py файлов в Оркестраторе (например панелей управления роботов) Добавляет инициализированный модуль в пространство sys.modules как imported (имя модуля = имя файла без расширения). @@ -668,20 +679,32 @@ def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSet :param inDefStr: ОПЦИОНАЛЬНО Строковое наименование функции. Преимущественно для обратной совместимости :param inDefArgNameGSettingsStr: ОПЦИОНАЛЬНО Наименование аргумента, в который требуется передать GSettings (если необходимо) :param inAsyncInitBool: ОПЦИОНАЛЬНО True - Инициализация py модулей в отдельных параллельных потоках - псевдопараллельное выполнение. False - последовательная инициализация + :param inPackageLevelInt: ОПЦИОНАЛЬНО Уровень вложенности модуля в пакет. По умолчанию 0 (не является модулем пакета) :return: Сведения об инициализированных модулях в структуре: { "ModuleNameStr":{"PyPathStr": "", "Module": ...}, ...} """ inGlobPatternStr = CrossOS.PathStr(inGlobPatternStr) + # # # # # # # # - def __execute__(inResultDict, inPyPathItemStr, inDefStr = None, inDefArgNameGSettingsStr = None): + def __execute__(inResultDict, inPyPathItemStr, inDefStr = None, inDefArgNameGSettingsStr = None, inPackageLevelInt=0): try: lPyPathItemStr = inPyPathItemStr + CrossOS.PathSplitList(inPathStr=lPyPathItemStr)[-1*inPackageLevelInt-1:-1] lModuleNameStr = os.path.basename(lPyPathItemStr)[0:-3] - lTechSpecification = importlib.util.spec_from_file_location(lModuleNameStr, lPyPathItemStr) - lTechModuleFromSpec = importlib.util.module_from_spec(lTechSpecification) - sys.modules[lModuleNameStr] = lTechModuleFromSpec # Add initialized module in sys - python will not init this module enought - lTechSpecificationModuleLoader = lTechSpecification.loader.exec_module(lTechModuleFromSpec) + if inPackageLevelInt==0: + lTechSpecification = importlib.util.spec_from_file_location(lModuleNameStr, lPyPathItemStr) + lTechModuleFromSpec = importlib.util.module_from_spec(lTechSpecification) + sys.modules[lModuleNameStr] = lTechModuleFromSpec # Add initialized module in sys - python will not init this module enought + lTechSpecificationModuleLoader = lTechSpecification.loader.exec_module(lTechModuleFromSpec) + else: + lPrePackagePathStr=CrossOS.PathStr("\\".join(CrossOS.PathSplitList(inPathStr=lPyPathItemStr)[:-1-inPackageLevelInt])) + lPackageNameStr=".".join(CrossOS.PathSplitList(inPathStr=lPyPathItemStr)[-inPackageLevelInt-1:-1]) + lModuleNameStr=os.path.basename(lPyPathItemStr)[0:-3] + sys.path.insert(0,lPrePackagePathStr) + lTechSpecification = importlib.import_module(f".{lModuleNameStr}", lPackageNameStr) + lTechModuleFromSpec=sys.modules[f"{lPackageNameStr}.{lModuleNameStr}"] + lModuleNameStr= f"{lPackageNameStr}.{lModuleNameStr}" lItemDict = {"ModuleNameStr": lModuleNameStr, "PyPathStr": lPyPathItemStr, "Module": lTechModuleFromSpec} - if lL: lL.info(f"Модуль .py {lModuleNameStr} был успешно инициализирован") + if lL: lL.info(f"Модуль .py {lModuleNameStr} был успешно инициализирован. Путь к файлу: {lPyPathItemStr}") inResultDict[lModuleNameStr]=lItemDict # Backward compatibility to call def with gsettings when init if inDefStr is not None and inDefStr != "": @@ -691,7 +714,7 @@ def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSet lArgDict = {inDefArgNameGSettingsStr:GSettingsGet()} lDef(**lArgDict) except Exception as e: - if lL: lL.exception(f"Exception when init the .py file {os.path.abspath(lPyPathItemStr)}") + if lL: lL.exception(f"Ошибка при инициализации .py файла: {os.path.abspath(lPyPathItemStr)}") # # # # # # # # lResultDict = {} @@ -703,11 +726,12 @@ def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSet # ASYNC EXECUTION lThreadInit = threading.Thread(target=__execute__,kwargs={ "inResultDict":lResultDict, "inPyPathItemStr": lPyPathItemStr, - "inDefStr": inDefStr, "inDefArgNameGSettingsStr": inDefArgNameGSettingsStr}, daemon=True) + "inDefStr": inDefStr, "inDefArgNameGSettingsStr": inDefArgNameGSettingsStr, "inPackageLevelInt":inPackageLevelInt}, daemon=True) + lThreadInit.setName("PY_SEARCH_MODULE_INIT") lThreadInit.start() else: # SYNC EXECUTION - __execute__(inResultDict=lResultDict, inPyPathItemStr=lPyPathItemStr, inDefStr = inDefStr, inDefArgNameGSettingsStr = inDefArgNameGSettingsStr) + __execute__(inResultDict=lResultDict, inPyPathItemStr=lPyPathItemStr, inDefStr = inDefStr, inDefArgNameGSettingsStr = inDefArgNameGSettingsStr, inPackageLevelInt=inPackageLevelInt) return lResultDict def OrchestratorSessionSave(inGSettings=None): @@ -785,7 +809,7 @@ def OrchestratorSessionRestore(inGSettings=None): inGSettings["StorageDict"] = {} with open('_SessionLast_StorageDict.pickle', 'rb') as lFile: lStorageDictDumpDict = pickle.load(lFile) - Server.__ComplexDictMerge2to1Overwrite__(in1Dict=inGSettings["StorageDict"], + Dictionary.MergeNoException(in1Dict=inGSettings["StorageDict"], in2Dict=lStorageDictDumpDict) # Merge dict 2 into dict 1 if lL: lL.warning(f"Словарь StorageDict был восстановлен из прошлой сессии оркестратора") os.remove("_SessionLast_StorageDict.pickle") # remove the temp file @@ -797,13 +821,13 @@ def OrchestratorSessionRestore(inGSettings=None): inGSettings["ManagersProcessDict"] = {} with open('_SessionLast_GSettings.pickle', 'rb') as lFile: lStorageDictDumpDict = pickle.load(lFile) - Server.__ComplexDictMerge2to1Overwrite__(in1Dict=inGSettings, + Dictionary.MergeNoException(in1Dict=inGSettings, in2Dict=lStorageDictDumpDict) # Merge dict 2 into dict 1 if lL: lL.warning(f"Словарь GSettings был восстановлен из прошлой сессии оркестратора") os.remove("_SessionLast_GSettings.pickle") # remove the temp file def UACKeyListCheck(inRequest, inRoleKeyList) -> bool: - """L+,W+: Проверить права доступа для пользователя запроса по списку ключей до права. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. WebUserUACCheck] Проверить права доступа для пользователя запроса по списку ключей до права. .. code-block:: python @@ -818,8 +842,8 @@ def UACKeyListCheck(inRequest, inRoleKeyList) -> bool: return inRequest.UACClientCheck(inRoleKeyList=inRoleKeyList) def UACUserDictGet(inRequest) -> dict: - """L+,W+: Вернуть UAC (User Access Control) словарь доступов для пользователя, который отправил запрос. Пустой словарь - супердоступ (доступ ко всему) - + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. WebUserUACHierarchyGet] Вернуть UAC (User Access Control) словарь доступов для пользователя, который отправил запрос. Пустой словарь - супердоступ (доступ ко всему) + :param inRequest: Экземпляр request (from http.server import BaseHTTPRequestHandler) :return: Словарь доступов пользователя. Пустой словарь - супердоступ (доступ ко всему) """ @@ -855,7 +879,7 @@ def UACUpdate(inADLoginStr, inADStr="", inADIsDefaultBool=True, inURLList=None, # Check RoleHierarchyAllowedDict in gSettings for the old role hierarchy - include in result. if lUserTurple in inGSettings["ServerDict"]["AccessUsers"]["RuleDomainUserDict"] and "RoleHierarchyAllowedDict" in inGSettings["ServerDict"]["AccessUsers"]["RuleDomainUserDict"][lUserTurple]: lRoleHierarchyAllowedOLDDict = inGSettings["ServerDict"]["AccessUsers"]["RuleDomainUserDict"][lUserTurple]["RoleHierarchyAllowedDict"] - Server.__ComplexDictMerge2to1__(in1Dict=inRoleHierarchyAllowedDict, in2Dict=lRoleHierarchyAllowedOLDDict) # Merge dict 2 into dict 1 + Dictionary.Merge(in1Dict=inRoleHierarchyAllowedDict, in2Dict=lRoleHierarchyAllowedOLDDict) # Merge dict 2 into dict 1 # Create Access item lRuleDomainUserDict = { @@ -916,6 +940,7 @@ def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentType "UACBool": inUACBool } inGSettings["ServerDict"]["URLList"].append(lURLItemDict) + Server.BCURLUpdate() def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None, inUseCacheBool= False): @@ -946,6 +971,7 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, "UseCacheBool": inUseCacheBool } inGSettings["ServerDict"]["URLList"].append(lURLItemDict) + Server.BCURLUpdate() def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr=None, inGSettings = None, inUACBool = None, inUseCacheBool = False): @@ -974,12 +1000,13 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo "UseCacheBool": inUseCacheBool } inGSettings["ServerDict"]["URLList"].append(lURLItemDict) + Server.BCURLUpdate() -def WebListenCreate(inServerKeyStr="Default", inAddressStr="", inPortInt=80, inCertFilePEMPathStr=None, inKeyFilePathStr=None, inGSettings = None): +def WebListenCreate(inServerKeyStr="Default", inAddressStr="0.0.0.0", inPortInt=1024, inCertFilePEMPathStr=None, inKeyFilePathStr=None, inGSettings = None): """L+,W+: Настроить веб-сервер Оркестратора. - :param inAddressStr: IP адрес для прослушивания. Если "", то прослушивать запросы со всех сетевых карт. Если "127.0.0.1", то слушать запросы только с той ОС, на которой работает Оркестратор - :param inPortInt: Номер порта для прослушивания. Если HTTP - 80; Если HTTPS - 443. По умолчанию 80. Допускается установка других портов + :param inAddressStr: IP адрес для прослушивания. Если "0.0.0.0", то прослушивать запросы со всех сетевых карт. Если "127.0.0.1", то слушать запросы только с той ОС, на которой работает Оркестратор + :param inPortInt: Номер порта для прослушивания. Если HTTP - 80; Если HTTPS - 443. По умолчанию 1024 (Связано с тем, что в линукс можно устанавливать порты выше 1000). Допускается установка других портов :param inCertFilePEMPathStr: Путь файлу сертификата, сгенерированного в .pem (base64) формате. Обязателен при использовании защищенного HTTPS/SSL соединения. :param inKeyFilePathStr: Путь к файлу закрытого ключа в base64 формате :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) @@ -1015,8 +1042,18 @@ def WebCPUpdate(inCPKeyStr, inHTMLRenderDef=None, inJSONGeneratorDef=None, inJSI if inJSInitGeneratorDef is not None: lCPManager.mBackwardCompatibilityJSDef = inJSInitGeneratorDef -def WebAuditMessageCreate(inRequest=None, inOperationCodeStr="-", inMessageStr="-"): - """L+,W+: Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). Данная функция особенно актуальна в том случае, если требуется реализовать дополнительные меры контроля ИТ системы. +def WebRequestHostGet(inRequest) -> str: + """L+,W+: Получить наименование хоста, с которого поступил запрос + + :param inRequest: Экземпляр fastapi.Request, по умолчанию None + :type inRequest: fastapi.Request, опционально + :return: Наименование хоста + :rtype: str + """ + return inRequest.client.host + +def WebAuditMessageCreate(inAuthTokenStr:str = None, inHostStr:str=None, inOperationCodeStr:str="-", inMessageStr:str="-"): + """L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). Данная функция особенно актуальна в том случае, если требуется реализовать дополнительные меры контроля ИТ системы. .. code-block:: python @@ -1031,47 +1068,44 @@ def WebAuditMessageCreate(inRequest=None, inOperationCodeStr="-", inMessageStr=" # Логгирование сообщения lLogger.info(lWebAuditMessageStr) - :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя + :param inAuthTokenStr: Токен авторизации пользователя / бота, по умолчанию None (не установлен) + :type inAuthTokenStr: str, опционально + :param inHostStr: IP адрес хоста пользователя / бота, по умолчанию None (не установлен) + :type inHostStr: str, опционально :param inOperationCodeStr: Код операции, который принят в компании в соответствии с регламентными процедурами :param inMessageStr: Дополнительное сообщение, которое необходимо отправить в сообщение об ИТ аудите :return: Формат сообщения: "WebAudit :: DOMAIN\\USER@101.121.123.12 :: operation code :: message" """ try: - if inRequest is None: inRequest = WebRequestGet() - lClientIPStr = inRequest.client_address[0] - lUserDict = WebUserInfoGet(inRequest=inRequest) - lDomainUpperStr = lUserDict["DomainUpperStr"] - lUserLoginStr = lUserDict["UserNameUpperStr"] - lResultStr = f"ВебАудит :: {lDomainUpperStr}\\\\{lUserLoginStr}@{lClientIPStr} :: {inOperationCodeStr} :: {inMessageStr}" + lDomainUpperStr = WebUserDomainGet(inAuthTokenStr=inAuthTokenStr).upper() + lUserLoginStr = WebUserLoginGet(inAuthTokenStr=inAuthTokenStr).upper() + lResultStr = f"ВебАудит :: {lDomainUpperStr}\\\\{lUserLoginStr}@{inHostStr} :: {inOperationCodeStr} :: {inMessageStr}" except Exception as e: print(str(e)) # Has no logger - must be dead alg branch lResultStr = inMessageStr return lResultStr def WebRequestParseBodyBytes(inRequest=None): - """L+,W+: Извлечь данные в байт виде из тела (body) HTTP запроса. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь данные в байт виде из тела (body) HTTP запроса. :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :return: Строка байт b'' или None (если тело запроса было пустым) """ if inRequest is None: inRequest = WebRequestGet() lBodyBytes=None - if inRequest.headers.get('Content-Length') is not None: - lInputByteArrayLength = int(inRequest.headers.get('Content-Length')) - lBodyBytes = inRequest.rfile.read(lInputByteArrayLength) - return lBodyBytes + return inRequest.body.encode("utf8") def WebRequestParseBodyStr(inRequest=None): - """L+,W+: Извлечь данные в виде строки из тела (body) HTTP запроса. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь данные в виде строки из тела (body) HTTP запроса. :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :return: Текстовая строка '' или None (если тело запроса было пустым) """ if inRequest is None: inRequest = WebRequestGet() - return WebRequestParseBodyBytes(inRequest=inRequest).decode('utf-8') + return inRequest.body def WebRequestParseBodyJSON(inRequest=None): - """L+,W+: Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python. :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :return: Словарь (dict), список (list) или None (если тело запроса было пустым) @@ -1080,7 +1114,7 @@ def WebRequestParseBodyJSON(inRequest=None): return json.loads(WebRequestParseBodyStr(inRequest=inRequest)) def WebRequestParsePath(inRequest=None): - """L+,W+: Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки. :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :return: str, пример: /pyOpenRPA/Debugging/DefHelper @@ -1089,7 +1123,7 @@ def WebRequestParsePath(inRequest=None): return urllib.parse.unquote(inRequest.path) def WebRequestParseFile(inRequest=None): - """L+,W+: Извлечь файл (наименование + содержимое в виде строки байт b'') из HTTP запроса пользователя. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь файл (наименование + содержимое в виде строки байт b'') из HTTP запроса пользователя. :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :return: Кортеж формата (FileNameStr, FileBodyBytes) or (None, None), если файл не был обнаружен @@ -1115,7 +1149,7 @@ def WebRequestParseFile(inRequest=None): return lResultTurple def WebRequestResponseSend(inResponeStr, inRequest=None, inContentTypeStr: str = None, inHeadersDict: dict = None): - """L+,W+: Установить ответ на HTTP запрос пользователя. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Установить ответ на HTTP запрос пользователя. :param inResponeStr: Тело ответа (строка) :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя @@ -1131,46 +1165,104 @@ def WebRequestResponseSend(inResponeStr, inRequest=None, inContentTypeStr: str = def WebRequestGet(): - """L+,W+: Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2] Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя. """ lCurrentThread = threading.current_thread() if hasattr(lCurrentThread, "request"): return lCurrentThread.request +def WebUserLoginGet(inAuthTokenStr: str=None) -> str: + """L+,W+: Получить логин авторизованного пользователя. Если авторизация не производилась - вернуть None + + :param inAuthTokenStr: Токен авторизации пользователя / бота, по умолчанию None (не установлен) + :type inAuthTokenStr: str, опционально + :return: Логин пользователя + :rtype: str + """ + if inAuthTokenStr is None: return None + inGS = GSettingsGet() # Get the global settings + return inGS.get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(inAuthTokenStr, {}).get("User", None) + +def WebUserDomainGet(inAuthTokenStr: str=None) -> str: + """L+,W+: Получить домен авторизованного пользователя. Если авторизация не производилась - вернуть None + + :param inAuthTokenStr: Токен авторизации пользователя / бота, по умолчанию None (не установлен) + :type inAuthTokenStr: str, опционально + :return: Домен пользователя + :rtype: str + """ + if inAuthTokenStr is None: return None + inGS = GSettingsGet() # Get the global settings + return inGS.get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(inAuthTokenStr, {}).get("Domain", None) + + def WebUserInfoGet(inRequest=None): - """L+,W+: Информация о пользователе, который отправил HTTP запрос. + """L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. WebUserLoginGet, WebUserDomainGet] Информация о пользователе, который отправил HTTP запрос. :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :return: Сведения в формате {"DomainUpperStr": "PYOPENRPA", "UserNameUpperStr": "IVAN.MASLOV"} """ if inRequest is None: inRequest = WebRequestGet() - lDomainUpperStr = inRequest.OpenRPA["Domain"].upper() - lUserUpperStr = inRequest.OpenRPA["User"].upper() - return {"DomainUpperStr": lDomainUpperStr, "UserNameUpperStr": lUserUpperStr} + try: + lDomainUpperStr = inRequest.OpenRPA["Domain"].upper() + lUserUpperStr = inRequest.OpenRPA["User"].upper() + return {"DomainUpperStr": lDomainUpperStr, "UserNameUpperStr": lUserUpperStr} + except Exception as e: + return {"DomainUpperStr": None, "UserNameUpperStr": None} -def WebUserIsSuperToken(inRequest = None, inGSettings = None): - """L+,W+: Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает). +def WebUserIsSuperToken(inAuthTokenStr: str=None): + """L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает). - :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя - :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :return: True - является супертокеном; False - не является супертокеном + :param inAuthTokenStr: Токен авторизации пользователя / бота, по умолчанию None (не установлен) + :type inAuthTokenStr: str, опционально + :return: True - является супертокеном; False - не является супертокеном; None - авторизация не производилась """ - if inRequest is None: inRequest = WebRequestGet() - inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings + if inAuthTokenStr is None: return None + inGSettings = GSettingsGet() # Get the global settings lIsSuperTokenBool = False # Get Flag is supertoken (True|False) - lIsSuperTokenBool = inGSettings.get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(inRequest.OpenRPA["AuthToken"], {}).get("FlagDoNotExpire", False) + lIsSuperTokenBool = inGSettings.get("ServerDict", {}).get("AccessUsers", {}).get("AuthTokensDict", {}).get(inAuthTokenStr, {}).get("FlagDoNotExpire", False) return lIsSuperTokenBool -def WebUserUACHierarchyGet(inRequest = None): - """L+,W+: Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest +def WebUserUACHierarchyGet(inAuthTokenStr: str=None) -> dict: + """L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest - :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя + :param inAuthTokenStr: Токен авторизации пользователя / бота, по умолчанию None (не установлен) + :type inAuthTokenStr: str, опционально :return: UAC словарь доступа или {}, что означает полный доступ """ - if inRequest is None: inRequest = WebRequestGet() - return inRequest.UserRoleHierarchyGet() + lDomainUpperStr = WebUserDomainGet(inAuthTokenStr=inAuthTokenStr).upper() + lUserUpperStr = WebUserLoginGet(inAuthTokenStr=inAuthTokenStr).upper() + if lUserUpperStr is None: return {} + else: return GSettingsGet().get("ServerDict", {}).get("AccessUsers", {}).get("RuleDomainUserDict", {}).get((lDomainUpperStr, lUserUpperStr), {}).get("RoleHierarchyAllowedDict", {}) +def WebUserUACCheck(inAuthTokenStr:str=None, inKeyList:list=None) -> bool: + """L+,W+: Проверить UAC доступ списка ключей для пользователя + + :param inAuthTokenStr: Токен авторизации пользователя / бота, по умолчанию None (не установлен) + :type inAuthTokenStr: str, опционально + :return: True - доступ имеется, False - доступа нет + :rtype: bool + """ + if inAuthTokenStr is None: return True # Если авторизации не происходило - супердоступ + lResult = True # Init flag + lRoleHierarchyDict = WebUserUACHierarchyGet(inAuthTokenStr=inAuthTokenStr) # get the Hierarchy + # Try to get value from key list + lKeyValue = lRoleHierarchyDict # Init the base + for lItem in inKeyList: + if type(lKeyValue) is dict: + if lItem in lKeyValue: # Has key + lKeyValue = lKeyValue[lItem] # Get the value and go to the next loop iteration + else: # Else branch - true or false + if len(lKeyValue)>0: # False - if Dict has some elements + lResult = False # Set the False Flag + else: + lResult = True # Set the True flag + break # Stop the loop + else: # Has element with no detalization - return True + lResult = True # Set the flag + break # Close the loop + return lResult # Return the result ## GSettings defs @@ -1193,7 +1285,7 @@ def GSettingsGet(inGSettings=None): global GSettings # identify the global variable # Merge dictionaries if some new dictionary has come if inGSettings is not None and GSettings is not inGSettings: - GSettings = Server.__ComplexDictMerge2to1Overwrite__(in1Dict = inGSettings, in2Dict = GSettings) + GSettings = Dictionary.MergeNoException(in1Dict = inGSettings, in2Dict = GSettings) return GSettings # Return the result def GSettingsKeyListValueSet(inValue, inKeyList=None, inGSettings = None): @@ -1962,6 +2054,7 @@ def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False, lThread2 = threading.Thread(target=inDef, args=inDefArgList, kwargs=inDefArgDict) + lThread2.setName("INTERVAL_CALL_DEF") lThread2.start() except Exception as e: if inLogger: inLogger.exception( @@ -1976,6 +2069,7 @@ def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False, "inIntervalAsyncBool": inIntervalAsyncBool, "inDefArgList": inDefArgList, "inDefArgDict": inDefArgDict, "inLogger": inLogger, "inDefArgGSettingsNameStr":inDefArgGSettingsNameStr , "inDefArgLoggerNameStr":inDefArgLoggerNameStr}) + lThread.setName("INTERVAL_CALL_EXECUTOR") lThread.start() else: __Execute__(inGSettings=inGSettings, inDef=inDef, inIntervalSecFloat=inIntervalSecFloat, inIntervalAsyncBool=inIntervalAsyncBool, @@ -2710,8 +2804,6 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato Processor.gSettingsDict = gSettingsDict Timer.gSettingsDict = gSettingsDict Timer.Processor.gSettingsDict = gSettingsDict - Server.gSettingsDict = gSettingsDict - Server.ProcessorOld.gSettingsDict = gSettingsDict # Backward compatibility #Backward compatibility - restore in Orc def if old def if inDumpRestoreBool == True: @@ -2732,7 +2824,7 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato # Run SettingUpdate function in submodule getattr(lTechModuleFromSpec, lSubmoduleFunctionName)(gSettingsDict) except Exception as e: - if lL: lL.exception(f"Error when init .py file in orchestrator '{lModuleFilePathItem}'. Exception is below:") + if lL: lL.exception(f"Ошибка при инициализации .py файлов в оркестраторе '{lModuleFilePathItem}'") # Turn on backward compatibility BackwardCompatibility.Update(inGSettings= gSettingsDict) @@ -2752,18 +2844,10 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato #Инициализация настроечных параметров gSettingsDict["ServerDict"]["WorkingDirectoryPathStr"] = os.getcwd() # Set working directory in g settings - #Инициализация сервера (инициализация всех интерфейсов) - lListenDict = gSettingsDict.get("ServerDict",{}).get("ListenDict",{}) - for lItemKeyStr in lListenDict: - lItemDict = lListenDict[lItemKeyStr] - lThreadServer = Server.RobotDaemonServer(lItemKeyStr, gSettingsDict) - lThreadServer.start() - gSettingsDict["ServerDict"]["ServerThread"] = lThreadServer - lItemDict["ServerInstance"] = lThreadServer - # Init the RobotScreenActive in another thread lRobotScreenActiveThread = threading.Thread(target= Monitor.CheckScreen) lRobotScreenActiveThread.daemon = True # Run the thread in daemon mode. + lRobotScreenActiveThread.setName("SCREEN_ACTIVE") lRobotScreenActiveThread.start() # Start the thread execution. if lL: lL.info("Модуль активного рабочего стола инициализирован") #Logging @@ -2771,12 +2855,14 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato lRobotRDPThreadControlDict = {"ThreadExecuteBool":True} # inThreadControlDict = {"ThreadExecuteBool":True} lRobotRDPActiveThread = threading.Thread(target= RobotRDPActive.RobotRDPActive, kwargs={"inGSettings":gSettingsDict, "inThreadControlDict":lRobotRDPThreadControlDict}) lRobotRDPActiveThread.daemon = True # Run the thread in daemon mode. + lRobotRDPActiveThread.setName("RDP_CONNECT") lRobotRDPActiveThread.start() # Start the thread execution. if lL: lL.info("Модуль подключения по РДП инициализированн") #Logging # Init autocleaner in another thread lAutocleanerThread = threading.Thread(target= GSettingsAutocleaner, kwargs={"inGSettings":gSettingsDict}) lAutocleanerThread.daemon = True # Run the thread in daemon mode. + lAutocleanerThread.setName("AUTOCLEANER") lAutocleanerThread.start() # Start the thread execution. if lL: lL.info("Модуль автоочистки инициализирован") #Logging @@ -2791,24 +2877,28 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato # Processor thread lProcessorThread = threading.Thread(target= Processor.ProcessorRunSync, kwargs={"inGSettings":gSettingsDict, "inRobotRDPThreadControlDict":lRobotRDPThreadControlDict}) lProcessorThread.daemon = True # Run the thread in daemon mode. + lProcessorThread.setName("PROCESSOR") lProcessorThread.start() # Start the thread execution. if lL: lL.info("Модуль процессора инициализирован") #Logging # Processor monitor thread lProcessorMonitorThread = threading.Thread(target= Processor.ProcessorMonitorRunSync, kwargs={"inGSettings":gSettingsDict}) lProcessorMonitorThread.daemon = True # Run the thread in daemon mode. + lProcessorMonitorThread.setName("PROCESSOR_MONITOR") lProcessorMonitorThread.start() # Start the thread execution. if lL: lL.info("Модуль контроля процессора инициализирован") #Logging # Scheduler loop lSchedulerThread = threading.Thread(target= __deprecated_orchestrator_loop__) lSchedulerThread.daemon = True # Run the thread in daemon mode. + lSchedulerThread.setName("SCHEDULER_OLD") lSchedulerThread.start() # Start the thread execution. if lL: lL.info("Модуль расписания (старая версия) инициализирован") #Logging # Schedule (new) loop lScheduleThread = threading.Thread(target= __schedule_loop__) lScheduleThread.daemon = True # Run the thread in daemon mode. + lScheduleThread.setName("SCHEDULER_NEW") lScheduleThread.start() # Start the thread execution. if lL: lL.info("Модуль расписания (новая версия) инициализирован") #Logging @@ -2817,11 +2907,22 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato lProcess = inGSettings["ManagersProcessDict"][lProcessKeyTuple] lProcess.StatusCheckIntervalRestore() lThread = threading.Thread(target= lProcess.StatusRestore) + lThread.setName("MANAGER_PROCESS_RESTORE") lThread.start() + # Init debug thread (run if "init_dubug" file exists) Debugger.LiveDebugCheckThread(inGSettings=GSettingsGet()) + #Инициализация сервера (инициализация всех интерфейсов) + Server.InitFastAPI() + lListenDict = gSettingsDict.get("ServerDict",{}).get("ListenDict",{}) + for lItemKeyStr in lListenDict: + lItemDict = lListenDict[lItemKeyStr] + lItemDict["ServerInstance"]=Server.app + Server.InitUvicorn(inHostStr=lItemDict["AddressStr"], inPortInt=lItemDict["PortInt"], inSSLCertPathStr=lItemDict["CertFilePEMPathStr"], inSSLKeyPathStr=lItemDict["KeyFilePathStr"], inSSLPasswordStr=None) + + def __schedule_loop__(): while True: schedule.run_pending() @@ -2889,6 +2990,7 @@ def __deprecated_orchestrator_loop__(): lThread = threading.Thread(target=Processor.ActivityListExecute, kwargs={"inGSettings": inGSettings, "inActivityList": lItem["ActivityList"]}) + lThread.setName("SCHEDULER_OLD_ACTIVITY") lThread.start() lIterationLastDateTime = datetime.datetime.now() # Set the new datetime for the new processor activity except Exception as e: diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css index 5e8b6e8d..3408fb51 100755 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/Semantic-UI-CSS-master/semantic.min.css @@ -8,7 +8,7 @@ * http://opensource.org/licenses/MIT * */ -@import url(/3rdParty/Google/LatoItalic.css); +@import url(/orpa/resources/Web/Google/LatoItalic.css); /*@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin);*//*! * # Semantic UI 2.4.0 - Reset * http://github.com/semantic-org/semantic-ui/ diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/footer.xhtml b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/footer.xhtml index 13d498d5..52d682df 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/footer.xhtml +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/footer.xhtml @@ -14,6 +14,7 @@

Интересный факт

Портал pyOpenRPA сделан на оркестраторе pyOpenRPA за 7 дней - присоединяйся к сильной стороне!

+

pyOpenRPA - роботы помогут!

Контактная информация

@@ -30,6 +31,8 @@
- - - - - - - - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/header.xhtml b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/header.xhtml index 45e1d7c0..bf933b79 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/header.xhtml +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/header.xhtml @@ -1,21 +1,21 @@ - - + + - - - - - + + + + + - - - - - - - - + + + + + + + +
@@ -82,12 +82,13 @@
- +

{{title}} -

+
{{version}}
+

{{subtitle}} diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.js b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.js index 86af9523..22774de9 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.js +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.js @@ -101,22 +101,6 @@ $(document).ready(function() { /////Controller JS module ////////////////////////// mGlobal.Controller={}; - - mGlobal.Controller.CMDRunText=function(inCMDText) { - ///Подготовить конфигурацию - lData = [ - {"Type":"CMDStart", "Command": inCMDText} - ] - ///Обнулить таблицу - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3){}, - dataType: "text" - }); - } mGlobal.Controller.CMDRun=function() { ///Обнулить таблицу lCMDCode=$(".openrpa-controller-cmd-run-input")[0].value @@ -132,37 +116,7 @@ $(document).ready(function() { ] $.ajax({ type: "POST", - url: '/pyOpenRPA/ActivityListExecute', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///Отправить запрос на формирование таблицы - //lHTMLCode=console.log("CMDRun result: "+lResponseJSON[0].result) - }, - dataType: "text" - }); - } - mGlobal.Controller.CMDRunGUILogout=function() { - ///Обнулить таблицу - lCMDCode="for /f \"skip=1 tokens=2\" %s in ('query user %USERNAME%') do (tscon \\dest:console)" - //lCMDCode = lCMDCode.replace(/\\n/g, "\\n") - // .replace(/\\'/g, "\\'") - // .replace(/\\"/g, '\\"') - // .replace(/\\&/g, "\\&") - // .replace(/\\r/g, "\\r") - // .replace(/\\t/g, "\\t") - // .replace(/\\b/g, "\\b") - // .replace(/\\f/g, "\\f") - // .replace('"', "\\\""); - ///Подготовить конфигурацию - lData = [ - {"Type":"CMDStart", "Command": lCMDCode } - ] - $.ajax({ - type: "POST", - url: 'Utils/Processor', + url: '/orpa/api/activity-list-execute', data: JSON.stringify(lData), success: function(lData,l2,l3) @@ -174,51 +128,33 @@ $(document).ready(function() { dataType: "text" }); } + ///Restart PC mGlobal.Controller.PCRestart = function () { mGlobal.Controller.OrchestratorSessionSave() mGlobal.Controller.CMDRunText("shutdown -r") } - ///Orchestrator save session - mGlobal.Controller.OrchestratorSessionSave=function() { - ///Подготовить конфигурацию - lData = [ - {"Type":"OrchestratorSessionSave"} - ] - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - }, - dataType: "text" - }); + mGlobal.Controller.OrchestratorGITPullRestart = function() { + mGlobal.Controller.OrchestratorSessionSave() //Save current RDP list session + mGlobal.Controller.CMDRunText("timeout 3 & taskkill /f /im OpenRPA_Orchestrator.exe & timeout 2 & cd "+mGlobal.WorkingDirectoryPathStr+" & git reset --hard & git pull & pyOpenRPA.Orchestrator_x64_administrator_startup.cmd"); } - ///Перезагрузить Orchestrator mGlobal.Controller.OrchestratorRestart=function() { ///Подготовить конфигурацию lData = [ - {"Type":"OrchestratorRestart"} + { + "Def":"OrchestratorRestart", // def link or def alias (look gSettings["Processor"]["AliasDefDict"]) + "ArgList":[], // Args list + "ArgDict":{}, // Args dictionary + "ArgGSettings": null, // Name of GSettings attribute: str (ArgDict) or index (for ArgList) + "ArgLogger": null // Name of GSettings attribute: str (ArgDict) or index (for ArgList) + } ] $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - }, - dataType: "text" + type: "POST", + url: '/orpa/api/activity-list-execute', + data: JSON.stringify(lData) }); } - mGlobal.Controller.OrchestratorGITPullRestart = function() { - mGlobal.Controller.OrchestratorSessionSave() //Save current RDP list session - mGlobal.Controller.CMDRunText("timeout 3 & taskkill /f /im OpenRPA_Orchestrator.exe & timeout 2 & cd "+mGlobal.WorkingDirectoryPathStr+" & git reset --hard & git pull & pyOpenRPA.Orchestrator_x64_administrator_startup.cmd"); - } ////////////////////////// /////Monitor JS module ////////////////////////// @@ -228,12 +164,12 @@ $(document).ready(function() { return inPrefix+Math.round(Math.random()*1000)+"-"+Math.round(Math.random()*10000)+"-"+Math.round(Math.random()*1000) } //inHostURI: http://localhost:8081 - mGlobal.Monitor.ScreenshotModal.Show=function(inHostURI=" ") { + mGlobal.Monitor.ScreenshotModal.Show=function(inHostURI="") { $('.ui.modal.daemon-screenshot').modal({'onHide':function (inElement) {mGlobal.Monitor.ScreenshotModal.Close();} }).modal('show'); //Функция обновления картинки lScreenshotUpdate=function() { - lScreenshotSrc=inHostURI+"/GetScreenshot?"+mGlobal.Monitor.GenerateUniqueID() + lScreenshotSrc=inHostURI+"/orpa/client/screenshot-get?"+mGlobal.Monitor.GenerateUniqueID() $(".daemon-screenshot img").attr('src', lScreenshotSrc); } @@ -244,26 +180,7 @@ $(document).ready(function() { } ///Monitor mGlobal.Monitor.DaemonList={} - mGlobal.Monitor.DaemonList.fRefreshTable=function() { - ///Загрузка данных - $.ajax({ - type: "GET", - url: 'Monitor/JSONDaemonListGet', - data: '', - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///Сформировать HTML код новой таблицы - lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-monitor-table-general",lResponseJSON) - ///Очистить дерево - //mGlobal.ElementTree.fClear(); - ///Прогрузить новую таблицу - $(".openrpa-monitor").html(lHTMLCode) - }, - dataType: "text" - }); - } + //////////////////////////////// ///////Control panel /////////////////////////////// @@ -380,7 +297,7 @@ $(document).ready(function() { lData = [inActivityItem] $.ajax({ type: "POST", - url: '/pyOpenRPA/ActivityListExecute', + url: '/orpa/api/activity-list-execute', data: JSON.stringify(lData), success: function(lData,l2,l3) @@ -405,7 +322,7 @@ $(document).ready(function() { lData = inActivityList $.ajax({ type: "POST", - url: '/pyOpenRPA/ActivityListExecute', + url: '/orpa/api/activity-list-execute', data: JSON.stringify(lData), success: function(lData,l2,l3) @@ -430,7 +347,7 @@ $(document).ready(function() { lData = inActivityList $.ajax({ type: "POST", - url: '/pyOpenRPA/ProcessorQueueAdd', + url: '/orpa/api/processor-queue-add', data: JSON.stringify(lData), success: function(lData,l2,l3) @@ -448,7 +365,7 @@ $(document).ready(function() { $.ajax({ type: "GET", headers: {}, - url: 'pyOpenRPA/ServerJSInit', + url: '/orpa/client/server-js-init', data: mGlobal.pyOpenRPA.ServerDataHashStr, async: false, success: function(lJSText) { @@ -512,7 +429,7 @@ $(document).ready(function() { $.ajax({ type: "POST", headers: {}, - url: 'pyOpenRPA/ServerData', + url: '/orpa/client/server-data', data: mGlobal.pyOpenRPA.ServerDataHashStr, success: function(lData,l2,l3) { try { @@ -587,7 +504,7 @@ $(document).ready(function() { $.ajax({ type: "POST", headers: {}, - url: 'pyOpenRPA/ServerLog', + url: '/orpa/client/server-log', data: mGlobal.pyOpenRPA.ServerLogListHashStr, success: function(lData,l2,l3) { try { @@ -624,90 +541,7 @@ $(document).ready(function() { ///Processor functions /////////////////////////////// mGlobal.Processor = {} - mGlobal.Processor.ServerValueAppend = function(inKeyList,inValue) { - lData = [ - { - "Type":"GlobalDictKeyListValueAppend", - "KeyList": inKeyList, - "Value": inValue - } - ] - ///Обнулить таблицу - $('.ui.modal.basic .content').html(""); - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Processor.ServerValueSet = function(inKeyList,inValue) { - lData = [ - { - "Type":"GlobalDictKeyListValueSet", - "KeyList": inKeyList, - "Value": inValue - } - ] - ///Обнулить таблицу - $('.ui.modal.basic .content').html(""); - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Processor.ServerValueOperatorPlus = function(inKeyList,inValue) { - lData = [ - { - "Type":"GlobalDictKeyListValueOperator+", - "KeyList": inKeyList, - "Value": inValue - } - ] - ///Обнулить таблицу - $('.ui.modal.basic .content').html(""); - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } - mGlobal.Processor.Send = function(inData) { - lData = inData - $.ajax({ - type: "POST", - url: 'Utils/Processor', - data: JSON.stringify(lData), - success: - function(lData,l2,l3) - { - var lResponseJSON=JSON.parse(lData) - ///TODO Show error if exist error - }, - dataType: "text" - }); - } + mGlobal.Server= {} mGlobal.Server.JSONGet=function(inMethod, inURL, inDataJSON, inCallback) { @@ -904,7 +738,7 @@ $(document).ready(function() { lValueStr = inEvent $.ajax({ type: "GET", - url: '/pyOpenRPA/Debugging/HelperDefAutofill/'+lValueStr, + url: '/orpa/api/helper-def-autofill/'+lValueStr, data: null, success: function(lData,l2,l3) @@ -957,7 +791,7 @@ $(document).ready(function() { lData = [lActivityItem] $.ajax({ type: "POST", - url: '/pyOpenRPA/ActivityListExecute', + url: '/orpa/api/activity-list-execute', data: JSON.stringify(lData), success: function(lData,l2,l3) @@ -984,9 +818,15 @@ $(document).ready(function() { .dropdown({ apiSettings: { // this url parses query server side and returns filtered results - url: '/pyOpenRPA/Debugging/HelperDefList/{query}' + url: '/orpa/api/helper-def-list/{query}' }, onChange: lDropdownOnChange }) ; + mGlobal.pyOpenRPA.RDPListTest= function() { + lResponseJSON={"HandlebarsList":[{"SessionKeyStr":"test"},{"SessionKeyStr":"test2"}]}; + /// !RDP List ! Сформировать HTML код новой таблицы - список RDP + lHTMLCode=mGlobal.GeneralGenerateHTMLCodeHandlebars(".openrpa-hidden-robotrdpactive-control-panel",lResponseJSON) + $(".openrpa-robotrdpactive-control-panel").html(lHTMLCode) + } }); \ No newline at end of file diff --git a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.xhtml b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.xhtml index 22b64a04..d25cd713 100644 --- a/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.xhtml +++ b/Resources/WPy32-3720/python-3.7.2/Lib/site-packages/pyOpenRPA/Resources/Web/orpa/orc.xhtml @@ -22,16 +22,16 @@ Оркестратор pyOpenRPA - - + + - - - + + + @@ -234,27 +233,28 @@
{{#HandlebarsList}}
+
+
Session key: {{{SessionKeyStr}}}
+ {{{SessionHexStr}}} +
-
Переподключить
+
Переподключить
{{#if IsIgnoredBool}} -
Игнорировать
+
Игнорировать
{{else}} -
Игнорировать
+
Игнорировать
{{/if}}
{{#if IsFullScreenBool}} -
Полный экран
+
Полный экран
{{else}} -
Полный экран
+
Полный экран
{{/if}}
-
-
Session key: {{{SessionKeyStr}}}
- {{{SessionHexStr}}} -
+
{{/HandlebarsList}}
@@ -423,13 +423,13 @@

-
[документация]def UIOSelectorList(inUIOSelectorStr, inUIO=None) -> list: """L+,W+: Получить список UIO объектов по UIO селектору. @@ -386,7 +387,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIOList = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr) + lUIOList = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() :param inUIOSelectorStr: XPATH или CSS селектор UI объекта на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath @@ -421,7 +422,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorFirst(inUIOSelectorStr = lUIOSelectorStr) + lUIO = UIWeb.UIOSelectorFirst(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() :param inUIOSelectorStr: XPATH или CSS селектор UI объекта на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath @@ -446,7 +447,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] lTextStr = UIWeb.UIOTextGet(inUIO=lUIO) UIWeb.BrowserClose() @@ -467,7 +468,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeGet(inUIO=lUIO, inAttributeStr = "href") UIWeb.BrowserClose() @@ -490,7 +491,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeStyleGet(inUIO=lUIO, inAttributeStr = "href") UIWeb.BrowserClose() @@ -513,7 +514,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeSet(inUIO=lUIO, inAttributeStr = "href", inValue = "https://mail.ru") UIWeb.BrowserClose() @@ -538,7 +539,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeRemove(lUIO, "href") UIWeb.BrowserClose() @@ -561,7 +562,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeStyleSet(inUIO=lUIO, inAttributeStr = "color", inValue = "grey") UIWeb.BrowserClose() @@ -586,7 +587,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeStyleRemove(lUIO, "color") UIWeb.BrowserClose() @@ -609,7 +610,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] + lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIOClick(inUIO = lUIO) UIWeb.BrowserClose() @@ -628,7 +629,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - UIOSelectorHighlight(inUIOSelectorStr = lUIOSelectorStr) + UIWeb.UIOSelectorHighlight(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() :param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath @@ -684,7 +685,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - UIOSelectorClick(inUIOSelectorStr = lUIOSelectorStr) + UIWeb.UIOSelectorClick(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() :param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath @@ -702,7 +703,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lAppearUIOList = UIOSelectorWaitAppear(inUIOSelectorStr = lUIOSelectorStr) + lAppearUIOList = UIWeb.UIOSelectorWaitAppear(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() :param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath @@ -734,7 +735,7 @@ UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - UIOSelectorWaitDisappear(inUIOSelectorStr = lUIOSelectorStr) + UIWeb.UIOSelectorWaitDisappear(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() :param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath @@ -766,7 +767,7 @@ from pyOpenRPA.Robot import UIWeb lUIOSelectorStr = "#grid > div.grid-middle > div.grid__main-col.svelte-2y66pa > div.grid_newscol.grid_newscol__more-pulse.svelte-1yvqfic > div.grid__ccol.svelte-1yvqfic > ul > li:nth-child(5) > div > a" lUIOSelectorStr = "//*[@id=\"grid\"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" - lResultStr = UIOSelectorDetect(inUIOSelectorStr = lUIOSelectorStr) + lResultStr = UIWeb.UIOSelectorDetect(inUIOSelectorStr = lUIOSelectorStr) :param inUIOSelectorStr: XPATH или CSS селектор UI объекта на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath :type inUIOSelectorStr: str diff --git a/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/Debugger.html b/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/Debugger.html index abf585b5..25a417a7 100755 --- a/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/Debugger.html +++ b/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/Debugger.html @@ -26,7 +26,7 @@ - pyOpenRPA.Tools.Debugger — документация pyOpenRPA v1.3.0 v1.3.0 + pyOpenRPA.Tools.Debugger — документация pyOpenRPA v1.3.1 v1.3.1 @@ -73,7 +73,7 @@ - pyOpenRPA v1.3.0 + pyOpenRPA v1.3.1 @@ -119,7 +119,8 @@
  • 5. Функции Clipboard
  • 6. Функции Mouse
  • 7. Функции Screen
  • -
  • 8. Как использовать?
  • +
  • 8. Функции Audio
  • +
  • 9. Как использовать?
  • МОДУЛЬ СТУДИЯ

      @@ -156,7 +157,7 @@ @@ -229,6 +230,7 @@ global gKWARGS gKWARGS = inKWARGS lThread = threading.Thread(target=LiveDebugCheckLoop) + lThread.setName("DEBUG_LIVE") lThread.start()
    diff --git a/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/StopSafe.html b/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/StopSafe.html index 58e7cc07..f7511c06 100755 --- a/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/StopSafe.html +++ b/Wiki/RUS_Guide/html/_modules/pyOpenRPA/Tools/StopSafe.html @@ -26,7 +26,7 @@ - pyOpenRPA.Tools.StopSafe — документация pyOpenRPA v1.3.0 v1.3.0 + pyOpenRPA.Tools.StopSafe — документация pyOpenRPA v1.3.1 v1.3.1 @@ -73,7 +73,7 @@ - pyOpenRPA v1.3.0 + pyOpenRPA v1.3.1 @@ -119,7 +119,8 @@
  • 5. Функции Clipboard
  • 6. Функции Mouse
  • 7. Функции Screen
  • -
  • 8. Как использовать?
  • +
  • 8. Функции Audio
  • +
  • 9. Как использовать?
  • МОДУЛЬ СТУДИЯ

      @@ -156,7 +157,7 @@ diff --git a/Wiki/RUS_Guide/html/_sources/Orchestrator/01_Orchestrator.rst.txt b/Wiki/RUS_Guide/html/_sources/Orchestrator/01_Orchestrator.rst.txt index 09d195ee..5e99c531 100755 --- a/Wiki/RUS_Guide/html/_sources/Orchestrator/01_Orchestrator.rst.txt +++ b/Wiki/RUS_Guide/html/_sources/Orchestrator/01_Orchestrator.rst.txt @@ -21,6 +21,10 @@ - Ролевая модель разграничения доступа - Функциональность очередей для координации роботов +В качестве основы для web сервера используется один из самых прогрессивных и производительных фреймворков от FastAPI. + +Пример использования FastAPI см. в GIT/Orchestrator/config.py + ************************************************************************ Концепция единого глобального словаря настроек (GSettings) ************************************************************************ diff --git a/Wiki/RUS_Guide/html/_sources/Orchestrator/04_HowToUse.rst.txt b/Wiki/RUS_Guide/html/_sources/Orchestrator/04_HowToUse.rst.txt index c92f98b6..55d371a5 100755 --- a/Wiki/RUS_Guide/html/_sources/Orchestrator/04_HowToUse.rst.txt +++ b/Wiki/RUS_Guide/html/_sources/Orchestrator/04_HowToUse.rst.txt @@ -10,7 +10,7 @@ **Для этого достаточно (выбрать одно):** -- запустить .cmd файл, расположенный в папке pyOpenRPA по адресу: Orchestrator\pyOpenRPA.Orchestrator_x64.cmd +- запустить демо-стэнд: запустить .cmd файл, расположенный в папке pyOpenRPA по адресу: Orchestrator\start.cmd (для Windows) и start.sh (для Linux). Далее перейти в браузер по адресу: http://localhost:1024 - в свой .py скрипт добавить следующий код (см. ниже) .. code-block:: python @@ -23,12 +23,12 @@ ****************************** -Параметры настройки +Конфигурационный файл config.py ****************************** Также вы можете выполнить более тонкую настройку параметров Оркестратора. Ниже пример такой настройки: -.. include:: ../../../Orchestrator/OrchestratorSettings.py +.. include:: ../../../Orchestrator/config.py :literal: diff --git a/Wiki/RUS_Guide/html/_sources/Robot/01_Robot.rst.txt b/Wiki/RUS_Guide/html/_sources/Robot/01_Robot.rst.txt index dddf9006..0332b664 100755 --- a/Wiki/RUS_Guide/html/_sources/Robot/01_Robot.rst.txt +++ b/Wiki/RUS_Guide/html/_sources/Robot/01_Robot.rst.txt @@ -25,6 +25,10 @@ - Mouse: инструменты взаимодействия с мышью. Перейти к описанию функций: :ref:`module.robot.mouse` - Screen: инструменты взаимодействия с эраном рабочего стола. Перейти к описанию функций: :ref:`module.robot.screen` + +- **Уровень доступа к звуковым каналам передачи данных (микрофон, динамик)** + + - Audio: инструменты взаимодействия с аудио. Перейти к описанию функций: :ref:`module.robot.audio` Дорогие коллеги! diff --git a/Wiki/RUS_Guide/html/_sources/Robot/08_audio.rst.txt b/Wiki/RUS_Guide/html/_sources/Robot/08_audio.rst.txt new file mode 100644 index 00000000..2b12c79a --- /dev/null +++ b/Wiki/RUS_Guide/html/_sources/Robot/08_audio.rst.txt @@ -0,0 +1,55 @@ +.. _module.robot.audio: + +#################################### +8. Функции Audio +#################################### + +!ВНИМАНИЕ! ДЛЯ КОРРЕКТНОЙ РАБОТЫ МОДУЛЯ ТРЕБУЕТСЯ КОМПОНЕНТ ffmpeg.exe (Для Windows x64 можно найти в pyOpenRPA\Resources\WAudio). На него должен указывать один из путей в переменной окружения PATH. Или ffmpeg.exe должен быть расположен в рабочей директории (working directory) + +!ВНИМАНИЕ! ДЛЯ ВИРТУАЛЬНОЙ МАШИНЫ МОЖЕТ ПОТРЕБОВАТЬСЯ КОМПОНЕНТ ВИРТУАЛЬНОГО АУДИОДРАЙВЕРА (Для Windows x64 можно найти в pyOpenRPA\Resources\WAudio\VBCABLE_Driver_Pack43.zip) + +************************ +Общее +************************ + +Дорогие коллеги! + +Мы знаем, что с pyOpenRPA вы сможете существенно улучшить качество вашего бизнеса. Платформа роботизации pyOpenRPA - это разработка, которая дает возможность делать виртуальных сотрудников (программных роботов RPA) выгодными, начиная от эффекта всего в **10 тыс. руб.** И управлять ими будете только Вы! + +Если у вас останутся вопросы, то вы всегда можете обратиться в центр поддержки клиентов pyOpenRPA. Контакты: :ref:`3.-Copyrights-&-Contacts` + +pyOpenRPA - роботы помогут! + +************************ +Класс Recorder +************************ + +Экземпляр класса pyOpenRPA.Robot.Audio.Recorder, который обеспечивает захват звука (с микрофона или из приложений) и сохраняет в виде аудиофайла (множества аудиофайлов) + + +************************************************** +Описание функций +************************************************** + +Описание каждой функции начинается с обозначения L-,W+, что означает, что функция не поддерживается в ОС Linux (L) и поддерживается в Windows (W) + +.. automodule:: pyOpenRPA.Robot.Audio + :members: + :autosummary: + + +.. autoclass:: pyOpenRPA.Robot.Audio.Recorder + :members: + :autosummary: + + +****************************** +Быстрая навигация +****************************** + +- `Сообщество pyOpenRPA (telegram) `_ +- `Сообщество pyOpenRPA (tenchat) `_ +- `Сообщество pyOpenRPA (вконтакте) `_ +- `Презентация pyOpenRPA `_ +- `Портал pyOpenRPA `_ +- `Репозиторий pyOpenRPA `_ \ No newline at end of file diff --git a/Wiki/RUS_Guide/html/_sources/Robot/08_HowToUse.rst.txt b/Wiki/RUS_Guide/html/_sources/Robot/09_HowToUse.rst.txt old mode 100755 new mode 100644 similarity index 81% rename from Wiki/RUS_Guide/html/_sources/Robot/08_HowToUse.rst.txt rename to Wiki/RUS_Guide/html/_sources/Robot/09_HowToUse.rst.txt index 5c23544e..231d207d --- a/Wiki/RUS_Guide/html/_sources/Robot/08_HowToUse.rst.txt +++ b/Wiki/RUS_Guide/html/_sources/Robot/09_HowToUse.rst.txt @@ -1,9 +1,25 @@ #################################### -8. Как использовать? +9. Как использовать? #################################### Модуль РОБОТ - это ключевое звено, которое отвечает за продуктивную роботизацию процесса. Данный модуль не имеет графический или консольный интерфейс - он подключается в качестве библиотеки в проект робота, что позволяет выполнять операции максимально быстро. А также позволяет с легкостью интегрировать робота в другие проекты. + +************************************************** +Быстрый запуск (Quickstart) +************************************************** + +Платформа pyOpenRPA содержит инструменты быстрого прототипирования роботов. Вы можете провести серию экспериментов роботизации без развертывания полноценной инфраструктуры робота - в рамках одного уже преднастроенного файла. + +Для быстрого запуска робота необходимо: + +- Открыть Jupyter-notebooks: GIT\Tools\Jupyter-notebooks\start.cmd (для Windows) или GIT\Tools\Jupyter-notebooks\start.sh (для Linux). Откроется окно консоли, в которой будет отображен адрес для входа на веб страницу Jupyter-notebooks. +- В web окне Jupyter-notebooks открыть Quickstart\Robot.ipynb + +Быстрая инфраструктура для прототипирования робота готова! + +В файле Robot.ipynb содержится вся необходимая информация, которая позволит решить любую поставленную задачу. + ************************************************** Как запустить скрипт робота? ************************************************** @@ -12,6 +28,7 @@ - Скрипт Python (файл .py) - Скрипт в Студии pyOpenRPA +- Скрипт в Jupyter (см. раздел "Быстрый запуск") Скрипт Python (файл .py) diff --git a/Wiki/RUS_Guide/html/_sources/Studio/02_HowToUse.rst.txt b/Wiki/RUS_Guide/html/_sources/Studio/02_HowToUse.rst.txt index fb0c6678..39026dcf 100755 --- a/Wiki/RUS_Guide/html/_sources/Studio/02_HowToUse.rst.txt +++ b/Wiki/RUS_Guide/html/_sources/Studio/02_HowToUse.rst.txt @@ -22,7 +22,7 @@ Как запустить? ************************ -- Запустить файл Studio\pyOpenRPA.Studio_x64.cmd +- Запустить файл Studio\start.cmd - Ожидать текст в окне консоли: "running server". Браузер, установленный по умолчанию откроется автоматически - **!ВНИМАНИЕ!** Студия поддерживает все версии браузеров, кроме Internet Explorer. diff --git a/Wiki/RUS_Guide/html/_static/documentation_options.js b/Wiki/RUS_Guide/html/_static/documentation_options.js index 3925cade..a0c9447f 100755 --- a/Wiki/RUS_Guide/html/_static/documentation_options.js +++ b/Wiki/RUS_Guide/html/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: 'v1.3.0', + VERSION: 'v1.3.1', LANGUAGE: 'ru', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/Wiki/RUS_Guide/html/genindex.html b/Wiki/RUS_Guide/html/genindex.html index c2dab04b..cbb6ec5f 100755 --- a/Wiki/RUS_Guide/html/genindex.html +++ b/Wiki/RUS_Guide/html/genindex.html @@ -26,7 +26,7 @@ - Алфавитный указатель — документация pyOpenRPA v1.3.0 v1.3.0 + Алфавитный указатель — документация pyOpenRPA v1.3.1 v1.3.1 @@ -73,7 +73,7 @@ - pyOpenRPA v1.3.0 + pyOpenRPA v1.3.1 @@ -119,7 +119,8 @@
    • 5. Функции Clipboard
    • 6. Функции Mouse
    • 7. Функции Screen
    • -
    • 8. Как использовать?
    • +
    • 8. Функции Audio
    • +
    • 9. Как использовать?

    МОДУЛЬ СТУДИЯ

    - + - +

    МОДУЛЬ СТУДИЯ

    Технические требования

    -

    ВЕРСИЯ v1.3.0

    +

    ВЕРСИЯ v1.3.1

    ! ВНИМАНИЕ ! Требуется пакет KB2999226 если используется windows Vista/7/8/8.1/Server 2008/Server 2012 https://support.microsoft.com/ru-ru/help/2999226 Использование компонента OpenCV: ОС Windows 7/8/8/10 (Windows Server только с 2016) В июле 2022 будет выпущен релиз pyOpenRPA, который будет работать на ОС семейства Linux (Ubuntu / Astra)

    @@ -455,9 +456,17 @@
  • Быстрая навигация
  • -
  • 8. Как использовать? @@ -507,8 +516,8 @@
  • 4. Как использовать?
  • 5. Права доступа пользователей UAC -

    .. v1.3.0 replace:: v1.3.0

    +

    .. v1.3.1 replace:: v1.3.1

  • diff --git a/Wiki/RUS_Guide/html/objects.inv b/Wiki/RUS_Guide/html/objects.inv index 1439d530..f47eeacc 100755 Binary files a/Wiki/RUS_Guide/html/objects.inv and b/Wiki/RUS_Guide/html/objects.inv differ diff --git a/Wiki/RUS_Guide/html/py-modindex.html b/Wiki/RUS_Guide/html/py-modindex.html index 899d61ac..bec1d14e 100755 --- a/Wiki/RUS_Guide/html/py-modindex.html +++ b/Wiki/RUS_Guide/html/py-modindex.html @@ -26,7 +26,7 @@ - Содержание модулей Python — документация pyOpenRPA v1.3.0 v1.3.0 + Содержание модулей Python — документация pyOpenRPA v1.3.1 v1.3.1 @@ -76,7 +76,7 @@ - pyOpenRPA v1.3.0 + pyOpenRPA v1.3.1 @@ -122,7 +122,8 @@
  • 5. Функции Clipboard
  • 6. Функции Mouse
  • 7. Функции Screen
  • -
  • 8. Как использовать?
  • +
  • 8. Функции Audio
  • +
  • 9. Как использовать?
  • МОДУЛЬ СТУДИЯ

    МОДУЛЬ СТУДИЯ

      @@ -159,7 +160,7 @@ diff --git a/Wiki/RUS_Guide/html/searchindex.js b/Wiki/RUS_Guide/html/searchindex.js index 85f1390f..2b49d02e 100755 --- a/Wiki/RUS_Guide/html/searchindex.js +++ b/Wiki/RUS_Guide/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["01_HowToInstall","03_Copyrights_Contacts","Agent/02_Defs","Orchestrator/01_Orchestrator","Orchestrator/02_Defs","Orchestrator/03_gSettingsTemplate","Orchestrator/04_HowToUse","Orchestrator/05_UAC","Robot/01_Robot","Robot/02_uidesktop","Robot/03_uiweb","Robot/04_keyboard","Robot/05_clipboard","Robot/06_mouse","Robot/07_screen","Robot/08_HowToUse","Studio/01_Studio","Studio/02_HowToUse","Tools/02_Defs","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["01_HowToInstall.rst","03_Copyrights_Contacts.rst","Agent\\02_Defs.rst","Orchestrator\\01_Orchestrator.rst","Orchestrator\\02_Defs.rst","Orchestrator\\03_gSettingsTemplate.rst","Orchestrator\\04_HowToUse.rst","Orchestrator\\05_UAC.rst","Robot\\01_Robot.rst","Robot\\02_uidesktop.rst","Robot\\03_uiweb.rst","Robot\\04_keyboard.rst","Robot\\05_clipboard.rst","Robot\\06_mouse.rst","Robot\\07_screen.rst","Robot\\08_HowToUse.rst","Studio\\01_Studio.rst","Studio\\02_HowToUse.rst","Tools\\02_Defs.rst","index.rst"],objects:{"pyOpenRPA.Agent":{__Agent__:[2,0,0,"-"]},"pyOpenRPA.Agent.__Agent__":{OSCMD:[2,1,1,""],OSFileBinaryDataBase64StrAppend:[2,1,1,""],OSFileBinaryDataBase64StrCreate:[2,1,1,""],OSFileBinaryDataBase64StrReceive:[2,1,1,""],OSFileMTimeGet:[2,1,1,""],OSFileTextDataStrCreate:[2,1,1,""],OSFileTextDataStrReceive:[2,1,1,""],ProcessWOExeUpperUserListGet:[2,1,1,""]},"pyOpenRPA.Orchestrator":{__Orchestrator__:[4,0,0,"-"]},"pyOpenRPA.Orchestrator.__Orchestrator__":{ActivityItemCreate:[4,1,1,""],ActivityItemDefAliasCreate:[4,1,1,""],ActivityItemDefAliasModulesLoad:[4,1,1,""],ActivityItemDefAliasUpdate:[4,1,1,""],ActivityItemHelperDefAutofill:[4,1,1,""],ActivityItemHelperDefList:[4,1,1,""],AgentActivityItemAdd:[4,1,1,""],AgentActivityItemExists:[4,1,1,""],AgentActivityItemReturnExists:[4,1,1,""],AgentActivityItemReturnGet:[4,1,1,""],AgentOSCMD:[4,1,1,""],AgentOSFileBinaryDataBase64StrAppend:[4,1,1,""],AgentOSFileBinaryDataBase64StrCreate:[4,1,1,""],AgentOSFileBinaryDataBase64StrReceive:[4,1,1,""],AgentOSFileBinaryDataBytesCreate:[4,1,1,""],AgentOSFileBinaryDataReceive:[4,1,1,""],AgentOSFileSend:[4,1,1,""],AgentOSFileTextDataStrCreate:[4,1,1,""],AgentOSFileTextDataStrReceive:[4,1,1,""],AgentOSLogoff:[4,1,1,""],AgentProcessWOExeUpperUserListGet:[4,1,1,""],GSettingsGet:[4,1,1,""],GSettingsKeyListValueAppend:[4,1,1,""],GSettingsKeyListValueGet:[4,1,1,""],GSettingsKeyListValueOperatorPlus:[4,1,1,""],GSettingsKeyListValueSet:[4,1,1,""],OSCMD:[4,1,1,""],OSCredentialsVerify:[4,1,1,""],OSLogoff:[4,1,1,""],OSRemotePCRestart:[4,1,1,""],OSRestart:[4,1,1,""],Orchestrator:[4,1,1,""],OrchestratorInitWait:[4,1,1,""],OrchestratorIsAdmin:[4,1,1,""],OrchestratorIsInited:[4,1,1,""],OrchestratorLoggerGet:[4,1,1,""],OrchestratorPySearchInit:[4,1,1,""],OrchestratorRerunAsAdmin:[4,1,1,""],OrchestratorRestart:[4,1,1,""],OrchestratorScheduleGet:[4,1,1,""],OrchestratorSessionRestore:[4,1,1,""],OrchestratorSessionSave:[4,1,1,""],OrchestratorThreadStart:[4,1,1,""],ProcessDefIntervalCall:[4,1,1,""],ProcessIsStarted:[4,1,1,""],ProcessListGet:[4,1,1,""],ProcessStart:[4,1,1,""],ProcessStop:[4,1,1,""],ProcessorActivityItemAppend:[4,1,1,""],ProcessorActivityItemCreate:[4,1,1,""],ProcessorAliasDefCreate:[4,1,1,""],ProcessorAliasDefUpdate:[4,1,1,""],PythonStart:[4,1,1,""],RDPSessionCMDRun:[4,1,1,""],RDPSessionConnect:[4,1,1,""],RDPSessionDisconnect:[4,1,1,""],RDPSessionFileStoredRecieve:[4,1,1,""],RDPSessionFileStoredSend:[4,1,1,""],RDPSessionLogoff:[4,1,1,""],RDPSessionMonitorStop:[4,1,1,""],RDPSessionProcessStartIfNotRunning:[4,1,1,""],RDPSessionProcessStop:[4,1,1,""],RDPSessionReconnect:[4,1,1,""],RDPTemplateCreate:[4,1,1,""],SchedulerActivityTimeAddWeekly:[4,1,1,""],StorageRobotExists:[4,1,1,""],StorageRobotGet:[4,1,1,""],UACKeyListCheck:[4,1,1,""],UACSuperTokenUpdate:[4,1,1,""],UACUpdate:[4,1,1,""],UACUserDictGet:[4,1,1,""],WebAuditMessageCreate:[4,1,1,""],WebCPUpdate:[4,1,1,""],WebListenCreate:[4,1,1,""],WebRequestGet:[4,1,1,""],WebRequestParseBodyBytes:[4,1,1,""],WebRequestParseBodyJSON:[4,1,1,""],WebRequestParseBodyStr:[4,1,1,""],WebRequestParseFile:[4,1,1,""],WebRequestParsePath:[4,1,1,""],WebRequestResponseSend:[4,1,1,""],WebURLConnectDef:[4,1,1,""],WebURLConnectFile:[4,1,1,""],WebURLConnectFolder:[4,1,1,""],WebURLIndexChange:[4,1,1,""],WebUserInfoGet:[4,1,1,""],WebUserIsSuperToken:[4,1,1,""],WebUserUACHierarchyGet:[4,1,1,""]},"pyOpenRPA.Robot":{Clipboard:[12,0,0,"-"],Keyboard:[11,0,0,"-"],Mouse:[13,0,0,"-"],Screen:[14,0,0,"-"],UIDesktop:[9,0,0,"-"],UIWeb:[10,0,0,"-"]},"pyOpenRPA.Robot.Clipboard":{Get:[12,1,1,""],Set:[12,1,1,""]},"pyOpenRPA.Robot.Keyboard":{"KEY_RUS_\u0416":[11,2,1,"pyOpenRPA.Robot.Keyboard.KEY_RUS_"],Down:[11,1,1,""],HotkeyCombination:[11,1,1,""],HotkeyCtrlA_CtrlC:[11,1,1,""],HotkeyCtrlV:[11,1,1,""],IsDown:[11,1,1,""],KEY_ENG_COLON:[11,2,1,""],KEY_HOT_COLON:[11,2,1,""],Send:[11,1,1,""],Up:[11,1,1,""],Wait:[11,1,1,""],Write:[11,1,1,""]},"pyOpenRPA.Robot.Mouse":{Click:[13,1,1,""],ClickDouble:[13,1,1,""],Down:[13,1,1,""],MoveTo:[13,1,1,""],ScrollHorizontal:[13,1,1,""],ScrollVertical:[13,1,1,""],Up:[13,1,1,""]},"pyOpenRPA.Robot.Screen":{BoxAnchorRuleCheck:[14,1,1,""],BoxCreate:[14,1,1,""],BoxDraw:[14,1,1,""],BoxGetPoint:[14,1,1,""],BoxModify:[14,1,1,""],BoxMoveTo:[14,1,1,""],BoxOverlay:[14,1,1,""],ImageClick:[14,1,1,""],ImageExists:[14,1,1,""],ImageLocateAll:[14,1,1,""],ImageWaitAppear:[14,1,1,""],ImageWaitDisappear:[14,1,1,""],PointClick:[14,1,1,""],PointClickDouble:[14,1,1,""],PointCreate:[14,1,1,""],PointDown:[14,1,1,""],PointModify:[14,1,1,""],PointMoveTo:[14,1,1,""],PointUp:[14,1,1,""]},"pyOpenRPA.Robot.UIDesktop":{BackendStr_GetTopLevelList_UIOInfo:[9,1,1,""],Get_OSBitnessInt:[9,1,1,""],PWASpecification_Get_PWAApplication:[9,1,1,""],PWASpecification_Get_UIO:[9,1,1,""],UIOEI_Convert_UIOInfo:[9,1,1,""],UIOSelectorSecs_WaitAppear_Bool:[9,1,1,""],UIOSelectorSecs_WaitDisappear_Bool:[9,1,1,""],UIOSelectorUIOActivity_Run_Dict:[9,1,1,""],UIOSelector_Exist_Bool:[9,1,1,""],UIOSelector_FocusHighlight:[9,1,1,""],UIOSelector_GetChildList_UIOList:[9,1,1,""],UIOSelector_Get_BitnessInt:[9,1,1,""],UIOSelector_Get_BitnessStr:[9,1,1,""],UIOSelector_Get_UIO:[9,1,1,""],UIOSelector_Get_UIOActivityList:[9,1,1,""],UIOSelector_Get_UIOInfo:[9,1,1,""],UIOSelector_Get_UIOInfoList:[9,1,1,""],UIOSelector_Get_UIOList:[9,1,1,""],UIOSelector_Highlight:[9,1,1,""],UIOSelector_SafeOtherGet_Process:[9,1,1,""],UIOSelector_SearchChildByMouse_UIO:[9,1,1,""],UIOSelector_SearchChildByMouse_UIOTree:[9,1,1,""],UIOSelector_SearchProcessNormalize_UIOSelector:[9,1,1,""],UIOSelector_SearchUIONormalize_UIOSelector:[9,1,1,""],UIOSelector_TryRestore_Dict:[9,1,1,""],UIOSelectorsSecs_WaitAppear_List:[9,1,1,""],UIOSelectorsSecs_WaitDisappear_List:[9,1,1,""],UIOXY_SearchChild_ListDict:[9,1,1,""],UIO_FocusHighlight:[9,1,1,""],UIO_GetCtrlIndex_Int:[9,1,1,""],UIO_Highlight:[9,1,1,""]},"pyOpenRPA.Robot.UIWeb":{BrowserChange:[10,1,1,""],BrowserChromeStart:[10,1,1,""],BrowserClose:[10,1,1,""],PageJSExecute:[10,1,1,""],PageOpen:[10,1,1,""],PageScrollTo:[10,1,1,""],UIOAttributeGet:[10,1,1,""],UIOAttributeRemove:[10,1,1,""],UIOAttributeSet:[10,1,1,""],UIOAttributeStyleGet:[10,1,1,""],UIOAttributeStyleRemove:[10,1,1,""],UIOAttributeStyleSet:[10,1,1,""],UIOClick:[10,1,1,""],UIOMouseSearchInit:[10,1,1,""],UIOMouseSearchReturn:[10,1,1,""],UIOSelectorClick:[10,1,1,""],UIOSelectorDetect:[10,1,1,""],UIOSelectorFirst:[10,1,1,""],UIOSelectorHighlight:[10,1,1,""],UIOSelectorList:[10,1,1,""],UIOSelectorWaitAppear:[10,1,1,""],UIOSelectorWaitDisappear:[10,1,1,""],UIOTextGet:[10,1,1,""]},"pyOpenRPA.Tools":{Debugger:[18,0,0,"-"],StopSafe:[18,0,0,"-"]},"pyOpenRPA.Tools.Debugger":{LiveDebugCheckThread:[18,1,1,""]},"pyOpenRPA.Tools.StopSafe":{Init:[18,1,1,""],IsStopSafe:[18,1,1,""]}},objnames:{"0":["py","module","Python \u043c\u043e\u0434\u0443\u043b\u044c"],"1":["py","function","Python \u0444\u0443\u043d\u043a\u0446\u0438\u044f"],"2":["py","data","Python \u0434\u0430\u043d\u043d\u044b\u0435"]},objtypes:{"0":"py:module","1":"py:function","2":"py:data"},terms:{"000":19,"000036":8,"0x0c":11,"0x0d":11,"0x0e":11,"0x0f":11,"0x1":11,"0x10":11,"0x11":11,"0x11c":11,"0x11d":11,"0x12":11,"0x13":11,"0x137":11,"0x138":11,"0x14":11,"0x15":11,"0x15d":11,"0x16":11,"0x17":11,"0x18":11,"0x19":11,"0x1a":11,"0x1b":11,"0x1c":11,"0x1d":11,"0x1e":11,"0x1f":11,"0x2":11,"0x20":11,"0x21":11,"0x22":11,"0x23":11,"0x24":11,"0x25":11,"0x26":11,"0x27":11,"0x28":11,"0x29":11,"0x2a":11,"0x2b":11,"0x2c":11,"0x2d":11,"0x2e":11,"0x2f":11,"0x3":11,"0x30":11,"0x31":11,"0x32":11,"0x33":11,"0x34":11,"0x35":11,"0x36":11,"0x37":11,"0x38":11,"0x39":11,"0x3a":11,"0x3b":11,"0x3c":11,"0x3d":11,"0x3e":11,"0x3f":11,"0x4":11,"0x40":11,"0x41":11,"0x42":11,"0x43":11,"0x44":11,"0x45":11,"0x46":11,"0x47":11,"0x48":11,"0x49":11,"0x4a":11,"0x4b":11,"0x4c":11,"0x4d":11,"0x4e":11,"0x4f":11,"0x5":11,"0x50":11,"0x51":11,"0x52":11,"0x53":11,"0x57":11,"0x58":11,"0x5b":11,"0x5c":11,"0x6":11,"0x7":11,"0x7c":11,"0x7d":11,"0x7e":11,"0x7f":11,"0x8":11,"0x80":11,"0x81":11,"0x82":11,"0x83":11,"0x84":11,"0x85":11,"0x86":11,"0x87":11,"0x9":11,"0xa":11,"0xb":11,"100":[5,8,9,10,11,13,14],"1000":14,"100px":13,"101":4,"1024":0,"105":8,"1050":[4,5],"120":5,"1200":5,"121":4,"1227700251350":1,"123":4,"125310":1,"127":4,"130":8,"140124673757368":9,"141":1,"150":[8,13,14],"150px":13,"160":14,"1680":[4,5],"1680x1050":5,"197022":1,"1\u0433\u043e":14,"1yvqfic":10,"200":[9,13,14],"2008":19,"2012":19,"2016":19,"2019":19,"2019\u0433":1,"2021\u0433":1,"2022":19,"2022\u0433":1,"222":5,"230":8,"233":1,"265":14,"299":19,"2999226":19,"2python":15,"2y66pa":10,"300":5,"3105":0,"32768":9,"3389":[4,5],"3600":5,"3720":[0,4,9,15],"3720python":15,"412":4,"443":4,"460":14,"50000000":5,"512":19,"600":5,"640x480":5,"722":1,"771801001":1,"77767775":4,"77777sdfsdf77777dsfdfsf77777777":4,"8081":5,"86400":9,"900":19,"906":1,"9718191421":1,"995":1,"\u0430":[1,4,11,15,19],"\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d":[2,4,9,14],"\u0430\u0432\u0442\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446":4,"\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446":19,"\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430":19,"\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a":[0,4,9,17],"\u0430\u0432\u0442\u043e\u0440":19,"\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430":4,"\u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442":19,"\u0430\u0433\u0435\u043d\u0442":[2,4],"\u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d":3,"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440":4,"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0440\u0430\u0442\u043e\u0440":4,"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d":[3,19],"\u0430\u0434\u0440\u0435\u0441":[1,4,6,9,10,19],"\u0430\u0434\u0440\u0435\u0441\u0430\u0446":9,"\u0430\u0434\u0440\u0435\u0441\u0441\u0430\u0446":9,"\u0430\u043a\u0442\u0438\u0432\u0430\u0446":19,"\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430":17,"\u0430\u043a\u0442\u0438\u0432\u043d":[3,9,10,11,17,19],"\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d":4,"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c":19,"\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d":4,"\u0430\u043d\u0430\u043b\u0438\u0437":4,"\u0430\u043d\u0430\u043b\u043e\u0433":19,"\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d":[13,14],"\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a":11,"\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442":[4,9,10,13],"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440":[4,19],"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d":3,"\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d":[3,4],"\u0430\u0441\u0444\u0440":8,"\u0430\u0442\u0440\u0438\u0431\u0443\u0442":[9,10,19],"\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d":9,"\u0430\u0443\u0434":4,"\u0430\u0443\u0434\u0438\u0442":[4,19],"\u0431\u0430\u0437":9,"\u0431\u0430\u0437\u043e\u0432":[4,9,11,13,14],"\u0431\u0430\u0439\u0442":[2,4],"\u0431\u0434":19,"\u0431\u0435\u0437":[0,2,4,15,19],"\u0431\u0435\u0437\u043e\u043f\u0430\u0441":2,"\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d":[2,3,4,7,19],"\u0431\u0435\u0441\u043f\u0435\u0440\u0435\u0431\u043e\u0439\u043d":3,"\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d":[1,19],"\u0431\u0435\u0441\u0441\u0440\u043e\u0447\u043d":19,"\u0431\u0435\u0441\u0448\u043e\u0432\u043d":3,"\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a":[8,9,11,15,19],"\u0431\u0438\u0437\u043d\u0435\u0441":[3,4,8,14,16,19],"\u0431\u0438\u043d\u0430\u0440\u043d":[2,4],"\u0431\u0438\u0442":9,"\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440":2,"\u0431\u043b\u043e\u043a":4,"\u0431\u043b\u043e\u043a\u0438\u0440":[10,11,19],"\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a":1,"\u0431\u043b\u043e\u043a\u043d\u043e\u0442":4,"\u0431\u043e\u043b":[4,6,9,19],"\u0431\u043e\u043b\u044c\u0448":[9,19],"\u0431\u043e\u0442":19,"\u0431\u0440\u0430\u0443\u0437\u0435\u0440":[8,10,16,17,19],"\u0431\u0443\u0434\u0435\u0442":[0,3,4,8,9,10,11,14,16,19],"\u0431\u0443\u0434\u0443\u0442":[4,7,15],"\u0431\u0443\u043a\u0432":[8,11],"\u0431\u0443\u043b\u0435\u0432":[9,14],"\u0431\u0443\u0444\u0435\u0440":[0,4,8,11,12,15,19],"\u0431\u044b":[9,14],"\u0431\u044b\u043b":[0,3,4,9,11],"\u0431\u044b\u0442":[3,4,7,9,10,19],"\u0432":[0,1,2,3,4,6,7,8,9,10,12,13,14,15,16,19],"\u0432\u0430\u043c":[1,3,4],"\u0432\u0430\u0440\u0438\u0430\u043d\u0442":[0,4,9,10,13,14,19],"\u0432\u0430\u0441":[1,3,7,8,11,14,16,17,19],"\u0432\u0430\u0448":[3,8,14,16],"\u0432\u0432\u0435\u0434":9,"\u0432\u0432\u0435\u0440\u0445":[13,14],"\u0432\u0432\u0435\u0441\u0442":11,"\u0432\u0432\u043e\u0434":[9,11],"\u0432\u0435":4,"\u0432\u0435\u0431":[3,4,8,9,10,15,16,19],"\u0432\u0435\u0434\u0435\u0442":9,"\u0432\u0435\u043b\u0438\u0447\u0438\u043d":10,"\u0432\u0435\u043d\u0434\u043e\u0440":19,"\u0432\u0435\u0440":13,"\u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446":4,"\u0432\u0435\u0440\u043d":4,"\u0432\u0435\u0440\u043d\u0435\u0442":[2,4,11],"\u0432\u0435\u0440\u043d\u0443\u0442":[2,4,9,14],"\u0432\u0435\u0440\u0441":[3,4,17,19],"\u0432\u0435\u0440\u0442\u0438\u043a\u0430":[10,14],"\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b":14,"\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d":[10,13,14],"\u0432\u0435\u0440\u0445\u043d":[2,4,9,13,14],"\u0432\u0435\u0447\u043d":4,"\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432":[0,4,8,9,10,11,12,13,14,15,16],"\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430":9,"\u0432\u0437\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432":9,"\u0432\u0437\u044f\u0442":4,"\u0432\u0438\u0434":[4,9],"\u0432\u0438\u0434\u0438\u043c":9,"\u0432\u0438\u0434\u043d":9,"\u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d":[9,19],"\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d":[3,8,13,14,16],"\u0432\u043a\u043b\u0430\u0434\u043a":9,"\u0432\u043a\u043b\u044e\u0447":[9,19],"\u0432\u043a\u043b\u044e\u0447\u0435\u043d":9,"\u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],"\u0432\u043b\u0435\u0432":[9,13,14],"\u0432\u043b\u043e\u0436\u0435\u043d":9,"\u0432\u043c\u0435\u0441\u0442":10,"\u0432\u043d\u0435":4,"\u0432\u043d\u0435\u0434\u0440\u0435\u043d":3,"\u0432\u043d\u0435\u0441\u0442":7,"\u0432\u043d\u0438\u0437":[13,14],"\u0432\u043d\u0438\u043c\u0430\u043d":[1,4,9,10,11,12,13,14,16,17,19],"\u0432\u043d\u043e\u0441":3,"\u0432\u043d\u0443\u0442\u0440":[4,9,15],"\u0432\u043e":[4,9],"\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430":[2,4,9,10],"\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d":19,"\u0432\u043e\u0437\u043c\u043e\u0436\u043d":[3,8,9,13,14,16,19],"\u0432\u043e\u0437\u043d\u0438\u043a\u0430":19,"\u0432\u043e\u0437\u043d\u0438\u043a\u043b":0,"\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442":[4,9],"\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442":19,"\u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430":11,"\u0432\u043e\u043a\u0440\u0443\u0433":9,"\u0432\u043e\u043f\u0440\u043e\u0441":[1,3,7,8,14,16,19],"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d":4,"\u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430":3,"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430":4,"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432":[4,9,11],"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b":11,"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d":[4,9],"\u0432\u043f\u043b\u043e\u0442":19,"\u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432":11,"\u0432\u043f\u0440\u0430\u0432":[9,13,14],"\u0432\u0440\u0435\u043c":[3,4,8,9,10,11,13,14],"\u0432\u0440\u0435\u043c\u0435\u043d":[2,4,11],"\u0432\u0441\u0435":[0,3,4,7,9,11,15,17,19],"\u0432\u0441\u0435\u0433":[3,8,14,16,19],"\u0432\u0441\u0435\u0433\u0434":[3,4,7,8,9,14,16,19],"\u0432\u0441\u0435\u043c":[1,4,9,14,19],"\u0432\u0441\u0435\u0445":[2,4,9,10,14,19],"\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d":[4,11,19],"\u0432\u0441\u0442\u0430\u0432\u043a":11,"\u0432\u0441\u0442\u0440\u043e\u0435\u043d":10,"\u0432\u0441\u044e":[0,4,8,16,19],"\u0432\u0441\u044f":11,"\u0432\u0445\u043e\u0434":[0,4],"\u0432\u0445\u043e\u0434\u044f":[4,9],"\u0432\u0445\u043e\u0436\u0434\u0435\u043d":14,"\u0432\u044b":[1,3,4,6,7,8,9,10,11,14,15,16,17,19],"\u0432\u044b\u0431\u043e\u0440":9,"\u0432\u044b\u0431\u0440\u0430":[3,4,6,9,11,14,15,17,19],"\u0432\u044b\u0432\u0435\u0434":11,"\u0432\u044b\u0432\u043e\u0434":4,"\u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442":9,"\u0432\u044b\u0433\u043e\u0434\u043d":[3,8,14,16,19],"\u0432\u044b\u0434\u0435\u043b":[4,11,17],"\u0432\u044b\u0434\u0435\u043b\u0435\u043d":[9,11,17],"\u0432\u044b\u0434\u0435\u043b\u044f":9,"\u0432\u044b\u0437":[4,9],"\u0432\u044b\u0437\u0432\u0430":[4,9,10],"\u0432\u044b\u0437\u043e\u0432":[4,9,11,13,14],"\u0432\u044b\u0437\u044b\u0432\u0430":[4,9],"\u0432\u044b\u043a\u043b\u044e\u0447":4,"\u0432\u044b\u043f\u0430\u0434\u0430":9,"\u0432\u044b\u043f\u043e\u043b\u043d":[0,4,6,9,10,11,13,14,15,17],"\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d":[4,9,10,11,13,14,19],"\u0432\u044b\u043f\u043e\u043b\u043d\u044f":[4,9,10,11,15,19],"\u0432\u044b\u043f\u0443\u0441\u043a":[13,14,19],"\u0432\u044b\u043f\u0443\u0441\u043a\u0430":19,"\u0432\u044b\u043f\u0443\u0449":[11,19],"\u0432\u044b\u0440\u0430\u0436":19,"\u0432\u044b\u0440\u0430\u0436\u0435\u043d":9,"\u0432\u044b\u0441\u043e\u0442":[4,14],"\u0432\u044b\u0445\u043e\u0434\u043d":4,"\u0432\u044b\u0448":[4,14],"\u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d":19,"\u0433":1,"\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430":11,"\u0433\u0431":[4,19],"\u0433\u0433\u0446":19,"\u0433\u0434\u0435":[3,4,10,14,15],"\u0433\u0435\u043d\u0435\u0440\u0430\u043b\u044c\u043d":19,"\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440":4,"\u0433\u0435\u043d\u0435\u0440\u0430\u0446":[4,19],"\u0433\u0438\u0431\u043a":[3,7],"\u0433\u0438\u0443\u0434":4,"\u0433\u043b\u0430\u0432\u043d":[0,4,9,11],"\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d":[2,4,5,19],"\u0433\u043b\u0443\u0431\u0438\u043d":[4,9],"\u0433\u043e":[9,14,19],"\u0433\u043e\u0432\u043e\u0440":9,"\u0433\u043e\u0434":19,"\u0433\u043e\u043b\u043e\u0441\u043e\u0432":19,"\u0433\u043e\u0440":13,"\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430":[10,14],"\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b":14,"\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d":[10,13,14],"\u0433\u043e\u0440\u044f\u0447":11,"\u0433\u043e\u0442\u043e\u0432":[0,9],"\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a":[2,3,4,8,14,15,19],"\u0433\u0440\u0443\u043f\u043f":[4,7,9],"\u0433\u0443\u0438\u0434":4,"\u0434":10,"\u0434\u0430":19,"\u0434\u0430\u0435\u0442":[3,8,14,16],"\u0434\u0430\u0436":[11,19],"\u0434\u0430\u043b":4,"\u0434\u0430\u043b\u044c\u043d":[4,9],"\u0434\u0430\u043d":[3,4,8,9,10,11,13,14,15,19],"\u0434\u0430\u0442":[2,7],"\u0434\u0432\u0430\u0436\u0434":9,"\u0434\u0432\u043e\u0439\u043d":[9,13,14],"\u0434\u0435\u0439\u0441\u0442\u0432":[0,1,9,11,13,14,19],"\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430":4,"\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d":2,"\u0434\u0435\u043b\u0430":[3,8,9,14,16,19],"\u0434\u0435\u043d":4,"\u0434\u0435\u0440\u0435\u0432":[9,19],"\u0434\u0435\u0444\u0435\u043a\u0442":19,"\u0434\u0438\u0430\u043b\u0435\u043a\u0442":9,"\u0434\u0438\u0430\u043b\u043e\u0433":9,"\u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432":9,"\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440":[4,15,19],"\u0434\u0438\u0441\u043a":4,"\u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440":[4,9,15],"\u0434\u043b\u0438\u043d":14,"\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d":[0,10],"\u0434\u043b\u044f":[0,1,2,3,4,6,8,9,10,11,12,14,15,16,19],"\u0434\u043c\u0438\u0442\u0440\u0438\u0435\u0432\u0438\u0447":1,"\u0434\u043d\u0435":4,"\u0434\u043e":[4,9,10,13,14,19],"\u0434\u043e\u0431\u0430\u0432":[4,6],"\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d":4,"\u0434\u043e\u0431\u0430\u0432\u043b\u044f":4,"\u0434\u043e\u0431\u0440":19,"\u0434\u043e\u0432\u043e\u043b\u044c\u043d":9,"\u0434\u043e\u0436\u0434":17,"\u0434\u043e\u0436\u0434\u0430":[4,9,10],"\u0434\u043e\u0436\u0438\u0434":4,"\u0434\u043e\u0436\u0438\u0434\u0430":4,"\u0434\u043e\u043b\u0436":[4,9,14],"\u0434\u043e\u043b\u0436\u043d":[7,9,10],"\u0434\u043e\u043c":4,"\u0434\u043e\u043c\u0435\u043d":4,"\u0434\u043e\u043e\u0431\u043e\u0433\u0430\u0442":9,"\u0434\u043e\u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d":[4,9],"\u0434\u043e\u043f":[4,19],"\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d":9,"\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d":[4,9,19],"\u0434\u043e\u043f\u0443\u0441\u043a\u0430":[4,13,14],"\u0434\u043e\u043f\u0443\u0441\u0442":4,"\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c":[4,9,14],"\u0434\u043e\u0440\u043e\u0433":[3,8,14,16],"\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d":[6,15],"\u0434\u043e\u0441\u0442\u0443\u043f":[0,3,4,8,9,16,19],"\u0434\u043e\u0441\u0442\u0443\u043f\u043d":[2,3,4,9,11,19],"\u0434\u043e\u0447\u0435\u0440\u043d":9,"\u0434\u0440\u043e\u0431\u043d":14,"\u0434\u0440\u0443\u0433":[4,7,8,9,10,11,14,15,17,19],"\u0435":[10,11,13,14],"\u0435\u0433":[4,8,9,10,11,19],"\u0435\u0434\u0438\u043d":[5,14,19],"\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d":[4,14],"\u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d":19,"\u0435\u0441\u043b":[0,2,3,4,7,8,9,10,11,13,14,16,19],"\u0435\u0441\u0442":9,"\u0435\u0449":4,"\u0436\u0434\u0430\u0442":[4,11],"\u0436\u0435":[0,3,4],"\u0436\u0438\u0437\u043d":3,"\u0437\u0430":[4,11,13,14,15],"\u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430":19,"\u0437\u0430\u0432\u0435\u0440\u0448":[0,4],"\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d":[9,15],"\u0437\u0430\u0432\u0438\u0441":11,"\u0437\u0430\u0432\u0438\u0441\u0438\u043c":[15,19],"\u0437\u0430\u0433\u0440\u0443\u0437":4,"\u0437\u0430\u0433\u0440\u0443\u0437\u043a":10,"\u0437\u0430\u0434\u0430":[9,10,14],"\u0437\u0430\u0434\u0430\u0447":[4,9,15,19],"\u0437\u0430\u0436\u0438\u043c":9,"\u0437\u0430\u0439\u043c\u0435\u0442":0,"\u0437\u0430\u043a\u0430\u0437":8,"\u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430":10,"\u0437\u0430\u043a\u043b\u044e\u0447\u0430":7,"\u0437\u0430\u043a\u043e\u043d":1,"\u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432":[1,19],"\u0437\u0430\u043a\u043e\u043d\u0447":4,"\u0437\u0430\u043a\u0440":10,"\u0437\u0430\u043a\u0440\u044b\u0432\u0430":15,"\u0437\u0430\u043a\u0440\u044b\u0442":[4,19],"\u0437\u0430\u043b\u0438\u0432\u043a":9,"\u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430":4,"\u0437\u0430\u043d":4,"\u0437\u0430\u043f":[4,19],"\u0437\u0430\u043f\u0430\u0434\u043d":19,"\u0437\u0430\u043f\u0438\u0441":[2,3,4],"\u0437\u0430\u043f\u043e\u043b\u043d":9,"\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d":4,"\u0437\u0430\u043f\u043e\u043b\u043d\u044f":4,"\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430":[2,9],"\u0437\u0430\u043f\u0440\u043e\u0441":[4,19],"\u0437\u0430\u043f\u0443\u0441\u043a":[3,4,6,8,9,10,15,19],"\u0437\u0430\u043f\u0443\u0441\u043a\u0430":[2,4,9,19],"\u0437\u0430\u043f\u0443\u0441\u0442":[0,4,19],"\u0437\u0430\u043f\u0443\u0449":[0,4,9],"\u0437\u0430\u043f\u0443\u0449\u0435\u043d":[2,4,16],"\u0437\u0430\u0442":[9,13,14],"\u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430":4,"\u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430":4,"\u0437\u0430\u0449\u0438\u0449\u0435\u043d":4,"\u0437\u0432\u0435\u043d":[3,15],"\u0437\u0434\u0435":[0,2,3,9,10,11],"\u0437\u0435\u043b\u0435\u043d":[9,10],"\u0437\u043d\u0430":[3,8,14,16],"\u0437\u043d\u0430\u043a":11,"\u0437\u043d\u0430\u0447\u0435\u043d":[4,9,10,11,12,13,14],"\u0437\u0440\u0435\u043d":19,"\u0438":[1,2,3,4,7,8,9,10,11,12,13,14,15,16],"\u0438\u0432\u0430":19,"\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440":[4,9],"\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446":[4,14],"\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430":10,"\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d":[9,14],"\u0438\u0434\u0435\u0442":[4,19],"\u0438\u0435\u0440\u0430\u0440\u0445":[9,17],"\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u043d":3,"\u0438\u0437":[3,4,8,9,10,11,12,14,17],"\u0438\u0437\u0432\u043b\u0435\u043a":8,"\u0438\u0437\u0432\u043b\u0435\u0447":[4,19],"\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d":[0,9],"\u0438\u0437\u043c\u0435\u043d":[4,14,15],"\u0438\u0437\u043c\u0435\u043d\u0435\u043d":[0,3,9,14,19],"\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d":[14,19],"\u0438\u043b":[4,9,10,13,14,15],"\u0438\u043c":[3,4,8,9,14,16,19],"\u0438\u043c\u0435\u0435\u0442":[4,9,14,15],"\u0438\u043c\u0435\u043d":[4,9],"\u0438\u043c\u0435\u043d\u043e\u0432\u0430":[4,9],"\u0438\u043c\u0435\u0442":12,"\u0438\u043c\u0435\u044e\u0442":9,"\u0438\u043c\u0435\u044e\u0449":9,"\u0438\u043c\u0438\u0442\u0430\u0446":11,"\u0438\u043c\u043f\u043e\u0440\u0442":[4,15],"\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430":4,"\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c":4,"\u0438\u043d":1,"\u0438\u043d\u0430\u0447":4,"\u0438\u043d\u0434\u0435\u043a\u0441":[9,14],"\u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d":[4,19],"\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446":[4,9,15],"\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440":10,"\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430":[4,9],"\u0438\u043d\u0438\u0446\u0438\u0430\u0442":19,"\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440":4,"\u0438\u043d\u0438\u0446\u0438\u0430\u0446":4,"\u0438\u043d\u0438\u0446\u0438\u0438\u0440":[13,14],"\u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430":[4,9],"\u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430":15,"\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446":[0,19],"\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442":[1,4,8,11,19],"\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440":7,"\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430":[8,15,19],"\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442":19,"\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d":[3,19],"\u0438\u043d\u0442\u0435\u0440\u0432\u0430":[4,10,11,13,14],"\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b":10,"\u0438\u043d\u0442\u0435\u0440\u0435\u0441":4,"\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d":0,"\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442":0,"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440":[0,9],"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446":14,"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430":4,"\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441":[9,10,15,16,17],"\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446":[3,4,9,11,19],"\u0438\u043f":[1,19],"\u0438\u0441\u043a\u0430":[4,14],"\u0438\u0441\u043a\u0430\u0436\u0435\u043d":14,"\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d":[9,10,13,14],"\u0438\u0441\u043a\u043e\u043c":[9,14],"\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d":[11,19],"\u0438\u0441\u043f\u043e\u043b\u0435\u043d":4,"\u0438\u0441\u043f\u043e\u043b\u043d":8,"\u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d":[3,4],"\u0438\u0441\u043f\u043e\u043b\u043d\u044f":[4,9],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437":[1,2,4,7,9,11,19],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430":[4,9,10,11,16,19],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d":[1,2,4,7,8,9,12,14,19],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443":[1,3,19],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c":[4,19],"\u0438\u0441\u043f\u043e\u0440\u0447":4,"\u0438\u0441\u043f\u044b\u0442\u0430":0,"\u0438\u0441\u0442\u0435\u043a\u0430":4,"\u0438\u0441\u0442\u043e\u0440":[4,10],"\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a":19,"\u0438\u0441\u0445\u043e\u0434\u043d":[2,4,9,10,11,12,13,14,18,19],"\u0438\u0441\u0445\u043e\u0434\u044f":9,"\u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d":[9,10,14],"\u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442":9,"\u0438\u0442":[4,19],"\u0438\u0442\u0435\u0440\u0430\u0446":4,"\u0438\u0445":[4,11],"\u0438\u044e\u043b":19,"\u0439":9,"\u043a":[1,2,3,4,8,9,10,14,15,19],"\u043a\u0430\u0436\u0434":[2,4,9,10,11,12,13,14,15,19],"\u043a\u0430\u043a":[1,3,4,9,11,13,16,19],"\u043a\u0430\u043d\u0430":1,"\u043a\u0430\u043d\u0430\u043b":[8,19],"\u043a\u0430\u0440\u0442":4,"\u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446":3,"\u043a\u0430\u0447\u0435\u0441\u0442\u0432":[3,8,9,14,15,16,19],"\u043a\u0438\u0448\u043a":9,"\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440":[0,4,8,9,11,15,19],"\u043a\u043b\u0430\u0432\u0438\u0448":[9,13,14,19],"\u043a\u043b\u0430\u0432\u0438\u0448\u043d":11,"\u043a\u043b\u0430\u0441\u0441":[9,19],"\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a":19,"\u043a\u043b\u0438\u0435\u043d\u0442":[0,3,4,7,8,14,16,19],"\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a":4,"\u043a\u043b\u0438\u043a":[9,13,14],"\u043a\u043b\u044e\u0447":[4,7,9,11,19],"\u043a\u043b\u044e\u0447\u0435\u0432":[10,15],"\u043a\u043d\u043e\u043f\u043a":[0,9,13,14],"\u043a\u043e":4,"\u043a\u043e\u0433\u0434":[9,17,19],"\u043a\u043e\u0434":[2,4,6,9,10,12,13,14,15,18,19],"\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a":[2,4],"\u043a\u043e\u0434\u043e\u0432":4,"\u043a\u043e\u043b\u0435\u0441":[9,13],"\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432":[4,9,11,13,14],"\u043a\u043e\u043b\u043b\u0435\u0433":[3,8,14,16],"\u043a\u043e\u043c\u0430\u043d\u0434":[0,4,11,13,14,15,19],"\u043a\u043e\u043c\u0430\u043d\u0434\u043d":[4,15],"\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446":[4,11,14],"\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a":19,"\u043a\u043e\u043c\u043f\u0430\u043d":[4,7,19],"\u043a\u043e\u043c\u043f\u0438\u0440\u043e\u0432\u0430\u043d":15,"\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442":[0,2,10,11,14,16,17,19],"\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440":[4,9],"\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d":19,"\u043a\u043e\u043d\u0435\u0446":4,"\u043a\u043e\u043d\u0435\u0447\u043d":9,"\u043a\u043e\u043d\u0441\u043e\u043b":[8,15,17],"\u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430":[3,19],"\u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d":15,"\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442":9,"\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446":4,"\u043a\u043e\u043d\u0442\u0430\u043a\u0442":[0,3,4,7,8,14,16,19],"\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440":4,"\u043a\u043e\u043d\u0442\u0440\u043e\u043b":[3,4,7,19],"\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440":4,"\u043a\u043e\u043d\u0442\u0443\u0440":9,"\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446":16,"\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d":[3,4],"\u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d":4,"\u043a\u043e\u043d\u0446\u0435\u043f\u0446":[7,19],"\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442":[9,13,14],"\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446":[3,19],"\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440":3,"\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430":15,"\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d":4,"\u043a\u043e\u0440\u043d\u0435\u0432":9,"\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a":[3,7,14],"\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d":[11,19],"\u043a\u043e\u0440\u0442\u0435\u0436":4,"\u043a\u043e\u0442\u043e\u0440":[2,3,4,7,8,9,10,11,13,14,15,16,19],"\u043a\u043f\u043f":1,"\u043a\u0440\u0430":[13,14],"\u043a\u0440\u0430\u0441\u043d":9,"\u043a\u0440\u0438\u0442\u0435\u0440":9,"\u043a\u0440\u043e\u043c":17,"\u043a\u0440\u0443\u043f\u043d":[4,19],"\u043a\u0440\u0443\u0442":13,"\u043a\u0443\u0434":[0,4],"\u043a\u0443\u043a":10,"\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430":4,"\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d":4,"\u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442":19,"\u043b\u0435\u0432":[9,13,14],"\u043b\u0435\u0433\u043a":9,"\u043b\u0435\u0433\u043a\u043e\u0441\u0442":[8,15,19],"\u043b\u0438":[4,9,11,14],"\u043b\u0438\u0431":[1,4,9],"\u043b\u0438\u0446":[1,19],"\u043b\u0438\u0446\u0435\u043d\u0437":[0,3,4,7,8,14,16],"\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d":19,"\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d":19,"\u043b\u0438\u0448":7,"\u043b\u043e\u0433":[3,4,19],"\u043b\u043e\u0433\u0433\u0435\u0440":[4,5],"\u043b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d":4,"\u043b\u043e\u0433\u0438\u043d":[0,4],"\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d":[4,5],"\u043b\u043e\u043a\u0430\u043b\u044c\u043d":[4,8,9,19],"\u043b\u043e\u043a\u0430\u0446":4,"\u043b\u044c\u0432\u0430":1,"\u043b\u044e\u0431":[8,9,11,19],"\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d":[7,9,10,15,19],"\u043c\u0430\u043b":19,"\u043c\u0430\u0441\u043b":19,"\u043c\u0430\u0441\u0441":3,"\u043c\u0430\u0441\u0441\u0438\u0432":3,"\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a":14,"\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b":19,"\u043c\u0430\u0448\u0438\u043d":[0,4,19],"\u043c\u0431":[0,4],"\u043c\u0435\u0436\u0434":[4,11,13,14,15],"\u043c\u0435\u043d":9,"\u043c\u0435\u043d\u044f":19,"\u043c\u0435\u0440":4,"\u043c\u0435\u0441\u0442":13,"\u043c\u0435\u0442\u043e\u0434":[4,9],"\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c":[4,7],"\u043c\u0438\u043a\u0440\u043e\u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442":19,"\u043c\u0438\u043b":11,"\u043c\u0438\u043c":4,"\u043c\u0438\u043d\u0443\u0442":0,"\u043c\u0438\u0440":11,"\u043c\u043d\u043e\u0433":[9,11],"\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d":4,"\u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432":3,"\u043c\u043e":11,"\u043c\u043e\u0433\u0443\u0442":[4,9],"\u043c\u043e\u0434\u0435\u043b":[3,4,19],"\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443":11,"\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440":11,"\u043c\u043e\u0434\u0443\u043b":[3,4,8,9,11,12,13,14,15,16],"\u043c\u043e\u0436\u0435\u0442":[1,3,4,6,7,8,9,11,13,14,15,16,19],"\u043c\u043e\u0436\u043d":[3,4,9,10,11,15,19],"\u043c\u043e\u043c\u0435\u043d\u0442":9,"\u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d":[13,14],"\u043c\u043e\u043d\u0438\u0442\u043e\u0440":4,"\u043c\u043e\u0441\u043a\u0432":1,"\u043c\u043e\u0449":0,"\u043c\u0443\u0440\u0430\u0432\u0441\u043a":1,"\u043c\u0443\u0441\u043e\u0440\u043d":3,"\u043c\u044b":[1,3,4,8,9,14,16,19],"\u043c\u044b\u0448":[8,9,10,13,14,15,19],"\u043c\u044f":15,"\u043c\u044f\u0433\u043a":4,"\u043d\u0430":[0,2,3,4,8,9,10,11,12,13,14,15,19],"\u043d\u0430\u0431\u043e\u0440":[4,19],"\u043d\u0430\u0432\u0435\u0434":17,"\u043d\u0430\u0432\u0435\u0434\u0435\u043d":[9,19],"\u043d\u0430\u0433\u0440\u0443\u0437\u043a":19,"\u043d\u0430\u0434":[9,10,17,19],"\u043d\u0430\u0434\u0435\u0436\u043d":[3,11],"\u043d\u0430\u0436\u0430":[11,13,14],"\u043d\u0430\u0436\u0430\u0442":[9,10,11,13,14,15],"\u043d\u0430\u0436\u0438\u043c\u0430":[9,11],"\u043d\u0430\u0436\u043c":9,"\u043d\u0430\u0437\u043d\u0430\u0447":4,"\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d":9,"\u043d\u0430\u0437\u044b\u0432\u0430":3,"\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d":[4,9,10,15],"\u043d\u0430\u0439\u0434\u0435\u0442":[16,19],"\u043d\u0430\u043b\u0438\u0447":[0,4,14],"\u043d\u0430\u043b\u043e\u0436":14,"\u043d\u0430\u043b\u043e\u0436\u0435\u043d":14,"\u043d\u0430\u043c":19,"\u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430":11,"\u043d\u0430\u043f\u0438\u0441\u0430":1,"\u043d\u0430\u043f\u0440\u0430\u0432\u043b":3,"\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440":[0,4,7,9],"\u043d\u0430\u043f\u0440\u044f\u043c":3,"\u043d\u0430\u0440\u0438\u0441":9,"\u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430":8,"\u043d\u0430\u0440\u0443\u0448\u0435\u043d":[1,19],"\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a":19,"\u043d\u0430\u0441\u0442\u043e\u044f":11,"\u043d\u0430\u0441\u0442\u0440\u043e":4,"\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a":[0,2,4,5,19],"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a":[0,3,7,9,13,14,19],"\u043d\u0430\u0445\u043e\u0434":[9,10,13,14,15],"\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d":13,"\u043d\u0430\u0446\u0435\u043b\u0435\u043d":19,"\u043d\u0430\u0447\u0430":[0,4,11,15],"\u043d\u0430\u0447\u0430\u043b\u044c\u043d":9,"\u043d\u0430\u0447\u0438\u043d":[3,4,8,14,16],"\u043d\u0430\u0447\u0438\u043d\u0430":[0,2,4,9,10,11,12,13,14],"\u043d\u0430\u0448":[8,9,19],"\u043d\u0434\u0441":19,"\u043d\u0435":[1,2,3,4,7,9,10,11,13,14,15,16,19],"\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d":[4,19],"\u043d\u0435\u0434\u0435\u043b":4,"\u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c":9,"\u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d":9,"\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c":[9,11],"\u043d\u0435\u0437\u043d\u0430\u043d":1,"\u043d\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430":[4,9],"\u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a":[1,19],"\u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d":4,"\u043d\u0435\u043a\u043e\u0442\u043e\u0440":9,"\u043d\u0435\u043c":[9,15,17],"\u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d":[9,13,14],"\u043d\u0435\u043e\u0431\u0445\u043e\u0434":[4,11,14,19],"\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c":[0,4,8,10,11,12,15,16,17,19],"\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d":[2,4,9,11,14],"\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d":9,"\u043d\u0435\u043f\u0440\u0430\u0432\u043e\u043c\u0435\u0440\u043d":[1,19],"\u043d\u0435\u043f\u0440\u043e\u0432\u0435\u0440":9,"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a":[4,9,11,14,19],"\u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432":14,"\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d":4,"\u043d\u0435\u0441\u0442\u0438\u043b\u0435\u0432":10,"\u043d\u0435\u0442":[4,9],"\u043d\u0438":[4,9],"\u043d\u0438\u0433\u0434":4,"\u043d\u0438\u0436":[4,5,6,8,9,11,13,14,17,19],"\u043d\u0438\u0436\u043d":14,"\u043d\u0438\u043a\u043e\u0433\u0434":9,"\u043d\u0438\u0445":4,"\u043d\u0438\u0447":[7,11],"\u043d\u043e":[7,9],"\u043d\u043e\u0432":[3,4,19],"\u043d\u043e\u043c\u0435\u0440":[4,8,9,10,13,14],"\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430":9,"\u043d\u043e\u0442\u0430\u0446":4,"\u043d\u0443\u0436":4,"\u043d\u0443\u0436\u0434":3,"\u043d\u0443\u0436\u043d":[4,7,9],"\u043e":[4,13,14],"\u043e\u0431":4,"\u043e\u0431\u0435\u0440\u043d\u0443\u0442":9,"\u043e\u0431\u0435\u0441\u043f\u0435\u0447":[4,9],"\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430":[3,4,8,16,19],"\u043e\u0431\u043b\u0430\u0434\u0430":[4,7,9,11],"\u043e\u0431\u043b\u0430\u0441\u0442":[9,10,13,19],"\u043e\u0431\u043c":[0,4,8,11,12,15,19],"\u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430":4,"\u043e\u0431\u043d\u0430\u0440\u0443\u0436":[4,9,14],"\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d":9,"\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043d":9,"\u043e\u0431\u043d\u043e\u0432":4,"\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430":14,"\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d":[2,4,9,10,11,12,13,14],"\u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b":17,"\u043e\u0431\u043e\u043b\u043e\u0447\u043a":9,"\u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d":19,"\u043e\u0431\u0440\u0430\u0437":9,"\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d":14,"\u043e\u0431\u0440\u0430\u0442":[0,1,3,4,7,8,9,10,14,16,19],"\u043e\u0431\u0440\u0430\u0442\u043a":14,"\u043e\u0431\u0440\u0430\u0442\u043d":[4,9],"\u043e\u0431\u0440\u0430\u0449\u0430":11,"\u043e\u0431\u0443\u0447\u0435\u043d":19,"\u043e\u0431\u044a\u0435\u043a\u0442":[4,9,10,14,15,16,19],"\u043e\u0431\u044b\u0447\u043d":[9,10],"\u043e\u0431\u044c\u0435\u043a\u0442":4,"\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b":4,"\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d":[4,9,13,14],"\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d":[9,19],"\u043e\u0433\u0440\u043d":1,"\u043e\u0434\u0438\u043d":[4,9,14],"\u043e\u0434\u0438\u043d\u043e\u0447\u043d":9,"\u043e\u0434\u043d":[3,6,9,11,14,15,19],"\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d":[9,11],"\u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d":4,"\u043e\u0436\u0438\u0434\u0430":[4,9,10,11,13,14,17],"\u043e\u0436\u0438\u0434\u0430\u043d":[9,10,11,13,14],"\u043e\u0437\u043d\u0430\u043a\u043e\u043c":[1,3,9,11,19],"\u043e\u0437\u043d\u0430\u0447\u0430":[2,4,9,10,11,12,13,14],"\u043e\u043a\u043d":[4,9,15,17],"\u043e\u043a\u043e\u043b":0,"\u043e\u043a\u043e\u043d\u0447\u0430\u043d":4,"\u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d":14,"\u043e\u043a\u0443\u043f\u0430":19,"\u043e\u043d":[4,7,9,10,15],"\u043e\u043e":19,"\u043e\u043f":19,"\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d":4,"\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440":[4,10],"\u043e\u043f\u0435\u0440\u0430\u0446":[4,11,13,14,15,19],"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d":[4,11],"\u043e\u043f\u0438\u0441\u0430\u043d":[4,15,19],"\u043e\u043f\u0440\u0435\u0434\u0435\u043b":9,"\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d":[4,9,11],"\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f":[4,9,14],"\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446":19,"\u043e\u043f\u0443\u0441\u0442":[11,13],"\u043e\u043f\u0443\u0449":11,"\u043e\u043f\u0446":14,"\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b":4,"\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d":[4,9,10,11,13,14],"\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446":[1,19],"\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440":[0,2,3,4,6,7,9],"\u043e\u0441":[0,2,4,8,9,10,11,12,13,14,15,19],"\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430":1,"\u043e\u0441\u043d\u043e\u0432":9,"\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b":19,"\u043e\u0441\u043d\u043e\u0432\u043d":[3,4,19],"\u043e\u0441\u043e\u0431":9,"\u043e\u0441\u043e\u0431\u0435\u043d":[4,11],"\u043e\u0441\u043e\u0437\u043d\u0430":[1,19],"\u043e\u0441\u0442\u0430":1,"\u043e\u0441\u0442\u0430\u0432":9,"\u043e\u0441\u0442\u0430\u0432\u043b\u044f":3,"\u043e\u0441\u0442\u0430\u043b\u044c\u043d":[0,1,9,13,14,19],"\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430":4,"\u043e\u0441\u0442\u0430\u043d\u043e\u0432":[4,9],"\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a":[3,4,19],"\u043e\u0441\u0442\u0430\u043d\u0443\u0442":[3,7,8,14,16,19],"\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d":11,"\u043e\u0442":[1,3,4,8,9,10,11,14,16,19],"\u043e\u0442\u0431\u043e\u0440":9,"\u043e\u0442\u0432\u0435\u0441\u0442":9,"\u043e\u0442\u0432\u0435\u0442":4,"\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d":[1,19],"\u043e\u0442\u0432\u0435\u0447\u0430":15,"\u043e\u0442\u0434\u0435\u043b\u044c\u043d":4,"\u043e\u0442\u043a\u0430\u0437":19,"\u043e\u0442\u043a\u0430\u0437\u0430":4,"\u043e\u0442\u043a\u043b\u044e\u0447":19,"\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d":[4,9],"\u043e\u0442\u043a\u0440":[4,8,10,15,19],"\u043e\u0442\u043a\u0440\u043e\u0435\u0442":17,"\u043e\u0442\u043a\u0440\u044b\u0442":[3,19],"\u043e\u0442\u043a\u0443\u0434":4,"\u043e\u0442\u043b\u0430\u0434\u043a":[3,4,19],"\u043e\u0442\u043b\u0438\u0447":11,"\u043e\u0442\u043b\u0438\u0447\u0430":9,"\u043e\u0442\u043b\u0438\u0447\u043d":7,"\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d":[4,14],"\u043e\u0442\u043d\u043e\u0448\u0435\u043d":4,"\u043e\u0442\u043e\u0431\u0440\u0430\u0436":9,"\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430":[9,15],"\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d":11,"\u043e\u0442\u043f\u0440\u0430\u0432":[2,4,10,11],"\u043e\u0442\u043f\u0440\u0430\u0432\u043a":[4,19],"\u043e\u0442\u043f\u0440\u0430\u0432\u043b":4,"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f":[2,4,9,10,11],"\u043e\u0442\u043f\u0443\u0441\u043a\u0430":[13,14],"\u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d":11,"\u043e\u0442\u043f\u0443\u0441\u0442":[11,13,14],"\u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430":19,"\u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a":[4,10],"\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a":14,"\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d":13,"\u043e\u0442\u0440\u044b\u0432\u0430":16,"\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430":9,"\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430":4,"\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432":4,"\u043e\u0442\u0441\u0447\u0435\u0442":[13,14],"\u043e\u0442\u0442\u0435\u043d\u043a":14,"\u043e\u0447\u0435\u043d":[0,19],"\u043e\u0447\u0435\u0440\u0435\u0434":[3,4,19],"\u043e\u0447\u0438\u0441\u0442":9,"\u043e\u0448\u0438\u0431\u043a":[4,9],"\u043e\u0448\u0438\u0431\u043e\u043a":9,"\u043f\u0430\u043a\u0435\u0442":[0,12,14,19],"\u043f\u0430\u043a\u0435\u0442\u043d":14,"\u043f\u0430\u043c\u044f\u0442":4,"\u043f\u0430\u043d\u0435\u043b":[3,4,17,19],"\u043f\u0430\u043f\u043a":[0,4,6,19],"\u043f\u0430\u0440":4,"\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d":4,"\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440":[2,4,9,10,11,12,13,14,18,19],"\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446":[13,14],"\u043f\u0430\u0440\u043e\u043b":4,"\u043f\u0430\u0443\u0437":[3,19],"\u043f\u0435\u0440\u0432":[9,10,19],"\u043f\u0435\u0440\u0435\u0434":[4,9,19],"\u043f\u0435\u0440\u0435\u0434\u0430":[4,10,11,13],"\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430":[4,9],"\u043f\u0435\u0440\u0435\u0434\u0430\u0447":[2,4,8,9,10,11,14,19],"\u043f\u0435\u0440\u0435\u0434\u043e\u0432":19,"\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437":4,"\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a":4,"\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a":4,"\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442":4,"\u043f\u0435\u0440\u0435\u0439\u0442":8,"\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447":11,"\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b":9,"\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d":11,"\u043f\u0435\u0440\u0435\u043c\u0435\u043d":[4,10,11],"\u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442":[0,9,13,14],"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430":9,"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d":[9,13,14],"\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b":9,"\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f":9,"\u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d":4,"\u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d":9,"\u043f\u0435\u0440\u0435\u0442\u0430\u0449":9,"\u043f\u0435\u0440\u0435\u0445\u043e\u0434":3,"\u043f\u0435\u0440\u0435\u0447\u0435\u043d":[4,9,11],"\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d":10,"\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a":4,"\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d":14,"\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d":[0,8,19],"\u043f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433":1,"\u043f\u0435\u0447\u0430":11,"\u043f\u0435\u0447\u0430\u0442":11,"\u043f\u0435\u0447\u0430\u0442\u0430":11,"\u043f\u0438\u043a\u0441\u0435\u043b":[4,10,14],"\u043f\u043b\u0430\u043d\u0438\u0440":[4,9],"\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c":9,"\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442":9,"\u043f\u043b\u0430\u0442\u0435\u0436":19,"\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c":[0,3,8,9,11,14,15,16,19],"\u043f\u043e":[0,1,2,3,4,6,7,9,10,11,13,14,16,19],"\u043f\u043e\u0432\u0442\u043e\u0440\u043d":[4,14],"\u043f\u043e\u0434":[2,3,4,9,19],"\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a":5,"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430":[2,4,9,10,11,12,13,14,17],"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a":[0,3,4,7,8,14,16,19],"\u043f\u043e\u0434\u043a\u043b\u044e\u0447":[4,9],"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430":15,"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d":[4,9,19],"\u043f\u043e\u0434\u043d\u044f":[11,13,14],"\u043f\u043e\u0434\u043d\u044f\u0442":11,"\u043f\u043e\u0434\u043e\u0436\u0434":17,"\u043f\u043e\u0434\u043f\u0438\u0441\u043a":19,"\u043f\u043e\u0434\u0440\u043e\u0431\u043d":[4,9,14,19],"\u043f\u043e\u0434\u0441\u0432\u0435\u0442":[9,10],"\u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a":[9,14],"\u043f\u043e\u0434\u0441\u0432\u0435\u0447":9,"\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0430\u043d":10,"\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u043d":10,"\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a":10,"\u043f\u043e\u0434\u0445\u043e\u0434\u044f":[10,14],"\u043f\u043e\u0434\u0445\u044a\u043e\u0434":3,"\u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430":19,"\u043f\u043e\u0437\u0432\u043e\u043b":4,"\u043f\u043e\u0437\u0432\u043e\u043b\u044f":[3,4,8,9,11,15,19],"\u043f\u043e\u0437\u0438\u0446":[13,14],"\u043f\u043e\u0438\u0441\u043a":[4,9,10,14,19],"\u043f\u043e\u043a":[4,9,11],"\u043f\u043e\u043a\u0430\u0437\u0430":17,"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b":14,"\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430":4,"\u043f\u043e\u043a\u043e\u043b\u0435\u043d":19,"\u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b":8,"\u043f\u043e\u043a\u0443\u043f\u043a":19,"\u043f\u043e\u043b":9,"\u043f\u043e\u043b\u0435\u0437\u043d":4,"\u043f\u043e\u043b\u043d":[4,9,14],"\u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447":4,"\u043f\u043e\u043b\u043d\u043e\u0441\u0442":4,"\u043f\u043e\u043b\u043e\u0436\u0435\u043d":[9,14,19],"\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d":13,"\u043f\u043e\u043b\u0443\u0447":[1,2,4,9,10,12,14],"\u043f\u043e\u043b\u0443\u0447\u0430":[4,11],"\u043f\u043e\u043b\u0443\u0447\u0435\u043d":[1,2,4,9,19],"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b":[2,3,4,9,19],"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a":[4,9,16,17],"\u043f\u043e\u043c\u0438\u043c":19,"\u043f\u043e\u043c\u043e\u0433\u0443\u0442":[1,3,7,8,14,16,19],"\u043f\u043e\u043c\u043e\u0436":1,"\u043f\u043e\u043c\u043e\u0449":[0,4,9,10,11,15],"\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a":4,"\u043f\u043e\u043f\u0430\u0441\u0442":9,"\u043f\u043e\u043f\u0440\u043e\u0431":11,"\u043f\u043e\u043f\u044b\u0442\u043a":[9,11],"\u043f\u043e\u0440\u043e\u0436\u0434":4,"\u043f\u043e\u0440\u0442":4,"\u043f\u043e\u0440\u0442\u0430":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432":10,"\u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d":9,"\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a":9,"\u043f\u043e\u0441\u043b":[0,4,9,11,13,14,15,17],"\u043f\u043e\u0441\u043b\u0435\u0434":9,"\u043f\u043e\u0441\u043b\u0435\u0434\u043d":9,"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d":4,"\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d":4,"\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f":[8,19],"\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a":19,"\u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441":[2,4],"\u043f\u043e\u0441\u044b\u043b\u0430":11,"\u043f\u043e\u0442\u043e\u043a":[3,4,10],"\u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d":4,"\u043f\u043e\u0442\u043e\u043c\u043a":9,"\u043f\u043e\u0442\u0440\u0435\u0431":[3,4,7],"\u043f\u043e\u0445\u043e\u0436":14,"\u043f\u043e\u0447\u0442":1,"\u043f\u043e\u044d\u0442":9,"\u043f\u043e\u044f\u0432":[9,10],"\u043f\u043e\u044f\u0432\u043b\u0435\u043d":[4,9,10,14],"\u043f\u0440\u0430\u0432":[4,9,13,14,19],"\u043f\u0440\u0430\u0432\u0438\u043b":14,"\u043f\u0440\u0430\u0432\u043e\u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b":19,"\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a":[16,19],"\u043f\u0440\u0435\u0432\u044b\u0448":10,"\u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d":10,"\u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d":19,"\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430":[3,19],"\u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d":4,"\u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d":[4,19],"\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432":4,"\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f":4,"\u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442":[8,9],"\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b":[2,4,5,7,9,10,11,15,17,19],"\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449":4,"\u043f\u0440\u0435\u0436\u0434":11,"\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],"\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d":4,"\u043f\u0440\u0435\u043a\u0440\u0430\u0442":4,"\u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d":10,"\u043f\u0440\u0435\u043c\u0438\u0430\u043b\u044c\u043d":19,"\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437":4,"\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430":[2,4],"\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d":4,"\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d":4,"\u043f\u0440\u0435\u0441\u0442\u0430\u0432\u043b":8,"\u043f\u0440\u0435\u0444\u0438\u043a\u0441":4,"\u043f\u0440\u0438":[0,4,7,9,10,11,12,14],"\u043f\u0440\u0438\u0431\u043b\u0438\u0436":9,"\u043f\u0440\u0438\u0432\u0435\u0434":9,"\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442":[4,14],"\u043f\u0440\u0438\u0432\u0435\u0441\u0442":4,"\u043f\u0440\u0438\u0432\u0435\u0442":11,"\u043f\u0440\u0438\u0437\u043d\u0430\u043a":9,"\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d":[4,8,9,10,15,16,19],"\u043f\u0440\u0438\u043c\u0435\u043d":4,"\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c":9,"\u043f\u0440\u0438\u043c\u0435\u043d\u044f":[9,19],"\u043f\u0440\u0438\u043c\u0435\u0440":[4,6,9,14,19],"\u043f\u0440\u0438\u043d":4,"\u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436":9,"\u043f\u0440\u0438\u043d\u0438\u043c\u0430":[4,13,14],"\u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d":[3,4,19],"\u043f\u0440\u0438\u043d\u0446\u0438\u043f":9,"\u043f\u0440\u0438\u043d\u044f":4,"\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d":1,"\u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432":[4,9],"\u043f\u0440\u0438\u0445\u043e\u0434":19,"\u043f\u0440\u0438\u0447\u0438\u043d":19,"\u043f\u0440\u0438\u0448\u0435\u043b":4,"\u043f\u0440\u043e":[4,19],"\u043f\u0440\u043e\u0431\u043b":[0,19],"\u043f\u0440\u043e\u0431\u043b\u0435\u043c":19,"\u043f\u0440\u043e\u0431\u043d":14,"\u043f\u0440\u043e\u0432\u0435\u0440":[1,4,9,11,14,19],"\u043f\u0440\u043e\u0432\u0435\u0440\u043a":[4,9,10,14,19],"\u043f\u0440\u043e\u0432\u0435\u0440\u044f":[4,9,14],"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c":[4,11],"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d":[3,8,11,14,15,16,19],"\u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d":19,"\u043f\u0440\u043e\u0434\u043e\u043b\u0436":4,"\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d":15,"\u043f\u0440\u043e\u0435\u043a\u0442":[0,8,15,19],"\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c":19,"\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d":19,"\u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430":[4,9],"\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434":9,"\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442":3,"\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434":[4,9,10,13],"\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d":[14,19],"\u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442":11,"\u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430":4,"\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434":[4,13],"\u043f\u0440\u043e\u043a\u0440\u0443\u0442":[9,13],"\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a":[10,13],"\u043f\u0440\u043e\u043f\u0438\u0441\u0430":15,"\u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430":4,"\u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d":4,"\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440":[3,4,19],"\u043f\u0440\u043e\u0441\u0442":[9,15],"\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432":4,"\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b":[2,8],"\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d":19,"\u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d":[9,10,14],"\u043f\u0440\u043e\u0444\u0438\u043b":10,"\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440":4,"\u043f\u0440\u043e\u0446\u0435\u0441\u0441":[2,4,9,10,15,19],"\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d":[3,4],"\u043f\u0440\u043e\u0447\u0438\u0442\u0430":[2,4],"\u043f\u0440\u043e\u0448\u043b":[4,14],"\u043f\u0440\u044f\u043c":9,"\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d":[9,14],"\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a":9,"\u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d":4,"\u043f\u0443\u0441\u0442":[4,9],"\u043f\u0443\u0442":[2,4,9,10,14],"\u0440\u0430\u0431\u043e\u0442":[0,3,4,7,8,11,14,15,16,19],"\u0440\u0430\u0431\u043e\u0442\u0430":[0,3,4,9,11,19],"\u0440\u0430\u0431\u043e\u0447":[4,8,9,13,14,15],"\u0440\u0430\u0432":9,"\u0440\u0430\u0432\u043d":9,"\u0440\u0430\u0437":[4,19],"\u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430":9,"\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442":[9,19],"\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u043d\u0443\u0442":4,"\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d":[0,19],"\u0440\u0430\u0437\u0432\u0438\u0442":19,"\u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d":[3,19],"\u0440\u0430\u0437\u0434\u0435\u043b":[4,7,9,11,15,16],"\u0440\u0430\u0437\u043b\u0438\u0447\u043d":[4,10,11,16],"\u0440\u0430\u0437\u043d":[4,11],"\u0440\u0430\u0437\u043d\u043e\u044f\u0437\u044b\u0447\u043d":11,"\u0440\u0430\u0437\u043e\u0432":19,"\u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430":9,"\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430":19,"\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a":[3,8,14,16],"\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a":[3,19],"\u0440\u0430\u0437\u0440\u0435\u0448\u0430":[1,19],"\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d":4,"\u0440\u0430\u0437\u0440\u044f\u0434\u043d":9,"\u0440\u0430\u043c\u043a":[9,19],"\u0440\u0430\u043d":[4,9,19],"\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a":11,"\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043e\u043a":11,"\u0440\u0430\u0441\u043a\u0440":4,"\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430":0,"\u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d":[3,4,19],"\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d":19,"\u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430":10,"\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436":[4,9,10],"\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d":[4,6,9,10,14],"\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d":7,"\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d":[9,14],"\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d":[4,10],"\u0440\u0435\u0430\u043a\u0446":11,"\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446":19,"\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430":[4,19],"\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d":9,"\u0440\u0435\u0430\u043b\u044c\u043d":11,"\u0440\u0435\u0433":9,"\u0440\u0435\u0433\u0438\u0441\u0442\u0440":[2,4,11],"\u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043d":4,"\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d":9,"\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430":7,"\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d":[9,19],"\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440":17,"\u0440\u0435\u0434\u0430\u043a\u0446":8,"\u0440\u0435\u0435\u0441\u0442\u0440":19,"\u0440\u0435\u0436":[9,17],"\u0440\u0435\u0436\u0438\u043c":[4,9,11,14],"\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442":[2,4,9,10,12,14,18,19],"\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443":[0,3,4,9],"\u0440\u0435\u043b\u0438\u0437":19,"\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"\u0440\u0435\u0441\u0443\u0440\u0441":19,"\u0440\u0435\u0447":19,"\u0440\u0435\u0448\u0430":19,"\u0440\u0435\u0448\u0435\u043d":[3,19],"\u0440\u0438\u0441\u043e\u0432\u0430\u043d":9,"\u0440\u043e\u0431\u043e\u0442":[1,2,3,4,7,8,9,11,14,16],"\u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0430":15,"\u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0430\u0446":[3,8,14,15,16,19],"\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a":[9,17],"\u0440\u043e\u043b\u0435\u0432":[3,4,19],"\u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a":19,"\u0440\u043f\u0430":19,"\u0440\u0443\u0431":[3,8,14,16,19],"\u0440\u0443\u0431\u043b":19,"\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432":[16,19],"\u0440\u0443\u0441\u0441\u043a":[4,11],"\u0440\u044b\u043d\u043a":[3,19],"\u0440\u044b\u043d\u043e\u043a":19,"\u0440\u044f\u0434":[9,19],"\u0441":[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,19],"\u0441\u0430\u043c":[9,19],"\u0441\u0430\u043c\u043e\u0437\u0430\u043d\u044f\u0442":[1,19],"\u0441\u0430\u043d\u043a\u0442":1,"\u0441\u0430\u043d\u043a\u0446":19,"\u0441\u0431\u043e\u0440":3,"\u0441\u0432\u0435\u0434\u0435\u043d":4,"\u0441\u0432\u0435\u0440\u043d\u0443\u0442":9,"\u0441\u0432\u0435\u0440\u0445":[9,14],"\u0441\u0432\u0435\u0441\u0442":15,"\u0441\u0432\u043e":[1,3,4,6,9,14,19],"\u0441\u0432\u043e\u0439\u0441\u0442\u0432":[9,19],"\u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d":9,"\u0441\u0432\u044f\u0437":[4,11,19],"\u0441\u0432\u044f\u0437\u0430":9,"\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430":4,"\u0441\u0435\u0433\u043c\u0435\u043d\u0442":19,"\u0441\u0435\u0433\u043e\u0434\u043d":19,"\u0441\u0435\u043a":[0,4,10,14],"\u0441\u0435\u043a\u0443\u043d\u0434":[4,9,11,13,14],"\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440":[10,17,19],"\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432":19,"\u0441\u0435\u0440":14,"\u0441\u0435\u0440\u0432\u0435\u0440":[3,4],"\u0441\u0435\u0440\u0435\u0434\u0438\u043d":4,"\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442":[1,4,19],"\u0441\u0435\u0441":9,"\u0441\u0435\u0441\u0438":4,"\u0441\u0435\u0441\u0441":[2,3,4,9,15,16,19],"\u0441\u0435\u0442\u0435\u0432":4,"\u0441\u0438\u0433\u043d\u0430":4,"\u0441\u0438\u043c\u0432\u043e\u043b":[4,9,11],"\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d":19,"\u0441\u0438\u043c\u0443\u043b\u044f\u0446":9,"\u0441\u0438\u043d":9,"\u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d":4,"\u0441\u0438\u043d\u043e\u043d":4,"\u0441\u0438\u043d\u043e\u043d\u0438\u043c":4,"\u0441\u0438\u043d\u0445\u0440\u043e\u043d":4,"\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446":4,"\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430":4,"\u0441\u0438\u0441\u0442":11,"\u0441\u0438\u0441\u0442\u0435\u043c":[4,7,11],"\u0441\u0438\u0442\u0443\u0430\u0446":[4,9],"\u0441\u043a\u0430\u043d":11,"\u0441\u043a\u0430\u0447\u0430":[0,10],"\u0441\u043a\u043e\u043b\u044c\u043a":9,"\u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430":[4,11],"\u0441\u043a\u043e\u0440\u043e\u0441\u0442":[0,19],"\u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430":14,"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442":[0,19],"\u0441\u043a\u0440\u0438\u043f\u0442":[6,19],"\u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433":13,"\u0441\u043a\u0440\u044b\u0442":9,"\u0441\u043b\u0435\u0432":[9,14],"\u0441\u043b\u0435\u0434":[0,3,4,6,9,11,13,14,15,17],"\u0441\u043b\u0435\u0434\u043e\u0432\u0430":0,"\u0441\u043b\u0435\u0434\u044e\u0449":4,"\u0441\u043b\u0435\u043f\u043e\u043a":2,"\u0441\u043b\u043e\u0432":10,"\u0441\u043b\u043e\u0432\u0430\u0440":[2,4,5,9,19],"\u0441\u043b\u043e\u0436\u0435\u043d":4,"\u0441\u043b\u043e\u0436\u043d":3,"\u0441\u043b\u0443\u0447\u0430":[0,1,4,9,13,14,19],"\u0441\u043b\u0443\u0448\u0430":4,"\u0441\u043c":[0,1,3,4,6,9,11,13,14,19],"\u0441\u043c\u0435\u043d":10,"\u0441\u043c\u0435\u0449\u0435\u043d":14,"\u0441\u043c\u043e\u0436\u0435\u0442":[3,8,14,16],"\u0441\u043c\u043e\u0442\u0440\u0435\u0442":19,"\u0441\u043d\u0430\u0447\u0430":4,"\u0441\u043d\u0438\u0437":[9,14],"\u0441\u043d\u044f\u0442":9,"\u0441\u043e":[0,3,4,7,9,11],"\u0441\u043e\u0431\u044b\u0442":11,"\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d":[1,19],"\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c":[4,9],"\u0441\u043e\u0432\u043f\u0430\u0434\u0430":9,"\u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d":1,"\u0441\u043e\u0434\u0435\u0440\u0436":[4,8,11,19],"\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442":9,"\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c":[2,4,9,12],"\u0441\u043e\u0435\u0434\u0438\u043d":4,"\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d":4,"\u0441\u043e\u0437\u0434\u0430":[2,4,5,14,15,19],"\u0441\u043e\u0437\u0434\u0430\u0432\u0430":[2,4],"\u0441\u043e\u0437\u0434\u0430\u043d":[4,8,19],"\u0441\u043e\u043e\u0431\u0449\u0430":4,"\u0441\u043e\u043e\u0431\u0449\u0435\u043d":[4,11],"\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],"\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432":[4,9,11,13,14,15],"\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432":[3,4,9,10,14],"\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d":11,"\u0441\u043e\u0441\u0442\u043e":[3,17],"\u0441\u043e\u0441\u0442\u043e\u044f":3,"\u0441\u043e\u0441\u0442\u043e\u044f\u043d":[3,4,9,19],"\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a":[3,8,14,16,19],"\u0441\u043e\u0444\u0442":19,"\u0441\u043e\u0445\u0440\u0430\u043d":[4,14],"\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d":[4,10],"\u0441\u043e\u0445\u0440\u0430\u043d\u044f":[4,10],"\u0441\u043e\u0447\u0435\u0442\u0430":19,"\u0441\u043e\u0447\u0435\u0442\u0430\u043d":11,"\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d":[3,4],"\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446":9,"\u0441\u043f\u0438\u0441\u043a":[4,9,14],"\u0441\u043f\u0438\u0441\u043e\u043a":[2,4,9,10,11,14,17],"\u0441\u043f\u043e\u0441\u043e\u0431":[4,9,10,15],"\u0441\u043f\u0440\u0430\u0432":[9,14],"\u0441\u043f\u0440\u0430\u0432\u043a":4,"\u0441\u0440\u0430\u0437":4,"\u0441\u0440\u0435\u0434":[3,4,9,19],"\u0441\u0440\u0435\u0434\u043d":[0,19],"\u0441\u0440\u0435\u0434\u0441\u0442\u0432":15,"\u0441\u0440\u0438\u043f\u0442":15,"\u0441\u0441\u044b\u043b\u043a":[3,19],"\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d":[4,11],"\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442":19,"\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d":4,"\u0441\u0442\u0430\u043d\u0435\u0442":9,"\u0441\u0442\u0430\u043d\u043e\u0432":19,"\u0441\u0442\u0430\u0440":4,"\u0441\u0442\u0438\u043b":10,"\u0441\u0442\u0438\u043b\u0435\u0432":10,"\u0441\u0442\u043e\u043b":[8,9],"\u0441\u0442\u043e\u0440\u043e\u043d":[2,4,7,10,11,19],"\u0441\u0442\u0440\u0430\u043d\u0438\u0446":[0,4,10,11],"\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a":19,"\u0441\u0442\u0440\u043e\u043a":[2,4,9,11,14,15],"\u0441\u0442\u0440\u043e\u043a\u043e\u0432":[4,14],"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440":[3,4,9],"\u0441\u0442\u0443\u0434":[9,15,16],"\u0441\u0443\u043f\u0435\u0440":4,"\u0441\u0443\u043f\u0435\u0440\u0434\u043e\u0441\u0442\u0443\u043f":4,"\u0441\u0443\u043f\u0435\u0440\u0442\u043e\u043a":4,"\u0441\u0443\u043f\u0435\u0440\u0442\u043e\u043a\u0435\u043d":4,"\u0441\u0443\u0449\u0435\u0441\u0442\u0432":[0,2,4,9],"\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d":[3,8,11,14,16],"\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d":9,"\u0441\u0445\u043e\u0436":9,"\u0441\u0447\u0435\u0442":11,"\u0441u":14,"\u0442":[10,11],"\u0442\u0430\u043a":[0,3,6,9,11,13,19],"\u0442\u0430\u043a\u0436":[0,1,4,6,7,9,11,15],"\u0442\u0430\u043a\u043e\u0432":[9,19],"\u0442\u0430\u043c":15,"\u0442\u0434":4,"\u0442\u0435":7,"\u0442\u0435\u043a\u0441\u0442":[1,2,9,10,11,17,19],"\u0442\u0435\u043a\u0441\u0442\u043e\u0432":[2,4,8,11,12,15,19],"\u0442\u0435\u043a\u0443\u0449":[4,9,11,13,19],"\u0442\u0435\u043b":4,"\u0442\u0435\u043b\u0435\u0433\u0440":1,"\u0442\u0435\u043b\u0435\u0444\u043e\u043d":1,"\u0442\u0435\u043c":[4,9,11,19],"\u0442\u0435\u043f\u0435\u0440":9,"\u0442\u0435\u0440\u043c\u0438\u043d":9,"\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b":[0,11],"\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d":0,"\u0442\u0435\u0445":13,"\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a":9,"\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433":[0,8,9,19],"\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a":19,"\u0442\u0438\u043f":[4,9,10,12,14],"\u0442\u043e":[3,4,7,8,9,10,11,14,16,19],"\u0442\u043e\u0433":[3,4,9,11,19],"\u0442\u043e\u043a":4,"\u0442\u043e\u043b\u0441\u0442":1,"\u0442\u043e\u043b\u0449\u0438\u043d":[9,14],"\u0442\u043e\u043b\u044c\u043a":[1,3,4,8,9,10,11,14,16,19],"\u0442\u043e\u043c":[0,4,7],"\u0442\u043e\u043d\u043a":6,"\u0442\u043e\u0447\u043a":19,"\u0442\u043e\u0447\u043d":19,"\u0442\u043e\u0447\u043d\u043e\u0441\u0442":[11,14],"\u0442\u0440\u0435\u0431":[0,1,2,4,7,9,10,11,13,14,16,19],"\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d":9,"\u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442":0,"\u0442\u044b\u0441":[3,8,14,16,19],"\u0442\u044b\u0441\u044f\u0447":3,"\u0443":[1,3,7,8,9,10,11,14,16,19],"\u0443\u0431\u0435\u0434":4,"\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430":3,"\u0443\u0433\u043b":9,"\u0443\u0433\u043e\u0434\u043d":0,"\u0443\u0434\u0430\u043b":10,"\u0443\u0434\u0430\u043b\u0435\u043d":[3,4,19],"\u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430":[9,17],"\u0443\u0434\u043e\u0431\u043d":7,"\u0443\u0434\u043e\u0431\u0441\u0442\u0432":9,"\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f":[9,10,14],"\u0443\u0436":[0,4,7,9,11],"\u0443\u0437":[0,4],"\u0443\u0437\u043b":19,"\u0443\u043a\u0430\u0436":9,"\u0443\u043a\u0430\u0437\u0430":[4,7,9,10,11,13],"\u0443\u043a\u0430\u0437\u0430\u043d":[4,19],"\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b":[9,10,13,14],"\u0443\u043a\u0430\u0437\u043d":9,"\u0443\u043a\u0430\u0437\u044b\u0432\u0430":[0,4,9],"\u0443\u043b\u0438\u0446":1,"\u0443\u043b\u0443\u0447\u0448":[3,8,14,16],"\u0443\u043c\u043e\u043b\u0447\u0430\u043d":[0,2,4,7,9,10,11,13,14,17],"\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d":[4,7,19],"\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430":4,"\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d":[3,4,8,9,10,11,19],"\u0443\u043f\u0440\u0430\u0432\u043b\u044f":[3,8,14,16,19],"\u0443\u043f\u0440\u043e\u0441\u0442":15,"\u0443\u043f\u0440\u043e\u0449\u0435\u043d":3,"\u0443\u0440\u043e\u0432\u0435\u043d":[8,9,19],"\u0443\u0440\u043e\u0432\u043d":[9,17],"\u0443\u0441\u043a\u043e\u0440\u044f":14,"\u0443\u0441\u043b\u043e\u0432":[9,14],"\u0443\u0441\u043b\u0443\u0433":19,"\u0443\u0441\u043f\u0435\u0448\u043d":[0,4],"\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430":[4,9,10],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432":[4,9,10,12,15],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a":[4,9,10,12],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b":[4,9,11,13,14],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d":[0,9,17],"\u0443\u0441\u0442\u0443\u043f\u0430":19,"\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a":19,"\u0443\u0447\u0435\u0442":[4,14,19],"\u0443\u0447\u0435\u0442\u043d":[2,3,4],"\u0443\u0447\u0438\u0442\u044b\u0432\u0430":11,"\u0443\u044f\u0437\u0432":9,"\u0444":11,"\u0444\u0430\u0439\u043b":[2,4,5,6,17,19],"\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a":[1,11,19],"\u0444\u0438\u043a\u0441\u0430\u0446":4,"\u0444\u0438\u043a\u0441\u0438\u0440":4,"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432":19,"\u0444\u0438\u0440\u043c":8,"\u0444\u043b\u0430\u0436\u043a":9,"\u0444\u043b\u0430\u0436\u043e\u043a":9,"\u0444\u043e\u043a\u0443\u0441":9,"\u0444\u043e\u0440\u043c\u0430\u0442":[2,4,9,14,19],"\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d":9,"\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430":9,"\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d":14,"\u0444\u0443\u043d\u043a\u0446":[3,7,8,19],"\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d":[1,3,7,8,9,16,19],"\u0445":[4,9,14],"\u0445\u0430\u0440\u0430\u043a\u0435\u0442\u0440\u0438\u0437":9,"\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437":14,"\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a":9,"\u0445\u043e\u0441\u0442":4,"\u0445\u043e\u0442":[3,6,9,14,17],"\u0445\u0440\u0430\u043d\u0435\u043d":[3,4],"\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449":[3,4,19],"\u0446\u0432\u0435\u0442":[4,9,10,14,17],"\u0446\u0435\u043b":[4,9],"\u0446\u0435\u043b\u0435\u0432":[9,13],"\u0446\u0435\u043b\u043e\u0441\u0442\u043d":11,"\u0446\u0435\u043d\u0442\u0440":[0,3,4,7,8,9,14,16,19],"\u0446\u0435\u043f\u043e\u0447\u043a":9,"\u0446\u0438\u043a\u043b":4,"\u0446\u0438\u0444\u0440\u043e\u0432":[1,19],"\u0447\u0430\u0441":9,"\u0447\u0430\u0441\u0442":[4,9],"\u0447\u0430\u0441\u0442\u043e\u0442":4,"\u0447\u0430\u0442":19,"\u0447\u0435\u0433":[11,13,14],"\u0447\u0435\u0440\u0435\u0437":[3,4,8,9,11,19],"\u0447\u0438\u0441\u043b":[9,11,14],"\u0447\u0438\u0441\u0442":0,"\u0447\u0438\u0441\u0442\u043e\u0442":19,"\u0447\u0438\u0442\u0430":2,"\u0447\u0442\u0435\u043d":[4,9,19],"\u0447\u0442\u043e":[2,3,7,8,9,10,11,12,13,14,15,16,19],"\u0447\u0442\u043e\u0431":[3,4,9,11,15,17],"\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d":4,"\u0448\u0430\u0431\u043b\u043e\u043d":[3,4,19],"\u0448\u0430\u043d\u0441":3,"\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0438\u0440\u0438\u0447\u043d":11,"\u0448\u0438\u0440\u0438\u043d":[4,14],"\u0448\u0438\u0440\u043e\u043a":3,"\u0449\u0435\u043b\u043a\u043d":9,"\u0449\u0435\u043b\u043a\u043d\u0443\u0442":[9,17],"\u0449\u0435\u043b\u0447\u043a":[9,13],"\u0449\u0435\u043b\u0447\u043e\u043a":[9,13],"\u044d\u0432\u043c":[15,19],"\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440":[4,9,14],"\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a":19,"\u044d\u043a\u0440\u0430":[4,8,9,13,14,19],"\u044d\u043a\u0440\u0430\u043d":[4,9,13,14],"\u044d\u043b\u0435\u043c\u0435\u043d\u0442":[4,8,9,10,14,19],"\u044d\u0440\u0430\u043d":8,"\u044d\u0442":[3,4,6,7,8,9,10,11,14,15,16,19],"\u044d\u0442\u043e\u0442":[3,9,15],"\u044d\u0444\u0444\u0435\u043a\u0442":[3,8,14,16,19],"\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d":[10,19],"\u044f":8,"\u044f\u0432\u043b\u044f":[4,9,14,19],"\u044f\u0432\u043d":[11,19],"\u044f\u0434\u0440":4,"\u044f\u0437\u044b\u043a":[4,9,11],"case":[2,5],"catch":[2,5],"class":9,"continue":4,"debugger":18,"default":[2,4,5],"double":9,"else":[2,5],"false":[2,4,5,9,10,11,14],"float":[2,5,9,10,11,13,14],"for":[2,4,5,11,19],"function":5,"import":[4,5,6,8,9,10,11,12,13,14,15,18],"int":[9,10,11,13,14],"key_rus_\u0430":11,"key_rus_\u0431":11,"key_rus_\u0432":11,"key_rus_\u0433":11,"key_rus_\u0434":11,"key_rus_\u0435":11,"key_rus_\u0436":11,"key_rus_\u0437":11,"key_rus_\u0438":11,"key_rus_\u0439":11,"key_rus_\u043a":11,"key_rus_\u043b":11,"key_rus_\u043c":11,"key_rus_\u043d":11,"key_rus_\u043e":11,"key_rus_\u043f":11,"key_rus_\u0440":11,"key_rus_\u0441":11,"key_rus_\u0442":11,"key_rus_\u0443":11,"key_rus_\u0444":11,"key_rus_\u0445":11,"key_rus_\u0446":11,"key_rus_\u0447":11,"key_rus_\u0448":11,"key_rus_\u0449":11,"key_rus_\u044a":11,"key_rus_\u044b":11,"key_rus_\u044c":11,"key_rus_\u044d":11,"key_rus_\u044e":11,"key_rus_\u044f":11,"new":[5,6],"return":[4,5,8,10],"static":9,"switch":11,"this":[2,5],"true":[2,4,5,7,9,10,11,14,18],"try":[4,9],"var":4,"with":[4,5,6,8],__agent__:2,__agentactivityreturndictitemcreate__:5,__agentdictitemcreate__:5,__create__:5,__init__:4,__main__:6,__name__:6,__orchestrator__:4,__statisticsdict__:5,__uacclientadmincreate__:5,_cp:4,_sessionlast_gsettings:4,_sessionlast_rdplist:4,_sessionlast_storagedict:4,about:[5,18],abs:5,absolute:[5,9],absolutely:2,abspath:4,access:[4,5,7],accessusers:5,activate:5,active:[4,5,7],active_only:9,activities:5,activity:[4,5,7],activitydict:[5,7],activityitem:[3,19],activityitemcreate:4,activityitemdefaliascreate:4,activityitemdefaliasmodulesload:4,activityitemdefaliasupdate:4,activityitemhelperdefautofill:4,activityitemhelperdeflist:4,activityitemnowdict:5,activitylist:5,activitylistappendprocessorqueuebool:[5,7],activitylistexecute:4,activitylistexecutebool:[5,7],activitytimelist:5,add:5,addhandler:5,address:5,addressstr:5,admindict:[5,7],administrator:4,after:[5,18],agent:[4,5,19],agentactivityitemadd:4,agentactivityitemexists:4,agentactivityitemreturnexists:4,agentactivityitemreturnget:4,agentactivitylifetimesecfloat:5,agentactivityreturndict:5,agentactivityreturnlifetimesecfloat:5,agentconnectionlifetimesecfloat:5,agentdict:5,agentfilechunkbytessizeint:5,agentfilechunkcheckintervalsecfloat:5,agentkeydict:[5,7],agentkeystr:[5,7],agentlimitlogsizebytesint:5,agentloopsleepsecfloat:5,agentoscmd:4,agentosfilebinarydatabase64strappend:4,agentosfilebinarydatabase64strcreate:4,agentosfilebinarydatabase64strreceive:4,agentosfilebinarydatabytescreate:4,agentosfilebinarydatareceive:4,agentosfilesend:4,agentosfiletextdatastrcreate:4,agentosfiletextdatastrreceive:4,agentoslogoff:4,agentprocesswoexeupperuserlistget:4,alert:10,algorythms:5,alias:[4,5],aliasdefdict:[4,5],all:[4,5,7],allow:6,allowed:5,already:4,alt:11,alt_shift_toggle:11,amd64:[0,4,9,15],amd64python:15,and:[2,4,5,7],another:4,apache:1,api:4,app:2,appear:18,append:[4,5,7,9,15],applicable:5,application:[4,9],apply:5,apt:[0,11,12,14],archive:5,argdict:[4,5],arggsettings:[4,5],arggsettingsstr:4,arglist:[4,5],arglogger:[4,5],argloggerstr:4,args:[4,5],arguments:10,argvaluestr:4,asctime:5,ask:5,astra:19,asweigart:1,attention:[2,4,5],attribute:[4,5],authentication:5,authtoken:5,authtokensdict:5,auto_id:9,autocleaner:5,automatically:5,automation:[8,19],automation_id:9,available:[5,6],b64decode:2,back:19,backend:[8,9],backendstr_gettoplevellist_uioinfo:9,base64:[2,4],basehttprequesthandler:4,basewrapper:9,basic:[5,6],beautiful:2,been:[4,5],before:5,beginwith:[4,5],below:4,best_match:9,between:5,bigdata:19,bin:0,binary:[2,4],bit:1,blob:1,blocked:5,blue:[9,10,14],body:[4,5],bool:[4,5,9,10,11,14],boppreh:1,borismoore:1,bottom:9,box:[6,19],boxanchorrulecheck:14,boxcreate:14,boxdraw:14,boxgetpoint:14,boxmodify:14,boxmoveto:14,boxoverlay:14,browser:5,browserchange:10,browserchromestart:10,browserclose:10,bs_null:9,bsd:1,bst_checked:9,bst_indeterminate:9,bst_unchecked:9,button:[5,7,9,14],button_down:9,button_up:9,cache:5,calcframe:9,call:[4,5,6],can:[4,5,6,18],cancel:9,car:4,catchperiodsecfloat:5,cclulds:14,certfilepempathstr:5,changed:5,chat:19,check:[4,5,9,18],checkbox:9,checkintervalsecfloat:5,child:10,chrome:[4,10],chunk:5,class_name:[8,9],class_name_re:9,clause:1,clear:5,click:[9,13],click_input:[8,9],clickdouble:13,client:5,clientrequesthandler:5,clipboard:[0,8,15,19],clipboardget:8,clipboardset:8,close:[4,5,18],cmd:[2,4,5,6,7,8,11,17],cmdinputbool:[5,7],code:[4,5,9],codepoint:11,codes:11,col:10,collecting:5,color:10,colour:9,com:[0,1,11,19],combobox:9,come:[2,18],command:[0,2,11,15],commands:5,completed:5,completion:5,complex:4,config:6,configuration:[4,5,6],configure:[0,5,9],connect:5,connection:5,connectioncountint:5,connectionfirstqueueitemcountint:5,console:5,contains:[4,5],content:5,control:[4,5,7],control_id:9,control_type:[8,9],control_type_re:9,controlpanel:[4,5],controlpaneldict:5,controlpanelkeyallowedlist:5,controlpanelrefreshintervalsecfloat:5,controls:[5,7],cookie:5,coords:9,copy:15,cp1251:[2,4],cp866:2,cp_:4,cp_versioncheck:4,cpkey:5,cpkeydict:[5,7],cpkeystr:[5,7],cpu:19,create:[2,4,5,6,18],created:5,creating:5,crosscheck:4,crossos:5,css:10,ctrl:[8,9,11],ctrl_index:9,ctypes:8,current:[4,5,7],cus:14,daemonic:2,data:[5,11],datasetlast:5,datastorage:4,datetime:5,dbader:1,dear:11,debugging:[4,5],def:[4,5,6,8,18],defaliastest:5,defhelper:4,defnamestr:5,defsettingsupdatepathlist:5,demo:[8,9],depth_end:[8,9],depth_start:[8,9],depth_stop:9,depthbit:[4,5],desktop:[5,19],desktopuser:4,detect:5,devhints:10,dict:[2,4,5,9,19],dictionary:[4,5],directory:[4,7,18],disconnect:[4,5],display_dashboard:4,div:10,dodict:5,domain:5,domainadstr:5,domainupperstr:4,domainuser:4,don:[2,5],dont:[5,7],dos:[2,4],double_click_input:[8,9],down:[11,13],dp0:15,drag_mouse_input:9,draw_outline:[8,9],drives:5,dropped_rect:9,dsd:5,dst:9,dump:5,dumploglist:5,dumploglistcountint:5,dumploglisthashstr:5,dumploglistrefreshintervalsecfloat:5,duration:5,each:5,early:2,echo:[8,11],edit:[8,9],element_info:9,elementinfo:9,empty:[5,7],enabled:9,enabled_only:9,encapsulated:2,encoding:[2,4],end:9,eng:19,enter:8,env:5,equal:[4,5],equalcase:[4,5],equalnoparam:4,etc:4,every:[4,5],example:4,examples:5,except:[4,9],exception:[4,9,10],exceptions:4,exe:[0,2,4,9,10,15,18],executable:4,execute:[2,5,7],executebool:5,executed:4,executing:5,execution:[2,5],exist:5,exists:[4,5],explorer:[4,17],feature:5,field:5,file:[2,4,5,18],filebodybytes:4,filehandler:5,filemanager:5,filemode:5,filenamestr:4,files:5,fileurl:5,fileurlfilepathdict:5,fileurlfilepathdict_help:5,fill:[5,9],filled:5,fills:5,findwindows:9,flag:[2,5],flagaccess:5,flagaccessdefrequestglobalauthenticate:5,flagcredentialsask:5,flagdonotexpire:5,flagsessionisactive:5,flaguseallmonitors:[4,5],flase:[2,4],forget:5,format:2,formatter:5,found:[0,11],found_index:9,foundation:1,framework:9,framework_id:9,friday:4,friendly_class_name:9,friendly_class_name_re:9,friendlyclassname:9,from:[4,5,6,8,9,10,11,12,13,14,15,18],from_point:9,front:19,full:5,full_control_type:9,fullscreen:5,fullscreenbool:[5,7],fullscreenrdpsessionkeystr:5,functions:[2,4,9,10,11,12,13,14,18],general:5,get:[0,4,5,11,12,14],get_check_state:9,get_item_focus:9,get_line:9,get_osbitnessint:9,get_properties:9,getlogger:5,getscreenshot:4,giampaolo:1,git:[0,4,5,7],github:1,gitlab:19,give:[5,7],global:2,google:10,green:[4,9,10,14],grey:10,grid:10,grid__ccol:10,grid__main:10,grid_newscol:10,grid_newscol__more:10,groupbox:9,groupboxes:9,grp:11,gsettings:[4,6,19],gsettingsdict:4,gsettingsget:4,gsettingskeylistvalueappend:4,gsettingskeylistvalueget:4,gsettingskeylistvalueoperatorplus:4,gsettingskeylistvalueset:4,guid:[4,5],guidstr:[4,5],gurbage:5,habr:19,handbk:11,handle:[5,9],handlebars:1,handler:5,handlers:5,hard:5,has:[5,18],have:4,hdd:19,headers:4,height:[4,5,9,14],hello:[4,10,11,12],help:[4,19],hex:[5,9],hiddenisorchestratorinitialized:5,hierarchy:17,host:[4,5],hostnameupperstr:5,hotkeycombination:11,hotkeyctrla_ctrlc:11,hotkeyctrlv:11,how:18,hpnd:1,href:10,html:[4,5,9,19],http:[0,1,4,5],https:[0,1,4,5,9,10,11,19],ignore:5,ignorebool:[5,7],image:[4,15],image_wait_interval_sec_float:14,image_wait_sec_float:14,imageclick:14,imageexists:14,imagelocateall:14,imagewaitappear:14,imagewaitdisappear:14,imported:4,inactionname:9,inactivityitemdict:4,inactivitylist:4,inaddressstr:4,inadisdefaultbool:4,inadloginstr:4,inadstr:4,inadstrinadloginstr:4,inagentfilepathstr:4,inaliasstr:4,inanchorbox:14,inanchorrule:14,inanchorrulestr:19,inarg1str:4,inargdict:4,inarggsettings:4,inarggsettingsstr:4,inarglist:[4,10],inargloggerstr:4,inargumentlist:9,inasyncinitbool:4,inattributestr:10,inbackend:9,inbox1:14,inbox2:14,inbox:14,inboxindexint:14,inbreaktriggerprocesswoexelist:4,inbrowser:10,inbuttonstr:[13,14],incapturebool:[2,4],incertfilepempathstr:4,incheckintervalsecfloat:4,inchromeexepathstr:10,inclickcountint:[13,14],incloseforcebool:4,included:8,incmdencodingstr:[2,4],incmdstr:[2,4],incolorstr:[10,14],inconfidencefloat:14,incontenttypestr:4,incontrolspecificationarray:9,incpkeystr:4,indef:4,indefargdict:4,indefarggsettingsnamestr:4,indefarglist:4,indefargloggernamestr:4,indefargnamegsettingsstr:4,indefnamestr:4,indefquerystr:4,indefstr:4,indelayfloat:11,indelaysecfloat:11,indepthbitint:4,index:[1,4,5,9],indheightint:14,indict:5,indomainstr:4,indopressbool:11,indoreleasebool:11,indriverexepathstr:10,indumprestorebool:4,indurationsecfloat:10,indwidthint:14,indxint:14,indyint:14,inelement:9,inelementinfo:9,inelementspecification:9,inencodingstr:[2,4],inexactbool:11,inexecuteinnewthreadbool:4,inextensionpathlist:10,infiledatabase64str:[2,4],infiledatabytes:4,infiledatastr:[2,4],infilepathstr:[2,4],inflagforceclosebool:4,inflaggetabspathbool:4,inflagraiseexception:9,inflagsetfocus:9,inflagwaitallinmoment:9,info:[4,5],infolderpathstr:4,inforcebool:4,inglobpatternstr:4,ingsettings:[2,4,6],ingsettingsclientdict:5,inguidstr:4,inhashkeystr:5,inheadersdict:4,inheightint:14,inheightpxint:4,inhierarchylist:9,inhorizontalpxint:10,inhostfilepathstr:4,inhostnamestr:4,inhoststr:[4,5],inhtmlrenderdef:4,inimgpathstr:14,inintervalasyncbool:4,inintervalsecfloat:[4,13,14],inisfirst:10,inisgraymodebool:14,init:[4,5,6,18],init_debug:18,initdatetime:5,inited:5,initialized:5,injsinitgeneratordef:4,injsongeneratordef:4,injsstr:10,inkeyfilepathstr:4,inkeyint:11,inkeylist:[4,11],inkeystr:5,inkwargs:18,inkwargumentobject:9,inleftint:14,inlogger:[4,5,18],inloggerlevel:5,inloginstr:[4,5],inmatchtypestr:4,inmessagestr:4,inmethodstr:4,inmodestr:[4,5,6],inmodulepathstr:4,inmovedurationsecfloat:[13,14],inoperationcodestr:4,inorchestratorfilepathstr:4,inpasswordstr:[4,5],inpathstr:4,inpoint:14,inpointrulestr:19,inportint:4,inportstr:[4,5],inprocessnamewexestr:4,inprocessnamewoexelist:4,inprocessnamewoexestr:4,inprofilepathstr:10,inrdpfilepathstr:4,inrdpsessionkeystr:[4,5],inrdptemplatedict:4,inredirectclipboardbool:4,inrequest:4,inresponestr:4,inrestorestateafterbool:11,inreturn:5,inrobotnamestr:4,inrolehierarchyalloweddict:4,inrolekeylist:4,inrootelement:9,inrowcountint:5,inrunasadministratorbool:4,inrunasyncbool:[2,4],inscrollclickcountint:13,insendoutputtoorchestratorlogsbool:[2,4],insert:4,inserverkeystr:4,inshareddrivelist:4,inspecificationlist:9,inspecificationlistlist:9,install:[0,8,11,12,14],instance:5,instopprocessnamewoexestr:4,insupertokenstr:4,internet:17,interval:5,intervalsecfloat:5,intextstr:[11,12],inthicknessint:14,inthreadbool:4,intimehhmmstr:4,intopint:14,inuacbool:4,inuio:10,inuioselector:9,inuioselectorstr:10,inurlindexstr:4,inurllist:4,inurlstr:[4,10],inusebothmonitorbool:4,inusecachebool:4,inusernamestr:4,inuserstr:4,invalue:[4,10],inverticalpxint:10,inwaitaftersecfloat:[11,13,14],inwaitintervalsecfloat:[10,14],inwaitsecfloat:[10,14],inwaitsecs:9,inweekdaylist:4,inwidthint:14,inwidthpxint:4,inx:9,inxint:[13,14],iny:9,inyint:[13,14],is_checked:9,is_child:9,is_dialog:9,is_enabled:9,is_single_selection:9,is_visible:9,isdown:11,islistenbool:5,isresponsiblebool:4,issafestop:18,isstopsafe:18,item:[5,9],item_count:9,item_data:9,item_texts:9,iterations:5,ivan:[1,4],ivanmaslov:1,javascript:10,jinja2:[1,4],jinja:1,join:4,json:[2,4,5,9],jsrender:1,jupiternotebook:1,jupyter:1,kb2999226:19,kde:0,key:[4,5],key_down:9,key_eng_a:11,key_eng_b:11,key_eng_c:11,key_eng_colon:11,key_eng_d:11,key_eng_e:11,key_eng_f:11,key_eng_g:11,key_eng_h:11,key_eng_i:11,key_eng_j:11,key_eng_k:11,key_eng_l:11,key_eng_layout:11,key_eng_m:11,key_eng_n:11,key_eng_o:11,key_eng_p:11,key_eng_q:11,key_eng_r:11,key_eng_s:11,key_eng_t:11,key_eng_u:11,key_eng_v:11,key_eng_w:11,key_eng_x:11,key_eng_y:11,key_eng_z:11,key_hot_0:11,key_hot_1:11,key_hot_2:11,key_hot_3:11,key_hot_4:11,key_hot_5:11,key_hot_6:11,key_hot_7:11,key_hot_8:11,key_hot_9:11,key_hot_alt_left:11,key_hot_alt_right:11,key_hot_apostrophe:11,key_hot_backspace:11,key_hot_caps_lock:11,key_hot_clear:11,key_hot_colon:11,key_hot_context_menu:11,key_hot_ctrl_left:11,key_hot_ctrl_right:11,key_hot_delete:11,key_hot_down:11,key_hot_end:11,key_hot_enter:11,key_hot_esc:11,key_hot_f10:11,key_hot_f11:11,key_hot_f12:11,key_hot_f13:11,key_hot_f14:11,key_hot_f15:11,key_hot_f16:11,key_hot_f17:11,key_hot_f18:11,key_hot_f19:11,key_hot_f1:11,key_hot_f20:11,key_hot_f21:11,key_hot_f22:11,key_hot_f23:11,key_hot_f24:11,key_hot_f2:11,key_hot_f3:11,key_hot_f4:11,key_hot_f5:11,key_hot_f6:11,key_hot_f7:11,key_hot_f8:11,key_hot_f9:11,key_hot_greater_than:11,key_hot_home:11,key_hot_insert:11,key_hot_left:11,key_hot_less_than:11,key_hot_minus:11,key_hot_num_lock:11,key_hot_numpad_0:11,key_hot_numpad_1:11,key_hot_numpad_2:11,key_hot_numpad_3:11,key_hot_numpad_4:11,key_hot_numpad_5:11,key_hot_numpad_6:11,key_hot_numpad_7:11,key_hot_numpad_8:11,key_hot_numpad_9:11,key_hot_numpad_asterisk:11,key_hot_numpad_delete:11,key_hot_numpad_enter:11,key_hot_numpad_minus:11,key_hot_numpad_plus:11,key_hot_numpad_solidus:11,key_hot_page_down:11,key_hot_page_up:11,key_hot_plus:11,key_hot_print_screen:11,key_hot_right:11,key_hot_scroll_lock:11,key_hot_shift_left:11,key_hot_shift_right:11,key_hot_solidus:11,key_hot_space:11,key_hot_square_bracket_left:11,key_hot_square_bracket_right:11,key_hot_tab:11,key_hot_tilde:11,key_hot_up:11,key_hot_vertical_line:11,key_hot_win_left:11,key_hot_win_right:11,key_rus_layout:11,key_up:9,keyboard:[1,8,9,15,19],keyfilepathstr:5,keys:[4,9],lactivityitem:4,lactivityitemdict:4,lactivitylist:9,lactivityresult:9,laliasstr:4,lang:1,lappearuiolist:10,lapplist:9,last:5,latest:9,layout:11,lbackendstr:9,lbox1:14,lbox2:14,lbox3:14,lbox:14,lboxlist:14,lbrowser1:10,lbrowser2:10,lclipstr:12,lcommentselector:8,ldemobase:8,ldemobasebitint:9,ldemobasebitstr:9,ldemobaseselector:8,ldemobaseuioexistbool:9,ldemobaseuioexistlist:9,ldemobaseuiolist:9,ldemobaseuioselector:9,ldemobaseuioselectorclean:9,ldemobaseuioselectorditry:9,left:[9,13,14],legacy:19,len:5,levelname:5,lib:4,library:8,license:1,licenses:1,life:5,lifetime:5,lifetimerequestsecfloat:5,lifetimesecfloat:5,line_count:9,line_index:9,line_length:9,link:[4,5],linux:[2,4,9,10,12,13,14,16,19],list:[4,5,9,10,14],listbox:9,listen:4,listendict:5,listread:5,livedebugcheckthread:18,lkeyaispressedbool:11,llc:19,llogger:4,lnotepadcancelselector:9,lnotepadokselector:9,loaded:5,localhost:[0,5],log:[5,7,18],logger:[4,5,18],loggerdumploghandleradd:5,loggerhandlerdumploglist:5,logging:[4,5],login:[4,5],logoff:[4,5],logs:[2,5,7],logviewerbool:[5,7],look:[4,5,7],lookmachinescreenshots:5,loops:5,lordernumberselector:8,lotherbitnessprocess:9,lowercase:5,lpoint:14,lprocess:4,lprocessisstartedbool:4,lprocesslist:4,lpy64:0,lpyopenrpa_settingsdict:9,lrdpitemdict:4,lrequest:4,lresult:[5,14],lresultdict:[4,5],lresultstr:10,lrobotbitint:9,lrunbase:8,lrunbaseselector:8,ltextraw:8,ltextstr:10,ltimestr:8,luio:[9,10],luioelementinfodict:9,luiohierarchylist:9,luioindexint:9,luioinfolist:9,luiolist:[9,10],luioobject:9,luioprocessinfodict:9,luioselectorstr:10,lwebauditmessagestr:4,lwrapperobject:9,mabspathupperstr:5,machina:5,machine:[4,5],magenthostnamestr:5,magentusernamestr:5,magicmock:9,mail:10,main:[1,3,5,6],makedirs:5,managers:[4,5],managersgitdict:5,managersprocessdict:5,markdown:19,maslov:[1,4],master:1,matchtype:[4,5],max:5,mdefaultpywinautobackend:9,message:[4,5],messageboxw:8,messages:18,method:[4,5],methodmatchurl:5,methodmatchurlbeforelist:5,mhammond:1,mhandlerdumploglist:5,microsoft:19,middle:[10,13,14],mime:4,minutes:5,mit:1,mmstr:5,mock:9,modification:2,module:[4,5,6,18],modulenamestr:4,modules:4,moduletocall:4,monitoring:4,more:[5,6],mouse:[8,14,15,19],mousedown:8,mouseup:8,moveto:[8,13],mprocessnamewoexestr:5,mrobotlogger:5,mrobotloggerfh:5,mrobotloggerformatter:5,msg_box:8,must:5,name:[4,5,9],namewoexestr:4,namewoexeupperstr:4,need:[2,11],needed:5,ner:19,newkeydict:4,newkeylist:4,newvalue:4,nlp:19,none:[2,4,5,9,10,11,13,14,18],not:[0,4,5,11],notebook:1,notepad:[2,4,9],nothingbool:[5,7],now:[4,5],nth:10,nul:15,numpy:1,object:[5,9],ocr:19,octet:4,off:[5,7],old:5,one:5,only:5,op_code_1:4,open:[5,19],opencv:[1,14,19],openrpa:[5,19],openrpaorchestrator:15,opensource:1,operation:4,option:[5,7,11],optional:[4,10,11,13,14],orc:[5,7],orch:5,orchestrator:[2,4,5,6,19],orchestrator_x64:6,orchestratorinitwait:4,orchestratorisadmin:4,orchestratorisinited:4,orchestratorloggerget:4,orchestratormain:15,orchestratorpyopenrpa:6,orchestratorpysearchinit:4,orchestratorrerunasadmin:4,orchestratorrestart:4,orchestratorscheduleget:4,orchestratorsessionrestore:4,orchestratorsessionsave:4,orchestratorstart:5,orchestratorthreadstart:4,org:1,oscmd:[2,4],oscredentialsverify:4,osfilebinarydatabase64strappend:2,osfilebinarydatabase64strcreate:2,osfilebinarydatabase64strreceive:2,osfilemtimeget:2,osfiletextdatastrcreate:2,osfiletextdatastrreceive:2,oslogoff:4,osremotepcrestart:[4,5],osrestart:4,output:[2,5],outstr:4,overwrite:5,own:6,packages:4,page:[5,7],pagejsexecute:10,pageopen:10,pagescrollto:10,pallets:1,pane:8,panel:5,panels:5,param:10,parent:9,pass:[4,5],password:[4,5],path:[4,5,15],pathstr:5,pause:[9,15],pay:5,pdb:5,pdf:[1,19],pem:4,period:5,periodically:5,php:1,pickle:4,pid:4,pil:1,pillow:1,pip:[0,14],pixels:5,png:[4,14],point:19,pointclick:14,pointclickdouble:14,pointcreate:14,pointdown:14,pointmodify:14,pointmoveto:14,pointup:14,popupmenu:9,port:[4,5],portint:5,pos_end:9,pos_start:9,post:[4,5],powershell:5,predicate_func:9,press_mouse_input:9,pressed:9,print:14,process:[2,4,5,9],process_id:9,processbitness:9,processdefintervalcall:4,processdetaillist:4,processisstarted:4,processlistget:4,processor:[2,3,4,5,7],processoractivityitemappend:4,processoractivityitemcreate:4,processoraliasdefcreate:4,processoraliasdefupdate:4,processordict:5,processstart:4,processstop:4,processwoexelist:4,processwoexeupperlist:4,processwoexeupperuserlistget:2,program:[4,5],programs:5,prototype:5,psf:1,psutil:1,pull:[5,7],pulse:10,push:5,pwa:9,pwaspecification_get_pwaapplication:9,pwaspecification_get_uio:9,pyautogui:1,pyopenpra:[9,19],pyopenrpa:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],pyopenrpa_product_service:1,pyopenrpa_repo:4,pyopenrpa_support:1,pyopenrpa_uidesktopx32:9,pyopenrpa_uidesktopx64:9,pyopenrpadict:[5,7],pypathstr:4,pyscreeze:[1,14],python32fullpath:9,python32processname:9,python3:0,python64fullpath:9,python64processname:9,python:[0,1,4,8,9,14,17,19],pythonstart:4,pywin32:1,pywinauto:[1,9],queue:[4,5,7],queuelist:5,r01:5,r01_integrationorderout:5,r01_orchestratortorobot:5,radiobutton:9,radiobuttons:9,raised:4,ram:19,rdp:[3,4,5,7],rdpactive:5,rdpkey:4,rdpkeydict:[5,7],rdpkeystr:[5,7],rdplist:5,rdpsession:4,rdpsessioncmdrun:4,rdpsessionconnect:[4,5],rdpsessiondisconnect:[4,5],rdpsessionfilestoredrecieve:4,rdpsessionfilestoredsend:4,rdpsessionkey:5,rdpsessionkeystr:5,rdpsessionlogoff:4,rdpsessionmonitorstop:4,rdpsessionprocessstartifnotrunning:4,rdpsessionprocessstop:4,rdpsessionreconnect:[4,5],rdptemplatecreate:4,read:[2,5],readthedocs:[4,5,9],ready:9,recieve:5,recieved:5,reconnect:[4,5],reconnectbool:[5,7],recoverydict:5,rect:9,rectangle:9,red:[9,10,14],redirectclipboardbool:4,reestr_otgruzok:5,refresh:5,relative:[4,5],remember:[5,7],remote:5,replace:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],report:5,reports:5,request:[4,5],requesting:5,requests:[1,5],requesttimeoutsecfloat:5,resolution:5,resources:[0,4,9,15,19],resourceswpy32:15,resourceswpy64:15,responsecontenttype:[4,5],responsedefrequestglobal:[4,5],responsefilepath:[4,5],responsefolderpath:[4,5],responsibility:5,responsibilitycheckintervalsec:5,responsible:5,restart:[5,7],restartorchestrator:5,restartorchestratorbool:[5,7],restartorchestratorgitpullbool:[5,7],restartpcbool:[5,7],result:[4,5,7],returnbool:5,returnedbydatetime:5,rich_text:9,rich_text_re:9,right:[9,13,14],right_click_input:9,rights:19,robot1:4,robot:[0,5,8,9,10,11,12,13,14,15,18,19],robot_r01:5,robot_r01_help:5,robotrdpactive:5,rolehierarchyalloweddict:5,root:[5,9],row:5,rpa00:0,rpa:[3,4,5,8,11,14,15,16,19],rpatestdirtest:4,rst:1,rtype:10,ruledomainuserdict:5,rulemethodmatchurlbeforelist:5,run:[4,5,6],running:[4,17],runs:5,runtime_id:9,rus:19,safe:2,scan:11,schedule:[1,4,5],scheduler:4,scheduleractivitytimeaddweekly:4,schedulerdict:5,scopesrcul:5,screen:[0,4,5,8,19],screened:5,screenshots:[5,7],screenshotviewerbool:[5,7],scrollhorizontal:13,scrollvertical:13,scrot:[0,14],sec:5,seconds:[4,5],section:4,see:[4,5],select:9,selected_index:9,selected_indices:9,selected_text:9,selection_indices:9,selenium:[1,10],seleniumhq:1,self:9,semantic:1,send:[2,4,5,7,8,11],send_keys:9,sendinput:9,sent:5,server:[2,4,5,7,17,19],serverdict:5,serverinstance:5,serversettings:5,serverthread:5,sesion:5,session:[2,4,5],sessionguidstr:5,sessionhex:[4,5],sessionisignoredbool:[4,5],sessioniswindowexistbool:[4,5],sessioniswindowresponsiblebool:[4,5],set:[2,5,12],set_check_indeterminate:9,set_edit_text:[8,9],set_focus:9,set_foreground:9,set_item_focus:9,set_text:9,set_trace:5,set_window_text:9,setformatter:5,setlevel:5,settings:[2,5],settingsinit:9,settingstemplate:[5,6],settingsupdate:4,setup:5,setxkbmap:[0,11],shareddrivelist:[4,5],shell:15,shift:11,should:5,show:[5,7],side:[5,7,18],signal:18,simple:4,since:5,site:4,size:5,sleep:[5,8,10],snipp:11,software:1,some:[5,7],someprocess:18,sources:19,special:5,split:8,src:9,ssl:4,stable:5,standart:5,staragedict:4,start:[2,4,9],started:4,starts:5,statictext:9,status:4,statuscheckstart:4,stdout:5,stop:[4,18],stopsafe:19,storage:[4,5],storagedict:[4,5],storagerobotexists:4,storagerobotget:4,stored:5,str:[2,4,5,9,10,11,12,13,14],stream:4,streamhandler:5,strftime:5,strict:14,string:2,struct:5,structure:5,studio:19,studio_x64:17,studiopyopenrpa:17,style:8,success:4,successfully:5,sudo:[0,12,14],support:[1,19],svelte:10,sys:[4,5,15],tabcontrol:9,taskkill:18,technical:5,technicalsessionguidcache:5,telegram:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],tenchat:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],test2:5,test:[2,4,5],testdef:4,testdefalias:4,testdir:4,testdirtest:4,testrdp:5,text:[4,8,9],text_block:9,texts:9,than:5,that:18,the:[2,4,5,6,7,18],there:5,thickness:9,thread:[4,5,7,18],threadbool:4,threaded:5,threadidint:5,threading:4,thunderrt6textbox:9,thundertextbox:9,thursday:4,time:[2,5,8,10,11],timehh:5,times:5,timestamp:2,title:[8,9],title_re:9,tmemo:9,tokendatetime:5,too:5,tool:5,tools:[5,18],top:[9,14],top_level_only:9,top_level_parent:9,tpanel:9,transmition:[2,5],trigger:5,triggercountint:5,trunk:1,ttt:5,turn:[5,7],turn_off_numlock:9,txt:[1,4],type:[5,10],type_keys:9,uac:[4,19],uacbool:[4,5],uackeylistcheck:4,uacsupertokenupdate:4,uacupdate:4,uacuserdictget:4,ubuntu:[0,19],uia:[8,9],uidesktop:[8,15,19],uio:[10,17,19],uio_focushighlight:9,uio_getctrlindex_int:9,uio_highlight:9,uio_wait_interval_sec_float:10,uio_wait_sec_float:10,uioattributeget:10,uioattributeremove:10,uioattributeset:10,uioattributestyleget:10,uioattributestyleremove:10,uioattributestyleset:10,uioclick:10,uioei_convert_uioinfo:9,uioinfo:9,uiomousesearchinit:10,uiomousesearchreturn:10,uioselector:9,uioselector_exist_bool:9,uioselector_focushighlight:9,uioselector_get_bitnessint:9,uioselector_get_bitnessstr:9,uioselector_get_uio:[8,9],uioselector_get_uioactivitylist:9,uioselector_get_uioinfo:9,uioselector_get_uioinfolist:9,uioselector_get_uiolist:9,uioselector_getchildlist_uiolist:9,uioselector_highlight:9,uioselector_safeotherget_process:9,uioselector_searchchildbymouse_uio:9,uioselector_searchchildbymouse_uiotree:9,uioselector_searchprocessnormalize_uioselector:9,uioselector_searchuionormalize_uioselector:9,uioselector_tryrestore_dict:9,uioselector_uio_get:9,uioselectorclick:10,uioselectordetect:10,uioselectorfirst:10,uioselectorhighlight:10,uioselectorlist:10,uioselectorsecs_waitappear_bool:9,uioselectorsecs_waitdisappear_bool:9,uioselectorssecs_waitappear_list:9,uioselectorssecs_waitdisappear_list:9,uioselectoruioactivity_run_dict:9,uioselectorwaitappear:10,uioselectorwaitdisappear:10,uiotextget:10,uioxy_searchchild_listdict:9,uiweb:[8,15,19],uncheck:9,unicode:11,unicodelabs:19,updated:5,updates:5,upper:5,url:[4,5,10],urlindexstr:5,urllist:5,urls:5,usage:4,use:[5,7,18],use_log:9,usecachebool:4,user32:8,user:[4,5,7],user_99:4,user_pass_here:4,useradstr:5,username:4,usernameupperstr:4,userupperstr:5,utf:[2,4],utils:[0,5,9,11,19],v228:1,v8toplevelframesdi:8,v8toplevelframetaxistarter:[8,9],value:5,valueerror:[13,14],variable:4,verification:1,verify:9,verify_actible:9,verify_enabled:9,verify_visible:9,version:4,versionstr:5,viewer:[5,7],virtual:5,visible:9,visible_only:9,vista:19,vk_packet:9,vms:4,voice:19,wait:[2,9,11,18],wait_not:9,want:[5,7],warning:5,warningexecutionmorethansecfloat:5,was:[2,5],was_maximized:9,way:6,web:[4,5,9,10,19],webaudit:4,webauditmessagecreate:4,webcpupdate:4,webdriver:10,webelement:10,weblistencreate:4,webrequestget:4,webrequestparsebodybytes:4,webrequestparsebodyjson:4,webrequestparsebodystr:4,webrequestparsefile:4,webrequestparsepath:4,webrequestresponsesend:4,weburlconnectdef:4,weburlconnectfile:4,weburlconnectfolder:4,weburlindexchange:4,webuserinfoget:4,webuserissupertoken:4,webuseruachierarchyget:4,wednesday:4,weekday:5,weekdaylist:5,wexe:4,whatsapp:1,wheel_dist:9,wheel_mouse_input:9,when:[4,5],which:5,who:5,width:[4,5,9,14],wiki:8,will:[2,4,5],win32:[8,9,19],win32api:1,win32defines:9,win32structures:9,win:8,windll:8,window:[2,5],window_text:9,windowclasses:9,windows:[2,4,9,10,11,12,13,14,16,19],windowsforms:9,winpython:1,with_newlines:9,with_spaces:9,with_tabs:9,without:[4,5],wm_close:18,wmi:1,working:[4,18],workingdirectorypathstr:5,works:5,world:[10,11,12],wpy32:[0,9,15],wpy64:[0,4,9],write:[8,11],www:1,x11:[0,11],x32:[0,9],x64:[0,9],xclip:[0,12],xkb:[0,11],xlsx:5,xpath:10,yellow:10,you:[2,4,5,6,7,18],your:[5,15]},titles:["1. \u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a (Windows & Linux)","2. \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f & \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Agent","1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438","3. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 GSettings (\u0448\u0430\u0431\u043b\u043e\u043d)","4. \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?","5. \u041f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 UAC","1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 UIDesktop","3. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 UIWeb","4. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Keyboard","5. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Clipboard","6. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Mouse","7. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Screen","8. \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?","1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","2. \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 StopSafe","\u041f\u043e\u0440\u0442\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 pyOpenRPA"],titleterms:{"\u0430\u0432\u0442\u043e\u0440":1,"\u0430\u0433\u0435\u043d\u0442":19,"\u0430\u043a\u0442\u0438\u0432\u043d":4,"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440":3,"\u0431\u0443\u0434\u0435\u0442":17,"\u0431\u0443\u0434\u0443\u0442":17,"\u0431\u044b\u0441\u0442\u0440":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],"\u0432":[11,17],"\u0433\u0435\u043d\u0435\u0440\u0430\u043b\u044c\u043d":1,"\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d":3,"\u0434\u0435\u0439\u0441\u0442\u0432":17,"\u0434\u0435\u0440\u0435\u0432":17,"\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440":1,"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446":19,"\u0434\u043e\u043f":11,"\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d":11,"\u0434\u043e\u0440\u043e\u0433":19,"\u0434\u043e\u0441\u0442\u0443\u043f":7,"\u0435\u0434\u0438\u043d":3,"\u0437\u0430\u0436\u0430":17,"\u0437\u0430\u043f\u0443\u0441\u043a":0,"\u0437\u0430\u043f\u0443\u0441\u0442":[6,15,17],"\u0438":[17,19],"\u0438\u0432\u0430":1,"\u0438\u0437":[15,19],"\u0438\u0437\u0432\u043b\u0435\u0447":17,"\u0438\u043d\u0442\u0435\u0440\u0435\u0441":17,"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440":15,"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430":[6,15,17],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d":11,"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c":1,"\u0438\u0442\u043e\u0433":17,"\u043a\u0430\u043a":[6,15,17],"\u043a\u043b\u0430\u0432\u0438\u0448":[11,17],"\u043a\u043b\u0430\u0441\u0441":14,"\u043a\u043b\u0438\u0435\u043d\u0442":1,"\u043a\u043d\u043e\u043f\u043a":17,"\u043a\u043e\u0434":11,"\u043a\u043e\u043b\u043b\u0435\u0433":19,"\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442":1,"\u043a\u043e\u043d\u0442\u0430\u043a\u0442":1,"\u043a\u043e\u043d\u0446\u0435\u043f\u0446":3,"\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d":0,"\u043a\u043e\u0442\u043e\u0440":17,"\u043a\u0443\u0440\u0441\u043e\u0440":17,"\u043b\u0438\u0446\u0435\u043d\u0437":[1,19],"\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d":1,"\u043c\u0430\u0441\u043b":1,"\u043c\u043e\u0434\u0443\u043b":19,"\u043c\u044b\u0448":17,"\u043d\u0430":17,"\u043d\u0430\u0432\u0435\u0434\u0435\u043d":17,"\u043d\u0430\u0432\u0435\u0441\u0442":17,"\u043d\u0430\u0432\u0438\u0433\u0430\u0446":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19],"\u043d\u0430\u0436\u0430":17,"\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a":3,"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a":[5,6,11],"\u043e":19,"\u043e\u0431\u043b\u0430\u0441\u0442":14,"\u043e\u0431\u0449":[2,3,4,5,8,9,10,11,13,14,16,17,19],"\u043e\u0431\u044a\u0435\u043a\u0442":17,"\u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d":19,"\u043e\u043e":1,"\u043e\u043f":1,"\u043e\u043f\u0438\u0441\u0430\u043d":[2,3,7,8,9,10,11,12,13,14,16,17],"\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440":19,"\u043e\u0442\u043e\u0431\u0440\u0430\u0436":17,"\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440":6,"\u043f\u0435\u0440\u0432":0,"\u043f\u043e":17,"\u043f\u043e\u0434":15,"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a":1,"\u043f\u043e\u0438\u0441\u043a":17,"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b":7,"\u043f\u043e\u0440\u0442\u0430":19,"\u043f\u043e\u0440\u0442\u0430\u043b":19,"\u043f\u0440\u0430\u0432":7,"\u043f\u0440\u0430\u0432\u043e\u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b":1,"\u043f\u0440\u0438\u043c\u0435\u0440":[8,11],"\u043f\u0440\u043e\u0432\u0435\u0440":0,"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c":19,"\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442":0,"\u0440\u0430\u0437\u0434\u0435\u043b":19,"\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440":19,"\u0440\u043e\u0431\u043e\u0442":[15,19],"\u0440\u043f\u0430":1,"\u0441\u0432\u043e\u0439\u0441\u0442\u0432":17,"\u0441\u0435\u043a\u0443\u043d\u0434":17,"\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440":9,"\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d":14,"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442":17,"\u0441\u043a\u0440\u0438\u043f\u0442":15,"\u0441\u043b\u0435\u0434":19,"\u0441\u043b\u043e\u0432\u0430\u0440":3,"\u0441\u043e\u0441\u0442\u043e":19,"\u0441\u0442\u043e\u0440\u043e\u043d":1,"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440":[5,19],"\u0441\u0442\u0443\u0434":[17,19],"\u0442\u0430\u043a":4,"\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a":19,"\u0442\u043e\u0447\u043a":14,"\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d":19,"\u0443\u043a\u0430\u0437\u0430\u043d":14,"\u0444\u0430\u0439\u043b":15,"\u0444\u0443\u043d\u043a\u0446":[2,4,9,10,11,12,13,14,18],"\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d":11,"\u0446\u0435\u043d\u0442\u0440":1,"\u0447\u0438\u0441\u0442\u043e\u0442":1,"\u0447\u0442\u043e":[0,4],"\u0448\u0430\u0431\u043b\u043e\u043d":5,"for":7,activityitem:4,agent:2,and:17,are:17,box:14,choose:17,click:17,clipboard:12,cmd:15,ctrl:17,dict:7,execute:15,expand:17,gsettings:[3,5],inanchorrulestr:14,inpointrulestr:14,interested:17,keyboard:11,linux:[0,11],list:17,mouse:[13,17],object:17,orchestrator:7,point:14,property:17,pyopenrpa:[0,19],python:15,rights:7,screen:14,script:15,search:17,selected:17,stopsafe:18,the:17,tree:17,uac:7,uidesktop:9,uio:9,uiweb:10,viewer:17,web:7,wiki:19,windows:0,x32:15,x64:15,you:17}}) \ No newline at end of file +Search.setIndex({docnames:["01_HowToInstall","03_Copyrights_Contacts","Agent/02_Defs","Orchestrator/01_Orchestrator","Orchestrator/02_Defs","Orchestrator/03_gSettingsTemplate","Orchestrator/04_HowToUse","Orchestrator/05_UAC","Robot/01_Robot","Robot/02_uidesktop","Robot/03_uiweb","Robot/04_keyboard","Robot/05_clipboard","Robot/06_mouse","Robot/07_screen","Robot/08_audio","Robot/09_HowToUse","Studio/01_Studio","Studio/02_HowToUse","Tools/02_Defs","index"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["01_HowToInstall.rst","03_Copyrights_Contacts.rst","Agent\\02_Defs.rst","Orchestrator\\01_Orchestrator.rst","Orchestrator\\02_Defs.rst","Orchestrator\\03_gSettingsTemplate.rst","Orchestrator\\04_HowToUse.rst","Orchestrator\\05_UAC.rst","Robot\\01_Robot.rst","Robot\\02_uidesktop.rst","Robot\\03_uiweb.rst","Robot\\04_keyboard.rst","Robot\\05_clipboard.rst","Robot\\06_mouse.rst","Robot\\07_screen.rst","Robot\\08_audio.rst","Robot\\09_HowToUse.rst","Studio\\01_Studio.rst","Studio\\02_HowToUse.rst","Tools\\02_Defs.rst","index.rst"],objects:{"pyOpenRPA.Agent":{__Agent__:[2,0,0,"-"]},"pyOpenRPA.Agent.__Agent__":{OSCMD:[2,1,1,""],OSFileBinaryDataBase64StrAppend:[2,1,1,""],OSFileBinaryDataBase64StrCreate:[2,1,1,""],OSFileBinaryDataBase64StrReceive:[2,1,1,""],OSFileMTimeGet:[2,1,1,""],OSFileTextDataStrCreate:[2,1,1,""],OSFileTextDataStrReceive:[2,1,1,""],ProcessWOExeUpperUserListGet:[2,1,1,""]},"pyOpenRPA.Orchestrator":{__Orchestrator__:[4,0,0,"-"]},"pyOpenRPA.Orchestrator.__Orchestrator__":{ActivityItemCreate:[4,1,1,""],ActivityItemDefAliasCreate:[4,1,1,""],ActivityItemDefAliasModulesLoad:[4,1,1,""],ActivityItemDefAliasUpdate:[4,1,1,""],ActivityItemHelperDefAutofill:[4,1,1,""],ActivityItemHelperDefList:[4,1,1,""],AgentActivityItemAdd:[4,1,1,""],AgentActivityItemExists:[4,1,1,""],AgentActivityItemReturnExists:[4,1,1,""],AgentActivityItemReturnGet:[4,1,1,""],AgentOSCMD:[4,1,1,""],AgentOSFileBinaryDataBase64StrAppend:[4,1,1,""],AgentOSFileBinaryDataBase64StrCreate:[4,1,1,""],AgentOSFileBinaryDataBase64StrReceive:[4,1,1,""],AgentOSFileBinaryDataBytesCreate:[4,1,1,""],AgentOSFileBinaryDataReceive:[4,1,1,""],AgentOSFileSend:[4,1,1,""],AgentOSFileTextDataStrCreate:[4,1,1,""],AgentOSFileTextDataStrReceive:[4,1,1,""],AgentOSLogoff:[4,1,1,""],AgentProcessWOExeUpperUserListGet:[4,1,1,""],GSettingsGet:[4,1,1,""],GSettingsKeyListValueAppend:[4,1,1,""],GSettingsKeyListValueGet:[4,1,1,""],GSettingsKeyListValueOperatorPlus:[4,1,1,""],GSettingsKeyListValueSet:[4,1,1,""],OSCMD:[4,1,1,""],OSCredentialsVerify:[4,1,1,""],OSLogoff:[4,1,1,""],OSRemotePCRestart:[4,1,1,""],OSRestart:[4,1,1,""],Orchestrator:[4,1,1,""],OrchestratorInitWait:[4,1,1,""],OrchestratorIsAdmin:[4,1,1,""],OrchestratorIsInited:[4,1,1,""],OrchestratorLoggerGet:[4,1,1,""],OrchestratorPySearchInit:[4,1,1,""],OrchestratorRerunAsAdmin:[4,1,1,""],OrchestratorRestart:[4,1,1,""],OrchestratorScheduleGet:[4,1,1,""],OrchestratorSessionRestore:[4,1,1,""],OrchestratorSessionSave:[4,1,1,""],OrchestratorThreadStart:[4,1,1,""],ProcessDefIntervalCall:[4,1,1,""],ProcessIsStarted:[4,1,1,""],ProcessListGet:[4,1,1,""],ProcessStart:[4,1,1,""],ProcessStop:[4,1,1,""],ProcessorActivityItemAppend:[4,1,1,""],ProcessorActivityItemCreate:[4,1,1,""],ProcessorAliasDefCreate:[4,1,1,""],ProcessorAliasDefUpdate:[4,1,1,""],PythonStart:[4,1,1,""],RDPSessionCMDRun:[4,1,1,""],RDPSessionConnect:[4,1,1,""],RDPSessionDisconnect:[4,1,1,""],RDPSessionFileStoredRecieve:[4,1,1,""],RDPSessionFileStoredSend:[4,1,1,""],RDPSessionLogoff:[4,1,1,""],RDPSessionMonitorStop:[4,1,1,""],RDPSessionProcessStartIfNotRunning:[4,1,1,""],RDPSessionProcessStop:[4,1,1,""],RDPSessionReconnect:[4,1,1,""],RDPTemplateCreate:[4,1,1,""],SchedulerActivityTimeAddWeekly:[4,1,1,""],StorageRobotExists:[4,1,1,""],StorageRobotGet:[4,1,1,""],UACKeyListCheck:[4,1,1,""],UACSuperTokenUpdate:[4,1,1,""],UACUpdate:[4,1,1,""],UACUserDictGet:[4,1,1,""],WebAuditMessageCreate:[4,1,1,""],WebCPUpdate:[4,1,1,""],WebListenCreate:[4,1,1,""],WebRequestGet:[4,1,1,""],WebRequestHostGet:[4,1,1,""],WebRequestParseBodyBytes:[4,1,1,""],WebRequestParseBodyJSON:[4,1,1,""],WebRequestParseBodyStr:[4,1,1,""],WebRequestParseFile:[4,1,1,""],WebRequestParsePath:[4,1,1,""],WebRequestResponseSend:[4,1,1,""],WebURLConnectDef:[4,1,1,""],WebURLConnectFile:[4,1,1,""],WebURLConnectFolder:[4,1,1,""],WebURLIndexChange:[4,1,1,""],WebUserDomainGet:[4,1,1,""],WebUserInfoGet:[4,1,1,""],WebUserIsSuperToken:[4,1,1,""],WebUserLoginGet:[4,1,1,""],WebUserUACCheck:[4,1,1,""],WebUserUACHierarchyGet:[4,1,1,""]},"pyOpenRPA.Robot":{Audio:[15,0,0,"-"],Clipboard:[12,0,0,"-"],Keyboard:[11,0,0,"-"],Mouse:[13,0,0,"-"],Screen:[14,0,0,"-"],UIDesktop:[9,0,0,"-"],UIWeb:[10,0,0,"-"]},"pyOpenRPA.Robot.Audio":{DeviceListGet:[15,1,1,""],DeviceMicrophoneIndex:[15,1,1,""],DeviceSystemSoundIndex:[15,1,1,""],Recorder:[15,2,1,""]},"pyOpenRPA.Robot.Audio.Recorder":{CaptureChunk:[15,3,1,""],CaptureStart:[15,3,1,""],CaptureStop:[15,3,1,""],CaptureWait:[15,3,1,""],FileInfoGet:[15,3,1,""],FileLastGet:[15,3,1,""],FileListGet:[15,3,1,""],StatusGet:[15,3,1,""]},"pyOpenRPA.Robot.Clipboard":{Get:[12,1,1,""],Set:[12,1,1,""]},"pyOpenRPA.Robot.Keyboard":{"KEY_RUS_\u0416":[11,4,1,"pyOpenRPA.Robot.Keyboard.KEY_RUS_"],Down:[11,1,1,""],HotkeyCombination:[11,1,1,""],HotkeyCtrlA_CtrlC:[11,1,1,""],HotkeyCtrlV:[11,1,1,""],IsDown:[11,1,1,""],KEY_ENG_COLON:[11,4,1,""],KEY_HOT_COLON:[11,4,1,""],Send:[11,1,1,""],Up:[11,1,1,""],Wait:[11,1,1,""],Write:[11,1,1,""]},"pyOpenRPA.Robot.Mouse":{Click:[13,1,1,""],ClickDouble:[13,1,1,""],Down:[13,1,1,""],MoveTo:[13,1,1,""],ScrollHorizontal:[13,1,1,""],ScrollVertical:[13,1,1,""],Up:[13,1,1,""]},"pyOpenRPA.Robot.Screen":{BoxAnchorRuleCheck:[14,1,1,""],BoxCreate:[14,1,1,""],BoxDraw:[14,1,1,""],BoxGetPoint:[14,1,1,""],BoxModify:[14,1,1,""],BoxMoveTo:[14,1,1,""],BoxOverlay:[14,1,1,""],ImageClick:[14,1,1,""],ImageExists:[14,1,1,""],ImageLocateAll:[14,1,1,""],ImageWaitAppear:[14,1,1,""],ImageWaitDisappear:[14,1,1,""],PointClick:[14,1,1,""],PointClickDouble:[14,1,1,""],PointCreate:[14,1,1,""],PointDown:[14,1,1,""],PointModify:[14,1,1,""],PointMoveTo:[14,1,1,""],PointUp:[14,1,1,""]},"pyOpenRPA.Robot.UIDesktop":{BackendStr_GetTopLevelList_UIOInfo:[9,1,1,""],Get_OSBitnessInt:[9,1,1,""],PWASpecification_Get_PWAApplication:[9,1,1,""],PWASpecification_Get_UIO:[9,1,1,""],UIOEI_Convert_UIOInfo:[9,1,1,""],UIOSelectorSecs_WaitAppear_Bool:[9,1,1,""],UIOSelectorSecs_WaitDisappear_Bool:[9,1,1,""],UIOSelectorUIOActivity_Run_Dict:[9,1,1,""],UIOSelector_Exist_Bool:[9,1,1,""],UIOSelector_FocusHighlight:[9,1,1,""],UIOSelector_GetChildList_UIOList:[9,1,1,""],UIOSelector_Get_BitnessInt:[9,1,1,""],UIOSelector_Get_BitnessStr:[9,1,1,""],UIOSelector_Get_UIO:[9,1,1,""],UIOSelector_Get_UIOActivityList:[9,1,1,""],UIOSelector_Get_UIOInfo:[9,1,1,""],UIOSelector_Get_UIOInfoList:[9,1,1,""],UIOSelector_Get_UIOList:[9,1,1,""],UIOSelector_Highlight:[9,1,1,""],UIOSelector_SafeOtherGet_Process:[9,1,1,""],UIOSelector_SearchChildByMouse_UIO:[9,1,1,""],UIOSelector_SearchChildByMouse_UIOTree:[9,1,1,""],UIOSelector_SearchProcessNormalize_UIOSelector:[9,1,1,""],UIOSelector_SearchUIONormalize_UIOSelector:[9,1,1,""],UIOSelector_TryRestore_Dict:[9,1,1,""],UIOSelectorsSecs_WaitAppear_List:[9,1,1,""],UIOSelectorsSecs_WaitDisappear_List:[9,1,1,""],UIOXY_SearchChild_ListDict:[9,1,1,""],UIO_FocusHighlight:[9,1,1,""],UIO_GetCtrlIndex_Int:[9,1,1,""],UIO_Highlight:[9,1,1,""]},"pyOpenRPA.Robot.UIWeb":{BrowserChange:[10,1,1,""],BrowserChromeStart:[10,1,1,""],BrowserClose:[10,1,1,""],PageJSExecute:[10,1,1,""],PageOpen:[10,1,1,""],PageScrollTo:[10,1,1,""],UIOAttributeGet:[10,1,1,""],UIOAttributeRemove:[10,1,1,""],UIOAttributeSet:[10,1,1,""],UIOAttributeStyleGet:[10,1,1,""],UIOAttributeStyleRemove:[10,1,1,""],UIOAttributeStyleSet:[10,1,1,""],UIOClick:[10,1,1,""],UIOMouseSearchInit:[10,1,1,""],UIOMouseSearchReturn:[10,1,1,""],UIOSelectorClick:[10,1,1,""],UIOSelectorDetect:[10,1,1,""],UIOSelectorFirst:[10,1,1,""],UIOSelectorHighlight:[10,1,1,""],UIOSelectorList:[10,1,1,""],UIOSelectorWaitAppear:[10,1,1,""],UIOSelectorWaitDisappear:[10,1,1,""],UIOTextGet:[10,1,1,""]},"pyOpenRPA.Tools":{Debugger:[19,0,0,"-"],StopSafe:[19,0,0,"-"]},"pyOpenRPA.Tools.Debugger":{LiveDebugCheckThread:[19,1,1,""]},"pyOpenRPA.Tools.StopSafe":{Init:[19,1,1,""],IsStopSafe:[19,1,1,""]}},objnames:{"0":["py","module","Python \u043c\u043e\u0434\u0443\u043b\u044c"],"1":["py","function","Python \u0444\u0443\u043d\u043a\u0446\u0438\u044f"],"2":["py","class","Python \u043a\u043b\u0430\u0441\u0441"],"3":["py","method","Python \u043c\u0435\u0442\u043e\u0434"],"4":["py","data","Python \u0434\u0430\u043d\u043d\u044b\u0435"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:data"},terms:{"000":20,"000036":8,"0643":6,"0_ready":15,"0x0c":11,"0x0d":11,"0x0e":11,"0x0f":11,"0x1":11,"0x10":11,"0x11":11,"0x11c":11,"0x11d":11,"0x12":11,"0x13":11,"0x137":11,"0x138":11,"0x14":11,"0x15":11,"0x15d":11,"0x16":11,"0x17":11,"0x18":11,"0x19":11,"0x1a":11,"0x1b":11,"0x1c":11,"0x1d":11,"0x1e":11,"0x1f":11,"0x2":11,"0x20":11,"0x21":11,"0x22":11,"0x23":11,"0x24":11,"0x25":11,"0x26":11,"0x27":11,"0x28":11,"0x29":11,"0x2a":11,"0x2b":11,"0x2c":11,"0x2d":11,"0x2e":11,"0x2f":11,"0x3":11,"0x30":11,"0x31":11,"0x32":11,"0x33":11,"0x34":11,"0x35":11,"0x36":11,"0x37":11,"0x38":11,"0x39":11,"0x3a":11,"0x3b":11,"0x3c":11,"0x3d":11,"0x3e":11,"0x3f":11,"0x4":11,"0x40":11,"0x41":11,"0x42":11,"0x43":11,"0x44":11,"0x45":11,"0x46":11,"0x47":11,"0x48":11,"0x49":11,"0x4a":11,"0x4b":11,"0x4c":11,"0x4d":11,"0x4e":11,"0x4f":11,"0x5":11,"0x50":11,"0x51":11,"0x52":11,"0x53":11,"0x57":11,"0x58":11,"0x5b":11,"0x5c":11,"0x6":11,"0x7":11,"0x7c":11,"0x7d":11,"0x7e":11,"0x7f":11,"0x8":11,"0x80":11,"0x81":11,"0x82":11,"0x83":11,"0x84":11,"0x85":11,"0x86":11,"0x87":11,"0x9":11,"0xa":11,"0xb":11,"100":[5,8,9,10,11,13,14],"1000":[4,14],"100px":13,"101":4,"1024":[0,4,6],"105":8,"1050":[4,5],"120":5,"1200":5,"121":4,"1227700251350":1,"123":4,"125310":1,"127":4,"130":8,"140124673757368":9,"141":1,"150":[8,13,14],"150px":13,"160":14,"1680":[4,5],"1680x1050":5,"197022":1,"1992":6,"1\u0433\u043e":14,"1_recording":15,"1yvqfic":10,"200":[9,13,14],"2008":20,"2012":20,"2016":20,"2019":20,"2019\u0433":1,"2021\u0433":1,"2022":20,"2022\u0433":1,"222":5,"230":8,"233":1,"265":14,"299":20,"2999226":20,"2python":16,"2y66pa":10,"300":[5,15],"3105":0,"32768":9,"3389":[4,5],"3600":5,"3720":[0,4,9,16],"3720python":16,"412":4,"44100":15,"443":4,"460":14,"50000000":5,"512":20,"600":5,"640x480":5,"722":1,"771801001":1,"77767775":4,"77777sdfsdf77777dsfdfsf77777777":4,"8081":5,"86400":9,"900":20,"906":1,"9718191421":1,"995":1,"\u0430":[1,4,11,16,20],"\u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d":[2,4,9,14],"\u0430\u0432\u0442\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446":4,"\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446":20,"\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430":20,"\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a":[0,4,9,18],"\u0430\u0432\u0442\u043e\u0440":20,"\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446":[4,6],"\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430":4,"\u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442":20,"\u0430\u0433\u0435\u043d\u0442":[2,4],"\u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d":3,"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440":4,"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0440\u0430\u0442\u043e\u0440":4,"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d":[3,20],"\u0430\u0434\u0440\u0435\u0441":[1,4,6,9,10,16,20],"\u0430\u0434\u0440\u0435\u0441\u0430\u0446":9,"\u0430\u0434\u0440\u0435\u0441\u0441\u0430\u0446":9,"\u0430\u043a\u0442\u0438\u0432\u0430\u0446":20,"\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430":18,"\u0430\u043a\u0442\u0438\u0432\u043d":[3,9,10,11,18,20],"\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d":4,"\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c":20,"\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d":4,"\u0430\u043d\u0430\u043b\u0438\u0437":4,"\u0430\u043d\u0430\u043b\u043e\u0433":20,"\u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d":[13,14],"\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a":11,"\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442":[4,9,10,13,15],"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440":[4,20],"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d":3,"\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d":[3,4,15],"\u0430\u0441\u0444\u0440":8,"\u0430\u0442\u0440\u0438\u0431\u0443\u0442":[9,10,20],"\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d":9,"\u0430\u0443\u0434":[4,8,15],"\u0430\u0443\u0434\u0438\u043e\u0434\u0440\u0430\u0439\u0432\u0435\u0440":15,"\u0430\u0443\u0434\u0438\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446":15,"\u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b":15,"\u0430\u0443\u0434\u0438\u0442":[4,20],"\u0431\u0430\u0437":9,"\u0431\u0430\u0437\u043e\u0432":[4,9,11,13,14],"\u0431\u0430\u0439\u0442":[2,4],"\u0431\u0434":20,"\u0431\u0435\u0437":[0,2,4,15,16,20],"\u0431\u0435\u0437\u043e\u043f\u0430\u0441":2,"\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d":[2,3,4,7,20],"\u0431\u0435\u0441\u043f\u0435\u0440\u0435\u0431\u043e\u0439\u043d":3,"\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d":[1,20],"\u0431\u0435\u0441\u0441\u0440\u043e\u0447\u043d":20,"\u0431\u0435\u0441\u0448\u043e\u0432\u043d":3,"\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a":[8,9,11,16,20],"\u0431\u0438\u0437\u043d\u0435\u0441":[3,4,8,14,15,17,20],"\u0431\u0438\u043d\u0430\u0440\u043d":[2,4],"\u0431\u0438\u0442":9,"\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440":2,"\u0431\u043b\u043e\u043a":4,"\u0431\u043b\u043e\u043a\u0438\u0440":[10,11,20],"\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a":1,"\u0431\u043b\u043e\u043a\u043d\u043e\u0442":4,"\u0431\u043e\u043b":[4,6,9,20],"\u0431\u043e\u043b\u044c\u0448":[9,20],"\u0431\u043e\u0442":[4,20],"\u0431\u0440\u0430\u0443\u0437\u0435\u0440":[6,8,10,17,18,20],"\u0431\u0443\u0434\u0435\u0442":[0,3,4,8,9,10,11,14,15,16,17,20],"\u0431\u0443\u0434\u0443\u0442":[4,7,15,16],"\u0431\u0443\u043a\u0432":[8,11],"\u0431\u0443\u043b\u0435\u0432":[9,14],"\u0431\u0443\u0444\u0435\u0440":[0,4,8,11,12,16,20],"\u0431\u044b":[9,14],"\u0431\u044b\u043b":[0,3,4,9,11],"\u0431\u044b\u0442":[3,4,7,9,10,15,20],"\u0432":[0,1,2,3,4,6,7,8,9,10,12,13,14,15,16,17,20],"\u0432\u0430\u043c":[1,3,4],"\u0432\u0430\u0440\u0438\u0430\u043d\u0442":[0,4,9,10,13,14,20],"\u0432\u0430\u0441":[1,3,7,8,11,14,15,17,18,20],"\u0432\u0430\u0448":[3,8,14,15,17],"\u0432\u0432\u0435\u0434":9,"\u0432\u0432\u0435\u0440\u0445":[13,14],"\u0432\u0432\u0435\u0441\u0442":11,"\u0432\u0432\u043e\u0434":[9,11],"\u0432\u0435":4,"\u0432\u0435\u0431":[3,4,8,9,10,16,17,20],"\u0432\u0435\u0434\u0435\u0442":9,"\u0432\u0435\u043b\u0438\u0447\u0438\u043d":10,"\u0432\u0435\u043d\u0434\u043e\u0440":20,"\u0432\u0435\u0440":13,"\u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446":4,"\u0432\u0435\u0440\u043d":4,"\u0432\u0435\u0440\u043d\u0435\u0442":[2,4,11,15],"\u0432\u0435\u0440\u043d\u0443\u0442":[2,4,9,14,15],"\u0432\u0435\u0440\u0441":[3,4,18,20],"\u0432\u0435\u0440\u0442\u0438\u043a\u0430":[10,14],"\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b":14,"\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d":[10,13,14],"\u0432\u0435\u0440\u0445\u043d":[2,4,9,13,14],"\u0432\u0435\u0447\u043d":4,"\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432":[0,4,8,9,10,11,12,13,14,16,17],"\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430":9,"\u0432\u0437\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432":9,"\u0432\u0437\u044f\u0442":[4,15],"\u0432\u0438\u0434":[4,9,15],"\u0432\u0438\u0434\u0438\u043c":9,"\u0432\u0438\u0434\u043d":9,"\u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d":[9,20],"\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d":[3,8,13,14,15,17],"\u0432\u043a\u043b\u0430\u0434\u043a":9,"\u0432\u043a\u043b\u044e\u0447":[9,20],"\u0432\u043a\u043b\u044e\u0447\u0435\u043d":9,"\u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],"\u0432\u043b\u0435\u0432":[9,13,14],"\u0432\u043b\u043e\u0436\u0435\u043d":[4,9],"\u0432\u043c\u0435\u0441\u0442":10,"\u0432\u043d\u0435":[4,15],"\u0432\u043d\u0435\u0434\u0440\u0435\u043d":3,"\u0432\u043d\u0435\u0441\u0442":7,"\u0432\u043d\u0438\u0437":[13,14],"\u0432\u043d\u0438\u043c\u0430\u043d":[1,4,9,10,11,12,13,14,15,17,18,20],"\u0432\u043d\u043e\u0441":3,"\u0432\u043d\u0443\u0442\u0440":[4,9,16],"\u0432\u043e":[4,9],"\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430":[2,4,9,10],"\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d":20,"\u0432\u043e\u0437\u043c\u043e\u0436\u043d":[3,8,9,13,14,15,17,20],"\u0432\u043e\u0437\u043d\u0438\u043a\u0430":20,"\u0432\u043e\u0437\u043d\u0438\u043a\u043b":0,"\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442":[4,9],"\u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442":20,"\u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430":11,"\u0432\u043e\u043a\u0440\u0443\u0433":9,"\u0432\u043e\u043f\u0440\u043e\u0441":[1,3,7,8,14,15,17,20],"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d":4,"\u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430":3,"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430":4,"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432":[4,9,11],"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b":11,"\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d":[4,9],"\u0432\u043f\u043b\u043e\u0442":20,"\u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432":11,"\u0432\u043f\u0440\u0430\u0432":[9,13,14],"\u0432\u0440\u0435\u043c":[3,4,8,9,10,11,13,14],"\u0432\u0440\u0435\u043c\u0435\u043d":[2,4,11],"\u0432\u0441\u0435":[0,3,4,7,9,11,16,18,20],"\u0432\u0441\u0435\u0433":[3,8,14,15,17,20],"\u0432\u0441\u0435\u0433\u0434":[3,4,7,8,9,14,15,17,20],"\u0432\u0441\u0435\u043c":[1,4,9,14,20],"\u0432\u0441\u0435\u0445":[2,4,9,10,14,15,20],"\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d":[4,11,20],"\u0432\u0441\u0442\u0430\u0432\u043a":11,"\u0432\u0441\u0442\u0440\u043e\u0435\u043d":10,"\u0432\u0441\u044e":[0,4,8,17,20],"\u0432\u0441\u044f":[11,16],"\u0432\u0445\u043e\u0434":[0,4,16],"\u0432\u0445\u043e\u0434\u044f":[4,9,15],"\u0432\u0445\u043e\u0436\u0434\u0435\u043d":14,"\u0432\u044b":[1,3,4,6,7,8,9,10,11,14,15,16,17,18,20],"\u0432\u044b\u0431\u043e\u0440":9,"\u0432\u044b\u0431\u0440\u0430":[3,4,6,9,11,14,16,18,20],"\u0432\u044b\u0432\u0435\u0434":11,"\u0432\u044b\u0432\u043e\u0434":4,"\u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442":9,"\u0432\u044b\u0433\u043e\u0434\u043d":[3,8,14,15,17,20],"\u0432\u044b\u0434\u0435\u043b":[4,11,18],"\u0432\u044b\u0434\u0435\u043b\u0435\u043d":[9,11,18],"\u0432\u044b\u0434\u0435\u043b\u044f":9,"\u0432\u044b\u0437":[4,9],"\u0432\u044b\u0437\u0432\u0430":[4,9,10],"\u0432\u044b\u0437\u043e\u0432":[4,9,11,13,14],"\u0432\u044b\u0437\u044b\u0432\u0430":[4,9],"\u0432\u044b\u043a\u043b\u044e\u0447":4,"\u0432\u044b\u043f\u0430\u0434\u0430":9,"\u0432\u044b\u043f\u043e\u043b\u043d":[0,4,6,9,10,11,13,14,15,16,18],"\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d":[4,9,10,11,13,14,15,20],"\u0432\u044b\u043f\u043e\u043b\u043d\u044f":[4,9,10,11,16,20],"\u0432\u044b\u043f\u0443\u0441\u043a":[13,14,20],"\u0432\u044b\u043f\u0443\u0441\u043a\u0430":20,"\u0432\u044b\u043f\u0443\u0449":[11,20],"\u0432\u044b\u0440\u0430\u0436":20,"\u0432\u044b\u0440\u0430\u0436\u0435\u043d":9,"\u0432\u044b\u0441\u043e\u0442":[4,14],"\u0432\u044b\u0445\u043e\u0434\u043d":4,"\u0432\u044b\u0448":[4,14],"\u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d":20,"\u0433":1,"\u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430":11,"\u0433\u0431":[4,20],"\u0433\u0433\u0446":20,"\u0433\u0434\u0435":[3,4,10,14,16],"\u0433\u0435\u043d\u0435\u0440\u0430\u043b\u044c\u043d":20,"\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440":4,"\u0433\u0435\u043d\u0435\u0440\u0430\u0446":[4,20],"\u0433\u0438\u0431\u043a":[3,7],"\u0433\u0438\u0443\u0434":4,"\u0433\u043b\u0430\u0432\u043d":[0,4,9,11],"\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d":[2,4,5,20],"\u0433\u043b\u0443\u0431\u0438\u043d":[4,9],"\u0433\u043e":[9,14,20],"\u0433\u043e\u0432\u043e\u0440":9,"\u0433\u043e\u0434":20,"\u0433\u043e\u043b\u043e\u0441\u043e\u0432":20,"\u0433\u043e\u0440":13,"\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430":[10,14],"\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b":14,"\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d":[10,13,14],"\u0433\u043e\u0440\u044f\u0447":11,"\u0433\u043e\u0442\u043e\u0432":[0,9,16],"\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a":[2,3,4,8,14,16,20],"\u0433\u0440\u0443\u043f\u043f":[4,7,9],"\u0433\u0443\u0438\u0434":4,"\u0434":[10,15],"\u0434\u0430":20,"\u0434\u0430\u0435\u0442":[3,8,14,15,17],"\u0434\u0430\u0436":[11,20],"\u0434\u0430\u043b":[4,6],"\u0434\u0430\u043b\u044c\u043d":[4,9,15],"\u0434\u0430\u043d":[3,4,8,9,10,11,13,14,16,20],"\u0434\u0430\u0442":[2,7],"\u0434\u0432\u0430\u0436\u0434":9,"\u0434\u0432\u043e\u0439\u043d":[9,13,14],"\u0434\u0435\u0439\u0441\u0442\u0432":[0,1,9,11,13,14,20],"\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430":4,"\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d":2,"\u0434\u0435\u043b\u0430":[3,8,9,14,15,17,20],"\u0434\u0435\u043c":6,"\u0434\u0435\u043d":4,"\u0434\u0435\u0440\u0435\u0432":[9,20],"\u0434\u0435\u0444\u0435\u043a\u0442":20,"\u0434\u0438\u0430\u043b\u0435\u043a\u0442":9,"\u0434\u0438\u0430\u043b\u043e\u0433":9,"\u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432":9,"\u0434\u0438\u043d\u0430\u043c\u0438\u043a":[8,15],"\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440":[4,15,16,20],"\u0434\u0438\u0441\u043a":4,"\u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440":[4,9,16],"\u0434\u043b\u0438\u043d":[14,15],"\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d":[0,10,15],"\u0434\u043b\u044f":[0,1,2,3,4,6,8,9,10,11,12,14,15,16,17,20],"\u0434\u043c\u0438\u0442\u0440\u0438\u0435\u0432\u0438\u0447":1,"\u0434\u043d\u0435":4,"\u0434\u043e":[4,9,10,13,14,20],"\u0434\u043e\u0431\u0430\u0432":[4,6],"\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d":4,"\u0434\u043e\u0431\u0430\u0432\u043b\u044f":4,"\u0434\u043e\u0431\u0440":20,"\u0434\u043e\u0432\u043e\u043b\u044c\u043d":9,"\u0434\u043e\u0436\u0434":18,"\u0434\u043e\u0436\u0434\u0430":[4,9,10],"\u0434\u043e\u0436\u0438\u0434":4,"\u0434\u043e\u0436\u0438\u0434\u0430":4,"\u0434\u043e\u043b\u0436":[4,9,14,15],"\u0434\u043e\u043b\u0436\u043d":[7,9,10,15],"\u0434\u043e\u043c":4,"\u0434\u043e\u043c\u0435\u043d":4,"\u0434\u043e\u043e\u0431\u043e\u0433\u0430\u0442":9,"\u0434\u043e\u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d":[4,9],"\u0434\u043e\u043f":[4,20],"\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d":9,"\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d":[4,9,15,20],"\u0434\u043e\u043f\u0443\u0441\u043a\u0430":[4,13,14],"\u0434\u043e\u043f\u0443\u0441\u0442":4,"\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c":[4,9,14],"\u0434\u043e\u0440\u043e\u0433":[3,8,14,15,17],"\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d":[6,16],"\u0434\u043e\u0441\u0442\u0443\u043f":[0,3,4,8,9,17,20],"\u0434\u043e\u0441\u0442\u0443\u043f\u043d":[2,3,4,9,11,20],"\u0434\u043e\u0447\u0435\u0440\u043d":9,"\u0434\u0440\u043e\u0431\u043d":14,"\u0434\u0440\u0443\u0433":[4,7,8,9,10,11,14,16,18,20],"\u0435":[10,11,13,14],"\u0435\u0433":[4,8,9,10,11,20],"\u0435\u0434\u0438\u043d":[5,14,20],"\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d":[4,14],"\u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d":20,"\u0435\u0441\u043b":[0,2,3,4,6,7,8,9,10,11,13,14,15,17,20],"\u0435\u0441\u0442":9,"\u0435\u0449":4,"\u0436\u0434\u0430\u0442":[4,11],"\u0436\u0435":[0,3,4],"\u0436\u0438\u0437\u043d":3,"\u0437\u0430":[4,11,13,14,16],"\u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430":20,"\u0437\u0430\u0432\u0435\u0440\u0448":[0,4],"\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d":[9,15,16],"\u0437\u0430\u0432\u0438\u0441":11,"\u0437\u0430\u0432\u0438\u0441\u0438\u043c":[15,16,20],"\u0437\u0430\u0433\u0440\u0443\u0437":4,"\u0437\u0430\u0433\u0440\u0443\u0437\u043a":10,"\u0437\u0430\u0434\u0430":[9,10,14],"\u0437\u0430\u0434\u0430\u0447":[4,9,16,20],"\u0437\u0430\u0436\u0438\u043c":9,"\u0437\u0430\u0439\u043c\u0435\u0442":0,"\u0437\u0430\u043a\u0430\u0437":8,"\u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430":10,"\u0437\u0430\u043a\u043b\u044e\u0447\u0430":7,"\u0437\u0430\u043a\u043e\u043d":1,"\u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432":[1,20],"\u0437\u0430\u043a\u043e\u043d\u0447":4,"\u0437\u0430\u043a\u0440":10,"\u0437\u0430\u043a\u0440\u044b\u0432\u0430":16,"\u0437\u0430\u043a\u0440\u044b\u0442":[4,20],"\u0437\u0430\u043b\u0438\u0432\u043a":9,"\u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430":4,"\u0437\u0430\u043d":4,"\u0437\u0430\u043f":[4,15,20],"\u0437\u0430\u043f\u0430\u0434\u043d":20,"\u0437\u0430\u043f\u0438\u0441":[2,3,4,15],"\u0437\u0430\u043f\u0438\u0441\u0430":15,"\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430":15,"\u0437\u0430\u043f\u043e\u043b\u043d":9,"\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d":4,"\u0437\u0430\u043f\u043e\u043b\u043d\u044f":4,"\u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430":[2,9],"\u0437\u0430\u043f\u0440\u043e\u0441":[4,20],"\u0437\u0430\u043f\u0443\u0441\u043a":[3,4,6,8,9,10,20],"\u0437\u0430\u043f\u0443\u0441\u043a\u0430":[2,4,9,15,20],"\u0437\u0430\u043f\u0443\u0441\u0442":[0,4,20],"\u0437\u0430\u043f\u0443\u0449":[0,4,9],"\u0437\u0430\u043f\u0443\u0449\u0435\u043d":[2,4,17],"\u0437\u0430\u0442":[9,13,14],"\u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430":[4,15],"\u0437\u0430\u0445\u0432\u0430\u0442":15,"\u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430":4,"\u0437\u0430\u0449\u0438\u0449\u0435\u043d":4,"\u0437\u0432\u0435\u043d":[3,16],"\u0437\u0432\u0443\u043a":15,"\u0437\u0432\u0443\u043a\u043e\u0432":8,"\u0437\u0434\u0435":[0,2,3,9,10,11],"\u0437\u0435\u043b\u0435\u043d":[9,10],"\u0437\u043d\u0430":[3,8,14,15,17],"\u0437\u043d\u0430\u043a":11,"\u0437\u043d\u0430\u0447\u0435\u043d":[4,9,10,11,12,13,14],"\u0437\u0440\u0435\u043d":20,"\u0438":[1,2,3,4,6,7,8,9,10,11,12,13,14,15,16,17],"\u0438\u0432\u0430":20,"\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440":[4,9],"\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446":[4,14,15],"\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430":10,"\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d":[9,14],"\u0438\u0434\u0435\u0442":[4,20],"\u0438\u0435\u0440\u0430\u0440\u0445":[9,18],"\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u043d":3,"\u0438\u0437":[3,4,8,9,10,11,12,14,15,18],"\u0438\u0437\u0432\u043b\u0435\u043a":8,"\u0438\u0437\u0432\u043b\u0435\u0447":[4,20],"\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d":[0,9],"\u0438\u0437\u043c\u0435\u043d":[4,14,16],"\u0438\u0437\u043c\u0435\u043d\u0435\u043d":[0,3,4,9,14,20],"\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d":[14,20],"\u0438\u043b":[4,9,10,13,14,15,16],"\u0438\u043c":[3,4,8,9,14,15,17,20],"\u0438\u043c\u0435\u0435\u0442":[4,9,14,16],"\u0438\u043c\u0435\u043d":[4,9],"\u0438\u043c\u0435\u043d\u043e\u0432\u0430":[4,9],"\u0438\u043c\u0435\u0442":12,"\u0438\u043c\u0435\u044e\u0442":9,"\u0438\u043c\u0435\u044e\u0449":9,"\u0438\u043c\u0438\u0442\u0430\u0446":11,"\u0438\u043c\u043f\u043e\u0440\u0442":[4,16],"\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430":4,"\u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c":4,"\u0438\u043d":1,"\u0438\u043d\u0430\u0447":4,"\u0438\u043d\u0434\u0435\u043a\u0441":[9,14],"\u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d":[4,20],"\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446":[4,9,16],"\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440":10,"\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430":[4,9],"\u0438\u043d\u0438\u0446\u0438\u0430\u0442":20,"\u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440":4,"\u0438\u043d\u0438\u0446\u0438\u0430\u0446":4,"\u0438\u043d\u0438\u0446\u0438\u0438\u0440":[13,14],"\u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430":[4,9,15],"\u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430":16,"\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446":[0,20],"\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442":[1,4,8,11,16,20],"\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440":7,"\u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430":[8,16,20],"\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442":20,"\u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d":[3,20],"\u0438\u043d\u0442\u0435\u0440\u0432\u0430":[4,10,11,13,14],"\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b":10,"\u0438\u043d\u0442\u0435\u0440\u0435\u0441":4,"\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d":0,"\u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442":0,"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440":[0,9],"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446":14,"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430":4,"\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441":[9,10,16,17,18],"\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446":[3,4,9,11,15,16,20],"\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440":16,"\u0438\u043f":[1,20],"\u0438\u0441\u043a\u0430":[4,14],"\u0438\u0441\u043a\u0430\u0436\u0435\u043d":14,"\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d":[9,10,13,14],"\u0438\u0441\u043a\u043e\u043c":[9,14],"\u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d":[11,20],"\u0438\u0441\u043f\u043e\u043b\u0435\u043d":4,"\u0438\u0441\u043f\u043e\u043b\u043d":8,"\u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d":[3,4],"\u0438\u0441\u043f\u043e\u043b\u043d\u044f":[4,9],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437":[1,2,3,4,6,7,9,11,20],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430":[4,9,10,11,17,20],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d":[1,2,3,4,7,8,9,12,14,20],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443":[1,3,20],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c":[4,20],"\u0438\u0441\u043f\u043e\u0440\u0447":4,"\u0438\u0441\u043f\u044b\u0442\u0430":0,"\u0438\u0441\u0442\u0435\u043a\u0430":4,"\u0438\u0441\u0442\u043e\u0440":[4,10],"\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a":20,"\u0438\u0441\u0445\u043e\u0434\u043d":[2,4,9,10,11,12,13,14,15,19,20],"\u0438\u0441\u0445\u043e\u0434\u044f":[9,15],"\u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d":[9,10,14],"\u0438\u0441\u0447\u0435\u0437\u043d\u0443\u0442":9,"\u0438\u0442":[4,20],"\u0438\u0442\u0435\u0440\u0430\u0446":4,"\u0438\u0445":[4,11],"\u0438\u044e\u043b":20,"\u0439":9,"\u043a":[1,2,3,4,8,9,10,14,15,16,20],"\u043a\u0430\u0436\u0434":[2,4,9,10,11,12,13,14,15,16,20],"\u043a\u0430\u043a":[1,3,4,9,11,13,17,20],"\u043a\u0430\u043d\u0430":1,"\u043a\u0430\u043d\u0430\u043b":[8,20],"\u043a\u0430\u0440\u0442":4,"\u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446":3,"\u043a\u0430\u0447\u0435\u0441\u0442\u0432":[3,8,9,14,15,16,17,20],"\u043a\u0438\u0448\u043a":9,"\u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440":[0,4,8,9,11,16,20],"\u043a\u043b\u0430\u0432\u0438\u0448":[9,13,14,20],"\u043a\u043b\u0430\u0432\u0438\u0448\u043d":11,"\u043a\u043b\u0430\u0441\u0441":[9,20],"\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a":20,"\u043a\u043b\u0438\u0435\u043d\u0442":[0,3,4,7,8,14,15,17,20],"\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a":4,"\u043a\u043b\u0438\u043a":[9,13,14],"\u043a\u043b\u044e\u0447":[4,7,9,11,20],"\u043a\u043b\u044e\u0447\u0435\u0432":[10,16],"\u043a\u043d\u043e\u043f\u043a":[0,9,13,14],"\u043a\u043e":4,"\u043a\u043e\u0433\u0434":[9,18,20],"\u043a\u043e\u0434":[2,4,6,9,10,12,13,14,15,16,19,20],"\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a":[2,4],"\u043a\u043e\u0434\u043e\u0432":4,"\u043a\u043e\u043b\u0435\u0441":[9,13],"\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432":[4,9,11,13,14],"\u043a\u043e\u043b\u043b\u0435\u0433":[3,8,14,15,17],"\u043a\u043e\u043c\u0430\u043d\u0434":[0,4,11,13,14,15,16,20],"\u043a\u043e\u043c\u0430\u043d\u0434\u043d":[4,16],"\u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446":[4,11,14],"\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a":20,"\u043a\u043e\u043c\u043f\u0430\u043d":[4,7,20],"\u043a\u043e\u043c\u043f\u0438\u0440\u043e\u0432\u0430\u043d":16,"\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442":[0,2,10,11,14,15,17,18,20],"\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440":[4,9],"\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d":20,"\u043a\u043e\u043d\u0435\u0446":4,"\u043a\u043e\u043d\u0435\u0447\u043d":9,"\u043a\u043e\u043d\u0441\u043e\u043b":[8,16,18],"\u043a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430":[3,20],"\u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d":16,"\u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442":9,"\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446":4,"\u043a\u043e\u043d\u0442\u0430\u043a\u0442":[0,3,4,7,8,14,15,17,20],"\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440":4,"\u043a\u043e\u043d\u0442\u0435\u043d\u0442":15,"\u043a\u043e\u043d\u0442\u0440\u043e\u043b":[3,4,7,20],"\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440":4,"\u043a\u043e\u043d\u0442\u0443\u0440":9,"\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446":17,"\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d":[3,4,20],"\u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d":4,"\u043a\u043e\u043d\u0446\u0435\u043f\u0446":[7,20],"\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442":[9,13,14],"\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446":[3,20],"\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440":3,"\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430":16,"\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d":4,"\u043a\u043e\u0440\u043d\u0435\u0432":9,"\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a":[3,7,14],"\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d":[11,15,20],"\u043a\u043e\u0440\u0442\u0435\u0436":4,"\u043a\u043e\u0442\u043e\u0440":[2,3,4,7,8,9,10,11,13,14,15,16,17,20],"\u043a\u043f\u043f":1,"\u043a\u0440\u0430":[13,14],"\u043a\u0440\u0430\u0441\u043d":9,"\u043a\u0440\u0438\u0442\u0435\u0440":9,"\u043a\u0440\u043e\u043c":18,"\u043a\u0440\u0443\u043f\u043d":[4,20],"\u043a\u0440\u0443\u0442":13,"\u043a\u0443\u0434":[0,4],"\u043a\u0443\u043a":10,"\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430":4,"\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d":4,"\u043b\u0430\u043d\u0434\u0448\u0430\u0444\u0442":20,"\u043b\u0435\u0432":[9,13,14],"\u043b\u0435\u0433\u043a":9,"\u043b\u0435\u0433\u043a\u043e\u0441\u0442":[8,16,20],"\u043b\u0438":[4,9,11,14],"\u043b\u0438\u0431":[1,4,9],"\u043b\u0438\u043d\u0443\u043a\u0441":4,"\u043b\u0438\u0446":[1,20],"\u043b\u0438\u0446\u0435\u043d\u0437":[0,3,4,7,8,14,15,17],"\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d":20,"\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d":20,"\u043b\u0438\u0448":7,"\u043b\u043e\u0433":[3,4,20],"\u043b\u043e\u0433\u0433\u0435\u0440":[4,5],"\u043b\u043e\u0433\u0433\u0438\u0440\u043e\u0432\u0430\u043d":4,"\u043b\u043e\u0433\u0438\u043d":[0,4],"\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d":[4,5],"\u043b\u043e\u043a\u0430\u043b\u044c\u043d":[4,8,9,20],"\u043b\u043e\u043a\u0430\u0446":4,"\u043b\u044c\u0432\u0430":1,"\u043b\u044e\u0431":[8,9,11,16,20],"\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d":[7,9,10,15,16,20],"\u043c\u0430\u043b":20,"\u043c\u0430\u0441\u043b":20,"\u043c\u0430\u0441\u0441":3,"\u043c\u0430\u0441\u0441\u0438\u0432":3,"\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a":14,"\u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b":20,"\u043c\u0430\u0448\u0438\u043d":[0,4,15,20],"\u043c\u0431":[0,4],"\u043c\u0435\u0436\u0434":[4,11,13,14,16],"\u043c\u0435\u043d":9,"\u043c\u0435\u043d\u044f":20,"\u043c\u0435\u0440":4,"\u043c\u0435\u0441\u0442":13,"\u043c\u0435\u0442\u043e\u0434":[4,9],"\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c":[4,7],"\u043c\u0438\u043a\u0440\u043e\u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442":20,"\u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d":[8,15],"\u043c\u0438\u043b":11,"\u043c\u0438\u043c":4,"\u043c\u0438\u043d\u0443\u0442":0,"\u043c\u0438\u0440":11,"\u043c\u043d\u043e\u0433":[9,11],"\u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d":4,"\u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432":3,"\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432":15,"\u043c\u043e":11,"\u043c\u043e\u0433\u0443\u0442":[4,9],"\u043c\u043e\u0434\u0435\u043b":[3,4,20],"\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443":11,"\u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440":11,"\u043c\u043e\u0434\u0443\u043b":[3,4,8,9,11,12,13,14,15,16,17],"\u043c\u043e\u0436\u0435\u0442":[1,3,4,6,7,8,9,11,13,14,15,16,17,20],"\u043c\u043e\u0436\u043d":[3,4,9,10,11,15,16,20],"\u043c\u043e\u043c\u0435\u043d\u0442":9,"\u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d":[13,14],"\u043c\u043e\u043d\u0438\u0442\u043e\u0440":4,"\u043c\u043e\u0441\u043a\u0432":1,"\u043c\u043e\u0449":0,"\u043c\u0443\u0440\u0430\u0432\u0441\u043a":1,"\u043c\u0443\u0441\u043e\u0440\u043d":3,"\u043c\u044b":[1,3,4,8,9,14,15,17,20],"\u043c\u044b\u0448":[8,9,10,13,14,16,20],"\u043c\u044f":16,"\u043c\u044f\u0433\u043a":4,"\u043d\u0430":[0,2,3,4,6,8,9,10,11,12,13,14,15,16,20],"\u043d\u0430\u0431\u043e\u0440":[4,20],"\u043d\u0430\u0432\u0435\u0434":18,"\u043d\u0430\u0432\u0435\u0434\u0435\u043d":[9,20],"\u043d\u0430\u0433\u0440\u0443\u0437\u043a":20,"\u043d\u0430\u0434":[9,10,18,20],"\u043d\u0430\u0434\u0435\u0436\u043d":[3,11],"\u043d\u0430\u0436\u0430":[11,13,14],"\u043d\u0430\u0436\u0430\u0442":[9,10,11,13,14,16],"\u043d\u0430\u0436\u0438\u043c\u0430":[9,11],"\u043d\u0430\u0436\u043c":9,"\u043d\u0430\u0437\u043d\u0430\u0447":4,"\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d":9,"\u043d\u0430\u0437\u044b\u0432\u0430":3,"\u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d":[4,9,10,15,16],"\u043d\u0430\u0439\u0434\u0435\u0442":[17,20],"\u043d\u0430\u0439\u0442":15,"\u043d\u0430\u043b\u0438\u0447":[0,4,14],"\u043d\u0430\u043b\u043e\u0436":14,"\u043d\u0430\u043b\u043e\u0436\u0435\u043d":14,"\u043d\u0430\u043c":20,"\u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430":11,"\u043d\u0430\u043f\u0438\u0441\u0430":1,"\u043d\u0430\u043f\u0440\u0430\u0432\u043b":3,"\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440":[0,4,7,9,15],"\u043d\u0430\u043f\u0440\u044f\u043c":3,"\u043d\u0430\u0440\u0438\u0441":9,"\u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430":8,"\u043d\u0430\u0440\u0443\u0448\u0435\u043d":[1,20],"\u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a":20,"\u043d\u0430\u0441\u0442\u043e\u044f":11,"\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430":15,"\u043d\u0430\u0441\u0442\u0440\u043e":4,"\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a":[0,2,4,5,20],"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a":[0,3,6,7,9,13,14,20],"\u043d\u0430\u0445\u043e\u0434":[9,10,13,14,16],"\u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d":13,"\u043d\u0430\u0446\u0435\u043b\u0435\u043d":20,"\u043d\u0430\u0447\u0430":[0,4,11,15,16],"\u043d\u0430\u0447\u0430\u043b":15,"\u043d\u0430\u0447\u0430\u043b\u044c\u043d":9,"\u043d\u0430\u0447\u0438\u043d":[3,4,8,14,15,17],"\u043d\u0430\u0447\u0438\u043d\u0430":[0,2,4,9,10,11,12,13,14,15],"\u043d\u0430\u0448":[8,9,20],"\u043d\u0434\u0441":20,"\u043d\u0435":[1,2,3,4,7,9,10,11,13,14,15,16,17,20],"\u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d":[4,20],"\u043d\u0435\u0433":15,"\u043d\u0435\u0434\u0435\u043b":4,"\u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c":9,"\u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d":9,"\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c":[9,11],"\u043d\u0435\u0437\u043d\u0430\u043d":1,"\u043d\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430":[4,9],"\u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a":[1,20],"\u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d":[4,11],"\u043d\u0435\u043a\u043e\u0442\u043e\u0440":9,"\u043d\u0435\u043c":[9,16,18],"\u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d":[9,13,14],"\u043d\u0435\u043e\u0431\u0445\u043e\u0434":[4,11,14,20],"\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c":[0,4,8,10,11,12,15,16,17,18,20],"\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d":[2,4,9,11,14],"\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d":9,"\u043d\u0435\u043f\u0440\u0430\u0432\u043e\u043c\u0435\u0440\u043d":[1,20],"\u043d\u0435\u043f\u0440\u043e\u0432\u0435\u0440":9,"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a":[4,9,11,14,20],"\u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432":14,"\u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d":4,"\u043d\u0435\u0441\u0442\u0438\u043b\u0435\u0432":10,"\u043d\u0435\u0442":[4,9],"\u043d\u0438":[4,9],"\u043d\u0438\u0433\u0434":4,"\u043d\u0438\u0436":[4,5,6,8,9,11,13,14,18,20],"\u043d\u0438\u0436\u043d":14,"\u043d\u0438\u043a\u043e\u0433\u0434":9,"\u043d\u0438\u0445":4,"\u043d\u0438\u0447":[7,11],"\u043d\u043e":[7,9],"\u043d\u043e\u0432":[3,4,20],"\u043d\u043e\u043c\u0435\u0440":[4,8,9,10,13,14],"\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430":9,"\u043d\u043e\u0442\u0430\u0446":4,"\u043d\u0443\u0436":4,"\u043d\u0443\u0436\u0434":3,"\u043d\u0443\u0436\u043d":[4,7,9],"\u043e":[4,13,14],"\u043e\u0431":4,"\u043e\u0431\u0435\u0440\u043d\u0443\u0442":9,"\u043e\u0431\u0435\u0441\u043f\u0435\u0447":[4,9],"\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430":[3,4,8,15,17,20],"\u043e\u0431\u043b\u0430\u0434\u0430":[4,7,9,11],"\u043e\u0431\u043b\u0430\u0441\u0442":[9,10,13,20],"\u043e\u0431\u043c":[0,4,8,11,12,16,20],"\u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430":4,"\u043e\u0431\u043d\u0430\u0440\u0443\u0436":[4,9,14],"\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d":9,"\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043d":9,"\u043e\u0431\u043d\u043e\u0432":4,"\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430":14,"\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d":[2,4,9,10,11,12,13,14,15],"\u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b":18,"\u043e\u0431\u043e\u043b\u043e\u0447\u043a":9,"\u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d":20,"\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a":15,"\u043e\u0431\u0440\u0430\u0437":9,"\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d":14,"\u043e\u0431\u0440\u0430\u0442":[0,1,3,4,7,8,9,10,14,15,17,20],"\u043e\u0431\u0440\u0430\u0442\u043a":14,"\u043e\u0431\u0440\u0430\u0442\u043d":[4,9],"\u043e\u0431\u0440\u0430\u0449\u0430":11,"\u043e\u0431\u0443\u0447\u0435\u043d":20,"\u043e\u0431\u044a\u0435\u043a\u0442":[4,9,10,14,16,17,20],"\u043e\u0431\u044b\u0447\u043d":[9,10],"\u043e\u0431\u044c\u0435\u043a\u0442":4,"\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b":4,"\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d":[4,9,13,14],"\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d":[9,20],"\u043e\u0433\u0440\u043d":1,"\u043e\u0434\u0438\u043d":[3,4,9,14,15],"\u043e\u0434\u0438\u043d\u043e\u0447\u043d":9,"\u043e\u0434\u043d":[3,6,9,11,14,16,20],"\u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d":[9,11],"\u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d":4,"\u043e\u0436\u0438\u0434\u0430":[4,9,10,11,13,14,15,18],"\u043e\u0436\u0438\u0434\u0430\u043d":[9,10,11,13,14,15],"\u043e\u0437\u043d\u0430\u043a\u043e\u043c":[1,3,9,11,20],"\u043e\u0437\u043d\u0430\u0447\u0430":[2,4,9,10,11,12,13,14,15],"\u043e\u043a\u043d":[4,9,16,18],"\u043e\u043a\u043e\u043b":0,"\u043e\u043a\u043e\u043d\u0447\u0430\u043d":[4,15],"\u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d":14,"\u043e\u043a\u0440\u0443\u0436\u0435\u043d":15,"\u043e\u043a\u0443\u043f\u0430":20,"\u043e\u043d":[4,7,9,10,15,16],"\u043e\u043e":20,"\u043e\u043f":20,"\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d":4,"\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440":[4,10],"\u043e\u043f\u0435\u0440\u0430\u0446":[4,11,13,14,16,20],"\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d":[4,11],"\u043e\u043f\u0438\u0441\u0430\u043d":[4,16,20],"\u043e\u043f\u0440\u0435\u0434\u0435\u043b":9,"\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d":[4,9,11],"\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f":[4,9,14],"\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446":20,"\u043e\u043f\u0443\u0441\u0442":[11,13],"\u043e\u043f\u0443\u0449":11,"\u043e\u043f\u0446":14,"\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b":4,"\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d":[4,9,10,11,13,14,15],"\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446":[1,20],"\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440":[0,2,3,4,6,7,9],"\u043e\u0441":[0,2,4,8,9,10,11,12,13,14,15,16,20],"\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430":1,"\u043e\u0441\u043d\u043e\u0432":[3,9],"\u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b":20,"\u043e\u0441\u043d\u043e\u0432\u043d":[3,4,20],"\u043e\u0441\u043e\u0431":9,"\u043e\u0441\u043e\u0431\u0435\u043d":[4,11],"\u043e\u0441\u043e\u0437\u043d\u0430":[1,20],"\u043e\u0441\u0442\u0430":1,"\u043e\u0441\u0442\u0430\u0432":9,"\u043e\u0441\u0442\u0430\u0432\u043b\u044f":3,"\u043e\u0441\u0442\u0430\u043b\u044c\u043d":[0,1,9,13,14,20],"\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430":4,"\u043e\u0441\u0442\u0430\u043d\u043e\u0432":[4,9,15],"\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a":[3,4,20],"\u043e\u0441\u0442\u0430\u043d\u0443\u0442":[3,7,8,14,15,17,20],"\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d":11,"\u043e\u0442":[1,3,4,8,9,10,11,14,15,17,20],"\u043e\u0442\u0431\u043e\u0440":9,"\u043e\u0442\u0432\u0435\u0441\u0442":9,"\u043e\u0442\u0432\u0435\u0442":4,"\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d":[1,20],"\u043e\u0442\u0432\u0435\u0447\u0430":16,"\u043e\u0442\u0434\u0435\u043b\u044c\u043d":4,"\u043e\u0442\u043a\u0430\u0437":20,"\u043e\u0442\u043a\u0430\u0437\u0430":4,"\u043e\u0442\u043a\u043b\u044e\u0447":20,"\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d":[4,9],"\u043e\u0442\u043a\u0440":[4,8,10,16,20],"\u043e\u0442\u043a\u0440\u043e\u0435\u0442":[16,18],"\u043e\u0442\u043a\u0440\u044b\u0442":[3,20],"\u043e\u0442\u043a\u0443\u0434":4,"\u043e\u0442\u043b\u0430\u0434\u043a":[3,4,20],"\u043e\u0442\u043b\u0438\u0447":11,"\u043e\u0442\u043b\u0438\u0447\u0430":9,"\u043e\u0442\u043b\u0438\u0447\u043d":7,"\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d":[4,14],"\u043e\u0442\u043d\u043e\u0448\u0435\u043d":4,"\u043e\u0442\u043e\u0431\u0440\u0430\u0436":[9,16],"\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430":[9,16],"\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d":11,"\u043e\u0442\u043f\u0440\u0430\u0432":[2,4,10,11],"\u043e\u0442\u043f\u0440\u0430\u0432\u043a":[4,20],"\u043e\u0442\u043f\u0440\u0430\u0432\u043b":4,"\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f":[2,4,9,10,11],"\u043e\u0442\u043f\u0443\u0441\u043a\u0430":[13,14],"\u043e\u0442\u043f\u0443\u0441\u043a\u0430\u043d":11,"\u043e\u0442\u043f\u0443\u0441\u0442":[11,13,14],"\u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430":20,"\u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430":11,"\u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a":[4,10],"\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a":14,"\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d":13,"\u043e\u0442\u0440\u044b\u0432\u0430":17,"\u043e\u0442\u0440\u044b\u0432\u043a":15,"\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430":9,"\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430":4,"\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432":4,"\u043e\u0442\u0441\u0447\u0435\u0442":[13,14],"\u043e\u0442\u0442\u0435\u043d\u043a":14,"\u043e\u0447\u0435\u043d":[0,20],"\u043e\u0447\u0435\u0440\u0435\u0434":[3,4,20],"\u043e\u0447\u0438\u0441\u0442":9,"\u043e\u0448\u0438\u0431\u043a":[4,9],"\u043e\u0448\u0438\u0431\u043e\u043a":9,"\u043f\u0430\u043a\u0435\u0442":[0,4,12,14,20],"\u043f\u0430\u043a\u0435\u0442\u043d":14,"\u043f\u0430\u043c\u044f\u0442":4,"\u043f\u0430\u043d\u0435\u043b":[3,4,18,20],"\u043f\u0430\u043f\u043a":[0,4,6,15,20],"\u043f\u0430\u0440":4,"\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d":4,"\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440":[2,4,6,9,10,11,12,13,14,15,19],"\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446":[13,14],"\u043f\u0430\u0440\u043e\u043b":4,"\u043f\u0430\u0443\u0437":[3,20],"\u043f\u0435\u0440\u0432":[9,10,20],"\u043f\u0435\u0440\u0435\u0434":[4,9,15,20],"\u043f\u0435\u0440\u0435\u0434\u0430":[4,10,11,13],"\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430":[4,9],"\u043f\u0435\u0440\u0435\u0434\u0430\u0447":[2,4,8,9,10,11,14,20],"\u043f\u0435\u0440\u0435\u0434\u043e\u0432":20,"\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437":4,"\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a":4,"\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a":4,"\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442":4,"\u043f\u0435\u0440\u0435\u0439\u0442":[6,8,15],"\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447":11,"\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b":9,"\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d":11,"\u043f\u0435\u0440\u0435\u043c\u0435\u043d":[4,10,11,15],"\u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442":[0,9,13,14],"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430":9,"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d":[9,13,14],"\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b":9,"\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f":9,"\u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d":4,"\u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d":9,"\u043f\u0435\u0440\u0435\u0442\u0430\u0449":9,"\u043f\u0435\u0440\u0435\u0445\u043e\u0434":3,"\u043f\u0435\u0440\u0435\u0447\u0435\u043d":[4,9,11],"\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d":10,"\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a":4,"\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d":14,"\u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d":[0,8,20],"\u043f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433":1,"\u043f\u0435\u0447\u0430":11,"\u043f\u0435\u0447\u0430\u0442":11,"\u043f\u0435\u0447\u0430\u0442\u0430":11,"\u043f\u0438\u043a\u0441\u0435\u043b":[4,10,14],"\u043f\u043b\u0430\u043d\u0438\u0440":[4,9],"\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c":9,"\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442":9,"\u043f\u043b\u0430\u0442\u0435\u0436":20,"\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c":[0,3,8,9,11,14,15,16,17,20],"\u043f\u043e":[0,1,2,3,4,6,7,9,10,11,13,14,15,17,20],"\u043f\u043e\u0432\u0442\u043e\u0440\u043d":[4,14],"\u043f\u043e\u0434":[2,3,4,9,20],"\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a":5,"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430":[2,4,9,10,11,12,13,14,15,18],"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a":[0,3,4,7,8,14,15,17,20],"\u043f\u043e\u0434\u043a\u043b\u044e\u0447":[4,9],"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430":16,"\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d":[4,9,20],"\u043f\u043e\u0434\u043d\u044f":[11,13,14],"\u043f\u043e\u0434\u043d\u044f\u0442":11,"\u043f\u043e\u0434\u043e\u0436\u0434":18,"\u043f\u043e\u0434\u043f\u0438\u0441\u043a":20,"\u043f\u043e\u0434\u0440\u043e\u0431\u043d":[4,9,14,20],"\u043f\u043e\u0434\u0441\u0432\u0435\u0442":[9,10],"\u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a":[9,14],"\u043f\u043e\u0434\u0441\u0432\u0435\u0447":9,"\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0430\u043d":10,"\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u043d":10,"\u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a":10,"\u043f\u043e\u0434\u0445\u043e\u0434\u044f":[10,14],"\u043f\u043e\u0434\u0445\u044a\u043e\u0434":3,"\u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430":20,"\u043f\u043e\u0437\u0432\u043e\u043b":[4,16],"\u043f\u043e\u0437\u0432\u043e\u043b\u044f":[3,4,8,9,11,16,20],"\u043f\u043e\u0437\u0438\u0446":[13,14],"\u043f\u043e\u0438\u0441\u043a":[4,9,10,14,15,20],"\u043f\u043e\u043a":[4,9,11,15],"\u043f\u043e\u043a\u0430\u0437\u0430":18,"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b":14,"\u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430":4,"\u043f\u043e\u043a\u043e\u043b\u0435\u043d":20,"\u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b":8,"\u043f\u043e\u043a\u0443\u043f\u043a":20,"\u043f\u043e\u043b":9,"\u043f\u043e\u043b\u0435\u0437\u043d":4,"\u043f\u043e\u043b\u043d":[4,9,14],"\u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447":4,"\u043f\u043e\u043b\u043d\u043e\u0441\u0442":4,"\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d":16,"\u043f\u043e\u043b\u043e\u0436\u0435\u043d":[9,14,20],"\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d":13,"\u043f\u043e\u043b\u0443\u0447":[1,2,4,9,10,12,14,15],"\u043f\u043e\u043b\u0443\u0447\u0430":[4,11],"\u043f\u043e\u043b\u0443\u0447\u0435\u043d":[1,2,4,9,20],"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b":[2,3,4,9,20],"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a":[4,9,17,18],"\u043f\u043e\u043c\u0438\u043c":20,"\u043f\u043e\u043c\u043e\u0433\u0443\u0442":[1,3,7,8,14,15,17,20],"\u043f\u043e\u043c\u043e\u0436":1,"\u043f\u043e\u043c\u043e\u0449":[0,4,9,10,11,15,16],"\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a":4,"\u043f\u043e\u043f\u0430\u0441\u0442":9,"\u043f\u043e\u043f\u0440\u043e\u0431":11,"\u043f\u043e\u043f\u044b\u0442\u043a":[9,11],"\u043f\u043e\u0440\u043e\u0436\u0434":4,"\u043f\u043e\u0440\u0442":4,"\u043f\u043e\u0440\u0442\u0430":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432":10,"\u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d":9,"\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a":9,"\u043f\u043e\u0441\u043b":[0,4,9,11,13,14,15,16,18],"\u043f\u043e\u0441\u043b\u0435\u0434":9,"\u043f\u043e\u0441\u043b\u0435\u0434\u043d":[9,15],"\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d":4,"\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d":[4,16],"\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f":[8,20],"\u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a":20,"\u043f\u043e\u0441\u0442\u0443\u043f":[4,15],"\u043f\u043e\u0441\u0442\u0443\u043f\u0430":15,"\u043f\u043e\u0441\u0442\u0444\u0438\u043a\u0441":[2,4],"\u043f\u043e\u0441\u044b\u043b\u0430":11,"\u043f\u043e\u0442\u043e\u043a":[3,4,6,10,15],"\u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d":4,"\u043f\u043e\u0442\u043e\u043c\u043a":9,"\u043f\u043e\u0442\u0440\u0435\u0431":[3,4,7],"\u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430":15,"\u043f\u043e\u0445\u043e\u0436":14,"\u043f\u043e\u0447\u0442":1,"\u043f\u043e\u044d\u0442":9,"\u043f\u043e\u044f\u0432":[9,10],"\u043f\u043e\u044f\u0432\u043b\u0435\u043d":[4,9,10,14],"\u043f\u0440\u0430\u0432":[4,9,13,14,20],"\u043f\u0440\u0430\u0432\u0438\u043b":14,"\u043f\u0440\u0430\u0432\u043e\u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b":20,"\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a":[17,20],"\u043f\u0440\u0435\u0432\u044b\u0448":10,"\u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d":10,"\u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d":20,"\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430":[3,20],"\u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d":4,"\u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d":[4,16,20],"\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432":4,"\u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f":4,"\u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442":[8,9],"\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b":[2,4,5,7,9,10,11,16,18,20],"\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449":4,"\u043f\u0440\u0435\u0436\u0434":11,"\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],"\u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d":4,"\u043f\u0440\u0435\u043a\u0440\u0430\u0442":4,"\u043f\u0440\u0435\u043a\u0440\u0430\u0449\u0435\u043d":[4,10],"\u043f\u0440\u0435\u043c\u0438\u0430\u043b\u044c\u043d":20,"\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437":4,"\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430":[2,4],"\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d":4,"\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d":4,"\u043f\u0440\u0435\u0441\u0442\u0430\u0432\u043b":8,"\u043f\u0440\u0435\u0444\u0438\u043a\u0441":4,"\u043f\u0440\u0438":[0,4,7,9,10,11,12,14],"\u043f\u0440\u0438\u0431\u043b\u0438\u0436":9,"\u043f\u0440\u0438\u0432\u0435\u0434":9,"\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442":[4,14],"\u043f\u0440\u0438\u0432\u0435\u0441\u0442":4,"\u043f\u0440\u0438\u0432\u0435\u0442":11,"\u043f\u0440\u0438\u0437\u043d\u0430\u043a":9,"\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d":[4,8,9,10,15,16,17,20],"\u043f\u0440\u0438\u043c\u0435\u043d":4,"\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c":9,"\u043f\u0440\u0438\u043c\u0435\u043d\u044f":[9,20],"\u043f\u0440\u0438\u043c\u0435\u0440":[3,4,6,9,14,20],"\u043f\u0440\u0438\u043d":4,"\u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436":9,"\u043f\u0440\u0438\u043d\u0438\u043c\u0430":[4,13,14,15],"\u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d":[3,4,20],"\u043f\u0440\u0438\u043d\u0446\u0438\u043f":9,"\u043f\u0440\u0438\u043d\u044f":4,"\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d":1,"\u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432":[4,9],"\u043f\u0440\u0438\u0445\u043e\u0434":20,"\u043f\u0440\u0438\u0447\u0438\u043d":20,"\u043f\u0440\u0438\u0448\u0435\u043b":4,"\u043f\u0440\u043e":[4,20],"\u043f\u0440\u043e\u0431\u043b":[0,20],"\u043f\u0440\u043e\u0431\u043b\u0435\u043c":20,"\u043f\u0440\u043e\u0431\u043d":14,"\u043f\u0440\u043e\u0432\u0435\u0440":[1,4,9,11,14,20],"\u043f\u0440\u043e\u0432\u0435\u0440\u043a":[4,9,10,14,20],"\u043f\u0440\u043e\u0432\u0435\u0440\u044f":[4,9,14],"\u043f\u0440\u043e\u0432\u0435\u0441\u0442":16,"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c":[4,11],"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d":[3,8,11,14,15,16,17,20],"\u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d":[3,20],"\u043f\u0440\u043e\u0434\u043e\u043b\u0436":4,"\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d":16,"\u043f\u0440\u043e\u0435\u043a\u0442":[0,8,16,20],"\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c":20,"\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d":20,"\u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430":[4,9],"\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434":9,"\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442":3,"\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434":[4,9,10,13],"\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d":[3,14,20],"\u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442":11,"\u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430":4,"\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434":[4,11,13,15],"\u043f\u0440\u043e\u043a\u0440\u0443\u0442":[9,13],"\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a":[10,13],"\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d":15,"\u043f\u0440\u043e\u043f\u0438\u0441\u0430":16,"\u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430":4,"\u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d":4,"\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440":[3,4,20],"\u043f\u0440\u043e\u0441\u0442":[9,16],"\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432":4,"\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b":[2,8],"\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d":[16,20],"\u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d":[9,10,14],"\u043f\u0440\u043e\u0444\u0438\u043b":10,"\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440":4,"\u043f\u0440\u043e\u0446\u0435\u0441\u0441":[2,4,9,10,16,20],"\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d":[3,4],"\u043f\u0440\u043e\u0447\u0438\u0442\u0430":[2,4],"\u043f\u0440\u043e\u0448\u043b":[4,14],"\u043f\u0440\u044f\u043c":9,"\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d":[9,14],"\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a":9,"\u043f\u0441\u0435\u0432\u0434\u043e\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d":4,"\u043f\u0443\u0441\u0442":[4,9],"\u043f\u0443\u0442":[2,4,9,10,14,15],"\u0440\u0430\u0431\u043e\u0442":[0,3,4,7,8,11,14,15,16,17,20],"\u0440\u0430\u0431\u043e\u0442\u0430":[0,3,4,9,11,20],"\u0440\u0430\u0431\u043e\u0447":[4,8,9,13,14,15,16],"\u0440\u0430\u0432":9,"\u0440\u0430\u0432\u043d":9,"\u0440\u0430\u0437":[4,20],"\u0440\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430":9,"\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442":[9,20],"\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u043d\u0443\u0442":4,"\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d":[0,16,20],"\u0440\u0430\u0437\u0432\u0438\u0442":20,"\u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d":[3,20],"\u0440\u0430\u0437\u0434\u0435\u043b":[4,7,9,11,16,17],"\u0440\u0430\u0437\u043b\u0438\u0447\u043d":[4,10,11,17],"\u0440\u0430\u0437\u043d":[4,11],"\u0440\u0430\u0437\u043d\u043e\u044f\u0437\u044b\u0447\u043d":11,"\u0440\u0430\u0437\u043e\u0432":20,"\u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430":9,"\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430":20,"\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a":[3,8,14,15,17],"\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a":[3,20],"\u0440\u0430\u0437\u0440\u0435\u0448\u0430":[1,20],"\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d":4,"\u0440\u0430\u0437\u0440\u044f\u0434\u043d":9,"\u0440\u0430\u043c\u043a":[9,16,20],"\u0440\u0430\u043d":[4,9,20],"\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a":11,"\u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043e\u043a":11,"\u0440\u0430\u0441\u043a\u0440":4,"\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430":0,"\u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d":[3,4,20],"\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d":20,"\u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430":10,"\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436":[4,9,10,15],"\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d":[4,6,9,10,14],"\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d":7,"\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d":[9,14],"\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d":[4,10,15],"\u0440\u0435\u0430\u043a\u0446":11,"\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446":20,"\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430":[4,20],"\u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d":9,"\u0440\u0435\u0430\u043b\u044c\u043d":11,"\u0440\u0435\u0433":9,"\u0440\u0435\u0433\u0438\u0441\u0442\u0440":[2,4,11],"\u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u043d":4,"\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d":9,"\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430":7,"\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d":[9,20],"\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440":18,"\u0440\u0435\u0434\u0430\u043a\u0446":8,"\u0440\u0435\u0435\u0441\u0442\u0440":20,"\u0440\u0435\u0436":[9,15,18],"\u0440\u0435\u0436\u0438\u043c":[4,9,11,14,15],"\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442":[2,4,9,10,12,14,15,19,20],"\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443":[0,3,4,9],"\u0440\u0435\u043b\u0438\u0437":20,"\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"\u0440\u0435\u0441\u0443\u0440\u0441":20,"\u0440\u0435\u0447":20,"\u0440\u0435\u0448":16,"\u0440\u0435\u0448\u0430":20,"\u0440\u0435\u0448\u0435\u043d":[3,20],"\u0440\u0438\u0441\u043e\u0432\u0430\u043d":9,"\u0440\u043e\u0431\u043e\u0442":[1,2,3,4,7,8,9,11,14,15,17],"\u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0430":16,"\u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0430\u0446":[3,8,14,15,16,17,20],"\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a":[9,18],"\u0440\u043e\u043b\u0435\u0432":[3,4,20],"\u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a":20,"\u0440\u043f\u0430":20,"\u0440\u0443\u0431":[3,8,14,15,17,20],"\u0440\u0443\u0431\u043b":20,"\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432":[17,20],"\u0440\u0443\u0441\u0441\u043a":[4,11],"\u0440\u044b\u043d\u043a":[3,20],"\u0440\u044b\u043d\u043e\u043a":20,"\u0440\u044f\u0434":[9,20],"\u0441":[0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,20],"\u0441\u0430\u043c":[3,9,20],"\u0441\u0430\u043c\u043e\u0437\u0430\u043d\u044f\u0442":[1,20],"\u0441\u0430\u043d\u043a\u0442":1,"\u0441\u0430\u043d\u043a\u0446":20,"\u0441\u0431\u043e\u0440":3,"\u0441\u0432\u0435\u0434\u0435\u043d":4,"\u0441\u0432\u0435\u0440\u043d\u0443\u0442":9,"\u0441\u0432\u0435\u0440\u0445":[9,14],"\u0441\u0432\u0435\u0441\u0442":16,"\u0441\u0432\u043e":[1,3,4,6,9,14,20],"\u0441\u0432\u043e\u0439\u0441\u0442\u0432":[9,20],"\u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d":9,"\u0441\u0432\u044f\u0437":[4,11,20],"\u0441\u0432\u044f\u0437\u0430":[4,9],"\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430":4,"\u0441\u0435\u0433\u043c\u0435\u043d\u0442":20,"\u0441\u0435\u0433\u043e\u0434\u043d":20,"\u0441\u0435\u043a":[0,4,10,14],"\u0441\u0435\u043a\u0443\u043d\u0434":[4,9,11,13,14,15],"\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440":[10,18,20],"\u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432":20,"\u0441\u0435\u0440":[14,16],"\u0441\u0435\u0440\u0432\u0435\u0440":[3,4,6],"\u0441\u0435\u0440\u0435\u0434\u0438\u043d":4,"\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442":[1,4,20],"\u0441\u0435\u0441":9,"\u0441\u0435\u0441\u0438":4,"\u0441\u0435\u0441\u0441":[2,3,4,9,16,17,20],"\u0441\u0435\u0442\u0435\u0432":4,"\u0441\u0438\u0433\u043d\u0430":4,"\u0441\u0438\u043c\u0432\u043e\u043b":[4,9,11],"\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d":20,"\u0441\u0438\u043c\u0443\u043b\u044f\u0446":9,"\u0441\u0438\u043d":9,"\u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d":4,"\u0441\u0438\u043d\u043e\u043d":4,"\u0441\u0438\u043d\u043e\u043d\u0438\u043c":4,"\u0441\u0438\u043d\u0445\u0440\u043e\u043d":4,"\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446":4,"\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430":4,"\u0441\u0438\u0441\u0442":11,"\u0441\u0438\u0441\u0442\u0435\u043c":[4,7,11],"\u0441\u0438\u0442\u0443\u0430\u0446":[4,9],"\u0441\u043a\u0430\u043d":11,"\u0441\u043a\u0430\u0447\u0430":[0,10],"\u0441\u043a\u043e\u043b\u044c\u043a":9,"\u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430":[4,11],"\u0441\u043a\u043e\u0440\u043e\u0441\u0442":[0,20],"\u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430":14,"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442":[0,20],"\u0441\u043a\u0440\u0438\u043f\u0442":[6,20],"\u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433":13,"\u0441\u043a\u0440\u044b\u0442":9,"\u0441\u043b\u0435\u0432":[9,14],"\u0441\u043b\u0435\u0434":[0,3,4,6,9,11,13,14,15,16,18],"\u0441\u043b\u0435\u0434\u043e\u0432\u0430":0,"\u0441\u043b\u0435\u0434\u044e\u0449":4,"\u0441\u043b\u0435\u043f\u043e\u043a":2,"\u0441\u043b\u043e\u0432":10,"\u0441\u043b\u043e\u0432\u0430\u0440":[2,4,5,9,20],"\u0441\u043b\u043e\u0436\u0435\u043d":4,"\u0441\u043b\u043e\u0436\u043d":3,"\u0441\u043b\u0443\u0447\u0430":[0,1,4,9,11,13,14,15,20],"\u0441\u043b\u0443\u0448\u0430":4,"\u0441\u043c":[0,1,3,4,6,9,11,13,14,16,20],"\u0441\u043c\u0435\u043d":10,"\u0441\u043c\u0435\u0449\u0435\u043d":14,"\u0441\u043c\u043e\u0436\u0435\u0442":[3,8,14,15,17],"\u0441\u043c\u043e\u0442\u0440\u0435\u0442":20,"\u0441\u043d\u0430\u0447\u0430":4,"\u0441\u043d\u0438\u0437":[9,14],"\u0441\u043d\u044f\u0442":9,"\u0441\u043e":[0,3,4,7,9,11],"\u0441\u043e\u0431\u044b\u0442":11,"\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d":[1,20],"\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c":[4,9],"\u0441\u043e\u0432\u043f\u0430\u0434\u0430":9,"\u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d":1,"\u0441\u043e\u0434\u0435\u0440\u0436":[4,8,11,16,20],"\u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442":9,"\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c":[2,4,9,12],"\u0441\u043e\u0435\u0434\u0438\u043d":4,"\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d":4,"\u0441\u043e\u0437\u0434\u0430":[2,4,5,14,16,20],"\u0441\u043e\u0437\u0434\u0430\u0432\u0430":[2,4],"\u0441\u043e\u0437\u0434\u0430\u043d":[4,6,8,20],"\u0441\u043e\u043e\u0431\u0449\u0430":4,"\u0441\u043e\u043e\u0431\u0449\u0435\u043d":[4,11],"\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],"\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432":[4,9,11,13,14,16],"\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432":[3,4,9,10,14],"\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d":11,"\u0441\u043e\u0441\u0442\u043e":[3,18],"\u0441\u043e\u0441\u0442\u043e\u044f":3,"\u0441\u043e\u0441\u0442\u043e\u044f\u043d":[3,4,9,20],"\u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a":[3,8,14,15,17,20],"\u0441\u043e\u0444\u0442":20,"\u0441\u043e\u0445\u0440\u0430\u043d":[4,14],"\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d":[4,10,15],"\u0441\u043e\u0445\u0440\u0430\u043d\u044f":[4,10,15],"\u0441\u043e\u0447\u0435\u0442\u0430":20,"\u0441\u043e\u0447\u0435\u0442\u0430\u043d":11,"\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d":[3,4],"\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446":9,"\u0441\u043f\u0438\u0441\u043a":[4,9,14],"\u0441\u043f\u0438\u0441\u043e\u043a":[2,4,9,10,11,14,15,18],"\u0441\u043f\u043e\u0441\u043e\u0431":[4,9,10,16],"\u0441\u043f\u0440\u0430\u0432":[9,14],"\u0441\u043f\u0440\u0430\u0432\u043a":4,"\u0441\u0440\u0430\u0437":[4,11],"\u0441\u0440\u0435\u0434":[3,4,9,20],"\u0441\u0440\u0435\u0434\u043d":[0,20],"\u0441\u0440\u0435\u0434\u0441\u0442\u0432":16,"\u0441\u0440\u0438\u043f\u0442":16,"\u0441\u0441\u044b\u043b\u043a":[3,20],"\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d":[4,11],"\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442":20,"\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d":4,"\u0441\u0442\u0430\u043d\u0435\u0442":9,"\u0441\u0442\u0430\u043d\u043e\u0432":20,"\u0441\u0442\u0430\u0440":4,"\u0441\u0442\u0430\u0442\u0443\u0441":15,"\u0441\u0442\u0438\u043b":10,"\u0441\u0442\u0438\u043b\u0435\u0432":10,"\u0441\u0442\u043e\u043b":[8,9],"\u0441\u0442\u043e\u0440\u043e\u043d":[2,4,7,10,11,20],"\u0441\u0442\u0440\u0430\u043d\u0438\u0446":[0,4,10,11,16],"\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0447\u0435\u0441\u043a":20,"\u0441\u0442\u0440\u043e\u043a":[2,4,9,11,14,16],"\u0441\u0442\u0440\u043e\u043a\u043e\u0432":[4,14],"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440":[3,4,9,15],"\u0441\u0442\u0443\u0434":[9,16,17],"\u0441\u0442\u044d\u043d\u0434":6,"\u0441\u0443\u043f\u0435\u0440":4,"\u0441\u0443\u043f\u0435\u0440\u0434\u043e\u0441\u0442\u0443\u043f":4,"\u0441\u0443\u043f\u0435\u0440\u0442\u043e\u043a":4,"\u0441\u0443\u043f\u0435\u0440\u0442\u043e\u043a\u0435\u043d":4,"\u0441\u0443\u0449\u0435\u0441\u0442\u0432":[0,2,4,9],"\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d":[3,8,11,14,15,17],"\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d":9,"\u0441\u0445\u043e\u0436":9,"\u0441\u0447\u0435\u0442":11,"\u0441u":14,"\u0442":[10,11,15],"\u0442\u0430\u043a":[0,3,6,9,11,13,20],"\u0442\u0430\u043a\u0436":[0,1,4,6,7,9,11,16],"\u0442\u0430\u043a\u043e\u0432":[9,20],"\u0442\u0430\u043c":16,"\u0442\u0434":4,"\u0442\u0435":7,"\u0442\u0435\u043a\u0441\u0442":[1,2,9,10,11,18,20],"\u0442\u0435\u043a\u0441\u0442\u043e\u0432":[2,4,8,11,12,16,20],"\u0442\u0435\u043a\u0443\u0449":[4,9,11,13,15,20],"\u0442\u0435\u043b":4,"\u0442\u0435\u043b\u0435\u0433\u0440":1,"\u0442\u0435\u043b\u0435\u0444\u043e\u043d":1,"\u0442\u0435\u043c":[4,9,11,20],"\u0442\u0435\u043f\u0435\u0440":9,"\u0442\u0435\u0440\u043c\u0438\u043d":9,"\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b":[0,11],"\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d":0,"\u0442\u0435\u0445":13,"\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a":9,"\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433":[0,8,9,20],"\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a":20,"\u0442\u0438\u043f":[4,9,10,12,14,15],"\u0442\u043e":[3,4,7,8,9,10,11,14,15,17,20],"\u0442\u043e\u0433":[3,4,9,11,20],"\u0442\u043e\u043a":4,"\u0442\u043e\u043b\u0441\u0442":1,"\u0442\u043e\u043b\u0449\u0438\u043d":[9,14],"\u0442\u043e\u043b\u044c\u043a":[1,3,4,8,9,10,11,14,15,17,20],"\u0442\u043e\u043c":[0,4,7,11],"\u0442\u043e\u043d\u043a":6,"\u0442\u043e\u0447\u043a":20,"\u0442\u043e\u0447\u043d":20,"\u0442\u043e\u0447\u043d\u043e\u0441\u0442":[11,14],"\u0442\u0440\u0435\u0431":[0,1,2,4,6,7,9,10,11,13,14,15,17,20],"\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d":9,"\u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442":0,"\u0442\u044b\u0441":[3,8,14,15,17,20],"\u0442\u044b\u0441\u044f\u0447":3,"\u0443":[1,3,7,8,9,10,11,14,15,17,20],"\u0443\u0431\u0435\u0434":4,"\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430":3,"\u0443\u0433\u043b":9,"\u0443\u0433\u043e\u0434\u043d":0,"\u0443\u0434\u0430\u043b":10,"\u0443\u0434\u0430\u043b\u0435\u043d":[3,4,20],"\u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430":[9,18],"\u0443\u0434\u043e\u0431\u043d":7,"\u0443\u0434\u043e\u0431\u0441\u0442\u0432":9,"\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f":[9,10,14],"\u0443\u0436":[0,4,7,9,11,16],"\u0443\u0437":[0,4],"\u0443\u0437\u043b":20,"\u0443\u043a\u0430\u0436":9,"\u0443\u043a\u0430\u0437\u0430":[4,7,9,10,11,13],"\u0443\u043a\u0430\u0437\u0430\u043d":[4,15,20],"\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b":[9,10,13,14],"\u0443\u043a\u0430\u0437\u043d":9,"\u0443\u043a\u0430\u0437\u044b\u0432\u0430":[0,4,9,15],"\u0443\u043b\u0438\u0446":1,"\u0443\u043b\u0443\u0447\u0448":[3,8,14,15,17],"\u0443\u043c\u043e\u043b\u0447\u0430\u043d":[0,2,4,7,9,10,11,13,14,15,18],"\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d":[4,7,20],"\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430":4,"\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d":[3,4,8,9,10,11,20],"\u0443\u043f\u0440\u0430\u0432\u043b\u044f":[3,8,14,15,17,20],"\u0443\u043f\u0440\u043e\u0441\u0442":16,"\u0443\u043f\u0440\u043e\u0449\u0435\u043d":3,"\u0443\u0440\u043e\u0432\u0435\u043d":[4,8,9,20],"\u0443\u0440\u043e\u0432\u043d":[9,18],"\u0443\u0441\u043a\u043e\u0440\u044f":14,"\u0443\u0441\u043b\u043e\u0432":[9,14],"\u0443\u0441\u043b\u0443\u0433":20,"\u0443\u0441\u043f\u0435\u0448\u043d":[0,4],"\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430":[4,9,10],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432":[4,9,10,12,16],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a":[4,9,10,12],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b":[4,9,11,13,14],"\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d":[0,9,18],"\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442":15,"\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432":15,"\u0443\u0441\u0442\u0443\u043f\u0430":20,"\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a":20,"\u0443\u0447\u0435\u0442":[4,14,20],"\u0443\u0447\u0435\u0442\u043d":[2,3,4],"\u0443\u0447\u0438\u0442\u044b\u0432\u0430":11,"\u0443\u044f\u0437\u0432":9,"\u0444":11,"\u0444\u0430\u0439\u043b":[2,4,5,15,18,20],"\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a":[1,11,20],"\u0444\u0438\u043a\u0441\u0430\u0446":4,"\u0444\u0438\u043a\u0441\u0438\u0440":4,"\u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432":20,"\u0444\u0438\u0440\u043c":8,"\u0444\u043b\u0430\u0436\u043a":9,"\u0444\u043b\u0430\u0436\u043e\u043a":9,"\u0444\u043e\u043a\u0443\u0441":9,"\u0444\u043e\u0440\u043c\u0430\u0442":[2,4,9,14,15,20],"\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d":9,"\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430":9,"\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d":14,"\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a":3,"\u0444\u0443\u043d\u043a\u0446":[3,6,7,8,20],"\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d":[1,3,7,8,9,17,20],"\u0445":[4,9,14],"\u0445\u0430\u0440\u0430\u043a\u0435\u0442\u0440\u0438\u0437":9,"\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437":14,"\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a":9,"\u0445\u043e\u0441\u0442":4,"\u0445\u043e\u0442":[3,6,9,14,18],"\u0445\u0440\u0430\u043d\u0435\u043d":[3,4],"\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449":[3,4,20],"\u0446\u0432\u0435\u0442":[4,9,10,14,18],"\u0446\u0435\u043b":[4,9],"\u0446\u0435\u043b\u0435\u0432":[9,13],"\u0446\u0435\u043b\u043e\u0441\u0442\u043d":11,"\u0446\u0435\u043d\u0442\u0440":[0,3,4,7,8,9,14,15,17,20],"\u0446\u0435\u043f\u043e\u0447\u043a":9,"\u0446\u0438\u043a\u043b":4,"\u0446\u0438\u0444\u0440\u043e\u0432":[1,20],"\u0447\u0430\u0441":9,"\u0447\u0430\u0441\u0442":[4,9,15],"\u0447\u0430\u0441\u0442\u043e\u0442":4,"\u0447\u0430\u0442":20,"\u0447\u0435\u0433":[11,13,14],"\u0447\u0435\u0440\u0435\u0437":[3,4,8,9,11,20],"\u0447\u0438\u0441\u043b":[9,11,14],"\u0447\u0438\u0441\u0442":0,"\u0447\u0438\u0441\u0442\u043e\u0442":20,"\u0447\u0438\u0442\u0430":2,"\u0447\u0442\u0435\u043d":[4,9,20],"\u0447\u0442\u043e":[2,3,7,8,9,10,11,12,13,14,15,16,17,20],"\u0447\u0442\u043e\u0431":[3,4,9,11,16,18],"\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d":4,"\u0448\u0430\u0431\u043b\u043e\u043d":[3,4,20],"\u0448\u0430\u043d\u0441":3,"\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0438\u0440\u0438\u0447\u043d":11,"\u0448\u0438\u0440\u0438\u043d":[4,14],"\u0448\u0438\u0440\u043e\u043a":3,"\u0449\u0435\u043b\u043a\u043d":9,"\u0449\u0435\u043b\u043a\u043d\u0443\u0442":[9,18],"\u0449\u0435\u043b\u0447\u043a":[9,13],"\u0449\u0435\u043b\u0447\u043e\u043a":[9,13],"\u044d\u0432\u043c":[16,20],"\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440":[4,9,14,15],"\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a":20,"\u044d\u043a\u0440\u0430":[4,8,9,13,14,20],"\u044d\u043a\u0440\u0430\u043d":[4,9,13,14],"\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442":16,"\u044d\u043b\u0435\u043c\u0435\u043d\u0442":[4,8,9,10,14,20],"\u044d\u0440\u0430\u043d":8,"\u044d\u0442":[3,4,6,7,8,9,10,11,14,15,16,17,20],"\u044d\u0442\u043e\u0442":[3,9,16],"\u044d\u0444\u0444\u0435\u043a\u0442":[3,8,14,15,17,20],"\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d":[10,20],"\u044f":8,"\u044f\u0432\u043b\u044f":[4,9,14,20],"\u044f\u0432\u043d":[11,20],"\u044f\u0434\u0440":4,"\u044f\u0437\u044b\u043a":[4,9,11],"case":[2,5],"catch":[2,5],"class":[9,15],"continue":4,"debugger":19,"default":[2,4,5],"double":9,"else":[2,5,6],"false":[2,4,5,6,9,10,11,14],"float":[2,5,9,10,11,13,14,15],"for":[2,4,5,6,11,20],"function":5,"import":[4,5,6,8,9,10,11,12,13,14,15,16,19],"int":[9,10,11,13,14],"interface":6,"key_rus_\u0430":11,"key_rus_\u0431":11,"key_rus_\u0432":11,"key_rus_\u0433":11,"key_rus_\u0434":11,"key_rus_\u0435":11,"key_rus_\u0436":11,"key_rus_\u0437":11,"key_rus_\u0438":11,"key_rus_\u0439":11,"key_rus_\u043a":11,"key_rus_\u043b":11,"key_rus_\u043c":11,"key_rus_\u043d":11,"key_rus_\u043e":11,"key_rus_\u043f":11,"key_rus_\u0440":11,"key_rus_\u0441":11,"key_rus_\u0442":11,"key_rus_\u0443":11,"key_rus_\u0444":11,"key_rus_\u0445":11,"key_rus_\u0446":11,"key_rus_\u0447":11,"key_rus_\u0448":11,"key_rus_\u0449":11,"key_rus_\u044a":11,"key_rus_\u044b":11,"key_rus_\u044c":11,"key_rus_\u044d":11,"key_rus_\u044e":11,"key_rus_\u044f":11,"new":[5,6],"package":6,"return":[4,5,6,8,10],"static":9,"switch":11,"this":[2,5],"true":[2,4,5,6,7,9,10,11,14,15,19],"try":[4,9],"var":4,"with":[4,5,6,8],_00000:15,__agent__:2,__agentactivityreturndictitemcreate__:5,__agentdictitemcreate__:5,__create__:5,__init__:4,__main__:6,__name__:6,__orchestrator__:4,__statisticsdict__:5,__uacclientadmincreate__:[5,6],_cp:4,_sessionlast_gsettings:4,_sessionlast_rdplist:4,_sessionlast_storagedict:4,about:[5,19],abs:[4,5],absolute:[5,9],absolutely:2,abspath:[4,6],access:[4,5,6,7],accessusers:[5,6],activate:5,active:[4,5,7],active_only:9,activities:5,activity:[4,5,7],activitydict:[5,7],activityitem:[3,20],activityitemcreate:4,activityitemdefaliascreate:4,activityitemdefaliasmodulesload:4,activityitemdefaliasupdate:4,activityitemhelperdefautofill:4,activityitemhelperdeflist:4,activityitemnowdict:5,activitylist:5,activitylistappendprocessorqueuebool:[5,7],activitylistexecute:4,activitylistexecutebool:[5,7],activitytimelist:5,add:[5,6],addhandler:5,address:5,addressstr:5,admindict:[5,7],administrator:[4,6],after:[5,6,19],agent:[4,5,20],agentactivityitemadd:4,agentactivityitemexists:4,agentactivityitemreturnexists:4,agentactivityitemreturnget:4,agentactivitylifetimesecfloat:5,agentactivityreturndict:5,agentactivityreturnlifetimesecfloat:5,agentconnectionlifetimesecfloat:5,agentdict:5,agentfilechunkbytessizeint:5,agentfilechunkcheckintervalsecfloat:5,agentkeydict:[5,7],agentkeystr:[5,7],agentlimitlogsizebytesint:5,agentloopsleepsecfloat:5,agentoscmd:4,agentosfilebinarydatabase64strappend:4,agentosfilebinarydatabase64strcreate:4,agentosfilebinarydatabase64strreceive:4,agentosfilebinarydatabytescreate:4,agentosfilebinarydatareceive:4,agentosfilesend:4,agentosfiletextdatastrcreate:4,agentosfiletextdatastrreceive:4,agentoslogoff:4,agentprocesswoexeupperuserlistget:4,aif:15,alert:10,algorythms:5,alias:[4,5],aliasdefdict:[4,5],all:[4,5,6,7],allow:6,allowed:5,already:4,alt:11,alt_shift_toggle:11,amd64:[0,4,9,16],amd64python:16,and:[2,4,5,6,7],another:4,any:15,apache:1,api:4,app:[2,6],appear:19,append:[4,5,7,9,16],applicable:5,application:[4,9],apply:5,apt:[0,11,12,14],archive:[4,5],argdict:[4,5],arggsettings:[4,5],arggsettingsstr:4,arglist:[4,5],arglogger:[4,5],argloggerstr:4,args:[4,5],arguments:10,argvaluestr:4,asctime:5,ask:5,astra:20,asweigart:1,attention:[2,4,5],attribute:[4,5],audio:[8,20],authentication:5,authtoken:5,authtokensdict:5,auto_id:9,autocleaner:5,autoinit:6,automatically:5,automation:[8,20],automation_id:9,available:[5,6],b4ff:6,b64decode:2,back:20,backend:[8,9],backendstr_gettoplevellist_uioinfo:9,base64:[2,4],basehttprequesthandler:4,basewrapper:9,basic:[5,6],beautiful:2,been:[4,5],before:5,beginwith:[4,5],below:4,best_match:9,between:[5,6],bigdata:20,bin:0,binary:[2,4],bit:1,blob:1,blocked:5,blue:[9,10,14],body:[4,5],bool:[4,5,9,10,11,14,15],boppreh:1,borismoore:1,bottom:9,box:[6,20],boxanchorrulecheck:14,boxcreate:14,boxdraw:14,boxgetpoint:14,boxmodify:14,boxmoveto:14,boxoverlay:14,browser:5,browserchange:10,browserchromestart:10,browserclose:10,bs_null:9,bsd:1,bst_checked:9,bst_indeterminate:9,bst_unchecked:9,button:[5,7,9,14],button_down:9,button_up:9,cache:5,calcframe:9,call:[4,5,6],callback:15,callbackchunk:15,can:[4,5,6,19],cancel:9,capturechunk:15,capturestart:15,capturestop:15,capturewait:15,car:4,catchperiodsecfloat:5,cclulds:14,certfilepempathstr:5,changed:5,chat:20,check:[4,5,9,19],checkbox:9,checkintervalsecfloat:5,child:10,chrome:[4,10],chunk:[5,15],class_name:[8,9],class_name_re:9,clause:1,clear:5,click:[9,13],click_input:[8,9],clickdouble:13,client:5,clientrequesthandler:5,clipboard:[0,8,16,20],clipboardget:8,clipboardset:8,close:[4,5,19],cmd:[2,4,5,6,7,8,11,18],cmdinputbool:[5,7],code:[4,5,9],codepoint:11,codes:11,col:10,collecting:5,color:10,colour:9,com:[0,1,11,20],combobox:9,come:[2,19],command:[0,2,11,16],commands:5,completed:5,completion:5,complex:4,config:[3,20],configuration:[4,5,6],configure:[0,5,9],connect:5,connection:5,connectioncountint:5,connectionfirstqueueitemcountint:5,console:5,contains:[4,5],content:5,control:[4,5,6,7],control_id:9,control_type:[8,9],control_type_re:9,controlpanel:[4,5],controlpaneldict:5,controlpanelkeyallowedlist:5,controlpanelrefreshintervalsecfloat:5,controls:[5,7],cookie:5,coords:9,copy:16,cp1251:[2,4],cp866:2,cp_:[4,6],cp_versioncheck:4,cpkey:5,cpkeydict:[5,7],cpkeystr:[5,7],cpu:20,create:[2,4,5,6,19],created:5,creating:5,crosscheck:4,crossos:[5,6],css:10,ctrl:[8,9,11],ctrl_index:9,ctypes:8,current:[4,5,7],cus:14,daemonic:2,data:[5,11],datasetlast:5,datastorage:4,datetime:[5,6],dbader:1,dear:11,debugging:[4,5],def:[4,5,6,8,15,19],defaliastest:5,defaultsampleratefloat:15,defhelper:4,defnamestr:5,defsettingsupdatepathlist:5,demo:[6,8,9],depends:6,depth_end:[8,9],depth_start:[8,9],depth_stop:9,depthbit:[4,5],desktop:[5,20],desktopuser:4,detect:5,devhints:10,devicelistget:15,devicemicrophoneindex:15,devicesystemsoundindex:15,dict:[2,4,5,6,9,15,20],dictionary:[4,5],directory:[4,7,15,19],disconnect:[4,5],display_dashboard:4,div:10,dodict:5,domain:5,domainadstr:5,domainupperstr:4,domainuser:4,don:[2,5],dont:[5,7],dos:[2,4],double_click_input:[8,9],down:[11,13],dp0:16,drag_mouse_input:9,draw_outline:[8,9],drives:5,dropped_rect:9,dsd:5,dst:9,dump:[5,6],dumploglist:5,dumploglistcountint:5,dumploglisthashstr:5,dumploglistrefreshintervalsecfloat:5,duration:5,each:5,early:2,echo:[8,11],edit:[8,9],element_info:9,elementinfo:9,empty:[5,7],enabled:9,enabled_only:9,encapsulated:2,encoding:[2,4],end:9,endsecfloat:15,eng:20,enter:[8,11],enumerate:6,env:5,equal:[4,5],equalcase:[4,5],equalnoparam:4,etc:4,every:[4,5],example:4,examples:5,except:[4,9],exception:[4,9,10],exceptions:4,exe:[0,2,4,9,10,15,16,19],executable:4,execute:[2,5,7],executebool:5,executed:4,executing:5,execution:[2,5],exist:5,exists:[4,5],explorer:[4,18],extra:15,fastapi:[3,4,6],feature:5,ffmpeg:15,field:5,file:[2,4,5,19],filebodybytes:4,filehandler:5,fileinfoget:15,filelastget:15,filelistget:15,filemanager:5,filemode:5,filenamestr:4,fileresponse:6,files:5,fileurl:5,fileurlfilepathdict:5,fileurlfilepathdict_help:5,fill:[5,9],filled:5,fills:5,findwindows:9,first:6,flag:[2,5],flagaccess:5,flagaccessdefrequestglobalauthenticate:5,flagcredentialsask:[5,6],flagdonotexpire:5,flagsessionisactive:5,flaguseallmonitors:[4,5],flase:[2,4],folder:6,forget:5,format:2,formatter:5,found:[0,11],found_index:9,foundation:1,framework:9,framework_id:9,friday:4,friendly_class_name:9,friendly_class_name_re:9,friendlyclassname:9,from:[4,5,6,8,9,10,11,12,13,14,15,16,19],from_point:9,front:20,full:5,full_control_type:9,fullscreen:5,fullscreenbool:[5,7],fullscreenrdpsessionkeystr:5,functionallity:6,functions:[2,4,9,10,11,12,13,14,15,19],general:5,get:[0,4,5,6,11,12,14],get_check_state:9,get_item_focus:9,get_line:9,get_osbitnessint:9,get_properties:9,getlogger:5,getscreenshot:4,giampaolo:1,git:[0,3,4,5,7],github:1,gitlab:20,gittoolsjupyter:16,give:[5,7],global:2,google:10,green:[4,9,10,14],grey:10,grid:10,grid__ccol:10,grid__main:10,grid_newscol:10,grid_newscol__more:10,groupbox:9,groupboxes:9,grp:11,gsettings:[4,6,20],gsettingsdict:4,gsettingsget:[4,6],gsettingskeylistvalueappend:4,gsettingskeylistvalueget:4,gsettingskeylistvalueoperatorplus:4,gsettingskeylistvalueset:4,guid:[4,5],guidstr:[4,5],gurbage:5,habr:20,handbk:11,handle:[5,9],handlebars:1,handler:5,handlers:5,hard:5,has:[5,19],have:4,hdd:20,headers:4,height:[4,5,9,14],hello:[4,10,11,12],help:[4,20],hex:[5,9],hiddenisorchestratorinitialized:5,hierarchy:18,host:[4,5],hostapiint:15,hostapistr:15,hostnameupperstr:5,hotkeycombination:11,hotkeyctrla_ctrlc:11,hotkeyctrlv:11,how:19,hpnd:1,href:10,html:[4,5,9,20],http:[0,1,4,5,6],https:[0,1,4,5,9,10,11,20],identifyauthorize:6,ignore:5,ignorebool:[5,7],image:[4,16],image_wait_interval_sec_float:14,image_wait_sec_float:14,imageclick:14,imageexists:14,imagelocateall:14,imagewaitappear:14,imagewaitdisappear:14,imaslov:6,imported:4,inactionname:9,inactivityitemdict:4,inactivitylist:4,inaddressstr:4,inadisdefaultbool:[4,6],inadloginstr:[4,6],inadstr:[4,6],inadstrinadloginstr:4,inagentfilepathstr:4,inaliasstr:4,inanchorbox:14,inanchorrule:14,inanchorrulestr:20,inarg1str:4,inargdict:4,inarggsettings:4,inarggsettingsstr:4,inarglist:[4,10],inargloggerstr:4,inargumentlist:9,inasyncinitbool:[4,6],inattributestr:10,inauthdict:6,inauthtokenstr:4,inbackend:9,inbox1:14,inbox2:14,inbox:14,inboxindexint:14,inbreaktriggerprocesswoexelist:4,inbrowser:10,inbuttonstr:[13,14],incallbackchunkdef:15,incallbackstopdef:15,incapturebool:[2,4],incertfilepempathstr:4,incheckintervalsecfloat:4,inchromeexepathstr:10,inchunksecfloat:15,inclickcountint:[13,14],incloseforcebool:4,included:8,incmdencodingstr:[2,4],incmdstr:[2,4],incolorstr:[10,14],inconfidencefloat:14,incontenttypestr:4,incontrolspecificationarray:9,incpkeystr:4,indef:4,indefargdict:4,indefarggsettingsnamestr:4,indefarglist:4,indefargloggernamestr:4,indefargnamegsettingsstr:4,indefnamestr:4,indefquerystr:4,indefstr:4,indelayfloat:11,indelaysecfloat:11,indepthbitint:4,indeviceint:15,index:[1,4,5,9],indexint:15,indheightint:14,indict:5,indomainstr:4,indopressbool:11,indoreleasebool:11,indriverexepathstr:10,indumprestorebool:[4,6],indurationsecfloat:[10,15],indwidthint:14,indxint:14,indyint:14,inelement:9,inelementinfo:9,inelementspecification:9,inencodingstr:[2,4],inexactbool:11,inexecuteinnewthreadbool:4,inextensionpathlist:10,inextra:15,infiledatabase64str:[2,4],infiledatabytes:4,infiledatastr:[2,4],infileformatstr:15,infilenamestr:15,infilepathstr:[2,4],inflagforceclosebool:4,inflaggetabspathbool:4,inflagraiseexception:9,inflagsetfocus:9,inflagwaitallinmoment:9,info:[4,5,6],infolderpathstr:[4,15],inforcebool:4,inforcechunkbool:15,inglobpatternstr:[4,6],ingsettings:[2,4,6],ingsettingsclientdict:5,inguidstr:4,inhashkeystr:5,inheadersdict:4,inheightint:14,inheightpxint:4,inhierarchylist:9,inhorizontalpxint:10,inhostfilepathstr:4,inhostnamestr:4,inhoststr:[4,5],inhtmlrenderdef:4,inimgpathstr:14,inintervalasyncbool:4,inintervalsecfloat:[4,13,14],inisfirst:10,inisgraymodebool:14,init:[4,5,6,19],init_debug:19,initdatetime:5,inited:5,initialized:5,injsinitgeneratordef:4,injsongeneratordef:4,injsstr:10,inkeyfilepathstr:4,inkeyint:11,inkeylist:[4,11],inkeystr:5,inkwargs:19,inkwargumentobject:9,inleftint:14,inlogger:[4,5,19],inloggerlevel:5,inloginstr:[4,5],inmatchtypestr:4,inmessagestr:4,inmethodstr:4,inmodestr:[4,5,6],inmodulepathstr:4,inmovedurationsecfloat:[13,14],inoperationcodestr:4,inorchestratorfilepathstr:4,inpackagelevelint:4,inpasswordstr:[4,5],inpathstr:4,inpoint:14,inpointrulestr:20,inportint:[4,6],inportstr:[4,5],inprocessnamewexestr:4,inprocessnamewoexelist:4,inprocessnamewoexestr:4,inprofilepathstr:10,inrdpfilepathstr:4,inrdpsessionkeystr:[4,5],inrdptemplatedict:4,inredirectclipboardbool:4,inrequest:4,inresponestr:4,inrestorestateafterbool:11,inreturn:5,inrobotnamestr:4,inrolehierarchyalloweddict:[4,6],inrolekeylist:4,inrootelement:9,inrowcountint:5,inrunasadministratorbool:4,inrunasyncbool:[2,4],inscrollclickcountint:13,insendoutputtoorchestratorlogsbool:[2,4],insert:[4,6],inserverkeystr:4,inshareddrivelist:4,inshiftsecfloat:15,inspecificationlist:9,inspecificationlistlist:9,install:[0,8,11,12,14],instance:5,instopprocessnamewoexestr:4,insupertokenstr:[4,6],internet:18,interval:5,intervalsecfloat:5,intextstr:[11,12],inthicknessint:14,inthreadbool:4,intimehhmmstr:4,intimeoutsecfloat:4,intopint:14,inuacbool:4,inuio:10,inuioselector:9,inuioselectorstr:10,inurlindexstr:4,inurllist:[4,6],inurlstr:[4,10],inusebothmonitorbool:4,inusecachebool:4,inusernamestr:4,inuserstr:4,invalue:[4,10],inverticalpxint:10,inwaitaftersecfloat:[11,13,14],inwaitcallbackchunkbool:15,inwaitcallbackstopbool:15,inwaitintervalsecfloat:[10,14],inwaitsecfloat:[10,14],inwaitsecs:9,inwaitstream:15,inweekdaylist:4,inwidthint:14,inwidthpxint:4,inx:9,inxint:[13,14],iny:9,inyint:[13,14],ipynb:16,is_checked:9,is_child:9,is_dialog:9,is_enabled:9,is_linux_bool:6,is_single_selection:9,is_visible:9,is_windows_bool:6,isdown:11,islistenbool:5,isresponsiblebool:4,issafestop:19,isstopsafe:19,item:[5,9],item_count:9,item_data:9,item_texts:9,iterations:5,ivan:[1,4],ivanmaslov:1,javascript:10,jinja2:[1,4],jinja:1,join:[4,6],json:[2,4,5,9],jsrender:1,jupiternotebook:1,jupyter:[1,16],kb2999226:20,kde:0,key:[4,5],key_down:9,key_eng_a:11,key_eng_b:11,key_eng_c:11,key_eng_colon:11,key_eng_d:11,key_eng_e:11,key_eng_f:11,key_eng_g:11,key_eng_h:11,key_eng_i:11,key_eng_j:11,key_eng_k:11,key_eng_l:11,key_eng_layout:11,key_eng_m:11,key_eng_n:11,key_eng_o:11,key_eng_p:11,key_eng_q:11,key_eng_r:11,key_eng_s:11,key_eng_t:11,key_eng_u:11,key_eng_v:11,key_eng_w:11,key_eng_x:11,key_eng_y:11,key_eng_z:11,key_hot_0:11,key_hot_1:11,key_hot_2:11,key_hot_3:11,key_hot_4:11,key_hot_5:11,key_hot_6:11,key_hot_7:11,key_hot_8:11,key_hot_9:11,key_hot_alt_left:11,key_hot_alt_right:11,key_hot_apostrophe:11,key_hot_backspace:11,key_hot_caps_lock:11,key_hot_clear:11,key_hot_colon:11,key_hot_context_menu:11,key_hot_ctrl_left:11,key_hot_ctrl_right:11,key_hot_delete:11,key_hot_down:11,key_hot_end:11,key_hot_enter:11,key_hot_esc:11,key_hot_f10:11,key_hot_f11:11,key_hot_f12:11,key_hot_f13:11,key_hot_f14:11,key_hot_f15:11,key_hot_f16:11,key_hot_f17:11,key_hot_f18:11,key_hot_f19:11,key_hot_f1:11,key_hot_f20:11,key_hot_f21:11,key_hot_f22:11,key_hot_f23:11,key_hot_f24:11,key_hot_f2:11,key_hot_f3:11,key_hot_f4:11,key_hot_f5:11,key_hot_f6:11,key_hot_f7:11,key_hot_f8:11,key_hot_f9:11,key_hot_greater_than:11,key_hot_home:11,key_hot_insert:11,key_hot_left:11,key_hot_less_than:11,key_hot_minus:11,key_hot_num_lock:11,key_hot_numpad_0:11,key_hot_numpad_1:11,key_hot_numpad_2:11,key_hot_numpad_3:11,key_hot_numpad_4:11,key_hot_numpad_5:11,key_hot_numpad_6:11,key_hot_numpad_7:11,key_hot_numpad_8:11,key_hot_numpad_9:11,key_hot_numpad_asterisk:11,key_hot_numpad_delete:11,key_hot_numpad_enter:11,key_hot_numpad_minus:11,key_hot_numpad_plus:11,key_hot_numpad_solidus:11,key_hot_page_down:11,key_hot_page_up:11,key_hot_plus:11,key_hot_print_screen:11,key_hot_right:11,key_hot_scroll_lock:11,key_hot_shift_left:11,key_hot_shift_right:11,key_hot_solidus:11,key_hot_space:11,key_hot_square_bracket_left:11,key_hot_square_bracket_right:11,key_hot_tab:11,key_hot_tilde:11,key_hot_up:11,key_hot_vertical_line:11,key_hot_win_left:11,key_hot_win_right:11,key_rus_layout:11,key_up:9,keyboard:[1,8,9,16,20],keyfilepathstr:5,keys:[4,9],lactivityitem:4,lactivityitemdict:4,lactivitylist:9,lactivityresult:9,laliasstr:4,lang:1,lappearuiolist:10,lapplist:9,last:5,latest:9,layout:11,lbackendstr:9,lbox1:14,lbox2:14,lbox3:14,lbox:14,lboxlist:14,lbrowser1:10,lbrowser2:10,lclipstr:12,lcommentselector:8,ldemobase:8,ldemobasebitint:9,ldemobasebitstr:9,ldemobaseselector:8,ldemobaseuioexistbool:9,ldemobaseuioexistlist:9,ldemobaseuiolist:9,ldemobaseuioselector:9,ldemobaseuioselectorclean:9,ldemobaseuioselectorditry:9,left:[9,13,14],legacy:20,len:5,levelname:5,lfilenamestr:15,lib:4,library:8,license:1,licenses:1,life:5,lifetime:5,lifetimerequestsecfloat:5,lifetimesecfloat:5,line_count:9,line_index:9,line_length:9,link:[4,5],linux:[2,4,6,9,10,12,13,14,15,16,17,20],list:[4,5,9,10,14,15],listbox:9,listen:4,listendict:5,listread:5,livedebugcheckthread:19,lkeyaispressedbool:11,llc:20,llogger:4,lnotepadcancelselector:9,lnotepadokselector:9,loaded:5,localhost:[0,5,6],log:[5,7,19],logger:[4,5,19],loggerdumploghandleradd:5,loggerhandlerdumploglist:5,logging:[4,5,6],login:[4,5,6],logoff:[4,5],logs:[2,5,7],logviewerbool:[5,7],look:[4,5,7],lookmachinescreenshots:5,loops:5,lordernumberselector:8,lotherbitnessprocess:9,lowercase:5,lpoint:14,lprocess:4,lprocessisstartedbool:4,lprocesslist:4,lpy64:0,lpymodules:6,lpyopenrpa_settingsdict:9,lpyopenrpasourcefolderpathstr:6,lrdpitemdict:4,lrec:15,lrequest:4,lresult:[5,14],lresultdict:[4,5],lresultstr:10,lrobotbitint:9,lrunbase:8,lrunbaseselector:8,ltextraw:8,ltextstr:10,lthreadstr:6,ltimestr:8,luacclientdict:6,luio:[9,10],luioelementinfodict:9,luiohierarchylist:9,luioindexint:9,luioinfolist:9,luiolist:[9,10],luioobject:9,luioprocessinfodict:9,luioselectorstr:10,lwebauditmessagestr:4,lwrapperobject:9,mabspathupperstr:5,machina:5,machine:[4,5],magenthostnamestr:5,magentusernamestr:5,magicmock:9,mail:10,main:[1,3,5,6],makedirs:5,managers:[4,5],managersgitdict:5,managersprocessdict:5,markdown:20,maslov:[1,4],master:1,matchtype:[4,5],max:5,maxinputchannelsint:15,maxoutputchannelsint:15,mdefaultpywinautobackend:9,message:[4,5],messageboxw:8,messages:19,method:[4,5],methodmatchurl:5,methodmatchurlbeforelist:5,methods:15,mhammond:1,mhandlerdumploglist:5,microsoft:20,middle:[10,13,14],mime:4,minutes:5,mit:1,mme:15,mmstr:5,mock:9,modification:2,module:[4,5,6,19],modulenamestr:4,modules:4,moduletocall:4,monitoring:4,more:[5,6],mouse:[8,14,16,20],mousedown:8,mouseup:8,moveto:[8,13],mp3:15,mprocessnamewoexestr:5,mrobotlogger:5,mrobotloggerfh:5,mrobotloggerformatter:5,msg_box:8,must:5,name:[4,5,6,9],namestr:15,namewoexestr:4,namewoexeupperstr:4,need:[2,11],needed:5,ner:20,newkeydict:4,newkeylist:4,newvalue:4,nlp:20,none:[2,4,5,9,10,11,13,14,15,19],not:[0,4,5,6,11],notebook:1,notebooks:16,notebooksstart:16,notepad:[2,4,9],nothingbool:[5,7],now:[4,5],nth:10,nul:16,numpy:1,object:[5,9],ocr:20,octet:4,off:[5,7],old:5,one:5,only:[5,6],op_code_1:4,open:[5,20],opencv:[1,14,20],openrpa52zzz:6,openrpa:[5,20],openrpaorchestrator:16,opensource:1,operation:4,operations:6,option:[5,7,11],optional:[4,10,11,13,14],orc:[5,7],orch:5,orchestrator:[2,3,4,5,6,20],orchestratorinitwait:4,orchestratorisadmin:[4,6],orchestratorisinited:4,orchestratorloggerget:[4,6],orchestratormain:16,orchestratorpysearchinit:[4,6],orchestratorrerunasadmin:[4,6],orchestratorrestart:4,orchestratorscheduleget:4,orchestratorsessionrestore:[4,6],orchestratorsessionsave:4,orchestratorstart:[5,6],orchestratorthreadstart:4,org:1,oscmd:[2,4],oscredentialsverify:4,osfilebinarydatabase64strappend:2,osfilebinarydatabase64strcreate:2,osfilebinarydatabase64strreceive:2,osfilemtimeget:2,osfiletextdatastrcreate:2,osfiletextdatastrreceive:2,oslogoff:4,osremotepcrestart:[4,5],osrestart:4,out:15,out_00000:15,out_00001:15,output:[2,5],outstr:4,overwrite:5,own:6,packages:4,page:[5,7],pagejsexecute:10,pageopen:10,pagescrollto:10,pallets:1,pane:8,panel:5,panels:[5,6],param:10,parent:9,pass:[4,5,15],password:[4,5],path:[4,5,6,15,16],pathstr:[5,15],pause:[9,16],pay:5,pdb:5,pdf:[1,20],pem:4,period:5,periodically:5,php:1,pickle:4,pid:4,pil:1,pillow:1,pip:[0,14],pixels:5,plaintextresponse:6,png:[4,14],point:20,pointclick:14,pointclickdouble:14,pointcreate:14,pointdown:14,pointmodify:14,pointmoveto:14,pointup:14,popupmenu:9,port:[4,5],portint:5,pos_end:9,pos_start:9,post:[4,5],powershell:5,predicate_func:9,press_mouse_input:9,pressed:9,print:[6,14],process:[2,4,5,9],process_id:9,processbitness:9,processdefintervalcall:4,processdetaillist:4,processisstarted:4,processlistget:4,processor:[2,3,4,5,7],processoractivityitemappend:4,processoractivityitemcreate:4,processoraliasdefcreate:4,processoraliasdefupdate:4,processordict:5,processstart:4,processstop:4,processwoexelist:4,processwoexeupperlist:4,processwoexeupperuserlistget:2,program:[4,5],programs:5,prototype:5,psf:1,psutil:[1,6],pull:[5,7],pulse:10,push:5,pwa:9,pwaspecification_get_pwaapplication:9,pwaspecification_get_uio:9,pyautogui:1,pyopenpra:[9,20],pyopenrpa:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],pyopenrpa_product_service:1,pyopenrpa_support:1,pyopenrpa_uidesktopx32:9,pyopenrpa_uidesktopx64:9,pyopenrpadict:[5,7],pyopenrparesourceswaudio:15,pyopenrparesourceswaudiovbcable_driver_pack43:15,pypathstr:4,pyscreeze:[1,14],python32fullpath:9,python32processname:9,python3:0,python64fullpath:9,python64processname:9,python:[0,1,4,8,9,14,18,20],pythonstart:4,pywin32:1,pywinauto:[1,9],queue:[4,5,7],queuelist:5,quickstart:20,quickstartrobot:16,r01:5,r01_integrationorderout:5,r01_orchestratortorobot:5,radiobutton:9,radiobuttons:9,raised:4,ram:20,raw:15,rdp:[3,4,5,7],rdpactive:5,rdpkey:4,rdpkeydict:[5,7],rdpkeystr:[5,7],rdplist:5,rdpsession:4,rdpsessioncmdrun:4,rdpsessionconnect:[4,5],rdpsessiondisconnect:[4,5],rdpsessionfilestoredrecieve:4,rdpsessionfilestoredsend:4,rdpsessionkey:5,rdpsessionkeystr:5,rdpsessionlogoff:4,rdpsessionmonitorstop:4,rdpsessionprocessstartifnotrunning:4,rdpsessionprocessstop:4,rdpsessionreconnect:[4,5],rdptemplatecreate:4,read:[2,5],readthedocs:[4,5,9],ready:9,recieve:5,recieved:5,reconnect:[4,5],reconnectbool:[5,7],recorder:20,recoverydict:5,rect:9,rectangle:9,red:[9,10,14],redirectclipboardbool:4,reestr_otgruzok:5,refresh:5,relative:[4,5],remember:[5,7],remote:5,replace:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],report:5,reports:5,request:[4,5],requesting:5,requests:[1,5],requesttimeoutsecfloat:5,resolution:5,resources:[0,4,9,16,20],resourceswpy32:16,resourceswpy64:16,response_class:6,responsecontenttype:[4,5],responsedefrequestglobal:[4,5],responsefilepath:[4,5],responsefolderpath:[4,5],responses:6,responsibility:5,responsibilitycheckintervalsec:5,responsible:5,restart:[5,7],restartorchestrator:5,restartorchestratorbool:[5,7],restartorchestratorgitpullbool:[5,7],restartpcbool:[5,7],restore:6,result:[4,5,7],returnbool:5,returnedbydatetime:5,rich_text:9,rich_text_re:9,right:[9,13,14],right_click_input:9,rights:20,robot1:4,robot:[0,5,8,9,10,11,12,13,14,15,16,19,20],robot_r01:5,robot_r01_help:5,robotrdpactive:5,robots:6,rolehierarchyalloweddict:5,root:[5,9],row:5,rpa00:[0,6],rpa:[3,4,5,8,11,14,15,16,17,20],rpatestdirtest:4,rst:1,rtype:10,ruledomainuserdict:5,rulemethodmatchurlbeforelist:5,run:[4,5,6],running:[4,18],runs:5,runtime_id:9,rus:20,safe:2,scan:11,schedule:[1,4,5],scheduler:4,scheduleractivitytimeaddweekly:4,schedulerdict:5,scopesrcul:[4,5],screen:[0,4,5,8,20],screened:5,screenshots:[5,7],screenshotviewerbool:[5,7],scrollhorizontal:13,scrollvertical:13,scrot:[0,14],sec:5,seconds:[4,5],section:4,see:[4,5],select:9,selected_index:9,selected_indices:9,selected_text:9,selection_indices:9,selenium:[1,10],seleniumhq:1,self:9,semantic:1,send:[2,4,5,7,8,11],send_keys:9,sendinput:9,sent:5,server:[2,4,5,6,7,18,20],serverdict:[5,6],serverinstance:5,serversettings:5,serverthread:5,sesion:5,session:[2,4,5],sessionguidstr:5,sessionhex:[4,5],sessionisignoredbool:[4,5],sessioniswindowexistbool:[4,5],sessioniswindowresponsiblebool:[4,5],set:[2,5,12],set_check_indeterminate:9,set_edit_text:[8,9],set_focus:9,set_foreground:9,set_item_focus:9,set_text:9,set_trace:5,set_window_text:9,setformatter:5,setlevel:[5,6],settings:[2,5,6],settingsinit:9,settingstemplate:[5,6],settingsupdate:4,setup:5,setxkbmap:[0,11],shareddrivelist:[4,5],shell:16,shift:11,should:5,show:[5,7],side:[5,7,19],signal:19,simple:4,since:5,site:4,size:5,sleep:[5,8,10,11],snipp:11,software:1,some:[5,7],someprocess:19,sources:[6,20],special:5,split:8,src:9,ssl:4,stable:5,standart:5,staragedict:4,start:[2,4,6,9],started:4,starts:[5,6],startsecfloat:15,statictext:9,status:4,statuscheckstart:4,statusget:15,stdout:5,stop:[4,19],stopsafe:20,storage:[4,5],storagedict:[4,5],storagerobotexists:4,storagerobotget:4,stored:5,str:[2,4,5,9,10,11,12,13,14,15],stream:4,streamhandler:5,strftime:5,strict:14,string:2,struct:5,structure:5,studio:20,studiostart:18,style:8,success:4,successfully:5,sudo:[0,12,14],supertoken:6,superuser:6,support:[1,20],svelte:10,sys:[4,5,6,16],tabcontrol:9,tags:6,taskkill:19,technical:5,technicalsessionguidcache:5,telegram:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],tenchat:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],test2:5,test:[2,4,5,6],testdef:4,testdefalias:4,testdir:4,testdirtest:4,testrdp:5,text:[4,8,9],text_block:9,texts:9,than:5,that:19,the:[2,4,5,6,7,19],there:5,thickness:9,thread:[4,5,6,7,19],threadbool:4,threaded:5,threadidint:5,threading:[4,6],threads:6,thunderrt6textbox:9,thundertextbox:9,thursday:4,time:[2,5,8,10,11],timehh:5,times:5,timestamp:2,title:[8,9],title_re:9,tmemo:9,tokendatetime:5,too:5,tool:5,tools:[5,6,19],top:[9,14],top_level_only:9,top_level_parent:9,tpanel:9,transmition:[2,5],trigger:5,triggercountint:5,trunk:1,ttt:5,turn:[5,7],turn_off_numlock:9,txt:[1,4],type:[5,10],type_keys:9,uac:[4,20],uacbool:[4,5],uackeylistcheck:4,uacsupertokenupdate:[4,6],uacupdate:[4,6],uacuserdictget:4,ubuntu:[0,20],uia:[8,9],uidesktop:[8,16,20],uio:[10,18,20],uio_focushighlight:9,uio_getctrlindex_int:9,uio_highlight:9,uio_wait_interval_sec_float:10,uio_wait_sec_float:10,uioattributeget:10,uioattributeremove:10,uioattributeset:10,uioattributestyleget:10,uioattributestyleremove:10,uioattributestyleset:10,uioclick:10,uioei_convert_uioinfo:9,uioinfo:9,uiomousesearchinit:10,uiomousesearchreturn:10,uioselector:9,uioselector_exist_bool:9,uioselector_focushighlight:9,uioselector_get_bitnessint:9,uioselector_get_bitnessstr:9,uioselector_get_uio:[8,9],uioselector_get_uioactivitylist:9,uioselector_get_uioinfo:9,uioselector_get_uioinfolist:9,uioselector_get_uiolist:9,uioselector_getchildlist_uiolist:9,uioselector_highlight:9,uioselector_safeotherget_process:9,uioselector_searchchildbymouse_uio:9,uioselector_searchchildbymouse_uiotree:9,uioselector_searchprocessnormalize_uioselector:9,uioselector_searchuionormalize_uioselector:9,uioselector_tryrestore_dict:9,uioselector_uio_get:9,uioselectorclick:10,uioselectordetect:10,uioselectorfirst:10,uioselectorhighlight:10,uioselectorlist:10,uioselectorsecs_waitappear_bool:9,uioselectorsecs_waitdisappear_bool:9,uioselectorssecs_waitappear_list:9,uioselectorssecs_waitdisappear_list:9,uioselectoruioactivity_run_dict:9,uioselectorwaitappear:10,uioselectorwaitdisappear:10,uiotextget:10,uioxy_searchchild_listdict:9,uiweb:[8,16,20],uncheck:9,unicode:11,unicodelabs:20,updated:5,updates:5,upper:5,url:[4,5,10],urlindexstr:5,urllist:5,urls:5,usage:4,use:[5,7,19],use_log:9,usecachebool:4,user32:8,user:[4,5,6,7],user_99:4,user_pass_here:4,useradstr:5,username:4,usernameupperstr:4,userupperstr:5,utf:[2,4],utils:[0,5,9,11,20],v228:1,v8toplevelframesdi:8,v8toplevelframetaxistarter:[8,9],value:5,valueerror:[13,14],variable:4,verification:1,verify:9,verify_actible:9,verify_enabled:9,verify_visible:9,version:4,versionstr:5,viewer:[5,7],virtual:5,visible:9,visible_only:9,vista:20,vk_packet:9,vladick:6,vms:4,voice:20,wait:[2,9,11,19],wait_not:9,want:[5,7],warning:5,warningexecutionmorethansecfloat:5,was:[2,5],was_maximized:9,wasapi:15,wav:15,way:6,wdm:15,web:[3,4,5,9,10,16,20],webaudit:4,webauditmessagecreate:4,webcpupdate:4,webdriver:10,webelement:10,weblistencreate:[4,6],webrequestget:4,webrequesthostget:4,webrequestparsebodybytes:4,webrequestparsebodyjson:4,webrequestparsebodystr:4,webrequestparsefile:4,webrequestparsepath:4,webrequestresponsesend:4,weburlconnectdef:4,weburlconnectfile:4,weburlconnectfolder:4,weburlindexchange:4,webuserdomainget:4,webuserinfoget:4,webuserissupertoken:4,webuserloginget:4,webuseruaccheck:4,webuseruachierarchyget:4,wednesday:4,weekday:5,weekdaylist:5,wexe:4,whatsapp:[1,15],wheel_dist:9,wheel_mouse_input:9,when:[4,5],which:5,who:5,width:[4,5,9,14],wiki:8,will:[2,4,5,6],win32:[8,9,20],win32api:1,win32defines:9,win32structures:9,win:8,windll:8,window:[2,5],window_text:9,windowclasses:9,windows:[2,4,6,9,10,11,12,13,14,15,16,17,20],windowsforms:9,winpython:1,with_newlines:9,with_spaces:9,with_tabs:9,without:[4,5],wm_close:19,wmi:1,working:[4,15,19],workingdirectorypathstr:5,works:5,world:[10,11,12],wpy32:[0,9,16],wpy64:[0,4,9],write:[8,11],www:1,x11:[0,11],x32:[0,9],x64:[0,9,15],xclip:[0,12],xkb:[0,11],xlsx:5,xpath:10,yellow:10,you:[2,4,5,6,7,19],your:[5,16],zip:15,zoom:15},titles:["1. \u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a (Windows & Linux)","2. \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f & \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Agent","1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438","3. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 GSettings (\u0448\u0430\u0431\u043b\u043e\u043d)","4. \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?","5. \u041f\u0440\u0430\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 UAC","1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 UIDesktop","3. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 UIWeb","4. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Keyboard","5. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Clipboard","6. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Mouse","7. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Screen","8. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 Audio","9. \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?","1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","2. \u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c?","2. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 StopSafe","\u041f\u043e\u0440\u0442\u0430\u043b \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 pyOpenRPA"],titleterms:{"\u0430\u0432\u0442\u043e\u0440":1,"\u0430\u0433\u0435\u043d\u0442":20,"\u0430\u043a\u0442\u0438\u0432\u043d":4,"\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440":3,"\u0431\u0443\u0434\u0435\u0442":18,"\u0431\u0443\u0434\u0443\u0442":18,"\u0431\u044b\u0441\u0442\u0440":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],"\u0432":[11,18],"\u0433\u0435\u043d\u0435\u0440\u0430\u043b\u044c\u043d":1,"\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d":3,"\u0434\u0435\u0439\u0441\u0442\u0432":18,"\u0434\u0435\u0440\u0435\u0432":18,"\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440":1,"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446":20,"\u0434\u043e\u043f":11,"\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d":11,"\u0434\u043e\u0440\u043e\u0433":20,"\u0434\u043e\u0441\u0442\u0443\u043f":7,"\u0435\u0434\u0438\u043d":3,"\u0437\u0430\u0436\u0430":18,"\u0437\u0430\u043f\u0443\u0441\u043a":[0,16],"\u0437\u0430\u043f\u0443\u0441\u0442":[6,16,18],"\u0438":[18,20],"\u0438\u0432\u0430":1,"\u0438\u0437":[16,20],"\u0438\u0437\u0432\u043b\u0435\u0447":18,"\u0438\u043d\u0442\u0435\u0440\u0435\u0441":18,"\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440":16,"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430":[6,16,18],"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d":11,"\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c":1,"\u0438\u0442\u043e\u0433":18,"\u043a\u0430\u043a":[6,16,18],"\u043a\u043b\u0430\u0432\u0438\u0448":[11,18],"\u043a\u043b\u0430\u0441\u0441":[14,15],"\u043a\u043b\u0438\u0435\u043d\u0442":1,"\u043a\u043d\u043e\u043f\u043a":18,"\u043a\u043e\u0434":11,"\u043a\u043e\u043b\u043b\u0435\u0433":20,"\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442":1,"\u043a\u043e\u043d\u0442\u0430\u043a\u0442":1,"\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d":6,"\u043a\u043e\u043d\u0446\u0435\u043f\u0446":3,"\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d":0,"\u043a\u043e\u0442\u043e\u0440":18,"\u043a\u0443\u0440\u0441\u043e\u0440":18,"\u043b\u0438\u0446\u0435\u043d\u0437":[1,20],"\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d":1,"\u043c\u0430\u0441\u043b":1,"\u043c\u043e\u0434\u0443\u043b":20,"\u043c\u044b\u0448":18,"\u043d\u0430":18,"\u043d\u0430\u0432\u0435\u0434\u0435\u043d":18,"\u043d\u0430\u0432\u0435\u0441\u0442":18,"\u043d\u0430\u0432\u0438\u0433\u0430\u0446":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20],"\u043d\u0430\u0436\u0430":18,"\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a":3,"\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a":[5,11],"\u043e":20,"\u043e\u0431\u043b\u0430\u0441\u0442":14,"\u043e\u0431\u0449":[2,3,4,5,8,9,10,11,13,14,15,17,18,20],"\u043e\u0431\u044a\u0435\u043a\u0442":18,"\u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d":20,"\u043e\u043e":1,"\u043e\u043f":1,"\u043e\u043f\u0438\u0441\u0430\u043d":[2,3,7,8,9,10,11,12,13,14,15,17,18],"\u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440":20,"\u043e\u0442\u043e\u0431\u0440\u0430\u0436":18,"\u043f\u0435\u0440\u0432":0,"\u043f\u043e":18,"\u043f\u043e\u0434":16,"\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a":1,"\u043f\u043e\u0438\u0441\u043a":18,"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b":7,"\u043f\u043e\u0440\u0442\u0430":20,"\u043f\u043e\u0440\u0442\u0430\u043b":20,"\u043f\u0440\u0430\u0432":7,"\u043f\u0440\u0430\u0432\u043e\u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b":1,"\u043f\u0440\u0438\u043c\u0435\u0440":[8,11],"\u043f\u0440\u043e\u0432\u0435\u0440":0,"\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c":20,"\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442":0,"\u0440\u0430\u0437\u0434\u0435\u043b":20,"\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440":20,"\u0440\u043e\u0431\u043e\u0442":[16,20],"\u0440\u043f\u0430":1,"\u0441\u0432\u043e\u0439\u0441\u0442\u0432":18,"\u0441\u0435\u043a\u0443\u043d\u0434":18,"\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440":9,"\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d":14,"\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442":18,"\u0441\u043a\u0440\u0438\u043f\u0442":16,"\u0441\u043b\u0435\u0434":20,"\u0441\u043b\u043e\u0432\u0430\u0440":3,"\u0441\u043e\u0441\u0442\u043e":20,"\u0441\u0442\u043e\u0440\u043e\u043d":1,"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440":[5,20],"\u0441\u0442\u0443\u0434":[18,20],"\u0442\u0430\u043a":4,"\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a":20,"\u0442\u043e\u0447\u043a":14,"\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d":20,"\u0443\u043a\u0430\u0437\u0430\u043d":14,"\u0444\u0430\u0439\u043b":[6,16],"\u0444\u0443\u043d\u043a\u0446":[2,4,9,10,11,12,13,14,15,19],"\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d":11,"\u0446\u0435\u043d\u0442\u0440":1,"\u0447\u0438\u0441\u0442\u043e\u0442":1,"\u0447\u0442\u043e":[0,4],"\u0448\u0430\u0431\u043b\u043e\u043d":5,"for":7,activityitem:4,agent:2,and:18,are:18,audio:15,box:14,choose:18,click:18,clipboard:12,cmd:16,config:6,ctrl:18,dict:7,execute:16,expand:18,gsettings:[3,5],inanchorrulestr:14,inpointrulestr:14,interested:18,keyboard:11,linux:[0,11],list:18,mouse:[13,18],object:18,orchestrator:7,point:14,property:18,pyopenrpa:[0,20],python:16,quickstart:16,recorder:15,rights:7,screen:14,script:16,search:18,selected:18,stopsafe:19,the:18,tree:18,uac:7,uidesktop:9,uio:9,uiweb:10,viewer:18,web:7,wiki:20,windows:0,x32:16,x64:16,you:18}}) \ No newline at end of file diff --git a/Wiki/RUS_Guide/markdown/01_HowToInstall.md b/Wiki/RUS_Guide/markdown/01_HowToInstall.md index d1fb3acb..15926459 100755 --- a/Wiki/RUS_Guide/markdown/01_HowToInstall.md +++ b/Wiki/RUS_Guide/markdown/01_HowToInstall.md @@ -96,4 +96,4 @@ * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/03_Copyrights_Contacts.md b/Wiki/RUS_Guide/markdown/03_Copyrights_Contacts.md index 41aa994d..ddc7b527 100755 --- a/Wiki/RUS_Guide/markdown/03_Copyrights_Contacts.md +++ b/Wiki/RUS_Guide/markdown/03_Copyrights_Contacts.md @@ -145,4 +145,4 @@ pyOpenRPA - роботы Вам помогут! * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Agent/02_Defs.md b/Wiki/RUS_Guide/markdown/Agent/02_Defs.md index 027a654f..59814711 100755 --- a/Wiki/RUS_Guide/markdown/Agent/02_Defs.md +++ b/Wiki/RUS_Guide/markdown/Agent/02_Defs.md @@ -203,4 +203,4 @@ L-,W+: Вернуть список процессов, запущенных по * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Orchestrator/01_Orchestrator.md b/Wiki/RUS_Guide/markdown/Orchestrator/01_Orchestrator.md index 0ea79a3c..1199438d 100755 --- a/Wiki/RUS_Guide/markdown/Orchestrator/01_Orchestrator.md +++ b/Wiki/RUS_Guide/markdown/Orchestrator/01_Orchestrator.md @@ -30,6 +30,10 @@ * Функциональность очередей для координации роботов +В качестве основы для web сервера используется один из самых прогрессивных и производительных фреймворков от FastAPI. + +Пример использования FastAPI см. в GIT/Orchestrator/config.py + ## Концепция единого глобального словаря настроек (GSettings) pyOpenRPA - это сложное решение, которое направлено на упрощение жизни пользователей и разработчиков роботов. @@ -99,4 +103,4 @@ pyOpenRPA - роботы помогут! * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Orchestrator/02_Defs.md b/Wiki/RUS_Guide/markdown/Orchestrator/02_Defs.md index 5eed251a..2004b9db 100755 --- a/Wiki/RUS_Guide/markdown/Orchestrator/02_Defs.md +++ b/Wiki/RUS_Guide/markdown/Orchestrator/02_Defs.md @@ -411,9 +411,9 @@ __Orchestrator__.OSCMD(inCMDStr = "git status", inRunAsyncBool=True) | | `UACKeyListCheck`(inRequest, inRoleKeyList) - | L+,W+: Проверить права доступа для пользователя запроса по списку ключей до права. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. - | + | | `UACSuperTokenUpdate`(inSuperTokenStr[, …]) | L+,W+: Добавить супертокен (полный доступ). @@ -426,14 +426,14 @@ __Orchestrator__.OSCMD(inCMDStr = "git status", inRunAsyncBool=True) | | `UACUserDictGet`(inRequest) - | L+,W+: Вернуть UAC (User Access Control) словарь доступов для пользователя, который отправил запрос. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. - | -| `WebAuditMessageCreate`([inRequest, …]) + | +| `WebAuditMessageCreate`([inAuthTokenStr, …]) - | L+,W+: Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). + | L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). - | + | | `WebCPUpdate`(inCPKeyStr[, inHTMLRenderDef, …]) | L+,W+: Добавить панель управления робота в Оркестратор. @@ -446,39 +446,44 @@ __Orchestrator__.OSCMD(inCMDStr = "git status", inRunAsyncBool=True) | | `WebRequestGet`() - | L+,W+: Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2] Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя. - | -| `WebRequestParseBodyBytes`([inRequest]) + | +| `WebRequestHostGet`(inRequest) - | L+,W+: Извлечь данные в байт виде из тела (body) HTTP запроса. + | L+,W+: Получить наименование хоста, с которого поступил запрос | +| `WebRequestParseBodyBytes`([inRequest]) + + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. + + | | `WebRequestParseBodyJSON`([inRequest]) - | L+,W+: Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. - | + | | `WebRequestParseBodyStr`([inRequest]) - | L+,W+: Извлечь данные в виде строки из тела (body) HTTP запроса. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. - | + | | `WebRequestParseFile`([inRequest]) - | L+,W+: Извлечь файл (наименование + содержимое в виде строки байт b““) из HTTP запроса пользователя. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. - | + | | `WebRequestParsePath`([inRequest]) - | L+,W+: Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. - | + | | `WebRequestResponseSend`(inResponeStr[, …]) - | L+,W+: Установить ответ на HTTP запрос пользователя. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. - | + | | `WebURLConnectDef`(inMethodStr, inURLStr, …) | L+,W+: Подключить функцию Python к URL. @@ -499,21 +504,36 @@ __Orchestrator__.OSCMD(inCMDStr = "git status", inRunAsyncBool=True) | L+,W+: Изменить адрес главной страницы Оркестратора. | +| `WebUserDomainGet`([inAuthTokenStr]) + + | L+,W+: Получить домен авторизованного пользователя. + + | | `WebUserInfoGet`([inRequest]) - | L+,W+: Информация о пользователе, который отправил HTTP запрос. + | L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. - | -| `WebUserIsSuperToken`([inRequest, inGSettings]) + | +| `WebUserIsSuperToken`([inAuthTokenStr]) - | L+,W+: Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает). + | L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает). - | -| `WebUserUACHierarchyGet`([inRequest]) + | +| `WebUserLoginGet`([inAuthTokenStr]) - | L+,W+: Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest + | L+,W+: Получить логин авторизованного пользователя. - | + | +| `WebUserUACCheck`([inAuthTokenStr, inKeyList]) + + | L+,W+: Проверить UAC доступ списка ключей для пользователя + + | +| `WebUserUACHierarchyGet`([inAuthTokenStr]) + + | L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest + + | ### pyOpenRPA.Orchestrator.__Orchestrator__.ActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr=None, inThreadBool=False) L+,W+: Создать Активность (ActivityItem). Активность можно использовать в ProcessorActivityItemAppend или в Processor.ActivityListExecute или в функциях работы с Агентами. @@ -790,7 +810,7 @@ L+,W+: Выполнить проверку, что активность (Activit -### pyOpenRPA.Orchestrator.__Orchestrator__.AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat=0.5, inGSettings=None) +### pyOpenRPA.Orchestrator.__Orchestrator__.AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat=0.5, inGSettings=None, inTimeoutSecFloat=None) L+,W+: Ожидает появления результата по активности (ActivityItem). Возвращает результат выполнения активности. !ВНИМАНИЕ! Замораживает поток, пока не будет получен результат. @@ -1419,7 +1439,7 @@ L+,W+: Получить логгер Оркестратора -### pyOpenRPA.Orchestrator.__Orchestrator__.OrchestratorPySearchInit(inGlobPatternStr, inDefStr=None, inDefArgNameGSettingsStr=None, inAsyncInitBool=False) +### pyOpenRPA.Orchestrator.__Orchestrator__.OrchestratorPySearchInit(inGlobPatternStr, inDefStr=None, inDefArgNameGSettingsStr=None, inAsyncInitBool=False, inPackageLevelInt=0) L+,W+: Выполнить поиск и инициализацию пользовательских .py файлов в Оркестраторе (например панелей управления роботов) Добавляет инициализированный модуль в пространство sys.modules как imported (имя модуля = имя файла без расширения). @@ -1461,6 +1481,9 @@ except Exception as e: * **inAsyncInitBool** – ОПЦИОНАЛЬНО True - Инициализация py модулей в отдельных параллельных потоках - псевдопараллельное выполнение. False - последовательная инициализация + * **inPackageLevelInt** – ОПЦИОНАЛЬНО Уровень вложенности модуля в пакет. По умолчанию 0 (не является модулем пакета) + + * **Результат** @@ -2541,7 +2564,7 @@ L+,W+: Получить содержимое по ключу робота inRobo ### pyOpenRPA.Orchestrator.__Orchestrator__.UACKeyListCheck(inRequest, inRoleKeyList) -L+,W+: Проверить права доступа для пользователя запроса по списку ключей до права. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. WebUserUACCheck] Проверить права доступа для пользователя запроса по списку ключей до права. ``` # ВАРИАНТ ИСПОЛЬЗОВАНИЯ 1 (инициализация модуля py без вызова каких-либо функций внутри) @@ -2617,7 +2640,7 @@ L+,W+: Дообогащение словаря доступа UAC пользов ### pyOpenRPA.Orchestrator.__Orchestrator__.UACUserDictGet(inRequest) -L+,W+: Вернуть UAC (User Access Control) словарь доступов для пользователя, который отправил запрос. Пустой словарь - супердоступ (доступ ко всему) +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. WebUserUACHierarchyGet] Вернуть UAC (User Access Control) словарь доступов для пользователя, который отправил запрос. Пустой словарь - супердоступ (доступ ко всему) * **Параметры** @@ -2632,8 +2655,8 @@ L+,W+: Вернуть UAC (User Access Control) словарь доступов -### pyOpenRPA.Orchestrator.__Orchestrator__.WebAuditMessageCreate(inRequest=None, inOperationCodeStr='-', inMessageStr='-') -L+,W+: Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). Данная функция особенно актуальна в том случае, если требуется реализовать дополнительные меры контроля ИТ системы. +### pyOpenRPA.Orchestrator.__Orchestrator__.WebAuditMessageCreate(inAuthTokenStr: Optional[str] = None, inHostStr: Optional[str] = None, inOperationCodeStr: str = '-', inMessageStr: str = '-') +L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). Данная функция особенно актуальна в том случае, если требуется реализовать дополнительные меры контроля ИТ системы. ``` # ПРИМЕР @@ -2652,7 +2675,10 @@ lLogger.info(lWebAuditMessageStr) * **Параметры** - * **inRequest** – Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя + * **inAuthTokenStr** (*str**, **опционально*) – Токен авторизации пользователя / бота, по умолчанию None (не установлен) + + + * **inHostStr** (*str**, **опционально*) – IP адрес хоста пользователя / бота, по умолчанию None (не установлен) * **inOperationCodeStr** – Код операции, который принят в компании в соответствии с регламентными процедурами @@ -2691,17 +2717,17 @@ L+,W+: Добавить панель управления робота в Орк -### pyOpenRPA.Orchestrator.__Orchestrator__.WebListenCreate(inServerKeyStr='Default', inAddressStr='', inPortInt=80, inCertFilePEMPathStr=None, inKeyFilePathStr=None, inGSettings=None) +### pyOpenRPA.Orchestrator.__Orchestrator__.WebListenCreate(inServerKeyStr='Default', inAddressStr='0.0.0.0', inPortInt=1024, inCertFilePEMPathStr=None, inKeyFilePathStr=None, inGSettings=None) L+,W+: Настроить веб-сервер Оркестратора. * **Параметры** - * **inAddressStr** – IP адрес для прослушивания. Если «», то прослушивать запросы со всех сетевых карт. Если «127.0.0.1», то слушать запросы только с той ОС, на которой работает Оркестратор + * **inAddressStr** – IP адрес для прослушивания. Если «0.0.0.0», то прослушивать запросы со всех сетевых карт. Если «127.0.0.1», то слушать запросы только с той ОС, на которой работает Оркестратор - * **inPortInt** – Номер порта для прослушивания. Если HTTP - 80; Если HTTPS - 443. По умолчанию 80. Допускается установка других портов + * **inPortInt** – Номер порта для прослушивания. Если HTTP - 80; Если HTTPS - 443. По умолчанию 1024 (Связано с тем, что в линукс можно устанавливать порты выше 1000). Допускается установка других портов * **inCertFilePEMPathStr** – Путь файлу сертификата, сгенерированного в .pem (base64) формате. Обязателен при использовании защищенного HTTPS/SSL соединения. @@ -2720,11 +2746,33 @@ L+,W+: Настроить веб-сервер Оркестратора. ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestGet() -L+,W+: Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2] Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя. + + +### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestHostGet(inRequest) +L+,W+: Получить наименование хоста, с которого поступил запрос + + +* **Параметры** + + **inRequest** (*fastapi.Request**, **опционально*) – Экземпляр fastapi.Request, по умолчанию None + + + +* **Результат** + + Наименование хоста + + + +* **Тип результата** + + str + ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestParseBodyBytes(inRequest=None) -L+,W+: Извлечь данные в байт виде из тела (body) HTTP запроса. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь данные в байт виде из тела (body) HTTP запроса. * **Параметры** @@ -2740,7 +2788,7 @@ L+,W+: Извлечь данные в байт виде из тела (body) HTT ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestParseBodyJSON(inRequest=None) -L+,W+: Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python. * **Параметры** @@ -2756,7 +2804,7 @@ L+,W+: Извлечь из тела (body) запроса HTTP JSON данные ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestParseBodyStr(inRequest=None) -L+,W+: Извлечь данные в виде строки из тела (body) HTTP запроса. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь данные в виде строки из тела (body) HTTP запроса. * **Параметры** @@ -2772,7 +2820,7 @@ L+,W+: Извлечь данные в виде строки из тела (body) ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestParseFile(inRequest=None) -L+,W+: Извлечь файл (наименование + содержимое в виде строки байт b““) из HTTP запроса пользователя. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь файл (наименование + содержимое в виде строки байт b““) из HTTP запроса пользователя. * **Параметры** @@ -2788,7 +2836,7 @@ L+,W+: Извлечь файл (наименование + содержимое ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestParsePath(inRequest=None) -L+,W+: Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки. * **Параметры** @@ -2804,7 +2852,7 @@ L+,W+: Извлечь декодированный URL путь из HTTP зап ### pyOpenRPA.Orchestrator.__Orchestrator__.WebRequestResponseSend(inResponeStr, inRequest=None, inContentTypeStr: Optional[str] = None, inHeadersDict: Optional[dict] = None) -L+,W+: Установить ответ на HTTP запрос пользователя. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.1, см. FASTAPI] Установить ответ на HTTP запрос пользователя. * **Параметры** @@ -2923,8 +2971,30 @@ L+,W+: Изменить адрес главной страницы Оркест +### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserDomainGet(inAuthTokenStr: Optional[str] = None) +L+,W+: Получить домен авторизованного пользователя. Если авторизация не производилась - вернуть None + + +* **Параметры** + + **inAuthTokenStr** (*str**, **опционально*) – Токен авторизации пользователя / бота, по умолчанию None (не установлен) + + + +* **Результат** + + Домен пользователя + + + +* **Тип результата** + + str + + + ### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserInfoGet(inRequest=None) -L+,W+: Информация о пользователе, который отправил HTTP запрос. +L+,W+: [ПРЕКРАЩЕНИЕ ПОДДЕРЖКИ В 1.3.2, см. WebUserLoginGet, WebUserDomainGet] Информация о пользователе, который отправил HTTP запрос. * **Параметры** @@ -2939,33 +3009,73 @@ L+,W+: Информация о пользователе, который отпр -### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserIsSuperToken(inRequest=None, inGSettings=None) -L+,W+: Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает). +### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserIsSuperToken(inAuthTokenStr: Optional[str] = None) +L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает). * **Параметры** - - * **inRequest** – Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя + **inAuthTokenStr** (*str**, **опционально*) – Токен авторизации пользователя / бота, по умолчанию None (не установлен) - * **inGSettings** – Глобальный словарь настроек Оркестратора (синглтон) + +* **Результат** + + True - является супертокеном; False - не является супертокеном; None - авторизация не производилась + + + +### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserLoginGet(inAuthTokenStr: Optional[str] = None) +L+,W+: Получить логин авторизованного пользователя. Если авторизация не производилась - вернуть None + + +* **Параметры** + + **inAuthTokenStr** (*str**, **опционально*) – Токен авторизации пользователя / бота, по умолчанию None (не установлен) * **Результат** - True - является супертокеном; False - не является супертокеном + Логин пользователя + + + +* **Тип результата** + + str -### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserUACHierarchyGet(inRequest=None) -L+,W+: Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest +### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserUACCheck(inAuthTokenStr: Optional[str] = None, inKeyList: Optional[list] = None) +L+,W+: Проверить UAC доступ списка ключей для пользователя * **Параметры** - **inRequest** – Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя + **inAuthTokenStr** (*str**, **опционально*) – Токен авторизации пользователя / бота, по умолчанию None (не установлен) + + + +* **Результат** + + True - доступ имеется, False - доступа нет + + + +* **Тип результата** + + bool + + + +### pyOpenRPA.Orchestrator.__Orchestrator__.WebUserUACHierarchyGet(inAuthTokenStr: Optional[str] = None) +L+,W+: [ИЗМЕНЕНИЕ В 1.3.1] Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest + + +* **Параметры** + + **inAuthTokenStr** (*str**, **опционально*) – Токен авторизации пользователя / бота, по умолчанию None (не установлен) @@ -2994,4 +3104,4 @@ L+,W+: Вернуть словарь доступа UAC в отношении п * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Orchestrator/03_gSettingsTemplate.md b/Wiki/RUS_Guide/markdown/Orchestrator/03_gSettingsTemplate.md index 684f9328..4c3b5c54 100755 --- a/Wiki/RUS_Guide/markdown/Orchestrator/03_gSettingsTemplate.md +++ b/Wiki/RUS_Guide/markdown/Orchestrator/03_gSettingsTemplate.md @@ -394,4 +394,4 @@ def Create(inModeStr="BASIC", inLoggerLevel = None): * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Orchestrator/04_HowToUse.md b/Wiki/RUS_Guide/markdown/Orchestrator/04_HowToUse.md index dcf76d01..91eef360 100755 --- a/Wiki/RUS_Guide/markdown/Orchestrator/04_HowToUse.md +++ b/Wiki/RUS_Guide/markdown/Orchestrator/04_HowToUse.md @@ -7,7 +7,7 @@ **Для этого достаточно (выбрать одно):** -* запустить .cmd файл, расположенный в папке pyOpenRPA по адресу: OrchestratorpyOpenRPA.Orchestrator_x64.cmd +* запустить демо-стэнд: запустить .cmd файл, расположенный в папке pyOpenRPA по адресу: Orchestratorstart.cmd (для Windows) и start.sh (для Linux). Далее перейти в браузер по адресу: [http://localhost:1024](http://localhost:1024) * в свой .py скрипт добавить следующий код (см. ниже) @@ -20,10 +20,80 @@ if __name__ == "__main__": # New init way - allow run as module -m PyOpenRPA.Orc Orchestrator.Orchestrator(inGSettings=gSettings) ``` -## Параметры настройки +## Конфигурационный файл config.py Также вы можете выполнить более тонкую настройку параметров Оркестратора. Ниже пример такой настройки: +``` +import psutil, datetime, logging, os, sys + + +# Config settings +lPyOpenRPASourceFolderPathStr = (r"../Sources") # Path for test pyOpenRPA package + +# Operations +if lPyOpenRPASourceFolderPathStr != "": sys.path.insert(0,os.path.abspath(os.path.join(lPyOpenRPASourceFolderPathStr))) # Path for test pyOpenRPA package + + +# Start import after config the pyOpenRPA folder +from pyOpenRPA.Orchestrator import SettingsTemplate # Import functionallity +from pyOpenRPA.Tools import CrossOS +from pyOpenRPA import Orchestrator # Import orchestrator main +from pyOpenRPA.Orchestrator.Server import app +import threading + +from fastapi import Depends +from fastapi.responses import PlainTextResponse +from fastapi.responses import FileResponse + + + + + +# Пример создания функции на сервере (FASTAPI) /test/threads +@app.get(path="/test/threads",tags=["Test"],response_class=PlainTextResponse) +def Threads():# inAuthDict:dict=Depends(IdentifyAuthorize) +#def Threads(inAuthDict:dict=Depends(IdentifyAuthorize)):# Используй, если требуется авторизация + lThreadStr = "" + for thread in threading.enumerate(): + lThreadStr+=f"ПОТОК: {thread.name}\n" + #print(thread.name) + return lThreadStr + + +#Run as administrator (ONLY FOR WINDOWS) +if not Orchestrator.OrchestratorIsAdmin() and CrossOS.IS_WINDOWS_BOOL: + Orchestrator.OrchestratorRerunAsAdmin() + print(f"Orchestrator will be run as administrator!") +else: + gSettings = Orchestrator.GSettingsGet() + #gSettings = SettingsTemplate.Create(inModeStr="BASIC") # Create GSettings with basic configuration - no more config is available from the box - you can create own + Orchestrator.OrchestratorLoggerGet().setLevel(logging.INFO) + # TEST Add User ND - Add Login ND to superuser of the Orchestrator + lUACClientDict = SettingsTemplate.__UACClientAdminCreate__() + gSettings["ServerDict"]["AccessUsers"]["FlagCredentialsAsk"]=False + Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="ND", inADStr="", inADIsDefaultBool=True, inURLList=[], inRoleHierarchyAllowedDict=lUACClientDict) + Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="rpa00", inADStr="", inADIsDefaultBool=True, inURLList=[], inRoleHierarchyAllowedDict=lUACClientDict) + # TEST Add User IMaslov - Add Login IMaslov to superuser of the Orchestrator + Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="VLADICK", inADStr="", inADIsDefaultBool=True, inURLList=[]) + # TEST Add Supertoken for the all access between robots + Orchestrator.UACSuperTokenUpdate(inGSettings=gSettings, inSuperTokenStr="1992-04-03-0643-ru-b4ff-openrpa52zzz") + # Add first interface! + if CrossOS.IS_WINDOWS_BOOL: + Orchestrator.WebListenCreate(inGSettings=gSettings, inPortInt=1024) + if CrossOS.IS_LINUX_BOOL: + Orchestrator.WebListenCreate(inGSettings=gSettings, inPortInt=1024) + # Restore DUMP + Orchestrator.OrchestratorSessionRestore(inGSettings=gSettings) + # Autoinit control panels starts with CP_ + lPyModules = Orchestrator.OrchestratorPySearchInit(inGlobPatternStr="Demo\\*\\config.py", inAsyncInitBool=True) + # Call the orchestrator def + Orchestrator.Orchestrator(inGSettings=gSettings, inDumpRestoreBool=False) + + + +``` + ## Быстрая навигация @@ -44,4 +114,4 @@ if __name__ == "__main__": # New init way - allow run as module -m PyOpenRPA.Orc * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Orchestrator/05_UAC.md b/Wiki/RUS_Guide/markdown/Orchestrator/05_UAC.md index 302cb5e6..335b1170 100755 --- a/Wiki/RUS_Guide/markdown/Orchestrator/05_UAC.md +++ b/Wiki/RUS_Guide/markdown/Orchestrator/05_UAC.md @@ -74,4 +74,4 @@ UAC Dict for pyOpenRPA Orchestrator WEB UI rights. * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/01_Robot.md b/Wiki/RUS_Guide/markdown/Robot/01_Robot.md index 61379704..dd5a4146 100755 --- a/Wiki/RUS_Guide/markdown/Robot/01_Robot.md +++ b/Wiki/RUS_Guide/markdown/Robot/01_Robot.md @@ -33,6 +33,12 @@ * Screen: инструменты взаимодействия с эраном рабочего стола. Перейти к описанию функций: 7. Функции Screen + +* **Уровень доступа к звуковым каналам передачи данных (микрофон, динамик)** + + + * Audio: инструменты взаимодействия с аудио. Перейти к описанию функций: 8. Функции Audio + Дорогие коллеги! Мы знаем, что с pyOpenRPA вы сможете существенно улучшить качество вашего бизнеса. Платформа роботизации pyOpenRPA - это разработка, которая дает возможность делать виртуальных сотрудников (программных роботов RPA) выгодными, начиная от эффекта всего в **10 тыс. руб.** И управлять ими будете только Вы! @@ -151,4 +157,4 @@ Mouse.mouseUp() * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/02_uidesktop.md b/Wiki/RUS_Guide/markdown/Robot/02_uidesktop.md index 5b21c250..98f9000d 100755 --- a/Wiki/RUS_Guide/markdown/Robot/02_uidesktop.md +++ b/Wiki/RUS_Guide/markdown/Robot/02_uidesktop.md @@ -1530,4 +1530,4 @@ UIDesktop.Utils.ProcessBitness.SettingsInit(lPyOpenRPA_SettingsDict) * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/03_uiweb.md b/Wiki/RUS_Guide/markdown/Robot/03_uiweb.md index bf273faa..8e34b9e7 100755 --- a/Wiki/RUS_Guide/markdown/Robot/03_uiweb.md +++ b/Wiki/RUS_Guide/markdown/Robot/03_uiweb.md @@ -279,7 +279,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeGet(inUIO=lUIO, inAttributeStr = "href") UIWeb.BrowserClose() ``` @@ -316,7 +316,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeRemove(lUIO, "href") UIWeb.BrowserClose() ``` @@ -341,7 +341,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeSet(inUIO=lUIO, inAttributeStr = "href", inValue = "https://mail.ru") UIWeb.BrowserClose() ``` @@ -369,7 +369,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeStyleGet(inUIO=lUIO, inAttributeStr = "href") UIWeb.BrowserClose() ``` @@ -406,7 +406,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeStyleRemove(lUIO, "color") UIWeb.BrowserClose() ``` @@ -431,7 +431,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIWeb.UIOAttributeStyleSet(inUIO=lUIO, inAttributeStr = "color", inValue = "grey") UIWeb.BrowserClose() ``` @@ -459,7 +459,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] UIOClick(inUIO = lUIO) UIWeb.BrowserClose() ``` @@ -524,7 +524,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -UIOSelectorClick(inUIOSelectorStr = lUIOSelectorStr) +UIWeb.UIOSelectorClick(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() ``` @@ -543,7 +543,7 @@ L+,W+: Идентифицировать стиль селектора (CSS ил from pyOpenRPA.Robot import UIWeb lUIOSelectorStr = "#grid > div.grid-middle > div.grid__main-col.svelte-2y66pa > div.grid_newscol.grid_newscol__more-pulse.svelte-1yvqfic > div.grid__ccol.svelte-1yvqfic > ul > li:nth-child(5) > div > a" lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lResultStr = UIOSelectorDetect(inUIOSelectorStr = lUIOSelectorStr) +lResultStr = UIWeb.UIOSelectorDetect(inUIOSelectorStr = lUIOSelectorStr) ``` @@ -574,7 +574,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorFirst(inUIOSelectorStr = lUIOSelectorStr) +lUIO = UIWeb.UIOSelectorFirst(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() ``` @@ -610,7 +610,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -UIOSelectorHighlight(inUIOSelectorStr = lUIOSelectorStr) +UIWeb.UIOSelectorHighlight(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() ``` @@ -640,7 +640,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIOList = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr) +lUIOList = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() ``` @@ -676,7 +676,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lAppearUIOList = UIOSelectorWaitAppear(inUIOSelectorStr = lUIOSelectorStr) +lAppearUIOList = UIWeb.UIOSelectorWaitAppear(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() ``` @@ -721,7 +721,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -UIOSelectorWaitDisappear(inUIOSelectorStr = lUIOSelectorStr) +UIWeb.UIOSelectorWaitDisappear(inUIOSelectorStr = lUIOSelectorStr) UIWeb.BrowserClose() ``` @@ -754,7 +754,7 @@ from pyOpenRPA.Robot import UIWeb UIWeb.BrowserChromeStart() UIWeb.PageOpen("https://mail.ru") lUIOSelectorStr = "//*[@id="grid"]/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a" -lUIO = UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] +lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0] lTextStr = UIWeb.UIOTextGet(inUIO=lUIO) UIWeb.BrowserClose() ``` @@ -797,4 +797,4 @@ UIWeb.BrowserClose() * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/04_keyboard.md b/Wiki/RUS_Guide/markdown/Robot/04_keyboard.md index 17bf96a7..17c65f5e 100755 --- a/Wiki/RUS_Guide/markdown/Robot/04_keyboard.md +++ b/Wiki/RUS_Guide/markdown/Robot/04_keyboard.md @@ -110,6 +110,8 @@ L+,W+: Нажать (опустить) клавишу. Если клавиша ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! +ВНИМАНИЕ! ФУНКЦИЯ МОЖЕТ ОТРАБОТАТЬ НЕКОРРЕКТНО В ТОМ СЛУЧАЕ, ЕСЛИ ДЕЙСТВИЕ ПРОИСХОДИТ СРАЗУ ПОСЛЕ НАЖАТИЯ КЛАВИШИ ENTER (ИСПОЛЬЗУЙТЕ SLEEP) + ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard @@ -245,6 +247,8 @@ L+,W+: Отпустить (поднять) клавишу. Если клавиш ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! +ВНИМАНИЕ! ФУНКЦИЯ МОЖЕТ ОТРАБОТАТЬ НЕКОРРЕКТНО В ТОМ СЛУЧАЕ, ЕСЛИ ДЕЙСТВИЕ ПРОИСХОДИТ СРАЗУ ПОСЛЕ НАЖАТИЯ КЛАВИШИ ENTER (ИСПОЛЬЗУЙТЕ SLEEP) + ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard @@ -512,4 +516,4 @@ Keyboard.send(57) * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/05_clipboard.md b/Wiki/RUS_Guide/markdown/Robot/05_clipboard.md index 725e5138..61a340d5 100755 --- a/Wiki/RUS_Guide/markdown/Robot/05_clipboard.md +++ b/Wiki/RUS_Guide/markdown/Robot/05_clipboard.md @@ -78,4 +78,4 @@ lClipStr = Clipboard.Set(inTextStr="HELLO WORLD") * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/06_mouse.md b/Wiki/RUS_Guide/markdown/Robot/06_mouse.md index fb2dceab..814fd798 100755 --- a/Wiki/RUS_Guide/markdown/Robot/06_mouse.md +++ b/Wiki/RUS_Guide/markdown/Robot/06_mouse.md @@ -267,4 +267,4 @@ Mouse.Up(inButtonStr:str='right') #Поднять правую клавишу м * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/07_screen.md b/Wiki/RUS_Guide/markdown/Robot/07_screen.md index 7c37297e..fc057705 100755 --- a/Wiki/RUS_Guide/markdown/Robot/07_screen.md +++ b/Wiki/RUS_Guide/markdown/Robot/07_screen.md @@ -900,4 +900,4 @@ Screen.PointUp(lPoint) * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/08_audio.md b/Wiki/RUS_Guide/markdown/Robot/08_audio.md new file mode 100644 index 00000000..53a04da6 --- /dev/null +++ b/Wiki/RUS_Guide/markdown/Robot/08_audio.md @@ -0,0 +1,306 @@ +# 8. Функции Audio + +!ВНИМАНИЕ! ДЛЯ КОРРЕКТНОЙ РАБОТЫ МОДУЛЯ ТРЕБУЕТСЯ КОМПОНЕНТ ffmpeg.exe (Для Windows x64 можно найти в pyOpenRPAResourcesWAudio). На него должен указывать один из путей в переменной окружения PATH. Или ffmpeg.exe должен быть расположен в рабочей директории (working directory) + +!ВНИМАНИЕ! ДЛЯ ВИРТУАЛЬНОЙ МАШИНЫ МОЖЕТ ПОТРЕБОВАТЬСЯ КОМПОНЕНТ ВИРТУАЛЬНОГО АУДИОДРАЙВЕРА (Для Windows x64 можно найти в pyOpenRPAResourcesWAudioVBCABLE_Driver_Pack43.zip) + +## Общее + +Дорогие коллеги! + +Мы знаем, что с pyOpenRPA вы сможете существенно улучшить качество вашего бизнеса. Платформа роботизации pyOpenRPA - это разработка, которая дает возможность делать виртуальных сотрудников (программных роботов RPA) выгодными, начиная от эффекта всего в **10 тыс. руб.** И управлять ими будете только Вы! + +Если у вас останутся вопросы, то вы всегда можете обратиться в центр поддержки клиентов pyOpenRPA. Контакты: 2. Лицензия & Контакты + +pyOpenRPA - роботы помогут! + +## Класс Recorder + +Экземпляр класса pyOpenRPA.Robot.Audio.Recorder, который обеспечивает захват звука (с микрофона или из приложений) и сохраняет в виде аудиофайла (множества аудиофайлов) + +## Описание функций + +Описание каждой функции начинается с обозначения L-,W+, что означает, что функция не поддерживается в ОС Linux (L) и поддерживается в Windows (W) + +**Functions:** + +| `DeviceListGet`() + + | L-,W+: Вернуть список аудио устройст (входящих и исходящих, микрофонов и динамиков). + + | +| `DeviceMicrophoneIndex`() + + | L-,W+: Выполнить поиск устройства, с помощью которого можно будет выполнить захват c микрофона. + + | +| `DeviceSystemSoundIndex`() + + | L-,W+: Выполнить поиск устройства, с помощью которого можно будет выполнить захват аудио, которое поступает из приложений. + + | + +### pyOpenRPA.Robot.Audio.DeviceListGet() +L-,W+: Вернуть список аудио устройст (входящих и исходящих, микрофонов и динамиков). + +from pyOpenRPA.Robot import Audio +Audio.DeviceListGet() + + +* **Результат** + + [{«IndexInt»:1, «NameStr»: «», + + «HostApiInt»: 0, «HostApiStr»: «MME»|»Windows WASAPI»|»Windows WDM-KS», + «MaxInputChannelsInt»: 0, «MaxOutputChannelsInt»: 0, + «DefaultSampleRateFloat»: 44100.0 + + },…] + + + + +* **Тип результата** + + list + + + +### pyOpenRPA.Robot.Audio.DeviceMicrophoneIndex() +L-,W+: Выполнить поиск устройства, с помощью которого можно будет выполнить захват c микрофона. + + +### pyOpenRPA.Robot.Audio.DeviceSystemSoundIndex() +L-,W+: Выполнить поиск устройства, с помощью которого можно будет выполнить захват аудио, которое поступает из приложений. Например: аудиоконференции Zoom, whatsapp, telegram и т.д. + + +### class pyOpenRPA.Robot.Audio.Recorder(inDeviceInt=None) +**Methods:** + +| `CaptureChunk`([inExtra, inForceChunkBool, …]) + + | L-,W+: Зафиксировать захват аудио в виде промежуточного файла вида: <имя файла>_00000.mp3 + + | +| `CaptureStart`([inFolderPathStr, …]) + + | L-,W+: Начать запись звука + + | +| `CaptureStop`([inWaitStream, inExtra]) + + | L-,W+: Остановить захват аудио + + | +| `CaptureWait`([inWaitCallbackChunkBool, …]) + + | L-,W+: Ожидать окончания захвата аудио. + + | +| `FileInfoGet`([inFileNameStr]) + + | L-,W+: Вернуть информацию по аудиофайлу inFileNameStr. + + | +| `FileLastGet`() + + | L-,W+: Вернуть наименование последнего сохраненного аудиофайла + + | +| `FileListGet`() + + | L-,W+: Вернуть список сохраненных аудиофайлов (наименования) + + | +| `StatusGet`() + + | L-,W+: Вернуть статус записи звука + + | + +#### CaptureChunk(inExtra=None, inForceChunkBool=True, inShiftSecFloat=0.0) +L-,W+: Зафиксировать захват аудио в виде промежуточного файла вида: <имя файла>_00000.mp3 + + +* **Параметры** + + + * **inExtra** (*any**, **опционально*) – Дополнительный контент, необходимый для идентификации файла. В дальнейшем получить структуру можно с помощью функции FileInfoGet()[„Extra“], по умолчанию None + + + * **inForceChunkBool** (*bool**, **опционально*) – True - вне зависимости от текущего режима перейти на режим сохранения по частям, по умолчанию True + + + * **inShiftSecFloat** (*float*) – Последние секунды, которые не записывать в промежуточный аудиофайл. Они будут началом следующего аудио отрывка, по умолчанию 0.0 + + + +* **Результат** + + Наименование сохраненного аудиофайла + + + +* **Тип результата** + + str + + + +#### CaptureStart(inFolderPathStr='', inFileNameStr='out', inFileFormatStr='mp3', inDurationSecFloat=None, inChunkSecFloat=300.0, inCallbackChunkDef=None, inCallbackStopDef=None) +L-,W+: Начать запись звука + +``` +def CallbackChunk(lRec, lFilenameStr): + pass # КОД ОБРАБОТКИ ПОСЛЕ СОХРАНЕНИЯ ЧАСТИ + +from pyOpenRPA.Robot import Audio +lRec = Audio.Recorder() +lRec.CaptureStart(inFileNameStr = "out", inFileFormatStr = "mp3", inDurationSecFloat = None, inChunkSecFloat = 5.0, inCallbackChunkDef=CallbackChunk) +lRec.CaptureStop() +``` + + +* **Параметры** + + + * **inFolderPathStr** (*str**, **опционально*) – Путь к папке, в которую сохранять аудиофайлы захвата , по умолчанию «» + + + * **inFileNameStr** (*str**, **опционально*) – Наименование файла без расширения, по умолчанию «out» + + + * **inFileFormatStr** (*str**, **опционально*) – Наименование формата, в который будет происходить сохранение («mp3» или «wav» или «raw» или «aif»), по умолчанию «mp3» + + + * **inDurationSecFloat** (*float**, **опционально*) – Длительность захвата аудио, по умолчанию None (пока не поступит команда CaptureStop() ) + + + * **inChunkSecFloat** (*float**, **опционально*) – Максимальная длина части аудиофайла, по умолчанию 300.0 + + + * **inCallbackChunkDef** (*def**, **опционально*) – Функция, которая будет инициирована в случае выполнения Chunk сохранения (сохранение части). Callback функция должна принимать 2 аргумента: экземпляр класса Recorder и наименование сохраненного файла. Внимание! Функция запускается асинхронно! + + + * **inCallbackStopDef** (*def**, **опционально*) – Функция, которая будет инициирована в случае окончания записи. Callback функция должна принимать 2 аргумента: экземпляр класса Recorder и наименование сохраненного файла. Внимание! Функция запускается асинхронно! + + + +#### CaptureStop(inWaitStream=True, inExtra=None) +L-,W+: Остановить захват аудио + + +* **Параметры** + + + * **inWaitStream** (*bool**, **опционально*) – True - выполнить ожидание окончания потока захвата перед окончанием, по умолчанию True + + + * **inExtra** (*any**, **опционально*) – Дополнительный контент, необходимый для идентификации файла. В дальнейшем получить структуру можно с помощью функции FileInfoGet()[„Extra“], по умолчанию None + + + +#### CaptureWait(inWaitCallbackChunkBool=True, inWaitCallbackStopBool=True) +L-,W+: Ожидать окончания захвата аудио. Дополнительно настраивается ожидание окончания всех callback функций. + + +* **Параметры** + + + * **inWaitCallbackChunkBool** (*bool**, **опционально*) – True - ожидать выполнение всех асинхронных callback по сохранению части аудиофайла, по умолчанию True + + + * **inWaitCallbackStopBool** (*bool**, **опционально*) – True - ожидать выполнение всех асинхронных callback по завершению записи, по умолчанию True + + + +#### FileInfoGet(inFileNameStr=None) +L-,W+: Вернуть информацию по аудиофайлу inFileNameStr. Если inFileNameStr == None -> Функция вернет информацию по последнему записанному файлу + + +* **Параметры** + + **inFileNameStr** (*str**, **опционально*) – Наименование аудиофайла с указанием расширения, по умолчанию None (взять последний записанный файл) + + + +* **Результат** + + {StartSecFloat:, EndSecFloat:, Extra:, PathStr:, } или None + + + +* **Тип результата** + + dict + + + +#### FileLastGet() +L-,W+: Вернуть наименование последнего сохраненного аудиофайла + + +* **Результат** + + [«out_00000.mp3», «out_00001.mp3», …] + + + +* **Тип результата** + + list + + + +#### FileListGet() +L-,W+: Вернуть список сохраненных аудиофайлов (наименования) + + +* **Результат** + + [«out_00000.mp3», «out_00001.mp3», …] + + + +* **Тип результата** + + list + + + +#### StatusGet() +L-,W+: Вернуть статус записи звука + + +* **Результат** + + «0_READY» или «1_RECORDING» + + + +* **Тип результата** + + str + + +## Быстрая навигация + + +* [Сообщество pyOpenRPA (telegram)](https://t.me/pyOpenRPA) + + +* [Сообщество pyOpenRPA (tenchat)](https://tenchat.ru/iMaslov?utm_source=19f2a84f-3268-437f-950c-d987ae42af24) + + +* [Сообщество pyOpenRPA (вконтакте)](https://vk.com/pyopenrpa) + + +* [Презентация pyOpenRPA](https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf) + + +* [Портал pyOpenRPA](https://pyopenrpa.ru) + + +* [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) + + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Robot/08_HowToUse.md b/Wiki/RUS_Guide/markdown/Robot/09_HowToUse.md old mode 100755 new mode 100644 similarity index 80% rename from Wiki/RUS_Guide/markdown/Robot/08_HowToUse.md rename to Wiki/RUS_Guide/markdown/Robot/09_HowToUse.md index 182e2340..887e4ddb --- a/Wiki/RUS_Guide/markdown/Robot/08_HowToUse.md +++ b/Wiki/RUS_Guide/markdown/Robot/09_HowToUse.md @@ -1,7 +1,23 @@ -# 8. Как использовать? +# 9. Как использовать? Модуль РОБОТ - это ключевое звено, которое отвечает за продуктивную роботизацию процесса. Данный модуль не имеет графический или консольный интерфейс - он подключается в качестве библиотеки в проект робота, что позволяет выполнять операции максимально быстро. А также позволяет с легкостью интегрировать робота в другие проекты. +## Быстрый запуск (Quickstart) + +Платформа pyOpenRPA содержит инструменты быстрого прототипирования роботов. Вы можете провести серию экспериментов роботизации без развертывания полноценной инфраструктуры робота - в рамках одного уже преднастроенного файла. + +Для быстрого запуска робота необходимо: + + +* Открыть Jupyter-notebooks: GITToolsJupyter-notebooksstart.cmd (для Windows) или GITToolsJupyter-notebooksstart.sh (для Linux). Откроется окно консоли, в которой будет отображен адрес для входа на веб страницу Jupyter-notebooks. + + +* В web окне Jupyter-notebooks открыть QuickstartRobot.ipynb + +Быстрая инфраструктура для прототипирования робота готова! + +В файле Robot.ipynb содержится вся необходимая информация, которая позволит решить любую поставленную задачу. + ## Как запустить скрипт робота? Запустить скрипт робота можно 2-мя способами: @@ -12,6 +28,9 @@ * Скрипт в Студии pyOpenRPA + +* Скрипт в Jupyter (см. раздел «Быстрый запуск») + ### Скрипт Python (файл .py) Чтобы начать использовать модуль робота достаточно выполнить в файле скрипта соответсвующие команды импорта: @@ -95,4 +114,4 @@ pause >nul # Не закрывать окно консоли после заве * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Studio/01_Studio.md b/Wiki/RUS_Guide/markdown/Studio/01_Studio.md index b284fe68..430c8fef 100755 --- a/Wiki/RUS_Guide/markdown/Studio/01_Studio.md +++ b/Wiki/RUS_Guide/markdown/Studio/01_Studio.md @@ -36,4 +36,4 @@ pyOpenRPA - роботы помогут! * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Studio/02_HowToUse.md b/Wiki/RUS_Guide/markdown/Studio/02_HowToUse.md index 6154f167..63c33481 100755 --- a/Wiki/RUS_Guide/markdown/Studio/02_HowToUse.md +++ b/Wiki/RUS_Guide/markdown/Studio/02_HowToUse.md @@ -20,7 +20,7 @@ ## Как запустить? -* Запустить файл StudiopyOpenRPA.Studio_x64.cmd +* Запустить файл Studiostart.cmd * Ожидать текст в окне консоли: «running server». Браузер, установленный по умолчанию откроется автоматически @@ -151,4 +151,4 @@ * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/Tools/02_Defs.md b/Wiki/RUS_Guide/markdown/Tools/02_Defs.md index d59b2de6..7cbc7e43 100755 --- a/Wiki/RUS_Guide/markdown/Tools/02_Defs.md +++ b/Wiki/RUS_Guide/markdown/Tools/02_Defs.md @@ -60,4 +60,4 @@ Check if stop signal has come. ### pyOpenRPA.Tools.Debugger.LiveDebugCheckThread(\*\*inKWARGS) Create thread to wait file appear «init_debug» in the working directory. - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/markdown/index.md b/Wiki/RUS_Guide/markdown/index.md index 941764b5..9f3d98cb 100755 --- a/Wiki/RUS_Guide/markdown/index.md +++ b/Wiki/RUS_Guide/markdown/index.md @@ -227,7 +227,7 @@ pyOpenRPA - роботы помогут! ## Технические требования -ВЕРСИЯ v1.3.0 +ВЕРСИЯ v1.3.1 ! ВНИМАНИЕ ! Требуется пакет KB2999226 если используется windows Vista/7/8/8.1/Server 2008/Server 2012 [https://support.microsoft.com/ru-ru/help/2999226](https://support.microsoft.com/ru-ru/help/2999226) Использование компонента OpenCV: ОС Windows 7/8/8/10 (Windows Server только с 2016) @@ -460,7 +460,25 @@ pyOpenRPA - роботы помогут! * Быстрая навигация -* 8. Как использовать? +* 8. Функции Audio + + + * Общее + + + * Класс Recorder + + + * Описание функций + + + * Быстрая навигация + + +* 9. Как использовать? + + + * Быстрый запуск (Quickstart) * Как запустить скрипт робота? @@ -552,7 +570,7 @@ pyOpenRPA - роботы помогут! * Как запустить? - * Параметры настройки + * Конфигурационный файл config.py * Быстрая навигация @@ -607,4 +625,4 @@ pyOpenRPA - роботы помогут! * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) - .. v1.3.0 replace:: v1.3.0 + .. v1.3.1 replace:: v1.3.1 diff --git a/Wiki/RUS_Guide/pdf/pyOpenRPA_Guide_RUS.pdf b/Wiki/RUS_Guide/pdf/pyOpenRPA_Guide_RUS.pdf index fc550ad3..142dc779 100755 Binary files a/Wiki/RUS_Guide/pdf/pyOpenRPA_Guide_RUS.pdf and b/Wiki/RUS_Guide/pdf/pyOpenRPA_Guide_RUS.pdf differ diff --git a/v1.3.0 b/v1.3.1 similarity index 100% rename from v1.3.0 rename to v1.3.1